@dxos/hypercore 0.1.12 → 0.1.14

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 (87) hide show
  1. package/dist/lib/browser/index.mjs +106 -0
  2. package/dist/lib/browser/index.mjs.map +7 -0
  3. package/dist/lib/browser/meta.json +1 -0
  4. package/dist/lib/node/index.cjs +147 -0
  5. package/dist/lib/node/index.cjs.map +7 -0
  6. package/dist/lib/node/meta.json +1 -0
  7. package/dist/{src → types/src}/crypto.d.ts +0 -0
  8. package/dist/types/src/crypto.d.ts.map +1 -0
  9. package/dist/{src → types/src}/defaults.d.ts +0 -0
  10. package/dist/types/src/defaults.d.ts.map +1 -0
  11. package/dist/{src → types/src}/hypercore-factory.d.ts +0 -0
  12. package/dist/types/src/hypercore-factory.d.ts.map +1 -0
  13. package/dist/{src → types/src}/hypercore-factory.test.d.ts +0 -0
  14. package/dist/types/src/hypercore-factory.test.d.ts.map +1 -0
  15. package/dist/{src → types/src}/hypercore-protocol.test.d.ts +0 -0
  16. package/dist/types/src/hypercore-protocol.test.d.ts.map +1 -0
  17. package/dist/{src → types/src}/hypercore.test.d.ts +0 -0
  18. package/dist/{src → types/src}/hypercore.test.d.ts.map +1 -1
  19. package/dist/{src → types/src}/index.d.ts +0 -0
  20. package/dist/types/src/index.d.ts.map +1 -0
  21. package/dist/{src → types/src}/iterator.d.ts +0 -0
  22. package/dist/types/src/iterator.d.ts.map +1 -0
  23. package/dist/{src → types/src}/iterator.test.d.ts +0 -0
  24. package/dist/{src → types/src}/iterator.test.d.ts.map +1 -1
  25. package/dist/{src → types/src}/multiplexer.d.ts +0 -0
  26. package/dist/types/src/multiplexer.d.ts.map +1 -0
  27. package/dist/{src → types/src}/multiplexer.test.d.ts +0 -0
  28. package/dist/types/src/multiplexer.test.d.ts.map +1 -0
  29. package/dist/{src → types/src}/replicate.test.d.ts +0 -0
  30. package/dist/{src → types/src}/replicate.test.d.ts.map +1 -1
  31. package/dist/{src → types/src}/streams.test.d.ts +0 -0
  32. package/dist/{src → types/src}/streams.test.d.ts.map +1 -1
  33. package/dist/{src → types/src}/testing.d.ts +2 -3
  34. package/dist/types/src/testing.d.ts.map +1 -0
  35. package/dist/types/src/util.d.ts +2 -0
  36. package/dist/types/src/util.d.ts.map +1 -0
  37. package/package.json +13 -15
  38. package/src/crypto.ts +1 -1
  39. package/src/hypercore-factory.test.ts +5 -3
  40. package/src/hypercore-factory.ts +2 -2
  41. package/src/hypercore-protocol.test.ts +5 -4
  42. package/src/hypercore.test.ts +4 -3
  43. package/src/iterator.test.ts +3 -2
  44. package/src/multiplexer.test.ts +6 -4
  45. package/src/multiplexer.ts +1 -1
  46. package/src/replicate.test.ts +5 -4
  47. package/src/streams.test.ts +4 -3
  48. package/src/testing.ts +0 -3
  49. package/src/util.ts +7 -0
  50. package/dist/src/crypto.d.ts.map +0 -1
  51. package/dist/src/crypto.js +0 -45
  52. package/dist/src/crypto.js.map +0 -1
  53. package/dist/src/defaults.d.ts.map +0 -1
  54. package/dist/src/defaults.js +0 -44
  55. package/dist/src/defaults.js.map +0 -1
  56. package/dist/src/hypercore-factory.d.ts.map +0 -1
  57. package/dist/src/hypercore-factory.js +0 -44
  58. package/dist/src/hypercore-factory.js.map +0 -1
  59. package/dist/src/hypercore-factory.test.d.ts.map +0 -1
  60. package/dist/src/hypercore-factory.test.js +0 -46
  61. package/dist/src/hypercore-factory.test.js.map +0 -1
  62. package/dist/src/hypercore-protocol.test.d.ts.map +0 -1
  63. package/dist/src/hypercore-protocol.test.js +0 -191
  64. package/dist/src/hypercore-protocol.test.js.map +0 -1
  65. package/dist/src/hypercore.test.js +0 -79
  66. package/dist/src/hypercore.test.js.map +0 -1
  67. package/dist/src/index.d.ts.map +0 -1
  68. package/dist/src/index.js +0 -24
  69. package/dist/src/index.js.map +0 -1
  70. package/dist/src/iterator.d.ts.map +0 -1
  71. package/dist/src/iterator.js +0 -37
  72. package/dist/src/iterator.js.map +0 -1
  73. package/dist/src/iterator.test.js +0 -61
  74. package/dist/src/iterator.test.js.map +0 -1
  75. package/dist/src/multiplexer.d.ts.map +0 -1
  76. package/dist/src/multiplexer.js +0 -103
  77. package/dist/src/multiplexer.js.map +0 -1
  78. package/dist/src/multiplexer.test.d.ts.map +0 -1
  79. package/dist/src/multiplexer.test.js +0 -142
  80. package/dist/src/multiplexer.test.js.map +0 -1
  81. package/dist/src/replicate.test.js +0 -197
  82. package/dist/src/replicate.test.js.map +0 -1
  83. package/dist/src/streams.test.js +0 -65
  84. package/dist/src/streams.test.js.map +0 -1
  85. package/dist/src/testing.d.ts.map +0 -1
  86. package/dist/src/testing.js +0 -36
  87. package/dist/src/testing.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAIA,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,qBAAqB,CAAC;AACpC,cAAc,YAAY,CAAC"}
package/dist/src/index.js DELETED
@@ -1,24 +0,0 @@
1
- "use strict";
2
- //
3
- // Copyright 2021 DXOS.org
4
- //
5
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
- if (k2 === undefined) k2 = k;
7
- var desc = Object.getOwnPropertyDescriptor(m, k);
8
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
- desc = { enumerable: true, get: function() { return m[k]; } };
10
- }
11
- Object.defineProperty(o, k2, desc);
12
- }) : (function(o, m, k, k2) {
13
- if (k2 === undefined) k2 = k;
14
- o[k2] = m[k];
15
- }));
16
- var __exportStar = (this && this.__exportStar) || function(m, exports) {
17
- for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
18
- };
19
- Object.defineProperty(exports, "__esModule", { value: true });
20
- __exportStar(require("./crypto"), exports);
21
- __exportStar(require("./defaults"), exports);
22
- __exportStar(require("./hypercore-factory"), exports);
23
- __exportStar(require("./iterator"), exports);
24
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAAA,EAAE;AACF,0BAA0B;AAC1B,EAAE;;;;;;;;;;;;;;;;AAEF,2CAAyB;AACzB,6CAA2B;AAC3B,sDAAoC;AACpC,6CAA2B"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"iterator.d.ts","sourceRoot":"","sources":["../../src/iterator.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,QAAQ,IAAI,eAAe,EAAE,MAAM,SAAS,CAAC;AAEtD;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,cAAc,WAAY,eAAe,KAAG,QAExD,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,mBAAmB,WAAY,QAAQ,KAAG,cAAc,GAAG,CAEvE,CAAC"}
@@ -1,37 +0,0 @@
1
- "use strict";
2
- //
3
- // Copyright 2022 DXOS.org
4
- //
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.createAsyncIterator = exports.createReadable = void 0;
7
- const readable_stream_1 = require("readable-stream");
8
- /**
9
- * Wraps streamx.Readable (hypercore.createReadStream) to a standard Readable stream.
10
- *
11
- * The read-stream package is mirror of the streams implementations in Node.js 18.9.0.
12
- * This function is here to standardize the cast in case there are incompatibilities
13
- * across different platforms.
14
- *
15
- * Hypercore createReadStream returns a `streamx` Readable, which does not close properly on destroy.
16
- *
17
- * https://github.com/nodejs/readable-stream
18
- * https://nodejs.org/api/stream.html#readable-streams
19
- * https://nodejs.org/dist/v18.9.0/docs/api/stream.html#readablewrapstream
20
- */
21
- const createReadable = (stream) => {
22
- return new readable_stream_1.Readable({ objectMode: true }).wrap(stream);
23
- };
24
- exports.createReadable = createReadable;
25
- /**
26
- * Converts streamx.Readable (hypercore.createReadStream) to an async iterator.
27
- *
28
- * https://github.com/tc39/proposal-async-iteration
29
- * https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-3.html#async-iteration
30
- * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Iterators_and_Generators
31
- * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols
32
- */
33
- const createAsyncIterator = (stream) => {
34
- return stream[Symbol.asyncIterator]();
35
- };
36
- exports.createAsyncIterator = createAsyncIterator;
37
- //# sourceMappingURL=iterator.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"iterator.js","sourceRoot":"","sources":["../../src/iterator.ts"],"names":[],"mappings":";AAAA,EAAE;AACF,0BAA0B;AAC1B,EAAE;;;AAEF,qDAA2C;AAG3C;;;;;;;;;;;;GAYG;AACI,MAAM,cAAc,GAAG,CAAC,MAAuB,EAAY,EAAE;IAClE,OAAO,IAAI,0BAAQ,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,MAAa,CAAC,CAAC;AAChE,CAAC,CAAC;AAFW,QAAA,cAAc,kBAEzB;AAEF;;;;;;;GAOG;AACI,MAAM,mBAAmB,GAAG,CAAC,MAAgB,EAAsB,EAAE;IAC1E,OAAO,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC;AACxC,CAAC,CAAC;AAFW,QAAA,mBAAmB,uBAE9B"}
@@ -1,61 +0,0 @@
1
- "use strict";
2
- //
3
- // Copyright 2019 DXOS.org
4
- //
5
- var __importDefault = (this && this.__importDefault) || function (mod) {
6
- return (mod && mod.__esModule) ? mod : { "default": mod };
7
- };
8
- Object.defineProperty(exports, "__esModule", { value: true });
9
- const node_util_1 = __importDefault(require("node:util"));
10
- const async_1 = require("@dxos/async");
11
- const crypto_1 = require("@dxos/crypto");
12
- const log_1 = require("@dxos/log");
13
- const hypercore_factory_1 = require("./hypercore-factory");
14
- const iterator_1 = require("./iterator");
15
- describe('AsyncIterator', function () {
16
- it('iterates a feed until stopped', async function () {
17
- const factory = new hypercore_factory_1.HypercoreFactory();
18
- const { publicKey, secretKey } = (0, crypto_1.createKeyPair)();
19
- const core = factory.createFeed(publicKey, { secretKey });
20
- const numBlocks = 10;
21
- // Write.
22
- {
23
- const append = node_util_1.default.promisify(core.append.bind(core));
24
- for (let i = 0; i < numBlocks; i++) {
25
- await append(`test-${i}`);
26
- }
27
- }
28
- // Read until stopped.
29
- {
30
- // Read forever.
31
- // NOTE: Read must be opened in live mode.
32
- // NOTE: Uses wrapper to normalize stream; otherwise done isn't called after destroying the stream.
33
- const stream = (0, iterator_1.createReadable)(core.createReadStream({ live: true }));
34
- // Use util to create reliable iterators.
35
- const iterator = (0, iterator_1.createAsyncIterator)(stream);
36
- const [streamEnded, end] = (0, async_1.latch)();
37
- const [readAll, inc] = (0, async_1.latch)({ count: numBlocks });
38
- setTimeout(async () => {
39
- while (true) {
40
- try {
41
- const { value, done } = await iterator.next();
42
- if (done) {
43
- end();
44
- break;
45
- }
46
- (0, log_1.log)('received', { data: String(value) }, { file: "packages/common/hypercore/src/iterator.test.ts", line: 51, scope: this, bugcheck: "If you see this message then it means that the source code preprocessor for @dxos/log is broken. It probably has misinterpreted an unrelated call for a logger invocation.", callSite: (fn, args) => fn(...args) });
47
- inc();
48
- }
49
- catch (err) {
50
- end();
51
- break;
52
- }
53
- }
54
- });
55
- await readAll();
56
- stream.destroy();
57
- await streamEnded();
58
- }
59
- });
60
- });
61
- //# sourceMappingURL=iterator.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"iterator.test.js","sourceRoot":"","sources":["../../src/iterator.test.ts"],"names":[],"mappings":";AAAA,EAAE;AACF,0BAA0B;AAC1B,EAAE;;;;;AAEF,0DAA6B;AAE7B,uCAAoC;AACpC,yCAA6C;AAC7C,mCAAgC;AAEhC,2DAAuD;AACvD,yCAAiE;AAEjE,QAAQ,CAAC,eAAe,EAAE;IACxB,EAAE,CAAC,+BAA+B,EAAE,KAAK;QACvC,MAAM,OAAO,GAAG,IAAI,oCAAgB,EAAE,CAAC;QACvC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,IAAA,sBAAa,GAAE,CAAC;QACjD,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;QAE1D,MAAM,SAAS,GAAG,EAAE,CAAC;QAErB,SAAS;QACT;YACE,MAAM,MAAM,GAAG,mBAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YACtD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE,EAAE;gBAClC,MAAM,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;aAC3B;SACF;QAED,sBAAsB;QACtB;YACE,gBAAgB;YAChB,0CAA0C;YAC1C,mGAAmG;YACnG,MAAM,MAAM,GAAG,IAAA,yBAAc,EAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YAErE,yCAAyC;YACzC,MAAM,QAAQ,GAAG,IAAA,8BAAmB,EAAC,MAAM,CAAC,CAAC;YAE7C,MAAM,CAAC,WAAW,EAAE,GAAG,CAAC,GAAG,IAAA,aAAK,GAAE,CAAC;YACnC,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,GAAG,IAAA,aAAK,EAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;YACnD,UAAU,CAAC,KAAK,IAAI,EAAE;gBACpB,OAAO,IAAI,EAAE;oBACX,IAAI;wBACF,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;wBAC9C,IAAI,IAAI,EAAE;4BACR,GAAG,EAAE,CAAC;4BACN,MAAM;yBACP;wBAED,IAAA,SAAG,EAAC,UAAU,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,iTAAC,CAAC;wBACzC,GAAG,EAAE,CAAC;qBACP;oBAAC,OAAO,GAAG,EAAE;wBACZ,GAAG,EAAE,CAAC;wBACN,MAAM;qBACP;iBACF;YACH,CAAC,CAAC,CAAC;YAEH,MAAM,OAAO,EAAE,CAAC;YAEhB,MAAM,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,WAAW,EAAE,CAAC;SACrB;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"multiplexer.d.ts","sourceRoot":"","sources":["../../src/multiplexer.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EAAE,WAAW,EAAuB,MAAM,SAAS,CAAC;AAO3D;;GAEG;AAEH,qBAAa,WAAW;IAYpB,OAAO,CAAC,QAAQ,CAAC,GAAG;IAXtB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAwD;IAC/E,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA6D;IAEtF,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,cAAc,CAAoC;IAE1D,SAAgB,KAAK,cAAqB;IAC1C,SAAgB,MAAM,cAAqB;gBAIxB,GAAG,EAAE,MAAM;IAG9B,IAAI,MAAM,YAET;IAED,IAAI,KAAK,qBAER;IAED,OAAO,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,UAAQ;IA6BpC,IAAI;IAuBJ,KAAK;CA4BZ"}
@@ -1,103 +0,0 @@
1
- "use strict";
2
- //
3
- // Copyright 2022 DXOS.org
4
- //
5
- var __importDefault = (this && this.__importDefault) || function (mod) {
6
- return (mod && mod.__esModule) ? mod : { "default": mod };
7
- };
8
- Object.defineProperty(exports, "__esModule", { value: true });
9
- exports.Multiplexer = void 0;
10
- const assert_1 = __importDefault(require("assert"));
11
- const streamx_1 = require("streamx");
12
- const async_1 = require("@dxos/async");
13
- const keys_1 = require("@dxos/keys");
14
- const log_1 = require("@dxos/log");
15
- const util_1 = require("@dxos/util");
16
- /**
17
- * Hypercore multiplexer.
18
- */
19
- // TODO(burdon): Add encoding.
20
- class Multiplexer {
21
- // prettier-ignore
22
- constructor(_id) {
23
- this._id = _id;
24
- this._feeds = new util_1.ComplexMap(keys_1.PublicKey.hash);
25
- this._streams = new util_1.ComplexMap(keys_1.PublicKey.hash);
26
- this._isOpen = false;
27
- this._closedTrigger = new async_1.Trigger({ autoReset: true });
28
- this.input = new streamx_1.PassThrough();
29
- this.output = new streamx_1.PassThrough();
30
- }
31
- get isOpen() {
32
- return this._isOpen;
33
- }
34
- get feeds() {
35
- return Array.from(this._feeds.values());
36
- }
37
- addFeed(core, initiator = false) {
38
- const stream = core.replicate(initiator, { live: true });
39
- const feedKey = keys_1.PublicKey.from(core.key);
40
- this._feeds.set(feedKey, core);
41
- this._streams.set(feedKey, stream);
42
- (0, log_1.log)('added', { feedKey: keys_1.PublicKey.from(feedKey) }, { file: "packages/common/hypercore/src/multiplexer.ts", line: 48, scope: this, bugcheck: "If you see this message then it means that the source code preprocessor for @dxos/log is broken. It probably has misinterpreted an unrelated call for a logger invocation.", callSite: (fn, args) => fn(...args) });
43
- stream
44
- .pipe(new streamx_1.Transform({
45
- transform: (data, next) => {
46
- (0, log_1.log)('send', { id: this._id, feedKey: keys_1.PublicKey.from(feedKey), payload: data.length }, { file: "packages/common/hypercore/src/multiplexer.ts", line: 54, scope: this, bugcheck: "If you see this message then it means that the source code preprocessor for @dxos/log is broken. It probably has misinterpreted an unrelated call for a logger invocation.", callSite: (fn, args) => fn(...args) });
47
- next(null, {
48
- feedKey: core.key,
49
- payload: data
50
- });
51
- }
52
- }))
53
- .pipe(this.output, () => {
54
- (0, log_1.log)('pipeline closed', { id: this._id }, { file: "packages/common/hypercore/src/multiplexer.ts", line: 63, scope: this, bugcheck: "If you see this message then it means that the source code preprocessor for @dxos/log is broken. It probably has misinterpreted an unrelated call for a logger invocation.", callSite: (fn, args) => fn(...args) });
55
- this._isOpen = false;
56
- this._closedTrigger.wake();
57
- });
58
- return this;
59
- }
60
- async open() {
61
- if (this._isOpen) {
62
- return;
63
- }
64
- this.input.pipe(new streamx_1.Writable({
65
- write: (data, next) => {
66
- const { feedKey, payload } = data;
67
- const feedStream = this._streams.get(keys_1.PublicKey.from(feedKey));
68
- (0, assert_1.default)(feedStream, `invalid stream: ${keys_1.PublicKey.from(feedKey).truncate()}`);
69
- (0, log_1.log)('recv', { id: this._id, feedKey: keys_1.PublicKey.from(feedKey), payload: payload.length }, { file: "packages/common/hypercore/src/multiplexer.ts", line: 82, scope: this, bugcheck: "If you see this message then it means that the source code preprocessor for @dxos/log is broken. It probably has misinterpreted an unrelated call for a logger invocation.", callSite: (fn, args) => fn(...args) });
70
- feedStream.write(payload);
71
- next();
72
- }
73
- }));
74
- (0, log_1.log)('opened', {}, { file: "packages/common/hypercore/src/multiplexer.ts", line: 89, scope: this, bugcheck: "If you see this message then it means that the source code preprocessor for @dxos/log is broken. It probably has misinterpreted an unrelated call for a logger invocation.", callSite: (fn, args) => fn(...args) });
75
- this._isOpen = true;
76
- }
77
- // TODO(burdon): Test if re-entrant?
78
- async close() {
79
- if (!this._isOpen) {
80
- return;
81
- }
82
- (0, log_1.log)('closing...', {}, { file: "packages/common/hypercore/src/multiplexer.ts", line: 99, scope: this, bugcheck: "If you see this message then it means that the source code preprocessor for @dxos/log is broken. It probably has misinterpreted an unrelated call for a logger invocation.", callSite: (fn, args) => fn(...args) });
83
- const [closed, setClosed] = (0, async_1.latch)({ count: this._streams.size });
84
- Array.from(this._streams.values()).forEach((stream) => {
85
- stream.once('end', () => {
86
- (0, log_1.log)('stream closed', {}, { file: "packages/common/hypercore/src/multiplexer.ts", line: 103, scope: this, bugcheck: "If you see this message then it means that the source code preprocessor for @dxos/log is broken. It probably has misinterpreted an unrelated call for a logger invocation.", callSite: (fn, args) => fn(...args) });
87
- setClosed();
88
- });
89
- stream.finalize();
90
- });
91
- await closed();
92
- // NOTE: Depending on environment, pipeline may close before or after the stream above.
93
- if (this._isOpen) {
94
- await this._closedTrigger.wait();
95
- (0, assert_1.default)(!this._isOpen);
96
- }
97
- this._feeds.clear();
98
- this._streams.clear();
99
- (0, log_1.log)('closed', {}, { file: "packages/common/hypercore/src/multiplexer.ts", line: 120, scope: this, bugcheck: "If you see this message then it means that the source code preprocessor for @dxos/log is broken. It probably has misinterpreted an unrelated call for a logger invocation.", callSite: (fn, args) => fn(...args) });
100
- }
101
- }
102
- exports.Multiplexer = Multiplexer;
103
- //# sourceMappingURL=multiplexer.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"multiplexer.js","sourceRoot":"","sources":["../../src/multiplexer.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"multiplexer.test.d.ts","sourceRoot":"","sources":["../../src/multiplexer.test.ts"],"names":[],"mappings":""}
@@ -1,142 +0,0 @@
1
- "use strict";
2
- //
3
- // Copyright 2022 DXOS.org
4
- //
5
- var __importDefault = (this && this.__importDefault) || function (mod) {
6
- return (mod && mod.__esModule) ? mod : { "default": mod };
7
- };
8
- Object.defineProperty(exports, "__esModule", { value: true });
9
- const chai_1 = require("chai");
10
- const faker_1 = __importDefault(require("faker"));
11
- const streamx_1 = require("streamx");
12
- const async_1 = require("@dxos/async");
13
- const crypto_1 = require("@dxos/crypto");
14
- const keys_1 = require("@dxos/keys");
15
- const log_1 = require("@dxos/log");
16
- const hypercore_factory_1 = require("./hypercore-factory");
17
- const multiplexer_1 = require("./multiplexer");
18
- const testing_1 = require("./testing");
19
- describe('Multiplexing', function () {
20
- it.only('multiplexes feeds', async function () {
21
- const plex1 = new multiplexer_1.Multiplexer('A');
22
- const plex2 = new multiplexer_1.Multiplexer('B');
23
- await plex1.open();
24
- await plex2.open();
25
- const numFeeds = 1;
26
- const factory = new hypercore_factory_1.HypercoreFactory();
27
- const feeds = await Promise.all(Array.from(Array(numFeeds)).map(async () => {
28
- const { publicKey, secretKey } = (0, crypto_1.createKeyPair)();
29
- const core1 = factory.createFeed(publicKey, { secretKey });
30
- const core2 = factory.createFeed(publicKey);
31
- await (0, testing_1.py)(core1, core1.open)();
32
- await (0, testing_1.py)(core2, core2.open)();
33
- plex1.addFeed(core1, true);
34
- plex2.addFeed(core2);
35
- return [core1, core2];
36
- }));
37
- feeds.forEach(([core1, core2]) => {
38
- (0, chai_1.expect)(core1.stats.peers.length).to.eq(1);
39
- (0, chai_1.expect)(core2.stats.peers.length).to.eq(1);
40
- });
41
- const [closed, setClosed] = (0, async_1.latch)({ count: 2 });
42
- // TODO(burdon): Test with additional PassThrough.
43
- plex1.output.pipe(plex2.input, setClosed);
44
- plex2.output.pipe(plex1.input, setClosed);
45
- const numMessages = 1;
46
- const written = new Set();
47
- Array.from(Array(numMessages)).forEach((_, i) => {
48
- const [core] = faker_1.default.random.arrayElement(feeds);
49
- written.add(core.key.toString());
50
- core.append(`test-${i}: ${faker_1.default.lorem.sentence(10)}`, testing_1.noop); // Long message.
51
- });
52
- {
53
- const [synced, setSynced] = (0, async_1.latch)({ count: written.size });
54
- feeds.forEach(([, core2]) => {
55
- core2.on('sync', () => {
56
- (0, log_1.log)('sync', { feedKey: keys_1.PublicKey.from(core2.key) }, { file: "packages/common/hypercore/src/multiplexer.test.ts", line: 66, scope: this, bugcheck: "If you see this message then it means that the source code preprocessor for @dxos/log is broken. It probably has misinterpreted an unrelated call for a logger invocation.", callSite: (fn, args) => fn(...args) });
57
- setSynced();
58
- });
59
- });
60
- await synced();
61
- }
62
- await plex1.close();
63
- await plex2.close();
64
- await closed();
65
- (0, chai_1.expect)(plex1.isOpen).to.be.false;
66
- (0, chai_1.expect)(plex2.isOpen).to.be.false;
67
- const count = feeds.reduce((total, [, core2]) => total + core2.length, 0);
68
- (0, chai_1.expect)(count).to.eq(numMessages);
69
- });
70
- it('pipelines', async function () {
71
- const factory = new hypercore_factory_1.HypercoreFactory();
72
- const { publicKey, secretKey } = (0, crypto_1.createKeyPair)();
73
- const core1 = factory.createFeed(publicKey, { secretKey });
74
- const core2 = factory.createFeed(publicKey);
75
- await (0, testing_1.py)(core1, core1.open)();
76
- await (0, testing_1.py)(core2, core2.open)();
77
- const stream1 = core1.replicate(true, { live: true });
78
- const stream2 = core2.replicate(false, { live: true });
79
- //
80
- // Pipeline
81
- //
82
- const createWireTap = (label) => new streamx_1.Transform({
83
- transform: (data, next) => {
84
- (0, log_1.log)(label, { length: data.length }, { file: "packages/common/hypercore/src/multiplexer.test.ts", line: 104, scope: this, bugcheck: "If you see this message then it means that the source code preprocessor for @dxos/log is broken. It probably has misinterpreted an unrelated call for a logger invocation.", callSite: (fn, args) => fn(...args) });
85
- next(null, data);
86
- }
87
- });
88
- const [pipelineClosed, onStreamClose] = (0, async_1.latch)({ count: 2 });
89
- const createPipeline = (type) => {
90
- switch (type) {
91
- case 1:
92
- // prettier-ignore
93
- return stream1
94
- .pipe(stream2, onStreamClose)
95
- .pipe(stream1, onStreamClose);
96
- case 2:
97
- // prettier-ignore
98
- return stream1
99
- .pipe(new streamx_1.PassThrough())
100
- .pipe(stream2, onStreamClose)
101
- .pipe(new streamx_1.PassThrough())
102
- .pipe(stream1, onStreamClose);
103
- case 3:
104
- // prettier-ignore
105
- return stream1
106
- .pipe(createWireTap('send'))
107
- .pipe(stream2, onStreamClose)
108
- .pipe(createWireTap('recv'))
109
- .pipe(stream1, onStreamClose);
110
- }
111
- };
112
- const pipeline = createPipeline(3);
113
- (0, chai_1.expect)(core1.stats.peers).to.have.lengthOf(1);
114
- (0, chai_1.expect)(core2.stats.peers).to.have.lengthOf(1);
115
- //
116
- // Sync
117
- //
118
- const numMessages = 10;
119
- const [synced, setSynced] = (0, async_1.latch)();
120
- core2.on('sync', () => {
121
- (0, log_1.log)('sync', { send: core1.stats.totals, recv: core1.stats.totals }, { file: "packages/common/hypercore/src/multiplexer.test.ts", line: 147, scope: this, bugcheck: "If you see this message then it means that the source code preprocessor for @dxos/log is broken. It probably has misinterpreted an unrelated call for a logger invocation.", callSite: (fn, args) => fn(...args) });
122
- (0, chai_1.expect)(core2.length).to.eq(10);
123
- setSynced();
124
- });
125
- Array.from(Array(numMessages)).map((_, i) => core1.append(`test-${i}: ${faker_1.default.lorem.sentence()}`, testing_1.noop));
126
- await synced();
127
- //
128
- // Close
129
- //
130
- {
131
- pipeline.finalize();
132
- await pipelineClosed();
133
- const [feedsClosed, done] = (0, async_1.latch)({ count: 2 });
134
- core1.close(done);
135
- core2.close(done);
136
- await feedsClosed();
137
- (0, chai_1.expect)(core1.closed).to.be.true;
138
- (0, chai_1.expect)(core2.closed).to.be.true;
139
- }
140
- });
141
- });
142
- //# sourceMappingURL=multiplexer.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"multiplexer.test.js","sourceRoot":"","sources":["../../src/multiplexer.test.ts"],"names":[],"mappings":";AAAA,EAAE;AACF,0BAA0B;AAC1B,EAAE;;;;;AAEF,+BAA8B;AAC9B,kDAA0B;AAC1B,qCAAiD;AAEjD,uCAAoC;AACpC,yCAA6C;AAC7C,qCAAuC;AACvC,mCAAgC;AAEhC,2DAAuD;AACvD,+CAA4C;AAC5C,uCAAqC;AAErC,QAAQ,CAAC,cAAc,EAAE;IACvB,EAAE,CAAC,IAAI,CAAC,mBAAmB,EAAE,KAAK;QAChC,MAAM,KAAK,GAAG,IAAI,yBAAW,CAAC,GAAG,CAAC,CAAC;QACnC,MAAM,KAAK,GAAG,IAAI,yBAAW,CAAC,GAAG,CAAC,CAAC;QAEnC,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;QAEnB,MAAM,QAAQ,GAAG,CAAC,CAAC;QACnB,MAAM,OAAO,GAAG,IAAI,oCAAgB,EAAE,CAAC;QACvC,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,GAAG,CAC7B,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE;YACzC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,IAAA,sBAAa,GAAE,CAAC;YACjD,MAAM,KAAK,GAAG,OAAO,CAAC,UAAU,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;YAC3D,MAAM,KAAK,GAAG,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;YAE5C,MAAM,IAAA,YAAE,EAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9B,MAAM,IAAA,YAAE,EAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YAE9B,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YAC3B,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YACrB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACxB,CAAC,CAAC,CACH,CAAC;QAEF,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE;YAC/B,IAAA,aAAM,EAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAC1C,IAAA,aAAM,EAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,IAAA,aAAK,EAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;QAEhD,kDAAkD;QAClD,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QAC1C,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QAE1C,MAAM,WAAW,GAAG,CAAC,CAAC;QACtB,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;QAClC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YAC9C,MAAM,CAAC,IAAI,CAAC,GAAG,eAAK,CAAC,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;YAChD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;YACjC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,eAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,cAAI,CAAC,CAAC,CAAC,gBAAgB;QAC/E,CAAC,CAAC,CAAC;QAEH;YACE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,IAAA,aAAK,EAAC,EAAE,KAAK,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;YAC3D,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE;gBAC1B,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE;oBACpB,IAAA,SAAG,EAAC,MAAM,EAAE,EAAE,OAAO,EAAE,gBAAS,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,oTAAC,CAAC;oBACpD,SAAS,EAAE,CAAC;gBACd,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YAEH,MAAM,MAAM,EAAE,CAAC;SAChB;QAED,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC;QACpB,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC;QACpB,MAAM,MAAM,EAAE,CAAC;QAEf,IAAA,aAAM,EAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC;QACjC,IAAA,aAAM,EAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC;QAEjC,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC1E,IAAA,aAAM,EAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,WAAW,EAAE,KAAK;QACnB,MAAM,OAAO,GAAG,IAAI,oCAAgB,EAAE,CAAC;QACvC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,IAAA,sBAAa,GAAE,CAAC;QACjD,MAAM,KAAK,GAAG,OAAO,CAAC,UAAU,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;QAC3D,MAAM,KAAK,GAAG,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QAE5C,MAAM,IAAA,YAAE,EAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAA,YAAE,EAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QAE9B,MAAM,OAAO,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACtD,MAAM,OAAO,GAAG,KAAK,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAEvD,EAAE;QACF,WAAW;QACX,EAAE;QAEF,MAAM,aAAa,GAAG,CAAC,KAAa,EAAE,EAAE,CACtC,IAAI,mBAAS,CAAC;YACZ,SAAS,EAAE,CAAC,IAAY,EAAE,IAA+C,EAAE,EAAE;gBAC3E,IAAA,SAAG,EAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,qTAAC,CAAC;gBACpC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YACnB,CAAC;SACF,CAAC,CAAC;QAEL,MAAM,CAAC,cAAc,EAAE,aAAa,CAAC,GAAG,IAAA,aAAK,EAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;QAC5D,MAAM,cAAc,GAAG,CAAC,IAAY,EAAE,EAAE;YACtC,QAAQ,IAAI,EAAE;gBACZ,KAAK,CAAC;oBACJ,kBAAkB;oBAClB,OAAO,OAAO;yBACX,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC;yBAC5B,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;gBAElC,KAAK,CAAC;oBACJ,kBAAkB;oBAClB,OAAO,OAAO;yBACX,IAAI,CAAC,IAAI,qBAAW,EAAE,CAAC;yBACvB,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC;yBAC5B,IAAI,CAAC,IAAI,qBAAW,EAAE,CAAC;yBACvB,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;gBAElC,KAAK,CAAC;oBACJ,kBAAkB;oBAClB,OAAO,OAAO;yBACX,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;yBAC3B,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC;yBAC5B,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;yBAC3B,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;aACnC;QACH,CAAC,CAAC;QAEF,MAAM,QAAQ,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;QACnC,IAAA,aAAM,EAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC9C,IAAA,aAAM,EAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAE9C,EAAE;QACF,OAAO;QACP,EAAE;QAEF,MAAM,WAAW,GAAG,EAAE,CAAC;QACvB,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,IAAA,aAAK,GAAE,CAAC;QACpC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE;YACpB,IAAA,SAAG,EAAC,MAAM,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,qTAAC,CAAC;YACpE,IAAA,aAAM,EAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YAC/B,SAAS,EAAE,CAAC;QACd,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,eAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,EAAE,cAAI,CAAC,CAAC,CAAC;QACzG,MAAM,MAAM,EAAE,CAAC;QAEf,EAAE;QACF,QAAQ;QACR,EAAE;QAEF;YACE,QAAQ,CAAC,QAAQ,EAAE,CAAC;YACpB,MAAM,cAAc,EAAE,CAAC;YAEvB,MAAM,CAAC,WAAW,EAAE,IAAI,CAAC,GAAG,IAAA,aAAK,EAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;YAChD,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAClB,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAClB,MAAM,WAAW,EAAE,CAAC;YAEpB,IAAA,aAAM,EAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;YAChC,IAAA,aAAM,EAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;SACjC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,197 +0,0 @@
1
- "use strict";
2
- //
3
- // Copyright 2019 DXOS.org
4
- //
5
- var __importDefault = (this && this.__importDefault) || function (mod) {
6
- return (mod && mod.__esModule) ? mod : { "default": mod };
7
- };
8
- Object.defineProperty(exports, "__esModule", { value: true });
9
- const chai_1 = require("chai");
10
- const faker_1 = __importDefault(require("faker"));
11
- const async_1 = require("@dxos/async");
12
- const crypto_1 = require("@dxos/crypto");
13
- const log_1 = require("@dxos/log");
14
- const hypercore_factory_1 = require("./hypercore-factory");
15
- const iterator_1 = require("./iterator");
16
- const testing_1 = require("./testing");
17
- const noop = () => { };
18
- describe('Replication', function () {
19
- const factory1 = new hypercore_factory_1.HypercoreFactory();
20
- const factory2 = new hypercore_factory_1.HypercoreFactory();
21
- it('replicates feeds', async function () {
22
- const { publicKey, secretKey } = (0, crypto_1.createKeyPair)();
23
- const core1 = factory1.createFeed(publicKey, { secretKey });
24
- const core2 = factory2.createFeed(publicKey);
25
- // Open.
26
- {
27
- const [ready, done] = (0, async_1.latch)({ count: 2 });
28
- core1.open(done);
29
- core2.open(done);
30
- await ready();
31
- }
32
- const numBlocks = 10;
33
- // Sync.
34
- {
35
- const stream1 = core1.replicate(true);
36
- const stream2 = core2.replicate(false);
37
- const [streamsClosed, onClose] = (0, async_1.latch)({ count: 2 });
38
- stream1.pipe(stream2, onClose).pipe(stream1, onClose);
39
- (0, chai_1.expect)(core1.stats.peers).to.have.lengthOf(1);
40
- (0, chai_1.expect)(core2.stats.peers).to.have.lengthOf(1);
41
- // Wait for complete sync.
42
- core2.on('sync', () => {
43
- stream1.end();
44
- stream2.end();
45
- });
46
- // Write.
47
- for (let i = 0; i < numBlocks; i++) {
48
- core1.append(`test-${i}`, noop);
49
- }
50
- await streamsClosed();
51
- }
52
- // Close.
53
- {
54
- const [closed, close] = (0, async_1.latch)({ count: 2 });
55
- core1.close(close);
56
- core1.close(close);
57
- await closed();
58
- }
59
- (0, chai_1.expect)(core1.stats.totals.uploadedBlocks).to.eq(numBlocks);
60
- (0, chai_1.expect)(core2.stats.totals.downloadedBlocks).to.eq(numBlocks);
61
- });
62
- it('replicates feeds in batches', async function () {
63
- const numBlocks = 100;
64
- // Replicating feeds must have the same public key.
65
- const { publicKey, secretKey } = (0, crypto_1.createKeyPair)();
66
- const core1 = factory1.createFeed(publicKey, { secretKey });
67
- const core2 = factory2.createFeed(publicKey);
68
- // Open.
69
- {
70
- const [ready, done] = (0, async_1.latch)({ count: 2 });
71
- core1.open(done);
72
- core2.open(done);
73
- await ready();
74
- }
75
- const stream1 = core1.replicate(true);
76
- const stream2 = core2.replicate(false);
77
- // Start replication.
78
- // NOTE: Replication won't start unless the public keys on both sides are the same.
79
- const [streamsClosed, onClose] = (0, async_1.latch)({ count: 2 });
80
- stream1.pipe(stream2, onClose).pipe(stream1, onClose);
81
- (0, chai_1.expect)(core1.stats.peers).to.have.lengthOf(1);
82
- (0, chai_1.expect)(core2.stats.peers).to.have.lengthOf(1);
83
- // Replicate messages.
84
- {
85
- // Wait until all uploaded.
86
- const [waitForDownloaded, incDownload] = (0, async_1.latch)({ count: numBlocks });
87
- // Monitor uploads.
88
- let uploaded = 0;
89
- core1.on('upload', () => {
90
- uploaded++;
91
- (0, log_1.log)('up', { uploaded, length: core1.length }, { file: "packages/common/hypercore/src/replicate.test.ts", line: 111, scope: this, bugcheck: "If you see this message then it means that the source code preprocessor for @dxos/log is broken. It probably has misinterpreted an unrelated call for a logger invocation.", callSite: (fn, args) => fn(...args) });
92
- });
93
- // Monitor downloads.
94
- let downloaded = 0;
95
- core2.on('download', (seq, data) => {
96
- downloaded++;
97
- const { id } = JSON.parse(data.toString());
98
- (0, chai_1.expect)(id).to.eq(seq);
99
- (0, log_1.log)('down', { downloaded, length: core2.length }, { file: "packages/common/hypercore/src/replicate.test.ts", line: 120, scope: this, bugcheck: "If you see this message then it means that the source code preprocessor for @dxos/log is broken. It probably has misinterpreted an unrelated call for a logger invocation.", callSite: (fn, args) => fn(...args) });
100
- (0, chai_1.expect)(downloaded).to.be.lessThanOrEqual(uploaded);
101
- incDownload();
102
- });
103
- // Monitor sync points (multiple since delayed writes).
104
- const sync = { started: 0, complete: 0 };
105
- core2.on('sync', () => {
106
- (0, log_1.log)('sync', { events: ++sync.started }, { file: "packages/common/hypercore/src/replicate.test.ts", line: 128, scope: this, bugcheck: "If you see this message then it means that the source code preprocessor for @dxos/log is broken. It probably has misinterpreted an unrelated call for a logger invocation.", callSite: (fn, args) => fn(...args) });
107
- core2.download();
108
- });
109
- // Write batch of messages with delay.
110
- (0, testing_1.batch)((next, i, remaining) => {
111
- const size = faker_1.default.datatype.number({
112
- min: 1,
113
- max: Math.min(10, remaining)
114
- });
115
- for (let j = 0; j < size; j++) {
116
- core1.append(JSON.stringify((0, testing_1.createDataItem)(i + j)), noop);
117
- }
118
- // Random delay.
119
- setTimeout(() => {
120
- next(size);
121
- }, faker_1.default.datatype.number({ min: 0, max: 100 }));
122
- }, numBlocks);
123
- // Done.
124
- await waitForDownloaded();
125
- (0, chai_1.expect)(uploaded).to.eq(downloaded);
126
- }
127
- // Close streams.
128
- {
129
- stream1.end();
130
- stream2.end();
131
- await streamsClosed();
132
- (0, chai_1.expect)(stream1.destroyed).to.be.true;
133
- (0, chai_1.expect)(stream2.destroyed).to.be.true;
134
- }
135
- // Close feeds.
136
- {
137
- await core1.close();
138
- await core2.close();
139
- (0, chai_1.expect)(core1.writable).to.be.false;
140
- (0, chai_1.expect)(core1.stats.totals.uploadedBlocks).to.eq(numBlocks);
141
- (0, chai_1.expect)(core2.stats.totals.downloadedBlocks).to.eq(numBlocks);
142
- }
143
- }).timeout(5000);
144
- it('replicates feeds with read stream', async function () {
145
- const numBlocks = 10;
146
- const { publicKey, secretKey } = (0, crypto_1.createKeyPair)();
147
- const core1 = factory1.createFeed(publicKey, { secretKey });
148
- const core2 = factory2.createFeed(publicKey);
149
- // Open.
150
- {
151
- const [ready, done] = (0, async_1.latch)({ count: 2 });
152
- core1.open(done);
153
- core2.open(done);
154
- await ready();
155
- }
156
- (0, chai_1.expect)(core1.opened).to.be.true;
157
- (0, chai_1.expect)(core2.opened).to.be.true;
158
- const stream1 = core1.replicate(true, { live: true });
159
- const stream2 = core2.replicate(false, { live: true });
160
- const [done, onClose] = (0, async_1.latch)({ count: 2 });
161
- // Start replication.
162
- {
163
- stream1.pipe(stream2, onClose).pipe(stream1, onClose);
164
- (0, chai_1.expect)(core1.stats.peers).to.have.lengthOf(1);
165
- (0, chai_1.expect)(core2.stats.peers).to.have.lengthOf(1);
166
- let sync = 0;
167
- core2.on('sync', () => {
168
- (0, log_1.log)('sync', { events: ++sync }, { file: "packages/common/hypercore/src/replicate.test.ts", line: 206, scope: this, bugcheck: "If you see this message then it means that the source code preprocessor for @dxos/log is broken. It probably has misinterpreted an unrelated call for a logger invocation.", callSite: (fn, args) => fn(...args) });
169
- });
170
- }
171
- // Writer.
172
- {
173
- setTimeout(async () => {
174
- for (const _ of Array.from(Array(numBlocks))) {
175
- const block = {
176
- text: faker_1.default.lorem.sentence()
177
- };
178
- core1.append(JSON.stringify(block), noop);
179
- }
180
- });
181
- }
182
- // Reader.
183
- {
184
- const [done, inc] = (0, async_1.latch)({ count: numBlocks });
185
- setTimeout(async () => {
186
- for await (const _ of (0, iterator_1.createReadable)(core2.createReadStream({ live: true }))) {
187
- inc();
188
- }
189
- });
190
- await done();
191
- stream1.end();
192
- stream2.end();
193
- }
194
- await done();
195
- }).timeout(5000);
196
- });
197
- //# sourceMappingURL=replicate.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"replicate.test.js","sourceRoot":"","sources":["../../src/replicate.test.ts"],"names":[],"mappings":"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"}