@dxos/feed-store 0.8.3 → 0.8.4-main.1da679c

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/dist/lib/browser/{chunk-WS47OKDO.mjs → chunk-4RW534M7.mjs} +192 -116
  2. package/dist/lib/browser/chunk-4RW534M7.mjs.map +7 -0
  3. package/dist/lib/browser/index.mjs +116 -64
  4. package/dist/lib/browser/index.mjs.map +3 -3
  5. package/dist/lib/browser/meta.json +1 -1
  6. package/dist/lib/browser/testing/index.mjs +78 -32
  7. package/dist/lib/browser/testing/index.mjs.map +3 -3
  8. package/dist/lib/node-esm/{chunk-AO5I2BX3.mjs → chunk-D4DVCY7Y.mjs} +192 -116
  9. package/dist/lib/node-esm/chunk-D4DVCY7Y.mjs.map +7 -0
  10. package/dist/lib/node-esm/index.mjs +116 -64
  11. package/dist/lib/node-esm/index.mjs.map +3 -3
  12. package/dist/lib/node-esm/meta.json +1 -1
  13. package/dist/lib/node-esm/testing/index.mjs +78 -32
  14. package/dist/lib/node-esm/testing/index.mjs.map +3 -3
  15. package/dist/types/src/feed-queue.d.ts.map +1 -1
  16. package/dist/types/src/feed-wrapper.d.ts +18 -19
  17. package/dist/types/src/feed-wrapper.d.ts.map +1 -1
  18. package/dist/types/src/index.d.ts +1 -1
  19. package/dist/types/src/index.d.ts.map +1 -1
  20. package/dist/types/src/testing/test-builder.d.ts +2 -2
  21. package/dist/types/src/testing/test-builder.d.ts.map +1 -1
  22. package/dist/types/src/testing/test-generator.d.ts +1 -1
  23. package/dist/types/src/testing/test-generator.d.ts.map +1 -1
  24. package/dist/types/tsconfig.tsbuildinfo +1 -1
  25. package/package.json +20 -17
  26. package/src/feed-queue.test.ts +1 -1
  27. package/src/feed-queue.ts +5 -2
  28. package/src/feed-store.node.test.ts +3 -3
  29. package/src/feed-wrapper.test.ts +38 -4
  30. package/src/feed-wrapper.ts +75 -35
  31. package/src/index.ts +1 -1
  32. package/src/testing/test-builder.ts +4 -4
  33. package/src/testing/test-generator.ts +1 -2
  34. package/dist/lib/browser/chunk-WS47OKDO.mjs.map +0 -7
  35. package/dist/lib/node/chunk-YOYJCS5J.cjs +0 -523
  36. package/dist/lib/node/chunk-YOYJCS5J.cjs.map +0 -7
  37. package/dist/lib/node/index.cjs +0 -593
  38. package/dist/lib/node/index.cjs.map +0 -7
  39. package/dist/lib/node/meta.json +0 -1
  40. package/dist/lib/node/testing/index.cjs +0 -173
  41. package/dist/lib/node/testing/index.cjs.map +0 -7
  42. package/dist/lib/node-esm/chunk-AO5I2BX3.mjs.map +0 -7
@@ -1 +0,0 @@
1
- {"inputs":{"packages/common/feed-store/src/feed-wrapper.ts":{"bytes":34043,"imports":[{"path":"node: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}],"format":"esm"},"packages/common/feed-store/src/feed-factory.ts":{"bytes":9099,"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"}],"format":"esm"},"packages/common/feed-store/src/feed-queue.ts":{"bytes":19584,"imports":[{"path":"node: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}],"format":"esm"},"packages/common/feed-store/src/feed-iterator.ts":{"bytes":10127,"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"}],"format":"esm"},"packages/common/feed-store/src/feed-set-iterator.ts":{"bytes":20088,"imports":[{"path":"node: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"}],"format":"esm"},"packages/common/feed-store/src/feed-store.ts":{"bytes":12115,"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}],"format":"esm"},"packages/common/feed-store/src/feed-writer.ts":{"bytes":2638,"imports":[],"format":"esm"},"packages/common/feed-store/src/types.ts":{"bytes":582,"imports":[],"format":"esm"},"packages/common/feed-store/src/index.ts":{"bytes":1156,"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"}],"format":"esm"},"packages/common/feed-store/src/testing/mocks.ts":{"bytes":3449,"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}],"format":"esm"},"packages/common/feed-store/src/testing/test-generator.ts":{"bytes":5535,"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}],"format":"esm"},"packages/common/feed-store/src/testing/test-builder.ts":{"bytes":9638,"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"}],"format":"esm"},"packages/common/feed-store/src/testing/index.ts":{"bytes":673,"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"}],"format":"esm"}},"outputs":{"packages/common/feed-store/dist/lib/node/index.cjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":24427},"packages/common/feed-store/dist/lib/node/index.cjs":{"imports":[{"path":"packages/common/feed-store/dist/lib/node/chunk-YOYJCS5J.cjs","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":"node: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":"node: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":2798},"packages/common/feed-store/src/feed-queue.ts":{"bytesInOutput":4925},"packages/common/feed-store/src/feed-set-iterator.ts":{"bytesInOutput":4933},"packages/common/feed-store/src/feed-writer.ts":{"bytesInOutput":273}},"bytes":13529},"packages/common/feed-store/dist/lib/node/testing/index.cjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":9597},"packages/common/feed-store/dist/lib/node/testing/index.cjs":{"imports":[{"path":"packages/common/feed-store/dist/lib/node/chunk-YOYJCS5J.cjs","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":4052},"packages/common/feed-store/dist/lib/node/chunk-YOYJCS5J.cjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":26154},"packages/common/feed-store/dist/lib/node/chunk-YOYJCS5J.cjs":{"imports":[{"path":"node: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":["FeedFactory","FeedStore","FeedWrapper"],"inputs":{"packages/common/feed-store/src/feed-wrapper.ts":{"bytesInOutput":8205},"packages/common/feed-store/src/feed-factory.ts":{"bytesInOutput":2015},"packages/common/feed-store/src/feed-store.ts":{"bytesInOutput":3129}},"bytes":13598}}}
@@ -1,173 +0,0 @@
1
- "use strict";
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __export = (target, all) => {
7
- for (var name in all)
8
- __defProp(target, name, { get: all[name], enumerable: true });
9
- };
10
- var __copyProps = (to, from, except, desc) => {
11
- if (from && typeof from === "object" || typeof from === "function") {
12
- for (let key of __getOwnPropNames(from))
13
- if (!__hasOwnProp.call(to, key) && key !== except)
14
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
- }
16
- return to;
17
- };
18
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
- var testing_exports = {};
20
- __export(testing_exports, {
21
- MockFeedWriter: () => MockFeedWriter,
22
- TestBuilder: () => TestBuilder,
23
- TestGenerator: () => TestGenerator,
24
- TestItemBuilder: () => TestItemBuilder,
25
- defaultCodec: () => defaultCodec,
26
- defaultTestBlockGenerator: () => defaultTestBlockGenerator,
27
- defaultTestGenerator: () => defaultTestGenerator,
28
- defaultValueEncoding: () => defaultValueEncoding
29
- });
30
- module.exports = __toCommonJS(testing_exports);
31
- var import_chunk_YOYJCS5J = require("../chunk-YOYJCS5J.cjs");
32
- var import_async = require("@dxos/async");
33
- var import_context = require("@dxos/context");
34
- var import_keys = require("@dxos/keys");
35
- var import_keyring = require("@dxos/keyring");
36
- var import_random_access_storage = require("@dxos/random-access-storage");
37
- var import_async2 = require("@dxos/async");
38
- var import_hypercore = require("@dxos/hypercore");
39
- var import_random = require("@dxos/random");
40
- var __dxlog_file = "/home/runner/work/dxos/dxos/packages/common/feed-store/src/testing/mocks.ts";
41
- var MockFeedWriter = class {
42
- constructor(feedKey = import_keys.PublicKey.random()) {
43
- this.feedKey = feedKey;
44
- this.written = new import_async.Event();
45
- this.messages = [];
46
- }
47
- async write(data, { afterWrite } = {}) {
48
- this.messages.push(data);
49
- const receipt = {
50
- feedKey: this.feedKey,
51
- seq: this.messages.length - 1
52
- };
53
- await afterWrite?.(receipt);
54
- (0, import_async.scheduleTask)(new import_context.Context(void 0, {
55
- F: __dxlog_file,
56
- L: 30
57
- }), () => {
58
- this.written.emit([
59
- data,
60
- receipt
61
- ]);
62
- });
63
- return receipt;
64
- }
65
- };
66
- var defaultCodec = {
67
- encode: (obj) => Buffer.from(JSON.stringify(obj)),
68
- decode: (buffer) => JSON.parse(buffer.toString())
69
- };
70
- var defaultValueEncoding = (0, import_hypercore.createCodecEncoding)(defaultCodec);
71
- var defaultTestBlockGenerator = (i) => ({
72
- id: import_random.faker.string.uuid(),
73
- index: i,
74
- value: import_random.faker.lorem.sentence()
75
- });
76
- var TestGenerator = class {
77
- constructor(_generate) {
78
- this._generate = _generate;
79
- this._count = 0;
80
- }
81
- async writeBlocks(writer, { count = 1, delay } = {}) {
82
- return await Promise.all(Array.from(Array(count)).map(async () => {
83
- const data = this._generate(this._count++);
84
- const receipt = await writer.write(data);
85
- if (delay) {
86
- await (0, import_async2.sleep)(import_random.faker.number.int(delay));
87
- }
88
- return receipt;
89
- }));
90
- }
91
- };
92
- var defaultTestGenerator = new TestGenerator(defaultTestBlockGenerator);
93
- var evaluate = (builder, arg) => arg === "function" ? arg(builder) : arg;
94
- var TestBuilder = class _TestBuilder {
95
- static {
96
- this.ROOT_DIR = "feeds";
97
- }
98
- constructor(_properties = {}) {
99
- this._properties = _properties;
100
- }
101
- /**
102
- * Creates a new builder with the current builder's properties.
103
- */
104
- clone() {
105
- return new _TestBuilder(Object.assign({}, this._properties));
106
- }
107
- get keyring() {
108
- return this._properties.keyring ??= new import_keyring.Keyring();
109
- }
110
- get storage() {
111
- return this._properties.storage ??= (0, import_random_access_storage.createStorage)({
112
- type: import_random_access_storage.StorageType.RAM
113
- });
114
- }
115
- get root() {
116
- return this._properties.root ??= this.storage.createDirectory(_TestBuilder.ROOT_DIR);
117
- }
118
- setKeyring(keyring) {
119
- this._properties.keyring = evaluate(this, keyring);
120
- return this;
121
- }
122
- setStorage(storage, root) {
123
- this._properties.storage = evaluate(this, storage);
124
- if (root) {
125
- this._properties.root = this.storage.createDirectory(root);
126
- }
127
- return this;
128
- }
129
- setRoot(root) {
130
- this._properties.root = evaluate(this, root);
131
- return this;
132
- }
133
- createFeedFactory() {
134
- return new import_chunk_YOYJCS5J.FeedFactory({
135
- root: this.root,
136
- signer: this.keyring,
137
- hypercore: {
138
- valueEncoding: this._properties.valueEncoding
139
- }
140
- });
141
- }
142
- createFeedStore() {
143
- return new import_chunk_YOYJCS5J.FeedStore({
144
- factory: this.createFeedFactory()
145
- });
146
- }
147
- };
148
- var TestItemBuilder = class extends TestBuilder {
149
- constructor() {
150
- super({
151
- valueEncoding: defaultValueEncoding,
152
- generator: defaultTestGenerator
153
- });
154
- }
155
- get valueEncoding() {
156
- return this._properties.valueEncoding;
157
- }
158
- get generator() {
159
- return this._properties.generator;
160
- }
161
- };
162
- // Annotate the CommonJS export names for ESM import in node:
163
- 0 && (module.exports = {
164
- MockFeedWriter,
165
- TestBuilder,
166
- TestGenerator,
167
- TestItemBuilder,
168
- defaultCodec,
169
- defaultTestBlockGenerator,
170
- defaultTestGenerator,
171
- defaultValueEncoding
172
- });
173
- //# sourceMappingURL=index.cjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../src/testing/mocks.ts", "../../../../src/testing/test-builder.ts", "../../../../src/testing/test-generator.ts"],
4
- "sourcesContent": ["//\n// Copyright 2022 DXOS.org\n//\n\nimport { Event, scheduleTask } from '@dxos/async';\nimport { Context } from '@dxos/context';\nimport { PublicKey } from '@dxos/keys';\n\nimport type { FeedWriter, WriteOptions, WriteReceipt } from '../feed-writer';\n\n/**\n * Mock writer collects and emits messages.\n */\nexport class MockFeedWriter<T extends {}> implements FeedWriter<T> {\n public readonly written = new Event<[T, WriteReceipt]>();\n public readonly messages: T[] = [];\n\n constructor(readonly feedKey = PublicKey.random()) {}\n\n async write(data: T, { afterWrite }: WriteOptions = {}): Promise<WriteReceipt> {\n this.messages.push(data);\n\n const receipt: WriteReceipt = {\n feedKey: this.feedKey,\n seq: this.messages.length - 1,\n };\n\n await afterWrite?.(receipt);\n\n scheduleTask(new Context(), () => {\n this.written.emit([data, receipt]);\n });\n\n return receipt;\n }\n}\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport type { ValueEncoding } from 'hypercore';\n\nimport { Keyring } from '@dxos/keyring';\nimport { createStorage, type Directory, type Storage, StorageType } from '@dxos/random-access-storage';\n\nimport { defaultTestGenerator, defaultValueEncoding, type TestGenerator, type TestItem } from './test-generator';\nimport { FeedFactory } from '../feed-factory';\nimport { FeedStore } from '../feed-store';\n\nexport type TestBuilderOptions<T extends {}> = {\n storage?: Storage;\n root?: Directory;\n keyring?: Keyring;\n valueEncoding?: ValueEncoding<T>;\n generator?: TestGenerator<T>;\n};\n\ntype PropertyProvider<T extends {}, P> = (cb: TestBuilder<T>) => P;\n\nconst evaluate = <T extends {}, P>(builder: TestBuilder<T>, arg: P | PropertyProvider<T, P>) =>\n arg === 'function' ? (arg as Function)(builder) : arg;\n\n/**\n * The builder provides building blocks for tests with sensible defaults.\n * - Factory methods trigger the automatic generation of unset required properties.\n * - Avoids explosion of overly specific test functions that require and return large bags of properties.\n */\nexport class TestBuilder<T extends {}> {\n static readonly ROOT_DIR = 'feeds';\n\n constructor(public readonly _properties: TestBuilderOptions<T> = {}) {}\n\n /**\n * Creates a new builder with the current builder's properties.\n */\n clone(): TestBuilder<T> {\n return new TestBuilder<T>(Object.assign({}, this._properties));\n }\n\n get keyring(): Keyring {\n return (this._properties.keyring ??= new Keyring());\n }\n\n get storage(): Storage {\n return (this._properties.storage ??= createStorage({ type: StorageType.RAM }));\n }\n\n get root(): Directory {\n return (this._properties.root ??= this.storage.createDirectory(TestBuilder.ROOT_DIR));\n }\n\n setKeyring(keyring: Keyring | PropertyProvider<T, Keyring>): this {\n this._properties.keyring = evaluate(this, keyring);\n return this;\n }\n\n setStorage(storage: Storage, root?: string): this {\n this._properties.storage = evaluate(this, storage);\n if (root) {\n this._properties.root = this.storage.createDirectory(root);\n }\n\n return this;\n }\n\n setRoot(root: Directory): this {\n this._properties.root = evaluate(this, root);\n return this;\n }\n\n createFeedFactory(): FeedFactory<T> {\n return new FeedFactory<T>({\n root: this.root,\n signer: this.keyring,\n hypercore: {\n valueEncoding: this._properties.valueEncoding,\n },\n });\n }\n\n createFeedStore(): FeedStore<T> {\n return new FeedStore<T>({\n factory: this.createFeedFactory(),\n });\n }\n}\n\n/**\n * Builder with default encoder and generator.\n */\nexport class TestItemBuilder extends TestBuilder<TestItem> {\n constructor() {\n super({\n valueEncoding: defaultValueEncoding,\n generator: defaultTestGenerator,\n });\n }\n\n get valueEncoding() {\n return this._properties.valueEncoding!;\n }\n\n get generator() {\n return this._properties.generator!;\n }\n}\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport type { AbstractValueEncoding } from 'hypercore';\n\nimport { sleep } from '@dxos/async';\nimport { type Codec } from '@dxos/codec-protobuf';\nimport { createCodecEncoding } from '@dxos/hypercore';\nimport { faker } from '@dxos/random';\n\nimport { type FeedWriter } from '../feed-writer';\n\nexport type TestItem = {\n id: string;\n index: number;\n value: string;\n};\n\nexport const defaultCodec: Codec<any> = {\n encode: (obj: any) => Buffer.from(JSON.stringify(obj)),\n decode: (buffer: Uint8Array) => JSON.parse(buffer.toString()),\n};\n\nexport const defaultValueEncoding: AbstractValueEncoding<any> = createCodecEncoding(defaultCodec);\n\nexport type TestBlockGenerator<T> = (i: number) => T;\n\nexport const defaultTestBlockGenerator: TestBlockGenerator<TestItem> = (i) => ({\n id: faker.string.uuid(),\n index: i,\n value: faker.lorem.sentence(),\n});\n\n/**\n * Writes data to feeds.\n */\nexport class TestGenerator<T extends {}> {\n _count = 0;\n\n constructor(private readonly _generate: TestBlockGenerator<T>) {}\n\n async writeBlocks(\n writer: FeedWriter<T>,\n {\n count = 1,\n delay,\n }: {\n count?: number;\n delay?: {\n min: number;\n max: number;\n };\n } = {},\n ) {\n return await Promise.all(\n Array.from(Array(count)).map(async () => {\n const data = this._generate(this._count++);\n const receipt = await writer.write(data);\n if (delay) {\n await sleep(faker.number.int(delay));\n }\n\n return receipt;\n }),\n );\n }\n}\n\nexport const defaultTestGenerator = new TestGenerator<TestItem>(defaultTestBlockGenerator);\n"],
5
- "mappings": "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",
6
- "names": ["import_async", "MockFeedWriter", "feedKey", "PublicKey", "random", "written", "Event", "messages", "write", "data", "afterWrite", "push", "receipt", "seq", "length", "scheduleTask", "Context", "emit", "defaultCodec", "encode", "obj", "Buffer", "from", "JSON", "stringify", "decode", "buffer", "parse", "toString", "defaultValueEncoding", "createCodecEncoding", "defaultTestBlockGenerator", "i", "id", "faker", "string", "uuid", "index", "value", "lorem", "sentence", "TestGenerator", "_generate", "_count", "writeBlocks", "writer", "count", "delay", "Promise", "all", "Array", "map", "sleep", "number", "int", "defaultTestGenerator", "evaluate", "builder", "arg", "TestBuilder", "ROOT_DIR", "_properties", "clone", "Object", "assign", "keyring", "Keyring", "storage", "createStorage", "type", "StorageType", "RAM", "root", "createDirectory", "setKeyring", "setStorage", "setRoot", "createFeedFactory", "FeedFactory", "signer", "hypercore", "valueEncoding", "createFeedStore", "FeedStore", "factory", "TestItemBuilder", "generator"]
7
- }
@@ -1,7 +0,0 @@
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](): string {\n return inspectObject(this);\n }\n\n toJSON(): { feedKey: PublicKey; length: number; opened: boolean; closed: boolean } {\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 });\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(): Promise<void> {\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): Promise<void> {\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): 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): 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(): Promise<void> {\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": "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",
6
- "names": ["inspect", "Readable", "Transform", "Trigger", "inspectObject", "StackTrace", "invariant", "log", "arrayToBuffer", "createBinder", "rangeFromTo", "FeedWrapper", "_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", "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", "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
- }