@helia/verified-fetch 4.0.5 → 4.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.
- package/dist/index.min.js +60 -60
- package/dist/index.min.js.map +3 -3
- package/dist/src/plugins/plugin-handle-car.d.ts.map +1 -1
- package/dist/src/plugins/plugin-handle-car.js +12 -6
- package/dist/src/plugins/plugin-handle-car.js.map +1 -1
- package/package.json +5 -5
- package/src/plugins/plugin-handle-car.ts +13 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin-handle-car.d.ts","sourceRoot":"","sources":["../../../src/plugins/plugin-handle-car.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAmC/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;
|
|
1
|
+
{"version":3,"file":"plugin-handle-car.d.ts","sourceRoot":"","sources":["../../../src/plugins/plugin-handle-car.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAmC/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;CA6E7G"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { BlockExporter, car, CIDPath, SubgraphExporter, UnixFSExporter } from '@helia/car';
|
|
1
|
+
import { BlockExporter, car, CIDPath, depthFirstWalker, naturalOrderWalker, SubgraphExporter, UnixFSExporter } from '@helia/car';
|
|
2
2
|
import { code as dagPbCode } from '@ipld/dag-pb';
|
|
3
3
|
import { createScalableCuckooFilter } from '@libp2p/utils';
|
|
4
4
|
import toBrowserReadableStream from 'it-to-browser-readablestream';
|
|
5
5
|
import { getOffsetAndLength } from "../utils/get-offset-and-length.js";
|
|
6
|
-
import { okRangeResponse } from '../utils/responses.js';
|
|
6
|
+
import { notAcceptableResponse, okRangeResponse } from '../utils/responses.js';
|
|
7
7
|
import { BasePlugin } from './plugin-base.js';
|
|
8
8
|
function getFilename({ cid, ipfsPath, query }) {
|
|
9
9
|
if (query.filename != null) {
|
|
@@ -44,12 +44,16 @@ export class CarPlugin extends BasePlugin {
|
|
|
44
44
|
return context.accept?.mimeType.startsWith('application/vnd.ipld.car') === true || context.query.format === 'car'; // application/vnd.ipld.car
|
|
45
45
|
}
|
|
46
46
|
async handle(context) {
|
|
47
|
-
const { options, pathDetails, cid, query, accept } = context;
|
|
48
|
-
const order = accept?.options.order === 'dfs' ? 'dfs' : 'unk';
|
|
49
|
-
const duplicates = accept?.options.dups !== 'n';
|
|
47
|
+
const { options, pathDetails, cid, query, accept, resource } = context;
|
|
48
|
+
const order = accept?.options.order === 'dfs' || context.query['car-order'] === 'dfs' ? 'dfs' : 'unk';
|
|
49
|
+
const duplicates = accept?.options.dups !== 'n' && context.query['car-dups'] !== 'n';
|
|
50
50
|
if (pathDetails == null) {
|
|
51
51
|
throw new Error('attempted to handle request for car with no path details');
|
|
52
52
|
}
|
|
53
|
+
// TODO: `@ipld/car` only supports CARv1
|
|
54
|
+
if (accept?.options.version === '2' || context.query['car-version'] === '2') {
|
|
55
|
+
return notAcceptableResponse(resource, 'Only CARv1 is supported');
|
|
56
|
+
}
|
|
53
57
|
const { getBlockstore, helia } = this.pluginOptions;
|
|
54
58
|
context.reqFormat = 'car';
|
|
55
59
|
context.query.download = true;
|
|
@@ -92,7 +96,9 @@ export class CarPlugin extends BasePlugin {
|
|
|
92
96
|
}
|
|
93
97
|
}
|
|
94
98
|
else {
|
|
95
|
-
carExportOptions.exporter = new SubgraphExporter(
|
|
99
|
+
carExportOptions.exporter = new SubgraphExporter({
|
|
100
|
+
walker: order === 'dfs' ? depthFirstWalker() : naturalOrderWalker()
|
|
101
|
+
});
|
|
96
102
|
}
|
|
97
103
|
context.byteRangeContext.setBody(toBrowserReadableStream(c.export(target, carExportOptions)));
|
|
98
104
|
const response = okRangeResponse(context.resource, context.byteRangeContext.getBody('application/vnd.ipld.car; version=1'), {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin-handle-car.js","sourceRoot":"","sources":["../../../src/plugins/plugin-handle-car.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,GAAG,EAAE,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"plugin-handle-car.js","sourceRoot":"","sources":["../../../src/plugins/plugin-handle-car.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,GAAG,EAAE,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAChI,OAAO,EAAE,IAAI,IAAI,SAAS,EAAE,MAAM,cAAc,CAAA;AAChD,OAAO,EAAE,0BAA0B,EAAE,MAAM,eAAe,CAAA;AAC1D,OAAO,uBAAuB,MAAM,8BAA8B,CAAA;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAA;AACtE,OAAO,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAC9E,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAI7C,SAAS,WAAW,CAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAqD;IAC/F,IAAI,KAAK,CAAC,QAAQ,IAAI,IAAI,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC,QAAQ,CAAA;IACvB,CAAC;IAED,0GAA0G;IAC1G,MAAM,QAAQ,GAAG,QAAQ;SACtB,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;SACvB,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;SACvB,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;SACpB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;IAEtB,OAAO,GAAG,QAAQ,MAAM,CAAA;AAC1B,CAAC;AAID,SAAS,WAAW,CAAE,EAAE,KAAK,EAAgC;IAC3D,MAAM,QAAQ,GAAG,KAAK,CAAC,WAAW,CAAC,CAAA;IAEnC,IAAI,QAAQ,KAAK,KAAK,IAAI,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACxE,OAAO,QAAQ,CAAA;IACjB,CAAC;IAED,oCAAoC;IACpC,IAAI,KAAK,CAAC,cAAc,CAAC,EAAE,CAAC;QAC1B,OAAO,QAAQ,CAAA;IACjB,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC;AAED;;;GAGG;AACH,MAAM,OAAO,SAAU,SAAQ,UAAU;IAC9B,EAAE,GAAG,YAAY,CAAA;IAE1B,SAAS,CAAE,OAAsB;QAC/B,IAAI,OAAO,CAAC,gBAAgB,IAAI,IAAI,EAAE,CAAC;YACrC,OAAO,KAAK,CAAA;QACd,CAAC;QAED,IAAI,OAAO,CAAC,WAAW,IAAI,IAAI,EAAE,CAAC;YAChC,OAAO,KAAK,CAAA;QACd,CAAC;QAED,OAAO,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,UAAU,CAAC,0BAA0B,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,KAAK,KAAK,CAAA,CAAC,2BAA2B;IAC/I,CAAC;IAED,KAAK,CAAC,MAAM,CAAE,OAA0E;QACtF,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAA;QAEtE,MAAM,KAAK,GAAG,MAAM,EAAE,OAAO,CAAC,KAAK,KAAK,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAA;QACrG,MAAM,UAAU,GAAG,MAAM,EAAE,OAAO,CAAC,IAAI,KAAK,GAAG,IAAI,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,GAAG,CAAA;QAEpF,IAAI,WAAW,IAAI,IAAI,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAA;QAC7E,CAAC;QAED,wCAAwC;QACxC,IAAI,MAAM,EAAE,OAAO,CAAC,OAAO,KAAK,GAAG,IAAI,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,GAAG,EAAE,CAAC;YAC5E,OAAO,qBAAqB,CAAC,QAAQ,EAAE,yBAAyB,CAAC,CAAA;QACnE,CAAC;QAED,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,aAAa,CAAA;QACnD,OAAO,CAAC,SAAS,GAAG,KAAK,CAAA;QACzB,OAAO,CAAC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAA;QAC7B,OAAO,CAAC,KAAK,CAAC,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,CAAA;QAC7C,MAAM,UAAU,GAAG,aAAa,CAAC,GAAG,EAAE,OAAO,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,OAAO,CAAC,CAAA;QAE1F,MAAM,CAAC,GAAG,GAAG,CAAC;YACZ,UAAU;YACV,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,MAAM,EAAE,KAAK,CAAC,MAAM;SACrB,CAAC,CAAA;QAEF,MAAM,gBAAgB,GAAqB;YACzC,GAAG,OAAO;YACV,sBAAsB,EAAE,IAAI;SAC7B,CAAA;QAED,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,gBAAgB,CAAC,WAAW,GAAG,0BAA0B,CAAC,IAAI,CAAC,CAAA;QACjE,CAAC;QAED,IAAI,WAAW,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrC,gBAAgB,CAAC,SAAS,GAAG,IAAI,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC,CAAA;QACjE,CAAC;QAED,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,CAAA;QACrC,MAAM,MAAM,GAAG,WAAW,CAAC,eAAe,CAAC,GAAG,IAAI,GAAG,CAAA;QAErD,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;YACzB,gBAAgB,CAAC,QAAQ,GAAG,IAAI,aAAa,EAAE,CAAA;QACjD,CAAC;aAAM,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;YACjC,0EAA0E;YAC1E,+CAA+C;YAC/C,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBAC9B,MAAM,OAAO,GAA0B;oBACrC,WAAW,EAAE,IAAI;iBAClB,CAAA;gBAED,MAAM,KAAK,GAAG,kBAAkB,CAAC,WAAW,CAAC,eAAe,EAAE,KAAK,CAAC,cAAc,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAA;gBAChG,OAAO,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAA;gBAC7B,OAAO,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAA;gBAE7B,gBAAgB,CAAC,QAAQ,GAAG,IAAI,cAAc,CAAC,OAAO,CAAC,CAAA;YACzD,CAAC;iBAAM,CAAC;gBACN,gBAAgB,CAAC,QAAQ,GAAG,IAAI,aAAa,EAAE,CAAA;YACjD,CAAC;QACH,CAAC;aAAM,CAAC;YACN,gBAAgB,CAAC,QAAQ,GAAG,IAAI,gBAAgB,CAAC;gBAC/C,MAAM,EAAE,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC,kBAAkB,EAAE;aACpE,CAAC,CAAA;QACJ,CAAC;QAED,OAAO,CAAC,gBAAgB,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAA;QAE7F,MAAM,QAAQ,GAAG,eAAe,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,gBAAgB,CAAC,OAAO,CAAC,qCAAqC,CAAC,EAAE;YAC1H,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;YAC1C,GAAG,EAAE,IAAI,CAAC,GAAG;SACd,CAAC,CAAA;QACF,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,OAAO,CAAC,gBAAgB,CAAC,cAAc,EAAE,IAAI,8CAA8C,KAAK,UAAU,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAA;QAExK,OAAO,QAAQ,CAAA;IACjB,CAAC;CACF"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@helia/verified-fetch",
|
|
3
|
-
"version": "4.0
|
|
3
|
+
"version": "4.1.0",
|
|
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",
|
|
@@ -165,7 +165,7 @@
|
|
|
165
165
|
},
|
|
166
166
|
"dependencies": {
|
|
167
167
|
"@helia/block-brokers": "^5.0.4",
|
|
168
|
-
"@helia/car": "^5.
|
|
168
|
+
"@helia/car": "^5.3.0",
|
|
169
169
|
"@helia/delegated-routing-v1-http-api-client": "^5.0.0",
|
|
170
170
|
"@helia/dnslink": "^1.0.1",
|
|
171
171
|
"@helia/interface": "^6.0.0",
|
|
@@ -183,8 +183,8 @@
|
|
|
183
183
|
"@libp2p/websockets": "^10.1.0",
|
|
184
184
|
"@multiformats/dns": "^1.0.6",
|
|
185
185
|
"cborg": "^4.2.11",
|
|
186
|
-
"file-type": "^21.
|
|
187
|
-
"helia": "^6.0.
|
|
186
|
+
"file-type": "^21.1.1",
|
|
187
|
+
"helia": "^6.0.11",
|
|
188
188
|
"interface-blockstore": "^6.0.1",
|
|
189
189
|
"ipfs-unixfs-exporter": "^14.0.1",
|
|
190
190
|
"ipns": "^10.1.3",
|
|
@@ -207,7 +207,7 @@
|
|
|
207
207
|
"@ipld/car": "^5.4.2",
|
|
208
208
|
"@libp2p/crypto": "^5.1.13",
|
|
209
209
|
"@libp2p/logger": "^6.2.0",
|
|
210
|
-
"@types/sinon": "^
|
|
210
|
+
"@types/sinon": "^21.0.0",
|
|
211
211
|
"aegir": "^47.0.24",
|
|
212
212
|
"browser-readablestream-to-it": "^2.0.9",
|
|
213
213
|
"ipfs-unixfs-importer": "^16.0.1",
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { BlockExporter, car, CIDPath, SubgraphExporter, UnixFSExporter } from '@helia/car'
|
|
1
|
+
import { BlockExporter, car, CIDPath, depthFirstWalker, naturalOrderWalker, SubgraphExporter, UnixFSExporter } from '@helia/car'
|
|
2
2
|
import { code as dagPbCode } from '@ipld/dag-pb'
|
|
3
3
|
import { createScalableCuckooFilter } from '@libp2p/utils'
|
|
4
4
|
import toBrowserReadableStream from 'it-to-browser-readablestream'
|
|
5
5
|
import { getOffsetAndLength } from '../utils/get-offset-and-length.ts'
|
|
6
|
-
import { okRangeResponse } from '../utils/responses.js'
|
|
6
|
+
import { notAcceptableResponse, okRangeResponse } from '../utils/responses.js'
|
|
7
7
|
import { BasePlugin } from './plugin-base.js'
|
|
8
8
|
import type { PluginContext } from './types.js'
|
|
9
9
|
import type { ExportCarOptions, UnixFSExporterOptions } from '@helia/car'
|
|
@@ -60,15 +60,20 @@ export class CarPlugin extends BasePlugin {
|
|
|
60
60
|
}
|
|
61
61
|
|
|
62
62
|
async handle (context: PluginContext & Required<Pick<PluginContext, 'byteRangeContext'>>): Promise<Response> {
|
|
63
|
-
const { options, pathDetails, cid, query, accept } = context
|
|
63
|
+
const { options, pathDetails, cid, query, accept, resource } = context
|
|
64
64
|
|
|
65
|
-
const order = accept?.options.order === 'dfs' ? 'dfs' : 'unk'
|
|
66
|
-
const duplicates = accept?.options.dups !== 'n'
|
|
65
|
+
const order = accept?.options.order === 'dfs' || context.query['car-order'] === 'dfs' ? 'dfs' : 'unk'
|
|
66
|
+
const duplicates = accept?.options.dups !== 'n' && context.query['car-dups'] !== 'n'
|
|
67
67
|
|
|
68
68
|
if (pathDetails == null) {
|
|
69
69
|
throw new Error('attempted to handle request for car with no path details')
|
|
70
70
|
}
|
|
71
71
|
|
|
72
|
+
// TODO: `@ipld/car` only supports CARv1
|
|
73
|
+
if (accept?.options.version === '2' || context.query['car-version'] === '2') {
|
|
74
|
+
return notAcceptableResponse(resource, 'Only CARv1 is supported')
|
|
75
|
+
}
|
|
76
|
+
|
|
72
77
|
const { getBlockstore, helia } = this.pluginOptions
|
|
73
78
|
context.reqFormat = 'car'
|
|
74
79
|
context.query.download = true
|
|
@@ -116,7 +121,9 @@ export class CarPlugin extends BasePlugin {
|
|
|
116
121
|
carExportOptions.exporter = new BlockExporter()
|
|
117
122
|
}
|
|
118
123
|
} else {
|
|
119
|
-
carExportOptions.exporter = new SubgraphExporter(
|
|
124
|
+
carExportOptions.exporter = new SubgraphExporter({
|
|
125
|
+
walker: order === 'dfs' ? depthFirstWalker() : naturalOrderWalker()
|
|
126
|
+
})
|
|
120
127
|
}
|
|
121
128
|
|
|
122
129
|
context.byteRangeContext.setBody(toBrowserReadableStream(c.export(target, carExportOptions)))
|