@dxos/hypercore 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +4 -0
  3. package/dist/src/crypto.d.ts +13 -0
  4. package/dist/src/crypto.d.ts.map +1 -0
  5. package/dist/src/crypto.js +45 -0
  6. package/dist/src/crypto.js.map +1 -0
  7. package/dist/src/defaults.d.ts +18 -0
  8. package/dist/src/defaults.d.ts.map +1 -0
  9. package/dist/src/defaults.js +44 -0
  10. package/dist/src/defaults.js.map +1 -0
  11. package/dist/src/hypercore-factory.d.ts +23 -0
  12. package/dist/src/hypercore-factory.d.ts.map +1 -0
  13. package/dist/src/hypercore-factory.js +44 -0
  14. package/dist/src/hypercore-factory.js.map +1 -0
  15. package/dist/src/hypercore-factory.test.d.ts +2 -0
  16. package/dist/src/hypercore-factory.test.d.ts.map +1 -0
  17. package/dist/src/hypercore-factory.test.js +46 -0
  18. package/dist/src/hypercore-factory.test.js.map +1 -0
  19. package/dist/src/hypercore-protocol.test.d.ts +2 -0
  20. package/dist/src/hypercore-protocol.test.d.ts.map +1 -0
  21. package/dist/src/hypercore-protocol.test.js +191 -0
  22. package/dist/src/hypercore-protocol.test.js.map +1 -0
  23. package/dist/src/hypercore.test.d.ts +2 -0
  24. package/dist/src/hypercore.test.d.ts.map +1 -0
  25. package/dist/src/hypercore.test.js +79 -0
  26. package/dist/src/hypercore.test.js.map +1 -0
  27. package/dist/src/index.d.ts +5 -0
  28. package/dist/src/index.d.ts.map +1 -0
  29. package/dist/src/index.js +24 -0
  30. package/dist/src/index.js.map +1 -0
  31. package/dist/src/iterator.d.ts +26 -0
  32. package/dist/src/iterator.d.ts.map +1 -0
  33. package/dist/src/iterator.js +37 -0
  34. package/dist/src/iterator.js.map +1 -0
  35. package/dist/src/iterator.test.d.ts +2 -0
  36. package/dist/src/iterator.test.d.ts.map +1 -0
  37. package/dist/src/iterator.test.js +61 -0
  38. package/dist/src/iterator.test.js.map +1 -0
  39. package/dist/src/multiplexer.d.ts +21 -0
  40. package/dist/src/multiplexer.d.ts.map +1 -0
  41. package/dist/src/multiplexer.js +103 -0
  42. package/dist/src/multiplexer.js.map +1 -0
  43. package/dist/src/multiplexer.test.d.ts +2 -0
  44. package/dist/src/multiplexer.test.d.ts.map +1 -0
  45. package/dist/src/multiplexer.test.js +142 -0
  46. package/dist/src/multiplexer.test.js.map +1 -0
  47. package/dist/src/replicate.test.d.ts +2 -0
  48. package/dist/src/replicate.test.d.ts.map +1 -0
  49. package/dist/src/replicate.test.js +197 -0
  50. package/dist/src/replicate.test.js.map +1 -0
  51. package/dist/src/streams.test.d.ts +2 -0
  52. package/dist/src/streams.test.d.ts.map +1 -0
  53. package/dist/src/streams.test.js +65 -0
  54. package/dist/src/streams.test.js.map +1 -0
  55. package/dist/src/testing.d.ts +11 -0
  56. package/dist/src/testing.d.ts.map +1 -0
  57. package/dist/src/testing.js +36 -0
  58. package/dist/src/testing.js.map +1 -0
  59. package/package.json +50 -0
  60. package/src/crypto.ts +46 -0
  61. package/src/defaults.ts +46 -0
  62. package/src/hypercore-factory.test.ts +53 -0
  63. package/src/hypercore-factory.ts +44 -0
  64. package/src/hypercore-protocol.test.ts +236 -0
  65. package/src/hypercore.test.ts +98 -0
  66. package/src/index.ts +8 -0
  67. package/src/iterator.test.ts +66 -0
  68. package/src/iterator.ts +35 -0
  69. package/src/multiplexer.test.ts +172 -0
  70. package/src/multiplexer.ts +122 -0
  71. package/src/replicate.test.ts +241 -0
  72. package/src/streams.test.ts +75 -0
  73. package/src/testing.ts +40 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2022 DXOS.org
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,4 @@
1
+ # Keys
2
+
3
+ Very low-level key definitions.
4
+ NOTE: Do not add crypto dependencies here.
@@ -0,0 +1,13 @@
1
+ import { AbstractValueEncoding, Crypto } from 'hypercore';
2
+ import { Codec } from '@dxos/codec-protobuf';
3
+ import { Signer } from '@dxos/crypto';
4
+ import { PublicKey } from '@dxos/keys';
5
+ /**
6
+ * Create encoding (e.g., from protobuf codec).
7
+ */
8
+ export declare const createCodecEncoding: <T>(codec: Codec<T>) => AbstractValueEncoding<T>;
9
+ /**
10
+ * Create a custom hypercore crypto signer.
11
+ */
12
+ export declare const createCrypto: (signer: Signer, publicKey: PublicKey) => Crypto;
13
+ //# sourceMappingURL=crypto.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto.d.ts","sourceRoot":"","sources":["../../src/crypto.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,qBAAqB,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAG1D,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAmB,MAAM,cAAc,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC;;GAEG;AACH,eAAO,MAAM,mBAAmB,kDAG9B,CAAC;AAEH;;GAEG;AAEH,eAAO,MAAM,YAAY,WAAY,MAAM,aAAa,SAAS,KAAG,MAqBnE,CAAC"}
@@ -0,0 +1,45 @@
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.createCrypto = exports.createCodecEncoding = void 0;
10
+ const assert_1 = __importDefault(require("assert"));
11
+ const node_util_1 = require("node:util");
12
+ const crypto_1 = require("@dxos/crypto");
13
+ /**
14
+ * Create encoding (e.g., from protobuf codec).
15
+ */
16
+ const createCodecEncoding = (codec) => ({
17
+ encode: (obj) => Buffer.from(codec.encode(obj)),
18
+ decode: (buffer) => codec.decode(buffer)
19
+ });
20
+ exports.createCodecEncoding = createCodecEncoding;
21
+ /**
22
+ * Create a custom hypercore crypto signer.
23
+ */
24
+ // TODO(burdon): Create test without adding deps.
25
+ const createCrypto = (signer, publicKey) => {
26
+ (0, assert_1.default)(signer);
27
+ (0, assert_1.default)(publicKey);
28
+ return {
29
+ sign: (message, secretKey, cb) => {
30
+ (0, node_util_1.callbackify)(signer.sign.bind(signer))(publicKey, message, (err, result) => {
31
+ if (err) {
32
+ cb(err, null);
33
+ return;
34
+ }
35
+ cb(null, Buffer.from(result));
36
+ });
37
+ },
38
+ verify: async (message, signature, key, cb) => {
39
+ // NOTE: Uses the public key passed into function.
40
+ (0, node_util_1.callbackify)(crypto_1.verifySignature)(publicKey, message, signature, cb);
41
+ }
42
+ };
43
+ };
44
+ exports.createCrypto = createCrypto;
45
+ //# sourceMappingURL=crypto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto.js","sourceRoot":"","sources":["../../src/crypto.ts"],"names":[],"mappings":";AAAA,EAAE;AACF,0BAA0B;AAC1B,EAAE;;;;;;AAEF,oDAA4B;AAE5B,yCAAwC;AAGxC,yCAAuD;AAGvD;;GAEG;AACI,MAAM,mBAAmB,GAAG,CAAI,KAAe,EAA4B,EAAE,CAAC,CAAC;IACpF,MAAM,EAAE,CAAC,GAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAClD,MAAM,EAAE,CAAC,MAAc,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC;CACjD,CAAC,CAAC;AAHU,QAAA,mBAAmB,uBAG7B;AAEH;;GAEG;AACH,iDAAiD;AAC1C,MAAM,YAAY,GAAG,CAAC,MAAc,EAAE,SAAoB,EAAU,EAAE;IAC3E,IAAA,gBAAM,EAAC,MAAM,CAAC,CAAC;IACf,IAAA,gBAAM,EAAC,SAAS,CAAC,CAAC;IAElB,OAAO;QACL,IAAI,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE;YAC/B,IAAA,uBAAW,EAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAO,CAAC,CAAC,CAAC,SAAS,EAAE,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;gBACzE,IAAI,GAAG,EAAE;oBACP,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;oBACd,OAAO;iBACR;gBAED,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;YAChC,CAAC,CAAC,CAAC;QACL,CAAC;QAED,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE;YAC5C,kDAAkD;YAClD,IAAA,uBAAW,EAAC,wBAAe,CAAC,CAAC,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;QAClE,CAAC;KACF,CAAC;AACJ,CAAC,CAAC;AArBW,QAAA,YAAY,gBAqBvB"}
@@ -0,0 +1,18 @@
1
+ import type { HypercoreOptions, ReadStreamOptions, ReplicationOptions, WriteStreamOptions } from 'hypercore';
2
+ /**
3
+ * https://github.com/hypercore-protocol/hypercore/tree/v9.12.0#var-feed--hypercorestorage-key-options
4
+ */
5
+ export declare const defaultFeedOptions: HypercoreOptions;
6
+ /**
7
+ * https://github.com/hypercore-protocol/hypercore/tree/v9.12.0#var-stream--feedcreatereadstreamoptions
8
+ */
9
+ export declare const defaultReadStreamOptions: ReadStreamOptions;
10
+ /**
11
+ * https://github.com/hypercore-protocol/hypercore/tree/v9.12.0#var-stream--feedcreatewritestreamopts
12
+ */
13
+ export declare const defaultWriteStreamOptions: WriteStreamOptions;
14
+ /**
15
+ * https://github.com/hypercore-protocol/hypercore/tree/v9.12.0#var-stream--feedreplicateisinitiator-options
16
+ */
17
+ export declare const defaultReplicateOptions: ReplicationOptions;
18
+ //# sourceMappingURL=defaults.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../src/defaults.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAE7G;;GAEG;AACH,eAAO,MAAM,kBAAkB,EAAE,gBAGhC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,wBAAwB,EAAE,iBAStC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,yBAAyB,EAAE,kBAEvC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,uBAAuB,EAAE,kBAOrC,CAAC"}
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ //
3
+ // Copyright 2022 DXOS.org
4
+ //
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.defaultReplicateOptions = exports.defaultWriteStreamOptions = exports.defaultReadStreamOptions = exports.defaultFeedOptions = void 0;
7
+ /**
8
+ * https://github.com/hypercore-protocol/hypercore/tree/v9.12.0#var-feed--hypercorestorage-key-options
9
+ */
10
+ exports.defaultFeedOptions = {
11
+ createIfMissing: true,
12
+ valueEncoding: 'binary'
13
+ };
14
+ /**
15
+ * https://github.com/hypercore-protocol/hypercore/tree/v9.12.0#var-stream--feedcreatereadstreamoptions
16
+ */
17
+ exports.defaultReadStreamOptions = {
18
+ start: 0,
19
+ end: Infinity,
20
+ snapshot: true,
21
+ tail: false,
22
+ live: false,
23
+ timeout: 0,
24
+ wait: true,
25
+ batch: 1
26
+ };
27
+ /**
28
+ * https://github.com/hypercore-protocol/hypercore/tree/v9.12.0#var-stream--feedcreatewritestreamopts
29
+ */
30
+ exports.defaultWriteStreamOptions = {
31
+ maxBlockSize: Infinity
32
+ };
33
+ /**
34
+ * https://github.com/hypercore-protocol/hypercore/tree/v9.12.0#var-stream--feedreplicateisinitiator-options
35
+ */
36
+ exports.defaultReplicateOptions = {
37
+ live: false,
38
+ ack: false,
39
+ download: true,
40
+ upload: true,
41
+ encrypted: true,
42
+ noise: true
43
+ };
44
+ //# sourceMappingURL=defaults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/defaults.ts"],"names":[],"mappings":";AAAA,EAAE;AACF,0BAA0B;AAC1B,EAAE;;;AAIF;;GAEG;AACU,QAAA,kBAAkB,GAAqB;IAClD,eAAe,EAAE,IAAI;IACrB,aAAa,EAAE,QAAQ;CACxB,CAAC;AAEF;;GAEG;AACU,QAAA,wBAAwB,GAAsB;IACzD,KAAK,EAAE,CAAC;IACR,GAAG,EAAE,QAAQ;IACb,QAAQ,EAAE,IAAI;IACd,IAAI,EAAE,KAAK;IACX,IAAI,EAAE,KAAK;IACX,OAAO,EAAE,CAAC;IACV,IAAI,EAAE,IAAI;IACV,KAAK,EAAE,CAAC;CACT,CAAC;AAEF;;GAEG;AACU,QAAA,yBAAyB,GAAuB;IAC3D,YAAY,EAAE,QAAQ;CACvB,CAAC;AAEF;;GAEG;AACU,QAAA,uBAAuB,GAAuB;IACzD,IAAI,EAAE,KAAK;IACX,GAAG,EAAE,KAAK;IACV,QAAQ,EAAE,IAAI;IACd,MAAM,EAAE,IAAI;IACZ,SAAS,EAAE,IAAI;IACf,KAAK,EAAE,IAAI;CACZ,CAAC"}
@@ -0,0 +1,23 @@
1
+ /// <reference types="node" />
2
+ import hypercore from 'hypercore';
3
+ import type { Hypercore, HypercoreOptions } from 'hypercore';
4
+ import { Directory } from '@dxos/random-access-storage';
5
+ /**
6
+ * Creates feeds with default properties.
7
+ */
8
+ export declare class HypercoreFactory<T> {
9
+ private readonly _root;
10
+ private readonly _options?;
11
+ constructor(_root?: Directory, _options?: hypercore.HypercoreOptions | undefined);
12
+ /**
13
+ * Creates a feed using a storage factory prefixed with the feed's key.
14
+ * NOTE: We have to use our `random-access-storage` implementation since the native ones
15
+ * do not behave uniformly across platforms.
16
+ */
17
+ createFeed(publicKey: Buffer, options?: HypercoreOptions): Hypercore<T>;
18
+ /**
19
+ * Creates and opens a feed.
20
+ */
21
+ openFeed(publicKey: Buffer, options?: HypercoreOptions): Promise<Hypercore<T>>;
22
+ }
23
+ //# sourceMappingURL=hypercore-factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hypercore-factory.d.ts","sourceRoot":"","sources":["../../src/hypercore-factory.ts"],"names":[],"mappings":";AAKA,OAAO,SAAS,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAE7D,OAAO,EAAiB,SAAS,EAAe,MAAM,6BAA6B,CAAC;AAIpF;;GAEG;AACH,qBAAa,gBAAgB,CAAC,CAAC;IAG3B,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBADT,KAAK,GAAE,SAAsE,EAC7E,QAAQ,CAAC,wCAAkB;IAK9C;;;;OAIG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAAC,CAAC,CAAC;IAMvE;;OAEG;IACG,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;CAKrF"}
@@ -0,0 +1,44 @@
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.HypercoreFactory = void 0;
10
+ const assert_1 = __importDefault(require("assert"));
11
+ const hypercore_1 = __importDefault(require("hypercore"));
12
+ const random_access_storage_1 = require("@dxos/random-access-storage");
13
+ const testing_1 = require("./testing");
14
+ /**
15
+ * Creates feeds with default properties.
16
+ */
17
+ class HypercoreFactory {
18
+ // prettier-ignore
19
+ constructor(_root = (0, random_access_storage_1.createStorage)({ type: random_access_storage_1.StorageType.RAM }).createDirectory(), _options) {
20
+ this._root = _root;
21
+ this._options = _options;
22
+ (0, assert_1.default)(this._root);
23
+ }
24
+ /**
25
+ * Creates a feed using a storage factory prefixed with the feed's key.
26
+ * NOTE: We have to use our `random-access-storage` implementation since the native ones
27
+ * do not behave uniformly across platforms.
28
+ */
29
+ createFeed(publicKey, options) {
30
+ const directory = this._root.createDirectory(publicKey.toString());
31
+ const storage = (filename) => directory.getOrCreateFile(filename).native;
32
+ return (0, hypercore_1.default)(storage, publicKey, Object.assign({}, this._options, options));
33
+ }
34
+ /**
35
+ * Creates and opens a feed.
36
+ */
37
+ async openFeed(publicKey, options) {
38
+ const feed = this.createFeed(publicKey, options);
39
+ await (0, testing_1.py)(feed, feed.open)(); // TODO(burdon): Sometimes strange bug if done inside function.
40
+ return feed;
41
+ }
42
+ }
43
+ exports.HypercoreFactory = HypercoreFactory;
44
+ //# sourceMappingURL=hypercore-factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hypercore-factory.js","sourceRoot":"","sources":["../../src/hypercore-factory.ts"],"names":[],"mappings":";AAAA,EAAE;AACF,0BAA0B;AAC1B,EAAE;;;;;;AAEF,oDAA4B;AAC5B,0DAAkC;AAGlC,uEAAoF;AAEpF,uCAA+B;AAE/B;;GAEG;AACH,MAAa,gBAAgB;IAC3B,kBAAkB;IAClB,YACmB,QAAmB,IAAA,qCAAa,EAAC,EAAE,IAAI,EAAE,mCAAW,CAAC,GAAG,EAAE,CAAC,CAAC,eAAe,EAAE,EAC7E,QAA2B;QAD3B,UAAK,GAAL,KAAK,CAAwE;QAC7E,aAAQ,GAAR,QAAQ,CAAmB;QAE5C,IAAA,gBAAM,EAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;IAED;;;;OAIG;IACH,UAAU,CAAC,SAAiB,EAAE,OAA0B;QACtD,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC;QACnE,MAAM,OAAO,GAAG,CAAC,QAAgB,EAAE,EAAE,CAAC,SAAS,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC;QACjF,OAAO,IAAA,mBAAS,EAAC,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;IAClF,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ,CAAC,SAAiB,EAAE,OAA0B;QAC1D,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QACjD,MAAM,IAAA,YAAE,EAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,+DAA+D;QAC5F,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AA5BD,4CA4BC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=hypercore-factory.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hypercore-factory.test.d.ts","sourceRoot":"","sources":["../../src/hypercore-factory.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,46 @@
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 crypto_1 = require("@dxos/crypto");
12
+ const hypercore_factory_1 = require("./hypercore-factory");
13
+ const testing_1 = require("./testing");
14
+ describe('HypercoreFactory', function () {
15
+ it('appends to, and read from, multiple feeds', async function () {
16
+ const factory = new hypercore_factory_1.HypercoreFactory();
17
+ const numFeeds = 10;
18
+ const numBlocks = 100;
19
+ // Create feeds.
20
+ const feeds = await Promise.all(Array.from({ length: numFeeds }).map(async () => {
21
+ const { publicKey, secretKey } = (0, crypto_1.createKeyPair)();
22
+ return await factory.openFeed(publicKey, { secretKey });
23
+ }));
24
+ // Write data.
25
+ {
26
+ const data = Array.from({ length: numBlocks }).map((_, i) => (0, testing_1.createDataItem)(i));
27
+ for await (const datum of data) {
28
+ const feed = faker_1.default.random.arrayElement(feeds);
29
+ await (0, testing_1.py)(feed, feed.append)(Buffer.from(JSON.stringify(datum)));
30
+ }
31
+ }
32
+ // Test.
33
+ {
34
+ const total = feeds.reduce((result, feed) => result + feed.length, 0);
35
+ (0, chai_1.expect)(total).to.eq(numBlocks);
36
+ const feed = faker_1.default.random.arrayElement(feeds);
37
+ const block1 = await (0, testing_1.py)(feed, feed.head)();
38
+ const block2 = await (0, testing_1.py)(feed, feed.get)(feed.length - 1);
39
+ (0, chai_1.expect)(block1.toString()).to.eq(block2.toString());
40
+ const blocks = await (0, testing_1.py)(feed, feed.getBatch)(0, feed.length);
41
+ (0, chai_1.expect)(blocks.length).to.eq(feed.length);
42
+ }
43
+ await Promise.all(feeds.map((feed) => feed.close()));
44
+ });
45
+ });
46
+ //# sourceMappingURL=hypercore-factory.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hypercore-factory.test.js","sourceRoot":"","sources":["../../src/hypercore-factory.test.ts"],"names":[],"mappings":";AAAA,EAAE;AACF,0BAA0B;AAC1B,EAAE;;;;;AAEF,+BAA8B;AAC9B,kDAA0B;AAE1B,yCAA6C;AAE7C,2DAAuD;AACvD,uCAA+C;AAE/C,QAAQ,CAAC,kBAAkB,EAAE;IAC3B,EAAE,CAAC,2CAA2C,EAAE,KAAK;QACnD,MAAM,OAAO,GAAG,IAAI,oCAAgB,EAAE,CAAC;QAEvC,MAAM,QAAQ,GAAG,EAAE,CAAC;QACpB,MAAM,SAAS,GAAG,GAAG,CAAC;QAEtB,gBAAgB;QAChB,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,GAAG,CAC7B,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE;YAC9C,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,IAAA,sBAAa,GAAE,CAAC;YACjD,OAAO,MAAM,OAAO,CAAC,QAAQ,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;QAC1D,CAAC,CAAC,CACH,CAAC;QAEF,cAAc;QACd;YACE,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAA,wBAAc,EAAC,CAAC,CAAC,CAAC,CAAC;YAChF,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,IAAI,EAAE;gBAC9B,MAAM,IAAI,GAAG,eAAK,CAAC,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;gBAC9C,MAAM,IAAA,YAAE,EAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;aACjE;SACF;QAED,QAAQ;QACR;YACE,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YACtE,IAAA,aAAM,EAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;YAE/B,MAAM,IAAI,GAAG,eAAK,CAAC,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;YAC9C,MAAM,MAAM,GAAG,MAAM,IAAA,YAAE,EAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3C,MAAM,MAAM,GAAG,MAAM,IAAA,YAAE,EAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACzD,IAAA,aAAM,EAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;YAEnD,MAAM,MAAM,GAAG,MAAM,IAAA,YAAE,EAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YAC7D,IAAA,aAAM,EAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;SAC1C;QAED,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=hypercore-protocol.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hypercore-protocol.test.d.ts","sourceRoot":"","sources":["../../src/hypercore-protocol.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,191 @@
1
+ "use strict";
2
+ //
3
+ // Copyright 2020 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 hypercore_protocol_1 = __importDefault(require("hypercore-protocol"));
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
+ // TODO(burdon): Test encoding.
18
+ // TODO(burdon): Simulate multiple peers and broadcast.
19
+ describe('ProtocolStream', function () {
20
+ it('protocol stream handshake completes', async function () {
21
+ const [handshake, setHandshake] = (0, async_1.latch)({ count: 2 });
22
+ const stream1 = new hypercore_protocol_1.default(true, {
23
+ onhandshake: () => {
24
+ (0, log_1.log)('onhandshake', { key: keys_1.PublicKey.from(stream1.publicKey) }, { file: "packages/common/hypercore/src/hypercore-protocol.test.ts", line: 25 });
25
+ setHandshake();
26
+ }
27
+ });
28
+ const stream2 = new hypercore_protocol_1.default(false, {
29
+ onhandshake: () => {
30
+ (0, log_1.log)('onhandshake', { key: keys_1.PublicKey.from(stream2.publicKey) }, { file: "packages/common/hypercore/src/hypercore-protocol.test.ts", line: 32 });
31
+ setHandshake();
32
+ }
33
+ });
34
+ const [closed, setClosed] = (0, async_1.latch)({ count: 2 });
35
+ const pipeline = stream1.pipe(stream2, setClosed).pipe(stream1, setClosed);
36
+ await handshake();
37
+ pipeline.destroy();
38
+ await closed();
39
+ });
40
+ it('protocol stream handshake completes with feeds', async function () {
41
+ //
42
+ // Pipeline and handshake.
43
+ //
44
+ const [handshake, setHandshake] = (0, async_1.latch)({ count: 2 });
45
+ const stream1 = new hypercore_protocol_1.default(true, {
46
+ onhandshake: () => {
47
+ (0, log_1.log)('onhandshake', { key: keys_1.PublicKey.from(stream1.publicKey) }, { file: "packages/common/hypercore/src/hypercore-protocol.test.ts", line: 54 });
48
+ setHandshake();
49
+ }
50
+ });
51
+ const stream2 = new hypercore_protocol_1.default(false, {
52
+ onhandshake: () => {
53
+ (0, log_1.log)('onhandshake', { key: keys_1.PublicKey.from(stream2.publicKey) }, { file: "packages/common/hypercore/src/hypercore-protocol.test.ts", line: 61 });
54
+ setHandshake();
55
+ }
56
+ });
57
+ const [streamClosed, setStreamClosed] = (0, async_1.latch)({ count: 2 });
58
+ const pipeline = stream1.pipe(stream2, setStreamClosed).pipe(stream1, setStreamClosed);
59
+ await handshake();
60
+ //
61
+ // Hypercore replication.
62
+ // https://github.com/hypercore-protocol/hypercore-protocol#const-channel--streamopenkey-handlers
63
+ //
64
+ const factory = new hypercore_factory_1.HypercoreFactory();
65
+ const { publicKey, secretKey } = (0, crypto_1.createKeyPair)();
66
+ const core1 = factory.createFeed(publicKey, { secretKey });
67
+ const core2 = factory.createFeed(publicKey);
68
+ const [feedsClosed, setFeedClosed] = (0, async_1.latch)({ count: 2 });
69
+ core1.once('close', setFeedClosed);
70
+ core2.once('close', setFeedClosed);
71
+ core1.replicate(true, { stream: stream1, live: true });
72
+ core2.replicate(false, { stream: stream2, live: true });
73
+ //
74
+ // Extensions.
75
+ //
76
+ const [received, incMessage] = (0, async_1.latch)({ count: 2 });
77
+ const extension1 = stream1.registerExtension('stream-extension', {
78
+ onmessage: (msg) => {
79
+ (0, log_1.log)('onmessage', {
80
+ key: keys_1.PublicKey.from(stream1.publicKey),
81
+ msg: msg.toString()
82
+ }, { file: "packages/common/hypercore/src/hypercore-protocol.test.ts", line: 95 });
83
+ incMessage();
84
+ }
85
+ });
86
+ const extension2 = stream2.registerExtension('stream-extension', {
87
+ onmessage: (msg) => {
88
+ (0, log_1.log)('onmessage', {
89
+ key: keys_1.PublicKey.from(stream2.publicKey),
90
+ msg: msg.toString()
91
+ }, { file: "packages/common/hypercore/src/hypercore-protocol.test.ts", line: 105 });
92
+ incMessage();
93
+ }
94
+ });
95
+ extension1.send(Buffer.from('message-1'));
96
+ extension2.send(Buffer.from('message-2'));
97
+ await received();
98
+ //
99
+ // Replication.
100
+ //
101
+ const [synced, setSynced] = (0, async_1.latch)({ count: 1 });
102
+ {
103
+ const numBlocks = 10;
104
+ Array.from(Array(numBlocks)).forEach((_, i) => {
105
+ core1.append(`block-${i}`, () => { });
106
+ });
107
+ core2.on('sync', () => {
108
+ (0, log_1.log)('sync', {
109
+ core: { key: keys_1.PublicKey.from(core2.key), length: core2.length }
110
+ }, { file: "packages/common/hypercore/src/hypercore-protocol.test.ts", line: 130 });
111
+ (0, chai_1.expect)(core2.length).to.eq(numBlocks);
112
+ setSynced();
113
+ });
114
+ }
115
+ await synced();
116
+ //
117
+ // Close.
118
+ //
119
+ // Gracefully shutdown.
120
+ pipeline.finalize();
121
+ await streamClosed();
122
+ // TODO(burdon): Destroy and finalize don't seem to close the feeds.
123
+ (0, chai_1.expect)(core1.closed).to.be.false;
124
+ (0, chai_1.expect)(core2.closed).to.be.false;
125
+ core1.close(setFeedClosed);
126
+ core2.close(setFeedClosed);
127
+ await feedsClosed();
128
+ (0, chai_1.expect)(core1.closed).to.be.true;
129
+ (0, chai_1.expect)(core2.closed).to.be.true;
130
+ });
131
+ it('multi-feed multiplexing', async function () {
132
+ //
133
+ // Handshake.
134
+ //
135
+ const [handshake, setHandshake] = (0, async_1.latch)({ count: 2 });
136
+ const stream1 = new hypercore_protocol_1.default(true, { onhandshake: setHandshake });
137
+ const stream2 = new hypercore_protocol_1.default(false, { onhandshake: setHandshake });
138
+ const [streamClosed, setStreamClosed] = (0, async_1.latch)({ count: 2 });
139
+ const pipeline = stream1.pipe(stream2, setStreamClosed).pipe(stream1, setStreamClosed);
140
+ await handshake();
141
+ //
142
+ // Feeds.
143
+ //
144
+ const factory = new hypercore_factory_1.HypercoreFactory();
145
+ const numFeeds = 5;
146
+ const [feedsClosed, setFeedClosed] = (0, async_1.latch)({ count: 2 * numFeeds });
147
+ // Create set of feed pairs.
148
+ const feeds = Array.from(Array(numFeeds)).map(() => {
149
+ const { publicKey, secretKey } = (0, crypto_1.createKeyPair)();
150
+ const core1 = factory.createFeed(publicKey, { secretKey });
151
+ const core2 = factory.createFeed(publicKey);
152
+ core1.once('close', setFeedClosed);
153
+ core2.once('close', setFeedClosed);
154
+ core1.replicate(true, { stream: stream1, live: true });
155
+ core2.replicate(false, { stream: stream2, live: true });
156
+ return [core1, core2];
157
+ });
158
+ //
159
+ // Replicate.
160
+ //
161
+ let total = 0;
162
+ const numBlocks = 100;
163
+ const [synced, setSynced] = (0, async_1.latch)({ count: numFeeds });
164
+ feeds.forEach(([, core2]) => {
165
+ core2.on('sync', () => {
166
+ core2.audit((_, data) => {
167
+ total += data.valid;
168
+ (0, log_1.log)('synced', { data }, { file: "packages/common/hypercore/src/hypercore-protocol.test.ts", line: 208 });
169
+ setSynced();
170
+ });
171
+ });
172
+ });
173
+ Array.from(Array(numBlocks)).forEach((_, i) => {
174
+ const [core1] = faker_1.default.random.arrayElement(feeds);
175
+ core1.append(`block-${i}`, () => { });
176
+ });
177
+ await synced();
178
+ (0, chai_1.expect)(total).to.eq(numBlocks);
179
+ //
180
+ // Close.
181
+ //
182
+ pipeline.finalize();
183
+ await streamClosed();
184
+ feeds.forEach(([core1, core2]) => {
185
+ core1.close();
186
+ core2.close();
187
+ });
188
+ await feedsClosed();
189
+ });
190
+ });
191
+ //# sourceMappingURL=hypercore-protocol.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hypercore-protocol.test.js","sourceRoot":"","sources":["../../src/hypercore-protocol.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=hypercore.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hypercore.test.d.ts","sourceRoot":"","sources":["../../src/hypercore.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,79 @@
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 node_util_1 = __importDefault(require("node:util"));
11
+ const crypto_1 = require("@dxos/crypto");
12
+ const crypto_2 = require("./crypto");
13
+ const hypercore_factory_1 = require("./hypercore-factory");
14
+ const codec = {
15
+ encode: (obj) => Buffer.from(JSON.stringify(obj)),
16
+ decode: (buffer) => JSON.parse(buffer.toString())
17
+ };
18
+ const valueEncoding = (0, crypto_2.createCodecEncoding)(codec);
19
+ describe('Hypercore', function () {
20
+ it('create, append, and close a feed', async function () {
21
+ const factory = new hypercore_factory_1.HypercoreFactory();
22
+ const { publicKey, secretKey } = (0, crypto_1.createKeyPair)();
23
+ const core = factory.createFeed(publicKey, { secretKey });
24
+ {
25
+ // Check open is idempotent.
26
+ const open = node_util_1.default.promisify(core.open.bind(core));
27
+ await open();
28
+ await open();
29
+ }
30
+ {
31
+ // Append block.
32
+ (0, chai_1.expect)(core.length).to.eq(0);
33
+ const append = node_util_1.default.promisify(core.append.bind(core));
34
+ const seq = await append('test');
35
+ (0, chai_1.expect)(core.length).to.eq(1);
36
+ (0, chai_1.expect)(seq).to.eq(0);
37
+ }
38
+ {
39
+ // Get block.
40
+ const get = node_util_1.default.promisify(core.get.bind(core));
41
+ const block = await get(0);
42
+ (0, chai_1.expect)(block.toString()).to.eq('test');
43
+ }
44
+ {
45
+ // Check open is idempotent.
46
+ const close = node_util_1.default.promisify(core.close.bind(core));
47
+ await close();
48
+ await close();
49
+ }
50
+ });
51
+ it('encoding with typed hypercore', async function () {
52
+ const factory = new hypercore_factory_1.HypercoreFactory();
53
+ const { publicKey, secretKey } = (0, crypto_1.createKeyPair)();
54
+ const core = factory.createFeed(publicKey, { secretKey, valueEncoding });
55
+ {
56
+ const append = node_util_1.default.promisify(core.append.bind(core));
57
+ (0, chai_1.expect)(core.length).to.eq(0);
58
+ const seq = await append({
59
+ key: 'test-1',
60
+ value: 'test'
61
+ });
62
+ (0, chai_1.expect)(core.length).to.eq(1);
63
+ (0, chai_1.expect)(seq).to.eq(0);
64
+ }
65
+ {
66
+ const head = node_util_1.default.promisify(core.head.bind(core));
67
+ const { key, value } = await head();
68
+ (0, chai_1.expect)(key).to.eq('test-1');
69
+ (0, chai_1.expect)(value).to.eq('test');
70
+ }
71
+ {
72
+ const get = node_util_1.default.promisify(core.get.bind(core));
73
+ const { key, value } = await get(0);
74
+ (0, chai_1.expect)(key).to.eq('test-1');
75
+ (0, chai_1.expect)(value).to.eq('test');
76
+ }
77
+ });
78
+ });
79
+ //# sourceMappingURL=hypercore.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hypercore.test.js","sourceRoot":"","sources":["../../src/hypercore.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export * from './crypto';
2
+ export * from './defaults';
3
+ export * from './hypercore-factory';
4
+ export * from './iterator';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
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"}