document-drive 4.1.0-dev.11 → 4.1.0-dev.110

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 (537) hide show
  1. package/dist/index.d.ts +1 -30
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +1 -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 +1 -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 +1 -2
  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 -3
  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 +1 -1
  29. package/dist/src/drive-document-model/constants.d.ts.map +1 -1
  30. package/dist/src/drive-document-model/constants.js +1 -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/document-schema.d.ts +288 -0
  37. package/dist/src/drive-document-model/gen/document-schema.d.ts.map +1 -0
  38. package/dist/src/drive-document-model/gen/document-schema.js +35 -0
  39. package/dist/src/drive-document-model/gen/document-schema.js.map +1 -0
  40. package/dist/src/drive-document-model/gen/document-type.d.ts +2 -0
  41. package/dist/src/drive-document-model/gen/document-type.d.ts.map +1 -0
  42. package/dist/src/drive-document-model/gen/document-type.js +2 -0
  43. package/dist/src/drive-document-model/gen/document-type.js.map +1 -0
  44. package/dist/src/drive-document-model/gen/drive/actions.d.ts +12 -2
  45. package/dist/src/drive-document-model/gen/drive/actions.d.ts.map +1 -1
  46. package/dist/src/drive-document-model/gen/drive/creators.d.ts +1 -2
  47. package/dist/src/drive-document-model/gen/drive/creators.d.ts.map +1 -1
  48. package/dist/src/drive-document-model/gen/drive/creators.js +10 -10
  49. package/dist/src/drive-document-model/gen/drive/creators.js.map +1 -1
  50. package/dist/src/drive-document-model/gen/drive/index.d.ts +2 -0
  51. package/dist/src/drive-document-model/gen/drive/index.d.ts.map +1 -0
  52. package/dist/src/drive-document-model/gen/drive/index.js +2 -0
  53. package/dist/src/drive-document-model/gen/drive/index.js.map +1 -0
  54. package/dist/src/drive-document-model/gen/drive/types.d.ts +2 -0
  55. package/dist/src/drive-document-model/gen/drive/types.d.ts.map +1 -0
  56. package/dist/src/drive-document-model/gen/drive/types.js +2 -0
  57. package/dist/src/drive-document-model/gen/drive/types.js.map +1 -0
  58. package/dist/src/drive-document-model/gen/index.d.ts +8 -4
  59. package/dist/src/drive-document-model/gen/index.d.ts.map +1 -1
  60. package/dist/src/drive-document-model/gen/index.js +8 -4
  61. package/dist/src/drive-document-model/gen/index.js.map +1 -1
  62. package/dist/src/drive-document-model/gen/node/actions.d.ts +11 -2
  63. package/dist/src/drive-document-model/gen/node/actions.d.ts.map +1 -1
  64. package/dist/src/drive-document-model/gen/node/creators.d.ts +1 -2
  65. package/dist/src/drive-document-model/gen/node/creators.d.ts.map +1 -1
  66. package/dist/src/drive-document-model/gen/node/creators.js +9 -9
  67. package/dist/src/drive-document-model/gen/node/creators.js.map +1 -1
  68. package/dist/src/drive-document-model/gen/node/index.d.ts +2 -0
  69. package/dist/src/drive-document-model/gen/node/index.d.ts.map +1 -0
  70. package/dist/src/drive-document-model/gen/node/index.js +2 -0
  71. package/dist/src/drive-document-model/gen/node/index.js.map +1 -0
  72. package/dist/src/drive-document-model/gen/node/types.d.ts +2 -0
  73. package/dist/src/drive-document-model/gen/node/types.d.ts.map +1 -0
  74. package/dist/src/drive-document-model/gen/node/types.js +2 -0
  75. package/dist/src/drive-document-model/gen/node/types.js.map +1 -0
  76. package/dist/src/drive-document-model/gen/ph-factories.d.ts +12 -0
  77. package/dist/src/drive-document-model/gen/ph-factories.d.ts.map +1 -0
  78. package/dist/src/drive-document-model/gen/ph-factories.js +46 -0
  79. package/dist/src/drive-document-model/gen/ph-factories.js.map +1 -0
  80. package/dist/src/drive-document-model/gen/reducer.d.ts +3 -3
  81. package/dist/src/drive-document-model/gen/reducer.d.ts.map +1 -1
  82. package/dist/src/drive-document-model/gen/reducer.js +36 -36
  83. package/dist/src/drive-document-model/gen/reducer.js.map +1 -1
  84. package/dist/src/drive-document-model/gen/schema/index.d.ts +1 -2
  85. package/dist/src/drive-document-model/gen/schema/index.d.ts.map +1 -1
  86. package/dist/src/drive-document-model/gen/schema/index.js +1 -2
  87. package/dist/src/drive-document-model/gen/schema/index.js.map +1 -1
  88. package/dist/src/drive-document-model/gen/schema/types.d.ts +8 -3
  89. package/dist/src/drive-document-model/gen/schema/types.d.ts.map +1 -1
  90. package/dist/src/drive-document-model/gen/schema/zod.d.ts +28 -28
  91. package/dist/src/drive-document-model/gen/schema/zod.d.ts.map +1 -1
  92. package/dist/src/drive-document-model/gen/schema/zod.js.map +1 -1
  93. package/dist/src/drive-document-model/gen/types.d.ts +7 -8
  94. package/dist/src/drive-document-model/gen/types.d.ts.map +1 -1
  95. package/dist/src/drive-document-model/gen/types.js +3 -1
  96. package/dist/src/drive-document-model/gen/types.js.map +1 -1
  97. package/dist/src/drive-document-model/gen/utils.d.ts +11 -9
  98. package/dist/src/drive-document-model/gen/utils.d.ts.map +1 -1
  99. package/dist/src/drive-document-model/gen/utils.js +36 -38
  100. package/dist/src/drive-document-model/gen/utils.js.map +1 -1
  101. package/dist/src/drive-document-model/index.d.ts +4 -1
  102. package/dist/src/drive-document-model/index.d.ts.map +1 -1
  103. package/dist/src/drive-document-model/index.js +4 -1
  104. package/dist/src/drive-document-model/index.js.map +1 -1
  105. package/dist/src/drive-document-model/module.d.ts +2 -27
  106. package/dist/src/drive-document-model/module.d.ts.map +1 -1
  107. package/dist/src/drive-document-model/module.js +21 -16
  108. package/dist/src/drive-document-model/module.js.map +1 -1
  109. package/dist/src/drive-document-model/src/index.d.ts +3 -0
  110. package/dist/src/drive-document-model/src/index.d.ts.map +1 -0
  111. package/dist/src/drive-document-model/src/index.js +3 -0
  112. package/dist/src/drive-document-model/src/index.js.map +1 -0
  113. package/dist/src/drive-document-model/src/reducers/drive.d.ts +2 -2
  114. package/dist/src/drive-document-model/src/reducers/drive.d.ts.map +1 -1
  115. package/dist/src/drive-document-model/src/reducers/drive.js +1 -1
  116. package/dist/src/drive-document-model/src/reducers/drive.js.map +1 -1
  117. package/dist/src/drive-document-model/src/reducers/index.d.ts +3 -0
  118. package/dist/src/drive-document-model/src/reducers/index.d.ts.map +1 -0
  119. package/dist/src/drive-document-model/src/reducers/index.js +3 -0
  120. package/dist/src/drive-document-model/src/reducers/index.js.map +1 -0
  121. package/dist/src/drive-document-model/src/reducers/node.d.ts +2 -2
  122. package/dist/src/drive-document-model/src/reducers/node.d.ts.map +1 -1
  123. package/dist/src/drive-document-model/src/reducers/node.js +16 -4
  124. package/dist/src/drive-document-model/src/reducers/node.js.map +1 -1
  125. package/dist/src/drive-document-model/src/tests/actions.test.js +20 -22
  126. package/dist/src/drive-document-model/src/tests/actions.test.js.map +1 -1
  127. package/dist/src/drive-document-model/src/tests/base.test.js +12 -52
  128. package/dist/src/drive-document-model/src/tests/base.test.js.map +1 -1
  129. package/dist/src/drive-document-model/src/tests/document-model.test.js +3 -3
  130. package/dist/src/drive-document-model/src/tests/document-model.test.js.map +1 -1
  131. package/dist/src/drive-document-model/src/tests/drive.test.js +12 -15
  132. package/dist/src/drive-document-model/src/tests/drive.test.js.map +1 -1
  133. package/dist/src/drive-document-model/src/tests/generate-mock.d.ts +5 -0
  134. package/dist/src/drive-document-model/src/tests/generate-mock.d.ts.map +1 -0
  135. package/dist/src/drive-document-model/src/tests/generate-mock.js +5 -0
  136. package/dist/src/drive-document-model/src/tests/generate-mock.js.map +1 -0
  137. package/dist/src/drive-document-model/src/tests/node.test.js +75 -112
  138. package/dist/src/drive-document-model/src/tests/node.test.js.map +1 -1
  139. package/dist/src/drive-document-model/src/tests/test-factories.d.ts +9 -0
  140. package/dist/src/drive-document-model/src/tests/test-factories.d.ts.map +1 -0
  141. package/dist/src/drive-document-model/src/tests/test-factories.js +17 -0
  142. package/dist/src/drive-document-model/src/tests/test-factories.js.map +1 -0
  143. package/dist/src/drive-document-model/src/tests/utils.test.js +1 -1
  144. package/dist/src/drive-document-model/src/tests/utils.test.js.map +1 -1
  145. package/dist/src/drive-document-model/src/types.d.ts +8 -0
  146. package/dist/src/drive-document-model/src/types.d.ts.map +1 -0
  147. package/dist/src/drive-document-model/src/types.js.map +1 -0
  148. package/dist/src/drive-document-model/src/utils.d.ts +2 -7
  149. package/dist/src/drive-document-model/src/utils.d.ts.map +1 -1
  150. package/dist/src/drive-document-model/src/utils.js +4 -0
  151. package/dist/src/drive-document-model/src/utils.js.map +1 -1
  152. package/dist/src/drive-document-model/types.d.ts +10 -0
  153. package/dist/src/drive-document-model/types.d.ts.map +1 -0
  154. package/dist/src/drive-document-model/types.js +3 -0
  155. package/dist/src/drive-document-model/types.js.map +1 -0
  156. package/dist/src/index.d.ts +17 -0
  157. package/dist/src/index.d.ts.map +1 -0
  158. package/dist/src/index.js +17 -0
  159. package/dist/src/index.js.map +1 -0
  160. package/dist/src/processors/index.d.ts +4 -0
  161. package/dist/src/processors/index.d.ts.map +1 -0
  162. package/dist/src/processors/index.js +4 -0
  163. package/dist/src/processors/index.js.map +1 -0
  164. package/dist/src/processors/processor-manager.d.ts +1 -2
  165. package/dist/src/processors/processor-manager.d.ts.map +1 -1
  166. package/dist/src/processors/processor-manager.js +6 -5
  167. package/dist/src/processors/processor-manager.js.map +1 -1
  168. package/dist/src/processors/relational.d.ts +4 -17
  169. package/dist/src/processors/relational.d.ts.map +1 -1
  170. package/dist/src/processors/relational.js +3 -6
  171. package/dist/src/processors/relational.js.map +1 -1
  172. package/dist/src/processors/types.d.ts +19 -10
  173. package/dist/src/processors/types.d.ts.map +1 -1
  174. package/dist/src/processors/utils.d.ts +1 -2
  175. package/dist/src/processors/utils.d.ts.map +1 -1
  176. package/dist/src/processors/utils.js +0 -2
  177. package/dist/src/processors/utils.js.map +1 -1
  178. package/dist/src/queue/base.d.ts +1 -1
  179. package/dist/src/queue/base.d.ts.map +1 -1
  180. package/dist/src/queue/event.d.ts +4 -5
  181. package/dist/src/queue/event.d.ts.map +1 -1
  182. package/dist/src/queue/event.js +11 -7
  183. package/dist/src/queue/event.js.map +1 -1
  184. package/dist/src/queue/index.d.ts +5 -0
  185. package/dist/src/queue/index.d.ts.map +1 -0
  186. package/dist/src/queue/index.js +5 -0
  187. package/dist/src/queue/index.js.map +1 -0
  188. package/dist/src/queue/redis.js +1 -1
  189. package/dist/src/queue/redis.js.map +1 -1
  190. package/dist/src/queue/types.d.ts +4 -6
  191. package/dist/src/queue/types.d.ts.map +1 -1
  192. package/dist/src/queue/types.js +1 -9
  193. package/dist/src/queue/types.js.map +1 -1
  194. package/dist/src/queue/utils.d.ts +5 -0
  195. package/dist/src/queue/utils.d.ts.map +1 -0
  196. package/dist/src/queue/utils.js +10 -0
  197. package/dist/src/queue/utils.js.map +1 -0
  198. package/dist/src/read-mode/index.d.ts +4 -0
  199. package/dist/src/read-mode/index.d.ts.map +1 -0
  200. package/dist/src/read-mode/index.js +4 -0
  201. package/dist/src/read-mode/index.js.map +1 -0
  202. package/dist/src/read-mode/server.d.ts +1 -2
  203. package/dist/src/read-mode/server.d.ts.map +1 -1
  204. package/dist/src/read-mode/server.js +1 -2
  205. package/dist/src/read-mode/server.js.map +1 -1
  206. package/dist/src/read-mode/service.d.ts +4 -5
  207. package/dist/src/read-mode/service.d.ts.map +1 -1
  208. package/dist/src/read-mode/service.js +3 -4
  209. package/dist/src/read-mode/service.js.map +1 -1
  210. package/dist/src/read-mode/types.d.ts +4 -8
  211. package/dist/src/read-mode/types.d.ts.map +1 -1
  212. package/dist/src/server/base-server.d.ts +19 -28
  213. package/dist/src/server/base-server.d.ts.map +1 -1
  214. package/dist/src/server/base-server.js +381 -65
  215. package/dist/src/server/base-server.js.map +1 -1
  216. package/dist/src/server/builder.d.ts +2 -5
  217. package/dist/src/server/builder.d.ts.map +1 -1
  218. package/dist/src/server/builder.js +13 -7
  219. package/dist/src/server/builder.js.map +1 -1
  220. package/dist/src/server/error.d.ts +6 -2
  221. package/dist/src/server/error.d.ts.map +1 -1
  222. package/dist/src/server/error.js +7 -2
  223. package/dist/src/server/error.js.map +1 -1
  224. package/dist/src/server/event-emitter.d.ts +2 -2
  225. package/dist/src/server/event-emitter.d.ts.map +1 -1
  226. package/dist/src/server/event-emitter.js.map +1 -1
  227. package/dist/src/server/index.d.ts +10 -0
  228. package/dist/src/server/index.d.ts.map +1 -0
  229. package/dist/src/server/index.js +10 -0
  230. package/dist/src/server/index.js.map +1 -0
  231. package/dist/src/server/listener/constants.d.ts +4 -0
  232. package/dist/src/server/listener/constants.d.ts.map +1 -0
  233. package/dist/src/server/listener/constants.js +4 -0
  234. package/dist/src/server/listener/constants.js.map +1 -0
  235. package/dist/src/server/listener/index.d.ts +2 -0
  236. package/dist/src/server/listener/index.d.ts.map +1 -1
  237. package/dist/src/server/listener/index.js +2 -0
  238. package/dist/src/server/listener/index.js.map +1 -1
  239. package/dist/src/server/listener/listener-manager.d.ts +4 -5
  240. package/dist/src/server/listener/listener-manager.d.ts.map +1 -1
  241. package/dist/src/server/listener/listener-manager.js +4 -4
  242. package/dist/src/server/listener/listener-manager.js.map +1 -1
  243. package/dist/src/server/sync-manager.d.ts +3 -6
  244. package/dist/src/server/sync-manager.d.ts.map +1 -1
  245. package/dist/src/server/sync-manager.js +14 -13
  246. package/dist/src/server/sync-manager.js.map +1 -1
  247. package/dist/src/server/sync-unit-map.d.ts +4 -25
  248. package/dist/src/server/sync-unit-map.d.ts.map +1 -1
  249. package/dist/src/server/sync-unit-map.js +0 -1
  250. package/dist/src/server/sync-unit-map.js.map +1 -1
  251. package/dist/src/server/transmitter/constants.d.ts.map +1 -0
  252. package/dist/src/server/transmitter/constants.js.map +1 -0
  253. package/dist/src/server/transmitter/factory.d.ts +7 -0
  254. package/dist/src/server/transmitter/factory.d.ts.map +1 -0
  255. package/dist/src/server/{listener/transmitter → transmitter}/factory.js +1 -1
  256. package/dist/src/server/transmitter/factory.js.map +1 -0
  257. package/dist/src/server/transmitter/index.d.ts +6 -0
  258. package/dist/src/server/transmitter/index.d.ts.map +1 -0
  259. package/dist/src/server/transmitter/index.js +5 -0
  260. package/dist/src/server/transmitter/index.js.map +1 -0
  261. package/dist/src/server/transmitter/internal.d.ts +12 -0
  262. package/dist/src/server/transmitter/internal.d.ts.map +1 -0
  263. package/dist/src/server/{listener/transmitter → transmitter}/internal.js +22 -16
  264. package/dist/src/server/transmitter/internal.js.map +1 -0
  265. package/dist/src/server/{listener/transmitter → transmitter}/pull-responder.d.ts +3 -22
  266. package/dist/src/server/transmitter/pull-responder.d.ts.map +1 -0
  267. package/dist/src/server/{listener/transmitter → transmitter}/pull-responder.js +11 -9
  268. package/dist/src/server/transmitter/pull-responder.js.map +1 -0
  269. package/dist/src/server/{listener/transmitter → transmitter}/switchboard-push.d.ts +1 -2
  270. package/dist/src/server/transmitter/switchboard-push.d.ts.map +1 -0
  271. package/dist/src/server/{listener/transmitter → transmitter}/switchboard-push.js +21 -5
  272. package/dist/src/server/transmitter/switchboard-push.js.map +1 -0
  273. package/dist/src/server/transmitter/types.d.ts +53 -0
  274. package/dist/src/server/transmitter/types.d.ts.map +1 -0
  275. package/dist/src/server/transmitter/types.js +2 -0
  276. package/dist/src/server/transmitter/types.js.map +1 -0
  277. package/dist/src/server/types.d.ts +50 -33
  278. package/dist/src/server/types.d.ts.map +1 -1
  279. package/dist/src/server/types.js +9 -12
  280. package/dist/src/server/types.js.map +1 -1
  281. package/dist/src/server/utils.d.ts +3 -1
  282. package/dist/src/server/utils.d.ts.map +1 -1
  283. package/dist/src/server/utils.js +24 -5
  284. package/dist/src/server/utils.js.map +1 -1
  285. package/dist/src/storage/browser.d.ts +2 -2
  286. package/dist/src/storage/browser.d.ts.map +1 -1
  287. package/dist/src/storage/browser.js +18 -12
  288. package/dist/src/storage/browser.js.map +1 -1
  289. package/dist/src/storage/filesystem.d.ts +3 -3
  290. package/dist/src/storage/filesystem.d.ts.map +1 -1
  291. package/dist/src/storage/filesystem.js +41 -13
  292. package/dist/src/storage/filesystem.js.map +1 -1
  293. package/dist/src/storage/index.d.ts +4 -0
  294. package/dist/src/storage/index.d.ts.map +1 -0
  295. package/dist/src/storage/index.js +4 -0
  296. package/dist/src/storage/index.js.map +1 -0
  297. package/dist/src/storage/ipfs.d.ts +2 -3
  298. package/dist/src/storage/ipfs.d.ts.map +1 -1
  299. package/dist/src/storage/ipfs.js +7 -5
  300. package/dist/src/storage/ipfs.js.map +1 -1
  301. package/dist/src/storage/memory.d.ts +3 -3
  302. package/dist/src/storage/memory.d.ts.map +1 -1
  303. package/dist/src/storage/memory.js +43 -17
  304. package/dist/src/storage/memory.js.map +1 -1
  305. package/dist/src/storage/prisma/client/edge.js +17 -8
  306. package/dist/src/storage/prisma/client/index-browser.js +1 -0
  307. package/dist/src/storage/prisma/client/index.d.ts +45 -0
  308. package/dist/src/storage/prisma/client/index.js +25 -8
  309. package/dist/src/storage/prisma/client/libquery_engine-darwin-arm64.dylib.node +0 -0
  310. package/dist/src/storage/prisma/client/libquery_engine-linux-musl.so.node +0 -0
  311. package/dist/src/storage/prisma/client/package.json +1 -1
  312. package/dist/src/storage/prisma/client/schema.prisma +4 -2
  313. package/dist/src/storage/prisma/client/wasm.js +1 -0
  314. package/dist/src/storage/prisma/factory.d.ts +3 -2
  315. package/dist/src/storage/prisma/factory.d.ts.map +1 -1
  316. package/dist/src/storage/prisma/factory.js +4 -1
  317. package/dist/src/storage/prisma/factory.js.map +1 -1
  318. package/dist/src/storage/prisma/index.d.ts +3 -0
  319. package/dist/src/storage/prisma/index.d.ts.map +1 -0
  320. package/dist/src/storage/prisma/index.js +3 -0
  321. package/dist/src/storage/prisma/index.js.map +1 -0
  322. package/dist/src/storage/prisma/prisma.d.ts +4 -7
  323. package/dist/src/storage/prisma/prisma.d.ts.map +1 -1
  324. package/dist/src/storage/prisma/prisma.js +147 -55
  325. package/dist/src/storage/prisma/prisma.js.map +1 -1
  326. package/dist/src/storage/types.d.ts +1 -2
  327. package/dist/src/storage/types.d.ts.map +1 -1
  328. package/dist/src/storage/utils.d.ts +3 -1
  329. package/dist/src/storage/utils.d.ts.map +1 -1
  330. package/dist/src/storage/utils.js +18 -0
  331. package/dist/src/storage/utils.js.map +1 -1
  332. package/dist/src/utils/default-drives-manager.d.ts +1 -12
  333. package/dist/src/utils/default-drives-manager.d.ts.map +1 -1
  334. package/dist/src/utils/default-drives-manager.js +2 -2
  335. package/dist/src/utils/default-drives-manager.js.map +1 -1
  336. package/dist/src/utils/gql-transformations.d.ts +14 -5
  337. package/dist/src/utils/gql-transformations.d.ts.map +1 -1
  338. package/dist/src/utils/gql-transformations.js +19 -5
  339. package/dist/src/utils/gql-transformations.js.map +1 -1
  340. package/dist/src/utils/graphql.d.ts +6 -32
  341. package/dist/src/utils/graphql.d.ts.map +1 -1
  342. package/dist/src/utils/graphql.js +21 -31
  343. package/dist/src/utils/graphql.js.map +1 -1
  344. package/dist/src/utils/index.d.ts +9 -0
  345. package/dist/src/utils/index.d.ts.map +1 -0
  346. package/dist/src/utils/index.js +9 -0
  347. package/dist/src/utils/index.js.map +1 -0
  348. package/dist/src/utils/logger.d.ts +2 -8
  349. package/dist/src/utils/logger.d.ts.map +1 -1
  350. package/dist/src/utils/logger.js +6 -7
  351. package/dist/src/utils/logger.js.map +1 -1
  352. package/dist/src/utils/migrations.d.ts +1 -1
  353. package/dist/src/utils/migrations.d.ts.map +1 -1
  354. package/dist/src/utils/migrations.js +88 -18
  355. package/dist/src/utils/migrations.js.map +1 -1
  356. package/dist/src/utils/misc.d.ts +2 -6
  357. package/dist/src/utils/misc.d.ts.map +1 -1
  358. package/dist/src/utils/misc.js +10 -12
  359. package/dist/src/utils/misc.js.map +1 -1
  360. package/dist/src/utils/run-asap.d.ts +7 -11
  361. package/dist/src/utils/run-asap.d.ts.map +1 -1
  362. package/dist/src/utils/run-asap.js +110 -122
  363. package/dist/src/utils/run-asap.js.map +1 -1
  364. package/dist/src/utils/test.d.ts +62 -0
  365. package/dist/src/utils/test.d.ts.map +1 -0
  366. package/dist/src/utils/test.js +158 -0
  367. package/dist/src/utils/test.js.map +1 -0
  368. package/dist/src/utils/types.d.ts +50 -0
  369. package/dist/src/utils/types.d.ts.map +1 -0
  370. package/dist/src/utils/types.js +2 -0
  371. package/dist/src/utils/types.js.map +1 -0
  372. package/dist/test/benchmarks/getDrive.json +10 -0
  373. package/dist/test/benchmarks/processOperations.bench.d.ts +2 -0
  374. package/dist/test/benchmarks/processOperations.bench.d.ts.map +1 -0
  375. package/dist/test/benchmarks/processOperations.bench.js +148 -0
  376. package/dist/test/benchmarks/processOperations.bench.js.map +1 -0
  377. package/dist/test/benchmarks/queue.bench.d.ts +2 -0
  378. package/dist/test/benchmarks/queue.bench.d.ts.map +1 -0
  379. package/dist/test/benchmarks/queue.bench.js +55 -0
  380. package/dist/test/benchmarks/queue.bench.js.map +1 -0
  381. package/dist/test/benchmarks/strands.small.json +37085 -0
  382. package/dist/test/cache.test.d.ts +2 -0
  383. package/dist/test/cache.test.d.ts.map +1 -0
  384. package/dist/test/cache.test.js +275 -0
  385. package/dist/test/cache.test.js.map +1 -0
  386. package/dist/test/default-remote-drives.test.d.ts +2 -0
  387. package/dist/test/default-remote-drives.test.d.ts.map +1 -0
  388. package/dist/test/default-remote-drives.test.js +445 -0
  389. package/dist/test/default-remote-drives.test.js.map +1 -0
  390. package/dist/test/drive-operations.test.d.ts +2 -0
  391. package/dist/test/drive-operations.test.d.ts.map +1 -0
  392. package/dist/test/drive-operations.test.js +134 -0
  393. package/dist/test/drive-operations.test.js.map +1 -0
  394. package/dist/test/dual-action-create.test.d.ts +2 -0
  395. package/dist/test/dual-action-create.test.d.ts.map +1 -0
  396. package/dist/test/dual-action-create.test.js +187 -0
  397. package/dist/test/dual-action-create.test.js.map +1 -0
  398. package/dist/test/dual-action-migration.test.d.ts +2 -0
  399. package/dist/test/dual-action-migration.test.d.ts.map +1 -0
  400. package/dist/test/dual-action-migration.test.js +344 -0
  401. package/dist/test/dual-action-migration.test.js.map +1 -0
  402. package/dist/test/graphql.test.d.ts +2 -0
  403. package/dist/test/graphql.test.d.ts.map +1 -0
  404. package/dist/test/graphql.test.js +9 -0
  405. package/dist/test/graphql.test.js.map +1 -0
  406. package/dist/test/internal-listener.test.d.ts +2 -0
  407. package/dist/test/internal-listener.test.d.ts.map +1 -0
  408. package/dist/test/internal-listener.test.js +262 -0
  409. package/dist/test/internal-listener.test.js.map +1 -0
  410. package/dist/test/queue.test.d.ts +2 -0
  411. package/dist/test/queue.test.d.ts.map +1 -0
  412. package/dist/test/queue.test.js +324 -0
  413. package/dist/test/queue.test.js.map +1 -0
  414. package/dist/test/reactor.test.d.ts +2 -0
  415. package/dist/test/reactor.test.d.ts.map +1 -0
  416. package/dist/test/reactor.test.js +32 -0
  417. package/dist/test/reactor.test.js.map +1 -0
  418. package/dist/test/read-mode.test.d.ts +2 -0
  419. package/dist/test/read-mode.test.d.ts.map +1 -0
  420. package/dist/test/read-mode.test.js +569 -0
  421. package/dist/test/read-mode.test.js.map +1 -0
  422. package/dist/test/server/driveOperationsConflictResolution.test.d.ts +2 -0
  423. package/dist/test/server/driveOperationsConflictResolution.test.d.ts.map +1 -0
  424. package/dist/test/server/driveOperationsConflictResolution.test.js +486 -0
  425. package/dist/test/server/driveOperationsConflictResolution.test.js.map +1 -0
  426. package/dist/test/server/mergeOperations.test.d.ts +2 -0
  427. package/dist/test/server/mergeOperations.test.d.ts.map +1 -0
  428. package/dist/test/server/mergeOperations.test.js +115 -0
  429. package/dist/test/server/mergeOperations.test.js.map +1 -0
  430. package/dist/test/server/processOperations.test.d.ts +2 -0
  431. package/dist/test/server/processOperations.test.d.ts.map +1 -0
  432. package/dist/test/server/processOperations.test.js +392 -0
  433. package/dist/test/server/processOperations.test.js.map +1 -0
  434. package/dist/test/server.test.d.ts +2 -0
  435. package/dist/test/server.test.d.ts.map +1 -0
  436. package/dist/test/server.test.js +957 -0
  437. package/dist/test/server.test.js.map +1 -0
  438. package/dist/test/signature-migration.test.d.ts +2 -0
  439. package/dist/test/signature-migration.test.d.ts.map +1 -0
  440. package/dist/test/signature-migration.test.js +241 -0
  441. package/dist/test/signature-migration.test.js.map +1 -0
  442. package/dist/test/storage.test.d.ts +2 -0
  443. package/dist/test/storage.test.d.ts.map +1 -0
  444. package/dist/test/storage.test.js +522 -0
  445. package/dist/test/storage.test.js.map +1 -0
  446. package/dist/test/switchboard-push-listener.test.d.ts +2 -0
  447. package/dist/test/switchboard-push-listener.test.d.ts.map +1 -0
  448. package/dist/test/switchboard-push-listener.test.js +133 -0
  449. package/dist/test/switchboard-push-listener.test.js.map +1 -0
  450. package/dist/test/sync-manager.test.d.ts +2 -0
  451. package/dist/test/sync-manager.test.d.ts.map +1 -0
  452. package/dist/test/sync-manager.test.js +349 -0
  453. package/dist/test/sync-manager.test.js.map +1 -0
  454. package/dist/test/undo-redo-clipboard.test.d.ts +2 -0
  455. package/dist/test/undo-redo-clipboard.test.d.ts.map +1 -0
  456. package/dist/test/undo-redo-clipboard.test.js +108 -0
  457. package/dist/test/undo-redo-clipboard.test.js.map +1 -0
  458. package/dist/test/utils.test.d.ts +2 -0
  459. package/dist/test/utils.test.d.ts.map +1 -0
  460. package/dist/test/utils.test.js +86 -0
  461. package/dist/test/utils.test.js.map +1 -0
  462. package/dist/test/vitest-setup.d.ts +2 -0
  463. package/dist/test/vitest-setup.d.ts.map +1 -0
  464. package/dist/test/vitest-setup.js +5 -0
  465. package/dist/test/vitest-setup.js.map +1 -0
  466. package/dist/tsconfig.tsbuildinfo +1 -0
  467. package/dist/vitest.config.d.ts +3 -0
  468. package/dist/vitest.config.d.ts.map +1 -0
  469. package/dist/vitest.config.js +28 -0
  470. package/dist/vitest.config.js.map +1 -0
  471. package/package.json +47 -27
  472. package/prisma/schema.prisma +93 -0
  473. package/src/storage/prisma/client/default.d.ts +1 -0
  474. package/src/storage/prisma/client/default.js +1 -0
  475. package/src/storage/prisma/client/edge.d.ts +1 -0
  476. package/src/storage/prisma/client/edge.js +263 -0
  477. package/src/storage/prisma/client/index-browser.js +246 -0
  478. package/src/storage/prisma/client/index.d.ts +10318 -0
  479. package/src/storage/prisma/client/index.js +292 -0
  480. package/src/storage/prisma/client/libquery_engine-darwin-arm64.dylib.node +0 -0
  481. package/src/storage/prisma/client/libquery_engine-debian-openssl-3.0.x.so.node +0 -0
  482. package/src/storage/prisma/client/libquery_engine-linux-musl.so.node +0 -0
  483. package/src/storage/prisma/client/package.json +84 -0
  484. package/src/storage/prisma/client/runtime/edge-esm.js +31 -0
  485. package/src/storage/prisma/client/runtime/edge.js +31 -0
  486. package/src/storage/prisma/client/runtime/index-browser.d.ts +365 -0
  487. package/src/storage/prisma/client/runtime/index-browser.js +13 -0
  488. package/src/storage/prisma/client/runtime/library.d.ts +3273 -0
  489. package/src/storage/prisma/client/runtime/library.js +143 -0
  490. package/src/storage/prisma/client/runtime/react-native.js +80 -0
  491. package/src/storage/prisma/client/runtime/wasm.js +32 -0
  492. package/src/storage/prisma/client/schema.prisma +93 -0
  493. package/src/storage/prisma/client/wasm.d.ts +1 -0
  494. package/src/storage/prisma/client/wasm.js +246 -0
  495. package/dist/src/drive-document-model/gen/actions.d.ts +0 -6
  496. package/dist/src/drive-document-model/gen/actions.d.ts.map +0 -1
  497. package/dist/src/drive-document-model/gen/actions.js +0 -3
  498. package/dist/src/drive-document-model/gen/actions.js.map +0 -1
  499. package/dist/src/drive-document-model/gen/drive/object.d.ts +0 -14
  500. package/dist/src/drive-document-model/gen/drive/object.d.ts.map +0 -1
  501. package/dist/src/drive-document-model/gen/drive/object.js +0 -29
  502. package/dist/src/drive-document-model/gen/drive/object.js.map +0 -1
  503. package/dist/src/drive-document-model/gen/drive/operations.d.ts +0 -14
  504. package/dist/src/drive-document-model/gen/drive/operations.d.ts.map +0 -1
  505. package/dist/src/drive-document-model/gen/drive/operations.js +0 -2
  506. package/dist/src/drive-document-model/gen/drive/operations.js.map +0 -1
  507. package/dist/src/drive-document-model/gen/node/object.d.ts +0 -13
  508. package/dist/src/drive-document-model/gen/node/object.d.ts.map +0 -1
  509. package/dist/src/drive-document-model/gen/node/object.js +0 -26
  510. package/dist/src/drive-document-model/gen/node/object.js.map +0 -1
  511. package/dist/src/drive-document-model/gen/node/operations.d.ts +0 -13
  512. package/dist/src/drive-document-model/gen/node/operations.d.ts.map +0 -1
  513. package/dist/src/drive-document-model/gen/node/operations.js +0 -2
  514. package/dist/src/drive-document-model/gen/node/operations.js.map +0 -1
  515. package/dist/src/drive-document-model/gen/object.d.ts +0 -18
  516. package/dist/src/drive-document-model/gen/object.d.ts.map +0 -1
  517. package/dist/src/drive-document-model/gen/object.js +0 -28
  518. package/dist/src/drive-document-model/gen/object.js.map +0 -1
  519. package/dist/src/server/constants.d.ts.map +0 -1
  520. package/dist/src/server/constants.js.map +0 -1
  521. package/dist/src/server/listener/transmitter/factory.d.ts +0 -8
  522. package/dist/src/server/listener/transmitter/factory.d.ts.map +0 -1
  523. package/dist/src/server/listener/transmitter/factory.js.map +0 -1
  524. package/dist/src/server/listener/transmitter/internal.d.ts +0 -29
  525. package/dist/src/server/listener/transmitter/internal.d.ts.map +0 -1
  526. package/dist/src/server/listener/transmitter/internal.js.map +0 -1
  527. package/dist/src/server/listener/transmitter/pull-responder.d.ts.map +0 -1
  528. package/dist/src/server/listener/transmitter/pull-responder.js.map +0 -1
  529. package/dist/src/server/listener/transmitter/switchboard-push.d.ts.map +0 -1
  530. package/dist/src/server/listener/transmitter/switchboard-push.js.map +0 -1
  531. package/dist/src/server/listener/transmitter/types.d.ts +0 -22
  532. package/dist/src/server/listener/transmitter/types.d.ts.map +0 -1
  533. package/dist/src/server/listener/transmitter/types.js.map +0 -1
  534. package/dist/tsconfig.lib.tsbuildinfo +0 -1
  535. /package/dist/src/{server/listener/transmitter → drive-document-model/src}/types.js +0 -0
  536. /package/dist/src/server/{constants.d.ts → transmitter/constants.d.ts} +0 -0
  537. /package/dist/src/server/{constants.js → transmitter/constants.js} +0 -0
@@ -1,18 +1,17 @@
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 { isActionJob, isDocumentJob, isOperationJob, } from "document-drive/queue/utils";
2
+ import { ReadModeServer } from "document-drive/read-mode/server";
3
+ import { DefaultDrivesManager } from "document-drive/utils/default-drives-manager";
4
+ import { requestPublicDriveWithTokenFromReactor } from "document-drive/utils/graphql";
5
+ import { childLogger } from "document-drive/utils/logger";
6
+ import { isDocumentDrive } from "document-drive/utils/misc";
7
+ import { runAsap, runAsapAsync } from "document-drive/utils/run-asap";
8
+ import { attachBranch, createPresignedHeader, defaultBaseState, diffOperations, garbageCollect, garbageCollectDocumentOperations, groupOperationsByScope, hashDocumentStateForScope, merge, precedes, removeExistingOperations, replayDocument, reshuffleByTimestamp, skipHeaderOperations, sortOperations, validateHeader, } from "document-model/core";
11
9
  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";
10
+ import { driveCreateDocument, driveCreateState, removeListener, removeTrigger, setSharingType, } from "../drive-document-model/index.js";
11
+ import { ConflictOperationError, DocumentAlreadyExistsError, OperationError, } from "./error.js";
12
+ import { DefaultListenerManagerOptions } from "./listener/constants.js";
13
+ import { PullResponderTransmitter } from "./transmitter/pull-responder.js";
14
+ import { SwitchboardPushTransmitter } from "./transmitter/switchboard-push.js";
16
15
  import { filterOperationsByRevision, isAtRevision, resolveCreateDocumentInput, } from "./utils.js";
17
16
  export class BaseDocumentDriveServer {
18
17
  logger = childLogger(["BaseDocumentDriveServer"]);
@@ -47,18 +46,19 @@ export class BaseDocumentDriveServer {
47
46
  ? this.processDriveActions(documentId, actions, options)
48
47
  : this.processActions(documentId, actions, options);
49
48
  },
50
- processDocumentJob: async ({ documentId, documentType, initialState, options, }) => {
49
+ processDocumentJob: async ({ documentId, documentType, header: inputHeader, initialState, options, }) => {
51
50
  const documentModelModule = this.getDocumentModelModule(documentType);
52
- const document = documentModelModule.utils.createDocument({
53
- ...initialState,
54
- });
51
+ const document = documentModelModule.utils.createDocument(initialState);
55
52
  // TODO: header must be included
56
53
  const header = createPresignedHeader(documentId, documentType);
57
54
  document.header.id = documentId;
58
55
  document.header.sig = header.sig;
59
56
  document.header.documentType = documentType;
57
+ if (inputHeader) {
58
+ document.header.meta = inputHeader.meta;
59
+ }
60
60
  try {
61
- const createdDocument = await this.createDocument({ document }, options?.source ?? { type: "local" }, initialState?.header.meta);
61
+ const createdDocument = await this.createDocument({ document }, options?.source ?? { type: "local" }, document.header.meta);
62
62
  return {
63
63
  status: "SUCCESS",
64
64
  operations: [],
@@ -95,6 +95,7 @@ export class BaseDocumentDriveServer {
95
95
  // internal state
96
96
  triggerMap = new Map();
97
97
  initializePromise;
98
+ enableDualActionCreate;
98
99
  constructor(documentModelModules, storage, documentStorage, cache, queueManager, eventEmitter, synchronizationManager, listenerManager, options) {
99
100
  this.documentModelModules = documentModelModules;
100
101
  this.legacyStorage = storage;
@@ -117,9 +118,17 @@ export class BaseDocumentDriveServer {
117
118
  ? () => Promise.resolve("")
118
119
  : options.jwtHandler,
119
120
  taskQueueMethod: options?.taskQueueMethod === undefined
120
- ? RunAsap.runAsap
121
+ ? runAsap
121
122
  : options.taskQueueMethod,
123
+ featureFlags: {
124
+ ...options?.featureFlags,
125
+ },
122
126
  };
127
+ this.enableDualActionCreate =
128
+ options?.featureFlags?.enableDualActionCreate ?? false;
129
+ if (this.enableDualActionCreate) {
130
+ this.logger.warn("Dual action create is enabled.");
131
+ }
123
132
  // todo: move to external dependencies
124
133
  this.defaultDrivesManager = new DefaultDrivesManager(this, this.defaultDrivesManagerDelegate, options);
125
134
  this.initializePromise = this._initialize();
@@ -136,7 +145,7 @@ export class BaseDocumentDriveServer {
136
145
  await this.listenerManager.initialize(this.handleListenerError.bind(this));
137
146
  await this.queueManager.init(this.queueDelegate, (error) => {
138
147
  this.logger.error(`Error initializing queue manager`, error);
139
- errors.push(error);
148
+ // errors.push(error);
140
149
  });
141
150
  try {
142
151
  await this.defaultDrivesManager.removeOldremoteDrives();
@@ -328,7 +337,7 @@ export class BaseDocumentDriveServer {
328
337
  }
329
338
  }
330
339
  getDocumentModelModule(documentType) {
331
- const documentModelModule = this.documentModelModules.find((module) => module.documentModel.id === documentType);
340
+ const documentModelModule = this.documentModelModules.find((module) => module.documentModel.global.id === documentType);
332
341
  if (!documentModelModule) {
333
342
  throw new Error(`Document type ${documentType} not supported`);
334
343
  }
@@ -344,13 +353,19 @@ export class BaseDocumentDriveServer {
344
353
  return this.createDocument(input, { type: "local" }, meta);
345
354
  }
346
355
  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 ?? {},
356
+ // Create document with custom global and local state
357
+ const { global } = driveCreateState();
358
+ const document = driveCreateDocument({
359
+ global: {
360
+ ...global,
361
+ name: input.global.name ?? global.name,
362
+ icon: input.global.icon ?? global.icon,
363
+ },
364
+ local: {
365
+ availableOffline: input.local?.availableOffline ?? false,
366
+ sharingType: input.local?.sharingType ?? "public",
367
+ listeners: input.local?.listeners ?? [],
368
+ triggers: input.local?.triggers ?? [],
354
369
  },
355
370
  });
356
371
  if (input.id && input.id.length > 0) {
@@ -359,6 +374,9 @@ export class BaseDocumentDriveServer {
359
374
  if (input.slug && input.slug.length > 0) {
360
375
  document.header.slug = input.slug;
361
376
  }
377
+ if (input.global.name) {
378
+ document.header.name = input.global.name;
379
+ }
362
380
  const editorToUse = input.preferredEditor || preferredEditor;
363
381
  if (editorToUse) {
364
382
  document.header.meta = {
@@ -549,6 +567,14 @@ export class BaseDocumentDriveServer {
549
567
  }
550
568
  }
551
569
  async createDocument(input, source, meta) {
570
+ if (this.enableDualActionCreate) {
571
+ return this.createDocumentDualAction(input, source, meta);
572
+ }
573
+ else {
574
+ return this.createDocumentLegacy(input, source, meta);
575
+ }
576
+ }
577
+ async createDocumentLegacy(input, source, meta) {
552
578
  const { documentType, document: inputDocument } = resolveCreateDocumentInput(input);
553
579
  // if a document was provided then checks if it's valid
554
580
  let state = undefined;
@@ -562,9 +588,7 @@ export class BaseDocumentDriveServer {
562
588
  }
563
589
  // if no document was provided then create a new one
564
590
  const document = inputDocument ??
565
- this.getDocumentModelModule(documentType).utils.createDocument({
566
- state,
567
- });
591
+ this.getDocumentModelModule(documentType).utils.createDocument(state);
568
592
  // get the header
569
593
  let header;
570
594
  // handle the legacy case where an id is provided
@@ -613,11 +637,9 @@ export class BaseDocumentDriveServer {
613
637
  // stores document information
614
638
  const documentStorage = {
615
639
  header,
616
- history: document.history,
617
640
  operations: { global: [], local: [] },
618
641
  initialState: document.initialState,
619
642
  clipboard: [],
620
- attachments: document.attachments,
621
643
  state: state ?? document.state,
622
644
  };
623
645
  await this.documentStorage.create(documentStorage);
@@ -650,7 +672,185 @@ export class BaseDocumentDriveServer {
650
672
  await this.legacyStorage.addDocumentOperations(header.id, operations, document);
651
673
  }
652
674
  }
653
- return await this.getDocument(documentStorage.header.id);
675
+ const addedDocument = await this.getDocument(documentStorage.header.id);
676
+ this.eventEmitter.emit("documentAdded", addedDocument);
677
+ return addedDocument;
678
+ }
679
+ async createDocumentDualAction(input, source, meta) {
680
+ const { documentType, document: inputDocument } = resolveCreateDocumentInput(input);
681
+ // if a document was provided then checks if it's valid
682
+ let state = undefined;
683
+ if (inputDocument) {
684
+ if ("documentType" in input &&
685
+ documentType !== inputDocument.header.documentType) {
686
+ throw new Error(`Provided document is not ${documentType}`);
687
+ }
688
+ const doc = this._buildDocument(inputDocument);
689
+ state = doc.state;
690
+ }
691
+ // if no document was provided then create a new one
692
+ const document = inputDocument ??
693
+ this.getDocumentModelModule(documentType).utils.createDocument(state);
694
+ // get the header
695
+ let header;
696
+ // handle the legacy case where an id is provided
697
+ let isSigned = false;
698
+ if ("id" in input && input.id) {
699
+ if (inputDocument) {
700
+ header = document.header;
701
+ document.header.id = input.id;
702
+ this.logger.warn("Assigning an id to a document is deprecated. Use the header field instead.");
703
+ }
704
+ else {
705
+ this.logger.warn("Creating a document with an id is deprecated. Use the header field instead.");
706
+ header = createPresignedHeader(input.id, documentType);
707
+ }
708
+ }
709
+ else if ("header" in input) {
710
+ // validate the header passed in
711
+ await validateHeader(input.header);
712
+ isSigned = true;
713
+ header = input.header;
714
+ }
715
+ else if (inputDocument?.header) {
716
+ if (!inputDocument.header.id) {
717
+ throw new Error("Document header id is required");
718
+ }
719
+ if (!inputDocument.header.documentType) {
720
+ throw new Error("Document header documentType is required");
721
+ }
722
+ if (!inputDocument.header.createdAtUtcIso) {
723
+ throw new Error("Document header createdAtUtcIso is required");
724
+ }
725
+ if (!inputDocument.header.sig.nonce) {
726
+ this.logger.warn("Creating a document with an unsigned id is deprecated. Use createSignedHeaderForSigner.");
727
+ // throw new Error("Document header sig nonce is required"); TODO: uncomment when ready to enforce signed documents
728
+ }
729
+ else {
730
+ await validateHeader(inputDocument.header);
731
+ isSigned = true;
732
+ }
733
+ header = inputDocument.header;
734
+ }
735
+ else {
736
+ // otherwise, generate a header
737
+ header = createPresignedHeader(undefined, documentType);
738
+ isSigned = false;
739
+ }
740
+ if (meta) {
741
+ header.meta = { ...header.meta, ...meta };
742
+ }
743
+ const currentVersion = "0.1.0";
744
+ // Get initial state from input or model's defaultState
745
+ const initialState = state ?? document.state;
746
+ // Check if the input document already has operations
747
+ const existingOperations = Object.values(document.operations).flat();
748
+ const shouldCreateOperations = existingOperations.length === 0;
749
+ let operations = [];
750
+ if (shouldCreateOperations) {
751
+ const timestampUtcMs = new Date().toISOString();
752
+ // Determine if this is a signed document
753
+ const signing = isSigned
754
+ ? {
755
+ signature: header.id, // The document ID is the signature
756
+ publicKey: header.sig.publicKey,
757
+ nonce: header.sig.nonce,
758
+ createdAtUtcIso: header.createdAtUtcIso,
759
+ documentType: header.documentType,
760
+ }
761
+ : undefined;
762
+ // Create actions for CREATE_DOCUMENT and UPGRADE_DOCUMENT
763
+ const createDocumentInput = {
764
+ model: documentType,
765
+ version: "0.0.0",
766
+ documentId: header.id,
767
+ signing,
768
+ };
769
+ const createDocumentAction = {
770
+ id: `${header.id}-create`,
771
+ type: "CREATE_DOCUMENT",
772
+ timestampUtcMs,
773
+ input: createDocumentInput,
774
+ scope: "document",
775
+ };
776
+ const upgradeDocumentInput = {
777
+ model: documentType,
778
+ fromVersion: "0.0.0",
779
+ toVersion: currentVersion,
780
+ documentId: header.id,
781
+ initialState,
782
+ };
783
+ const upgradeDocumentAction = {
784
+ id: `${header.id}-upgrade`,
785
+ type: "UPGRADE_DOCUMENT",
786
+ timestampUtcMs,
787
+ input: upgradeDocumentInput,
788
+ scope: "document",
789
+ };
790
+ // we need to create hashes for later verification
791
+ const baseState = defaultBaseState();
792
+ const createStateForHash = {
793
+ state: baseState,
794
+ };
795
+ const createHash = hashDocumentStateForScope(createStateForHash, "document");
796
+ const upgradeStateForHash = {
797
+ state: initialState,
798
+ };
799
+ const upgradeHash = hashDocumentStateForScope(upgradeStateForHash, "document");
800
+ // Create operations from actions with computed hashes
801
+ operations = [
802
+ {
803
+ index: 0,
804
+ skip: 0,
805
+ hash: createHash,
806
+ timestampUtcMs,
807
+ action: createDocumentAction,
808
+ },
809
+ {
810
+ index: 1,
811
+ skip: 0,
812
+ hash: upgradeHash,
813
+ timestampUtcMs,
814
+ action: upgradeDocumentAction,
815
+ },
816
+ ];
817
+ }
818
+ else {
819
+ // Use existing operations from the input document
820
+ operations = existingOperations;
821
+ }
822
+ // Group operations by scope before storing
823
+ const groupedOps = groupOperationsByScope(operations);
824
+ // Ensure backward compatibility by initializing missing scopes
825
+ if (!groupedOps.header) {
826
+ groupedOps.header = [];
827
+ }
828
+ if (!groupedOps.document) {
829
+ groupedOps.document = [];
830
+ }
831
+ if (!groupedOps.global) {
832
+ groupedOps.global = [];
833
+ }
834
+ if (!groupedOps.local) {
835
+ groupedOps.local = [];
836
+ }
837
+ // After initialization, it's safe to treat as DocumentOperations
838
+ const operationsByScope = groupedOps;
839
+ // stores document information with operations
840
+ const documentToStore = {
841
+ header,
842
+ operations: operationsByScope,
843
+ initialState,
844
+ clipboard: [],
845
+ state: initialState,
846
+ };
847
+ await this.documentStorage.create(documentToStore);
848
+ // Force rebuild to ensure operations are properly merged
849
+ const addedDocument = await this.getDocument(documentToStore.header.id, {
850
+ checkHashes: true,
851
+ });
852
+ this.eventEmitter.emit("documentAdded", addedDocument);
853
+ return addedDocument;
654
854
  }
655
855
  async deleteDocument(documentId) {
656
856
  try {
@@ -669,8 +869,11 @@ export class BaseDocumentDriveServer {
669
869
  catch (error) {
670
870
  this.logger.warn("Error deleting document", error);
671
871
  }
672
- await this.cache.deleteDocument(documentId);
673
- await this.documentStorage.delete(documentId);
872
+ await Promise.allSettled([
873
+ this.cache.deleteDocument(documentId).catch(this.logger.warn),
874
+ this.documentStorage.delete(documentId).catch(this.logger.warn),
875
+ ]);
876
+ this.eventEmitter.emit("documentDeleted", documentId);
674
877
  }
675
878
  async _processOperations(documentId, documentStorage, operations) {
676
879
  const operationsApplied = [];
@@ -680,7 +883,7 @@ export class BaseDocumentDriveServer {
680
883
  let error; // TODO: replace with an array of errors/consistency issues
681
884
  const operationsByScope = groupOperationsByScope(operations);
682
885
  for (const scope of Object.keys(operationsByScope)) {
683
- const storageDocumentOperations = documentStorage.operations[scope];
886
+ const storageDocumentOperations = documentStorage.operations[scope] || [];
684
887
  // TODO two equal operations done by two clients will be considered the same, ie: { type: "INCREMENT" }
685
888
  const branch = removeExistingOperations(operationsByScope[scope] || [], storageDocumentOperations);
686
889
  // No operations to apply
@@ -740,13 +943,17 @@ export class BaseDocumentDriveServer {
740
943
  : document.operations;
741
944
  const documentOperations = garbageCollectDocumentOperations(operations);
742
945
  for (const scope of Object.keys(documentOperations)) {
743
- const lastRemainingOperation = documentOperations[scope].at(-1);
946
+ const scopeOps = documentOperations[scope];
947
+ if (!scopeOps) {
948
+ continue;
949
+ }
950
+ const lastRemainingOperation = scopeOps.at(-1);
744
951
  // if the latest operation doesn't have a resulting state then tries
745
952
  // to retrieve it from the db to avoid rerunning all the operations
746
953
  if (lastRemainingOperation && !lastRemainingOperation.resultingState) {
747
954
  lastRemainingOperation.resultingState = await (isDocumentDrive(document)
748
- ? this.legacyStorage.getOperationResultingState?.(documentId, lastRemainingOperation.index, lastRemainingOperation.scope, "main")
749
- : this.legacyStorage.getDriveOperationResultingState?.(documentId, lastRemainingOperation.index, lastRemainingOperation.scope, "main"));
955
+ ? this.legacyStorage.getOperationResultingState?.(documentId, lastRemainingOperation.index, lastRemainingOperation.action.scope, "main")
956
+ : this.legacyStorage.getDriveOperationResultingState?.(documentId, lastRemainingOperation.index, lastRemainingOperation.action.scope, "main"));
750
957
  }
751
958
  }
752
959
  return {
@@ -765,31 +972,84 @@ export class BaseDocumentDriveServer {
765
972
  ? filterOperationsByRevision(documentStorage.operations, options.revisions)
766
973
  : documentStorage.operations;
767
974
  const operations = garbageCollectDocumentOperations(revisionOperations);
768
- return replayDocument(documentStorage.initialState, operations, documentModelModule.reducer, undefined, documentStorage.header, undefined, {
975
+ // Get all scopes from operations
976
+ const allScopes = Object.keys(operations);
977
+ // Initialize with all scopes found in operations, plus global and local for backward compatibility
978
+ const scopesToInitialize = new Set([...allScopes, "global", "local"]);
979
+ const headerOperations = {};
980
+ const operationsToReplay = {};
981
+ for (const scope of scopesToInitialize) {
982
+ headerOperations[scope] = [];
983
+ operationsToReplay[scope] = [];
984
+ }
985
+ // Filter out CREATE_DOCUMENT and UPGRADE_DOCUMENT operations
986
+ // (these don't currently have reducers and should not be replayed)
987
+ for (const [scope, scopeOps] of Object.entries(operations)) {
988
+ if (!scopeOps) {
989
+ continue;
990
+ }
991
+ for (const op of scopeOps) {
992
+ if (op.action.type === "CREATE_DOCUMENT" ||
993
+ op.action.type === "UPGRADE_DOCUMENT") {
994
+ const headerOps = headerOperations[scope];
995
+ if (headerOps) {
996
+ headerOps.push(op);
997
+ }
998
+ }
999
+ else {
1000
+ const replayOps = operationsToReplay[scope];
1001
+ if (replayOps) {
1002
+ replayOps.push(op);
1003
+ }
1004
+ }
1005
+ }
1006
+ }
1007
+ const replayed = replayDocument(documentStorage.initialState, operationsToReplay, documentModelModule.reducer, undefined, documentStorage.header, undefined, {
769
1008
  ...options,
770
1009
  checkHashes: options?.checkHashes ?? true,
771
1010
  reuseOperationResultingState: options?.checkHashes ?? true,
772
1011
  });
1012
+ // merge header operations back into the result
1013
+ // Include ALL scopes from input operations, header operations, and replayed operations
1014
+ const allScopesForMerge = new Set([
1015
+ ...Object.keys(operations), // From input storage
1016
+ ...Object.keys(headerOperations),
1017
+ ...Object.keys(replayed.operations),
1018
+ ]);
1019
+ const finalOperations = {};
1020
+ for (const scope of allScopesForMerge) {
1021
+ finalOperations[scope] = [
1022
+ ...(headerOperations[scope] || []),
1023
+ ...(replayed.operations[scope] || []),
1024
+ ];
1025
+ }
1026
+ return {
1027
+ ...replayed,
1028
+ operations: finalOperations,
1029
+ };
773
1030
  }
774
1031
  async _performOperation(documentId, document, operation, skipHashValidation = false) {
775
1032
  const documentModelModule = this.getDocumentModelModule(document.header.documentType);
776
1033
  const signalResults = [];
777
1034
  let newDocument = document;
778
- const scope = operation.scope;
1035
+ const scope = operation.action.scope;
1036
+ const currentScopeOperations = document.operations[scope] || [];
779
1037
  const documentOperations = garbageCollectDocumentOperations({
780
1038
  ...document.operations,
781
- [scope]: skipHeaderOperations(document.operations[scope], operation),
1039
+ [scope]: skipHeaderOperations(currentScopeOperations, operation),
782
1040
  });
783
- const lastRemainingOperation = documentOperations[scope].at(-1);
1041
+ const remainingScopeOps = documentOperations[scope];
1042
+ const lastRemainingOperation = remainingScopeOps?.at(-1);
784
1043
  // if the latest operation doesn't have a resulting state then tries
785
1044
  // to retrieve it from the db to avoid rerunning all the operations
786
1045
  if (lastRemainingOperation && !lastRemainingOperation.resultingState) {
787
1046
  lastRemainingOperation.resultingState = await (isDocumentDrive(document)
788
- ? this.legacyStorage.getOperationResultingState?.(documentId, lastRemainingOperation.index, lastRemainingOperation.scope, "main")
789
- : this.legacyStorage.getDriveOperationResultingState?.(documentId, lastRemainingOperation.index, lastRemainingOperation.scope, "main"));
1047
+ ? this.legacyStorage.getOperationResultingState?.(documentId, lastRemainingOperation.index, lastRemainingOperation.action.scope, "main")
1048
+ : this.legacyStorage.getDriveOperationResultingState?.(documentId, lastRemainingOperation.index, lastRemainingOperation.action.scope, "main"));
790
1049
  }
1050
+ const operationsBeforeReducer = newDocument.operations[scope] || [];
791
1051
  const operationSignals = [];
792
- newDocument = documentModelModule.reducer(newDocument, operation, (signal) => {
1052
+ newDocument = documentModelModule.reducer(newDocument, operation.action, (signal) => {
793
1053
  let handler = undefined;
794
1054
  switch (signal.type) {
795
1055
  case "CREATE_CHILD_DOCUMENT":
@@ -805,8 +1065,35 @@ export class BaseDocumentDriveServer {
805
1065
  if (handler) {
806
1066
  operationSignals.push(() => handler().then((result) => ({ signal, result })));
807
1067
  }
808
- }, { skip: operation.skip, reuseOperationResultingState: true });
809
- const appliedOperations = newDocument.operations[operation.scope].filter((op) => op.index == operation.index && op.skip == operation.skip);
1068
+ }, {
1069
+ skip: operation.skip,
1070
+ reuseOperationResultingState: true,
1071
+ replayOptions: { operation },
1072
+ });
1073
+ // when we have NOOP operations with skip > 0 we need to populate the
1074
+ // clipboard with the operations that were skipped to allow redo
1075
+ if (operation.action.type === "NOOP" &&
1076
+ operation.skip > 0 &&
1077
+ newDocument.clipboard.length === 0) {
1078
+ const scopeOperationsAfter = newDocument.operations[scope] || [];
1079
+ // Get operations AFTER garbageCollect (with NOOP)
1080
+ const afterOperations = garbageCollect(sortOperations(scopeOperationsAfter));
1081
+ // Get operations BEFORE the reducer ran (before NOOP was applied)
1082
+ const beforeOperations = garbageCollect(sortOperations(operationsBeforeReducer));
1083
+ // Calculate what was removed by comparing before vs after
1084
+ // The diff shows operations that were in "before" but not in "after"
1085
+ const diff = diffOperations(beforeOperations, afterOperations);
1086
+ // Populate clipboard with skipped operations (excluding NOOPs)
1087
+ newDocument = {
1088
+ ...newDocument,
1089
+ clipboard: sortOperations(diff.filter((op) => op.action.type !== "NOOP")).reverse(),
1090
+ };
1091
+ }
1092
+ const newDocScopeOperations = newDocument.operations[operation.action.scope];
1093
+ if (!newDocScopeOperations) {
1094
+ throw new OperationError("ERROR", operation, `No operations found for scope: ${operation.action.scope}`);
1095
+ }
1096
+ const appliedOperations = newDocScopeOperations.filter((op) => op.index == operation.index && op.skip == operation.skip);
810
1097
  const appliedOperation = appliedOperations.at(0);
811
1098
  if (!appliedOperation) {
812
1099
  throw new OperationError("ERROR", operation, `Operation with index ${operation.index}:${operation.skip} was not applied.`);
@@ -893,7 +1180,8 @@ export class BaseDocumentDriveServer {
893
1180
  jobId = await this.queueManager.addJob({
894
1181
  documentId: id,
895
1182
  documentType,
896
- initialState: document,
1183
+ initialState: document?.state,
1184
+ header: document?.header,
897
1185
  options,
898
1186
  });
899
1187
  }
@@ -924,11 +1212,19 @@ export class BaseDocumentDriveServer {
924
1212
  async resultIfExistingOperations(id, operations) {
925
1213
  try {
926
1214
  const document = await this.getDocument(id);
927
- const newOperation = operations.find((op) => !op.id ||
928
- !document.operations[op.scope].find((existingOp) => existingOp.id === op.id &&
1215
+ const newOperation = operations.find((op) => {
1216
+ if (!op.id) {
1217
+ return true;
1218
+ }
1219
+ const scopeOps = document.operations[op.action.scope];
1220
+ if (!scopeOps) {
1221
+ return true;
1222
+ }
1223
+ return !scopeOps.find((existingOp) => existingOp.id === op.id &&
929
1224
  existingOp.index === op.index &&
930
- existingOp.type === op.type &&
931
- existingOp.hash === op.hash));
1225
+ existingOp.action.type === op.action.type &&
1226
+ existingOp.hash === op.hash);
1227
+ });
932
1228
  if (!newOperation) {
933
1229
  return {
934
1230
  status: "SUCCESS",
@@ -1159,10 +1455,10 @@ export class BaseDocumentDriveServer {
1159
1455
  const syncUnit = {
1160
1456
  documentId,
1161
1457
  documentType: document.header.documentType,
1162
- scope: operation.scope,
1458
+ scope: operation.action.scope,
1163
1459
  branch: "main", // TODO: handle branches
1164
1460
  revision: operation.index + 1,
1165
- lastUpdated: operation.timestamp,
1461
+ lastUpdated: operation.timestampUtcMs,
1166
1462
  };
1167
1463
  // checks if this sync unit was already added
1168
1464
  const exists = syncUnits.some((unit) => unit.documentId === syncUnit.documentId &&
@@ -1280,11 +1576,19 @@ export class BaseDocumentDriveServer {
1280
1576
  async resultIfExistingDriveOperations(driveId, operations) {
1281
1577
  try {
1282
1578
  const drive = await this.getDrive(driveId);
1283
- const newOperation = operations.find((op) => !op.id ||
1284
- !drive.operations[op.scope].find((existingOp) => existingOp.id === op.id &&
1579
+ const newOperation = operations.find((op) => {
1580
+ if (!op.id) {
1581
+ return true;
1582
+ }
1583
+ const scopeOps = drive.operations[op.action.scope];
1584
+ if (!scopeOps) {
1585
+ return true;
1586
+ }
1587
+ return !scopeOps.find((existingOp) => existingOp.id === op.id &&
1285
1588
  existingOp.index === op.index &&
1286
- existingOp.type === op.type &&
1287
- existingOp.hash === op.hash));
1589
+ existingOp.action.type === op.action.type &&
1590
+ existingOp.hash === op.hash);
1591
+ });
1288
1592
  if (!newOperation) {
1289
1593
  return {
1290
1594
  status: "SUCCESS",
@@ -1374,7 +1678,7 @@ export class BaseDocumentDriveServer {
1374
1678
  this.cache.setDrive(driveId, document).catch(this.logger.error);
1375
1679
  // update listener cache
1376
1680
  const lastOperation = operationsApplied
1377
- .filter((op) => op.scope === "global")
1681
+ .filter((op) => op.action.scope === "global")
1378
1682
  .slice()
1379
1683
  .pop();
1380
1684
  if (lastOperation) {
@@ -1397,7 +1701,7 @@ export class BaseDocumentDriveServer {
1397
1701
  documentType: document.header.documentType,
1398
1702
  scope: "global",
1399
1703
  branch: "main",
1400
- lastUpdated: lastOperation.timestamp,
1704
+ lastUpdated: lastOperation.timestampUtcMs,
1401
1705
  revision: lastOperation.index,
1402
1706
  },
1403
1707
  ], source, () => {
@@ -1457,7 +1761,11 @@ export class BaseDocumentDriveServer {
1457
1761
  const { reducer } = this.getDocumentModelModule(documentId.header.documentType);
1458
1762
  for (const action of actions) {
1459
1763
  documentId = reducer(documentId, action);
1460
- const operation = documentId.operations[action.scope].slice().pop();
1764
+ const scopeOps = documentId.operations[action.scope];
1765
+ if (!scopeOps) {
1766
+ throw new Error(`No operations found for scope: ${action.scope}`);
1767
+ }
1768
+ const operation = scopeOps.slice().pop();
1461
1769
  if (!operation) {
1462
1770
  throw new Error("Error creating operations");
1463
1771
  }
@@ -1520,7 +1828,7 @@ export class BaseDocumentDriveServer {
1520
1828
  }
1521
1829
  async _legacyAddFileAction(driveId, action, options) {
1522
1830
  // create document before adding it to the drive
1523
- const document = this.getDocumentModelModule(action.input.documentType).utils.createDocument({ ...action.input.document });
1831
+ const document = this.getDocumentModelModule(action.input.documentType).utils.createDocument(action.input.document?.state || undefined);
1524
1832
  document.header.id = action.input.id;
1525
1833
  document.header.name = action.input.name;
1526
1834
  document.header.documentType = action.input.documentType;
@@ -1591,6 +1899,14 @@ export class BaseDocumentDriveServer {
1591
1899
  }
1592
1900
  const operations = strand.operations.map((op) => ({
1593
1901
  ...op,
1902
+ action: {
1903
+ id: op.actionId,
1904
+ timestampUtcMs: op.timestampUtcMs,
1905
+ type: op.type,
1906
+ input: op.input,
1907
+ context: op.context,
1908
+ scope: strand.scope,
1909
+ },
1594
1910
  scope: strand.scope,
1595
1911
  branch: strand.branch,
1596
1912
  }));