document-drive 4.1.0-dev.8 → 4.1.0-dev.80

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