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
@@ -0,0 +1,146 @@
1
+ import { v4 as generateUUID } from "uuid";
2
+ import { addFile, copyNode } from "../gen/node/creators.js";
3
+ export function isFileNode(node) {
4
+ return node.kind === "file";
5
+ }
6
+ export function isFolderNode(node) {
7
+ return node.kind === "folder";
8
+ }
9
+ export function getAncestors(node, allNodes) {
10
+ if (!node.parentFolder) {
11
+ return [];
12
+ }
13
+ else {
14
+ const parentNode = allNodes.find((_node) => _node.id === node.parentFolder);
15
+ if (!parentNode) {
16
+ throw new Error(`Parent node with id ${node.parentFolder} not found`);
17
+ }
18
+ return [parentNode, ...getAncestors(parentNode, allNodes)];
19
+ }
20
+ }
21
+ export function getDescendants(node, allNodes) {
22
+ const children = allNodes.filter((_node) => _node.parentFolder === node.id);
23
+ const descendants = children.map((child) => getDescendants(child, allNodes));
24
+ return [...children, ...descendants.flat()];
25
+ }
26
+ /**
27
+ * Generates a copy of nodes based on the provided source and target information.
28
+ * @param src - The source information for generating the copy.
29
+ * @param idGenerator - The function used to generate new IDs for the copied nodes.
30
+ * @param nodes - The array of nodes to copy from.
31
+ * @returns An array of copied nodes with updated IDs and parent folders.
32
+ * @throws Error if the root node with the specified ID is not found.
33
+ */
34
+ export function generateNodesCopy(src, idGenerator, nodes) {
35
+ const rootNode = nodes.find((node) => node.id === src.srcId);
36
+ if (!rootNode) {
37
+ throw new Error(`Node with id ${src.srcId} not found`);
38
+ }
39
+ const nodesToCopy = [
40
+ {
41
+ ...rootNode,
42
+ name: src.targetName || rootNode.name,
43
+ parentFolder: src.targetParentFolder || null,
44
+ },
45
+ ...getDescendants(rootNode, nodes),
46
+ ];
47
+ const ids = {};
48
+ // Add targetParentFolder to ids so that is not replaced by a new id
49
+ if (src.targetParentFolder) {
50
+ ids[src.targetParentFolder] = src.targetParentFolder;
51
+ }
52
+ const getNewNodeId = (id) => {
53
+ let newId = ids[id];
54
+ if (!newId) {
55
+ const oldId = id;
56
+ newId = idGenerator(id);
57
+ ids[oldId] = newId;
58
+ }
59
+ return newId;
60
+ };
61
+ const copyNodesInput = nodesToCopy.map((node) => ({
62
+ srcId: node.id,
63
+ targetId: getNewNodeId(node.id),
64
+ targetName: node.name,
65
+ targetParentFolder: node.parentFolder
66
+ ? getNewNodeId(node.parentFolder)
67
+ : null,
68
+ synchronizationUnits: isFileNode(node)
69
+ ? node.synchronizationUnits.map((unit) => ({
70
+ ...unit,
71
+ syncId: generateSynchronizationUnitId(nodes),
72
+ }))
73
+ : undefined,
74
+ }));
75
+ return copyNodesInput;
76
+ }
77
+ export function generateSynchronizationUnitId(nodes) {
78
+ let syncId = "";
79
+ while (!syncId ||
80
+ nodes.find((node) => isFileNode(node) &&
81
+ node.synchronizationUnits.find((unit) => unit.syncId === syncId))) {
82
+ syncId = generateUUID();
83
+ }
84
+ return syncId;
85
+ }
86
+ export function generateSynchronizationUnits(state, scopes, branch = "main") {
87
+ return scopes.map((scope) => ({
88
+ scope,
89
+ branch,
90
+ syncId: generateSynchronizationUnitId(state.nodes),
91
+ }));
92
+ }
93
+ export function generateAddNodeAction(state, action, scopes) {
94
+ return addFile({
95
+ ...action,
96
+ synchronizationUnits: generateSynchronizationUnits(state, scopes),
97
+ });
98
+ }
99
+ export function generateCopyNodeAction(state, action) {
100
+ const originalNode = state.nodes.find((node) => node.id === action.srcId);
101
+ if (!originalNode) {
102
+ throw new Error(`Node with id ${action.srcId} not found`);
103
+ }
104
+ let synchronizationUnits = undefined;
105
+ if (isFileNode(originalNode)) {
106
+ synchronizationUnits = originalNode.synchronizationUnits.map((syncUnit) => ({
107
+ ...syncUnit,
108
+ syncId: generateSynchronizationUnitId(state.nodes),
109
+ }));
110
+ }
111
+ return copyNode({
112
+ ...action,
113
+ synchronizationUnits,
114
+ });
115
+ }
116
+ export function getNextCopyNumber(files, baseFilename) {
117
+ let maxNumber = 0; // Start by assuming no copies exist
118
+ // Regex to find files that match the base filename followed by " (copy)" and possibly a number
119
+ const regex = new RegExp(`^${escapeRegExp(baseFilename)} \\(copy\\)(?: (\\d+))?$`);
120
+ for (const file of files) {
121
+ const match = file.match(regex);
122
+ if (match) {
123
+ const number = match[1] ? parseInt(match[1], 10) : 1;
124
+ if (number > maxNumber) {
125
+ maxNumber = number;
126
+ }
127
+ }
128
+ }
129
+ return maxNumber + 1;
130
+ }
131
+ export function escapeRegExp(string) {
132
+ return string.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
133
+ }
134
+ export function handleTargetNameCollisions(params) {
135
+ const { nodes, targetParentFolder, srcName } = params;
136
+ const targetNodeChildrenNames = nodes
137
+ .filter((node) => targetParentFolder === ""
138
+ ? node.parentFolder === null
139
+ : node.parentFolder === targetParentFolder)
140
+ .map((node) => node.name);
141
+ const targetHasNodesWithSameName = targetNodeChildrenNames.includes(srcName);
142
+ const targetName = targetHasNodesWithSameName
143
+ ? `${srcName} (copy) ${getNextCopyNumber(targetNodeChildrenNames, srcName)}`
144
+ : srcName;
145
+ return targetName;
146
+ }
@@ -0,0 +1,43 @@
1
+ import { Unsubscribe } from "nanoevents";
2
+ import { IJob, IJobQueue, IQueue, IQueueManager, IServerDelegate, Job, JobId, QueueEvents } from "./types.js";
3
+ export declare class MemoryQueue<T> implements IQueue<T> {
4
+ private id;
5
+ private blocked;
6
+ private deleted;
7
+ private items;
8
+ private dependencies;
9
+ constructor(id: string);
10
+ setDeleted(deleted: boolean): Promise<void>;
11
+ isDeleted(): Promise<boolean>;
12
+ addJob(data: IJob<T>): Promise<void>;
13
+ getNextJob(): Promise<IJob<T> | undefined>;
14
+ amountOfJobs(): Promise<number>;
15
+ getId(): string;
16
+ setBlocked(blocked: boolean): Promise<void>;
17
+ isBlocked(): Promise<boolean>;
18
+ getJobs(): Promise<IJob<T>[]>;
19
+ addDependencies(job: IJob<Job>): Promise<void>;
20
+ removeDependencies(job: IJob<Job>): Promise<void>;
21
+ }
22
+ export declare class BaseQueueManager implements IQueueManager {
23
+ protected emitter: import("nanoevents").Emitter<QueueEvents>;
24
+ protected ticker: number;
25
+ protected queues: IJobQueue[];
26
+ protected workers: number;
27
+ protected timeout: number;
28
+ private delegate;
29
+ constructor(workers?: number, timeout?: number);
30
+ init(delegate: IServerDelegate, onError: (error: Error) => void): Promise<void>;
31
+ addJob(job: Job): Promise<JobId>;
32
+ getQueue(driveId: string, documentId?: string): IJobQueue;
33
+ removeQueue(driveId: string, documentId?: string): void;
34
+ getQueueByIndex(index: number): IJobQueue | null;
35
+ getQueues(): string[];
36
+ private retryNextJob;
37
+ private findFirstNonEmptyQueue;
38
+ private processNextJob;
39
+ protected emit<K extends keyof QueueEvents>(event: K, ...args: Parameters<QueueEvents[K]>): void;
40
+ on<K extends keyof QueueEvents>(event: K, cb: QueueEvents[K]): Unsubscribe;
41
+ protected getQueueId(driveId: string, documentId?: string): string;
42
+ }
43
+ //# sourceMappingURL=base.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../src/queue/base.ts"],"names":[],"mappings":"AAKA,OAAO,EAAoB,WAAW,EAAE,MAAM,YAAY,CAAC;AAC3D,OAAO,EACL,IAAI,EACJ,SAAS,EACT,MAAM,EACN,aAAa,EACb,eAAe,EAEf,GAAG,EACH,KAAK,EACL,WAAW,EACZ,MAAM,YAAY,CAAC;AAEpB,qBAAa,WAAW,CAAC,CAAC,CAAE,YAAW,MAAM,CAAC,CAAC,CAAC;IAC9C,OAAO,CAAC,EAAE,CAAS;IACnB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,KAAK,CAAiB;IAC9B,OAAO,CAAC,YAAY,CAA0B;gBAElC,EAAE,EAAE,MAAM;IAIhB,UAAU,CAAC,OAAO,EAAE,OAAO;IAI3B,SAAS;IAIT,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;IAKpB,UAAU;IAKV,YAAY;IAIlB,KAAK;IAIC,UAAU,CAAC,OAAO,EAAE,OAAO;IAI3B,SAAS;IAIT,OAAO;IAIP,eAAe,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC;IAS9B,kBAAkB,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC;CAQxC;AAED,qBAAa,gBAAiB,YAAW,aAAa;IACpD,SAAS,CAAC,OAAO,4CAAmC;IACpD,SAAS,CAAC,MAAM,SAAK;IACrB,SAAS,CAAC,MAAM,EAAE,SAAS,EAAE,CAAM;IACnC,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC;IAC1B,OAAO,CAAC,QAAQ,CAA8B;gBAElC,OAAO,SAAI,EAAE,OAAO,SAAI;IAK9B,IAAI,CACR,QAAQ,EAAE,eAAe,EACzB,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAC9B,OAAO,CAAC,IAAI,CAAC;IAWV,MAAM,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC;IA8DtC,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM;IAY7C,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM;IAMhD,eAAe,CAAC,KAAK,EAAE,MAAM;IAS7B,SAAS;IAIT,OAAO,CAAC,YAAY;YAON,sBAAsB;YAatB,cAAc;IA0E5B,SAAS,CAAC,IAAI,CAAC,CAAC,SAAS,MAAM,WAAW,EACxC,KAAK,EAAE,CAAC,EACR,GAAG,IAAI,EAAE,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAK9B,EAAE,CAAC,CAAC,SAAS,MAAM,WAAW,EACnC,KAAK,EAAE,CAAC,EACR,EAAE,EAAE,WAAW,CAAC,CAAC,CAAC,GACjB,WAAW;IAId,SAAS,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM;CAG1D"}
@@ -0,0 +1,241 @@
1
+ import { logger } from "#utils/logger";
2
+ import { generateUUID, runAsap } from "#utils/misc";
3
+ import { createNanoEvents } from "nanoevents";
4
+ import { isOperationJob, } from "./types.js";
5
+ export class MemoryQueue {
6
+ id;
7
+ blocked = false;
8
+ deleted = false;
9
+ items = [];
10
+ dependencies = new Array();
11
+ constructor(id) {
12
+ this.id = id;
13
+ }
14
+ async setDeleted(deleted) {
15
+ this.deleted = deleted;
16
+ }
17
+ async isDeleted() {
18
+ return this.deleted;
19
+ }
20
+ async addJob(data) {
21
+ this.items.push(data);
22
+ return Promise.resolve();
23
+ }
24
+ async getNextJob() {
25
+ const job = this.items.shift();
26
+ return Promise.resolve(job);
27
+ }
28
+ async amountOfJobs() {
29
+ return Promise.resolve(this.items.length);
30
+ }
31
+ getId() {
32
+ return this.id;
33
+ }
34
+ async setBlocked(blocked) {
35
+ this.blocked = blocked;
36
+ }
37
+ async isBlocked() {
38
+ return this.blocked;
39
+ }
40
+ async getJobs() {
41
+ return this.items;
42
+ }
43
+ async addDependencies(job) {
44
+ if (!this.dependencies.find((j) => j.jobId === job.jobId)) {
45
+ this.dependencies.push(job);
46
+ }
47
+ if (!this.isBlocked()) {
48
+ this.setBlocked(true);
49
+ }
50
+ }
51
+ async removeDependencies(job) {
52
+ this.dependencies = this.dependencies.filter((j) => j.jobId !== job.jobId && j.driveId !== job.driveId);
53
+ if (this.dependencies.length === 0) {
54
+ await this.setBlocked(false);
55
+ }
56
+ }
57
+ }
58
+ export class BaseQueueManager {
59
+ emitter = createNanoEvents();
60
+ ticker = 0;
61
+ queues = [];
62
+ workers;
63
+ timeout;
64
+ delegate;
65
+ constructor(workers = 3, timeout = 0) {
66
+ this.workers = workers;
67
+ this.timeout = timeout;
68
+ }
69
+ async init(delegate, onError) {
70
+ this.delegate = delegate;
71
+ for (let i = 0; i < this.workers; i++) {
72
+ setTimeout(() => this.processNextJob.bind(this)().catch(onError), 100 * i);
73
+ }
74
+ return Promise.resolve();
75
+ }
76
+ async addJob(job) {
77
+ if (!this.delegate) {
78
+ throw new Error("No server delegate defined");
79
+ }
80
+ const jobId = generateUUID();
81
+ const queue = this.getQueue(job.driveId, job.documentId);
82
+ if (await queue.isDeleted()) {
83
+ throw new Error("Queue is deleted");
84
+ }
85
+ // checks if the job is for a document that doesn't exist in storage yet
86
+ const newDocument = job.documentId &&
87
+ !(await this.delegate.checkDocumentExists(job.driveId, job.documentId));
88
+ // if it is a new document and queue is not yet blocked then
89
+ // blocks it so the jobs are not processed until it's ready
90
+ if (newDocument && !(await queue.isBlocked())) {
91
+ await queue.setBlocked(true);
92
+ // checks if there any job in the queue adding the file and adds as dependency
93
+ const driveQueue = this.getQueue(job.driveId);
94
+ const jobs = await driveQueue.getJobs();
95
+ for (const driveJob of jobs) {
96
+ const actions = isOperationJob(driveJob)
97
+ ? driveJob.operations
98
+ : driveJob.actions;
99
+ const op = actions.find((j) => {
100
+ const input = j.input;
101
+ return j.type === "ADD_FILE" && input.id === job.documentId;
102
+ });
103
+ if (op) {
104
+ await queue.addDependencies(driveJob);
105
+ }
106
+ }
107
+ }
108
+ // if it has ADD_FILE operations then adds the job as
109
+ // a dependency to the corresponding document queues
110
+ const actions = isOperationJob(job) ? job.operations : (job.actions ?? []);
111
+ const addFileOps = actions.filter((j) => j.type === "ADD_FILE");
112
+ for (const addFileOp of addFileOps) {
113
+ const input = addFileOp.input;
114
+ const q = this.getQueue(job.driveId, input.id);
115
+ await q.addDependencies({ jobId, ...job });
116
+ }
117
+ // remove document if operations contains delete_node
118
+ const removeFileOps = actions.filter((j) => j.type === "DELETE_NODE");
119
+ for (const removeFileOp of removeFileOps) {
120
+ const input = removeFileOp.input;
121
+ const queue = this.getQueue(job.driveId, input.id);
122
+ await queue.setDeleted(true);
123
+ }
124
+ await queue.addJob({ jobId, ...job });
125
+ return jobId;
126
+ }
127
+ getQueue(driveId, documentId) {
128
+ const queueId = this.getQueueId(driveId, documentId);
129
+ let queue = this.queues.find((q) => q.getId() === queueId);
130
+ if (!queue) {
131
+ queue = new MemoryQueue(queueId);
132
+ this.queues.push(queue);
133
+ }
134
+ return queue;
135
+ }
136
+ removeQueue(driveId, documentId) {
137
+ const queueId = this.getQueueId(driveId, documentId);
138
+ this.queues = this.queues.filter((q) => q.getId() !== queueId);
139
+ this.emit("queueRemoved", queueId);
140
+ }
141
+ getQueueByIndex(index) {
142
+ const queue = this.queues[index];
143
+ if (queue) {
144
+ return queue;
145
+ }
146
+ return null;
147
+ }
148
+ getQueues() {
149
+ return this.queues.map((q) => q.getId());
150
+ }
151
+ retryNextJob(timeout) {
152
+ const _timeout = timeout !== undefined ? timeout : this.timeout;
153
+ const retry = _timeout > 0 ? (fn) => setTimeout(fn, _timeout) : runAsap;
154
+ retry(() => this.processNextJob());
155
+ }
156
+ async findFirstNonEmptyQueue(ticker) {
157
+ const numQueues = this.queues.length;
158
+ for (let i = 0; i < numQueues; i++) {
159
+ const index = (ticker + i) % numQueues;
160
+ const queue = this.queues[index];
161
+ if (queue && (await queue.amountOfJobs()) > 0) {
162
+ return index;
163
+ }
164
+ }
165
+ return null;
166
+ }
167
+ async processNextJob() {
168
+ if (!this.delegate) {
169
+ throw new Error("No server delegate defined");
170
+ }
171
+ if (this.queues.length === 0) {
172
+ this.retryNextJob();
173
+ return;
174
+ }
175
+ const queue = this.queues[this.ticker];
176
+ if (!queue) {
177
+ this.ticker = 0;
178
+ this.retryNextJob();
179
+ return;
180
+ }
181
+ // if no jobs in the current queue then looks for the
182
+ // next queue with jobs. If no jobs in any queue then
183
+ // retries after a timeout
184
+ const amountOfJobs = await queue.amountOfJobs();
185
+ if (amountOfJobs === 0) {
186
+ const nextTicker = await this.findFirstNonEmptyQueue(this.ticker);
187
+ if (nextTicker !== null) {
188
+ this.ticker = nextTicker;
189
+ this.retryNextJob(0);
190
+ }
191
+ else {
192
+ this.retryNextJob();
193
+ }
194
+ return;
195
+ }
196
+ this.ticker = this.ticker === this.queues.length - 1 ? 0 : this.ticker + 1;
197
+ const isBlocked = await queue.isBlocked();
198
+ if (isBlocked) {
199
+ this.retryNextJob();
200
+ return;
201
+ }
202
+ await queue.setBlocked(true);
203
+ const nextJob = await queue.getNextJob();
204
+ if (!nextJob) {
205
+ this.retryNextJob();
206
+ return;
207
+ }
208
+ try {
209
+ const result = await this.delegate.processJob(nextJob);
210
+ // unblock the document queues of each add_file operation
211
+ const actions = isOperationJob(nextJob)
212
+ ? nextJob.operations
213
+ : nextJob.actions;
214
+ const addFileActions = actions.filter((op) => op.type === "ADD_FILE");
215
+ if (addFileActions.length > 0) {
216
+ for (const addFile of addFileActions) {
217
+ const documentQueue = this.getQueue(nextJob.driveId, addFile.input.id);
218
+ await documentQueue.removeDependencies(nextJob);
219
+ }
220
+ }
221
+ this.emit("jobCompleted", nextJob, result);
222
+ }
223
+ catch (e) {
224
+ logger.error(`job failed`, e);
225
+ this.emit("jobFailed", nextJob, e);
226
+ }
227
+ finally {
228
+ await queue.setBlocked(false);
229
+ this.retryNextJob(0);
230
+ }
231
+ }
232
+ emit(event, ...args) {
233
+ this.emitter.emit(event, ...args);
234
+ }
235
+ on(event, cb) {
236
+ return this.emitter.on(event, cb);
237
+ }
238
+ getQueueId(driveId, documentId) {
239
+ return `queue:${driveId}${documentId ? `:${documentId}` : ""}`;
240
+ }
241
+ }
@@ -0,0 +1,28 @@
1
+ import { RedisClientType } from "redis";
2
+ import { BaseQueueManager } from "./base.js";
3
+ import { IJob, IQueue, IQueueManager, IServerDelegate, Job } from "./types.js";
4
+ export declare class RedisQueue<T> implements IQueue<T> {
5
+ private id;
6
+ private client;
7
+ constructor(id: string, client: RedisClientType);
8
+ addJob(data: any): Promise<void>;
9
+ getNextJob(): Promise<IJob<T> | undefined>;
10
+ amountOfJobs(): Promise<number>;
11
+ setBlocked(blocked: boolean): Promise<void>;
12
+ isBlocked(): Promise<boolean>;
13
+ getId(): string;
14
+ getJobs(): Promise<IJob<T>[]>;
15
+ addDependencies(job: IJob<Job>): Promise<void>;
16
+ hasDependency(job: IJob<Job>): Promise<boolean>;
17
+ removeDependencies(job: IJob<Job>): Promise<void>;
18
+ isDeleted(): Promise<boolean>;
19
+ setDeleted(deleted: boolean): Promise<void>;
20
+ }
21
+ export declare class RedisQueueManager extends BaseQueueManager implements IQueueManager {
22
+ private client;
23
+ constructor(workers: number | undefined, timeout: number | undefined, client: RedisClientType);
24
+ init(delegate: IServerDelegate, onError: (error: Error) => void): Promise<void>;
25
+ getQueue(driveId: string, documentId?: string): import("./types.js").IJobQueue;
26
+ removeQueue(driveId: string, documentId?: string | undefined): void;
27
+ }
28
+ //# sourceMappingURL=redis.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redis.d.ts","sourceRoot":"","sources":["../../../src/queue/redis.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,OAAO,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,eAAe,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AAE/E,qBAAa,UAAU,CAAC,CAAC,CAAE,YAAW,MAAM,CAAC,CAAC,CAAC;IAC7C,OAAO,CAAC,EAAE,CAAS;IACnB,OAAO,CAAC,MAAM,CAAkB;gBAEpB,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe;IAOzC,MAAM,CAAC,IAAI,EAAE,GAAG;IAIhB,UAAU;IAQV,YAAY;IAIZ,UAAU,CAAC,OAAO,EAAE,OAAO;IAQ3B,SAAS;IASf,KAAK;IAIC,OAAO;IAKP,eAAe,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC;IAQ9B,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC;IAK5B,kBAAkB,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC;IAUjC,SAAS;IAKT,UAAU,CAAC,OAAO,EAAE,OAAO;CAOlC;AAED,qBAAa,iBACX,SAAQ,gBACR,YAAW,aAAa;IAExB,OAAO,CAAC,MAAM,CAAkB;gBAEpB,OAAO,oBAAI,EAAE,OAAO,oBAAI,EAAE,MAAM,EAAE,eAAe;IAKvD,IAAI,CACR,QAAQ,EAAE,eAAe,EACzB,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAC9B,OAAO,CAAC,IAAI,CAAC;IAWhB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM;IAY7C,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;CAMpE"}
@@ -0,0 +1,110 @@
1
+ import { BaseQueueManager } from "./base.js";
2
+ export class RedisQueue {
3
+ id;
4
+ client;
5
+ constructor(id, client) {
6
+ this.client = client;
7
+ this.id = id;
8
+ this.client.hSet("queues", id, "true");
9
+ this.client.hSet(this.id, "blocked", "false");
10
+ }
11
+ async addJob(data) {
12
+ await this.client.lPush(this.id + "-jobs", JSON.stringify(data));
13
+ }
14
+ async getNextJob() {
15
+ const job = await this.client.rPop(this.id + "-jobs");
16
+ if (!job) {
17
+ return undefined;
18
+ }
19
+ return JSON.parse(job);
20
+ }
21
+ async amountOfJobs() {
22
+ return this.client.lLen(this.id + "-jobs");
23
+ }
24
+ async setBlocked(blocked) {
25
+ if (blocked) {
26
+ await this.client.hSet(this.id, "blocked", "true");
27
+ }
28
+ else {
29
+ await this.client.hSet(this.id, "blocked", "false");
30
+ }
31
+ }
32
+ async isBlocked() {
33
+ const blockedResult = await this.client.hGet(this.id, "blocked");
34
+ if (blockedResult === "true") {
35
+ return true;
36
+ }
37
+ return false;
38
+ }
39
+ getId() {
40
+ return this.id;
41
+ }
42
+ async getJobs() {
43
+ const entries = await this.client.lRange(this.id + "-jobs", 0, -1);
44
+ return entries.map((e) => JSON.parse(e));
45
+ }
46
+ async addDependencies(job) {
47
+ if (await this.hasDependency(job)) {
48
+ return;
49
+ }
50
+ await this.client.lPush(this.id + "-deps", JSON.stringify(job));
51
+ await this.setBlocked(true);
52
+ }
53
+ async hasDependency(job) {
54
+ const deps = await this.client.lRange(this.id + "-deps", 0, -1);
55
+ return deps.some((d) => d === JSON.stringify(job));
56
+ }
57
+ async removeDependencies(job) {
58
+ await this.client.lRem(this.id + "-deps", 1, JSON.stringify(job));
59
+ const allDeps = await this.client.lLen(this.id + "-deps");
60
+ if (allDeps > 0) {
61
+ await this.setBlocked(true);
62
+ }
63
+ else {
64
+ await this.setBlocked(false);
65
+ }
66
+ }
67
+ async isDeleted() {
68
+ const active = await this.client.hGet("queues", this.id);
69
+ return active === "false";
70
+ }
71
+ async setDeleted(deleted) {
72
+ if (deleted) {
73
+ await this.client.hSet("queues", this.id, "false");
74
+ }
75
+ else {
76
+ await this.client.hSet("queues", this.id, "true");
77
+ }
78
+ }
79
+ }
80
+ export class RedisQueueManager extends BaseQueueManager {
81
+ client;
82
+ constructor(workers = 3, timeout = 0, client) {
83
+ super(workers, timeout);
84
+ this.client = client;
85
+ }
86
+ async init(delegate, onError) {
87
+ await super.init(delegate, onError);
88
+ const queues = await this.client.hGetAll("queues");
89
+ for (const queueId in queues) {
90
+ const active = await this.client.hGet("queues", queueId);
91
+ if (active === "true") {
92
+ this.queues.push(new RedisQueue(queueId, this.client));
93
+ }
94
+ }
95
+ }
96
+ getQueue(driveId, documentId) {
97
+ const queueId = this.getQueueId(driveId, documentId);
98
+ let queue = this.queues.find((q) => q.getId() === queueId);
99
+ if (!queue) {
100
+ queue = new RedisQueue(queueId, this.client);
101
+ this.queues.push(queue);
102
+ }
103
+ return queue;
104
+ }
105
+ removeQueue(driveId, documentId) {
106
+ super.removeQueue(driveId, documentId);
107
+ const queueId = this.getQueueId(driveId, documentId);
108
+ this.client.hDel("queues", queueId);
109
+ }
110
+ }
@@ -0,0 +1,55 @@
1
+ import type { Action, Operation } from "document-model";
2
+ import type { Unsubscribe } from "nanoevents";
3
+ import { AddOperationOptions, IOperationResult } from "#server/types";
4
+ export interface BaseJob {
5
+ driveId: string;
6
+ documentId?: string;
7
+ actions?: Action[];
8
+ options?: AddOperationOptions;
9
+ }
10
+ export interface OperationJob extends BaseJob {
11
+ operations: Operation[];
12
+ }
13
+ export interface ActionJob extends BaseJob {
14
+ actions: Action[];
15
+ }
16
+ export type Job = OperationJob | ActionJob;
17
+ export type JobId = string;
18
+ export interface QueueEvents {
19
+ jobCompleted: (job: IJob<Job>, result: IOperationResult) => void;
20
+ jobFailed: (job: IJob<Job>, error: Error) => void;
21
+ queueRemoved: (queueId: string) => void;
22
+ }
23
+ export interface IServerDelegate {
24
+ checkDocumentExists: (driveId: string, documentId: string) => Promise<boolean>;
25
+ processJob: (job: Job) => Promise<IOperationResult>;
26
+ }
27
+ export interface IQueueManager {
28
+ addJob: (job: Job) => Promise<JobId>;
29
+ getQueue: (driveId: string, documentId?: string) => IQueue<Job>;
30
+ removeQueue: (driveId: string, documentId?: string) => void;
31
+ getQueueByIndex: (index: number) => IQueue<Job> | null;
32
+ getQueues: () => string[];
33
+ init: (delegate: IServerDelegate, onError: (error: Error) => void) => Promise<void>;
34
+ on: <K extends keyof QueueEvents>(this: this, event: K, cb: QueueEvents[K]) => Unsubscribe;
35
+ }
36
+ export type IJob<T> = {
37
+ jobId: JobId;
38
+ } & T;
39
+ export interface IQueue<T> {
40
+ addJob(data: IJob<T>): Promise<void>;
41
+ getNextJob(): Promise<IJob<T> | undefined>;
42
+ amountOfJobs(): Promise<number>;
43
+ getId(): string;
44
+ setBlocked(blocked: boolean): Promise<void>;
45
+ isBlocked(): Promise<boolean>;
46
+ isDeleted(): Promise<boolean>;
47
+ setDeleted(deleted: boolean): Promise<void>;
48
+ getJobs(): Promise<IJob<T>[]>;
49
+ addDependencies: (job: IJob<Job>) => Promise<void>;
50
+ removeDependencies: (job: IJob<Job>) => Promise<void>;
51
+ }
52
+ export type IJobQueue = IQueue<Job>;
53
+ export declare function isOperationJob(job: Job): job is OperationJob;
54
+ export declare function isActionJob(job: Job): job is ActionJob;
55
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/queue/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export function isOperationJob(job) {
2
+ return "operations" in job;
3
+ }
4
+ export function isActionJob(job) {
5
+ return "actions" in job;
6
+ }
@@ -0,0 +1,12 @@
1
+ export declare abstract class ReadDriveError extends Error {
2
+ }
3
+ export declare class ReadDriveNotFoundError extends ReadDriveError {
4
+ constructor(driveId: string);
5
+ }
6
+ export declare class ReadDriveSlugNotFoundError extends ReadDriveError {
7
+ constructor(slug: string);
8
+ }
9
+ export declare class ReadDocumentNotFoundError extends ReadDriveError {
10
+ constructor(drive: string, id: string);
11
+ }
12
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/read-mode/errors.ts"],"names":[],"mappings":"AAAA,8BAAsB,cAAe,SAAQ,KAAK;CAAG;AAErD,qBAAa,sBAAuB,SAAQ,cAAc;gBAC5C,OAAO,EAAE,MAAM;CAG5B;AAED,qBAAa,0BAA2B,SAAQ,cAAc;gBAChD,IAAI,EAAE,MAAM;CAGzB;AAED,qBAAa,yBAA0B,SAAQ,cAAc;gBAC/C,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM;CAGtC"}