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,289 @@
|
|
|
1
|
+
import { compareHlcStamps } from "../core/hlc.js";
|
|
2
|
+
import { deepClone, flattenPaths, getPath, setPath, valuesEqual } from "../query/path.js";
|
|
3
|
+
/**
|
|
4
|
+
* Last write wins — the default.
|
|
5
|
+
*
|
|
6
|
+
* "Latest" is decided by the hybrid logical clock, never by raw device wall-clock strings. The
|
|
7
|
+
* comparison order is documented in SYNC_PROTOCOL.md:
|
|
8
|
+
*
|
|
9
|
+
* 1. HLC physical time (already skew-corrected against the server)
|
|
10
|
+
* 2. HLC logical counter, for writes inside the same millisecond
|
|
11
|
+
* 3. clientId, lexicographically
|
|
12
|
+
*
|
|
13
|
+
* Step 3 is what makes this a *total* order. Without it two devices could produce genuinely equal
|
|
14
|
+
* stamps and the winner would depend on evaluation order — different devices would converge to
|
|
15
|
+
* different documents, which is precisely the failure LWW is supposed to prevent.
|
|
16
|
+
*
|
|
17
|
+
* On an exact tie the server wins, because the server's copy is the one everyone else has already
|
|
18
|
+
* observed; preferring the client would make convergence depend on who pushed last.
|
|
19
|
+
*/
|
|
20
|
+
export class LastWriteWinsStrategy {
|
|
21
|
+
constructor() {
|
|
22
|
+
this.name = "last-write-wins";
|
|
23
|
+
}
|
|
24
|
+
resolve(ctx) {
|
|
25
|
+
const cmp = compareHlcStamps(ctx.localHlc, ctx.remoteHlc);
|
|
26
|
+
if (cmp > 0)
|
|
27
|
+
return { winner: "local", document: ctx.local, pushBack: true };
|
|
28
|
+
return { winner: "remote", document: ctx.remote, pushBack: false };
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Server wins — the local change is discarded and the server's document adopted.
|
|
33
|
+
*
|
|
34
|
+
* `pushBack: false` matters: re-pushing a document the server just gave us would create an endless
|
|
35
|
+
* echo between the two.
|
|
36
|
+
*/
|
|
37
|
+
export class ServerWinsStrategy {
|
|
38
|
+
constructor() {
|
|
39
|
+
this.name = "server-wins";
|
|
40
|
+
}
|
|
41
|
+
resolve(ctx) {
|
|
42
|
+
return { winner: "remote", document: ctx.remote, pushBack: false };
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Client wins — the local change overwrites the server's.
|
|
47
|
+
*
|
|
48
|
+
* The loop hazard is real and is handled by the engine rather than here: the re-push carries
|
|
49
|
+
* `baseVersion = remoteVersion` (the version we just observed), so the server's optimistic check
|
|
50
|
+
* now passes instead of conflicting again forever. The engine also caps `conflictAttempts`.
|
|
51
|
+
*/
|
|
52
|
+
export class ClientWinsStrategy {
|
|
53
|
+
constructor() {
|
|
54
|
+
this.name = "client-wins";
|
|
55
|
+
}
|
|
56
|
+
resolve(ctx) {
|
|
57
|
+
return { winner: "local", document: ctx.local, pushBack: true };
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
const DELETED = Symbol("anchor.field.deleted");
|
|
61
|
+
/**
|
|
62
|
+
* Field-level three-way merge.
|
|
63
|
+
*
|
|
64
|
+
* Compares local and remote against their common ancestor (`base`, the last server-confirmed
|
|
65
|
+
* document kept in the shadow table). Paths only one side touched merge silently; paths both sides
|
|
66
|
+
* touched are a genuine conflict and fall to `fieldPolicy`.
|
|
67
|
+
*
|
|
68
|
+
* Documented edge cases, each with a test:
|
|
69
|
+
*
|
|
70
|
+
* - **No base.** Without an ancestor we cannot tell an edit from an insert, so a merge would be a
|
|
71
|
+
* guess. Falls back to last-write-wins rather than inventing a result.
|
|
72
|
+
* - **Arrays are atomic by default.** Element-wise merging of two concurrently reordered arrays
|
|
73
|
+
* has no correct answer in general. `arrayStrategy: "union-by-id"` opts into merging arrays of
|
|
74
|
+
* objects that carry `_id`/`id`.
|
|
75
|
+
* - **Deleted fields.** "Deleted on one side" is distinguished from "absent on both" by diffing
|
|
76
|
+
* against base — otherwise a deletion would be silently undone by the other side's copy.
|
|
77
|
+
* - **Type changes** (string -> object) are treated as an ordinary same-path conflict.
|
|
78
|
+
* - **Object replacement.** An edit at `a` conflicts with an edit at `a.b`: parent/child overlap is
|
|
79
|
+
* detected explicitly, because treating them as unrelated paths would resurrect a replaced object.
|
|
80
|
+
*/
|
|
81
|
+
export class FieldLevelStrategy {
|
|
82
|
+
constructor(config = {}) {
|
|
83
|
+
this.name = "field-level";
|
|
84
|
+
this.fallback = new LastWriteWinsStrategy();
|
|
85
|
+
this.policy = config.fieldPolicy ?? "lww";
|
|
86
|
+
this.arrayStrategy = config.arrayStrategy ?? "atomic";
|
|
87
|
+
}
|
|
88
|
+
resolve(ctx) {
|
|
89
|
+
if (!ctx.base) {
|
|
90
|
+
// Honest degradation: a "merge" without an ancestor is a guess dressed up as a decision.
|
|
91
|
+
return this.fallback.resolve(ctx);
|
|
92
|
+
}
|
|
93
|
+
const base = ctx.base;
|
|
94
|
+
const local = ctx.local;
|
|
95
|
+
const remote = ctx.remote;
|
|
96
|
+
const localChanges = diff(base, local);
|
|
97
|
+
const remoteChanges = diff(base, remote);
|
|
98
|
+
const merged = deepClone(remote);
|
|
99
|
+
const conflicts = [];
|
|
100
|
+
let tookLocal = false;
|
|
101
|
+
for (const [path, localValue] of localChanges) {
|
|
102
|
+
const remoteValue = remoteChanges.get(path);
|
|
103
|
+
const overlaps = remoteChanges.has(path) || hasAncestorOrDescendant(path, remoteChanges);
|
|
104
|
+
if (!overlaps) {
|
|
105
|
+
// Only the client touched this path — apply it on top of the server document.
|
|
106
|
+
applyChange(merged, path, localValue);
|
|
107
|
+
tookLocal = true;
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
if (remoteChanges.has(path) && valuesEqual(localValue, remoteValue)) {
|
|
111
|
+
continue; // both sides made the same edit; nothing to decide
|
|
112
|
+
}
|
|
113
|
+
conflicts.push(path);
|
|
114
|
+
const decision = this.decide(path, ctx);
|
|
115
|
+
if (decision === "client") {
|
|
116
|
+
applyChange(merged, path, localValue);
|
|
117
|
+
tookLocal = true;
|
|
118
|
+
}
|
|
119
|
+
// "server" needs no action: `merged` started as the remote document.
|
|
120
|
+
}
|
|
121
|
+
if (this.arrayStrategy === "union-by-id") {
|
|
122
|
+
this.mergeArraysById(base, local, remote, merged);
|
|
123
|
+
}
|
|
124
|
+
return {
|
|
125
|
+
winner: tookLocal ? "merged" : "remote",
|
|
126
|
+
document: merged,
|
|
127
|
+
// Only push back when the merge actually contains something the server has not seen.
|
|
128
|
+
pushBack: tookLocal,
|
|
129
|
+
...(conflicts.length > 0 ? { conflictedPaths: conflicts } : {}),
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
decide(path, ctx) {
|
|
133
|
+
const policy = typeof this.policy === "function" ? this.policy(path, ctx) : (this.policy ?? "lww");
|
|
134
|
+
if (policy !== "lww")
|
|
135
|
+
return policy;
|
|
136
|
+
return compareHlcStamps(ctx.localHlc, ctx.remoteHlc) > 0 ? "client" : "server";
|
|
137
|
+
}
|
|
138
|
+
/** Opt-in array merging for arrays of objects with a stable identity. */
|
|
139
|
+
mergeArraysById(base, local, remote, merged) {
|
|
140
|
+
for (const key of new Set([...Object.keys(local), ...Object.keys(remote)])) {
|
|
141
|
+
const l = local[key];
|
|
142
|
+
const r = remote[key];
|
|
143
|
+
if (!Array.isArray(l) || !Array.isArray(r))
|
|
144
|
+
continue;
|
|
145
|
+
if (!l.every(hasIdentity) || !r.every(hasIdentity))
|
|
146
|
+
continue;
|
|
147
|
+
const baseArr = Array.isArray(base[key]) ? base[key] : [];
|
|
148
|
+
const baseIds = new Set(baseArr.map(identityOf));
|
|
149
|
+
const byId = new Map();
|
|
150
|
+
for (const item of r)
|
|
151
|
+
byId.set(identityOf(item), item);
|
|
152
|
+
for (const item of l) {
|
|
153
|
+
const id = identityOf(item);
|
|
154
|
+
// Added locally, or edited locally — local wins for that element.
|
|
155
|
+
if (!baseIds.has(id) || !valuesEqual(item, baseArr.find((b) => identityOf(b) === id))) {
|
|
156
|
+
byId.set(id, item);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
// Removed on either side stays removed.
|
|
160
|
+
const removedLocally = baseArr.filter((b) => !l.some((x) => identityOf(x) === identityOf(b)));
|
|
161
|
+
for (const gone of removedLocally)
|
|
162
|
+
byId.delete(identityOf(gone));
|
|
163
|
+
merged[key] = [...byId.values()];
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Custom resolver.
|
|
169
|
+
*
|
|
170
|
+
* The developer's function may return either a bare document (treated as the resolved value) or a
|
|
171
|
+
* full `Resolution` when it needs to control `pushBack`. A throwing resolver is *not* caught here —
|
|
172
|
+
* the engine parks the mutation and keeps draining the queue, so one bad resolver cannot wedge sync
|
|
173
|
+
* for every other document.
|
|
174
|
+
*/
|
|
175
|
+
export class CustomStrategy {
|
|
176
|
+
constructor(config) {
|
|
177
|
+
this.name = "custom";
|
|
178
|
+
if (!config.resolver) {
|
|
179
|
+
throw new Error('conflictResolution.strategy is "custom" but no `resolver` was provided. ' +
|
|
180
|
+
"Pass resolver: async ({ local, remote, base }) => {...}");
|
|
181
|
+
}
|
|
182
|
+
this.resolver = config.resolver;
|
|
183
|
+
}
|
|
184
|
+
async resolve(ctx) {
|
|
185
|
+
const result = await this.resolver(ctx);
|
|
186
|
+
if (result && typeof result === "object" && "winner" in result && "document" in result) {
|
|
187
|
+
return result;
|
|
188
|
+
}
|
|
189
|
+
const document = result;
|
|
190
|
+
// Infer the winner so events and Lens can report something meaningful.
|
|
191
|
+
const winner = valuesEqual(document, ctx.remote)
|
|
192
|
+
? "remote"
|
|
193
|
+
: valuesEqual(document, ctx.local)
|
|
194
|
+
? "local"
|
|
195
|
+
: "merged";
|
|
196
|
+
return { winner, document, pushBack: winner !== "remote" };
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
/** Registry — open for user-defined strategies (§11). */
|
|
200
|
+
export class ConflictStrategyRegistry {
|
|
201
|
+
constructor(config = {}) {
|
|
202
|
+
this.strategies = new Map();
|
|
203
|
+
this.register(new LastWriteWinsStrategy());
|
|
204
|
+
this.register(new ServerWinsStrategy());
|
|
205
|
+
this.register(new ClientWinsStrategy());
|
|
206
|
+
this.register(new FieldLevelStrategy(config));
|
|
207
|
+
if (config.strategy === "custom" || config.resolver) {
|
|
208
|
+
this.register(new CustomStrategy(config));
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
register(strategy) {
|
|
212
|
+
this.strategies.set(strategy.name, strategy);
|
|
213
|
+
}
|
|
214
|
+
get(name) {
|
|
215
|
+
const found = this.strategies.get(name);
|
|
216
|
+
if (!found) {
|
|
217
|
+
throw new Error(`Unknown conflict strategy "${name}". Available: ${[...this.strategies.keys()].join(", ")}.`);
|
|
218
|
+
}
|
|
219
|
+
return found;
|
|
220
|
+
}
|
|
221
|
+
names() {
|
|
222
|
+
return [...this.strategies.keys()];
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
// ---- diffing helpers -------------------------------------------------------
|
|
226
|
+
/**
|
|
227
|
+
* Leaf-path diff of `next` against `prev`.
|
|
228
|
+
*
|
|
229
|
+
* Deletions are recorded explicitly with a sentinel rather than omitted, because "absent from the
|
|
230
|
+
* diff" and "deleted by this side" must not be confused — conflating them silently undoes deletions.
|
|
231
|
+
*/
|
|
232
|
+
function diff(prev, next) {
|
|
233
|
+
const out = new Map();
|
|
234
|
+
const prevPaths = flattenPaths(prev);
|
|
235
|
+
const nextPaths = flattenPaths(next);
|
|
236
|
+
for (const [path, value] of nextPaths) {
|
|
237
|
+
if (isInternal(path))
|
|
238
|
+
continue;
|
|
239
|
+
if (!prevPaths.has(path) || !valuesEqual(prevPaths.get(path), value))
|
|
240
|
+
out.set(path, value);
|
|
241
|
+
}
|
|
242
|
+
for (const [path] of prevPaths) {
|
|
243
|
+
if (isInternal(path))
|
|
244
|
+
continue;
|
|
245
|
+
if (!nextPaths.has(path))
|
|
246
|
+
out.set(path, DELETED);
|
|
247
|
+
}
|
|
248
|
+
return out;
|
|
249
|
+
}
|
|
250
|
+
/** `updatedAt` and the version key always differ; treating them as edits would conflict every time. */
|
|
251
|
+
function isInternal(path) {
|
|
252
|
+
const head = path.split(".")[0];
|
|
253
|
+
return head === "_id" || head === "updatedAt" || head === "__v" || head === "_sync";
|
|
254
|
+
}
|
|
255
|
+
function applyChange(target, path, value) {
|
|
256
|
+
if (value === DELETED) {
|
|
257
|
+
const parts = path.split(".");
|
|
258
|
+
const last = parts.pop();
|
|
259
|
+
const parent = parts.length ? getPath(target, parts.join(".")) : target;
|
|
260
|
+
if (parent && typeof parent === "object")
|
|
261
|
+
delete parent[last];
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
264
|
+
setPath(target, path, value);
|
|
265
|
+
}
|
|
266
|
+
/** `a` conflicts with `a.b`: replacing an object and editing inside it are not independent. */
|
|
267
|
+
function hasAncestorOrDescendant(path, others) {
|
|
268
|
+
for (const other of others.keys()) {
|
|
269
|
+
if (other === path)
|
|
270
|
+
continue;
|
|
271
|
+
if (other.startsWith(`${path}.`) || path.startsWith(`${other}.`))
|
|
272
|
+
return true;
|
|
273
|
+
}
|
|
274
|
+
return false;
|
|
275
|
+
}
|
|
276
|
+
function hasIdentity(item) {
|
|
277
|
+
return (item !== null &&
|
|
278
|
+
typeof item === "object" &&
|
|
279
|
+
!Array.isArray(item) &&
|
|
280
|
+
(("_id" in item) || ("id" in item)));
|
|
281
|
+
}
|
|
282
|
+
function identityOf(item) {
|
|
283
|
+
if (item === null || typeof item !== "object")
|
|
284
|
+
return item;
|
|
285
|
+
const rec = item;
|
|
286
|
+
return String(rec._id ?? rec.id);
|
|
287
|
+
}
|
|
288
|
+
export { DELETED as FIELD_DELETED };
|
|
289
|
+
//# sourceMappingURL=strategies.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"strategies.js","sourceRoot":"","sources":["../../../src/conflict/strategies.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/** Conflict resolution types. The strategies themselves land in the sync milestone. */
|
|
2
|
+
export type ConflictStrategyName = "last-write-wins" | "server-wins" | "client-wins" | "field-level" | "custom";
|
|
3
|
+
export interface ConflictContext<T = Record<string, unknown>> {
|
|
4
|
+
local: T;
|
|
5
|
+
remote: T;
|
|
6
|
+
base?: T;
|
|
7
|
+
collection: string;
|
|
8
|
+
documentId: string;
|
|
9
|
+
localHlc: string;
|
|
10
|
+
remoteHlc: string;
|
|
11
|
+
localVersion?: number;
|
|
12
|
+
remoteVersion: number;
|
|
13
|
+
localTimestamp?: number;
|
|
14
|
+
remoteTimestamp?: number;
|
|
15
|
+
metadata?: Record<string, unknown>;
|
|
16
|
+
}
|
|
17
|
+
export interface Resolution<T = Record<string, unknown>> {
|
|
18
|
+
winner: "local" | "remote" | "merged";
|
|
19
|
+
document: T;
|
|
20
|
+
/**
|
|
21
|
+
* Whether the resolved document must be pushed back to the server.
|
|
22
|
+
*
|
|
23
|
+
* False whenever the result is the server document unchanged — pushing that back would echo
|
|
24
|
+
* between client and server forever.
|
|
25
|
+
*/
|
|
26
|
+
pushBack: boolean;
|
|
27
|
+
/** Field-level only: paths both sides edited, surfaced for events and the Lens conflict viewer. */
|
|
28
|
+
conflictedPaths?: string[];
|
|
29
|
+
}
|
|
30
|
+
export type ConflictResolver<T = Record<string, unknown>> = (context: ConflictContext<T>) => Promise<T | Resolution<T>> | T | Resolution<T>;
|
|
31
|
+
export type FieldPolicy = "lww" | "server" | "client";
|
|
32
|
+
export interface ConflictResolutionConfig<T = Record<string, unknown>> {
|
|
33
|
+
strategy?: ConflictStrategyName;
|
|
34
|
+
resolver?: ConflictResolver<T>;
|
|
35
|
+
fieldPolicy?: FieldPolicy | ((path: string, ctx: ConflictContext<T>) => FieldPolicy);
|
|
36
|
+
arrayStrategy?: "atomic" | "union-by-id";
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/conflict/types.ts"],"names":[],"mappings":"AAAA,uFAAuF;AACvF,MAAM,MAAM,oBAAoB,GAC5B,iBAAiB,GACjB,aAAa,GACb,aAAa,GACb,aAAa,GACb,QAAQ,CAAC;AAEb,MAAM,WAAW,eAAe,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC1D,KAAK,EAAE,CAAC,CAAC;IACT,MAAM,EAAE,CAAC,CAAC;IACV,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,UAAU,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACrD,MAAM,EAAE,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAC;IACtC,QAAQ,EAAE,CAAC,CAAC;IACZ;;;;;OAKG;IACH,QAAQ,EAAE,OAAO,CAAC;IAClB,mGAAmG;IACnG,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED,MAAM,MAAM,gBAAgB,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAC1D,OAAO,EAAE,eAAe,CAAC,CAAC,CAAC,KACxB,OAAO,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;AAEpD,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAEtD,MAAM,WAAW,wBAAwB,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACnE,QAAQ,CAAC,EAAE,oBAAoB,CAAC;IAChC,QAAQ,CAAC,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC;IAC/B,WAAW,CAAC,EAAE,WAAW,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,eAAe,CAAC,CAAC,CAAC,KAAK,WAAW,CAAC,CAAC;IACrF,aAAa,CAAC,EAAE,QAAQ,GAAG,aAAa,CAAC;CAC1C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/conflict/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { HybridLogicalClock } from "./hlc.js";
|
|
2
|
+
import { TypedEmitter } from "../events/emitter.js";
|
|
3
|
+
import { TimeService } from "../timestamps/index.js";
|
|
4
|
+
import { Schema } from "../schema/schema.js";
|
|
5
|
+
import { Model } from "../model/model.js";
|
|
6
|
+
import { type ModelConstructor } from "../model/document.js";
|
|
7
|
+
import type { AdapterStats, DatabaseAdapter, WriteOp } from "../storage/types.js";
|
|
8
|
+
import type { AnchorEvents } from "./runtime.js";
|
|
9
|
+
import type { ConflictResolutionConfig } from "../conflict/types.js";
|
|
10
|
+
export type SyncStatus = "disabled" | "idle" | "syncing" | "offline" | "error" | "paused";
|
|
11
|
+
export interface SyncConfig {
|
|
12
|
+
endpoint: string;
|
|
13
|
+
token?: string;
|
|
14
|
+
auth?: {
|
|
15
|
+
token?: string;
|
|
16
|
+
getToken?: () => string | Promise<string>;
|
|
17
|
+
};
|
|
18
|
+
conflictResolution?: ConflictResolutionConfig;
|
|
19
|
+
/** Automatically drain the queue when connectivity returns. */
|
|
20
|
+
autoSync?: boolean;
|
|
21
|
+
intervalMs?: number;
|
|
22
|
+
batchSize?: number;
|
|
23
|
+
maxConflictAttempts?: number;
|
|
24
|
+
}
|
|
25
|
+
export interface InspectorConfig {
|
|
26
|
+
enabled: boolean;
|
|
27
|
+
relayUrl?: string;
|
|
28
|
+
authentication?: {
|
|
29
|
+
mode: "temporary-token";
|
|
30
|
+
ttlSeconds?: number;
|
|
31
|
+
};
|
|
32
|
+
allowInProduction?: boolean;
|
|
33
|
+
}
|
|
34
|
+
export interface AnchorDBConfig {
|
|
35
|
+
name: string;
|
|
36
|
+
adapter?: DatabaseAdapter;
|
|
37
|
+
/** §26.3 — on by default. */
|
|
38
|
+
timestamps?: boolean;
|
|
39
|
+
timezone?: {
|
|
40
|
+
server?: string;
|
|
41
|
+
};
|
|
42
|
+
/** Omit entirely for a purely local database. */
|
|
43
|
+
sync?: SyncConfig;
|
|
44
|
+
inspector?: InspectorConfig;
|
|
45
|
+
/** What populate does when a referenced document is not present locally. */
|
|
46
|
+
onMissingRef?: "null" | "keep-id" | "throw";
|
|
47
|
+
clientId?: string;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* AnchorDB — MongoDB + Mongoose for mobile apps.
|
|
51
|
+
*
|
|
52
|
+
* ## Two modes, one API
|
|
53
|
+
*
|
|
54
|
+
* Passing no `sync` block yields a **purely local database**: no mutation queue is created, no
|
|
55
|
+
* network code is instantiated, deletes are hard deletes rather than tombstones, and documents
|
|
56
|
+
* carry no sync metadata. That is not a degraded mode — it is the default, and an app with no
|
|
57
|
+
* backend never pays for machinery it does not use.
|
|
58
|
+
*
|
|
59
|
+
* Adding a `sync` block later changes no application code. Existing documents are adopted on first
|
|
60
|
+
* sync (seeded dirty at version 0) so nothing has to be rewritten or re-imported.
|
|
61
|
+
*/
|
|
62
|
+
export declare class AnchorDB {
|
|
63
|
+
readonly name: string;
|
|
64
|
+
readonly time: TimeService;
|
|
65
|
+
readonly config: AnchorDBConfig;
|
|
66
|
+
private readonly emitter;
|
|
67
|
+
private readonly models;
|
|
68
|
+
private readonly constructors;
|
|
69
|
+
private readonly clockInstance;
|
|
70
|
+
private readonly adapterInstance;
|
|
71
|
+
private clientIdValue;
|
|
72
|
+
private openPromise;
|
|
73
|
+
private closed;
|
|
74
|
+
/** Installed by the sync engine when sync is configured. */
|
|
75
|
+
private mutationRecorder;
|
|
76
|
+
private syncStatusValue;
|
|
77
|
+
constructor(config: AnchorDBConfig);
|
|
78
|
+
/** True when a `sync` block was supplied. */
|
|
79
|
+
get syncEnabled(): boolean;
|
|
80
|
+
get clientId(): string;
|
|
81
|
+
get adapter(): DatabaseAdapter;
|
|
82
|
+
/** Exposed for the sync engine, which must stamp and advance the same clock the models use. */
|
|
83
|
+
get clock(): HybridLogicalClock;
|
|
84
|
+
/** Opened lazily on first use, so construction never does I/O. */
|
|
85
|
+
open(): Promise<void>;
|
|
86
|
+
close(): Promise<void>;
|
|
87
|
+
/** Mirrors `mongoose.model()`. Calling it again with the same name returns the existing model. */
|
|
88
|
+
model<T extends Record<string, unknown> = Record<string, unknown>>(name: string, schema?: Schema, options?: {
|
|
89
|
+
collection?: string;
|
|
90
|
+
}): ModelConstructor<T>;
|
|
91
|
+
/**
|
|
92
|
+
* Schema-less access, matching the driver's `db.collection("users")`. Useful for scratch work and
|
|
93
|
+
* for Lens, which must browse collections whose schema it does not have.
|
|
94
|
+
*/
|
|
95
|
+
collection<T extends Record<string, unknown> = Record<string, unknown>>(name: string): ModelConstructor<T>;
|
|
96
|
+
/**
|
|
97
|
+
* The model registered for a storage collection, if any.
|
|
98
|
+
*
|
|
99
|
+
* Interop needs it: storage holds ObjectIds and Dates as strings, so an export has to consult the
|
|
100
|
+
* schema to restore their real types before encoding. Without this an export would emit bare
|
|
101
|
+
* strings and mongoimport would store String instead of ObjectId/Date.
|
|
102
|
+
*/
|
|
103
|
+
modelForCollection(collection: string): Model | undefined;
|
|
104
|
+
modelNames(): string[];
|
|
105
|
+
listCollections(): Promise<string[]>;
|
|
106
|
+
stats(): Promise<AdapterStats & {
|
|
107
|
+
name: string;
|
|
108
|
+
syncEnabled: boolean;
|
|
109
|
+
}>;
|
|
110
|
+
/** Deletes all local data. Lens exposes this as an explicit developer action. */
|
|
111
|
+
destroy(): Promise<void>;
|
|
112
|
+
on<K extends keyof AnchorEvents>(event: K, listener: (payload: AnchorEvents[K]) => void): () => void;
|
|
113
|
+
off<K extends keyof AnchorEvents>(event: K, listener: (payload: AnchorEvents[K]) => void): void;
|
|
114
|
+
once<K extends keyof AnchorEvents>(event: K, listener: (payload: AnchorEvents[K]) => void): () => void;
|
|
115
|
+
get events(): TypedEmitter<AnchorEvents>;
|
|
116
|
+
/**
|
|
117
|
+
* Always present, even with no backend, so UI bound to sync state does not have to branch. In
|
|
118
|
+
* local-only mode `status()` reports "disabled" and the actions are explicit no-ops rather than
|
|
119
|
+
* throwing — a dashboard that renders sync state should degrade, not crash.
|
|
120
|
+
*/
|
|
121
|
+
readonly sync: {
|
|
122
|
+
status: () => SyncStatus;
|
|
123
|
+
isEnabled: () => boolean;
|
|
124
|
+
now: () => Promise<{
|
|
125
|
+
pushed: number;
|
|
126
|
+
pulled: number;
|
|
127
|
+
conflicts: number;
|
|
128
|
+
} | null>;
|
|
129
|
+
pending: () => Promise<number>;
|
|
130
|
+
};
|
|
131
|
+
private syncRunner;
|
|
132
|
+
private pendingCounter;
|
|
133
|
+
/** Used by the sync engine to install itself without AnchorDB importing it. */
|
|
134
|
+
_attachSync(hooks: {
|
|
135
|
+
recordMutations: (collection: string, ops: WriteOp[]) => Promise<void>;
|
|
136
|
+
run: () => Promise<{
|
|
137
|
+
pushed: number;
|
|
138
|
+
pulled: number;
|
|
139
|
+
conflicts: number;
|
|
140
|
+
}>;
|
|
141
|
+
pending: () => Promise<number>;
|
|
142
|
+
setStatus: (fn: (status: SyncStatus) => void) => void;
|
|
143
|
+
}): void;
|
|
144
|
+
private runtimeCache;
|
|
145
|
+
private runtime;
|
|
146
|
+
/**
|
|
147
|
+
* The inspector exposes application data, so enabling it in production requires an explicit,
|
|
148
|
+
* separate acknowledgement — a config typo must never open a database over the network.
|
|
149
|
+
*/
|
|
150
|
+
private assertInspectorSafe;
|
|
151
|
+
}
|
|
152
|
+
/** Alias matching the brief's original naming. */
|
|
153
|
+
export declare const LocalDB: typeof AnchorDB;
|
|
154
|
+
//# sourceMappingURL=anchor-db.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anchor-db.d.ts","sourceRoot":"","sources":["../../../src/core/anchor-db.ts"],"names":[],"mappings":"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"}
|