document-drive 4.1.0-dev.10 → 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 (508) 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 +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 -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 +18 -27
  202. package/dist/src/server/base-server.d.ts.map +1 -1
  203. package/dist/src/server/base-server.js +363 -66
  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 +49 -33
  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 +13 -12
  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 +37 -13
  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 +39 -17
  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 +3 -2
  304. package/dist/src/storage/prisma/factory.d.ts.map +1 -1
  305. package/dist/src/storage/prisma/factory.js +6 -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 +145 -54
  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 +3 -1
  314. package/dist/src/storage/utils.d.ts.map +1 -1
  315. package/dist/src/storage/utils.js +18 -0
  316. package/dist/src/storage/utils.js.map +1 -1
  317. package/dist/src/utils/default-drives-manager.d.ts +1 -12
  318. package/dist/src/utils/default-drives-manager.d.ts.map +1 -1
  319. package/dist/src/utils/default-drives-manager.js +1 -2
  320. package/dist/src/utils/default-drives-manager.js.map +1 -1
  321. package/dist/src/utils/gql-transformations.d.ts +14 -5
  322. package/dist/src/utils/gql-transformations.d.ts.map +1 -1
  323. package/dist/src/utils/gql-transformations.js +19 -5
  324. package/dist/src/utils/gql-transformations.js.map +1 -1
  325. package/dist/src/utils/graphql.d.ts +6 -32
  326. package/dist/src/utils/graphql.d.ts.map +1 -1
  327. package/dist/src/utils/graphql.js +21 -31
  328. package/dist/src/utils/graphql.js.map +1 -1
  329. package/dist/src/utils/index.d.ts +8 -0
  330. package/dist/src/utils/index.d.ts.map +1 -0
  331. package/dist/src/utils/index.js +8 -0
  332. package/dist/src/utils/index.js.map +1 -0
  333. package/dist/src/utils/logger.d.ts +2 -8
  334. package/dist/src/utils/logger.d.ts.map +1 -1
  335. package/dist/src/utils/logger.js +6 -7
  336. package/dist/src/utils/logger.js.map +1 -1
  337. package/dist/src/utils/migrations.d.ts +1 -1
  338. package/dist/src/utils/migrations.d.ts.map +1 -1
  339. package/dist/src/utils/migrations.js +88 -18
  340. package/dist/src/utils/migrations.js.map +1 -1
  341. package/dist/src/utils/misc.d.ts +2 -6
  342. package/dist/src/utils/misc.d.ts.map +1 -1
  343. package/dist/src/utils/misc.js +9 -12
  344. package/dist/src/utils/misc.js.map +1 -1
  345. package/dist/src/utils/run-asap.d.ts +7 -11
  346. package/dist/src/utils/run-asap.d.ts.map +1 -1
  347. package/dist/src/utils/run-asap.js +110 -122
  348. package/dist/src/utils/run-asap.js.map +1 -1
  349. package/dist/src/utils/types.d.ts +50 -0
  350. package/dist/src/utils/types.d.ts.map +1 -0
  351. package/dist/src/utils/types.js +2 -0
  352. package/dist/src/utils/types.js.map +1 -0
  353. package/dist/test/benchmarks/getDrive.json +10 -0
  354. package/dist/test/benchmarks/processOperations.bench.d.ts +2 -0
  355. package/dist/test/benchmarks/processOperations.bench.d.ts.map +1 -0
  356. package/dist/test/benchmarks/processOperations.bench.js +148 -0
  357. package/dist/test/benchmarks/processOperations.bench.js.map +1 -0
  358. package/dist/test/benchmarks/queue.bench.d.ts +2 -0
  359. package/dist/test/benchmarks/queue.bench.d.ts.map +1 -0
  360. package/dist/test/benchmarks/queue.bench.js +51 -0
  361. package/dist/test/benchmarks/queue.bench.js.map +1 -0
  362. package/dist/test/benchmarks/strands.small.json +37085 -0
  363. package/dist/test/cache.test.d.ts +2 -0
  364. package/dist/test/cache.test.d.ts.map +1 -0
  365. package/dist/test/cache.test.js +275 -0
  366. package/dist/test/cache.test.js.map +1 -0
  367. package/dist/test/default-remote-drives.test.d.ts +2 -0
  368. package/dist/test/default-remote-drives.test.d.ts.map +1 -0
  369. package/dist/test/default-remote-drives.test.js +445 -0
  370. package/dist/test/default-remote-drives.test.js.map +1 -0
  371. package/dist/test/drive-operations.test.d.ts +2 -0
  372. package/dist/test/drive-operations.test.d.ts.map +1 -0
  373. package/dist/test/drive-operations.test.js +134 -0
  374. package/dist/test/drive-operations.test.js.map +1 -0
  375. package/dist/test/dual-action-create.test.d.ts +2 -0
  376. package/dist/test/dual-action-create.test.d.ts.map +1 -0
  377. package/dist/test/dual-action-create.test.js +187 -0
  378. package/dist/test/dual-action-create.test.js.map +1 -0
  379. package/dist/test/dual-action-migration.test.d.ts +2 -0
  380. package/dist/test/dual-action-migration.test.d.ts.map +1 -0
  381. package/dist/test/dual-action-migration.test.js +344 -0
  382. package/dist/test/dual-action-migration.test.js.map +1 -0
  383. package/dist/test/graphql.test.d.ts +2 -0
  384. package/dist/test/graphql.test.d.ts.map +1 -0
  385. package/dist/test/graphql.test.js +9 -0
  386. package/dist/test/graphql.test.js.map +1 -0
  387. package/dist/test/index.d.ts +2 -0
  388. package/dist/test/index.d.ts.map +1 -0
  389. package/dist/test/index.js +2 -0
  390. package/dist/test/index.js.map +1 -0
  391. package/dist/test/internal-listener.test.d.ts +2 -0
  392. package/dist/test/internal-listener.test.d.ts.map +1 -0
  393. package/dist/test/internal-listener.test.js +243 -0
  394. package/dist/test/internal-listener.test.js.map +1 -0
  395. package/dist/test/queue.test.d.ts +2 -0
  396. package/dist/test/queue.test.d.ts.map +1 -0
  397. package/dist/test/queue.test.js +324 -0
  398. package/dist/test/queue.test.js.map +1 -0
  399. package/dist/test/reactor.test.d.ts +2 -0
  400. package/dist/test/reactor.test.d.ts.map +1 -0
  401. package/dist/test/reactor.test.js +32 -0
  402. package/dist/test/reactor.test.js.map +1 -0
  403. package/dist/test/read-mode.test.d.ts +2 -0
  404. package/dist/test/read-mode.test.d.ts.map +1 -0
  405. package/dist/test/read-mode.test.js +569 -0
  406. package/dist/test/read-mode.test.js.map +1 -0
  407. package/dist/test/server/driveOperationsConflictResolution.test.d.ts +2 -0
  408. package/dist/test/server/driveOperationsConflictResolution.test.d.ts.map +1 -0
  409. package/dist/test/server/driveOperationsConflictResolution.test.js +486 -0
  410. package/dist/test/server/driveOperationsConflictResolution.test.js.map +1 -0
  411. package/dist/test/server/mergeOperations.test.d.ts +2 -0
  412. package/dist/test/server/mergeOperations.test.d.ts.map +1 -0
  413. package/dist/test/server/mergeOperations.test.js +115 -0
  414. package/dist/test/server/mergeOperations.test.js.map +1 -0
  415. package/dist/test/server/processOperations.test.d.ts +2 -0
  416. package/dist/test/server/processOperations.test.d.ts.map +1 -0
  417. package/dist/test/server/processOperations.test.js +392 -0
  418. package/dist/test/server/processOperations.test.js.map +1 -0
  419. package/dist/test/server.test.d.ts +2 -0
  420. package/dist/test/server.test.d.ts.map +1 -0
  421. package/dist/test/server.test.js +957 -0
  422. package/dist/test/server.test.js.map +1 -0
  423. package/dist/test/signature-migration.test.d.ts +2 -0
  424. package/dist/test/signature-migration.test.d.ts.map +1 -0
  425. package/dist/test/signature-migration.test.js +241 -0
  426. package/dist/test/signature-migration.test.js.map +1 -0
  427. package/dist/test/storage.test.d.ts +2 -0
  428. package/dist/test/storage.test.d.ts.map +1 -0
  429. package/dist/test/storage.test.js +522 -0
  430. package/dist/test/storage.test.js.map +1 -0
  431. package/dist/test/switchboard-push-listener.test.d.ts +2 -0
  432. package/dist/test/switchboard-push-listener.test.d.ts.map +1 -0
  433. package/dist/test/switchboard-push-listener.test.js +133 -0
  434. package/dist/test/switchboard-push-listener.test.js.map +1 -0
  435. package/dist/test/sync-manager.test.d.ts +2 -0
  436. package/dist/test/sync-manager.test.d.ts.map +1 -0
  437. package/dist/test/sync-manager.test.js +349 -0
  438. package/dist/test/sync-manager.test.js.map +1 -0
  439. package/dist/test/undo-redo-clipboard.test.d.ts +2 -0
  440. package/dist/test/undo-redo-clipboard.test.d.ts.map +1 -0
  441. package/dist/test/undo-redo-clipboard.test.js +108 -0
  442. package/dist/test/undo-redo-clipboard.test.js.map +1 -0
  443. package/dist/test/utils.d.ts +62 -0
  444. package/dist/test/utils.d.ts.map +1 -0
  445. package/dist/test/utils.js +158 -0
  446. package/dist/test/utils.js.map +1 -0
  447. package/dist/test/utils.test.d.ts +2 -0
  448. package/dist/test/utils.test.d.ts.map +1 -0
  449. package/dist/test/utils.test.js +86 -0
  450. package/dist/test/utils.test.js.map +1 -0
  451. package/dist/test/vitest-setup.d.ts +2 -0
  452. package/dist/test/vitest-setup.d.ts.map +1 -0
  453. package/dist/test/vitest-setup.js +5 -0
  454. package/dist/test/vitest-setup.js.map +1 -0
  455. package/dist/tsconfig.tsbuildinfo +1 -0
  456. package/dist/vitest.config.d.ts +3 -0
  457. package/dist/vitest.config.d.ts.map +1 -0
  458. package/dist/vitest.config.js +28 -0
  459. package/dist/vitest.config.js.map +1 -0
  460. package/package.json +39 -27
  461. package/prisma/schema.prisma +93 -0
  462. package/src/storage/prisma/client/default.d.ts +1 -0
  463. package/src/storage/prisma/client/default.js +1 -0
  464. package/src/storage/prisma/client/edge.d.ts +1 -0
  465. package/src/storage/prisma/client/edge.js +263 -0
  466. package/src/storage/prisma/client/index-browser.js +246 -0
  467. package/src/storage/prisma/client/index.d.ts +10318 -0
  468. package/src/storage/prisma/client/index.js +292 -0
  469. package/src/storage/prisma/client/libquery_engine-darwin-arm64.dylib.node +0 -0
  470. package/src/storage/prisma/client/libquery_engine-debian-openssl-3.0.x.so.node +0 -0
  471. package/src/storage/prisma/client/libquery_engine-linux-musl.so.node +0 -0
  472. package/src/storage/prisma/client/package.json +84 -0
  473. package/src/storage/prisma/client/runtime/edge-esm.js +31 -0
  474. package/src/storage/prisma/client/runtime/edge.js +31 -0
  475. package/src/storage/prisma/client/runtime/index-browser.d.ts +365 -0
  476. package/src/storage/prisma/client/runtime/index-browser.js +13 -0
  477. package/src/storage/prisma/client/runtime/library.d.ts +3273 -0
  478. package/src/storage/prisma/client/runtime/library.js +143 -0
  479. package/src/storage/prisma/client/runtime/react-native.js +80 -0
  480. package/src/storage/prisma/client/runtime/wasm.js +32 -0
  481. package/src/storage/prisma/client/schema.prisma +93 -0
  482. package/src/storage/prisma/client/wasm.d.ts +1 -0
  483. package/src/storage/prisma/client/wasm.js +246 -0
  484. package/dist/src/drive-document-model/gen/actions.d.ts +0 -6
  485. package/dist/src/drive-document-model/gen/actions.d.ts.map +0 -1
  486. package/dist/src/drive-document-model/gen/actions.js +0 -3
  487. package/dist/src/drive-document-model/gen/actions.js.map +0 -1
  488. package/dist/src/drive-document-model/gen/drive/object.d.ts +0 -14
  489. package/dist/src/drive-document-model/gen/drive/object.d.ts.map +0 -1
  490. package/dist/src/drive-document-model/gen/drive/object.js +0 -29
  491. package/dist/src/drive-document-model/gen/drive/object.js.map +0 -1
  492. package/dist/src/drive-document-model/gen/drive/operations.d.ts +0 -14
  493. package/dist/src/drive-document-model/gen/drive/operations.d.ts.map +0 -1
  494. package/dist/src/drive-document-model/gen/drive/operations.js +0 -2
  495. package/dist/src/drive-document-model/gen/drive/operations.js.map +0 -1
  496. package/dist/src/drive-document-model/gen/node/object.d.ts +0 -13
  497. package/dist/src/drive-document-model/gen/node/object.d.ts.map +0 -1
  498. package/dist/src/drive-document-model/gen/node/object.js +0 -26
  499. package/dist/src/drive-document-model/gen/node/object.js.map +0 -1
  500. package/dist/src/drive-document-model/gen/node/operations.d.ts +0 -13
  501. package/dist/src/drive-document-model/gen/node/operations.d.ts.map +0 -1
  502. package/dist/src/drive-document-model/gen/node/operations.js +0 -2
  503. package/dist/src/drive-document-model/gen/node/operations.js.map +0 -1
  504. package/dist/src/drive-document-model/gen/object.d.ts +0 -18
  505. package/dist/src/drive-document-model/gen/object.d.ts.map +0 -1
  506. package/dist/src/drive-document-model/gen/object.js +0 -28
  507. package/dist/src/drive-document-model/gen/object.js.map +0 -1
  508. 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
  }
@@ -344,13 +343,19 @@ export class BaseDocumentDriveServer {
344
343
  return this.createDocument(input, { type: "local" }, meta);
345
344
  }
346
345
  async addDrive(input, preferredEditor) {
347
- const document = createDocument({
348
- state: {
349
- global: {
350
- icon: input.global.icon ?? null,
351
- name: input.global.name,
352
- },
353
- 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 ?? [],
354
359
  },
355
360
  });
356
361
  if (input.id && input.id.length > 0) {
@@ -359,9 +364,10 @@ export class BaseDocumentDriveServer {
359
364
  if (input.slug && input.slug.length > 0) {
360
365
  document.header.slug = input.slug;
361
366
  }
362
- if (preferredEditor) {
367
+ const editorToUse = input.preferredEditor || preferredEditor;
368
+ if (editorToUse) {
363
369
  document.header.meta = {
364
- preferredEditor: preferredEditor,
370
+ preferredEditor: editorToUse,
365
371
  };
366
372
  }
367
373
  await this.documentStorage.create(document);
@@ -548,6 +554,14 @@ export class BaseDocumentDriveServer {
548
554
  }
549
555
  }
550
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) {
551
565
  const { documentType, document: inputDocument } = resolveCreateDocumentInput(input);
552
566
  // if a document was provided then checks if it's valid
553
567
  let state = undefined;
@@ -561,9 +575,7 @@ export class BaseDocumentDriveServer {
561
575
  }
562
576
  // if no document was provided then create a new one
563
577
  const document = inputDocument ??
564
- this.getDocumentModelModule(documentType).utils.createDocument({
565
- state,
566
- });
578
+ this.getDocumentModelModule(documentType).utils.createDocument(state);
567
579
  // get the header
568
580
  let header;
569
581
  // handle the legacy case where an id is provided
@@ -612,11 +624,9 @@ export class BaseDocumentDriveServer {
612
624
  // stores document information
613
625
  const documentStorage = {
614
626
  header,
615
- history: document.history,
616
627
  operations: { global: [], local: [] },
617
628
  initialState: document.initialState,
618
629
  clipboard: [],
619
- attachments: document.attachments,
620
630
  state: state ?? document.state,
621
631
  };
622
632
  await this.documentStorage.create(documentStorage);
@@ -649,7 +659,181 @@ export class BaseDocumentDriveServer {
649
659
  await this.legacyStorage.addDocumentOperations(header.id, operations, document);
650
660
  }
651
661
  }
652
- 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
+ });
653
837
  }
654
838
  async deleteDocument(documentId) {
655
839
  try {
@@ -679,7 +863,7 @@ export class BaseDocumentDriveServer {
679
863
  let error; // TODO: replace with an array of errors/consistency issues
680
864
  const operationsByScope = groupOperationsByScope(operations);
681
865
  for (const scope of Object.keys(operationsByScope)) {
682
- const storageDocumentOperations = documentStorage.operations[scope];
866
+ const storageDocumentOperations = documentStorage.operations[scope] || [];
683
867
  // TODO two equal operations done by two clients will be considered the same, ie: { type: "INCREMENT" }
684
868
  const branch = removeExistingOperations(operationsByScope[scope] || [], storageDocumentOperations);
685
869
  // No operations to apply
@@ -739,13 +923,17 @@ export class BaseDocumentDriveServer {
739
923
  : document.operations;
740
924
  const documentOperations = garbageCollectDocumentOperations(operations);
741
925
  for (const scope of Object.keys(documentOperations)) {
742
- const lastRemainingOperation = documentOperations[scope].at(-1);
926
+ const scopeOps = documentOperations[scope];
927
+ if (!scopeOps) {
928
+ continue;
929
+ }
930
+ const lastRemainingOperation = scopeOps.at(-1);
743
931
  // if the latest operation doesn't have a resulting state then tries
744
932
  // to retrieve it from the db to avoid rerunning all the operations
745
933
  if (lastRemainingOperation && !lastRemainingOperation.resultingState) {
746
934
  lastRemainingOperation.resultingState = await (isDocumentDrive(document)
747
- ? this.legacyStorage.getOperationResultingState?.(documentId, lastRemainingOperation.index, lastRemainingOperation.scope, "main")
748
- : 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"));
749
937
  }
750
938
  }
751
939
  return {
@@ -764,31 +952,84 @@ export class BaseDocumentDriveServer {
764
952
  ? filterOperationsByRevision(documentStorage.operations, options.revisions)
765
953
  : documentStorage.operations;
766
954
  const operations = garbageCollectDocumentOperations(revisionOperations);
767
- 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, {
768
988
  ...options,
769
989
  checkHashes: options?.checkHashes ?? true,
770
990
  reuseOperationResultingState: options?.checkHashes ?? true,
771
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
+ };
772
1010
  }
773
1011
  async _performOperation(documentId, document, operation, skipHashValidation = false) {
774
1012
  const documentModelModule = this.getDocumentModelModule(document.header.documentType);
775
1013
  const signalResults = [];
776
1014
  let newDocument = document;
777
- const scope = operation.scope;
1015
+ const scope = operation.action.scope;
1016
+ const currentScopeOperations = document.operations[scope] || [];
778
1017
  const documentOperations = garbageCollectDocumentOperations({
779
1018
  ...document.operations,
780
- [scope]: skipHeaderOperations(document.operations[scope], operation),
1019
+ [scope]: skipHeaderOperations(currentScopeOperations, operation),
781
1020
  });
782
- const lastRemainingOperation = documentOperations[scope].at(-1);
1021
+ const remainingScopeOps = documentOperations[scope];
1022
+ const lastRemainingOperation = remainingScopeOps?.at(-1);
783
1023
  // if the latest operation doesn't have a resulting state then tries
784
1024
  // to retrieve it from the db to avoid rerunning all the operations
785
1025
  if (lastRemainingOperation && !lastRemainingOperation.resultingState) {
786
1026
  lastRemainingOperation.resultingState = await (isDocumentDrive(document)
787
- ? this.legacyStorage.getOperationResultingState?.(documentId, lastRemainingOperation.index, lastRemainingOperation.scope, "main")
788
- : 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"));
789
1029
  }
1030
+ const operationsBeforeReducer = newDocument.operations[scope] || [];
790
1031
  const operationSignals = [];
791
- newDocument = documentModelModule.reducer(newDocument, operation, (signal) => {
1032
+ newDocument = documentModelModule.reducer(newDocument, operation.action, (signal) => {
792
1033
  let handler = undefined;
793
1034
  switch (signal.type) {
794
1035
  case "CREATE_CHILD_DOCUMENT":
@@ -804,8 +1045,35 @@ export class BaseDocumentDriveServer {
804
1045
  if (handler) {
805
1046
  operationSignals.push(() => handler().then((result) => ({ signal, result })));
806
1047
  }
807
- }, { skip: operation.skip, reuseOperationResultingState: true });
808
- 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);
809
1077
  const appliedOperation = appliedOperations.at(0);
810
1078
  if (!appliedOperation) {
811
1079
  throw new OperationError("ERROR", operation, `Operation with index ${operation.index}:${operation.skip} was not applied.`);
@@ -892,7 +1160,8 @@ export class BaseDocumentDriveServer {
892
1160
  jobId = await this.queueManager.addJob({
893
1161
  documentId: id,
894
1162
  documentType,
895
- initialState: document,
1163
+ initialState: document?.state,
1164
+ header: document?.header,
896
1165
  options,
897
1166
  });
898
1167
  }
@@ -923,11 +1192,19 @@ export class BaseDocumentDriveServer {
923
1192
  async resultIfExistingOperations(id, operations) {
924
1193
  try {
925
1194
  const document = await this.getDocument(id);
926
- const newOperation = operations.find((op) => !op.id ||
927
- !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 &&
928
1204
  existingOp.index === op.index &&
929
- existingOp.type === op.type &&
930
- existingOp.hash === op.hash));
1205
+ existingOp.action.type === op.action.type &&
1206
+ existingOp.hash === op.hash);
1207
+ });
931
1208
  if (!newOperation) {
932
1209
  return {
933
1210
  status: "SUCCESS",
@@ -1158,10 +1435,10 @@ export class BaseDocumentDriveServer {
1158
1435
  const syncUnit = {
1159
1436
  documentId,
1160
1437
  documentType: document.header.documentType,
1161
- scope: operation.scope,
1438
+ scope: operation.action.scope,
1162
1439
  branch: "main", // TODO: handle branches
1163
1440
  revision: operation.index + 1,
1164
- lastUpdated: operation.timestamp,
1441
+ lastUpdated: operation.timestampUtcMs,
1165
1442
  };
1166
1443
  // checks if this sync unit was already added
1167
1444
  const exists = syncUnits.some((unit) => unit.documentId === syncUnit.documentId &&
@@ -1279,11 +1556,19 @@ export class BaseDocumentDriveServer {
1279
1556
  async resultIfExistingDriveOperations(driveId, operations) {
1280
1557
  try {
1281
1558
  const drive = await this.getDrive(driveId);
1282
- const newOperation = operations.find((op) => !op.id ||
1283
- !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 &&
1284
1568
  existingOp.index === op.index &&
1285
- existingOp.type === op.type &&
1286
- existingOp.hash === op.hash));
1569
+ existingOp.action.type === op.action.type &&
1570
+ existingOp.hash === op.hash);
1571
+ });
1287
1572
  if (!newOperation) {
1288
1573
  return {
1289
1574
  status: "SUCCESS",
@@ -1373,7 +1658,7 @@ export class BaseDocumentDriveServer {
1373
1658
  this.cache.setDrive(driveId, document).catch(this.logger.error);
1374
1659
  // update listener cache
1375
1660
  const lastOperation = operationsApplied
1376
- .filter((op) => op.scope === "global")
1661
+ .filter((op) => op.action.scope === "global")
1377
1662
  .slice()
1378
1663
  .pop();
1379
1664
  if (lastOperation) {
@@ -1396,7 +1681,7 @@ export class BaseDocumentDriveServer {
1396
1681
  documentType: document.header.documentType,
1397
1682
  scope: "global",
1398
1683
  branch: "main",
1399
- lastUpdated: lastOperation.timestamp,
1684
+ lastUpdated: lastOperation.timestampUtcMs,
1400
1685
  revision: lastOperation.index,
1401
1686
  },
1402
1687
  ], source, () => {
@@ -1456,7 +1741,11 @@ export class BaseDocumentDriveServer {
1456
1741
  const { reducer } = this.getDocumentModelModule(documentId.header.documentType);
1457
1742
  for (const action of actions) {
1458
1743
  documentId = reducer(documentId, action);
1459
- 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();
1460
1749
  if (!operation) {
1461
1750
  throw new Error("Error creating operations");
1462
1751
  }
@@ -1519,7 +1808,7 @@ export class BaseDocumentDriveServer {
1519
1808
  }
1520
1809
  async _legacyAddFileAction(driveId, action, options) {
1521
1810
  // create document before adding it to the drive
1522
- 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);
1523
1812
  document.header.id = action.input.id;
1524
1813
  document.header.name = action.input.name;
1525
1814
  document.header.documentType = action.input.documentType;
@@ -1590,6 +1879,14 @@ export class BaseDocumentDriveServer {
1590
1879
  }
1591
1880
  const operations = strand.operations.map((op) => ({
1592
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
+ },
1593
1890
  scope: strand.scope,
1594
1891
  branch: strand.branch,
1595
1892
  }));