@rango-dev/queue-manager-core 0.1.10-next.79 → 0.1.10-next.80

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/manager.d.ts CHANGED
@@ -132,7 +132,9 @@ declare class Manager {
132
132
  * @returns an ID for queue so it can be used to get the created queue later by client.
133
133
  *
134
134
  */
135
- create(name: QueueName, storage: QueueStorage): Promise<string>;
135
+ create(name: QueueName, storage: QueueStorage, options?: {
136
+ id?: QueueID;
137
+ }): Promise<string>;
136
138
  /**
137
139
  * Get a queue by its ID.
138
140
  *
@@ -1 +1 @@
1
- {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["src/manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["src/manager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAG/C,oBAAY,cAAc,GAAG,MAAM,CAAC;AACpC,oBAAY,SAAS,GAAG,MAAM,CAAC;AAC/B,oBAAY,OAAO,GAAG,MAAM,CAAC;AAC7B,oBAAY,WAAW,GAAG;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,OAAO,EAAE;QACP,GAAG,EAAE,MAAM,YAAY,CAAC;QACxB,GAAG,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,YAAY,CAAC;KAC3C,CAAC;CACH,CAAC;AAEF,oBAAY,UAAU,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC;AAElD,MAAM,WAAW,eAAe,CAC9B,CAAC,SAAS,YAAY,GAAG,YAAY,EACrC,CAAC,SAAS,MAAM,GAAG,MAAM,EACzB,CAAC,GAAG,cAAc;IAElB,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,QAAQ,EAAE,CAAC,UAAU,EAAE,CAAC,KAAK,IAAI,CAAC;IAClC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC,CAAC;IACpB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IACjD,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,OAAO,EAAE,CAAC,CAAC;CACZ;AAED,MAAM,WAAW,QAAQ,CACvB,CAAC,SAAS,YAAY,GAAG,YAAY,EACrC,CAAC,SAAS,MAAM,GAAG,MAAM,EACzB,CAAC,GAAG,cAAc;IAElB,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE;SACN,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;KACtE,CAAC;IACF,MAAM,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACrC,GAAG,EAAE,CAAC,EAAE,CAAC;IACT,eAAe,CAAC,EAAE,CAChB,KAAK,EAAE,GAAG,EACV,MAAM,EAAE;QACN,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,KAAK,CAAC;QACb,OAAO,EAAE,CAAC,CAAC;QACX,eAAe,EAAE,MAAM,WAAW,EAAE,CAAC;QACrC,YAAY,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;QACxD,KAAK,EAAE,MAAM,IAAI,CAAC;QAClB,OAAO,EAAE,OAAO,CAAC;KAClB,KACE,IAAI,CAAC;CACX;AAED,MAAM,WAAW,MAAM;IACrB,aAAa,EAAE,CAAC,KAAK,EAAE,SAAS,GAAG;QAAE,EAAE,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,CAAC;IAC5D,aAAa,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,KAAK,IAAI,CAAC;IAC7D,YAAY,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,KAAK,IAAI,CAAC;IAC5D,YAAY,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,KAAK,IAAI,CAAC;IAC5D,eAAe,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,KAAK,IAAI,CAAC;IACjE,WAAW,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;IACzC,qBAAqB,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;CACnD;AAED,UAAU,cAAc;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IACzB,UAAU,EAAE,QAAQ,EAAE,CAAC;IACvB,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,SAAS,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,KAAK,CAAC;IACZ,OAAO,EAAE;QACP,GAAG,EAAE,MAAM,IAAI,CAAC;QAChB,MAAM,EAAE,MAAM,IAAI,CAAC;QACnB,UAAU,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC;QAC5B,UAAU,EAAE,MAAM,GAAG,CAAC;KACvB,CAAC;CACH;AAED,cAAM,OAAO;IACX,OAAO,CAAC,UAAU,CAAkC;IACpD,OAAO,CAAC,MAAM,CAAiC;IAC/C,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,QAAQ,CAAkB;IAElC;;;;SAIK;gBACO,OAAO,EAAE,cAAc;IA+CnC;;;;;;;;;;OAUG;YACW,IAAI;IAsDlB;;;;;;OAMG;IACH,OAAO,CAAC,WAAW;IAqFnB;;;;;OAKG;IACH,OAAO,CAAC,eAAe;IA4BvB;;;;;;;OAOG;IACH,OAAO,CAAC,GAAG;IASX;;;;;;;;;;;OAWG;IACU,MAAM,CACjB,IAAI,EAAE,SAAS,EACf,OAAO,EAAE,YAAY,EACrB,OAAO,CAAC,EAAE;QAAE,EAAE,CAAC,EAAE,OAAO,CAAA;KAAE;IA4D5B;;;;OAIG;IACI,GAAG,CAAC,QAAQ,EAAE,OAAO;IAI5B;;;;OAIG;IACI,MAAM;IAIb;;;;;;OAMG;IACI,OAAO;IAad;;;;;;;;OAQG;IACI,MAAM;IAiBb;;;;;;;;;;;;OAYG;IACI,KAAK;IAiBZ;;;;;;;OAOG;IACI,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM;IAenD;;;;;;OAMG;IACH,OAAO,CAAC,YAAY;IAgBpB;;;OAGG;IACI,KAAK;IAIZ;;OAEG;IACI,GAAG;IAQV,OAAO,CAAC,UAAU;IAMlB,OAAO,CAAC,aAAa;CAMtB;AAED,OAAO,EAAE,OAAO,EAAE,CAAC"}
@@ -2,8 +2,8 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- var uuid = require('uuid');
6
5
  var idb = require('idb');
6
+ var uuid = require('uuid');
7
7
 
8
8
  function _regeneratorRuntime() {
9
9
  _regeneratorRuntime = function () {
@@ -1276,7 +1276,7 @@ var Manager = /*#__PURE__*/function () {
1276
1276
  _proto.create =
1277
1277
  /*#__PURE__*/
1278
1278
  function () {
1279
- var _create = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(name, storage) {
1279
+ var _create = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(name, storage, options) {
1280
1280
  var _this4 = this;
1281
1281
  var def, queue_id, createdAt, list, createdQueue;
1282
1282
  return _regeneratorRuntime().wrap(function _callee2$(_context2) {
@@ -1289,7 +1289,7 @@ var Manager = /*#__PURE__*/function () {
1289
1289
  throw new Error('You need to add a queue definition first.');
1290
1290
  case 2:
1291
1291
  def = this.queuesDefs.get(name);
1292
- queue_id = uuid.v4();
1292
+ queue_id = (options == null ? void 0 : options.id) || uuid.v4();
1293
1293
  createdAt = Date.now();
1294
1294
  list = this.createQueue({
1295
1295
  queue_id: queue_id,
@@ -1344,7 +1344,7 @@ var Manager = /*#__PURE__*/function () {
1344
1344
  }
1345
1345
  }, _callee2, this);
1346
1346
  }));
1347
- function create(_x, _x2) {
1347
+ function create(_x, _x2, _x3) {
1348
1348
  return _create.apply(this, arguments);
1349
1349
  }
1350
1350
  return create;
@@ -1 +1 @@
1
- {"version":3,"file":"queue-manager-core.cjs.development.js","sources":["../src/persistor.ts","../src/types.ts","../src/queue.ts","../src/manager.ts"],"sourcesContent":["import { openDB, DBSchema, IDBPDatabase } from 'idb';\n\nimport { QueueID } from './manager';\nimport { PersistedQueue } from './types';\n\nexport const DB_NAME = 'queues-manager';\nconst OBJECT_STORE_NAME = 'queues';\nconst VERSION = 1;\n\ntype UpdatePersistedQueue = Partial<\n Pick<PersistedQueue, 'status' | 'state' | 'tasks' | 'storage'>\n>;\n\ninterface Database extends DBSchema {\n queues: {\n value: PersistedQueue;\n key: string;\n };\n}\n\nclass Persistor {\n db: Promise<IDBPDatabase<Database>>;\n constructor() {\n this.db = openDB<Database>(DB_NAME, VERSION, {\n upgrade(db) {\n db.createObjectStore(OBJECT_STORE_NAME, { keyPath: 'id' });\n },\n });\n }\n async insertQueue(queue: PersistedQueue) {\n const db = await this.db;\n const queueRecord = await db.get(OBJECT_STORE_NAME, queue.id);\n if (queueRecord) {\n console.log('[Persistor] Queue already exists inside persistor.');\n } else {\n await db.add(OBJECT_STORE_NAME, queue);\n console.log('[Persistor] Queue added to IndexedDB successfully.');\n }\n }\n async updateQueue(id: QueueID, queue: UpdatePersistedQueue) {\n const db = await this.db;\n const currentRecord = await db.get(OBJECT_STORE_NAME, id);\n\n if (!currentRecord) {\n console.log(\"[Persistor] Requested queue for update doesn't exist.\");\n return;\n }\n\n const updatedRecord = {\n ...currentRecord,\n ...queue,\n };\n await db.put(OBJECT_STORE_NAME, updatedRecord);\n }\n async getAll() {\n const db = await this.db;\n const results = await db.getAll(OBJECT_STORE_NAME);\n\n return results;\n }\n}\n\nexport default Persistor;\n","import { QueueID, QueueName } from './manager';\nimport Queue, { QueueState, Task } from './queue';\n\nexport enum Status {\n PENDING = 'PENDING',\n RUNNING = 'RUNNING',\n FAILED = 'FAILED',\n SUCCESS = 'SUCCESS',\n CANCELED = 'CANCELED',\n BLOCKED = 'BLOCKED',\n}\n\nexport type QueueStorage = Record<string, unknown>;\n\nexport type QueueType = Queue;\n\nexport interface PersistedQueue {\n id: QueueID;\n createdAt: number;\n name: QueueName;\n status: Status;\n state: QueueState;\n tasks: Task[];\n storage: QueueStorage;\n}\n","import { v4 as uuidv4 } from 'uuid';\nimport { ManagerContext, QueueDef, QueueID } from './manager';\nimport { QueueStorage, Status } from './types';\n\ntype TaskId = string;\nexport type TaskState = {\n status: Status;\n blockedFor: any;\n};\n\nexport interface QueueContext {\n _queue?: {\n id: string;\n };\n}\nexport type NextParams = {\n context: ManagerContext;\n};\n\nexport interface QueueState {\n status: Status;\n activeTaskIndex: number;\n tasks: {\n [key in TaskId]: TaskState;\n };\n}\n\nexport interface Task {\n id: TaskId;\n action: string;\n}\n\nexport type InitTasks = {\n tasks: Task[];\n state: QueueState;\n storage: QueueStorage;\n};\n\nexport interface TaskEvent {\n id: TaskId;\n task: TaskState;\n action: string;\n}\n\nexport interface QueueEventHandlers {\n // all tasks\n onUpdateListStatus: (status: Status) => void;\n // single task\n onCreate: (event: TaskEvent) => void;\n onUpdate: (event: TaskEvent) => void;\n onStorageUpdate: (data: QueueStorage) => void;\n onBlock: (\n data: Omit<TaskEvent, 'task'> & { reason: Record<string, unknown> }\n ) => void;\n onUnblock: (data: { id: string }) => void;\n}\n\ninterface QueueOptions {\n id: QueueID;\n events: QueueEventHandlers;\n actions: QueueDef['actions'];\n}\n\n/**\n *\n * Notes on statuses:\n * - Success: last task has success status\n * - Failed: any of task has been failed\n * - Running: first task is not on pending\n * - Pending: default state. not started\n *\n */\nclass Queue {\n public id: string;\n public state: QueueState = {\n status: Status.PENDING,\n activeTaskIndex: 0,\n tasks: {},\n };\n public tasks: Task[] = [];\n private events: QueueOptions['events'];\n private actions: QueueOptions['actions'];\n private storage: QueueStorage = {};\n\n constructor(options: QueueOptions) {\n this.id = options.id;\n this.events = options.events;\n this.actions = options.actions;\n }\n\n /**\n * Update queue status and trigger an event\n *\n */\n private updateQueueStatus(status: Status) {\n this.state.status = status;\n this.events.onUpdateListStatus(status);\n }\n\n private updateActiveTaskIndex(index: number) {\n this.state.activeTaskIndex = index;\n }\n\n /**\n *\n * Update task state (`status`, `blockedFor`) and trigger an event.\n * @param id\n * @param nextState\n */\n private updateTaskState(id: TaskId, nextState: Partial<TaskState>) {\n if (nextState.status) {\n this.state.tasks[id].status = nextState.status;\n }\n if (nextState.blockedFor) {\n this.state.tasks[id].blockedFor = nextState.blockedFor;\n }\n\n const updatedTaskEvent = {\n id: id,\n task: this.get(id)!,\n action: this.tasks.find((task) => task.id === id)!.action,\n };\n this.events.onUpdate(updatedTaskEvent);\n }\n\n /**\n * Create a task by providing an `action` name.\n *\n * this method creating the task, push it to the queue's tasks and trigger an event.\n * @param action\n */\n createTask(action: string) {\n const id = uuidv4();\n this.tasks.push({\n action,\n id,\n });\n this.state.tasks[id] = {\n status: Status.PENDING,\n blockedFor: null,\n };\n\n const createdTask = this.get(id);\n this.events.onCreate({\n id,\n task: createdTask!,\n action,\n });\n }\n\n /**\n * Initilize a queue with some tasks, instead of an empty queue.\n *\n * Using it for recover the queue state from persistor.\n *\n */\n public initTasks(info: InitTasks) {\n this.state = info.state;\n this.storage = info.storage;\n\n info.tasks.forEach((task) => {\n this.tasks.push(task);\n const action = this.tasks.find((t) => t.id === task.id)!.action;\n this.events.onCreate({\n id: task.id,\n task: this.get(task.id)!,\n action,\n });\n });\n }\n\n public checkBlock() {\n const currentActiveTask = this.getActiveTask();\n\n if (!currentActiveTask) {\n return;\n }\n const { task, state } = currentActiveTask;\n\n if (state.status === Status.BLOCKED) {\n this.events.onBlock({\n action: task.action,\n id: task.id,\n reason: state.blockedFor,\n });\n }\n }\n\n /**\n * Getting task state by ID\n */\n public get(id: string): TaskState | null {\n const task = this.state.tasks[id];\n\n if (!task) return null;\n\n return task;\n }\n\n /**\n *\n * Checking if status of the last is `SUCCESS` or not\n *\n */\n private lastTaskIsSuccessful() {\n const lastTask = this.tasks[this.tasks.length - 1];\n\n // checking for empty lists.\n if (lastTask) {\n const lastTaskState = this.state.tasks[lastTask.id];\n\n // Maybe we didn't create the state yet. It should has success status as well.\n if (!!lastTaskState && lastTaskState.status === Status.SUCCESS) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * If the first task started (it's not PENDING),\n * it means the queue has been ran.\n *\n * @returns\n */\n private firstTaskIsStarted() {\n const firstTask = this.tasks[0];\n\n // checking for empty lists.\n if (firstTask) {\n const firstTaskState = this.state.tasks[firstTask.id];\n\n // Maybe we didn't create the state yet.\n if (!!firstTaskState) {\n if (firstTaskState.status !== Status.PENDING) {\n return true;\n }\n }\n }\n\n return false;\n }\n\n /**\n * Getting active task index from state and\n * returns the task and its state.\n *\n */\n private getActiveTask() {\n // First try to get task with `activeTask`\n const index = this.state.activeTaskIndex;\n const task = this.tasks[index];\n\n // Consider all the tasks has been executed.\n if (!task) {\n return null;\n }\n\n const state = this.state.tasks[task.id];\n\n return { task, state, index };\n }\n\n /**\n * Update and find the queue status by checking state of each tasks in the queue.\n */\n public check() {\n const currentListStatus = this.state.status;\n let nextListStatus = this.firstTaskIsStarted()\n ? Status.RUNNING\n : Status.PENDING;\n\n if (this.lastTaskIsSuccessful()) {\n nextListStatus = Status.SUCCESS;\n } else {\n // Is there any failed task?\n for (const task of this.tasks) {\n const state = this.state.tasks[task.id];\n\n // If one item fails, we stop to work on the list.\n if (state.status === Status.FAILED) {\n nextListStatus = Status.FAILED;\n break;\n }\n }\n }\n\n // We only update and trigger an event when there is a new value\n if (nextListStatus !== currentListStatus) {\n this.updateQueueStatus(nextListStatus);\n }\n }\n\n /**\n * Execute active task.\n * Based on the state of active task, the behaviour is different. If status is:\n * - Success -> we need to go to next task by updating the active index and try `next` on more time.\n * - Failed, Running, or no active task -> doesn't do anything.\n * - Pending or Blocked -> update the task and queue status to running, and execute the provided `action` for the task.\n *\n * The queue is a linked list somehow, active task means the pointer to where we are in the queue right now.\n *\n */\n public next(params: NextParams) {\n console.log('[next]', this.state, params);\n\n this.check();\n\n const currentActiveTask = this.getActiveTask();\n\n if (!currentActiveTask) {\n return;\n }\n\n const {\n index: activeTaskIndex,\n task: activeTask,\n state: activeTaskState,\n } = currentActiveTask;\n\n // if `activeTask` is already done, we will go for next one.\n if (activeTaskState.status === Status.SUCCESS) {\n this.updateActiveTaskIndex(activeTaskIndex + 1);\n this.next(params);\n return;\n }\n\n if (activeTaskState.status === Status.FAILED) {\n console.log('Task has been failed. It can not be proceed.');\n return;\n }\n\n if (activeTaskState.status === Status.CANCELED) {\n console.log('Task has been canceled. It can not be proceed.');\n return;\n }\n\n if (activeTaskState.status === Status.RUNNING) {\n console.log('Task is running. It can not be proceed.');\n return;\n }\n\n if (\n activeTaskState.status === Status.PENDING ||\n activeTaskState.status === Status.BLOCKED\n ) {\n // Update task status to `running`\n this.updateTaskState(activeTask.id, {\n status: Status.RUNNING,\n });\n this.updateQueueStatus(Status.RUNNING);\n\n // Try to execute task.\n const execute = this.actions[activeTask.action];\n execute({\n context: this.getContext(params),\n next: () => {\n console.log('[execute][next]', params);\n this.markCurrentTaskAsFinished(params);\n },\n retry: () => {\n this.resume(params);\n },\n failed: () => {\n this.updateTaskState(activeTask.id, {\n status: Status.FAILED,\n });\n this.check();\n },\n schedule: (action) => {\n this.createTask(action);\n this.check();\n },\n getStorage: this.getStorage.bind(this),\n setStorage: this.setStorage.bind(this),\n block: (reason: Record<string, unknown>) => {\n this.block({ reason });\n },\n unblock: () => {\n this.unblock();\n },\n });\n }\n }\n\n /**\n * Change the `status` of active task and queue to BLOCKED, then trigger an event.\n */\n public block({\n reason,\n silent = false,\n }: {\n reason: Record<string, unknown>;\n silent?: boolean;\n }) {\n const currentActiveTask = this.getActiveTask();\n\n if (!currentActiveTask) {\n throw new Error(\"Task isn't exist.\");\n }\n\n this.updateTaskState(currentActiveTask.task.id, {\n status: Status.BLOCKED,\n blockedFor: reason,\n });\n this.updateQueueStatus(Status.BLOCKED);\n\n if (!silent) {\n this.events.onBlock({\n action: currentActiveTask.task.action,\n id: currentActiveTask.task.id,\n reason,\n });\n }\n }\n\n /**\n * If the active task is `BLOCKED`, update the task status to `PENDING`, queue status to `RUNNING`\n * then trigger an event.\n */\n public unblock() {\n const currentActiveTask = this.getActiveTask();\n\n if (\n !currentActiveTask ||\n currentActiveTask.state.status !== Status.BLOCKED\n ) {\n throw new Error('Task is not blocked.');\n }\n\n this.updateTaskState(currentActiveTask.task.id, {\n status: Status.PENDING,\n });\n this.updateQueueStatus(Status.RUNNING);\n this.events.onUnblock({ id: currentActiveTask.task.id });\n }\n\n /**\n * If the active task is `BLOCKED` then execute the `action` for the task.\n *\n * It is useful for when we need to run a blocked task without changing the status of task at the first place.\n * For scenarios like we have some conditions in `action` and needs to run the `action` again\n * to check the conditions are met or not, if yes, so we can proceed the `action`.\n *\n */\n public forceRun(params: NextParams) {\n const currentTask = this.getActiveTask();\n\n if (!currentTask || currentTask.state.status !== Status.BLOCKED) {\n throw new Error('Task is not blocked.');\n }\n\n // Try to execute task.\n const execute = this.actions[currentTask.task.action];\n execute({\n context: this.getContext(params),\n next: () => {\n console.log('[force run][execute][next]', params);\n\n /*\n NOTE:\n When running `forceRun`, the status of task can be `BLOCKED`\n So we need to change to `Running` first. \n */\n // Update task status to `running`\n this.updateTaskState(currentTask.task.id, {\n status: Status.RUNNING,\n });\n this.updateQueueStatus(Status.RUNNING);\n\n this.markCurrentTaskAsFinished(params);\n },\n retry: () => {\n this.resume(params);\n },\n failed: () => {\n this.updateTaskState(currentTask.task.id, {\n status: Status.FAILED,\n });\n this.check();\n },\n schedule: (action) => {\n this.createTask(action);\n this.check();\n },\n getStorage: this.getStorage.bind(this),\n setStorage: this.setStorage.bind(this),\n block: (reason: Record<string, unknown>) => {\n this.block({ reason });\n },\n unblock: () => {\n this.unblock();\n },\n });\n }\n private markCurrentTaskAsFinished(params: NextParams) {\n this.check();\n const activeTaskIndex = this.state.activeTaskIndex;\n const activeTask = this.tasks[activeTaskIndex];\n\n if (!activeTask) {\n console.log(\"It seems this queue has been finished. Task doesn't exist.\");\n return;\n }\n\n const activeTaskState = this.state.tasks[activeTask.id];\n if (activeTaskState.status === Status.RUNNING) {\n this.updateTaskState(activeTask.id, {\n status: Status.SUCCESS,\n });\n this.updateActiveTaskIndex(activeTaskIndex + 1);\n\n const updatedTaskEvent = {\n id: activeTask.id,\n task: this.get(activeTask.id)!,\n action: this.tasks.find((task) => task.id === activeTask.id)!.action,\n };\n this.events.onUpdate(updatedTaskEvent);\n this.next(params);\n } else {\n console.log('There is no running task.');\n }\n }\n\n /**\n * If the active task is `RUNNING`, change it to `PENING` the try to run the task by calling `next`.\n * If it's other than `RUNNING` we reset the queue state and run the queue from the beggining.\n *\n * @param params\n * @returns\n */\n public resume(params: NextParams) {\n const activeTaskIndex = this.state.activeTaskIndex;\n const activeTask = this.tasks[activeTaskIndex];\n if (!activeTask) {\n console.log(\"It seems this queue has been finished. Task doesn't exist.\");\n return;\n }\n\n const activeTaskState = this.state.tasks[activeTask.id];\n if (activeTaskState.status === Status.RUNNING) {\n this.updateTaskState(activeTask.id, {\n status: Status.PENDING,\n });\n this.next(params);\n } else {\n console.log('There is no running task. restart the queue', {\n state: this.state.tasks,\n activeTaskState,\n activeTask,\n activeTaskIndex,\n });\n this.resetState();\n this.next(params);\n }\n }\n\n /**\n *\n * Cancel the queue by changing active task and queue status to `CANCELED`.\n *\n */\n public cancel() {\n const currentActiveTask = this.getActiveTask();\n\n if (\n !currentActiveTask ||\n [Status.FAILED, Status.CANCELED, Status.SUCCESS].includes(\n currentActiveTask.state.status\n )\n ) {\n return;\n }\n\n const { task } = currentActiveTask;\n\n // Update task status to `canceled`\n this.updateTaskState(task.id, {\n status: Status.CANCELED,\n });\n const updatedTaskEvent = {\n id: task.id,\n task: this.get(task.id)!,\n action: this.tasks.find((t) => t.id === task.id)!.action,\n };\n this.events.onUpdate(updatedTaskEvent);\n\n // Update queue status to `canceled`\n this.updateQueueStatus(Status.CANCELED);\n }\n\n /**\n * Update queue status, and all the tasks inside queue to `PENDING`.\n */\n private resetState() {\n this.state.activeTaskIndex = 0;\n this.state.status = Status.PENDING;\n Object.keys(this.state.tasks).forEach((id) => {\n this.state.tasks[id].status = Status.PENDING;\n });\n }\n\n public getStorage() {\n return this.storage;\n }\n public setStorage(data: QueueStorage) {\n this.storage = data;\n this.events.onStorageUpdate(data);\n return this.storage;\n }\n\n private getContext(params: NextParams): QueueContext & ManagerContext {\n return {\n ...params.context,\n _queue: {\n id: this.id,\n },\n };\n }\n}\n\nexport default Queue;\n","import { v4 as uuidv4 } from 'uuid';\nimport Persistor from './persistor';\nimport Queue, { QueueEventHandlers, TaskEvent } from './queue';\nimport { QueueStorage, Status } from './types';\n\nexport type ManagerContext = object;\nexport type QueueName = string;\nexport type QueueID = string;\nexport type BlockedTask = {\n queue_id: string;\n task_id: string;\n action: string;\n reason: Record<string, unknown>;\n storage: {\n get: () => QueueStorage;\n set: (data: QueueStorage) => QueueStorage;\n };\n};\n\nexport type SetStorage<T> = (nextStorage: T) => T;\n\nexport interface ExecuterActions<\n T extends QueueStorage = QueueStorage,\n V extends string = string,\n C = ManagerContext\n> {\n next: () => void;\n retry: () => void;\n failed: () => void;\n schedule: (actionName: V) => void;\n setStorage: SetStorage<T>;\n getStorage: () => T;\n block: (reason: Record<string, unknown>) => void;\n unblock: () => void;\n context: C;\n}\n\nexport interface QueueDef<\n T extends QueueStorage = QueueStorage,\n V extends string = string,\n C = ManagerContext\n> {\n name: QueueName;\n actions: {\n [K in V]: (actions: ExecuterActions<T, V, C>) => void | Promise<void>;\n };\n events?: Partial<QueueEventHandlers>;\n run: V[];\n whenTaskBlocked?: (\n event: any,\n params: {\n queue_id: string;\n queue: Queue;\n context: C;\n getBlockedTasks: () => BlockedTask[];\n forceExecute: (queue_id: string, data?: object) => void;\n retry: () => void;\n manager: Manager;\n }\n ) => void;\n}\n\nexport interface Events {\n onCreateQueue: (queue: QueueInfo & { id: QueueID }) => void;\n onUpdateQueue: (queue_id: QueueID, queue: QueueInfo) => void;\n onCreateTask: (queue_id: QueueID, event: TaskEvent) => void;\n onUpdateTask: (queue_id: QueueID, event: TaskEvent) => void;\n onStorageUpdate: (queue_id: QueueID, data: QueueStorage) => void;\n onTaskBlock: (queue_id: QueueID) => void;\n onPersistedDataLoaded: (manager: Manager) => void;\n}\n\ninterface ManagerOptions {\n events?: Partial<Events>;\n queuesDefs: QueueDef[];\n context?: ManagerContext;\n isPaused?: boolean;\n}\n\nexport interface QueueInfo {\n name: QueueName;\n createdAt: number;\n status: Status;\n list: Queue;\n actions: {\n run: () => void;\n cancel: () => void;\n setStorage: SetStorage<any>;\n getStorage: () => any;\n };\n}\n\nclass Manager {\n private queuesDefs = new Map<QueueName, QueueDef>();\n private queues = new Map<QueueID, QueueInfo>();\n private events: Events;\n private persistor: Persistor;\n private context: ManagerContext;\n private isPaused: boolean = false;\n\n /**\n *\n * Making an instance, initilize events, setup a persistor and try to recover the last state of the manager.\n *\n * */\n constructor(options: ManagerOptions) {\n const defaultEventHandlers: Events = {\n onCreateQueue: () => {\n // ...\n },\n onCreateTask: () => {\n // ...\n },\n onUpdateQueue: () => {\n // ...\n },\n onUpdateTask: () => {\n // ...\n },\n onStorageUpdate: () => {\n // ...\n },\n onTaskBlock: () => {\n // ...\n },\n onPersistedDataLoaded: () => {\n // ..\n },\n };\n\n if (options.events) {\n this.events = {\n ...defaultEventHandlers,\n ...options.events,\n };\n } else {\n this.events = defaultEventHandlers;\n }\n\n options.queuesDefs.map((qDef) => {\n this.queuesDefs.set(qDef.name, qDef);\n });\n\n this.context = options.context || {};\n this.persistor = new Persistor();\n this.sync();\n\n if (options.isPaused) {\n this.pause();\n }\n }\n\n /**\n *\n * Reading persisted data from storage then brings into memory.\n *\n * Notes:\n * - Reset the memory, so we can call this method whenever we want and not only on the initialize process.\n * - All the events will be tirggered (like onCreateQueue, onCreateTask, onBlock, ....)\n * - Try to `resume` if the status is `running`.\n * - Trigger `onPersistedDataLoaded` event when queues recovered from storage.\n *\n */\n private async sync() {\n // Reading queues from storage\n const queues = await this.persistor.getAll();\n\n // Reset queues, if anything is exist in memory.\n this.queues = new Map();\n\n // Brings them into memory\n queues.forEach((q) => {\n const list = this.createQueue({\n queue_id: q.id,\n queue_name: q.name,\n });\n this.add(q.id, {\n list,\n createdAt: q.createdAt,\n name: q.name,\n status: q.status,\n actions: {\n run: () => {\n list.next({\n context: this.getContext(),\n });\n },\n cancel: () => {\n list.cancel();\n },\n setStorage: (...args) => {\n list.setStorage(...args);\n },\n getStorage: () => {\n return list.getStorage();\n },\n },\n });\n\n list.initTasks({\n state: q.state,\n tasks: q.tasks,\n storage: q.storage || {},\n });\n\n if (q.status === Status.RUNNING && this.shouldExecute()) {\n console.log('[INIT] Try to resume');\n list.resume({\n context: this.getContext(),\n });\n }\n });\n\n // Trigger an event to let the subscribers we are done here.\n this.events.onPersistedDataLoaded(this);\n }\n\n /**\n *\n * Making a new instance from `Queue` and adds Manager's event handlers to it.\n *\n * @returns An instance of `Queue` with wrapped event handlers from Manager.\n *\n */\n private createQueue({\n queue_id,\n queue_name,\n }: {\n queue_id: QueueID;\n queue_name: QueueName;\n }) {\n const manager = this;\n const def = this.queuesDefs.get(queue_name)!;\n const list = new Queue({\n id: queue_id,\n events: {\n onCreate: (task) => {\n this.events.onCreateTask(queue_id, task);\n this.handleUpdate(queue_id);\n\n if (def.events?.onCreate) def.events.onCreate(task);\n },\n onUpdate: (task) => {\n this.events.onUpdateTask(queue_id, task);\n this.handleUpdate(queue_id);\n\n if (def.events?.onUpdate) def.events.onUpdate(task);\n },\n onUpdateListStatus: (status) => {\n this.queues.set(queue_id, {\n ...this.get(queue_id)!,\n status,\n });\n this.events.onUpdateQueue(queue_id, this.get(queue_id)!);\n\n this.handleUpdate(queue_id);\n\n // After finishing a queue, try to run other queues.\n this.execute();\n if (def.events?.onUpdateListStatus)\n def.events.onUpdateListStatus(status);\n },\n onStorageUpdate: (data) => {\n this.events.onStorageUpdate(queue_id, data);\n if (def.events?.onStorageUpdate) def.events.onStorageUpdate(data);\n this.handleUpdate(queue_id);\n },\n onBlock: (event) => {\n // Update queue status\n this.queues.set(queue_id, {\n ...this.get(queue_id)!,\n status: Status.BLOCKED,\n });\n\n // Trigger event\n this.events.onTaskBlock(queue_id);\n if (def.whenTaskBlocked) {\n def.whenTaskBlocked(event, {\n queue_id: queue_id,\n queue: list,\n context: this.getContext(),\n getBlockedTasks: this.getBlockedTasks.bind(this),\n forceExecute: this.forceExecute.bind(this),\n retry: this.retry.bind(this),\n manager,\n });\n }\n\n // Sync\n this.handleUpdate(queue_id);\n },\n onUnblock: () => {\n // Update queue status\n this.queues.set(queue_id, {\n ...this.get(queue_id)!,\n status: Status.PENDING,\n });\n\n // Sync\n this.handleUpdate(queue_id);\n\n this.execute();\n },\n },\n actions: def.actions,\n });\n return list;\n }\n\n /**\n * Go through all tasks (from all queues) and return a list of blocked tasks\n *\n * @returns a list of blocked tasks including enough information to get the queue and mutate the storage.\n *\n */\n private getBlockedTasks() {\n const queues = this.getAll();\n const blockedTasks: BlockedTask[] = [];\n queues.forEach((q, queue_id) => {\n q.list.tasks.forEach((task) => {\n const state = q.list.state.tasks[task.id];\n if (state.status === Status.BLOCKED) {\n blockedTasks.push({\n task_id: task.id,\n queue_id: queue_id,\n action: task.action,\n reason: state.blockedFor,\n storage: {\n get: () => {\n return q.list.getStorage();\n },\n set: (data) => {\n return q.list.setStorage(data);\n },\n },\n });\n }\n });\n });\n\n return blockedTasks;\n }\n\n /**\n *\n * Add a queue to the manager to keep track of the queue and its state.\n *\n * @param id\n * @param queue\n * @returns\n */\n private add(id: QueueID, queue: QueueInfo) {\n this.queues.set(id, queue);\n const createdQueue = this.get(id)!;\n this.events.onCreateQueue({ ...createdQueue, id });\n\n return createdQueue;\n }\n\n // Create a new queue\n /**\n *\n * Create a new queue by client.\n *\n * It will do the internal things to make a queue from definitions, and running using Manager.\n *\n * Notes:\n * - After creating the queue, it will be run automatically.\n *\n * @returns an ID for queue so it can be used to get the created queue later by client.\n *\n */\n public async create(name: QueueName, storage: QueueStorage) {\n if (!this.queuesDefs.has(name)) {\n throw new Error('You need to add a queue definition first.');\n }\n\n const def = this.queuesDefs.get(name)!;\n const queue_id: QueueID = uuidv4();\n const createdAt = Date.now();\n const list = this.createQueue({\n queue_id: queue_id,\n queue_name: name,\n });\n list.setStorage(storage);\n\n const createdQueue = this.add(queue_id, {\n list,\n createdAt,\n name,\n status: Status.PENDING,\n actions: {\n run: () => {\n list.next({\n context: this.getContext(),\n });\n },\n cancel: () => {\n list.cancel();\n },\n setStorage: (...args) => {\n list.setStorage(...args);\n },\n getStorage: () => {\n return list.getStorage();\n },\n },\n });\n\n // Persist initial queue\n // Note: we need to first insert the queue, and then it can be updated by internal events.\n await this.persistor.insertQueue({\n id: queue_id,\n createdAt,\n name: createdQueue.name,\n status: createdQueue.status,\n tasks: list.tasks,\n state: list.state,\n storage: list.getStorage(),\n });\n\n // adding initial tasks\n def.run.forEach((action) => {\n console.log('action', action);\n list.createTask(action);\n });\n\n // After creating a new queue, try to run.\n this.execute();\n return queue_id;\n }\n\n /**\n * Get a queue by its ID.\n *\n * @returns An object includes queue and its state in `Manager`.\n */\n public get(queue_id: QueueID) {\n return this.queues.get(queue_id);\n }\n\n /**\n * Get all queues from `Manager`\n *\n * @returns a list of queues includes all the queues and their states.\n */\n public getAll() {\n return this.queues;\n }\n\n /**\n *\n * Ask from manager to run pending queues.\n *\n * It only try to run queues with `PENDING` status and ignore all the other statuses.\n *\n */\n public execute() {\n if (!this.shouldExecute()) return;\n\n for (const [, q] of Array.from(this.queues)) {\n if (q.status === Status.PENDING) {\n console.log('There is a pending queue. Run it.');\n q.actions.run();\n }\n }\n\n console.log('There is no pending queue.');\n }\n\n /**\n *\n * Try to find queues with `RUNNING` status to run them again.\n *\n * It's useful for recovering the queue at some certain points\n * like running a currepted task (reloaded when it was running) or needs manual trigger from UI.\n *\n * @returns\n */\n public resume() {\n if (!this.shouldExecute()) return;\n\n for (const [, q] of Array.from(this.queues)) {\n if (q.status === Status.RUNNING) {\n console.log(\"Found a running queue. Let's resume the queue.\", q);\n q.list.resume({\n context: this.getContext(),\n });\n return;\n }\n }\n\n // If there is no running queue, try to run a new queue.\n this.execute();\n }\n\n /**\n *\n * Run all `BLOCKED` queues once again.\n *\n * If a queue has `BLOCKED` status and the last task is `BLOCKED` as well,\n * The task will be run one more time.\n *\n * Useful for scenarios like we are blocking the queue under some conditions in task,\n * We can use this method to ask the queue to run the blocked task one more time and\n * maybe this time condtions are met and the queue can be proceed.\n *\n * @returns\n */\n public retry() {\n if (!this.shouldExecute()) return;\n\n for (const [, q] of Array.from(this.queues)) {\n if (q.status === Status.BLOCKED) {\n console.log(\n `[Retry] Found: ${q.list.id}, Running onBlock callback.`,\n q\n );\n q.list.checkBlock();\n }\n }\n\n // If there is no running queue, try to run a new queue.\n this.execute();\n }\n\n /**\n *\n * Run a blocked task on a specific queue with the ability to pass more data.\n *\n * Useful when we have a custom logic for running queue and needs to pass some specific data\n * to the task and try to run it manually with the provided data.\n *\n */\n public forceExecute(queue_id: string, data?: object) {\n const queue = this.get(queue_id);\n let context = this.getContext();\n if (data) {\n context = {\n ...context,\n ...data,\n };\n }\n\n queue?.list.forceRun({\n context,\n });\n }\n\n /**\n *\n * Sync in-memory state (of `Manager`) with storage (persist).\n *\n * Usually we call this method after a change detected in the state of manager.\n *\n */\n private handleUpdate(queue_id: QueueID) {\n const queue = this.get(queue_id);\n\n if (queue) {\n const status = queue.status;\n const state = queue.list.state;\n const tasks = queue.list.tasks;\n this.persistor.updateQueue(queue_id, {\n status,\n state,\n tasks,\n storage: queue.list.getStorage(),\n });\n }\n }\n\n /**\n * Active readonly mode for manager, it means it doesn't run anythin,\n * And only can be used to read the data.\n */\n public pause() {\n this.isPaused = true;\n }\n\n /**\n * Activate normal mode which means it will be able to run the queuese as well.\n */\n public run() {\n // If call this method multiple times, it should be run for once.\n if (this.isPaused) {\n this.isPaused = false;\n this.sync();\n }\n }\n\n private getContext() {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n //@ts-ignore\n return this.context?.current || {};\n }\n\n private shouldExecute() {\n console.log('[shouldExecute] checking and result is:', {\n isPaused: this.isPaused,\n });\n return !this.isPaused;\n }\n}\n\nexport { Manager };\n"],"names":["DB_NAME","OBJECT_STORE_NAME","VERSION","Persistor","db","openDB","upgrade","createObjectStore","keyPath","_proto","prototype","insertQueue","_insertQueue","_asyncToGenerator","_regeneratorRuntime","mark","_callee","queue","queueRecord","wrap","_callee$","_context","prev","next","sent","get","id","console","log","add","stop","_x","apply","arguments","updateQueue","_updateQueue","_callee2","currentRecord","updatedRecord","_callee2$","_context2","abrupt","_extends","put","_x2","_x3","getAll","_getAll","_callee3","results","_callee3$","_context3","Status","Queue","options","status","PENDING","activeTaskIndex","tasks","events","actions","updateQueueStatus","state","onUpdateListStatus","updateActiveTaskIndex","index","updateTaskState","nextState","blockedFor","updatedTaskEvent","task","action","find","onUpdate","createTask","uuidv4","push","createdTask","onCreate","initTasks","info","storage","forEach","_this","t","checkBlock","currentActiveTask","getActiveTask","BLOCKED","onBlock","reason","lastTaskIsSuccessful","lastTask","length","lastTaskState","SUCCESS","firstTaskIsStarted","firstTask","firstTaskState","check","currentListStatus","nextListStatus","RUNNING","_iterator","_createForOfIteratorHelperLoose","_step","done","value","FAILED","params","activeTask","activeTaskState","CANCELED","execute","context","getContext","_this2","markCurrentTaskAsFinished","retry","resume","failed","schedule","getStorage","bind","setStorage","block","unblock","_ref","_ref$silent","silent","Error","onUnblock","forceRun","currentTask","_this3","resetState","cancel","includes","Object","keys","_this4","data","onStorageUpdate","_queue","Manager","Map","defaultEventHandlers","onCreateQueue","onCreateTask","onUpdateQueue","onUpdateTask","onTaskBlock","onPersistedDataLoaded","queuesDefs","map","qDef","set","name","persistor","sync","isPaused","pause","_sync","queues","q","list","createQueue","queue_id","queue_name","createdAt","run","shouldExecute","manager","def","handleUpdate","_def$events","_def$events2","_def$events3","_def$events4","event","whenTaskBlocked","getBlockedTasks","forceExecute","blockedTasks","task_id","createdQueue","create","_create","has","Date","now","_i","_Array$from","Array","from","_Array$from$_i","_i2","_Array$from2","_Array$from2$_i","_i3","_Array$from3","_Array$from3$_i","_this$context","current"],"mappings":"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"}
1
+ {"version":3,"file":"queue-manager-core.cjs.development.js","sources":["../src/persistor.ts","../src/types.ts","../src/queue.ts","../src/manager.ts"],"sourcesContent":["import { openDB, DBSchema, IDBPDatabase } from 'idb';\n\nimport { QueueID } from './manager';\nimport { PersistedQueue } from './types';\n\nexport const DB_NAME = 'queues-manager';\nconst OBJECT_STORE_NAME = 'queues';\nconst VERSION = 1;\n\ntype UpdatePersistedQueue = Partial<\n Pick<PersistedQueue, 'status' | 'state' | 'tasks' | 'storage'>\n>;\n\ninterface Database extends DBSchema {\n queues: {\n value: PersistedQueue;\n key: string;\n };\n}\n\nclass Persistor {\n db: Promise<IDBPDatabase<Database>>;\n constructor() {\n this.db = openDB<Database>(DB_NAME, VERSION, {\n upgrade(db) {\n db.createObjectStore(OBJECT_STORE_NAME, { keyPath: 'id' });\n },\n });\n }\n async insertQueue(queue: PersistedQueue) {\n const db = await this.db;\n const queueRecord = await db.get(OBJECT_STORE_NAME, queue.id);\n if (queueRecord) {\n console.log('[Persistor] Queue already exists inside persistor.');\n } else {\n await db.add(OBJECT_STORE_NAME, queue);\n console.log('[Persistor] Queue added to IndexedDB successfully.');\n }\n }\n async updateQueue(id: QueueID, queue: UpdatePersistedQueue) {\n const db = await this.db;\n const currentRecord = await db.get(OBJECT_STORE_NAME, id);\n\n if (!currentRecord) {\n console.log(\"[Persistor] Requested queue for update doesn't exist.\");\n return;\n }\n\n const updatedRecord = {\n ...currentRecord,\n ...queue,\n };\n await db.put(OBJECT_STORE_NAME, updatedRecord);\n }\n async getAll() {\n const db = await this.db;\n const results = await db.getAll(OBJECT_STORE_NAME);\n\n return results;\n }\n}\n\nexport default Persistor;\n","import { QueueID, QueueName } from './manager';\nimport Queue, { QueueState, Task } from './queue';\n\nexport enum Status {\n PENDING = 'PENDING',\n RUNNING = 'RUNNING',\n FAILED = 'FAILED',\n SUCCESS = 'SUCCESS',\n CANCELED = 'CANCELED',\n BLOCKED = 'BLOCKED',\n}\n\nexport type QueueStorage = Record<string, unknown>;\n\nexport type QueueType = Queue;\n\nexport interface PersistedQueue {\n id: QueueID;\n createdAt: number;\n name: QueueName;\n status: Status;\n state: QueueState;\n tasks: Task[];\n storage: QueueStorage;\n}\n","import { v4 as uuidv4 } from 'uuid';\nimport { ManagerContext, QueueDef, QueueID } from './manager';\nimport { QueueStorage, Status } from './types';\n\ntype TaskId = string;\nexport type TaskState = {\n status: Status;\n blockedFor: any;\n};\n\nexport interface QueueContext {\n _queue?: {\n id: string;\n };\n}\nexport type NextParams = {\n context: ManagerContext;\n};\n\nexport interface QueueState {\n status: Status;\n activeTaskIndex: number;\n tasks: {\n [key in TaskId]: TaskState;\n };\n}\n\nexport interface Task {\n id: TaskId;\n action: string;\n}\n\nexport type InitTasks = {\n tasks: Task[];\n state: QueueState;\n storage: QueueStorage;\n};\n\nexport interface TaskEvent {\n id: TaskId;\n task: TaskState;\n action: string;\n}\n\nexport interface QueueEventHandlers {\n // all tasks\n onUpdateListStatus: (status: Status) => void;\n // single task\n onCreate: (event: TaskEvent) => void;\n onUpdate: (event: TaskEvent) => void;\n onStorageUpdate: (data: QueueStorage) => void;\n onBlock: (\n data: Omit<TaskEvent, 'task'> & { reason: Record<string, unknown> }\n ) => void;\n onUnblock: (data: { id: string }) => void;\n}\n\ninterface QueueOptions {\n id: QueueID;\n events: QueueEventHandlers;\n actions: QueueDef['actions'];\n}\n\n/**\n *\n * Notes on statuses:\n * - Success: last task has success status\n * - Failed: any of task has been failed\n * - Running: first task is not on pending\n * - Pending: default state. not started\n *\n */\nclass Queue {\n public id: string;\n public state: QueueState = {\n status: Status.PENDING,\n activeTaskIndex: 0,\n tasks: {},\n };\n public tasks: Task[] = [];\n private events: QueueOptions['events'];\n private actions: QueueOptions['actions'];\n private storage: QueueStorage = {};\n\n constructor(options: QueueOptions) {\n this.id = options.id;\n this.events = options.events;\n this.actions = options.actions;\n }\n\n /**\n * Update queue status and trigger an event\n *\n */\n private updateQueueStatus(status: Status) {\n this.state.status = status;\n this.events.onUpdateListStatus(status);\n }\n\n private updateActiveTaskIndex(index: number) {\n this.state.activeTaskIndex = index;\n }\n\n /**\n *\n * Update task state (`status`, `blockedFor`) and trigger an event.\n * @param id\n * @param nextState\n */\n private updateTaskState(id: TaskId, nextState: Partial<TaskState>) {\n if (nextState.status) {\n this.state.tasks[id].status = nextState.status;\n }\n if (nextState.blockedFor) {\n this.state.tasks[id].blockedFor = nextState.blockedFor;\n }\n\n const updatedTaskEvent = {\n id: id,\n task: this.get(id)!,\n action: this.tasks.find((task) => task.id === id)!.action,\n };\n this.events.onUpdate(updatedTaskEvent);\n }\n\n /**\n * Create a task by providing an `action` name.\n *\n * this method creating the task, push it to the queue's tasks and trigger an event.\n * @param action\n */\n createTask(action: string) {\n const id = uuidv4();\n this.tasks.push({\n action,\n id,\n });\n this.state.tasks[id] = {\n status: Status.PENDING,\n blockedFor: null,\n };\n\n const createdTask = this.get(id);\n this.events.onCreate({\n id,\n task: createdTask!,\n action,\n });\n }\n\n /**\n * Initilize a queue with some tasks, instead of an empty queue.\n *\n * Using it for recover the queue state from persistor.\n *\n */\n public initTasks(info: InitTasks) {\n this.state = info.state;\n this.storage = info.storage;\n\n info.tasks.forEach((task) => {\n this.tasks.push(task);\n const action = this.tasks.find((t) => t.id === task.id)!.action;\n this.events.onCreate({\n id: task.id,\n task: this.get(task.id)!,\n action,\n });\n });\n }\n\n public checkBlock() {\n const currentActiveTask = this.getActiveTask();\n\n if (!currentActiveTask) {\n return;\n }\n const { task, state } = currentActiveTask;\n\n if (state.status === Status.BLOCKED) {\n this.events.onBlock({\n action: task.action,\n id: task.id,\n reason: state.blockedFor,\n });\n }\n }\n\n /**\n * Getting task state by ID\n */\n public get(id: string): TaskState | null {\n const task = this.state.tasks[id];\n\n if (!task) return null;\n\n return task;\n }\n\n /**\n *\n * Checking if status of the last is `SUCCESS` or not\n *\n */\n private lastTaskIsSuccessful() {\n const lastTask = this.tasks[this.tasks.length - 1];\n\n // checking for empty lists.\n if (lastTask) {\n const lastTaskState = this.state.tasks[lastTask.id];\n\n // Maybe we didn't create the state yet. It should has success status as well.\n if (!!lastTaskState && lastTaskState.status === Status.SUCCESS) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * If the first task started (it's not PENDING),\n * it means the queue has been ran.\n *\n * @returns\n */\n private firstTaskIsStarted() {\n const firstTask = this.tasks[0];\n\n // checking for empty lists.\n if (firstTask) {\n const firstTaskState = this.state.tasks[firstTask.id];\n\n // Maybe we didn't create the state yet.\n if (!!firstTaskState) {\n if (firstTaskState.status !== Status.PENDING) {\n return true;\n }\n }\n }\n\n return false;\n }\n\n /**\n * Getting active task index from state and\n * returns the task and its state.\n *\n */\n private getActiveTask() {\n // First try to get task with `activeTask`\n const index = this.state.activeTaskIndex;\n const task = this.tasks[index];\n\n // Consider all the tasks has been executed.\n if (!task) {\n return null;\n }\n\n const state = this.state.tasks[task.id];\n\n return { task, state, index };\n }\n\n /**\n * Update and find the queue status by checking state of each tasks in the queue.\n */\n public check() {\n const currentListStatus = this.state.status;\n let nextListStatus = this.firstTaskIsStarted()\n ? Status.RUNNING\n : Status.PENDING;\n\n if (this.lastTaskIsSuccessful()) {\n nextListStatus = Status.SUCCESS;\n } else {\n // Is there any failed task?\n for (const task of this.tasks) {\n const state = this.state.tasks[task.id];\n\n // If one item fails, we stop to work on the list.\n if (state.status === Status.FAILED) {\n nextListStatus = Status.FAILED;\n break;\n }\n }\n }\n\n // We only update and trigger an event when there is a new value\n if (nextListStatus !== currentListStatus) {\n this.updateQueueStatus(nextListStatus);\n }\n }\n\n /**\n * Execute active task.\n * Based on the state of active task, the behaviour is different. If status is:\n * - Success -> we need to go to next task by updating the active index and try `next` on more time.\n * - Failed, Running, or no active task -> doesn't do anything.\n * - Pending or Blocked -> update the task and queue status to running, and execute the provided `action` for the task.\n *\n * The queue is a linked list somehow, active task means the pointer to where we are in the queue right now.\n *\n */\n public next(params: NextParams) {\n console.log('[next]', this.state, params);\n\n this.check();\n\n const currentActiveTask = this.getActiveTask();\n\n if (!currentActiveTask) {\n return;\n }\n\n const {\n index: activeTaskIndex,\n task: activeTask,\n state: activeTaskState,\n } = currentActiveTask;\n\n // if `activeTask` is already done, we will go for next one.\n if (activeTaskState.status === Status.SUCCESS) {\n this.updateActiveTaskIndex(activeTaskIndex + 1);\n this.next(params);\n return;\n }\n\n if (activeTaskState.status === Status.FAILED) {\n console.log('Task has been failed. It can not be proceed.');\n return;\n }\n\n if (activeTaskState.status === Status.CANCELED) {\n console.log('Task has been canceled. It can not be proceed.');\n return;\n }\n\n if (activeTaskState.status === Status.RUNNING) {\n console.log('Task is running. It can not be proceed.');\n return;\n }\n\n if (\n activeTaskState.status === Status.PENDING ||\n activeTaskState.status === Status.BLOCKED\n ) {\n // Update task status to `running`\n this.updateTaskState(activeTask.id, {\n status: Status.RUNNING,\n });\n this.updateQueueStatus(Status.RUNNING);\n\n // Try to execute task.\n const execute = this.actions[activeTask.action];\n execute({\n context: this.getContext(params),\n next: () => {\n console.log('[execute][next]', params);\n this.markCurrentTaskAsFinished(params);\n },\n retry: () => {\n this.resume(params);\n },\n failed: () => {\n this.updateTaskState(activeTask.id, {\n status: Status.FAILED,\n });\n this.check();\n },\n schedule: (action) => {\n this.createTask(action);\n this.check();\n },\n getStorage: this.getStorage.bind(this),\n setStorage: this.setStorage.bind(this),\n block: (reason: Record<string, unknown>) => {\n this.block({ reason });\n },\n unblock: () => {\n this.unblock();\n },\n });\n }\n }\n\n /**\n * Change the `status` of active task and queue to BLOCKED, then trigger an event.\n */\n public block({\n reason,\n silent = false,\n }: {\n reason: Record<string, unknown>;\n silent?: boolean;\n }) {\n const currentActiveTask = this.getActiveTask();\n\n if (!currentActiveTask) {\n throw new Error(\"Task isn't exist.\");\n }\n\n this.updateTaskState(currentActiveTask.task.id, {\n status: Status.BLOCKED,\n blockedFor: reason,\n });\n this.updateQueueStatus(Status.BLOCKED);\n\n if (!silent) {\n this.events.onBlock({\n action: currentActiveTask.task.action,\n id: currentActiveTask.task.id,\n reason,\n });\n }\n }\n\n /**\n * If the active task is `BLOCKED`, update the task status to `PENDING`, queue status to `RUNNING`\n * then trigger an event.\n */\n public unblock() {\n const currentActiveTask = this.getActiveTask();\n\n if (\n !currentActiveTask ||\n currentActiveTask.state.status !== Status.BLOCKED\n ) {\n throw new Error('Task is not blocked.');\n }\n\n this.updateTaskState(currentActiveTask.task.id, {\n status: Status.PENDING,\n });\n this.updateQueueStatus(Status.RUNNING);\n this.events.onUnblock({ id: currentActiveTask.task.id });\n }\n\n /**\n * If the active task is `BLOCKED` then execute the `action` for the task.\n *\n * It is useful for when we need to run a blocked task without changing the status of task at the first place.\n * For scenarios like we have some conditions in `action` and needs to run the `action` again\n * to check the conditions are met or not, if yes, so we can proceed the `action`.\n *\n */\n public forceRun(params: NextParams) {\n const currentTask = this.getActiveTask();\n\n if (!currentTask || currentTask.state.status !== Status.BLOCKED) {\n throw new Error('Task is not blocked.');\n }\n\n // Try to execute task.\n const execute = this.actions[currentTask.task.action];\n execute({\n context: this.getContext(params),\n next: () => {\n console.log('[force run][execute][next]', params);\n\n /*\n NOTE:\n When running `forceRun`, the status of task can be `BLOCKED`\n So we need to change to `Running` first. \n */\n // Update task status to `running`\n this.updateTaskState(currentTask.task.id, {\n status: Status.RUNNING,\n });\n this.updateQueueStatus(Status.RUNNING);\n\n this.markCurrentTaskAsFinished(params);\n },\n retry: () => {\n this.resume(params);\n },\n failed: () => {\n this.updateTaskState(currentTask.task.id, {\n status: Status.FAILED,\n });\n this.check();\n },\n schedule: (action) => {\n this.createTask(action);\n this.check();\n },\n getStorage: this.getStorage.bind(this),\n setStorage: this.setStorage.bind(this),\n block: (reason: Record<string, unknown>) => {\n this.block({ reason });\n },\n unblock: () => {\n this.unblock();\n },\n });\n }\n private markCurrentTaskAsFinished(params: NextParams) {\n this.check();\n const activeTaskIndex = this.state.activeTaskIndex;\n const activeTask = this.tasks[activeTaskIndex];\n\n if (!activeTask) {\n console.log(\"It seems this queue has been finished. Task doesn't exist.\");\n return;\n }\n\n const activeTaskState = this.state.tasks[activeTask.id];\n if (activeTaskState.status === Status.RUNNING) {\n this.updateTaskState(activeTask.id, {\n status: Status.SUCCESS,\n });\n this.updateActiveTaskIndex(activeTaskIndex + 1);\n\n const updatedTaskEvent = {\n id: activeTask.id,\n task: this.get(activeTask.id)!,\n action: this.tasks.find((task) => task.id === activeTask.id)!.action,\n };\n this.events.onUpdate(updatedTaskEvent);\n this.next(params);\n } else {\n console.log('There is no running task.');\n }\n }\n\n /**\n * If the active task is `RUNNING`, change it to `PENING` the try to run the task by calling `next`.\n * If it's other than `RUNNING` we reset the queue state and run the queue from the beggining.\n *\n * @param params\n * @returns\n */\n public resume(params: NextParams) {\n const activeTaskIndex = this.state.activeTaskIndex;\n const activeTask = this.tasks[activeTaskIndex];\n if (!activeTask) {\n console.log(\"It seems this queue has been finished. Task doesn't exist.\");\n return;\n }\n\n const activeTaskState = this.state.tasks[activeTask.id];\n if (activeTaskState.status === Status.RUNNING) {\n this.updateTaskState(activeTask.id, {\n status: Status.PENDING,\n });\n this.next(params);\n } else {\n console.log('There is no running task. restart the queue', {\n state: this.state.tasks,\n activeTaskState,\n activeTask,\n activeTaskIndex,\n });\n this.resetState();\n this.next(params);\n }\n }\n\n /**\n *\n * Cancel the queue by changing active task and queue status to `CANCELED`.\n *\n */\n public cancel() {\n const currentActiveTask = this.getActiveTask();\n\n if (\n !currentActiveTask ||\n [Status.FAILED, Status.CANCELED, Status.SUCCESS].includes(\n currentActiveTask.state.status\n )\n ) {\n return;\n }\n\n const { task } = currentActiveTask;\n\n // Update task status to `canceled`\n this.updateTaskState(task.id, {\n status: Status.CANCELED,\n });\n const updatedTaskEvent = {\n id: task.id,\n task: this.get(task.id)!,\n action: this.tasks.find((t) => t.id === task.id)!.action,\n };\n this.events.onUpdate(updatedTaskEvent);\n\n // Update queue status to `canceled`\n this.updateQueueStatus(Status.CANCELED);\n }\n\n /**\n * Update queue status, and all the tasks inside queue to `PENDING`.\n */\n private resetState() {\n this.state.activeTaskIndex = 0;\n this.state.status = Status.PENDING;\n Object.keys(this.state.tasks).forEach((id) => {\n this.state.tasks[id].status = Status.PENDING;\n });\n }\n\n public getStorage() {\n return this.storage;\n }\n public setStorage(data: QueueStorage) {\n this.storage = data;\n this.events.onStorageUpdate(data);\n return this.storage;\n }\n\n private getContext(params: NextParams): QueueContext & ManagerContext {\n return {\n ...params.context,\n _queue: {\n id: this.id,\n },\n };\n }\n}\n\nexport default Queue;\n","import Persistor from './persistor';\nimport Queue, { QueueEventHandlers, TaskEvent } from './queue';\nimport { QueueStorage, Status } from './types';\nimport { v4 as uuidv4 } from 'uuid';\n\nexport type ManagerContext = object;\nexport type QueueName = string;\nexport type QueueID = string;\nexport type BlockedTask = {\n queue_id: string;\n task_id: string;\n action: string;\n reason: Record<string, unknown>;\n storage: {\n get: () => QueueStorage;\n set: (data: QueueStorage) => QueueStorage;\n };\n};\n\nexport type SetStorage<T> = (nextStorage: T) => T;\n\nexport interface ExecuterActions<\n T extends QueueStorage = QueueStorage,\n V extends string = string,\n C = ManagerContext\n> {\n next: () => void;\n retry: () => void;\n failed: () => void;\n schedule: (actionName: V) => void;\n setStorage: SetStorage<T>;\n getStorage: () => T;\n block: (reason: Record<string, unknown>) => void;\n unblock: () => void;\n context: C;\n}\n\nexport interface QueueDef<\n T extends QueueStorage = QueueStorage,\n V extends string = string,\n C = ManagerContext\n> {\n name: QueueName;\n actions: {\n [K in V]: (actions: ExecuterActions<T, V, C>) => void | Promise<void>;\n };\n events?: Partial<QueueEventHandlers>;\n run: V[];\n whenTaskBlocked?: (\n event: any,\n params: {\n queue_id: string;\n queue: Queue;\n context: C;\n getBlockedTasks: () => BlockedTask[];\n forceExecute: (queue_id: string, data?: object) => void;\n retry: () => void;\n manager: Manager;\n }\n ) => void;\n}\n\nexport interface Events {\n onCreateQueue: (queue: QueueInfo & { id: QueueID }) => void;\n onUpdateQueue: (queue_id: QueueID, queue: QueueInfo) => void;\n onCreateTask: (queue_id: QueueID, event: TaskEvent) => void;\n onUpdateTask: (queue_id: QueueID, event: TaskEvent) => void;\n onStorageUpdate: (queue_id: QueueID, data: QueueStorage) => void;\n onTaskBlock: (queue_id: QueueID) => void;\n onPersistedDataLoaded: (manager: Manager) => void;\n}\n\ninterface ManagerOptions {\n events?: Partial<Events>;\n queuesDefs: QueueDef[];\n context?: ManagerContext;\n isPaused?: boolean;\n}\n\nexport interface QueueInfo {\n name: QueueName;\n createdAt: number;\n status: Status;\n list: Queue;\n actions: {\n run: () => void;\n cancel: () => void;\n setStorage: SetStorage<any>;\n getStorage: () => any;\n };\n}\n\nclass Manager {\n private queuesDefs = new Map<QueueName, QueueDef>();\n private queues = new Map<QueueID, QueueInfo>();\n private events: Events;\n private persistor: Persistor;\n private context: ManagerContext;\n private isPaused: boolean = false;\n\n /**\n *\n * Making an instance, initilize events, setup a persistor and try to recover the last state of the manager.\n *\n * */\n constructor(options: ManagerOptions) {\n const defaultEventHandlers: Events = {\n onCreateQueue: () => {\n // ...\n },\n onCreateTask: () => {\n // ...\n },\n onUpdateQueue: () => {\n // ...\n },\n onUpdateTask: () => {\n // ...\n },\n onStorageUpdate: () => {\n // ...\n },\n onTaskBlock: () => {\n // ...\n },\n onPersistedDataLoaded: () => {\n // ..\n },\n };\n\n if (options.events) {\n this.events = {\n ...defaultEventHandlers,\n ...options.events,\n };\n } else {\n this.events = defaultEventHandlers;\n }\n\n options.queuesDefs.map((qDef) => {\n this.queuesDefs.set(qDef.name, qDef);\n });\n\n this.context = options.context || {};\n this.persistor = new Persistor();\n this.sync();\n\n if (options.isPaused) {\n this.pause();\n }\n }\n\n /**\n *\n * Reading persisted data from storage then brings into memory.\n *\n * Notes:\n * - Reset the memory, so we can call this method whenever we want and not only on the initialize process.\n * - All the events will be tirggered (like onCreateQueue, onCreateTask, onBlock, ....)\n * - Try to `resume` if the status is `running`.\n * - Trigger `onPersistedDataLoaded` event when queues recovered from storage.\n *\n */\n private async sync() {\n // Reading queues from storage\n const queues = await this.persistor.getAll();\n\n // Reset queues, if anything is exist in memory.\n this.queues = new Map();\n\n // Brings them into memory\n queues.forEach((q) => {\n const list = this.createQueue({\n queue_id: q.id,\n queue_name: q.name,\n });\n this.add(q.id, {\n list,\n createdAt: q.createdAt,\n name: q.name,\n status: q.status,\n actions: {\n run: () => {\n list.next({\n context: this.getContext(),\n });\n },\n cancel: () => {\n list.cancel();\n },\n setStorage: (...args) => {\n list.setStorage(...args);\n },\n getStorage: () => {\n return list.getStorage();\n },\n },\n });\n\n list.initTasks({\n state: q.state,\n tasks: q.tasks,\n storage: q.storage || {},\n });\n\n if (q.status === Status.RUNNING && this.shouldExecute()) {\n console.log('[INIT] Try to resume');\n list.resume({\n context: this.getContext(),\n });\n }\n });\n\n // Trigger an event to let the subscribers we are done here.\n this.events.onPersistedDataLoaded(this);\n }\n\n /**\n *\n * Making a new instance from `Queue` and adds Manager's event handlers to it.\n *\n * @returns An instance of `Queue` with wrapped event handlers from Manager.\n *\n */\n private createQueue({\n queue_id,\n queue_name,\n }: {\n queue_id: QueueID;\n queue_name: QueueName;\n }) {\n const manager = this;\n const def = this.queuesDefs.get(queue_name)!;\n const list = new Queue({\n id: queue_id,\n events: {\n onCreate: (task) => {\n this.events.onCreateTask(queue_id, task);\n this.handleUpdate(queue_id);\n\n if (def.events?.onCreate) def.events.onCreate(task);\n },\n onUpdate: (task) => {\n this.events.onUpdateTask(queue_id, task);\n this.handleUpdate(queue_id);\n\n if (def.events?.onUpdate) def.events.onUpdate(task);\n },\n onUpdateListStatus: (status) => {\n this.queues.set(queue_id, {\n ...this.get(queue_id)!,\n status,\n });\n this.events.onUpdateQueue(queue_id, this.get(queue_id)!);\n\n this.handleUpdate(queue_id);\n\n // After finishing a queue, try to run other queues.\n this.execute();\n if (def.events?.onUpdateListStatus)\n def.events.onUpdateListStatus(status);\n },\n onStorageUpdate: (data) => {\n this.events.onStorageUpdate(queue_id, data);\n if (def.events?.onStorageUpdate) def.events.onStorageUpdate(data);\n this.handleUpdate(queue_id);\n },\n onBlock: (event) => {\n // Update queue status\n this.queues.set(queue_id, {\n ...this.get(queue_id)!,\n status: Status.BLOCKED,\n });\n\n // Trigger event\n this.events.onTaskBlock(queue_id);\n if (def.whenTaskBlocked) {\n def.whenTaskBlocked(event, {\n queue_id: queue_id,\n queue: list,\n context: this.getContext(),\n getBlockedTasks: this.getBlockedTasks.bind(this),\n forceExecute: this.forceExecute.bind(this),\n retry: this.retry.bind(this),\n manager,\n });\n }\n\n // Sync\n this.handleUpdate(queue_id);\n },\n onUnblock: () => {\n // Update queue status\n this.queues.set(queue_id, {\n ...this.get(queue_id)!,\n status: Status.PENDING,\n });\n\n // Sync\n this.handleUpdate(queue_id);\n\n this.execute();\n },\n },\n actions: def.actions,\n });\n return list;\n }\n\n /**\n * Go through all tasks (from all queues) and return a list of blocked tasks\n *\n * @returns a list of blocked tasks including enough information to get the queue and mutate the storage.\n *\n */\n private getBlockedTasks() {\n const queues = this.getAll();\n const blockedTasks: BlockedTask[] = [];\n queues.forEach((q, queue_id) => {\n q.list.tasks.forEach((task) => {\n const state = q.list.state.tasks[task.id];\n if (state.status === Status.BLOCKED) {\n blockedTasks.push({\n task_id: task.id,\n queue_id: queue_id,\n action: task.action,\n reason: state.blockedFor,\n storage: {\n get: () => {\n return q.list.getStorage();\n },\n set: (data) => {\n return q.list.setStorage(data);\n },\n },\n });\n }\n });\n });\n\n return blockedTasks;\n }\n\n /**\n *\n * Add a queue to the manager to keep track of the queue and its state.\n *\n * @param id\n * @param queue\n * @returns\n */\n private add(id: QueueID, queue: QueueInfo) {\n this.queues.set(id, queue);\n const createdQueue = this.get(id)!;\n this.events.onCreateQueue({ ...createdQueue, id });\n\n return createdQueue;\n }\n\n // Create a new queue\n /**\n *\n * Create a new queue by client.\n *\n * It will do the internal things to make a queue from definitions, and running using Manager.\n *\n * Notes:\n * - After creating the queue, it will be run automatically.\n *\n * @returns an ID for queue so it can be used to get the created queue later by client.\n *\n */\n public async create(\n name: QueueName,\n storage: QueueStorage,\n options?: { id?: QueueID }\n ) {\n if (!this.queuesDefs.has(name)) {\n throw new Error('You need to add a queue definition first.');\n }\n const def = this.queuesDefs.get(name)!;\n const queue_id: QueueID = options?.id || uuidv4();\n const createdAt = Date.now();\n const list = this.createQueue({\n queue_id: queue_id,\n queue_name: name,\n });\n list.setStorage(storage);\n\n const createdQueue = this.add(queue_id, {\n list,\n createdAt,\n name,\n status: Status.PENDING,\n actions: {\n run: () => {\n list.next({\n context: this.getContext(),\n });\n },\n cancel: () => {\n list.cancel();\n },\n setStorage: (...args) => {\n list.setStorage(...args);\n },\n getStorage: () => {\n return list.getStorage();\n },\n },\n });\n\n // Persist initial queue\n // Note: we need to first insert the queue, and then it can be updated by internal events.\n await this.persistor.insertQueue({\n id: queue_id,\n createdAt,\n name: createdQueue.name,\n status: createdQueue.status,\n tasks: list.tasks,\n state: list.state,\n storage: list.getStorage(),\n });\n\n // adding initial tasks\n def.run.forEach((action) => {\n console.log('action', action);\n list.createTask(action);\n });\n\n // After creating a new queue, try to run.\n this.execute();\n return queue_id;\n }\n\n /**\n * Get a queue by its ID.\n *\n * @returns An object includes queue and its state in `Manager`.\n */\n public get(queue_id: QueueID) {\n return this.queues.get(queue_id);\n }\n\n /**\n * Get all queues from `Manager`\n *\n * @returns a list of queues includes all the queues and their states.\n */\n public getAll() {\n return this.queues;\n }\n\n /**\n *\n * Ask from manager to run pending queues.\n *\n * It only try to run queues with `PENDING` status and ignore all the other statuses.\n *\n */\n public execute() {\n if (!this.shouldExecute()) return;\n\n for (const [, q] of Array.from(this.queues)) {\n if (q.status === Status.PENDING) {\n console.log('There is a pending queue. Run it.');\n q.actions.run();\n }\n }\n\n console.log('There is no pending queue.');\n }\n\n /**\n *\n * Try to find queues with `RUNNING` status to run them again.\n *\n * It's useful for recovering the queue at some certain points\n * like running a currepted task (reloaded when it was running) or needs manual trigger from UI.\n *\n * @returns\n */\n public resume() {\n if (!this.shouldExecute()) return;\n\n for (const [, q] of Array.from(this.queues)) {\n if (q.status === Status.RUNNING) {\n console.log(\"Found a running queue. Let's resume the queue.\", q);\n q.list.resume({\n context: this.getContext(),\n });\n return;\n }\n }\n\n // If there is no running queue, try to run a new queue.\n this.execute();\n }\n\n /**\n *\n * Run all `BLOCKED` queues once again.\n *\n * If a queue has `BLOCKED` status and the last task is `BLOCKED` as well,\n * The task will be run one more time.\n *\n * Useful for scenarios like we are blocking the queue under some conditions in task,\n * We can use this method to ask the queue to run the blocked task one more time and\n * maybe this time condtions are met and the queue can be proceed.\n *\n * @returns\n */\n public retry() {\n if (!this.shouldExecute()) return;\n\n for (const [, q] of Array.from(this.queues)) {\n if (q.status === Status.BLOCKED) {\n console.log(\n `[Retry] Found: ${q.list.id}, Running onBlock callback.`,\n q\n );\n q.list.checkBlock();\n }\n }\n\n // If there is no running queue, try to run a new queue.\n this.execute();\n }\n\n /**\n *\n * Run a blocked task on a specific queue with the ability to pass more data.\n *\n * Useful when we have a custom logic for running queue and needs to pass some specific data\n * to the task and try to run it manually with the provided data.\n *\n */\n public forceExecute(queue_id: string, data?: object) {\n const queue = this.get(queue_id);\n let context = this.getContext();\n if (data) {\n context = {\n ...context,\n ...data,\n };\n }\n\n queue?.list.forceRun({\n context,\n });\n }\n\n /**\n *\n * Sync in-memory state (of `Manager`) with storage (persist).\n *\n * Usually we call this method after a change detected in the state of manager.\n *\n */\n private handleUpdate(queue_id: QueueID) {\n const queue = this.get(queue_id);\n\n if (queue) {\n const status = queue.status;\n const state = queue.list.state;\n const tasks = queue.list.tasks;\n this.persistor.updateQueue(queue_id, {\n status,\n state,\n tasks,\n storage: queue.list.getStorage(),\n });\n }\n }\n\n /**\n * Active readonly mode for manager, it means it doesn't run anythin,\n * And only can be used to read the data.\n */\n public pause() {\n this.isPaused = true;\n }\n\n /**\n * Activate normal mode which means it will be able to run the queuese as well.\n */\n public run() {\n // If call this method multiple times, it should be run for once.\n if (this.isPaused) {\n this.isPaused = false;\n this.sync();\n }\n }\n\n private getContext() {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n //@ts-ignore\n return this.context?.current || {};\n }\n\n private shouldExecute() {\n console.log('[shouldExecute] checking and result is:', {\n isPaused: this.isPaused,\n });\n return !this.isPaused;\n }\n}\n\nexport { Manager };\n"],"names":["DB_NAME","OBJECT_STORE_NAME","VERSION","Persistor","db","openDB","upgrade","createObjectStore","keyPath","_proto","prototype","insertQueue","_insertQueue","_asyncToGenerator","_regeneratorRuntime","mark","_callee","queue","queueRecord","wrap","_callee$","_context","prev","next","sent","get","id","console","log","add","stop","_x","apply","arguments","updateQueue","_updateQueue","_callee2","currentRecord","updatedRecord","_callee2$","_context2","abrupt","_extends","put","_x2","_x3","getAll","_getAll","_callee3","results","_callee3$","_context3","Status","Queue","options","status","PENDING","activeTaskIndex","tasks","events","actions","updateQueueStatus","state","onUpdateListStatus","updateActiveTaskIndex","index","updateTaskState","nextState","blockedFor","updatedTaskEvent","task","action","find","onUpdate","createTask","uuidv4","push","createdTask","onCreate","initTasks","info","storage","forEach","_this","t","checkBlock","currentActiveTask","getActiveTask","BLOCKED","onBlock","reason","lastTaskIsSuccessful","lastTask","length","lastTaskState","SUCCESS","firstTaskIsStarted","firstTask","firstTaskState","check","currentListStatus","nextListStatus","RUNNING","_iterator","_createForOfIteratorHelperLoose","_step","done","value","FAILED","params","activeTask","activeTaskState","CANCELED","execute","context","getContext","_this2","markCurrentTaskAsFinished","retry","resume","failed","schedule","getStorage","bind","setStorage","block","unblock","_ref","_ref$silent","silent","Error","onUnblock","forceRun","currentTask","_this3","resetState","cancel","includes","Object","keys","_this4","data","onStorageUpdate","_queue","Manager","Map","defaultEventHandlers","onCreateQueue","onCreateTask","onUpdateQueue","onUpdateTask","onTaskBlock","onPersistedDataLoaded","queuesDefs","map","qDef","set","name","persistor","sync","isPaused","pause","_sync","queues","q","list","createQueue","queue_id","queue_name","createdAt","run","shouldExecute","manager","def","handleUpdate","_def$events","_def$events2","_def$events3","_def$events4","event","whenTaskBlocked","getBlockedTasks","forceExecute","blockedTasks","task_id","createdQueue","create","_create","has","Date","now","_i","_Array$from","Array","from","_Array$from$_i","_i2","_Array$from2","_Array$from2$_i","_i3","_Array$from3","_Array$from3$_i","_this$context","current"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var t=require("uuid"),e=require("idb");function n(){n=function(){return t};var t={},e=Object.prototype,s=e.hasOwnProperty,r=Object.defineProperty||function(t,e,n){t[e]=n.value},a="function"==typeof Symbol?Symbol:{},o=a.iterator||"@@iterator",i=a.asyncIterator||"@@asyncIterator",u=a.toStringTag||"@@toStringTag";function c(t,e,n){return Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}),t[e]}try{c({},"")}catch(t){c=function(t,e,n){return t[e]=n}}function h(t,e,n,s){var a=Object.create((e&&e.prototype instanceof l?e:l).prototype),o=new T(s||[]);return r(a,"_invoke",{value:E(t,n,o)}),a}function d(t,e,n){try{return{type:"normal",arg:t.call(e,n)}}catch(t){return{type:"throw",arg:t}}}t.wrap=h;var f={};function l(){}function p(){}function v(){}var g={};c(g,o,(function(){return this}));var k=Object.getPrototypeOf,x=k&&k(k(I([])));x&&x!==e&&s.call(x,o)&&(g=x);var S=v.prototype=l.prototype=Object.create(g);function y(t){["next","throw","return"].forEach((function(e){c(t,e,(function(t){return this._invoke(e,t)}))}))}function m(t,e){var n;r(this,"_invoke",{value:function(r,a){function o(){return new e((function(n,o){!function n(r,a,o,i){var u=d(t[r],t,a);if("throw"!==u.type){var c=u.arg,h=c.value;return h&&"object"==typeof h&&s.call(h,"__await")?e.resolve(h.__await).then((function(t){n("next",t,o,i)}),(function(t){n("throw",t,o,i)})):e.resolve(h).then((function(t){c.value=t,o(c)}),(function(t){return n("throw",t,o,i)}))}i(u.arg)}(r,a,n,o)}))}return n=n?n.then(o,o):o()}})}function E(t,e,n){var s="suspendedStart";return function(r,a){if("executing"===s)throw new Error("Generator is already running");if("completed"===s){if("throw"===r)throw a;return{value:void 0,done:!0}}for(n.method=r,n.arg=a;;){var o=n.delegate;if(o){var i=b(o,n);if(i){if(i===f)continue;return i}}if("next"===n.method)n.sent=n._sent=n.arg;else if("throw"===n.method){if("suspendedStart"===s)throw s="completed",n.arg;n.dispatchException(n.arg)}else"return"===n.method&&n.abrupt("return",n.arg);s="executing";var u=d(t,e,n);if("normal"===u.type){if(s=n.done?"completed":"suspendedYield",u.arg===f)continue;return{value:u.arg,done:n.done}}"throw"===u.type&&(s="completed",n.method="throw",n.arg=u.arg)}}}function b(t,e){var n=e.method,s=t.iterator[n];if(void 0===s)return e.delegate=null,"throw"===n&&t.iterator.return&&(e.method="return",e.arg=void 0,b(t,e),"throw"===e.method)||"return"!==n&&(e.method="throw",e.arg=new TypeError("The iterator does not provide a '"+n+"' method")),f;var r=d(s,t.iterator,e.arg);if("throw"===r.type)return e.method="throw",e.arg=r.arg,e.delegate=null,f;var a=r.arg;return a?a.done?(e[t.resultName]=a.value,e.next=t.nextLoc,"return"!==e.method&&(e.method="next",e.arg=void 0),e.delegate=null,f):a:(e.method="throw",e.arg=new TypeError("iterator result is not an object"),e.delegate=null,f)}function N(t){var e={tryLoc:t[0]};1 in t&&(e.catchLoc=t[1]),2 in t&&(e.finallyLoc=t[2],e.afterLoc=t[3]),this.tryEntries.push(e)}function w(t){var e=t.completion||{};e.type="normal",delete e.arg,t.completion=e}function T(t){this.tryEntries=[{tryLoc:"root"}],t.forEach(N,this),this.reset(!0)}function I(t){if(t){var e=t[o];if(e)return e.call(t);if("function"==typeof t.next)return t;if(!isNaN(t.length)){var n=-1,r=function e(){for(;++n<t.length;)if(s.call(t,n))return e.value=t[n],e.done=!1,e;return e.value=void 0,e.done=!0,e};return r.next=r}}return{next:C}}function C(){return{value:void 0,done:!0}}return p.prototype=v,r(S,"constructor",{value:v,configurable:!0}),r(v,"constructor",{value:p,configurable:!0}),p.displayName=c(v,u,"GeneratorFunction"),t.isGeneratorFunction=function(t){var e="function"==typeof t&&t.constructor;return!!e&&(e===p||"GeneratorFunction"===(e.displayName||e.name))},t.mark=function(t){return Object.setPrototypeOf?Object.setPrototypeOf(t,v):(t.__proto__=v,c(t,u,"GeneratorFunction")),t.prototype=Object.create(S),t},t.awrap=function(t){return{__await:t}},y(m.prototype),c(m.prototype,i,(function(){return this})),t.AsyncIterator=m,t.async=function(e,n,s,r,a){void 0===a&&(a=Promise);var o=new m(h(e,n,s,r),a);return t.isGeneratorFunction(n)?o:o.next().then((function(t){return t.done?t.value:o.next()}))},y(S),c(S,u,"Generator"),c(S,o,(function(){return this})),c(S,"toString",(function(){return"[object Generator]"})),t.keys=function(t){var e=Object(t),n=[];for(var s in e)n.push(s);return n.reverse(),function t(){for(;n.length;){var s=n.pop();if(s in e)return t.value=s,t.done=!1,t}return t.done=!0,t}},t.values=I,T.prototype={constructor:T,reset:function(t){if(this.prev=0,this.next=0,this.sent=this._sent=void 0,this.done=!1,this.delegate=null,this.method="next",this.arg=void 0,this.tryEntries.forEach(w),!t)for(var e in this)"t"===e.charAt(0)&&s.call(this,e)&&!isNaN(+e.slice(1))&&(this[e]=void 0)},stop:function(){this.done=!0;var t=this.tryEntries[0].completion;if("throw"===t.type)throw t.arg;return this.rval},dispatchException:function(t){if(this.done)throw t;var e=this;function n(n,s){return o.type="throw",o.arg=t,e.next=n,s&&(e.method="next",e.arg=void 0),!!s}for(var r=this.tryEntries.length-1;r>=0;--r){var a=this.tryEntries[r],o=a.completion;if("root"===a.tryLoc)return n("end");if(a.tryLoc<=this.prev){var i=s.call(a,"catchLoc"),u=s.call(a,"finallyLoc");if(i&&u){if(this.prev<a.catchLoc)return n(a.catchLoc,!0);if(this.prev<a.finallyLoc)return n(a.finallyLoc)}else if(i){if(this.prev<a.catchLoc)return n(a.catchLoc,!0)}else{if(!u)throw new Error("try statement without catch or finally");if(this.prev<a.finallyLoc)return n(a.finallyLoc)}}}},abrupt:function(t,e){for(var n=this.tryEntries.length-1;n>=0;--n){var r=this.tryEntries[n];if(r.tryLoc<=this.prev&&s.call(r,"finallyLoc")&&this.prev<r.finallyLoc){var a=r;break}}a&&("break"===t||"continue"===t)&&a.tryLoc<=e&&e<=a.finallyLoc&&(a=null);var o=a?a.completion:{};return o.type=t,o.arg=e,a?(this.method="next",this.next=a.finallyLoc,f):this.complete(o)},complete:function(t,e){if("throw"===t.type)throw t.arg;return"break"===t.type||"continue"===t.type?this.next=t.arg:"return"===t.type?(this.rval=this.arg=t.arg,this.method="return",this.next="end"):"normal"===t.type&&e&&(this.next=e),f},finish:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var n=this.tryEntries[e];if(n.finallyLoc===t)return this.complete(n.completion,n.afterLoc),w(n),f}},catch:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var n=this.tryEntries[e];if(n.tryLoc===t){var s=n.completion;if("throw"===s.type){var r=s.arg;w(n)}return r}}throw new Error("illegal catch attempt")},delegateYield:function(t,e,n){return this.delegate={iterator:I(t),resultName:e,nextLoc:n},"next"===this.method&&(this.arg=void 0),f}},t}function s(t,e,n,s,r,a,o){try{var i=t[a](o),u=i.value}catch(t){return void n(t)}i.done?e(u):Promise.resolve(u).then(s,r)}function r(t){return function(){var e=this,n=arguments;return new Promise((function(r,a){var o=t.apply(e,n);function i(t){s(o,r,a,i,u,"next",t)}function u(t){s(o,r,a,i,u,"throw",t)}i(void 0)}))}}function a(){return(a=Object.assign?Object.assign.bind():function(t){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(t[s]=n[s])}return t}).apply(this,arguments)}function o(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,s=new Array(e);n<e;n++)s[n]=t[n];return s}var i,u=function(){function t(){this.db=e.openDB("queues-manager",1,{upgrade:function(t){t.createObjectStore("queues",{keyPath:"id"})}})}var s=t.prototype;return s.insertQueue=function(){var t=r(n().mark((function t(e){var s;return n().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,this.db;case 2:return s=t.sent,t.next=5,s.get("queues",e.id);case 5:if(!t.sent){t.next=10;break}console.log("[Persistor] Queue already exists inside persistor."),t.next=13;break;case 10:return t.next=12,s.add("queues",e);case 12:console.log("[Persistor] Queue added to IndexedDB successfully.");case 13:case"end":return t.stop()}}),t,this)})));return function(e){return t.apply(this,arguments)}}(),s.updateQueue=function(){var t=r(n().mark((function t(e,s){var r,o,i;return n().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,this.db;case 2:return r=t.sent,t.next=5,r.get("queues",e);case 5:if(o=t.sent){t.next=9;break}return console.log("[Persistor] Requested queue for update doesn't exist."),t.abrupt("return");case 9:return i=a({},o,s),t.next=12,r.put("queues",i);case 12:case"end":return t.stop()}}),t,this)})));return function(e,n){return t.apply(this,arguments)}}(),s.getAll=function(){var t=r(n().mark((function t(){var e;return n().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,this.db;case 2:return e=t.sent,t.next=5,e.getAll("queues");case 5:return t.abrupt("return",t.sent);case 7:case"end":return t.stop()}}),t,this)})));return function(){return t.apply(this,arguments)}}(),t}();(i=exports.Status||(exports.Status={})).PENDING="PENDING",i.RUNNING="RUNNING",i.FAILED="FAILED",i.SUCCESS="SUCCESS",i.CANCELED="CANCELED",i.BLOCKED="BLOCKED";var c=function(){function e(t){this.state={status:exports.Status.PENDING,activeTaskIndex:0,tasks:{}},this.tasks=[],this.storage={},this.id=t.id,this.events=t.events,this.actions=t.actions}var n=e.prototype;return n.updateQueueStatus=function(t){this.state.status=t,this.events.onUpdateListStatus(t)},n.updateActiveTaskIndex=function(t){this.state.activeTaskIndex=t},n.updateTaskState=function(t,e){e.status&&(this.state.tasks[t].status=e.status),e.blockedFor&&(this.state.tasks[t].blockedFor=e.blockedFor);var n={id:t,task:this.get(t),action:this.tasks.find((function(e){return e.id===t})).action};this.events.onUpdate(n)},n.createTask=function(e){var n=t.v4();this.tasks.push({action:e,id:n}),this.state.tasks[n]={status:exports.Status.PENDING,blockedFor:null};var s=this.get(n);this.events.onCreate({id:n,task:s,action:e})},n.initTasks=function(t){var e=this;this.state=t.state,this.storage=t.storage,t.tasks.forEach((function(t){e.tasks.push(t);var n=e.tasks.find((function(e){return e.id===t.id})).action;e.events.onCreate({id:t.id,task:e.get(t.id),action:n})}))},n.checkBlock=function(){var t=this.getActiveTask();if(t){var e=t.task,n=t.state;n.status===exports.Status.BLOCKED&&this.events.onBlock({action:e.action,id:e.id,reason:n.blockedFor})}},n.get=function(t){return this.state.tasks[t]||null},n.lastTaskIsSuccessful=function(){var t=this.tasks[this.tasks.length-1];if(t){var e=this.state.tasks[t.id];if(e&&e.status===exports.Status.SUCCESS)return!0}return!1},n.firstTaskIsStarted=function(){var t=this.tasks[0];if(t){var e=this.state.tasks[t.id];if(e&&e.status!==exports.Status.PENDING)return!0}return!1},n.getActiveTask=function(){var t=this.state.activeTaskIndex,e=this.tasks[t];return e?{task:e,state:this.state.tasks[e.id],index:t}:null},n.check=function(){var t=this.state.status,e=this.firstTaskIsStarted()?exports.Status.RUNNING:exports.Status.PENDING;if(this.lastTaskIsSuccessful())e=exports.Status.SUCCESS;else for(var n,s=function(t,e){var n="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(n)return(n=n.call(t)).next.bind(n);if(Array.isArray(t)||(n=function(t,e){if(t){if("string"==typeof t)return o(t,void 0);var n=Object.prototype.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?o(t,void 0):void 0}}(t))){n&&(t=n);var s=0;return function(){return s>=t.length?{done:!0}:{done:!1,value:t[s++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}(this.tasks);!(n=s()).done;)if(this.state.tasks[n.value.id].status===exports.Status.FAILED){e=exports.Status.FAILED;break}e!==t&&this.updateQueueStatus(e)},n.next=function(t){var e=this;console.log("[next]",this.state,t),this.check();var n=this.getActiveTask();if(n){var s=n.task,r=n.state;if(r.status===exports.Status.SUCCESS)return this.updateActiveTaskIndex(n.index+1),void this.next(t);r.status!==exports.Status.FAILED?r.status!==exports.Status.CANCELED?r.status!==exports.Status.RUNNING?r.status!==exports.Status.PENDING&&r.status!==exports.Status.BLOCKED||(this.updateTaskState(s.id,{status:exports.Status.RUNNING}),this.updateQueueStatus(exports.Status.RUNNING),(0,this.actions[s.action])({context:this.getContext(t),next:function(){console.log("[execute][next]",t),e.markCurrentTaskAsFinished(t)},retry:function(){e.resume(t)},failed:function(){e.updateTaskState(s.id,{status:exports.Status.FAILED}),e.check()},schedule:function(t){e.createTask(t),e.check()},getStorage:this.getStorage.bind(this),setStorage:this.setStorage.bind(this),block:function(t){e.block({reason:t})},unblock:function(){e.unblock()}})):console.log("Task is running. It can not be proceed."):console.log("Task has been canceled. It can not be proceed."):console.log("Task has been failed. It can not be proceed.")}},n.block=function(t){var e=t.reason,n=t.silent,s=void 0!==n&&n,r=this.getActiveTask();if(!r)throw new Error("Task isn't exist.");this.updateTaskState(r.task.id,{status:exports.Status.BLOCKED,blockedFor:e}),this.updateQueueStatus(exports.Status.BLOCKED),s||this.events.onBlock({action:r.task.action,id:r.task.id,reason:e})},n.unblock=function(){var t=this.getActiveTask();if(!t||t.state.status!==exports.Status.BLOCKED)throw new Error("Task is not blocked.");this.updateTaskState(t.task.id,{status:exports.Status.PENDING}),this.updateQueueStatus(exports.Status.RUNNING),this.events.onUnblock({id:t.task.id})},n.forceRun=function(t){var e=this,n=this.getActiveTask();if(!n||n.state.status!==exports.Status.BLOCKED)throw new Error("Task is not blocked.");(0,this.actions[n.task.action])({context:this.getContext(t),next:function(){console.log("[force run][execute][next]",t),e.updateTaskState(n.task.id,{status:exports.Status.RUNNING}),e.updateQueueStatus(exports.Status.RUNNING),e.markCurrentTaskAsFinished(t)},retry:function(){e.resume(t)},failed:function(){e.updateTaskState(n.task.id,{status:exports.Status.FAILED}),e.check()},schedule:function(t){e.createTask(t),e.check()},getStorage:this.getStorage.bind(this),setStorage:this.setStorage.bind(this),block:function(t){e.block({reason:t})},unblock:function(){e.unblock()}})},n.markCurrentTaskAsFinished=function(t){this.check();var e=this.state.activeTaskIndex,n=this.tasks[e];if(n)if(this.state.tasks[n.id].status===exports.Status.RUNNING){this.updateTaskState(n.id,{status:exports.Status.SUCCESS}),this.updateActiveTaskIndex(e+1);var s={id:n.id,task:this.get(n.id),action:this.tasks.find((function(t){return t.id===n.id})).action};this.events.onUpdate(s),this.next(t)}else console.log("There is no running task.");else console.log("It seems this queue has been finished. Task doesn't exist.")},n.resume=function(t){var e=this.state.activeTaskIndex,n=this.tasks[e];if(n){var s=this.state.tasks[n.id];s.status===exports.Status.RUNNING?(this.updateTaskState(n.id,{status:exports.Status.PENDING}),this.next(t)):(console.log("There is no running task. restart the queue",{state:this.state.tasks,activeTaskState:s,activeTask:n,activeTaskIndex:e}),this.resetState(),this.next(t))}else console.log("It seems this queue has been finished. Task doesn't exist.")},n.cancel=function(){var t=this.getActiveTask();if(t&&![exports.Status.FAILED,exports.Status.CANCELED,exports.Status.SUCCESS].includes(t.state.status)){var e=t.task;this.updateTaskState(e.id,{status:exports.Status.CANCELED});var n={id:e.id,task:this.get(e.id),action:this.tasks.find((function(t){return t.id===e.id})).action};this.events.onUpdate(n),this.updateQueueStatus(exports.Status.CANCELED)}},n.resetState=function(){var t=this;this.state.activeTaskIndex=0,this.state.status=exports.Status.PENDING,Object.keys(this.state.tasks).forEach((function(e){t.state.tasks[e].status=exports.Status.PENDING}))},n.getStorage=function(){return this.storage},n.setStorage=function(t){return this.storage=t,this.events.onStorageUpdate(t),this.storage},n.getContext=function(t){return a({},t.context,{_queue:{id:this.id}})},e}(),h=function(){function e(t){var e=this;this.queuesDefs=new Map,this.queues=new Map,this.isPaused=!1;var n={onCreateQueue:function(){},onCreateTask:function(){},onUpdateQueue:function(){},onUpdateTask:function(){},onStorageUpdate:function(){},onTaskBlock:function(){},onPersistedDataLoaded:function(){}};this.events=t.events?a({},n,t.events):n,t.queuesDefs.map((function(t){e.queuesDefs.set(t.name,t)})),this.context=t.context||{},this.persistor=new u,this.sync(),t.isPaused&&this.pause()}var s=e.prototype;return s.sync=function(){var t=r(n().mark((function t(){var e,s=this;return n().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,this.persistor.getAll();case 2:e=t.sent,this.queues=new Map,e.forEach((function(t){var e=s.createQueue({queue_id:t.id,queue_name:t.name});s.add(t.id,{list:e,createdAt:t.createdAt,name:t.name,status:t.status,actions:{run:function(){e.next({context:s.getContext()})},cancel:function(){e.cancel()},setStorage:function(){e.setStorage.apply(e,arguments)},getStorage:function(){return e.getStorage()}}}),e.initTasks({state:t.state,tasks:t.tasks,storage:t.storage||{}}),t.status===exports.Status.RUNNING&&s.shouldExecute()&&(console.log("[INIT] Try to resume"),e.resume({context:s.getContext()}))})),this.events.onPersistedDataLoaded(this);case 6:case"end":return t.stop()}}),t,this)})));return function(){return t.apply(this,arguments)}}(),s.createQueue=function(t){var e=this,n=t.queue_id,s=this,r=this.queuesDefs.get(t.queue_name),o=new c({id:n,events:{onCreate:function(t){var s;e.events.onCreateTask(n,t),e.handleUpdate(n),null!=(s=r.events)&&s.onCreate&&r.events.onCreate(t)},onUpdate:function(t){var s;e.events.onUpdateTask(n,t),e.handleUpdate(n),null!=(s=r.events)&&s.onUpdate&&r.events.onUpdate(t)},onUpdateListStatus:function(t){var s;e.queues.set(n,a({},e.get(n),{status:t})),e.events.onUpdateQueue(n,e.get(n)),e.handleUpdate(n),e.execute(),null!=(s=r.events)&&s.onUpdateListStatus&&r.events.onUpdateListStatus(t)},onStorageUpdate:function(t){var s;e.events.onStorageUpdate(n,t),null!=(s=r.events)&&s.onStorageUpdate&&r.events.onStorageUpdate(t),e.handleUpdate(n)},onBlock:function(t){e.queues.set(n,a({},e.get(n),{status:exports.Status.BLOCKED})),e.events.onTaskBlock(n),r.whenTaskBlocked&&r.whenTaskBlocked(t,{queue_id:n,queue:o,context:e.getContext(),getBlockedTasks:e.getBlockedTasks.bind(e),forceExecute:e.forceExecute.bind(e),retry:e.retry.bind(e),manager:s}),e.handleUpdate(n)},onUnblock:function(){e.queues.set(n,a({},e.get(n),{status:exports.Status.PENDING})),e.handleUpdate(n),e.execute()}},actions:r.actions});return o},s.getBlockedTasks=function(){var t=this.getAll(),e=[];return t.forEach((function(t,n){t.list.tasks.forEach((function(s){var r=t.list.state.tasks[s.id];r.status===exports.Status.BLOCKED&&e.push({task_id:s.id,queue_id:n,action:s.action,reason:r.blockedFor,storage:{get:function(){return t.list.getStorage()},set:function(e){return t.list.setStorage(e)}}})}))})),e},s.add=function(t,e){this.queues.set(t,e);var n=this.get(t);return this.events.onCreateQueue(a({},n,{id:t})),n},s.create=function(){var e=r(n().mark((function e(s,r){var a,o,i,u,c,h=this;return n().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(this.queuesDefs.has(s)){e.next=2;break}throw new Error("You need to add a queue definition first.");case 2:return a=this.queuesDefs.get(s),o=t.v4(),i=Date.now(),(u=this.createQueue({queue_id:o,queue_name:s})).setStorage(r),c=this.add(o,{list:u,createdAt:i,name:s,status:exports.Status.PENDING,actions:{run:function(){u.next({context:h.getContext()})},cancel:function(){u.cancel()},setStorage:function(){u.setStorage.apply(u,arguments)},getStorage:function(){return u.getStorage()}}}),e.next=10,this.persistor.insertQueue({id:o,createdAt:i,name:c.name,status:c.status,tasks:u.tasks,state:u.state,storage:u.getStorage()});case 10:return a.run.forEach((function(t){console.log("action",t),u.createTask(t)})),this.execute(),e.abrupt("return",o);case 13:case"end":return e.stop()}}),e,this)})));return function(t,n){return e.apply(this,arguments)}}(),s.get=function(t){return this.queues.get(t)},s.getAll=function(){return this.queues},s.execute=function(){if(this.shouldExecute()){for(var t=0,e=Array.from(this.queues);t<e.length;t++){var n=e[t][1];n.status===exports.Status.PENDING&&(console.log("There is a pending queue. Run it."),n.actions.run())}console.log("There is no pending queue.")}},s.resume=function(){if(this.shouldExecute()){for(var t=0,e=Array.from(this.queues);t<e.length;t++){var n=e[t][1];if(n.status===exports.Status.RUNNING)return console.log("Found a running queue. Let's resume the queue.",n),void n.list.resume({context:this.getContext()})}this.execute()}},s.retry=function(){if(this.shouldExecute()){for(var t=0,e=Array.from(this.queues);t<e.length;t++){var n=e[t][1];n.status===exports.Status.BLOCKED&&(console.log("[Retry] Found: "+n.list.id+", Running onBlock callback.",n),n.list.checkBlock())}this.execute()}},s.forceExecute=function(t,e){var n=this.get(t),s=this.getContext();e&&(s=a({},s,e)),null==n||n.list.forceRun({context:s})},s.handleUpdate=function(t){var e=this.get(t);e&&this.persistor.updateQueue(t,{status:e.status,state:e.list.state,tasks:e.list.tasks,storage:e.list.getStorage()})},s.pause=function(){this.isPaused=!0},s.run=function(){this.isPaused&&(this.isPaused=!1,this.sync())},s.getContext=function(){var t;return(null==(t=this.context)?void 0:t.current)||{}},s.shouldExecute=function(){return console.log("[shouldExecute] checking and result is:",{isPaused:this.isPaused}),!this.isPaused},e}();exports.DB_NAME="queues-manager",exports.Manager=h,exports.Persistor=u;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var t=require("idb"),e=require("uuid");function n(){n=function(){return t};var t={},e=Object.prototype,s=e.hasOwnProperty,r=Object.defineProperty||function(t,e,n){t[e]=n.value},a="function"==typeof Symbol?Symbol:{},o=a.iterator||"@@iterator",i=a.asyncIterator||"@@asyncIterator",u=a.toStringTag||"@@toStringTag";function c(t,e,n){return Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}),t[e]}try{c({},"")}catch(t){c=function(t,e,n){return t[e]=n}}function h(t,e,n,s){var a=Object.create((e&&e.prototype instanceof l?e:l).prototype),o=new T(s||[]);return r(a,"_invoke",{value:E(t,n,o)}),a}function d(t,e,n){try{return{type:"normal",arg:t.call(e,n)}}catch(t){return{type:"throw",arg:t}}}t.wrap=h;var f={};function l(){}function p(){}function v(){}var g={};c(g,o,(function(){return this}));var k=Object.getPrototypeOf,x=k&&k(k(I([])));x&&x!==e&&s.call(x,o)&&(g=x);var S=v.prototype=l.prototype=Object.create(g);function y(t){["next","throw","return"].forEach((function(e){c(t,e,(function(t){return this._invoke(e,t)}))}))}function m(t,e){var n;r(this,"_invoke",{value:function(r,a){function o(){return new e((function(n,o){!function n(r,a,o,i){var u=d(t[r],t,a);if("throw"!==u.type){var c=u.arg,h=c.value;return h&&"object"==typeof h&&s.call(h,"__await")?e.resolve(h.__await).then((function(t){n("next",t,o,i)}),(function(t){n("throw",t,o,i)})):e.resolve(h).then((function(t){c.value=t,o(c)}),(function(t){return n("throw",t,o,i)}))}i(u.arg)}(r,a,n,o)}))}return n=n?n.then(o,o):o()}})}function E(t,e,n){var s="suspendedStart";return function(r,a){if("executing"===s)throw new Error("Generator is already running");if("completed"===s){if("throw"===r)throw a;return{value:void 0,done:!0}}for(n.method=r,n.arg=a;;){var o=n.delegate;if(o){var i=b(o,n);if(i){if(i===f)continue;return i}}if("next"===n.method)n.sent=n._sent=n.arg;else if("throw"===n.method){if("suspendedStart"===s)throw s="completed",n.arg;n.dispatchException(n.arg)}else"return"===n.method&&n.abrupt("return",n.arg);s="executing";var u=d(t,e,n);if("normal"===u.type){if(s=n.done?"completed":"suspendedYield",u.arg===f)continue;return{value:u.arg,done:n.done}}"throw"===u.type&&(s="completed",n.method="throw",n.arg=u.arg)}}}function b(t,e){var n=e.method,s=t.iterator[n];if(void 0===s)return e.delegate=null,"throw"===n&&t.iterator.return&&(e.method="return",e.arg=void 0,b(t,e),"throw"===e.method)||"return"!==n&&(e.method="throw",e.arg=new TypeError("The iterator does not provide a '"+n+"' method")),f;var r=d(s,t.iterator,e.arg);if("throw"===r.type)return e.method="throw",e.arg=r.arg,e.delegate=null,f;var a=r.arg;return a?a.done?(e[t.resultName]=a.value,e.next=t.nextLoc,"return"!==e.method&&(e.method="next",e.arg=void 0),e.delegate=null,f):a:(e.method="throw",e.arg=new TypeError("iterator result is not an object"),e.delegate=null,f)}function N(t){var e={tryLoc:t[0]};1 in t&&(e.catchLoc=t[1]),2 in t&&(e.finallyLoc=t[2],e.afterLoc=t[3]),this.tryEntries.push(e)}function w(t){var e=t.completion||{};e.type="normal",delete e.arg,t.completion=e}function T(t){this.tryEntries=[{tryLoc:"root"}],t.forEach(N,this),this.reset(!0)}function I(t){if(t){var e=t[o];if(e)return e.call(t);if("function"==typeof t.next)return t;if(!isNaN(t.length)){var n=-1,r=function e(){for(;++n<t.length;)if(s.call(t,n))return e.value=t[n],e.done=!1,e;return e.value=void 0,e.done=!0,e};return r.next=r}}return{next:C}}function C(){return{value:void 0,done:!0}}return p.prototype=v,r(S,"constructor",{value:v,configurable:!0}),r(v,"constructor",{value:p,configurable:!0}),p.displayName=c(v,u,"GeneratorFunction"),t.isGeneratorFunction=function(t){var e="function"==typeof t&&t.constructor;return!!e&&(e===p||"GeneratorFunction"===(e.displayName||e.name))},t.mark=function(t){return Object.setPrototypeOf?Object.setPrototypeOf(t,v):(t.__proto__=v,c(t,u,"GeneratorFunction")),t.prototype=Object.create(S),t},t.awrap=function(t){return{__await:t}},y(m.prototype),c(m.prototype,i,(function(){return this})),t.AsyncIterator=m,t.async=function(e,n,s,r,a){void 0===a&&(a=Promise);var o=new m(h(e,n,s,r),a);return t.isGeneratorFunction(n)?o:o.next().then((function(t){return t.done?t.value:o.next()}))},y(S),c(S,u,"Generator"),c(S,o,(function(){return this})),c(S,"toString",(function(){return"[object Generator]"})),t.keys=function(t){var e=Object(t),n=[];for(var s in e)n.push(s);return n.reverse(),function t(){for(;n.length;){var s=n.pop();if(s in e)return t.value=s,t.done=!1,t}return t.done=!0,t}},t.values=I,T.prototype={constructor:T,reset:function(t){if(this.prev=0,this.next=0,this.sent=this._sent=void 0,this.done=!1,this.delegate=null,this.method="next",this.arg=void 0,this.tryEntries.forEach(w),!t)for(var e in this)"t"===e.charAt(0)&&s.call(this,e)&&!isNaN(+e.slice(1))&&(this[e]=void 0)},stop:function(){this.done=!0;var t=this.tryEntries[0].completion;if("throw"===t.type)throw t.arg;return this.rval},dispatchException:function(t){if(this.done)throw t;var e=this;function n(n,s){return o.type="throw",o.arg=t,e.next=n,s&&(e.method="next",e.arg=void 0),!!s}for(var r=this.tryEntries.length-1;r>=0;--r){var a=this.tryEntries[r],o=a.completion;if("root"===a.tryLoc)return n("end");if(a.tryLoc<=this.prev){var i=s.call(a,"catchLoc"),u=s.call(a,"finallyLoc");if(i&&u){if(this.prev<a.catchLoc)return n(a.catchLoc,!0);if(this.prev<a.finallyLoc)return n(a.finallyLoc)}else if(i){if(this.prev<a.catchLoc)return n(a.catchLoc,!0)}else{if(!u)throw new Error("try statement without catch or finally");if(this.prev<a.finallyLoc)return n(a.finallyLoc)}}}},abrupt:function(t,e){for(var n=this.tryEntries.length-1;n>=0;--n){var r=this.tryEntries[n];if(r.tryLoc<=this.prev&&s.call(r,"finallyLoc")&&this.prev<r.finallyLoc){var a=r;break}}a&&("break"===t||"continue"===t)&&a.tryLoc<=e&&e<=a.finallyLoc&&(a=null);var o=a?a.completion:{};return o.type=t,o.arg=e,a?(this.method="next",this.next=a.finallyLoc,f):this.complete(o)},complete:function(t,e){if("throw"===t.type)throw t.arg;return"break"===t.type||"continue"===t.type?this.next=t.arg:"return"===t.type?(this.rval=this.arg=t.arg,this.method="return",this.next="end"):"normal"===t.type&&e&&(this.next=e),f},finish:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var n=this.tryEntries[e];if(n.finallyLoc===t)return this.complete(n.completion,n.afterLoc),w(n),f}},catch:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var n=this.tryEntries[e];if(n.tryLoc===t){var s=n.completion;if("throw"===s.type){var r=s.arg;w(n)}return r}}throw new Error("illegal catch attempt")},delegateYield:function(t,e,n){return this.delegate={iterator:I(t),resultName:e,nextLoc:n},"next"===this.method&&(this.arg=void 0),f}},t}function s(t,e,n,s,r,a,o){try{var i=t[a](o),u=i.value}catch(t){return void n(t)}i.done?e(u):Promise.resolve(u).then(s,r)}function r(t){return function(){var e=this,n=arguments;return new Promise((function(r,a){var o=t.apply(e,n);function i(t){s(o,r,a,i,u,"next",t)}function u(t){s(o,r,a,i,u,"throw",t)}i(void 0)}))}}function a(){return(a=Object.assign?Object.assign.bind():function(t){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(t[s]=n[s])}return t}).apply(this,arguments)}function o(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,s=new Array(e);n<e;n++)s[n]=t[n];return s}var i,u=function(){function e(){this.db=t.openDB("queues-manager",1,{upgrade:function(t){t.createObjectStore("queues",{keyPath:"id"})}})}var s=e.prototype;return s.insertQueue=function(){var t=r(n().mark((function t(e){var s;return n().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,this.db;case 2:return s=t.sent,t.next=5,s.get("queues",e.id);case 5:if(!t.sent){t.next=10;break}console.log("[Persistor] Queue already exists inside persistor."),t.next=13;break;case 10:return t.next=12,s.add("queues",e);case 12:console.log("[Persistor] Queue added to IndexedDB successfully.");case 13:case"end":return t.stop()}}),t,this)})));return function(e){return t.apply(this,arguments)}}(),s.updateQueue=function(){var t=r(n().mark((function t(e,s){var r,o,i;return n().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,this.db;case 2:return r=t.sent,t.next=5,r.get("queues",e);case 5:if(o=t.sent){t.next=9;break}return console.log("[Persistor] Requested queue for update doesn't exist."),t.abrupt("return");case 9:return i=a({},o,s),t.next=12,r.put("queues",i);case 12:case"end":return t.stop()}}),t,this)})));return function(e,n){return t.apply(this,arguments)}}(),s.getAll=function(){var t=r(n().mark((function t(){var e;return n().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,this.db;case 2:return e=t.sent,t.next=5,e.getAll("queues");case 5:return t.abrupt("return",t.sent);case 7:case"end":return t.stop()}}),t,this)})));return function(){return t.apply(this,arguments)}}(),e}();(i=exports.Status||(exports.Status={})).PENDING="PENDING",i.RUNNING="RUNNING",i.FAILED="FAILED",i.SUCCESS="SUCCESS",i.CANCELED="CANCELED",i.BLOCKED="BLOCKED";var c=function(){function t(t){this.state={status:exports.Status.PENDING,activeTaskIndex:0,tasks:{}},this.tasks=[],this.storage={},this.id=t.id,this.events=t.events,this.actions=t.actions}var n=t.prototype;return n.updateQueueStatus=function(t){this.state.status=t,this.events.onUpdateListStatus(t)},n.updateActiveTaskIndex=function(t){this.state.activeTaskIndex=t},n.updateTaskState=function(t,e){e.status&&(this.state.tasks[t].status=e.status),e.blockedFor&&(this.state.tasks[t].blockedFor=e.blockedFor);var n={id:t,task:this.get(t),action:this.tasks.find((function(e){return e.id===t})).action};this.events.onUpdate(n)},n.createTask=function(t){var n=e.v4();this.tasks.push({action:t,id:n}),this.state.tasks[n]={status:exports.Status.PENDING,blockedFor:null};var s=this.get(n);this.events.onCreate({id:n,task:s,action:t})},n.initTasks=function(t){var e=this;this.state=t.state,this.storage=t.storage,t.tasks.forEach((function(t){e.tasks.push(t);var n=e.tasks.find((function(e){return e.id===t.id})).action;e.events.onCreate({id:t.id,task:e.get(t.id),action:n})}))},n.checkBlock=function(){var t=this.getActiveTask();if(t){var e=t.task,n=t.state;n.status===exports.Status.BLOCKED&&this.events.onBlock({action:e.action,id:e.id,reason:n.blockedFor})}},n.get=function(t){return this.state.tasks[t]||null},n.lastTaskIsSuccessful=function(){var t=this.tasks[this.tasks.length-1];if(t){var e=this.state.tasks[t.id];if(e&&e.status===exports.Status.SUCCESS)return!0}return!1},n.firstTaskIsStarted=function(){var t=this.tasks[0];if(t){var e=this.state.tasks[t.id];if(e&&e.status!==exports.Status.PENDING)return!0}return!1},n.getActiveTask=function(){var t=this.state.activeTaskIndex,e=this.tasks[t];return e?{task:e,state:this.state.tasks[e.id],index:t}:null},n.check=function(){var t=this.state.status,e=this.firstTaskIsStarted()?exports.Status.RUNNING:exports.Status.PENDING;if(this.lastTaskIsSuccessful())e=exports.Status.SUCCESS;else for(var n,s=function(t,e){var n="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(n)return(n=n.call(t)).next.bind(n);if(Array.isArray(t)||(n=function(t,e){if(t){if("string"==typeof t)return o(t,void 0);var n=Object.prototype.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?o(t,void 0):void 0}}(t))){n&&(t=n);var s=0;return function(){return s>=t.length?{done:!0}:{done:!1,value:t[s++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}(this.tasks);!(n=s()).done;)if(this.state.tasks[n.value.id].status===exports.Status.FAILED){e=exports.Status.FAILED;break}e!==t&&this.updateQueueStatus(e)},n.next=function(t){var e=this;console.log("[next]",this.state,t),this.check();var n=this.getActiveTask();if(n){var s=n.task,r=n.state;if(r.status===exports.Status.SUCCESS)return this.updateActiveTaskIndex(n.index+1),void this.next(t);r.status!==exports.Status.FAILED?r.status!==exports.Status.CANCELED?r.status!==exports.Status.RUNNING?r.status!==exports.Status.PENDING&&r.status!==exports.Status.BLOCKED||(this.updateTaskState(s.id,{status:exports.Status.RUNNING}),this.updateQueueStatus(exports.Status.RUNNING),(0,this.actions[s.action])({context:this.getContext(t),next:function(){console.log("[execute][next]",t),e.markCurrentTaskAsFinished(t)},retry:function(){e.resume(t)},failed:function(){e.updateTaskState(s.id,{status:exports.Status.FAILED}),e.check()},schedule:function(t){e.createTask(t),e.check()},getStorage:this.getStorage.bind(this),setStorage:this.setStorage.bind(this),block:function(t){e.block({reason:t})},unblock:function(){e.unblock()}})):console.log("Task is running. It can not be proceed."):console.log("Task has been canceled. It can not be proceed."):console.log("Task has been failed. It can not be proceed.")}},n.block=function(t){var e=t.reason,n=t.silent,s=void 0!==n&&n,r=this.getActiveTask();if(!r)throw new Error("Task isn't exist.");this.updateTaskState(r.task.id,{status:exports.Status.BLOCKED,blockedFor:e}),this.updateQueueStatus(exports.Status.BLOCKED),s||this.events.onBlock({action:r.task.action,id:r.task.id,reason:e})},n.unblock=function(){var t=this.getActiveTask();if(!t||t.state.status!==exports.Status.BLOCKED)throw new Error("Task is not blocked.");this.updateTaskState(t.task.id,{status:exports.Status.PENDING}),this.updateQueueStatus(exports.Status.RUNNING),this.events.onUnblock({id:t.task.id})},n.forceRun=function(t){var e=this,n=this.getActiveTask();if(!n||n.state.status!==exports.Status.BLOCKED)throw new Error("Task is not blocked.");(0,this.actions[n.task.action])({context:this.getContext(t),next:function(){console.log("[force run][execute][next]",t),e.updateTaskState(n.task.id,{status:exports.Status.RUNNING}),e.updateQueueStatus(exports.Status.RUNNING),e.markCurrentTaskAsFinished(t)},retry:function(){e.resume(t)},failed:function(){e.updateTaskState(n.task.id,{status:exports.Status.FAILED}),e.check()},schedule:function(t){e.createTask(t),e.check()},getStorage:this.getStorage.bind(this),setStorage:this.setStorage.bind(this),block:function(t){e.block({reason:t})},unblock:function(){e.unblock()}})},n.markCurrentTaskAsFinished=function(t){this.check();var e=this.state.activeTaskIndex,n=this.tasks[e];if(n)if(this.state.tasks[n.id].status===exports.Status.RUNNING){this.updateTaskState(n.id,{status:exports.Status.SUCCESS}),this.updateActiveTaskIndex(e+1);var s={id:n.id,task:this.get(n.id),action:this.tasks.find((function(t){return t.id===n.id})).action};this.events.onUpdate(s),this.next(t)}else console.log("There is no running task.");else console.log("It seems this queue has been finished. Task doesn't exist.")},n.resume=function(t){var e=this.state.activeTaskIndex,n=this.tasks[e];if(n){var s=this.state.tasks[n.id];s.status===exports.Status.RUNNING?(this.updateTaskState(n.id,{status:exports.Status.PENDING}),this.next(t)):(console.log("There is no running task. restart the queue",{state:this.state.tasks,activeTaskState:s,activeTask:n,activeTaskIndex:e}),this.resetState(),this.next(t))}else console.log("It seems this queue has been finished. Task doesn't exist.")},n.cancel=function(){var t=this.getActiveTask();if(t&&![exports.Status.FAILED,exports.Status.CANCELED,exports.Status.SUCCESS].includes(t.state.status)){var e=t.task;this.updateTaskState(e.id,{status:exports.Status.CANCELED});var n={id:e.id,task:this.get(e.id),action:this.tasks.find((function(t){return t.id===e.id})).action};this.events.onUpdate(n),this.updateQueueStatus(exports.Status.CANCELED)}},n.resetState=function(){var t=this;this.state.activeTaskIndex=0,this.state.status=exports.Status.PENDING,Object.keys(this.state.tasks).forEach((function(e){t.state.tasks[e].status=exports.Status.PENDING}))},n.getStorage=function(){return this.storage},n.setStorage=function(t){return this.storage=t,this.events.onStorageUpdate(t),this.storage},n.getContext=function(t){return a({},t.context,{_queue:{id:this.id}})},t}(),h=function(){function t(t){var e=this;this.queuesDefs=new Map,this.queues=new Map,this.isPaused=!1;var n={onCreateQueue:function(){},onCreateTask:function(){},onUpdateQueue:function(){},onUpdateTask:function(){},onStorageUpdate:function(){},onTaskBlock:function(){},onPersistedDataLoaded:function(){}};this.events=t.events?a({},n,t.events):n,t.queuesDefs.map((function(t){e.queuesDefs.set(t.name,t)})),this.context=t.context||{},this.persistor=new u,this.sync(),t.isPaused&&this.pause()}var s=t.prototype;return s.sync=function(){var t=r(n().mark((function t(){var e,s=this;return n().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,this.persistor.getAll();case 2:e=t.sent,this.queues=new Map,e.forEach((function(t){var e=s.createQueue({queue_id:t.id,queue_name:t.name});s.add(t.id,{list:e,createdAt:t.createdAt,name:t.name,status:t.status,actions:{run:function(){e.next({context:s.getContext()})},cancel:function(){e.cancel()},setStorage:function(){e.setStorage.apply(e,arguments)},getStorage:function(){return e.getStorage()}}}),e.initTasks({state:t.state,tasks:t.tasks,storage:t.storage||{}}),t.status===exports.Status.RUNNING&&s.shouldExecute()&&(console.log("[INIT] Try to resume"),e.resume({context:s.getContext()}))})),this.events.onPersistedDataLoaded(this);case 6:case"end":return t.stop()}}),t,this)})));return function(){return t.apply(this,arguments)}}(),s.createQueue=function(t){var e=this,n=t.queue_id,s=this,r=this.queuesDefs.get(t.queue_name),o=new c({id:n,events:{onCreate:function(t){var s;e.events.onCreateTask(n,t),e.handleUpdate(n),null!=(s=r.events)&&s.onCreate&&r.events.onCreate(t)},onUpdate:function(t){var s;e.events.onUpdateTask(n,t),e.handleUpdate(n),null!=(s=r.events)&&s.onUpdate&&r.events.onUpdate(t)},onUpdateListStatus:function(t){var s;e.queues.set(n,a({},e.get(n),{status:t})),e.events.onUpdateQueue(n,e.get(n)),e.handleUpdate(n),e.execute(),null!=(s=r.events)&&s.onUpdateListStatus&&r.events.onUpdateListStatus(t)},onStorageUpdate:function(t){var s;e.events.onStorageUpdate(n,t),null!=(s=r.events)&&s.onStorageUpdate&&r.events.onStorageUpdate(t),e.handleUpdate(n)},onBlock:function(t){e.queues.set(n,a({},e.get(n),{status:exports.Status.BLOCKED})),e.events.onTaskBlock(n),r.whenTaskBlocked&&r.whenTaskBlocked(t,{queue_id:n,queue:o,context:e.getContext(),getBlockedTasks:e.getBlockedTasks.bind(e),forceExecute:e.forceExecute.bind(e),retry:e.retry.bind(e),manager:s}),e.handleUpdate(n)},onUnblock:function(){e.queues.set(n,a({},e.get(n),{status:exports.Status.PENDING})),e.handleUpdate(n),e.execute()}},actions:r.actions});return o},s.getBlockedTasks=function(){var t=this.getAll(),e=[];return t.forEach((function(t,n){t.list.tasks.forEach((function(s){var r=t.list.state.tasks[s.id];r.status===exports.Status.BLOCKED&&e.push({task_id:s.id,queue_id:n,action:s.action,reason:r.blockedFor,storage:{get:function(){return t.list.getStorage()},set:function(e){return t.list.setStorage(e)}}})}))})),e},s.add=function(t,e){this.queues.set(t,e);var n=this.get(t);return this.events.onCreateQueue(a({},n,{id:t})),n},s.create=function(){var t=r(n().mark((function t(s,r,a){var o,i,u,c,h,d=this;return n().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(this.queuesDefs.has(s)){t.next=2;break}throw new Error("You need to add a queue definition first.");case 2:return o=this.queuesDefs.get(s),i=(null==a?void 0:a.id)||e.v4(),u=Date.now(),(c=this.createQueue({queue_id:i,queue_name:s})).setStorage(r),h=this.add(i,{list:c,createdAt:u,name:s,status:exports.Status.PENDING,actions:{run:function(){c.next({context:d.getContext()})},cancel:function(){c.cancel()},setStorage:function(){c.setStorage.apply(c,arguments)},getStorage:function(){return c.getStorage()}}}),t.next=10,this.persistor.insertQueue({id:i,createdAt:u,name:h.name,status:h.status,tasks:c.tasks,state:c.state,storage:c.getStorage()});case 10:return o.run.forEach((function(t){console.log("action",t),c.createTask(t)})),this.execute(),t.abrupt("return",i);case 13:case"end":return t.stop()}}),t,this)})));return function(e,n,s){return t.apply(this,arguments)}}(),s.get=function(t){return this.queues.get(t)},s.getAll=function(){return this.queues},s.execute=function(){if(this.shouldExecute()){for(var t=0,e=Array.from(this.queues);t<e.length;t++){var n=e[t][1];n.status===exports.Status.PENDING&&(console.log("There is a pending queue. Run it."),n.actions.run())}console.log("There is no pending queue.")}},s.resume=function(){if(this.shouldExecute()){for(var t=0,e=Array.from(this.queues);t<e.length;t++){var n=e[t][1];if(n.status===exports.Status.RUNNING)return console.log("Found a running queue. Let's resume the queue.",n),void n.list.resume({context:this.getContext()})}this.execute()}},s.retry=function(){if(this.shouldExecute()){for(var t=0,e=Array.from(this.queues);t<e.length;t++){var n=e[t][1];n.status===exports.Status.BLOCKED&&(console.log("[Retry] Found: "+n.list.id+", Running onBlock callback.",n),n.list.checkBlock())}this.execute()}},s.forceExecute=function(t,e){var n=this.get(t),s=this.getContext();e&&(s=a({},s,e)),null==n||n.list.forceRun({context:s})},s.handleUpdate=function(t){var e=this.get(t);e&&this.persistor.updateQueue(t,{status:e.status,state:e.list.state,tasks:e.list.tasks,storage:e.list.getStorage()})},s.pause=function(){this.isPaused=!0},s.run=function(){this.isPaused&&(this.isPaused=!1,this.sync())},s.getContext=function(){var t;return(null==(t=this.context)?void 0:t.current)||{}},s.shouldExecute=function(){return console.log("[shouldExecute] checking and result is:",{isPaused:this.isPaused}),!this.isPaused},t}();exports.DB_NAME="queues-manager",exports.Manager=h,exports.Persistor=u;
2
2
  //# sourceMappingURL=queue-manager-core.cjs.production.min.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"queue-manager-core.cjs.production.min.js","sources":["../src/types.ts","../src/persistor.ts","../src/queue.ts","../src/manager.ts"],"sourcesContent":["import { QueueID, QueueName } from './manager';\nimport Queue, { QueueState, Task } from './queue';\n\nexport enum Status {\n PENDING = 'PENDING',\n RUNNING = 'RUNNING',\n FAILED = 'FAILED',\n SUCCESS = 'SUCCESS',\n CANCELED = 'CANCELED',\n BLOCKED = 'BLOCKED',\n}\n\nexport type QueueStorage = Record<string, unknown>;\n\nexport type QueueType = Queue;\n\nexport interface PersistedQueue {\n id: QueueID;\n createdAt: number;\n name: QueueName;\n status: Status;\n state: QueueState;\n tasks: Task[];\n storage: QueueStorage;\n}\n","import { openDB, DBSchema, IDBPDatabase } from 'idb';\n\nimport { QueueID } from './manager';\nimport { PersistedQueue } from './types';\n\nexport const DB_NAME = 'queues-manager';\nconst OBJECT_STORE_NAME = 'queues';\nconst VERSION = 1;\n\ntype UpdatePersistedQueue = Partial<\n Pick<PersistedQueue, 'status' | 'state' | 'tasks' | 'storage'>\n>;\n\ninterface Database extends DBSchema {\n queues: {\n value: PersistedQueue;\n key: string;\n };\n}\n\nclass Persistor {\n db: Promise<IDBPDatabase<Database>>;\n constructor() {\n this.db = openDB<Database>(DB_NAME, VERSION, {\n upgrade(db) {\n db.createObjectStore(OBJECT_STORE_NAME, { keyPath: 'id' });\n },\n });\n }\n async insertQueue(queue: PersistedQueue) {\n const db = await this.db;\n const queueRecord = await db.get(OBJECT_STORE_NAME, queue.id);\n if (queueRecord) {\n console.log('[Persistor] Queue already exists inside persistor.');\n } else {\n await db.add(OBJECT_STORE_NAME, queue);\n console.log('[Persistor] Queue added to IndexedDB successfully.');\n }\n }\n async updateQueue(id: QueueID, queue: UpdatePersistedQueue) {\n const db = await this.db;\n const currentRecord = await db.get(OBJECT_STORE_NAME, id);\n\n if (!currentRecord) {\n console.log(\"[Persistor] Requested queue for update doesn't exist.\");\n return;\n }\n\n const updatedRecord = {\n ...currentRecord,\n ...queue,\n };\n await db.put(OBJECT_STORE_NAME, updatedRecord);\n }\n async getAll() {\n const db = await this.db;\n const results = await db.getAll(OBJECT_STORE_NAME);\n\n return results;\n }\n}\n\nexport default Persistor;\n","import { v4 as uuidv4 } from 'uuid';\nimport { ManagerContext, QueueDef, QueueID } from './manager';\nimport { QueueStorage, Status } from './types';\n\ntype TaskId = string;\nexport type TaskState = {\n status: Status;\n blockedFor: any;\n};\n\nexport interface QueueContext {\n _queue?: {\n id: string;\n };\n}\nexport type NextParams = {\n context: ManagerContext;\n};\n\nexport interface QueueState {\n status: Status;\n activeTaskIndex: number;\n tasks: {\n [key in TaskId]: TaskState;\n };\n}\n\nexport interface Task {\n id: TaskId;\n action: string;\n}\n\nexport type InitTasks = {\n tasks: Task[];\n state: QueueState;\n storage: QueueStorage;\n};\n\nexport interface TaskEvent {\n id: TaskId;\n task: TaskState;\n action: string;\n}\n\nexport interface QueueEventHandlers {\n // all tasks\n onUpdateListStatus: (status: Status) => void;\n // single task\n onCreate: (event: TaskEvent) => void;\n onUpdate: (event: TaskEvent) => void;\n onStorageUpdate: (data: QueueStorage) => void;\n onBlock: (\n data: Omit<TaskEvent, 'task'> & { reason: Record<string, unknown> }\n ) => void;\n onUnblock: (data: { id: string }) => void;\n}\n\ninterface QueueOptions {\n id: QueueID;\n events: QueueEventHandlers;\n actions: QueueDef['actions'];\n}\n\n/**\n *\n * Notes on statuses:\n * - Success: last task has success status\n * - Failed: any of task has been failed\n * - Running: first task is not on pending\n * - Pending: default state. not started\n *\n */\nclass Queue {\n public id: string;\n public state: QueueState = {\n status: Status.PENDING,\n activeTaskIndex: 0,\n tasks: {},\n };\n public tasks: Task[] = [];\n private events: QueueOptions['events'];\n private actions: QueueOptions['actions'];\n private storage: QueueStorage = {};\n\n constructor(options: QueueOptions) {\n this.id = options.id;\n this.events = options.events;\n this.actions = options.actions;\n }\n\n /**\n * Update queue status and trigger an event\n *\n */\n private updateQueueStatus(status: Status) {\n this.state.status = status;\n this.events.onUpdateListStatus(status);\n }\n\n private updateActiveTaskIndex(index: number) {\n this.state.activeTaskIndex = index;\n }\n\n /**\n *\n * Update task state (`status`, `blockedFor`) and trigger an event.\n * @param id\n * @param nextState\n */\n private updateTaskState(id: TaskId, nextState: Partial<TaskState>) {\n if (nextState.status) {\n this.state.tasks[id].status = nextState.status;\n }\n if (nextState.blockedFor) {\n this.state.tasks[id].blockedFor = nextState.blockedFor;\n }\n\n const updatedTaskEvent = {\n id: id,\n task: this.get(id)!,\n action: this.tasks.find((task) => task.id === id)!.action,\n };\n this.events.onUpdate(updatedTaskEvent);\n }\n\n /**\n * Create a task by providing an `action` name.\n *\n * this method creating the task, push it to the queue's tasks and trigger an event.\n * @param action\n */\n createTask(action: string) {\n const id = uuidv4();\n this.tasks.push({\n action,\n id,\n });\n this.state.tasks[id] = {\n status: Status.PENDING,\n blockedFor: null,\n };\n\n const createdTask = this.get(id);\n this.events.onCreate({\n id,\n task: createdTask!,\n action,\n });\n }\n\n /**\n * Initilize a queue with some tasks, instead of an empty queue.\n *\n * Using it for recover the queue state from persistor.\n *\n */\n public initTasks(info: InitTasks) {\n this.state = info.state;\n this.storage = info.storage;\n\n info.tasks.forEach((task) => {\n this.tasks.push(task);\n const action = this.tasks.find((t) => t.id === task.id)!.action;\n this.events.onCreate({\n id: task.id,\n task: this.get(task.id)!,\n action,\n });\n });\n }\n\n public checkBlock() {\n const currentActiveTask = this.getActiveTask();\n\n if (!currentActiveTask) {\n return;\n }\n const { task, state } = currentActiveTask;\n\n if (state.status === Status.BLOCKED) {\n this.events.onBlock({\n action: task.action,\n id: task.id,\n reason: state.blockedFor,\n });\n }\n }\n\n /**\n * Getting task state by ID\n */\n public get(id: string): TaskState | null {\n const task = this.state.tasks[id];\n\n if (!task) return null;\n\n return task;\n }\n\n /**\n *\n * Checking if status of the last is `SUCCESS` or not\n *\n */\n private lastTaskIsSuccessful() {\n const lastTask = this.tasks[this.tasks.length - 1];\n\n // checking for empty lists.\n if (lastTask) {\n const lastTaskState = this.state.tasks[lastTask.id];\n\n // Maybe we didn't create the state yet. It should has success status as well.\n if (!!lastTaskState && lastTaskState.status === Status.SUCCESS) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * If the first task started (it's not PENDING),\n * it means the queue has been ran.\n *\n * @returns\n */\n private firstTaskIsStarted() {\n const firstTask = this.tasks[0];\n\n // checking for empty lists.\n if (firstTask) {\n const firstTaskState = this.state.tasks[firstTask.id];\n\n // Maybe we didn't create the state yet.\n if (!!firstTaskState) {\n if (firstTaskState.status !== Status.PENDING) {\n return true;\n }\n }\n }\n\n return false;\n }\n\n /**\n * Getting active task index from state and\n * returns the task and its state.\n *\n */\n private getActiveTask() {\n // First try to get task with `activeTask`\n const index = this.state.activeTaskIndex;\n const task = this.tasks[index];\n\n // Consider all the tasks has been executed.\n if (!task) {\n return null;\n }\n\n const state = this.state.tasks[task.id];\n\n return { task, state, index };\n }\n\n /**\n * Update and find the queue status by checking state of each tasks in the queue.\n */\n public check() {\n const currentListStatus = this.state.status;\n let nextListStatus = this.firstTaskIsStarted()\n ? Status.RUNNING\n : Status.PENDING;\n\n if (this.lastTaskIsSuccessful()) {\n nextListStatus = Status.SUCCESS;\n } else {\n // Is there any failed task?\n for (const task of this.tasks) {\n const state = this.state.tasks[task.id];\n\n // If one item fails, we stop to work on the list.\n if (state.status === Status.FAILED) {\n nextListStatus = Status.FAILED;\n break;\n }\n }\n }\n\n // We only update and trigger an event when there is a new value\n if (nextListStatus !== currentListStatus) {\n this.updateQueueStatus(nextListStatus);\n }\n }\n\n /**\n * Execute active task.\n * Based on the state of active task, the behaviour is different. If status is:\n * - Success -> we need to go to next task by updating the active index and try `next` on more time.\n * - Failed, Running, or no active task -> doesn't do anything.\n * - Pending or Blocked -> update the task and queue status to running, and execute the provided `action` for the task.\n *\n * The queue is a linked list somehow, active task means the pointer to where we are in the queue right now.\n *\n */\n public next(params: NextParams) {\n console.log('[next]', this.state, params);\n\n this.check();\n\n const currentActiveTask = this.getActiveTask();\n\n if (!currentActiveTask) {\n return;\n }\n\n const {\n index: activeTaskIndex,\n task: activeTask,\n state: activeTaskState,\n } = currentActiveTask;\n\n // if `activeTask` is already done, we will go for next one.\n if (activeTaskState.status === Status.SUCCESS) {\n this.updateActiveTaskIndex(activeTaskIndex + 1);\n this.next(params);\n return;\n }\n\n if (activeTaskState.status === Status.FAILED) {\n console.log('Task has been failed. It can not be proceed.');\n return;\n }\n\n if (activeTaskState.status === Status.CANCELED) {\n console.log('Task has been canceled. It can not be proceed.');\n return;\n }\n\n if (activeTaskState.status === Status.RUNNING) {\n console.log('Task is running. It can not be proceed.');\n return;\n }\n\n if (\n activeTaskState.status === Status.PENDING ||\n activeTaskState.status === Status.BLOCKED\n ) {\n // Update task status to `running`\n this.updateTaskState(activeTask.id, {\n status: Status.RUNNING,\n });\n this.updateQueueStatus(Status.RUNNING);\n\n // Try to execute task.\n const execute = this.actions[activeTask.action];\n execute({\n context: this.getContext(params),\n next: () => {\n console.log('[execute][next]', params);\n this.markCurrentTaskAsFinished(params);\n },\n retry: () => {\n this.resume(params);\n },\n failed: () => {\n this.updateTaskState(activeTask.id, {\n status: Status.FAILED,\n });\n this.check();\n },\n schedule: (action) => {\n this.createTask(action);\n this.check();\n },\n getStorage: this.getStorage.bind(this),\n setStorage: this.setStorage.bind(this),\n block: (reason: Record<string, unknown>) => {\n this.block({ reason });\n },\n unblock: () => {\n this.unblock();\n },\n });\n }\n }\n\n /**\n * Change the `status` of active task and queue to BLOCKED, then trigger an event.\n */\n public block({\n reason,\n silent = false,\n }: {\n reason: Record<string, unknown>;\n silent?: boolean;\n }) {\n const currentActiveTask = this.getActiveTask();\n\n if (!currentActiveTask) {\n throw new Error(\"Task isn't exist.\");\n }\n\n this.updateTaskState(currentActiveTask.task.id, {\n status: Status.BLOCKED,\n blockedFor: reason,\n });\n this.updateQueueStatus(Status.BLOCKED);\n\n if (!silent) {\n this.events.onBlock({\n action: currentActiveTask.task.action,\n id: currentActiveTask.task.id,\n reason,\n });\n }\n }\n\n /**\n * If the active task is `BLOCKED`, update the task status to `PENDING`, queue status to `RUNNING`\n * then trigger an event.\n */\n public unblock() {\n const currentActiveTask = this.getActiveTask();\n\n if (\n !currentActiveTask ||\n currentActiveTask.state.status !== Status.BLOCKED\n ) {\n throw new Error('Task is not blocked.');\n }\n\n this.updateTaskState(currentActiveTask.task.id, {\n status: Status.PENDING,\n });\n this.updateQueueStatus(Status.RUNNING);\n this.events.onUnblock({ id: currentActiveTask.task.id });\n }\n\n /**\n * If the active task is `BLOCKED` then execute the `action` for the task.\n *\n * It is useful for when we need to run a blocked task without changing the status of task at the first place.\n * For scenarios like we have some conditions in `action` and needs to run the `action` again\n * to check the conditions are met or not, if yes, so we can proceed the `action`.\n *\n */\n public forceRun(params: NextParams) {\n const currentTask = this.getActiveTask();\n\n if (!currentTask || currentTask.state.status !== Status.BLOCKED) {\n throw new Error('Task is not blocked.');\n }\n\n // Try to execute task.\n const execute = this.actions[currentTask.task.action];\n execute({\n context: this.getContext(params),\n next: () => {\n console.log('[force run][execute][next]', params);\n\n /*\n NOTE:\n When running `forceRun`, the status of task can be `BLOCKED`\n So we need to change to `Running` first. \n */\n // Update task status to `running`\n this.updateTaskState(currentTask.task.id, {\n status: Status.RUNNING,\n });\n this.updateQueueStatus(Status.RUNNING);\n\n this.markCurrentTaskAsFinished(params);\n },\n retry: () => {\n this.resume(params);\n },\n failed: () => {\n this.updateTaskState(currentTask.task.id, {\n status: Status.FAILED,\n });\n this.check();\n },\n schedule: (action) => {\n this.createTask(action);\n this.check();\n },\n getStorage: this.getStorage.bind(this),\n setStorage: this.setStorage.bind(this),\n block: (reason: Record<string, unknown>) => {\n this.block({ reason });\n },\n unblock: () => {\n this.unblock();\n },\n });\n }\n private markCurrentTaskAsFinished(params: NextParams) {\n this.check();\n const activeTaskIndex = this.state.activeTaskIndex;\n const activeTask = this.tasks[activeTaskIndex];\n\n if (!activeTask) {\n console.log(\"It seems this queue has been finished. Task doesn't exist.\");\n return;\n }\n\n const activeTaskState = this.state.tasks[activeTask.id];\n if (activeTaskState.status === Status.RUNNING) {\n this.updateTaskState(activeTask.id, {\n status: Status.SUCCESS,\n });\n this.updateActiveTaskIndex(activeTaskIndex + 1);\n\n const updatedTaskEvent = {\n id: activeTask.id,\n task: this.get(activeTask.id)!,\n action: this.tasks.find((task) => task.id === activeTask.id)!.action,\n };\n this.events.onUpdate(updatedTaskEvent);\n this.next(params);\n } else {\n console.log('There is no running task.');\n }\n }\n\n /**\n * If the active task is `RUNNING`, change it to `PENING` the try to run the task by calling `next`.\n * If it's other than `RUNNING` we reset the queue state and run the queue from the beggining.\n *\n * @param params\n * @returns\n */\n public resume(params: NextParams) {\n const activeTaskIndex = this.state.activeTaskIndex;\n const activeTask = this.tasks[activeTaskIndex];\n if (!activeTask) {\n console.log(\"It seems this queue has been finished. Task doesn't exist.\");\n return;\n }\n\n const activeTaskState = this.state.tasks[activeTask.id];\n if (activeTaskState.status === Status.RUNNING) {\n this.updateTaskState(activeTask.id, {\n status: Status.PENDING,\n });\n this.next(params);\n } else {\n console.log('There is no running task. restart the queue', {\n state: this.state.tasks,\n activeTaskState,\n activeTask,\n activeTaskIndex,\n });\n this.resetState();\n this.next(params);\n }\n }\n\n /**\n *\n * Cancel the queue by changing active task and queue status to `CANCELED`.\n *\n */\n public cancel() {\n const currentActiveTask = this.getActiveTask();\n\n if (\n !currentActiveTask ||\n [Status.FAILED, Status.CANCELED, Status.SUCCESS].includes(\n currentActiveTask.state.status\n )\n ) {\n return;\n }\n\n const { task } = currentActiveTask;\n\n // Update task status to `canceled`\n this.updateTaskState(task.id, {\n status: Status.CANCELED,\n });\n const updatedTaskEvent = {\n id: task.id,\n task: this.get(task.id)!,\n action: this.tasks.find((t) => t.id === task.id)!.action,\n };\n this.events.onUpdate(updatedTaskEvent);\n\n // Update queue status to `canceled`\n this.updateQueueStatus(Status.CANCELED);\n }\n\n /**\n * Update queue status, and all the tasks inside queue to `PENDING`.\n */\n private resetState() {\n this.state.activeTaskIndex = 0;\n this.state.status = Status.PENDING;\n Object.keys(this.state.tasks).forEach((id) => {\n this.state.tasks[id].status = Status.PENDING;\n });\n }\n\n public getStorage() {\n return this.storage;\n }\n public setStorage(data: QueueStorage) {\n this.storage = data;\n this.events.onStorageUpdate(data);\n return this.storage;\n }\n\n private getContext(params: NextParams): QueueContext & ManagerContext {\n return {\n ...params.context,\n _queue: {\n id: this.id,\n },\n };\n }\n}\n\nexport default Queue;\n","import { v4 as uuidv4 } from 'uuid';\nimport Persistor from './persistor';\nimport Queue, { QueueEventHandlers, TaskEvent } from './queue';\nimport { QueueStorage, Status } from './types';\n\nexport type ManagerContext = object;\nexport type QueueName = string;\nexport type QueueID = string;\nexport type BlockedTask = {\n queue_id: string;\n task_id: string;\n action: string;\n reason: Record<string, unknown>;\n storage: {\n get: () => QueueStorage;\n set: (data: QueueStorage) => QueueStorage;\n };\n};\n\nexport type SetStorage<T> = (nextStorage: T) => T;\n\nexport interface ExecuterActions<\n T extends QueueStorage = QueueStorage,\n V extends string = string,\n C = ManagerContext\n> {\n next: () => void;\n retry: () => void;\n failed: () => void;\n schedule: (actionName: V) => void;\n setStorage: SetStorage<T>;\n getStorage: () => T;\n block: (reason: Record<string, unknown>) => void;\n unblock: () => void;\n context: C;\n}\n\nexport interface QueueDef<\n T extends QueueStorage = QueueStorage,\n V extends string = string,\n C = ManagerContext\n> {\n name: QueueName;\n actions: {\n [K in V]: (actions: ExecuterActions<T, V, C>) => void | Promise<void>;\n };\n events?: Partial<QueueEventHandlers>;\n run: V[];\n whenTaskBlocked?: (\n event: any,\n params: {\n queue_id: string;\n queue: Queue;\n context: C;\n getBlockedTasks: () => BlockedTask[];\n forceExecute: (queue_id: string, data?: object) => void;\n retry: () => void;\n manager: Manager;\n }\n ) => void;\n}\n\nexport interface Events {\n onCreateQueue: (queue: QueueInfo & { id: QueueID }) => void;\n onUpdateQueue: (queue_id: QueueID, queue: QueueInfo) => void;\n onCreateTask: (queue_id: QueueID, event: TaskEvent) => void;\n onUpdateTask: (queue_id: QueueID, event: TaskEvent) => void;\n onStorageUpdate: (queue_id: QueueID, data: QueueStorage) => void;\n onTaskBlock: (queue_id: QueueID) => void;\n onPersistedDataLoaded: (manager: Manager) => void;\n}\n\ninterface ManagerOptions {\n events?: Partial<Events>;\n queuesDefs: QueueDef[];\n context?: ManagerContext;\n isPaused?: boolean;\n}\n\nexport interface QueueInfo {\n name: QueueName;\n createdAt: number;\n status: Status;\n list: Queue;\n actions: {\n run: () => void;\n cancel: () => void;\n setStorage: SetStorage<any>;\n getStorage: () => any;\n };\n}\n\nclass Manager {\n private queuesDefs = new Map<QueueName, QueueDef>();\n private queues = new Map<QueueID, QueueInfo>();\n private events: Events;\n private persistor: Persistor;\n private context: ManagerContext;\n private isPaused: boolean = false;\n\n /**\n *\n * Making an instance, initilize events, setup a persistor and try to recover the last state of the manager.\n *\n * */\n constructor(options: ManagerOptions) {\n const defaultEventHandlers: Events = {\n onCreateQueue: () => {\n // ...\n },\n onCreateTask: () => {\n // ...\n },\n onUpdateQueue: () => {\n // ...\n },\n onUpdateTask: () => {\n // ...\n },\n onStorageUpdate: () => {\n // ...\n },\n onTaskBlock: () => {\n // ...\n },\n onPersistedDataLoaded: () => {\n // ..\n },\n };\n\n if (options.events) {\n this.events = {\n ...defaultEventHandlers,\n ...options.events,\n };\n } else {\n this.events = defaultEventHandlers;\n }\n\n options.queuesDefs.map((qDef) => {\n this.queuesDefs.set(qDef.name, qDef);\n });\n\n this.context = options.context || {};\n this.persistor = new Persistor();\n this.sync();\n\n if (options.isPaused) {\n this.pause();\n }\n }\n\n /**\n *\n * Reading persisted data from storage then brings into memory.\n *\n * Notes:\n * - Reset the memory, so we can call this method whenever we want and not only on the initialize process.\n * - All the events will be tirggered (like onCreateQueue, onCreateTask, onBlock, ....)\n * - Try to `resume` if the status is `running`.\n * - Trigger `onPersistedDataLoaded` event when queues recovered from storage.\n *\n */\n private async sync() {\n // Reading queues from storage\n const queues = await this.persistor.getAll();\n\n // Reset queues, if anything is exist in memory.\n this.queues = new Map();\n\n // Brings them into memory\n queues.forEach((q) => {\n const list = this.createQueue({\n queue_id: q.id,\n queue_name: q.name,\n });\n this.add(q.id, {\n list,\n createdAt: q.createdAt,\n name: q.name,\n status: q.status,\n actions: {\n run: () => {\n list.next({\n context: this.getContext(),\n });\n },\n cancel: () => {\n list.cancel();\n },\n setStorage: (...args) => {\n list.setStorage(...args);\n },\n getStorage: () => {\n return list.getStorage();\n },\n },\n });\n\n list.initTasks({\n state: q.state,\n tasks: q.tasks,\n storage: q.storage || {},\n });\n\n if (q.status === Status.RUNNING && this.shouldExecute()) {\n console.log('[INIT] Try to resume');\n list.resume({\n context: this.getContext(),\n });\n }\n });\n\n // Trigger an event to let the subscribers we are done here.\n this.events.onPersistedDataLoaded(this);\n }\n\n /**\n *\n * Making a new instance from `Queue` and adds Manager's event handlers to it.\n *\n * @returns An instance of `Queue` with wrapped event handlers from Manager.\n *\n */\n private createQueue({\n queue_id,\n queue_name,\n }: {\n queue_id: QueueID;\n queue_name: QueueName;\n }) {\n const manager = this;\n const def = this.queuesDefs.get(queue_name)!;\n const list = new Queue({\n id: queue_id,\n events: {\n onCreate: (task) => {\n this.events.onCreateTask(queue_id, task);\n this.handleUpdate(queue_id);\n\n if (def.events?.onCreate) def.events.onCreate(task);\n },\n onUpdate: (task) => {\n this.events.onUpdateTask(queue_id, task);\n this.handleUpdate(queue_id);\n\n if (def.events?.onUpdate) def.events.onUpdate(task);\n },\n onUpdateListStatus: (status) => {\n this.queues.set(queue_id, {\n ...this.get(queue_id)!,\n status,\n });\n this.events.onUpdateQueue(queue_id, this.get(queue_id)!);\n\n this.handleUpdate(queue_id);\n\n // After finishing a queue, try to run other queues.\n this.execute();\n if (def.events?.onUpdateListStatus)\n def.events.onUpdateListStatus(status);\n },\n onStorageUpdate: (data) => {\n this.events.onStorageUpdate(queue_id, data);\n if (def.events?.onStorageUpdate) def.events.onStorageUpdate(data);\n this.handleUpdate(queue_id);\n },\n onBlock: (event) => {\n // Update queue status\n this.queues.set(queue_id, {\n ...this.get(queue_id)!,\n status: Status.BLOCKED,\n });\n\n // Trigger event\n this.events.onTaskBlock(queue_id);\n if (def.whenTaskBlocked) {\n def.whenTaskBlocked(event, {\n queue_id: queue_id,\n queue: list,\n context: this.getContext(),\n getBlockedTasks: this.getBlockedTasks.bind(this),\n forceExecute: this.forceExecute.bind(this),\n retry: this.retry.bind(this),\n manager,\n });\n }\n\n // Sync\n this.handleUpdate(queue_id);\n },\n onUnblock: () => {\n // Update queue status\n this.queues.set(queue_id, {\n ...this.get(queue_id)!,\n status: Status.PENDING,\n });\n\n // Sync\n this.handleUpdate(queue_id);\n\n this.execute();\n },\n },\n actions: def.actions,\n });\n return list;\n }\n\n /**\n * Go through all tasks (from all queues) and return a list of blocked tasks\n *\n * @returns a list of blocked tasks including enough information to get the queue and mutate the storage.\n *\n */\n private getBlockedTasks() {\n const queues = this.getAll();\n const blockedTasks: BlockedTask[] = [];\n queues.forEach((q, queue_id) => {\n q.list.tasks.forEach((task) => {\n const state = q.list.state.tasks[task.id];\n if (state.status === Status.BLOCKED) {\n blockedTasks.push({\n task_id: task.id,\n queue_id: queue_id,\n action: task.action,\n reason: state.blockedFor,\n storage: {\n get: () => {\n return q.list.getStorage();\n },\n set: (data) => {\n return q.list.setStorage(data);\n },\n },\n });\n }\n });\n });\n\n return blockedTasks;\n }\n\n /**\n *\n * Add a queue to the manager to keep track of the queue and its state.\n *\n * @param id\n * @param queue\n * @returns\n */\n private add(id: QueueID, queue: QueueInfo) {\n this.queues.set(id, queue);\n const createdQueue = this.get(id)!;\n this.events.onCreateQueue({ ...createdQueue, id });\n\n return createdQueue;\n }\n\n // Create a new queue\n /**\n *\n * Create a new queue by client.\n *\n * It will do the internal things to make a queue from definitions, and running using Manager.\n *\n * Notes:\n * - After creating the queue, it will be run automatically.\n *\n * @returns an ID for queue so it can be used to get the created queue later by client.\n *\n */\n public async create(name: QueueName, storage: QueueStorage) {\n if (!this.queuesDefs.has(name)) {\n throw new Error('You need to add a queue definition first.');\n }\n\n const def = this.queuesDefs.get(name)!;\n const queue_id: QueueID = uuidv4();\n const createdAt = Date.now();\n const list = this.createQueue({\n queue_id: queue_id,\n queue_name: name,\n });\n list.setStorage(storage);\n\n const createdQueue = this.add(queue_id, {\n list,\n createdAt,\n name,\n status: Status.PENDING,\n actions: {\n run: () => {\n list.next({\n context: this.getContext(),\n });\n },\n cancel: () => {\n list.cancel();\n },\n setStorage: (...args) => {\n list.setStorage(...args);\n },\n getStorage: () => {\n return list.getStorage();\n },\n },\n });\n\n // Persist initial queue\n // Note: we need to first insert the queue, and then it can be updated by internal events.\n await this.persistor.insertQueue({\n id: queue_id,\n createdAt,\n name: createdQueue.name,\n status: createdQueue.status,\n tasks: list.tasks,\n state: list.state,\n storage: list.getStorage(),\n });\n\n // adding initial tasks\n def.run.forEach((action) => {\n console.log('action', action);\n list.createTask(action);\n });\n\n // After creating a new queue, try to run.\n this.execute();\n return queue_id;\n }\n\n /**\n * Get a queue by its ID.\n *\n * @returns An object includes queue and its state in `Manager`.\n */\n public get(queue_id: QueueID) {\n return this.queues.get(queue_id);\n }\n\n /**\n * Get all queues from `Manager`\n *\n * @returns a list of queues includes all the queues and their states.\n */\n public getAll() {\n return this.queues;\n }\n\n /**\n *\n * Ask from manager to run pending queues.\n *\n * It only try to run queues with `PENDING` status and ignore all the other statuses.\n *\n */\n public execute() {\n if (!this.shouldExecute()) return;\n\n for (const [, q] of Array.from(this.queues)) {\n if (q.status === Status.PENDING) {\n console.log('There is a pending queue. Run it.');\n q.actions.run();\n }\n }\n\n console.log('There is no pending queue.');\n }\n\n /**\n *\n * Try to find queues with `RUNNING` status to run them again.\n *\n * It's useful for recovering the queue at some certain points\n * like running a currepted task (reloaded when it was running) or needs manual trigger from UI.\n *\n * @returns\n */\n public resume() {\n if (!this.shouldExecute()) return;\n\n for (const [, q] of Array.from(this.queues)) {\n if (q.status === Status.RUNNING) {\n console.log(\"Found a running queue. Let's resume the queue.\", q);\n q.list.resume({\n context: this.getContext(),\n });\n return;\n }\n }\n\n // If there is no running queue, try to run a new queue.\n this.execute();\n }\n\n /**\n *\n * Run all `BLOCKED` queues once again.\n *\n * If a queue has `BLOCKED` status and the last task is `BLOCKED` as well,\n * The task will be run one more time.\n *\n * Useful for scenarios like we are blocking the queue under some conditions in task,\n * We can use this method to ask the queue to run the blocked task one more time and\n * maybe this time condtions are met and the queue can be proceed.\n *\n * @returns\n */\n public retry() {\n if (!this.shouldExecute()) return;\n\n for (const [, q] of Array.from(this.queues)) {\n if (q.status === Status.BLOCKED) {\n console.log(\n `[Retry] Found: ${q.list.id}, Running onBlock callback.`,\n q\n );\n q.list.checkBlock();\n }\n }\n\n // If there is no running queue, try to run a new queue.\n this.execute();\n }\n\n /**\n *\n * Run a blocked task on a specific queue with the ability to pass more data.\n *\n * Useful when we have a custom logic for running queue and needs to pass some specific data\n * to the task and try to run it manually with the provided data.\n *\n */\n public forceExecute(queue_id: string, data?: object) {\n const queue = this.get(queue_id);\n let context = this.getContext();\n if (data) {\n context = {\n ...context,\n ...data,\n };\n }\n\n queue?.list.forceRun({\n context,\n });\n }\n\n /**\n *\n * Sync in-memory state (of `Manager`) with storage (persist).\n *\n * Usually we call this method after a change detected in the state of manager.\n *\n */\n private handleUpdate(queue_id: QueueID) {\n const queue = this.get(queue_id);\n\n if (queue) {\n const status = queue.status;\n const state = queue.list.state;\n const tasks = queue.list.tasks;\n this.persistor.updateQueue(queue_id, {\n status,\n state,\n tasks,\n storage: queue.list.getStorage(),\n });\n }\n }\n\n /**\n * Active readonly mode for manager, it means it doesn't run anythin,\n * And only can be used to read the data.\n */\n public pause() {\n this.isPaused = true;\n }\n\n /**\n * Activate normal mode which means it will be able to run the queuese as well.\n */\n public run() {\n // If call this method multiple times, it should be run for once.\n if (this.isPaused) {\n this.isPaused = false;\n this.sync();\n }\n }\n\n private getContext() {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n //@ts-ignore\n return this.context?.current || {};\n }\n\n private shouldExecute() {\n console.log('[shouldExecute] checking and result is:', {\n isPaused: this.isPaused,\n });\n return !this.isPaused;\n }\n}\n\nexport { Manager };\n"],"names":["Status","Persistor","this","db","openDB","upgrade","createObjectStore","keyPath","_proto","prototype","insertQueue","_insertQueue","_asyncToGenerator","_regeneratorRuntime","mark","_callee","queue","wrap","_context","prev","next","sent","get","id","console","log","add","stop","_x","apply","arguments","updateQueue","_updateQueue","_callee2","currentRecord","updatedRecord","_context2","abrupt","_extends","put","_x2","_x3","getAll","_getAll","_callee3","_context3","Queue","options","status","PENDING","activeTaskIndex","tasks","events","actions","updateQueueStatus","state","onUpdateListStatus","updateActiveTaskIndex","index","updateTaskState","nextState","blockedFor","updatedTaskEvent","task","action","find","onUpdate","createTask","uuidv4","push","createdTask","onCreate","initTasks","info","storage","forEach","_this","t","checkBlock","currentActiveTask","getActiveTask","BLOCKED","onBlock","reason","lastTaskIsSuccessful","lastTask","length","lastTaskState","SUCCESS","firstTaskIsStarted","firstTask","firstTaskState","check","currentListStatus","nextListStatus","RUNNING","_step","_iterator","_createForOfIteratorHelperLoose","done","value","FAILED","params","activeTask","activeTaskState","CANCELED","execute","context","getContext","_this2","markCurrentTaskAsFinished","retry","resume","failed","schedule","getStorage","bind","setStorage","block","unblock","_ref","_ref$silent","silent","Error","onUnblock","forceRun","currentTask","_this3","resetState","cancel","includes","Object","keys","_this4","data","onStorageUpdate","_queue","Manager","Map","defaultEventHandlers","onCreateQueue","onCreateTask","onUpdateQueue","onUpdateTask","onTaskBlock","onPersistedDataLoaded","queuesDefs","map","qDef","set","name","persistor","sync","isPaused","pause","_sync","queues","q","list","createQueue","queue_id","queue_name","createdAt","run","shouldExecute","manager","def","handleUpdate","_def$events","_def$events2","_def$events3","_def$events4","event","whenTaskBlocked","getBlockedTasks","forceExecute","blockedTasks","task_id","createdQueue","create","_create","has","Date","now","_i","_Array$from","Array","from","_i2","_Array$from2","_i3","_Array$from3","_this$context","current"],"mappings":"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"}
1
+ {"version":3,"file":"queue-manager-core.cjs.production.min.js","sources":["../src/types.ts","../src/persistor.ts","../src/queue.ts","../src/manager.ts"],"sourcesContent":["import { QueueID, QueueName } from './manager';\nimport Queue, { QueueState, Task } from './queue';\n\nexport enum Status {\n PENDING = 'PENDING',\n RUNNING = 'RUNNING',\n FAILED = 'FAILED',\n SUCCESS = 'SUCCESS',\n CANCELED = 'CANCELED',\n BLOCKED = 'BLOCKED',\n}\n\nexport type QueueStorage = Record<string, unknown>;\n\nexport type QueueType = Queue;\n\nexport interface PersistedQueue {\n id: QueueID;\n createdAt: number;\n name: QueueName;\n status: Status;\n state: QueueState;\n tasks: Task[];\n storage: QueueStorage;\n}\n","import { openDB, DBSchema, IDBPDatabase } from 'idb';\n\nimport { QueueID } from './manager';\nimport { PersistedQueue } from './types';\n\nexport const DB_NAME = 'queues-manager';\nconst OBJECT_STORE_NAME = 'queues';\nconst VERSION = 1;\n\ntype UpdatePersistedQueue = Partial<\n Pick<PersistedQueue, 'status' | 'state' | 'tasks' | 'storage'>\n>;\n\ninterface Database extends DBSchema {\n queues: {\n value: PersistedQueue;\n key: string;\n };\n}\n\nclass Persistor {\n db: Promise<IDBPDatabase<Database>>;\n constructor() {\n this.db = openDB<Database>(DB_NAME, VERSION, {\n upgrade(db) {\n db.createObjectStore(OBJECT_STORE_NAME, { keyPath: 'id' });\n },\n });\n }\n async insertQueue(queue: PersistedQueue) {\n const db = await this.db;\n const queueRecord = await db.get(OBJECT_STORE_NAME, queue.id);\n if (queueRecord) {\n console.log('[Persistor] Queue already exists inside persistor.');\n } else {\n await db.add(OBJECT_STORE_NAME, queue);\n console.log('[Persistor] Queue added to IndexedDB successfully.');\n }\n }\n async updateQueue(id: QueueID, queue: UpdatePersistedQueue) {\n const db = await this.db;\n const currentRecord = await db.get(OBJECT_STORE_NAME, id);\n\n if (!currentRecord) {\n console.log(\"[Persistor] Requested queue for update doesn't exist.\");\n return;\n }\n\n const updatedRecord = {\n ...currentRecord,\n ...queue,\n };\n await db.put(OBJECT_STORE_NAME, updatedRecord);\n }\n async getAll() {\n const db = await this.db;\n const results = await db.getAll(OBJECT_STORE_NAME);\n\n return results;\n }\n}\n\nexport default Persistor;\n","import { v4 as uuidv4 } from 'uuid';\nimport { ManagerContext, QueueDef, QueueID } from './manager';\nimport { QueueStorage, Status } from './types';\n\ntype TaskId = string;\nexport type TaskState = {\n status: Status;\n blockedFor: any;\n};\n\nexport interface QueueContext {\n _queue?: {\n id: string;\n };\n}\nexport type NextParams = {\n context: ManagerContext;\n};\n\nexport interface QueueState {\n status: Status;\n activeTaskIndex: number;\n tasks: {\n [key in TaskId]: TaskState;\n };\n}\n\nexport interface Task {\n id: TaskId;\n action: string;\n}\n\nexport type InitTasks = {\n tasks: Task[];\n state: QueueState;\n storage: QueueStorage;\n};\n\nexport interface TaskEvent {\n id: TaskId;\n task: TaskState;\n action: string;\n}\n\nexport interface QueueEventHandlers {\n // all tasks\n onUpdateListStatus: (status: Status) => void;\n // single task\n onCreate: (event: TaskEvent) => void;\n onUpdate: (event: TaskEvent) => void;\n onStorageUpdate: (data: QueueStorage) => void;\n onBlock: (\n data: Omit<TaskEvent, 'task'> & { reason: Record<string, unknown> }\n ) => void;\n onUnblock: (data: { id: string }) => void;\n}\n\ninterface QueueOptions {\n id: QueueID;\n events: QueueEventHandlers;\n actions: QueueDef['actions'];\n}\n\n/**\n *\n * Notes on statuses:\n * - Success: last task has success status\n * - Failed: any of task has been failed\n * - Running: first task is not on pending\n * - Pending: default state. not started\n *\n */\nclass Queue {\n public id: string;\n public state: QueueState = {\n status: Status.PENDING,\n activeTaskIndex: 0,\n tasks: {},\n };\n public tasks: Task[] = [];\n private events: QueueOptions['events'];\n private actions: QueueOptions['actions'];\n private storage: QueueStorage = {};\n\n constructor(options: QueueOptions) {\n this.id = options.id;\n this.events = options.events;\n this.actions = options.actions;\n }\n\n /**\n * Update queue status and trigger an event\n *\n */\n private updateQueueStatus(status: Status) {\n this.state.status = status;\n this.events.onUpdateListStatus(status);\n }\n\n private updateActiveTaskIndex(index: number) {\n this.state.activeTaskIndex = index;\n }\n\n /**\n *\n * Update task state (`status`, `blockedFor`) and trigger an event.\n * @param id\n * @param nextState\n */\n private updateTaskState(id: TaskId, nextState: Partial<TaskState>) {\n if (nextState.status) {\n this.state.tasks[id].status = nextState.status;\n }\n if (nextState.blockedFor) {\n this.state.tasks[id].blockedFor = nextState.blockedFor;\n }\n\n const updatedTaskEvent = {\n id: id,\n task: this.get(id)!,\n action: this.tasks.find((task) => task.id === id)!.action,\n };\n this.events.onUpdate(updatedTaskEvent);\n }\n\n /**\n * Create a task by providing an `action` name.\n *\n * this method creating the task, push it to the queue's tasks and trigger an event.\n * @param action\n */\n createTask(action: string) {\n const id = uuidv4();\n this.tasks.push({\n action,\n id,\n });\n this.state.tasks[id] = {\n status: Status.PENDING,\n blockedFor: null,\n };\n\n const createdTask = this.get(id);\n this.events.onCreate({\n id,\n task: createdTask!,\n action,\n });\n }\n\n /**\n * Initilize a queue with some tasks, instead of an empty queue.\n *\n * Using it for recover the queue state from persistor.\n *\n */\n public initTasks(info: InitTasks) {\n this.state = info.state;\n this.storage = info.storage;\n\n info.tasks.forEach((task) => {\n this.tasks.push(task);\n const action = this.tasks.find((t) => t.id === task.id)!.action;\n this.events.onCreate({\n id: task.id,\n task: this.get(task.id)!,\n action,\n });\n });\n }\n\n public checkBlock() {\n const currentActiveTask = this.getActiveTask();\n\n if (!currentActiveTask) {\n return;\n }\n const { task, state } = currentActiveTask;\n\n if (state.status === Status.BLOCKED) {\n this.events.onBlock({\n action: task.action,\n id: task.id,\n reason: state.blockedFor,\n });\n }\n }\n\n /**\n * Getting task state by ID\n */\n public get(id: string): TaskState | null {\n const task = this.state.tasks[id];\n\n if (!task) return null;\n\n return task;\n }\n\n /**\n *\n * Checking if status of the last is `SUCCESS` or not\n *\n */\n private lastTaskIsSuccessful() {\n const lastTask = this.tasks[this.tasks.length - 1];\n\n // checking for empty lists.\n if (lastTask) {\n const lastTaskState = this.state.tasks[lastTask.id];\n\n // Maybe we didn't create the state yet. It should has success status as well.\n if (!!lastTaskState && lastTaskState.status === Status.SUCCESS) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * If the first task started (it's not PENDING),\n * it means the queue has been ran.\n *\n * @returns\n */\n private firstTaskIsStarted() {\n const firstTask = this.tasks[0];\n\n // checking for empty lists.\n if (firstTask) {\n const firstTaskState = this.state.tasks[firstTask.id];\n\n // Maybe we didn't create the state yet.\n if (!!firstTaskState) {\n if (firstTaskState.status !== Status.PENDING) {\n return true;\n }\n }\n }\n\n return false;\n }\n\n /**\n * Getting active task index from state and\n * returns the task and its state.\n *\n */\n private getActiveTask() {\n // First try to get task with `activeTask`\n const index = this.state.activeTaskIndex;\n const task = this.tasks[index];\n\n // Consider all the tasks has been executed.\n if (!task) {\n return null;\n }\n\n const state = this.state.tasks[task.id];\n\n return { task, state, index };\n }\n\n /**\n * Update and find the queue status by checking state of each tasks in the queue.\n */\n public check() {\n const currentListStatus = this.state.status;\n let nextListStatus = this.firstTaskIsStarted()\n ? Status.RUNNING\n : Status.PENDING;\n\n if (this.lastTaskIsSuccessful()) {\n nextListStatus = Status.SUCCESS;\n } else {\n // Is there any failed task?\n for (const task of this.tasks) {\n const state = this.state.tasks[task.id];\n\n // If one item fails, we stop to work on the list.\n if (state.status === Status.FAILED) {\n nextListStatus = Status.FAILED;\n break;\n }\n }\n }\n\n // We only update and trigger an event when there is a new value\n if (nextListStatus !== currentListStatus) {\n this.updateQueueStatus(nextListStatus);\n }\n }\n\n /**\n * Execute active task.\n * Based on the state of active task, the behaviour is different. If status is:\n * - Success -> we need to go to next task by updating the active index and try `next` on more time.\n * - Failed, Running, or no active task -> doesn't do anything.\n * - Pending or Blocked -> update the task and queue status to running, and execute the provided `action` for the task.\n *\n * The queue is a linked list somehow, active task means the pointer to where we are in the queue right now.\n *\n */\n public next(params: NextParams) {\n console.log('[next]', this.state, params);\n\n this.check();\n\n const currentActiveTask = this.getActiveTask();\n\n if (!currentActiveTask) {\n return;\n }\n\n const {\n index: activeTaskIndex,\n task: activeTask,\n state: activeTaskState,\n } = currentActiveTask;\n\n // if `activeTask` is already done, we will go for next one.\n if (activeTaskState.status === Status.SUCCESS) {\n this.updateActiveTaskIndex(activeTaskIndex + 1);\n this.next(params);\n return;\n }\n\n if (activeTaskState.status === Status.FAILED) {\n console.log('Task has been failed. It can not be proceed.');\n return;\n }\n\n if (activeTaskState.status === Status.CANCELED) {\n console.log('Task has been canceled. It can not be proceed.');\n return;\n }\n\n if (activeTaskState.status === Status.RUNNING) {\n console.log('Task is running. It can not be proceed.');\n return;\n }\n\n if (\n activeTaskState.status === Status.PENDING ||\n activeTaskState.status === Status.BLOCKED\n ) {\n // Update task status to `running`\n this.updateTaskState(activeTask.id, {\n status: Status.RUNNING,\n });\n this.updateQueueStatus(Status.RUNNING);\n\n // Try to execute task.\n const execute = this.actions[activeTask.action];\n execute({\n context: this.getContext(params),\n next: () => {\n console.log('[execute][next]', params);\n this.markCurrentTaskAsFinished(params);\n },\n retry: () => {\n this.resume(params);\n },\n failed: () => {\n this.updateTaskState(activeTask.id, {\n status: Status.FAILED,\n });\n this.check();\n },\n schedule: (action) => {\n this.createTask(action);\n this.check();\n },\n getStorage: this.getStorage.bind(this),\n setStorage: this.setStorage.bind(this),\n block: (reason: Record<string, unknown>) => {\n this.block({ reason });\n },\n unblock: () => {\n this.unblock();\n },\n });\n }\n }\n\n /**\n * Change the `status` of active task and queue to BLOCKED, then trigger an event.\n */\n public block({\n reason,\n silent = false,\n }: {\n reason: Record<string, unknown>;\n silent?: boolean;\n }) {\n const currentActiveTask = this.getActiveTask();\n\n if (!currentActiveTask) {\n throw new Error(\"Task isn't exist.\");\n }\n\n this.updateTaskState(currentActiveTask.task.id, {\n status: Status.BLOCKED,\n blockedFor: reason,\n });\n this.updateQueueStatus(Status.BLOCKED);\n\n if (!silent) {\n this.events.onBlock({\n action: currentActiveTask.task.action,\n id: currentActiveTask.task.id,\n reason,\n });\n }\n }\n\n /**\n * If the active task is `BLOCKED`, update the task status to `PENDING`, queue status to `RUNNING`\n * then trigger an event.\n */\n public unblock() {\n const currentActiveTask = this.getActiveTask();\n\n if (\n !currentActiveTask ||\n currentActiveTask.state.status !== Status.BLOCKED\n ) {\n throw new Error('Task is not blocked.');\n }\n\n this.updateTaskState(currentActiveTask.task.id, {\n status: Status.PENDING,\n });\n this.updateQueueStatus(Status.RUNNING);\n this.events.onUnblock({ id: currentActiveTask.task.id });\n }\n\n /**\n * If the active task is `BLOCKED` then execute the `action` for the task.\n *\n * It is useful for when we need to run a blocked task without changing the status of task at the first place.\n * For scenarios like we have some conditions in `action` and needs to run the `action` again\n * to check the conditions are met or not, if yes, so we can proceed the `action`.\n *\n */\n public forceRun(params: NextParams) {\n const currentTask = this.getActiveTask();\n\n if (!currentTask || currentTask.state.status !== Status.BLOCKED) {\n throw new Error('Task is not blocked.');\n }\n\n // Try to execute task.\n const execute = this.actions[currentTask.task.action];\n execute({\n context: this.getContext(params),\n next: () => {\n console.log('[force run][execute][next]', params);\n\n /*\n NOTE:\n When running `forceRun`, the status of task can be `BLOCKED`\n So we need to change to `Running` first. \n */\n // Update task status to `running`\n this.updateTaskState(currentTask.task.id, {\n status: Status.RUNNING,\n });\n this.updateQueueStatus(Status.RUNNING);\n\n this.markCurrentTaskAsFinished(params);\n },\n retry: () => {\n this.resume(params);\n },\n failed: () => {\n this.updateTaskState(currentTask.task.id, {\n status: Status.FAILED,\n });\n this.check();\n },\n schedule: (action) => {\n this.createTask(action);\n this.check();\n },\n getStorage: this.getStorage.bind(this),\n setStorage: this.setStorage.bind(this),\n block: (reason: Record<string, unknown>) => {\n this.block({ reason });\n },\n unblock: () => {\n this.unblock();\n },\n });\n }\n private markCurrentTaskAsFinished(params: NextParams) {\n this.check();\n const activeTaskIndex = this.state.activeTaskIndex;\n const activeTask = this.tasks[activeTaskIndex];\n\n if (!activeTask) {\n console.log(\"It seems this queue has been finished. Task doesn't exist.\");\n return;\n }\n\n const activeTaskState = this.state.tasks[activeTask.id];\n if (activeTaskState.status === Status.RUNNING) {\n this.updateTaskState(activeTask.id, {\n status: Status.SUCCESS,\n });\n this.updateActiveTaskIndex(activeTaskIndex + 1);\n\n const updatedTaskEvent = {\n id: activeTask.id,\n task: this.get(activeTask.id)!,\n action: this.tasks.find((task) => task.id === activeTask.id)!.action,\n };\n this.events.onUpdate(updatedTaskEvent);\n this.next(params);\n } else {\n console.log('There is no running task.');\n }\n }\n\n /**\n * If the active task is `RUNNING`, change it to `PENING` the try to run the task by calling `next`.\n * If it's other than `RUNNING` we reset the queue state and run the queue from the beggining.\n *\n * @param params\n * @returns\n */\n public resume(params: NextParams) {\n const activeTaskIndex = this.state.activeTaskIndex;\n const activeTask = this.tasks[activeTaskIndex];\n if (!activeTask) {\n console.log(\"It seems this queue has been finished. Task doesn't exist.\");\n return;\n }\n\n const activeTaskState = this.state.tasks[activeTask.id];\n if (activeTaskState.status === Status.RUNNING) {\n this.updateTaskState(activeTask.id, {\n status: Status.PENDING,\n });\n this.next(params);\n } else {\n console.log('There is no running task. restart the queue', {\n state: this.state.tasks,\n activeTaskState,\n activeTask,\n activeTaskIndex,\n });\n this.resetState();\n this.next(params);\n }\n }\n\n /**\n *\n * Cancel the queue by changing active task and queue status to `CANCELED`.\n *\n */\n public cancel() {\n const currentActiveTask = this.getActiveTask();\n\n if (\n !currentActiveTask ||\n [Status.FAILED, Status.CANCELED, Status.SUCCESS].includes(\n currentActiveTask.state.status\n )\n ) {\n return;\n }\n\n const { task } = currentActiveTask;\n\n // Update task status to `canceled`\n this.updateTaskState(task.id, {\n status: Status.CANCELED,\n });\n const updatedTaskEvent = {\n id: task.id,\n task: this.get(task.id)!,\n action: this.tasks.find((t) => t.id === task.id)!.action,\n };\n this.events.onUpdate(updatedTaskEvent);\n\n // Update queue status to `canceled`\n this.updateQueueStatus(Status.CANCELED);\n }\n\n /**\n * Update queue status, and all the tasks inside queue to `PENDING`.\n */\n private resetState() {\n this.state.activeTaskIndex = 0;\n this.state.status = Status.PENDING;\n Object.keys(this.state.tasks).forEach((id) => {\n this.state.tasks[id].status = Status.PENDING;\n });\n }\n\n public getStorage() {\n return this.storage;\n }\n public setStorage(data: QueueStorage) {\n this.storage = data;\n this.events.onStorageUpdate(data);\n return this.storage;\n }\n\n private getContext(params: NextParams): QueueContext & ManagerContext {\n return {\n ...params.context,\n _queue: {\n id: this.id,\n },\n };\n }\n}\n\nexport default Queue;\n","import Persistor from './persistor';\nimport Queue, { QueueEventHandlers, TaskEvent } from './queue';\nimport { QueueStorage, Status } from './types';\nimport { v4 as uuidv4 } from 'uuid';\n\nexport type ManagerContext = object;\nexport type QueueName = string;\nexport type QueueID = string;\nexport type BlockedTask = {\n queue_id: string;\n task_id: string;\n action: string;\n reason: Record<string, unknown>;\n storage: {\n get: () => QueueStorage;\n set: (data: QueueStorage) => QueueStorage;\n };\n};\n\nexport type SetStorage<T> = (nextStorage: T) => T;\n\nexport interface ExecuterActions<\n T extends QueueStorage = QueueStorage,\n V extends string = string,\n C = ManagerContext\n> {\n next: () => void;\n retry: () => void;\n failed: () => void;\n schedule: (actionName: V) => void;\n setStorage: SetStorage<T>;\n getStorage: () => T;\n block: (reason: Record<string, unknown>) => void;\n unblock: () => void;\n context: C;\n}\n\nexport interface QueueDef<\n T extends QueueStorage = QueueStorage,\n V extends string = string,\n C = ManagerContext\n> {\n name: QueueName;\n actions: {\n [K in V]: (actions: ExecuterActions<T, V, C>) => void | Promise<void>;\n };\n events?: Partial<QueueEventHandlers>;\n run: V[];\n whenTaskBlocked?: (\n event: any,\n params: {\n queue_id: string;\n queue: Queue;\n context: C;\n getBlockedTasks: () => BlockedTask[];\n forceExecute: (queue_id: string, data?: object) => void;\n retry: () => void;\n manager: Manager;\n }\n ) => void;\n}\n\nexport interface Events {\n onCreateQueue: (queue: QueueInfo & { id: QueueID }) => void;\n onUpdateQueue: (queue_id: QueueID, queue: QueueInfo) => void;\n onCreateTask: (queue_id: QueueID, event: TaskEvent) => void;\n onUpdateTask: (queue_id: QueueID, event: TaskEvent) => void;\n onStorageUpdate: (queue_id: QueueID, data: QueueStorage) => void;\n onTaskBlock: (queue_id: QueueID) => void;\n onPersistedDataLoaded: (manager: Manager) => void;\n}\n\ninterface ManagerOptions {\n events?: Partial<Events>;\n queuesDefs: QueueDef[];\n context?: ManagerContext;\n isPaused?: boolean;\n}\n\nexport interface QueueInfo {\n name: QueueName;\n createdAt: number;\n status: Status;\n list: Queue;\n actions: {\n run: () => void;\n cancel: () => void;\n setStorage: SetStorage<any>;\n getStorage: () => any;\n };\n}\n\nclass Manager {\n private queuesDefs = new Map<QueueName, QueueDef>();\n private queues = new Map<QueueID, QueueInfo>();\n private events: Events;\n private persistor: Persistor;\n private context: ManagerContext;\n private isPaused: boolean = false;\n\n /**\n *\n * Making an instance, initilize events, setup a persistor and try to recover the last state of the manager.\n *\n * */\n constructor(options: ManagerOptions) {\n const defaultEventHandlers: Events = {\n onCreateQueue: () => {\n // ...\n },\n onCreateTask: () => {\n // ...\n },\n onUpdateQueue: () => {\n // ...\n },\n onUpdateTask: () => {\n // ...\n },\n onStorageUpdate: () => {\n // ...\n },\n onTaskBlock: () => {\n // ...\n },\n onPersistedDataLoaded: () => {\n // ..\n },\n };\n\n if (options.events) {\n this.events = {\n ...defaultEventHandlers,\n ...options.events,\n };\n } else {\n this.events = defaultEventHandlers;\n }\n\n options.queuesDefs.map((qDef) => {\n this.queuesDefs.set(qDef.name, qDef);\n });\n\n this.context = options.context || {};\n this.persistor = new Persistor();\n this.sync();\n\n if (options.isPaused) {\n this.pause();\n }\n }\n\n /**\n *\n * Reading persisted data from storage then brings into memory.\n *\n * Notes:\n * - Reset the memory, so we can call this method whenever we want and not only on the initialize process.\n * - All the events will be tirggered (like onCreateQueue, onCreateTask, onBlock, ....)\n * - Try to `resume` if the status is `running`.\n * - Trigger `onPersistedDataLoaded` event when queues recovered from storage.\n *\n */\n private async sync() {\n // Reading queues from storage\n const queues = await this.persistor.getAll();\n\n // Reset queues, if anything is exist in memory.\n this.queues = new Map();\n\n // Brings them into memory\n queues.forEach((q) => {\n const list = this.createQueue({\n queue_id: q.id,\n queue_name: q.name,\n });\n this.add(q.id, {\n list,\n createdAt: q.createdAt,\n name: q.name,\n status: q.status,\n actions: {\n run: () => {\n list.next({\n context: this.getContext(),\n });\n },\n cancel: () => {\n list.cancel();\n },\n setStorage: (...args) => {\n list.setStorage(...args);\n },\n getStorage: () => {\n return list.getStorage();\n },\n },\n });\n\n list.initTasks({\n state: q.state,\n tasks: q.tasks,\n storage: q.storage || {},\n });\n\n if (q.status === Status.RUNNING && this.shouldExecute()) {\n console.log('[INIT] Try to resume');\n list.resume({\n context: this.getContext(),\n });\n }\n });\n\n // Trigger an event to let the subscribers we are done here.\n this.events.onPersistedDataLoaded(this);\n }\n\n /**\n *\n * Making a new instance from `Queue` and adds Manager's event handlers to it.\n *\n * @returns An instance of `Queue` with wrapped event handlers from Manager.\n *\n */\n private createQueue({\n queue_id,\n queue_name,\n }: {\n queue_id: QueueID;\n queue_name: QueueName;\n }) {\n const manager = this;\n const def = this.queuesDefs.get(queue_name)!;\n const list = new Queue({\n id: queue_id,\n events: {\n onCreate: (task) => {\n this.events.onCreateTask(queue_id, task);\n this.handleUpdate(queue_id);\n\n if (def.events?.onCreate) def.events.onCreate(task);\n },\n onUpdate: (task) => {\n this.events.onUpdateTask(queue_id, task);\n this.handleUpdate(queue_id);\n\n if (def.events?.onUpdate) def.events.onUpdate(task);\n },\n onUpdateListStatus: (status) => {\n this.queues.set(queue_id, {\n ...this.get(queue_id)!,\n status,\n });\n this.events.onUpdateQueue(queue_id, this.get(queue_id)!);\n\n this.handleUpdate(queue_id);\n\n // After finishing a queue, try to run other queues.\n this.execute();\n if (def.events?.onUpdateListStatus)\n def.events.onUpdateListStatus(status);\n },\n onStorageUpdate: (data) => {\n this.events.onStorageUpdate(queue_id, data);\n if (def.events?.onStorageUpdate) def.events.onStorageUpdate(data);\n this.handleUpdate(queue_id);\n },\n onBlock: (event) => {\n // Update queue status\n this.queues.set(queue_id, {\n ...this.get(queue_id)!,\n status: Status.BLOCKED,\n });\n\n // Trigger event\n this.events.onTaskBlock(queue_id);\n if (def.whenTaskBlocked) {\n def.whenTaskBlocked(event, {\n queue_id: queue_id,\n queue: list,\n context: this.getContext(),\n getBlockedTasks: this.getBlockedTasks.bind(this),\n forceExecute: this.forceExecute.bind(this),\n retry: this.retry.bind(this),\n manager,\n });\n }\n\n // Sync\n this.handleUpdate(queue_id);\n },\n onUnblock: () => {\n // Update queue status\n this.queues.set(queue_id, {\n ...this.get(queue_id)!,\n status: Status.PENDING,\n });\n\n // Sync\n this.handleUpdate(queue_id);\n\n this.execute();\n },\n },\n actions: def.actions,\n });\n return list;\n }\n\n /**\n * Go through all tasks (from all queues) and return a list of blocked tasks\n *\n * @returns a list of blocked tasks including enough information to get the queue and mutate the storage.\n *\n */\n private getBlockedTasks() {\n const queues = this.getAll();\n const blockedTasks: BlockedTask[] = [];\n queues.forEach((q, queue_id) => {\n q.list.tasks.forEach((task) => {\n const state = q.list.state.tasks[task.id];\n if (state.status === Status.BLOCKED) {\n blockedTasks.push({\n task_id: task.id,\n queue_id: queue_id,\n action: task.action,\n reason: state.blockedFor,\n storage: {\n get: () => {\n return q.list.getStorage();\n },\n set: (data) => {\n return q.list.setStorage(data);\n },\n },\n });\n }\n });\n });\n\n return blockedTasks;\n }\n\n /**\n *\n * Add a queue to the manager to keep track of the queue and its state.\n *\n * @param id\n * @param queue\n * @returns\n */\n private add(id: QueueID, queue: QueueInfo) {\n this.queues.set(id, queue);\n const createdQueue = this.get(id)!;\n this.events.onCreateQueue({ ...createdQueue, id });\n\n return createdQueue;\n }\n\n // Create a new queue\n /**\n *\n * Create a new queue by client.\n *\n * It will do the internal things to make a queue from definitions, and running using Manager.\n *\n * Notes:\n * - After creating the queue, it will be run automatically.\n *\n * @returns an ID for queue so it can be used to get the created queue later by client.\n *\n */\n public async create(\n name: QueueName,\n storage: QueueStorage,\n options?: { id?: QueueID }\n ) {\n if (!this.queuesDefs.has(name)) {\n throw new Error('You need to add a queue definition first.');\n }\n const def = this.queuesDefs.get(name)!;\n const queue_id: QueueID = options?.id || uuidv4();\n const createdAt = Date.now();\n const list = this.createQueue({\n queue_id: queue_id,\n queue_name: name,\n });\n list.setStorage(storage);\n\n const createdQueue = this.add(queue_id, {\n list,\n createdAt,\n name,\n status: Status.PENDING,\n actions: {\n run: () => {\n list.next({\n context: this.getContext(),\n });\n },\n cancel: () => {\n list.cancel();\n },\n setStorage: (...args) => {\n list.setStorage(...args);\n },\n getStorage: () => {\n return list.getStorage();\n },\n },\n });\n\n // Persist initial queue\n // Note: we need to first insert the queue, and then it can be updated by internal events.\n await this.persistor.insertQueue({\n id: queue_id,\n createdAt,\n name: createdQueue.name,\n status: createdQueue.status,\n tasks: list.tasks,\n state: list.state,\n storage: list.getStorage(),\n });\n\n // adding initial tasks\n def.run.forEach((action) => {\n console.log('action', action);\n list.createTask(action);\n });\n\n // After creating a new queue, try to run.\n this.execute();\n return queue_id;\n }\n\n /**\n * Get a queue by its ID.\n *\n * @returns An object includes queue and its state in `Manager`.\n */\n public get(queue_id: QueueID) {\n return this.queues.get(queue_id);\n }\n\n /**\n * Get all queues from `Manager`\n *\n * @returns a list of queues includes all the queues and their states.\n */\n public getAll() {\n return this.queues;\n }\n\n /**\n *\n * Ask from manager to run pending queues.\n *\n * It only try to run queues with `PENDING` status and ignore all the other statuses.\n *\n */\n public execute() {\n if (!this.shouldExecute()) return;\n\n for (const [, q] of Array.from(this.queues)) {\n if (q.status === Status.PENDING) {\n console.log('There is a pending queue. Run it.');\n q.actions.run();\n }\n }\n\n console.log('There is no pending queue.');\n }\n\n /**\n *\n * Try to find queues with `RUNNING` status to run them again.\n *\n * It's useful for recovering the queue at some certain points\n * like running a currepted task (reloaded when it was running) or needs manual trigger from UI.\n *\n * @returns\n */\n public resume() {\n if (!this.shouldExecute()) return;\n\n for (const [, q] of Array.from(this.queues)) {\n if (q.status === Status.RUNNING) {\n console.log(\"Found a running queue. Let's resume the queue.\", q);\n q.list.resume({\n context: this.getContext(),\n });\n return;\n }\n }\n\n // If there is no running queue, try to run a new queue.\n this.execute();\n }\n\n /**\n *\n * Run all `BLOCKED` queues once again.\n *\n * If a queue has `BLOCKED` status and the last task is `BLOCKED` as well,\n * The task will be run one more time.\n *\n * Useful for scenarios like we are blocking the queue under some conditions in task,\n * We can use this method to ask the queue to run the blocked task one more time and\n * maybe this time condtions are met and the queue can be proceed.\n *\n * @returns\n */\n public retry() {\n if (!this.shouldExecute()) return;\n\n for (const [, q] of Array.from(this.queues)) {\n if (q.status === Status.BLOCKED) {\n console.log(\n `[Retry] Found: ${q.list.id}, Running onBlock callback.`,\n q\n );\n q.list.checkBlock();\n }\n }\n\n // If there is no running queue, try to run a new queue.\n this.execute();\n }\n\n /**\n *\n * Run a blocked task on a specific queue with the ability to pass more data.\n *\n * Useful when we have a custom logic for running queue and needs to pass some specific data\n * to the task and try to run it manually with the provided data.\n *\n */\n public forceExecute(queue_id: string, data?: object) {\n const queue = this.get(queue_id);\n let context = this.getContext();\n if (data) {\n context = {\n ...context,\n ...data,\n };\n }\n\n queue?.list.forceRun({\n context,\n });\n }\n\n /**\n *\n * Sync in-memory state (of `Manager`) with storage (persist).\n *\n * Usually we call this method after a change detected in the state of manager.\n *\n */\n private handleUpdate(queue_id: QueueID) {\n const queue = this.get(queue_id);\n\n if (queue) {\n const status = queue.status;\n const state = queue.list.state;\n const tasks = queue.list.tasks;\n this.persistor.updateQueue(queue_id, {\n status,\n state,\n tasks,\n storage: queue.list.getStorage(),\n });\n }\n }\n\n /**\n * Active readonly mode for manager, it means it doesn't run anythin,\n * And only can be used to read the data.\n */\n public pause() {\n this.isPaused = true;\n }\n\n /**\n * Activate normal mode which means it will be able to run the queuese as well.\n */\n public run() {\n // If call this method multiple times, it should be run for once.\n if (this.isPaused) {\n this.isPaused = false;\n this.sync();\n }\n }\n\n private getContext() {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n //@ts-ignore\n return this.context?.current || {};\n }\n\n private shouldExecute() {\n console.log('[shouldExecute] checking and result is:', {\n isPaused: this.isPaused,\n });\n return !this.isPaused;\n }\n}\n\nexport { Manager };\n"],"names":["Status","Persistor","this","db","openDB","upgrade","createObjectStore","keyPath","_proto","prototype","insertQueue","_insertQueue","_asyncToGenerator","_regeneratorRuntime","mark","_callee","queue","wrap","_context","prev","next","sent","get","id","console","log","add","stop","_x","apply","arguments","updateQueue","_updateQueue","_callee2","currentRecord","updatedRecord","_context2","abrupt","_extends","put","_x2","_x3","getAll","_getAll","_callee3","_context3","Queue","options","status","PENDING","activeTaskIndex","tasks","events","actions","updateQueueStatus","state","onUpdateListStatus","updateActiveTaskIndex","index","updateTaskState","nextState","blockedFor","updatedTaskEvent","task","action","find","onUpdate","createTask","uuidv4","push","createdTask","onCreate","initTasks","info","storage","forEach","_this","t","checkBlock","currentActiveTask","getActiveTask","BLOCKED","onBlock","reason","lastTaskIsSuccessful","lastTask","length","lastTaskState","SUCCESS","firstTaskIsStarted","firstTask","firstTaskState","check","currentListStatus","nextListStatus","RUNNING","_step","_iterator","_createForOfIteratorHelperLoose","done","value","FAILED","params","activeTask","activeTaskState","CANCELED","execute","context","getContext","_this2","markCurrentTaskAsFinished","retry","resume","failed","schedule","getStorage","bind","setStorage","block","unblock","_ref","_ref$silent","silent","Error","onUnblock","forceRun","currentTask","_this3","resetState","cancel","includes","Object","keys","_this4","data","onStorageUpdate","_queue","Manager","Map","defaultEventHandlers","onCreateQueue","onCreateTask","onUpdateQueue","onUpdateTask","onTaskBlock","onPersistedDataLoaded","queuesDefs","map","qDef","set","name","persistor","sync","isPaused","pause","_sync","queues","q","list","createQueue","queue_id","queue_name","createdAt","run","shouldExecute","manager","def","handleUpdate","_def$events","_def$events2","_def$events3","_def$events4","event","whenTaskBlocked","getBlockedTasks","forceExecute","blockedTasks","task_id","createdQueue","create","_create","has","Date","now","_i","_Array$from","Array","from","_i2","_Array$from2","_i3","_Array$from3","_this$context","current"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import { v4 } from 'uuid';
2
1
  import { openDB } from 'idb';
2
+ import { v4 } from 'uuid';
3
3
 
4
4
  function _regeneratorRuntime() {
5
5
  _regeneratorRuntime = function () {
@@ -1273,7 +1273,7 @@ var Manager = /*#__PURE__*/function () {
1273
1273
  _proto.create =
1274
1274
  /*#__PURE__*/
1275
1275
  function () {
1276
- var _create = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(name, storage) {
1276
+ var _create = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(name, storage, options) {
1277
1277
  var _this4 = this;
1278
1278
  var def, queue_id, createdAt, list, createdQueue;
1279
1279
  return _regeneratorRuntime().wrap(function _callee2$(_context2) {
@@ -1286,7 +1286,7 @@ var Manager = /*#__PURE__*/function () {
1286
1286
  throw new Error('You need to add a queue definition first.');
1287
1287
  case 2:
1288
1288
  def = this.queuesDefs.get(name);
1289
- queue_id = v4();
1289
+ queue_id = (options == null ? void 0 : options.id) || v4();
1290
1290
  createdAt = Date.now();
1291
1291
  list = this.createQueue({
1292
1292
  queue_id: queue_id,
@@ -1341,7 +1341,7 @@ var Manager = /*#__PURE__*/function () {
1341
1341
  }
1342
1342
  }, _callee2, this);
1343
1343
  }));
1344
- function create(_x, _x2) {
1344
+ function create(_x, _x2, _x3) {
1345
1345
  return _create.apply(this, arguments);
1346
1346
  }
1347
1347
  return create;
@@ -1 +1 @@
1
- {"version":3,"file":"queue-manager-core.esm.js","sources":["../src/persistor.ts","../src/types.ts","../src/queue.ts","../src/manager.ts"],"sourcesContent":["import { openDB, DBSchema, IDBPDatabase } from 'idb';\n\nimport { QueueID } from './manager';\nimport { PersistedQueue } from './types';\n\nexport const DB_NAME = 'queues-manager';\nconst OBJECT_STORE_NAME = 'queues';\nconst VERSION = 1;\n\ntype UpdatePersistedQueue = Partial<\n Pick<PersistedQueue, 'status' | 'state' | 'tasks' | 'storage'>\n>;\n\ninterface Database extends DBSchema {\n queues: {\n value: PersistedQueue;\n key: string;\n };\n}\n\nclass Persistor {\n db: Promise<IDBPDatabase<Database>>;\n constructor() {\n this.db = openDB<Database>(DB_NAME, VERSION, {\n upgrade(db) {\n db.createObjectStore(OBJECT_STORE_NAME, { keyPath: 'id' });\n },\n });\n }\n async insertQueue(queue: PersistedQueue) {\n const db = await this.db;\n const queueRecord = await db.get(OBJECT_STORE_NAME, queue.id);\n if (queueRecord) {\n console.log('[Persistor] Queue already exists inside persistor.');\n } else {\n await db.add(OBJECT_STORE_NAME, queue);\n console.log('[Persistor] Queue added to IndexedDB successfully.');\n }\n }\n async updateQueue(id: QueueID, queue: UpdatePersistedQueue) {\n const db = await this.db;\n const currentRecord = await db.get(OBJECT_STORE_NAME, id);\n\n if (!currentRecord) {\n console.log(\"[Persistor] Requested queue for update doesn't exist.\");\n return;\n }\n\n const updatedRecord = {\n ...currentRecord,\n ...queue,\n };\n await db.put(OBJECT_STORE_NAME, updatedRecord);\n }\n async getAll() {\n const db = await this.db;\n const results = await db.getAll(OBJECT_STORE_NAME);\n\n return results;\n }\n}\n\nexport default Persistor;\n","import { QueueID, QueueName } from './manager';\nimport Queue, { QueueState, Task } from './queue';\n\nexport enum Status {\n PENDING = 'PENDING',\n RUNNING = 'RUNNING',\n FAILED = 'FAILED',\n SUCCESS = 'SUCCESS',\n CANCELED = 'CANCELED',\n BLOCKED = 'BLOCKED',\n}\n\nexport type QueueStorage = Record<string, unknown>;\n\nexport type QueueType = Queue;\n\nexport interface PersistedQueue {\n id: QueueID;\n createdAt: number;\n name: QueueName;\n status: Status;\n state: QueueState;\n tasks: Task[];\n storage: QueueStorage;\n}\n","import { v4 as uuidv4 } from 'uuid';\nimport { ManagerContext, QueueDef, QueueID } from './manager';\nimport { QueueStorage, Status } from './types';\n\ntype TaskId = string;\nexport type TaskState = {\n status: Status;\n blockedFor: any;\n};\n\nexport interface QueueContext {\n _queue?: {\n id: string;\n };\n}\nexport type NextParams = {\n context: ManagerContext;\n};\n\nexport interface QueueState {\n status: Status;\n activeTaskIndex: number;\n tasks: {\n [key in TaskId]: TaskState;\n };\n}\n\nexport interface Task {\n id: TaskId;\n action: string;\n}\n\nexport type InitTasks = {\n tasks: Task[];\n state: QueueState;\n storage: QueueStorage;\n};\n\nexport interface TaskEvent {\n id: TaskId;\n task: TaskState;\n action: string;\n}\n\nexport interface QueueEventHandlers {\n // all tasks\n onUpdateListStatus: (status: Status) => void;\n // single task\n onCreate: (event: TaskEvent) => void;\n onUpdate: (event: TaskEvent) => void;\n onStorageUpdate: (data: QueueStorage) => void;\n onBlock: (\n data: Omit<TaskEvent, 'task'> & { reason: Record<string, unknown> }\n ) => void;\n onUnblock: (data: { id: string }) => void;\n}\n\ninterface QueueOptions {\n id: QueueID;\n events: QueueEventHandlers;\n actions: QueueDef['actions'];\n}\n\n/**\n *\n * Notes on statuses:\n * - Success: last task has success status\n * - Failed: any of task has been failed\n * - Running: first task is not on pending\n * - Pending: default state. not started\n *\n */\nclass Queue {\n public id: string;\n public state: QueueState = {\n status: Status.PENDING,\n activeTaskIndex: 0,\n tasks: {},\n };\n public tasks: Task[] = [];\n private events: QueueOptions['events'];\n private actions: QueueOptions['actions'];\n private storage: QueueStorage = {};\n\n constructor(options: QueueOptions) {\n this.id = options.id;\n this.events = options.events;\n this.actions = options.actions;\n }\n\n /**\n * Update queue status and trigger an event\n *\n */\n private updateQueueStatus(status: Status) {\n this.state.status = status;\n this.events.onUpdateListStatus(status);\n }\n\n private updateActiveTaskIndex(index: number) {\n this.state.activeTaskIndex = index;\n }\n\n /**\n *\n * Update task state (`status`, `blockedFor`) and trigger an event.\n * @param id\n * @param nextState\n */\n private updateTaskState(id: TaskId, nextState: Partial<TaskState>) {\n if (nextState.status) {\n this.state.tasks[id].status = nextState.status;\n }\n if (nextState.blockedFor) {\n this.state.tasks[id].blockedFor = nextState.blockedFor;\n }\n\n const updatedTaskEvent = {\n id: id,\n task: this.get(id)!,\n action: this.tasks.find((task) => task.id === id)!.action,\n };\n this.events.onUpdate(updatedTaskEvent);\n }\n\n /**\n * Create a task by providing an `action` name.\n *\n * this method creating the task, push it to the queue's tasks and trigger an event.\n * @param action\n */\n createTask(action: string) {\n const id = uuidv4();\n this.tasks.push({\n action,\n id,\n });\n this.state.tasks[id] = {\n status: Status.PENDING,\n blockedFor: null,\n };\n\n const createdTask = this.get(id);\n this.events.onCreate({\n id,\n task: createdTask!,\n action,\n });\n }\n\n /**\n * Initilize a queue with some tasks, instead of an empty queue.\n *\n * Using it for recover the queue state from persistor.\n *\n */\n public initTasks(info: InitTasks) {\n this.state = info.state;\n this.storage = info.storage;\n\n info.tasks.forEach((task) => {\n this.tasks.push(task);\n const action = this.tasks.find((t) => t.id === task.id)!.action;\n this.events.onCreate({\n id: task.id,\n task: this.get(task.id)!,\n action,\n });\n });\n }\n\n public checkBlock() {\n const currentActiveTask = this.getActiveTask();\n\n if (!currentActiveTask) {\n return;\n }\n const { task, state } = currentActiveTask;\n\n if (state.status === Status.BLOCKED) {\n this.events.onBlock({\n action: task.action,\n id: task.id,\n reason: state.blockedFor,\n });\n }\n }\n\n /**\n * Getting task state by ID\n */\n public get(id: string): TaskState | null {\n const task = this.state.tasks[id];\n\n if (!task) return null;\n\n return task;\n }\n\n /**\n *\n * Checking if status of the last is `SUCCESS` or not\n *\n */\n private lastTaskIsSuccessful() {\n const lastTask = this.tasks[this.tasks.length - 1];\n\n // checking for empty lists.\n if (lastTask) {\n const lastTaskState = this.state.tasks[lastTask.id];\n\n // Maybe we didn't create the state yet. It should has success status as well.\n if (!!lastTaskState && lastTaskState.status === Status.SUCCESS) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * If the first task started (it's not PENDING),\n * it means the queue has been ran.\n *\n * @returns\n */\n private firstTaskIsStarted() {\n const firstTask = this.tasks[0];\n\n // checking for empty lists.\n if (firstTask) {\n const firstTaskState = this.state.tasks[firstTask.id];\n\n // Maybe we didn't create the state yet.\n if (!!firstTaskState) {\n if (firstTaskState.status !== Status.PENDING) {\n return true;\n }\n }\n }\n\n return false;\n }\n\n /**\n * Getting active task index from state and\n * returns the task and its state.\n *\n */\n private getActiveTask() {\n // First try to get task with `activeTask`\n const index = this.state.activeTaskIndex;\n const task = this.tasks[index];\n\n // Consider all the tasks has been executed.\n if (!task) {\n return null;\n }\n\n const state = this.state.tasks[task.id];\n\n return { task, state, index };\n }\n\n /**\n * Update and find the queue status by checking state of each tasks in the queue.\n */\n public check() {\n const currentListStatus = this.state.status;\n let nextListStatus = this.firstTaskIsStarted()\n ? Status.RUNNING\n : Status.PENDING;\n\n if (this.lastTaskIsSuccessful()) {\n nextListStatus = Status.SUCCESS;\n } else {\n // Is there any failed task?\n for (const task of this.tasks) {\n const state = this.state.tasks[task.id];\n\n // If one item fails, we stop to work on the list.\n if (state.status === Status.FAILED) {\n nextListStatus = Status.FAILED;\n break;\n }\n }\n }\n\n // We only update and trigger an event when there is a new value\n if (nextListStatus !== currentListStatus) {\n this.updateQueueStatus(nextListStatus);\n }\n }\n\n /**\n * Execute active task.\n * Based on the state of active task, the behaviour is different. If status is:\n * - Success -> we need to go to next task by updating the active index and try `next` on more time.\n * - Failed, Running, or no active task -> doesn't do anything.\n * - Pending or Blocked -> update the task and queue status to running, and execute the provided `action` for the task.\n *\n * The queue is a linked list somehow, active task means the pointer to where we are in the queue right now.\n *\n */\n public next(params: NextParams) {\n console.log('[next]', this.state, params);\n\n this.check();\n\n const currentActiveTask = this.getActiveTask();\n\n if (!currentActiveTask) {\n return;\n }\n\n const {\n index: activeTaskIndex,\n task: activeTask,\n state: activeTaskState,\n } = currentActiveTask;\n\n // if `activeTask` is already done, we will go for next one.\n if (activeTaskState.status === Status.SUCCESS) {\n this.updateActiveTaskIndex(activeTaskIndex + 1);\n this.next(params);\n return;\n }\n\n if (activeTaskState.status === Status.FAILED) {\n console.log('Task has been failed. It can not be proceed.');\n return;\n }\n\n if (activeTaskState.status === Status.CANCELED) {\n console.log('Task has been canceled. It can not be proceed.');\n return;\n }\n\n if (activeTaskState.status === Status.RUNNING) {\n console.log('Task is running. It can not be proceed.');\n return;\n }\n\n if (\n activeTaskState.status === Status.PENDING ||\n activeTaskState.status === Status.BLOCKED\n ) {\n // Update task status to `running`\n this.updateTaskState(activeTask.id, {\n status: Status.RUNNING,\n });\n this.updateQueueStatus(Status.RUNNING);\n\n // Try to execute task.\n const execute = this.actions[activeTask.action];\n execute({\n context: this.getContext(params),\n next: () => {\n console.log('[execute][next]', params);\n this.markCurrentTaskAsFinished(params);\n },\n retry: () => {\n this.resume(params);\n },\n failed: () => {\n this.updateTaskState(activeTask.id, {\n status: Status.FAILED,\n });\n this.check();\n },\n schedule: (action) => {\n this.createTask(action);\n this.check();\n },\n getStorage: this.getStorage.bind(this),\n setStorage: this.setStorage.bind(this),\n block: (reason: Record<string, unknown>) => {\n this.block({ reason });\n },\n unblock: () => {\n this.unblock();\n },\n });\n }\n }\n\n /**\n * Change the `status` of active task and queue to BLOCKED, then trigger an event.\n */\n public block({\n reason,\n silent = false,\n }: {\n reason: Record<string, unknown>;\n silent?: boolean;\n }) {\n const currentActiveTask = this.getActiveTask();\n\n if (!currentActiveTask) {\n throw new Error(\"Task isn't exist.\");\n }\n\n this.updateTaskState(currentActiveTask.task.id, {\n status: Status.BLOCKED,\n blockedFor: reason,\n });\n this.updateQueueStatus(Status.BLOCKED);\n\n if (!silent) {\n this.events.onBlock({\n action: currentActiveTask.task.action,\n id: currentActiveTask.task.id,\n reason,\n });\n }\n }\n\n /**\n * If the active task is `BLOCKED`, update the task status to `PENDING`, queue status to `RUNNING`\n * then trigger an event.\n */\n public unblock() {\n const currentActiveTask = this.getActiveTask();\n\n if (\n !currentActiveTask ||\n currentActiveTask.state.status !== Status.BLOCKED\n ) {\n throw new Error('Task is not blocked.');\n }\n\n this.updateTaskState(currentActiveTask.task.id, {\n status: Status.PENDING,\n });\n this.updateQueueStatus(Status.RUNNING);\n this.events.onUnblock({ id: currentActiveTask.task.id });\n }\n\n /**\n * If the active task is `BLOCKED` then execute the `action` for the task.\n *\n * It is useful for when we need to run a blocked task without changing the status of task at the first place.\n * For scenarios like we have some conditions in `action` and needs to run the `action` again\n * to check the conditions are met or not, if yes, so we can proceed the `action`.\n *\n */\n public forceRun(params: NextParams) {\n const currentTask = this.getActiveTask();\n\n if (!currentTask || currentTask.state.status !== Status.BLOCKED) {\n throw new Error('Task is not blocked.');\n }\n\n // Try to execute task.\n const execute = this.actions[currentTask.task.action];\n execute({\n context: this.getContext(params),\n next: () => {\n console.log('[force run][execute][next]', params);\n\n /*\n NOTE:\n When running `forceRun`, the status of task can be `BLOCKED`\n So we need to change to `Running` first. \n */\n // Update task status to `running`\n this.updateTaskState(currentTask.task.id, {\n status: Status.RUNNING,\n });\n this.updateQueueStatus(Status.RUNNING);\n\n this.markCurrentTaskAsFinished(params);\n },\n retry: () => {\n this.resume(params);\n },\n failed: () => {\n this.updateTaskState(currentTask.task.id, {\n status: Status.FAILED,\n });\n this.check();\n },\n schedule: (action) => {\n this.createTask(action);\n this.check();\n },\n getStorage: this.getStorage.bind(this),\n setStorage: this.setStorage.bind(this),\n block: (reason: Record<string, unknown>) => {\n this.block({ reason });\n },\n unblock: () => {\n this.unblock();\n },\n });\n }\n private markCurrentTaskAsFinished(params: NextParams) {\n this.check();\n const activeTaskIndex = this.state.activeTaskIndex;\n const activeTask = this.tasks[activeTaskIndex];\n\n if (!activeTask) {\n console.log(\"It seems this queue has been finished. Task doesn't exist.\");\n return;\n }\n\n const activeTaskState = this.state.tasks[activeTask.id];\n if (activeTaskState.status === Status.RUNNING) {\n this.updateTaskState(activeTask.id, {\n status: Status.SUCCESS,\n });\n this.updateActiveTaskIndex(activeTaskIndex + 1);\n\n const updatedTaskEvent = {\n id: activeTask.id,\n task: this.get(activeTask.id)!,\n action: this.tasks.find((task) => task.id === activeTask.id)!.action,\n };\n this.events.onUpdate(updatedTaskEvent);\n this.next(params);\n } else {\n console.log('There is no running task.');\n }\n }\n\n /**\n * If the active task is `RUNNING`, change it to `PENING` the try to run the task by calling `next`.\n * If it's other than `RUNNING` we reset the queue state and run the queue from the beggining.\n *\n * @param params\n * @returns\n */\n public resume(params: NextParams) {\n const activeTaskIndex = this.state.activeTaskIndex;\n const activeTask = this.tasks[activeTaskIndex];\n if (!activeTask) {\n console.log(\"It seems this queue has been finished. Task doesn't exist.\");\n return;\n }\n\n const activeTaskState = this.state.tasks[activeTask.id];\n if (activeTaskState.status === Status.RUNNING) {\n this.updateTaskState(activeTask.id, {\n status: Status.PENDING,\n });\n this.next(params);\n } else {\n console.log('There is no running task. restart the queue', {\n state: this.state.tasks,\n activeTaskState,\n activeTask,\n activeTaskIndex,\n });\n this.resetState();\n this.next(params);\n }\n }\n\n /**\n *\n * Cancel the queue by changing active task and queue status to `CANCELED`.\n *\n */\n public cancel() {\n const currentActiveTask = this.getActiveTask();\n\n if (\n !currentActiveTask ||\n [Status.FAILED, Status.CANCELED, Status.SUCCESS].includes(\n currentActiveTask.state.status\n )\n ) {\n return;\n }\n\n const { task } = currentActiveTask;\n\n // Update task status to `canceled`\n this.updateTaskState(task.id, {\n status: Status.CANCELED,\n });\n const updatedTaskEvent = {\n id: task.id,\n task: this.get(task.id)!,\n action: this.tasks.find((t) => t.id === task.id)!.action,\n };\n this.events.onUpdate(updatedTaskEvent);\n\n // Update queue status to `canceled`\n this.updateQueueStatus(Status.CANCELED);\n }\n\n /**\n * Update queue status, and all the tasks inside queue to `PENDING`.\n */\n private resetState() {\n this.state.activeTaskIndex = 0;\n this.state.status = Status.PENDING;\n Object.keys(this.state.tasks).forEach((id) => {\n this.state.tasks[id].status = Status.PENDING;\n });\n }\n\n public getStorage() {\n return this.storage;\n }\n public setStorage(data: QueueStorage) {\n this.storage = data;\n this.events.onStorageUpdate(data);\n return this.storage;\n }\n\n private getContext(params: NextParams): QueueContext & ManagerContext {\n return {\n ...params.context,\n _queue: {\n id: this.id,\n },\n };\n }\n}\n\nexport default Queue;\n","import { v4 as uuidv4 } from 'uuid';\nimport Persistor from './persistor';\nimport Queue, { QueueEventHandlers, TaskEvent } from './queue';\nimport { QueueStorage, Status } from './types';\n\nexport type ManagerContext = object;\nexport type QueueName = string;\nexport type QueueID = string;\nexport type BlockedTask = {\n queue_id: string;\n task_id: string;\n action: string;\n reason: Record<string, unknown>;\n storage: {\n get: () => QueueStorage;\n set: (data: QueueStorage) => QueueStorage;\n };\n};\n\nexport type SetStorage<T> = (nextStorage: T) => T;\n\nexport interface ExecuterActions<\n T extends QueueStorage = QueueStorage,\n V extends string = string,\n C = ManagerContext\n> {\n next: () => void;\n retry: () => void;\n failed: () => void;\n schedule: (actionName: V) => void;\n setStorage: SetStorage<T>;\n getStorage: () => T;\n block: (reason: Record<string, unknown>) => void;\n unblock: () => void;\n context: C;\n}\n\nexport interface QueueDef<\n T extends QueueStorage = QueueStorage,\n V extends string = string,\n C = ManagerContext\n> {\n name: QueueName;\n actions: {\n [K in V]: (actions: ExecuterActions<T, V, C>) => void | Promise<void>;\n };\n events?: Partial<QueueEventHandlers>;\n run: V[];\n whenTaskBlocked?: (\n event: any,\n params: {\n queue_id: string;\n queue: Queue;\n context: C;\n getBlockedTasks: () => BlockedTask[];\n forceExecute: (queue_id: string, data?: object) => void;\n retry: () => void;\n manager: Manager;\n }\n ) => void;\n}\n\nexport interface Events {\n onCreateQueue: (queue: QueueInfo & { id: QueueID }) => void;\n onUpdateQueue: (queue_id: QueueID, queue: QueueInfo) => void;\n onCreateTask: (queue_id: QueueID, event: TaskEvent) => void;\n onUpdateTask: (queue_id: QueueID, event: TaskEvent) => void;\n onStorageUpdate: (queue_id: QueueID, data: QueueStorage) => void;\n onTaskBlock: (queue_id: QueueID) => void;\n onPersistedDataLoaded: (manager: Manager) => void;\n}\n\ninterface ManagerOptions {\n events?: Partial<Events>;\n queuesDefs: QueueDef[];\n context?: ManagerContext;\n isPaused?: boolean;\n}\n\nexport interface QueueInfo {\n name: QueueName;\n createdAt: number;\n status: Status;\n list: Queue;\n actions: {\n run: () => void;\n cancel: () => void;\n setStorage: SetStorage<any>;\n getStorage: () => any;\n };\n}\n\nclass Manager {\n private queuesDefs = new Map<QueueName, QueueDef>();\n private queues = new Map<QueueID, QueueInfo>();\n private events: Events;\n private persistor: Persistor;\n private context: ManagerContext;\n private isPaused: boolean = false;\n\n /**\n *\n * Making an instance, initilize events, setup a persistor and try to recover the last state of the manager.\n *\n * */\n constructor(options: ManagerOptions) {\n const defaultEventHandlers: Events = {\n onCreateQueue: () => {\n // ...\n },\n onCreateTask: () => {\n // ...\n },\n onUpdateQueue: () => {\n // ...\n },\n onUpdateTask: () => {\n // ...\n },\n onStorageUpdate: () => {\n // ...\n },\n onTaskBlock: () => {\n // ...\n },\n onPersistedDataLoaded: () => {\n // ..\n },\n };\n\n if (options.events) {\n this.events = {\n ...defaultEventHandlers,\n ...options.events,\n };\n } else {\n this.events = defaultEventHandlers;\n }\n\n options.queuesDefs.map((qDef) => {\n this.queuesDefs.set(qDef.name, qDef);\n });\n\n this.context = options.context || {};\n this.persistor = new Persistor();\n this.sync();\n\n if (options.isPaused) {\n this.pause();\n }\n }\n\n /**\n *\n * Reading persisted data from storage then brings into memory.\n *\n * Notes:\n * - Reset the memory, so we can call this method whenever we want and not only on the initialize process.\n * - All the events will be tirggered (like onCreateQueue, onCreateTask, onBlock, ....)\n * - Try to `resume` if the status is `running`.\n * - Trigger `onPersistedDataLoaded` event when queues recovered from storage.\n *\n */\n private async sync() {\n // Reading queues from storage\n const queues = await this.persistor.getAll();\n\n // Reset queues, if anything is exist in memory.\n this.queues = new Map();\n\n // Brings them into memory\n queues.forEach((q) => {\n const list = this.createQueue({\n queue_id: q.id,\n queue_name: q.name,\n });\n this.add(q.id, {\n list,\n createdAt: q.createdAt,\n name: q.name,\n status: q.status,\n actions: {\n run: () => {\n list.next({\n context: this.getContext(),\n });\n },\n cancel: () => {\n list.cancel();\n },\n setStorage: (...args) => {\n list.setStorage(...args);\n },\n getStorage: () => {\n return list.getStorage();\n },\n },\n });\n\n list.initTasks({\n state: q.state,\n tasks: q.tasks,\n storage: q.storage || {},\n });\n\n if (q.status === Status.RUNNING && this.shouldExecute()) {\n console.log('[INIT] Try to resume');\n list.resume({\n context: this.getContext(),\n });\n }\n });\n\n // Trigger an event to let the subscribers we are done here.\n this.events.onPersistedDataLoaded(this);\n }\n\n /**\n *\n * Making a new instance from `Queue` and adds Manager's event handlers to it.\n *\n * @returns An instance of `Queue` with wrapped event handlers from Manager.\n *\n */\n private createQueue({\n queue_id,\n queue_name,\n }: {\n queue_id: QueueID;\n queue_name: QueueName;\n }) {\n const manager = this;\n const def = this.queuesDefs.get(queue_name)!;\n const list = new Queue({\n id: queue_id,\n events: {\n onCreate: (task) => {\n this.events.onCreateTask(queue_id, task);\n this.handleUpdate(queue_id);\n\n if (def.events?.onCreate) def.events.onCreate(task);\n },\n onUpdate: (task) => {\n this.events.onUpdateTask(queue_id, task);\n this.handleUpdate(queue_id);\n\n if (def.events?.onUpdate) def.events.onUpdate(task);\n },\n onUpdateListStatus: (status) => {\n this.queues.set(queue_id, {\n ...this.get(queue_id)!,\n status,\n });\n this.events.onUpdateQueue(queue_id, this.get(queue_id)!);\n\n this.handleUpdate(queue_id);\n\n // After finishing a queue, try to run other queues.\n this.execute();\n if (def.events?.onUpdateListStatus)\n def.events.onUpdateListStatus(status);\n },\n onStorageUpdate: (data) => {\n this.events.onStorageUpdate(queue_id, data);\n if (def.events?.onStorageUpdate) def.events.onStorageUpdate(data);\n this.handleUpdate(queue_id);\n },\n onBlock: (event) => {\n // Update queue status\n this.queues.set(queue_id, {\n ...this.get(queue_id)!,\n status: Status.BLOCKED,\n });\n\n // Trigger event\n this.events.onTaskBlock(queue_id);\n if (def.whenTaskBlocked) {\n def.whenTaskBlocked(event, {\n queue_id: queue_id,\n queue: list,\n context: this.getContext(),\n getBlockedTasks: this.getBlockedTasks.bind(this),\n forceExecute: this.forceExecute.bind(this),\n retry: this.retry.bind(this),\n manager,\n });\n }\n\n // Sync\n this.handleUpdate(queue_id);\n },\n onUnblock: () => {\n // Update queue status\n this.queues.set(queue_id, {\n ...this.get(queue_id)!,\n status: Status.PENDING,\n });\n\n // Sync\n this.handleUpdate(queue_id);\n\n this.execute();\n },\n },\n actions: def.actions,\n });\n return list;\n }\n\n /**\n * Go through all tasks (from all queues) and return a list of blocked tasks\n *\n * @returns a list of blocked tasks including enough information to get the queue and mutate the storage.\n *\n */\n private getBlockedTasks() {\n const queues = this.getAll();\n const blockedTasks: BlockedTask[] = [];\n queues.forEach((q, queue_id) => {\n q.list.tasks.forEach((task) => {\n const state = q.list.state.tasks[task.id];\n if (state.status === Status.BLOCKED) {\n blockedTasks.push({\n task_id: task.id,\n queue_id: queue_id,\n action: task.action,\n reason: state.blockedFor,\n storage: {\n get: () => {\n return q.list.getStorage();\n },\n set: (data) => {\n return q.list.setStorage(data);\n },\n },\n });\n }\n });\n });\n\n return blockedTasks;\n }\n\n /**\n *\n * Add a queue to the manager to keep track of the queue and its state.\n *\n * @param id\n * @param queue\n * @returns\n */\n private add(id: QueueID, queue: QueueInfo) {\n this.queues.set(id, queue);\n const createdQueue = this.get(id)!;\n this.events.onCreateQueue({ ...createdQueue, id });\n\n return createdQueue;\n }\n\n // Create a new queue\n /**\n *\n * Create a new queue by client.\n *\n * It will do the internal things to make a queue from definitions, and running using Manager.\n *\n * Notes:\n * - After creating the queue, it will be run automatically.\n *\n * @returns an ID for queue so it can be used to get the created queue later by client.\n *\n */\n public async create(name: QueueName, storage: QueueStorage) {\n if (!this.queuesDefs.has(name)) {\n throw new Error('You need to add a queue definition first.');\n }\n\n const def = this.queuesDefs.get(name)!;\n const queue_id: QueueID = uuidv4();\n const createdAt = Date.now();\n const list = this.createQueue({\n queue_id: queue_id,\n queue_name: name,\n });\n list.setStorage(storage);\n\n const createdQueue = this.add(queue_id, {\n list,\n createdAt,\n name,\n status: Status.PENDING,\n actions: {\n run: () => {\n list.next({\n context: this.getContext(),\n });\n },\n cancel: () => {\n list.cancel();\n },\n setStorage: (...args) => {\n list.setStorage(...args);\n },\n getStorage: () => {\n return list.getStorage();\n },\n },\n });\n\n // Persist initial queue\n // Note: we need to first insert the queue, and then it can be updated by internal events.\n await this.persistor.insertQueue({\n id: queue_id,\n createdAt,\n name: createdQueue.name,\n status: createdQueue.status,\n tasks: list.tasks,\n state: list.state,\n storage: list.getStorage(),\n });\n\n // adding initial tasks\n def.run.forEach((action) => {\n console.log('action', action);\n list.createTask(action);\n });\n\n // After creating a new queue, try to run.\n this.execute();\n return queue_id;\n }\n\n /**\n * Get a queue by its ID.\n *\n * @returns An object includes queue and its state in `Manager`.\n */\n public get(queue_id: QueueID) {\n return this.queues.get(queue_id);\n }\n\n /**\n * Get all queues from `Manager`\n *\n * @returns a list of queues includes all the queues and their states.\n */\n public getAll() {\n return this.queues;\n }\n\n /**\n *\n * Ask from manager to run pending queues.\n *\n * It only try to run queues with `PENDING` status and ignore all the other statuses.\n *\n */\n public execute() {\n if (!this.shouldExecute()) return;\n\n for (const [, q] of Array.from(this.queues)) {\n if (q.status === Status.PENDING) {\n console.log('There is a pending queue. Run it.');\n q.actions.run();\n }\n }\n\n console.log('There is no pending queue.');\n }\n\n /**\n *\n * Try to find queues with `RUNNING` status to run them again.\n *\n * It's useful for recovering the queue at some certain points\n * like running a currepted task (reloaded when it was running) or needs manual trigger from UI.\n *\n * @returns\n */\n public resume() {\n if (!this.shouldExecute()) return;\n\n for (const [, q] of Array.from(this.queues)) {\n if (q.status === Status.RUNNING) {\n console.log(\"Found a running queue. Let's resume the queue.\", q);\n q.list.resume({\n context: this.getContext(),\n });\n return;\n }\n }\n\n // If there is no running queue, try to run a new queue.\n this.execute();\n }\n\n /**\n *\n * Run all `BLOCKED` queues once again.\n *\n * If a queue has `BLOCKED` status and the last task is `BLOCKED` as well,\n * The task will be run one more time.\n *\n * Useful for scenarios like we are blocking the queue under some conditions in task,\n * We can use this method to ask the queue to run the blocked task one more time and\n * maybe this time condtions are met and the queue can be proceed.\n *\n * @returns\n */\n public retry() {\n if (!this.shouldExecute()) return;\n\n for (const [, q] of Array.from(this.queues)) {\n if (q.status === Status.BLOCKED) {\n console.log(\n `[Retry] Found: ${q.list.id}, Running onBlock callback.`,\n q\n );\n q.list.checkBlock();\n }\n }\n\n // If there is no running queue, try to run a new queue.\n this.execute();\n }\n\n /**\n *\n * Run a blocked task on a specific queue with the ability to pass more data.\n *\n * Useful when we have a custom logic for running queue and needs to pass some specific data\n * to the task and try to run it manually with the provided data.\n *\n */\n public forceExecute(queue_id: string, data?: object) {\n const queue = this.get(queue_id);\n let context = this.getContext();\n if (data) {\n context = {\n ...context,\n ...data,\n };\n }\n\n queue?.list.forceRun({\n context,\n });\n }\n\n /**\n *\n * Sync in-memory state (of `Manager`) with storage (persist).\n *\n * Usually we call this method after a change detected in the state of manager.\n *\n */\n private handleUpdate(queue_id: QueueID) {\n const queue = this.get(queue_id);\n\n if (queue) {\n const status = queue.status;\n const state = queue.list.state;\n const tasks = queue.list.tasks;\n this.persistor.updateQueue(queue_id, {\n status,\n state,\n tasks,\n storage: queue.list.getStorage(),\n });\n }\n }\n\n /**\n * Active readonly mode for manager, it means it doesn't run anythin,\n * And only can be used to read the data.\n */\n public pause() {\n this.isPaused = true;\n }\n\n /**\n * Activate normal mode which means it will be able to run the queuese as well.\n */\n public run() {\n // If call this method multiple times, it should be run for once.\n if (this.isPaused) {\n this.isPaused = false;\n this.sync();\n }\n }\n\n private getContext() {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n //@ts-ignore\n return this.context?.current || {};\n }\n\n private shouldExecute() {\n console.log('[shouldExecute] checking and result is:', {\n isPaused: this.isPaused,\n });\n return !this.isPaused;\n }\n}\n\nexport { Manager };\n"],"names":["DB_NAME","OBJECT_STORE_NAME","VERSION","Persistor","db","openDB","upgrade","createObjectStore","keyPath","_proto","prototype","insertQueue","_insertQueue","_asyncToGenerator","_regeneratorRuntime","mark","_callee","queue","queueRecord","wrap","_callee$","_context","prev","next","sent","get","id","console","log","add","stop","_x","apply","arguments","updateQueue","_updateQueue","_callee2","currentRecord","updatedRecord","_callee2$","_context2","abrupt","_extends","put","_x2","_x3","getAll","_getAll","_callee3","results","_callee3$","_context3","Status","Queue","options","status","PENDING","activeTaskIndex","tasks","events","actions","updateQueueStatus","state","onUpdateListStatus","updateActiveTaskIndex","index","updateTaskState","nextState","blockedFor","updatedTaskEvent","task","action","find","onUpdate","createTask","uuidv4","push","createdTask","onCreate","initTasks","info","storage","forEach","_this","t","checkBlock","currentActiveTask","getActiveTask","BLOCKED","onBlock","reason","lastTaskIsSuccessful","lastTask","length","lastTaskState","SUCCESS","firstTaskIsStarted","firstTask","firstTaskState","check","currentListStatus","nextListStatus","RUNNING","_iterator","_createForOfIteratorHelperLoose","_step","done","value","FAILED","params","activeTask","activeTaskState","CANCELED","execute","context","getContext","_this2","markCurrentTaskAsFinished","retry","resume","failed","schedule","getStorage","bind","setStorage","block","unblock","_ref","_ref$silent","silent","Error","onUnblock","forceRun","currentTask","_this3","resetState","cancel","includes","Object","keys","_this4","data","onStorageUpdate","_queue","Manager","Map","defaultEventHandlers","onCreateQueue","onCreateTask","onUpdateQueue","onUpdateTask","onTaskBlock","onPersistedDataLoaded","queuesDefs","map","qDef","set","name","persistor","sync","isPaused","pause","_sync","queues","q","list","createQueue","queue_id","queue_name","createdAt","run","shouldExecute","manager","def","handleUpdate","_def$events","_def$events2","_def$events3","_def$events4","event","whenTaskBlocked","getBlockedTasks","forceExecute","blockedTasks","task_id","createdQueue","create","_create","has","Date","now","_i","_Array$from","Array","from","_Array$from$_i","_i2","_Array$from2","_Array$from2$_i","_i3","_Array$from3","_Array$from3$_i","_this$context","current"],"mappings":"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"}
1
+ {"version":3,"file":"queue-manager-core.esm.js","sources":["../src/persistor.ts","../src/types.ts","../src/queue.ts","../src/manager.ts"],"sourcesContent":["import { openDB, DBSchema, IDBPDatabase } from 'idb';\n\nimport { QueueID } from './manager';\nimport { PersistedQueue } from './types';\n\nexport const DB_NAME = 'queues-manager';\nconst OBJECT_STORE_NAME = 'queues';\nconst VERSION = 1;\n\ntype UpdatePersistedQueue = Partial<\n Pick<PersistedQueue, 'status' | 'state' | 'tasks' | 'storage'>\n>;\n\ninterface Database extends DBSchema {\n queues: {\n value: PersistedQueue;\n key: string;\n };\n}\n\nclass Persistor {\n db: Promise<IDBPDatabase<Database>>;\n constructor() {\n this.db = openDB<Database>(DB_NAME, VERSION, {\n upgrade(db) {\n db.createObjectStore(OBJECT_STORE_NAME, { keyPath: 'id' });\n },\n });\n }\n async insertQueue(queue: PersistedQueue) {\n const db = await this.db;\n const queueRecord = await db.get(OBJECT_STORE_NAME, queue.id);\n if (queueRecord) {\n console.log('[Persistor] Queue already exists inside persistor.');\n } else {\n await db.add(OBJECT_STORE_NAME, queue);\n console.log('[Persistor] Queue added to IndexedDB successfully.');\n }\n }\n async updateQueue(id: QueueID, queue: UpdatePersistedQueue) {\n const db = await this.db;\n const currentRecord = await db.get(OBJECT_STORE_NAME, id);\n\n if (!currentRecord) {\n console.log(\"[Persistor] Requested queue for update doesn't exist.\");\n return;\n }\n\n const updatedRecord = {\n ...currentRecord,\n ...queue,\n };\n await db.put(OBJECT_STORE_NAME, updatedRecord);\n }\n async getAll() {\n const db = await this.db;\n const results = await db.getAll(OBJECT_STORE_NAME);\n\n return results;\n }\n}\n\nexport default Persistor;\n","import { QueueID, QueueName } from './manager';\nimport Queue, { QueueState, Task } from './queue';\n\nexport enum Status {\n PENDING = 'PENDING',\n RUNNING = 'RUNNING',\n FAILED = 'FAILED',\n SUCCESS = 'SUCCESS',\n CANCELED = 'CANCELED',\n BLOCKED = 'BLOCKED',\n}\n\nexport type QueueStorage = Record<string, unknown>;\n\nexport type QueueType = Queue;\n\nexport interface PersistedQueue {\n id: QueueID;\n createdAt: number;\n name: QueueName;\n status: Status;\n state: QueueState;\n tasks: Task[];\n storage: QueueStorage;\n}\n","import { v4 as uuidv4 } from 'uuid';\nimport { ManagerContext, QueueDef, QueueID } from './manager';\nimport { QueueStorage, Status } from './types';\n\ntype TaskId = string;\nexport type TaskState = {\n status: Status;\n blockedFor: any;\n};\n\nexport interface QueueContext {\n _queue?: {\n id: string;\n };\n}\nexport type NextParams = {\n context: ManagerContext;\n};\n\nexport interface QueueState {\n status: Status;\n activeTaskIndex: number;\n tasks: {\n [key in TaskId]: TaskState;\n };\n}\n\nexport interface Task {\n id: TaskId;\n action: string;\n}\n\nexport type InitTasks = {\n tasks: Task[];\n state: QueueState;\n storage: QueueStorage;\n};\n\nexport interface TaskEvent {\n id: TaskId;\n task: TaskState;\n action: string;\n}\n\nexport interface QueueEventHandlers {\n // all tasks\n onUpdateListStatus: (status: Status) => void;\n // single task\n onCreate: (event: TaskEvent) => void;\n onUpdate: (event: TaskEvent) => void;\n onStorageUpdate: (data: QueueStorage) => void;\n onBlock: (\n data: Omit<TaskEvent, 'task'> & { reason: Record<string, unknown> }\n ) => void;\n onUnblock: (data: { id: string }) => void;\n}\n\ninterface QueueOptions {\n id: QueueID;\n events: QueueEventHandlers;\n actions: QueueDef['actions'];\n}\n\n/**\n *\n * Notes on statuses:\n * - Success: last task has success status\n * - Failed: any of task has been failed\n * - Running: first task is not on pending\n * - Pending: default state. not started\n *\n */\nclass Queue {\n public id: string;\n public state: QueueState = {\n status: Status.PENDING,\n activeTaskIndex: 0,\n tasks: {},\n };\n public tasks: Task[] = [];\n private events: QueueOptions['events'];\n private actions: QueueOptions['actions'];\n private storage: QueueStorage = {};\n\n constructor(options: QueueOptions) {\n this.id = options.id;\n this.events = options.events;\n this.actions = options.actions;\n }\n\n /**\n * Update queue status and trigger an event\n *\n */\n private updateQueueStatus(status: Status) {\n this.state.status = status;\n this.events.onUpdateListStatus(status);\n }\n\n private updateActiveTaskIndex(index: number) {\n this.state.activeTaskIndex = index;\n }\n\n /**\n *\n * Update task state (`status`, `blockedFor`) and trigger an event.\n * @param id\n * @param nextState\n */\n private updateTaskState(id: TaskId, nextState: Partial<TaskState>) {\n if (nextState.status) {\n this.state.tasks[id].status = nextState.status;\n }\n if (nextState.blockedFor) {\n this.state.tasks[id].blockedFor = nextState.blockedFor;\n }\n\n const updatedTaskEvent = {\n id: id,\n task: this.get(id)!,\n action: this.tasks.find((task) => task.id === id)!.action,\n };\n this.events.onUpdate(updatedTaskEvent);\n }\n\n /**\n * Create a task by providing an `action` name.\n *\n * this method creating the task, push it to the queue's tasks and trigger an event.\n * @param action\n */\n createTask(action: string) {\n const id = uuidv4();\n this.tasks.push({\n action,\n id,\n });\n this.state.tasks[id] = {\n status: Status.PENDING,\n blockedFor: null,\n };\n\n const createdTask = this.get(id);\n this.events.onCreate({\n id,\n task: createdTask!,\n action,\n });\n }\n\n /**\n * Initilize a queue with some tasks, instead of an empty queue.\n *\n * Using it for recover the queue state from persistor.\n *\n */\n public initTasks(info: InitTasks) {\n this.state = info.state;\n this.storage = info.storage;\n\n info.tasks.forEach((task) => {\n this.tasks.push(task);\n const action = this.tasks.find((t) => t.id === task.id)!.action;\n this.events.onCreate({\n id: task.id,\n task: this.get(task.id)!,\n action,\n });\n });\n }\n\n public checkBlock() {\n const currentActiveTask = this.getActiveTask();\n\n if (!currentActiveTask) {\n return;\n }\n const { task, state } = currentActiveTask;\n\n if (state.status === Status.BLOCKED) {\n this.events.onBlock({\n action: task.action,\n id: task.id,\n reason: state.blockedFor,\n });\n }\n }\n\n /**\n * Getting task state by ID\n */\n public get(id: string): TaskState | null {\n const task = this.state.tasks[id];\n\n if (!task) return null;\n\n return task;\n }\n\n /**\n *\n * Checking if status of the last is `SUCCESS` or not\n *\n */\n private lastTaskIsSuccessful() {\n const lastTask = this.tasks[this.tasks.length - 1];\n\n // checking for empty lists.\n if (lastTask) {\n const lastTaskState = this.state.tasks[lastTask.id];\n\n // Maybe we didn't create the state yet. It should has success status as well.\n if (!!lastTaskState && lastTaskState.status === Status.SUCCESS) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * If the first task started (it's not PENDING),\n * it means the queue has been ran.\n *\n * @returns\n */\n private firstTaskIsStarted() {\n const firstTask = this.tasks[0];\n\n // checking for empty lists.\n if (firstTask) {\n const firstTaskState = this.state.tasks[firstTask.id];\n\n // Maybe we didn't create the state yet.\n if (!!firstTaskState) {\n if (firstTaskState.status !== Status.PENDING) {\n return true;\n }\n }\n }\n\n return false;\n }\n\n /**\n * Getting active task index from state and\n * returns the task and its state.\n *\n */\n private getActiveTask() {\n // First try to get task with `activeTask`\n const index = this.state.activeTaskIndex;\n const task = this.tasks[index];\n\n // Consider all the tasks has been executed.\n if (!task) {\n return null;\n }\n\n const state = this.state.tasks[task.id];\n\n return { task, state, index };\n }\n\n /**\n * Update and find the queue status by checking state of each tasks in the queue.\n */\n public check() {\n const currentListStatus = this.state.status;\n let nextListStatus = this.firstTaskIsStarted()\n ? Status.RUNNING\n : Status.PENDING;\n\n if (this.lastTaskIsSuccessful()) {\n nextListStatus = Status.SUCCESS;\n } else {\n // Is there any failed task?\n for (const task of this.tasks) {\n const state = this.state.tasks[task.id];\n\n // If one item fails, we stop to work on the list.\n if (state.status === Status.FAILED) {\n nextListStatus = Status.FAILED;\n break;\n }\n }\n }\n\n // We only update and trigger an event when there is a new value\n if (nextListStatus !== currentListStatus) {\n this.updateQueueStatus(nextListStatus);\n }\n }\n\n /**\n * Execute active task.\n * Based on the state of active task, the behaviour is different. If status is:\n * - Success -> we need to go to next task by updating the active index and try `next` on more time.\n * - Failed, Running, or no active task -> doesn't do anything.\n * - Pending or Blocked -> update the task and queue status to running, and execute the provided `action` for the task.\n *\n * The queue is a linked list somehow, active task means the pointer to where we are in the queue right now.\n *\n */\n public next(params: NextParams) {\n console.log('[next]', this.state, params);\n\n this.check();\n\n const currentActiveTask = this.getActiveTask();\n\n if (!currentActiveTask) {\n return;\n }\n\n const {\n index: activeTaskIndex,\n task: activeTask,\n state: activeTaskState,\n } = currentActiveTask;\n\n // if `activeTask` is already done, we will go for next one.\n if (activeTaskState.status === Status.SUCCESS) {\n this.updateActiveTaskIndex(activeTaskIndex + 1);\n this.next(params);\n return;\n }\n\n if (activeTaskState.status === Status.FAILED) {\n console.log('Task has been failed. It can not be proceed.');\n return;\n }\n\n if (activeTaskState.status === Status.CANCELED) {\n console.log('Task has been canceled. It can not be proceed.');\n return;\n }\n\n if (activeTaskState.status === Status.RUNNING) {\n console.log('Task is running. It can not be proceed.');\n return;\n }\n\n if (\n activeTaskState.status === Status.PENDING ||\n activeTaskState.status === Status.BLOCKED\n ) {\n // Update task status to `running`\n this.updateTaskState(activeTask.id, {\n status: Status.RUNNING,\n });\n this.updateQueueStatus(Status.RUNNING);\n\n // Try to execute task.\n const execute = this.actions[activeTask.action];\n execute({\n context: this.getContext(params),\n next: () => {\n console.log('[execute][next]', params);\n this.markCurrentTaskAsFinished(params);\n },\n retry: () => {\n this.resume(params);\n },\n failed: () => {\n this.updateTaskState(activeTask.id, {\n status: Status.FAILED,\n });\n this.check();\n },\n schedule: (action) => {\n this.createTask(action);\n this.check();\n },\n getStorage: this.getStorage.bind(this),\n setStorage: this.setStorage.bind(this),\n block: (reason: Record<string, unknown>) => {\n this.block({ reason });\n },\n unblock: () => {\n this.unblock();\n },\n });\n }\n }\n\n /**\n * Change the `status` of active task and queue to BLOCKED, then trigger an event.\n */\n public block({\n reason,\n silent = false,\n }: {\n reason: Record<string, unknown>;\n silent?: boolean;\n }) {\n const currentActiveTask = this.getActiveTask();\n\n if (!currentActiveTask) {\n throw new Error(\"Task isn't exist.\");\n }\n\n this.updateTaskState(currentActiveTask.task.id, {\n status: Status.BLOCKED,\n blockedFor: reason,\n });\n this.updateQueueStatus(Status.BLOCKED);\n\n if (!silent) {\n this.events.onBlock({\n action: currentActiveTask.task.action,\n id: currentActiveTask.task.id,\n reason,\n });\n }\n }\n\n /**\n * If the active task is `BLOCKED`, update the task status to `PENDING`, queue status to `RUNNING`\n * then trigger an event.\n */\n public unblock() {\n const currentActiveTask = this.getActiveTask();\n\n if (\n !currentActiveTask ||\n currentActiveTask.state.status !== Status.BLOCKED\n ) {\n throw new Error('Task is not blocked.');\n }\n\n this.updateTaskState(currentActiveTask.task.id, {\n status: Status.PENDING,\n });\n this.updateQueueStatus(Status.RUNNING);\n this.events.onUnblock({ id: currentActiveTask.task.id });\n }\n\n /**\n * If the active task is `BLOCKED` then execute the `action` for the task.\n *\n * It is useful for when we need to run a blocked task without changing the status of task at the first place.\n * For scenarios like we have some conditions in `action` and needs to run the `action` again\n * to check the conditions are met or not, if yes, so we can proceed the `action`.\n *\n */\n public forceRun(params: NextParams) {\n const currentTask = this.getActiveTask();\n\n if (!currentTask || currentTask.state.status !== Status.BLOCKED) {\n throw new Error('Task is not blocked.');\n }\n\n // Try to execute task.\n const execute = this.actions[currentTask.task.action];\n execute({\n context: this.getContext(params),\n next: () => {\n console.log('[force run][execute][next]', params);\n\n /*\n NOTE:\n When running `forceRun`, the status of task can be `BLOCKED`\n So we need to change to `Running` first. \n */\n // Update task status to `running`\n this.updateTaskState(currentTask.task.id, {\n status: Status.RUNNING,\n });\n this.updateQueueStatus(Status.RUNNING);\n\n this.markCurrentTaskAsFinished(params);\n },\n retry: () => {\n this.resume(params);\n },\n failed: () => {\n this.updateTaskState(currentTask.task.id, {\n status: Status.FAILED,\n });\n this.check();\n },\n schedule: (action) => {\n this.createTask(action);\n this.check();\n },\n getStorage: this.getStorage.bind(this),\n setStorage: this.setStorage.bind(this),\n block: (reason: Record<string, unknown>) => {\n this.block({ reason });\n },\n unblock: () => {\n this.unblock();\n },\n });\n }\n private markCurrentTaskAsFinished(params: NextParams) {\n this.check();\n const activeTaskIndex = this.state.activeTaskIndex;\n const activeTask = this.tasks[activeTaskIndex];\n\n if (!activeTask) {\n console.log(\"It seems this queue has been finished. Task doesn't exist.\");\n return;\n }\n\n const activeTaskState = this.state.tasks[activeTask.id];\n if (activeTaskState.status === Status.RUNNING) {\n this.updateTaskState(activeTask.id, {\n status: Status.SUCCESS,\n });\n this.updateActiveTaskIndex(activeTaskIndex + 1);\n\n const updatedTaskEvent = {\n id: activeTask.id,\n task: this.get(activeTask.id)!,\n action: this.tasks.find((task) => task.id === activeTask.id)!.action,\n };\n this.events.onUpdate(updatedTaskEvent);\n this.next(params);\n } else {\n console.log('There is no running task.');\n }\n }\n\n /**\n * If the active task is `RUNNING`, change it to `PENING` the try to run the task by calling `next`.\n * If it's other than `RUNNING` we reset the queue state and run the queue from the beggining.\n *\n * @param params\n * @returns\n */\n public resume(params: NextParams) {\n const activeTaskIndex = this.state.activeTaskIndex;\n const activeTask = this.tasks[activeTaskIndex];\n if (!activeTask) {\n console.log(\"It seems this queue has been finished. Task doesn't exist.\");\n return;\n }\n\n const activeTaskState = this.state.tasks[activeTask.id];\n if (activeTaskState.status === Status.RUNNING) {\n this.updateTaskState(activeTask.id, {\n status: Status.PENDING,\n });\n this.next(params);\n } else {\n console.log('There is no running task. restart the queue', {\n state: this.state.tasks,\n activeTaskState,\n activeTask,\n activeTaskIndex,\n });\n this.resetState();\n this.next(params);\n }\n }\n\n /**\n *\n * Cancel the queue by changing active task and queue status to `CANCELED`.\n *\n */\n public cancel() {\n const currentActiveTask = this.getActiveTask();\n\n if (\n !currentActiveTask ||\n [Status.FAILED, Status.CANCELED, Status.SUCCESS].includes(\n currentActiveTask.state.status\n )\n ) {\n return;\n }\n\n const { task } = currentActiveTask;\n\n // Update task status to `canceled`\n this.updateTaskState(task.id, {\n status: Status.CANCELED,\n });\n const updatedTaskEvent = {\n id: task.id,\n task: this.get(task.id)!,\n action: this.tasks.find((t) => t.id === task.id)!.action,\n };\n this.events.onUpdate(updatedTaskEvent);\n\n // Update queue status to `canceled`\n this.updateQueueStatus(Status.CANCELED);\n }\n\n /**\n * Update queue status, and all the tasks inside queue to `PENDING`.\n */\n private resetState() {\n this.state.activeTaskIndex = 0;\n this.state.status = Status.PENDING;\n Object.keys(this.state.tasks).forEach((id) => {\n this.state.tasks[id].status = Status.PENDING;\n });\n }\n\n public getStorage() {\n return this.storage;\n }\n public setStorage(data: QueueStorage) {\n this.storage = data;\n this.events.onStorageUpdate(data);\n return this.storage;\n }\n\n private getContext(params: NextParams): QueueContext & ManagerContext {\n return {\n ...params.context,\n _queue: {\n id: this.id,\n },\n };\n }\n}\n\nexport default Queue;\n","import Persistor from './persistor';\nimport Queue, { QueueEventHandlers, TaskEvent } from './queue';\nimport { QueueStorage, Status } from './types';\nimport { v4 as uuidv4 } from 'uuid';\n\nexport type ManagerContext = object;\nexport type QueueName = string;\nexport type QueueID = string;\nexport type BlockedTask = {\n queue_id: string;\n task_id: string;\n action: string;\n reason: Record<string, unknown>;\n storage: {\n get: () => QueueStorage;\n set: (data: QueueStorage) => QueueStorage;\n };\n};\n\nexport type SetStorage<T> = (nextStorage: T) => T;\n\nexport interface ExecuterActions<\n T extends QueueStorage = QueueStorage,\n V extends string = string,\n C = ManagerContext\n> {\n next: () => void;\n retry: () => void;\n failed: () => void;\n schedule: (actionName: V) => void;\n setStorage: SetStorage<T>;\n getStorage: () => T;\n block: (reason: Record<string, unknown>) => void;\n unblock: () => void;\n context: C;\n}\n\nexport interface QueueDef<\n T extends QueueStorage = QueueStorage,\n V extends string = string,\n C = ManagerContext\n> {\n name: QueueName;\n actions: {\n [K in V]: (actions: ExecuterActions<T, V, C>) => void | Promise<void>;\n };\n events?: Partial<QueueEventHandlers>;\n run: V[];\n whenTaskBlocked?: (\n event: any,\n params: {\n queue_id: string;\n queue: Queue;\n context: C;\n getBlockedTasks: () => BlockedTask[];\n forceExecute: (queue_id: string, data?: object) => void;\n retry: () => void;\n manager: Manager;\n }\n ) => void;\n}\n\nexport interface Events {\n onCreateQueue: (queue: QueueInfo & { id: QueueID }) => void;\n onUpdateQueue: (queue_id: QueueID, queue: QueueInfo) => void;\n onCreateTask: (queue_id: QueueID, event: TaskEvent) => void;\n onUpdateTask: (queue_id: QueueID, event: TaskEvent) => void;\n onStorageUpdate: (queue_id: QueueID, data: QueueStorage) => void;\n onTaskBlock: (queue_id: QueueID) => void;\n onPersistedDataLoaded: (manager: Manager) => void;\n}\n\ninterface ManagerOptions {\n events?: Partial<Events>;\n queuesDefs: QueueDef[];\n context?: ManagerContext;\n isPaused?: boolean;\n}\n\nexport interface QueueInfo {\n name: QueueName;\n createdAt: number;\n status: Status;\n list: Queue;\n actions: {\n run: () => void;\n cancel: () => void;\n setStorage: SetStorage<any>;\n getStorage: () => any;\n };\n}\n\nclass Manager {\n private queuesDefs = new Map<QueueName, QueueDef>();\n private queues = new Map<QueueID, QueueInfo>();\n private events: Events;\n private persistor: Persistor;\n private context: ManagerContext;\n private isPaused: boolean = false;\n\n /**\n *\n * Making an instance, initilize events, setup a persistor and try to recover the last state of the manager.\n *\n * */\n constructor(options: ManagerOptions) {\n const defaultEventHandlers: Events = {\n onCreateQueue: () => {\n // ...\n },\n onCreateTask: () => {\n // ...\n },\n onUpdateQueue: () => {\n // ...\n },\n onUpdateTask: () => {\n // ...\n },\n onStorageUpdate: () => {\n // ...\n },\n onTaskBlock: () => {\n // ...\n },\n onPersistedDataLoaded: () => {\n // ..\n },\n };\n\n if (options.events) {\n this.events = {\n ...defaultEventHandlers,\n ...options.events,\n };\n } else {\n this.events = defaultEventHandlers;\n }\n\n options.queuesDefs.map((qDef) => {\n this.queuesDefs.set(qDef.name, qDef);\n });\n\n this.context = options.context || {};\n this.persistor = new Persistor();\n this.sync();\n\n if (options.isPaused) {\n this.pause();\n }\n }\n\n /**\n *\n * Reading persisted data from storage then brings into memory.\n *\n * Notes:\n * - Reset the memory, so we can call this method whenever we want and not only on the initialize process.\n * - All the events will be tirggered (like onCreateQueue, onCreateTask, onBlock, ....)\n * - Try to `resume` if the status is `running`.\n * - Trigger `onPersistedDataLoaded` event when queues recovered from storage.\n *\n */\n private async sync() {\n // Reading queues from storage\n const queues = await this.persistor.getAll();\n\n // Reset queues, if anything is exist in memory.\n this.queues = new Map();\n\n // Brings them into memory\n queues.forEach((q) => {\n const list = this.createQueue({\n queue_id: q.id,\n queue_name: q.name,\n });\n this.add(q.id, {\n list,\n createdAt: q.createdAt,\n name: q.name,\n status: q.status,\n actions: {\n run: () => {\n list.next({\n context: this.getContext(),\n });\n },\n cancel: () => {\n list.cancel();\n },\n setStorage: (...args) => {\n list.setStorage(...args);\n },\n getStorage: () => {\n return list.getStorage();\n },\n },\n });\n\n list.initTasks({\n state: q.state,\n tasks: q.tasks,\n storage: q.storage || {},\n });\n\n if (q.status === Status.RUNNING && this.shouldExecute()) {\n console.log('[INIT] Try to resume');\n list.resume({\n context: this.getContext(),\n });\n }\n });\n\n // Trigger an event to let the subscribers we are done here.\n this.events.onPersistedDataLoaded(this);\n }\n\n /**\n *\n * Making a new instance from `Queue` and adds Manager's event handlers to it.\n *\n * @returns An instance of `Queue` with wrapped event handlers from Manager.\n *\n */\n private createQueue({\n queue_id,\n queue_name,\n }: {\n queue_id: QueueID;\n queue_name: QueueName;\n }) {\n const manager = this;\n const def = this.queuesDefs.get(queue_name)!;\n const list = new Queue({\n id: queue_id,\n events: {\n onCreate: (task) => {\n this.events.onCreateTask(queue_id, task);\n this.handleUpdate(queue_id);\n\n if (def.events?.onCreate) def.events.onCreate(task);\n },\n onUpdate: (task) => {\n this.events.onUpdateTask(queue_id, task);\n this.handleUpdate(queue_id);\n\n if (def.events?.onUpdate) def.events.onUpdate(task);\n },\n onUpdateListStatus: (status) => {\n this.queues.set(queue_id, {\n ...this.get(queue_id)!,\n status,\n });\n this.events.onUpdateQueue(queue_id, this.get(queue_id)!);\n\n this.handleUpdate(queue_id);\n\n // After finishing a queue, try to run other queues.\n this.execute();\n if (def.events?.onUpdateListStatus)\n def.events.onUpdateListStatus(status);\n },\n onStorageUpdate: (data) => {\n this.events.onStorageUpdate(queue_id, data);\n if (def.events?.onStorageUpdate) def.events.onStorageUpdate(data);\n this.handleUpdate(queue_id);\n },\n onBlock: (event) => {\n // Update queue status\n this.queues.set(queue_id, {\n ...this.get(queue_id)!,\n status: Status.BLOCKED,\n });\n\n // Trigger event\n this.events.onTaskBlock(queue_id);\n if (def.whenTaskBlocked) {\n def.whenTaskBlocked(event, {\n queue_id: queue_id,\n queue: list,\n context: this.getContext(),\n getBlockedTasks: this.getBlockedTasks.bind(this),\n forceExecute: this.forceExecute.bind(this),\n retry: this.retry.bind(this),\n manager,\n });\n }\n\n // Sync\n this.handleUpdate(queue_id);\n },\n onUnblock: () => {\n // Update queue status\n this.queues.set(queue_id, {\n ...this.get(queue_id)!,\n status: Status.PENDING,\n });\n\n // Sync\n this.handleUpdate(queue_id);\n\n this.execute();\n },\n },\n actions: def.actions,\n });\n return list;\n }\n\n /**\n * Go through all tasks (from all queues) and return a list of blocked tasks\n *\n * @returns a list of blocked tasks including enough information to get the queue and mutate the storage.\n *\n */\n private getBlockedTasks() {\n const queues = this.getAll();\n const blockedTasks: BlockedTask[] = [];\n queues.forEach((q, queue_id) => {\n q.list.tasks.forEach((task) => {\n const state = q.list.state.tasks[task.id];\n if (state.status === Status.BLOCKED) {\n blockedTasks.push({\n task_id: task.id,\n queue_id: queue_id,\n action: task.action,\n reason: state.blockedFor,\n storage: {\n get: () => {\n return q.list.getStorage();\n },\n set: (data) => {\n return q.list.setStorage(data);\n },\n },\n });\n }\n });\n });\n\n return blockedTasks;\n }\n\n /**\n *\n * Add a queue to the manager to keep track of the queue and its state.\n *\n * @param id\n * @param queue\n * @returns\n */\n private add(id: QueueID, queue: QueueInfo) {\n this.queues.set(id, queue);\n const createdQueue = this.get(id)!;\n this.events.onCreateQueue({ ...createdQueue, id });\n\n return createdQueue;\n }\n\n // Create a new queue\n /**\n *\n * Create a new queue by client.\n *\n * It will do the internal things to make a queue from definitions, and running using Manager.\n *\n * Notes:\n * - After creating the queue, it will be run automatically.\n *\n * @returns an ID for queue so it can be used to get the created queue later by client.\n *\n */\n public async create(\n name: QueueName,\n storage: QueueStorage,\n options?: { id?: QueueID }\n ) {\n if (!this.queuesDefs.has(name)) {\n throw new Error('You need to add a queue definition first.');\n }\n const def = this.queuesDefs.get(name)!;\n const queue_id: QueueID = options?.id || uuidv4();\n const createdAt = Date.now();\n const list = this.createQueue({\n queue_id: queue_id,\n queue_name: name,\n });\n list.setStorage(storage);\n\n const createdQueue = this.add(queue_id, {\n list,\n createdAt,\n name,\n status: Status.PENDING,\n actions: {\n run: () => {\n list.next({\n context: this.getContext(),\n });\n },\n cancel: () => {\n list.cancel();\n },\n setStorage: (...args) => {\n list.setStorage(...args);\n },\n getStorage: () => {\n return list.getStorage();\n },\n },\n });\n\n // Persist initial queue\n // Note: we need to first insert the queue, and then it can be updated by internal events.\n await this.persistor.insertQueue({\n id: queue_id,\n createdAt,\n name: createdQueue.name,\n status: createdQueue.status,\n tasks: list.tasks,\n state: list.state,\n storage: list.getStorage(),\n });\n\n // adding initial tasks\n def.run.forEach((action) => {\n console.log('action', action);\n list.createTask(action);\n });\n\n // After creating a new queue, try to run.\n this.execute();\n return queue_id;\n }\n\n /**\n * Get a queue by its ID.\n *\n * @returns An object includes queue and its state in `Manager`.\n */\n public get(queue_id: QueueID) {\n return this.queues.get(queue_id);\n }\n\n /**\n * Get all queues from `Manager`\n *\n * @returns a list of queues includes all the queues and their states.\n */\n public getAll() {\n return this.queues;\n }\n\n /**\n *\n * Ask from manager to run pending queues.\n *\n * It only try to run queues with `PENDING` status and ignore all the other statuses.\n *\n */\n public execute() {\n if (!this.shouldExecute()) return;\n\n for (const [, q] of Array.from(this.queues)) {\n if (q.status === Status.PENDING) {\n console.log('There is a pending queue. Run it.');\n q.actions.run();\n }\n }\n\n console.log('There is no pending queue.');\n }\n\n /**\n *\n * Try to find queues with `RUNNING` status to run them again.\n *\n * It's useful for recovering the queue at some certain points\n * like running a currepted task (reloaded when it was running) or needs manual trigger from UI.\n *\n * @returns\n */\n public resume() {\n if (!this.shouldExecute()) return;\n\n for (const [, q] of Array.from(this.queues)) {\n if (q.status === Status.RUNNING) {\n console.log(\"Found a running queue. Let's resume the queue.\", q);\n q.list.resume({\n context: this.getContext(),\n });\n return;\n }\n }\n\n // If there is no running queue, try to run a new queue.\n this.execute();\n }\n\n /**\n *\n * Run all `BLOCKED` queues once again.\n *\n * If a queue has `BLOCKED` status and the last task is `BLOCKED` as well,\n * The task will be run one more time.\n *\n * Useful for scenarios like we are blocking the queue under some conditions in task,\n * We can use this method to ask the queue to run the blocked task one more time and\n * maybe this time condtions are met and the queue can be proceed.\n *\n * @returns\n */\n public retry() {\n if (!this.shouldExecute()) return;\n\n for (const [, q] of Array.from(this.queues)) {\n if (q.status === Status.BLOCKED) {\n console.log(\n `[Retry] Found: ${q.list.id}, Running onBlock callback.`,\n q\n );\n q.list.checkBlock();\n }\n }\n\n // If there is no running queue, try to run a new queue.\n this.execute();\n }\n\n /**\n *\n * Run a blocked task on a specific queue with the ability to pass more data.\n *\n * Useful when we have a custom logic for running queue and needs to pass some specific data\n * to the task and try to run it manually with the provided data.\n *\n */\n public forceExecute(queue_id: string, data?: object) {\n const queue = this.get(queue_id);\n let context = this.getContext();\n if (data) {\n context = {\n ...context,\n ...data,\n };\n }\n\n queue?.list.forceRun({\n context,\n });\n }\n\n /**\n *\n * Sync in-memory state (of `Manager`) with storage (persist).\n *\n * Usually we call this method after a change detected in the state of manager.\n *\n */\n private handleUpdate(queue_id: QueueID) {\n const queue = this.get(queue_id);\n\n if (queue) {\n const status = queue.status;\n const state = queue.list.state;\n const tasks = queue.list.tasks;\n this.persistor.updateQueue(queue_id, {\n status,\n state,\n tasks,\n storage: queue.list.getStorage(),\n });\n }\n }\n\n /**\n * Active readonly mode for manager, it means it doesn't run anythin,\n * And only can be used to read the data.\n */\n public pause() {\n this.isPaused = true;\n }\n\n /**\n * Activate normal mode which means it will be able to run the queuese as well.\n */\n public run() {\n // If call this method multiple times, it should be run for once.\n if (this.isPaused) {\n this.isPaused = false;\n this.sync();\n }\n }\n\n private getContext() {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n //@ts-ignore\n return this.context?.current || {};\n }\n\n private shouldExecute() {\n console.log('[shouldExecute] checking and result is:', {\n isPaused: this.isPaused,\n });\n return !this.isPaused;\n }\n}\n\nexport { Manager };\n"],"names":["DB_NAME","OBJECT_STORE_NAME","VERSION","Persistor","db","openDB","upgrade","createObjectStore","keyPath","_proto","prototype","insertQueue","_insertQueue","_asyncToGenerator","_regeneratorRuntime","mark","_callee","queue","queueRecord","wrap","_callee$","_context","prev","next","sent","get","id","console","log","add","stop","_x","apply","arguments","updateQueue","_updateQueue","_callee2","currentRecord","updatedRecord","_callee2$","_context2","abrupt","_extends","put","_x2","_x3","getAll","_getAll","_callee3","results","_callee3$","_context3","Status","Queue","options","status","PENDING","activeTaskIndex","tasks","events","actions","updateQueueStatus","state","onUpdateListStatus","updateActiveTaskIndex","index","updateTaskState","nextState","blockedFor","updatedTaskEvent","task","action","find","onUpdate","createTask","uuidv4","push","createdTask","onCreate","initTasks","info","storage","forEach","_this","t","checkBlock","currentActiveTask","getActiveTask","BLOCKED","onBlock","reason","lastTaskIsSuccessful","lastTask","length","lastTaskState","SUCCESS","firstTaskIsStarted","firstTask","firstTaskState","check","currentListStatus","nextListStatus","RUNNING","_iterator","_createForOfIteratorHelperLoose","_step","done","value","FAILED","params","activeTask","activeTaskState","CANCELED","execute","context","getContext","_this2","markCurrentTaskAsFinished","retry","resume","failed","schedule","getStorage","bind","setStorage","block","unblock","_ref","_ref$silent","silent","Error","onUnblock","forceRun","currentTask","_this3","resetState","cancel","includes","Object","keys","_this4","data","onStorageUpdate","_queue","Manager","Map","defaultEventHandlers","onCreateQueue","onCreateTask","onUpdateQueue","onUpdateTask","onTaskBlock","onPersistedDataLoaded","queuesDefs","map","qDef","set","name","persistor","sync","isPaused","pause","_sync","queues","q","list","createQueue","queue_id","queue_name","createdAt","run","shouldExecute","manager","def","handleUpdate","_def$events","_def$events2","_def$events3","_def$events4","event","whenTaskBlocked","getBlockedTasks","forceExecute","blockedTasks","task_id","createdQueue","create","_create","has","Date","now","_i","_Array$from","Array","from","_Array$from$_i","_i2","_Array$from2","_Array$from2$_i","_i3","_Array$from3","_Array$from3$_i","_this$context","current"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rango-dev/queue-manager-core",
3
- "version": "0.1.10-next.79",
3
+ "version": "0.1.10-next.80",
4
4
  "license": "MIT",
5
5
  "module": "dist/queue-manager-core.esm.js",
6
6
  "main": "dist/index.js",
package/src/manager.ts CHANGED
@@ -1,7 +1,7 @@
1
- import { v4 as uuidv4 } from 'uuid';
2
1
  import Persistor from './persistor';
3
2
  import Queue, { QueueEventHandlers, TaskEvent } from './queue';
4
3
  import { QueueStorage, Status } from './types';
4
+ import { v4 as uuidv4 } from 'uuid';
5
5
 
6
6
  export type ManagerContext = object;
7
7
  export type QueueName = string;
@@ -370,13 +370,16 @@ class Manager {
370
370
  * @returns an ID for queue so it can be used to get the created queue later by client.
371
371
  *
372
372
  */
373
- public async create(name: QueueName, storage: QueueStorage) {
373
+ public async create(
374
+ name: QueueName,
375
+ storage: QueueStorage,
376
+ options?: { id?: QueueID }
377
+ ) {
374
378
  if (!this.queuesDefs.has(name)) {
375
379
  throw new Error('You need to add a queue definition first.');
376
380
  }
377
-
378
381
  const def = this.queuesDefs.get(name)!;
379
- const queue_id: QueueID = uuidv4();
382
+ const queue_id: QueueID = options?.id || uuidv4();
380
383
  const createdAt = Date.now();
381
384
  const list = this.createQueue({
382
385
  queue_id: queue_id,