helia 0.0.0-031ca73

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.
@@ -0,0 +1,178 @@
1
+ import { BaseBlockstore } from 'blockstore-core';
2
+ import merge from 'it-merge';
3
+ import { pushable } from 'it-pushable';
4
+ import filter from 'it-filter';
5
+ import createMortice from 'mortice';
6
+ /**
7
+ * BlockStorage is a hybrid blockstore that puts/gets blocks from a configured
8
+ * blockstore (that may be on disk, s3, or something else). If the blocks are
9
+ * not present Bitswap will be used to fetch them from network peers.
10
+ */
11
+ export class BlockStorage extends BaseBlockstore {
12
+ /**
13
+ * Create a new BlockStorage
14
+ */
15
+ constructor(blockstore, pins, bitswap) {
16
+ super();
17
+ this.child = blockstore;
18
+ this.bitswap = bitswap;
19
+ this.pins = pins;
20
+ this.lock = createMortice();
21
+ }
22
+ async open() {
23
+ await this.child.open();
24
+ }
25
+ async close() {
26
+ await this.child.close();
27
+ }
28
+ unwrap() {
29
+ return this.child;
30
+ }
31
+ /**
32
+ * Put a block to the underlying datastore
33
+ */
34
+ async put(cid, block, options = {}) {
35
+ const releaseLock = await this.lock.readLock();
36
+ try {
37
+ if (this.bitswap?.isStarted() === true) {
38
+ await this.bitswap.put(cid, block, options);
39
+ }
40
+ else {
41
+ await this.child.put(cid, block, options);
42
+ }
43
+ }
44
+ finally {
45
+ releaseLock();
46
+ }
47
+ }
48
+ /**
49
+ * Put a multiple blocks to the underlying datastore
50
+ */
51
+ async *putMany(blocks, options = {}) {
52
+ const releaseLock = await this.lock.readLock();
53
+ try {
54
+ const missingBlocks = filter(blocks, async ({ key }) => {
55
+ return !(await this.child.has(key));
56
+ });
57
+ const store = this.bitswap?.isStarted() === true ? this.bitswap : this.child;
58
+ yield* store.putMany(missingBlocks, options);
59
+ }
60
+ finally {
61
+ releaseLock();
62
+ }
63
+ }
64
+ /**
65
+ * Get a block by cid
66
+ */
67
+ async get(cid, options = {}) {
68
+ const releaseLock = await this.lock.readLock();
69
+ try {
70
+ if (!(await this.has(cid)) && this.bitswap?.isStarted() === true) {
71
+ return await this.bitswap?.get(cid, options);
72
+ }
73
+ else {
74
+ return await this.child.get(cid, options);
75
+ }
76
+ }
77
+ finally {
78
+ releaseLock();
79
+ }
80
+ }
81
+ /**
82
+ * Get multiple blocks back from an array of cids
83
+ */
84
+ async *getMany(cids, options = {}) {
85
+ const releaseLock = await this.lock.readLock();
86
+ try {
87
+ const getFromBitswap = pushable({ objectMode: true });
88
+ const getFromChild = pushable({ objectMode: true });
89
+ void Promise.resolve().then(async () => {
90
+ for await (const cid of cids) {
91
+ if (!(await this.has(cid)) && this.bitswap?.isStarted() === true) {
92
+ getFromBitswap.push(cid);
93
+ }
94
+ else {
95
+ getFromChild.push(cid);
96
+ }
97
+ }
98
+ getFromBitswap.end();
99
+ getFromChild.end();
100
+ }).catch(err => {
101
+ getFromBitswap.throw(err);
102
+ });
103
+ const streams = [
104
+ this.child.getMany(getFromChild, options)
105
+ ];
106
+ if (this.bitswap?.isStarted() === true) {
107
+ streams.push(this.bitswap.getMany(getFromBitswap, options));
108
+ }
109
+ yield* merge(...streams);
110
+ }
111
+ finally {
112
+ releaseLock();
113
+ }
114
+ }
115
+ /**
116
+ * Delete a block from the blockstore
117
+ */
118
+ async delete(cid, options = {}) {
119
+ const releaseLock = await this.lock.writeLock();
120
+ try {
121
+ if (await this.pins.isPinned(cid)) {
122
+ throw new Error('CID was pinned');
123
+ }
124
+ await this.child.delete(cid, options);
125
+ }
126
+ finally {
127
+ releaseLock();
128
+ }
129
+ }
130
+ /**
131
+ * Delete multiple blocks from the blockstore
132
+ */
133
+ async *deleteMany(cids, options = {}) {
134
+ const releaseLock = await this.lock.writeLock();
135
+ try {
136
+ const storage = this;
137
+ yield* this.child.deleteMany((async function* () {
138
+ for await (const cid of cids) {
139
+ if (await storage.pins.isPinned(cid)) {
140
+ throw new Error('CID was pinned');
141
+ }
142
+ yield cid;
143
+ }
144
+ }()), options);
145
+ }
146
+ finally {
147
+ releaseLock();
148
+ }
149
+ }
150
+ async has(cid, options = {}) {
151
+ const releaseLock = await this.lock.readLock();
152
+ try {
153
+ return await this.child.has(cid, options);
154
+ }
155
+ finally {
156
+ releaseLock();
157
+ }
158
+ }
159
+ async *query(q, options = {}) {
160
+ const releaseLock = await this.lock.readLock();
161
+ try {
162
+ yield* this.child.query(q, options);
163
+ }
164
+ finally {
165
+ releaseLock();
166
+ }
167
+ }
168
+ async *queryKeys(q, options = {}) {
169
+ const releaseLock = await this.lock.readLock();
170
+ try {
171
+ yield* this.child.queryKeys(q, options);
172
+ }
173
+ finally {
174
+ releaseLock();
175
+ }
176
+ }
177
+ }
178
+ //# sourceMappingURL=storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/storage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { DAGWalker } from '../index.js';
2
+ /**
3
+ * Dag walker for dag-pb CIDs
4
+ */
5
+ export declare const dagPbWalker: DAGWalker;
6
+ /**
7
+ * Dag walker for raw CIDs
8
+ */
9
+ export declare const rawWalker: DAGWalker;
10
+ /**
11
+ * Dag walker for dag-cbor CIDs. Does not actually use dag-cbor since
12
+ * all we are interested in is extracting the the CIDs from the block
13
+ * so we can just use cborg for that.
14
+ */
15
+ export declare const cborWalker: DAGWalker;
16
+ /**
17
+ * Dag walker for dag-json CIDs. Does not actually use dag-json since
18
+ * all we are interested in is extracting the the CIDs from the block
19
+ * so we can just use cborg/json for that.
20
+ */
21
+ export declare const jsonWalker: DAGWalker;
22
+ //# sourceMappingURL=dag-walkers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dag-walkers.d.ts","sourceRoot":"","sources":["../../../src/utils/dag-walkers.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAK5C;;GAEG;AACH,eAAO,MAAM,WAAW,EAAE,SAOzB,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,SAAS,EAAE,SAKvB,CAAA;AAKD;;;;GAIG;AACH,eAAO,MAAM,UAAU,EAAE,SAuBxB,CAAA;AAsED;;;;GAIG;AACH,eAAO,MAAM,UAAU,EAAE,SA6BxB,CAAA"}
@@ -0,0 +1,145 @@
1
+ /* eslint max-depth: ["error", 7] */
2
+ import * as dagPb from '@ipld/dag-pb';
3
+ import * as cborg from 'cborg';
4
+ import { Type, Token } from 'cborg';
5
+ import * as cborgJson from 'cborg/json';
6
+ import * as raw from 'multiformats/codecs/raw';
7
+ import { CID } from 'multiformats';
8
+ import { base64 } from 'multiformats/bases/base64';
9
+ /**
10
+ * Dag walker for dag-pb CIDs
11
+ */
12
+ export const dagPbWalker = {
13
+ codec: dagPb.code,
14
+ async *walk(block) {
15
+ const node = dagPb.decode(block);
16
+ yield* node.Links.map(l => l.Hash);
17
+ }
18
+ };
19
+ /**
20
+ * Dag walker for raw CIDs
21
+ */
22
+ export const rawWalker = {
23
+ codec: raw.code,
24
+ async *walk() {
25
+ // no embedded CIDs in a raw block
26
+ }
27
+ };
28
+ // https://github.com/ipfs/go-ipfs/issues/3570#issuecomment-273931692
29
+ const CID_TAG = 42;
30
+ /**
31
+ * Dag walker for dag-cbor CIDs. Does not actually use dag-cbor since
32
+ * all we are interested in is extracting the the CIDs from the block
33
+ * so we can just use cborg for that.
34
+ */
35
+ export const cborWalker = {
36
+ codec: 0x71,
37
+ async *walk(block) {
38
+ const cids = [];
39
+ const tags = [];
40
+ tags[CID_TAG] = (bytes) => {
41
+ if (bytes[0] !== 0) {
42
+ throw new Error('Invalid CID for CBOR tag 42; expected leading 0x00');
43
+ }
44
+ const cid = CID.decode(bytes.subarray(1)); // ignore leading 0x00
45
+ cids.push(cid);
46
+ return cid;
47
+ };
48
+ cborg.decode(block, {
49
+ tags
50
+ });
51
+ yield* cids;
52
+ }
53
+ };
54
+ /**
55
+ * Borrowed from @ipld/dag-json
56
+ */
57
+ class DagJsonTokenizer extends cborgJson.Tokenizer {
58
+ constructor(data, options) {
59
+ super(data, options);
60
+ this.tokenBuffer = [];
61
+ }
62
+ done() {
63
+ return this.tokenBuffer.length === 0 && super.done();
64
+ }
65
+ _next() {
66
+ if (this.tokenBuffer.length > 0) {
67
+ // @ts-expect-error https://github.com/Microsoft/TypeScript/issues/30406
68
+ return this.tokenBuffer.pop();
69
+ }
70
+ return super.next();
71
+ }
72
+ /**
73
+ * Implements rules outlined in https://github.com/ipld/specs/pull/356
74
+ */
75
+ next() {
76
+ const token = this._next();
77
+ if (token.type === Type.map) {
78
+ const keyToken = this._next();
79
+ if (keyToken.type === Type.string && keyToken.value === '/') {
80
+ const valueToken = this._next();
81
+ if (valueToken.type === Type.string) { // *must* be a CID
82
+ const breakToken = this._next(); // swallow the end-of-map token
83
+ if (breakToken.type !== Type.break) {
84
+ throw new Error('Invalid encoded CID form');
85
+ }
86
+ this.tokenBuffer.push(valueToken); // CID.parse will pick this up after our tag token
87
+ return new Token(Type.tag, 42, 0);
88
+ }
89
+ if (valueToken.type === Type.map) {
90
+ const innerKeyToken = this._next();
91
+ if (innerKeyToken.type === Type.string && innerKeyToken.value === 'bytes') {
92
+ const innerValueToken = this._next();
93
+ if (innerValueToken.type === Type.string) { // *must* be Bytes
94
+ for (let i = 0; i < 2; i++) {
95
+ const breakToken = this._next(); // swallow two end-of-map tokens
96
+ if (breakToken.type !== Type.break) {
97
+ throw new Error('Invalid encoded Bytes form');
98
+ }
99
+ }
100
+ const bytes = base64.decode(`m${innerValueToken.value}`);
101
+ return new Token(Type.bytes, bytes, innerValueToken.value.length);
102
+ }
103
+ this.tokenBuffer.push(innerValueToken); // bail
104
+ }
105
+ this.tokenBuffer.push(innerKeyToken); // bail
106
+ }
107
+ this.tokenBuffer.push(valueToken); // bail
108
+ }
109
+ this.tokenBuffer.push(keyToken); // bail
110
+ }
111
+ return token;
112
+ }
113
+ }
114
+ /**
115
+ * Dag walker for dag-json CIDs. Does not actually use dag-json since
116
+ * all we are interested in is extracting the the CIDs from the block
117
+ * so we can just use cborg/json for that.
118
+ */
119
+ export const jsonWalker = {
120
+ codec: 0x0129,
121
+ async *walk(block) {
122
+ const cids = [];
123
+ const tags = [];
124
+ tags[CID_TAG] = (string) => {
125
+ const cid = CID.parse(string);
126
+ cids.push(cid);
127
+ return cid;
128
+ };
129
+ cborgJson.decode(block, {
130
+ tags,
131
+ tokenizer: new DagJsonTokenizer(block, {
132
+ tags,
133
+ allowIndefinite: true,
134
+ allowUndefined: true,
135
+ allowNaN: true,
136
+ allowInfinity: true,
137
+ allowBigInt: true,
138
+ strict: false,
139
+ rejectDuplicateMapKeys: false
140
+ })
141
+ });
142
+ yield* cids;
143
+ }
144
+ };
145
+ //# sourceMappingURL=dag-walkers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dag-walkers.js","sourceRoot":"","sources":["../../../src/utils/dag-walkers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Datastore } from 'interface-datastore';
2
+ export declare function assertDatastoreVersionIsCurrent(datastore: Datastore): Promise<void>;
3
+ //# sourceMappingURL=datastore-version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"datastore-version.d.ts","sourceRoot":"","sources":["../../../src/utils/datastore-version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAO,MAAM,qBAAqB,CAAA;AAOpD,wBAAsB,+BAA+B,CAAE,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAe1F"}
@@ -0,0 +1,19 @@
1
+ import { Key } from 'interface-datastore';
2
+ import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string';
3
+ import { toString as uint8ArrayToString } from 'uint8arrays/to-string';
4
+ const DS_VERSION_KEY = new Key('/version');
5
+ const CURRENT_VERSION = 1;
6
+ export async function assertDatastoreVersionIsCurrent(datastore) {
7
+ if (!(await datastore.has(DS_VERSION_KEY))) {
8
+ await datastore.put(DS_VERSION_KEY, uint8ArrayFromString(`${CURRENT_VERSION}`));
9
+ return;
10
+ }
11
+ const buf = await datastore.get(DS_VERSION_KEY);
12
+ const str = uint8ArrayToString(buf);
13
+ const version = parseInt(str, 10);
14
+ if (version !== CURRENT_VERSION) {
15
+ // TODO: write migrations when we break compatibility - for an example, see https://github.com/ipfs/js-ipfs-repo/tree/master/packages/ipfs-repo-migrations
16
+ throw new Error('Unknown datastore version, a datastore migration may be required');
17
+ }
18
+ }
19
+ //# sourceMappingURL=datastore-version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"datastore-version.js","sourceRoot":"","sources":["../../../src/utils/datastore-version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,GAAG,EAAE,MAAM,qBAAqB,CAAA;AACpD,OAAO,EAAE,UAAU,IAAI,oBAAoB,EAAE,MAAM,yBAAyB,CAAA;AAC5E,OAAO,EAAE,QAAQ,IAAI,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AAEtE,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAA;AAC1C,MAAM,eAAe,GAAG,CAAC,CAAA;AAEzB,MAAM,CAAC,KAAK,UAAU,+BAA+B,CAAE,SAAoB;IACzE,IAAI,CAAC,CAAC,MAAM,SAAS,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,EAAE;QAC1C,MAAM,SAAS,CAAC,GAAG,CAAC,cAAc,EAAE,oBAAoB,CAAC,GAAG,eAAe,EAAE,CAAC,CAAC,CAAA;QAE/E,OAAM;KACP;IAED,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC,cAAc,CAAC,CAAA;IAC/C,MAAM,GAAG,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAA;IACnC,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;IAEjC,IAAI,OAAO,KAAK,eAAe,EAAE;QAC/B,0JAA0J;QAC1J,MAAM,IAAI,KAAK,CAAC,kEAAkE,CAAC,CAAA;KACpF;AACH,CAAC"}
package/package.json ADDED
@@ -0,0 +1,176 @@
1
+ {
2
+ "name": "helia",
3
+ "version": "0.0.0-031ca73",
4
+ "description": "An implementation of IPFS in JavaScript",
5
+ "license": "Apache-2.0 OR MIT",
6
+ "homepage": "https://github.com/ipfs/helia/tree/master/packages/helia#readme",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/ipfs/helia.git"
10
+ },
11
+ "bugs": {
12
+ "url": "https://github.com/ipfs/helia/issues"
13
+ },
14
+ "keywords": [
15
+ "IPFS"
16
+ ],
17
+ "engines": {
18
+ "node": ">=16.0.0",
19
+ "npm": ">=7.0.0"
20
+ },
21
+ "type": "module",
22
+ "types": "./dist/src/index.d.ts",
23
+ "files": [
24
+ "src",
25
+ "dist",
26
+ "!dist/test",
27
+ "!**/*.tsbuildinfo"
28
+ ],
29
+ "exports": {
30
+ ".": {
31
+ "types": "./dist/src/index.d.ts",
32
+ "import": "./dist/src/index.js"
33
+ }
34
+ },
35
+ "eslintConfig": {
36
+ "extends": "ipfs",
37
+ "parserOptions": {
38
+ "sourceType": "module"
39
+ }
40
+ },
41
+ "release": {
42
+ "branches": [
43
+ "main"
44
+ ],
45
+ "plugins": [
46
+ [
47
+ "@semantic-release/commit-analyzer",
48
+ {
49
+ "preset": "conventionalcommits",
50
+ "releaseRules": [
51
+ {
52
+ "breaking": true,
53
+ "release": "major"
54
+ },
55
+ {
56
+ "revert": true,
57
+ "release": "patch"
58
+ },
59
+ {
60
+ "type": "feat",
61
+ "release": "minor"
62
+ },
63
+ {
64
+ "type": "fix",
65
+ "release": "patch"
66
+ },
67
+ {
68
+ "type": "docs",
69
+ "release": "patch"
70
+ },
71
+ {
72
+ "type": "test",
73
+ "release": "patch"
74
+ },
75
+ {
76
+ "type": "deps",
77
+ "release": "patch"
78
+ },
79
+ {
80
+ "scope": "no-release",
81
+ "release": false
82
+ }
83
+ ]
84
+ }
85
+ ],
86
+ [
87
+ "@semantic-release/release-notes-generator",
88
+ {
89
+ "preset": "conventionalcommits",
90
+ "presetConfig": {
91
+ "types": [
92
+ {
93
+ "type": "feat",
94
+ "section": "Features"
95
+ },
96
+ {
97
+ "type": "fix",
98
+ "section": "Bug Fixes"
99
+ },
100
+ {
101
+ "type": "chore",
102
+ "section": "Trivial Changes"
103
+ },
104
+ {
105
+ "type": "docs",
106
+ "section": "Documentation"
107
+ },
108
+ {
109
+ "type": "deps",
110
+ "section": "Dependencies"
111
+ },
112
+ {
113
+ "type": "test",
114
+ "section": "Tests"
115
+ }
116
+ ]
117
+ }
118
+ }
119
+ ],
120
+ "@semantic-release/changelog",
121
+ "@semantic-release/npm",
122
+ "@semantic-release/github",
123
+ "@semantic-release/git"
124
+ ]
125
+ },
126
+ "scripts": {
127
+ "clean": "aegir clean",
128
+ "lint": "aegir lint",
129
+ "dep-check": "aegir dep-check",
130
+ "build": "aegir build",
131
+ "test": "aegir test",
132
+ "test:chrome": "aegir test -t browser --cov",
133
+ "test:chrome-webworker": "aegir test -t webworker",
134
+ "test:firefox": "aegir test -t browser -- --browser firefox",
135
+ "test:firefox-webworker": "aegir test -t webworker -- --browser firefox",
136
+ "test:node": "aegir test -t node --cov",
137
+ "test:electron-main": "aegir test -t electron-main",
138
+ "release": "aegir release"
139
+ },
140
+ "dependencies": {
141
+ "@helia/interface": "0.0.0-031ca73",
142
+ "@ipld/dag-pb": "^4.0.2",
143
+ "@libp2p/interface-libp2p": "^1.1.0",
144
+ "@libp2p/interfaces": "^3.3.1",
145
+ "blockstore-core": "^3.0.0",
146
+ "cborg": "^1.10.0",
147
+ "datastore-core": "^8.0.4",
148
+ "interface-blockstore": "^4.0.1",
149
+ "interface-datastore": "^7.0.3",
150
+ "interface-store": "^3.0.4",
151
+ "ipfs-bitswap": "^16.0.0",
152
+ "it-all": "^2.0.0",
153
+ "it-drain": "^2.0.0",
154
+ "it-filter": "^2.0.0",
155
+ "it-merge": "^2.0.0",
156
+ "it-pushable": "^3.1.2",
157
+ "mortice": "^3.0.1",
158
+ "multiformats": "^11.0.1",
159
+ "p-defer": "^4.0.0",
160
+ "p-queue": "^7.3.4",
161
+ "progress-events": "^1.0.0",
162
+ "uint8arrays": "^4.0.3"
163
+ },
164
+ "devDependencies": {
165
+ "@chainsafe/libp2p-noise": "^11.0.0",
166
+ "@chainsafe/libp2p-yamux": "^3.0.5",
167
+ "@ipld/dag-cbor": "^9.0.0",
168
+ "@ipld/dag-json": "^10.0.1",
169
+ "@libp2p/websockets": "^5.0.3",
170
+ "aegir": "^38.1.0",
171
+ "libp2p": "^0.42.2"
172
+ },
173
+ "typedoc": {
174
+ "entryPoint": "./src/index.ts"
175
+ }
176
+ }