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.
- package/CHANGELOG.md +61 -0
- package/LICENSE +21 -0
- package/README.md +160 -0
- package/dist/cjs/conflict/strategies.d.ts +110 -0
- package/dist/cjs/conflict/strategies.d.ts.map +1 -0
- package/dist/cjs/conflict/strategies.js +298 -0
- package/dist/cjs/conflict/strategies.js.map +1 -0
- package/dist/cjs/conflict/types.d.ts +38 -0
- package/dist/cjs/conflict/types.d.ts.map +1 -0
- package/dist/cjs/conflict/types.js +3 -0
- package/dist/cjs/conflict/types.js.map +1 -0
- package/dist/cjs/core/anchor-db.d.ts +154 -0
- package/dist/cjs/core/anchor-db.d.ts.map +1 -0
- package/dist/cjs/core/anchor-db.js +273 -0
- package/dist/cjs/core/anchor-db.js.map +1 -0
- package/dist/cjs/core/errors.d.ts +125 -0
- package/dist/cjs/core/errors.d.ts.map +1 -0
- package/dist/cjs/core/errors.js +174 -0
- package/dist/cjs/core/errors.js.map +1 -0
- package/dist/cjs/core/hex.d.ts +4 -0
- package/dist/cjs/core/hex.d.ts.map +1 -0
- package/dist/cjs/core/hex.js +41 -0
- package/dist/cjs/core/hex.js.map +1 -0
- package/dist/cjs/core/hlc.d.ts +96 -0
- package/dist/cjs/core/hlc.d.ts.map +1 -0
- package/dist/cjs/core/hlc.js +161 -0
- package/dist/cjs/core/hlc.js.map +1 -0
- package/dist/cjs/core/object-id.d.ts +38 -0
- package/dist/cjs/core/object-id.d.ts.map +1 -0
- package/dist/cjs/core/object-id.js +167 -0
- package/dist/cjs/core/object-id.js.map +1 -0
- package/dist/cjs/core/random.d.ts +6 -0
- package/dist/cjs/core/random.d.ts.map +1 -0
- package/dist/cjs/core/random.js +39 -0
- package/dist/cjs/core/random.js.map +1 -0
- package/dist/cjs/core/runtime.d.ts +96 -0
- package/dist/cjs/core/runtime.d.ts.map +1 -0
- package/dist/cjs/core/runtime.js +3 -0
- package/dist/cjs/core/runtime.js.map +1 -0
- package/dist/cjs/core/uuid.d.ts +16 -0
- package/dist/cjs/core/uuid.d.ts.map +1 -0
- package/dist/cjs/core/uuid.js +37 -0
- package/dist/cjs/core/uuid.js.map +1 -0
- package/dist/cjs/decorators/index.d.ts +48 -0
- package/dist/cjs/decorators/index.d.ts.map +1 -0
- package/dist/cjs/decorators/index.js +295 -0
- package/dist/cjs/decorators/index.js.map +1 -0
- package/dist/cjs/events/emitter.d.ts +16 -0
- package/dist/cjs/events/emitter.d.ts.map +1 -0
- package/dist/cjs/events/emitter.js +56 -0
- package/dist/cjs/events/emitter.js.map +1 -0
- package/dist/cjs/index/keys.d.ts +79 -0
- package/dist/cjs/index/keys.d.ts.map +1 -0
- package/dist/cjs/index/keys.js +208 -0
- package/dist/cjs/index/keys.js.map +1 -0
- package/dist/cjs/index.d.ts +81 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +193 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/inspector/agent.d.ts +75 -0
- package/dist/cjs/inspector/agent.d.ts.map +1 -0
- package/dist/cjs/inspector/agent.js +520 -0
- package/dist/cjs/inspector/agent.js.map +1 -0
- package/dist/cjs/inspector/auth.d.ts +49 -0
- package/dist/cjs/inspector/auth.d.ts.map +1 -0
- package/dist/cjs/inspector/auth.js +234 -0
- package/dist/cjs/inspector/auth.js.map +1 -0
- package/dist/cjs/inspector/bridge.d.ts +141 -0
- package/dist/cjs/inspector/bridge.d.ts.map +1 -0
- package/dist/cjs/inspector/bridge.js +190 -0
- package/dist/cjs/inspector/bridge.js.map +1 -0
- package/dist/cjs/inspector/client.d.ts +111 -0
- package/dist/cjs/inspector/client.d.ts.map +1 -0
- package/dist/cjs/inspector/client.js +218 -0
- package/dist/cjs/inspector/client.js.map +1 -0
- package/dist/cjs/inspector/protocol.d.ts +160 -0
- package/dist/cjs/inspector/protocol.d.ts.map +1 -0
- package/dist/cjs/inspector/protocol.js +53 -0
- package/dist/cjs/inspector/protocol.js.map +1 -0
- package/dist/cjs/inspector/transports/in-process.d.ts +7 -0
- package/dist/cjs/inspector/transports/in-process.d.ts.map +1 -0
- package/dist/cjs/inspector/transports/in-process.js +58 -0
- package/dist/cjs/inspector/transports/in-process.js.map +1 -0
- package/dist/cjs/inspector/transports/websocket.d.ts +39 -0
- package/dist/cjs/inspector/transports/websocket.d.ts.map +1 -0
- package/dist/cjs/inspector/transports/websocket.js +60 -0
- package/dist/cjs/inspector/transports/websocket.js.map +1 -0
- package/dist/cjs/interop/csv.d.ts +53 -0
- package/dist/cjs/interop/csv.d.ts.map +1 -0
- package/dist/cjs/interop/csv.js +230 -0
- package/dist/cjs/interop/csv.js.map +1 -0
- package/dist/cjs/interop/ejson.d.ts +41 -0
- package/dist/cjs/interop/ejson.d.ts.map +1 -0
- package/dist/cjs/interop/ejson.js +182 -0
- package/dist/cjs/interop/ejson.js.map +1 -0
- package/dist/cjs/interop/export-import.d.ts +98 -0
- package/dist/cjs/interop/export-import.d.ts.map +1 -0
- package/dist/cjs/interop/export-import.js +222 -0
- package/dist/cjs/interop/export-import.js.map +1 -0
- package/dist/cjs/model/document.d.ts +66 -0
- package/dist/cjs/model/document.d.ts.map +1 -0
- package/dist/cjs/model/document.js +302 -0
- package/dist/cjs/model/document.js.map +1 -0
- package/dist/cjs/model/model.d.ts +178 -0
- package/dist/cjs/model/model.d.ts.map +1 -0
- package/dist/cjs/model/model.js +823 -0
- package/dist/cjs/model/model.js.map +1 -0
- package/dist/cjs/package.json +3 -0
- package/dist/cjs/query/aggregation/expressions.d.ts +34 -0
- package/dist/cjs/query/aggregation/expressions.d.ts.map +1 -0
- package/dist/cjs/query/aggregation/expressions.js +552 -0
- package/dist/cjs/query/aggregation/expressions.js.map +1 -0
- package/dist/cjs/query/aggregation/pipeline.d.ts +79 -0
- package/dist/cjs/query/aggregation/pipeline.d.ts.map +1 -0
- package/dist/cjs/query/aggregation/pipeline.js +597 -0
- package/dist/cjs/query/aggregation/pipeline.js.map +1 -0
- package/dist/cjs/query/aggregation/source.d.ts +35 -0
- package/dist/cjs/query/aggregation/source.d.ts.map +1 -0
- package/dist/cjs/query/aggregation/source.js +81 -0
- package/dist/cjs/query/aggregation/source.js.map +1 -0
- package/dist/cjs/query/builder/query.d.ts +113 -0
- package/dist/cjs/query/builder/query.d.ts.map +1 -0
- package/dist/cjs/query/builder/query.js +215 -0
- package/dist/cjs/query/builder/query.js.map +1 -0
- package/dist/cjs/query/filter.d.ts +50 -0
- package/dist/cjs/query/filter.d.ts.map +1 -0
- package/dist/cjs/query/filter.js +275 -0
- package/dist/cjs/query/filter.js.map +1 -0
- package/dist/cjs/query/path.d.ts +41 -0
- package/dist/cjs/query/path.d.ts.map +1 -0
- package/dist/cjs/query/path.js +294 -0
- package/dist/cjs/query/path.js.map +1 -0
- package/dist/cjs/query/update.d.ts +30 -0
- package/dist/cjs/query/update.d.ts.map +1 -0
- package/dist/cjs/query/update.js +205 -0
- package/dist/cjs/query/update.js.map +1 -0
- package/dist/cjs/reactive/live-query.d.ts +41 -0
- package/dist/cjs/reactive/live-query.d.ts.map +1 -0
- package/dist/cjs/reactive/live-query.js +88 -0
- package/dist/cjs/reactive/live-query.js.map +1 -0
- package/dist/cjs/schema/cast.d.ts +38 -0
- package/dist/cjs/schema/cast.d.ts.map +1 -0
- package/dist/cjs/schema/cast.js +280 -0
- package/dist/cjs/schema/cast.js.map +1 -0
- package/dist/cjs/schema/index.d.ts +5 -0
- package/dist/cjs/schema/index.d.ts.map +1 -0
- package/dist/cjs/schema/index.js +27 -0
- package/dist/cjs/schema/index.js.map +1 -0
- package/dist/cjs/schema/schema.d.ts +58 -0
- package/dist/cjs/schema/schema.d.ts.map +1 -0
- package/dist/cjs/schema/schema.js +363 -0
- package/dist/cjs/schema/schema.js.map +1 -0
- package/dist/cjs/schema/types.d.ts +144 -0
- package/dist/cjs/schema/types.d.ts.map +1 -0
- package/dist/cjs/schema/types.js +20 -0
- package/dist/cjs/schema/types.js.map +1 -0
- package/dist/cjs/schema/validate.d.ts +15 -0
- package/dist/cjs/schema/validate.d.ts.map +1 -0
- package/dist/cjs/schema/validate.js +101 -0
- package/dist/cjs/schema/validate.js.map +1 -0
- package/dist/cjs/storage/adapters/capacitor-sqlite.d.ts +67 -0
- package/dist/cjs/storage/adapters/capacitor-sqlite.d.ts.map +1 -0
- package/dist/cjs/storage/adapters/capacitor-sqlite.js +69 -0
- package/dist/cjs/storage/adapters/capacitor-sqlite.js.map +1 -0
- package/dist/cjs/storage/adapters/expo-sqlite.d.ts +55 -0
- package/dist/cjs/storage/adapters/expo-sqlite.d.ts.map +1 -0
- package/dist/cjs/storage/adapters/expo-sqlite.js +53 -0
- package/dist/cjs/storage/adapters/expo-sqlite.js.map +1 -0
- package/dist/cjs/storage/adapters/indexeddb.d.ts +55 -0
- package/dist/cjs/storage/adapters/indexeddb.d.ts.map +1 -0
- package/dist/cjs/storage/adapters/indexeddb.js +393 -0
- package/dist/cjs/storage/adapters/indexeddb.js.map +1 -0
- package/dist/cjs/storage/adapters/memory.d.ts +44 -0
- package/dist/cjs/storage/adapters/memory.d.ts.map +1 -0
- package/dist/cjs/storage/adapters/memory.js +286 -0
- package/dist/cjs/storage/adapters/memory.js.map +1 -0
- package/dist/cjs/storage/adapters/node-sqlite.d.ts +59 -0
- package/dist/cjs/storage/adapters/node-sqlite.d.ts.map +1 -0
- package/dist/cjs/storage/adapters/node-sqlite.js +457 -0
- package/dist/cjs/storage/adapters/node-sqlite.js.map +1 -0
- package/dist/cjs/storage/adapters/sql-base.d.ts +84 -0
- package/dist/cjs/storage/adapters/sql-base.d.ts.map +1 -0
- package/dist/cjs/storage/adapters/sql-base.js +393 -0
- package/dist/cjs/storage/adapters/sql-base.js.map +1 -0
- package/dist/cjs/storage/types.d.ts +131 -0
- package/dist/cjs/storage/types.d.ts.map +1 -0
- package/dist/cjs/storage/types.js +3 -0
- package/dist/cjs/storage/types.js.map +1 -0
- package/dist/cjs/sync/adapters/rest.d.ts +31 -0
- package/dist/cjs/sync/adapters/rest.d.ts.map +1 -0
- package/dist/cjs/sync/adapters/rest.js +75 -0
- package/dist/cjs/sync/adapters/rest.js.map +1 -0
- package/dist/cjs/sync/attach.d.ts +30 -0
- package/dist/cjs/sync/attach.d.ts.map +1 -0
- package/dist/cjs/sync/attach.js +104 -0
- package/dist/cjs/sync/attach.js.map +1 -0
- package/dist/cjs/sync/engine.d.ts +96 -0
- package/dist/cjs/sync/engine.d.ts.map +1 -0
- package/dist/cjs/sync/engine.js +491 -0
- package/dist/cjs/sync/engine.js.map +1 -0
- package/dist/cjs/sync/protocol.d.ts +128 -0
- package/dist/cjs/sync/protocol.d.ts.map +1 -0
- package/dist/cjs/sync/protocol.js +38 -0
- package/dist/cjs/sync/protocol.js.map +1 -0
- package/dist/cjs/sync/queue.d.ts +77 -0
- package/dist/cjs/sync/queue.d.ts.map +1 -0
- package/dist/cjs/sync/queue.js +245 -0
- package/dist/cjs/sync/queue.js.map +1 -0
- package/dist/cjs/sync/server/memory-server.d.ts +65 -0
- package/dist/cjs/sync/server/memory-server.d.ts.map +1 -0
- package/dist/cjs/sync/server/memory-server.js +193 -0
- package/dist/cjs/sync/server/memory-server.js.map +1 -0
- package/dist/cjs/timestamps/index.d.ts +47 -0
- package/dist/cjs/timestamps/index.d.ts.map +1 -0
- package/dist/cjs/timestamps/index.js +88 -0
- package/dist/cjs/timestamps/index.js.map +1 -0
- package/dist/cjs/timestamps/timezone.d.ts +65 -0
- package/dist/cjs/timestamps/timezone.d.ts.map +1 -0
- package/dist/cjs/timestamps/timezone.js +208 -0
- package/dist/cjs/timestamps/timezone.js.map +1 -0
- package/dist/esm/conflict/strategies.d.ts +110 -0
- package/dist/esm/conflict/strategies.d.ts.map +1 -0
- package/dist/esm/conflict/strategies.js +289 -0
- package/dist/esm/conflict/strategies.js.map +1 -0
- package/dist/esm/conflict/types.d.ts +38 -0
- package/dist/esm/conflict/types.d.ts.map +1 -0
- package/dist/esm/conflict/types.js +2 -0
- package/dist/esm/conflict/types.js.map +1 -0
- package/dist/esm/core/anchor-db.d.ts +154 -0
- package/dist/esm/core/anchor-db.d.ts.map +1 -0
- package/dist/esm/core/anchor-db.js +269 -0
- package/dist/esm/core/anchor-db.js.map +1 -0
- package/dist/esm/core/errors.d.ts +125 -0
- package/dist/esm/core/errors.d.ts.map +1 -0
- package/dist/esm/core/errors.js +161 -0
- package/dist/esm/core/errors.js.map +1 -0
- package/dist/esm/core/hex.d.ts +4 -0
- package/dist/esm/core/hex.d.ts.map +1 -0
- package/dist/esm/core/hex.js +37 -0
- package/dist/esm/core/hex.js.map +1 -0
- package/dist/esm/core/hlc.d.ts +96 -0
- package/dist/esm/core/hlc.d.ts.map +1 -0
- package/dist/esm/core/hlc.js +153 -0
- package/dist/esm/core/hlc.js.map +1 -0
- package/dist/esm/core/object-id.d.ts +38 -0
- package/dist/esm/core/object-id.d.ts.map +1 -0
- package/dist/esm/core/object-id.js +163 -0
- package/dist/esm/core/object-id.js.map +1 -0
- package/dist/esm/core/random.d.ts +6 -0
- package/dist/esm/core/random.d.ts.map +1 -0
- package/dist/esm/core/random.js +34 -0
- package/dist/esm/core/random.js.map +1 -0
- package/dist/esm/core/runtime.d.ts +96 -0
- package/dist/esm/core/runtime.d.ts.map +1 -0
- package/dist/esm/core/runtime.js +2 -0
- package/dist/esm/core/runtime.js.map +1 -0
- package/dist/esm/core/uuid.d.ts +16 -0
- package/dist/esm/core/uuid.d.ts.map +1 -0
- package/dist/esm/core/uuid.js +33 -0
- package/dist/esm/core/uuid.js.map +1 -0
- package/dist/esm/decorators/index.d.ts +48 -0
- package/dist/esm/decorators/index.d.ts.map +1 -0
- package/dist/esm/decorators/index.js +286 -0
- package/dist/esm/decorators/index.js.map +1 -0
- package/dist/esm/events/emitter.d.ts +16 -0
- package/dist/esm/events/emitter.d.ts.map +1 -0
- package/dist/esm/events/emitter.js +52 -0
- package/dist/esm/events/emitter.js.map +1 -0
- package/dist/esm/index/keys.d.ts +79 -0
- package/dist/esm/index/keys.d.ts.map +1 -0
- package/dist/esm/index/keys.js +198 -0
- package/dist/esm/index/keys.js.map +1 -0
- package/dist/esm/index.d.ts +81 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +59 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/inspector/agent.d.ts +75 -0
- package/dist/esm/inspector/agent.d.ts.map +1 -0
- package/dist/esm/inspector/agent.js +482 -0
- package/dist/esm/inspector/agent.js.map +1 -0
- package/dist/esm/inspector/auth.d.ts +49 -0
- package/dist/esm/inspector/auth.d.ts.map +1 -0
- package/dist/esm/inspector/auth.js +228 -0
- package/dist/esm/inspector/auth.js.map +1 -0
- package/dist/esm/inspector/bridge.d.ts +141 -0
- package/dist/esm/inspector/bridge.d.ts.map +1 -0
- package/dist/esm/inspector/bridge.js +182 -0
- package/dist/esm/inspector/bridge.js.map +1 -0
- package/dist/esm/inspector/client.d.ts +111 -0
- package/dist/esm/inspector/client.d.ts.map +1 -0
- package/dist/esm/inspector/client.js +213 -0
- package/dist/esm/inspector/client.js.map +1 -0
- package/dist/esm/inspector/protocol.d.ts +160 -0
- package/dist/esm/inspector/protocol.d.ts.map +1 -0
- package/dist/esm/inspector/protocol.js +43 -0
- package/dist/esm/inspector/protocol.js.map +1 -0
- package/dist/esm/inspector/transports/in-process.d.ts +7 -0
- package/dist/esm/inspector/transports/in-process.d.ts.map +1 -0
- package/dist/esm/inspector/transports/in-process.js +55 -0
- package/dist/esm/inspector/transports/in-process.js.map +1 -0
- package/dist/esm/inspector/transports/websocket.d.ts +39 -0
- package/dist/esm/inspector/transports/websocket.d.ts.map +1 -0
- package/dist/esm/inspector/transports/websocket.js +56 -0
- package/dist/esm/inspector/transports/websocket.js.map +1 -0
- package/dist/esm/interop/csv.d.ts +53 -0
- package/dist/esm/interop/csv.d.ts.map +1 -0
- package/dist/esm/interop/csv.js +222 -0
- package/dist/esm/interop/csv.js.map +1 -0
- package/dist/esm/interop/ejson.d.ts +41 -0
- package/dist/esm/interop/ejson.d.ts.map +1 -0
- package/dist/esm/interop/ejson.js +176 -0
- package/dist/esm/interop/ejson.js.map +1 -0
- package/dist/esm/interop/export-import.d.ts +98 -0
- package/dist/esm/interop/export-import.d.ts.map +1 -0
- package/dist/esm/interop/export-import.js +210 -0
- package/dist/esm/interop/export-import.js.map +1 -0
- package/dist/esm/model/document.d.ts +66 -0
- package/dist/esm/model/document.d.ts.map +1 -0
- package/dist/esm/model/document.js +297 -0
- package/dist/esm/model/document.js.map +1 -0
- package/dist/esm/model/model.d.ts +178 -0
- package/dist/esm/model/model.d.ts.map +1 -0
- package/dist/esm/model/model.js +815 -0
- package/dist/esm/model/model.js.map +1 -0
- package/dist/esm/package.json +3 -0
- package/dist/esm/query/aggregation/expressions.d.ts +34 -0
- package/dist/esm/query/aggregation/expressions.d.ts.map +1 -0
- package/dist/esm/query/aggregation/expressions.js +545 -0
- package/dist/esm/query/aggregation/expressions.js.map +1 -0
- package/dist/esm/query/aggregation/pipeline.d.ts +79 -0
- package/dist/esm/query/aggregation/pipeline.d.ts.map +1 -0
- package/dist/esm/query/aggregation/pipeline.js +591 -0
- package/dist/esm/query/aggregation/pipeline.js.map +1 -0
- package/dist/esm/query/aggregation/source.d.ts +35 -0
- package/dist/esm/query/aggregation/source.d.ts.map +1 -0
- package/dist/esm/query/aggregation/source.js +77 -0
- package/dist/esm/query/aggregation/source.js.map +1 -0
- package/dist/esm/query/builder/query.d.ts +113 -0
- package/dist/esm/query/builder/query.d.ts.map +1 -0
- package/dist/esm/query/builder/query.js +209 -0
- package/dist/esm/query/builder/query.js.map +1 -0
- package/dist/esm/query/filter.d.ts +50 -0
- package/dist/esm/query/filter.d.ts.map +1 -0
- package/dist/esm/query/filter.js +267 -0
- package/dist/esm/query/filter.js.map +1 -0
- package/dist/esm/query/path.d.ts +41 -0
- package/dist/esm/query/path.d.ts.map +1 -0
- package/dist/esm/query/path.js +282 -0
- package/dist/esm/query/path.js.map +1 -0
- package/dist/esm/query/update.d.ts +30 -0
- package/dist/esm/query/update.d.ts.map +1 -0
- package/dist/esm/query/update.js +198 -0
- package/dist/esm/query/update.js.map +1 -0
- package/dist/esm/reactive/live-query.d.ts +41 -0
- package/dist/esm/reactive/live-query.d.ts.map +1 -0
- package/dist/esm/reactive/live-query.js +83 -0
- package/dist/esm/reactive/live-query.js.map +1 -0
- package/dist/esm/schema/cast.d.ts +38 -0
- package/dist/esm/schema/cast.d.ts.map +1 -0
- package/dist/esm/schema/cast.js +275 -0
- package/dist/esm/schema/cast.js.map +1 -0
- package/dist/esm/schema/index.d.ts +5 -0
- package/dist/esm/schema/index.d.ts.map +1 -0
- package/dist/esm/schema/index.js +5 -0
- package/dist/esm/schema/index.js.map +1 -0
- package/dist/esm/schema/schema.d.ts +58 -0
- package/dist/esm/schema/schema.d.ts.map +1 -0
- package/dist/esm/schema/schema.js +358 -0
- package/dist/esm/schema/schema.js.map +1 -0
- package/dist/esm/schema/types.d.ts +144 -0
- package/dist/esm/schema/types.d.ts.map +1 -0
- package/dist/esm/schema/types.js +17 -0
- package/dist/esm/schema/types.js.map +1 -0
- package/dist/esm/schema/validate.d.ts +15 -0
- package/dist/esm/schema/validate.d.ts.map +1 -0
- package/dist/esm/schema/validate.js +98 -0
- package/dist/esm/schema/validate.js.map +1 -0
- package/dist/esm/storage/adapters/capacitor-sqlite.d.ts +67 -0
- package/dist/esm/storage/adapters/capacitor-sqlite.d.ts.map +1 -0
- package/dist/esm/storage/adapters/capacitor-sqlite.js +65 -0
- package/dist/esm/storage/adapters/capacitor-sqlite.js.map +1 -0
- package/dist/esm/storage/adapters/expo-sqlite.d.ts +55 -0
- package/dist/esm/storage/adapters/expo-sqlite.d.ts.map +1 -0
- package/dist/esm/storage/adapters/expo-sqlite.js +49 -0
- package/dist/esm/storage/adapters/expo-sqlite.js.map +1 -0
- package/dist/esm/storage/adapters/indexeddb.d.ts +55 -0
- package/dist/esm/storage/adapters/indexeddb.d.ts.map +1 -0
- package/dist/esm/storage/adapters/indexeddb.js +389 -0
- package/dist/esm/storage/adapters/indexeddb.js.map +1 -0
- package/dist/esm/storage/adapters/memory.d.ts +44 -0
- package/dist/esm/storage/adapters/memory.d.ts.map +1 -0
- package/dist/esm/storage/adapters/memory.js +282 -0
- package/dist/esm/storage/adapters/memory.js.map +1 -0
- package/dist/esm/storage/adapters/node-sqlite.d.ts +59 -0
- package/dist/esm/storage/adapters/node-sqlite.d.ts.map +1 -0
- package/dist/esm/storage/adapters/node-sqlite.js +450 -0
- package/dist/esm/storage/adapters/node-sqlite.js.map +1 -0
- package/dist/esm/storage/adapters/sql-base.d.ts +84 -0
- package/dist/esm/storage/adapters/sql-base.d.ts.map +1 -0
- package/dist/esm/storage/adapters/sql-base.js +383 -0
- package/dist/esm/storage/adapters/sql-base.js.map +1 -0
- package/dist/esm/storage/types.d.ts +131 -0
- package/dist/esm/storage/types.d.ts.map +1 -0
- package/dist/esm/storage/types.js +2 -0
- package/dist/esm/storage/types.js.map +1 -0
- package/dist/esm/sync/adapters/rest.d.ts +31 -0
- package/dist/esm/sync/adapters/rest.d.ts.map +1 -0
- package/dist/esm/sync/adapters/rest.js +71 -0
- package/dist/esm/sync/adapters/rest.js.map +1 -0
- package/dist/esm/sync/attach.d.ts +30 -0
- package/dist/esm/sync/attach.d.ts.map +1 -0
- package/dist/esm/sync/attach.js +98 -0
- package/dist/esm/sync/attach.js.map +1 -0
- package/dist/esm/sync/engine.d.ts +96 -0
- package/dist/esm/sync/engine.d.ts.map +1 -0
- package/dist/esm/sync/engine.js +487 -0
- package/dist/esm/sync/engine.js.map +1 -0
- package/dist/esm/sync/protocol.d.ts +128 -0
- package/dist/esm/sync/protocol.d.ts.map +1 -0
- package/dist/esm/sync/protocol.js +33 -0
- package/dist/esm/sync/protocol.js.map +1 -0
- package/dist/esm/sync/queue.d.ts +77 -0
- package/dist/esm/sync/queue.d.ts.map +1 -0
- package/dist/esm/sync/queue.js +241 -0
- package/dist/esm/sync/queue.js.map +1 -0
- package/dist/esm/sync/server/memory-server.d.ts +65 -0
- package/dist/esm/sync/server/memory-server.d.ts.map +1 -0
- package/dist/esm/sync/server/memory-server.js +189 -0
- package/dist/esm/sync/server/memory-server.js.map +1 -0
- package/dist/esm/timestamps/index.d.ts +47 -0
- package/dist/esm/timestamps/index.d.ts.map +1 -0
- package/dist/esm/timestamps/index.js +70 -0
- package/dist/esm/timestamps/index.js.map +1 -0
- package/dist/esm/timestamps/timezone.d.ts +65 -0
- package/dist/esm/timestamps/timezone.d.ts.map +1 -0
- package/dist/esm/timestamps/timezone.js +196 -0
- package/dist/esm/timestamps/timezone.js.map +1 -0
- 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"}
|