Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
setTimeout(() => {
// apply the action over the server root store
// sometimes applying actions might fail (for example on invalid operations
// such as when one client asks to delete a model from an array and other asks to mutate it)
// so we try / catch it
let serializedActionCallToReplicate: SerializedActionCallWithModelIdOverrides | undefined
try {
// we use this to apply the action on the server side and keep track of new model IDs being
// generated, so the clients will have the chance to keep those in sync
const applyActionResult = applySerializedActionAndTrackNewModelIds(
this.serverRootStore,
actionCall
)
serializedActionCallToReplicate = applyActionResult.serializedActionCall
} catch (err) {
console.error("error applying action to server:", err)
}
if (serializedActionCallToReplicate) {
setTimeout(() => {
// and distribute message, which includes new model IDs to keep them in sync
this.msgListeners.forEach(listener => listener(serializedActionCallToReplicate!))
}, 500)
}
}, 500)
}
@modelAction
setDone(done: boolean) {
this.done = done
}
@modelAction
setText(text: string) {
this.text = text
}
}
@model("todoSample/TodoList")
export class TodoList extends Model({
// in this case the default uses an arrow function to create the object since it is not a primitive
// and we need a different array for each model instane
todos: tProp(types.array(types.model(Todo)), () => []),
// if we didn't require runtime type checking
// todos: prop(() => [])
}) {
// standard mobx decorators (such as computed) can be used as usual, since props are observables
@computed
get pending() {
return this.todos.filter(t => !t.done)
}
@computed
get done() {
return this.todos.filter(t => t.done)
}
@modelAction
// for this example we will enable runtime data checking even in production mode
setGlobalConfig({
modelAutoTypeChecking: ModelAutoTypeCheckingMode.AlwaysOn,
})
// the model decorator marks this class as a model, an object with actions, etc.
// the string identifies this model type and must be unique across your whole application
@model("todoSample/Todo")
export class Todo extends Model({
// here we define the type of the model data, which is observable and snapshottable
// and also part of the required initialization data of the model
// in this case we use runtime type checking,
id: tProp(types.string, () => uuid.v4()), // an optional string that will use a random id when not provided
text: tProp(types.string), // a required string
done: tProp(types.boolean, false), // an optional boolean that will default to false
// if we didn't require runtime type checking we could do this
// id: prop(() => uuid.v4())
// text: prop(),
// done: prop(false)
}) {
// the modelAction decorator marks the function as a model action, giving it access
// to modify any model data and other superpowers such as action
// middlewares, replication, etc.
@modelAction
setDone(done: boolean) {
this.done = done
}
@modelAction
setText(text: string) {
// for this example we will enable runtime data checking even in production mode
setGlobalConfig({
modelAutoTypeChecking: ModelAutoTypeCheckingMode.AlwaysOn,
})
// the model decorator marks this class as a model, an object with actions, etc.
// the string identifies this model type and must be unique across your whole application
@model("todoSample/Todo")
export class Todo extends Model({
// here we define the type of the model data, which is observable and snapshottable
// and also part of the required initialization data of the model
// in this case we use runtime type checking,
id: tProp(types.string, () => uuid.v4()), // an optional string that will use a random id when not provided
text: tProp(types.string), // a required string
done: tProp(types.boolean, false), // an optional boolean that will default to false
// if we didn't require runtime type checking we could do this
// id: prop(() => uuid.v4())
// text: prop(),
// done: prop(false)
}) {
// the modelAction decorator marks the function as a model action, giving it access
// to modify any model data and other superpowers such as action
// middlewares, replication, etc.
@modelAction
setDone(done: boolean) {
this.done = done
}
@modelAction
import uuid from "uuid"
// for this example we will enable runtime data checking even in production mode
setGlobalConfig({
modelAutoTypeChecking: ModelAutoTypeCheckingMode.AlwaysOn,
})
// the model decorator marks this class as a model, an object with actions, etc.
// the string identifies this model type and must be unique across your whole application
@model("todoSample/Todo")
export class Todo extends Model({
// here we define the type of the model data, which is observable and snapshottable
// and also part of the required initialization data of the model
// in this case we use runtime type checking,
id: tProp(types.string, () => uuid.v4()), // an optional string that will use a random id when not provided
text: tProp(types.string), // a required string
done: tProp(types.boolean, false), // an optional boolean that will default to false
// if we didn't require runtime type checking we could do this
// id: prop(() => uuid.v4())
// text: prop(),
// done: prop(false)
}) {
// the modelAction decorator marks the function as a model action, giving it access
// to modify any model data and other superpowers such as action
// middlewares, replication, etc.
@modelAction
setDone(done: boolean) {
this.done = done
}
// the modelAction decorator marks the function as a model action, giving it access
// to modify any model data and other superpowers such as action
// middlewares, replication, etc.
@modelAction
setDone(done: boolean) {
this.done = done
}
@modelAction
setText(text: string) {
this.text = text
}
}
@model("todoSample/TodoList")
export class TodoList extends Model({
// in this case the default uses an arrow function to create the object since it is not a primitive
// and we need a different array for each model instane
todos: tProp(types.array(types.model(Todo)), () => []),
// if we didn't require runtime type checking
// todos: prop(() => [])
}) {
// standard mobx decorators (such as computed) can be used as usual, since props are observables
@computed
get pending() {
return this.todos.filter(t => !t.done)
}
@computed
get done() {
return this.todos.filter(t => t.done)
registerRootStore,
setGlobalConfig,
tProp,
types,
} from "mobx-keystone"
import uuid from "uuid"
// for this example we will enable runtime data checking even in production mode
setGlobalConfig({
modelAutoTypeChecking: ModelAutoTypeCheckingMode.AlwaysOn,
})
// the model decorator marks this class as a model, an object with actions, etc.
// the string identifies this model type and must be unique across your whole application
@model("todoSample/Todo")
export class Todo extends Model({
// here we define the type of the model data, which is observable and snapshottable
// and also part of the required initialization data of the model
// in this case we use runtime type checking,
id: tProp(types.string, () => uuid.v4()), // an optional string that will use a random id when not provided
text: tProp(types.string), // a required string
done: tProp(types.boolean, false), // an optional boolean that will default to false
// if we didn't require runtime type checking we could do this
// id: prop(() => uuid.v4())
// text: prop(),
// done: prop(false)
}) {
// the modelAction decorator marks the function as a model action, giving it access
// to modify any model data and other superpowers such as action
// middlewares, replication, etc.
function initAppInstance() {
// we get the snapshot from the server, which is a serializable object
const rootStoreSnapshot = server.getInitialState()
// and hydrate it into a proper object
const rootStore = fromSnapshot(rootStoreSnapshot)
let serverAction = false
const runServerActionLocally = (actionCall: SerializedActionCallWithModelIdOverrides) => {
let wasServerAction = serverAction
serverAction = true
try {
// in clients we use the sync new model ids version to make sure that
// any model ids that were generated in the server side end up being
// the same in the client side
applySerializedActionAndSyncNewModelIds(rootStore, actionCall)
} finally {
serverAction = wasServerAction
}
}
// listen to action messages to be replicated into the local root store
}) {
// the modelAction decorator marks the function as a model action, giving it access
// to modify any model data and other superpowers such as action
// middlewares, replication, etc.
@modelAction
setDone(done: boolean) {
this.done = done
}
@modelAction
setText(text: string) {
this.text = text
}
}
@model("todoSample/TodoList")
export class TodoList extends Model({
// in this case the default uses an arrow function to create the object since it is not a primitive
// and we need a different array for each model instane
todos: tProp(types.array(types.model(Todo)), () => []),
// if we didn't require runtime type checking
// todos: prop(() => [])
}) {
// standard mobx decorators (such as computed) can be used as usual, since props are observables
@computed
get pending() {
return this.todos.filter(t => !t.done)
}
@computed
get done() {
ModelAutoTypeCheckingMode,
registerRootStore,
setGlobalConfig,
tProp,
types,
} from "mobx-keystone"
import uuid from "uuid"
// for this example we will enable runtime data checking even in production mode
setGlobalConfig({
modelAutoTypeChecking: ModelAutoTypeCheckingMode.AlwaysOn,
})
// the model decorator marks this class as a model, an object with actions, etc.
// the string identifies this model type and must be unique across your whole application
@model("todoSample/Todo")
export class Todo extends Model({
// here we define the type of the model data, which is observable and snapshottable
// and also part of the required initialization data of the model
// in this case we use runtime type checking,
id: tProp(types.string, () => uuid.v4()), // an optional string that will use a random id when not provided
text: tProp(types.string), // a required string
done: tProp(types.boolean, false), // an optional boolean that will default to false
// if we didn't require runtime type checking we could do this
// id: prop(() => uuid.v4())
// text: prop(),
// done: prop(false)
}) {
// the modelAction decorator marks the function as a model action, giving it access
// to modify any model data and other superpowers such as action