document-drive 1.19.0 → 1.20.0

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.
Files changed (252) hide show
  1. package/README.md +4 -0
  2. package/dist/index.d.ts +28 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +18 -0
  5. package/dist/src/cache/memory.d.ts +10 -0
  6. package/dist/src/cache/memory.d.ts.map +1 -0
  7. package/dist/src/cache/memory.js +26 -0
  8. package/dist/src/cache/redis.d.ts +14 -0
  9. package/dist/src/cache/redis.d.ts.map +1 -0
  10. package/dist/src/cache/redis.js +40 -0
  11. package/dist/src/cache/types.d.ts +7 -0
  12. package/dist/src/cache/types.d.ts.map +1 -0
  13. package/dist/src/cache/types.js +1 -0
  14. package/dist/src/drive-document-model/constants.d.ts +2 -0
  15. package/dist/src/drive-document-model/constants.d.ts.map +1 -0
  16. package/dist/src/drive-document-model/constants.js +1 -0
  17. package/dist/src/drive-document-model/gen/actions.d.ts +7 -0
  18. package/dist/src/drive-document-model/gen/actions.d.ts.map +1 -0
  19. package/dist/src/drive-document-model/gen/actions.js +2 -0
  20. package/dist/src/drive-document-model/gen/constants.d.ts +7 -0
  21. package/dist/src/drive-document-model/gen/constants.d.ts.map +1 -0
  22. package/dist/src/drive-document-model/gen/constants.js +16 -0
  23. package/dist/src/drive-document-model/gen/creators.d.ts +3 -0
  24. package/dist/src/drive-document-model/gen/creators.d.ts.map +1 -0
  25. package/dist/src/drive-document-model/gen/creators.js +2 -0
  26. package/dist/src/drive-document-model/gen/document-model.d.ts +3 -0
  27. package/dist/src/drive-document-model/gen/document-model.d.ts.map +1 -0
  28. package/dist/src/drive-document-model/gen/document-model.js +210 -0
  29. package/dist/src/drive-document-model/gen/drive/actions.d.ts +12 -0
  30. package/dist/src/drive-document-model/gen/drive/actions.d.ts.map +1 -0
  31. package/dist/src/drive-document-model/gen/drive/actions.js +1 -0
  32. package/dist/src/drive-document-model/gen/drive/creators.d.ts +11 -0
  33. package/dist/src/drive-document-model/gen/drive/creators.d.ts.map +1 -0
  34. package/dist/src/drive-document-model/gen/drive/creators.js +10 -0
  35. package/dist/src/drive-document-model/gen/drive/error.d.ts +2 -0
  36. package/dist/src/drive-document-model/gen/drive/error.d.ts.map +1 -0
  37. package/dist/src/drive-document-model/gen/drive/error.js +1 -0
  38. package/dist/src/drive-document-model/gen/drive/object.d.ts +14 -0
  39. package/dist/src/drive-document-model/gen/drive/object.d.ts.map +1 -0
  40. package/dist/src/drive-document-model/gen/drive/object.js +28 -0
  41. package/dist/src/drive-document-model/gen/drive/operations.d.ts +14 -0
  42. package/dist/src/drive-document-model/gen/drive/operations.d.ts.map +1 -0
  43. package/dist/src/drive-document-model/gen/drive/operations.js +1 -0
  44. package/dist/src/drive-document-model/gen/node/actions.d.ts +11 -0
  45. package/dist/src/drive-document-model/gen/node/actions.d.ts.map +1 -0
  46. package/dist/src/drive-document-model/gen/node/actions.js +1 -0
  47. package/dist/src/drive-document-model/gen/node/creators.d.ts +10 -0
  48. package/dist/src/drive-document-model/gen/node/creators.d.ts.map +1 -0
  49. package/dist/src/drive-document-model/gen/node/creators.js +9 -0
  50. package/dist/src/drive-document-model/gen/node/error.d.ts +2 -0
  51. package/dist/src/drive-document-model/gen/node/error.d.ts.map +1 -0
  52. package/dist/src/drive-document-model/gen/node/error.js +1 -0
  53. package/dist/src/drive-document-model/gen/node/object.d.ts +13 -0
  54. package/dist/src/drive-document-model/gen/node/object.d.ts.map +1 -0
  55. package/dist/src/drive-document-model/gen/node/object.js +25 -0
  56. package/dist/src/drive-document-model/gen/node/operations.d.ts +13 -0
  57. package/dist/src/drive-document-model/gen/node/operations.d.ts.map +1 -0
  58. package/dist/src/drive-document-model/gen/node/operations.js +1 -0
  59. package/dist/src/drive-document-model/gen/object.d.ts +21 -0
  60. package/dist/src/drive-document-model/gen/object.d.ts.map +1 -0
  61. package/dist/src/drive-document-model/gen/object.js +28 -0
  62. package/dist/src/drive-document-model/gen/reducer.d.ts +4 -0
  63. package/dist/src/drive-document-model/gen/reducer.d.ts.map +1 -0
  64. package/dist/src/drive-document-model/gen/reducer.js +74 -0
  65. package/dist/src/drive-document-model/gen/schema/types.d.ts +176 -0
  66. package/dist/src/drive-document-model/gen/schema/types.d.ts.map +1 -0
  67. package/dist/src/drive-document-model/gen/schema/types.js +1 -0
  68. package/dist/src/drive-document-model/gen/schema/zod.d.ts +87 -0
  69. package/dist/src/drive-document-model/gen/schema/zod.d.ts.map +1 -0
  70. package/dist/src/drive-document-model/gen/schema/zod.js +203 -0
  71. package/dist/src/drive-document-model/gen/types.d.ts +9 -0
  72. package/dist/src/drive-document-model/gen/types.d.ts.map +1 -0
  73. package/dist/src/drive-document-model/gen/types.js +1 -0
  74. package/dist/src/drive-document-model/gen/utils.d.ts +10 -0
  75. package/dist/src/drive-document-model/gen/utils.d.ts.map +1 -0
  76. package/dist/src/drive-document-model/gen/utils.js +27 -0
  77. package/dist/src/drive-document-model/index.d.ts +2 -0
  78. package/dist/src/drive-document-model/index.d.ts.map +1 -0
  79. package/dist/src/drive-document-model/index.js +1 -0
  80. package/dist/src/drive-document-model/module.d.ts +3 -0
  81. package/dist/src/drive-document-model/module.d.ts.map +1 -0
  82. package/dist/src/drive-document-model/module.js +12 -0
  83. package/dist/src/drive-document-model/src/reducers/drive.d.ts +8 -0
  84. package/dist/src/drive-document-model/src/reducers/drive.d.ts.map +1 -0
  85. package/dist/src/drive-document-model/src/reducers/drive.js +37 -0
  86. package/dist/src/drive-document-model/src/reducers/node.d.ts +8 -0
  87. package/dist/src/drive-document-model/src/reducers/node.d.ts.map +1 -0
  88. package/dist/src/drive-document-model/src/reducers/node.js +185 -0
  89. package/dist/src/drive-document-model/src/utils.d.ts +34 -0
  90. package/dist/src/drive-document-model/src/utils.d.ts.map +1 -0
  91. package/dist/src/drive-document-model/src/utils.js +146 -0
  92. package/dist/src/queue/base.d.ts +43 -0
  93. package/dist/src/queue/base.d.ts.map +1 -0
  94. package/dist/src/queue/base.js +241 -0
  95. package/dist/src/queue/redis.d.ts +28 -0
  96. package/dist/src/queue/redis.d.ts.map +1 -0
  97. package/dist/src/queue/redis.js +110 -0
  98. package/dist/src/queue/types.d.ts +55 -0
  99. package/dist/src/queue/types.d.ts.map +1 -0
  100. package/dist/src/queue/types.js +6 -0
  101. package/dist/src/read-mode/errors.d.ts +12 -0
  102. package/dist/src/read-mode/errors.d.ts.map +1 -0
  103. package/dist/src/read-mode/errors.js +17 -0
  104. package/dist/src/read-mode/server.d.ts +4 -0
  105. package/dist/src/read-mode/server.d.ts.map +1 -0
  106. package/dist/src/read-mode/server.js +78 -0
  107. package/dist/src/read-mode/service.d.ts +18 -0
  108. package/dist/src/read-mode/service.d.ts.map +1 -0
  109. package/dist/src/read-mode/service.js +112 -0
  110. package/dist/src/read-mode/types.d.ts +35 -0
  111. package/dist/src/read-mode/types.d.ts.map +1 -0
  112. package/dist/src/read-mode/types.js +1 -0
  113. package/dist/src/server/base-server.d.ts +112 -0
  114. package/dist/src/server/base-server.d.ts.map +1 -0
  115. package/dist/src/server/base-server.js +1280 -0
  116. package/dist/src/server/builder.d.ts +30 -0
  117. package/dist/src/server/builder.d.ts.map +1 -0
  118. package/dist/src/server/builder.js +89 -0
  119. package/dist/src/server/constants.d.ts +2 -0
  120. package/dist/src/server/constants.d.ts.map +1 -0
  121. package/dist/src/server/constants.js +1 -0
  122. package/dist/src/server/error.d.ts +30 -0
  123. package/dist/src/server/error.d.ts.map +1 -0
  124. package/dist/src/server/error.js +47 -0
  125. package/dist/src/server/event-emitter.d.ts +8 -0
  126. package/dist/src/server/event-emitter.d.ts.map +1 -0
  127. package/dist/src/server/event-emitter.js +10 -0
  128. package/dist/src/server/listener/index.d.ts +2 -0
  129. package/dist/src/server/listener/index.d.ts.map +1 -0
  130. package/dist/src/server/listener/index.js +1 -0
  131. package/dist/src/server/listener/listener-manager.d.ts +27 -0
  132. package/dist/src/server/listener/listener-manager.d.ts.map +1 -0
  133. package/dist/src/server/listener/listener-manager.js +401 -0
  134. package/dist/src/server/listener/transmitter/factory.d.ts +8 -0
  135. package/dist/src/server/listener/transmitter/factory.d.ts.map +1 -0
  136. package/dist/src/server/listener/transmitter/factory.js +25 -0
  137. package/dist/src/server/listener/transmitter/internal.d.ts +34 -0
  138. package/dist/src/server/listener/transmitter/internal.d.ts.map +1 -0
  139. package/dist/src/server/listener/transmitter/internal.js +87 -0
  140. package/dist/src/server/listener/transmitter/pull-responder.d.ts +38 -0
  141. package/dist/src/server/listener/transmitter/pull-responder.d.ts.map +1 -0
  142. package/dist/src/server/listener/transmitter/pull-responder.js +256 -0
  143. package/dist/src/server/listener/transmitter/switchboard-push.d.ts +9 -0
  144. package/dist/src/server/listener/transmitter/switchboard-push.d.ts.map +1 -0
  145. package/dist/src/server/listener/transmitter/switchboard-push.js +77 -0
  146. package/dist/src/server/listener/transmitter/types.d.ts +20 -0
  147. package/dist/src/server/listener/transmitter/types.d.ts.map +1 -0
  148. package/dist/src/server/listener/transmitter/types.js +1 -0
  149. package/dist/src/server/listener/util.d.ts +2 -0
  150. package/dist/src/server/listener/util.d.ts.map +1 -0
  151. package/dist/src/server/listener/util.js +22 -0
  152. package/dist/src/server/sync-manager.d.ts +30 -0
  153. package/dist/src/server/sync-manager.d.ts.map +1 -0
  154. package/dist/src/server/sync-manager.js +287 -0
  155. package/dist/src/server/types.d.ts +308 -0
  156. package/dist/src/server/types.d.ts.map +1 -0
  157. package/dist/src/server/types.js +12 -0
  158. package/dist/src/server/utils.d.ts +8 -0
  159. package/dist/src/server/utils.d.ts.map +1 -0
  160. package/dist/src/server/utils.js +47 -0
  161. package/dist/src/storage/base.d.ts +36 -0
  162. package/dist/src/storage/base.d.ts.map +1 -0
  163. package/dist/src/storage/base.js +4 -0
  164. package/dist/src/storage/browser.d.ts +36 -0
  165. package/dist/src/storage/browser.d.ts.map +1 -0
  166. package/dist/src/storage/browser.js +155 -0
  167. package/dist/src/storage/filesystem.d.ts +33 -0
  168. package/dist/src/storage/filesystem.d.ts.map +1 -0
  169. package/dist/src/storage/filesystem.js +197 -0
  170. package/dist/src/storage/memory.d.ts +33 -0
  171. package/dist/src/storage/memory.d.ts.map +1 -0
  172. package/dist/src/storage/memory.js +139 -0
  173. package/dist/src/storage/prisma.d.ts +67 -0
  174. package/dist/src/storage/prisma.d.ts.map +1 -0
  175. package/dist/src/storage/prisma.js +445 -0
  176. package/dist/src/storage/sequelize.d.ts +32 -0
  177. package/dist/src/storage/sequelize.d.ts.map +1 -0
  178. package/dist/src/storage/sequelize.js +373 -0
  179. package/dist/src/storage/types.d.ts +43 -0
  180. package/dist/src/storage/types.d.ts.map +1 -0
  181. package/dist/src/storage/types.js +1 -0
  182. package/dist/src/utils/default-drives-manager.d.ts +29 -0
  183. package/dist/src/utils/default-drives-manager.d.ts.map +1 -0
  184. package/dist/src/utils/default-drives-manager.js +208 -0
  185. package/dist/src/utils/graphql.d.ts +34 -0
  186. package/dist/src/utils/graphql.d.ts.map +1 -0
  187. package/dist/src/utils/graphql.js +183 -0
  188. package/dist/src/utils/logger.d.ts +27 -0
  189. package/dist/src/utils/logger.d.ts.map +1 -0
  190. package/dist/src/utils/logger.js +105 -0
  191. package/dist/src/utils/migrations.d.ts +4 -0
  192. package/dist/src/utils/migrations.d.ts.map +1 -0
  193. package/dist/src/utils/migrations.js +41 -0
  194. package/dist/src/utils/misc.d.ts +11 -0
  195. package/dist/src/utils/misc.d.ts.map +1 -0
  196. package/dist/src/utils/misc.js +43 -0
  197. package/dist/src/utils/run-asap.d.ts +12 -0
  198. package/dist/src/utils/run-asap.d.ts.map +1 -0
  199. package/dist/src/utils/run-asap.js +131 -0
  200. package/dist/test/document-helpers/utils.d.ts +8 -0
  201. package/dist/test/document-helpers/utils.d.ts.map +1 -0
  202. package/dist/test/document-helpers/utils.js +21 -0
  203. package/dist/test/utils.d.ts +48 -0
  204. package/dist/test/utils.d.ts.map +1 -0
  205. package/dist/test/utils.js +132 -0
  206. package/dist/test/vitest-setup.d.ts +2 -0
  207. package/dist/test/vitest-setup.d.ts.map +1 -0
  208. package/dist/test/vitest-setup.js +4 -0
  209. package/dist/tsconfig.tsbuildinfo +1 -0
  210. package/dist/vitest.config.d.ts +3 -0
  211. package/dist/vitest.config.d.ts.map +1 -0
  212. package/dist/vitest.config.js +20 -0
  213. package/package.json +20 -38
  214. package/src/cache/index.ts +0 -2
  215. package/src/cache/memory.ts +0 -33
  216. package/src/cache/redis.ts +0 -56
  217. package/src/cache/types.ts +0 -9
  218. package/src/index.ts +0 -4
  219. package/src/queue/base.ts +0 -320
  220. package/src/queue/index.ts +0 -2
  221. package/src/queue/redis.ts +0 -144
  222. package/src/queue/types.ts +0 -79
  223. package/src/read-mode/errors.ts +0 -19
  224. package/src/read-mode/index.ts +0 -125
  225. package/src/read-mode/service.ts +0 -207
  226. package/src/read-mode/types.ts +0 -108
  227. package/src/server/error.ts +0 -70
  228. package/src/server/index.ts +0 -2444
  229. package/src/server/listener/index.ts +0 -2
  230. package/src/server/listener/manager.ts +0 -652
  231. package/src/server/listener/transmitter/index.ts +0 -4
  232. package/src/server/listener/transmitter/internal.ts +0 -143
  233. package/src/server/listener/transmitter/pull-responder.ts +0 -462
  234. package/src/server/listener/transmitter/switchboard-push.ts +0 -125
  235. package/src/server/listener/transmitter/types.ts +0 -27
  236. package/src/server/types.ts +0 -596
  237. package/src/server/utils.ts +0 -82
  238. package/src/storage/base.ts +0 -81
  239. package/src/storage/browser.ts +0 -238
  240. package/src/storage/filesystem.ts +0 -297
  241. package/src/storage/index.ts +0 -2
  242. package/src/storage/memory.ts +0 -211
  243. package/src/storage/prisma.ts +0 -653
  244. package/src/storage/sequelize.ts +0 -498
  245. package/src/storage/types.ts +0 -97
  246. package/src/utils/default-drives-manager.ts +0 -341
  247. package/src/utils/document-helpers.ts +0 -21
  248. package/src/utils/graphql.ts +0 -301
  249. package/src/utils/index.ts +0 -90
  250. package/src/utils/logger.ts +0 -38
  251. package/src/utils/migrations.ts +0 -58
  252. package/src/utils/run-asap.ts +0 -156
@@ -1,90 +0,0 @@
1
- import {
2
- DocumentDriveDocument,
3
- documentModel as DocumentDriveModel,
4
- } from "document-model-libs/document-drive";
5
- import {
6
- Action,
7
- BaseAction,
8
- Document,
9
- DocumentOperations,
10
- Operation,
11
- OperationScope,
12
- } from "document-model/document";
13
- import { generateId } from "document-model/utils";
14
- import { OperationError } from "../server/error";
15
- import { DocumentDriveStorage, DocumentStorage } from "../storage";
16
- import { RunAsap } from "./run-asap";
17
- export * from "./run-asap";
18
-
19
- export const runAsap = RunAsap.runAsap;
20
- export const runAsapAsync = RunAsap.runAsapAsync;
21
-
22
- export function isDocumentDriveStorage(
23
- document: DocumentStorage,
24
- ): document is DocumentDriveStorage {
25
- return document.documentType === DocumentDriveModel.id;
26
- }
27
-
28
- export function isDocumentDrive(
29
- document: Document,
30
- ): document is DocumentDriveDocument {
31
- return document.documentType === DocumentDriveModel.id;
32
- }
33
-
34
- export function mergeOperations<A extends Action = Action>(
35
- currentOperations: DocumentOperations<A>,
36
- newOperations: Operation<A | BaseAction>[],
37
- ): DocumentOperations<A> {
38
- const minIndexByScope = Object.keys(currentOperations).reduce<
39
- Partial<Record<OperationScope, number>>
40
- >((acc, curr) => {
41
- const scope = curr as OperationScope;
42
- acc[scope] = currentOperations[scope].at(-1)?.index ?? 0;
43
- return acc;
44
- }, {});
45
-
46
- const conflictOp = newOperations.find(
47
- (op) => op.index < (minIndexByScope[op.scope] ?? 0),
48
- );
49
- if (conflictOp) {
50
- throw new OperationError(
51
- "ERROR",
52
- conflictOp,
53
- `Tried to add operation with index ${conflictOp.index} and document is at index ${minIndexByScope[conflictOp.scope]}`,
54
- );
55
- }
56
-
57
- return newOperations
58
- .sort((a, b) => a.index - b.index)
59
- .reduce<DocumentOperations<A>>((acc, curr) => {
60
- const existingOperations = acc[curr.scope] || [];
61
- return { ...acc, [curr.scope]: [...existingOperations, curr] };
62
- }, currentOperations);
63
- }
64
-
65
- export function generateUUID(): string {
66
- return generateId();
67
- }
68
-
69
- export function isNoopUpdate(
70
- operation: Operation,
71
- latestOperation?: Operation,
72
- ) {
73
- if (!latestOperation) {
74
- return false;
75
- }
76
-
77
- const isNoopOp = operation.type === "NOOP";
78
- const isNoopLatestOp = latestOperation.type === "NOOP";
79
- const isSameIndexOp = operation.index === latestOperation.index;
80
- const isSkipOpGreaterThanLatestOp = operation.skip > latestOperation.skip;
81
-
82
- return (
83
- isNoopOp && isNoopLatestOp && isSameIndexOp && isSkipOpGreaterThanLatestOp
84
- );
85
- }
86
-
87
- // return true if dateA is before dateB
88
- export function isBefore(dateA: Date | string, dateB: Date | string) {
89
- return new Date(dateA) < new Date(dateB);
90
- }
@@ -1,38 +0,0 @@
1
- export type ILogger = Pick<
2
- Console,
3
- "log" | "info" | "warn" | "error" | "debug" | "trace"
4
- >;
5
- class Logger implements ILogger {
6
- #logger: ILogger = console;
7
-
8
- constructor() {
9
- // Bind methods to avoid losing `this`
10
- this.log = this.log.bind(this);
11
- this.info = this.info.bind(this);
12
- this.warn = this.warn.bind(this);
13
- this.error = this.error.bind(this);
14
- this.debug = this.debug.bind(this);
15
- this.trace = this.trace.bind(this);
16
- }
17
-
18
- set logger(logger: ILogger) {
19
- this.#logger = logger;
20
- }
21
- // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
22
- log = (...data: any[]) => this.#logger.log(...data);
23
- // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
24
- info = (...data: any[]) => this.#logger.info(...data);
25
- // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
26
- warn = (...data: any[]) => this.#logger.warn(...data);
27
- // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
28
- error = (...data: any[]) => this.#logger.error(...data);
29
- // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
30
- debug = (...data: any[]) => this.#logger.debug(...data);
31
- // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
32
- trace = (...data: any[]) => this.#logger.trace(...data);
33
- }
34
-
35
- const loggerInstance = new Logger();
36
-
37
- export const logger: ILogger = loggerInstance;
38
- export const setLogger = (logger: ILogger) => (loggerInstance.logger = logger);
@@ -1,58 +0,0 @@
1
- import {
2
- Action,
3
- Document,
4
- DocumentOperations,
5
- Operation,
6
- OperationScope,
7
- } from "document-model/document";
8
- import { DocumentStorage } from "../storage/types";
9
-
10
- export function migrateDocumentOperationSigatures<D extends Document>(
11
- document: DocumentStorage<D>,
12
- ): DocumentStorage<D> | undefined {
13
- let legacy = false;
14
- const operations = Object.entries(document.operations).reduce<
15
- DocumentOperations<Action>
16
- >(
17
- (acc, [key, operations]) => {
18
- const scope = key as unknown as OperationScope;
19
- for (const op of operations) {
20
- const newOp = migrateLegacyOperationSignature(op);
21
- acc[scope].push(newOp);
22
- if (newOp !== op) {
23
- legacy = true;
24
- }
25
- }
26
- return acc;
27
- },
28
- { global: [], local: [] },
29
- );
30
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
31
- return legacy ? { ...document, operations } : document;
32
- }
33
-
34
- export function migrateLegacyOperationSignature<A extends Action>(
35
- operation: Operation<A>,
36
- ): Operation<A> {
37
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
38
- if (!operation.context?.signer || operation.context.signer.signatures) {
39
- return operation;
40
- }
41
- const { signer } = operation.context;
42
- if ("signature" in signer) {
43
- const signature = signer.signature as string | undefined;
44
- return {
45
- ...operation,
46
- context: {
47
- ...operation.context,
48
- signer: {
49
- user: signer.user,
50
- app: signer.app,
51
- signatures: signature?.length ? [signature] : [],
52
- },
53
- },
54
- };
55
- } else {
56
- return operation;
57
- }
58
- }
@@ -1,156 +0,0 @@
1
- // eslint-disable-next-line @typescript-eslint/no-namespace
2
- export namespace RunAsap {
3
- export type Task<T = void> = () => T;
4
- export type AbortTask = () => void;
5
- export type RunAsap<T> = (task: Task<T>) => AbortTask;
6
-
7
- export const useMessageChannel = (() => {
8
- if (typeof MessageChannel === "undefined") {
9
- return new Error("MessageChannel is not supported");
10
- }
11
-
12
- return (task: Task) => {
13
- const controller = new AbortController();
14
- const signal = controller.signal;
15
- const mc = new MessageChannel();
16
- mc.port1.postMessage(null);
17
- mc.port2.addEventListener(
18
- "message",
19
- () => {
20
- task();
21
- mc.port1.close();
22
- mc.port2.close();
23
- },
24
- { once: true, signal: signal },
25
- );
26
- mc.port2.start();
27
- return () => controller.abort();
28
- };
29
- })();
30
-
31
- export const usePostMessage = (() => {
32
- const _main: unknown =
33
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
34
- (typeof window === "object" && window) ||
35
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
36
- (typeof global === "object" && global) ||
37
- (typeof self === "object" && self);
38
- if (!_main) {
39
- return new Error("No global object found");
40
- }
41
-
42
- const main = _main as Window;
43
- if (
44
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
45
- !main.postMessage ||
46
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
47
- !main.addEventListener ||
48
- (main as { importScripts?: unknown }).importScripts // web workers can't this method
49
- ) {
50
- return new Error("postMessage is not supported");
51
- }
52
-
53
- let index = 0;
54
- const tasks = new Map<number, Task>();
55
-
56
- function getNewIndex() {
57
- if (index === 9007199254740991) {
58
- return 0;
59
- }
60
- return ++index;
61
- }
62
-
63
- const MESSAGE_PREFIX = "com.usePostMessage" + Math.random();
64
-
65
- main.addEventListener(
66
- "message",
67
- (e) => {
68
- const event = e as MessageEvent<string>;
69
- if (typeof event.data !== "string") {
70
- return;
71
- }
72
- if (event.source !== main || !event.data.startsWith(MESSAGE_PREFIX)) {
73
- return;
74
- }
75
- const index = event.data.split(":").at(1);
76
- if (index === undefined) {
77
- return;
78
- }
79
- const i = +index;
80
- const task = tasks.get(i);
81
- if (task) {
82
- task();
83
- tasks.delete(i);
84
- }
85
- },
86
- false,
87
- );
88
-
89
- return (task: Task) => {
90
- const i = getNewIndex();
91
- tasks.set(i, task);
92
- main.postMessage(MESSAGE_PREFIX + ":" + i, { targetOrigin: "*" });
93
- return () => {
94
- tasks.delete(i);
95
- };
96
- };
97
- })();
98
-
99
- export const useSetImmediate = (() => {
100
- if (typeof window !== "undefined") {
101
- return new Error("setImmediate is not supported on the browser");
102
- }
103
- if (typeof setImmediate === "undefined") {
104
- return new Error("setImmediate is not supported");
105
- }
106
-
107
- return (task: Task) => {
108
- const id = setImmediate(task);
109
- return () => clearImmediate(id);
110
- };
111
- })();
112
-
113
- export const useSetTimeout = (() => {
114
- return (task: Task) => {
115
- const id = setTimeout(task, 0);
116
- return () => clearTimeout(id);
117
- };
118
- })();
119
-
120
- // queues the task in the macro tasks queue, so it doesn't
121
- // prevent the event loop from movin on the next tick
122
- export function runAsap<T = void>(task: Task<T>): AbortTask {
123
- // if on node use setImmediate
124
- if (!(useSetImmediate instanceof Error)) {
125
- return useSetImmediate(task);
126
- }
127
- // on browser use MessageChannel if available
128
- else if (!(useMessageChannel instanceof Error)) {
129
- return useMessageChannel(task);
130
- }
131
- // otherwise use window.postMessage
132
- else if (!(usePostMessage instanceof Error)) {
133
- return usePostMessage(task);
134
- }
135
- // fallback to setTimeout with 0 delay
136
- else {
137
- return useSetTimeout(task);
138
- }
139
- }
140
-
141
- export function runAsapAsync<T = void>(
142
- task: RunAsap.Task<Promise<T>>,
143
- queueMethod: RunAsap<void> = runAsap,
144
- ): Promise<T> {
145
- if (queueMethod instanceof Error) {
146
- throw new Error("queueMethod is not supported", {
147
- cause: queueMethod,
148
- });
149
- }
150
- return new Promise((resolve, reject) => {
151
- queueMethod(() => {
152
- task().then(resolve).catch(reject);
153
- });
154
- });
155
- }
156
- }