document-drive 4.1.0-dev.1 → 4.1.0-dev.100

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 (512) 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 +44 -10
  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 +39 -9
  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 +36 -37
  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 +11 -9
  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 -108
  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 +5 -6
  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 -9
  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 +9 -11
  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 +5 -7
  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 +21 -29
  202. package/dist/src/server/base-server.d.ts.map +1 -1
  203. package/dist/src/server/base-server.js +368 -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 -13
  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/listener/util.d.ts +1 -1
  259. package/dist/src/server/listener/util.d.ts.map +1 -1
  260. package/dist/src/server/listener/util.js +1 -1
  261. package/dist/src/server/listener/util.js.map +1 -1
  262. package/dist/src/server/sync-manager.d.ts +4 -7
  263. package/dist/src/server/sync-manager.d.ts.map +1 -1
  264. package/dist/src/server/sync-manager.js +13 -15
  265. package/dist/src/server/sync-manager.js.map +1 -1
  266. package/dist/src/server/sync-unit-map.d.ts +4 -25
  267. package/dist/src/server/sync-unit-map.d.ts.map +1 -1
  268. package/dist/src/server/sync-unit-map.js +0 -1
  269. package/dist/src/server/sync-unit-map.js.map +1 -1
  270. package/dist/src/server/types.d.ts +59 -42
  271. package/dist/src/server/types.d.ts.map +1 -1
  272. package/dist/src/server/types.js +10 -12
  273. package/dist/src/server/types.js.map +1 -1
  274. package/dist/src/server/utils.d.ts +5 -3
  275. package/dist/src/server/utils.d.ts.map +1 -1
  276. package/dist/src/server/utils.js +27 -6
  277. package/dist/src/server/utils.js.map +1 -1
  278. package/dist/src/storage/browser.d.ts +3 -4
  279. package/dist/src/storage/browser.d.ts.map +1 -1
  280. package/dist/src/storage/browser.js +13 -12
  281. package/dist/src/storage/browser.js.map +1 -1
  282. package/dist/src/storage/filesystem.d.ts +4 -5
  283. package/dist/src/storage/filesystem.d.ts.map +1 -1
  284. package/dist/src/storage/filesystem.js +37 -13
  285. package/dist/src/storage/filesystem.js.map +1 -1
  286. package/dist/src/storage/index.d.ts +4 -0
  287. package/dist/src/storage/index.d.ts.map +1 -0
  288. package/dist/src/storage/index.js +4 -0
  289. package/dist/src/storage/index.js.map +1 -0
  290. package/dist/src/storage/ipfs.d.ts +2 -3
  291. package/dist/src/storage/ipfs.d.ts.map +1 -1
  292. package/dist/src/storage/ipfs.js +7 -5
  293. package/dist/src/storage/ipfs.js.map +1 -1
  294. package/dist/src/storage/memory.d.ts +4 -5
  295. package/dist/src/storage/memory.d.ts.map +1 -1
  296. package/dist/src/storage/memory.js +39 -17
  297. package/dist/src/storage/memory.js.map +1 -1
  298. package/dist/src/storage/prisma/client/edge.js +17 -8
  299. package/dist/src/storage/prisma/client/index-browser.js +1 -0
  300. package/dist/src/storage/prisma/client/index.d.ts +45 -0
  301. package/dist/src/storage/prisma/client/index.js +25 -8
  302. package/dist/src/storage/prisma/client/libquery_engine-darwin-arm64.dylib.node +0 -0
  303. package/dist/src/storage/prisma/client/libquery_engine-linux-musl.so.node +0 -0
  304. package/dist/src/storage/prisma/client/package.json +1 -1
  305. package/dist/src/storage/prisma/client/schema.prisma +4 -2
  306. package/dist/src/storage/prisma/client/wasm.js +1 -0
  307. package/dist/src/storage/prisma/factory.d.ts +3 -2
  308. package/dist/src/storage/prisma/factory.d.ts.map +1 -1
  309. package/dist/src/storage/prisma/factory.js +6 -2
  310. package/dist/src/storage/prisma/factory.js.map +1 -1
  311. package/dist/src/storage/prisma/prisma.d.ts +8 -9
  312. package/dist/src/storage/prisma/prisma.d.ts.map +1 -1
  313. package/dist/src/storage/prisma/prisma.js +145 -54
  314. package/dist/src/storage/prisma/prisma.js.map +1 -1
  315. package/dist/src/storage/types.d.ts +4 -5
  316. package/dist/src/storage/types.d.ts.map +1 -1
  317. package/dist/src/storage/utils.d.ts +3 -1
  318. package/dist/src/storage/utils.d.ts.map +1 -1
  319. package/dist/src/storage/utils.js +18 -0
  320. package/dist/src/storage/utils.js.map +1 -1
  321. package/dist/src/utils/default-drives-manager.d.ts +1 -12
  322. package/dist/src/utils/default-drives-manager.d.ts.map +1 -1
  323. package/dist/src/utils/default-drives-manager.js +1 -2
  324. package/dist/src/utils/default-drives-manager.js.map +1 -1
  325. package/dist/src/utils/gql-transformations.d.ts +14 -5
  326. package/dist/src/utils/gql-transformations.d.ts.map +1 -1
  327. package/dist/src/utils/gql-transformations.js +19 -5
  328. package/dist/src/utils/gql-transformations.js.map +1 -1
  329. package/dist/src/utils/graphql.d.ts +6 -32
  330. package/dist/src/utils/graphql.d.ts.map +1 -1
  331. package/dist/src/utils/graphql.js +21 -31
  332. package/dist/src/utils/graphql.js.map +1 -1
  333. package/dist/src/utils/index.d.ts +8 -0
  334. package/dist/src/utils/index.d.ts.map +1 -0
  335. package/dist/src/utils/index.js +8 -0
  336. package/dist/src/utils/index.js.map +1 -0
  337. package/dist/src/utils/logger.d.ts +2 -8
  338. package/dist/src/utils/logger.d.ts.map +1 -1
  339. package/dist/src/utils/logger.js +6 -7
  340. package/dist/src/utils/logger.js.map +1 -1
  341. package/dist/src/utils/migrations.d.ts +1 -1
  342. package/dist/src/utils/migrations.d.ts.map +1 -1
  343. package/dist/src/utils/migrations.js +88 -18
  344. package/dist/src/utils/migrations.js.map +1 -1
  345. package/dist/src/utils/misc.d.ts +3 -7
  346. package/dist/src/utils/misc.d.ts.map +1 -1
  347. package/dist/src/utils/misc.js +9 -12
  348. package/dist/src/utils/misc.js.map +1 -1
  349. package/dist/src/utils/run-asap.d.ts +7 -11
  350. package/dist/src/utils/run-asap.d.ts.map +1 -1
  351. package/dist/src/utils/run-asap.js +110 -122
  352. package/dist/src/utils/run-asap.js.map +1 -1
  353. package/dist/src/utils/types.d.ts +50 -0
  354. package/dist/src/utils/types.d.ts.map +1 -0
  355. package/dist/src/utils/types.js +2 -0
  356. package/dist/src/utils/types.js.map +1 -0
  357. package/dist/test/benchmarks/getDrive.json +10 -0
  358. package/dist/test/benchmarks/processOperations.bench.d.ts +2 -0
  359. package/dist/test/benchmarks/processOperations.bench.d.ts.map +1 -0
  360. package/dist/test/benchmarks/processOperations.bench.js +148 -0
  361. package/dist/test/benchmarks/processOperations.bench.js.map +1 -0
  362. package/dist/test/benchmarks/queue.bench.d.ts +2 -0
  363. package/dist/test/benchmarks/queue.bench.d.ts.map +1 -0
  364. package/dist/test/benchmarks/queue.bench.js +51 -0
  365. package/dist/test/benchmarks/queue.bench.js.map +1 -0
  366. package/dist/test/benchmarks/strands.small.json +37085 -0
  367. package/dist/test/cache.test.d.ts +2 -0
  368. package/dist/test/cache.test.d.ts.map +1 -0
  369. package/dist/test/cache.test.js +275 -0
  370. package/dist/test/cache.test.js.map +1 -0
  371. package/dist/test/default-remote-drives.test.d.ts +2 -0
  372. package/dist/test/default-remote-drives.test.d.ts.map +1 -0
  373. package/dist/test/default-remote-drives.test.js +445 -0
  374. package/dist/test/default-remote-drives.test.js.map +1 -0
  375. package/dist/test/drive-operations.test.d.ts +2 -0
  376. package/dist/test/drive-operations.test.d.ts.map +1 -0
  377. package/dist/test/drive-operations.test.js +134 -0
  378. package/dist/test/drive-operations.test.js.map +1 -0
  379. package/dist/test/dual-action-create.test.d.ts +2 -0
  380. package/dist/test/dual-action-create.test.d.ts.map +1 -0
  381. package/dist/test/dual-action-create.test.js +187 -0
  382. package/dist/test/dual-action-create.test.js.map +1 -0
  383. package/dist/test/dual-action-migration.test.d.ts +2 -0
  384. package/dist/test/dual-action-migration.test.d.ts.map +1 -0
  385. package/dist/test/dual-action-migration.test.js +344 -0
  386. package/dist/test/dual-action-migration.test.js.map +1 -0
  387. package/dist/test/graphql.test.d.ts +2 -0
  388. package/dist/test/graphql.test.d.ts.map +1 -0
  389. package/dist/test/graphql.test.js +9 -0
  390. package/dist/test/graphql.test.js.map +1 -0
  391. package/dist/test/index.d.ts +2 -0
  392. package/dist/test/index.d.ts.map +1 -0
  393. package/dist/test/index.js +2 -0
  394. package/dist/test/index.js.map +1 -0
  395. package/dist/test/internal-listener.test.d.ts +2 -0
  396. package/dist/test/internal-listener.test.d.ts.map +1 -0
  397. package/dist/test/internal-listener.test.js +243 -0
  398. package/dist/test/internal-listener.test.js.map +1 -0
  399. package/dist/test/queue.test.d.ts +2 -0
  400. package/dist/test/queue.test.d.ts.map +1 -0
  401. package/dist/test/queue.test.js +324 -0
  402. package/dist/test/queue.test.js.map +1 -0
  403. package/dist/test/reactor.test.d.ts +2 -0
  404. package/dist/test/reactor.test.d.ts.map +1 -0
  405. package/dist/test/reactor.test.js +32 -0
  406. package/dist/test/reactor.test.js.map +1 -0
  407. package/dist/test/read-mode.test.d.ts +2 -0
  408. package/dist/test/read-mode.test.d.ts.map +1 -0
  409. package/dist/test/read-mode.test.js +569 -0
  410. package/dist/test/read-mode.test.js.map +1 -0
  411. package/dist/test/server/driveOperationsConflictResolution.test.d.ts +2 -0
  412. package/dist/test/server/driveOperationsConflictResolution.test.d.ts.map +1 -0
  413. package/dist/test/server/driveOperationsConflictResolution.test.js +486 -0
  414. package/dist/test/server/driveOperationsConflictResolution.test.js.map +1 -0
  415. package/dist/test/server/mergeOperations.test.d.ts +2 -0
  416. package/dist/test/server/mergeOperations.test.d.ts.map +1 -0
  417. package/dist/test/server/mergeOperations.test.js +115 -0
  418. package/dist/test/server/mergeOperations.test.js.map +1 -0
  419. package/dist/test/server/processOperations.test.d.ts +2 -0
  420. package/dist/test/server/processOperations.test.d.ts.map +1 -0
  421. package/dist/test/server/processOperations.test.js +392 -0
  422. package/dist/test/server/processOperations.test.js.map +1 -0
  423. package/dist/test/server.test.d.ts +2 -0
  424. package/dist/test/server.test.d.ts.map +1 -0
  425. package/dist/test/server.test.js +957 -0
  426. package/dist/test/server.test.js.map +1 -0
  427. package/dist/test/signature-migration.test.d.ts +2 -0
  428. package/dist/test/signature-migration.test.d.ts.map +1 -0
  429. package/dist/test/signature-migration.test.js +241 -0
  430. package/dist/test/signature-migration.test.js.map +1 -0
  431. package/dist/test/storage.test.d.ts +2 -0
  432. package/dist/test/storage.test.d.ts.map +1 -0
  433. package/dist/test/storage.test.js +522 -0
  434. package/dist/test/storage.test.js.map +1 -0
  435. package/dist/test/switchboard-push-listener.test.d.ts +2 -0
  436. package/dist/test/switchboard-push-listener.test.d.ts.map +1 -0
  437. package/dist/test/switchboard-push-listener.test.js +133 -0
  438. package/dist/test/switchboard-push-listener.test.js.map +1 -0
  439. package/dist/test/sync-manager.test.d.ts +2 -0
  440. package/dist/test/sync-manager.test.d.ts.map +1 -0
  441. package/dist/test/sync-manager.test.js +349 -0
  442. package/dist/test/sync-manager.test.js.map +1 -0
  443. package/dist/test/undo-redo-clipboard.test.d.ts +2 -0
  444. package/dist/test/undo-redo-clipboard.test.d.ts.map +1 -0
  445. package/dist/test/undo-redo-clipboard.test.js +108 -0
  446. package/dist/test/undo-redo-clipboard.test.js.map +1 -0
  447. package/dist/test/utils.d.ts +62 -0
  448. package/dist/test/utils.d.ts.map +1 -0
  449. package/dist/test/utils.js +158 -0
  450. package/dist/test/utils.js.map +1 -0
  451. package/dist/test/utils.test.d.ts +2 -0
  452. package/dist/test/utils.test.d.ts.map +1 -0
  453. package/dist/test/utils.test.js +86 -0
  454. package/dist/test/utils.test.js.map +1 -0
  455. package/dist/test/vitest-setup.d.ts +2 -0
  456. package/dist/test/vitest-setup.d.ts.map +1 -0
  457. package/dist/test/vitest-setup.js +5 -0
  458. package/dist/test/vitest-setup.js.map +1 -0
  459. package/dist/tsconfig.tsbuildinfo +1 -0
  460. package/dist/vitest.config.d.ts +3 -0
  461. package/dist/vitest.config.d.ts.map +1 -0
  462. package/dist/vitest.config.js +28 -0
  463. package/dist/vitest.config.js.map +1 -0
  464. package/package.json +39 -26
  465. package/prisma/schema.prisma +93 -0
  466. package/src/storage/prisma/client/default.d.ts +1 -0
  467. package/src/storage/prisma/client/default.js +1 -0
  468. package/src/storage/prisma/client/edge.d.ts +1 -0
  469. package/src/storage/prisma/client/edge.js +263 -0
  470. package/src/storage/prisma/client/index-browser.js +246 -0
  471. package/src/storage/prisma/client/index.d.ts +10318 -0
  472. package/src/storage/prisma/client/index.js +292 -0
  473. package/src/storage/prisma/client/libquery_engine-darwin-arm64.dylib.node +0 -0
  474. package/src/storage/prisma/client/libquery_engine-debian-openssl-3.0.x.so.node +0 -0
  475. package/src/storage/prisma/client/libquery_engine-linux-musl.so.node +0 -0
  476. package/src/storage/prisma/client/package.json +84 -0
  477. package/src/storage/prisma/client/runtime/edge-esm.js +31 -0
  478. package/src/storage/prisma/client/runtime/edge.js +31 -0
  479. package/src/storage/prisma/client/runtime/index-browser.d.ts +365 -0
  480. package/src/storage/prisma/client/runtime/index-browser.js +13 -0
  481. package/src/storage/prisma/client/runtime/library.d.ts +3273 -0
  482. package/src/storage/prisma/client/runtime/library.js +143 -0
  483. package/src/storage/prisma/client/runtime/react-native.js +80 -0
  484. package/src/storage/prisma/client/runtime/wasm.js +32 -0
  485. package/src/storage/prisma/client/schema.prisma +93 -0
  486. package/src/storage/prisma/client/wasm.d.ts +1 -0
  487. package/src/storage/prisma/client/wasm.js +246 -0
  488. package/dist/src/drive-document-model/gen/actions.d.ts +0 -6
  489. package/dist/src/drive-document-model/gen/actions.d.ts.map +0 -1
  490. package/dist/src/drive-document-model/gen/actions.js +0 -3
  491. package/dist/src/drive-document-model/gen/actions.js.map +0 -1
  492. package/dist/src/drive-document-model/gen/drive/object.d.ts +0 -14
  493. package/dist/src/drive-document-model/gen/drive/object.d.ts.map +0 -1
  494. package/dist/src/drive-document-model/gen/drive/object.js +0 -29
  495. package/dist/src/drive-document-model/gen/drive/object.js.map +0 -1
  496. package/dist/src/drive-document-model/gen/drive/operations.d.ts +0 -14
  497. package/dist/src/drive-document-model/gen/drive/operations.d.ts.map +0 -1
  498. package/dist/src/drive-document-model/gen/drive/operations.js +0 -2
  499. package/dist/src/drive-document-model/gen/drive/operations.js.map +0 -1
  500. package/dist/src/drive-document-model/gen/node/object.d.ts +0 -13
  501. package/dist/src/drive-document-model/gen/node/object.d.ts.map +0 -1
  502. package/dist/src/drive-document-model/gen/node/object.js +0 -26
  503. package/dist/src/drive-document-model/gen/node/object.js.map +0 -1
  504. package/dist/src/drive-document-model/gen/node/operations.d.ts +0 -13
  505. package/dist/src/drive-document-model/gen/node/operations.d.ts.map +0 -1
  506. package/dist/src/drive-document-model/gen/node/operations.js +0 -2
  507. package/dist/src/drive-document-model/gen/node/operations.js.map +0 -1
  508. package/dist/src/drive-document-model/gen/object.d.ts +0 -18
  509. package/dist/src/drive-document-model/gen/object.d.ts.map +0 -1
  510. package/dist/src/drive-document-model/gen/object.js +0 -28
  511. package/dist/src/drive-document-model/gen/object.js.map +0 -1
  512. 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, 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, diffOperations, 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,26 @@ 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 { 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 ?? [],
351
359
  },
352
360
  });
353
361
  if (input.id && input.id.length > 0) {
@@ -356,9 +364,10 @@ export class BaseDocumentDriveServer {
356
364
  if (input.slug && input.slug.length > 0) {
357
365
  document.header.slug = input.slug;
358
366
  }
359
- if (preferredEditor) {
367
+ const editorToUse = input.preferredEditor || preferredEditor;
368
+ if (editorToUse) {
360
369
  document.header.meta = {
361
- preferredEditor: preferredEditor,
370
+ preferredEditor: editorToUse,
362
371
  };
363
372
  }
364
373
  await this.documentStorage.create(document);
@@ -545,6 +554,14 @@ export class BaseDocumentDriveServer {
545
554
  }
546
555
  }
547
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) {
548
565
  const { documentType, document: inputDocument } = resolveCreateDocumentInput(input);
549
566
  // if a document was provided then checks if it's valid
550
567
  let state = undefined;
@@ -558,9 +575,7 @@ export class BaseDocumentDriveServer {
558
575
  }
559
576
  // if no document was provided then create a new one
560
577
  const document = inputDocument ??
561
- this.getDocumentModelModule(documentType).utils.createDocument({
562
- state,
563
- });
578
+ this.getDocumentModelModule(documentType).utils.createDocument(state);
564
579
  // get the header
565
580
  let header;
566
581
  // handle the legacy case where an id is provided
@@ -609,11 +624,9 @@ export class BaseDocumentDriveServer {
609
624
  // stores document information
610
625
  const documentStorage = {
611
626
  header,
612
- history: document.history,
613
627
  operations: { global: [], local: [] },
614
628
  initialState: document.initialState,
615
629
  clipboard: [],
616
- attachments: document.attachments,
617
630
  state: state ?? document.state,
618
631
  };
619
632
  await this.documentStorage.create(documentStorage);
@@ -646,7 +659,181 @@ export class BaseDocumentDriveServer {
646
659
  await this.legacyStorage.addDocumentOperations(header.id, operations, document);
647
660
  }
648
661
  }
649
- return document;
662
+ return await this.getDocument(documentStorage.header.id);
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
+ });
650
837
  }
651
838
  async deleteDocument(documentId) {
652
839
  try {
@@ -676,7 +863,7 @@ export class BaseDocumentDriveServer {
676
863
  let error; // TODO: replace with an array of errors/consistency issues
677
864
  const operationsByScope = groupOperationsByScope(operations);
678
865
  for (const scope of Object.keys(operationsByScope)) {
679
- const storageDocumentOperations = documentStorage.operations[scope];
866
+ const storageDocumentOperations = documentStorage.operations[scope] || [];
680
867
  // TODO two equal operations done by two clients will be considered the same, ie: { type: "INCREMENT" }
681
868
  const branch = removeExistingOperations(operationsByScope[scope] || [], storageDocumentOperations);
682
869
  // No operations to apply
@@ -736,13 +923,17 @@ export class BaseDocumentDriveServer {
736
923
  : document.operations;
737
924
  const documentOperations = garbageCollectDocumentOperations(operations);
738
925
  for (const scope of Object.keys(documentOperations)) {
739
- const lastRemainingOperation = documentOperations[scope].at(-1);
926
+ const scopeOps = documentOperations[scope];
927
+ if (!scopeOps) {
928
+ continue;
929
+ }
930
+ const lastRemainingOperation = scopeOps.at(-1);
740
931
  // if the latest operation doesn't have a resulting state then tries
741
932
  // to retrieve it from the db to avoid rerunning all the operations
742
933
  if (lastRemainingOperation && !lastRemainingOperation.resultingState) {
743
934
  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"));
935
+ ? this.legacyStorage.getOperationResultingState?.(documentId, lastRemainingOperation.index, lastRemainingOperation.action.scope, "main")
936
+ : this.legacyStorage.getDriveOperationResultingState?.(documentId, lastRemainingOperation.index, lastRemainingOperation.action.scope, "main"));
746
937
  }
747
938
  }
748
939
  return {
@@ -761,31 +952,84 @@ export class BaseDocumentDriveServer {
761
952
  ? filterOperationsByRevision(documentStorage.operations, options.revisions)
762
953
  : documentStorage.operations;
763
954
  const operations = garbageCollectDocumentOperations(revisionOperations);
764
- 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, {
765
988
  ...options,
766
989
  checkHashes: options?.checkHashes ?? true,
767
990
  reuseOperationResultingState: options?.checkHashes ?? true,
768
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
+ };
769
1010
  }
770
1011
  async _performOperation(documentId, document, operation, skipHashValidation = false) {
771
1012
  const documentModelModule = this.getDocumentModelModule(document.header.documentType);
772
1013
  const signalResults = [];
773
1014
  let newDocument = document;
774
- const scope = operation.scope;
1015
+ const scope = operation.action.scope;
1016
+ const currentScopeOperations = document.operations[scope] || [];
775
1017
  const documentOperations = garbageCollectDocumentOperations({
776
1018
  ...document.operations,
777
- [scope]: skipHeaderOperations(document.operations[scope], operation),
1019
+ [scope]: skipHeaderOperations(currentScopeOperations, operation),
778
1020
  });
779
- const lastRemainingOperation = documentOperations[scope].at(-1);
1021
+ const remainingScopeOps = documentOperations[scope];
1022
+ const lastRemainingOperation = remainingScopeOps?.at(-1);
780
1023
  // if the latest operation doesn't have a resulting state then tries
781
1024
  // to retrieve it from the db to avoid rerunning all the operations
782
1025
  if (lastRemainingOperation && !lastRemainingOperation.resultingState) {
783
1026
  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"));
1027
+ ? this.legacyStorage.getOperationResultingState?.(documentId, lastRemainingOperation.index, lastRemainingOperation.action.scope, "main")
1028
+ : this.legacyStorage.getDriveOperationResultingState?.(documentId, lastRemainingOperation.index, lastRemainingOperation.action.scope, "main"));
786
1029
  }
1030
+ const operationsBeforeReducer = newDocument.operations[scope] || [];
787
1031
  const operationSignals = [];
788
- newDocument = documentModelModule.reducer(newDocument, operation, (signal) => {
1032
+ newDocument = documentModelModule.reducer(newDocument, operation.action, (signal) => {
789
1033
  let handler = undefined;
790
1034
  switch (signal.type) {
791
1035
  case "CREATE_CHILD_DOCUMENT":
@@ -801,8 +1045,35 @@ export class BaseDocumentDriveServer {
801
1045
  if (handler) {
802
1046
  operationSignals.push(() => handler().then((result) => ({ signal, result })));
803
1047
  }
804
- }, { skip: operation.skip, reuseOperationResultingState: true });
805
- const appliedOperations = newDocument.operations[operation.scope].filter((op) => op.index == operation.index && op.skip == operation.skip);
1048
+ }, {
1049
+ skip: operation.skip,
1050
+ reuseOperationResultingState: true,
1051
+ replayOptions: { operation },
1052
+ });
1053
+ // when we have NOOP operations with skip > 0 we need to populate the
1054
+ // clipboard with the operations that were skipped to allow redo
1055
+ if (operation.action.type === "NOOP" &&
1056
+ operation.skip > 0 &&
1057
+ newDocument.clipboard.length === 0) {
1058
+ const scopeOperationsAfter = newDocument.operations[scope] || [];
1059
+ // Get operations AFTER garbageCollect (with NOOP)
1060
+ const afterOperations = garbageCollect(sortOperations(scopeOperationsAfter));
1061
+ // Get operations BEFORE the reducer ran (before NOOP was applied)
1062
+ const beforeOperations = garbageCollect(sortOperations(operationsBeforeReducer));
1063
+ // Calculate what was removed by comparing before vs after
1064
+ // The diff shows operations that were in "before" but not in "after"
1065
+ const diff = diffOperations(beforeOperations, afterOperations);
1066
+ // Populate clipboard with skipped operations (excluding NOOPs)
1067
+ newDocument = {
1068
+ ...newDocument,
1069
+ clipboard: sortOperations(diff.filter((op) => op.action.type !== "NOOP")).reverse(),
1070
+ };
1071
+ }
1072
+ const newDocScopeOperations = newDocument.operations[operation.action.scope];
1073
+ if (!newDocScopeOperations) {
1074
+ throw new OperationError("ERROR", operation, `No operations found for scope: ${operation.action.scope}`);
1075
+ }
1076
+ const appliedOperations = newDocScopeOperations.filter((op) => op.index == operation.index && op.skip == operation.skip);
806
1077
  const appliedOperation = appliedOperations.at(0);
807
1078
  if (!appliedOperation) {
808
1079
  throw new OperationError("ERROR", operation, `Operation with index ${operation.index}:${operation.skip} was not applied.`);
@@ -889,7 +1160,8 @@ export class BaseDocumentDriveServer {
889
1160
  jobId = await this.queueManager.addJob({
890
1161
  documentId: id,
891
1162
  documentType,
892
- initialState: document,
1163
+ initialState: document?.state,
1164
+ header: document?.header,
893
1165
  options,
894
1166
  });
895
1167
  }
@@ -920,11 +1192,19 @@ export class BaseDocumentDriveServer {
920
1192
  async resultIfExistingOperations(id, operations) {
921
1193
  try {
922
1194
  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 &&
1195
+ const newOperation = operations.find((op) => {
1196
+ if (!op.id) {
1197
+ return true;
1198
+ }
1199
+ const scopeOps = document.operations[op.action.scope];
1200
+ if (!scopeOps) {
1201
+ return true;
1202
+ }
1203
+ return !scopeOps.find((existingOp) => existingOp.id === op.id &&
925
1204
  existingOp.index === op.index &&
926
- existingOp.type === op.type &&
927
- existingOp.hash === op.hash));
1205
+ existingOp.action.type === op.action.type &&
1206
+ existingOp.hash === op.hash);
1207
+ });
928
1208
  if (!newOperation) {
929
1209
  return {
930
1210
  status: "SUCCESS",
@@ -1155,10 +1435,10 @@ export class BaseDocumentDriveServer {
1155
1435
  const syncUnit = {
1156
1436
  documentId,
1157
1437
  documentType: document.header.documentType,
1158
- scope: operation.scope,
1438
+ scope: operation.action.scope,
1159
1439
  branch: "main", // TODO: handle branches
1160
1440
  revision: operation.index + 1,
1161
- lastUpdated: operation.timestamp,
1441
+ lastUpdated: operation.timestampUtcMs,
1162
1442
  };
1163
1443
  // checks if this sync unit was already added
1164
1444
  const exists = syncUnits.some((unit) => unit.documentId === syncUnit.documentId &&
@@ -1276,11 +1556,19 @@ export class BaseDocumentDriveServer {
1276
1556
  async resultIfExistingDriveOperations(driveId, operations) {
1277
1557
  try {
1278
1558
  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 &&
1559
+ const newOperation = operations.find((op) => {
1560
+ if (!op.id) {
1561
+ return true;
1562
+ }
1563
+ const scopeOps = drive.operations[op.action.scope];
1564
+ if (!scopeOps) {
1565
+ return true;
1566
+ }
1567
+ return !scopeOps.find((existingOp) => existingOp.id === op.id &&
1281
1568
  existingOp.index === op.index &&
1282
- existingOp.type === op.type &&
1283
- existingOp.hash === op.hash));
1569
+ existingOp.action.type === op.action.type &&
1570
+ existingOp.hash === op.hash);
1571
+ });
1284
1572
  if (!newOperation) {
1285
1573
  return {
1286
1574
  status: "SUCCESS",
@@ -1370,7 +1658,7 @@ export class BaseDocumentDriveServer {
1370
1658
  this.cache.setDrive(driveId, document).catch(this.logger.error);
1371
1659
  // update listener cache
1372
1660
  const lastOperation = operationsApplied
1373
- .filter((op) => op.scope === "global")
1661
+ .filter((op) => op.action.scope === "global")
1374
1662
  .slice()
1375
1663
  .pop();
1376
1664
  if (lastOperation) {
@@ -1393,7 +1681,7 @@ export class BaseDocumentDriveServer {
1393
1681
  documentType: document.header.documentType,
1394
1682
  scope: "global",
1395
1683
  branch: "main",
1396
- lastUpdated: lastOperation.timestamp,
1684
+ lastUpdated: lastOperation.timestampUtcMs,
1397
1685
  revision: lastOperation.index,
1398
1686
  },
1399
1687
  ], source, () => {
@@ -1453,7 +1741,11 @@ export class BaseDocumentDriveServer {
1453
1741
  const { reducer } = this.getDocumentModelModule(documentId.header.documentType);
1454
1742
  for (const action of actions) {
1455
1743
  documentId = reducer(documentId, action);
1456
- const operation = documentId.operations[action.scope].slice().pop();
1744
+ const scopeOps = documentId.operations[action.scope];
1745
+ if (!scopeOps) {
1746
+ throw new Error(`No operations found for scope: ${action.scope}`);
1747
+ }
1748
+ const operation = scopeOps.slice().pop();
1457
1749
  if (!operation) {
1458
1750
  throw new Error("Error creating operations");
1459
1751
  }
@@ -1516,7 +1808,7 @@ export class BaseDocumentDriveServer {
1516
1808
  }
1517
1809
  async _legacyAddFileAction(driveId, action, options) {
1518
1810
  // create document before adding it to the drive
1519
- const document = this.getDocumentModelModule(action.input.documentType).utils.createDocument({ ...action.input.document });
1811
+ const document = this.getDocumentModelModule(action.input.documentType).utils.createDocument(action.input.document?.state || undefined);
1520
1812
  document.header.id = action.input.id;
1521
1813
  document.header.name = action.input.name;
1522
1814
  document.header.documentType = action.input.documentType;
@@ -1587,6 +1879,14 @@ export class BaseDocumentDriveServer {
1587
1879
  }
1588
1880
  const operations = strand.operations.map((op) => ({
1589
1881
  ...op,
1882
+ action: {
1883
+ id: op.actionId,
1884
+ timestampUtcMs: op.timestampUtcMs,
1885
+ type: op.type,
1886
+ input: op.input,
1887
+ context: op.context,
1888
+ scope: strand.scope,
1889
+ },
1590
1890
  scope: strand.scope,
1591
1891
  branch: strand.branch,
1592
1892
  }));