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,228 @@
|
|
|
1
|
+
import { bytesToHex } from "../core/hex.js";
|
|
2
|
+
import { randomBytes } from "../core/random.js";
|
|
3
|
+
/**
|
|
4
|
+
* Inspector pairing and session authentication.
|
|
5
|
+
*
|
|
6
|
+
* ## The threat this addresses
|
|
7
|
+
*
|
|
8
|
+
* An inspector connection exposes the whole local database. The pairing code travels through a QR
|
|
9
|
+
* code or is read aloud, so it is the *least* protected part of the flow — which is exactly why it
|
|
10
|
+
* must never become a long-lived bearer credential.
|
|
11
|
+
*
|
|
12
|
+
* So pairing is challenge–response:
|
|
13
|
+
*
|
|
14
|
+
* agent -> challenge (random, single-use)
|
|
15
|
+
* client -> HMAC(pairingCode, challenge)
|
|
16
|
+
* agent -> verifies, issues a session token, burns the pairing code
|
|
17
|
+
*
|
|
18
|
+
* The code itself is never transmitted. Replaying a captured proof fails because the challenge is
|
|
19
|
+
* consumed on use, and a stolen QR is useless after the short pairing window closes.
|
|
20
|
+
*
|
|
21
|
+
* ## Why HMAC-SHA256 is implemented here
|
|
22
|
+
*
|
|
23
|
+
* `crypto.subtle` is unavailable or async-only on several React Native runtimes, and this must
|
|
24
|
+
* behave identically on device, in Node and in a browser. A self-contained implementation is ~80
|
|
25
|
+
* lines and removes the platform question entirely. It is used only for pairing proofs — never for
|
|
26
|
+
* storing secrets.
|
|
27
|
+
*/
|
|
28
|
+
const K = new Uint32Array([
|
|
29
|
+
0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
|
|
30
|
+
0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
|
|
31
|
+
0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
|
|
32
|
+
0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
|
|
33
|
+
0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
|
|
34
|
+
0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
|
|
35
|
+
0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
|
|
36
|
+
0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2,
|
|
37
|
+
]);
|
|
38
|
+
function sha256(input) {
|
|
39
|
+
const h = new Uint32Array([
|
|
40
|
+
0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19,
|
|
41
|
+
]);
|
|
42
|
+
const bitLength = input.length * 8;
|
|
43
|
+
const paddedLength = (((input.length + 8) >> 6) + 1) << 6;
|
|
44
|
+
const buffer = new Uint8Array(paddedLength);
|
|
45
|
+
buffer.set(input);
|
|
46
|
+
buffer[input.length] = 0x80;
|
|
47
|
+
const view = new DataView(buffer.buffer);
|
|
48
|
+
view.setUint32(paddedLength - 4, bitLength >>> 0, false);
|
|
49
|
+
view.setUint32(paddedLength - 8, Math.floor(bitLength / 2 ** 32), false);
|
|
50
|
+
const w = new Uint32Array(64);
|
|
51
|
+
for (let offset = 0; offset < paddedLength; offset += 64) {
|
|
52
|
+
for (let i = 0; i < 16; i++)
|
|
53
|
+
w[i] = view.getUint32(offset + i * 4, false);
|
|
54
|
+
for (let i = 16; i < 64; i++) {
|
|
55
|
+
const a = w[i - 15];
|
|
56
|
+
const b = w[i - 2];
|
|
57
|
+
const s0 = ((a >>> 7) | (a << 25)) ^ ((a >>> 18) | (a << 14)) ^ (a >>> 3);
|
|
58
|
+
const s1 = ((b >>> 17) | (b << 15)) ^ ((b >>> 19) | (b << 13)) ^ (b >>> 10);
|
|
59
|
+
w[i] = (w[i - 16] + s0 + w[i - 7] + s1) >>> 0;
|
|
60
|
+
}
|
|
61
|
+
let [a, b, c, d, e, f, g, hh] = [h[0], h[1], h[2], h[3], h[4], h[5], h[6], h[7]];
|
|
62
|
+
for (let i = 0; i < 64; i++) {
|
|
63
|
+
const S1 = ((e >>> 6) | (e << 26)) ^ ((e >>> 11) | (e << 21)) ^ ((e >>> 25) | (e << 7));
|
|
64
|
+
const ch = (e & f) ^ (~e & g);
|
|
65
|
+
const temp1 = (hh + S1 + ch + K[i] + w[i]) >>> 0;
|
|
66
|
+
const S0 = ((a >>> 2) | (a << 30)) ^ ((a >>> 13) | (a << 19)) ^ ((a >>> 22) | (a << 10));
|
|
67
|
+
const maj = (a & b) ^ (a & c) ^ (b & c);
|
|
68
|
+
const temp2 = (S0 + maj) >>> 0;
|
|
69
|
+
hh = g;
|
|
70
|
+
g = f;
|
|
71
|
+
f = e;
|
|
72
|
+
e = (d + temp1) >>> 0;
|
|
73
|
+
d = c;
|
|
74
|
+
c = b;
|
|
75
|
+
b = a;
|
|
76
|
+
a = (temp1 + temp2) >>> 0;
|
|
77
|
+
}
|
|
78
|
+
h[0] = (h[0] + a) >>> 0;
|
|
79
|
+
h[1] = (h[1] + b) >>> 0;
|
|
80
|
+
h[2] = (h[2] + c) >>> 0;
|
|
81
|
+
h[3] = (h[3] + d) >>> 0;
|
|
82
|
+
h[4] = (h[4] + e) >>> 0;
|
|
83
|
+
h[5] = (h[5] + f) >>> 0;
|
|
84
|
+
h[6] = (h[6] + g) >>> 0;
|
|
85
|
+
h[7] = (h[7] + hh) >>> 0;
|
|
86
|
+
}
|
|
87
|
+
const out = new Uint8Array(32);
|
|
88
|
+
const outView = new DataView(out.buffer);
|
|
89
|
+
for (let i = 0; i < 8; i++)
|
|
90
|
+
outView.setUint32(i * 4, h[i], false);
|
|
91
|
+
return out;
|
|
92
|
+
}
|
|
93
|
+
function utf8(text) {
|
|
94
|
+
return new TextEncoder().encode(text);
|
|
95
|
+
}
|
|
96
|
+
export function hmacSha256(key, message) {
|
|
97
|
+
const blockSize = 64;
|
|
98
|
+
let keyBytes = utf8(key);
|
|
99
|
+
if (keyBytes.length > blockSize)
|
|
100
|
+
keyBytes = sha256(keyBytes);
|
|
101
|
+
const padded = new Uint8Array(blockSize);
|
|
102
|
+
padded.set(keyBytes);
|
|
103
|
+
const inner = new Uint8Array(blockSize);
|
|
104
|
+
const outer = new Uint8Array(blockSize);
|
|
105
|
+
for (let i = 0; i < blockSize; i++) {
|
|
106
|
+
inner[i] = padded[i] ^ 0x36;
|
|
107
|
+
outer[i] = padded[i] ^ 0x5c;
|
|
108
|
+
}
|
|
109
|
+
const messageBytes = utf8(message);
|
|
110
|
+
const innerInput = new Uint8Array(blockSize + messageBytes.length);
|
|
111
|
+
innerInput.set(inner);
|
|
112
|
+
innerInput.set(messageBytes, blockSize);
|
|
113
|
+
const innerHash = sha256(innerInput);
|
|
114
|
+
const outerInput = new Uint8Array(blockSize + innerHash.length);
|
|
115
|
+
outerInput.set(outer);
|
|
116
|
+
outerInput.set(innerHash, blockSize);
|
|
117
|
+
return bytesToHex(sha256(outerInput));
|
|
118
|
+
}
|
|
119
|
+
/** Constant-time comparison — a length-independent early return would leak the proof by timing. */
|
|
120
|
+
export function timingSafeEqual(a, b) {
|
|
121
|
+
if (a.length !== b.length)
|
|
122
|
+
return false;
|
|
123
|
+
let diff = 0;
|
|
124
|
+
for (let i = 0; i < a.length; i++)
|
|
125
|
+
diff |= a.charCodeAt(i) ^ b.charCodeAt(i);
|
|
126
|
+
return diff === 0;
|
|
127
|
+
}
|
|
128
|
+
export class InspectorAuth {
|
|
129
|
+
constructor(options = {}) {
|
|
130
|
+
this.pairing = null;
|
|
131
|
+
this.sessions = new Map();
|
|
132
|
+
this.opts = {
|
|
133
|
+
pairingTtlMs: options.pairingTtlMs ?? 5 * 60_000,
|
|
134
|
+
sessionTtlMs: options.sessionTtlMs ?? 60 * 60_000,
|
|
135
|
+
disabled: options.disabled ?? false,
|
|
136
|
+
now: options.now ?? (() => Date.now()),
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
get isDisabled() {
|
|
140
|
+
return this.opts.disabled;
|
|
141
|
+
}
|
|
142
|
+
/** Begin a pairing window. Any previous unused code is invalidated. */
|
|
143
|
+
startPairing() {
|
|
144
|
+
const code = formatCode(randomBytes(4));
|
|
145
|
+
const challenge = bytesToHex(randomBytes(16));
|
|
146
|
+
this.pairing = {
|
|
147
|
+
code,
|
|
148
|
+
challenge,
|
|
149
|
+
expiresAt: new Date(this.opts.now() + this.opts.pairingTtlMs).toISOString(),
|
|
150
|
+
};
|
|
151
|
+
return this.pairing;
|
|
152
|
+
}
|
|
153
|
+
/** The challenge a client must sign. Null when no pairing window is open. */
|
|
154
|
+
currentChallenge() {
|
|
155
|
+
if (!this.pairing)
|
|
156
|
+
return null;
|
|
157
|
+
if (Date.parse(this.pairing.expiresAt) <= this.opts.now()) {
|
|
158
|
+
this.pairing = null;
|
|
159
|
+
return null;
|
|
160
|
+
}
|
|
161
|
+
return this.pairing.challenge;
|
|
162
|
+
}
|
|
163
|
+
/** What a client computes from the code it scanned. */
|
|
164
|
+
static proofFor(pairingCode, challenge) {
|
|
165
|
+
return hmacSha256(pairingCode, challenge);
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Verify a proof and issue a session.
|
|
169
|
+
*
|
|
170
|
+
* The pairing code is consumed whether or not the proof was correct, so a captured challenge
|
|
171
|
+
* cannot be brute-forced by replaying against the same window.
|
|
172
|
+
*/
|
|
173
|
+
authenticate(proof, clientName = "Anchor Lens") {
|
|
174
|
+
if (this.opts.disabled)
|
|
175
|
+
return this.issueSession(clientName);
|
|
176
|
+
const pairing = this.pairing;
|
|
177
|
+
if (!pairing || Date.parse(pairing.expiresAt) <= this.opts.now()) {
|
|
178
|
+
this.pairing = null;
|
|
179
|
+
return null;
|
|
180
|
+
}
|
|
181
|
+
this.pairing = null; // single use, success or failure
|
|
182
|
+
const expected = hmacSha256(pairing.code, pairing.challenge);
|
|
183
|
+
if (!timingSafeEqual(expected, proof))
|
|
184
|
+
return null;
|
|
185
|
+
return this.issueSession(clientName);
|
|
186
|
+
}
|
|
187
|
+
issueSession(clientName) {
|
|
188
|
+
const session = {
|
|
189
|
+
token: bytesToHex(randomBytes(24)),
|
|
190
|
+
clientName,
|
|
191
|
+
createdAt: new Date(this.opts.now()).toISOString(),
|
|
192
|
+
expiresAt: new Date(this.opts.now() + this.opts.sessionTtlMs).toISOString(),
|
|
193
|
+
};
|
|
194
|
+
this.sessions.set(session.token, session);
|
|
195
|
+
return session;
|
|
196
|
+
}
|
|
197
|
+
verify(token) {
|
|
198
|
+
if (this.opts.disabled)
|
|
199
|
+
return { token: "disabled", clientName: "in-process", createdAt: "", expiresAt: "" };
|
|
200
|
+
if (!token)
|
|
201
|
+
return null;
|
|
202
|
+
const session = this.sessions.get(token);
|
|
203
|
+
if (!session)
|
|
204
|
+
return null;
|
|
205
|
+
if (Date.parse(session.expiresAt) <= this.opts.now()) {
|
|
206
|
+
this.sessions.delete(token);
|
|
207
|
+
return null;
|
|
208
|
+
}
|
|
209
|
+
return session;
|
|
210
|
+
}
|
|
211
|
+
revoke(token) {
|
|
212
|
+
this.sessions.delete(token);
|
|
213
|
+
}
|
|
214
|
+
activeSessions() {
|
|
215
|
+
const now = this.opts.now();
|
|
216
|
+
for (const [token, session] of this.sessions) {
|
|
217
|
+
if (Date.parse(session.expiresAt) <= now)
|
|
218
|
+
this.sessions.delete(token);
|
|
219
|
+
}
|
|
220
|
+
return [...this.sessions.values()];
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
/** `A3F9-2B71` — short enough to read aloud, 32 bits of entropy inside a 5-minute window. */
|
|
224
|
+
function formatCode(bytes) {
|
|
225
|
+
const hex = bytesToHex(bytes).toUpperCase();
|
|
226
|
+
return `${hex.slice(0, 4)}-${hex.slice(4, 8)}`;
|
|
227
|
+
}
|
|
228
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/inspector/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import type { WebSocketLike } from "./transports/websocket.js";
|
|
2
|
+
/**
|
|
3
|
+
* The MongoDB bridge protocol — moving collections between a device and a real MongoDB.
|
|
4
|
+
*
|
|
5
|
+
* ## Why this exists as a separate channel
|
|
6
|
+
*
|
|
7
|
+
* Anchor Lens cannot talk to MongoDB. The driver needs raw TCP and TLS sockets; React Native has
|
|
8
|
+
* neither without a native module, which is the same reason the inspector needs a relay at all.
|
|
9
|
+
* Lens's own source guard bans importing `mongodb` for exactly this reason.
|
|
10
|
+
*
|
|
11
|
+
* So the driver lives in the relay — an ordinary Node process, already running on the developer's
|
|
12
|
+
* machine, already bound to localhost — and Lens orchestrates the two ends it *can* reach:
|
|
13
|
+
*
|
|
14
|
+
* ```
|
|
15
|
+
* pull: relay reads MongoDB ──Extended JSON──► agent.importCollection()
|
|
16
|
+
* push: agent.exportCollection() ──Extended JSON──► relay writes MongoDB
|
|
17
|
+
* ```
|
|
18
|
+
*
|
|
19
|
+
* The payload is Extended JSON in both directions, so this reuses the interchange format that is
|
|
20
|
+
* already cross-validated against the official `bson` package. Anchor's codec encodes on the Anchor
|
|
21
|
+
* side, MongoDB's own codec decodes on the MongoDB side, and the two are tested to agree — no third
|
|
22
|
+
* interpretation of an ObjectId or a Date is introduced anywhere.
|
|
23
|
+
*
|
|
24
|
+
* This is a **development tool**. The bridge is off unless the relay is started with
|
|
25
|
+
* `--mongo-bridge`, and a connection string is held only for the life of a socket.
|
|
26
|
+
*/
|
|
27
|
+
export declare const BRIDGE_PROTOCOL_VERSION = 1;
|
|
28
|
+
export type BridgeOp = "connect" | "read" | "write" | "disconnect";
|
|
29
|
+
/** How an existing document in the target collection is treated. Mirrors `ImportOptions.mode`. */
|
|
30
|
+
export type BridgeWriteMode = "insert" | "upsert" | "replace";
|
|
31
|
+
export interface BridgeRequest {
|
|
32
|
+
v: number;
|
|
33
|
+
id: string;
|
|
34
|
+
op: BridgeOp;
|
|
35
|
+
/** Present on `connect`. Never logged, never persisted. */
|
|
36
|
+
uri?: string;
|
|
37
|
+
database?: string;
|
|
38
|
+
/** The relay room, used as the bridge's access token. */
|
|
39
|
+
room?: string;
|
|
40
|
+
collection?: string;
|
|
41
|
+
data?: string;
|
|
42
|
+
mode?: BridgeWriteMode;
|
|
43
|
+
}
|
|
44
|
+
export interface BridgeResponse {
|
|
45
|
+
v: number;
|
|
46
|
+
id: string;
|
|
47
|
+
ok: boolean;
|
|
48
|
+
error?: {
|
|
49
|
+
code: BridgeErrorCode;
|
|
50
|
+
message: string;
|
|
51
|
+
};
|
|
52
|
+
result?: unknown;
|
|
53
|
+
/** `read` streams its body: a chunk of newline-delimited Extended JSON. */
|
|
54
|
+
chunk?: string;
|
|
55
|
+
done?: boolean;
|
|
56
|
+
/** Documents sent so far, for progress. */
|
|
57
|
+
sent?: number;
|
|
58
|
+
}
|
|
59
|
+
export type BridgeErrorCode = "disabled" | "unauthorized" | "driver_missing" | "not_connected" | "connect_failed" | "bad_request" | "failed";
|
|
60
|
+
export interface MongoCollectionInfo {
|
|
61
|
+
name: string;
|
|
62
|
+
/** Estimated, from collection metadata — instant, but may lag by a few documents. */
|
|
63
|
+
count: number;
|
|
64
|
+
}
|
|
65
|
+
export interface BridgeConnectResult {
|
|
66
|
+
database: string;
|
|
67
|
+
serverVersion: string;
|
|
68
|
+
collections: MongoCollectionInfo[];
|
|
69
|
+
}
|
|
70
|
+
export interface BridgeWriteResult {
|
|
71
|
+
collection: string;
|
|
72
|
+
inserted: number;
|
|
73
|
+
updated: number;
|
|
74
|
+
skipped: number;
|
|
75
|
+
}
|
|
76
|
+
export interface BridgeReadResult {
|
|
77
|
+
collection: string;
|
|
78
|
+
/** Newline-delimited Extended JSON, ready to hand straight to `importCollection`. */
|
|
79
|
+
data: string;
|
|
80
|
+
count: number;
|
|
81
|
+
}
|
|
82
|
+
export declare class BridgeError extends Error {
|
|
83
|
+
readonly code: BridgeErrorCode;
|
|
84
|
+
constructor(error: {
|
|
85
|
+
code: BridgeErrorCode;
|
|
86
|
+
message: string;
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Hide the password in a connection string.
|
|
91
|
+
*
|
|
92
|
+
* One implementation, used by the relay's logs, the relay's error messages and Lens's display, so a
|
|
93
|
+
* credential cannot leak through the one place that forgot to redact. Anything that is not
|
|
94
|
+
* recognisably a URI is replaced wholesale rather than echoed back — a malformed string is far more
|
|
95
|
+
* likely to be a secret typed into the wrong box than something safe to print.
|
|
96
|
+
*/
|
|
97
|
+
export declare function redactMongoUri(uri: string): string;
|
|
98
|
+
export interface MongoBridgeClientOptions {
|
|
99
|
+
socket: WebSocketLike;
|
|
100
|
+
/** Requests fail rather than hang if the relay stops answering. */
|
|
101
|
+
timeoutMs?: number;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* The Lens half of the bridge.
|
|
105
|
+
*
|
|
106
|
+
* Lives here rather than in the relay package because the relay is a Node program — it imports
|
|
107
|
+
* `node:http` and `ws`, neither of which exists in React Native. Keeping both halves compiled from
|
|
108
|
+
* one definition of the protocol is the same reason `InspectorClient` lives beside `InspectorAgent`.
|
|
109
|
+
*/
|
|
110
|
+
export declare class MongoBridgeClient {
|
|
111
|
+
private readonly socket;
|
|
112
|
+
private readonly timeoutMs;
|
|
113
|
+
private readonly pending;
|
|
114
|
+
/** Frames written before the socket opened, flushed on open rather than lost to the race. */
|
|
115
|
+
private queued;
|
|
116
|
+
private opened;
|
|
117
|
+
constructor(options: MongoBridgeClientOptions);
|
|
118
|
+
private receive;
|
|
119
|
+
private call;
|
|
120
|
+
/** Open a MongoDB connection on the relay and list what is there. */
|
|
121
|
+
connect(uri: string, database: string, room: string): Promise<BridgeConnectResult>;
|
|
122
|
+
/** Read a whole collection as newline-delimited Extended JSON. */
|
|
123
|
+
read(collection: string, onProgress?: (sent: number) => void): Promise<BridgeReadResult>;
|
|
124
|
+
/** Write Extended JSON into a MongoDB collection. */
|
|
125
|
+
write(collection: string, data: string, mode: BridgeWriteMode): Promise<BridgeWriteResult>;
|
|
126
|
+
disconnect(): Promise<{
|
|
127
|
+
closed: boolean;
|
|
128
|
+
}>;
|
|
129
|
+
close(): void;
|
|
130
|
+
}
|
|
131
|
+
/** The URL Lens dials for the bridge, given the relay it is already talking to. */
|
|
132
|
+
export declare function bridgeUrl(host: string, port: number, room: string): string;
|
|
133
|
+
/**
|
|
134
|
+
* The bridge URL for a relay Lens is already connected to.
|
|
135
|
+
*
|
|
136
|
+
* Lens holds the relay address from the QR link, in whatever form it was written — with or without
|
|
137
|
+
* a path, with or without query parameters. Rewriting it here keeps that parsing in one place
|
|
138
|
+
* instead of in the screen.
|
|
139
|
+
*/
|
|
140
|
+
export declare function bridgeUrlFromRelay(relayUrl: string, room: string): string;
|
|
141
|
+
//# sourceMappingURL=bridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bridge.d.ts","sourceRoot":"","sources":["../../../src/inspector/bridge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
import { uuidv7 } from "../core/uuid.js";
|
|
2
|
+
/**
|
|
3
|
+
* The MongoDB bridge protocol — moving collections between a device and a real MongoDB.
|
|
4
|
+
*
|
|
5
|
+
* ## Why this exists as a separate channel
|
|
6
|
+
*
|
|
7
|
+
* Anchor Lens cannot talk to MongoDB. The driver needs raw TCP and TLS sockets; React Native has
|
|
8
|
+
* neither without a native module, which is the same reason the inspector needs a relay at all.
|
|
9
|
+
* Lens's own source guard bans importing `mongodb` for exactly this reason.
|
|
10
|
+
*
|
|
11
|
+
* So the driver lives in the relay — an ordinary Node process, already running on the developer's
|
|
12
|
+
* machine, already bound to localhost — and Lens orchestrates the two ends it *can* reach:
|
|
13
|
+
*
|
|
14
|
+
* ```
|
|
15
|
+
* pull: relay reads MongoDB ──Extended JSON──► agent.importCollection()
|
|
16
|
+
* push: agent.exportCollection() ──Extended JSON──► relay writes MongoDB
|
|
17
|
+
* ```
|
|
18
|
+
*
|
|
19
|
+
* The payload is Extended JSON in both directions, so this reuses the interchange format that is
|
|
20
|
+
* already cross-validated against the official `bson` package. Anchor's codec encodes on the Anchor
|
|
21
|
+
* side, MongoDB's own codec decodes on the MongoDB side, and the two are tested to agree — no third
|
|
22
|
+
* interpretation of an ObjectId or a Date is introduced anywhere.
|
|
23
|
+
*
|
|
24
|
+
* This is a **development tool**. The bridge is off unless the relay is started with
|
|
25
|
+
* `--mongo-bridge`, and a connection string is held only for the life of a socket.
|
|
26
|
+
*/
|
|
27
|
+
export const BRIDGE_PROTOCOL_VERSION = 1;
|
|
28
|
+
export class BridgeError extends Error {
|
|
29
|
+
constructor(error) {
|
|
30
|
+
super(error.message);
|
|
31
|
+
this.code = error.code;
|
|
32
|
+
this.name = "BridgeError";
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Hide the password in a connection string.
|
|
37
|
+
*
|
|
38
|
+
* One implementation, used by the relay's logs, the relay's error messages and Lens's display, so a
|
|
39
|
+
* credential cannot leak through the one place that forgot to redact. Anything that is not
|
|
40
|
+
* recognisably a URI is replaced wholesale rather than echoed back — a malformed string is far more
|
|
41
|
+
* likely to be a secret typed into the wrong box than something safe to print.
|
|
42
|
+
*/
|
|
43
|
+
export function redactMongoUri(uri) {
|
|
44
|
+
const match = /^(mongodb(?:\+srv)?:\/\/)(?:[^@/]*@)?([^/?]*)(.*)$/.exec(uri.trim());
|
|
45
|
+
if (!match)
|
|
46
|
+
return "<redacted>";
|
|
47
|
+
const [, scheme, hostPart, rest] = match;
|
|
48
|
+
const hadCredentials = /^mongodb(?:\+srv)?:\/\/[^@/]*@/.test(uri.trim());
|
|
49
|
+
const path = (rest ?? "").split("?")[0] ?? "";
|
|
50
|
+
return `${scheme}${hadCredentials ? "***:***@" : ""}${hostPart}${path}`;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* The Lens half of the bridge.
|
|
54
|
+
*
|
|
55
|
+
* Lives here rather than in the relay package because the relay is a Node program — it imports
|
|
56
|
+
* `node:http` and `ws`, neither of which exists in React Native. Keeping both halves compiled from
|
|
57
|
+
* one definition of the protocol is the same reason `InspectorClient` lives beside `InspectorAgent`.
|
|
58
|
+
*/
|
|
59
|
+
export class MongoBridgeClient {
|
|
60
|
+
constructor(options) {
|
|
61
|
+
this.pending = new Map();
|
|
62
|
+
/** Frames written before the socket opened, flushed on open rather than lost to the race. */
|
|
63
|
+
this.queued = [];
|
|
64
|
+
this.socket = options.socket;
|
|
65
|
+
this.timeoutMs = options.timeoutMs ?? 60_000;
|
|
66
|
+
this.opened = options.socket.readyState === 1;
|
|
67
|
+
this.socket.addEventListener("open", () => {
|
|
68
|
+
this.opened = true;
|
|
69
|
+
for (const frame of this.queued)
|
|
70
|
+
this.socket.send(frame);
|
|
71
|
+
this.queued = [];
|
|
72
|
+
});
|
|
73
|
+
this.socket.addEventListener("message", (event) => {
|
|
74
|
+
let parsed;
|
|
75
|
+
try {
|
|
76
|
+
parsed = JSON.parse(String(event.data));
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
return; // not ours; a malformed frame must not take the socket down
|
|
80
|
+
}
|
|
81
|
+
this.receive(parsed);
|
|
82
|
+
});
|
|
83
|
+
this.socket.addEventListener("close", () => {
|
|
84
|
+
for (const [, entry] of this.pending) {
|
|
85
|
+
clearTimeout(entry.timer);
|
|
86
|
+
entry.reject(new BridgeError({ code: "failed", message: "The relay connection closed." }));
|
|
87
|
+
}
|
|
88
|
+
this.pending.clear();
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
receive(response) {
|
|
92
|
+
const entry = this.pending.get(response.id);
|
|
93
|
+
if (!entry)
|
|
94
|
+
return;
|
|
95
|
+
if (!response.ok) {
|
|
96
|
+
clearTimeout(entry.timer);
|
|
97
|
+
this.pending.delete(response.id);
|
|
98
|
+
entry.reject(new BridgeError(response.error ?? { code: "failed", message: "The bridge reported a failure." }));
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
// A streamed read arrives as many frames; only the last one settles the promise.
|
|
102
|
+
if (response.chunk !== undefined) {
|
|
103
|
+
if (response.chunk !== "")
|
|
104
|
+
entry.chunks.push(response.chunk);
|
|
105
|
+
if (!response.done) {
|
|
106
|
+
// Progress only while there is more to come. The terminal frame repeats the final count,
|
|
107
|
+
// and reporting it again would emit the same number twice.
|
|
108
|
+
if (response.sent !== undefined)
|
|
109
|
+
entry.onProgress?.(response.sent);
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
clearTimeout(entry.timer);
|
|
113
|
+
this.pending.delete(response.id);
|
|
114
|
+
entry.resolve({ ...response.result, data: entry.chunks.join("\n") });
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
clearTimeout(entry.timer);
|
|
118
|
+
this.pending.delete(response.id);
|
|
119
|
+
entry.resolve(response.result);
|
|
120
|
+
}
|
|
121
|
+
call(request, onProgress) {
|
|
122
|
+
const id = uuidv7();
|
|
123
|
+
const frame = { v: BRIDGE_PROTOCOL_VERSION, id, ...request };
|
|
124
|
+
return new Promise((resolve, reject) => {
|
|
125
|
+
const timer = setTimeout(() => {
|
|
126
|
+
this.pending.delete(id);
|
|
127
|
+
reject(new BridgeError({ code: "failed", message: `The bridge did not answer "${request.op}" in time.` }));
|
|
128
|
+
}, this.timeoutMs);
|
|
129
|
+
this.pending.set(id, {
|
|
130
|
+
resolve: resolve,
|
|
131
|
+
reject,
|
|
132
|
+
timer,
|
|
133
|
+
chunks: [],
|
|
134
|
+
...(onProgress ? { onProgress } : {}),
|
|
135
|
+
});
|
|
136
|
+
const encoded = JSON.stringify(frame);
|
|
137
|
+
if (this.opened)
|
|
138
|
+
this.socket.send(encoded);
|
|
139
|
+
else
|
|
140
|
+
this.queued.push(encoded);
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
/** Open a MongoDB connection on the relay and list what is there. */
|
|
144
|
+
connect(uri, database, room) {
|
|
145
|
+
return this.call({ op: "connect", uri, database, room });
|
|
146
|
+
}
|
|
147
|
+
/** Read a whole collection as newline-delimited Extended JSON. */
|
|
148
|
+
read(collection, onProgress) {
|
|
149
|
+
return this.call({ op: "read", collection }, onProgress);
|
|
150
|
+
}
|
|
151
|
+
/** Write Extended JSON into a MongoDB collection. */
|
|
152
|
+
write(collection, data, mode) {
|
|
153
|
+
return this.call({ op: "write", collection, data, mode });
|
|
154
|
+
}
|
|
155
|
+
disconnect() {
|
|
156
|
+
return this.call({ op: "disconnect" });
|
|
157
|
+
}
|
|
158
|
+
close() {
|
|
159
|
+
for (const [, entry] of this.pending)
|
|
160
|
+
clearTimeout(entry.timer);
|
|
161
|
+
this.pending.clear();
|
|
162
|
+
this.socket.close();
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
/** The URL Lens dials for the bridge, given the relay it is already talking to. */
|
|
166
|
+
export function bridgeUrl(host, port, room) {
|
|
167
|
+
return `ws://${host}:${port}/bridge?room=${encodeURIComponent(room)}`;
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* The bridge URL for a relay Lens is already connected to.
|
|
171
|
+
*
|
|
172
|
+
* Lens holds the relay address from the QR link, in whatever form it was written — with or without
|
|
173
|
+
* a path, with or without query parameters. Rewriting it here keeps that parsing in one place
|
|
174
|
+
* instead of in the screen.
|
|
175
|
+
*/
|
|
176
|
+
export function bridgeUrlFromRelay(relayUrl, room) {
|
|
177
|
+
const trimmed = relayUrl.trim().replace(/\/+$/, "");
|
|
178
|
+
const withoutQuery = trimmed.split("?")[0] ?? trimmed;
|
|
179
|
+
const origin = withoutQuery.replace(/\/relay$|\/bridge$/, "");
|
|
180
|
+
return `${origin}/bridge?room=${encodeURIComponent(room)}`;
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=bridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bridge.js","sourceRoot":"","sources":["../../../src/inspector/bridge.ts"],"names":[],"mappings":"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"}
|