@helia/verified-fetch 3.0.0 → 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 +46 -46
- 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 +4 -1
- package/dist/src/utils/parse-url-string.d.ts.map +1 -1
- package/dist/src/utils/parse-url-string.js +1 -1
- package/dist/src/utils/parse-url-string.js.map +1 -1
- package/package.json +2 -3
- package/src/plugins/plugin-handle-car.ts +57 -6
- package/src/utils/parse-url-string.ts +2 -1
|
@@ -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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"}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
|
+
import { TLRU } from './tlru.js';
|
|
1
2
|
import type { ServerTimingResult } from './server-timing.js';
|
|
2
3
|
import type { RequestFormatShorthand } from '../types.js';
|
|
3
|
-
import type { IPNS, IPNSRoutingEvents, ResolveDNSLinkProgressEvents, ResolveProgressEvents, ResolveResult } from '@helia/ipns';
|
|
4
|
+
import type { DNSLinkResolveResult, IPNS, IPNSResolveResult, IPNSRoutingEvents, ResolveDNSLinkProgressEvents, ResolveProgressEvents, ResolveResult } from '@helia/ipns';
|
|
4
5
|
import type { AbortOptions, ComponentLogger } from '@libp2p/interface';
|
|
5
6
|
import type { ProgressOptions } from 'progress-events';
|
|
7
|
+
export declare const ipnsCache: TLRU<DNSLinkResolveResult | IPNSResolveResult>;
|
|
6
8
|
export interface ParseUrlStringInput {
|
|
7
9
|
urlString: string;
|
|
8
10
|
ipns: IPNS;
|
|
@@ -15,6 +17,7 @@ export interface ParsedUrlQuery extends Record<string, string | unknown> {
|
|
|
15
17
|
format?: RequestFormatShorthand;
|
|
16
18
|
download?: boolean;
|
|
17
19
|
filename?: string;
|
|
20
|
+
'dag-scope'?: string;
|
|
18
21
|
}
|
|
19
22
|
export interface ParsedUrlStringResults extends ResolveResult {
|
|
20
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":"
|
|
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"}
|
|
@@ -3,7 +3,7 @@ import { CID } from 'multiformats/cid';
|
|
|
3
3
|
import { getPeerIdFromString } from './get-peer-id-from-string.js';
|
|
4
4
|
import { serverTiming } from './server-timing.js';
|
|
5
5
|
import { TLRU } from './tlru.js';
|
|
6
|
-
const ipnsCache = new TLRU(1000);
|
|
6
|
+
export const ipnsCache = new TLRU(1000);
|
|
7
7
|
const URL_REGEX = /^(?<protocol>ip[fn]s):\/\/(?<cidOrPeerIdOrDnsLink>[^/?]+)\/?(?<path>[^?]*)\??(?<queryString>.*)$/;
|
|
8
8
|
const PATH_REGEX = /^\/(?<protocol>ip[fn]s)\/(?<cidOrPeerIdOrDnsLink>[^/?]+)\/?(?<path>[^?]*)\??(?<queryString>.*)$/;
|
|
9
9
|
const PATH_GATEWAY_REGEX = /^https?:\/\/(.*[^/])\/(?<protocol>ip[fn]s)\/(?<cidOrPeerIdOrDnsLink>[^/?]+)\/?(?<path>[^?]*)\??(?<queryString>.*)$/;
|
|
@@ -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,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":"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;AA4CjF,MAAM,SAAS,GAAG,kGAAkG,CAAA;AACpH,MAAM,UAAU,GAAG,iGAAiG,CAAA;AACpH,MAAM,kBAAkB,GAAG,oHAAoH,CAAA;AAC/I,MAAM,uBAAuB,GAAG,oHAAoH,CAAA;AASpJ,SAAS,mBAAmB,CAAE,MAA6D;IACzF,MAAM,QAAQ,GAAG,MAAM,EAAE,QAAQ,CAAA;IACjC,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;QAAC,OAAO,KAAK,CAAA;IAAC,CAAC;IACtC,MAAM,oBAAoB,GAAG,MAAM,EAAE,oBAAoB,CAAA;IACzD,IAAI,oBAAoB,IAAI,IAAI,EAAE,CAAC;QAAC,OAAO,KAAK,CAAA;IAAC,CAAC;IAClD,MAAM,IAAI,GAAG,MAAM,EAAE,IAAI,CAAA;IACzB,MAAM,WAAW,GAAG,MAAM,EAAE,WAAW,CAAA;IAEvC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACxC,OAAO,oBAAoB,KAAK,QAAQ;QACxC,CAAC,IAAI,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,CAAC;QAC1C,CAAC,WAAW,IAAI,IAAI,IAAI,OAAO,WAAW,KAAK,QAAQ,CAAC,CAAA;AAC5D,CAAC;AAED,MAAM,UAAU,cAAc,CAAE,SAAiB;IAC/C,KAAK,MAAM,OAAO,IAAI,CAAC,uBAAuB,EAAE,SAAS,EAAE,kBAAkB,EAAE,UAAU,CAAC,EAAE,CAAC;QAC3F,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QAEtC,IAAI,mBAAmB,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC;YACvC,OAAO,KAAK,CAAC,MAA+B,CAAA;QAC9C,CAAC;IACH,CAAC;IAED,MAAM,IAAI,SAAS,CAAC,gBAAgB,SAAS,qDAAqD,CAAC,CAAA;AACrG,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,SAAS,YAAY,CAAE,aAAwD;IAC7E,IAAI,aAAa,IAAI,IAAI,EAAE,CAAC;QAC1B,OAAO,SAAS,CAAA;IAClB,CAAC;IACD,MAAM,UAAU,GAAI,aAAsC,CAAC,MAAM,EAAE,GAAG,CAAA;IACtE,MAAM,SAAS,GAAI,aAAmC,CAAC,MAAM,EAAE,GAAG,CAAA;IAClE,MAAM,OAAO,GAAG,SAAS,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IAC/E,OAAO,UAAU,IAAI,OAAO,CAAA;AAC9B,CAAC;AAED;;;GAGG;AAEH,qEAAqE;AACrE,uEAAuE;AACvE,MAAM,aAAa,GAAG,+CAA+C,CAAA;AAErE;;;GAGG;AACH,SAAS,gBAAgB,CAAE,KAAa;IACtC,OAAO,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;AACjF,CAAC;AAED;;;;;;GAMG;AACH,SAAS,mBAAmB,CAAE,SAAiB;IAC7C,OAAO,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;AAC5E,CAAC;AAED;;;;;;;;;;GAUG;AACH,sCAAsC;AACtC,MAAM,CAAC,KAAK,UAAU,cAAc,CAAE,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,gBAAgB,GAAG,KAAK,EAAuB,EAAE,OAA+B;IAC/I,MAAM,GAAG,GAAG,MAAM,CAAC,YAAY,CAAC,uCAAuC,CAAC,CAAA;IACxE,MAAM,EAAE,QAAQ,EAAE,oBAAoB,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,cAAc,CAAC,SAAS,CAAC,CAAA;IAEhG,IAAI,GAAoB,CAAA;IACxB,IAAI,YAAgC,CAAA;IACpC,MAAM,MAAM,GAAY,EAAE,CAAA;IAC1B,IAAI,aAAmE,CAAA;IACvE,MAAM,aAAa,GAAmC,EAAE,CAAA;IAExD,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;QACxB,IAAI,CAAC;YACH,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAA;YACrC;;eAEG;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;YACd,MAAM,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC,kCAAkC,CAAC,CAAC,CAAA;QAChE,CAAC;IACH,CAAC;SAAM,CAAC;QACN,mBAAmB;QACnB,aAAa,GAAG,SAAS,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAA;QAEnD,IAAI,aAAa,IAAI,IAAI,EAAE,CAAC;YAC1B,GAAG,GAAG,aAAa,CAAC,GAAG,CAAA;YACvB,YAAY,GAAG,aAAa,CAAC,IAAI,CAAA;YACjC,GAAG,CAAC,KAAK,CAAC,8BAA8B,EAAE,oBAAoB,EAAE,GAAG,CAAC,CAAA;QACtE,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,KAAK,CAAC,qCAAqC,EAAE,oBAAoB,CAAC,CAAA;YACtE,IAAI,MAA0B,CAAA;YAC9B,IAAI,CAAC;gBACH,gCAAgC;gBAEhC,MAAM,GAAG,mBAAmB,CAAC,oBAAoB,CAAC,CAAA;gBAClD,MAAM,MAAM,GAAG,MAAM,EAAE,SAAS,CAAA;gBAChC,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;oBACnB,MAAM,IAAI,SAAS,CAAC,6CAA6C,CAAC,CAAA;gBACpE,CAAC;gBAED,IAAI,gBAAgB,EAAE,CAAC;oBACrB,MAAM,WAAW,GAAG,KAAK,IAAgC,EAAE;wBACzD,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;oBACtC,CAAC,CAAA;oBACD,MAAM,6BAA6B,GAAG,MAAM,YAAY,CAAC,cAAc,EAAE,qBAAqB,oBAAoB,EAAE,EAAE,WAAW,CAAC,CAAA;oBAClI,aAAa,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAA;oBAEjD,qCAAqC;oBACrC,IAAI,6BAA6B,CAAC,KAAK,IAAI,IAAI,EAAE,CAAC;wBAChD,MAAM,6BAA6B,CAAC,KAAK,CAAA;oBAC3C,CAAC;oBACD,aAAa,GAAG,6BAA6B,CAAC,MAAM,CAAA;gBACtD,CAAC;qBAAM,CAAC;oBACN,aAAa,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;gBACrD,CAAC;gBACD,GAAG,GAAG,aAAa,EAAE,GAAG,CAAA;gBACxB,YAAY,GAAG,aAAa,EAAE,IAAI,CAAA;gBAClC,GAAG,CAAC,KAAK,CAAC,mBAAmB,EAAE,oBAAoB,EAAE,GAAG,CAAC,CAAA;YAC3D,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;oBAC7B,MAAM,IAAI,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;gBAC/C,CAAC;gBACD,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;oBACnB,GAAG,CAAC,KAAK,CAAC,oCAAoC,EAAE,oBAAoB,EAAE,GAAG,CAAC,CAAA;oBAC1E,MAAM,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC,uCAAuC,oBAAoB,MAAO,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC,CAAA;gBACvH,CAAC;qBAAM,CAAC;oBACN,GAAG,CAAC,KAAK,CAAC,6BAA6B,EAAE,MAAM,EAAE,GAAG,CAAC,CAAA;oBACrD,MAAM,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC,6BAA6B,oBAAoB,MAAO,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC,CAAA;gBAC7G,CAAC;YACH,CAAC;YAED,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;gBAChB,gDAAgD;gBAChD,IAAI,mBAAmB,GAAG,oBAAoB,CAAA;gBAC9C,IAAI,gBAAgB,CAAC,oBAAoB,CAAC,EAAE,CAAC;oBAC3C,mBAAmB,GAAG,mBAAmB,CAAC,oBAAoB,CAAC,CAAA;oBAC/D,GAAG,CAAC,KAAK,CAAC,mCAAmC,EAAE,oBAAoB,EAAE,mBAAmB,CAAC,CAAA;gBAC3F,CAAC;gBACD,GAAG,CAAC,KAAK,CAAC,sCAAsC,EAAE,mBAAmB,CAAC,CAAA;gBAEtE,IAAI,CAAC;oBACH,qCAAqC;oBACrC,IAAI,gBAAgB,EAAE,CAAC;wBACrB,MAAM,6BAA6B,GAAG,MAAM,YAAY,CAAC,qBAAqB,EAAE,mBAAmB,mBAAmB,EAAE,EAAE,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,mBAAmB,EAAE,OAAO,CAAC,CAAC,CAAA;wBACvL,aAAa,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAA;wBACjD,qCAAqC;wBACrC,IAAI,6BAA6B,CAAC,KAAK,IAAI,IAAI,EAAE,CAAC;4BAChD,MAAM,6BAA6B,CAAC,KAAK,CAAA;wBAC3C,CAAC;wBACD,aAAa,GAAG,6BAA6B,CAAC,MAAM,CAAA;oBACtD,CAAC;yBAAM,CAAC;wBACN,aAAa,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,mBAAmB,EAAE,OAAO,CAAC,CAAA;oBACzE,CAAC;oBAED,GAAG,GAAG,aAAa,EAAE,GAAG,CAAA;oBACxB,YAAY,GAAG,aAAa,EAAE,IAAI,CAAA;oBAClC,GAAG,CAAC,KAAK,CAAC,mBAAmB,EAAE,mBAAmB,EAAE,GAAG,CAAC,CAAA;gBAC1D,CAAC;gBAAC,OAAO,GAAQ,EAAE,CAAC;oBAClB,qCAAqC;oBACrC,IAAI,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;wBAC7B,MAAM,IAAI,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;oBAC/C,CAAC;oBACD,GAAG,CAAC,KAAK,CAAC,oCAAoC,EAAE,oBAAoB,EAAE,GAAG,CAAC,CAAA;oBAC1E,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;gBAClB,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;QAChB,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,MAAM,MAAM,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,oDAAoD,SAAS,IAAI,CAAC,CAAC,CAAA;QAEzF,+DAA+D;QAC/D,MAAM,MAAM,CAAA;IACd,CAAC;IAED,IAAI,GAAG,GAAG,YAAY,CAAC,aAAa,CAAC,CAAA;IAErC,IAAI,aAAa,IAAI,IAAI,EAAE,CAAC;QAC1B,kGAAkG;QAClG,GAAG,GAAG,GAAG,IAAI,EAAE,GAAG,CAAC,CAAA;QACnB,GAAG,CAAC,KAAK,CAAC,wCAAwC,EAAE,oBAAoB,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;QACnF,+CAA+C;QAC/C,SAAS,CAAC,GAAG,CAAC,oBAAoB,EAAE,aAAa,EAAE,GAAG,GAAG,IAAI,CAAC,CAAA;IAChE,CAAC;IAED,qBAAqB;IACrB,MAAM,KAAK,GAAwB,EAAE,CAAA;IAErC,IAAI,WAAW,IAAI,IAAI,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClD,MAAM,UAAU,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QACzC,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;YAC9B,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;YACpC,KAAK,CAAC,GAAG,CAAC,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAA;QACxC,CAAC;QAED,IAAI,KAAK,CAAC,QAAQ,IAAI,IAAI,EAAE,CAAC;YAC3B,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,KAAK,MAAM,CAAA;QAC5C,CAAC;QAED,IAAI,KAAK,CAAC,QAAQ,IAAI,IAAI,EAAE,CAAC;YAC3B,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAA;QAC5C,CAAC;IACH,CAAC;IAED,OAAO;QACL,QAAQ;QACR,GAAG;QACH,IAAI,EAAE,SAAS,CAAC,YAAY,EAAE,OAAO,IAAI,EAAE,CAAC;QAC5C,KAAK;QACL,GAAG;QACH,QAAQ,EAAE,IAAI,QAAQ,IAAI,oBAAoB,GAAG,OAAO,IAAI,IAAI,IAAI,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE;QACzG,aAAa;KACmB,CAAA;AACpC,CAAC;AAED;;;;GAIG;AACH,SAAS,SAAS,CAAE,YAAgC,EAAE,OAAe;IACnE,IAAI,IAAI,GAAG,EAAE,CAAA;IAEb,IAAI,YAAY,IAAI,IAAI,EAAE,CAAC;QACzB,IAAI,IAAI,YAAY,CAAA;IACtB,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,IAAI,GAAG,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,OAAO,EAAE,CAAA;IAC3D,CAAC;IAED,oCAAoC;IACpC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,CAAA;IAEpC,0CAA0C;IAC1C,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACzB,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;IAC1B,CAAC;IAED,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAC1D,CAAC"}
|
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",
|
|
@@ -213,7 +213,6 @@
|
|
|
213
213
|
"helia": "^5.4.1",
|
|
214
214
|
"ipfs-unixfs-importer": "^15.3.2",
|
|
215
215
|
"it-all": "^3.0.8",
|
|
216
|
-
"it-drain": "^3.0.9",
|
|
217
216
|
"it-last": "^3.0.8",
|
|
218
217
|
"it-to-buffer": "^4.0.9",
|
|
219
218
|
"magic-bytes.js": "^1.12.1",
|
|
@@ -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')
|
|
@@ -9,7 +9,7 @@ import type { DNSLinkResolveResult, IPNS, IPNSResolveResult, IPNSRoutingEvents,
|
|
|
9
9
|
import type { AbortOptions, ComponentLogger, PeerId } from '@libp2p/interface'
|
|
10
10
|
import type { ProgressOptions } from 'progress-events'
|
|
11
11
|
|
|
12
|
-
const ipnsCache = new TLRU<DNSLinkResolveResult | IPNSResolveResult>(1000)
|
|
12
|
+
export const ipnsCache = new TLRU<DNSLinkResolveResult | IPNSResolveResult>(1000)
|
|
13
13
|
|
|
14
14
|
export interface ParseUrlStringInput {
|
|
15
15
|
urlString: string
|
|
@@ -25,6 +25,7 @@ export interface ParsedUrlQuery extends Record<string, string | unknown> {
|
|
|
25
25
|
format?: RequestFormatShorthand
|
|
26
26
|
download?: boolean
|
|
27
27
|
filename?: string
|
|
28
|
+
'dag-scope'?: string
|
|
28
29
|
}
|
|
29
30
|
|
|
30
31
|
export interface ParsedUrlStringResults extends ResolveResult {
|