@dxos/feed-store 0.6.11 → 0.6.12-main.5cc132e
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/dist/lib/browser/meta.json +1 -1
- package/dist/lib/node-esm/chunk-FUWJLFOB.mjs +494 -0
- package/dist/lib/node-esm/chunk-FUWJLFOB.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +566 -0
- package/dist/lib/node-esm/index.mjs.map +7 -0
- package/dist/lib/node-esm/meta.json +1 -0
- package/dist/lib/node-esm/testing/index.mjs +153 -0
- package/dist/lib/node-esm/testing/index.mjs.map +7 -0
- package/dist/types/src/feed-queue.browser.test.d.ts +2 -0
- package/dist/types/src/feed-queue.browser.test.d.ts.map +1 -0
- package/dist/types/src/feed-store.node.test.d.ts +2 -0
- package/dist/types/src/feed-store.node.test.d.ts.map +1 -0
- package/package.json +21 -19
- package/src/feed-factory.test.ts +1 -1
- package/src/feed-iterator.test.ts +2 -3
- package/src/feed-queue.browser.test.ts +54 -0
- package/src/feed-queue.test.ts +50 -92
- package/src/feed-set-iterator.test.ts +3 -4
- package/src/feed-store.node.test.ts +56 -0
- package/src/feed-store.test.ts +2 -51
- package/src/feed-wrapper.test.ts +3 -7
|
@@ -1 +1 @@
|
|
|
1
|
-
{"inputs":{"inject-globals:@inject-globals":{"bytes":384,"imports":[{"path":"@dxos/node-std/inject-globals","kind":"import-statement","external":true}],"format":"esm"},"packages/common/feed-store/src/feed-wrapper.ts":{"bytes":34421,"imports":[{"path":"@dxos/node-std/util","kind":"import-statement","external":true},{"path":"streamx","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"@inject-globals","kind":"import-statement","external":true}],"format":"esm"},"packages/common/feed-store/src/feed-factory.ts":{"bytes":9251,"imports":[{"path":"lodash.defaultsdeep","kind":"import-statement","external":true},{"path":"@dxos/crypto","kind":"import-statement","external":true},{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"@dxos/hypercore","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"packages/common/feed-store/src/feed-wrapper.ts","kind":"import-statement","original":"./feed-wrapper"},{"path":"@inject-globals","kind":"import-statement","external":true}],"format":"esm"},"packages/common/feed-store/src/feed-queue.ts":{"bytes":19868,"imports":[{"path":"@dxos/node-std/util","kind":"import-statement","external":true},{"path":"streamx","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@inject-globals","kind":"import-statement","external":true}],"format":"esm"},"packages/common/feed-store/src/feed-iterator.ts":{"bytes":10231,"imports":[{"path":"race-as-promised","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"packages/common/feed-store/src/feed-queue.ts","kind":"import-statement","original":"./feed-queue"},{"path":"@inject-globals","kind":"import-statement","external":true}],"format":"esm"},"packages/common/feed-store/src/feed-set-iterator.ts":{"bytes":19960,"imports":[{"path":"@dxos/node-std/util","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/keys","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"packages/common/feed-store/src/feed-iterator.ts","kind":"import-statement","original":"./feed-iterator"},{"path":"packages/common/feed-store/src/feed-queue.ts","kind":"import-statement","original":"./feed-queue"},{"path":"@inject-globals","kind":"import-statement","external":true}],"format":"esm"},"packages/common/feed-store/src/feed-store.ts":{"bytes":12315,"imports":[{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/keys","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"@inject-globals","kind":"import-statement","external":true}],"format":"esm"},"packages/common/feed-store/src/feed-writer.ts":{"bytes":2686,"imports":[{"path":"@inject-globals","kind":"import-statement","external":true}],"format":"esm"},"packages/common/feed-store/src/types.ts":{"bytes":614,"imports":[{"path":"@inject-globals","kind":"import-statement","external":true}],"format":"esm"},"packages/common/feed-store/src/index.ts":{"bytes":1196,"imports":[{"path":"packages/common/feed-store/src/feed-factory.ts","kind":"import-statement","original":"./feed-factory"},{"path":"packages/common/feed-store/src/feed-iterator.ts","kind":"import-statement","original":"./feed-iterator"},{"path":"packages/common/feed-store/src/feed-set-iterator.ts","kind":"import-statement","original":"./feed-set-iterator"},{"path":"packages/common/feed-store/src/feed-queue.ts","kind":"import-statement","original":"./feed-queue"},{"path":"packages/common/feed-store/src/feed-store.ts","kind":"import-statement","original":"./feed-store"},{"path":"packages/common/feed-store/src/feed-wrapper.ts","kind":"import-statement","original":"./feed-wrapper"},{"path":"packages/common/feed-store/src/feed-writer.ts","kind":"import-statement","original":"./feed-writer"},{"path":"packages/common/feed-store/src/types.ts","kind":"import-statement","original":"./types"},{"path":"@inject-globals","kind":"import-statement","external":true}],"format":"esm"},"packages/common/feed-store/src/testing/mocks.ts":{"bytes":3541,"imports":[{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/keys","kind":"import-statement","external":true},{"path":"@inject-globals","kind":"import-statement","external":true}],"format":"esm"},"packages/common/feed-store/src/testing/test-generator.ts":{"bytes":5631,"imports":[{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/hypercore","kind":"import-statement","external":true},{"path":"@dxos/random","kind":"import-statement","external":true},{"path":"@inject-globals","kind":"import-statement","external":true}],"format":"esm"},"packages/common/feed-store/src/testing/test-builder.ts":{"bytes":9730,"imports":[{"path":"@dxos/keyring","kind":"import-statement","external":true},{"path":"@dxos/random-access-storage","kind":"import-statement","external":true},{"path":"packages/common/feed-store/src/testing/test-generator.ts","kind":"import-statement","original":"./test-generator"},{"path":"packages/common/feed-store/src/feed-factory.ts","kind":"import-statement","original":"../feed-factory"},{"path":"packages/common/feed-store/src/feed-store.ts","kind":"import-statement","original":"../feed-store"},{"path":"@inject-globals","kind":"import-statement","external":true}],"format":"esm"},"packages/common/feed-store/src/testing/index.ts":{"bytes":705,"imports":[{"path":"packages/common/feed-store/src/testing/mocks.ts","kind":"import-statement","original":"./mocks"},{"path":"packages/common/feed-store/src/testing/test-builder.ts","kind":"import-statement","original":"./test-builder"},{"path":"packages/common/feed-store/src/testing/test-generator.ts","kind":"import-statement","original":"./test-generator"},{"path":"@inject-globals","kind":"import-statement","external":true}],"format":"esm"}},"outputs":{"packages/common/feed-store/dist/lib/browser/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":24009},"packages/common/feed-store/dist/lib/browser/index.mjs":{"imports":[{"path":"packages/common/feed-store/dist/lib/browser/chunk-QEVMM5RF.mjs","kind":"import-statement"},{"path":"race-as-promised","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/node-std/util","kind":"import-statement","external":true},{"path":"streamx","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/node-std/util","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/keys","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true}],"exports":["AbstractFeedIterator","FeedFactory","FeedIterator","FeedQueue","FeedSetIterator","FeedStore","FeedWrapper","createFeedWriter","defaultFeedSetIteratorOptions","defaultReadStreamOptions","writeMessages"],"entryPoint":"packages/common/feed-store/src/index.ts","inputs":{"packages/common/feed-store/src/index.ts":{"bytesInOutput":0},"packages/common/feed-store/src/feed-iterator.ts":{"bytesInOutput":2802},"packages/common/feed-store/src/feed-queue.ts":{"bytesInOutput":4935},"packages/common/feed-store/src/feed-set-iterator.ts":{"bytesInOutput":4893},"packages/common/feed-store/src/feed-writer.ts":{"bytesInOutput":273}},"bytes":13536},"packages/common/feed-store/dist/lib/browser/testing/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":9599},"packages/common/feed-store/dist/lib/browser/testing/index.mjs":{"imports":[{"path":"packages/common/feed-store/dist/lib/browser/chunk-QEVMM5RF.mjs","kind":"import-statement"},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/keys","kind":"import-statement","external":true},{"path":"@dxos/keyring","kind":"import-statement","external":true},{"path":"@dxos/random-access-storage","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/hypercore","kind":"import-statement","external":true},{"path":"@dxos/random","kind":"import-statement","external":true}],"exports":["MockFeedWriter","TestBuilder","TestGenerator","TestItemBuilder","defaultCodec","defaultTestBlockGenerator","defaultTestGenerator","defaultValueEncoding"],"entryPoint":"packages/common/feed-store/src/testing/index.ts","inputs":{"packages/common/feed-store/src/testing/mocks.ts":{"bytesInOutput":784},"packages/common/feed-store/src/testing/index.ts":{"bytesInOutput":0},"packages/common/feed-store/src/testing/test-builder.ts":{"bytesInOutput":1800},"packages/common/feed-store/src/testing/test-generator.ts":{"bytesInOutput":961}},"bytes":4095},"packages/common/feed-store/dist/lib/browser/chunk-QEVMM5RF.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":26081},"packages/common/feed-store/dist/lib/browser/chunk-QEVMM5RF.mjs":{"imports":[{"path":"@dxos/node-std/inject-globals","kind":"import-statement","external":true},{"path":"@dxos/node-std/util","kind":"import-statement","external":true},{"path":"streamx","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"lodash.defaultsdeep","kind":"import-statement","external":true},{"path":"@dxos/crypto","kind":"import-statement","external":true},{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"@dxos/hypercore","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/keys","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true}],"exports":["Buffer","FeedFactory","FeedStore","FeedWrapper"],"inputs":{"inject-globals:@inject-globals":{"bytesInOutput":79},"packages/common/feed-store/src/feed-wrapper.ts":{"bytesInOutput":8231},"packages/common/feed-store/src/feed-factory.ts":{"bytesInOutput":2015},"packages/common/feed-store/src/feed-store.ts":{"bytesInOutput":3129}},"bytes":13782}}}
|
|
1
|
+
{"inputs":{"inject-globals:@inject-globals":{"bytes":324,"imports":[{"path":"@dxos/node-std/inject-globals","kind":"import-statement","external":true}],"format":"esm"},"packages/common/feed-store/src/feed-wrapper.ts":{"bytes":34421,"imports":[{"path":"@dxos/node-std/util","kind":"import-statement","external":true},{"path":"streamx","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"@inject-globals","kind":"import-statement","external":true}],"format":"esm"},"packages/common/feed-store/src/feed-factory.ts":{"bytes":9251,"imports":[{"path":"lodash.defaultsdeep","kind":"import-statement","external":true},{"path":"@dxos/crypto","kind":"import-statement","external":true},{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"@dxos/hypercore","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"packages/common/feed-store/src/feed-wrapper.ts","kind":"import-statement","original":"./feed-wrapper"},{"path":"@inject-globals","kind":"import-statement","external":true}],"format":"esm"},"packages/common/feed-store/src/feed-queue.ts":{"bytes":19868,"imports":[{"path":"@dxos/node-std/util","kind":"import-statement","external":true},{"path":"streamx","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@inject-globals","kind":"import-statement","external":true}],"format":"esm"},"packages/common/feed-store/src/feed-iterator.ts":{"bytes":10231,"imports":[{"path":"race-as-promised","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"packages/common/feed-store/src/feed-queue.ts","kind":"import-statement","original":"./feed-queue"},{"path":"@inject-globals","kind":"import-statement","external":true}],"format":"esm"},"packages/common/feed-store/src/feed-set-iterator.ts":{"bytes":19960,"imports":[{"path":"@dxos/node-std/util","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/keys","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"packages/common/feed-store/src/feed-iterator.ts","kind":"import-statement","original":"./feed-iterator"},{"path":"packages/common/feed-store/src/feed-queue.ts","kind":"import-statement","original":"./feed-queue"},{"path":"@inject-globals","kind":"import-statement","external":true}],"format":"esm"},"packages/common/feed-store/src/feed-store.ts":{"bytes":12315,"imports":[{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/keys","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"@inject-globals","kind":"import-statement","external":true}],"format":"esm"},"packages/common/feed-store/src/feed-writer.ts":{"bytes":2686,"imports":[{"path":"@inject-globals","kind":"import-statement","external":true}],"format":"esm"},"packages/common/feed-store/src/types.ts":{"bytes":614,"imports":[{"path":"@inject-globals","kind":"import-statement","external":true}],"format":"esm"},"packages/common/feed-store/src/index.ts":{"bytes":1196,"imports":[{"path":"packages/common/feed-store/src/feed-factory.ts","kind":"import-statement","original":"./feed-factory"},{"path":"packages/common/feed-store/src/feed-iterator.ts","kind":"import-statement","original":"./feed-iterator"},{"path":"packages/common/feed-store/src/feed-set-iterator.ts","kind":"import-statement","original":"./feed-set-iterator"},{"path":"packages/common/feed-store/src/feed-queue.ts","kind":"import-statement","original":"./feed-queue"},{"path":"packages/common/feed-store/src/feed-store.ts","kind":"import-statement","original":"./feed-store"},{"path":"packages/common/feed-store/src/feed-wrapper.ts","kind":"import-statement","original":"./feed-wrapper"},{"path":"packages/common/feed-store/src/feed-writer.ts","kind":"import-statement","original":"./feed-writer"},{"path":"packages/common/feed-store/src/types.ts","kind":"import-statement","original":"./types"},{"path":"@inject-globals","kind":"import-statement","external":true}],"format":"esm"},"packages/common/feed-store/src/testing/mocks.ts":{"bytes":3541,"imports":[{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/keys","kind":"import-statement","external":true},{"path":"@inject-globals","kind":"import-statement","external":true}],"format":"esm"},"packages/common/feed-store/src/testing/test-generator.ts":{"bytes":5631,"imports":[{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/hypercore","kind":"import-statement","external":true},{"path":"@dxos/random","kind":"import-statement","external":true},{"path":"@inject-globals","kind":"import-statement","external":true}],"format":"esm"},"packages/common/feed-store/src/testing/test-builder.ts":{"bytes":9730,"imports":[{"path":"@dxos/keyring","kind":"import-statement","external":true},{"path":"@dxos/random-access-storage","kind":"import-statement","external":true},{"path":"packages/common/feed-store/src/testing/test-generator.ts","kind":"import-statement","original":"./test-generator"},{"path":"packages/common/feed-store/src/feed-factory.ts","kind":"import-statement","original":"../feed-factory"},{"path":"packages/common/feed-store/src/feed-store.ts","kind":"import-statement","original":"../feed-store"},{"path":"@inject-globals","kind":"import-statement","external":true}],"format":"esm"},"packages/common/feed-store/src/testing/index.ts":{"bytes":705,"imports":[{"path":"packages/common/feed-store/src/testing/mocks.ts","kind":"import-statement","original":"./mocks"},{"path":"packages/common/feed-store/src/testing/test-builder.ts","kind":"import-statement","original":"./test-builder"},{"path":"packages/common/feed-store/src/testing/test-generator.ts","kind":"import-statement","original":"./test-generator"},{"path":"@inject-globals","kind":"import-statement","external":true}],"format":"esm"}},"outputs":{"packages/common/feed-store/dist/lib/browser/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":24009},"packages/common/feed-store/dist/lib/browser/index.mjs":{"imports":[{"path":"packages/common/feed-store/dist/lib/browser/chunk-QEVMM5RF.mjs","kind":"import-statement"},{"path":"race-as-promised","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/node-std/util","kind":"import-statement","external":true},{"path":"streamx","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/node-std/util","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/keys","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true}],"exports":["AbstractFeedIterator","FeedFactory","FeedIterator","FeedQueue","FeedSetIterator","FeedStore","FeedWrapper","createFeedWriter","defaultFeedSetIteratorOptions","defaultReadStreamOptions","writeMessages"],"entryPoint":"packages/common/feed-store/src/index.ts","inputs":{"packages/common/feed-store/src/index.ts":{"bytesInOutput":0},"packages/common/feed-store/src/feed-iterator.ts":{"bytesInOutput":2802},"packages/common/feed-store/src/feed-queue.ts":{"bytesInOutput":4935},"packages/common/feed-store/src/feed-set-iterator.ts":{"bytesInOutput":4893},"packages/common/feed-store/src/feed-writer.ts":{"bytesInOutput":273}},"bytes":13536},"packages/common/feed-store/dist/lib/browser/testing/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":9599},"packages/common/feed-store/dist/lib/browser/testing/index.mjs":{"imports":[{"path":"packages/common/feed-store/dist/lib/browser/chunk-QEVMM5RF.mjs","kind":"import-statement"},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/keys","kind":"import-statement","external":true},{"path":"@dxos/keyring","kind":"import-statement","external":true},{"path":"@dxos/random-access-storage","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/hypercore","kind":"import-statement","external":true},{"path":"@dxos/random","kind":"import-statement","external":true}],"exports":["MockFeedWriter","TestBuilder","TestGenerator","TestItemBuilder","defaultCodec","defaultTestBlockGenerator","defaultTestGenerator","defaultValueEncoding"],"entryPoint":"packages/common/feed-store/src/testing/index.ts","inputs":{"packages/common/feed-store/src/testing/mocks.ts":{"bytesInOutput":784},"packages/common/feed-store/src/testing/index.ts":{"bytesInOutput":0},"packages/common/feed-store/src/testing/test-builder.ts":{"bytesInOutput":1800},"packages/common/feed-store/src/testing/test-generator.ts":{"bytesInOutput":961}},"bytes":4095},"packages/common/feed-store/dist/lib/browser/chunk-QEVMM5RF.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":26081},"packages/common/feed-store/dist/lib/browser/chunk-QEVMM5RF.mjs":{"imports":[{"path":"@dxos/node-std/inject-globals","kind":"import-statement","external":true},{"path":"@dxos/node-std/util","kind":"import-statement","external":true},{"path":"streamx","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"lodash.defaultsdeep","kind":"import-statement","external":true},{"path":"@dxos/crypto","kind":"import-statement","external":true},{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"@dxos/hypercore","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/debug","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/keys","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true}],"exports":["Buffer","FeedFactory","FeedStore","FeedWrapper"],"inputs":{"inject-globals:@inject-globals":{"bytesInOutput":79},"packages/common/feed-store/src/feed-wrapper.ts":{"bytesInOutput":8231},"packages/common/feed-store/src/feed-factory.ts":{"bytesInOutput":2015},"packages/common/feed-store/src/feed-store.ts":{"bytesInOutput":3129}},"bytes":13782}}}
|
|
@@ -0,0 +1,494 @@
|
|
|
1
|
+
// packages/common/feed-store/src/feed-wrapper.ts
|
|
2
|
+
import { inspect } from "node:util";
|
|
3
|
+
import { Readable, Transform } from "streamx";
|
|
4
|
+
import { Trigger } from "@dxos/async";
|
|
5
|
+
import { inspectObject, StackTrace } from "@dxos/debug";
|
|
6
|
+
import { invariant } from "@dxos/invariant";
|
|
7
|
+
import { log } from "@dxos/log";
|
|
8
|
+
import { arrayToBuffer, createBinder, rangeFromTo } from "@dxos/util";
|
|
9
|
+
var __dxlog_file = "/home/runner/work/dxos/dxos/packages/common/feed-store/src/feed-wrapper.ts";
|
|
10
|
+
var FeedWrapper = class {
|
|
11
|
+
constructor(_hypercore, _key, _storageDirectory) {
|
|
12
|
+
this._hypercore = _hypercore;
|
|
13
|
+
this._key = _key;
|
|
14
|
+
this._storageDirectory = _storageDirectory;
|
|
15
|
+
this._pendingWrites = /* @__PURE__ */ new Set();
|
|
16
|
+
this._binder = createBinder(this._hypercore);
|
|
17
|
+
this._writeLock = new Trigger();
|
|
18
|
+
this._closed = false;
|
|
19
|
+
this.on = this._binder.fn(this._hypercore.on);
|
|
20
|
+
this.off = this._binder.fn(this._hypercore.off);
|
|
21
|
+
this.open = this._binder.async(this._hypercore.open);
|
|
22
|
+
this._close = this._binder.async(this._hypercore.close);
|
|
23
|
+
this.close = async () => {
|
|
24
|
+
if (this._pendingWrites.size) {
|
|
25
|
+
log.warn("Closing feed with pending writes", {
|
|
26
|
+
feed: this._key,
|
|
27
|
+
count: this._pendingWrites.size,
|
|
28
|
+
pendingWrites: Array.from(this._pendingWrites.values()).map((stack) => stack.getStack())
|
|
29
|
+
}, {
|
|
30
|
+
F: __dxlog_file,
|
|
31
|
+
L: 173,
|
|
32
|
+
S: this,
|
|
33
|
+
C: (f, a) => f(...a)
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
this._closed = true;
|
|
37
|
+
await this.flushToDisk();
|
|
38
|
+
await this._close();
|
|
39
|
+
};
|
|
40
|
+
this.has = this._binder.fn(this._hypercore.has);
|
|
41
|
+
this.get = this._binder.async(this._hypercore.get);
|
|
42
|
+
this.append = this._binder.async(this._hypercore.append);
|
|
43
|
+
this.download = this._binder.fn(this._hypercore.download);
|
|
44
|
+
this.undownload = this._binder.fn(this._hypercore.undownload);
|
|
45
|
+
this.setDownloading = this._binder.fn(this._hypercore.setDownloading);
|
|
46
|
+
this.replicate = this._binder.fn(this._hypercore.replicate);
|
|
47
|
+
this.clear = this._binder.async(this._hypercore.clear);
|
|
48
|
+
this.proof = this._binder.async(this._hypercore.proof);
|
|
49
|
+
this.put = this._binder.async(this._hypercore.put);
|
|
50
|
+
this.putBuffer = this._binder.async(this._hypercore._putBuffer);
|
|
51
|
+
invariant(this._hypercore, void 0, {
|
|
52
|
+
F: __dxlog_file,
|
|
53
|
+
L: 37,
|
|
54
|
+
S: this,
|
|
55
|
+
A: [
|
|
56
|
+
"this._hypercore",
|
|
57
|
+
""
|
|
58
|
+
]
|
|
59
|
+
});
|
|
60
|
+
invariant(this._key, void 0, {
|
|
61
|
+
F: __dxlog_file,
|
|
62
|
+
L: 38,
|
|
63
|
+
S: this,
|
|
64
|
+
A: [
|
|
65
|
+
"this._key",
|
|
66
|
+
""
|
|
67
|
+
]
|
|
68
|
+
});
|
|
69
|
+
this._writeLock.wake();
|
|
70
|
+
}
|
|
71
|
+
[inspect.custom]() {
|
|
72
|
+
return inspectObject(this);
|
|
73
|
+
}
|
|
74
|
+
toJSON() {
|
|
75
|
+
return {
|
|
76
|
+
feedKey: this._key,
|
|
77
|
+
length: this.properties.length,
|
|
78
|
+
opened: this.properties.opened,
|
|
79
|
+
closed: this.properties.closed
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
get key() {
|
|
83
|
+
return this._key;
|
|
84
|
+
}
|
|
85
|
+
get core() {
|
|
86
|
+
return this._hypercore;
|
|
87
|
+
}
|
|
88
|
+
// TODO(burdon): Create proxy.
|
|
89
|
+
get properties() {
|
|
90
|
+
return this._hypercore;
|
|
91
|
+
}
|
|
92
|
+
createReadableStream(opts) {
|
|
93
|
+
const self = this;
|
|
94
|
+
const transform = new Transform({
|
|
95
|
+
transform(data, cb) {
|
|
96
|
+
void self._writeLock.wait().then(() => {
|
|
97
|
+
this.push(data);
|
|
98
|
+
cb();
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
const readStream = opts?.batch !== void 0 && opts?.batch > 1 ? new BatchedReadStream(this._hypercore, opts) : this._hypercore.createReadStream(opts);
|
|
103
|
+
readStream.pipe(transform, (err) => {
|
|
104
|
+
});
|
|
105
|
+
return transform;
|
|
106
|
+
}
|
|
107
|
+
createFeedWriter() {
|
|
108
|
+
return {
|
|
109
|
+
write: async (data, { afterWrite } = {}) => {
|
|
110
|
+
log("write", {
|
|
111
|
+
feed: this._key,
|
|
112
|
+
seq: this._hypercore.length,
|
|
113
|
+
data
|
|
114
|
+
}, {
|
|
115
|
+
F: __dxlog_file,
|
|
116
|
+
L: 97,
|
|
117
|
+
S: this,
|
|
118
|
+
C: (f, a) => f(...a)
|
|
119
|
+
});
|
|
120
|
+
invariant(!this._closed, "Feed closed", {
|
|
121
|
+
F: __dxlog_file,
|
|
122
|
+
L: 98,
|
|
123
|
+
S: this,
|
|
124
|
+
A: [
|
|
125
|
+
"!this._closed",
|
|
126
|
+
"'Feed closed'"
|
|
127
|
+
]
|
|
128
|
+
});
|
|
129
|
+
const stackTrace = new StackTrace();
|
|
130
|
+
try {
|
|
131
|
+
this._pendingWrites.add(stackTrace);
|
|
132
|
+
if (this._pendingWrites.size === 1) {
|
|
133
|
+
this._writeLock.reset();
|
|
134
|
+
}
|
|
135
|
+
const receipt = await this.appendWithReceipt(data);
|
|
136
|
+
await this.flushToDisk();
|
|
137
|
+
await afterWrite?.(receipt);
|
|
138
|
+
return receipt;
|
|
139
|
+
} finally {
|
|
140
|
+
this._pendingWrites.delete(stackTrace);
|
|
141
|
+
if (this._pendingWrites.size === 0) {
|
|
142
|
+
this._writeLock.wake();
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
async appendWithReceipt(data) {
|
|
149
|
+
const seq = await this.append(data);
|
|
150
|
+
invariant(seq < this.length, "Invalid seq after write", {
|
|
151
|
+
F: __dxlog_file,
|
|
152
|
+
L: 129,
|
|
153
|
+
S: this,
|
|
154
|
+
A: [
|
|
155
|
+
"seq < this.length",
|
|
156
|
+
"'Invalid seq after write'"
|
|
157
|
+
]
|
|
158
|
+
});
|
|
159
|
+
log("write complete", {
|
|
160
|
+
feed: this._key,
|
|
161
|
+
seq
|
|
162
|
+
}, {
|
|
163
|
+
F: __dxlog_file,
|
|
164
|
+
L: 130,
|
|
165
|
+
S: this,
|
|
166
|
+
C: (f, a) => f(...a)
|
|
167
|
+
});
|
|
168
|
+
const receipt = {
|
|
169
|
+
feedKey: this.key,
|
|
170
|
+
seq
|
|
171
|
+
};
|
|
172
|
+
return receipt;
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Flush pending changes to disk.
|
|
176
|
+
* Calling this is not required unless you want to explicitly wait for data to be written.
|
|
177
|
+
*/
|
|
178
|
+
async flushToDisk() {
|
|
179
|
+
await this._storageDirectory.flush();
|
|
180
|
+
}
|
|
181
|
+
get opened() {
|
|
182
|
+
return this._hypercore.opened;
|
|
183
|
+
}
|
|
184
|
+
get closed() {
|
|
185
|
+
return this._hypercore.closed;
|
|
186
|
+
}
|
|
187
|
+
get readable() {
|
|
188
|
+
return this._hypercore.readable;
|
|
189
|
+
}
|
|
190
|
+
get length() {
|
|
191
|
+
return this._hypercore.length;
|
|
192
|
+
}
|
|
193
|
+
get byteLength() {
|
|
194
|
+
return this._hypercore.byteLength;
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Clear and check for integrity.
|
|
198
|
+
*/
|
|
199
|
+
async safeClear(from, to) {
|
|
200
|
+
invariant(from >= 0 && from < to && to <= this.length, "Invalid range", {
|
|
201
|
+
F: __dxlog_file,
|
|
202
|
+
L: 210,
|
|
203
|
+
S: this,
|
|
204
|
+
A: [
|
|
205
|
+
"from >= 0 && from < to && to <= this.length",
|
|
206
|
+
"'Invalid range'"
|
|
207
|
+
]
|
|
208
|
+
});
|
|
209
|
+
const CHECK_MESSAGES = 20;
|
|
210
|
+
const checkBegin = to;
|
|
211
|
+
const checkEnd = Math.min(checkBegin + CHECK_MESSAGES, this.length);
|
|
212
|
+
const messagesBefore = await Promise.all(rangeFromTo(checkBegin, checkEnd).map((idx) => this.get(idx, {
|
|
213
|
+
valueEncoding: {
|
|
214
|
+
decode: (x) => x
|
|
215
|
+
}
|
|
216
|
+
})));
|
|
217
|
+
await this.clear(from, to);
|
|
218
|
+
const messagesAfter = await Promise.all(rangeFromTo(checkBegin, checkEnd).map((idx) => this.get(idx, {
|
|
219
|
+
valueEncoding: {
|
|
220
|
+
decode: (x) => x
|
|
221
|
+
}
|
|
222
|
+
})));
|
|
223
|
+
for (let i = 0; i < messagesBefore.length; i++) {
|
|
224
|
+
const before = arrayToBuffer(messagesBefore[i]);
|
|
225
|
+
const after = arrayToBuffer(messagesAfter[i]);
|
|
226
|
+
if (!before.equals(after)) {
|
|
227
|
+
throw new Error("Feed corruption on clear. There has likely been a data loss.");
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
};
|
|
232
|
+
var BatchedReadStream = class extends Readable {
|
|
233
|
+
constructor(feed, opts = {}) {
|
|
234
|
+
super({
|
|
235
|
+
objectMode: true
|
|
236
|
+
});
|
|
237
|
+
this._reading = false;
|
|
238
|
+
invariant(opts.live === true, "Only live mode supported", {
|
|
239
|
+
F: __dxlog_file,
|
|
240
|
+
L: 252,
|
|
241
|
+
S: this,
|
|
242
|
+
A: [
|
|
243
|
+
"opts.live === true",
|
|
244
|
+
"'Only live mode supported'"
|
|
245
|
+
]
|
|
246
|
+
});
|
|
247
|
+
invariant(opts.batch !== void 0 && opts.batch > 1, void 0, {
|
|
248
|
+
F: __dxlog_file,
|
|
249
|
+
L: 253,
|
|
250
|
+
S: this,
|
|
251
|
+
A: [
|
|
252
|
+
"opts.batch !== undefined && opts.batch > 1",
|
|
253
|
+
""
|
|
254
|
+
]
|
|
255
|
+
});
|
|
256
|
+
this._feed = feed;
|
|
257
|
+
this._batch = opts.batch;
|
|
258
|
+
this._cursor = opts.start ?? 0;
|
|
259
|
+
}
|
|
260
|
+
_open(cb) {
|
|
261
|
+
this._feed.ready(cb);
|
|
262
|
+
}
|
|
263
|
+
_read(cb) {
|
|
264
|
+
if (this._reading) {
|
|
265
|
+
return;
|
|
266
|
+
}
|
|
267
|
+
if (this._feed.bitfield.total(this._cursor, this._cursor + this._batch) === this._batch) {
|
|
268
|
+
this._batchedRead(cb);
|
|
269
|
+
} else {
|
|
270
|
+
this._nonBatchedRead(cb);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
_nonBatchedRead(cb) {
|
|
274
|
+
this._feed.get(this._cursor, {
|
|
275
|
+
wait: true
|
|
276
|
+
}, (err, data) => {
|
|
277
|
+
if (err) {
|
|
278
|
+
cb(err);
|
|
279
|
+
} else {
|
|
280
|
+
this._cursor++;
|
|
281
|
+
this._reading = false;
|
|
282
|
+
this.push(data);
|
|
283
|
+
cb(null);
|
|
284
|
+
}
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
_batchedRead(cb) {
|
|
288
|
+
this._feed.getBatch(this._cursor, this._cursor + this._batch, {
|
|
289
|
+
wait: true
|
|
290
|
+
}, (err, data) => {
|
|
291
|
+
if (err) {
|
|
292
|
+
cb(err);
|
|
293
|
+
} else {
|
|
294
|
+
this._cursor += data.length;
|
|
295
|
+
this._reading = false;
|
|
296
|
+
for (const item of data) {
|
|
297
|
+
this.push(item);
|
|
298
|
+
}
|
|
299
|
+
cb(null);
|
|
300
|
+
}
|
|
301
|
+
});
|
|
302
|
+
}
|
|
303
|
+
};
|
|
304
|
+
|
|
305
|
+
// packages/common/feed-store/src/feed-factory.ts
|
|
306
|
+
import defaultsDeep from "lodash.defaultsdeep";
|
|
307
|
+
import { subtleCrypto } from "@dxos/crypto";
|
|
308
|
+
import { failUndefined } from "@dxos/debug";
|
|
309
|
+
import { createCrypto, hypercore } from "@dxos/hypercore";
|
|
310
|
+
import { log as log2 } from "@dxos/log";
|
|
311
|
+
var __dxlog_file2 = "/home/runner/work/dxos/dxos/packages/common/feed-store/src/feed-factory.ts";
|
|
312
|
+
var FeedFactory = class {
|
|
313
|
+
constructor({ root, signer, hypercore: hypercore2 }) {
|
|
314
|
+
log2("FeedFactory", {
|
|
315
|
+
options: hypercore2
|
|
316
|
+
}, {
|
|
317
|
+
F: __dxlog_file2,
|
|
318
|
+
L: 43,
|
|
319
|
+
S: this,
|
|
320
|
+
C: (f, a) => f(...a)
|
|
321
|
+
});
|
|
322
|
+
this._root = root ?? failUndefined();
|
|
323
|
+
this._signer = signer;
|
|
324
|
+
this._hypercoreOptions = hypercore2;
|
|
325
|
+
}
|
|
326
|
+
get storageRoot() {
|
|
327
|
+
return this._root;
|
|
328
|
+
}
|
|
329
|
+
async createFeed(publicKey, options) {
|
|
330
|
+
if (options?.writable && !this._signer) {
|
|
331
|
+
throw new Error("Signer required to create writable feeds.");
|
|
332
|
+
}
|
|
333
|
+
if (options?.secretKey) {
|
|
334
|
+
log2.warn("Secret key ignored due to signer.", void 0, {
|
|
335
|
+
F: __dxlog_file2,
|
|
336
|
+
L: 58,
|
|
337
|
+
S: this,
|
|
338
|
+
C: (f, a) => f(...a)
|
|
339
|
+
});
|
|
340
|
+
}
|
|
341
|
+
const key = await subtleCrypto.digest("SHA-256", Buffer.from(publicKey.toHex()));
|
|
342
|
+
const opts = defaultsDeep({}, this._hypercoreOptions, {
|
|
343
|
+
secretKey: this._signer && options?.writable ? Buffer.from("secret") : void 0,
|
|
344
|
+
crypto: this._signer ? createCrypto(this._signer, publicKey) : void 0,
|
|
345
|
+
onwrite: options?.onwrite,
|
|
346
|
+
noiseKeyPair: {}
|
|
347
|
+
}, options);
|
|
348
|
+
const storageDir = this._root.createDirectory(publicKey.toHex());
|
|
349
|
+
const makeStorage = (filename) => {
|
|
350
|
+
const { type, native } = storageDir.getOrCreateFile(filename);
|
|
351
|
+
log2("created", {
|
|
352
|
+
path: `${type}:${this._root.path}/${publicKey.truncate()}/${filename}`
|
|
353
|
+
}, {
|
|
354
|
+
F: __dxlog_file2,
|
|
355
|
+
L: 82,
|
|
356
|
+
S: this,
|
|
357
|
+
C: (f, a) => f(...a)
|
|
358
|
+
});
|
|
359
|
+
return native;
|
|
360
|
+
};
|
|
361
|
+
const core = hypercore(makeStorage, Buffer.from(key), opts);
|
|
362
|
+
return new FeedWrapper(core, publicKey, storageDir);
|
|
363
|
+
}
|
|
364
|
+
};
|
|
365
|
+
|
|
366
|
+
// packages/common/feed-store/src/feed-store.ts
|
|
367
|
+
import { Event, Mutex } from "@dxos/async";
|
|
368
|
+
import { failUndefined as failUndefined2 } from "@dxos/debug";
|
|
369
|
+
import { invariant as invariant2 } from "@dxos/invariant";
|
|
370
|
+
import { PublicKey } from "@dxos/keys";
|
|
371
|
+
import { log as log3 } from "@dxos/log";
|
|
372
|
+
import { ComplexMap, defaultMap } from "@dxos/util";
|
|
373
|
+
var __dxlog_file3 = "/home/runner/work/dxos/dxos/packages/common/feed-store/src/feed-store.ts";
|
|
374
|
+
var FeedStore = class {
|
|
375
|
+
constructor({ factory }) {
|
|
376
|
+
this._feeds = new ComplexMap(PublicKey.hash);
|
|
377
|
+
this._mutexes = new ComplexMap(PublicKey.hash);
|
|
378
|
+
this._closed = false;
|
|
379
|
+
this.feedOpened = new Event();
|
|
380
|
+
this._factory = factory ?? failUndefined2();
|
|
381
|
+
}
|
|
382
|
+
get size() {
|
|
383
|
+
return this._feeds.size;
|
|
384
|
+
}
|
|
385
|
+
get feeds() {
|
|
386
|
+
return Array.from(this._feeds.values());
|
|
387
|
+
}
|
|
388
|
+
/**
|
|
389
|
+
* Get the open feed if it exists.
|
|
390
|
+
*/
|
|
391
|
+
getFeed(publicKey) {
|
|
392
|
+
return this._feeds.get(publicKey);
|
|
393
|
+
}
|
|
394
|
+
/**
|
|
395
|
+
* Gets or opens a feed.
|
|
396
|
+
* The feed is readonly unless a secret key is provided.
|
|
397
|
+
*/
|
|
398
|
+
async openFeed(feedKey, { writable, sparse } = {}) {
|
|
399
|
+
log3("opening feed", {
|
|
400
|
+
feedKey
|
|
401
|
+
}, {
|
|
402
|
+
F: __dxlog_file3,
|
|
403
|
+
L: 55,
|
|
404
|
+
S: this,
|
|
405
|
+
C: (f, a) => f(...a)
|
|
406
|
+
});
|
|
407
|
+
invariant2(feedKey, void 0, {
|
|
408
|
+
F: __dxlog_file3,
|
|
409
|
+
L: 56,
|
|
410
|
+
S: this,
|
|
411
|
+
A: [
|
|
412
|
+
"feedKey",
|
|
413
|
+
""
|
|
414
|
+
]
|
|
415
|
+
});
|
|
416
|
+
invariant2(!this._closed, "Feed store is closed", {
|
|
417
|
+
F: __dxlog_file3,
|
|
418
|
+
L: 57,
|
|
419
|
+
S: this,
|
|
420
|
+
A: [
|
|
421
|
+
"!this._closed",
|
|
422
|
+
"'Feed store is closed'"
|
|
423
|
+
]
|
|
424
|
+
});
|
|
425
|
+
const mutex = defaultMap(this._mutexes, feedKey, () => new Mutex());
|
|
426
|
+
return mutex.executeSynchronized(async () => {
|
|
427
|
+
let feed = this.getFeed(feedKey);
|
|
428
|
+
if (feed) {
|
|
429
|
+
if (writable && !feed.properties.writable) {
|
|
430
|
+
throw new Error(`Read-only feed is already open: ${feedKey.truncate()}`);
|
|
431
|
+
} else if ((sparse ?? false) !== feed.properties.sparse) {
|
|
432
|
+
throw new Error(`Feed already open with different sparse setting: ${feedKey.truncate()} [${sparse} !== ${feed.properties.sparse}]`);
|
|
433
|
+
} else {
|
|
434
|
+
await feed.open();
|
|
435
|
+
return feed;
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
feed = await this._factory.createFeed(feedKey, {
|
|
439
|
+
writable,
|
|
440
|
+
sparse
|
|
441
|
+
});
|
|
442
|
+
this._feeds.set(feed.key, feed);
|
|
443
|
+
await feed.open();
|
|
444
|
+
this.feedOpened.emit(feed);
|
|
445
|
+
log3("opened", {
|
|
446
|
+
feedKey
|
|
447
|
+
}, {
|
|
448
|
+
F: __dxlog_file3,
|
|
449
|
+
L: 85,
|
|
450
|
+
S: this,
|
|
451
|
+
C: (f, a) => f(...a)
|
|
452
|
+
});
|
|
453
|
+
return feed;
|
|
454
|
+
});
|
|
455
|
+
}
|
|
456
|
+
/**
|
|
457
|
+
* Close all feeds.
|
|
458
|
+
*/
|
|
459
|
+
async close() {
|
|
460
|
+
log3("closing...", void 0, {
|
|
461
|
+
F: __dxlog_file3,
|
|
462
|
+
L: 94,
|
|
463
|
+
S: this,
|
|
464
|
+
C: (f, a) => f(...a)
|
|
465
|
+
});
|
|
466
|
+
this._closed = true;
|
|
467
|
+
await Promise.all(Array.from(this._feeds.values()).map(async (feed) => {
|
|
468
|
+
await feed.close();
|
|
469
|
+
invariant2(feed.closed, void 0, {
|
|
470
|
+
F: __dxlog_file3,
|
|
471
|
+
L: 99,
|
|
472
|
+
S: this,
|
|
473
|
+
A: [
|
|
474
|
+
"feed.closed",
|
|
475
|
+
""
|
|
476
|
+
]
|
|
477
|
+
});
|
|
478
|
+
}));
|
|
479
|
+
this._feeds.clear();
|
|
480
|
+
log3("closed", void 0, {
|
|
481
|
+
F: __dxlog_file3,
|
|
482
|
+
L: 108,
|
|
483
|
+
S: this,
|
|
484
|
+
C: (f, a) => f(...a)
|
|
485
|
+
});
|
|
486
|
+
}
|
|
487
|
+
};
|
|
488
|
+
|
|
489
|
+
export {
|
|
490
|
+
FeedWrapper,
|
|
491
|
+
FeedFactory,
|
|
492
|
+
FeedStore
|
|
493
|
+
};
|
|
494
|
+
//# sourceMappingURL=chunk-FUWJLFOB.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/feed-wrapper.ts", "../../../src/feed-factory.ts", "../../../src/feed-store.ts"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2022 DXOS.org\n//\n\nimport type { Proof } from 'hypercore';\nimport { inspect } from 'node:util';\nimport { Readable, Transform } from 'streamx';\n\nimport { Trigger } from '@dxos/async';\nimport { inspectObject, StackTrace } from '@dxos/debug';\nimport type { Hypercore, HypercoreProperties, ReadStreamOptions } from '@dxos/hypercore';\nimport { invariant } from '@dxos/invariant';\nimport { type PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { type Directory } from '@dxos/random-access-storage';\nimport { arrayToBuffer, createBinder, rangeFromTo } from '@dxos/util';\n\nimport { type FeedWriter, type WriteReceipt } from './feed-writer';\n\n/**\n * Async feed wrapper.\n */\nexport class FeedWrapper<T extends {}> {\n private readonly _pendingWrites = new Set<StackTrace>();\n private readonly _binder = createBinder(this._hypercore);\n\n // Pending while writes are happening. Resolves when there are no pending writes.\n private readonly _writeLock = new Trigger();\n\n private _closed = false;\n\n constructor(\n private _hypercore: Hypercore<T>,\n private _key: PublicKey, // TODO(burdon): Required since currently patching the key inside factory.\n private _storageDirectory: Directory,\n ) {\n invariant(this._hypercore);\n invariant(this._key);\n this._writeLock.wake();\n }\n\n [inspect.custom]() {\n return inspectObject(this);\n }\n\n toJSON() {\n return {\n feedKey: this._key,\n length: this.properties.length,\n opened: this.properties.opened,\n closed: this.properties.closed,\n };\n }\n\n get key(): PublicKey {\n return this._key;\n }\n\n get core(): Hypercore<T> {\n return this._hypercore;\n }\n\n // TODO(burdon): Create proxy.\n get properties(): HypercoreProperties {\n return this._hypercore;\n }\n\n createReadableStream(opts?: ReadStreamOptions): Readable {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const self = this;\n const transform = new Transform({\n transform(data: any, cb: (err?: Error | null, data?: any) => void) {\n // Delay until write is complete.\n void self._writeLock.wait().then(() => {\n this.push(data);\n cb();\n });\n },\n });\n const readStream =\n opts?.batch !== undefined && opts?.batch > 1\n ? new BatchedReadStream(this._hypercore, opts)\n : this._hypercore.createReadStream(opts);\n\n readStream.pipe(transform, (err: any) => {\n // Ignore errors.\n // We might get \"Writable stream closed prematurely\" error.\n // Its okay since the pipeline is closed and does not expect more messages.\n });\n\n return transform;\n }\n\n createFeedWriter(): FeedWriter<T> {\n return {\n write: async (data: T, { afterWrite } = {}) => {\n log('write', { feed: this._key, seq: this._hypercore.length, data });\n invariant(!this._closed, 'Feed closed');\n const stackTrace = new StackTrace();\n\n try {\n // Pending writes pause the read stream.\n this._pendingWrites.add(stackTrace);\n if (this._pendingWrites.size === 1) {\n this._writeLock.reset();\n }\n\n const receipt = await this.appendWithReceipt(data);\n\n // TODO(dmaretskyi): Removing this will make user-intiated writes faster but might result in a data-loss.\n await this.flushToDisk();\n\n await afterWrite?.(receipt);\n\n return receipt;\n } finally {\n // Unblock the read stream after the write (and callback) is complete.\n this._pendingWrites.delete(stackTrace);\n if (this._pendingWrites.size === 0) {\n this._writeLock.wake();\n }\n }\n },\n };\n }\n\n async appendWithReceipt(data: T): Promise<WriteReceipt> {\n const seq = await this.append(data);\n invariant(seq < this.length, 'Invalid seq after write');\n log('write complete', { feed: this._key, seq });\n const receipt: WriteReceipt = {\n feedKey: this.key,\n seq,\n };\n return receipt;\n }\n\n /**\n * Flush pending changes to disk.\n * Calling this is not required unless you want to explicitly wait for data to be written.\n */\n async flushToDisk() {\n await this._storageDirectory.flush();\n }\n\n get opened() {\n return this._hypercore.opened;\n }\n\n get closed() {\n return this._hypercore.closed;\n }\n\n get readable() {\n return this._hypercore.readable;\n }\n\n get length() {\n return this._hypercore.length;\n }\n\n get byteLength() {\n return this._hypercore.byteLength;\n }\n\n on = this._binder.fn(this._hypercore.on);\n off = this._binder.fn(this._hypercore.off);\n\n open = this._binder.async(this._hypercore.open);\n private _close = this._binder.async(this._hypercore.close);\n close = async () => {\n if (this._pendingWrites.size) {\n log.warn('Closing feed with pending writes', {\n feed: this._key,\n count: this._pendingWrites.size,\n pendingWrites: Array.from(this._pendingWrites.values()).map((stack) => stack.getStack()),\n });\n }\n this._closed = true;\n await this.flushToDisk();\n await this._close();\n };\n\n has = this._binder.fn(this._hypercore.has) as (start: number, end?: number) => boolean;\n get = this._binder.async(this._hypercore.get);\n append = this._binder.async(this._hypercore.append);\n\n /**\n * Will not resolve if `end` parameter is not specified and the feed is not closed.\n */\n download = this._binder.fn(this._hypercore.download);\n undownload = this._binder.fn(this._hypercore.undownload);\n setDownloading = this._binder.fn(this._hypercore.setDownloading);\n replicate: Hypercore<T>['replicate'] = this._binder.fn(this._hypercore.replicate);\n clear = this._binder.async(this._hypercore.clear) as (start: number, end?: number) => Promise<void>;\n\n proof = this._binder.async(this._hypercore.proof) as (index: number) => Promise<Proof>;\n put = this._binder.async(this._hypercore.put) as (index: number, data: T, proof: Proof) => Promise<void>;\n putBuffer = this._binder.async((this._hypercore as any)._putBuffer) as (\n index: number,\n data: Buffer,\n proof: Proof,\n from: null,\n ) => Promise<void>;\n\n /**\n * Clear and check for integrity.\n */\n async safeClear(from: number, to: number) {\n invariant(from >= 0 && from < to && to <= this.length, 'Invalid range');\n\n const CHECK_MESSAGES = 20;\n const checkBegin = to;\n const checkEnd = Math.min(checkBegin + CHECK_MESSAGES, this.length);\n\n const messagesBefore = await Promise.all(\n rangeFromTo(checkBegin, checkEnd).map((idx) =>\n this.get(idx, {\n valueEncoding: { decode: (x: Uint8Array) => x },\n }),\n ),\n );\n\n await this.clear(from, to);\n\n const messagesAfter = await Promise.all(\n rangeFromTo(checkBegin, checkEnd).map((idx) =>\n this.get(idx, {\n valueEncoding: { decode: (x: Uint8Array) => x },\n }),\n ),\n );\n\n for (let i = 0; i < messagesBefore.length; i++) {\n const before = arrayToBuffer(messagesBefore[i]);\n const after = arrayToBuffer(messagesAfter[i]);\n if (!before.equals(after)) {\n throw new Error('Feed corruption on clear. There has likely been a data loss.');\n }\n }\n }\n}\n\nclass BatchedReadStream extends Readable {\n private readonly _feed: Hypercore<any>;\n private readonly _batch: number;\n private _cursor: number;\n private _reading = false;\n\n constructor(feed: Hypercore<any>, opts: ReadStreamOptions = {}) {\n super({ objectMode: true });\n invariant(opts.live === true, 'Only live mode supported');\n invariant(opts.batch !== undefined && opts.batch > 1);\n this._feed = feed;\n this._batch = opts.batch;\n this._cursor = opts.start ?? 0;\n }\n\n override _open(cb: (err: Error | null) => void): void {\n this._feed.ready(cb);\n }\n\n override _read(cb: (err: Error | null) => void): void {\n if (this._reading) {\n return;\n }\n\n if (this._feed.bitfield!.total(this._cursor, this._cursor + this._batch) === this._batch) {\n this._batchedRead(cb);\n } else {\n this._nonBatchedRead(cb);\n }\n }\n\n private _nonBatchedRead(cb: (err: Error | null) => void) {\n this._feed.get(this._cursor, { wait: true }, (err, data) => {\n if (err) {\n cb(err);\n } else {\n this._cursor++;\n this._reading = false;\n this.push(data);\n cb(null);\n }\n });\n }\n\n private _batchedRead(cb: (err: Error | null) => void) {\n this._feed.getBatch(this._cursor, this._cursor + this._batch, { wait: true }, (err, data) => {\n if (err) {\n cb(err);\n } else {\n this._cursor += data.length;\n this._reading = false;\n for (const item of data) {\n this.push(item);\n }\n cb(null);\n }\n });\n }\n}\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport defaultsDeep from 'lodash.defaultsdeep';\n\nimport { type Signer, subtleCrypto } from '@dxos/crypto';\nimport { failUndefined } from '@dxos/debug';\nimport type { HypercoreOptions } from '@dxos/hypercore';\nimport { createCrypto, hypercore } from '@dxos/hypercore';\nimport { type PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { type Directory } from '@dxos/random-access-storage';\n\nimport { FeedWrapper } from './feed-wrapper';\n\nexport type FeedFactoryOptions = {\n root: Directory;\n signer?: Signer;\n hypercore?: HypercoreOptions;\n};\n\nexport type FeedOptions = HypercoreOptions & {\n writable?: boolean;\n /**\n * Optional hook called before data is written after being verified.\n * Called for writes done by this peer as well as for data replicated from other peers.\n * NOTE: The callback must be invoked to complete the write operation.\n * @param peer Always null in hypercore@9.12.0.\n */\n onwrite?: (index: number, data: any, peer: null, cb: (err: Error | null) => void) => void;\n};\n\n/**\n * Hypercore factory.\n */\nexport class FeedFactory<T extends {}> {\n private readonly _root: Directory;\n private readonly _signer?: Signer;\n private readonly _hypercoreOptions?: HypercoreOptions;\n\n constructor({ root, signer, hypercore }: FeedFactoryOptions) {\n log('FeedFactory', { options: hypercore });\n this._root = root ?? failUndefined();\n this._signer = signer;\n this._hypercoreOptions = hypercore;\n }\n\n get storageRoot() {\n return this._root;\n }\n\n async createFeed(publicKey: PublicKey, options?: FeedOptions): Promise<FeedWrapper<T>> {\n if (options?.writable && !this._signer) {\n throw new Error('Signer required to create writable feeds.');\n }\n if (options?.secretKey) {\n log.warn('Secret key ignored due to signer.');\n }\n\n // Required due to hypercore's 32-byte key limit.\n const key = await subtleCrypto.digest('SHA-256', Buffer.from(publicKey.toHex()));\n\n const opts = defaultsDeep(\n {\n // sparse: false,\n // stats: false,\n },\n this._hypercoreOptions,\n {\n secretKey: this._signer && options?.writable ? Buffer.from('secret') : undefined,\n crypto: this._signer ? createCrypto(this._signer, publicKey) : undefined,\n onwrite: options?.onwrite,\n noiseKeyPair: {}, // We're not using noise.\n },\n options,\n );\n\n const storageDir = this._root.createDirectory(publicKey.toHex());\n const makeStorage = (filename: string) => {\n const { type, native } = storageDir.getOrCreateFile(filename);\n log('created', {\n path: `${type}:${this._root.path}/${publicKey.truncate()}/${filename}`,\n });\n\n return native;\n };\n\n const core = hypercore(makeStorage, Buffer.from(key), opts);\n return new FeedWrapper(core, publicKey, storageDir);\n }\n}\n", "//\n// Copyright 2019 DXOS.org\n//\n\nimport { Event, Mutex } from '@dxos/async';\nimport { failUndefined } from '@dxos/debug';\nimport { invariant } from '@dxos/invariant';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { ComplexMap, defaultMap } from '@dxos/util';\n\nimport { type FeedFactory, type FeedOptions } from './feed-factory';\nimport { type FeedWrapper } from './feed-wrapper';\n\nexport interface FeedStoreOptions<T extends {}> {\n factory: FeedFactory<T>;\n}\n\n/**\n * Persistent hypercore store.\n */\nexport class FeedStore<T extends {}> {\n private readonly _feeds: ComplexMap<PublicKey, FeedWrapper<T>> = new ComplexMap(PublicKey.hash);\n private readonly _mutexes = new ComplexMap<PublicKey, Mutex>(PublicKey.hash);\n private readonly _factory: FeedFactory<T>;\n\n private _closed = false;\n\n readonly feedOpened = new Event<FeedWrapper<T>>();\n\n constructor({ factory }: FeedStoreOptions<T>) {\n this._factory = factory ?? failUndefined();\n }\n\n get size() {\n return this._feeds.size;\n }\n\n get feeds() {\n return Array.from(this._feeds.values());\n }\n\n /**\n * Get the open feed if it exists.\n */\n getFeed(publicKey: PublicKey): FeedWrapper<T> | undefined {\n return this._feeds.get(publicKey);\n }\n\n /**\n * Gets or opens a feed.\n * The feed is readonly unless a secret key is provided.\n */\n async openFeed(feedKey: PublicKey, { writable, sparse }: FeedOptions = {}): Promise<FeedWrapper<T>> {\n log('opening feed', { feedKey });\n invariant(feedKey);\n invariant(!this._closed, 'Feed store is closed');\n\n const mutex = defaultMap(this._mutexes, feedKey, () => new Mutex());\n\n return mutex.executeSynchronized(async () => {\n let feed = this.getFeed(feedKey);\n if (feed) {\n // TODO(burdon): Need to check that there's another instance being used (create test and break this).\n // TODO(burdon): Remove from store if feed is closed externally? (remove wrapped open/close methods?)\n if (writable && !feed.properties.writable) {\n throw new Error(`Read-only feed is already open: ${feedKey.truncate()}`);\n } else if ((sparse ?? false) !== feed.properties.sparse) {\n throw new Error(\n `Feed already open with different sparse setting: ${feedKey.truncate()} [${sparse} !== ${\n feed.properties.sparse\n }]`,\n );\n } else {\n await feed.open();\n return feed;\n }\n }\n\n feed = await this._factory.createFeed(feedKey, { writable, sparse });\n this._feeds.set(feed.key, feed);\n\n await feed.open();\n this.feedOpened.emit(feed);\n log('opened', { feedKey });\n return feed;\n });\n }\n\n /**\n * Close all feeds.\n */\n async close() {\n log('closing...');\n this._closed = true;\n await Promise.all(\n Array.from(this._feeds.values()).map(async (feed) => {\n await feed.close();\n invariant(feed.closed);\n // TODO(burdon): SpaceProxy still being initialized.\n // SpaceProxy.initialize => Database.createItem => ... => FeedWrapper.append\n // Uncaught Error: Closed [random-access-storage/index.js:181:38]\n // await sleep(100);\n }),\n );\n\n this._feeds.clear();\n log('closed');\n }\n}\n"],
|
|
5
|
+
"mappings": ";AAKA,SAASA,eAAe;AACxB,SAASC,UAAUC,iBAAiB;AAEpC,SAASC,eAAe;AACxB,SAASC,eAAeC,kBAAkB;AAE1C,SAASC,iBAAiB;AAE1B,SAASC,WAAW;AAEpB,SAASC,eAAeC,cAAcC,mBAAmB;;AAOlD,IAAMC,cAAN,MAAMA;EASXC,YACUC,YACAC,MACAC,mBACR;SAHQF,aAAAA;SACAC,OAAAA;SACAC,oBAAAA;SAXOC,iBAAiB,oBAAIC,IAAAA;SACrBC,UAAUT,aAAa,KAAKI,UAAU;SAGtCM,aAAa,IAAIhB,QAAAA;SAE1BiB,UAAU;SAwIlBC,KAAK,KAAKH,QAAQI,GAAG,KAAKT,WAAWQ,EAAE;SACvCE,MAAM,KAAKL,QAAQI,GAAG,KAAKT,WAAWU,GAAG;SAEzCC,OAAO,KAAKN,QAAQO,MAAM,KAAKZ,WAAWW,IAAI;SACtCE,SAAS,KAAKR,QAAQO,MAAM,KAAKZ,WAAWc,KAAK;SACzDA,QAAQ,YAAA;AACN,UAAI,KAAKX,eAAeY,MAAM;AAC5BrB,YAAIsB,KAAK,oCAAoC;UAC3CC,MAAM,KAAKhB;UACXiB,OAAO,KAAKf,eAAeY;UAC3BI,eAAeC,MAAMC,KAAK,KAAKlB,eAAemB,OAAM,CAAA,EAAIC,IAAI,CAACC,UAAUA,MAAMC,SAAQ,CAAA;QACvF,GAAA;;;;;;MACF;AACA,WAAKlB,UAAU;AACf,YAAM,KAAKmB,YAAW;AACtB,YAAM,KAAKb,OAAM;IACnB;SAEAc,MAAM,KAAKtB,QAAQI,GAAG,KAAKT,WAAW2B,GAAG;SACzCC,MAAM,KAAKvB,QAAQO,MAAM,KAAKZ,WAAW4B,GAAG;SAC5CC,SAAS,KAAKxB,QAAQO,MAAM,KAAKZ,WAAW6B,MAAM;SAKlDC,WAAW,KAAKzB,QAAQI,GAAG,KAAKT,WAAW8B,QAAQ;SACnDC,aAAa,KAAK1B,QAAQI,GAAG,KAAKT,WAAW+B,UAAU;SACvDC,iBAAiB,KAAK3B,QAAQI,GAAG,KAAKT,WAAWgC,cAAc;SAC/DC,YAAuC,KAAK5B,QAAQI,GAAG,KAAKT,WAAWiC,SAAS;SAChFC,QAAQ,KAAK7B,QAAQO,MAAM,KAAKZ,WAAWkC,KAAK;SAEhDC,QAAQ,KAAK9B,QAAQO,MAAM,KAAKZ,WAAWmC,KAAK;SAChDC,MAAM,KAAK/B,QAAQO,MAAM,KAAKZ,WAAWoC,GAAG;SAC5CC,YAAY,KAAKhC,QAAQO,MAAO,KAAKZ,WAAmBsC,UAAU;AAlKhE7C,cAAU,KAAKO,YAAU,QAAA;;;;;;;;;AACzBP,cAAU,KAAKQ,MAAI,QAAA;;;;;;;;;AACnB,SAAKK,WAAWiC,KAAI;EACtB;EAEA,CAACpD,QAAQqD,MAAM,IAAI;AACjB,WAAOjD,cAAc,IAAI;EAC3B;EAEAkD,SAAS;AACP,WAAO;MACLC,SAAS,KAAKzC;MACd0C,QAAQ,KAAKC,WAAWD;MACxBE,QAAQ,KAAKD,WAAWC;MACxBC,QAAQ,KAAKF,WAAWE;IAC1B;EACF;EAEA,IAAIC,MAAiB;AACnB,WAAO,KAAK9C;EACd;EAEA,IAAI+C,OAAqB;AACvB,WAAO,KAAKhD;EACd;;EAGA,IAAI4C,aAAkC;AACpC,WAAO,KAAK5C;EACd;EAEAiD,qBAAqBC,MAAoC;AAEvD,UAAMC,OAAO;AACb,UAAMC,YAAY,IAAI/D,UAAU;MAC9B+D,UAAUC,MAAWC,IAA4C;AAE/D,aAAKH,KAAK7C,WAAWiD,KAAI,EAAGC,KAAK,MAAA;AAC/B,eAAKC,KAAKJ,IAAAA;AACVC,aAAAA;QACF,CAAA;MACF;IACF,CAAA;AACA,UAAMI,aACJR,MAAMS,UAAUC,UAAaV,MAAMS,QAAQ,IACvC,IAAIE,kBAAkB,KAAK7D,YAAYkD,IAAAA,IACvC,KAAKlD,WAAW8D,iBAAiBZ,IAAAA;AAEvCQ,eAAWK,KAAKX,WAAW,CAACY,QAAAA;IAI5B,CAAA;AAEA,WAAOZ;EACT;EAEAa,mBAAkC;AAChC,WAAO;MACLC,OAAO,OAAOb,MAAS,EAAEc,WAAU,IAAK,CAAC,MAAC;AACxCzE,YAAI,SAAS;UAAEuB,MAAM,KAAKhB;UAAMmE,KAAK,KAAKpE,WAAW2C;UAAQU;QAAK,GAAA;;;;;;AAClE5D,kBAAU,CAAC,KAAKc,SAAS,eAAA;;;;;;;;;AACzB,cAAM8D,aAAa,IAAI7E,WAAAA;AAEvB,YAAI;AAEF,eAAKW,eAAemE,IAAID,UAAAA;AACxB,cAAI,KAAKlE,eAAeY,SAAS,GAAG;AAClC,iBAAKT,WAAWiE,MAAK;UACvB;AAEA,gBAAMC,UAAU,MAAM,KAAKC,kBAAkBpB,IAAAA;AAG7C,gBAAM,KAAK3B,YAAW;AAEtB,gBAAMyC,aAAaK,OAAAA;AAEnB,iBAAOA;QACT,UAAA;AAEE,eAAKrE,eAAeuE,OAAOL,UAAAA;AAC3B,cAAI,KAAKlE,eAAeY,SAAS,GAAG;AAClC,iBAAKT,WAAWiC,KAAI;UACtB;QACF;MACF;IACF;EACF;EAEA,MAAMkC,kBAAkBpB,MAAgC;AACtD,UAAMe,MAAM,MAAM,KAAKvC,OAAOwB,IAAAA;AAC9B5D,cAAU2E,MAAM,KAAKzB,QAAQ,2BAAA;;;;;;;;;AAC7BjD,QAAI,kBAAkB;MAAEuB,MAAM,KAAKhB;MAAMmE;IAAI,GAAA;;;;;;AAC7C,UAAMI,UAAwB;MAC5B9B,SAAS,KAAKK;MACdqB;IACF;AACA,WAAOI;EACT;;;;;EAMA,MAAM9C,cAAc;AAClB,UAAM,KAAKxB,kBAAkByE,MAAK;EACpC;EAEA,IAAI9B,SAAS;AACX,WAAO,KAAK7C,WAAW6C;EACzB;EAEA,IAAIC,SAAS;AACX,WAAO,KAAK9C,WAAW8C;EACzB;EAEA,IAAI8B,WAAW;AACb,WAAO,KAAK5E,WAAW4E;EACzB;EAEA,IAAIjC,SAAS;AACX,WAAO,KAAK3C,WAAW2C;EACzB;EAEA,IAAIkC,aAAa;AACf,WAAO,KAAK7E,WAAW6E;EACzB;;;;EA6CA,MAAMC,UAAUzD,MAAc0D,IAAY;AACxCtF,cAAU4B,QAAQ,KAAKA,OAAO0D,MAAMA,MAAM,KAAKpC,QAAQ,iBAAA;;;;;;;;;AAEvD,UAAMqC,iBAAiB;AACvB,UAAMC,aAAaF;AACnB,UAAMG,WAAWC,KAAKC,IAAIH,aAAaD,gBAAgB,KAAKrC,MAAM;AAElE,UAAM0C,iBAAiB,MAAMC,QAAQC,IACnC1F,YAAYoF,YAAYC,QAAAA,EAAU3D,IAAI,CAACiE,QACrC,KAAK5D,IAAI4D,KAAK;MACZC,eAAe;QAAEC,QAAQ,CAACC,MAAkBA;MAAE;IAChD,CAAA,CAAA,CAAA;AAIJ,UAAM,KAAKzD,MAAMb,MAAM0D,EAAAA;AAEvB,UAAMa,gBAAgB,MAAMN,QAAQC,IAClC1F,YAAYoF,YAAYC,QAAAA,EAAU3D,IAAI,CAACiE,QACrC,KAAK5D,IAAI4D,KAAK;MACZC,eAAe;QAAEC,QAAQ,CAACC,MAAkBA;MAAE;IAChD,CAAA,CAAA,CAAA;AAIJ,aAASE,IAAI,GAAGA,IAAIR,eAAe1C,QAAQkD,KAAK;AAC9C,YAAMC,SAASnG,cAAc0F,eAAeQ,CAAAA,CAAE;AAC9C,YAAME,QAAQpG,cAAciG,cAAcC,CAAAA,CAAE;AAC5C,UAAI,CAACC,OAAOE,OAAOD,KAAAA,GAAQ;AACzB,cAAM,IAAIE,MAAM,8DAAA;MAClB;IACF;EACF;AACF;AAEA,IAAMpC,oBAAN,cAAgCzE,SAAAA;EAM9BW,YAAYkB,MAAsBiC,OAA0B,CAAC,GAAG;AAC9D,UAAM;MAAEgD,YAAY;IAAK,CAAA;AAHnBC,oBAAW;AAIjB1G,cAAUyD,KAAKkD,SAAS,MAAM,4BAAA;;;;;;;;;AAC9B3G,cAAUyD,KAAKS,UAAUC,UAAaV,KAAKS,QAAQ,GAAA,QAAA;;;;;;;;;AACnD,SAAK0C,QAAQpF;AACb,SAAKqF,SAASpD,KAAKS;AACnB,SAAK4C,UAAUrD,KAAKsD,SAAS;EAC/B;EAESC,MAAMnD,IAAuC;AACpD,SAAK+C,MAAMK,MAAMpD,EAAAA;EACnB;EAESqD,MAAMrD,IAAuC;AACpD,QAAI,KAAK6C,UAAU;AACjB;IACF;AAEA,QAAI,KAAKE,MAAMO,SAAUC,MAAM,KAAKN,SAAS,KAAKA,UAAU,KAAKD,MAAM,MAAM,KAAKA,QAAQ;AACxF,WAAKQ,aAAaxD,EAAAA;IACpB,OAAO;AACL,WAAKyD,gBAAgBzD,EAAAA;IACvB;EACF;EAEQyD,gBAAgBzD,IAAiC;AACvD,SAAK+C,MAAMzE,IAAI,KAAK2E,SAAS;MAAEhD,MAAM;IAAK,GAAG,CAACS,KAAKX,SAAAA;AACjD,UAAIW,KAAK;AACPV,WAAGU,GAAAA;MACL,OAAO;AACL,aAAKuC;AACL,aAAKJ,WAAW;AAChB,aAAK1C,KAAKJ,IAAAA;AACVC,WAAG,IAAA;MACL;IACF,CAAA;EACF;EAEQwD,aAAaxD,IAAiC;AACpD,SAAK+C,MAAMW,SAAS,KAAKT,SAAS,KAAKA,UAAU,KAAKD,QAAQ;MAAE/C,MAAM;IAAK,GAAG,CAACS,KAAKX,SAAAA;AAClF,UAAIW,KAAK;AACPV,WAAGU,GAAAA;MACL,OAAO;AACL,aAAKuC,WAAWlD,KAAKV;AACrB,aAAKwD,WAAW;AAChB,mBAAWc,QAAQ5D,MAAM;AACvB,eAAKI,KAAKwD,IAAAA;QACZ;AACA3D,WAAG,IAAA;MACL;IACF,CAAA;EACF;AACF;;;ACzSA,OAAO4D,kBAAkB;AAEzB,SAAsBC,oBAAoB;AAC1C,SAASC,qBAAqB;AAE9B,SAASC,cAAcC,iBAAiB;AAExC,SAASC,OAAAA,YAAW;;AAyBb,IAAMC,cAAN,MAAMA;EAKXC,YAAY,EAAEC,MAAMC,QAAQC,WAAAA,WAAS,GAAwB;AAC3DC,IAAAA,KAAI,eAAe;MAAEC,SAASF;IAAU,GAAA;;;;;;AACxC,SAAKG,QAAQL,QAAQM,cAAAA;AACrB,SAAKC,UAAUN;AACf,SAAKO,oBAAoBN;EAC3B;EAEA,IAAIO,cAAc;AAChB,WAAO,KAAKJ;EACd;EAEA,MAAMK,WAAWC,WAAsBP,SAAgD;AACrF,QAAIA,SAASQ,YAAY,CAAC,KAAKL,SAAS;AACtC,YAAM,IAAIM,MAAM,2CAAA;IAClB;AACA,QAAIT,SAASU,WAAW;AACtBX,MAAAA,KAAIY,KAAK,qCAAA,QAAA;;;;;;IACX;AAGA,UAAMC,MAAM,MAAMC,aAAaC,OAAO,WAAWC,OAAOC,KAAKT,UAAUU,MAAK,CAAA,CAAA;AAE5E,UAAMC,OAAOC,aACX,CAGA,GACA,KAAKf,mBACL;MACEM,WAAW,KAAKP,WAAWH,SAASQ,WAAWO,OAAOC,KAAK,QAAA,IAAYI;MACvEC,QAAQ,KAAKlB,UAAUmB,aAAa,KAAKnB,SAASI,SAAAA,IAAaa;MAC/DG,SAASvB,SAASuB;MAClBC,cAAc,CAAC;IACjB,GACAxB,OAAAA;AAGF,UAAMyB,aAAa,KAAKxB,MAAMyB,gBAAgBnB,UAAUU,MAAK,CAAA;AAC7D,UAAMU,cAAc,CAACC,aAAAA;AACnB,YAAM,EAAEC,MAAMC,OAAM,IAAKL,WAAWM,gBAAgBH,QAAAA;AACpD7B,MAAAA,KAAI,WAAW;QACbiC,MAAM,GAAGH,IAAAA,IAAQ,KAAK5B,MAAM+B,IAAI,IAAIzB,UAAU0B,SAAQ,CAAA,IAAML,QAAAA;MAC9D,GAAA;;;;;;AAEA,aAAOE;IACT;AAEA,UAAMI,OAAOpC,UAAU6B,aAAaZ,OAAOC,KAAKJ,GAAAA,GAAMM,IAAAA;AACtD,WAAO,IAAIiB,YAAYD,MAAM3B,WAAWkB,UAAAA;EAC1C;AACF;;;ACvFA,SAASW,OAAOC,aAAa;AAC7B,SAASC,iBAAAA,sBAAqB;AAC9B,SAASC,aAAAA,kBAAiB;AAC1B,SAASC,iBAAiB;AAC1B,SAASC,OAAAA,YAAW;AACpB,SAASC,YAAYC,kBAAkB;;AAYhC,IAAMC,YAAN,MAAMA;EASXC,YAAY,EAAEC,QAAO,GAAyB;AAR7BC,kBAAgD,IAAIL,WAAWF,UAAUQ,IAAI;AAC7EC,oBAAW,IAAIP,WAA6BF,UAAUQ,IAAI;AAGnEE,mBAAU;AAETC,sBAAa,IAAIf,MAAAA;AAGxB,SAAKgB,WAAWN,WAAWR,eAAAA;EAC7B;EAEA,IAAIe,OAAO;AACT,WAAO,KAAKN,OAAOM;EACrB;EAEA,IAAIC,QAAQ;AACV,WAAOC,MAAMC,KAAK,KAAKT,OAAOU,OAAM,CAAA;EACtC;;;;EAKAC,QAAQC,WAAkD;AACxD,WAAO,KAAKZ,OAAOa,IAAID,SAAAA;EACzB;;;;;EAMA,MAAME,SAASC,SAAoB,EAAEC,UAAUC,OAAM,IAAkB,CAAC,GAA4B;AAClGvB,IAAAA,KAAI,gBAAgB;MAAEqB;IAAQ,GAAA;;;;;;AAC9BvB,IAAAA,WAAUuB,SAAAA,QAAAA;;;;;;;;;AACVvB,IAAAA,WAAU,CAAC,KAAKW,SAAS,wBAAA;;;;;;;;;AAEzB,UAAMe,QAAQtB,WAAW,KAAKM,UAAUa,SAAS,MAAM,IAAIzB,MAAAA,CAAAA;AAE3D,WAAO4B,MAAMC,oBAAoB,YAAA;AAC/B,UAAIC,OAAO,KAAKT,QAAQI,OAAAA;AACxB,UAAIK,MAAM;AAGR,YAAIJ,YAAY,CAACI,KAAKC,WAAWL,UAAU;AACzC,gBAAM,IAAIM,MAAM,mCAAmCP,QAAQQ,SAAQ,CAAA,EAAI;QACzE,YAAYN,UAAU,WAAWG,KAAKC,WAAWJ,QAAQ;AACvD,gBAAM,IAAIK,MACR,oDAAoDP,QAAQQ,SAAQ,CAAA,KAAON,MAAAA,QACzEG,KAAKC,WAAWJ,MAAM,GACrB;QAEP,OAAO;AACL,gBAAMG,KAAKI,KAAI;AACf,iBAAOJ;QACT;MACF;AAEAA,aAAO,MAAM,KAAKf,SAASoB,WAAWV,SAAS;QAAEC;QAAUC;MAAO,CAAA;AAClE,WAAKjB,OAAO0B,IAAIN,KAAKO,KAAKP,IAAAA;AAE1B,YAAMA,KAAKI,KAAI;AACf,WAAKpB,WAAWwB,KAAKR,IAAAA;AACrB1B,MAAAA,KAAI,UAAU;QAAEqB;MAAQ,GAAA;;;;;;AACxB,aAAOK;IACT,CAAA;EACF;;;;EAKA,MAAMS,QAAQ;AACZnC,IAAAA,KAAI,cAAA,QAAA;;;;;;AACJ,SAAKS,UAAU;AACf,UAAM2B,QAAQC,IACZvB,MAAMC,KAAK,KAAKT,OAAOU,OAAM,CAAA,EAAIsB,IAAI,OAAOZ,SAAAA;AAC1C,YAAMA,KAAKS,MAAK;AAChBrC,MAAAA,WAAU4B,KAAKa,QAAM,QAAA;;;;;;;;;IAKvB,CAAA,CAAA;AAGF,SAAKjC,OAAOkC,MAAK;AACjBxC,IAAAA,KAAI,UAAA,QAAA;;;;;;EACN;AACF;",
|
|
6
|
+
"names": ["inspect", "Readable", "Transform", "Trigger", "inspectObject", "StackTrace", "invariant", "log", "arrayToBuffer", "createBinder", "rangeFromTo", "FeedWrapper", "constructor", "_hypercore", "_key", "_storageDirectory", "_pendingWrites", "Set", "_binder", "_writeLock", "_closed", "on", "fn", "off", "open", "async", "_close", "close", "size", "warn", "feed", "count", "pendingWrites", "Array", "from", "values", "map", "stack", "getStack", "flushToDisk", "has", "get", "append", "download", "undownload", "setDownloading", "replicate", "clear", "proof", "put", "putBuffer", "_putBuffer", "wake", "custom", "toJSON", "feedKey", "length", "properties", "opened", "closed", "key", "core", "createReadableStream", "opts", "self", "transform", "data", "cb", "wait", "then", "push", "readStream", "batch", "undefined", "BatchedReadStream", "createReadStream", "pipe", "err", "createFeedWriter", "write", "afterWrite", "seq", "stackTrace", "add", "reset", "receipt", "appendWithReceipt", "delete", "flush", "readable", "byteLength", "safeClear", "to", "CHECK_MESSAGES", "checkBegin", "checkEnd", "Math", "min", "messagesBefore", "Promise", "all", "idx", "valueEncoding", "decode", "x", "messagesAfter", "i", "before", "after", "equals", "Error", "objectMode", "_reading", "live", "_feed", "_batch", "_cursor", "start", "_open", "ready", "_read", "bitfield", "total", "_batchedRead", "_nonBatchedRead", "getBatch", "item", "defaultsDeep", "subtleCrypto", "failUndefined", "createCrypto", "hypercore", "log", "FeedFactory", "constructor", "root", "signer", "hypercore", "log", "options", "_root", "failUndefined", "_signer", "_hypercoreOptions", "storageRoot", "createFeed", "publicKey", "writable", "Error", "secretKey", "warn", "key", "subtleCrypto", "digest", "Buffer", "from", "toHex", "opts", "defaultsDeep", "undefined", "crypto", "createCrypto", "onwrite", "noiseKeyPair", "storageDir", "createDirectory", "makeStorage", "filename", "type", "native", "getOrCreateFile", "path", "truncate", "core", "FeedWrapper", "Event", "Mutex", "failUndefined", "invariant", "PublicKey", "log", "ComplexMap", "defaultMap", "FeedStore", "constructor", "factory", "_feeds", "hash", "_mutexes", "_closed", "feedOpened", "_factory", "size", "feeds", "Array", "from", "values", "getFeed", "publicKey", "get", "openFeed", "feedKey", "writable", "sparse", "mutex", "executeSynchronized", "feed", "properties", "Error", "truncate", "open", "createFeed", "set", "key", "emit", "close", "Promise", "all", "map", "closed", "clear"]
|
|
7
|
+
}
|