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,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,153 @@
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
+ const WALL_DIGITS = 15;
17
+ const COUNTER_DIGITS = 5;
18
+ const MAX_COUNTER = 99_999;
19
+ export function encodeHlc(hlc) {
20
+ return (String(hlc.wall).padStart(WALL_DIGITS, "0") +
21
+ "-" +
22
+ String(hlc.counter).padStart(COUNTER_DIGITS, "0") +
23
+ "-" +
24
+ hlc.node);
25
+ }
26
+ export function decodeHlc(encoded) {
27
+ const first = encoded.indexOf("-");
28
+ const second = encoded.indexOf("-", first + 1);
29
+ if (first < 0 || second < 0) {
30
+ throw new TypeError(`Malformed HLC stamp: "${encoded}"`);
31
+ }
32
+ return {
33
+ wall: Number(encoded.slice(0, first)),
34
+ counter: Number(encoded.slice(first + 1, second)),
35
+ node: encoded.slice(second + 1),
36
+ };
37
+ }
38
+ /**
39
+ * Total order over HLC stamps: wall, then counter, then node.
40
+ *
41
+ * The node tiebreak is what makes this a *total* order rather than a partial one. Without it two
42
+ * devices could produce genuinely equal stamps and "last write wins" would have no answer — the
43
+ * outcome would depend on map iteration order, which is how a sync engine ends up non-deterministic
44
+ * and different devices converge to different documents.
45
+ */
46
+ export function compareHlc(a, b) {
47
+ if (a.wall !== b.wall)
48
+ return a.wall < b.wall ? -1 : 1;
49
+ if (a.counter !== b.counter)
50
+ return a.counter < b.counter ? -1 : 1;
51
+ if (a.node === b.node)
52
+ return 0;
53
+ return a.node < b.node ? -1 : 1;
54
+ }
55
+ export function compareHlcStamps(a, b) {
56
+ // Fixed-width encoding means plain string comparison is already the correct order.
57
+ return a < b ? -1 : a > b ? 1 : 0;
58
+ }
59
+ export class HybridLogicalClock {
60
+ constructor(opts) {
61
+ this.node = opts.node;
62
+ this.nowFn = opts.now ?? (() => Date.now());
63
+ this.maxDriftMs = opts.maxDriftMs ?? 3_600_000;
64
+ this.wall = 0;
65
+ this.counter = 0;
66
+ }
67
+ /** Stamp a local event. Never returns a value <= the previous one. */
68
+ tick() {
69
+ const physical = this.nowFn();
70
+ if (physical > this.wall) {
71
+ this.wall = physical;
72
+ this.counter = 0;
73
+ }
74
+ else {
75
+ // Physical clock stalled or went backwards; keep moving via the logical counter.
76
+ this.counter += 1;
77
+ if (this.counter > MAX_COUNTER) {
78
+ this.wall += 1;
79
+ this.counter = 0;
80
+ }
81
+ }
82
+ return { wall: this.wall, counter: this.counter, node: this.node };
83
+ }
84
+ /** Stamp a local event and return the encoded form. */
85
+ tickStamp() {
86
+ return encodeHlc(this.tick());
87
+ }
88
+ /**
89
+ * Merge an observed remote stamp, then stamp a local event. This is what lets a device with a
90
+ * wrong clock self-correct: after one sync it is ordered relative to everyone else.
91
+ *
92
+ * `trusted` matters more than it looks. The drift guard compares the remote stamp against the
93
+ * *local* clock — but the whole reason we need an HLC is that the local clock may be the wrong
94
+ * one. A device sitting an hour behind would see every legitimate stamp as an "absurd future" and
95
+ * reject all of them, permanently isolating itself in the ordering: the guard would defeat the
96
+ * mechanism it is protecting.
97
+ *
98
+ * So the server, which is the time authority, is always adopted (`trusted: true`). The guard
99
+ * applies only to peer stamps, where we genuinely cannot tell whose clock is broken.
100
+ */
101
+ update(remote, opts = {}) {
102
+ const r = typeof remote === "string" ? decodeHlc(remote) : remote;
103
+ const physical = this.nowFn();
104
+ const tooFarAhead = !opts.trusted && r.wall > physical + this.maxDriftMs;
105
+ const remoteWall = tooFarAhead ? this.wall : r.wall;
106
+ if (physical > this.wall && physical > remoteWall) {
107
+ this.wall = physical;
108
+ this.counter = 0;
109
+ }
110
+ else if (remoteWall > this.wall) {
111
+ this.wall = remoteWall;
112
+ this.counter = r.counter + 1;
113
+ }
114
+ else if (this.wall === remoteWall) {
115
+ this.counter = Math.max(this.counter, r.counter) + 1;
116
+ }
117
+ else {
118
+ this.counter += 1;
119
+ }
120
+ if (this.counter > MAX_COUNTER) {
121
+ this.wall += 1;
122
+ this.counter = 0;
123
+ }
124
+ return { wall: this.wall, counter: this.counter, node: this.node };
125
+ }
126
+ updateStamp(remote, opts = {}) {
127
+ return encodeHlc(this.update(remote, opts));
128
+ }
129
+ /** Current value without advancing. */
130
+ peek() {
131
+ return { wall: this.wall, counter: this.counter, node: this.node };
132
+ }
133
+ /**
134
+ * Correct the node identity before any stamp is issued.
135
+ *
136
+ * AnchorDB generates a client id synchronously in its constructor, but the *persisted* id is only
137
+ * available after the adapter opens. Without this, a restarted app would stamp with a fresh node
138
+ * id while presenting the restored one as its clientId — the HLC tiebreak and the device identity
139
+ * would disagree, and two runs of the same device would order as if they were different devices.
140
+ */
141
+ setNode(node) {
142
+ this.node = node;
143
+ }
144
+ /** Restore across an app restart, so ordering survives process death. */
145
+ restore(stamp) {
146
+ const h = typeof stamp === "string" ? decodeHlc(stamp) : stamp;
147
+ if (h.wall > this.wall || (h.wall === this.wall && h.counter > this.counter)) {
148
+ this.wall = h.wall;
149
+ this.counter = h.counter;
150
+ }
151
+ }
152
+ }
153
+ //# sourceMappingURL=hlc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hlc.js","sourceRoot":"","sources":["../../../src/core/hlc.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAWH,MAAM,WAAW,GAAG,EAAE,CAAC;AACvB,MAAM,cAAc,GAAG,CAAC,CAAC;AACzB,MAAM,WAAW,GAAG,MAAM,CAAC;AAE3B,MAAM,UAAU,SAAS,CAAC,GAAQ;IAChC,OAAO,CACL,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,WAAW,EAAE,GAAG,CAAC;QAC3C,GAAG;QACH,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,cAAc,EAAE,GAAG,CAAC;QACjD,GAAG;QACH,GAAG,CAAC,IAAI,CACT,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,OAAe;IACvC,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACnC,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;IAC/C,IAAI,KAAK,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,SAAS,CAAC,yBAAyB,OAAO,GAAG,CAAC,CAAC;IAC3D,CAAC;IACD,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QACrC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC;QACjD,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;KAChC,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,UAAU,CAAC,CAAM,EAAE,CAAM;IACvC,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI;QAAE,OAAO,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACvD,IAAI,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,OAAO;QAAE,OAAO,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACnE,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI;QAAE,OAAO,CAAC,CAAC;IAChC,OAAO,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,CAAS,EAAE,CAAS;IACnD,mFAAmF;IACnF,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACpC,CAAC;AAeD,MAAM,OAAO,kBAAkB;IAW7B,YAAY,IAAgB;QAC1B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACtB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QAC5C,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,SAAS,CAAC;QAC/C,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;QACd,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;IACnB,CAAC;IAED,sEAAsE;IACtE,IAAI;QACF,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QAC9B,IAAI,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YACzB,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC;YACrB,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;QACnB,CAAC;aAAM,CAAC;YACN,iFAAiF;YACjF,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC;YAClB,IAAI,IAAI,CAAC,OAAO,GAAG,WAAW,EAAE,CAAC;gBAC/B,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC;gBACf,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;YACnB,CAAC;QACH,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;IACrE,CAAC;IAED,uDAAuD;IACvD,SAAS;QACP,OAAO,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAChC,CAAC;IAED;;;;;;;;;;;;OAYG;IACH,MAAM,CAAC,MAAoB,EAAE,OAA8B,EAAE;QAC3D,MAAM,CAAC,GAAG,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QAClE,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QAE9B,MAAM,WAAW,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC,IAAI,GAAG,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC;QACzE,MAAM,UAAU,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAEpD,IAAI,QAAQ,GAAG,IAAI,CAAC,IAAI,IAAI,QAAQ,GAAG,UAAU,EAAE,CAAC;YAClD,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC;YACrB,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;QACnB,CAAC;aAAM,IAAI,UAAU,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAClC,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;YACvB,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC;QAC/B,CAAC;aAAM,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YACpC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACvD,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC;QACpB,CAAC;QAED,IAAI,IAAI,CAAC,OAAO,GAAG,WAAW,EAAE,CAAC;YAC/B,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC;YACf,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;QACnB,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;IACrE,CAAC;IAED,WAAW,CAAC,MAAoB,EAAE,OAA8B,EAAE;QAChE,OAAO,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;IAC9C,CAAC;IAED,uCAAuC;IACvC,IAAI;QACF,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;IACrE,CAAC;IAED;;;;;;;OAOG;IACH,OAAO,CAAC,IAAY;QAClB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAED,yEAAyE;IACzE,OAAO,CAAC,KAAmB;QACzB,MAAM,CAAC,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QAC/D,IAAI,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAC7E,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC;YACnB,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC;QAC3B,CAAC;IACH,CAAC;CACF"}
@@ -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"}
@@ -0,0 +1,163 @@
1
+ import { bytesToHex, hexToBytes } from "./hex.js";
2
+ import { randomBytes, randomInt } from "./random.js";
3
+ /**
4
+ * A real MongoDB ObjectId — not a lookalike.
5
+ *
6
+ * Layout is exactly the BSON spec, which is what makes documents portable to a real database
7
+ * without translation:
8
+ *
9
+ * bytes 0-3 4-byte big-endian seconds since the Unix epoch
10
+ * bytes 4-8 5-byte value random per process
11
+ * bytes 9-11 3-byte big-endian counter, randomly seeded
12
+ *
13
+ * Two consequences we rely on elsewhere:
14
+ *
15
+ * - Because the timestamp leads and is big-endian, the lowercase hex form sorts in the same order
16
+ * as the raw bytes. So `_id` can be the SQLite TEXT primary key and still give creation-ordered
17
+ * scans and cheap cursor pagination, with no separate sort column.
18
+ * - The per-process random block is what keeps two devices generating ids offline from colliding,
19
+ * which is why `random.ts` refuses to run without a real CSPRNG.
20
+ */
21
+ const PROCESS_RANDOM = randomBytes(5);
22
+ const COUNTER_MAX = 0xffffff;
23
+ let counter = randomInt(COUNTER_MAX + 1);
24
+ function nextCounter() {
25
+ counter = (counter + 1) % (COUNTER_MAX + 1); // wraps at 2^24, as the spec requires
26
+ return counter;
27
+ }
28
+ /**
29
+ * A note on numbers: bson (and therefore Mongoose) rejects `new ObjectId(1234)` outright with
30
+ * "Argument passed in does not match the accepted types". AnchorDB rejects it too, rather than
31
+ * offering a friendlier overload, because a convenience that exists only here is exactly the kind
32
+ * of drift that stops code porting cleanly. Build from a time with `createFromTime()`.
33
+ */
34
+ export class ObjectId {
35
+ constructor(value) {
36
+ /** Marks the value for BSON/Mongoose consumers that brand-check instead of instanceof. */
37
+ this._bsontype = "ObjectId";
38
+ this.cachedHex = null;
39
+ if (value === undefined || value === null) {
40
+ this.bytes = ObjectId.generate();
41
+ return;
42
+ }
43
+ if (value instanceof ObjectId) {
44
+ this.bytes = value.bytes.slice();
45
+ return;
46
+ }
47
+ if (typeof value === "string") {
48
+ const parsed = hexToBytes(value, 12);
49
+ if (!parsed) {
50
+ throw new TypeError(`Argument passed in must be a string of 12 bytes or a string of 24 hex characters, got "${value}"`);
51
+ }
52
+ this.bytes = parsed;
53
+ return;
54
+ }
55
+ if (value instanceof Uint8Array) {
56
+ if (value.length !== 12) {
57
+ throw new TypeError(`Argument passed in must be 12 bytes, got ${value.length}`);
58
+ }
59
+ this.bytes = value.slice();
60
+ return;
61
+ }
62
+ if (typeof value.toHexString === "function") {
63
+ // Accepts a foreign ObjectId (e.g. from the official `bson` package) without importing it.
64
+ const parsed = hexToBytes(value.toHexString(), 12);
65
+ if (parsed) {
66
+ this.bytes = parsed;
67
+ return;
68
+ }
69
+ }
70
+ throw new TypeError("Argument passed in does not match the accepted types");
71
+ }
72
+ /** Raw 12 bytes. Copied, so callers cannot mutate an id in place. */
73
+ get id() {
74
+ return this.bytes.slice();
75
+ }
76
+ toHexString() {
77
+ this.cachedHex ??= bytesToHex(this.bytes);
78
+ return this.cachedHex;
79
+ }
80
+ toString() {
81
+ return this.toHexString();
82
+ }
83
+ /** Serialises to the plain hex string, matching Mongoose — not to `{ $oid }`. */
84
+ toJSON() {
85
+ return this.toHexString();
86
+ }
87
+ /** Second-precision creation time. Useful, but never the canonical `createdAt`. */
88
+ getTimestamp() {
89
+ const seconds = (this.bytes[0] << 24) | (this.bytes[1] << 16) | (this.bytes[2] << 8) | this.bytes[3];
90
+ return new Date((seconds >>> 0) * 1000);
91
+ }
92
+ equals(other) {
93
+ if (other === null || other === undefined)
94
+ return false;
95
+ if (other instanceof ObjectId)
96
+ return this.toHexString() === other.toHexString();
97
+ if (typeof other === "string")
98
+ return this.toHexString() === other.toLowerCase();
99
+ if (other instanceof Uint8Array) {
100
+ if (other.length !== 12)
101
+ return false;
102
+ return this.toHexString() === bytesToHex(other);
103
+ }
104
+ if (typeof other.toHexString === "function")
105
+ return this.toHexString() === other.toHexString().toLowerCase();
106
+ return false;
107
+ }
108
+ [Symbol.for("nodejs.util.inspect.custom")]() {
109
+ return `new ObjectId("${this.toHexString()}")`;
110
+ }
111
+ inspect() {
112
+ return `new ObjectId("${this.toHexString()}")`;
113
+ }
114
+ /** Raw 12-byte generator. `time` is seconds since the epoch; defaults to now. */
115
+ static generate(time) {
116
+ const seconds = Math.floor(time ?? Date.now() / 1000);
117
+ const out = new Uint8Array(12);
118
+ out[0] = (seconds >> 24) & 0xff;
119
+ out[1] = (seconds >> 16) & 0xff;
120
+ out[2] = (seconds >> 8) & 0xff;
121
+ out[3] = seconds & 0xff;
122
+ out.set(PROCESS_RANDOM, 4);
123
+ const c = nextCounter();
124
+ out[9] = (c >> 16) & 0xff;
125
+ out[10] = (c >> 8) & 0xff;
126
+ out[11] = c & 0xff;
127
+ return out;
128
+ }
129
+ static createFromHexString(hex) {
130
+ return new ObjectId(hex);
131
+ }
132
+ static createFromTime(seconds) {
133
+ const bytes = new Uint8Array(12);
134
+ bytes[0] = (seconds >> 24) & 0xff;
135
+ bytes[1] = (seconds >> 16) & 0xff;
136
+ bytes[2] = (seconds >> 8) & 0xff;
137
+ bytes[3] = seconds & 0xff;
138
+ return new ObjectId(bytes);
139
+ }
140
+ /**
141
+ * Mirrors the driver's `isValid`: accepts a 24-char hex string, 12 raw bytes, an ObjectId, or
142
+ * anything exposing `toHexString()`. Notably it does *not* accept arbitrary 12-char strings.
143
+ */
144
+ static isValid(value) {
145
+ if (value === null || value === undefined)
146
+ return false;
147
+ if (value instanceof ObjectId)
148
+ return true;
149
+ if (typeof value === "string")
150
+ return hexToBytes(value, 12) !== null;
151
+ if (value instanceof Uint8Array)
152
+ return value.length === 12;
153
+ if (typeof value.toHexString === "function") {
154
+ return hexToBytes(value.toHexString(), 12) !== null;
155
+ }
156
+ return false;
157
+ }
158
+ /** Test seam so counter-rollover behaviour can be exercised deterministically. */
159
+ static __setCounter(value) {
160
+ counter = value % (COUNTER_MAX + 1);
161
+ }
162
+ }
163
+ //# sourceMappingURL=object-id.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"object-id.js","sourceRoot":"","sources":["../../../src/core/object-id.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /** Test seam, and the escape hatch for exotic runtimes. Pass `null` to restore platform crypto. */
2
+ export declare function setRandomBytesSource(fn: ((size: number) => Uint8Array) | null): void;
3
+ export declare function randomBytes(size: number): Uint8Array;
4
+ /** Uniform integer in [0, maxExclusive). Used to seed the ObjectId counter. */
5
+ export declare function randomInt(maxExclusive: number): number;
6
+ //# sourceMappingURL=random.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"random.d.ts","sourceRoot":"","sources":["../../../src/core/random.ts"],"names":[],"mappings":"AAYA,mGAAmG;AACnG,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,KAAK,UAAU,CAAC,GAAG,IAAI,GAAG,IAAI,CAEpF;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAepD;AAED,+EAA+E;AAC/E,wBAAgB,SAAS,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAItD"}
@@ -0,0 +1,34 @@
1
+ import { AnchorConfigError } from "./errors.js";
2
+ /**
3
+ * Cryptographically secure random bytes.
4
+ *
5
+ * ObjectId collision resistance depends on this being a real CSPRNG, so there is deliberately no
6
+ * `Math.random()` fallback: on a platform without one we throw a message that names the fix. A
7
+ * silent downgrade would raise collision risk across devices in exactly the offline, multi-device
8
+ * scenario AnchorDB exists to serve, and would do so invisibly.
9
+ */
10
+ let override = null;
11
+ /** Test seam, and the escape hatch for exotic runtimes. Pass `null` to restore platform crypto. */
12
+ export function setRandomBytesSource(fn) {
13
+ override = fn;
14
+ }
15
+ export function randomBytes(size) {
16
+ if (override)
17
+ return override(size);
18
+ const out = new Uint8Array(size);
19
+ const c = globalThis.crypto;
20
+ if (c && typeof c.getRandomValues === "function") {
21
+ c.getRandomValues(out);
22
+ return out;
23
+ }
24
+ throw new AnchorConfigError("No cryptographically secure random source is available (globalThis.crypto.getRandomValues is missing). " +
25
+ "On React Native, install and import `react-native-get-random-values` at the top of your entry file. " +
26
+ "AnchorDB refuses to fall back to Math.random() because ObjectId uniqueness depends on real entropy.");
27
+ }
28
+ /** Uniform integer in [0, maxExclusive). Used to seed the ObjectId counter. */
29
+ export function randomInt(maxExclusive) {
30
+ const bytes = randomBytes(4);
31
+ const value = ((bytes[0] << 24) | (bytes[1] << 16) | (bytes[2] << 8) | bytes[3]) >>> 0;
32
+ return value % maxExclusive;
33
+ }
34
+ //# sourceMappingURL=random.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"random.js","sourceRoot":"","sources":["../../../src/core/random.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD;;;;;;;GAOG;AACH,IAAI,QAAQ,GAA0C,IAAI,CAAC;AAE3D,mGAAmG;AACnG,MAAM,UAAU,oBAAoB,CAAC,EAAyC;IAC5E,QAAQ,GAAG,EAAE,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC;IAEpC,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;IACjC,MAAM,CAAC,GAAuB,UAAU,CAAC,MAAM,CAAC;IAChD,IAAI,CAAC,IAAI,OAAO,CAAC,CAAC,eAAe,KAAK,UAAU,EAAE,CAAC;QACjD,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;QACvB,OAAO,GAAG,CAAC;IACb,CAAC;IAED,MAAM,IAAI,iBAAiB,CACzB,yGAAyG;QACvG,sGAAsG;QACtG,qGAAqG,CACxG,CAAC;AACJ,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,SAAS,CAAC,YAAoB;IAC5C,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;IAC7B,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAE,IAAI,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAE,IAAI,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAE,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,CAAC;IAC3F,OAAO,KAAK,GAAG,YAAY,CAAC;AAC9B,CAAC"}
@@ -0,0 +1,96 @@
1
+ import type { HybridLogicalClock } from "./hlc.js";
2
+ import type { TimeService } from "../timestamps/index.js";
3
+ import type { TypedEmitter } from "../events/emitter.js";
4
+ import type { DatabaseAdapter, WriteOp } from "../storage/types.js";
5
+ import type { Model } from "../model/model.js";
6
+ /** Events the SDK emits. Local events fire in both modes; sync events only in synced mode. */
7
+ export interface AnchorEvents extends Record<string, unknown> {
8
+ change: {
9
+ collection: string;
10
+ modelName: string;
11
+ operation: "insert" | "update" | "replace" | "delete";
12
+ documentId: string;
13
+ document: Record<string, unknown> | null;
14
+ };
15
+ "queue:changed": {
16
+ pending: number;
17
+ failed: number;
18
+ };
19
+ online: {
20
+ at: string;
21
+ };
22
+ offline: {
23
+ at: string;
24
+ };
25
+ "sync:start": {
26
+ pending: number;
27
+ };
28
+ "sync:progress": {
29
+ pushed: number;
30
+ pulled: number;
31
+ };
32
+ "sync:complete": {
33
+ pushed: number;
34
+ pulled: number;
35
+ conflicts: number;
36
+ durationMs: number;
37
+ };
38
+ "sync:error": {
39
+ error: Error;
40
+ phase: "push" | "pull";
41
+ };
42
+ conflict: {
43
+ collection: string;
44
+ documentId: string;
45
+ strategy: string;
46
+ winner: "local" | "remote" | "merged";
47
+ local: Record<string, unknown>;
48
+ remote: Record<string, unknown>;
49
+ base?: Record<string, unknown>;
50
+ resolved: Record<string, unknown>;
51
+ };
52
+ "conflict:unresolvable": {
53
+ collection: string;
54
+ documentId: string;
55
+ attempts: number;
56
+ };
57
+ "duplicate-key": {
58
+ collection: string;
59
+ documentId: string;
60
+ index: string;
61
+ keyValue: Record<string, unknown>;
62
+ };
63
+ "auth:expired": {
64
+ at: string;
65
+ };
66
+ }
67
+ /**
68
+ * The shared services a Model needs, passed as one object so Model never reaches back into AnchorDB.
69
+ *
70
+ * `syncEnabled` is the single flag that distinguishes the two modes. It is read at write time rather
71
+ * than branching into a different code path, which is what keeps local-only and synced behaviour
72
+ * identical everywhere except where they genuinely must differ (queueing and tombstones).
73
+ */
74
+ export interface AnchorRuntime {
75
+ readonly adapter: DatabaseAdapter;
76
+ readonly time: TimeService;
77
+ readonly clock: HybridLogicalClock;
78
+ readonly events: TypedEmitter<AnchorEvents>;
79
+ readonly syncEnabled: boolean;
80
+ readonly clientId: string;
81
+ readonly onMissingRef: "null" | "keep-id" | "throw";
82
+ getModel(name: string): Model;
83
+ /** Resolve a storage collection name to its model, if one is registered. Used by $lookup. */
84
+ getModelByCollection?(collection: string): Model | undefined;
85
+ /**
86
+ * Resolves once the adapter is open.
87
+ *
88
+ * AnchorDB opens lazily so construction never does I/O, which means every Model operation must
89
+ * await this first. MemoryAdapter tolerates being used unopened; a SQLite adapter does not, so
90
+ * without this the file-backed path fails while the in-memory tests pass.
91
+ */
92
+ ready(): Promise<void>;
93
+ /** No-op in local-only mode; the sync engine installs the real implementation. */
94
+ recordMutations(collection: string, ops: WriteOp[]): Promise<void>;
95
+ }
96
+ //# sourceMappingURL=runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../../src/core/runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../../src/core/runtime.ts"],"names":[],"mappings":""}