@helia/verified-fetch 0.0.0-8db7792 → 0.0.0-a04e041

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 (33) hide show
  1. package/README.md +33 -0
  2. package/dist/index.min.js +4 -4
  3. package/dist/src/index.d.ts +36 -0
  4. package/dist/src/index.d.ts.map +1 -1
  5. package/dist/src/index.js +33 -0
  6. package/dist/src/index.js.map +1 -1
  7. package/dist/src/utils/get-content-disposition-filename.d.ts +6 -0
  8. package/dist/src/utils/get-content-disposition-filename.d.ts.map +1 -0
  9. package/dist/src/utils/get-content-disposition-filename.js +16 -0
  10. package/dist/src/utils/get-content-disposition-filename.js.map +1 -0
  11. package/dist/src/utils/parse-url-string.d.ts +2 -0
  12. package/dist/src/utils/parse-url-string.d.ts.map +1 -1
  13. package/dist/src/utils/parse-url-string.js +6 -0
  14. package/dist/src/utils/parse-url-string.js.map +1 -1
  15. package/dist/src/utils/responses.d.ts +4 -0
  16. package/dist/src/utils/responses.d.ts.map +1 -0
  17. package/dist/src/utils/responses.js +21 -0
  18. package/dist/src/utils/responses.js.map +1 -0
  19. package/dist/src/utils/select-output-type.d.ts +12 -0
  20. package/dist/src/utils/select-output-type.d.ts.map +1 -0
  21. package/dist/src/utils/select-output-type.js +147 -0
  22. package/dist/src/utils/select-output-type.js.map +1 -0
  23. package/dist/src/verified-fetch.d.ts +17 -15
  24. package/dist/src/verified-fetch.d.ts.map +1 -1
  25. package/dist/src/verified-fetch.js +211 -129
  26. package/dist/src/verified-fetch.js.map +1 -1
  27. package/package.json +18 -12
  28. package/src/index.ts +37 -0
  29. package/src/utils/get-content-disposition-filename.ts +18 -0
  30. package/src/utils/parse-url-string.ts +11 -1
  31. package/src/utils/responses.ts +22 -0
  32. package/src/utils/select-output-type.ts +166 -0
  33. package/src/verified-fetch.ts +237 -134
@@ -1,17 +1,22 @@
1
+ import { car } from '@helia/car';
1
2
  import { ipns as heliaIpns } from '@helia/ipns';
2
3
  import { dnsJsonOverHttps } from '@helia/ipns/dns-resolvers';
3
4
  import { unixfs as heliaUnixFs } from '@helia/unixfs';
4
- import { code as dagCborCode } from '@ipld/dag-cbor';
5
- import { code as dagJsonCode } from '@ipld/dag-json';
5
+ import * as ipldDagCbor from '@ipld/dag-cbor';
6
+ import * as ipldDagJson from '@ipld/dag-json';
6
7
  import { code as dagPbCode } from '@ipld/dag-pb';
8
+ import toBrowserReadableStream from 'it-to-browser-readablestream';
7
9
  import { code as jsonCode } from 'multiformats/codecs/json';
8
10
  import { code as rawCode } from 'multiformats/codecs/raw';
9
11
  import { identity } from 'multiformats/hashes/identity';
10
12
  import { CustomProgressEvent } from 'progress-events';
11
13
  import { dagCborToSafeJSON } from './utils/dag-cbor-to-safe-json.js';
14
+ import { getContentDispositionFilename } from './utils/get-content-disposition-filename.js';
12
15
  import { getETag } from './utils/get-e-tag.js';
13
16
  import { getStreamFromAsyncIterable } from './utils/get-stream-from-async-iterable.js';
14
17
  import { parseResource } from './utils/parse-resource.js';
18
+ import { notAcceptableResponse, notSupportedResponse, okResponse } from './utils/responses.js';
19
+ import { selectOutputType, queryFormatToAcceptHeader } from './utils/select-output-type.js';
15
20
  import { walkPath } from './utils/walk-path.js';
16
21
  function convertOptions(options) {
17
22
  if (options == null) {
@@ -26,26 +31,42 @@ function convertOptions(options) {
26
31
  signal
27
32
  };
28
33
  }
29
- function okResponse(body) {
30
- return new Response(body, {
31
- status: 200,
32
- statusText: 'OK'
33
- });
34
- }
35
- function notSupportedResponse(body) {
36
- return new Response(body, {
37
- status: 501,
38
- statusText: 'Not Implemented'
39
- });
34
+ /**
35
+ * These are Accept header values that will cause content type sniffing to be
36
+ * skipped and set to these values.
37
+ */
38
+ const RAW_HEADERS = [
39
+ 'application/vnd.ipld.raw',
40
+ 'application/octet-stream'
41
+ ];
42
+ /**
43
+ * if the user has specified an `Accept` header, and it's in our list of
44
+ * allowable "raw" format headers, use that instead of detecting the content
45
+ * type. This avoids the user from receiving something different when they
46
+ * signal that they want to `Accept` a specific mime type.
47
+ */
48
+ function getOverridenRawContentType(headers) {
49
+ const acceptHeader = new Headers(headers).get('accept') ?? '';
50
+ // e.g. "Accept: text/html, application/xhtml+xml, application/xml;q=0.9, image/webp, */*;q=0.8"
51
+ const acceptHeaders = acceptHeader.split(',')
52
+ .map(s => s.split(';')[0])
53
+ .map(s => s.trim());
54
+ for (const mimeType of acceptHeaders) {
55
+ if (mimeType === '*/*') {
56
+ return;
57
+ }
58
+ if (RAW_HEADERS.includes(mimeType ?? '')) {
59
+ return mimeType;
60
+ }
61
+ }
40
62
  }
41
63
  export class VerifiedFetch {
42
64
  helia;
43
65
  ipns;
44
66
  unixfs;
45
- pathWalker;
46
67
  log;
47
68
  contentTypeParser;
48
- constructor({ helia, ipns, unixfs, pathWalker }, init) {
69
+ constructor({ helia, ipns, unixfs }, init) {
49
70
  this.helia = helia;
50
71
  this.log = helia.logger.forComponent('helia:verified-fetch');
51
72
  this.ipns = ipns ?? heliaIpns(helia, {
@@ -55,54 +76,114 @@ export class VerifiedFetch {
55
76
  ]
56
77
  });
57
78
  this.unixfs = unixfs ?? heliaUnixFs(helia);
58
- this.pathWalker = pathWalker ?? walkPath;
59
79
  this.contentTypeParser = init?.contentTypeParser;
60
80
  this.log.trace('created VerifiedFetch instance');
61
81
  }
62
- // handle vnd.ipfs.ipns-record
63
- async handleIPNSRecord({ cid, path, options }) {
64
- const response = notSupportedResponse('vnd.ipfs.ipns-record support is not implemented');
65
- response.headers.set('X-Content-Type-Options', 'nosniff'); // see https://specs.ipfs.tech/http-gateways/path-gateway/#x-content-type-options-response-header
66
- return response;
82
+ /**
83
+ * Accepts an `ipns://...` URL as a string and returns a `Response` containing
84
+ * a raw IPNS record.
85
+ */
86
+ async handleIPNSRecord(resource, opts) {
87
+ return notSupportedResponse('vnd.ipfs.ipns-record support is not implemented');
67
88
  }
68
- // handle vnd.ipld.car
69
- async handleIPLDCar({ cid, path, options }) {
70
- const response = notSupportedResponse('vnd.ipld.car support is not implemented');
71
- response.headers.set('X-Content-Type-Options', 'nosniff'); // see https://specs.ipfs.tech/http-gateways/path-gateway/#x-content-type-options-response-header
89
+ /**
90
+ * Accepts a `CID` and returns a `Response` with a body stream that is a CAR
91
+ * of the `DAG` referenced by the `CID`.
92
+ */
93
+ async handleCar({ cid, options }) {
94
+ const c = car(this.helia);
95
+ const stream = toBrowserReadableStream(c.stream(cid, options));
96
+ const response = okResponse(stream);
97
+ response.headers.set('content-type', 'application/vnd.ipld.car; version=1');
72
98
  return response;
73
99
  }
74
- async handleJson({ cid, path, options }) {
75
- this.log.trace('fetching %c/%s', cid, path);
76
- options?.onProgress?.(new CustomProgressEvent('verified-fetch:request:start', { cid, path }));
77
- const result = await this.helia.blockstore.get(cid, {
78
- signal: options?.signal,
79
- onProgress: options?.onProgress
80
- });
81
- const response = okResponse(result);
82
- response.headers.set('content-type', 'application/json');
83
- options?.onProgress?.(new CustomProgressEvent('verified-fetch:request:end', { cid, path }));
84
- return response;
100
+ /**
101
+ * Accepts a UnixFS `CID` and returns a `.tar` file containing the file or
102
+ * directory structure referenced by the `CID`.
103
+ */
104
+ async handleTar({ cid, path, options }) {
105
+ if (cid.code !== dagPbCode) {
106
+ return notAcceptableResponse('only dag-pb CIDs can be returned in TAR files');
107
+ }
108
+ return notSupportedResponse('application/tar support is not implemented');
85
109
  }
86
- async handleDagCbor({ cid, path, options }) {
110
+ async handleJson({ cid, path, accept, options }) {
87
111
  this.log.trace('fetching %c/%s', cid, path);
88
- options?.onProgress?.(new CustomProgressEvent('verified-fetch:request:start', { cid, path }));
89
- // return body as binary
90
- const block = await this.helia.blockstore.get(cid);
112
+ const block = await this.helia.blockstore.get(cid, options);
91
113
  let body;
92
- try {
93
- body = dagCborToSafeJSON(block);
114
+ if (accept === 'application/vnd.ipld.dag-cbor' || accept === 'application/cbor') {
115
+ try {
116
+ // if vnd.ipld.dag-cbor has been specified, convert to the format - note
117
+ // that this supports more data types than regular JSON, the content-type
118
+ // response header is set so the user knows to process it differently
119
+ const obj = ipldDagJson.decode(block);
120
+ body = ipldDagCbor.encode(obj);
121
+ }
122
+ catch (err) {
123
+ this.log.error('could not transform %c to application/vnd.ipld.dag-cbor', err);
124
+ return notAcceptableResponse();
125
+ }
94
126
  }
95
- catch (err) {
96
- this.log('could not decode DAG-CBOR as JSON-safe, falling back to `application/octet-stream`', err);
127
+ else {
128
+ // skip decoding
97
129
  body = block;
98
130
  }
99
131
  const response = okResponse(body);
100
- response.headers.set('content-type', body instanceof Uint8Array ? 'application/octet-stream' : 'application/json');
101
- options?.onProgress?.(new CustomProgressEvent('verified-fetch:request:end', { cid, path }));
132
+ response.headers.set('content-type', accept ?? 'application/json');
102
133
  return response;
103
134
  }
104
- async handleDagPb({ cid, path, options, terminalElement }) {
135
+ async handleDagCbor({ cid, path, accept, options }) {
105
136
  this.log.trace('fetching %c/%s', cid, path);
137
+ const block = await this.helia.blockstore.get(cid, options);
138
+ let body;
139
+ if (accept === 'application/octet-stream' || accept === 'application/vnd.ipld.dag-cbor' || accept === 'application/cbor') {
140
+ // skip decoding
141
+ body = block;
142
+ }
143
+ else if (accept === 'application/vnd.ipld.dag-json') {
144
+ try {
145
+ // if vnd.ipld.dag-json has been specified, convert to the format - note
146
+ // that this supports more data types than regular JSON, the content-type
147
+ // response header is set so the user knows to process it differently
148
+ const obj = ipldDagCbor.decode(block);
149
+ body = ipldDagJson.encode(obj);
150
+ }
151
+ catch (err) {
152
+ this.log.error('could not transform %c to application/vnd.ipld.dag-json', err);
153
+ return notAcceptableResponse();
154
+ }
155
+ }
156
+ else {
157
+ try {
158
+ body = dagCborToSafeJSON(block);
159
+ }
160
+ catch (err) {
161
+ if (accept === 'application/json') {
162
+ this.log('could not decode DAG-CBOR as JSON-safe, but the client sent "Accept: application/json"', err);
163
+ return notAcceptableResponse();
164
+ }
165
+ this.log('could not decode DAG-CBOR as JSON-safe, falling back to `application/octet-stream`', err);
166
+ body = block;
167
+ }
168
+ }
169
+ const response = okResponse(body);
170
+ if (accept == null) {
171
+ accept = body instanceof Uint8Array ? 'application/octet-stream' : 'application/json';
172
+ }
173
+ response.headers.set('content-type', accept);
174
+ return response;
175
+ }
176
+ async handleDagPb({ cid, path, options }) {
177
+ let terminalElement;
178
+ let ipfsRoots;
179
+ try {
180
+ const pathDetails = await walkPath(this.helia.blockstore, `${cid.toString()}/${path}`, options);
181
+ ipfsRoots = pathDetails.ipfsRoots;
182
+ terminalElement = pathDetails.terminalElement;
183
+ }
184
+ catch (err) {
185
+ this.log.error('Error walking path %s', path, err);
186
+ }
106
187
  let resolvedCID = terminalElement?.cid ?? cid;
107
188
  let stat;
108
189
  if (terminalElement?.type === 'directory') {
@@ -110,7 +191,6 @@ export class VerifiedFetch {
110
191
  const rootFilePath = 'index.html';
111
192
  try {
112
193
  this.log.trace('found directory at %c/%s, looking for index.html', cid, path);
113
- options?.onProgress?.(new CustomProgressEvent('verified-fetch:request:start', { cid: dirCid, path: rootFilePath }));
114
194
  stat = await this.unixfs.stat(dirCid, {
115
195
  path: rootFilePath,
116
196
  signal: options?.signal,
@@ -129,7 +209,6 @@ export class VerifiedFetch {
129
209
  options?.onProgress?.(new CustomProgressEvent('verified-fetch:request:end', { cid: dirCid, path: rootFilePath }));
130
210
  }
131
211
  }
132
- options?.onProgress?.(new CustomProgressEvent('verified-fetch:request:start', { cid: resolvedCID, path: '' }));
133
212
  const asyncIter = this.unixfs.cat(resolvedCID, {
134
213
  signal: options?.signal,
135
214
  onProgress: options?.onProgress
@@ -140,16 +219,24 @@ export class VerifiedFetch {
140
219
  });
141
220
  const response = okResponse(stream);
142
221
  await this.setContentType(firstChunk, path, response);
143
- options?.onProgress?.(new CustomProgressEvent('verified-fetch:request:end', { cid: resolvedCID, path: '' }));
222
+ if (ipfsRoots != null) {
223
+ response.headers.set('X-Ipfs-Roots', ipfsRoots.map(cid => cid.toV1().toString()).join(',')); // https://specs.ipfs.tech/http-gateways/path-gateway/#x-ipfs-roots-response-header
224
+ }
144
225
  return response;
145
226
  }
146
227
  async handleRaw({ cid, path, options }) {
147
- this.log.trace('fetching %c/%s', cid, path);
148
- options?.onProgress?.(new CustomProgressEvent('verified-fetch:request:start', { cid, path }));
149
- const result = await this.helia.blockstore.get(cid);
228
+ const result = await this.helia.blockstore.get(cid, options);
150
229
  const response = okResponse(result);
151
- await this.setContentType(result, path, response);
152
- options?.onProgress?.(new CustomProgressEvent('verified-fetch:request:end', { cid, path }));
230
+ // if the user has specified an `Accept` header that corresponds to a raw
231
+ // type, honour that header, so for example they don't request
232
+ // `application/vnd.ipld.raw` but get `application/octet-stream`
233
+ const overriddenContentType = getOverridenRawContentType(options?.headers);
234
+ if (overriddenContentType != null) {
235
+ response.headers.set('content-type', overriddenContentType);
236
+ }
237
+ else {
238
+ await this.setContentType(result, path, response);
239
+ }
153
240
  return response;
154
241
  }
155
242
  async setContentType(bytes, path, response) {
@@ -176,99 +263,94 @@ export class VerifiedFetch {
176
263
  response.headers.set('content-type', contentType);
177
264
  }
178
265
  /**
179
- * Determines the format requested by the client, defaults to `null` if no format is requested.
180
- *
181
- * @see https://specs.ipfs.tech/http-gateways/path-gateway/#format-request-query-parameter
182
- * @default 'raw'
183
- */
184
- getFormat({ headerFormat, queryFormat }) {
185
- const formatMap = {
186
- 'vnd.ipld.raw': 'raw',
187
- 'vnd.ipld.car': 'car',
188
- 'application/x-tar': 'tar',
189
- 'application/vnd.ipld.dag-json': 'dag-json',
190
- 'application/vnd.ipld.dag-cbor': 'dag-cbor',
191
- 'application/json': 'json',
192
- 'application/cbor': 'cbor',
193
- 'vnd.ipfs.ipns-record': 'ipns-record'
194
- };
195
- if (headerFormat != null) {
196
- for (const format in formatMap) {
197
- if (headerFormat.includes(format)) {
198
- return formatMap[format];
199
- }
200
- }
201
- }
202
- else if (queryFormat != null) {
203
- return queryFormat;
204
- }
205
- return null;
206
- }
207
- /**
208
- * Map of format to specific handlers for that format.
209
- * These format handlers should adjust the response headers as specified in https://specs.ipfs.tech/http-gateways/path-gateway/#response-headers
266
+ * If the user has not specified an Accept header or format query string arg,
267
+ * use the CID codec to choose an appropriate handler for the block data.
210
268
  */
211
- formatHandlers = {
212
- raw: async () => notSupportedResponse('application/vnd.ipld.raw support is not implemented'),
213
- car: this.handleIPLDCar,
214
- 'ipns-record': this.handleIPNSRecord,
215
- tar: async () => notSupportedResponse('application/x-tar support is not implemented'),
216
- 'dag-json': async () => notSupportedResponse('application/vnd.ipld.dag-json support is not implemented'),
217
- 'dag-cbor': async () => notSupportedResponse('application/vnd.ipld.dag-cbor support is not implemented'),
218
- json: async () => notSupportedResponse('application/json support is not implemented'),
219
- cbor: async () => notSupportedResponse('application/cbor support is not implemented')
220
- };
221
269
  codecHandlers = {
222
270
  [dagPbCode]: this.handleDagPb,
223
- [dagJsonCode]: this.handleJson,
271
+ [ipldDagJson.code]: this.handleJson,
224
272
  [jsonCode]: this.handleJson,
225
- [dagCborCode]: this.handleDagCbor,
273
+ [ipldDagCbor.code]: this.handleDagCbor,
226
274
  [rawCode]: this.handleRaw,
227
275
  [identity.code]: this.handleRaw
228
276
  };
229
277
  async fetch(resource, opts) {
278
+ this.log('fetch %s', resource);
230
279
  const options = convertOptions(opts);
231
- const { path, query, ...rest } = await parseResource(resource, { ipns: this.ipns, logger: this.helia.logger }, options);
232
- const cid = rest.cid;
280
+ options?.onProgress?.(new CustomProgressEvent('verified-fetch:request:start', { resource }));
281
+ // resolve the CID/path from the requested resource
282
+ const { path, query, cid } = await parseResource(resource, { ipns: this.ipns, logger: this.helia.logger }, options);
283
+ options?.onProgress?.(new CustomProgressEvent('verified-fetch:request:resolve', { cid, path }));
284
+ const requestHeaders = new Headers(options?.headers);
285
+ const incomingAcceptHeader = requestHeaders.get('accept');
286
+ if (incomingAcceptHeader != null) {
287
+ this.log('incoming accept header "%s"', incomingAcceptHeader);
288
+ }
289
+ const queryFormatMapping = queryFormatToAcceptHeader(query.format);
290
+ if (query.format != null) {
291
+ this.log('incoming query format "%s", mapped to %s', query.format, queryFormatMapping);
292
+ }
293
+ const acceptHeader = incomingAcceptHeader ?? queryFormatMapping;
294
+ const accept = selectOutputType(cid, acceptHeader);
295
+ this.log('output type %s', accept);
296
+ if (acceptHeader != null && accept == null) {
297
+ return notAcceptableResponse();
298
+ }
233
299
  let response;
234
- const format = this.getFormat({ headerFormat: new Headers(options?.headers).get('accept'), queryFormat: query.format ?? null });
235
- if (format != null) {
236
- // TODO: These should be handled last when they're returning something other than 501
237
- const formatHandler = this.formatHandlers[format];
238
- if (formatHandler != null) {
239
- response = await formatHandler.call(this, { cid, path, options });
240
- if (response.status === 501) {
241
- return response;
242
- }
243
- }
300
+ let reqFormat;
301
+ if (accept === 'application/vnd.ipfs.ipns-record') {
302
+ // the user requested a raw IPNS record
303
+ reqFormat = 'ipns-record';
304
+ response = await this.handleIPNSRecord(resource.toString(), options);
244
305
  }
245
- let terminalElement;
246
- let ipfsRoots;
247
- try {
248
- const pathDetails = await this.pathWalker(this.helia.blockstore, `${cid.toString()}/${path}`, options);
249
- ipfsRoots = pathDetails.ipfsRoots;
250
- terminalElement = pathDetails.terminalElement;
306
+ else if (accept === 'application/vnd.ipld.car') {
307
+ // the user requested a CAR file
308
+ reqFormat = 'car';
309
+ query.download = true;
310
+ query.filename = query.filename ?? `${cid.toString()}.car`;
311
+ response = await this.handleCar({ cid, path, options });
251
312
  }
252
- catch (err) {
253
- this.log.error('Error walking path %s', path, err);
254
- // return new Response(`Error walking path: ${(err as Error).message}`, { status: 500 })
313
+ else if (accept === 'application/vnd.ipld.raw') {
314
+ // the user requested a raw block
315
+ reqFormat = 'raw';
316
+ query.download = true;
317
+ query.filename = query.filename ?? `${cid.toString()}.bin`;
318
+ response = await this.handleRaw({ cid, path, options });
255
319
  }
256
- if (response == null) {
320
+ else if (accept === 'application/x-tar') {
321
+ // the user requested a TAR file
322
+ reqFormat = 'tar';
323
+ response = await this.handleTar({ cid, path, options });
324
+ }
325
+ else {
326
+ // derive the handler from the CID type
257
327
  const codecHandler = this.codecHandlers[cid.code];
258
- if (codecHandler != null) {
259
- response = await codecHandler.call(this, { cid, path, options, terminalElement });
260
- }
261
- else {
328
+ if (codecHandler == null) {
262
329
  return notSupportedResponse(`Support for codec with code ${cid.code} is not yet implemented. Please open an issue at https://github.com/ipfs/helia/issues/new`);
263
330
  }
331
+ response = await codecHandler.call(this, { cid, path, accept, options });
264
332
  }
265
- response.headers.set('etag', getETag({ cid, reqFormat: format ?? undefined, weak: false }));
333
+ response.headers.set('etag', getETag({ cid, reqFormat, weak: false }));
266
334
  response.headers.set('cache-control', 'public, max-age=29030400, immutable');
267
- response.headers.set('X-Ipfs-Path', resource.toString()); // https://specs.ipfs.tech/http-gateways/path-gateway/#x-ipfs-path-response-header
268
- if (ipfsRoots != null) {
269
- response.headers.set('X-Ipfs-Roots', ipfsRoots.map(cid => cid.toV1().toString()).join(',')); // https://specs.ipfs.tech/http-gateways/path-gateway/#x-ipfs-roots-response-header
335
+ // https://specs.ipfs.tech/http-gateways/path-gateway/#x-ipfs-path-response-header
336
+ response.headers.set('X-Ipfs-Path', resource.toString());
337
+ // set Content-Disposition header
338
+ let contentDisposition;
339
+ // force download if requested
340
+ if (query.download === true) {
341
+ contentDisposition = 'attachment';
342
+ }
343
+ // override filename if requested
344
+ if (query.filename != null) {
345
+ if (contentDisposition == null) {
346
+ contentDisposition = 'inline';
347
+ }
348
+ contentDisposition = `${contentDisposition}; ${getContentDispositionFilename(query.filename)}`;
270
349
  }
271
- // response.headers.set('Content-Disposition', `TODO`) // https://specs.ipfs.tech/http-gateways/path-gateway/#content-disposition-response-header
350
+ if (contentDisposition != null) {
351
+ response.headers.set('Content-Disposition', contentDisposition);
352
+ }
353
+ options?.onProgress?.(new CustomProgressEvent('verified-fetch:request:end', { cid, path }));
272
354
  return response;
273
355
  }
274
356
  /**
@@ -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": "0.0.0-8db7792",
3
+ "version": "0.0.0-a04e041",
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/tree/main/packages/verified-fetch#readme",
@@ -141,12 +141,13 @@
141
141
  "release": "aegir release"
142
142
  },
143
143
  "dependencies": {
144
- "@helia/block-brokers": "2.0.1-8db7792",
145
- "@helia/http": "1.0.1-8db7792",
146
- "@helia/interface": "4.0.0-8db7792",
147
- "@helia/ipns": "6.0.0-8db7792",
148
- "@helia/routers": "1.0.0-8db7792",
149
- "@helia/unixfs": "3.0.0-8db7792",
144
+ "@helia/car": "3.0.0-a04e041",
145
+ "@helia/block-brokers": "2.0.1-a04e041",
146
+ "@helia/http": "1.0.1-a04e041",
147
+ "@helia/interface": "4.0.0-a04e041",
148
+ "@helia/ipns": "6.0.0-a04e041",
149
+ "@helia/routers": "1.0.0-a04e041",
150
+ "@helia/unixfs": "3.0.0-a04e041",
150
151
  "@ipld/dag-cbor": "^9.2.0",
151
152
  "@ipld/dag-json": "^10.2.0",
152
153
  "@ipld/dag-pb": "^4.1.0",
@@ -155,14 +156,17 @@
155
156
  "cborg": "^4.0.9",
156
157
  "hashlru": "^2.3.0",
157
158
  "ipfs-unixfs-exporter": "^13.5.0",
159
+ "it-to-browser-readablestream": "^2.0.6",
158
160
  "multiformats": "^13.1.0",
159
161
  "progress-events": "^1.0.0"
160
162
  },
161
163
  "devDependencies": {
162
- "@helia/dag-cbor": "3.0.0-8db7792",
163
- "@helia/dag-json": "3.0.0-8db7792",
164
- "@helia/json": "3.0.0-8db7792",
165
- "@helia/utils": "0.0.1-8db7792",
164
+ "@helia/car": "3.0.0-a04e041",
165
+ "@helia/dag-cbor": "3.0.0-a04e041",
166
+ "@helia/dag-json": "3.0.0-a04e041",
167
+ "@helia/json": "3.0.0-a04e041",
168
+ "@helia/utils": "0.0.1-a04e041",
169
+ "@ipld/car": "^5.2.6",
166
170
  "@libp2p/logger": "^4.0.5",
167
171
  "@libp2p/peer-id-factory": "^4.0.5",
168
172
  "@sgtpooki/file-type": "^1.0.1",
@@ -170,10 +174,12 @@
170
174
  "aegir": "^42.2.2",
171
175
  "blockstore-core": "^4.4.0",
172
176
  "datastore-core": "^9.2.8",
173
- "helia": "4.0.1-8db7792",
177
+ "helia": "4.0.1-a04e041",
178
+ "ipns": "^9.0.0",
174
179
  "it-last": "^3.0.4",
175
180
  "it-to-buffer": "^4.0.5",
176
181
  "magic-bytes.js": "^1.8.0",
182
+ "p-defer": "^4.0.0",
177
183
  "sinon": "^17.0.1",
178
184
  "sinon-ts": "^2.0.0",
179
185
  "uint8arrays": "^5.0.1"
package/src/index.ts CHANGED
@@ -320,6 +320,39 @@
320
320
  * console.info(obj) // ...
321
321
  * ```
322
322
  *
323
+ * ## The `Accept` header
324
+ *
325
+ * The `Accept` header can be passed to override certain response processing, or to ensure that the final `Content-Type` of the response is the one that is expected.
326
+ *
327
+ * If the final `Content-Type` does not match the `Accept` header, or if the content cannot be represented in the format dictated by the `Accept` header, or you have configured a custom content type parser, and that parser returns a value that isn't in the accept header, a [406: Not Acceptable](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/406) response will be returned:
328
+ *
329
+ * ```typescript
330
+ * import { verifiedFetch } from '@helia/verified-fetch'
331
+ *
332
+ * const res = await verifiedFetch('ipfs://bafyJPEGImageCID', {
333
+ * headers: {
334
+ * accept: 'image/png'
335
+ * }
336
+ * })
337
+ *
338
+ * console.info(res.status) // 406 - the image was a JPEG but we specified PNG as the accept header
339
+ * ```
340
+ *
341
+ * It can also be used to skip processing the data from some formats such as `DAG-CBOR` if you wish to handle decoding it yourself:
342
+ *
343
+ * ```typescript
344
+ * import { verifiedFetch } from '@helia/verified-fetch'
345
+ *
346
+ * const res = await verifiedFetch('ipfs://bafyDAGCBORCID', {
347
+ * headers: {
348
+ * accept: 'application/octet-stream'
349
+ * }
350
+ * })
351
+ *
352
+ * console.info(res.headers.get('accept')) // application/octet-stream
353
+ * const buf = await res.arrayBuffer() // raw bytes, not processed as JSON
354
+ * ```
355
+ *
323
356
  * ## Comparison to fetch
324
357
  *
325
358
  * This module attempts to act as similarly to the `fetch()` API as possible.
@@ -449,6 +482,10 @@ import type { ProgressEvent, ProgressOptions } from 'progress-events'
449
482
  */
450
483
  export type Resource = string | CID
451
484
 
485
+ export interface ResourceDetail {
486
+ resource: Resource
487
+ }
488
+
452
489
  export interface CIDDetail {
453
490
  cid: CID
454
491
  path: string
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Takes a filename URL param and returns a string for use in a
3
+ * `Content-Disposition` header
4
+ */
5
+ export function getContentDispositionFilename (filename: string): string {
6
+ const asciiOnly = replaceNonAsciiCharacters(filename)
7
+
8
+ if (asciiOnly === filename) {
9
+ return `filename="${filename}"`
10
+ }
11
+
12
+ return `filename="${asciiOnly}"; filename*=UTF-8''${encodeURIComponent(filename)}`
13
+ }
14
+
15
+ function replaceNonAsciiCharacters (filename: string): string {
16
+ // eslint-disable-next-line no-control-regex
17
+ return filename.replace(/[^\x00-\x7F]/g, '_')
18
+ }