@helia/verified-fetch 3.0.1 → 3.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.min.js +33 -33
- package/dist/index.min.js.map +4 -4
- package/dist/src/plugins/plugin-handle-car.d.ts.map +1 -1
- package/dist/src/plugins/plugin-handle-car.js +51 -6
- package/dist/src/plugins/plugin-handle-car.js.map +1 -1
- package/dist/src/utils/parse-url-string.d.ts +1 -0
- package/dist/src/utils/parse-url-string.d.ts.map +1 -1
- package/dist/src/utils/parse-url-string.js.map +1 -1
- package/package.json +2 -2
- package/src/plugins/plugin-handle-car.ts +57 -6
- package/src/utils/parse-url-string.ts +1 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin-handle-car.d.ts","sourceRoot":"","sources":["../../../src/plugins/plugin-handle-car.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"plugin-handle-car.d.ts","sourceRoot":"","sources":["../../../src/plugins/plugin-handle-car.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAwB/C;;;GAGG;AACH,qBAAa,SAAU,SAAQ,UAAU;IACvC,QAAQ,CAAC,EAAE,gBAAe;IAE1B,SAAS,CAAE,OAAO,EAAE,aAAa,GAAG,OAAO;IAYrC,MAAM,CAAE,OAAO,EAAE,aAAa,GAAG,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE,kBAAkB,CAAC,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC;CAwD7G"}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
import { car } from '@helia/car';
|
|
1
|
+
import { BlockExporter, car, CIDPath, SubgraphExporter, UnixFSExporter } from '@helia/car';
|
|
2
|
+
import { CarWriter } from '@ipld/car';
|
|
3
|
+
import { code as dagPbCode } from '@ipld/dag-pb';
|
|
2
4
|
import toBrowserReadableStream from 'it-to-browser-readablestream';
|
|
3
5
|
import { okRangeResponse } from '../utils/responses.js';
|
|
4
6
|
import { BasePlugin } from './plugin-base.js';
|
|
@@ -10,6 +12,13 @@ function getFilename({ cid, ipfsPath, query }) {
|
|
|
10
12
|
const filename = ipfsPath.replace(/\/ipfs\//, '').replace(/\/ipns\//, '').replace(/\//g, '_');
|
|
11
13
|
return `${filename}.car`;
|
|
12
14
|
}
|
|
15
|
+
function getDagScope({ query }) {
|
|
16
|
+
const dagScope = query['dag-scope'];
|
|
17
|
+
if (dagScope === 'all' || dagScope === 'entity' || dagScope === 'block') {
|
|
18
|
+
return dagScope;
|
|
19
|
+
}
|
|
20
|
+
return 'all';
|
|
21
|
+
}
|
|
13
22
|
/**
|
|
14
23
|
* Accepts a `CID` and returns a `Response` with a body stream that is a CAR
|
|
15
24
|
* of the `DAG` referenced by the `CID`.
|
|
@@ -18,16 +27,19 @@ export class CarPlugin extends BasePlugin {
|
|
|
18
27
|
id = 'car-plugin';
|
|
19
28
|
canHandle(context) {
|
|
20
29
|
this.log('checking if we can handle %c with accept %s', context.cid, context.accept);
|
|
21
|
-
// if (context.pathDetails == null) {
|
|
22
|
-
// return false
|
|
23
|
-
// }
|
|
24
30
|
if (context.byteRangeContext == null) {
|
|
25
31
|
return false;
|
|
26
32
|
}
|
|
33
|
+
if (context.pathDetails == null) {
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
27
36
|
return context.accept?.startsWith('application/vnd.ipld.car') === true || context.query.format === 'car'; // application/vnd.ipld.car
|
|
28
37
|
}
|
|
29
38
|
async handle(context) {
|
|
30
39
|
const { options, pathDetails, cid } = context;
|
|
40
|
+
if (pathDetails == null) {
|
|
41
|
+
throw new Error('attempted to handle request for car with no path details');
|
|
42
|
+
}
|
|
31
43
|
const { getBlockstore, helia } = this.pluginOptions;
|
|
32
44
|
context.reqFormat = 'car';
|
|
33
45
|
context.query.download = true;
|
|
@@ -38,8 +50,41 @@ export class CarPlugin extends BasePlugin {
|
|
|
38
50
|
getCodec: helia.getCodec,
|
|
39
51
|
logger: helia.logger
|
|
40
52
|
});
|
|
41
|
-
const
|
|
42
|
-
|
|
53
|
+
const carExportOptions = {
|
|
54
|
+
...options,
|
|
55
|
+
traversal: new CIDPath(pathDetails.ipfsRoots)
|
|
56
|
+
};
|
|
57
|
+
const dagScope = getDagScope(context);
|
|
58
|
+
// root should be the terminal element if it exists, otherwise the root cid.. because of this, we can't use the @helia/car stream() method.
|
|
59
|
+
const root = pathDetails.terminalElement.cid ?? cid;
|
|
60
|
+
if (dagScope === 'block') {
|
|
61
|
+
carExportOptions.exporter = new BlockExporter();
|
|
62
|
+
}
|
|
63
|
+
else if (dagScope === 'entity') {
|
|
64
|
+
// if its unixFS, we need to enumerate a directory, or get all blocks for the entity, otherwise, use blockExporter
|
|
65
|
+
if (root.code === dagPbCode) {
|
|
66
|
+
carExportOptions.exporter = new UnixFSExporter();
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
carExportOptions.exporter = new BlockExporter();
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
carExportOptions.exporter = new SubgraphExporter();
|
|
74
|
+
}
|
|
75
|
+
const { writer, out } = CarWriter.create(root);
|
|
76
|
+
const iter = async function* () {
|
|
77
|
+
for await (const buf of out) {
|
|
78
|
+
yield buf;
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
// the root passed to export should be the root CID of the DAG, not the terminal element.
|
|
82
|
+
c.export(cid, writer, carExportOptions)
|
|
83
|
+
.catch((err) => {
|
|
84
|
+
this.log.error('error exporting car - %e', err);
|
|
85
|
+
});
|
|
86
|
+
// export will close the writer when it's done, no finally needed.
|
|
87
|
+
context.byteRangeContext.setBody(toBrowserReadableStream(iter()));
|
|
43
88
|
const response = okRangeResponse(context.resource, context.byteRangeContext.getBody(), { byteRangeContext: context.byteRangeContext, log: this.log });
|
|
44
89
|
response.headers.set('content-type', 'application/vnd.ipld.car; version=1');
|
|
45
90
|
return response;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin-handle-car.js","sourceRoot":"","sources":["../../../src/plugins/plugin-handle-car.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"plugin-handle-car.js","sourceRoot":"","sources":["../../../src/plugins/plugin-handle-car.ts"],"names":[],"mappings":"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"}
|
|
@@ -17,6 +17,7 @@ export interface ParsedUrlQuery extends Record<string, string | unknown> {
|
|
|
17
17
|
format?: RequestFormatShorthand;
|
|
18
18
|
download?: boolean;
|
|
19
19
|
filename?: string;
|
|
20
|
+
'dag-scope'?: string;
|
|
20
21
|
}
|
|
21
22
|
export interface ParsedUrlStringResults extends ResolveResult {
|
|
22
23
|
protocol: 'ipfs' | 'ipns';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse-url-string.d.ts","sourceRoot":"","sources":["../../../src/utils/parse-url-string.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AAC5D,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA;AACzD,OAAO,KAAK,EAAE,oBAAoB,EAAE,IAAI,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,4BAA4B,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AACvK,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAU,MAAM,mBAAmB,CAAA;AAC9E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAEtD,eAAO,MAAM,SAAS,gDAA2D,CAAA;AAEjF,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,IAAI,CAAA;IACV,MAAM,EAAE,eAAe,CAAA;IACvB,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAC3B;AACD,MAAM,WAAW,qBAAsB,SAAQ,eAAe,CAAC,qBAAqB,GAAG,iBAAiB,GAAG,4BAA4B,CAAC,EAAE,YAAY;CAErJ;AAED,MAAM,WAAW,cAAe,SAAQ,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;IACtE,MAAM,CAAC,EAAE,sBAAsB,CAAA;IAC/B,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"parse-url-string.d.ts","sourceRoot":"","sources":["../../../src/utils/parse-url-string.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AAC5D,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA;AACzD,OAAO,KAAK,EAAE,oBAAoB,EAAE,IAAI,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,4BAA4B,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AACvK,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAU,MAAM,mBAAmB,CAAA;AAC9E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAEtD,eAAO,MAAM,SAAS,gDAA2D,CAAA;AAEjF,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,IAAI,CAAA;IACV,MAAM,EAAE,eAAe,CAAA;IACvB,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAC3B;AACD,MAAM,WAAW,qBAAsB,SAAQ,eAAe,CAAC,qBAAqB,GAAG,iBAAiB,GAAG,4BAA4B,CAAC,EAAE,YAAY;CAErJ;AAED,MAAM,WAAW,cAAe,SAAQ,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;IACtE,MAAM,CAAC,EAAE,sBAAsB,CAAA;IAC/B,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,sBAAuB,SAAQ,aAAa;IAC3D,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAA;IACzB,KAAK,EAAE,cAAc,CAAA;IAErB;;;;;;;OAOG;IACH,QAAQ,EAAE,MAAM,CAAA;IAEhB;;OAEG;IACH,GAAG,CAAC,EAAE,MAAM,CAAA;IAEZ;;OAEG;IACH,aAAa,EAAE,KAAK,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAA;CAC9C;AAOD,UAAU,cAAc;IACtB,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAA;IACzB,oBAAoB,EAAE,MAAM,CAAA;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAgBD,wBAAgB,cAAc,CAAE,SAAS,EAAE,MAAM,GAAG,cAAc,CAUjE;AAsDD;;;;;;;;;;GAUG;AAEH,wBAAsB,cAAc,CAAE,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,gBAAwB,EAAE,EAAE,mBAAmB,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,sBAAsB,CAAC,CA8JlL"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse-url-string.js","sourceRoot":"","sources":["../../../src/utils/parse-url-string.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC9C,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AACtC,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAA;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAOhC,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,IAAI,CAA2C,IAAI,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"parse-url-string.js","sourceRoot":"","sources":["../../../src/utils/parse-url-string.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@helia/verified-fetch",
|
|
3
|
-
"version": "3.0.
|
|
3
|
+
"version": "3.0.2",
|
|
4
4
|
"description": "A fetch-like API for obtaining verified & trustless IPFS content on the web",
|
|
5
5
|
"license": "Apache-2.0 OR MIT",
|
|
6
6
|
"homepage": "https://github.com/ipfs/helia-verified-fetch/tree/main/packages/verified-fetch#readme",
|
|
@@ -171,6 +171,7 @@
|
|
|
171
171
|
"@helia/ipns": "^8.2.2",
|
|
172
172
|
"@helia/routers": "^3.1.1",
|
|
173
173
|
"@helia/unixfs": "^5.0.2",
|
|
174
|
+
"@ipld/car": "^5.4.2",
|
|
174
175
|
"@ipld/dag-cbor": "^9.2.3",
|
|
175
176
|
"@ipld/dag-json": "^10.2.4",
|
|
176
177
|
"@ipld/dag-pb": "^4.1.5",
|
|
@@ -203,7 +204,6 @@
|
|
|
203
204
|
"@helia/dag-json": "^4.0.5",
|
|
204
205
|
"@helia/http": "^2.1.1",
|
|
205
206
|
"@helia/json": "^4.0.5",
|
|
206
|
-
"@ipld/car": "^5.4.1",
|
|
207
207
|
"@libp2p/crypto": "^5.1.3",
|
|
208
208
|
"@types/sinon": "^17.0.4",
|
|
209
209
|
"aegir": "^47.0.11",
|
|
@@ -1,8 +1,11 @@
|
|
|
1
|
-
import { car } from '@helia/car'
|
|
1
|
+
import { BlockExporter, car, CIDPath, SubgraphExporter, UnixFSExporter } from '@helia/car'
|
|
2
|
+
import { CarWriter } from '@ipld/car'
|
|
3
|
+
import { code as dagPbCode } from '@ipld/dag-pb'
|
|
2
4
|
import toBrowserReadableStream from 'it-to-browser-readablestream'
|
|
3
5
|
import { okRangeResponse } from '../utils/responses.js'
|
|
4
6
|
import { BasePlugin } from './plugin-base.js'
|
|
5
7
|
import type { PluginContext } from './types.js'
|
|
8
|
+
import type { ExportCarOptions } from '@helia/car'
|
|
6
9
|
|
|
7
10
|
function getFilename ({ cid, ipfsPath, query }: Pick<PluginContext, 'query' | 'cid' | 'ipfsPath'>): string {
|
|
8
11
|
if (query.filename != null) {
|
|
@@ -14,6 +17,17 @@ function getFilename ({ cid, ipfsPath, query }: Pick<PluginContext, 'query' | 'c
|
|
|
14
17
|
|
|
15
18
|
return `${filename}.car`
|
|
16
19
|
}
|
|
20
|
+
|
|
21
|
+
// https://specs.ipfs.tech/http-gateways/trustless-gateway/#dag-scope-request-query-parameter
|
|
22
|
+
type DagScope = 'all' | 'entity' | 'block'
|
|
23
|
+
function getDagScope ({ query }: Pick<PluginContext, 'query'>): DagScope | null {
|
|
24
|
+
const dagScope = query['dag-scope']
|
|
25
|
+
if (dagScope === 'all' || dagScope === 'entity' || dagScope === 'block') {
|
|
26
|
+
return dagScope
|
|
27
|
+
}
|
|
28
|
+
return 'all'
|
|
29
|
+
}
|
|
30
|
+
|
|
17
31
|
/**
|
|
18
32
|
* Accepts a `CID` and returns a `Response` with a body stream that is a CAR
|
|
19
33
|
* of the `DAG` referenced by the `CID`.
|
|
@@ -23,29 +37,66 @@ export class CarPlugin extends BasePlugin {
|
|
|
23
37
|
|
|
24
38
|
canHandle (context: PluginContext): boolean {
|
|
25
39
|
this.log('checking if we can handle %c with accept %s', context.cid, context.accept)
|
|
26
|
-
// if (context.pathDetails == null) {
|
|
27
|
-
// return false
|
|
28
|
-
// }
|
|
29
40
|
if (context.byteRangeContext == null) {
|
|
30
41
|
return false
|
|
31
42
|
}
|
|
43
|
+
if (context.pathDetails == null) {
|
|
44
|
+
return false
|
|
45
|
+
}
|
|
46
|
+
|
|
32
47
|
return context.accept?.startsWith('application/vnd.ipld.car') === true || context.query.format === 'car' // application/vnd.ipld.car
|
|
33
48
|
}
|
|
34
49
|
|
|
35
50
|
async handle (context: PluginContext & Required<Pick<PluginContext, 'byteRangeContext'>>): Promise<Response> {
|
|
36
51
|
const { options, pathDetails, cid } = context
|
|
52
|
+
if (pathDetails == null) {
|
|
53
|
+
throw new Error('attempted to handle request for car with no path details')
|
|
54
|
+
}
|
|
37
55
|
const { getBlockstore, helia } = this.pluginOptions
|
|
38
56
|
context.reqFormat = 'car'
|
|
39
57
|
context.query.download = true
|
|
40
58
|
context.query.filename = getFilename(context)
|
|
41
59
|
const blockstore = getBlockstore(cid, context.resource, options?.session ?? true, options)
|
|
60
|
+
|
|
42
61
|
const c = car({
|
|
43
62
|
blockstore,
|
|
44
63
|
getCodec: helia.getCodec,
|
|
45
64
|
logger: helia.logger
|
|
46
65
|
})
|
|
47
|
-
const
|
|
48
|
-
|
|
66
|
+
const carExportOptions: ExportCarOptions = {
|
|
67
|
+
...options,
|
|
68
|
+
traversal: new CIDPath(pathDetails.ipfsRoots)
|
|
69
|
+
}
|
|
70
|
+
const dagScope = getDagScope(context)
|
|
71
|
+
// root should be the terminal element if it exists, otherwise the root cid.. because of this, we can't use the @helia/car stream() method.
|
|
72
|
+
const root = pathDetails.terminalElement.cid ?? cid
|
|
73
|
+
if (dagScope === 'block') {
|
|
74
|
+
carExportOptions.exporter = new BlockExporter()
|
|
75
|
+
} else if (dagScope === 'entity') {
|
|
76
|
+
// if its unixFS, we need to enumerate a directory, or get all blocks for the entity, otherwise, use blockExporter
|
|
77
|
+
if (root.code === dagPbCode) {
|
|
78
|
+
carExportOptions.exporter = new UnixFSExporter()
|
|
79
|
+
} else {
|
|
80
|
+
carExportOptions.exporter = new BlockExporter()
|
|
81
|
+
}
|
|
82
|
+
} else {
|
|
83
|
+
carExportOptions.exporter = new SubgraphExporter()
|
|
84
|
+
}
|
|
85
|
+
const { writer, out } = CarWriter.create(root)
|
|
86
|
+
const iter = async function * (): AsyncIterable<Uint8Array> {
|
|
87
|
+
for await (const buf of out) {
|
|
88
|
+
yield buf
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// the root passed to export should be the root CID of the DAG, not the terminal element.
|
|
93
|
+
c.export(cid, writer, carExportOptions)
|
|
94
|
+
.catch((err) => {
|
|
95
|
+
this.log.error('error exporting car - %e', err)
|
|
96
|
+
})
|
|
97
|
+
// export will close the writer when it's done, no finally needed.
|
|
98
|
+
|
|
99
|
+
context.byteRangeContext.setBody(toBrowserReadableStream(iter()))
|
|
49
100
|
|
|
50
101
|
const response = okRangeResponse(context.resource, context.byteRangeContext.getBody(), { byteRangeContext: context.byteRangeContext, log: this.log })
|
|
51
102
|
response.headers.set('content-type', 'application/vnd.ipld.car; version=1')
|