1{"version":3,"file":"UpdatesStateMachine.js","sourceRoot":"","sources":["../../src/statemachine/UpdatesStateMachine.ts"],"names":[],"mappings":"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","sourcesContent":["import { createMachine, assign } from 'xstate';\n\nexport enum UpdatesStateMachineEventTypes {\n  CHECK = 'check',\n  CHECK_COMPLETE_AVAILABLE = 'checkCompleteAvailable',\n  CHECK_COMPLETE_UNAVAILABLE = 'checkCompleteUnavailable',\n  CHECK_ERROR = 'checkError',\n  DOWNLOAD = 'download',\n  DOWNLOAD_COMPLETE = 'downloadComplete',\n  DOWNLOAD_ERROR = 'downloadError',\n  RESTART = 'restart',\n}\n\n/**\n * Simplified model for an update manifest\n */\nexport type Manifest = {\n  updateId: string;\n};\n\n/**\n * Model for an update event\n */\nexport type UpdatesStateMachineEvent = {\n  type: UpdatesStateMachineEventTypes;\n  body: {\n    message?: string;\n    manifest?: Manifest;\n    isRollBackToEmbedded?: boolean;\n  };\n};\n\n/**\n * The context structure (analogous to what is exposed in @expo/use-updates)\n */\nexport interface UpdatesStateMachineContext {\n  isUpdateAvailable: boolean;\n  isUpdatePending: boolean;\n  latestManifest?: Manifest;\n  isChecking: boolean;\n  isDownloading: boolean;\n  isRollback: boolean;\n  downloadedManifest?: Manifest;\n  checkError?: Error;\n  downloadError?: Error;\n}\n\n/**\n * Actions that modify the context\n */\nconst checkCompleteAvailableAction = assign({\n  latestManifest: (context: UpdatesStateMachineContext, event: UpdatesStateMachineEvent) =>\n    event.body?.manifest || undefined,\n  checkError: () => undefined,\n  isChecking: () => false,\n  isUpdateAvailable: () => true,\n  isRollback: (context: UpdatesStateMachineContext, event: UpdatesStateMachineEvent) =>\n    Boolean(event.body?.isRollBackToEmbedded),\n});\n\nconst checkCompleteUnavailableAction = assign({\n  latestManifest: () => undefined,\n  checkError: () => undefined,\n  isChecking: () => false,\n  isUpdateAvailable: () => false,\n  isRollback: () => false,\n});\n\nconst checkErrorAction = assign({\n  isChecking: () => false,\n  checkError: (context: UpdatesStateMachineContext, event: UpdatesStateMachineEvent) =>\n    new Error(event.body?.message || 'checkError'),\n});\n\nconst downloadCompleteAction = assign({\n  downloadedManifest: (context: UpdatesStateMachineContext, event: UpdatesStateMachineEvent) =>\n    event.body?.manifest || context.downloadedManifest,\n  latestManifest: (context: UpdatesStateMachineContext, event: UpdatesStateMachineEvent) =>\n    event.body?.manifest || context.latestManifest,\n  downloadError: () => undefined,\n  isDownloading: () => false,\n  isUpdatePending: (context: UpdatesStateMachineContext, event: UpdatesStateMachineEvent) =>\n    !!(event.body?.manifest || context.downloadedManifest),\n  isUpdateAvailable: (context: UpdatesStateMachineContext, event: UpdatesStateMachineEvent) =>\n    event.body?.manifest !== undefined || context.isUpdateAvailable,\n});\n\nconst downloadErrorAction = assign({\n  downloadError: (context: UpdatesStateMachineContext, event: UpdatesStateMachineEvent) =>\n    new Error(event.body?.message || 'downloadError'),\n  isDownloading: () => false,\n});\n\nconst check = assign({\n  isChecking: (context: UpdatesStateMachineContext) => true,\n});\n\nconst download = assign({\n  isDownloading: (context: UpdatesStateMachineContext) => true,\n});\n\n/**\n * Model of the expo-updates state machine, written in Typescript.\n * The actual implementations of this state machine will be in Swift on iOS and Kotlin on Android.\n */\nexport const UpdatesStateMachine = createMachine<UpdatesStateMachineContext>({\n  id: 'Updates',\n  initial: 'idle',\n  context: {\n    isChecking: false,\n    isDownloading: false,\n    isUpdateAvailable: false,\n    isUpdatePending: false,\n    isRollback: false,\n  },\n  predictableActionArguments: true,\n  states: {\n    idle: {\n      on: {\n        check: {\n          target: 'checking',\n          actions: check,\n        },\n        download: {\n          target: 'downloading',\n          actions: download,\n        },\n        restart: {\n          target: 'restarting',\n        },\n      },\n    },\n    checking: {\n      on: {\n        checkCompleteAvailable: {\n          target: 'idle',\n          actions: [checkCompleteAvailableAction],\n        },\n        checkCompleteUnavailable: {\n          target: 'idle',\n          actions: [checkCompleteUnavailableAction],\n        },\n        checkError: {\n          target: 'idle',\n          actions: [checkErrorAction],\n        },\n      },\n    },\n    downloading: {\n      on: {\n        downloadComplete: {\n          target: 'idle',\n          actions: [downloadCompleteAction],\n        },\n        downloadError: {\n          target: 'idle',\n          actions: [downloadErrorAction],\n        },\n      },\n    },\n    restarting: {\n      type: 'final',\n    },\n  },\n});\n"]}