document-drive 6.0.0-dev.105 → 6.0.0-dev.107

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 (564) hide show
  1. package/dist/chunk-CX61OkwL.mjs +16 -0
  2. package/dist/index-HOJm2mt2.d.mts +205 -0
  3. package/dist/index-HOJm2mt2.d.mts.map +1 -0
  4. package/dist/index.d.ts +1944 -1
  5. package/dist/index.d.ts.map +1 -1
  6. package/dist/index.js +5170 -1
  7. package/dist/index.js.map +1 -1
  8. package/dist/storage/filesystem.d.mts +49 -0
  9. package/dist/storage/filesystem.d.mts.map +1 -0
  10. package/dist/storage/filesystem.mjs +371 -0
  11. package/dist/storage/filesystem.mjs.map +1 -0
  12. package/dist/storage/prisma.d.mts +11508 -0
  13. package/dist/storage/prisma.d.mts.map +1 -0
  14. package/dist/storage/prisma.mjs +7582 -0
  15. package/dist/storage/prisma.mjs.map +1 -0
  16. package/dist/utils-BI7cwVSp.mjs +74 -0
  17. package/dist/utils-BI7cwVSp.mjs.map +1 -0
  18. package/package.json +21 -38
  19. package/dist/prisma/schema.prisma +0 -93
  20. package/dist/src/cache/index.d.ts +0 -4
  21. package/dist/src/cache/index.d.ts.map +0 -1
  22. package/dist/src/cache/index.js +0 -4
  23. package/dist/src/cache/index.js.map +0 -1
  24. package/dist/src/cache/lru.d.ts +0 -22
  25. package/dist/src/cache/lru.d.ts.map +0 -1
  26. package/dist/src/cache/lru.js +0 -40
  27. package/dist/src/cache/lru.js.map +0 -1
  28. package/dist/src/cache/memory.d.ts +0 -27
  29. package/dist/src/cache/memory.d.ts.map +0 -1
  30. package/dist/src/cache/memory.js +0 -104
  31. package/dist/src/cache/memory.js.map +0 -1
  32. package/dist/src/cache/redis.d.ts +0 -22
  33. package/dist/src/cache/redis.d.ts.map +0 -1
  34. package/dist/src/cache/redis.js +0 -91
  35. package/dist/src/cache/redis.js.map +0 -1
  36. package/dist/src/cache/types.d.ts +0 -37
  37. package/dist/src/cache/types.d.ts.map +0 -1
  38. package/dist/src/cache/types.js +0 -2
  39. package/dist/src/cache/types.js.map +0 -1
  40. package/dist/src/cache/util.d.ts +0 -3
  41. package/dist/src/cache/util.d.ts.map +0 -1
  42. package/dist/src/cache/util.js +0 -16
  43. package/dist/src/cache/util.js.map +0 -1
  44. package/dist/src/drive-document-model/constants.d.ts +0 -2
  45. package/dist/src/drive-document-model/constants.d.ts.map +0 -1
  46. package/dist/src/drive-document-model/constants.js +0 -2
  47. package/dist/src/drive-document-model/constants.js.map +0 -1
  48. package/dist/src/drive-document-model/gen/creators.d.ts +0 -3
  49. package/dist/src/drive-document-model/gen/creators.d.ts.map +0 -1
  50. package/dist/src/drive-document-model/gen/creators.js +0 -3
  51. package/dist/src/drive-document-model/gen/creators.js.map +0 -1
  52. package/dist/src/drive-document-model/gen/document-model.d.ts +0 -3
  53. package/dist/src/drive-document-model/gen/document-model.d.ts.map +0 -1
  54. package/dist/src/drive-document-model/gen/document-model.js +0 -210
  55. package/dist/src/drive-document-model/gen/document-model.js.map +0 -1
  56. package/dist/src/drive-document-model/gen/document-schema.d.ts +0 -68
  57. package/dist/src/drive-document-model/gen/document-schema.d.ts.map +0 -1
  58. package/dist/src/drive-document-model/gen/document-schema.js +0 -35
  59. package/dist/src/drive-document-model/gen/document-schema.js.map +0 -1
  60. package/dist/src/drive-document-model/gen/document-type.d.ts +0 -2
  61. package/dist/src/drive-document-model/gen/document-type.d.ts.map +0 -1
  62. package/dist/src/drive-document-model/gen/document-type.js +0 -2
  63. package/dist/src/drive-document-model/gen/document-type.js.map +0 -1
  64. package/dist/src/drive-document-model/gen/drive/actions.d.ts +0 -46
  65. package/dist/src/drive-document-model/gen/drive/actions.d.ts.map +0 -1
  66. package/dist/src/drive-document-model/gen/drive/actions.js +0 -2
  67. package/dist/src/drive-document-model/gen/drive/actions.js.map +0 -1
  68. package/dist/src/drive-document-model/gen/drive/creators.d.ts +0 -10
  69. package/dist/src/drive-document-model/gen/drive/creators.d.ts.map +0 -1
  70. package/dist/src/drive-document-model/gen/drive/creators.js +0 -11
  71. package/dist/src/drive-document-model/gen/drive/creators.js.map +0 -1
  72. package/dist/src/drive-document-model/gen/drive/error.d.ts +0 -2
  73. package/dist/src/drive-document-model/gen/drive/error.d.ts.map +0 -1
  74. package/dist/src/drive-document-model/gen/drive/error.js +0 -2
  75. package/dist/src/drive-document-model/gen/drive/error.js.map +0 -1
  76. package/dist/src/drive-document-model/gen/drive/index.d.ts +0 -2
  77. package/dist/src/drive-document-model/gen/drive/index.d.ts.map +0 -1
  78. package/dist/src/drive-document-model/gen/drive/index.js +0 -2
  79. package/dist/src/drive-document-model/gen/drive/index.js.map +0 -1
  80. package/dist/src/drive-document-model/gen/drive/types.d.ts +0 -2
  81. package/dist/src/drive-document-model/gen/drive/types.d.ts.map +0 -1
  82. package/dist/src/drive-document-model/gen/drive/types.js +0 -2
  83. package/dist/src/drive-document-model/gen/drive/types.js.map +0 -1
  84. package/dist/src/drive-document-model/gen/index.d.ts +0 -10
  85. package/dist/src/drive-document-model/gen/index.d.ts.map +0 -1
  86. package/dist/src/drive-document-model/gen/index.js +0 -10
  87. package/dist/src/drive-document-model/gen/index.js.map +0 -1
  88. package/dist/src/drive-document-model/gen/node/actions.d.ts +0 -41
  89. package/dist/src/drive-document-model/gen/node/actions.d.ts.map +0 -1
  90. package/dist/src/drive-document-model/gen/node/actions.js +0 -2
  91. package/dist/src/drive-document-model/gen/node/actions.js.map +0 -1
  92. package/dist/src/drive-document-model/gen/node/creators.d.ts +0 -13
  93. package/dist/src/drive-document-model/gen/node/creators.d.ts.map +0 -1
  94. package/dist/src/drive-document-model/gen/node/creators.js +0 -17
  95. package/dist/src/drive-document-model/gen/node/creators.js.map +0 -1
  96. package/dist/src/drive-document-model/gen/node/error.d.ts +0 -2
  97. package/dist/src/drive-document-model/gen/node/error.d.ts.map +0 -1
  98. package/dist/src/drive-document-model/gen/node/error.js +0 -2
  99. package/dist/src/drive-document-model/gen/node/error.js.map +0 -1
  100. package/dist/src/drive-document-model/gen/node/index.d.ts +0 -2
  101. package/dist/src/drive-document-model/gen/node/index.d.ts.map +0 -1
  102. package/dist/src/drive-document-model/gen/node/index.js +0 -2
  103. package/dist/src/drive-document-model/gen/node/index.js.map +0 -1
  104. package/dist/src/drive-document-model/gen/node/types.d.ts +0 -2
  105. package/dist/src/drive-document-model/gen/node/types.d.ts.map +0 -1
  106. package/dist/src/drive-document-model/gen/node/types.js +0 -2
  107. package/dist/src/drive-document-model/gen/node/types.js.map +0 -1
  108. package/dist/src/drive-document-model/gen/ph-factories.d.ts +0 -12
  109. package/dist/src/drive-document-model/gen/ph-factories.d.ts.map +0 -1
  110. package/dist/src/drive-document-model/gen/ph-factories.js +0 -46
  111. package/dist/src/drive-document-model/gen/ph-factories.js.map +0 -1
  112. package/dist/src/drive-document-model/gen/reducer.d.ts +0 -4
  113. package/dist/src/drive-document-model/gen/reducer.d.ts.map +0 -1
  114. package/dist/src/drive-document-model/gen/reducer.js +0 -76
  115. package/dist/src/drive-document-model/gen/reducer.js.map +0 -1
  116. package/dist/src/drive-document-model/gen/schema/index.d.ts +0 -2
  117. package/dist/src/drive-document-model/gen/schema/index.d.ts.map +0 -1
  118. package/dist/src/drive-document-model/gen/schema/index.js +0 -2
  119. package/dist/src/drive-document-model/gen/schema/index.js.map +0 -1
  120. package/dist/src/drive-document-model/gen/schema/types.d.ts +0 -283
  121. package/dist/src/drive-document-model/gen/schema/types.d.ts.map +0 -1
  122. package/dist/src/drive-document-model/gen/schema/types.js +0 -2
  123. package/dist/src/drive-document-model/gen/schema/types.js.map +0 -1
  124. package/dist/src/drive-document-model/gen/schema/zod.d.ts +0 -67
  125. package/dist/src/drive-document-model/gen/schema/zod.d.ts.map +0 -1
  126. package/dist/src/drive-document-model/gen/schema/zod.js +0 -229
  127. package/dist/src/drive-document-model/gen/schema/zod.js.map +0 -1
  128. package/dist/src/drive-document-model/gen/types.d.ts +0 -21
  129. package/dist/src/drive-document-model/gen/types.d.ts.map +0 -1
  130. package/dist/src/drive-document-model/gen/types.js +0 -4
  131. package/dist/src/drive-document-model/gen/types.js.map +0 -1
  132. package/dist/src/drive-document-model/gen/utils.d.ts +0 -13
  133. package/dist/src/drive-document-model/gen/utils.d.ts.map +0 -1
  134. package/dist/src/drive-document-model/gen/utils.js +0 -48
  135. package/dist/src/drive-document-model/gen/utils.js.map +0 -1
  136. package/dist/src/drive-document-model/index.d.ts +0 -5
  137. package/dist/src/drive-document-model/index.d.ts.map +0 -1
  138. package/dist/src/drive-document-model/index.js +0 -5
  139. package/dist/src/drive-document-model/index.js.map +0 -1
  140. package/dist/src/drive-document-model/module.d.ts +0 -3
  141. package/dist/src/drive-document-model/module.d.ts.map +0 -1
  142. package/dist/src/drive-document-model/module.js +0 -24
  143. package/dist/src/drive-document-model/module.js.map +0 -1
  144. package/dist/src/drive-document-model/src/index.d.ts +0 -3
  145. package/dist/src/drive-document-model/src/index.d.ts.map +0 -1
  146. package/dist/src/drive-document-model/src/index.js +0 -3
  147. package/dist/src/drive-document-model/src/index.js.map +0 -1
  148. package/dist/src/drive-document-model/src/reducers/drive.d.ts +0 -8
  149. package/dist/src/drive-document-model/src/reducers/drive.d.ts.map +0 -1
  150. package/dist/src/drive-document-model/src/reducers/drive.js +0 -66
  151. package/dist/src/drive-document-model/src/reducers/drive.js.map +0 -1
  152. package/dist/src/drive-document-model/src/reducers/index.d.ts +0 -3
  153. package/dist/src/drive-document-model/src/reducers/index.d.ts.map +0 -1
  154. package/dist/src/drive-document-model/src/reducers/index.js +0 -3
  155. package/dist/src/drive-document-model/src/reducers/index.js.map +0 -1
  156. package/dist/src/drive-document-model/src/reducers/node.d.ts +0 -8
  157. package/dist/src/drive-document-model/src/reducers/node.d.ts.map +0 -1
  158. package/dist/src/drive-document-model/src/reducers/node.js +0 -187
  159. package/dist/src/drive-document-model/src/reducers/node.js.map +0 -1
  160. package/dist/src/drive-document-model/src/tests/actions.test.d.ts +0 -2
  161. package/dist/src/drive-document-model/src/tests/actions.test.d.ts.map +0 -1
  162. package/dist/src/drive-document-model/src/tests/actions.test.js +0 -197
  163. package/dist/src/drive-document-model/src/tests/actions.test.js.map +0 -1
  164. package/dist/src/drive-document-model/src/tests/base.test.d.ts +0 -2
  165. package/dist/src/drive-document-model/src/tests/base.test.d.ts.map +0 -1
  166. package/dist/src/drive-document-model/src/tests/base.test.js +0 -44
  167. package/dist/src/drive-document-model/src/tests/base.test.js.map +0 -1
  168. package/dist/src/drive-document-model/src/tests/document-model.test.d.ts +0 -6
  169. package/dist/src/drive-document-model/src/tests/document-model.test.d.ts.map +0 -1
  170. package/dist/src/drive-document-model/src/tests/document-model.test.js +0 -19
  171. package/dist/src/drive-document-model/src/tests/document-model.test.js.map +0 -1
  172. package/dist/src/drive-document-model/src/tests/drive.test.d.ts +0 -6
  173. package/dist/src/drive-document-model/src/tests/drive.test.d.ts.map +0 -1
  174. package/dist/src/drive-document-model/src/tests/drive.test.js +0 -38
  175. package/dist/src/drive-document-model/src/tests/drive.test.js.map +0 -1
  176. package/dist/src/drive-document-model/src/tests/generate-mock.d.ts +0 -3
  177. package/dist/src/drive-document-model/src/tests/generate-mock.d.ts.map +0 -1
  178. package/dist/src/drive-document-model/src/tests/generate-mock.js +0 -5
  179. package/dist/src/drive-document-model/src/tests/generate-mock.js.map +0 -1
  180. package/dist/src/drive-document-model/src/tests/node.test.d.ts +0 -6
  181. package/dist/src/drive-document-model/src/tests/node.test.d.ts.map +0 -1
  182. package/dist/src/drive-document-model/src/tests/node.test.js +0 -343
  183. package/dist/src/drive-document-model/src/tests/node.test.js.map +0 -1
  184. package/dist/src/drive-document-model/src/tests/test-factories.d.ts +0 -9
  185. package/dist/src/drive-document-model/src/tests/test-factories.d.ts.map +0 -1
  186. package/dist/src/drive-document-model/src/tests/test-factories.js +0 -17
  187. package/dist/src/drive-document-model/src/tests/test-factories.js.map +0 -1
  188. package/dist/src/drive-document-model/src/tests/utils.test.d.ts +0 -2
  189. package/dist/src/drive-document-model/src/tests/utils.test.d.ts.map +0 -1
  190. package/dist/src/drive-document-model/src/tests/utils.test.js +0 -232
  191. package/dist/src/drive-document-model/src/tests/utils.test.js.map +0 -1
  192. package/dist/src/drive-document-model/src/types.d.ts +0 -8
  193. package/dist/src/drive-document-model/src/types.d.ts.map +0 -1
  194. package/dist/src/drive-document-model/src/types.js +0 -2
  195. package/dist/src/drive-document-model/src/types.js.map +0 -1
  196. package/dist/src/drive-document-model/src/utils.d.ts +0 -23
  197. package/dist/src/drive-document-model/src/utils.d.ts.map +0 -1
  198. package/dist/src/drive-document-model/src/utils.js +0 -102
  199. package/dist/src/drive-document-model/src/utils.js.map +0 -1
  200. package/dist/src/drive-document-model/types.d.ts +0 -10
  201. package/dist/src/drive-document-model/types.d.ts.map +0 -1
  202. package/dist/src/drive-document-model/types.js +0 -3
  203. package/dist/src/drive-document-model/types.js.map +0 -1
  204. package/dist/src/index.d.ts +0 -17
  205. package/dist/src/index.d.ts.map +0 -1
  206. package/dist/src/index.js +0 -17
  207. package/dist/src/index.js.map +0 -1
  208. package/dist/src/processors/index.d.ts +0 -4
  209. package/dist/src/processors/index.d.ts.map +0 -1
  210. package/dist/src/processors/index.js +0 -4
  211. package/dist/src/processors/index.js.map +0 -1
  212. package/dist/src/processors/processor-manager.d.ts +0 -21
  213. package/dist/src/processors/processor-manager.d.ts.map +0 -1
  214. package/dist/src/processors/processor-manager.js +0 -104
  215. package/dist/src/processors/processor-manager.js.map +0 -1
  216. package/dist/src/processors/relational.d.ts +0 -49
  217. package/dist/src/processors/relational.d.ts.map +0 -1
  218. package/dist/src/processors/relational.js +0 -57
  219. package/dist/src/processors/relational.js.map +0 -1
  220. package/dist/src/processors/types.d.ts +0 -94
  221. package/dist/src/processors/types.d.ts.map +0 -1
  222. package/dist/src/processors/types.js +0 -2
  223. package/dist/src/processors/types.js.map +0 -1
  224. package/dist/src/processors/utils.d.ts +0 -29
  225. package/dist/src/processors/utils.d.ts.map +0 -1
  226. package/dist/src/processors/utils.js +0 -72
  227. package/dist/src/processors/utils.js.map +0 -1
  228. package/dist/src/queue/base.d.ts +0 -22
  229. package/dist/src/queue/base.d.ts.map +0 -1
  230. package/dist/src/queue/base.js +0 -54
  231. package/dist/src/queue/base.js.map +0 -1
  232. package/dist/src/queue/event.d.ts +0 -40
  233. package/dist/src/queue/event.d.ts.map +0 -1
  234. package/dist/src/queue/event.js +0 -226
  235. package/dist/src/queue/event.js.map +0 -1
  236. package/dist/src/queue/index.d.ts +0 -5
  237. package/dist/src/queue/index.d.ts.map +0 -1
  238. package/dist/src/queue/index.js +0 -5
  239. package/dist/src/queue/index.js.map +0 -1
  240. package/dist/src/queue/redis.d.ts +0 -2
  241. package/dist/src/queue/redis.d.ts.map +0 -1
  242. package/dist/src/queue/redis.js +0 -123
  243. package/dist/src/queue/redis.js.map +0 -1
  244. package/dist/src/queue/types.d.ts +0 -59
  245. package/dist/src/queue/types.d.ts.map +0 -1
  246. package/dist/src/queue/types.js +0 -2
  247. package/dist/src/queue/types.js.map +0 -1
  248. package/dist/src/queue/utils.d.ts +0 -5
  249. package/dist/src/queue/utils.d.ts.map +0 -1
  250. package/dist/src/queue/utils.js +0 -10
  251. package/dist/src/queue/utils.js.map +0 -1
  252. package/dist/src/read-mode/errors.d.ts +0 -12
  253. package/dist/src/read-mode/errors.d.ts.map +0 -1
  254. package/dist/src/read-mode/errors.js +0 -18
  255. package/dist/src/read-mode/errors.js.map +0 -1
  256. package/dist/src/read-mode/index.d.ts +0 -4
  257. package/dist/src/read-mode/index.d.ts.map +0 -1
  258. package/dist/src/read-mode/index.js +0 -4
  259. package/dist/src/read-mode/index.js.map +0 -1
  260. package/dist/src/read-mode/server.d.ts +0 -3
  261. package/dist/src/read-mode/server.d.ts.map +0 -1
  262. package/dist/src/read-mode/server.js +0 -78
  263. package/dist/src/read-mode/server.js.map +0 -1
  264. package/dist/src/read-mode/service.d.ts +0 -17
  265. package/dist/src/read-mode/service.d.ts.map +0 -1
  266. package/dist/src/read-mode/service.js +0 -119
  267. package/dist/src/read-mode/service.js.map +0 -1
  268. package/dist/src/read-mode/types.d.ts +0 -31
  269. package/dist/src/read-mode/types.d.ts.map +0 -1
  270. package/dist/src/read-mode/types.js +0 -2
  271. package/dist/src/read-mode/types.js.map +0 -1
  272. package/dist/src/server/base-server.d.ts +0 -177
  273. package/dist/src/server/base-server.d.ts.map +0 -1
  274. package/dist/src/server/base-server.js +0 -2000
  275. package/dist/src/server/base-server.js.map +0 -1
  276. package/dist/src/server/builder.d.ts +0 -27
  277. package/dist/src/server/builder.d.ts.map +0 -1
  278. package/dist/src/server/builder.js +0 -97
  279. package/dist/src/server/builder.js.map +0 -1
  280. package/dist/src/server/error.d.ts +0 -34
  281. package/dist/src/server/error.d.ts.map +0 -1
  282. package/dist/src/server/error.js +0 -56
  283. package/dist/src/server/error.js.map +0 -1
  284. package/dist/src/server/event-emitter.d.ts +0 -8
  285. package/dist/src/server/event-emitter.d.ts.map +0 -1
  286. package/dist/src/server/event-emitter.js +0 -11
  287. package/dist/src/server/event-emitter.js.map +0 -1
  288. package/dist/src/server/index.d.ts +0 -10
  289. package/dist/src/server/index.d.ts.map +0 -1
  290. package/dist/src/server/index.js +0 -10
  291. package/dist/src/server/index.js.map +0 -1
  292. package/dist/src/server/listener/constants.d.ts +0 -4
  293. package/dist/src/server/listener/constants.d.ts.map +0 -1
  294. package/dist/src/server/listener/constants.js +0 -4
  295. package/dist/src/server/listener/constants.js.map +0 -1
  296. package/dist/src/server/listener/index.d.ts +0 -4
  297. package/dist/src/server/listener/index.d.ts.map +0 -1
  298. package/dist/src/server/listener/index.js +0 -4
  299. package/dist/src/server/listener/index.js.map +0 -1
  300. package/dist/src/server/listener/listener-manager.d.ts +0 -28
  301. package/dist/src/server/listener/listener-manager.d.ts.map +0 -1
  302. package/dist/src/server/listener/listener-manager.js +0 -415
  303. package/dist/src/server/listener/listener-manager.js.map +0 -1
  304. package/dist/src/server/listener/util.d.ts +0 -2
  305. package/dist/src/server/listener/util.d.ts.map +0 -1
  306. package/dist/src/server/listener/util.js +0 -23
  307. package/dist/src/server/listener/util.js.map +0 -1
  308. package/dist/src/server/sync-manager.d.ts +0 -28
  309. package/dist/src/server/sync-manager.d.ts.map +0 -1
  310. package/dist/src/server/sync-manager.js +0 -222
  311. package/dist/src/server/sync-manager.js.map +0 -1
  312. package/dist/src/server/sync-unit-map.d.ts +0 -116
  313. package/dist/src/server/sync-unit-map.d.ts.map +0 -1
  314. package/dist/src/server/sync-unit-map.js +0 -233
  315. package/dist/src/server/sync-unit-map.js.map +0 -1
  316. package/dist/src/server/transmitter/constants.d.ts +0 -2
  317. package/dist/src/server/transmitter/constants.d.ts.map +0 -1
  318. package/dist/src/server/transmitter/constants.js +0 -2
  319. package/dist/src/server/transmitter/constants.js.map +0 -1
  320. package/dist/src/server/transmitter/factory.d.ts +0 -7
  321. package/dist/src/server/transmitter/factory.d.ts.map +0 -1
  322. package/dist/src/server/transmitter/factory.js +0 -25
  323. package/dist/src/server/transmitter/factory.js.map +0 -1
  324. package/dist/src/server/transmitter/index.d.ts +0 -6
  325. package/dist/src/server/transmitter/index.d.ts.map +0 -1
  326. package/dist/src/server/transmitter/index.js +0 -5
  327. package/dist/src/server/transmitter/index.js.map +0 -1
  328. package/dist/src/server/transmitter/internal.d.ts +0 -12
  329. package/dist/src/server/transmitter/internal.d.ts.map +0 -1
  330. package/dist/src/server/transmitter/internal.js +0 -113
  331. package/dist/src/server/transmitter/internal.js.map +0 -1
  332. package/dist/src/server/transmitter/pull-responder.d.ts +0 -30
  333. package/dist/src/server/transmitter/pull-responder.d.ts.map +0 -1
  334. package/dist/src/server/transmitter/pull-responder.js +0 -543
  335. package/dist/src/server/transmitter/pull-responder.js.map +0 -1
  336. package/dist/src/server/transmitter/switchboard-push.d.ts +0 -11
  337. package/dist/src/server/transmitter/switchboard-push.d.ts.map +0 -1
  338. package/dist/src/server/transmitter/switchboard-push.js +0 -130
  339. package/dist/src/server/transmitter/switchboard-push.js.map +0 -1
  340. package/dist/src/server/transmitter/types.d.ts +0 -53
  341. package/dist/src/server/transmitter/types.d.ts.map +0 -1
  342. package/dist/src/server/transmitter/types.js +0 -2
  343. package/dist/src/server/transmitter/types.js.map +0 -1
  344. package/dist/src/server/types.d.ts +0 -419
  345. package/dist/src/server/types.d.ts.map +0 -1
  346. package/dist/src/server/types.js +0 -10
  347. package/dist/src/server/types.js.map +0 -1
  348. package/dist/src/server/utils.d.ts +0 -19
  349. package/dist/src/server/utils.d.ts.map +0 -1
  350. package/dist/src/server/utils.js +0 -110
  351. package/dist/src/server/utils.js.map +0 -1
  352. package/dist/src/storage/browser.d.ts +0 -52
  353. package/dist/src/storage/browser.d.ts.map +0 -1
  354. package/dist/src/storage/browser.js +0 -430
  355. package/dist/src/storage/browser.js.map +0 -1
  356. package/dist/src/storage/filesystem.d.ts +0 -45
  357. package/dist/src/storage/filesystem.d.ts.map +0 -1
  358. package/dist/src/storage/filesystem.js +0 -457
  359. package/dist/src/storage/filesystem.js.map +0 -1
  360. package/dist/src/storage/index.d.ts +0 -5
  361. package/dist/src/storage/index.d.ts.map +0 -1
  362. package/dist/src/storage/index.js +0 -5
  363. package/dist/src/storage/index.js.map +0 -1
  364. package/dist/src/storage/ipfs.d.ts +0 -2
  365. package/dist/src/storage/ipfs.d.ts.map +0 -1
  366. package/dist/src/storage/ipfs.js +0 -491
  367. package/dist/src/storage/ipfs.js.map +0 -1
  368. package/dist/src/storage/memory.d.ts +0 -42
  369. package/dist/src/storage/memory.d.ts.map +0 -1
  370. package/dist/src/storage/memory.js +0 -355
  371. package/dist/src/storage/memory.js.map +0 -1
  372. package/dist/src/storage/path-encoding.d.ts +0 -21
  373. package/dist/src/storage/path-encoding.d.ts.map +0 -1
  374. package/dist/src/storage/path-encoding.js +0 -53
  375. package/dist/src/storage/path-encoding.js.map +0 -1
  376. package/dist/src/storage/prisma/client/default.d.ts +0 -1
  377. package/dist/src/storage/prisma/client/default.js +0 -1
  378. package/dist/src/storage/prisma/client/edge.d.ts +0 -1
  379. package/dist/src/storage/prisma/client/edge.js +0 -263
  380. package/dist/src/storage/prisma/client/index-browser.js +0 -246
  381. package/dist/src/storage/prisma/client/index.d.ts +0 -10318
  382. package/dist/src/storage/prisma/client/index.js +0 -292
  383. package/dist/src/storage/prisma/client/libquery_engine-darwin-arm64.dylib.node +0 -0
  384. package/dist/src/storage/prisma/client/libquery_engine-debian-openssl-3.0.x.so.node +0 -0
  385. package/dist/src/storage/prisma/client/libquery_engine-linux-musl.so.node +0 -0
  386. package/dist/src/storage/prisma/client/package.json +0 -84
  387. package/dist/src/storage/prisma/client/runtime/edge-esm.js +0 -31
  388. package/dist/src/storage/prisma/client/runtime/edge.js +0 -31
  389. package/dist/src/storage/prisma/client/runtime/index-browser.d.ts +0 -365
  390. package/dist/src/storage/prisma/client/runtime/index-browser.js +0 -13
  391. package/dist/src/storage/prisma/client/runtime/library.d.ts +0 -3273
  392. package/dist/src/storage/prisma/client/runtime/library.js +0 -143
  393. package/dist/src/storage/prisma/client/runtime/react-native.js +0 -80
  394. package/dist/src/storage/prisma/client/runtime/wasm.js +0 -32
  395. package/dist/src/storage/prisma/client/schema.prisma +0 -93
  396. package/dist/src/storage/prisma/client/wasm.d.ts +0 -1
  397. package/dist/src/storage/prisma/client/wasm.js +0 -246
  398. package/dist/src/storage/prisma/factory.d.ts +0 -10
  399. package/dist/src/storage/prisma/factory.d.ts.map +0 -1
  400. package/dist/src/storage/prisma/factory.js +0 -23
  401. package/dist/src/storage/prisma/factory.js.map +0 -1
  402. package/dist/src/storage/prisma/index.d.ts +0 -3
  403. package/dist/src/storage/prisma/index.d.ts.map +0 -1
  404. package/dist/src/storage/prisma/index.js +0 -3
  405. package/dist/src/storage/prisma/index.js.map +0 -1
  406. package/dist/src/storage/prisma/prisma.d.ts +0 -73
  407. package/dist/src/storage/prisma/prisma.d.ts.map +0 -1
  408. package/dist/src/storage/prisma/prisma.js +0 -760
  409. package/dist/src/storage/prisma/prisma.js.map +0 -1
  410. package/dist/src/storage/types.d.ts +0 -187
  411. package/dist/src/storage/types.d.ts.map +0 -1
  412. package/dist/src/storage/types.js +0 -2
  413. package/dist/src/storage/types.js.map +0 -1
  414. package/dist/src/storage/utils.d.ts +0 -6
  415. package/dist/src/storage/utils.d.ts.map +0 -1
  416. package/dist/src/storage/utils.js +0 -33
  417. package/dist/src/storage/utils.js.map +0 -1
  418. package/dist/src/utils/default-drives-manager.d.ts +0 -18
  419. package/dist/src/utils/default-drives-manager.d.ts.map +0 -1
  420. package/dist/src/utils/default-drives-manager.js +0 -208
  421. package/dist/src/utils/default-drives-manager.js.map +0 -1
  422. package/dist/src/utils/errors.d.ts +0 -5
  423. package/dist/src/utils/errors.d.ts.map +0 -1
  424. package/dist/src/utils/errors.js +0 -10
  425. package/dist/src/utils/errors.js.map +0 -1
  426. package/dist/src/utils/gql-transformations.d.ts +0 -32
  427. package/dist/src/utils/gql-transformations.d.ts.map +0 -1
  428. package/dist/src/utils/gql-transformations.js +0 -39
  429. package/dist/src/utils/gql-transformations.js.map +0 -1
  430. package/dist/src/utils/graphql.d.ts +0 -13
  431. package/dist/src/utils/graphql.d.ts.map +0 -1
  432. package/dist/src/utils/graphql.js +0 -196
  433. package/dist/src/utils/graphql.js.map +0 -1
  434. package/dist/src/utils/index.d.ts +0 -9
  435. package/dist/src/utils/index.d.ts.map +0 -1
  436. package/dist/src/utils/index.js +0 -9
  437. package/dist/src/utils/index.js.map +0 -1
  438. package/dist/src/utils/logger.d.ts +0 -3
  439. package/dist/src/utils/logger.d.ts.map +0 -1
  440. package/dist/src/utils/logger.js +0 -2
  441. package/dist/src/utils/logger.js.map +0 -1
  442. package/dist/src/utils/migrations.d.ts +0 -4
  443. package/dist/src/utils/migrations.d.ts.map +0 -1
  444. package/dist/src/utils/migrations.js +0 -112
  445. package/dist/src/utils/migrations.js.map +0 -1
  446. package/dist/src/utils/misc.d.ts +0 -21
  447. package/dist/src/utils/misc.d.ts.map +0 -1
  448. package/dist/src/utils/misc.js +0 -55
  449. package/dist/src/utils/misc.js.map +0 -1
  450. package/dist/src/utils/run-asap.d.ts +0 -8
  451. package/dist/src/utils/run-asap.d.ts.map +0 -1
  452. package/dist/src/utils/run-asap.js +0 -120
  453. package/dist/src/utils/run-asap.js.map +0 -1
  454. package/dist/src/utils/test.d.ts +0 -63
  455. package/dist/src/utils/test.d.ts.map +0 -1
  456. package/dist/src/utils/test.js +0 -161
  457. package/dist/src/utils/test.js.map +0 -1
  458. package/dist/src/utils/types.d.ts +0 -44
  459. package/dist/src/utils/types.d.ts.map +0 -1
  460. package/dist/src/utils/types.js +0 -2
  461. package/dist/src/utils/types.js.map +0 -1
  462. package/dist/test/benchmarks/getDrive.json +0 -10
  463. package/dist/test/benchmarks/processOperations.bench.d.ts +0 -2
  464. package/dist/test/benchmarks/processOperations.bench.d.ts.map +0 -1
  465. package/dist/test/benchmarks/processOperations.bench.js +0 -148
  466. package/dist/test/benchmarks/processOperations.bench.js.map +0 -1
  467. package/dist/test/benchmarks/queue.bench.d.ts +0 -2
  468. package/dist/test/benchmarks/queue.bench.d.ts.map +0 -1
  469. package/dist/test/benchmarks/queue.bench.js +0 -55
  470. package/dist/test/benchmarks/queue.bench.js.map +0 -1
  471. package/dist/test/benchmarks/strands.small.json +0 -37085
  472. package/dist/test/cache.test.d.ts +0 -2
  473. package/dist/test/cache.test.d.ts.map +0 -1
  474. package/dist/test/cache.test.js +0 -276
  475. package/dist/test/cache.test.js.map +0 -1
  476. package/dist/test/default-remote-drives.test.d.ts +0 -2
  477. package/dist/test/default-remote-drives.test.d.ts.map +0 -1
  478. package/dist/test/default-remote-drives.test.js +0 -445
  479. package/dist/test/default-remote-drives.test.js.map +0 -1
  480. package/dist/test/drive-operations.test.d.ts +0 -2
  481. package/dist/test/drive-operations.test.d.ts.map +0 -1
  482. package/dist/test/drive-operations.test.js +0 -134
  483. package/dist/test/drive-operations.test.js.map +0 -1
  484. package/dist/test/dual-action-create.test.d.ts +0 -2
  485. package/dist/test/dual-action-create.test.d.ts.map +0 -1
  486. package/dist/test/dual-action-create.test.js +0 -187
  487. package/dist/test/dual-action-create.test.js.map +0 -1
  488. package/dist/test/dual-action-migration.test.d.ts +0 -2
  489. package/dist/test/dual-action-migration.test.d.ts.map +0 -1
  490. package/dist/test/dual-action-migration.test.js +0 -348
  491. package/dist/test/dual-action-migration.test.js.map +0 -1
  492. package/dist/test/graphql.test.d.ts +0 -2
  493. package/dist/test/graphql.test.d.ts.map +0 -1
  494. package/dist/test/graphql.test.js +0 -9
  495. package/dist/test/graphql.test.js.map +0 -1
  496. package/dist/test/internal-listener.test.d.ts +0 -2
  497. package/dist/test/internal-listener.test.d.ts.map +0 -1
  498. package/dist/test/internal-listener.test.js +0 -262
  499. package/dist/test/internal-listener.test.js.map +0 -1
  500. package/dist/test/path-encoding.test.d.ts +0 -2
  501. package/dist/test/path-encoding.test.d.ts.map +0 -1
  502. package/dist/test/path-encoding.test.js +0 -116
  503. package/dist/test/path-encoding.test.js.map +0 -1
  504. package/dist/test/queue.test.d.ts +0 -2
  505. package/dist/test/queue.test.d.ts.map +0 -1
  506. package/dist/test/queue.test.js +0 -325
  507. package/dist/test/queue.test.js.map +0 -1
  508. package/dist/test/reactor.test.d.ts +0 -2
  509. package/dist/test/reactor.test.d.ts.map +0 -1
  510. package/dist/test/reactor.test.js +0 -32
  511. package/dist/test/reactor.test.js.map +0 -1
  512. package/dist/test/read-mode.test.d.ts +0 -2
  513. package/dist/test/read-mode.test.d.ts.map +0 -1
  514. package/dist/test/read-mode.test.js +0 -569
  515. package/dist/test/read-mode.test.js.map +0 -1
  516. package/dist/test/server/driveOperationsConflictResolution.test.d.ts +0 -2
  517. package/dist/test/server/driveOperationsConflictResolution.test.d.ts.map +0 -1
  518. package/dist/test/server/driveOperationsConflictResolution.test.js +0 -486
  519. package/dist/test/server/driveOperationsConflictResolution.test.js.map +0 -1
  520. package/dist/test/server/mergeOperations.test.d.ts +0 -2
  521. package/dist/test/server/mergeOperations.test.d.ts.map +0 -1
  522. package/dist/test/server/mergeOperations.test.js +0 -131
  523. package/dist/test/server/mergeOperations.test.js.map +0 -1
  524. package/dist/test/server/processOperations.test.d.ts +0 -2
  525. package/dist/test/server/processOperations.test.d.ts.map +0 -1
  526. package/dist/test/server/processOperations.test.js +0 -392
  527. package/dist/test/server/processOperations.test.js.map +0 -1
  528. package/dist/test/server.test.d.ts +0 -2
  529. package/dist/test/server.test.d.ts.map +0 -1
  530. package/dist/test/server.test.js +0 -957
  531. package/dist/test/server.test.js.map +0 -1
  532. package/dist/test/signature-migration.test.d.ts +0 -2
  533. package/dist/test/signature-migration.test.d.ts.map +0 -1
  534. package/dist/test/signature-migration.test.js +0 -241
  535. package/dist/test/signature-migration.test.js.map +0 -1
  536. package/dist/test/storage.test.d.ts +0 -2
  537. package/dist/test/storage.test.d.ts.map +0 -1
  538. package/dist/test/storage.test.js +0 -457
  539. package/dist/test/storage.test.js.map +0 -1
  540. package/dist/test/switchboard-push-listener.test.d.ts +0 -2
  541. package/dist/test/switchboard-push-listener.test.d.ts.map +0 -1
  542. package/dist/test/switchboard-push-listener.test.js +0 -133
  543. package/dist/test/switchboard-push-listener.test.js.map +0 -1
  544. package/dist/test/sync-manager.test.d.ts +0 -2
  545. package/dist/test/sync-manager.test.d.ts.map +0 -1
  546. package/dist/test/sync-manager.test.js +0 -354
  547. package/dist/test/sync-manager.test.js.map +0 -1
  548. package/dist/test/undo-redo-clipboard.test.d.ts +0 -2
  549. package/dist/test/undo-redo-clipboard.test.d.ts.map +0 -1
  550. package/dist/test/undo-redo-clipboard.test.js +0 -108
  551. package/dist/test/undo-redo-clipboard.test.js.map +0 -1
  552. package/dist/test/utils.test.d.ts +0 -2
  553. package/dist/test/utils.test.d.ts.map +0 -1
  554. package/dist/test/utils.test.js +0 -86
  555. package/dist/test/utils.test.js.map +0 -1
  556. package/dist/test/vitest-setup.d.ts +0 -2
  557. package/dist/test/vitest-setup.d.ts.map +0 -1
  558. package/dist/test/vitest-setup.js +0 -5
  559. package/dist/test/vitest-setup.js.map +0 -1
  560. package/dist/tsconfig.tsbuildinfo +0 -1
  561. package/dist/vitest.config.d.ts +0 -3
  562. package/dist/vitest.config.d.ts.map +0 -1
  563. package/dist/vitest.config.js +0 -28
  564. package/dist/vitest.config.js.map +0 -1
@@ -0,0 +1,49 @@
1
+ import { a as IStorageUnitFilter, i as IStorageUnit, n as IDocumentStorage, o as SynchronizationUnitQuery, r as IDriveOperationStorage } from "../index-HOJm2mt2.mjs";
2
+ import { Operation, PHDocument } from "@powerhousedao/shared/document-model";
3
+
4
+ //#region src/storage/filesystem.d.mts
5
+ declare class FilesystemStorage implements IDriveOperationStorage, IDocumentStorage {
6
+ private logger;
7
+ private basePath;
8
+ constructor(basePath: string);
9
+ findStorageUnitsBy(filter: IStorageUnitFilter, limit: number, cursor?: string): Promise<{
10
+ units: IStorageUnit[];
11
+ nextCursor?: string;
12
+ }>;
13
+ resolveIds(slugs: string[], signal?: AbortSignal): Promise<string[]>;
14
+ resolveSlugs(ids: string[], signal?: AbortSignal): Promise<string[]>;
15
+ exists(documentId: string): Promise<boolean>;
16
+ create(document: PHDocument): Promise<void>;
17
+ get<TDocument extends PHDocument>(documentId: string): Promise<TDocument>;
18
+ getBySlug<TDocument extends PHDocument>(slug: string): Promise<TDocument>;
19
+ findByType(documentModelType: string, limit?: number, cursor?: string): Promise<{
20
+ documents: string[];
21
+ nextCursor: string | undefined;
22
+ }>;
23
+ delete(documentId: string): Promise<boolean>;
24
+ addChild(parentId: string, childId: string): Promise<void>;
25
+ removeChild(parentId: string, childId: string): Promise<boolean>;
26
+ getChildren(parentId: string): Promise<string[]>;
27
+ getParents(childId: string): Promise<string[]>;
28
+ clear(): Promise<void>;
29
+ addDocumentOperations(id: string, operations: Operation[], document: PHDocument): Promise<undefined>;
30
+ addDriveOperations(id: string, operations: Operation[], document: PHDocument): Promise<void>;
31
+ getSynchronizationUnitsRevision(units: SynchronizationUnitQuery[]): Promise<{
32
+ documentId: string;
33
+ documentType: string;
34
+ scope: string;
35
+ branch: string;
36
+ lastUpdated: string;
37
+ revision: number;
38
+ }[]>;
39
+ private _buildDocumentPath;
40
+ private _buildManifestPath;
41
+ private _buildSlugManifestPath;
42
+ private getManifest;
43
+ private updateDriveManifest;
44
+ private getSlugManifest;
45
+ private updateSlugManifest;
46
+ }
47
+ //#endregion
48
+ export { FilesystemStorage };
49
+ //# sourceMappingURL=filesystem.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filesystem.d.mts","names":[],"sources":["../../src/storage/filesystem.mts"],"mappings":";;;;cAiDa,iBAAA,YACA,sBAAA,EAAwB,gBAAA;EAAA,QAE3B,MAAA;EAAA,QACA,QAAA;cAEI,QAAA;EASN,kBAAA,CACJ,MAAA,EAAQ,kBAAA,EACR,KAAA,UACA,MAAA,YACC,OAAA;IAAU,KAAA,EAAO,YAAA;IAAgB,UAAA;EAAA;EA8F9B,UAAA,CAAW,KAAA,YAAiB,MAAA,GAAS,WAAA,GAAc,OAAA;EAoBnD,YAAA,CAAa,GAAA,YAAe,MAAA,GAAS,WAAA,GAAc,OAAA;EAsBnD,MAAA,CAAO,UAAA,WAAqB,OAAA;EAS5B,MAAA,CAAO,QAAA,EAAU,UAAA,GAAU,OAAA;EAqC3B,GAAA,mBAAsB,UAAA,CAAA,CAC1B,UAAA,WACC,OAAA,CAAQ,SAAA;EAYL,SAAA,mBAA4B,UAAA,CAAA,CAChC,IAAA,WACC,OAAA,CAAQ,SAAA;EAWL,UAAA,CACJ,iBAAA,UACA,KAAA,WACA,MAAA,YACC,OAAA;IACD,SAAA;IACA,UAAA;EAAA;EAoEI,MAAA,CAAO,UAAA,WAAqB,OAAA;EA0C5B,QAAA,CAAS,QAAA,UAAkB,OAAA,WAAkB,OAAA;EAuB7C,WAAA,CAAY,QAAA,UAAkB,OAAA,WAAkB,OAAA;EAYhD,WAAA,CAAY,QAAA,WAAmB,OAAA;EAK/B,UAAA,CAAW,OAAA,WAAkB,OAAA;EAgC7B,KAAA,CAAA,GAAK,OAAA;EAmBL,qBAAA,CACJ,EAAA,UACA,UAAA,EAAY,SAAA,IACZ,QAAA,EAAU,UAAA,GAAU,OAAA;EAsChB,kBAAA,CACJ,EAAA,UACA,UAAA,EAAY,SAAA,IACZ,QAAA,EAAU,UAAA,GACT,OAAA;EAiCG,+BAAA,CACJ,KAAA,EAAO,wBAAA,KACN,OAAA;IAEC,UAAA;IACA,YAAA;IACA,KAAA;IACA,MAAA;IACA,WAAA;IACA,QAAA;EAAA;EAAA,QAsDI,kBAAA;EAAA,QAKA,kBAAA;EAAA,QAKA,sBAAA;EAAA,QAIM,WAAA;EAAA,QAWA,mBAAA;EAAA,QAUA,eAAA;EAAA,QAaA,kBAAA;AAAA"}
@@ -0,0 +1,371 @@
1
+ import { a as DocumentAlreadyExistsError, c as OperationError, l as AbortError, n as setIntersection, o as DocumentAlreadyExistsReason, r as setUnion, s as DocumentNotFoundError, t as resolveStorageUnitsFilter } from "../utils-BI7cwVSp.mjs";
2
+ import { childLogger } from "document-model";
3
+ import { existsSync, mkdirSync } from "fs";
4
+ import fs from "fs/promises";
5
+ import stringify from "json-stringify-deterministic";
6
+ import path from "path";
7
+ import "@powerhousedao/shared/document-drive";
8
+ import "change-case";
9
+ //#region src/utils/misc.ts
10
+ function mergeOperations(currentOperations, newOperations) {
11
+ const minIndexByScope = Object.keys(currentOperations).reduce((acc, curr) => {
12
+ const scope = curr;
13
+ acc[scope] = currentOperations[scope]?.at(-1)?.index ?? 0;
14
+ return acc;
15
+ }, {});
16
+ const conflictOp = newOperations.find((op) => op.index < (minIndexByScope[op.action.scope] ?? 0));
17
+ if (conflictOp) throw new OperationError("ERROR", conflictOp, `Tried to add operation with index ${conflictOp.index} and document is at index ${minIndexByScope[conflictOp.action.scope]}`);
18
+ return newOperations.sort((a, b) => a.index - b.index).reduce((acc, curr) => {
19
+ const existingOperations = acc[curr.action.scope] || [];
20
+ return {
21
+ ...acc,
22
+ [curr.action.scope]: [...existingOperations, curr]
23
+ };
24
+ }, currentOperations);
25
+ }
26
+ function operationsToRevision(operations) {
27
+ const lastOperation = operations?.at(-1);
28
+ return lastOperation ? lastOperation.index + 1 : 0;
29
+ }
30
+ //#endregion
31
+ //#region src/storage/path-encoding.ts
32
+ const UUID_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
33
+ const BASE64_SPECIAL_CHARS = /[+/=]/;
34
+ /**
35
+ * Checks if a string is a UUID v4.
36
+ */
37
+ function isUUID(id) {
38
+ return UUID_REGEX.test(id);
39
+ }
40
+ /**
41
+ * Checks if a string contains Base64 special characters that need encoding.
42
+ */
43
+ function hasBase64SpecialChars(id) {
44
+ return BASE64_SPECIAL_CHARS.test(id);
45
+ }
46
+ /**
47
+ * Encodes a document ID to a filesystem-safe string.
48
+ * - UUIDs pass through unchanged
49
+ * - Base64 signatures are encoded to Base64url
50
+ */
51
+ function encodeDocumentIdForPath(documentId) {
52
+ if (isUUID(documentId)) return documentId;
53
+ if (hasBase64SpecialChars(documentId)) return documentId.replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
54
+ return documentId;
55
+ }
56
+ /**
57
+ * Decodes a filesystem-safe string back to original document ID.
58
+ * - UUIDs pass through unchanged
59
+ * - Base64url is decoded back to Base64 (for signatures)
60
+ */
61
+ function decodeDocumentIdFromPath(encodedId) {
62
+ if (isUUID(encodedId)) return encodedId;
63
+ let base64 = encodedId.replace(/-/g, "+").replace(/_/g, "/");
64
+ const padLength = (4 - base64.length % 4) % 4;
65
+ base64 += "=".repeat(padLength);
66
+ return base64;
67
+ }
68
+ //#endregion
69
+ //#region src/storage/filesystem.mts
70
+ function ensureDir(dir) {
71
+ if (!existsSync(dir)) mkdirSync(dir, { recursive: true });
72
+ }
73
+ var FilesystemStorage = class {
74
+ logger = childLogger(["FilesystemStorage"]);
75
+ basePath;
76
+ constructor(basePath) {
77
+ this.basePath = basePath;
78
+ ensureDir(this.basePath);
79
+ }
80
+ async findStorageUnitsBy(filter, limit, cursor) {
81
+ const storageUnits = [];
82
+ const { parentId: parentIds, documentId: documentIds, documentModelType: documentTypes, scope: scopes, branch: branches } = resolveStorageUnitsFilter(filter);
83
+ const documentFiles = (await fs.readdir(this.basePath, { withFileTypes: true })).filter((file) => file.name.startsWith("document-") && file.name.endsWith(".json")).map((file) => decodeDocumentIdFromPath(file.name.replace("document-", "").replace(".json", "")));
84
+ let documents;
85
+ if (parentIds) {
86
+ const childrenIds = /* @__PURE__ */ new Set();
87
+ for (const parentId of parentIds) (await this.getChildren(parentId)).forEach((id) => childrenIds.add(id));
88
+ documents = setUnion(parentIds, childrenIds);
89
+ } else documents = new Set(documentFiles);
90
+ documents = documentIds ? setIntersection(documentIds, documents) : documents;
91
+ for (const documentId of documents) {
92
+ const document = await this.get(documentId).catch(() => null);
93
+ if (!document) continue;
94
+ if (documentTypes && !documentTypes.has(document.header.documentType)) continue;
95
+ for (const [scope] of Object.entries(document.state)) {
96
+ if (scopes && !scopes.has(scope)) continue;
97
+ storageUnits.push({
98
+ documentId,
99
+ documentModelType: document.header.documentType,
100
+ scope,
101
+ branch: "main"
102
+ });
103
+ }
104
+ }
105
+ let startIndex = 0;
106
+ if (cursor) {
107
+ const index = storageUnits.findIndex((unit) => unit.documentId === cursor);
108
+ if (index !== -1) startIndex = index;
109
+ }
110
+ const endIndex = Math.min(startIndex + limit, storageUnits.length);
111
+ const nextCursor = endIndex < storageUnits.length ? storageUnits[endIndex].documentId : void 0;
112
+ return {
113
+ units: storageUnits.slice(startIndex, endIndex),
114
+ nextCursor
115
+ };
116
+ }
117
+ async resolveIds(slugs, signal) {
118
+ const slugManifest = await this.getSlugManifest();
119
+ if (signal?.aborted) throw new AbortError("Aborted");
120
+ const ids = [];
121
+ for (const slug of slugs) {
122
+ const documentId = slugManifest.slugToId[slug];
123
+ if (!documentId) throw new DocumentNotFoundError(slug);
124
+ ids.push(documentId);
125
+ }
126
+ return Promise.resolve(ids);
127
+ }
128
+ async resolveSlugs(ids, signal) {
129
+ const slugs = [];
130
+ for (const id of ids) {
131
+ const document = await this.get(id);
132
+ if (!document) throw new DocumentNotFoundError(id);
133
+ if (signal?.aborted) throw new AbortError("Aborted");
134
+ slugs.push(document.header.slug);
135
+ }
136
+ return Promise.resolve(slugs);
137
+ }
138
+ async exists(documentId) {
139
+ try {
140
+ await fs.access(this._buildDocumentPath(documentId));
141
+ return true;
142
+ } catch {
143
+ return false;
144
+ }
145
+ }
146
+ async create(document) {
147
+ const documentId = document.header.id;
148
+ if (await this.exists(documentId)) throw new DocumentAlreadyExistsError(documentId);
149
+ const slug = document.header.slug?.length > 0 ? document.header.slug : documentId;
150
+ const slugManifest = await this.getSlugManifest();
151
+ if (slugManifest.slugToId[slug]) throw new DocumentAlreadyExistsError(documentId, DocumentAlreadyExistsReason.SLUG);
152
+ document.header.slug = slug;
153
+ const documentPath = this._buildDocumentPath(documentId);
154
+ await fs.writeFile(documentPath, stringify(document), { encoding: "utf-8" });
155
+ slugManifest.slugToId[slug] = documentId;
156
+ await this.updateSlugManifest(slugManifest);
157
+ if (document.header.documentType === "powerhouse/document-drive") this.updateDriveManifest(documentId, { documentIds: [] });
158
+ return Promise.resolve();
159
+ }
160
+ async get(documentId) {
161
+ try {
162
+ const content = await fs.readFile(this._buildDocumentPath(documentId), { encoding: "utf-8" });
163
+ return JSON.parse(content);
164
+ } catch (error) {
165
+ return Promise.reject(new DocumentNotFoundError(documentId));
166
+ }
167
+ }
168
+ async getBySlug(slug) {
169
+ const documentId = (await this.getSlugManifest()).slugToId[slug];
170
+ if (!documentId) return Promise.reject(new DocumentNotFoundError(slug));
171
+ return this.get(documentId);
172
+ }
173
+ async findByType(documentModelType, limit = 100, cursor) {
174
+ const documentFiles = (await fs.readdir(this.basePath, { withFileTypes: true })).filter((file) => file.name.startsWith("document-") && file.name.endsWith(".json"));
175
+ const documentsAndIds = [];
176
+ for (const file of documentFiles) {
177
+ const documentId = decodeDocumentIdFromPath(file.name.replace("document-", "").replace(".json", ""));
178
+ try {
179
+ const document = JSON.parse(await fs.readFile(this._buildDocumentPath(documentId), { encoding: "utf-8" }));
180
+ if (document.header.documentType === documentModelType) documentsAndIds.push({
181
+ id: documentId,
182
+ document
183
+ });
184
+ } catch (error) {
185
+ continue;
186
+ }
187
+ }
188
+ documentsAndIds.sort((a, b) => {
189
+ const aDate = new Date(a.document.header.createdAtUtcIso);
190
+ const bDate = new Date(b.document.header.createdAtUtcIso);
191
+ if (aDate.getTime() === bDate.getTime()) return a.id.localeCompare(b.id);
192
+ return aDate.getTime() - bDate.getTime();
193
+ });
194
+ let startIndex = 0;
195
+ if (cursor) {
196
+ const index = documentsAndIds.findIndex(({ id }) => id === cursor);
197
+ if (index !== -1) startIndex = index;
198
+ }
199
+ const endIndex = Math.min(startIndex + limit, documentsAndIds.length);
200
+ let nextCursor;
201
+ if (endIndex < documentsAndIds.length) nextCursor = documentsAndIds[endIndex].id;
202
+ return {
203
+ documents: documentsAndIds.slice(startIndex, endIndex).map(({ id }) => id),
204
+ nextCursor
205
+ };
206
+ }
207
+ async delete(documentId) {
208
+ try {
209
+ const document = await this.get(documentId);
210
+ const slug = document.header.slug?.length > 0 ? document.header.slug : documentId;
211
+ if (slug) {
212
+ const slugManifest = await this.getSlugManifest();
213
+ if (slugManifest.slugToId[slug] === documentId) {
214
+ delete slugManifest.slugToId[slug];
215
+ await this.updateSlugManifest(slugManifest);
216
+ }
217
+ }
218
+ } catch (error) {}
219
+ const parents = await this.getParents(documentId);
220
+ for (const parent of parents) await this.removeChild(parent, documentId);
221
+ try {
222
+ await fs.rm(this._buildManifestPath(documentId));
223
+ } catch (error) {}
224
+ const documentPath = this._buildDocumentPath(documentId);
225
+ if (await this.exists(documentId)) {
226
+ await fs.unlink(documentPath);
227
+ return Promise.resolve(true);
228
+ }
229
+ return Promise.resolve(false);
230
+ }
231
+ async addChild(parentId, childId) {
232
+ if (parentId === childId) return Promise.reject(/* @__PURE__ */ new Error("Cannot associate a document with itself"));
233
+ if ((await this.getChildren(childId)).includes(parentId)) return Promise.reject(/* @__PURE__ */ new Error("Cannot associate a document with its child"));
234
+ const manifest = await this.getManifest(parentId);
235
+ if (!manifest.documentIds.includes(childId)) {
236
+ manifest.documentIds.push(childId);
237
+ await this.updateDriveManifest(parentId, manifest);
238
+ }
239
+ }
240
+ async removeChild(parentId, childId) {
241
+ const manifest = await this.getManifest(parentId);
242
+ const docIndex = manifest.documentIds.indexOf(childId);
243
+ if (docIndex !== -1) {
244
+ manifest.documentIds.splice(docIndex, 1);
245
+ await this.updateDriveManifest(parentId, manifest);
246
+ return true;
247
+ }
248
+ return false;
249
+ }
250
+ async getChildren(parentId) {
251
+ return (await this.getManifest(parentId)).documentIds;
252
+ }
253
+ async getParents(childId) {
254
+ const parents = [];
255
+ const manifestFiles = (await fs.readdir(this.basePath, { withFileTypes: true })).filter((file) => file.name.startsWith("manifest-") && file.name.endsWith(".json"));
256
+ for (const file of manifestFiles) {
257
+ const driveId = decodeDocumentIdFromPath(file.name.replace("manifest-", "").replace(".json", ""));
258
+ if ((await this.getManifest(driveId)).documentIds.includes(childId)) parents.push(driveId);
259
+ }
260
+ return parents;
261
+ }
262
+ async clear() {
263
+ const files = (await fs.readdir(this.basePath, { withFileTypes: true })).filter((dirent) => !!dirent.name);
264
+ await Promise.all(files.map(async (dirent) => {
265
+ await fs.rm(path.join(this.basePath, dirent.name), { recursive: true });
266
+ }));
267
+ }
268
+ async addDocumentOperations(id, operations, document) {
269
+ const existingDocument = await this.get(id);
270
+ if (!existingDocument) return Promise.reject(new DocumentNotFoundError(id));
271
+ const mergedOperations = mergeOperations(existingDocument.operations, operations);
272
+ const revision = {};
273
+ for (const [scope, scopeOps] of Object.entries(mergedOperations)) revision[scope] = operationsToRevision(scopeOps);
274
+ const documentPath = this._buildDocumentPath(id);
275
+ await fs.writeFile(documentPath, stringify({
276
+ ...existingDocument,
277
+ state: document.state,
278
+ initialState: document.initialState,
279
+ header: {
280
+ ...existingDocument.header,
281
+ ...document.header,
282
+ revision
283
+ },
284
+ operations: mergedOperations,
285
+ clipboard: document.clipboard
286
+ }), { encoding: "utf-8" });
287
+ }
288
+ async addDriveOperations(id, operations, document) {
289
+ const existingDocument = await this.get(id);
290
+ const mergedOperations = mergeOperations(existingDocument.operations, operations);
291
+ const revision = {};
292
+ for (const [scope, scopeOps] of Object.entries(mergedOperations)) revision[scope] = operationsToRevision(scopeOps);
293
+ const drivePath = this._buildDocumentPath(id);
294
+ await fs.writeFile(drivePath, stringify({
295
+ ...existingDocument,
296
+ state: document.state,
297
+ initialState: document.initialState,
298
+ header: {
299
+ ...existingDocument.header,
300
+ ...document.header,
301
+ revision
302
+ },
303
+ operations: mergedOperations,
304
+ clipboard: document.clipboard
305
+ }), { encoding: "utf-8" });
306
+ }
307
+ async getSynchronizationUnitsRevision(units) {
308
+ return (await Promise.allSettled(units.map(async (unit) => {
309
+ try {
310
+ const document = await this.get(unit.documentId);
311
+ if (!document?.operations[unit.scope]) return;
312
+ const operations = document.operations[unit.scope];
313
+ return {
314
+ documentId: unit.documentId,
315
+ documentType: unit.documentType,
316
+ scope: unit.scope,
317
+ branch: unit.branch,
318
+ lastUpdated: operations.at(-1)?.timestampUtcMs ?? document.header.createdAtUtcIso,
319
+ revision: operations.length > 0 ? operationsToRevision(operations) : 0
320
+ };
321
+ } catch (error) {
322
+ this.logger.error("Error getting synchronization units revision: @error", error);
323
+ return;
324
+ }
325
+ }))).reduce((acc, curr) => {
326
+ if (curr.status === "fulfilled" && curr.value !== void 0) acc.push(curr.value);
327
+ return acc;
328
+ }, []);
329
+ }
330
+ _buildDocumentPath(documentId) {
331
+ const safeId = encodeDocumentIdForPath(documentId);
332
+ return `${this.basePath}/document-${safeId}.json`;
333
+ }
334
+ _buildManifestPath(driveId) {
335
+ const safeId = encodeDocumentIdForPath(driveId);
336
+ return `${this.basePath}/manifest-${safeId}.json`;
337
+ }
338
+ _buildSlugManifestPath() {
339
+ return `${this.basePath}/slugs.json`;
340
+ }
341
+ async getManifest(driveId) {
342
+ const manifestPath = this._buildManifestPath(driveId);
343
+ try {
344
+ const content = await fs.readFile(manifestPath, { encoding: "utf-8" });
345
+ return JSON.parse(content);
346
+ } catch (error) {
347
+ return { documentIds: [] };
348
+ }
349
+ }
350
+ async updateDriveManifest(driveId, manifest) {
351
+ const manifestPath = this._buildManifestPath(driveId);
352
+ await fs.writeFile(manifestPath, stringify(manifest), { encoding: "utf-8" });
353
+ }
354
+ async getSlugManifest() {
355
+ const slugManifestPath = this._buildSlugManifestPath();
356
+ try {
357
+ const content = await fs.readFile(slugManifestPath, { encoding: "utf-8" });
358
+ return JSON.parse(content);
359
+ } catch (error) {
360
+ return { slugToId: {} };
361
+ }
362
+ }
363
+ async updateSlugManifest(manifest) {
364
+ const slugManifestPath = this._buildSlugManifestPath();
365
+ await fs.writeFile(slugManifestPath, stringify(manifest), { encoding: "utf-8" });
366
+ }
367
+ };
368
+ //#endregion
369
+ export { FilesystemStorage };
370
+
371
+ //# sourceMappingURL=filesystem.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filesystem.mjs","names":[],"sources":["../../src/utils/misc.ts","../../src/storage/path-encoding.ts","../../src/storage/filesystem.mts"],"sourcesContent":["import {\n driveDocumentType,\n type DocumentDriveDocument,\n} from \"@powerhousedao/shared/document-drive\";\nimport { pascalCase } from \"change-case\";\nimport type { ListenerRevision } from \"document-drive\";\nimport type {\n DocumentOperations,\n Operation,\n PHDocument,\n} from \"@powerhousedao/shared/document-model\";\nimport { OperationError } from \"server\";\n\nexport function isDocumentDrive(\n document: PHDocument,\n): document is DocumentDriveDocument {\n return document.header.documentType === driveDocumentType;\n}\n\nexport function mergeOperations(\n currentOperations: DocumentOperations,\n newOperations: Operation[],\n): DocumentOperations {\n const minIndexByScope = Object.keys(currentOperations).reduce<\n Partial<Record<string, number>>\n >((acc, curr) => {\n const scope = curr;\n const scopeOps = currentOperations[scope];\n acc[scope] = scopeOps?.at(-1)?.index ?? 0;\n return acc;\n }, {});\n\n const conflictOp = newOperations.find(\n (op) => op.index < (minIndexByScope[op.action.scope] ?? 0),\n );\n if (conflictOp) {\n throw new OperationError(\n \"ERROR\",\n conflictOp,\n `Tried to add operation with index ${conflictOp.index} and document is at index ${minIndexByScope[conflictOp.action.scope]}`,\n );\n }\n\n return newOperations\n .sort((a, b) => a.index - b.index)\n .reduce<DocumentOperations>((acc, curr) => {\n const existingOperations = acc[curr.action.scope] || [];\n return { ...acc, [curr.action.scope]: [...existingOperations, curr] };\n }, currentOperations);\n}\n\nexport function isNoopUpdate(\n operation: Operation,\n latestOperation?: Operation,\n) {\n if (!latestOperation) {\n return false;\n }\n\n const isNoopOp = operation.action.type === \"NOOP\";\n const isNoopLatestOp = latestOperation.action.type === \"NOOP\";\n const isSameIndexOp = operation.index === latestOperation.index;\n const isSkipOpGreaterThanLatestOp = operation.skip > latestOperation.skip;\n\n return (\n isNoopOp && isNoopLatestOp && isSameIndexOp && isSkipOpGreaterThanLatestOp\n );\n}\n\n// return true if dateA is before dateB\nexport function isBefore(dateA: Date | string, dateB: Date | string) {\n return new Date(dateA) < new Date(dateB);\n}\n\nexport function operationsToRevision(\n operations: Pick<Operation, \"index\">[] | undefined,\n): ListenerRevision[\"revision\"] {\n const lastOperation = operations?.at(-1);\n return lastOperation ? lastOperation.index + 1 : 0;\n}\n\n/**\n * Converts a string to PascalCase\n * @param {string} str - The input string to convert\n * @returns {string} The string in PascalCase format\n *\n * Examples:\n * \"hello world\" -> \"HelloWorld\"\n * \"hello-world\" -> \"HelloWorld\"\n * \"hello_world\" -> \"HelloWorld\"\n * \"helloWorld\" -> \"HelloWorld\"\n */\nexport const toPascalCase = pascalCase;\n","// UUID v4 regex pattern\nconst UUID_REGEX =\n /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n\n// Base64 signature characters that need encoding\nconst BASE64_SPECIAL_CHARS = /[+/=]/;\n\n/**\n * Checks if a string is a UUID v4.\n */\nexport function isUUID(id: string): boolean {\n return UUID_REGEX.test(id);\n}\n\n/**\n * Checks if a string contains Base64 special characters that need encoding.\n */\nexport function hasBase64SpecialChars(id: string): boolean {\n return BASE64_SPECIAL_CHARS.test(id);\n}\n\n/**\n * Encodes a document ID to a filesystem-safe string.\n * - UUIDs pass through unchanged\n * - Base64 signatures are encoded to Base64url\n */\nexport function encodeDocumentIdForPath(documentId: string): string {\n // UUIDs are already filesystem-safe\n if (isUUID(documentId)) {\n return documentId;\n }\n\n // Only encode if it has Base64 special characters\n if (hasBase64SpecialChars(documentId)) {\n return documentId\n .replace(/\\+/g, \"-\")\n .replace(/\\//g, \"_\")\n .replace(/=+$/, \"\");\n }\n\n return documentId;\n}\n\n/**\n * Decodes a filesystem-safe string back to original document ID.\n * - UUIDs pass through unchanged\n * - Base64url is decoded back to Base64 (for signatures)\n */\nexport function decodeDocumentIdFromPath(encodedId: string): string {\n // UUIDs pass through unchanged\n if (isUUID(encodedId)) {\n return encodedId;\n }\n\n // Non-UUIDs are assumed to be Base64url-encoded signatures\n // Decode: replace - with +, _ with /, and restore padding\n let base64 = encodedId.replace(/-/g, \"+\").replace(/_/g, \"/\");\n const padLength = (4 - (base64.length % 4)) % 4;\n base64 += \"=\".repeat(padLength);\n return base64;\n}\n","import type { DocumentDriveDocument } from \"@powerhousedao/shared/document-drive\";\nimport type {\n Operation,\n PHDocument,\n} from \"@powerhousedao/shared/document-model\";\nimport type {\n IDocumentStorage,\n IDriveOperationStorage,\n IStorageUnit,\n IStorageUnitFilter,\n SynchronizationUnitQuery,\n} from \"document-drive\";\nimport { childLogger } from \"document-model\";\nimport { existsSync, mkdirSync } from \"fs\";\nimport fs from \"fs/promises\";\nimport stringify from \"json-stringify-deterministic\";\nimport path from \"path\";\nimport {\n DocumentAlreadyExistsError,\n DocumentAlreadyExistsReason,\n DocumentNotFoundError,\n} from \"server\";\nimport { AbortError, mergeOperations, operationsToRevision } from \"utils\";\nimport {\n decodeDocumentIdFromPath,\n encodeDocumentIdForPath,\n} from \"./path-encoding.js\";\nimport {\n resolveStorageUnitsFilter,\n setIntersection,\n setUnion,\n} from \"./utils.js\";\n\n// Interface for drive manifest that tracks document IDs in a drive\ninterface DriveManifest {\n documentIds: string[];\n}\n\n// Interface for slug manifest that maps slugs to document IDs\ninterface SlugManifest {\n slugToId: Record<string, string>;\n}\n\nfunction ensureDir(dir: string) {\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n}\n\nexport class FilesystemStorage\n implements IDriveOperationStorage, IDocumentStorage\n{\n private logger = childLogger([\"FilesystemStorage\"]);\n private basePath: string;\n\n constructor(basePath: string) {\n this.basePath = basePath;\n ensureDir(this.basePath);\n }\n\n ////////////////////////////////\n // IStorageUnitStorage\n ////////////////////////////////\n\n async findStorageUnitsBy(\n filter: IStorageUnitFilter,\n limit: number,\n cursor?: string,\n ): Promise<{ units: IStorageUnit[]; nextCursor?: string }> {\n const storageUnits: IStorageUnit[] = [];\n\n const {\n parentId: parentIds,\n documentId: documentIds,\n documentModelType: documentTypes,\n scope: scopes,\n branch: branches,\n } = resolveStorageUnitsFilter(filter);\n\n const files = await fs.readdir(this.basePath, { withFileTypes: true });\n const documentFiles = files\n .filter(\n (file) =>\n file.name.startsWith(\"document-\") && file.name.endsWith(\".json\"),\n )\n .map((file) =>\n decodeDocumentIdFromPath(\n file.name.replace(\"document-\", \"\").replace(\".json\", \"\"),\n ),\n );\n\n let documents: Set<string>;\n\n // apply parent id filter\n if (parentIds) {\n // join children from all parents\n const childrenIds = new Set<string>();\n for (const parentId of parentIds) {\n const ids = await this.getChildren(parentId);\n ids.forEach((id) => childrenIds.add(id));\n }\n documents = setUnion(parentIds, childrenIds);\n } else {\n documents = new Set(documentFiles);\n }\n\n // apply document id filter\n documents = documentIds\n ? setIntersection(documentIds, documents)\n : documents;\n\n for (const documentId of documents) {\n const document = await this.get(documentId).catch(() => null);\n // might be a child that has not been synced yet\n if (!document) continue;\n\n // apply document type filter\n if (documentTypes && !documentTypes.has(document.header.documentType))\n continue;\n\n // For each operation scope in the document\n for (const [scope] of Object.entries(document.state)) {\n // apply scope filter\n if (scopes && !scopes.has(scope)) continue;\n\n // Create storage unit for this document+scope combination\n storageUnits.push({\n documentId,\n documentModelType: document.header.documentType,\n scope,\n branch: \"main\", // Default branch\n });\n }\n }\n\n // Handle pagination\n let startIndex = 0;\n if (cursor) {\n const index = storageUnits.findIndex(\n (unit) => unit.documentId === cursor,\n );\n if (index !== -1) {\n startIndex = index;\n }\n }\n\n // Calculate the range to return\n const endIndex = Math.min(startIndex + limit, storageUnits.length);\n const nextCursor =\n endIndex < storageUnits.length\n ? storageUnits[endIndex].documentId\n : undefined;\n\n return {\n units: storageUnits.slice(startIndex, endIndex),\n nextCursor,\n };\n }\n\n ////////////////////////////////\n // IDocumentView\n ////////////////////////////////\n async resolveIds(slugs: string[], signal?: AbortSignal): Promise<string[]> {\n const slugManifest = await this.getSlugManifest();\n\n if (signal?.aborted) {\n throw new AbortError(\"Aborted\");\n }\n\n const ids: string[] = [];\n for (const slug of slugs) {\n const documentId = slugManifest.slugToId[slug];\n if (!documentId) {\n throw new DocumentNotFoundError(slug);\n }\n\n ids.push(documentId);\n }\n\n return Promise.resolve(ids);\n }\n\n async resolveSlugs(ids: string[], signal?: AbortSignal): Promise<string[]> {\n const slugs: string[] = [];\n for (const id of ids) {\n const document = await this.get<PHDocument>(id);\n if (!document) {\n throw new DocumentNotFoundError(id);\n }\n\n if (signal?.aborted) {\n throw new AbortError(\"Aborted\");\n }\n\n slugs.push(document.header.slug);\n }\n\n return Promise.resolve(slugs);\n }\n\n ////////////////////////////////\n // IDocumentStorage\n ////////////////////////////////\n\n async exists(documentId: string): Promise<boolean> {\n try {\n await fs.access(this._buildDocumentPath(documentId));\n return true;\n } catch {\n return false;\n }\n }\n\n async create(document: PHDocument) {\n const documentId = document.header.id;\n\n if (await this.exists(documentId)) {\n throw new DocumentAlreadyExistsError(documentId);\n }\n\n const slug =\n document.header.slug?.length > 0 ? document.header.slug : documentId;\n\n const slugManifest = await this.getSlugManifest();\n if (slugManifest.slugToId[slug]) {\n throw new DocumentAlreadyExistsError(\n documentId,\n DocumentAlreadyExistsReason.SLUG,\n );\n }\n\n document.header.slug = slug;\n const documentPath = this._buildDocumentPath(documentId);\n await fs.writeFile(documentPath, stringify(document), {\n encoding: \"utf-8\",\n });\n\n // Update the slug manifest if the document has a slug\n\n slugManifest.slugToId[slug] = documentId;\n await this.updateSlugManifest(slugManifest);\n\n // temporary: initialize an empty manifest for new drives\n if (document.header.documentType === \"powerhouse/document-drive\") {\n this.updateDriveManifest(documentId, { documentIds: [] });\n }\n\n return Promise.resolve();\n }\n\n async get<TDocument extends PHDocument>(\n documentId: string,\n ): Promise<TDocument> {\n try {\n const content = await fs.readFile(this._buildDocumentPath(documentId), {\n encoding: \"utf-8\",\n });\n\n return JSON.parse(content) as TDocument;\n } catch (error) {\n return Promise.reject(new DocumentNotFoundError(documentId));\n }\n }\n\n async getBySlug<TDocument extends PHDocument>(\n slug: string,\n ): Promise<TDocument> {\n const slugManifest = await this.getSlugManifest();\n const documentId = slugManifest.slugToId[slug];\n\n if (!documentId) {\n return Promise.reject(new DocumentNotFoundError(slug));\n }\n\n return this.get<TDocument>(documentId);\n }\n\n async findByType(\n documentModelType: string,\n limit = 100,\n cursor?: string,\n ): Promise<{\n documents: string[];\n nextCursor: string | undefined;\n }> {\n const files = await fs.readdir(this.basePath, { withFileTypes: true });\n const documentFiles = files.filter(\n (file) =>\n file.name.startsWith(\"document-\") && file.name.endsWith(\".json\"),\n );\n\n // Load documents with matching type and collect their metadata\n const documentsAndIds: Array<{ id: string; document: PHDocument }> = [];\n for (const file of documentFiles) {\n const documentId = decodeDocumentIdFromPath(\n file.name.replace(\"document-\", \"\").replace(\".json\", \"\"),\n );\n\n try {\n // Read and parse the document\n const document = JSON.parse(\n await fs.readFile(this._buildDocumentPath(documentId), {\n encoding: \"utf-8\",\n }),\n ) as PHDocument;\n\n // Only include documents of the requested type\n if (document.header.documentType === documentModelType) {\n documentsAndIds.push({ id: documentId, document });\n }\n } catch (error) {\n // Skip files that can't be read or parsed\n continue;\n }\n }\n\n // Sort by creation date first, then by ID (consistent sort order for pagination)\n documentsAndIds.sort((a, b) => {\n const aDate = new Date(a.document.header.createdAtUtcIso);\n const bDate = new Date(b.document.header.createdAtUtcIso);\n\n if (aDate.getTime() === bDate.getTime()) {\n return a.id.localeCompare(b.id);\n }\n\n return aDate.getTime() - bDate.getTime();\n });\n\n let startIndex = 0;\n if (cursor) {\n const index = documentsAndIds.findIndex(({ id }) => id === cursor);\n if (index !== -1) {\n startIndex = index;\n }\n }\n\n // cursor\n const endIndex = Math.min(startIndex + limit, documentsAndIds.length);\n let nextCursor: string | undefined;\n if (endIndex < documentsAndIds.length) {\n nextCursor = documentsAndIds[endIndex].id;\n }\n\n return {\n documents: documentsAndIds\n .slice(startIndex, endIndex)\n .map(({ id }) => id),\n nextCursor,\n };\n }\n\n async delete(documentId: string): Promise<boolean> {\n // First, find any slug for this document and remove it from the slug manifest\n try {\n const document = await this.get<PHDocument>(documentId);\n const slug =\n document.header.slug?.length > 0 ? document.header.slug : documentId;\n\n if (slug) {\n const slugManifest = await this.getSlugManifest();\n if (slugManifest.slugToId[slug] === documentId) {\n delete slugManifest.slugToId[slug];\n await this.updateSlugManifest(slugManifest);\n }\n }\n } catch (error) {\n // If we can't get the document, we can't remove its slug\n }\n\n // delete from parent manifests\n const parents = await this.getParents(documentId);\n for (const parent of parents) {\n await this.removeChild(parent, documentId);\n }\n\n // delete any manifest for this document\n try {\n await fs.rm(this._buildManifestPath(documentId));\n } catch (error) {\n // there may be no manifest for this document\n }\n\n // finally, delete the specified document\n const documentPath = this._buildDocumentPath(documentId);\n if (await this.exists(documentId)) {\n await fs.unlink(documentPath);\n\n return Promise.resolve(true);\n }\n\n return Promise.resolve(false);\n }\n\n async addChild(parentId: string, childId: string): Promise<void> {\n if (parentId === childId) {\n return Promise.reject(\n new Error(\"Cannot associate a document with itself\"),\n );\n }\n\n // check if the child is a parent of the parent\n const children = await this.getChildren(childId);\n if (children.includes(parentId)) {\n return Promise.reject(\n new Error(\"Cannot associate a document with its child\"),\n );\n }\n\n // Update the drive manifest to include this document\n const manifest = await this.getManifest(parentId);\n if (!manifest.documentIds.includes(childId)) {\n manifest.documentIds.push(childId);\n await this.updateDriveManifest(parentId, manifest);\n }\n }\n\n async removeChild(parentId: string, childId: string): Promise<boolean> {\n const manifest = await this.getManifest(parentId);\n const docIndex = manifest.documentIds.indexOf(childId);\n if (docIndex !== -1) {\n manifest.documentIds.splice(docIndex, 1);\n await this.updateDriveManifest(parentId, manifest);\n return true;\n }\n\n return false;\n }\n\n async getChildren(parentId: string): Promise<string[]> {\n const manifest = await this.getManifest(parentId);\n return manifest.documentIds;\n }\n\n async getParents(childId: string): Promise<string[]> {\n const parents: string[] = [];\n\n // Get all files in the base directory\n const files = await fs.readdir(this.basePath, { withFileTypes: true });\n\n // Filter to only include manifest files\n const manifestFiles = files.filter(\n (file) =>\n file.name.startsWith(\"manifest-\") && file.name.endsWith(\".json\"),\n );\n\n // Check each manifest file to see if it contains the childId\n for (const file of manifestFiles) {\n // Extract the driveId from the manifest filename\n const driveId = decodeDocumentIdFromPath(\n file.name.replace(\"manifest-\", \"\").replace(\".json\", \"\"),\n );\n\n const manifest = await this.getManifest(driveId);\n if (manifest.documentIds.includes(childId)) {\n parents.push(driveId);\n }\n }\n\n return parents;\n }\n\n ////////////////////////////////\n // IDocumentAdminStorage\n ////////////////////////////////\n\n async clear() {\n // delete content of basePath\n const files = (\n await fs.readdir(this.basePath, { withFileTypes: true })\n ).filter((dirent) => !!dirent.name);\n\n await Promise.all(\n files.map(async (dirent) => {\n await fs.rm(path.join(this.basePath, dirent.name), {\n recursive: true,\n });\n }),\n );\n }\n\n ////////////////////////////////\n // IDriveStorage\n ////////////////////////////////\n\n async addDocumentOperations(\n id: string,\n operations: Operation[],\n document: PHDocument,\n ) {\n const existingDocument = await this.get(id);\n if (!existingDocument) {\n return Promise.reject(new DocumentNotFoundError(id));\n }\n\n const mergedOperations = mergeOperations(\n existingDocument.operations,\n operations,\n );\n\n const revision: Record<string, number> = {};\n for (const [scope, scopeOps] of Object.entries(mergedOperations)) {\n revision[scope] = operationsToRevision(scopeOps);\n }\n\n const documentPath = this._buildDocumentPath(id);\n await fs.writeFile(\n documentPath,\n stringify({\n ...existingDocument,\n state: document.state,\n initialState: document.initialState,\n header: {\n ...existingDocument.header,\n ...document.header,\n revision,\n },\n operations: mergedOperations,\n clipboard: document.clipboard,\n }),\n {\n encoding: \"utf-8\",\n },\n );\n }\n\n async addDriveOperations(\n id: string,\n operations: Operation[],\n document: PHDocument,\n ): Promise<void> {\n const existingDocument = await this.get<DocumentDriveDocument>(id);\n const mergedOperations = mergeOperations(\n existingDocument.operations,\n operations,\n );\n\n const revision: Record<string, number> = {};\n for (const [scope, scopeOps] of Object.entries(mergedOperations)) {\n revision[scope] = operationsToRevision(scopeOps);\n }\n\n const drivePath = this._buildDocumentPath(id);\n await fs.writeFile(\n drivePath,\n stringify({\n ...existingDocument,\n state: document.state,\n initialState: document.initialState,\n header: {\n ...existingDocument.header,\n ...document.header,\n revision,\n },\n operations: mergedOperations,\n clipboard: document.clipboard,\n }),\n {\n encoding: \"utf-8\",\n },\n );\n }\n\n async getSynchronizationUnitsRevision(\n units: SynchronizationUnitQuery[],\n ): Promise<\n {\n documentId: string;\n documentType: string;\n scope: string;\n branch: string;\n lastUpdated: string;\n revision: number;\n }[]\n > {\n const results = await Promise.allSettled(\n units.map(async (unit) => {\n try {\n const document = await this.get<PHDocument>(unit.documentId);\n if (!document?.operations[unit.scope]) {\n return undefined;\n }\n\n const operations = document.operations[unit.scope]!;\n\n return {\n documentId: unit.documentId,\n documentType: unit.documentType,\n scope: unit.scope,\n branch: unit.branch,\n lastUpdated:\n operations.at(-1)?.timestampUtcMs ??\n document.header.createdAtUtcIso,\n revision:\n operations.length > 0 ? operationsToRevision(operations) : 0,\n };\n } catch (error) {\n this.logger.error(\n \"Error getting synchronization units revision: @error\",\n error,\n );\n return undefined;\n }\n }),\n );\n return results.reduce<\n {\n documentId: string;\n documentType: string;\n scope: string;\n branch: string;\n lastUpdated: string;\n revision: number;\n }[]\n >((acc, curr) => {\n if (curr.status === \"fulfilled\" && curr.value !== undefined) {\n acc.push(curr.value);\n }\n return acc;\n }, []);\n }\n\n ////////////////////////////////\n // Private\n ////////////////////////////////\n\n private _buildDocumentPath(documentId: string) {\n const safeId = encodeDocumentIdForPath(documentId);\n return `${this.basePath}/document-${safeId}.json`;\n }\n\n private _buildManifestPath(driveId: string) {\n const safeId = encodeDocumentIdForPath(driveId);\n return `${this.basePath}/manifest-${safeId}.json`;\n }\n\n private _buildSlugManifestPath() {\n return `${this.basePath}/slugs.json`;\n }\n\n private async getManifest(driveId: string): Promise<DriveManifest> {\n const manifestPath = this._buildManifestPath(driveId);\n try {\n const content = await fs.readFile(manifestPath, { encoding: \"utf-8\" });\n return JSON.parse(content) as DriveManifest;\n } catch (error) {\n // Return empty manifest if file doesn't exist\n return { documentIds: [] };\n }\n }\n\n private async updateDriveManifest(\n driveId: string,\n manifest: DriveManifest,\n ): Promise<void> {\n const manifestPath = this._buildManifestPath(driveId);\n await fs.writeFile(manifestPath, stringify(manifest), {\n encoding: \"utf-8\",\n });\n }\n\n private async getSlugManifest(): Promise<SlugManifest> {\n const slugManifestPath = this._buildSlugManifestPath();\n try {\n const content = await fs.readFile(slugManifestPath, {\n encoding: \"utf-8\",\n });\n return JSON.parse(content) as SlugManifest;\n } catch (error) {\n // Return empty slug manifest if file doesn't exist\n return { slugToId: {} };\n }\n }\n\n private async updateSlugManifest(manifest: SlugManifest): Promise<void> {\n const slugManifestPath = this._buildSlugManifestPath();\n await fs.writeFile(slugManifestPath, stringify(manifest), {\n encoding: \"utf-8\",\n });\n }\n}\n"],"mappings":"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"}