anchordb 0.2.0

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 (438) hide show
  1. package/CHANGELOG.md +61 -0
  2. package/LICENSE +21 -0
  3. package/README.md +160 -0
  4. package/dist/cjs/conflict/strategies.d.ts +110 -0
  5. package/dist/cjs/conflict/strategies.d.ts.map +1 -0
  6. package/dist/cjs/conflict/strategies.js +298 -0
  7. package/dist/cjs/conflict/strategies.js.map +1 -0
  8. package/dist/cjs/conflict/types.d.ts +38 -0
  9. package/dist/cjs/conflict/types.d.ts.map +1 -0
  10. package/dist/cjs/conflict/types.js +3 -0
  11. package/dist/cjs/conflict/types.js.map +1 -0
  12. package/dist/cjs/core/anchor-db.d.ts +154 -0
  13. package/dist/cjs/core/anchor-db.d.ts.map +1 -0
  14. package/dist/cjs/core/anchor-db.js +273 -0
  15. package/dist/cjs/core/anchor-db.js.map +1 -0
  16. package/dist/cjs/core/errors.d.ts +125 -0
  17. package/dist/cjs/core/errors.d.ts.map +1 -0
  18. package/dist/cjs/core/errors.js +174 -0
  19. package/dist/cjs/core/errors.js.map +1 -0
  20. package/dist/cjs/core/hex.d.ts +4 -0
  21. package/dist/cjs/core/hex.d.ts.map +1 -0
  22. package/dist/cjs/core/hex.js +41 -0
  23. package/dist/cjs/core/hex.js.map +1 -0
  24. package/dist/cjs/core/hlc.d.ts +96 -0
  25. package/dist/cjs/core/hlc.d.ts.map +1 -0
  26. package/dist/cjs/core/hlc.js +161 -0
  27. package/dist/cjs/core/hlc.js.map +1 -0
  28. package/dist/cjs/core/object-id.d.ts +38 -0
  29. package/dist/cjs/core/object-id.d.ts.map +1 -0
  30. package/dist/cjs/core/object-id.js +167 -0
  31. package/dist/cjs/core/object-id.js.map +1 -0
  32. package/dist/cjs/core/random.d.ts +6 -0
  33. package/dist/cjs/core/random.d.ts.map +1 -0
  34. package/dist/cjs/core/random.js +39 -0
  35. package/dist/cjs/core/random.js.map +1 -0
  36. package/dist/cjs/core/runtime.d.ts +96 -0
  37. package/dist/cjs/core/runtime.d.ts.map +1 -0
  38. package/dist/cjs/core/runtime.js +3 -0
  39. package/dist/cjs/core/runtime.js.map +1 -0
  40. package/dist/cjs/core/uuid.d.ts +16 -0
  41. package/dist/cjs/core/uuid.d.ts.map +1 -0
  42. package/dist/cjs/core/uuid.js +37 -0
  43. package/dist/cjs/core/uuid.js.map +1 -0
  44. package/dist/cjs/decorators/index.d.ts +48 -0
  45. package/dist/cjs/decorators/index.d.ts.map +1 -0
  46. package/dist/cjs/decorators/index.js +295 -0
  47. package/dist/cjs/decorators/index.js.map +1 -0
  48. package/dist/cjs/events/emitter.d.ts +16 -0
  49. package/dist/cjs/events/emitter.d.ts.map +1 -0
  50. package/dist/cjs/events/emitter.js +56 -0
  51. package/dist/cjs/events/emitter.js.map +1 -0
  52. package/dist/cjs/index/keys.d.ts +79 -0
  53. package/dist/cjs/index/keys.d.ts.map +1 -0
  54. package/dist/cjs/index/keys.js +208 -0
  55. package/dist/cjs/index/keys.js.map +1 -0
  56. package/dist/cjs/index.d.ts +81 -0
  57. package/dist/cjs/index.d.ts.map +1 -0
  58. package/dist/cjs/index.js +193 -0
  59. package/dist/cjs/index.js.map +1 -0
  60. package/dist/cjs/inspector/agent.d.ts +75 -0
  61. package/dist/cjs/inspector/agent.d.ts.map +1 -0
  62. package/dist/cjs/inspector/agent.js +520 -0
  63. package/dist/cjs/inspector/agent.js.map +1 -0
  64. package/dist/cjs/inspector/auth.d.ts +49 -0
  65. package/dist/cjs/inspector/auth.d.ts.map +1 -0
  66. package/dist/cjs/inspector/auth.js +234 -0
  67. package/dist/cjs/inspector/auth.js.map +1 -0
  68. package/dist/cjs/inspector/bridge.d.ts +141 -0
  69. package/dist/cjs/inspector/bridge.d.ts.map +1 -0
  70. package/dist/cjs/inspector/bridge.js +190 -0
  71. package/dist/cjs/inspector/bridge.js.map +1 -0
  72. package/dist/cjs/inspector/client.d.ts +111 -0
  73. package/dist/cjs/inspector/client.d.ts.map +1 -0
  74. package/dist/cjs/inspector/client.js +218 -0
  75. package/dist/cjs/inspector/client.js.map +1 -0
  76. package/dist/cjs/inspector/protocol.d.ts +160 -0
  77. package/dist/cjs/inspector/protocol.d.ts.map +1 -0
  78. package/dist/cjs/inspector/protocol.js +53 -0
  79. package/dist/cjs/inspector/protocol.js.map +1 -0
  80. package/dist/cjs/inspector/transports/in-process.d.ts +7 -0
  81. package/dist/cjs/inspector/transports/in-process.d.ts.map +1 -0
  82. package/dist/cjs/inspector/transports/in-process.js +58 -0
  83. package/dist/cjs/inspector/transports/in-process.js.map +1 -0
  84. package/dist/cjs/inspector/transports/websocket.d.ts +39 -0
  85. package/dist/cjs/inspector/transports/websocket.d.ts.map +1 -0
  86. package/dist/cjs/inspector/transports/websocket.js +60 -0
  87. package/dist/cjs/inspector/transports/websocket.js.map +1 -0
  88. package/dist/cjs/interop/csv.d.ts +53 -0
  89. package/dist/cjs/interop/csv.d.ts.map +1 -0
  90. package/dist/cjs/interop/csv.js +230 -0
  91. package/dist/cjs/interop/csv.js.map +1 -0
  92. package/dist/cjs/interop/ejson.d.ts +41 -0
  93. package/dist/cjs/interop/ejson.d.ts.map +1 -0
  94. package/dist/cjs/interop/ejson.js +182 -0
  95. package/dist/cjs/interop/ejson.js.map +1 -0
  96. package/dist/cjs/interop/export-import.d.ts +98 -0
  97. package/dist/cjs/interop/export-import.d.ts.map +1 -0
  98. package/dist/cjs/interop/export-import.js +222 -0
  99. package/dist/cjs/interop/export-import.js.map +1 -0
  100. package/dist/cjs/model/document.d.ts +66 -0
  101. package/dist/cjs/model/document.d.ts.map +1 -0
  102. package/dist/cjs/model/document.js +302 -0
  103. package/dist/cjs/model/document.js.map +1 -0
  104. package/dist/cjs/model/model.d.ts +178 -0
  105. package/dist/cjs/model/model.d.ts.map +1 -0
  106. package/dist/cjs/model/model.js +823 -0
  107. package/dist/cjs/model/model.js.map +1 -0
  108. package/dist/cjs/package.json +3 -0
  109. package/dist/cjs/query/aggregation/expressions.d.ts +34 -0
  110. package/dist/cjs/query/aggregation/expressions.d.ts.map +1 -0
  111. package/dist/cjs/query/aggregation/expressions.js +552 -0
  112. package/dist/cjs/query/aggregation/expressions.js.map +1 -0
  113. package/dist/cjs/query/aggregation/pipeline.d.ts +79 -0
  114. package/dist/cjs/query/aggregation/pipeline.d.ts.map +1 -0
  115. package/dist/cjs/query/aggregation/pipeline.js +597 -0
  116. package/dist/cjs/query/aggregation/pipeline.js.map +1 -0
  117. package/dist/cjs/query/aggregation/source.d.ts +35 -0
  118. package/dist/cjs/query/aggregation/source.d.ts.map +1 -0
  119. package/dist/cjs/query/aggregation/source.js +81 -0
  120. package/dist/cjs/query/aggregation/source.js.map +1 -0
  121. package/dist/cjs/query/builder/query.d.ts +113 -0
  122. package/dist/cjs/query/builder/query.d.ts.map +1 -0
  123. package/dist/cjs/query/builder/query.js +215 -0
  124. package/dist/cjs/query/builder/query.js.map +1 -0
  125. package/dist/cjs/query/filter.d.ts +50 -0
  126. package/dist/cjs/query/filter.d.ts.map +1 -0
  127. package/dist/cjs/query/filter.js +275 -0
  128. package/dist/cjs/query/filter.js.map +1 -0
  129. package/dist/cjs/query/path.d.ts +41 -0
  130. package/dist/cjs/query/path.d.ts.map +1 -0
  131. package/dist/cjs/query/path.js +294 -0
  132. package/dist/cjs/query/path.js.map +1 -0
  133. package/dist/cjs/query/update.d.ts +30 -0
  134. package/dist/cjs/query/update.d.ts.map +1 -0
  135. package/dist/cjs/query/update.js +205 -0
  136. package/dist/cjs/query/update.js.map +1 -0
  137. package/dist/cjs/reactive/live-query.d.ts +41 -0
  138. package/dist/cjs/reactive/live-query.d.ts.map +1 -0
  139. package/dist/cjs/reactive/live-query.js +88 -0
  140. package/dist/cjs/reactive/live-query.js.map +1 -0
  141. package/dist/cjs/schema/cast.d.ts +38 -0
  142. package/dist/cjs/schema/cast.d.ts.map +1 -0
  143. package/dist/cjs/schema/cast.js +280 -0
  144. package/dist/cjs/schema/cast.js.map +1 -0
  145. package/dist/cjs/schema/index.d.ts +5 -0
  146. package/dist/cjs/schema/index.d.ts.map +1 -0
  147. package/dist/cjs/schema/index.js +27 -0
  148. package/dist/cjs/schema/index.js.map +1 -0
  149. package/dist/cjs/schema/schema.d.ts +58 -0
  150. package/dist/cjs/schema/schema.d.ts.map +1 -0
  151. package/dist/cjs/schema/schema.js +363 -0
  152. package/dist/cjs/schema/schema.js.map +1 -0
  153. package/dist/cjs/schema/types.d.ts +144 -0
  154. package/dist/cjs/schema/types.d.ts.map +1 -0
  155. package/dist/cjs/schema/types.js +20 -0
  156. package/dist/cjs/schema/types.js.map +1 -0
  157. package/dist/cjs/schema/validate.d.ts +15 -0
  158. package/dist/cjs/schema/validate.d.ts.map +1 -0
  159. package/dist/cjs/schema/validate.js +101 -0
  160. package/dist/cjs/schema/validate.js.map +1 -0
  161. package/dist/cjs/storage/adapters/capacitor-sqlite.d.ts +67 -0
  162. package/dist/cjs/storage/adapters/capacitor-sqlite.d.ts.map +1 -0
  163. package/dist/cjs/storage/adapters/capacitor-sqlite.js +69 -0
  164. package/dist/cjs/storage/adapters/capacitor-sqlite.js.map +1 -0
  165. package/dist/cjs/storage/adapters/expo-sqlite.d.ts +55 -0
  166. package/dist/cjs/storage/adapters/expo-sqlite.d.ts.map +1 -0
  167. package/dist/cjs/storage/adapters/expo-sqlite.js +53 -0
  168. package/dist/cjs/storage/adapters/expo-sqlite.js.map +1 -0
  169. package/dist/cjs/storage/adapters/indexeddb.d.ts +55 -0
  170. package/dist/cjs/storage/adapters/indexeddb.d.ts.map +1 -0
  171. package/dist/cjs/storage/adapters/indexeddb.js +393 -0
  172. package/dist/cjs/storage/adapters/indexeddb.js.map +1 -0
  173. package/dist/cjs/storage/adapters/memory.d.ts +44 -0
  174. package/dist/cjs/storage/adapters/memory.d.ts.map +1 -0
  175. package/dist/cjs/storage/adapters/memory.js +286 -0
  176. package/dist/cjs/storage/adapters/memory.js.map +1 -0
  177. package/dist/cjs/storage/adapters/node-sqlite.d.ts +59 -0
  178. package/dist/cjs/storage/adapters/node-sqlite.d.ts.map +1 -0
  179. package/dist/cjs/storage/adapters/node-sqlite.js +457 -0
  180. package/dist/cjs/storage/adapters/node-sqlite.js.map +1 -0
  181. package/dist/cjs/storage/adapters/sql-base.d.ts +84 -0
  182. package/dist/cjs/storage/adapters/sql-base.d.ts.map +1 -0
  183. package/dist/cjs/storage/adapters/sql-base.js +393 -0
  184. package/dist/cjs/storage/adapters/sql-base.js.map +1 -0
  185. package/dist/cjs/storage/types.d.ts +131 -0
  186. package/dist/cjs/storage/types.d.ts.map +1 -0
  187. package/dist/cjs/storage/types.js +3 -0
  188. package/dist/cjs/storage/types.js.map +1 -0
  189. package/dist/cjs/sync/adapters/rest.d.ts +31 -0
  190. package/dist/cjs/sync/adapters/rest.d.ts.map +1 -0
  191. package/dist/cjs/sync/adapters/rest.js +75 -0
  192. package/dist/cjs/sync/adapters/rest.js.map +1 -0
  193. package/dist/cjs/sync/attach.d.ts +30 -0
  194. package/dist/cjs/sync/attach.d.ts.map +1 -0
  195. package/dist/cjs/sync/attach.js +104 -0
  196. package/dist/cjs/sync/attach.js.map +1 -0
  197. package/dist/cjs/sync/engine.d.ts +96 -0
  198. package/dist/cjs/sync/engine.d.ts.map +1 -0
  199. package/dist/cjs/sync/engine.js +491 -0
  200. package/dist/cjs/sync/engine.js.map +1 -0
  201. package/dist/cjs/sync/protocol.d.ts +128 -0
  202. package/dist/cjs/sync/protocol.d.ts.map +1 -0
  203. package/dist/cjs/sync/protocol.js +38 -0
  204. package/dist/cjs/sync/protocol.js.map +1 -0
  205. package/dist/cjs/sync/queue.d.ts +77 -0
  206. package/dist/cjs/sync/queue.d.ts.map +1 -0
  207. package/dist/cjs/sync/queue.js +245 -0
  208. package/dist/cjs/sync/queue.js.map +1 -0
  209. package/dist/cjs/sync/server/memory-server.d.ts +65 -0
  210. package/dist/cjs/sync/server/memory-server.d.ts.map +1 -0
  211. package/dist/cjs/sync/server/memory-server.js +193 -0
  212. package/dist/cjs/sync/server/memory-server.js.map +1 -0
  213. package/dist/cjs/timestamps/index.d.ts +47 -0
  214. package/dist/cjs/timestamps/index.d.ts.map +1 -0
  215. package/dist/cjs/timestamps/index.js +88 -0
  216. package/dist/cjs/timestamps/index.js.map +1 -0
  217. package/dist/cjs/timestamps/timezone.d.ts +65 -0
  218. package/dist/cjs/timestamps/timezone.d.ts.map +1 -0
  219. package/dist/cjs/timestamps/timezone.js +208 -0
  220. package/dist/cjs/timestamps/timezone.js.map +1 -0
  221. package/dist/esm/conflict/strategies.d.ts +110 -0
  222. package/dist/esm/conflict/strategies.d.ts.map +1 -0
  223. package/dist/esm/conflict/strategies.js +289 -0
  224. package/dist/esm/conflict/strategies.js.map +1 -0
  225. package/dist/esm/conflict/types.d.ts +38 -0
  226. package/dist/esm/conflict/types.d.ts.map +1 -0
  227. package/dist/esm/conflict/types.js +2 -0
  228. package/dist/esm/conflict/types.js.map +1 -0
  229. package/dist/esm/core/anchor-db.d.ts +154 -0
  230. package/dist/esm/core/anchor-db.d.ts.map +1 -0
  231. package/dist/esm/core/anchor-db.js +269 -0
  232. package/dist/esm/core/anchor-db.js.map +1 -0
  233. package/dist/esm/core/errors.d.ts +125 -0
  234. package/dist/esm/core/errors.d.ts.map +1 -0
  235. package/dist/esm/core/errors.js +161 -0
  236. package/dist/esm/core/errors.js.map +1 -0
  237. package/dist/esm/core/hex.d.ts +4 -0
  238. package/dist/esm/core/hex.d.ts.map +1 -0
  239. package/dist/esm/core/hex.js +37 -0
  240. package/dist/esm/core/hex.js.map +1 -0
  241. package/dist/esm/core/hlc.d.ts +96 -0
  242. package/dist/esm/core/hlc.d.ts.map +1 -0
  243. package/dist/esm/core/hlc.js +153 -0
  244. package/dist/esm/core/hlc.js.map +1 -0
  245. package/dist/esm/core/object-id.d.ts +38 -0
  246. package/dist/esm/core/object-id.d.ts.map +1 -0
  247. package/dist/esm/core/object-id.js +163 -0
  248. package/dist/esm/core/object-id.js.map +1 -0
  249. package/dist/esm/core/random.d.ts +6 -0
  250. package/dist/esm/core/random.d.ts.map +1 -0
  251. package/dist/esm/core/random.js +34 -0
  252. package/dist/esm/core/random.js.map +1 -0
  253. package/dist/esm/core/runtime.d.ts +96 -0
  254. package/dist/esm/core/runtime.d.ts.map +1 -0
  255. package/dist/esm/core/runtime.js +2 -0
  256. package/dist/esm/core/runtime.js.map +1 -0
  257. package/dist/esm/core/uuid.d.ts +16 -0
  258. package/dist/esm/core/uuid.d.ts.map +1 -0
  259. package/dist/esm/core/uuid.js +33 -0
  260. package/dist/esm/core/uuid.js.map +1 -0
  261. package/dist/esm/decorators/index.d.ts +48 -0
  262. package/dist/esm/decorators/index.d.ts.map +1 -0
  263. package/dist/esm/decorators/index.js +286 -0
  264. package/dist/esm/decorators/index.js.map +1 -0
  265. package/dist/esm/events/emitter.d.ts +16 -0
  266. package/dist/esm/events/emitter.d.ts.map +1 -0
  267. package/dist/esm/events/emitter.js +52 -0
  268. package/dist/esm/events/emitter.js.map +1 -0
  269. package/dist/esm/index/keys.d.ts +79 -0
  270. package/dist/esm/index/keys.d.ts.map +1 -0
  271. package/dist/esm/index/keys.js +198 -0
  272. package/dist/esm/index/keys.js.map +1 -0
  273. package/dist/esm/index.d.ts +81 -0
  274. package/dist/esm/index.d.ts.map +1 -0
  275. package/dist/esm/index.js +59 -0
  276. package/dist/esm/index.js.map +1 -0
  277. package/dist/esm/inspector/agent.d.ts +75 -0
  278. package/dist/esm/inspector/agent.d.ts.map +1 -0
  279. package/dist/esm/inspector/agent.js +482 -0
  280. package/dist/esm/inspector/agent.js.map +1 -0
  281. package/dist/esm/inspector/auth.d.ts +49 -0
  282. package/dist/esm/inspector/auth.d.ts.map +1 -0
  283. package/dist/esm/inspector/auth.js +228 -0
  284. package/dist/esm/inspector/auth.js.map +1 -0
  285. package/dist/esm/inspector/bridge.d.ts +141 -0
  286. package/dist/esm/inspector/bridge.d.ts.map +1 -0
  287. package/dist/esm/inspector/bridge.js +182 -0
  288. package/dist/esm/inspector/bridge.js.map +1 -0
  289. package/dist/esm/inspector/client.d.ts +111 -0
  290. package/dist/esm/inspector/client.d.ts.map +1 -0
  291. package/dist/esm/inspector/client.js +213 -0
  292. package/dist/esm/inspector/client.js.map +1 -0
  293. package/dist/esm/inspector/protocol.d.ts +160 -0
  294. package/dist/esm/inspector/protocol.d.ts.map +1 -0
  295. package/dist/esm/inspector/protocol.js +43 -0
  296. package/dist/esm/inspector/protocol.js.map +1 -0
  297. package/dist/esm/inspector/transports/in-process.d.ts +7 -0
  298. package/dist/esm/inspector/transports/in-process.d.ts.map +1 -0
  299. package/dist/esm/inspector/transports/in-process.js +55 -0
  300. package/dist/esm/inspector/transports/in-process.js.map +1 -0
  301. package/dist/esm/inspector/transports/websocket.d.ts +39 -0
  302. package/dist/esm/inspector/transports/websocket.d.ts.map +1 -0
  303. package/dist/esm/inspector/transports/websocket.js +56 -0
  304. package/dist/esm/inspector/transports/websocket.js.map +1 -0
  305. package/dist/esm/interop/csv.d.ts +53 -0
  306. package/dist/esm/interop/csv.d.ts.map +1 -0
  307. package/dist/esm/interop/csv.js +222 -0
  308. package/dist/esm/interop/csv.js.map +1 -0
  309. package/dist/esm/interop/ejson.d.ts +41 -0
  310. package/dist/esm/interop/ejson.d.ts.map +1 -0
  311. package/dist/esm/interop/ejson.js +176 -0
  312. package/dist/esm/interop/ejson.js.map +1 -0
  313. package/dist/esm/interop/export-import.d.ts +98 -0
  314. package/dist/esm/interop/export-import.d.ts.map +1 -0
  315. package/dist/esm/interop/export-import.js +210 -0
  316. package/dist/esm/interop/export-import.js.map +1 -0
  317. package/dist/esm/model/document.d.ts +66 -0
  318. package/dist/esm/model/document.d.ts.map +1 -0
  319. package/dist/esm/model/document.js +297 -0
  320. package/dist/esm/model/document.js.map +1 -0
  321. package/dist/esm/model/model.d.ts +178 -0
  322. package/dist/esm/model/model.d.ts.map +1 -0
  323. package/dist/esm/model/model.js +815 -0
  324. package/dist/esm/model/model.js.map +1 -0
  325. package/dist/esm/package.json +3 -0
  326. package/dist/esm/query/aggregation/expressions.d.ts +34 -0
  327. package/dist/esm/query/aggregation/expressions.d.ts.map +1 -0
  328. package/dist/esm/query/aggregation/expressions.js +545 -0
  329. package/dist/esm/query/aggregation/expressions.js.map +1 -0
  330. package/dist/esm/query/aggregation/pipeline.d.ts +79 -0
  331. package/dist/esm/query/aggregation/pipeline.d.ts.map +1 -0
  332. package/dist/esm/query/aggregation/pipeline.js +591 -0
  333. package/dist/esm/query/aggregation/pipeline.js.map +1 -0
  334. package/dist/esm/query/aggregation/source.d.ts +35 -0
  335. package/dist/esm/query/aggregation/source.d.ts.map +1 -0
  336. package/dist/esm/query/aggregation/source.js +77 -0
  337. package/dist/esm/query/aggregation/source.js.map +1 -0
  338. package/dist/esm/query/builder/query.d.ts +113 -0
  339. package/dist/esm/query/builder/query.d.ts.map +1 -0
  340. package/dist/esm/query/builder/query.js +209 -0
  341. package/dist/esm/query/builder/query.js.map +1 -0
  342. package/dist/esm/query/filter.d.ts +50 -0
  343. package/dist/esm/query/filter.d.ts.map +1 -0
  344. package/dist/esm/query/filter.js +267 -0
  345. package/dist/esm/query/filter.js.map +1 -0
  346. package/dist/esm/query/path.d.ts +41 -0
  347. package/dist/esm/query/path.d.ts.map +1 -0
  348. package/dist/esm/query/path.js +282 -0
  349. package/dist/esm/query/path.js.map +1 -0
  350. package/dist/esm/query/update.d.ts +30 -0
  351. package/dist/esm/query/update.d.ts.map +1 -0
  352. package/dist/esm/query/update.js +198 -0
  353. package/dist/esm/query/update.js.map +1 -0
  354. package/dist/esm/reactive/live-query.d.ts +41 -0
  355. package/dist/esm/reactive/live-query.d.ts.map +1 -0
  356. package/dist/esm/reactive/live-query.js +83 -0
  357. package/dist/esm/reactive/live-query.js.map +1 -0
  358. package/dist/esm/schema/cast.d.ts +38 -0
  359. package/dist/esm/schema/cast.d.ts.map +1 -0
  360. package/dist/esm/schema/cast.js +275 -0
  361. package/dist/esm/schema/cast.js.map +1 -0
  362. package/dist/esm/schema/index.d.ts +5 -0
  363. package/dist/esm/schema/index.d.ts.map +1 -0
  364. package/dist/esm/schema/index.js +5 -0
  365. package/dist/esm/schema/index.js.map +1 -0
  366. package/dist/esm/schema/schema.d.ts +58 -0
  367. package/dist/esm/schema/schema.d.ts.map +1 -0
  368. package/dist/esm/schema/schema.js +358 -0
  369. package/dist/esm/schema/schema.js.map +1 -0
  370. package/dist/esm/schema/types.d.ts +144 -0
  371. package/dist/esm/schema/types.d.ts.map +1 -0
  372. package/dist/esm/schema/types.js +17 -0
  373. package/dist/esm/schema/types.js.map +1 -0
  374. package/dist/esm/schema/validate.d.ts +15 -0
  375. package/dist/esm/schema/validate.d.ts.map +1 -0
  376. package/dist/esm/schema/validate.js +98 -0
  377. package/dist/esm/schema/validate.js.map +1 -0
  378. package/dist/esm/storage/adapters/capacitor-sqlite.d.ts +67 -0
  379. package/dist/esm/storage/adapters/capacitor-sqlite.d.ts.map +1 -0
  380. package/dist/esm/storage/adapters/capacitor-sqlite.js +65 -0
  381. package/dist/esm/storage/adapters/capacitor-sqlite.js.map +1 -0
  382. package/dist/esm/storage/adapters/expo-sqlite.d.ts +55 -0
  383. package/dist/esm/storage/adapters/expo-sqlite.d.ts.map +1 -0
  384. package/dist/esm/storage/adapters/expo-sqlite.js +49 -0
  385. package/dist/esm/storage/adapters/expo-sqlite.js.map +1 -0
  386. package/dist/esm/storage/adapters/indexeddb.d.ts +55 -0
  387. package/dist/esm/storage/adapters/indexeddb.d.ts.map +1 -0
  388. package/dist/esm/storage/adapters/indexeddb.js +389 -0
  389. package/dist/esm/storage/adapters/indexeddb.js.map +1 -0
  390. package/dist/esm/storage/adapters/memory.d.ts +44 -0
  391. package/dist/esm/storage/adapters/memory.d.ts.map +1 -0
  392. package/dist/esm/storage/adapters/memory.js +282 -0
  393. package/dist/esm/storage/adapters/memory.js.map +1 -0
  394. package/dist/esm/storage/adapters/node-sqlite.d.ts +59 -0
  395. package/dist/esm/storage/adapters/node-sqlite.d.ts.map +1 -0
  396. package/dist/esm/storage/adapters/node-sqlite.js +450 -0
  397. package/dist/esm/storage/adapters/node-sqlite.js.map +1 -0
  398. package/dist/esm/storage/adapters/sql-base.d.ts +84 -0
  399. package/dist/esm/storage/adapters/sql-base.d.ts.map +1 -0
  400. package/dist/esm/storage/adapters/sql-base.js +383 -0
  401. package/dist/esm/storage/adapters/sql-base.js.map +1 -0
  402. package/dist/esm/storage/types.d.ts +131 -0
  403. package/dist/esm/storage/types.d.ts.map +1 -0
  404. package/dist/esm/storage/types.js +2 -0
  405. package/dist/esm/storage/types.js.map +1 -0
  406. package/dist/esm/sync/adapters/rest.d.ts +31 -0
  407. package/dist/esm/sync/adapters/rest.d.ts.map +1 -0
  408. package/dist/esm/sync/adapters/rest.js +71 -0
  409. package/dist/esm/sync/adapters/rest.js.map +1 -0
  410. package/dist/esm/sync/attach.d.ts +30 -0
  411. package/dist/esm/sync/attach.d.ts.map +1 -0
  412. package/dist/esm/sync/attach.js +98 -0
  413. package/dist/esm/sync/attach.js.map +1 -0
  414. package/dist/esm/sync/engine.d.ts +96 -0
  415. package/dist/esm/sync/engine.d.ts.map +1 -0
  416. package/dist/esm/sync/engine.js +487 -0
  417. package/dist/esm/sync/engine.js.map +1 -0
  418. package/dist/esm/sync/protocol.d.ts +128 -0
  419. package/dist/esm/sync/protocol.d.ts.map +1 -0
  420. package/dist/esm/sync/protocol.js +33 -0
  421. package/dist/esm/sync/protocol.js.map +1 -0
  422. package/dist/esm/sync/queue.d.ts +77 -0
  423. package/dist/esm/sync/queue.d.ts.map +1 -0
  424. package/dist/esm/sync/queue.js +241 -0
  425. package/dist/esm/sync/queue.js.map +1 -0
  426. package/dist/esm/sync/server/memory-server.d.ts +65 -0
  427. package/dist/esm/sync/server/memory-server.d.ts.map +1 -0
  428. package/dist/esm/sync/server/memory-server.js +189 -0
  429. package/dist/esm/sync/server/memory-server.js.map +1 -0
  430. package/dist/esm/timestamps/index.d.ts +47 -0
  431. package/dist/esm/timestamps/index.d.ts.map +1 -0
  432. package/dist/esm/timestamps/index.js +70 -0
  433. package/dist/esm/timestamps/index.js.map +1 -0
  434. package/dist/esm/timestamps/timezone.d.ts +65 -0
  435. package/dist/esm/timestamps/timezone.d.ts.map +1 -0
  436. package/dist/esm/timestamps/timezone.js +196 -0
  437. package/dist/esm/timestamps/timezone.js.map +1 -0
  438. package/package.json +163 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/core/errors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,174 @@
1
+ "use strict";
2
+ /**
3
+ * Mongoose-shaped error hierarchy.
4
+ *
5
+ * Principle 1 (zero re-learning) applies to failures as much as to successes: code that already
6
+ * does `if (err.code === 11000)` or reads `err.errors[path].kind` on the backend must work
7
+ * unchanged here. Every class below mirrors the name, message format and enumerable properties
8
+ * Mongoose produces.
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.BulkWriteError = exports.DUPLICATE_KEY_CODE = exports.MongoServerError = exports.StrictModeError = exports.DocumentNotFoundError = exports.ValidationError = exports.CastError = exports.ValidatorError = exports.AnchorConfigError = exports.AnchorError = void 0;
12
+ exports.duplicateKeyError = duplicateKeyError;
13
+ /** Base class for every error AnchorDB raises. Mirrors Mongoose's `MongooseError`. */
14
+ class AnchorError extends Error {
15
+ constructor(message) {
16
+ super(message);
17
+ this.name = "AnchorError";
18
+ Object.setPrototypeOf(this, new.target.prototype);
19
+ }
20
+ }
21
+ exports.AnchorError = AnchorError;
22
+ /** Configuration rejected at construction time (bad timezone, unknown adapter, ...). */
23
+ class AnchorConfigError extends AnchorError {
24
+ constructor() {
25
+ super(...arguments);
26
+ this.name = "AnchorConfigError";
27
+ }
28
+ }
29
+ exports.AnchorConfigError = AnchorConfigError;
30
+ /**
31
+ * A single failed validator on one path. Mongoose calls this `ValidatorError` and nests instances
32
+ * inside `ValidationError.errors`.
33
+ */
34
+ class ValidatorError extends AnchorError {
35
+ constructor(opts) {
36
+ super(opts.message);
37
+ this.name = "ValidatorError";
38
+ this.path = opts.path;
39
+ this.value = opts.value;
40
+ this.kind = opts.kind;
41
+ this.properties = { ...opts };
42
+ }
43
+ }
44
+ exports.ValidatorError = ValidatorError;
45
+ /**
46
+ * Failure converting a value to its declared type. Message format matches Mongoose so that
47
+ * log-scraping and error reporting behave identically.
48
+ */
49
+ class CastError extends AnchorError {
50
+ constructor(kind, value, path, reason) {
51
+ const stringValue = stringifyValue(value);
52
+ super(`Cast to ${kind} failed for value ${stringValue} (type ${typeOf(value)}) at path "${path}"` +
53
+ (reason ? `: ${reason}` : ""));
54
+ this.name = "CastError";
55
+ this.kind = kind;
56
+ this.value = value;
57
+ this.path = path;
58
+ this.stringValue = stringValue;
59
+ this.valueType = typeOf(value);
60
+ }
61
+ }
62
+ exports.CastError = CastError;
63
+ /** Aggregate of every path that failed validation for one document. */
64
+ class ValidationError extends AnchorError {
65
+ constructor(modelName) {
66
+ super(modelName ? `${modelName} validation failed` : "Validation failed");
67
+ this.name = "ValidationError";
68
+ this.errors = {};
69
+ this.modelName = modelName;
70
+ }
71
+ addError(path, error) {
72
+ this.errors[path] = error;
73
+ this.message = this.buildMessage();
74
+ }
75
+ get isEmpty() {
76
+ return Object.keys(this.errors).length === 0;
77
+ }
78
+ buildMessage() {
79
+ const prefix = this.modelName ? `${this.modelName} validation failed` : "Validation failed";
80
+ const parts = Object.entries(this.errors).map(([path, err]) => `${path}: ${err.message}`);
81
+ return `${prefix}: ${parts.join(", ")}`;
82
+ }
83
+ }
84
+ exports.ValidationError = ValidationError;
85
+ /** Raised by `orFail()` and by Lens edits targeting a document that vanished. */
86
+ class DocumentNotFoundError extends AnchorError {
87
+ constructor(filter, modelName) {
88
+ super(`No document found for query ${JSON.stringify(filter)}` + (modelName ? ` on model "${modelName}"` : ""));
89
+ this.name = "DocumentNotFoundError";
90
+ this.filter = filter;
91
+ }
92
+ }
93
+ exports.DocumentNotFoundError = DocumentNotFoundError;
94
+ /** Writing a path not present in the schema while `strict: "throw"` is set. */
95
+ class StrictModeError extends AnchorError {
96
+ constructor(path) {
97
+ super(`Field \`${path}\` is not in schema and strict mode is set to throw.`);
98
+ this.name = "StrictModeError";
99
+ this.path = path;
100
+ }
101
+ }
102
+ exports.StrictModeError = StrictModeError;
103
+ /**
104
+ * Server-style write error. A unique index violation surfaces as one of these with `code: 11000`,
105
+ * exactly like the MongoDB driver, so `err.code === 11000` branches port over untouched.
106
+ */
107
+ class MongoServerError extends AnchorError {
108
+ constructor(opts) {
109
+ super(opts.message);
110
+ this.name = "MongoServerError";
111
+ this.code = opts.code;
112
+ this.keyPattern = opts.keyPattern;
113
+ this.keyValue = opts.keyValue;
114
+ this.index = opts.index;
115
+ }
116
+ }
117
+ exports.MongoServerError = MongoServerError;
118
+ exports.DUPLICATE_KEY_CODE = 11000;
119
+ /**
120
+ * Build the duplicate-key error MongoDB produces. The message is reproduced literally — including
121
+ * the `E11000 duplicate key error collection:` prefix — because real code greps for it.
122
+ */
123
+ function duplicateKeyError(opts) {
124
+ const keyStr = Object.entries(opts.keyValue)
125
+ .map(([k, v]) => `${k}: ${stringifyValue(v)}`)
126
+ .join(", ");
127
+ return new MongoServerError({
128
+ message: `E11000 duplicate key error collection: ${opts.dbName}.${opts.collection} ` +
129
+ `index: ${opts.index} dup key: { ${keyStr} }`,
130
+ code: exports.DUPLICATE_KEY_CODE,
131
+ keyPattern: opts.keyPattern,
132
+ keyValue: opts.keyValue,
133
+ index: opts.index,
134
+ });
135
+ }
136
+ /** Reported by `insertMany({ ordered: false })` after every insert has been attempted. */
137
+ class BulkWriteError extends AnchorError {
138
+ constructor(opts) {
139
+ super(`Bulk write failed with ${opts.writeErrors.length} error(s)`);
140
+ this.name = "MongoBulkWriteError";
141
+ this.code = exports.DUPLICATE_KEY_CODE;
142
+ this.writeErrors = opts.writeErrors;
143
+ this.insertedCount = opts.insertedCount;
144
+ this.insertedIds = opts.insertedIds;
145
+ }
146
+ }
147
+ exports.BulkWriteError = BulkWriteError;
148
+ function typeOf(value) {
149
+ if (value === null)
150
+ return "null";
151
+ if (Array.isArray(value))
152
+ return "Array";
153
+ return typeof value;
154
+ }
155
+ function stringifyValue(value) {
156
+ if (typeof value === "string")
157
+ return `"${value}"`;
158
+ if (value === undefined)
159
+ return "undefined";
160
+ if (value === null)
161
+ return "null";
162
+ if (value instanceof Date)
163
+ return `"${value.toISOString()}"`;
164
+ if (typeof value === "object") {
165
+ try {
166
+ return JSON.stringify(value);
167
+ }
168
+ catch {
169
+ return String(value);
170
+ }
171
+ }
172
+ return String(value);
173
+ }
174
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/core/errors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare function bytesToHex(bytes: Uint8Array): string;
2
+ /** Returns null rather than throwing, so callers can produce their own typed error. */
3
+ export declare function hexToBytes(hex: string, expectedLength?: number): Uint8Array | null;
4
+ //# sourceMappingURL=hex.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hex.d.ts","sourceRoot":"","sources":["../../../src/core/hex.ts"],"names":[],"mappings":"AASA,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAOpD;AAED,uFAAuF;AACvF,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAYlF"}
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.bytesToHex = bytesToHex;
4
+ exports.hexToBytes = hexToBytes;
5
+ const HEX_CHARS = "0123456789abcdef";
6
+ const HEX_LOOKUP = (() => {
7
+ const table = new Array(256).fill(-1);
8
+ for (let i = 0; i < 10; i++)
9
+ table[48 + i] = i; // '0'-'9'
10
+ for (let i = 0; i < 6; i++)
11
+ table[97 + i] = 10 + i; // 'a'-'f'
12
+ for (let i = 0; i < 6; i++)
13
+ table[65 + i] = 10 + i; // 'A'-'F'
14
+ return table;
15
+ })();
16
+ function bytesToHex(bytes) {
17
+ let out = "";
18
+ for (let i = 0; i < bytes.length; i++) {
19
+ const b = bytes[i];
20
+ out += HEX_CHARS[b >> 4] + HEX_CHARS[b & 0x0f];
21
+ }
22
+ return out;
23
+ }
24
+ /** Returns null rather than throwing, so callers can produce their own typed error. */
25
+ function hexToBytes(hex, expectedLength) {
26
+ if (hex.length % 2 !== 0)
27
+ return null;
28
+ const len = hex.length / 2;
29
+ if (expectedLength !== undefined && len !== expectedLength)
30
+ return null;
31
+ const out = new Uint8Array(len);
32
+ for (let i = 0; i < len; i++) {
33
+ const hi = HEX_LOOKUP[hex.charCodeAt(i * 2)] ?? -1;
34
+ const lo = HEX_LOOKUP[hex.charCodeAt(i * 2 + 1)] ?? -1;
35
+ if (hi < 0 || lo < 0)
36
+ return null;
37
+ out[i] = (hi << 4) | lo;
38
+ }
39
+ return out;
40
+ }
41
+ //# sourceMappingURL=hex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hex.js","sourceRoot":"","sources":["../../../src/core/hex.ts"],"names":[],"mappings":";;AASA,gCAOC;AAGD,gCAYC;AA/BD,MAAM,SAAS,GAAG,kBAAkB,CAAC;AACrC,MAAM,UAAU,GAAa,CAAC,GAAG,EAAE;IACjC,MAAM,KAAK,GAAG,IAAI,KAAK,CAAS,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU;IAC1D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,UAAU;IAC9D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,UAAU;IAC9D,OAAO,KAAK,CAAC;AACf,CAAC,CAAC,EAAE,CAAC;AAEL,SAAgB,UAAU,CAAC,KAAiB;IAC1C,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;QACpB,GAAG,IAAI,SAAS,CAAC,CAAC,IAAI,CAAC,CAAE,GAAG,SAAS,CAAC,CAAC,GAAG,IAAI,CAAE,CAAC;IACnD,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,uFAAuF;AACvF,SAAgB,UAAU,CAAC,GAAW,EAAE,cAAuB;IAC7D,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACtC,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;IAC3B,IAAI,cAAc,KAAK,SAAS,IAAI,GAAG,KAAK,cAAc;QAAE,OAAO,IAAI,CAAC;IACxE,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC;IAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7B,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QACnD,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QACvD,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QAClC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC;IAC1B,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,96 @@
1
+ /**
2
+ * Hybrid Logical Clock.
3
+ *
4
+ * Wall clocks on phones are wrong often enough that ordering cannot be built on them: users change
5
+ * the date, timezones shift, DST jumps, and devices sit offline for days. An HLC keeps the *useful*
6
+ * property of a wall clock (roughly tracks real time, so it stays human-interpretable) while adding
7
+ * the property a wall clock lacks (it never goes backwards, and it advances whenever it observes a
8
+ * newer clock elsewhere).
9
+ *
10
+ * Encoded form is fixed-width and lexicographically sortable, so it can be compared as TEXT in SQL
11
+ * and used directly as a sort key:
12
+ *
13
+ * 000001756616340000-00000-cli_7f3a
14
+ * \______wall_____/ \cnt/ \_node_/
15
+ */
16
+ export interface Hlc {
17
+ /** Physical time in epoch milliseconds (skew-corrected where an offset is known). */
18
+ readonly wall: number;
19
+ /** Logical counter, breaks ties inside a single millisecond. */
20
+ readonly counter: number;
21
+ /** Node identity — the client id. Guarantees a total order with no ties. */
22
+ readonly node: string;
23
+ }
24
+ export declare function encodeHlc(hlc: Hlc): string;
25
+ export declare function decodeHlc(encoded: string): Hlc;
26
+ /**
27
+ * Total order over HLC stamps: wall, then counter, then node.
28
+ *
29
+ * The node tiebreak is what makes this a *total* order rather than a partial one. Without it two
30
+ * devices could produce genuinely equal stamps and "last write wins" would have no answer — the
31
+ * outcome would depend on map iteration order, which is how a sync engine ends up non-deterministic
32
+ * and different devices converge to different documents.
33
+ */
34
+ export declare function compareHlc(a: Hlc, b: Hlc): number;
35
+ export declare function compareHlcStamps(a: string, b: string): number;
36
+ export interface HlcOptions {
37
+ node: string;
38
+ /** Injected so the sync engine can supply server-skew-corrected time. Defaults to Date.now. */
39
+ now?: () => number;
40
+ /**
41
+ * How far ahead of local time an *untrusted* peer stamp may be before it is ignored (default
42
+ * 1 hour). Guards against one device with a broken clock dragging the whole fleet forward.
43
+ *
44
+ * Deliberately does NOT apply to trusted stamps — see `update()`.
45
+ */
46
+ maxDriftMs?: number;
47
+ }
48
+ export declare class HybridLogicalClock {
49
+ /**
50
+ * Not `readonly`: the client id is only known for certain after storage has been opened and the
51
+ * persisted one restored. See setNode().
52
+ */
53
+ node: string;
54
+ private wall;
55
+ private counter;
56
+ private readonly nowFn;
57
+ private readonly maxDriftMs;
58
+ constructor(opts: HlcOptions);
59
+ /** Stamp a local event. Never returns a value <= the previous one. */
60
+ tick(): Hlc;
61
+ /** Stamp a local event and return the encoded form. */
62
+ tickStamp(): string;
63
+ /**
64
+ * Merge an observed remote stamp, then stamp a local event. This is what lets a device with a
65
+ * wrong clock self-correct: after one sync it is ordered relative to everyone else.
66
+ *
67
+ * `trusted` matters more than it looks. The drift guard compares the remote stamp against the
68
+ * *local* clock — but the whole reason we need an HLC is that the local clock may be the wrong
69
+ * one. A device sitting an hour behind would see every legitimate stamp as an "absurd future" and
70
+ * reject all of them, permanently isolating itself in the ordering: the guard would defeat the
71
+ * mechanism it is protecting.
72
+ *
73
+ * So the server, which is the time authority, is always adopted (`trusted: true`). The guard
74
+ * applies only to peer stamps, where we genuinely cannot tell whose clock is broken.
75
+ */
76
+ update(remote: Hlc | string, opts?: {
77
+ trusted?: boolean;
78
+ }): Hlc;
79
+ updateStamp(remote: Hlc | string, opts?: {
80
+ trusted?: boolean;
81
+ }): string;
82
+ /** Current value without advancing. */
83
+ peek(): Hlc;
84
+ /**
85
+ * Correct the node identity before any stamp is issued.
86
+ *
87
+ * AnchorDB generates a client id synchronously in its constructor, but the *persisted* id is only
88
+ * available after the adapter opens. Without this, a restarted app would stamp with a fresh node
89
+ * id while presenting the restored one as its clientId — the HLC tiebreak and the device identity
90
+ * would disagree, and two runs of the same device would order as if they were different devices.
91
+ */
92
+ setNode(node: string): void;
93
+ /** Restore across an app restart, so ordering survives process death. */
94
+ restore(stamp: Hlc | string): void;
95
+ }
96
+ //# sourceMappingURL=hlc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hlc.d.ts","sourceRoot":"","sources":["../../../src/core/hlc.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,MAAM,WAAW,GAAG;IAClB,qFAAqF;IACrF,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,gEAAgE;IAChE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,4EAA4E;IAC5E,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAMD,wBAAgB,SAAS,CAAC,GAAG,EAAE,GAAG,GAAG,MAAM,CAQ1C;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,GAAG,CAW9C;AAED;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,GAAG,MAAM,CAKjD;AAED,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAG7D;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,+FAA+F;IAC/F,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,kBAAkB;IAC7B;;;OAGG;IACH,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAe;IACrC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;gBAExB,IAAI,EAAE,UAAU;IAQ5B,sEAAsE;IACtE,IAAI,IAAI,GAAG;IAgBX,uDAAuD;IACvD,SAAS,IAAI,MAAM;IAInB;;;;;;;;;;;;OAYG;IACH,MAAM,CAAC,MAAM,EAAE,GAAG,GAAG,MAAM,EAAE,IAAI,GAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAA;KAAO,GAAG,GAAG;IA0BnE,WAAW,CAAC,MAAM,EAAE,GAAG,GAAG,MAAM,EAAE,IAAI,GAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAA;KAAO,GAAG,MAAM;IAI3E,uCAAuC;IACvC,IAAI,IAAI,GAAG;IAIX;;;;;;;OAOG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAI3B,yEAAyE;IACzE,OAAO,CAAC,KAAK,EAAE,GAAG,GAAG,MAAM,GAAG,IAAI;CAOnC"}
@@ -0,0 +1,161 @@
1
+ "use strict";
2
+ /**
3
+ * Hybrid Logical Clock.
4
+ *
5
+ * Wall clocks on phones are wrong often enough that ordering cannot be built on them: users change
6
+ * the date, timezones shift, DST jumps, and devices sit offline for days. An HLC keeps the *useful*
7
+ * property of a wall clock (roughly tracks real time, so it stays human-interpretable) while adding
8
+ * the property a wall clock lacks (it never goes backwards, and it advances whenever it observes a
9
+ * newer clock elsewhere).
10
+ *
11
+ * Encoded form is fixed-width and lexicographically sortable, so it can be compared as TEXT in SQL
12
+ * and used directly as a sort key:
13
+ *
14
+ * 000001756616340000-00000-cli_7f3a
15
+ * \______wall_____/ \cnt/ \_node_/
16
+ */
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ exports.HybridLogicalClock = void 0;
19
+ exports.encodeHlc = encodeHlc;
20
+ exports.decodeHlc = decodeHlc;
21
+ exports.compareHlc = compareHlc;
22
+ exports.compareHlcStamps = compareHlcStamps;
23
+ const WALL_DIGITS = 15;
24
+ const COUNTER_DIGITS = 5;
25
+ const MAX_COUNTER = 99_999;
26
+ function encodeHlc(hlc) {
27
+ return (String(hlc.wall).padStart(WALL_DIGITS, "0") +
28
+ "-" +
29
+ String(hlc.counter).padStart(COUNTER_DIGITS, "0") +
30
+ "-" +
31
+ hlc.node);
32
+ }
33
+ function decodeHlc(encoded) {
34
+ const first = encoded.indexOf("-");
35
+ const second = encoded.indexOf("-", first + 1);
36
+ if (first < 0 || second < 0) {
37
+ throw new TypeError(`Malformed HLC stamp: "${encoded}"`);
38
+ }
39
+ return {
40
+ wall: Number(encoded.slice(0, first)),
41
+ counter: Number(encoded.slice(first + 1, second)),
42
+ node: encoded.slice(second + 1),
43
+ };
44
+ }
45
+ /**
46
+ * Total order over HLC stamps: wall, then counter, then node.
47
+ *
48
+ * The node tiebreak is what makes this a *total* order rather than a partial one. Without it two
49
+ * devices could produce genuinely equal stamps and "last write wins" would have no answer — the
50
+ * outcome would depend on map iteration order, which is how a sync engine ends up non-deterministic
51
+ * and different devices converge to different documents.
52
+ */
53
+ function compareHlc(a, b) {
54
+ if (a.wall !== b.wall)
55
+ return a.wall < b.wall ? -1 : 1;
56
+ if (a.counter !== b.counter)
57
+ return a.counter < b.counter ? -1 : 1;
58
+ if (a.node === b.node)
59
+ return 0;
60
+ return a.node < b.node ? -1 : 1;
61
+ }
62
+ function compareHlcStamps(a, b) {
63
+ // Fixed-width encoding means plain string comparison is already the correct order.
64
+ return a < b ? -1 : a > b ? 1 : 0;
65
+ }
66
+ class HybridLogicalClock {
67
+ constructor(opts) {
68
+ this.node = opts.node;
69
+ this.nowFn = opts.now ?? (() => Date.now());
70
+ this.maxDriftMs = opts.maxDriftMs ?? 3_600_000;
71
+ this.wall = 0;
72
+ this.counter = 0;
73
+ }
74
+ /** Stamp a local event. Never returns a value <= the previous one. */
75
+ tick() {
76
+ const physical = this.nowFn();
77
+ if (physical > this.wall) {
78
+ this.wall = physical;
79
+ this.counter = 0;
80
+ }
81
+ else {
82
+ // Physical clock stalled or went backwards; keep moving via the logical counter.
83
+ this.counter += 1;
84
+ if (this.counter > MAX_COUNTER) {
85
+ this.wall += 1;
86
+ this.counter = 0;
87
+ }
88
+ }
89
+ return { wall: this.wall, counter: this.counter, node: this.node };
90
+ }
91
+ /** Stamp a local event and return the encoded form. */
92
+ tickStamp() {
93
+ return encodeHlc(this.tick());
94
+ }
95
+ /**
96
+ * Merge an observed remote stamp, then stamp a local event. This is what lets a device with a
97
+ * wrong clock self-correct: after one sync it is ordered relative to everyone else.
98
+ *
99
+ * `trusted` matters more than it looks. The drift guard compares the remote stamp against the
100
+ * *local* clock — but the whole reason we need an HLC is that the local clock may be the wrong
101
+ * one. A device sitting an hour behind would see every legitimate stamp as an "absurd future" and
102
+ * reject all of them, permanently isolating itself in the ordering: the guard would defeat the
103
+ * mechanism it is protecting.
104
+ *
105
+ * So the server, which is the time authority, is always adopted (`trusted: true`). The guard
106
+ * applies only to peer stamps, where we genuinely cannot tell whose clock is broken.
107
+ */
108
+ update(remote, opts = {}) {
109
+ const r = typeof remote === "string" ? decodeHlc(remote) : remote;
110
+ const physical = this.nowFn();
111
+ const tooFarAhead = !opts.trusted && r.wall > physical + this.maxDriftMs;
112
+ const remoteWall = tooFarAhead ? this.wall : r.wall;
113
+ if (physical > this.wall && physical > remoteWall) {
114
+ this.wall = physical;
115
+ this.counter = 0;
116
+ }
117
+ else if (remoteWall > this.wall) {
118
+ this.wall = remoteWall;
119
+ this.counter = r.counter + 1;
120
+ }
121
+ else if (this.wall === remoteWall) {
122
+ this.counter = Math.max(this.counter, r.counter) + 1;
123
+ }
124
+ else {
125
+ this.counter += 1;
126
+ }
127
+ if (this.counter > MAX_COUNTER) {
128
+ this.wall += 1;
129
+ this.counter = 0;
130
+ }
131
+ return { wall: this.wall, counter: this.counter, node: this.node };
132
+ }
133
+ updateStamp(remote, opts = {}) {
134
+ return encodeHlc(this.update(remote, opts));
135
+ }
136
+ /** Current value without advancing. */
137
+ peek() {
138
+ return { wall: this.wall, counter: this.counter, node: this.node };
139
+ }
140
+ /**
141
+ * Correct the node identity before any stamp is issued.
142
+ *
143
+ * AnchorDB generates a client id synchronously in its constructor, but the *persisted* id is only
144
+ * available after the adapter opens. Without this, a restarted app would stamp with a fresh node
145
+ * id while presenting the restored one as its clientId — the HLC tiebreak and the device identity
146
+ * would disagree, and two runs of the same device would order as if they were different devices.
147
+ */
148
+ setNode(node) {
149
+ this.node = node;
150
+ }
151
+ /** Restore across an app restart, so ordering survives process death. */
152
+ restore(stamp) {
153
+ const h = typeof stamp === "string" ? decodeHlc(stamp) : stamp;
154
+ if (h.wall > this.wall || (h.wall === this.wall && h.counter > this.counter)) {
155
+ this.wall = h.wall;
156
+ this.counter = h.counter;
157
+ }
158
+ }
159
+ }
160
+ exports.HybridLogicalClock = HybridLogicalClock;
161
+ //# sourceMappingURL=hlc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hlc.js","sourceRoot":"","sources":["../../../src/core/hlc.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ export type ObjectIdLike = ObjectId | string | Uint8Array | {
2
+ toHexString(): string;
3
+ };
4
+ /**
5
+ * A note on numbers: bson (and therefore Mongoose) rejects `new ObjectId(1234)` outright with
6
+ * "Argument passed in does not match the accepted types". AnchorDB rejects it too, rather than
7
+ * offering a friendlier overload, because a convenience that exists only here is exactly the kind
8
+ * of drift that stops code porting cleanly. Build from a time with `createFromTime()`.
9
+ */
10
+ export declare class ObjectId {
11
+ /** Marks the value for BSON/Mongoose consumers that brand-check instead of instanceof. */
12
+ readonly _bsontype = "ObjectId";
13
+ private readonly bytes;
14
+ private cachedHex;
15
+ constructor(value?: ObjectIdLike | null);
16
+ /** Raw 12 bytes. Copied, so callers cannot mutate an id in place. */
17
+ get id(): Uint8Array;
18
+ toHexString(): string;
19
+ toString(): string;
20
+ /** Serialises to the plain hex string, matching Mongoose — not to `{ $oid }`. */
21
+ toJSON(): string;
22
+ /** Second-precision creation time. Useful, but never the canonical `createdAt`. */
23
+ getTimestamp(): Date;
24
+ equals(other: ObjectIdLike | null | undefined): boolean;
25
+ inspect(): string;
26
+ /** Raw 12-byte generator. `time` is seconds since the epoch; defaults to now. */
27
+ static generate(time?: number): Uint8Array;
28
+ static createFromHexString(hex: string): ObjectId;
29
+ static createFromTime(seconds: number): ObjectId;
30
+ /**
31
+ * Mirrors the driver's `isValid`: accepts a 24-char hex string, 12 raw bytes, an ObjectId, or
32
+ * anything exposing `toHexString()`. Notably it does *not* accept arbitrary 12-char strings.
33
+ */
34
+ static isValid(value: unknown): boolean;
35
+ /** Test seam so counter-rollover behaviour can be exercised deterministically. */
36
+ static __setCounter(value: number): void;
37
+ }
38
+ //# sourceMappingURL=object-id.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"object-id.d.ts","sourceRoot":"","sources":["../../../src/core/object-id.ts"],"names":[],"mappings":"AA+BA,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,GAAG;IAAE,WAAW,IAAI,MAAM,CAAA;CAAE,CAAC;AAEtF;;;;;GAKG;AAEH,qBAAa,QAAQ;IACnB,0FAA0F;IAC1F,QAAQ,CAAC,SAAS,cAAc;IAEhC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAa;IACnC,OAAO,CAAC,SAAS,CAAuB;gBAE5B,KAAK,CAAC,EAAE,YAAY,GAAG,IAAI;IAqCvC,qEAAqE;IACrE,IAAI,EAAE,IAAI,UAAU,CAEnB;IAED,WAAW,IAAI,MAAM;IAKrB,QAAQ,IAAI,MAAM;IAIlB,iFAAiF;IACjF,MAAM,IAAI,MAAM;IAIhB,mFAAmF;IACnF,YAAY,IAAI,IAAI;IAKpB,MAAM,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO;IAgBvD,OAAO,IAAI,MAAM;IAIjB,iFAAiF;IACjF,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,UAAU;IAmB1C,MAAM,CAAC,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ;IAIjD,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,QAAQ;IAShD;;;OAGG;IACH,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO;IAWvC,kFAAkF;IAClF,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;CAGzC"}