document-drive 5.0.0-staging.9 → 5.0.1-staging.2

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 (493) hide show
  1. package/dist/index.d.ts +17 -32
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +17 -20
  4. package/dist/index.js.map +1 -1
  5. package/dist/prisma/schema.prisma +1 -1
  6. package/dist/src/cache/index.d.ts +5 -0
  7. package/dist/src/cache/index.d.ts.map +1 -0
  8. package/dist/src/cache/index.js +5 -0
  9. package/dist/src/cache/index.js.map +1 -0
  10. package/dist/src/cache/lru.d.ts +2 -13
  11. package/dist/src/cache/lru.d.ts.map +1 -1
  12. package/dist/src/cache/lru.js +1 -2
  13. package/dist/src/cache/lru.js.map +1 -1
  14. package/dist/src/cache/memory.d.ts +3 -14
  15. package/dist/src/cache/memory.d.ts.map +1 -1
  16. package/dist/src/cache/memory.js +2 -3
  17. package/dist/src/cache/memory.js.map +1 -1
  18. package/dist/src/cache/redis.d.ts +3 -5
  19. package/dist/src/cache/redis.d.ts.map +1 -1
  20. package/dist/src/cache/redis.js +2 -4
  21. package/dist/src/cache/redis.js.map +1 -1
  22. package/dist/src/cache/types.d.ts +23 -2
  23. package/dist/src/cache/types.d.ts.map +1 -1
  24. package/dist/src/cache/util.d.ts +1 -1
  25. package/dist/src/cache/util.d.ts.map +1 -1
  26. package/dist/src/cache/util.js +11 -9
  27. package/dist/src/cache/util.js.map +1 -1
  28. package/dist/src/drive-document-model/constants.d.ts +2 -1
  29. package/dist/src/drive-document-model/constants.d.ts.map +1 -1
  30. package/dist/src/drive-document-model/constants.js +2 -2
  31. package/dist/src/drive-document-model/constants.js.map +1 -1
  32. package/dist/src/drive-document-model/gen/document-model.d.ts +2 -2
  33. package/dist/src/drive-document-model/gen/document-model.d.ts.map +1 -1
  34. package/dist/src/drive-document-model/gen/document-model.js +1 -1
  35. package/dist/src/drive-document-model/gen/document-model.js.map +1 -1
  36. package/dist/src/drive-document-model/gen/drive/actions.d.ts +12 -2
  37. package/dist/src/drive-document-model/gen/drive/actions.d.ts.map +1 -1
  38. package/dist/src/drive-document-model/gen/drive/creators.d.ts +2 -2
  39. package/dist/src/drive-document-model/gen/drive/creators.d.ts.map +1 -1
  40. package/dist/src/drive-document-model/gen/drive/creators.js +10 -10
  41. package/dist/src/drive-document-model/gen/drive/creators.js.map +1 -1
  42. package/dist/src/drive-document-model/gen/drive/index.d.ts +2 -0
  43. package/dist/src/drive-document-model/gen/drive/index.d.ts.map +1 -0
  44. package/dist/src/drive-document-model/gen/drive/index.js +2 -0
  45. package/dist/src/drive-document-model/gen/drive/index.js.map +1 -0
  46. package/dist/src/drive-document-model/gen/drive/types.d.ts +2 -0
  47. package/dist/src/drive-document-model/gen/drive/types.d.ts.map +1 -0
  48. package/dist/src/drive-document-model/gen/drive/types.js +2 -0
  49. package/dist/src/drive-document-model/gen/drive/types.js.map +1 -0
  50. package/dist/src/drive-document-model/gen/index.d.ts +7 -6
  51. package/dist/src/drive-document-model/gen/index.d.ts.map +1 -1
  52. package/dist/src/drive-document-model/gen/index.js +7 -5
  53. package/dist/src/drive-document-model/gen/index.js.map +1 -1
  54. package/dist/src/drive-document-model/gen/node/actions.d.ts +11 -2
  55. package/dist/src/drive-document-model/gen/node/actions.d.ts.map +1 -1
  56. package/dist/src/drive-document-model/gen/node/creators.d.ts +1 -2
  57. package/dist/src/drive-document-model/gen/node/creators.d.ts.map +1 -1
  58. package/dist/src/drive-document-model/gen/node/creators.js +9 -9
  59. package/dist/src/drive-document-model/gen/node/creators.js.map +1 -1
  60. package/dist/src/drive-document-model/gen/node/index.d.ts +2 -0
  61. package/dist/src/drive-document-model/gen/node/index.d.ts.map +1 -0
  62. package/dist/src/drive-document-model/gen/node/index.js +2 -0
  63. package/dist/src/drive-document-model/gen/node/index.js.map +1 -0
  64. package/dist/src/drive-document-model/gen/node/types.d.ts +2 -0
  65. package/dist/src/drive-document-model/gen/node/types.d.ts.map +1 -0
  66. package/dist/src/drive-document-model/gen/node/types.js +2 -0
  67. package/dist/src/drive-document-model/gen/node/types.js.map +1 -0
  68. package/dist/src/drive-document-model/gen/ph-factories.d.ts +5 -20
  69. package/dist/src/drive-document-model/gen/ph-factories.d.ts.map +1 -1
  70. package/dist/src/drive-document-model/gen/ph-factories.js +1 -13
  71. package/dist/src/drive-document-model/gen/ph-factories.js.map +1 -1
  72. package/dist/src/drive-document-model/gen/reducer.d.ts +3 -3
  73. package/dist/src/drive-document-model/gen/reducer.d.ts.map +1 -1
  74. package/dist/src/drive-document-model/gen/reducer.js +34 -36
  75. package/dist/src/drive-document-model/gen/reducer.js.map +1 -1
  76. package/dist/src/drive-document-model/gen/schema/index.d.ts +2 -2
  77. package/dist/src/drive-document-model/gen/schema/index.d.ts.map +1 -1
  78. package/dist/src/drive-document-model/gen/schema/index.js +2 -2
  79. package/dist/src/drive-document-model/gen/schema/index.js.map +1 -1
  80. package/dist/src/drive-document-model/gen/schema/types.d.ts +8 -3
  81. package/dist/src/drive-document-model/gen/schema/types.d.ts.map +1 -1
  82. package/dist/src/drive-document-model/gen/schema/zod.d.ts +28 -28
  83. package/dist/src/drive-document-model/gen/schema/zod.d.ts.map +1 -1
  84. package/dist/src/drive-document-model/gen/schema/zod.js.map +1 -1
  85. package/dist/src/drive-document-model/gen/types.d.ts +5 -6
  86. package/dist/src/drive-document-model/gen/types.d.ts.map +1 -1
  87. package/dist/src/drive-document-model/gen/types.js +3 -1
  88. package/dist/src/drive-document-model/gen/types.js.map +1 -1
  89. package/dist/src/drive-document-model/gen/utils.d.ts +7 -9
  90. package/dist/src/drive-document-model/gen/utils.d.ts.map +1 -1
  91. package/dist/src/drive-document-model/gen/utils.js +21 -34
  92. package/dist/src/drive-document-model/gen/utils.js.map +1 -1
  93. package/dist/src/drive-document-model/index.d.ts +4 -1
  94. package/dist/src/drive-document-model/index.d.ts.map +1 -1
  95. package/dist/src/drive-document-model/index.js +4 -1
  96. package/dist/src/drive-document-model/index.js.map +1 -1
  97. package/dist/src/drive-document-model/module.d.ts +2 -27
  98. package/dist/src/drive-document-model/module.d.ts.map +1 -1
  99. package/dist/src/drive-document-model/module.js +17 -16
  100. package/dist/src/drive-document-model/module.js.map +1 -1
  101. package/dist/src/drive-document-model/src/index.d.ts +3 -0
  102. package/dist/src/drive-document-model/src/index.d.ts.map +1 -0
  103. package/dist/src/drive-document-model/src/index.js +3 -0
  104. package/dist/src/drive-document-model/src/index.js.map +1 -0
  105. package/dist/src/drive-document-model/src/reducers/drive.d.ts +2 -2
  106. package/dist/src/drive-document-model/src/reducers/drive.d.ts.map +1 -1
  107. package/dist/src/drive-document-model/src/reducers/drive.js +1 -1
  108. package/dist/src/drive-document-model/src/reducers/drive.js.map +1 -1
  109. package/dist/src/drive-document-model/src/reducers/index.d.ts +3 -0
  110. package/dist/src/drive-document-model/src/reducers/index.d.ts.map +1 -0
  111. package/dist/src/drive-document-model/src/reducers/index.js +3 -0
  112. package/dist/src/drive-document-model/src/reducers/index.js.map +1 -0
  113. package/dist/src/drive-document-model/src/reducers/node.d.ts +2 -2
  114. package/dist/src/drive-document-model/src/reducers/node.d.ts.map +1 -1
  115. package/dist/src/drive-document-model/src/reducers/node.js +3 -4
  116. package/dist/src/drive-document-model/src/reducers/node.js.map +1 -1
  117. package/dist/src/drive-document-model/src/tests/actions.test.js +20 -22
  118. package/dist/src/drive-document-model/src/tests/actions.test.js.map +1 -1
  119. package/dist/src/drive-document-model/src/tests/base.test.js +12 -52
  120. package/dist/src/drive-document-model/src/tests/base.test.js.map +1 -1
  121. package/dist/src/drive-document-model/src/tests/document-model.test.js +3 -3
  122. package/dist/src/drive-document-model/src/tests/document-model.test.js.map +1 -1
  123. package/dist/src/drive-document-model/src/tests/drive.test.js +5 -8
  124. package/dist/src/drive-document-model/src/tests/drive.test.js.map +1 -1
  125. package/dist/src/drive-document-model/src/tests/generate-mock.d.ts +2 -1
  126. package/dist/src/drive-document-model/src/tests/generate-mock.d.ts.map +1 -1
  127. package/dist/src/drive-document-model/src/tests/node.test.js +32 -35
  128. package/dist/src/drive-document-model/src/tests/node.test.js.map +1 -1
  129. package/dist/src/drive-document-model/src/tests/test-factories.d.ts +1 -6
  130. package/dist/src/drive-document-model/src/tests/test-factories.d.ts.map +1 -1
  131. package/dist/src/drive-document-model/src/tests/test-factories.js +4 -11
  132. package/dist/src/drive-document-model/src/tests/test-factories.js.map +1 -1
  133. package/dist/src/drive-document-model/src/tests/utils.test.js +1 -1
  134. package/dist/src/drive-document-model/src/tests/utils.test.js.map +1 -1
  135. package/dist/src/drive-document-model/src/types.d.ts +8 -0
  136. package/dist/src/drive-document-model/src/types.d.ts.map +1 -0
  137. package/dist/src/drive-document-model/src/types.js +2 -0
  138. package/dist/src/drive-document-model/src/types.js.map +1 -0
  139. package/dist/src/drive-document-model/src/utils.d.ts +1 -7
  140. package/dist/src/drive-document-model/src/utils.d.ts.map +1 -1
  141. package/dist/src/drive-document-model/src/utils.js.map +1 -1
  142. package/dist/src/drive-document-model/types.d.ts +10 -0
  143. package/dist/src/drive-document-model/types.d.ts.map +1 -0
  144. package/dist/src/drive-document-model/types.js +3 -0
  145. package/dist/src/drive-document-model/types.js.map +1 -0
  146. package/dist/src/processors/index.d.ts +4 -0
  147. package/dist/src/processors/index.d.ts.map +1 -0
  148. package/dist/src/processors/index.js +4 -0
  149. package/dist/src/processors/index.js.map +1 -0
  150. package/dist/src/processors/processor-manager.d.ts +1 -2
  151. package/dist/src/processors/processor-manager.d.ts.map +1 -1
  152. package/dist/src/processors/processor-manager.js +3 -5
  153. package/dist/src/processors/processor-manager.js.map +1 -1
  154. package/dist/src/processors/relational.d.ts +3 -15
  155. package/dist/src/processors/relational.d.ts.map +1 -1
  156. package/dist/src/processors/relational.js +4 -7
  157. package/dist/src/processors/relational.js.map +1 -1
  158. package/dist/src/processors/types.d.ts +16 -7
  159. package/dist/src/processors/types.d.ts.map +1 -1
  160. package/dist/src/processors/utils.d.ts +1 -2
  161. package/dist/src/processors/utils.d.ts.map +1 -1
  162. package/dist/src/processors/utils.js +0 -2
  163. package/dist/src/processors/utils.js.map +1 -1
  164. package/dist/src/queue/base.d.ts +1 -1
  165. package/dist/src/queue/base.d.ts.map +1 -1
  166. package/dist/src/queue/event.d.ts +3 -4
  167. package/dist/src/queue/event.d.ts.map +1 -1
  168. package/dist/src/queue/event.js +2 -5
  169. package/dist/src/queue/event.js.map +1 -1
  170. package/dist/src/queue/index.d.ts +5 -0
  171. package/dist/src/queue/index.d.ts.map +1 -0
  172. package/dist/src/queue/index.js +5 -0
  173. package/dist/src/queue/index.js.map +1 -0
  174. package/dist/src/queue/redis.js +1 -1
  175. package/dist/src/queue/redis.js.map +1 -1
  176. package/dist/src/queue/types.d.ts +1 -4
  177. package/dist/src/queue/types.d.ts.map +1 -1
  178. package/dist/src/queue/types.js +1 -9
  179. package/dist/src/queue/types.js.map +1 -1
  180. package/dist/src/queue/utils.d.ts +5 -0
  181. package/dist/src/queue/utils.d.ts.map +1 -0
  182. package/dist/src/queue/utils.js +10 -0
  183. package/dist/src/queue/utils.js.map +1 -0
  184. package/dist/src/read-mode/index.d.ts +4 -0
  185. package/dist/src/read-mode/index.d.ts.map +1 -0
  186. package/dist/src/read-mode/index.js +4 -0
  187. package/dist/src/read-mode/index.js.map +1 -0
  188. package/dist/src/read-mode/server.d.ts +1 -2
  189. package/dist/src/read-mode/server.d.ts.map +1 -1
  190. package/dist/src/read-mode/server.js +1 -3
  191. package/dist/src/read-mode/server.js.map +1 -1
  192. package/dist/src/read-mode/service.d.ts +2 -3
  193. package/dist/src/read-mode/service.d.ts.map +1 -1
  194. package/dist/src/read-mode/service.js +1 -5
  195. package/dist/src/read-mode/service.js.map +1 -1
  196. package/dist/src/read-mode/types.d.ts +2 -6
  197. package/dist/src/read-mode/types.d.ts.map +1 -1
  198. package/dist/src/server/base-server.d.ts +17 -26
  199. package/dist/src/server/base-server.d.ts.map +1 -1
  200. package/dist/src/server/base-server.js +304 -36
  201. package/dist/src/server/base-server.js.map +1 -1
  202. package/dist/src/server/builder.d.ts +2 -5
  203. package/dist/src/server/builder.d.ts.map +1 -1
  204. package/dist/src/server/builder.js +8 -10
  205. package/dist/src/server/builder.js.map +1 -1
  206. package/dist/src/server/constants.d.ts +3 -0
  207. package/dist/src/server/constants.d.ts.map +1 -1
  208. package/dist/src/server/constants.js +3 -0
  209. package/dist/src/server/constants.js.map +1 -1
  210. package/dist/src/server/error.d.ts +1 -1
  211. package/dist/src/server/error.d.ts.map +1 -1
  212. package/dist/src/server/event-emitter.d.ts +2 -2
  213. package/dist/src/server/event-emitter.d.ts.map +1 -1
  214. package/dist/src/server/event-emitter.js.map +1 -1
  215. package/dist/src/server/index.d.ts +10 -0
  216. package/dist/src/server/index.d.ts.map +1 -0
  217. package/dist/src/server/index.js +10 -0
  218. package/dist/src/server/index.js.map +1 -0
  219. package/dist/src/server/listener/index.d.ts +2 -0
  220. package/dist/src/server/listener/index.d.ts.map +1 -1
  221. package/dist/src/server/listener/index.js +2 -0
  222. package/dist/src/server/listener/index.js.map +1 -1
  223. package/dist/src/server/listener/listener-manager.d.ts +4 -5
  224. package/dist/src/server/listener/listener-manager.d.ts.map +1 -1
  225. package/dist/src/server/listener/listener-manager.js +2 -5
  226. package/dist/src/server/listener/listener-manager.js.map +1 -1
  227. package/dist/src/server/listener/transmitter/factory.d.ts +3 -4
  228. package/dist/src/server/listener/transmitter/factory.d.ts.map +1 -1
  229. package/dist/src/server/listener/transmitter/factory.js +2 -3
  230. package/dist/src/server/listener/transmitter/factory.js.map +1 -1
  231. package/dist/src/server/listener/transmitter/index.d.ts +5 -0
  232. package/dist/src/server/listener/transmitter/index.d.ts.map +1 -0
  233. package/dist/src/server/listener/transmitter/index.js +5 -0
  234. package/dist/src/server/listener/transmitter/index.js.map +1 -0
  235. package/dist/src/server/listener/transmitter/internal.d.ts +3 -22
  236. package/dist/src/server/listener/transmitter/internal.d.ts.map +1 -1
  237. package/dist/src/server/listener/transmitter/internal.js +11 -16
  238. package/dist/src/server/listener/transmitter/internal.js.map +1 -1
  239. package/dist/src/server/listener/transmitter/pull-responder.d.ts +4 -22
  240. package/dist/src/server/listener/transmitter/pull-responder.d.ts.map +1 -1
  241. package/dist/src/server/listener/transmitter/pull-responder.js +3 -7
  242. package/dist/src/server/listener/transmitter/pull-responder.js.map +1 -1
  243. package/dist/src/server/listener/transmitter/switchboard-push.d.ts +1 -2
  244. package/dist/src/server/listener/transmitter/switchboard-push.d.ts.map +1 -1
  245. package/dist/src/server/listener/transmitter/switchboard-push.js +1 -3
  246. package/dist/src/server/listener/transmitter/switchboard-push.js.map +1 -1
  247. package/dist/src/server/listener/transmitter/types.d.ts +32 -2
  248. package/dist/src/server/listener/transmitter/types.d.ts.map +1 -1
  249. package/dist/src/server/listener/types.d.ts +2 -0
  250. package/dist/src/server/listener/types.d.ts.map +1 -0
  251. package/dist/src/server/listener/types.js +2 -0
  252. package/dist/src/server/listener/types.js.map +1 -0
  253. package/dist/src/server/sync-manager.d.ts +4 -7
  254. package/dist/src/server/sync-manager.d.ts.map +1 -1
  255. package/dist/src/server/sync-manager.js +4 -7
  256. package/dist/src/server/sync-manager.js.map +1 -1
  257. package/dist/src/server/sync-unit-map.d.ts +4 -25
  258. package/dist/src/server/sync-unit-map.d.ts.map +1 -1
  259. package/dist/src/server/sync-unit-map.js +0 -1
  260. package/dist/src/server/sync-unit-map.js.map +1 -1
  261. package/dist/src/server/types.d.ts +46 -32
  262. package/dist/src/server/types.d.ts.map +1 -1
  263. package/dist/src/server/types.js +10 -12
  264. package/dist/src/server/types.js.map +1 -1
  265. package/dist/src/server/utils.d.ts +1 -2
  266. package/dist/src/server/utils.d.ts.map +1 -1
  267. package/dist/src/server/utils.js +7 -5
  268. package/dist/src/server/utils.js.map +1 -1
  269. package/dist/src/storage/browser.d.ts +2 -2
  270. package/dist/src/storage/browser.d.ts.map +1 -1
  271. package/dist/src/storage/browser.js +5 -7
  272. package/dist/src/storage/browser.js.map +1 -1
  273. package/dist/src/storage/filesystem.d.ts +3 -3
  274. package/dist/src/storage/filesystem.d.ts.map +1 -1
  275. package/dist/src/storage/filesystem.js +27 -8
  276. package/dist/src/storage/filesystem.js.map +1 -1
  277. package/dist/src/storage/index.d.ts +4 -0
  278. package/dist/src/storage/index.d.ts.map +1 -0
  279. package/dist/src/storage/index.js +4 -0
  280. package/dist/src/storage/index.js.map +1 -0
  281. package/dist/src/storage/ipfs.d.ts +2 -3
  282. package/dist/src/storage/ipfs.d.ts.map +1 -1
  283. package/dist/src/storage/ipfs.js +5 -3
  284. package/dist/src/storage/ipfs.js.map +1 -1
  285. package/dist/src/storage/memory.d.ts +3 -3
  286. package/dist/src/storage/memory.d.ts.map +1 -1
  287. package/dist/src/storage/memory.js +30 -13
  288. package/dist/src/storage/memory.js.map +1 -1
  289. package/dist/src/storage/prisma/client/edge.js +11 -7
  290. package/dist/src/storage/prisma/client/index.js +17 -9
  291. package/dist/src/storage/prisma/client/libquery_engine-darwin-arm64.dylib.node +0 -0
  292. package/dist/src/storage/prisma/client/package.json +1 -1
  293. package/dist/src/storage/prisma/client/schema.prisma +1 -1
  294. package/dist/src/storage/prisma/factory.d.ts +3 -2
  295. package/dist/src/storage/prisma/factory.d.ts.map +1 -1
  296. package/dist/src/storage/prisma/factory.js +6 -2
  297. package/dist/src/storage/prisma/factory.js.map +1 -1
  298. package/dist/src/storage/prisma/prisma.d.ts +4 -5
  299. package/dist/src/storage/prisma/prisma.d.ts.map +1 -1
  300. package/dist/src/storage/prisma/prisma.js +27 -20
  301. package/dist/src/storage/prisma/prisma.js.map +1 -1
  302. package/dist/src/storage/types.d.ts +1 -2
  303. package/dist/src/storage/types.d.ts.map +1 -1
  304. package/dist/src/storage/utils.d.ts +1 -1
  305. package/dist/src/storage/utils.d.ts.map +1 -1
  306. package/dist/src/utils/default-drives-manager.d.ts +1 -12
  307. package/dist/src/utils/default-drives-manager.d.ts.map +1 -1
  308. package/dist/src/utils/default-drives-manager.js +1 -2
  309. package/dist/src/utils/default-drives-manager.js.map +1 -1
  310. package/dist/src/utils/gql-transformations.d.ts +13 -5
  311. package/dist/src/utils/gql-transformations.d.ts.map +1 -1
  312. package/dist/src/utils/gql-transformations.js +10 -3
  313. package/dist/src/utils/gql-transformations.js.map +1 -1
  314. package/dist/src/utils/graphql.d.ts +4 -30
  315. package/dist/src/utils/graphql.d.ts.map +1 -1
  316. package/dist/src/utils/graphql.js +3 -4
  317. package/dist/src/utils/graphql.js.map +1 -1
  318. package/dist/src/utils/index.d.ts +8 -0
  319. package/dist/src/utils/index.d.ts.map +1 -0
  320. package/dist/src/utils/index.js +8 -0
  321. package/dist/src/utils/index.js.map +1 -0
  322. package/dist/src/utils/logger.d.ts +2 -8
  323. package/dist/src/utils/logger.d.ts.map +1 -1
  324. package/dist/src/utils/logger.js +6 -7
  325. package/dist/src/utils/logger.js.map +1 -1
  326. package/dist/src/utils/migrations.d.ts +1 -1
  327. package/dist/src/utils/migrations.d.ts.map +1 -1
  328. package/dist/src/utils/migrations.js +7 -2
  329. package/dist/src/utils/migrations.js.map +1 -1
  330. package/dist/src/utils/misc.d.ts +2 -6
  331. package/dist/src/utils/misc.d.ts.map +1 -1
  332. package/dist/src/utils/misc.js +3 -6
  333. package/dist/src/utils/misc.js.map +1 -1
  334. package/dist/src/utils/run-asap.d.ts +7 -11
  335. package/dist/src/utils/run-asap.d.ts.map +1 -1
  336. package/dist/src/utils/run-asap.js +110 -122
  337. package/dist/src/utils/run-asap.js.map +1 -1
  338. package/dist/src/utils/types.d.ts +50 -0
  339. package/dist/src/utils/types.d.ts.map +1 -0
  340. package/dist/src/utils/types.js +2 -0
  341. package/dist/src/utils/types.js.map +1 -0
  342. package/dist/test/benchmarks/getDrive.json +10 -0
  343. package/dist/test/benchmarks/processOperations.bench.d.ts +2 -0
  344. package/dist/test/benchmarks/processOperations.bench.d.ts.map +1 -0
  345. package/dist/test/benchmarks/processOperations.bench.js +148 -0
  346. package/dist/test/benchmarks/processOperations.bench.js.map +1 -0
  347. package/dist/test/benchmarks/queue.bench.d.ts +2 -0
  348. package/dist/test/benchmarks/queue.bench.d.ts.map +1 -0
  349. package/dist/test/benchmarks/queue.bench.js +51 -0
  350. package/dist/test/benchmarks/queue.bench.js.map +1 -0
  351. package/dist/test/benchmarks/strands.small.json +37085 -0
  352. package/dist/test/cache.test.d.ts +2 -0
  353. package/dist/test/cache.test.d.ts.map +1 -0
  354. package/dist/test/cache.test.js +275 -0
  355. package/dist/test/cache.test.js.map +1 -0
  356. package/dist/test/default-remote-drives.test.d.ts +2 -0
  357. package/dist/test/default-remote-drives.test.d.ts.map +1 -0
  358. package/dist/test/default-remote-drives.test.js +445 -0
  359. package/dist/test/default-remote-drives.test.js.map +1 -0
  360. package/dist/test/drive-operations.test.d.ts +2 -0
  361. package/dist/test/drive-operations.test.d.ts.map +1 -0
  362. package/dist/test/drive-operations.test.js +134 -0
  363. package/dist/test/drive-operations.test.js.map +1 -0
  364. package/dist/test/dual-action-create.test.d.ts +2 -0
  365. package/dist/test/dual-action-create.test.d.ts.map +1 -0
  366. package/dist/test/dual-action-create.test.js +187 -0
  367. package/dist/test/dual-action-create.test.js.map +1 -0
  368. package/dist/test/dual-action-migration.test.d.ts +2 -0
  369. package/dist/test/dual-action-migration.test.d.ts.map +1 -0
  370. package/dist/test/dual-action-migration.test.js +344 -0
  371. package/dist/test/dual-action-migration.test.js.map +1 -0
  372. package/dist/test/graphql.test.d.ts +2 -0
  373. package/dist/test/graphql.test.d.ts.map +1 -0
  374. package/dist/test/graphql.test.js +9 -0
  375. package/dist/test/graphql.test.js.map +1 -0
  376. package/dist/test/index.d.ts +2 -0
  377. package/dist/test/index.d.ts.map +1 -0
  378. package/dist/test/index.js +2 -0
  379. package/dist/test/index.js.map +1 -0
  380. package/dist/test/internal-listener.test.d.ts +2 -0
  381. package/dist/test/internal-listener.test.d.ts.map +1 -0
  382. package/dist/test/internal-listener.test.js +243 -0
  383. package/dist/test/internal-listener.test.js.map +1 -0
  384. package/dist/test/queue.test.d.ts +2 -0
  385. package/dist/test/queue.test.d.ts.map +1 -0
  386. package/dist/test/queue.test.js +324 -0
  387. package/dist/test/queue.test.js.map +1 -0
  388. package/dist/test/reactor.test.d.ts +2 -0
  389. package/dist/test/reactor.test.d.ts.map +1 -0
  390. package/dist/test/reactor.test.js +32 -0
  391. package/dist/test/reactor.test.js.map +1 -0
  392. package/dist/test/read-mode.test.d.ts +2 -0
  393. package/dist/test/read-mode.test.d.ts.map +1 -0
  394. package/dist/test/read-mode.test.js +569 -0
  395. package/dist/test/read-mode.test.js.map +1 -0
  396. package/dist/test/server/driveOperationsConflictResolution.test.d.ts +2 -0
  397. package/dist/test/server/driveOperationsConflictResolution.test.d.ts.map +1 -0
  398. package/dist/test/server/driveOperationsConflictResolution.test.js +486 -0
  399. package/dist/test/server/driveOperationsConflictResolution.test.js.map +1 -0
  400. package/dist/test/server/mergeOperations.test.d.ts +2 -0
  401. package/dist/test/server/mergeOperations.test.d.ts.map +1 -0
  402. package/dist/test/server/mergeOperations.test.js +115 -0
  403. package/dist/test/server/mergeOperations.test.js.map +1 -0
  404. package/dist/test/server/processOperations.test.d.ts +2 -0
  405. package/dist/test/server/processOperations.test.d.ts.map +1 -0
  406. package/dist/test/server/processOperations.test.js +392 -0
  407. package/dist/test/server/processOperations.test.js.map +1 -0
  408. package/dist/test/server.test.d.ts +2 -0
  409. package/dist/test/server.test.d.ts.map +1 -0
  410. package/dist/test/server.test.js +957 -0
  411. package/dist/test/server.test.js.map +1 -0
  412. package/dist/test/signature-migration.test.d.ts +2 -0
  413. package/dist/test/signature-migration.test.d.ts.map +1 -0
  414. package/dist/test/signature-migration.test.js +241 -0
  415. package/dist/test/signature-migration.test.js.map +1 -0
  416. package/dist/test/storage.test.d.ts +2 -0
  417. package/dist/test/storage.test.d.ts.map +1 -0
  418. package/dist/test/storage.test.js +522 -0
  419. package/dist/test/storage.test.js.map +1 -0
  420. package/dist/test/switchboard-push-listener.test.d.ts +2 -0
  421. package/dist/test/switchboard-push-listener.test.d.ts.map +1 -0
  422. package/dist/test/switchboard-push-listener.test.js +133 -0
  423. package/dist/test/switchboard-push-listener.test.js.map +1 -0
  424. package/dist/test/sync-manager.test.d.ts +2 -0
  425. package/dist/test/sync-manager.test.d.ts.map +1 -0
  426. package/dist/test/sync-manager.test.js +349 -0
  427. package/dist/test/sync-manager.test.js.map +1 -0
  428. package/dist/test/utils.d.ts +62 -0
  429. package/dist/test/utils.d.ts.map +1 -0
  430. package/dist/test/utils.js +158 -0
  431. package/dist/test/utils.js.map +1 -0
  432. package/dist/test/utils.test.d.ts +2 -0
  433. package/dist/test/utils.test.d.ts.map +1 -0
  434. package/dist/test/utils.test.js +86 -0
  435. package/dist/test/utils.test.js.map +1 -0
  436. package/dist/test/vitest-setup.d.ts +2 -0
  437. package/dist/test/vitest-setup.d.ts.map +1 -0
  438. package/dist/test/vitest-setup.js +5 -0
  439. package/dist/test/vitest-setup.js.map +1 -0
  440. package/dist/tsconfig.tsbuildinfo +1 -0
  441. package/dist/vitest.config.d.ts +3 -0
  442. package/dist/vitest.config.d.ts.map +1 -0
  443. package/dist/vitest.config.js +28 -0
  444. package/dist/vitest.config.js.map +1 -0
  445. package/package.json +38 -26
  446. package/prisma/schema.prisma +93 -0
  447. package/src/storage/prisma/client/default.d.ts +1 -0
  448. package/src/storage/prisma/client/default.js +1 -0
  449. package/src/storage/prisma/client/edge.d.ts +1 -0
  450. package/src/storage/prisma/client/edge.js +263 -0
  451. package/src/storage/prisma/client/index-browser.js +246 -0
  452. package/src/storage/prisma/client/index.d.ts +10318 -0
  453. package/src/storage/prisma/client/index.js +292 -0
  454. package/src/storage/prisma/client/libquery_engine-darwin-arm64.dylib.node +0 -0
  455. package/src/storage/prisma/client/libquery_engine-debian-openssl-3.0.x.so.node +0 -0
  456. package/src/storage/prisma/client/libquery_engine-linux-musl.so.node +0 -0
  457. package/src/storage/prisma/client/package.json +84 -0
  458. package/src/storage/prisma/client/runtime/edge-esm.js +31 -0
  459. package/src/storage/prisma/client/runtime/edge.js +31 -0
  460. package/src/storage/prisma/client/runtime/index-browser.d.ts +365 -0
  461. package/src/storage/prisma/client/runtime/index-browser.js +13 -0
  462. package/src/storage/prisma/client/runtime/library.d.ts +3273 -0
  463. package/src/storage/prisma/client/runtime/library.js +143 -0
  464. package/src/storage/prisma/client/runtime/react-native.js +80 -0
  465. package/src/storage/prisma/client/runtime/wasm.js +32 -0
  466. package/src/storage/prisma/client/schema.prisma +93 -0
  467. package/src/storage/prisma/client/wasm.d.ts +1 -0
  468. package/src/storage/prisma/client/wasm.js +246 -0
  469. package/dist/src/drive-document-model/gen/actions.d.ts +0 -6
  470. package/dist/src/drive-document-model/gen/actions.d.ts.map +0 -1
  471. package/dist/src/drive-document-model/gen/actions.js +0 -3
  472. package/dist/src/drive-document-model/gen/actions.js.map +0 -1
  473. package/dist/src/drive-document-model/gen/drive/object.d.ts +0 -14
  474. package/dist/src/drive-document-model/gen/drive/object.d.ts.map +0 -1
  475. package/dist/src/drive-document-model/gen/drive/object.js +0 -29
  476. package/dist/src/drive-document-model/gen/drive/object.js.map +0 -1
  477. package/dist/src/drive-document-model/gen/drive/operations.d.ts +0 -14
  478. package/dist/src/drive-document-model/gen/drive/operations.d.ts.map +0 -1
  479. package/dist/src/drive-document-model/gen/drive/operations.js +0 -2
  480. package/dist/src/drive-document-model/gen/drive/operations.js.map +0 -1
  481. package/dist/src/drive-document-model/gen/node/object.d.ts +0 -13
  482. package/dist/src/drive-document-model/gen/node/object.d.ts.map +0 -1
  483. package/dist/src/drive-document-model/gen/node/object.js +0 -26
  484. package/dist/src/drive-document-model/gen/node/object.js.map +0 -1
  485. package/dist/src/drive-document-model/gen/node/operations.d.ts +0 -13
  486. package/dist/src/drive-document-model/gen/node/operations.d.ts.map +0 -1
  487. package/dist/src/drive-document-model/gen/node/operations.js +0 -2
  488. package/dist/src/drive-document-model/gen/node/operations.js.map +0 -1
  489. package/dist/src/drive-document-model/gen/object.d.ts +0 -17
  490. package/dist/src/drive-document-model/gen/object.d.ts.map +0 -1
  491. package/dist/src/drive-document-model/gen/object.js +0 -28
  492. package/dist/src/drive-document-model/gen/object.js.map +0 -1
  493. package/dist/tsconfig.lib.tsbuildinfo +0 -1
@@ -1,19 +1,8 @@
1
- import { removeListener, removeTrigger, setSharingType, } from "#drive-document-model/gen/creators";
2
- import { createDocumentDriveDocument } from "#drive-document-model/gen/ph-factories";
3
- import { isActionJob, isDocumentJob, isOperationJob, } from "#queue/types";
4
- import { ReadModeServer } from "#read-mode/server";
5
- import { DefaultDrivesManager, } from "#utils/default-drives-manager";
6
- import { requestPublicDriveWithTokenFromReactor } from "#utils/graphql";
7
- import { isDocumentDrive, runAsapAsync } from "#utils/misc";
8
- import { RunAsap } from "#utils/run-asap";
9
- import { DocumentAlreadyExistsError, childLogger, } from "document-drive";
10
- import { attachBranch, createPresignedHeader, garbageCollect, garbageCollectDocumentOperations, groupOperationsByScope, merge, precedes, removeExistingOperations, replayDocument, reshuffleByTimestamp, skipHeaderOperations, sortOperations, validateHeader, } from "document-model";
1
+ import { ConflictOperationError, DefaultDrivesManager, DefaultListenerManagerOptions, DocumentAlreadyExistsError, OperationError, PullResponderTransmitter, ReadModeServer, SwitchboardPushTransmitter, childLogger, driveCreateDocument, driveCreateState, filterOperationsByRevision, isActionJob, isAtRevision, isDocumentDrive, isDocumentJob, isOperationJob, removeListener, removeTrigger, requestPublicDriveWithTokenFromReactor, resolveCreateDocumentInput, setSharingType, } from "document-drive";
2
+ import { runAsap, runAsapAsync } from "document-drive/run-asap";
3
+ import {} from "document-model";
4
+ import { attachBranch, createPresignedHeader, defaultBaseState, garbageCollect, garbageCollectDocumentOperations, groupOperationsByScope, hashDocumentStateForScope, merge, precedes, removeExistingOperations, replayDocument, reshuffleByTimestamp, skipHeaderOperations, sortOperations, validateHeader, } from "document-model/core";
11
5
  import { ClientError } from "graphql-request";
12
- import { ConflictOperationError, OperationError, } from "./error.js";
13
- import { PullResponderTransmitter, } from "./listener/transmitter/pull-responder.js";
14
- import { SwitchboardPushTransmitter } from "./listener/transmitter/switchboard-push.js";
15
- import { DefaultListenerManagerOptions, } from "./types.js";
16
- import { filterOperationsByRevision, isAtRevision, resolveCreateDocumentInput, } from "./utils.js";
17
6
  export class BaseDocumentDriveServer {
18
7
  logger = childLogger(["BaseDocumentDriveServer"]);
19
8
  // external dependencies
@@ -96,6 +85,7 @@ export class BaseDocumentDriveServer {
96
85
  // internal state
97
86
  triggerMap = new Map();
98
87
  initializePromise;
88
+ enableDualActionCreate;
99
89
  constructor(documentModelModules, storage, documentStorage, cache, queueManager, eventEmitter, synchronizationManager, listenerManager, options) {
100
90
  this.documentModelModules = documentModelModules;
101
91
  this.legacyStorage = storage;
@@ -118,9 +108,17 @@ export class BaseDocumentDriveServer {
118
108
  ? () => Promise.resolve("")
119
109
  : options.jwtHandler,
120
110
  taskQueueMethod: options?.taskQueueMethod === undefined
121
- ? RunAsap.runAsap
111
+ ? runAsap
122
112
  : options.taskQueueMethod,
113
+ featureFlags: {
114
+ ...options?.featureFlags,
115
+ },
123
116
  };
117
+ this.enableDualActionCreate =
118
+ options?.featureFlags?.enableDualActionCreate ?? false;
119
+ if (this.enableDualActionCreate) {
120
+ this.logger.warn("Dual action create is enabled.");
121
+ }
124
122
  // todo: move to external dependencies
125
123
  this.defaultDrivesManager = new DefaultDrivesManager(this, this.defaultDrivesManagerDelegate, options);
126
124
  this.initializePromise = this._initialize();
@@ -137,7 +135,7 @@ export class BaseDocumentDriveServer {
137
135
  await this.listenerManager.initialize(this.handleListenerError.bind(this));
138
136
  await this.queueManager.init(this.queueDelegate, (error) => {
139
137
  this.logger.error(`Error initializing queue manager`, error);
140
- errors.push(error);
138
+ // errors.push(error);
141
139
  });
142
140
  try {
143
141
  await this.defaultDrivesManager.removeOldremoteDrives();
@@ -329,7 +327,7 @@ export class BaseDocumentDriveServer {
329
327
  }
330
328
  }
331
329
  getDocumentModelModule(documentType) {
332
- const documentModelModule = this.documentModelModules.find((module) => module.documentModel.id === documentType);
330
+ const documentModelModule = this.documentModelModules.find((module) => module.documentModel.global.id === documentType);
333
331
  if (!documentModelModule) {
334
332
  throw new Error(`Document type ${documentType} not supported`);
335
333
  }
@@ -346,9 +344,19 @@ export class BaseDocumentDriveServer {
346
344
  }
347
345
  async addDrive(input, preferredEditor) {
348
346
  // Create document with custom global and local state
349
- const document = createDocumentDriveDocument({
350
- global: input.global,
351
- local: input.local,
347
+ const { global } = driveCreateState();
348
+ const document = driveCreateDocument({
349
+ global: {
350
+ ...global,
351
+ name: input.global.name ?? global.name,
352
+ icon: input.global.icon ?? global.icon,
353
+ },
354
+ local: {
355
+ availableOffline: input.local?.availableOffline ?? false,
356
+ sharingType: input.local?.sharingType ?? "public",
357
+ listeners: input.local?.listeners ?? [],
358
+ triggers: input.local?.triggers ?? [],
359
+ },
352
360
  });
353
361
  if (input.id && input.id.length > 0) {
354
362
  document.header.id = input.id;
@@ -546,6 +554,14 @@ export class BaseDocumentDriveServer {
546
554
  }
547
555
  }
548
556
  async createDocument(input, source, meta) {
557
+ if (this.enableDualActionCreate) {
558
+ return this.createDocumentDualAction(input, source, meta);
559
+ }
560
+ else {
561
+ return this.createDocumentLegacy(input, source, meta);
562
+ }
563
+ }
564
+ async createDocumentLegacy(input, source, meta) {
549
565
  const { documentType, document: inputDocument } = resolveCreateDocumentInput(input);
550
566
  // if a document was provided then checks if it's valid
551
567
  let state = undefined;
@@ -608,11 +624,9 @@ export class BaseDocumentDriveServer {
608
624
  // stores document information
609
625
  const documentStorage = {
610
626
  header,
611
- history: document.history,
612
627
  operations: { global: [], local: [] },
613
628
  initialState: document.initialState,
614
629
  clipboard: [],
615
- attachments: document.attachments,
616
630
  state: state ?? document.state,
617
631
  };
618
632
  await this.documentStorage.create(documentStorage);
@@ -647,6 +661,180 @@ export class BaseDocumentDriveServer {
647
661
  }
648
662
  return await this.getDocument(documentStorage.header.id);
649
663
  }
664
+ async createDocumentDualAction(input, source, meta) {
665
+ const { documentType, document: inputDocument } = resolveCreateDocumentInput(input);
666
+ // if a document was provided then checks if it's valid
667
+ let state = undefined;
668
+ if (inputDocument) {
669
+ if ("documentType" in input &&
670
+ documentType !== inputDocument.header.documentType) {
671
+ throw new Error(`Provided document is not ${documentType}`);
672
+ }
673
+ const doc = this._buildDocument(inputDocument);
674
+ state = doc.state;
675
+ }
676
+ // if no document was provided then create a new one
677
+ const document = inputDocument ??
678
+ this.getDocumentModelModule(documentType).utils.createDocument(state);
679
+ // get the header
680
+ let header;
681
+ // handle the legacy case where an id is provided
682
+ let isSigned = false;
683
+ if ("id" in input && input.id) {
684
+ if (inputDocument) {
685
+ header = document.header;
686
+ document.header.id = input.id;
687
+ this.logger.warn("Assigning an id to a document is deprecated. Use the header field instead.");
688
+ }
689
+ else {
690
+ this.logger.warn("Creating a document with an id is deprecated. Use the header field instead.");
691
+ header = createPresignedHeader(input.id, documentType);
692
+ }
693
+ }
694
+ else if ("header" in input) {
695
+ // validate the header passed in
696
+ await validateHeader(input.header);
697
+ isSigned = true;
698
+ header = input.header;
699
+ }
700
+ else if (inputDocument?.header) {
701
+ if (!inputDocument.header.id) {
702
+ throw new Error("Document header id is required");
703
+ }
704
+ if (!inputDocument.header.documentType) {
705
+ throw new Error("Document header documentType is required");
706
+ }
707
+ if (!inputDocument.header.createdAtUtcIso) {
708
+ throw new Error("Document header createdAtUtcIso is required");
709
+ }
710
+ if (!inputDocument.header.sig.nonce) {
711
+ this.logger.warn("Creating a document with an unsigned id is deprecated. Use createSignedHeaderForSigner.");
712
+ // throw new Error("Document header sig nonce is required"); TODO: uncomment when ready to enforce signed documents
713
+ }
714
+ else {
715
+ await validateHeader(inputDocument.header);
716
+ isSigned = true;
717
+ }
718
+ header = inputDocument.header;
719
+ }
720
+ else {
721
+ // otherwise, generate a header
722
+ header = createPresignedHeader(undefined, documentType);
723
+ isSigned = false;
724
+ }
725
+ if (meta) {
726
+ header.meta = { ...header.meta, ...meta };
727
+ }
728
+ const currentVersion = "0.1.0";
729
+ // Get initial state from input or model's defaultState
730
+ const initialState = state ?? document.state;
731
+ // Check if the input document already has operations
732
+ const existingOperations = Object.values(document.operations).flat();
733
+ const shouldCreateOperations = existingOperations.length === 0;
734
+ let operations = [];
735
+ if (shouldCreateOperations) {
736
+ const timestampUtcMs = new Date().toISOString();
737
+ // Determine if this is a signed document
738
+ const signing = isSigned
739
+ ? {
740
+ signature: header.id, // The document ID is the signature
741
+ publicKey: header.sig.publicKey,
742
+ nonce: header.sig.nonce,
743
+ createdAtUtcIso: header.createdAtUtcIso,
744
+ documentType: header.documentType,
745
+ }
746
+ : undefined;
747
+ // Create actions for CREATE_DOCUMENT and UPGRADE_DOCUMENT
748
+ const createDocumentInput = {
749
+ model: documentType,
750
+ version: "0.0.0",
751
+ documentId: header.id,
752
+ signing,
753
+ };
754
+ const createDocumentAction = {
755
+ id: `${header.id}-create`,
756
+ type: "CREATE_DOCUMENT",
757
+ timestampUtcMs,
758
+ input: createDocumentInput,
759
+ scope: "document",
760
+ };
761
+ const upgradeDocumentInput = {
762
+ model: documentType,
763
+ fromVersion: "0.0.0",
764
+ toVersion: currentVersion,
765
+ documentId: header.id,
766
+ initialState,
767
+ };
768
+ const upgradeDocumentAction = {
769
+ id: `${header.id}-upgrade`,
770
+ type: "UPGRADE_DOCUMENT",
771
+ timestampUtcMs,
772
+ input: upgradeDocumentInput,
773
+ scope: "document",
774
+ };
775
+ // we need to create hashes for later verification
776
+ const baseState = defaultBaseState();
777
+ const createStateForHash = {
778
+ state: baseState,
779
+ };
780
+ const createHash = hashDocumentStateForScope(createStateForHash, "document");
781
+ const upgradeStateForHash = {
782
+ state: initialState,
783
+ };
784
+ const upgradeHash = hashDocumentStateForScope(upgradeStateForHash, "document");
785
+ // Create operations from actions with computed hashes
786
+ operations = [
787
+ {
788
+ index: 0,
789
+ skip: 0,
790
+ hash: createHash,
791
+ timestampUtcMs,
792
+ action: createDocumentAction,
793
+ },
794
+ {
795
+ index: 1,
796
+ skip: 0,
797
+ hash: upgradeHash,
798
+ timestampUtcMs,
799
+ action: upgradeDocumentAction,
800
+ },
801
+ ];
802
+ }
803
+ else {
804
+ // Use existing operations from the input document
805
+ operations = existingOperations;
806
+ }
807
+ // Group operations by scope before storing
808
+ const groupedOps = groupOperationsByScope(operations);
809
+ // Ensure backward compatibility by initializing missing scopes
810
+ if (!groupedOps.header) {
811
+ groupedOps.header = [];
812
+ }
813
+ if (!groupedOps.document) {
814
+ groupedOps.document = [];
815
+ }
816
+ if (!groupedOps.global) {
817
+ groupedOps.global = [];
818
+ }
819
+ if (!groupedOps.local) {
820
+ groupedOps.local = [];
821
+ }
822
+ // After initialization, it's safe to treat as DocumentOperations
823
+ const operationsByScope = groupedOps;
824
+ // stores document information with operations
825
+ const documentToStore = {
826
+ header,
827
+ operations: operationsByScope,
828
+ initialState,
829
+ clipboard: [],
830
+ state: initialState,
831
+ };
832
+ await this.documentStorage.create(documentToStore);
833
+ // Force rebuild to ensure operations are properly merged
834
+ return await this.getDocument(documentToStore.header.id, {
835
+ checkHashes: true,
836
+ });
837
+ }
650
838
  async deleteDocument(documentId) {
651
839
  try {
652
840
  const syncUnits = await this.synchronizationManager.getSynchronizationUnitsIds(undefined, [documentId]);
@@ -675,7 +863,7 @@ export class BaseDocumentDriveServer {
675
863
  let error; // TODO: replace with an array of errors/consistency issues
676
864
  const operationsByScope = groupOperationsByScope(operations);
677
865
  for (const scope of Object.keys(operationsByScope)) {
678
- const storageDocumentOperations = documentStorage.operations[scope];
866
+ const storageDocumentOperations = documentStorage.operations[scope] || [];
679
867
  // TODO two equal operations done by two clients will be considered the same, ie: { type: "INCREMENT" }
680
868
  const branch = removeExistingOperations(operationsByScope[scope] || [], storageDocumentOperations);
681
869
  // No operations to apply
@@ -735,7 +923,11 @@ export class BaseDocumentDriveServer {
735
923
  : document.operations;
736
924
  const documentOperations = garbageCollectDocumentOperations(operations);
737
925
  for (const scope of Object.keys(documentOperations)) {
738
- const lastRemainingOperation = documentOperations[scope].at(-1);
926
+ const scopeOps = documentOperations[scope];
927
+ if (!scopeOps) {
928
+ continue;
929
+ }
930
+ const lastRemainingOperation = scopeOps.at(-1);
739
931
  // if the latest operation doesn't have a resulting state then tries
740
932
  // to retrieve it from the db to avoid rerunning all the operations
741
933
  if (lastRemainingOperation && !lastRemainingOperation.resultingState) {
@@ -760,22 +952,74 @@ export class BaseDocumentDriveServer {
760
952
  ? filterOperationsByRevision(documentStorage.operations, options.revisions)
761
953
  : documentStorage.operations;
762
954
  const operations = garbageCollectDocumentOperations(revisionOperations);
763
- return replayDocument(documentStorage.initialState, operations, documentModelModule.reducer, undefined, documentStorage.header, undefined, {
955
+ // Get all scopes from operations
956
+ const allScopes = Object.keys(operations);
957
+ // Initialize with all scopes found in operations, plus global and local for backward compatibility
958
+ const scopesToInitialize = new Set([...allScopes, "global", "local"]);
959
+ const headerOperations = {};
960
+ const operationsToReplay = {};
961
+ for (const scope of scopesToInitialize) {
962
+ headerOperations[scope] = [];
963
+ operationsToReplay[scope] = [];
964
+ }
965
+ // Filter out CREATE_DOCUMENT and UPGRADE_DOCUMENT operations
966
+ // (these don't currently have reducers and should not be replayed)
967
+ for (const [scope, scopeOps] of Object.entries(operations)) {
968
+ if (!scopeOps) {
969
+ continue;
970
+ }
971
+ for (const op of scopeOps) {
972
+ if (op.action.type === "CREATE_DOCUMENT" ||
973
+ op.action.type === "UPGRADE_DOCUMENT") {
974
+ const headerOps = headerOperations[scope];
975
+ if (headerOps) {
976
+ headerOps.push(op);
977
+ }
978
+ }
979
+ else {
980
+ const replayOps = operationsToReplay[scope];
981
+ if (replayOps) {
982
+ replayOps.push(op);
983
+ }
984
+ }
985
+ }
986
+ }
987
+ const replayed = replayDocument(documentStorage.initialState, operationsToReplay, documentModelModule.reducer, undefined, documentStorage.header, undefined, {
764
988
  ...options,
765
989
  checkHashes: options?.checkHashes ?? true,
766
990
  reuseOperationResultingState: options?.checkHashes ?? true,
767
991
  });
992
+ // merge header operations back into the result
993
+ // Include ALL scopes from input operations, header operations, and replayed operations
994
+ const allScopesForMerge = new Set([
995
+ ...Object.keys(operations), // From input storage
996
+ ...Object.keys(headerOperations),
997
+ ...Object.keys(replayed.operations),
998
+ ]);
999
+ const finalOperations = {};
1000
+ for (const scope of allScopesForMerge) {
1001
+ finalOperations[scope] = [
1002
+ ...(headerOperations[scope] || []),
1003
+ ...(replayed.operations[scope] || []),
1004
+ ];
1005
+ }
1006
+ return {
1007
+ ...replayed,
1008
+ operations: finalOperations,
1009
+ };
768
1010
  }
769
1011
  async _performOperation(documentId, document, operation, skipHashValidation = false) {
770
1012
  const documentModelModule = this.getDocumentModelModule(document.header.documentType);
771
1013
  const signalResults = [];
772
1014
  let newDocument = document;
773
1015
  const scope = operation.action.scope;
1016
+ const currentScopeOperations = document.operations[scope] || [];
774
1017
  const documentOperations = garbageCollectDocumentOperations({
775
1018
  ...document.operations,
776
- [scope]: skipHeaderOperations(document.operations[scope], operation),
1019
+ [scope]: skipHeaderOperations(currentScopeOperations, operation),
777
1020
  });
778
- const lastRemainingOperation = documentOperations[scope].at(-1);
1021
+ const remainingScopeOps = documentOperations[scope];
1022
+ const lastRemainingOperation = remainingScopeOps?.at(-1);
779
1023
  // if the latest operation doesn't have a resulting state then tries
780
1024
  // to retrieve it from the db to avoid rerunning all the operations
781
1025
  if (lastRemainingOperation && !lastRemainingOperation.resultingState) {
@@ -805,7 +1049,11 @@ export class BaseDocumentDriveServer {
805
1049
  reuseOperationResultingState: true,
806
1050
  replayOptions: { operation },
807
1051
  });
808
- const appliedOperations = newDocument.operations[operation.action.scope].filter((op) => op.index == operation.index && op.skip == operation.skip);
1052
+ const newDocScopeOperations = newDocument.operations[operation.action.scope];
1053
+ if (!newDocScopeOperations) {
1054
+ throw new OperationError("ERROR", operation, `No operations found for scope: ${operation.action.scope}`);
1055
+ }
1056
+ const appliedOperations = newDocScopeOperations.filter((op) => op.index == operation.index && op.skip == operation.skip);
809
1057
  const appliedOperation = appliedOperations.at(0);
810
1058
  if (!appliedOperation) {
811
1059
  throw new OperationError("ERROR", operation, `Operation with index ${operation.index}:${operation.skip} was not applied.`);
@@ -924,11 +1172,19 @@ export class BaseDocumentDriveServer {
924
1172
  async resultIfExistingOperations(id, operations) {
925
1173
  try {
926
1174
  const document = await this.getDocument(id);
927
- const newOperation = operations.find((op) => !op.id ||
928
- !document.operations[op.action.scope].find((existingOp) => existingOp.id === op.id &&
1175
+ const newOperation = operations.find((op) => {
1176
+ if (!op.id) {
1177
+ return true;
1178
+ }
1179
+ const scopeOps = document.operations[op.action.scope];
1180
+ if (!scopeOps) {
1181
+ return true;
1182
+ }
1183
+ return !scopeOps.find((existingOp) => existingOp.id === op.id &&
929
1184
  existingOp.index === op.index &&
930
1185
  existingOp.action.type === op.action.type &&
931
- existingOp.hash === op.hash));
1186
+ existingOp.hash === op.hash);
1187
+ });
932
1188
  if (!newOperation) {
933
1189
  return {
934
1190
  status: "SUCCESS",
@@ -1280,11 +1536,19 @@ export class BaseDocumentDriveServer {
1280
1536
  async resultIfExistingDriveOperations(driveId, operations) {
1281
1537
  try {
1282
1538
  const drive = await this.getDrive(driveId);
1283
- const newOperation = operations.find((op) => !op.id ||
1284
- !drive.operations[op.action.scope].find((existingOp) => existingOp.id === op.id &&
1539
+ const newOperation = operations.find((op) => {
1540
+ if (!op.id) {
1541
+ return true;
1542
+ }
1543
+ const scopeOps = drive.operations[op.action.scope];
1544
+ if (!scopeOps) {
1545
+ return true;
1546
+ }
1547
+ return !scopeOps.find((existingOp) => existingOp.id === op.id &&
1285
1548
  existingOp.index === op.index &&
1286
1549
  existingOp.action.type === op.action.type &&
1287
- existingOp.hash === op.hash));
1550
+ existingOp.hash === op.hash);
1551
+ });
1288
1552
  if (!newOperation) {
1289
1553
  return {
1290
1554
  status: "SUCCESS",
@@ -1457,7 +1721,11 @@ export class BaseDocumentDriveServer {
1457
1721
  const { reducer } = this.getDocumentModelModule(documentId.header.documentType);
1458
1722
  for (const action of actions) {
1459
1723
  documentId = reducer(documentId, action);
1460
- const operation = documentId.operations[action.scope].slice().pop();
1724
+ const scopeOps = documentId.operations[action.scope];
1725
+ if (!scopeOps) {
1726
+ throw new Error(`No operations found for scope: ${action.scope}`);
1727
+ }
1728
+ const operation = scopeOps.slice().pop();
1461
1729
  if (!operation) {
1462
1730
  throw new Error("Error creating operations");
1463
1731
  }