@helia/verified-fetch 5.1.1 → 6.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 (72) hide show
  1. package/dist/index.min.js +61 -61
  2. package/dist/index.min.js.map +4 -4
  3. package/dist/src/index.d.ts +29 -6
  4. package/dist/src/index.d.ts.map +1 -1
  5. package/dist/src/index.js.map +1 -1
  6. package/dist/src/plugins/plugin-handle-car.d.ts.map +1 -1
  7. package/dist/src/plugins/plugin-handle-car.js +7 -3
  8. package/dist/src/plugins/plugin-handle-car.js.map +1 -1
  9. package/dist/src/plugins/plugin-handle-ipld.d.ts.map +1 -1
  10. package/dist/src/plugins/plugin-handle-ipld.js +4 -15
  11. package/dist/src/plugins/plugin-handle-ipld.js.map +1 -1
  12. package/dist/src/plugins/plugin-handle-raw.d.ts +11 -0
  13. package/dist/src/plugins/plugin-handle-raw.d.ts.map +1 -0
  14. package/dist/src/plugins/plugin-handle-raw.js +41 -0
  15. package/dist/src/plugins/plugin-handle-raw.js.map +1 -0
  16. package/dist/src/plugins/plugin-handle-unixfs.d.ts.map +1 -1
  17. package/dist/src/plugins/plugin-handle-unixfs.js +36 -18
  18. package/dist/src/plugins/plugin-handle-unixfs.js.map +1 -1
  19. package/dist/src/url-resolver.d.ts +2 -3
  20. package/dist/src/url-resolver.d.ts.map +1 -1
  21. package/dist/src/url-resolver.js +20 -57
  22. package/dist/src/url-resolver.js.map +1 -1
  23. package/dist/src/utils/error-to-response.d.ts +1 -1
  24. package/dist/src/utils/error-to-response.d.ts.map +1 -1
  25. package/dist/src/utils/error-to-response.js +14 -12
  26. package/dist/src/utils/error-to-response.js.map +1 -1
  27. package/dist/src/utils/get-range-header.d.ts +2 -1
  28. package/dist/src/utils/get-range-header.d.ts.map +1 -1
  29. package/dist/src/utils/get-range-header.js.map +1 -1
  30. package/dist/src/utils/get-tar-stream.d.ts.map +1 -1
  31. package/dist/src/utils/get-tar-stream.js +22 -9
  32. package/dist/src/utils/get-tar-stream.js.map +1 -1
  33. package/dist/src/utils/parse-resource.d.ts +10 -0
  34. package/dist/src/utils/parse-resource.d.ts.map +1 -0
  35. package/dist/src/utils/parse-resource.js +52 -0
  36. package/dist/src/utils/parse-resource.js.map +1 -0
  37. package/dist/src/utils/responses.d.ts +14 -14
  38. package/dist/src/utils/responses.d.ts.map +1 -1
  39. package/dist/src/utils/responses.js +8 -3
  40. package/dist/src/utils/responses.js.map +1 -1
  41. package/dist/src/verified-fetch.d.ts +1 -0
  42. package/dist/src/verified-fetch.d.ts.map +1 -1
  43. package/dist/src/verified-fetch.js +117 -119
  44. package/dist/src/verified-fetch.js.map +1 -1
  45. package/package.json +3 -3
  46. package/src/index.ts +30 -6
  47. package/src/plugins/plugin-handle-car.ts +8 -3
  48. package/src/plugins/plugin-handle-ipld.ts +4 -14
  49. package/src/plugins/plugin-handle-raw.ts +52 -0
  50. package/src/plugins/plugin-handle-unixfs.ts +42 -19
  51. package/src/url-resolver.ts +22 -65
  52. package/src/utils/error-to-response.ts +15 -12
  53. package/src/utils/get-range-header.ts +2 -1
  54. package/src/utils/get-tar-stream.ts +26 -10
  55. package/src/utils/parse-resource.ts +62 -0
  56. package/src/utils/responses.ts +24 -19
  57. package/src/verified-fetch.ts +123 -122
  58. package/dist/src/utils/ipfs-path-to-url.d.ts +0 -16
  59. package/dist/src/utils/ipfs-path-to-url.d.ts.map +0 -1
  60. package/dist/src/utils/ipfs-path-to-url.js +0 -45
  61. package/dist/src/utils/ipfs-path-to-url.js.map +0 -1
  62. package/dist/src/utils/parse-url-string.d.ts +0 -23
  63. package/dist/src/utils/parse-url-string.d.ts.map +0 -1
  64. package/dist/src/utils/parse-url-string.js +0 -120
  65. package/dist/src/utils/parse-url-string.js.map +0 -1
  66. package/dist/src/utils/resource-to-cache-key.d.ts +0 -15
  67. package/dist/src/utils/resource-to-cache-key.d.ts.map +0 -1
  68. package/dist/src/utils/resource-to-cache-key.js +0 -27
  69. package/dist/src/utils/resource-to-cache-key.js.map +0 -1
  70. package/src/utils/ipfs-path-to-url.ts +0 -54
  71. package/src/utils/parse-url-string.ts +0 -165
  72. package/src/utils/resource-to-cache-key.ts +0 -30
@@ -1,6 +1,6 @@
1
1
  import { dnsLink } from '@helia/dnslink';
2
2
  import { ipnsResolver } from '@helia/ipns';
3
- import { AbortError } from '@libp2p/interface';
3
+ import { isPeerId, isPublicKey } from '@libp2p/interface';
4
4
  import { CID } from 'multiformats/cid';
5
5
  import { CustomProgressEvent } from 'progress-events';
6
6
  import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string';
@@ -8,6 +8,7 @@ import { toString as uint8ArrayToString } from 'uint8arrays/to-string';
8
8
  import { CarPlugin } from './plugins/plugin-handle-car.js';
9
9
  import { IpldPlugin } from './plugins/plugin-handle-ipld.js';
10
10
  import { IpnsRecordPlugin } from './plugins/plugin-handle-ipns-record.js';
11
+ import { RawPlugin } from "./plugins/plugin-handle-raw.js";
11
12
  import { TarPlugin } from './plugins/plugin-handle-tar.js';
12
13
  import { UnixFSPlugin } from './plugins/plugin-handle-unixfs.js';
13
14
  import { URLResolver } from "./url-resolver.js";
@@ -17,9 +18,9 @@ import { errorToObject } from "./utils/error-to-object.js";
17
18
  import { errorToResponse } from "./utils/error-to-response.js";
18
19
  import { getETag, ifNoneMatches } from './utils/get-e-tag.js';
19
20
  import { getRangeHeader } from "./utils/get-range-header.js";
20
- import { parseURLString } from "./utils/parse-url-string.js";
21
+ import { stringToIpfsUrl } from "./utils/parse-resource.js";
21
22
  import { setCacheControlHeader } from './utils/response-headers.js';
22
- import { badRequestResponse, internalServerErrorResponse, notAcceptableResponse, notImplementedResponse, notModifiedResponse } from './utils/responses.js';
23
+ import { notAcceptableResponse, notImplementedResponse, notModifiedResponse } from './utils/responses.js';
23
24
  import { ServerTiming } from './utils/server-timing.js';
24
25
  /**
25
26
  * Retypes the `.signal` property of the options from
@@ -89,7 +90,8 @@ export class VerifiedFetch {
89
90
  new IpldPlugin(pluginOptions),
90
91
  new CarPlugin(pluginOptions),
91
92
  new TarPlugin(pluginOptions),
92
- new IpnsRecordPlugin(pluginOptions)
93
+ new IpnsRecordPlugin(pluginOptions),
94
+ new RawPlugin(pluginOptions)
93
95
  ];
94
96
  const customPlugins = init.plugins?.map((pluginFactory) => pluginFactory(pluginOptions)) ?? [];
95
97
  if (customPlugins.length > 0) {
@@ -114,106 +116,98 @@ export class VerifiedFetch {
114
116
  */
115
117
  async fetch(resource, opts) {
116
118
  this.log('fetch %s %s', opts?.method ?? 'GET', resource);
117
- if (opts?.method === 'OPTIONS') {
118
- return this.handleFinalResponse(new Response(null, {
119
- status: 200
120
- }));
121
- }
122
- const options = convertOptions(opts);
123
- const headers = new Headers(options?.headers);
124
- const serverTiming = new ServerTiming();
125
- options?.onProgress?.(new CustomProgressEvent('verified-fetch:request:start', { resource }));
126
- const range = getRangeHeader(resource.toString(), headers);
127
- if (range instanceof Response) {
128
- // invalid range request
129
- return this.handleFinalResponse(range);
130
- }
131
- let url;
132
119
  try {
133
- url = parseURLString(typeof resource === 'string' ? resource : `ipfs://${resource}`);
134
- }
135
- catch (err) {
136
- return this.handleFinalResponse(badRequestResponse(resource.toString(), err));
137
- }
138
- if (url.protocol === 'ipfs:' && url.pathname === '') {
139
- // if we don't need to resolve an IPNS names or traverse a DAG, we can
140
- // check the if-none-match header and maybe return a 304 without needing
141
- // to load any blocks
142
- if (ifNoneMatches(`"${url.hostname}"`, headers)) {
143
- return notModifiedResponse(resource.toString(), new Headers({
144
- etag: `"${url.hostname}"`,
145
- 'cache-control': 'public, max-age=29030400, immutable'
120
+ if (opts?.method === 'OPTIONS') {
121
+ return this.handleFinalResponse(new Response(null, {
122
+ status: 200
146
123
  }));
147
124
  }
148
- }
149
- const requestedMimeTypes = getRequestedMimeTypes(url, headers.get('accept'));
150
- let parsedResult;
151
- // if just an IPNS record has been requested, don't try to load the block
152
- // the record points to or do any recursive IPNS resolving
153
- if (isIPNSRecordRequest(headers)) {
154
- if (url.protocol !== 'ipns:') {
155
- return notAcceptableResponse(url, requestedMimeTypes, [
156
- CONTENT_TYPE_IPNS
157
- ]);
125
+ const options = convertOptions(opts);
126
+ const headers = new Headers(options?.headers);
127
+ const serverTiming = new ServerTiming();
128
+ if (options != null) {
129
+ options.offline ??= headers.get('cache-control') === 'only-if-cached';
158
130
  }
159
- // @ts-expect-error ipnsRecordPlugin may not be of type IpnsRecordPlugin
160
- const ipnsRecordPlugin = this.plugins.find(plugin => plugin.id === 'ipns-record-plugin');
161
- if (ipnsRecordPlugin == null) {
162
- // IPNS record was requested but no IPNS Record plugin is configured?!
163
- return notAcceptableResponse(url, requestedMimeTypes, []);
131
+ options?.onProgress?.(new CustomProgressEvent('verified-fetch:request:start', { resource }));
132
+ const range = getRangeHeader(resource, headers);
133
+ if (range instanceof Response) {
134
+ // invalid range request
135
+ return this.handleFinalResponse(range);
164
136
  }
165
- return this.handleFinalResponse(await ipnsRecordPlugin.handle({
166
- range,
167
- url,
168
- resource: resource.toString(),
169
- options
137
+ const url = this.parseResource(resource);
138
+ if (url.protocol === 'ipfs:' && url.pathname === '') {
139
+ // if we don't need to resolve an IPNS names or traverse a DAG, we can
140
+ // check the if-none-match header and maybe return a 304 without needing
141
+ // to load any blocks
142
+ if (ifNoneMatches(`"${url.hostname}"`, headers)) {
143
+ return notModifiedResponse(resource, new Headers({
144
+ etag: `"${url.hostname}"`,
145
+ 'cache-control': 'public, max-age=29030400, immutable'
146
+ }));
147
+ }
148
+ }
149
+ const requestedMimeTypes = getRequestedMimeTypes(url, headers.get('accept'));
150
+ // if a raw IPNS record has been requested, don't try to load the block
151
+ // the record points to or do any recursive IPNS resolving
152
+ if (isIPNSRecordRequest(headers)) {
153
+ if (url.protocol !== 'ipns:') {
154
+ return notAcceptableResponse(url, requestedMimeTypes, [
155
+ CONTENT_TYPE_IPNS
156
+ ]);
157
+ }
158
+ // @ts-expect-error ipnsRecordPlugin may not be of type IpnsRecordPlugin
159
+ const ipnsRecordPlugin = this.plugins.find(plugin => plugin.id === 'ipns-record-plugin');
160
+ if (ipnsRecordPlugin == null) {
161
+ // IPNS record was requested but no IPNS Record plugin is configured?!
162
+ return notAcceptableResponse(resource, requestedMimeTypes, []);
163
+ }
164
+ return this.handleFinalResponse(await ipnsRecordPlugin.handle({
165
+ range,
166
+ url,
167
+ resource,
168
+ options
169
+ }));
170
+ }
171
+ const resolveResult = await this.urlResolver.resolve(url, serverTiming, {
172
+ ...options,
173
+ isRawBlockRequest: isRawBlockRequest(headers)
174
+ });
175
+ options?.onProgress?.(new CustomProgressEvent('verified-fetch:request:resolve', {
176
+ cid: resolveResult.terminalElement.cid,
177
+ path: resolveResult.url.pathname
170
178
  }));
171
- }
172
- else {
173
- try {
174
- parsedResult = await this.urlResolver.resolve(url, serverTiming, {
175
- ...options,
176
- isRawBlockRequest: isRawBlockRequest(headers),
177
- onlyIfCached: headers.get('cache-control') === 'only-if-cached'
178
- });
179
+ const accept = this.getAcceptHeader(resolveResult.url, requestedMimeTypes, resolveResult.terminalElement.cid);
180
+ if (accept instanceof Response) {
181
+ this.log('allowed media types for requested CID did not contain anything the client can understand');
182
+ // invalid accept header
183
+ return this.handleFinalResponse(accept);
179
184
  }
180
- catch (err) {
181
- options?.signal?.throwIfAborted();
182
- this.log.error('error parsing resource %s - %e', resource, err);
183
- return this.handleFinalResponse(errorToResponse(resource, err));
185
+ const context = {
186
+ ...resolveResult,
187
+ resource,
188
+ accept,
189
+ range,
190
+ options,
191
+ onProgress: options?.onProgress,
192
+ serverTiming,
193
+ headers,
194
+ requestedMimeTypes
195
+ };
196
+ this.log.trace('finding handler for cid code "0x%s" and response content types %s', resolveResult.terminalElement.cid.code.toString(16), accept.map(header => header.contentType.mediaType).join(', '));
197
+ const response = await this.runPluginPipeline(context);
198
+ options?.onProgress?.(new CustomProgressEvent('verified-fetch:request:end', {
199
+ cid: resolveResult.terminalElement.cid,
200
+ path: resolveResult.url.pathname
201
+ }));
202
+ if (response == null) {
203
+ this.log.error('no plugin could handle request for %s', resource);
184
204
  }
205
+ return this.handleFinalResponse(response, Boolean(options?.withServerTiming) || Boolean(this.withServerTiming), context);
185
206
  }
186
- options?.onProgress?.(new CustomProgressEvent('verified-fetch:request:resolve', {
187
- cid: parsedResult.terminalElement.cid,
188
- path: parsedResult.url.pathname
189
- }));
190
- const accept = this.getAcceptHeader(parsedResult.url, requestedMimeTypes, parsedResult.terminalElement.cid);
191
- if (accept instanceof Response) {
192
- this.log('allowed media types for requested CID did not contain anything the client can understand');
193
- // invalid accept header
194
- return this.handleFinalResponse(accept);
195
- }
196
- const context = {
197
- ...parsedResult,
198
- resource: resource.toString(),
199
- accept,
200
- range,
201
- options,
202
- onProgress: options?.onProgress,
203
- serverTiming,
204
- headers,
205
- requestedMimeTypes
206
- };
207
- this.log.trace('finding handler for cid code "0x%s" and response content types %s', parsedResult.terminalElement.cid.code.toString(16), accept.map(header => header.contentType.mediaType).join(', '));
208
- const response = await this.runPluginPipeline(context);
209
- options?.onProgress?.(new CustomProgressEvent('verified-fetch:request:end', {
210
- cid: parsedResult.terminalElement.cid,
211
- path: parsedResult.url.pathname
212
- }));
213
- if (response == null) {
214
- this.log.error('no plugin could handle request for %s', resource);
207
+ catch (err) {
208
+ this.log.error('error fetching resource %s - %e', resource, err);
209
+ return this.handleFinalResponse(errorToResponse(resource, err, opts));
215
210
  }
216
- return this.handleFinalResponse(response, Boolean(options?.withServerTiming) || Boolean(this.withServerTiming), context);
217
211
  }
218
212
  /**
219
213
  * Returns a prioritized list of acceptable content types for the response
@@ -259,6 +253,15 @@ export class VerifiedFetch {
259
253
  }
260
254
  return acceptable;
261
255
  }
256
+ parseResource(resource) {
257
+ if (isPeerId(resource) || isPublicKey(resource)) {
258
+ resource = `/ipns/${resource}`;
259
+ }
260
+ if (CID.asCID(resource) === resource || resource instanceof CID) {
261
+ resource = `/ipfs/${resource}`;
262
+ }
263
+ return new URL(stringToIpfsUrl(resource.toString()));
264
+ }
262
265
  /**
263
266
  * The last place a Response touches in verified-fetch before being returned
264
267
  * to the user. This is where we add the Server-Timing header to the response
@@ -284,7 +287,7 @@ export class VerifiedFetch {
284
287
  // headers can ony contain extended ASCII but IPFS paths can be unicode
285
288
  const decodedPath = decodeURI(context?.url.pathname);
286
289
  const path = uint8ArrayToString(uint8ArrayFromString(decodedPath), 'ascii');
287
- response.headers.set('x-ipfs-path', `/${context.url.protocol === 'ipfs:' ? 'ipfs' : 'ipns'}/${context?.url.hostname}${path}`);
290
+ response.headers.set('x-ipfs-path', `/${context.url.protocol === 'ipfs:' ? 'ipfs' : 'ipns'}/${context?.url.hostname}${path === '/' ? '' : path}`);
288
291
  }
289
292
  // set CORS headers. If hosting your own gateway with verified-fetch behind
290
293
  // the scenes, you can alter these before you send the response to the
@@ -331,31 +334,26 @@ export class VerifiedFetch {
331
334
  const contextChanged = false;
332
335
  let pluginHandled = false;
333
336
  for (const plugin of plugins) {
334
- try {
335
- this.log('invoking plugin: %s', plugin.id);
336
- pluginsUsed.add(plugin.id);
337
- const maybeResponse = await plugin.handle(context);
338
- this.log('plugin response %s %o', plugin.id, maybeResponse);
339
- if (maybeResponse != null) {
340
- // if a plugin returns a final Response, short-circuit
341
- finalResponse = maybeResponse;
342
- pluginHandled = true;
343
- break;
344
- }
345
- }
346
- catch (err) {
347
- if (context.options?.signal?.aborted) {
348
- throw new AbortError(context.options?.signal?.reason);
349
- }
350
- this.log.error('error in plugin %s - %e', plugin.id, err);
351
- return internalServerErrorResponse(context.resource, JSON.stringify({
352
- error: errorToObject(err)
353
- }), {
354
- headers: {
355
- 'content-type': 'application/json'
356
- }
357
- });
337
+ // try {
338
+ this.log('invoking plugin: %s', plugin.id);
339
+ pluginsUsed.add(plugin.id);
340
+ const maybeResponse = await plugin.handle(context);
341
+ this.log('plugin response %s %o', plugin.id, maybeResponse);
342
+ if (maybeResponse != null) {
343
+ // if a plugin returns a final Response, short-circuit
344
+ finalResponse = maybeResponse;
345
+ pluginHandled = true;
346
+ break;
358
347
  }
348
+ /* } catch (err: any) {
349
+ if (context.options?.signal?.aborted) {
350
+ throw new AbortError(context.options?.signal?.reason)
351
+ }
352
+
353
+ this.log.error('error in plugin %s - %e', plugin.id, err)
354
+
355
+ return internalServerErrorResponse(context.resource, err)
356
+ } */
359
357
  if (finalResponse != null) {
360
358
  this.log.trace('plugin %s produced final response', plugin.id);
361
359
  break;
@@ -1 +1 @@
1
- {"version":3,"file":"verified-fetch.js","sourceRoot":"","sources":["../../src/verified-fetch.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"verified-fetch.js","sourceRoot":"","sources":["../../src/verified-fetch.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": "5.1.1",
3
+ "version": "6.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",
@@ -185,9 +185,10 @@
185
185
  "file-type": "^21.1.1",
186
186
  "helia": "^6.0.11",
187
187
  "interface-blockstore": "^6.0.1",
188
- "ipfs-unixfs-exporter": "^14.0.1",
188
+ "ipfs-unixfs-exporter": "^15.0.0",
189
189
  "ipns": "^10.1.3",
190
190
  "it-first": "^3.0.9",
191
+ "it-last": "^3.0.9",
191
192
  "it-map": "^3.1.3",
192
193
  "it-pipe": "^3.0.1",
193
194
  "it-tar": "^6.0.5",
@@ -214,7 +215,6 @@
214
215
  "cborg": "^4.2.11",
215
216
  "ipfs-unixfs-importer": "^16.0.1",
216
217
  "it-all": "^3.0.8",
217
- "it-last": "^3.0.8",
218
218
  "magic-bytes.js": "^1.12.1",
219
219
  "race-signal": "^2.0.0",
220
220
  "sinon": "^21.0.0",
package/src/index.ts CHANGED
@@ -786,12 +786,12 @@ import type { RequestedMimeType } from './verified-fetch.js'
786
786
  import type { DNSLink, ResolveProgressEvents as ResolveDNSLinkProgressEvents } from '@helia/dnslink'
787
787
  import type { GetBlockProgressEvents, Helia, Routing } from '@helia/interface'
788
788
  import type { ResolveProgressEvents as ResolveIPNSNameProgressEvents, IPNSRoutingProgressEvents, IPNSResolver } from '@helia/ipns'
789
- import type { AbortOptions, Libp2p, ServiceMap, Logger } from '@libp2p/interface'
789
+ import type { AbortOptions, Libp2p, ServiceMap, Logger, PeerId, PublicKey } from '@libp2p/interface'
790
790
  import type { DNSResolvers, DNS } from '@multiformats/dns'
791
791
  import type { DNSResolver } from '@multiformats/dns/resolvers'
792
792
  import type { HeliaInit } from 'helia'
793
793
  import type { Blockstore } from 'interface-blockstore'
794
- import type { ExporterProgressEvents, UnixFSEntry } from 'ipfs-unixfs-exporter'
794
+ import type { ExporterProgressEvents, PathEntry } from 'ipfs-unixfs-exporter'
795
795
  import type { Libp2pOptions } from 'libp2p'
796
796
  import type { CID } from 'multiformats/cid'
797
797
  import type { ProgressEvent, ProgressOptions } from 'progress-events'
@@ -874,7 +874,7 @@ export interface PluginContext extends ResolveURLResult {
874
874
  /**
875
875
  * The resource that was requested by the user
876
876
  */
877
- readonly resource: string
877
+ readonly resource: Resource
878
878
 
879
879
  /**
880
880
  * These are the response representations that the user requested and we
@@ -963,9 +963,25 @@ export interface ContentTypeParser {
963
963
  }
964
964
 
965
965
  /**
966
- * The types for the first argument of the `verifiedFetch` function.
966
+ * The resource that `verifiedFetch` will resolve
967
+ *
968
+ * Strings
969
+ * - '/ipfs/bafyfoo' (IPFS/IPNS path)
970
+ * - 'ipfs://bafyfoo' (IPFS/IPNS URL)
971
+ *
972
+ * CID object
973
+ * - CID('bafyfoo')
974
+ *
975
+ * URL object
976
+ * - URL('ipfs://bafyfoo') (IPFS/IPNS URL)
977
+ *
978
+ * PeerId object (will be resolved as an IPNS name)
979
+ * - PeerId('123koo')
980
+ *
981
+ * PublicKey object (will be resolved as an IPNS name)
982
+ * - PublicKey('Qmfoo')
967
983
  */
968
- export type Resource = string | CID
984
+ export type Resource = string | CID | URL | PublicKey | PeerId
969
985
 
970
986
  export interface ResourceDetail {
971
987
  resource: Resource
@@ -1199,6 +1215,14 @@ export interface VerifiedFetchInit extends RequestInit, ProgressOptions<Verified
1199
1215
  * @default true
1200
1216
  */
1201
1217
  supportWebRedirects?: boolean
1218
+
1219
+ /**
1220
+ * If true, only operate on the local blockstore, do not perform any network
1221
+ * operations.
1222
+ *
1223
+ * @default false
1224
+ */
1225
+ offline?: boolean
1202
1226
  }
1203
1227
 
1204
1228
  export type URLProtocols = 'ipfs' | 'ipns' | 'dnslink'
@@ -1212,7 +1236,7 @@ export interface ResolveURLResult {
1212
1236
  ttl: number
1213
1237
  blockstore: Blockstore
1214
1238
  ipfsRoots: CID[]
1215
- terminalElement: UnixFSEntry
1239
+ terminalElement: PathEntry
1216
1240
  }
1217
1241
 
1218
1242
  export interface URLResolver {
@@ -1,6 +1,7 @@
1
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
+ import { exporter } from 'ipfs-unixfs-exporter'
4
5
  import toBrowserReadableStream from 'it-to-browser-readablestream'
5
6
  import { CONTENT_TYPE_CAR, MEDIA_TYPE_CAR } from '../utils/content-types.ts'
6
7
  import { getContentDispositionFilename } from '../utils/get-content-disposition-filename.ts'
@@ -111,9 +112,13 @@ export class CarPlugin extends BasePlugin {
111
112
  listingOnly: true
112
113
  }
113
114
 
114
- const slice = entityBytesToOffsetAndLength(terminalElement.size, url.searchParams.get('entity-bytes'))
115
- options.offset = slice.offset
116
- options.length = slice.length
115
+ const entry = await exporter(terminalElement.cid, blockstore, context.options)
116
+
117
+ if (entry.type === 'file') {
118
+ const slice = entityBytesToOffsetAndLength(entry.size, url.searchParams.get('entity-bytes'))
119
+ options.offset = slice.offset
120
+ options.length = slice.length
121
+ }
117
122
 
118
123
  carExportOptions.exporter = new UnixFSExporter(options)
119
124
  } else {
@@ -6,7 +6,7 @@ import * as json from 'multiformats/codecs/json'
6
6
  import * as raw from 'multiformats/codecs/raw'
7
7
  import { identity } from 'multiformats/hashes/identity'
8
8
  import { CODEC_CBOR } from '../constants.ts'
9
- import { getContentTypesForCid, MEDIA_TYPE_CBOR, MEDIA_TYPE_DAG_CBOR, MEDIA_TYPE_DAG_JSON, MEDIA_TYPE_JSON, MEDIA_TYPE_OCTET_STREAM, MEDIA_TYPE_RAW } from '../utils/content-types.ts'
9
+ import { getContentTypesForCid, MEDIA_TYPE_CBOR, MEDIA_TYPE_DAG_CBOR, MEDIA_TYPE_DAG_JSON, MEDIA_TYPE_JSON } from '../utils/content-types.ts'
10
10
  import { convertOutput } from '../utils/convert-output.ts'
11
11
  import { getContentDispositionFilename } from '../utils/get-content-disposition-filename.ts'
12
12
  import { notAcceptableResponse, okResponse, partialContentResponse } from '../utils/responses.js'
@@ -34,9 +34,7 @@ export class IpldPlugin extends BasePlugin {
34
34
  accept.some(header => header.contentType.mediaType === MEDIA_TYPE_CBOR ||
35
35
  header.contentType.mediaType === MEDIA_TYPE_DAG_CBOR ||
36
36
  header.contentType.mediaType === MEDIA_TYPE_JSON ||
37
- header.contentType.mediaType === MEDIA_TYPE_DAG_JSON ||
38
- header.contentType.mediaType === MEDIA_TYPE_RAW ||
39
- header.contentType.mediaType === MEDIA_TYPE_OCTET_STREAM
37
+ header.contentType.mediaType === MEDIA_TYPE_DAG_JSON
40
38
  )
41
39
 
42
40
  return supportsCid && supportsAccept
@@ -45,16 +43,8 @@ export class IpldPlugin extends BasePlugin {
45
43
  async handle (context: PluginContext): Promise<Response> {
46
44
  const { url, resource, accept, ipfsRoots, terminalElement, blockstore, options, requestedMimeTypes } = context
47
45
 
48
- this.log.trace('fetching %c/%s', terminalElement.cid, url.pathname)
49
- let block: Uint8Array
50
- if (terminalElement.node == null) {
51
- block = await toBuffer(blockstore.get(terminalElement.cid, options))
52
- } else if (terminalElement.type === 'object' || terminalElement.type === 'raw' || terminalElement.type === 'identity') {
53
- block = terminalElement.node
54
- } else {
55
- block = dagPb.encode(terminalElement.node)
56
- }
57
-
46
+ this.log.trace('fetching %c%s', terminalElement.cid, url.pathname)
47
+ let block = await toBuffer(blockstore.get(terminalElement.cid, options))
58
48
  let contentType: ContentType
59
49
 
60
50
  try {
@@ -0,0 +1,52 @@
1
+ import toBuffer from 'it-to-buffer'
2
+ import { MEDIA_TYPE_OCTET_STREAM, MEDIA_TYPE_RAW } from '../utils/content-types.ts'
3
+ import { getContentDispositionFilename } from '../utils/get-content-disposition-filename.ts'
4
+ import { okResponse, partialContentResponse } from '../utils/responses.js'
5
+ import { BasePlugin } from './plugin-base.js'
6
+ import type { PluginContext } from '../index.ts'
7
+
8
+ /**
9
+ * Handles loading raw blocks from unsupported codecs
10
+ */
11
+ export class RawPlugin extends BasePlugin {
12
+ readonly id = 'raw-plugin'
13
+
14
+ canHandle ({ accept }: PluginContext): boolean {
15
+ const supportsAccept = accept.length === 0 ||
16
+ accept.some(header => header.contentType.mediaType === MEDIA_TYPE_RAW ||
17
+ header.contentType.mediaType === MEDIA_TYPE_OCTET_STREAM
18
+ )
19
+
20
+ return supportsAccept
21
+ }
22
+
23
+ async handle (context: PluginContext): Promise<Response> {
24
+ const { url, resource, accept, ipfsRoots, terminalElement, blockstore, options } = context
25
+
26
+ this.log.trace('fetching %c%s', terminalElement.cid, url.pathname)
27
+ const block = await toBuffer(blockstore.get(terminalElement.cid, options))
28
+
29
+ const headers = {
30
+ 'content-length': `${block.byteLength}`,
31
+ 'content-type': accept.some(value => value.contentType.mediaType === MEDIA_TYPE_RAW) ? MEDIA_TYPE_RAW : MEDIA_TYPE_OCTET_STREAM,
32
+ 'content-disposition': `${url.searchParams.get('download') === 'false' ? 'inline' : 'attachment'}; ${
33
+ getContentDispositionFilename(url.searchParams.get('filename') ?? `${terminalElement.cid}.raw`)
34
+ }`,
35
+ 'x-ipfs-roots': ipfsRoots.map(cid => cid.toV1()).join(','),
36
+ 'x-content-type-options': 'nosniff',
37
+ 'accept-ranges': 'bytes'
38
+ }
39
+
40
+ if (context.range != null) {
41
+ return partialContentResponse(resource, async function * (offset, length) {
42
+ yield block.subarray(offset, offset + length)
43
+ }, context.range, block.byteLength, {
44
+ headers
45
+ })
46
+ }
47
+
48
+ return okResponse(resource, block, {
49
+ headers
50
+ })
51
+ }
52
+ }