document-drive 4.1.0-dev.9 → 4.1.0-dev.90

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (502) hide show
  1. package/dist/index.d.ts +17 -30
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +17 -19
  4. package/dist/index.js.map +1 -1
  5. package/dist/prisma/schema.prisma +2 -0
  6. package/dist/src/cache/index.d.ts +5 -0
  7. package/dist/src/cache/index.d.ts.map +1 -0
  8. package/dist/src/cache/index.js +5 -0
  9. package/dist/src/cache/index.js.map +1 -0
  10. package/dist/src/cache/lru.d.ts +2 -13
  11. package/dist/src/cache/lru.d.ts.map +1 -1
  12. package/dist/src/cache/lru.js +1 -2
  13. package/dist/src/cache/lru.js.map +1 -1
  14. package/dist/src/cache/memory.d.ts +3 -14
  15. package/dist/src/cache/memory.d.ts.map +1 -1
  16. package/dist/src/cache/memory.js +2 -3
  17. package/dist/src/cache/memory.js.map +1 -1
  18. package/dist/src/cache/redis.d.ts +3 -5
  19. package/dist/src/cache/redis.d.ts.map +1 -1
  20. package/dist/src/cache/redis.js +2 -4
  21. package/dist/src/cache/redis.js.map +1 -1
  22. package/dist/src/cache/types.d.ts +23 -2
  23. package/dist/src/cache/types.d.ts.map +1 -1
  24. package/dist/src/cache/util.d.ts +1 -1
  25. package/dist/src/cache/util.d.ts.map +1 -1
  26. package/dist/src/cache/util.js +11 -9
  27. package/dist/src/cache/util.js.map +1 -1
  28. package/dist/src/drive-document-model/constants.d.ts +2 -1
  29. package/dist/src/drive-document-model/constants.d.ts.map +1 -1
  30. package/dist/src/drive-document-model/constants.js +2 -2
  31. package/dist/src/drive-document-model/constants.js.map +1 -1
  32. package/dist/src/drive-document-model/gen/document-model.d.ts +2 -2
  33. package/dist/src/drive-document-model/gen/document-model.d.ts.map +1 -1
  34. package/dist/src/drive-document-model/gen/document-model.js +1 -1
  35. package/dist/src/drive-document-model/gen/document-model.js.map +1 -1
  36. package/dist/src/drive-document-model/gen/drive/actions.d.ts +12 -2
  37. package/dist/src/drive-document-model/gen/drive/actions.d.ts.map +1 -1
  38. package/dist/src/drive-document-model/gen/drive/creators.d.ts +2 -2
  39. package/dist/src/drive-document-model/gen/drive/creators.d.ts.map +1 -1
  40. package/dist/src/drive-document-model/gen/drive/creators.js +10 -10
  41. package/dist/src/drive-document-model/gen/drive/creators.js.map +1 -1
  42. package/dist/src/drive-document-model/gen/drive/index.d.ts +2 -0
  43. package/dist/src/drive-document-model/gen/drive/index.d.ts.map +1 -0
  44. package/dist/src/drive-document-model/gen/drive/index.js +2 -0
  45. package/dist/src/drive-document-model/gen/drive/index.js.map +1 -0
  46. package/dist/src/drive-document-model/gen/drive/types.d.ts +2 -0
  47. package/dist/src/drive-document-model/gen/drive/types.d.ts.map +1 -0
  48. package/dist/src/drive-document-model/gen/drive/types.js +2 -0
  49. package/dist/src/drive-document-model/gen/drive/types.js.map +1 -0
  50. package/dist/src/drive-document-model/gen/index.d.ts +7 -4
  51. package/dist/src/drive-document-model/gen/index.d.ts.map +1 -1
  52. package/dist/src/drive-document-model/gen/index.js +7 -4
  53. package/dist/src/drive-document-model/gen/index.js.map +1 -1
  54. package/dist/src/drive-document-model/gen/node/actions.d.ts +11 -2
  55. package/dist/src/drive-document-model/gen/node/actions.d.ts.map +1 -1
  56. package/dist/src/drive-document-model/gen/node/creators.d.ts +1 -2
  57. package/dist/src/drive-document-model/gen/node/creators.d.ts.map +1 -1
  58. package/dist/src/drive-document-model/gen/node/creators.js +9 -9
  59. package/dist/src/drive-document-model/gen/node/creators.js.map +1 -1
  60. package/dist/src/drive-document-model/gen/node/index.d.ts +2 -0
  61. package/dist/src/drive-document-model/gen/node/index.d.ts.map +1 -0
  62. package/dist/src/drive-document-model/gen/node/index.js +2 -0
  63. package/dist/src/drive-document-model/gen/node/index.js.map +1 -0
  64. package/dist/src/drive-document-model/gen/node/types.d.ts +2 -0
  65. package/dist/src/drive-document-model/gen/node/types.d.ts.map +1 -0
  66. package/dist/src/drive-document-model/gen/node/types.js +2 -0
  67. package/dist/src/drive-document-model/gen/node/types.js.map +1 -0
  68. package/dist/src/drive-document-model/gen/ph-factories.d.ts +12 -0
  69. package/dist/src/drive-document-model/gen/ph-factories.d.ts.map +1 -0
  70. package/dist/src/drive-document-model/gen/ph-factories.js +46 -0
  71. package/dist/src/drive-document-model/gen/ph-factories.js.map +1 -0
  72. package/dist/src/drive-document-model/gen/reducer.d.ts +3 -3
  73. package/dist/src/drive-document-model/gen/reducer.d.ts.map +1 -1
  74. package/dist/src/drive-document-model/gen/reducer.js +34 -36
  75. package/dist/src/drive-document-model/gen/reducer.js.map +1 -1
  76. package/dist/src/drive-document-model/gen/schema/index.d.ts +2 -2
  77. package/dist/src/drive-document-model/gen/schema/index.d.ts.map +1 -1
  78. package/dist/src/drive-document-model/gen/schema/index.js +2 -2
  79. package/dist/src/drive-document-model/gen/schema/index.js.map +1 -1
  80. package/dist/src/drive-document-model/gen/schema/types.d.ts +8 -3
  81. package/dist/src/drive-document-model/gen/schema/types.d.ts.map +1 -1
  82. package/dist/src/drive-document-model/gen/schema/zod.d.ts +28 -28
  83. package/dist/src/drive-document-model/gen/schema/zod.d.ts.map +1 -1
  84. package/dist/src/drive-document-model/gen/schema/zod.js.map +1 -1
  85. package/dist/src/drive-document-model/gen/types.d.ts +7 -8
  86. package/dist/src/drive-document-model/gen/types.d.ts.map +1 -1
  87. package/dist/src/drive-document-model/gen/types.js +3 -1
  88. package/dist/src/drive-document-model/gen/types.js.map +1 -1
  89. package/dist/src/drive-document-model/gen/utils.d.ts +7 -9
  90. package/dist/src/drive-document-model/gen/utils.d.ts.map +1 -1
  91. package/dist/src/drive-document-model/gen/utils.js +21 -37
  92. package/dist/src/drive-document-model/gen/utils.js.map +1 -1
  93. package/dist/src/drive-document-model/index.d.ts +4 -1
  94. package/dist/src/drive-document-model/index.d.ts.map +1 -1
  95. package/dist/src/drive-document-model/index.js +4 -1
  96. package/dist/src/drive-document-model/index.js.map +1 -1
  97. package/dist/src/drive-document-model/module.d.ts +2 -27
  98. package/dist/src/drive-document-model/module.d.ts.map +1 -1
  99. package/dist/src/drive-document-model/module.js +17 -16
  100. package/dist/src/drive-document-model/module.js.map +1 -1
  101. package/dist/src/drive-document-model/src/index.d.ts +3 -0
  102. package/dist/src/drive-document-model/src/index.d.ts.map +1 -0
  103. package/dist/src/drive-document-model/src/index.js +3 -0
  104. package/dist/src/drive-document-model/src/index.js.map +1 -0
  105. package/dist/src/drive-document-model/src/reducers/drive.d.ts +2 -2
  106. package/dist/src/drive-document-model/src/reducers/drive.d.ts.map +1 -1
  107. package/dist/src/drive-document-model/src/reducers/drive.js +1 -1
  108. package/dist/src/drive-document-model/src/reducers/drive.js.map +1 -1
  109. package/dist/src/drive-document-model/src/reducers/index.d.ts +3 -0
  110. package/dist/src/drive-document-model/src/reducers/index.d.ts.map +1 -0
  111. package/dist/src/drive-document-model/src/reducers/index.js +3 -0
  112. package/dist/src/drive-document-model/src/reducers/index.js.map +1 -0
  113. package/dist/src/drive-document-model/src/reducers/node.d.ts +2 -2
  114. package/dist/src/drive-document-model/src/reducers/node.d.ts.map +1 -1
  115. package/dist/src/drive-document-model/src/reducers/node.js +15 -4
  116. package/dist/src/drive-document-model/src/reducers/node.js.map +1 -1
  117. package/dist/src/drive-document-model/src/tests/actions.test.js +20 -22
  118. package/dist/src/drive-document-model/src/tests/actions.test.js.map +1 -1
  119. package/dist/src/drive-document-model/src/tests/base.test.js +12 -52
  120. package/dist/src/drive-document-model/src/tests/base.test.js.map +1 -1
  121. package/dist/src/drive-document-model/src/tests/document-model.test.js +3 -3
  122. package/dist/src/drive-document-model/src/tests/document-model.test.js.map +1 -1
  123. package/dist/src/drive-document-model/src/tests/drive.test.js +12 -15
  124. package/dist/src/drive-document-model/src/tests/drive.test.js.map +1 -1
  125. package/dist/src/drive-document-model/src/tests/generate-mock.d.ts +5 -0
  126. package/dist/src/drive-document-model/src/tests/generate-mock.d.ts.map +1 -0
  127. package/dist/src/drive-document-model/src/tests/generate-mock.js +5 -0
  128. package/dist/src/drive-document-model/src/tests/generate-mock.js.map +1 -0
  129. package/dist/src/drive-document-model/src/tests/node.test.js +75 -112
  130. package/dist/src/drive-document-model/src/tests/node.test.js.map +1 -1
  131. package/dist/src/drive-document-model/src/tests/test-factories.d.ts +9 -0
  132. package/dist/src/drive-document-model/src/tests/test-factories.d.ts.map +1 -0
  133. package/dist/src/drive-document-model/src/tests/test-factories.js +17 -0
  134. package/dist/src/drive-document-model/src/tests/test-factories.js.map +1 -0
  135. package/dist/src/drive-document-model/src/tests/utils.test.js +1 -1
  136. package/dist/src/drive-document-model/src/tests/utils.test.js.map +1 -1
  137. package/dist/src/drive-document-model/src/types.d.ts +8 -0
  138. package/dist/src/drive-document-model/src/types.d.ts.map +1 -0
  139. package/dist/src/drive-document-model/src/types.js +2 -0
  140. package/dist/src/drive-document-model/src/types.js.map +1 -0
  141. package/dist/src/drive-document-model/src/utils.d.ts +2 -7
  142. package/dist/src/drive-document-model/src/utils.d.ts.map +1 -1
  143. package/dist/src/drive-document-model/src/utils.js +4 -0
  144. package/dist/src/drive-document-model/src/utils.js.map +1 -1
  145. package/dist/src/drive-document-model/types.d.ts +10 -0
  146. package/dist/src/drive-document-model/types.d.ts.map +1 -0
  147. package/dist/src/drive-document-model/types.js +3 -0
  148. package/dist/src/drive-document-model/types.js.map +1 -0
  149. package/dist/src/processors/index.d.ts +4 -0
  150. package/dist/src/processors/index.d.ts.map +1 -0
  151. package/dist/src/processors/index.js +4 -0
  152. package/dist/src/processors/index.js.map +1 -0
  153. package/dist/src/processors/processor-manager.d.ts +1 -2
  154. package/dist/src/processors/processor-manager.d.ts.map +1 -1
  155. package/dist/src/processors/processor-manager.js +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 +19 -27
  202. package/dist/src/server/base-server.d.ts.map +1 -1
  203. package/dist/src/server/base-server.js +348 -68
  204. package/dist/src/server/base-server.js.map +1 -1
  205. package/dist/src/server/builder.d.ts +2 -5
  206. package/dist/src/server/builder.d.ts.map +1 -1
  207. package/dist/src/server/builder.js +8 -10
  208. package/dist/src/server/builder.js.map +1 -1
  209. package/dist/src/server/constants.d.ts +3 -0
  210. package/dist/src/server/constants.d.ts.map +1 -1
  211. package/dist/src/server/constants.js +3 -0
  212. package/dist/src/server/constants.js.map +1 -1
  213. package/dist/src/server/error.d.ts +6 -2
  214. package/dist/src/server/error.d.ts.map +1 -1
  215. package/dist/src/server/error.js +7 -2
  216. package/dist/src/server/error.js.map +1 -1
  217. package/dist/src/server/event-emitter.d.ts +2 -2
  218. package/dist/src/server/event-emitter.d.ts.map +1 -1
  219. package/dist/src/server/event-emitter.js.map +1 -1
  220. package/dist/src/server/index.d.ts +10 -0
  221. package/dist/src/server/index.d.ts.map +1 -0
  222. package/dist/src/server/index.js +10 -0
  223. package/dist/src/server/index.js.map +1 -0
  224. package/dist/src/server/listener/index.d.ts +2 -0
  225. package/dist/src/server/listener/index.d.ts.map +1 -1
  226. package/dist/src/server/listener/index.js +2 -0
  227. package/dist/src/server/listener/index.js.map +1 -1
  228. package/dist/src/server/listener/listener-manager.d.ts +4 -5
  229. package/dist/src/server/listener/listener-manager.d.ts.map +1 -1
  230. package/dist/src/server/listener/listener-manager.js +7 -9
  231. package/dist/src/server/listener/listener-manager.js.map +1 -1
  232. package/dist/src/server/listener/transmitter/factory.d.ts +3 -4
  233. package/dist/src/server/listener/transmitter/factory.d.ts.map +1 -1
  234. package/dist/src/server/listener/transmitter/factory.js +2 -3
  235. package/dist/src/server/listener/transmitter/factory.js.map +1 -1
  236. package/dist/src/server/listener/transmitter/index.d.ts +5 -0
  237. package/dist/src/server/listener/transmitter/index.d.ts.map +1 -0
  238. package/dist/src/server/listener/transmitter/index.js +5 -0
  239. package/dist/src/server/listener/transmitter/index.js.map +1 -0
  240. package/dist/src/server/listener/transmitter/internal.d.ts +3 -20
  241. package/dist/src/server/listener/transmitter/internal.d.ts.map +1 -1
  242. package/dist/src/server/listener/transmitter/internal.js +20 -16
  243. package/dist/src/server/listener/transmitter/internal.js.map +1 -1
  244. package/dist/src/server/listener/transmitter/pull-responder.d.ts +4 -22
  245. package/dist/src/server/listener/transmitter/pull-responder.d.ts.map +1 -1
  246. package/dist/src/server/listener/transmitter/pull-responder.js +7 -9
  247. package/dist/src/server/listener/transmitter/pull-responder.js.map +1 -1
  248. package/dist/src/server/listener/transmitter/switchboard-push.d.ts +1 -2
  249. package/dist/src/server/listener/transmitter/switchboard-push.d.ts.map +1 -1
  250. package/dist/src/server/listener/transmitter/switchboard-push.js +18 -5
  251. package/dist/src/server/listener/transmitter/switchboard-push.js.map +1 -1
  252. package/dist/src/server/listener/transmitter/types.d.ts +32 -2
  253. package/dist/src/server/listener/transmitter/types.d.ts.map +1 -1
  254. package/dist/src/server/listener/types.d.ts +2 -0
  255. package/dist/src/server/listener/types.d.ts.map +1 -0
  256. package/dist/src/server/listener/types.js +2 -0
  257. package/dist/src/server/listener/types.js.map +1 -0
  258. package/dist/src/server/sync-manager.d.ts +4 -7
  259. package/dist/src/server/sync-manager.d.ts.map +1 -1
  260. package/dist/src/server/sync-manager.js +13 -15
  261. package/dist/src/server/sync-manager.js.map +1 -1
  262. package/dist/src/server/sync-unit-map.d.ts +4 -25
  263. package/dist/src/server/sync-unit-map.d.ts.map +1 -1
  264. package/dist/src/server/sync-unit-map.js +0 -1
  265. package/dist/src/server/sync-unit-map.js.map +1 -1
  266. package/dist/src/server/types.d.ts +52 -35
  267. package/dist/src/server/types.d.ts.map +1 -1
  268. package/dist/src/server/types.js +10 -12
  269. package/dist/src/server/types.js.map +1 -1
  270. package/dist/src/server/utils.d.ts +3 -1
  271. package/dist/src/server/utils.d.ts.map +1 -1
  272. package/dist/src/server/utils.js +24 -5
  273. package/dist/src/server/utils.js.map +1 -1
  274. package/dist/src/storage/browser.d.ts +2 -2
  275. package/dist/src/storage/browser.d.ts.map +1 -1
  276. package/dist/src/storage/browser.js +9 -10
  277. package/dist/src/storage/browser.js.map +1 -1
  278. package/dist/src/storage/filesystem.d.ts +3 -3
  279. package/dist/src/storage/filesystem.d.ts.map +1 -1
  280. package/dist/src/storage/filesystem.js +31 -11
  281. package/dist/src/storage/filesystem.js.map +1 -1
  282. package/dist/src/storage/index.d.ts +4 -0
  283. package/dist/src/storage/index.d.ts.map +1 -0
  284. package/dist/src/storage/index.js +4 -0
  285. package/dist/src/storage/index.js.map +1 -0
  286. package/dist/src/storage/ipfs.d.ts +2 -3
  287. package/dist/src/storage/ipfs.d.ts.map +1 -1
  288. package/dist/src/storage/ipfs.js +7 -5
  289. package/dist/src/storage/ipfs.js.map +1 -1
  290. package/dist/src/storage/memory.d.ts +3 -3
  291. package/dist/src/storage/memory.d.ts.map +1 -1
  292. package/dist/src/storage/memory.js +33 -15
  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 +70 -42
  310. package/dist/src/storage/prisma/prisma.js.map +1 -1
  311. package/dist/src/storage/types.d.ts +1 -2
  312. package/dist/src/storage/types.d.ts.map +1 -1
  313. package/dist/src/storage/utils.d.ts +1 -1
  314. package/dist/src/storage/utils.d.ts.map +1 -1
  315. package/dist/src/utils/default-drives-manager.d.ts +1 -12
  316. package/dist/src/utils/default-drives-manager.d.ts.map +1 -1
  317. package/dist/src/utils/default-drives-manager.js +1 -2
  318. package/dist/src/utils/default-drives-manager.js.map +1 -1
  319. package/dist/src/utils/gql-transformations.d.ts +14 -5
  320. package/dist/src/utils/gql-transformations.d.ts.map +1 -1
  321. package/dist/src/utils/gql-transformations.js +19 -5
  322. package/dist/src/utils/gql-transformations.js.map +1 -1
  323. package/dist/src/utils/graphql.d.ts +6 -32
  324. package/dist/src/utils/graphql.d.ts.map +1 -1
  325. package/dist/src/utils/graphql.js +21 -31
  326. package/dist/src/utils/graphql.js.map +1 -1
  327. package/dist/src/utils/index.d.ts +8 -0
  328. package/dist/src/utils/index.d.ts.map +1 -0
  329. package/dist/src/utils/index.js +8 -0
  330. package/dist/src/utils/index.js.map +1 -0
  331. package/dist/src/utils/logger.d.ts +2 -8
  332. package/dist/src/utils/logger.d.ts.map +1 -1
  333. package/dist/src/utils/logger.js +6 -7
  334. package/dist/src/utils/logger.js.map +1 -1
  335. package/dist/src/utils/migrations.d.ts +1 -1
  336. package/dist/src/utils/migrations.d.ts.map +1 -1
  337. package/dist/src/utils/migrations.js +88 -18
  338. package/dist/src/utils/migrations.js.map +1 -1
  339. package/dist/src/utils/misc.d.ts +2 -6
  340. package/dist/src/utils/misc.d.ts.map +1 -1
  341. package/dist/src/utils/misc.js +9 -12
  342. package/dist/src/utils/misc.js.map +1 -1
  343. package/dist/src/utils/run-asap.d.ts +7 -11
  344. package/dist/src/utils/run-asap.d.ts.map +1 -1
  345. package/dist/src/utils/run-asap.js +110 -122
  346. package/dist/src/utils/run-asap.js.map +1 -1
  347. package/dist/src/utils/types.d.ts +50 -0
  348. package/dist/src/utils/types.d.ts.map +1 -0
  349. package/dist/src/utils/types.js +2 -0
  350. package/dist/src/utils/types.js.map +1 -0
  351. package/dist/test/benchmarks/getDrive.json +10 -0
  352. package/dist/test/benchmarks/processOperations.bench.d.ts +2 -0
  353. package/dist/test/benchmarks/processOperations.bench.d.ts.map +1 -0
  354. package/dist/test/benchmarks/processOperations.bench.js +148 -0
  355. package/dist/test/benchmarks/processOperations.bench.js.map +1 -0
  356. package/dist/test/benchmarks/queue.bench.d.ts +2 -0
  357. package/dist/test/benchmarks/queue.bench.d.ts.map +1 -0
  358. package/dist/test/benchmarks/queue.bench.js +51 -0
  359. package/dist/test/benchmarks/queue.bench.js.map +1 -0
  360. package/dist/test/benchmarks/strands.small.json +37085 -0
  361. package/dist/test/cache.test.d.ts +2 -0
  362. package/dist/test/cache.test.d.ts.map +1 -0
  363. package/dist/test/cache.test.js +275 -0
  364. package/dist/test/cache.test.js.map +1 -0
  365. package/dist/test/default-remote-drives.test.d.ts +2 -0
  366. package/dist/test/default-remote-drives.test.d.ts.map +1 -0
  367. package/dist/test/default-remote-drives.test.js +445 -0
  368. package/dist/test/default-remote-drives.test.js.map +1 -0
  369. package/dist/test/drive-operations.test.d.ts +2 -0
  370. package/dist/test/drive-operations.test.d.ts.map +1 -0
  371. package/dist/test/drive-operations.test.js +134 -0
  372. package/dist/test/drive-operations.test.js.map +1 -0
  373. package/dist/test/dual-action-create.test.d.ts +2 -0
  374. package/dist/test/dual-action-create.test.d.ts.map +1 -0
  375. package/dist/test/dual-action-create.test.js +187 -0
  376. package/dist/test/dual-action-create.test.js.map +1 -0
  377. package/dist/test/dual-action-migration.test.d.ts +2 -0
  378. package/dist/test/dual-action-migration.test.d.ts.map +1 -0
  379. package/dist/test/dual-action-migration.test.js +344 -0
  380. package/dist/test/dual-action-migration.test.js.map +1 -0
  381. package/dist/test/graphql.test.d.ts +2 -0
  382. package/dist/test/graphql.test.d.ts.map +1 -0
  383. package/dist/test/graphql.test.js +9 -0
  384. package/dist/test/graphql.test.js.map +1 -0
  385. package/dist/test/index.d.ts +2 -0
  386. package/dist/test/index.d.ts.map +1 -0
  387. package/dist/test/index.js +2 -0
  388. package/dist/test/index.js.map +1 -0
  389. package/dist/test/internal-listener.test.d.ts +2 -0
  390. package/dist/test/internal-listener.test.d.ts.map +1 -0
  391. package/dist/test/internal-listener.test.js +243 -0
  392. package/dist/test/internal-listener.test.js.map +1 -0
  393. package/dist/test/queue.test.d.ts +2 -0
  394. package/dist/test/queue.test.d.ts.map +1 -0
  395. package/dist/test/queue.test.js +324 -0
  396. package/dist/test/queue.test.js.map +1 -0
  397. package/dist/test/reactor.test.d.ts +2 -0
  398. package/dist/test/reactor.test.d.ts.map +1 -0
  399. package/dist/test/reactor.test.js +32 -0
  400. package/dist/test/reactor.test.js.map +1 -0
  401. package/dist/test/read-mode.test.d.ts +2 -0
  402. package/dist/test/read-mode.test.d.ts.map +1 -0
  403. package/dist/test/read-mode.test.js +569 -0
  404. package/dist/test/read-mode.test.js.map +1 -0
  405. package/dist/test/server/driveOperationsConflictResolution.test.d.ts +2 -0
  406. package/dist/test/server/driveOperationsConflictResolution.test.d.ts.map +1 -0
  407. package/dist/test/server/driveOperationsConflictResolution.test.js +486 -0
  408. package/dist/test/server/driveOperationsConflictResolution.test.js.map +1 -0
  409. package/dist/test/server/mergeOperations.test.d.ts +2 -0
  410. package/dist/test/server/mergeOperations.test.d.ts.map +1 -0
  411. package/dist/test/server/mergeOperations.test.js +115 -0
  412. package/dist/test/server/mergeOperations.test.js.map +1 -0
  413. package/dist/test/server/processOperations.test.d.ts +2 -0
  414. package/dist/test/server/processOperations.test.d.ts.map +1 -0
  415. package/dist/test/server/processOperations.test.js +392 -0
  416. package/dist/test/server/processOperations.test.js.map +1 -0
  417. package/dist/test/server.test.d.ts +2 -0
  418. package/dist/test/server.test.d.ts.map +1 -0
  419. package/dist/test/server.test.js +957 -0
  420. package/dist/test/server.test.js.map +1 -0
  421. package/dist/test/signature-migration.test.d.ts +2 -0
  422. package/dist/test/signature-migration.test.d.ts.map +1 -0
  423. package/dist/test/signature-migration.test.js +241 -0
  424. package/dist/test/signature-migration.test.js.map +1 -0
  425. package/dist/test/storage.test.d.ts +2 -0
  426. package/dist/test/storage.test.d.ts.map +1 -0
  427. package/dist/test/storage.test.js +522 -0
  428. package/dist/test/storage.test.js.map +1 -0
  429. package/dist/test/switchboard-push-listener.test.d.ts +2 -0
  430. package/dist/test/switchboard-push-listener.test.d.ts.map +1 -0
  431. package/dist/test/switchboard-push-listener.test.js +133 -0
  432. package/dist/test/switchboard-push-listener.test.js.map +1 -0
  433. package/dist/test/sync-manager.test.d.ts +2 -0
  434. package/dist/test/sync-manager.test.d.ts.map +1 -0
  435. package/dist/test/sync-manager.test.js +349 -0
  436. package/dist/test/sync-manager.test.js.map +1 -0
  437. package/dist/test/utils.d.ts +62 -0
  438. package/dist/test/utils.d.ts.map +1 -0
  439. package/dist/test/utils.js +158 -0
  440. package/dist/test/utils.js.map +1 -0
  441. package/dist/test/utils.test.d.ts +2 -0
  442. package/dist/test/utils.test.d.ts.map +1 -0
  443. package/dist/test/utils.test.js +86 -0
  444. package/dist/test/utils.test.js.map +1 -0
  445. package/dist/test/vitest-setup.d.ts +2 -0
  446. package/dist/test/vitest-setup.d.ts.map +1 -0
  447. package/dist/test/vitest-setup.js +5 -0
  448. package/dist/test/vitest-setup.js.map +1 -0
  449. package/dist/tsconfig.tsbuildinfo +1 -0
  450. package/dist/vitest.config.d.ts +3 -0
  451. package/dist/vitest.config.d.ts.map +1 -0
  452. package/dist/vitest.config.js +28 -0
  453. package/dist/vitest.config.js.map +1 -0
  454. package/package.json +39 -27
  455. package/prisma/schema.prisma +93 -0
  456. package/src/storage/prisma/client/default.d.ts +1 -0
  457. package/src/storage/prisma/client/default.js +1 -0
  458. package/src/storage/prisma/client/edge.d.ts +1 -0
  459. package/src/storage/prisma/client/edge.js +263 -0
  460. package/src/storage/prisma/client/index-browser.js +246 -0
  461. package/src/storage/prisma/client/index.d.ts +10318 -0
  462. package/src/storage/prisma/client/index.js +292 -0
  463. package/src/storage/prisma/client/libquery_engine-darwin-arm64.dylib.node +0 -0
  464. package/src/storage/prisma/client/libquery_engine-debian-openssl-3.0.x.so.node +0 -0
  465. package/src/storage/prisma/client/libquery_engine-linux-musl.so.node +0 -0
  466. package/src/storage/prisma/client/package.json +84 -0
  467. package/src/storage/prisma/client/runtime/edge-esm.js +31 -0
  468. package/src/storage/prisma/client/runtime/edge.js +31 -0
  469. package/src/storage/prisma/client/runtime/index-browser.d.ts +365 -0
  470. package/src/storage/prisma/client/runtime/index-browser.js +13 -0
  471. package/src/storage/prisma/client/runtime/library.d.ts +3273 -0
  472. package/src/storage/prisma/client/runtime/library.js +143 -0
  473. package/src/storage/prisma/client/runtime/react-native.js +80 -0
  474. package/src/storage/prisma/client/runtime/wasm.js +32 -0
  475. package/src/storage/prisma/client/schema.prisma +93 -0
  476. package/src/storage/prisma/client/wasm.d.ts +1 -0
  477. package/src/storage/prisma/client/wasm.js +246 -0
  478. package/dist/src/drive-document-model/gen/actions.d.ts +0 -6
  479. package/dist/src/drive-document-model/gen/actions.d.ts.map +0 -1
  480. package/dist/src/drive-document-model/gen/actions.js +0 -3
  481. package/dist/src/drive-document-model/gen/actions.js.map +0 -1
  482. package/dist/src/drive-document-model/gen/drive/object.d.ts +0 -14
  483. package/dist/src/drive-document-model/gen/drive/object.d.ts.map +0 -1
  484. package/dist/src/drive-document-model/gen/drive/object.js +0 -29
  485. package/dist/src/drive-document-model/gen/drive/object.js.map +0 -1
  486. package/dist/src/drive-document-model/gen/drive/operations.d.ts +0 -14
  487. package/dist/src/drive-document-model/gen/drive/operations.d.ts.map +0 -1
  488. package/dist/src/drive-document-model/gen/drive/operations.js +0 -2
  489. package/dist/src/drive-document-model/gen/drive/operations.js.map +0 -1
  490. package/dist/src/drive-document-model/gen/node/object.d.ts +0 -13
  491. package/dist/src/drive-document-model/gen/node/object.d.ts.map +0 -1
  492. package/dist/src/drive-document-model/gen/node/object.js +0 -26
  493. package/dist/src/drive-document-model/gen/node/object.js.map +0 -1
  494. package/dist/src/drive-document-model/gen/node/operations.d.ts +0 -13
  495. package/dist/src/drive-document-model/gen/node/operations.d.ts.map +0 -1
  496. package/dist/src/drive-document-model/gen/node/operations.js +0 -2
  497. package/dist/src/drive-document-model/gen/node/operations.js.map +0 -1
  498. package/dist/src/drive-document-model/gen/object.d.ts +0 -18
  499. package/dist/src/drive-document-model/gen/object.d.ts.map +0 -1
  500. package/dist/src/drive-document-model/gen/object.js +0 -28
  501. package/dist/src/drive-document-model/gen/object.js.map +0 -1
  502. package/dist/tsconfig.lib.tsbuildinfo +0 -1
@@ -1,19 +1,8 @@
1
- import { removeListener, removeTrigger, setSharingType, } from "#drive-document-model/gen/creators";
2
- import { createDocument } from "#drive-document-model/gen/utils";
3
- import { isActionJob, isDocumentJob, isOperationJob, } from "#queue/types";
4
- import { ReadModeServer } from "#read-mode/server";
5
- import { DefaultDrivesManager, } from "#utils/default-drives-manager";
6
- import { requestPublicDriveWithTokenFromReactor } from "#utils/graphql";
7
- import { isDocumentDrive, runAsapAsync } from "#utils/misc";
8
- import { RunAsap } from "#utils/run-asap";
9
- import { DocumentAlreadyExistsError, childLogger, } from "document-drive";
10
- import { attachBranch, createPresignedHeader, garbageCollect, garbageCollectDocumentOperations, groupOperationsByScope, merge, precedes, removeExistingOperations, replayDocument, reshuffleByTimestamp, skipHeaderOperations, sortOperations, validateHeader, } from "document-model";
1
+ import { ConflictOperationError, DefaultDrivesManager, DefaultListenerManagerOptions, DocumentAlreadyExistsError, OperationError, PullResponderTransmitter, ReadModeServer, SwitchboardPushTransmitter, childLogger, driveCreateDocument, driveCreateState, filterOperationsByRevision, isActionJob, isAtRevision, isDocumentDrive, isDocumentJob, isOperationJob, removeListener, removeTrigger, requestPublicDriveWithTokenFromReactor, resolveCreateDocumentInput, setSharingType, } from "document-drive";
2
+ import { runAsap, runAsapAsync } from "document-drive/run-asap";
3
+ import {} from "document-model";
4
+ import { attachBranch, createPresignedHeader, defaultBaseState, garbageCollect, garbageCollectDocumentOperations, groupOperationsByScope, hashDocumentStateForScope, merge, precedes, removeExistingOperations, replayDocument, reshuffleByTimestamp, skipHeaderOperations, sortOperations, validateHeader, } from "document-model/core";
11
5
  import { ClientError } from "graphql-request";
12
- import { ConflictOperationError, OperationError, } from "./error.js";
13
- import { PullResponderTransmitter, } from "./listener/transmitter/pull-responder.js";
14
- import { SwitchboardPushTransmitter } from "./listener/transmitter/switchboard-push.js";
15
- import { DefaultListenerManagerOptions, } from "./types.js";
16
- import { filterOperationsByRevision, isAtRevision, resolveCreateDocumentInput, } from "./utils.js";
17
6
  export class BaseDocumentDriveServer {
18
7
  logger = childLogger(["BaseDocumentDriveServer"]);
19
8
  // external dependencies
@@ -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,83 @@ 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
  }
787
1030
  const operationSignals = [];
788
- newDocument = documentModelModule.reducer(newDocument, operation, (signal) => {
1031
+ newDocument = documentModelModule.reducer(newDocument, operation.action, (signal) => {
789
1032
  let handler = undefined;
790
1033
  switch (signal.type) {
791
1034
  case "CREATE_CHILD_DOCUMENT":
@@ -801,8 +1044,16 @@ export class BaseDocumentDriveServer {
801
1044
  if (handler) {
802
1045
  operationSignals.push(() => handler().then((result) => ({ signal, result })));
803
1046
  }
804
- }, { skip: operation.skip, reuseOperationResultingState: true });
805
- const appliedOperations = newDocument.operations[operation.scope].filter((op) => op.index == operation.index && op.skip == operation.skip);
1047
+ }, {
1048
+ skip: operation.skip,
1049
+ reuseOperationResultingState: true,
1050
+ replayOptions: { operation },
1051
+ });
1052
+ const newDocScopeOperations = newDocument.operations[operation.action.scope];
1053
+ if (!newDocScopeOperations) {
1054
+ throw new OperationError("ERROR", operation, `No operations found for scope: ${operation.action.scope}`);
1055
+ }
1056
+ const appliedOperations = newDocScopeOperations.filter((op) => op.index == operation.index && op.skip == operation.skip);
806
1057
  const appliedOperation = appliedOperations.at(0);
807
1058
  if (!appliedOperation) {
808
1059
  throw new OperationError("ERROR", operation, `Operation with index ${operation.index}:${operation.skip} was not applied.`);
@@ -889,7 +1140,8 @@ export class BaseDocumentDriveServer {
889
1140
  jobId = await this.queueManager.addJob({
890
1141
  documentId: id,
891
1142
  documentType,
892
- initialState: document,
1143
+ initialState: document?.state,
1144
+ header: document?.header,
893
1145
  options,
894
1146
  });
895
1147
  }
@@ -920,11 +1172,19 @@ export class BaseDocumentDriveServer {
920
1172
  async resultIfExistingOperations(id, operations) {
921
1173
  try {
922
1174
  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 &&
1175
+ const newOperation = operations.find((op) => {
1176
+ if (!op.id) {
1177
+ return true;
1178
+ }
1179
+ const scopeOps = document.operations[op.action.scope];
1180
+ if (!scopeOps) {
1181
+ return true;
1182
+ }
1183
+ return !scopeOps.find((existingOp) => existingOp.id === op.id &&
925
1184
  existingOp.index === op.index &&
926
- existingOp.type === op.type &&
927
- existingOp.hash === op.hash));
1185
+ existingOp.action.type === op.action.type &&
1186
+ existingOp.hash === op.hash);
1187
+ });
928
1188
  if (!newOperation) {
929
1189
  return {
930
1190
  status: "SUCCESS",
@@ -1155,10 +1415,10 @@ export class BaseDocumentDriveServer {
1155
1415
  const syncUnit = {
1156
1416
  documentId,
1157
1417
  documentType: document.header.documentType,
1158
- scope: operation.scope,
1418
+ scope: operation.action.scope,
1159
1419
  branch: "main", // TODO: handle branches
1160
1420
  revision: operation.index + 1,
1161
- lastUpdated: operation.timestamp,
1421
+ lastUpdated: operation.timestampUtcMs,
1162
1422
  };
1163
1423
  // checks if this sync unit was already added
1164
1424
  const exists = syncUnits.some((unit) => unit.documentId === syncUnit.documentId &&
@@ -1276,11 +1536,19 @@ export class BaseDocumentDriveServer {
1276
1536
  async resultIfExistingDriveOperations(driveId, operations) {
1277
1537
  try {
1278
1538
  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 &&
1539
+ const newOperation = operations.find((op) => {
1540
+ if (!op.id) {
1541
+ return true;
1542
+ }
1543
+ const scopeOps = drive.operations[op.action.scope];
1544
+ if (!scopeOps) {
1545
+ return true;
1546
+ }
1547
+ return !scopeOps.find((existingOp) => existingOp.id === op.id &&
1281
1548
  existingOp.index === op.index &&
1282
- existingOp.type === op.type &&
1283
- existingOp.hash === op.hash));
1549
+ existingOp.action.type === op.action.type &&
1550
+ existingOp.hash === op.hash);
1551
+ });
1284
1552
  if (!newOperation) {
1285
1553
  return {
1286
1554
  status: "SUCCESS",
@@ -1370,7 +1638,7 @@ export class BaseDocumentDriveServer {
1370
1638
  this.cache.setDrive(driveId, document).catch(this.logger.error);
1371
1639
  // update listener cache
1372
1640
  const lastOperation = operationsApplied
1373
- .filter((op) => op.scope === "global")
1641
+ .filter((op) => op.action.scope === "global")
1374
1642
  .slice()
1375
1643
  .pop();
1376
1644
  if (lastOperation) {
@@ -1393,7 +1661,7 @@ export class BaseDocumentDriveServer {
1393
1661
  documentType: document.header.documentType,
1394
1662
  scope: "global",
1395
1663
  branch: "main",
1396
- lastUpdated: lastOperation.timestamp,
1664
+ lastUpdated: lastOperation.timestampUtcMs,
1397
1665
  revision: lastOperation.index,
1398
1666
  },
1399
1667
  ], source, () => {
@@ -1453,7 +1721,11 @@ export class BaseDocumentDriveServer {
1453
1721
  const { reducer } = this.getDocumentModelModule(documentId.header.documentType);
1454
1722
  for (const action of actions) {
1455
1723
  documentId = reducer(documentId, action);
1456
- const operation = documentId.operations[action.scope].slice().pop();
1724
+ const scopeOps = documentId.operations[action.scope];
1725
+ if (!scopeOps) {
1726
+ throw new Error(`No operations found for scope: ${action.scope}`);
1727
+ }
1728
+ const operation = scopeOps.slice().pop();
1457
1729
  if (!operation) {
1458
1730
  throw new Error("Error creating operations");
1459
1731
  }
@@ -1516,7 +1788,7 @@ export class BaseDocumentDriveServer {
1516
1788
  }
1517
1789
  async _legacyAddFileAction(driveId, action, options) {
1518
1790
  // create document before adding it to the drive
1519
- const document = this.getDocumentModelModule(action.input.documentType).utils.createDocument({ ...action.input.document });
1791
+ const document = this.getDocumentModelModule(action.input.documentType).utils.createDocument(action.input.document?.state || undefined);
1520
1792
  document.header.id = action.input.id;
1521
1793
  document.header.name = action.input.name;
1522
1794
  document.header.documentType = action.input.documentType;
@@ -1587,6 +1859,14 @@ export class BaseDocumentDriveServer {
1587
1859
  }
1588
1860
  const operations = strand.operations.map((op) => ({
1589
1861
  ...op,
1862
+ action: {
1863
+ id: op.actionId,
1864
+ timestampUtcMs: op.timestampUtcMs,
1865
+ type: op.type,
1866
+ input: op.input,
1867
+ context: op.context,
1868
+ scope: strand.scope,
1869
+ },
1590
1870
  scope: strand.scope,
1591
1871
  branch: strand.branch,
1592
1872
  }));