@helia/verified-fetch 5.1.0 → 6.0.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 (54) hide show
  1. package/dist/index.min.js +52 -52
  2. package/dist/index.min.js.map +4 -4
  3. package/dist/src/index.d.ts +20 -4
  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-unixfs.d.ts.map +1 -1
  7. package/dist/src/plugins/plugin-handle-unixfs.js +6 -6
  8. package/dist/src/plugins/plugin-handle-unixfs.js.map +1 -1
  9. package/dist/src/url-resolver.d.ts.map +1 -1
  10. package/dist/src/url-resolver.js +1 -2
  11. package/dist/src/url-resolver.js.map +1 -1
  12. package/dist/src/utils/error-to-response.d.ts +1 -1
  13. package/dist/src/utils/error-to-response.d.ts.map +1 -1
  14. package/dist/src/utils/error-to-response.js +13 -11
  15. package/dist/src/utils/error-to-response.js.map +1 -1
  16. package/dist/src/utils/get-range-header.d.ts +2 -1
  17. package/dist/src/utils/get-range-header.d.ts.map +1 -1
  18. package/dist/src/utils/get-range-header.js.map +1 -1
  19. package/dist/src/utils/parse-resource.d.ts +10 -0
  20. package/dist/src/utils/parse-resource.d.ts.map +1 -0
  21. package/dist/src/utils/parse-resource.js +52 -0
  22. package/dist/src/utils/parse-resource.js.map +1 -0
  23. package/dist/src/utils/responses.d.ts +14 -14
  24. package/dist/src/utils/responses.d.ts.map +1 -1
  25. package/dist/src/utils/responses.js +8 -3
  26. package/dist/src/utils/responses.js.map +1 -1
  27. package/dist/src/verified-fetch.d.ts +1 -0
  28. package/dist/src/verified-fetch.d.ts.map +1 -1
  29. package/dist/src/verified-fetch.js +94 -102
  30. package/dist/src/verified-fetch.js.map +1 -1
  31. package/package.json +1 -1
  32. package/src/index.ts +20 -4
  33. package/src/plugins/plugin-handle-unixfs.ts +9 -8
  34. package/src/url-resolver.ts +1 -2
  35. package/src/utils/error-to-response.ts +14 -11
  36. package/src/utils/get-range-header.ts +2 -1
  37. package/src/utils/parse-resource.ts +62 -0
  38. package/src/utils/responses.ts +24 -19
  39. package/src/verified-fetch.ts +105 -110
  40. package/dist/src/utils/ipfs-path-to-url.d.ts +0 -16
  41. package/dist/src/utils/ipfs-path-to-url.d.ts.map +0 -1
  42. package/dist/src/utils/ipfs-path-to-url.js +0 -45
  43. package/dist/src/utils/ipfs-path-to-url.js.map +0 -1
  44. package/dist/src/utils/parse-url-string.d.ts +0 -23
  45. package/dist/src/utils/parse-url-string.d.ts.map +0 -1
  46. package/dist/src/utils/parse-url-string.js +0 -120
  47. package/dist/src/utils/parse-url-string.js.map +0 -1
  48. package/dist/src/utils/resource-to-cache-key.d.ts +0 -15
  49. package/dist/src/utils/resource-to-cache-key.d.ts.map +0 -1
  50. package/dist/src/utils/resource-to-cache-key.js +0 -27
  51. package/dist/src/utils/resource-to-cache-key.js.map +0 -1
  52. package/src/utils/ipfs-path-to-url.ts +0 -54
  53. package/src/utils/parse-url-string.ts +0 -165
  54. package/src/utils/resource-to-cache-key.ts +0 -30
@@ -1 +1 @@
1
- {"version":3,"file":"verified-fetch.d.ts","sourceRoot":"","sources":["../../src/verified-fetch.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAA8C,0BAA0B,EAAoB,QAAQ,EAAkB,iBAAiB,IAAI,oBAAoB,EAAqD,MAAM,YAAY,CAAA;AAElP,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AAiD7C,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAO;IAC7B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAc;IAC3C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAQ;IAC5B,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAA+B;IACjE,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA4B;IACpD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAa;gBAE5B,KAAK,EAAE,KAAK,EAAE,IAAI,GAAE,0BAA+B;IA8ChE;;;;;;OAMG;IACG,KAAK,CAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,QAAQ,CAAC;IA+HhF;;;OAGG;IACH,OAAO,CAAC,eAAe;IAkDvB;;;;;OAKG;IACH,OAAO,CAAC,mBAAmB;YAiEb,iBAAiB;IA0E/B;;OAEG;IACG,KAAK,IAAK,OAAO,CAAC,IAAI,CAAC;IAI7B;;OAEG;IACG,IAAI,IAAK,OAAO,CAAC,IAAI,CAAC;CAG7B;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAChC"}
1
+ {"version":3,"file":"verified-fetch.d.ts","sourceRoot":"","sources":["../../src/verified-fetch.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAA8C,0BAA0B,EAAE,QAAQ,EAAkB,iBAAiB,IAAI,oBAAoB,EAAqD,MAAM,YAAY,CAAA;AAEhO,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AAiD7C,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAO;IAC7B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAc;IAC3C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAQ;IAC5B,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAA+B;IACjE,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA4B;IACpD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAa;gBAE5B,KAAK,EAAE,KAAK,EAAE,IAAI,GAAE,0BAA+B;IA8ChE;;;;;;OAMG;IACG,KAAK,CAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,QAAQ,CAAC;IAoHhF;;;OAGG;IACH,OAAO,CAAC,eAAe;IAkDvB,OAAO,CAAC,aAAa;IAYrB;;;;;OAKG;IACH,OAAO,CAAC,mBAAmB;YAiEb,iBAAiB;IAoE/B;;OAEG;IACG,KAAK,IAAK,OAAO,CAAC,IAAI,CAAC;IAI7B;;OAEG;IACG,IAAI,IAAK,OAAO,CAAC,IAAI,CAAC;CAG7B;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAChC"}
@@ -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 { AbortError, 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';
@@ -17,9 +17,9 @@ import { errorToObject } from "./utils/error-to-object.js";
17
17
  import { errorToResponse } from "./utils/error-to-response.js";
18
18
  import { getETag, ifNoneMatches } from './utils/get-e-tag.js';
19
19
  import { getRangeHeader } from "./utils/get-range-header.js";
20
- import { parseURLString } from "./utils/parse-url-string.js";
20
+ import { stringToIpfsUrl } from "./utils/parse-resource.js";
21
21
  import { setCacheControlHeader } from './utils/response-headers.js';
22
- import { badRequestResponse, internalServerErrorResponse, notAcceptableResponse, notImplementedResponse, notModifiedResponse } from './utils/responses.js';
22
+ import { internalServerErrorResponse, notAcceptableResponse, notImplementedResponse, notModifiedResponse } from './utils/responses.js';
23
23
  import { ServerTiming } from './utils/server-timing.js';
24
24
  /**
25
25
  * Retypes the `.signal` property of the options from
@@ -114,107 +114,96 @@ export class VerifiedFetch {
114
114
  */
115
115
  async fetch(resource, opts) {
116
116
  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
117
  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'
118
+ if (opts?.method === 'OPTIONS') {
119
+ return this.handleFinalResponse(new Response(null, {
120
+ status: 200
146
121
  }));
147
122
  }
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
- ]);
123
+ const options = convertOptions(opts);
124
+ const headers = new Headers(options?.headers);
125
+ const serverTiming = new ServerTiming();
126
+ options?.onProgress?.(new CustomProgressEvent('verified-fetch:request:start', { resource }));
127
+ const range = getRangeHeader(resource, headers);
128
+ if (range instanceof Response) {
129
+ // invalid range request
130
+ return this.handleFinalResponse(range);
158
131
  }
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, []);
132
+ const url = this.parseResource(resource);
133
+ if (url.protocol === 'ipfs:' && url.pathname === '') {
134
+ // if we don't need to resolve an IPNS names or traverse a DAG, we can
135
+ // check the if-none-match header and maybe return a 304 without needing
136
+ // to load any blocks
137
+ if (ifNoneMatches(`"${url.hostname}"`, headers)) {
138
+ return notModifiedResponse(resource, new Headers({
139
+ etag: `"${url.hostname}"`,
140
+ 'cache-control': 'public, max-age=29030400, immutable'
141
+ }));
142
+ }
164
143
  }
165
- return this.handleFinalResponse(await ipnsRecordPlugin.handle({
166
- range,
167
- url,
168
- resource: resource.toString(),
169
- options
144
+ const requestedMimeTypes = getRequestedMimeTypes(url, headers.get('accept'));
145
+ // if a raw IPNS record has been requested, don't try to load the block
146
+ // the record points to or do any recursive IPNS resolving
147
+ if (isIPNSRecordRequest(headers)) {
148
+ if (url.protocol !== 'ipns:') {
149
+ return notAcceptableResponse(url, requestedMimeTypes, [
150
+ CONTENT_TYPE_IPNS
151
+ ]);
152
+ }
153
+ // @ts-expect-error ipnsRecordPlugin may not be of type IpnsRecordPlugin
154
+ const ipnsRecordPlugin = this.plugins.find(plugin => plugin.id === 'ipns-record-plugin');
155
+ if (ipnsRecordPlugin == null) {
156
+ // IPNS record was requested but no IPNS Record plugin is configured?!
157
+ return notAcceptableResponse(resource, requestedMimeTypes, []);
158
+ }
159
+ return this.handleFinalResponse(await ipnsRecordPlugin.handle({
160
+ range,
161
+ url,
162
+ resource,
163
+ options
164
+ }));
165
+ }
166
+ const resolveResult = await this.urlResolver.resolve(url, serverTiming, {
167
+ ...options,
168
+ isRawBlockRequest: isRawBlockRequest(headers),
169
+ onlyIfCached: headers.get('cache-control') === 'only-if-cached'
170
+ });
171
+ options?.onProgress?.(new CustomProgressEvent('verified-fetch:request:resolve', {
172
+ cid: resolveResult.terminalElement.cid,
173
+ path: resolveResult.url.pathname
170
174
  }));
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
- });
175
+ const accept = this.getAcceptHeader(resolveResult.url, requestedMimeTypes, resolveResult.terminalElement.cid);
176
+ if (accept instanceof Response) {
177
+ this.log('allowed media types for requested CID did not contain anything the client can understand');
178
+ // invalid accept header
179
+ return this.handleFinalResponse(accept);
179
180
  }
180
- catch (err) {
181
- options?.signal?.throwIfAborted();
182
- this.log.error('error parsing resource %s - %e', resource, err);
183
- this.log.error('wat name %s', err.name);
184
- return this.handleFinalResponse(errorToResponse(resource, err));
181
+ const context = {
182
+ ...resolveResult,
183
+ resource,
184
+ accept,
185
+ range,
186
+ options,
187
+ onProgress: options?.onProgress,
188
+ serverTiming,
189
+ headers,
190
+ requestedMimeTypes
191
+ };
192
+ 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(', '));
193
+ const response = await this.runPluginPipeline(context);
194
+ options?.onProgress?.(new CustomProgressEvent('verified-fetch:request:end', {
195
+ cid: resolveResult.terminalElement.cid,
196
+ path: resolveResult.url.pathname
197
+ }));
198
+ if (response == null) {
199
+ this.log.error('no plugin could handle request for %s', resource);
185
200
  }
201
+ return this.handleFinalResponse(response, Boolean(options?.withServerTiming) || Boolean(this.withServerTiming), context);
186
202
  }
187
- options?.onProgress?.(new CustomProgressEvent('verified-fetch:request:resolve', {
188
- cid: parsedResult.terminalElement.cid,
189
- path: parsedResult.url.pathname
190
- }));
191
- const accept = this.getAcceptHeader(parsedResult.url, requestedMimeTypes, parsedResult.terminalElement.cid);
192
- if (accept instanceof Response) {
193
- this.log('allowed media types for requested CID did not contain anything the client can understand');
194
- // invalid accept header
195
- return this.handleFinalResponse(accept);
196
- }
197
- const context = {
198
- ...parsedResult,
199
- resource: resource.toString(),
200
- accept,
201
- range,
202
- options,
203
- onProgress: options?.onProgress,
204
- serverTiming,
205
- headers,
206
- requestedMimeTypes
207
- };
208
- 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(', '));
209
- const response = await this.runPluginPipeline(context);
210
- options?.onProgress?.(new CustomProgressEvent('verified-fetch:request:end', {
211
- cid: parsedResult.terminalElement.cid,
212
- path: parsedResult.url.pathname
213
- }));
214
- if (response == null) {
215
- this.log.error('no plugin could handle request for %s', resource);
203
+ catch (err) {
204
+ this.log.error('error fetching resource %s - %e', resource, err);
205
+ return this.handleFinalResponse(errorToResponse(resource, err, opts));
216
206
  }
217
- return this.handleFinalResponse(response, Boolean(options?.withServerTiming) || Boolean(this.withServerTiming), context);
218
207
  }
219
208
  /**
220
209
  * Returns a prioritized list of acceptable content types for the response
@@ -260,6 +249,15 @@ export class VerifiedFetch {
260
249
  }
261
250
  return acceptable;
262
251
  }
252
+ parseResource(resource) {
253
+ if (isPeerId(resource) || isPublicKey(resource)) {
254
+ resource = `/ipns/${resource}`;
255
+ }
256
+ if (CID.asCID(resource) === resource || resource instanceof CID) {
257
+ resource = `/ipfs/${resource}`;
258
+ }
259
+ return new URL(stringToIpfsUrl(resource.toString()));
260
+ }
263
261
  /**
264
262
  * The last place a Response touches in verified-fetch before being returned
265
263
  * to the user. This is where we add the Server-Timing header to the response
@@ -285,7 +283,7 @@ export class VerifiedFetch {
285
283
  // headers can ony contain extended ASCII but IPFS paths can be unicode
286
284
  const decodedPath = decodeURI(context?.url.pathname);
287
285
  const path = uint8ArrayToString(uint8ArrayFromString(decodedPath), 'ascii');
288
- response.headers.set('x-ipfs-path', `/${context.url.protocol === 'ipfs:' ? 'ipfs' : 'ipns'}/${context?.url.hostname}${path}`);
286
+ response.headers.set('x-ipfs-path', `/${context.url.protocol === 'ipfs:' ? 'ipfs' : 'ipns'}/${context?.url.hostname}${path === '/' ? '' : path}`);
289
287
  }
290
288
  // set CORS headers. If hosting your own gateway with verified-fetch behind
291
289
  // the scenes, you can alter these before you send the response to the
@@ -349,13 +347,7 @@ export class VerifiedFetch {
349
347
  throw new AbortError(context.options?.signal?.reason);
350
348
  }
351
349
  this.log.error('error in plugin %s - %e', plugin.id, err);
352
- return internalServerErrorResponse(context.resource, JSON.stringify({
353
- error: errorToObject(err)
354
- }), {
355
- headers: {
356
- 'content-type': 'application/json'
357
- }
358
- });
350
+ return internalServerErrorResponse(context.resource, err);
359
351
  }
360
352
  if (finalResponse != null) {
361
353
  this.log.trace('plugin %s produced final response', plugin.id);
@@ -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":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAA;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC1C,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AACrE,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AACtC,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AACrD,OAAO,EAAE,UAAU,IAAI,oBAAoB,EAAE,MAAM,yBAAyB,CAAA;AAC5E,OAAO,EAAE,QAAQ,IAAI,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AACtE,OAAO,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAA;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAA;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,wCAAwC,CAAA;AACzE,OAAO,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAA;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAA;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAA;AAClE,OAAO,EAAE,cAAc,EAAE,wBAAwB,EAAE,yBAAyB,EAAE,sBAAsB,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AACzK,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAA;AAC9D,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAA;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAA;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAA;AACnE,OAAO,EAAE,2BAA2B,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAA;AACtI,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAOvD;;;GAGG;AACH,SAAS,cAAc,CAAE,OAA8B;IACrD,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;QACpB,OAAM;IACR,CAAC;IAED,OAAO;QACL,GAAG,OAAO;QACV,MAAM,EAAE,OAAO,EAAE,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,EAAE,MAAM;KAC9D,CAAA;AACH,CAAC;AAED;;GAEG;AACH,SAAS,mBAAmB,CAAE,OAAgB;IAC5C,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,CAAA;IAE7D,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO,KAAK,CAAA;IACd,CAAC;IAED,MAAM,SAAS,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;IAEhD,OAAO,SAAS,KAAK,sBAAsB,CAAA;AAC7C,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB,CAAE,OAAgB;IAC1C,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,CAAA;IAE7D,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO,KAAK,CAAA;IACd,CAAC;IAED,MAAM,SAAS,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;IAEhD,OAAO,SAAS,KAAK,cAAc,CAAA;AACrC,CAAC;AAED,MAAM,OAAO,aAAa;IACP,KAAK,CAAO;IACZ,YAAY,CAAc;IAC1B,OAAO,CAAS;IAChB,GAAG,CAAQ;IACX,iBAAiB,CAA+B;IAChD,gBAAgB,CAAS;IACzB,OAAO,GAA0B,EAAE,CAAA;IACnC,WAAW,CAAa;IAEzC,YAAa,KAAY,EAAE,OAAmC,EAAE;QAC9D,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;QAClB,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,sBAAsB,CAAC,CAAA;QAC5D,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,IAAI,YAAY,CAAC,KAAK,CAAC,CAAA;QAC5D,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC,CAAA;QAC7C,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,IAAI,iBAAiB,CAAA;QACpE,IAAI,CAAC,gBAAgB,GAAG,IAAI,EAAE,gBAAgB,IAAI,KAAK,CAAA;QACvD,IAAI,CAAC,WAAW,GAAG,IAAI,WAAW,CAAC;YACjC,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,KAAK,EAAE,IAAI,CAAC,KAAK;SAClB,EAAE,IAAI,CAAC,CAAA;QAER,MAAM,aAAa,GAAkB;YACnC,GAAG,IAAI;YACP,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,gBAAgB,CAAC;YACnD,KAAK;YACL,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;YACzC,YAAY,EAAE,IAAI,CAAC,YAAY;SAChC,CAAA;QAED,MAAM,cAAc,GAAG;YACrB,IAAI,YAAY,CAAC,aAAa,CAAC;YAC/B,IAAI,UAAU,CAAC,aAAa,CAAC;YAC7B,IAAI,SAAS,CAAC,aAAa,CAAC;YAC5B,IAAI,SAAS,CAAC,aAAa,CAAC;YAC5B,IAAI,gBAAgB,CAAC,aAAa,CAAC;SACpC,CAAA;QAED,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,aAAa,EAAE,EAAE,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC,IAAI,EAAE,CAAA;QAE9F,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,kDAAkD;YAClD,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,CAAA;YACnF,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,CAAA;YAEjF,IAAI,CAAC,OAAO,GAAG,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,CAAA;YAErF,uEAAuE;YACvE,kCAAkC;YAClC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QAC3F,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,OAAO,GAAG,cAAc,CAAA;QAC/B,CAAC;IACH,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,KAAK,CAAE,QAAkB,EAAE,IAA2B;QAC1D,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,EAAE,MAAM,IAAI,KAAK,EAAE,QAAQ,CAAC,CAAA;QAExD,IAAI,CAAC;YACH,IAAI,IAAI,EAAE,MAAM,KAAK,SAAS,EAAE,CAAC;gBAC/B,OAAO,IAAI,CAAC,mBAAmB,CAAC,IAAI,QAAQ,CAAC,IAAI,EAAE;oBACjD,MAAM,EAAE,GAAG;iBACZ,CAAC,CAAC,CAAA;YACL,CAAC;YAED,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,CAAA;YACpC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;YAC7C,MAAM,YAAY,GAAG,IAAI,YAAY,EAAE,CAAA;YAEvC,OAAO,EAAE,UAAU,EAAE,CAAC,IAAI,mBAAmB,CAAiB,8BAA8B,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAA;YAE5G,MAAM,KAAK,GAAG,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;YAE/C,IAAI,KAAK,YAAY,QAAQ,EAAE,CAAC;gBAC9B,wBAAwB;gBACxB,OAAO,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAA;YACxC,CAAC;YAED,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAA;YAExC,IAAI,GAAG,CAAC,QAAQ,KAAK,OAAO,IAAI,GAAG,CAAC,QAAQ,KAAK,EAAE,EAAE,CAAC;gBACpD,sEAAsE;gBACtE,wEAAwE;gBACxE,qBAAqB;gBACrB,IAAI,aAAa,CAAC,IAAI,GAAG,CAAC,QAAQ,GAAG,EAAE,OAAO,CAAC,EAAE,CAAC;oBAChD,OAAO,mBAAmB,CAAC,QAAQ,EAAE,IAAI,OAAO,CAAC;wBAC/C,IAAI,EAAE,IAAI,GAAG,CAAC,QAAQ,GAAG;wBACzB,eAAe,EAAE,qCAAqC;qBACvD,CAAC,CAAC,CAAA;gBACL,CAAC;YACH,CAAC;YAED,MAAM,kBAAkB,GAAG,qBAAqB,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAA;YAE5E,uEAAuE;YACvE,0DAA0D;YAC1D,IAAI,mBAAmB,CAAC,OAAO,CAAC,EAAE,CAAC;gBACjC,IAAI,GAAG,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;oBAC7B,OAAO,qBAAqB,CAAC,GAAG,EAAE,kBAAkB,EAAE;wBACpD,iBAAiB;qBAClB,CAAC,CAAA;gBACJ,CAAC;gBAED,wEAAwE;gBACxE,MAAM,gBAAgB,GAAiC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,KAAK,oBAAoB,CAAC,CAAA;gBAEtH,IAAI,gBAAgB,IAAI,IAAI,EAAE,CAAC;oBAC7B,sEAAsE;oBACtE,OAAO,qBAAqB,CAAC,QAAQ,EAAE,kBAAkB,EAAE,EAAE,CAAC,CAAA;gBAChE,CAAC;gBAED,OAAO,IAAI,CAAC,mBAAmB,CAAC,MAAM,gBAAgB,CAAC,MAAM,CAAC;oBAC5D,KAAK;oBACL,GAAG;oBACH,QAAQ;oBACR,OAAO;iBACR,CAAC,CAAC,CAAA;YACL,CAAC;YAED,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,EAAE,YAAY,EAAE;gBACtE,GAAG,OAAO;gBACV,iBAAiB,EAAE,iBAAiB,CAAC,OAAO,CAAC;gBAC7C,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,KAAK,gBAAgB;aAChE,CAAC,CAAA;YAEF,OAAO,EAAE,UAAU,EAAE,CAAC,IAAI,mBAAmB,CAAY,gCAAgC,EAAE;gBACzF,GAAG,EAAE,aAAa,CAAC,eAAe,CAAC,GAAG;gBACtC,IAAI,EAAE,aAAa,CAAC,GAAG,CAAC,QAAQ;aACjC,CAAC,CAAC,CAAA;YAEH,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,GAAG,EAAE,kBAAkB,EAAE,aAAa,CAAC,eAAe,CAAC,GAAG,CAAC,CAAA;YAE7G,IAAI,MAAM,YAAY,QAAQ,EAAE,CAAC;gBAC/B,IAAI,CAAC,GAAG,CAAC,0FAA0F,CAAC,CAAA;gBAEpG,wBAAwB;gBACxB,OAAO,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAA;YACzC,CAAC;YAED,MAAM,OAAO,GAAkB;gBAC7B,GAAG,aAAa;gBAChB,QAAQ;gBACR,MAAM;gBACN,KAAK;gBACL,OAAO;gBACP,UAAU,EAAE,OAAO,EAAE,UAAU;gBAC/B,YAAY;gBACZ,OAAO;gBACP,kBAAkB;aACnB,CAAA;YAED,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,mEAAmE,EAAE,aAAa,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;YAEvM,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAA;YAEtD,OAAO,EAAE,UAAU,EAAE,CAAC,IAAI,mBAAmB,CAAY,4BAA4B,EAAE;gBACrF,GAAG,EAAE,aAAa,CAAC,eAAe,CAAC,GAAG;gBACtC,IAAI,EAAE,aAAa,CAAC,GAAG,CAAC,QAAQ;aACjC,CAAC,CAAC,CAAA;YAEH,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;gBACrB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,uCAAuC,EAAE,QAAQ,CAAC,CAAA;YACnE,CAAC;YAED,OAAO,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,OAAO,CAAC,OAAO,EAAE,gBAAgB,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE,OAAO,CAAC,CAAA;QAC1H,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,iCAAiC,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAA;YAChE,OAAO,IAAI,CAAC,mBAAmB,CAAC,eAAe,CAAC,QAAQ,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,CAAA;QACvE,CAAC;IACH,CAAC;IAED;;;OAGG;IACK,eAAe,CAAE,GAAQ,EAAE,kBAAuC,EAAE,GAAS;QACnF,MAAM,qBAAqB,GAAG,wBAAwB,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;QACzE,MAAM,UAAU,GAAmB,EAAE,CAAA;QAErC,KAAK,MAAM,YAAY,IAAI,kBAAkB,EAAE,CAAC;YAC9C,MAAM,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,GAAG,YAAY,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;YAEjF,KAAK,MAAM,WAAW,IAAI,qBAAqB,EAAE,CAAC;gBAChD,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,WAAW,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;gBAE9E,IAAI,YAAY,CAAC,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,CAAC;oBAC3D,UAAU,CAAC,IAAI,CAAC;wBACd,WAAW;wBACX,OAAO,EAAE,YAAY,CAAC,OAAO;qBAC9B,CAAC,CAAA;gBACJ,CAAC;gBAED,IAAI,YAAY,CAAC,SAAS,KAAK,KAAK,EAAE,CAAC;oBACrC,UAAU,CAAC,IAAI,CAAC;wBACd,WAAW;wBACX,OAAO,EAAE,YAAY,CAAC,OAAO;qBAC9B,CAAC,CAAA;gBACJ,CAAC;gBAED,IAAI,YAAY,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,kBAAkB,KAAK,mBAAmB,EAAE,CAAC;oBAC1F,UAAU,CAAC,IAAI,CAAC;wBACd,WAAW;wBACX,OAAO,EAAE,YAAY,CAAC,OAAO;qBAC9B,CAAC,CAAA;gBACJ,CAAC;gBAED,IAAI,YAAY,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,eAAe,KAAK,gBAAgB,EAAE,CAAC;oBAClF,UAAU,CAAC,IAAI,CAAC;wBACd,WAAW;wBACX,OAAO,EAAE,YAAY,CAAC,OAAO;qBAC9B,CAAC,CAAA;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,kBAAkB,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAA;YAC9E,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,qBAAqB,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAA;YAEjF,OAAO,qBAAqB,CAAC,GAAG,EAAE,kBAAkB,EAAE,qBAAqB,CAAC,CAAA;QAC9E,CAAC;QAED,OAAO,UAAU,CAAA;IACnB,CAAC;IAEO,aAAa,CAAE,QAAkB;QACvC,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC;YAChD,QAAQ,GAAG,SAAS,QAAQ,EAAE,CAAA;QAChC,CAAC;QAED,IAAI,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,QAAQ,IAAI,QAAQ,YAAY,GAAG,EAAE,CAAC;YAChE,QAAQ,GAAG,SAAS,QAAQ,EAAE,CAAA;QAChC,CAAC;QAED,OAAO,IAAI,GAAG,CAAC,eAAe,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAA;IACtD,CAAC;IAED;;;;;OAKG;IACK,mBAAmB,CAAE,QAAkB,EAAE,gBAA0B,EAAE,OAAuB;QAClG,MAAM,WAAW,GAAG,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,IAAI,yBAAyB,CAAA;QAErG,IAAI,gBAAgB,KAAK,IAAI,IAAI,OAAO,EAAE,YAAY,IAAI,IAAI,EAAE,CAAC;YAC/D,MAAM,YAAY,GAAG,OAAO,EAAE,YAAY,CAAC,SAAS,EAAE,CAAA;YAEtD,IAAI,YAAY,KAAK,EAAE,EAAE,CAAC;gBACxB,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,YAAY,CAAC,CAAA;YACrD,CAAC;QACH,CAAC;QAED,IAAI,OAAO,EAAE,GAAG,EAAE,QAAQ,IAAI,IAAI,IAAI,OAAO,CAAC,GAAG,IAAI,IAAI,EAAE,CAAC;YAC1D,qBAAqB,CAAC;gBACpB,QAAQ;gBACR,GAAG,EAAE,OAAO,CAAC,GAAG;gBAChB,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ;aAC/B,CAAC,CAAA;QACJ,CAAC;QAED,IAAI,OAAO,EAAE,eAAe,CAAC,GAAG,IAAI,IAAI,EAAE,CAAC;YACzC,uEAAuE;YACvE,MAAM,WAAW,GAAG,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAA;YACpD,MAAM,IAAI,GAAG,kBAAkB,CAAC,oBAAoB,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC,CAAA;YAE3E,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,IAAI,OAAO,EAAE,GAAG,CAAC,QAAQ,GAAG,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;QACnJ,CAAC;QAED,2EAA2E;QAC3E,sEAAsE;QACtE,UAAU;QACV,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,6BAA6B,EAAE,GAAG,CAAC,CAAA;QACxD,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,8BAA8B,EAAE,oBAAoB,CAAC,CAAA;QAC1E,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,8BAA8B,EAAE,yBAAyB,CAAC,CAAA;QAC/E,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,+BAA+B,EAAE,2EAA2E,CAAC,CAAA;QAElI,IAAI,OAAO,EAAE,eAAe,CAAC,GAAG,IAAI,IAAI,IAAI,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YACjF,MAAM,IAAI,GAAG,OAAO,CAAC;gBACnB,GAAG,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG;gBAChC,WAAW;gBACX,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM;aAC/B,CAAC,CAAA;YAEF,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;YAElC,IAAI,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC;gBAC1C,OAAO,mBAAmB,CAAC,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAA;YAC5D,CAAC;QACH,CAAC;QAED,IAAI,OAAO,EAAE,OAAO,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;YACxC,wCAAwC;YACxC,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE;gBACxB,MAAM,EAAE,GAAG;gBACX,OAAO,EAAE,QAAQ,CAAC,OAAO;aAC1B,CAAC,CAAA;QACJ,CAAC;QAED,iEAAiE;QACjE,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;YAC1B,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAA;QAChD,CAAC;QAED,OAAO,QAAQ,CAAA;IACjB,CAAC;IAEO,KAAK,CAAC,iBAAiB,CAAE,OAAsB;QACrD,IAAI,aAAmC,CAAA;QACvC,MAAM,WAAW,GAAG,IAAI,GAAG,EAAU,CAAA;QAErC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,uDAAuD,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC,WAAW,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;QAE3M,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAA;QAElG,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,4DAA4D,CAAC,CAAA;YAC5E,OAAO,sBAAsB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;QACjD,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,qCAAqC,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;QAExF,iEAAiE;QACjE,MAAM,cAAc,GAAG,KAAK,CAAA;QAC5B,IAAI,aAAa,GAAG,KAAK,CAAA;QAEzB,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,IAAI,CAAC;gBACH,IAAI,CAAC,GAAG,CAAC,qBAAqB,EAAE,MAAM,CAAC,EAAE,CAAC,CAAA;gBAC1C,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;gBAE1B,MAAM,aAAa,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;gBAElD,IAAI,CAAC,GAAG,CAAC,uBAAuB,EAAE,MAAM,CAAC,EAAE,EAAE,aAAa,CAAC,CAAA;gBAE3D,IAAI,aAAa,IAAI,IAAI,EAAE,CAAC;oBAC1B,sDAAsD;oBACtD,aAAa,GAAG,aAAa,CAAA;oBAC7B,aAAa,GAAG,IAAI,CAAA;oBACpB,MAAK;gBACP,CAAC;YACH,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAClB,IAAI,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;oBACrC,MAAM,IAAI,UAAU,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;gBACvD,CAAC;gBAED,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,yBAAyB,EAAE,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,CAAA;gBAEzD,OAAO,2BAA2B,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;YAC3D,CAAC;YAED,IAAI,aAAa,IAAI,IAAI,EAAE,CAAC;gBAC1B,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,mCAAmC,EAAE,MAAM,CAAC,EAAE,CAAC,CAAA;gBAC9D,MAAK;YACP,CAAC;YAED,IAAI,aAAa,IAAI,aAAa,IAAI,IAAI,EAAE,CAAC;gBAC3C,MAAK;YACP,CAAC;YAED,IAAI,CAAC,cAAc,EAAE,CAAC;gBACpB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,6DAA6D,CAAC,CAAA;gBAC7E,MAAK;YACP,CAAC;QACH,CAAC;QAED,OAAO,aAAa,IAAI,sBAAsB,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC;YAC9E,KAAK,EAAE,aAAa,CAAC,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;SACrF,CAAC,EAAE;YACF,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;aACnC;SACF,CAAC,CAAA;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAA;IAC1B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI;QACR,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAA;IACzB,CAAC;CACF;AAOD,SAAS,qBAAqB,CAAE,GAAQ,EAAE,MAAsB;IAC9D,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,KAAK,EAAE,EAAE,CAAC;QACpC,oBAAoB;QACpB,MAAM,GAAG,KAAK,CAAA;IAChB,CAAC;IAED,OAAO,MAAM;SACV,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE;QACP,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QAEjC,MAAM,OAAO,GAA2B;YACtC,CAAC,EAAE,GAAG;SACP,CAAA;QAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;YAE3D,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;QACtB,CAAC;QAED,OAAO;YACL,SAAS,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE;YAC/B,OAAO;SACR,CAAA;IACH,CAAC,CAAC;SACD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACb,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;YAChC,OAAO,CAAC,CAAA;QACV,CAAC;QAED,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;YAC9B,OAAO,CAAC,CAAC,CAAA;QACX,CAAC;QAED,OAAO,CAAC,CAAA;IACV,CAAC,CAAC,CAAA;AACN,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@helia/verified-fetch",
3
- "version": "5.1.0",
3
+ "version": "6.0.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",
package/src/index.ts CHANGED
@@ -786,7 +786,7 @@ 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'
@@ -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
@@ -9,20 +9,21 @@ import { MEDIA_TYPE_OCTET_STREAM, MEDIA_TYPE_DAG_PB } from '../utils/content-typ
9
9
  import { getContentDispositionFilename } from '../utils/get-content-disposition-filename.ts'
10
10
  import { badGatewayResponse, movedPermanentlyResponse, partialContentResponse, okResponse } from '../utils/responses.js'
11
11
  import { BasePlugin } from './plugin-base.js'
12
- import type { PluginContext } from '../index.js'
12
+ import type { PluginContext, Resource } from '../index.js'
13
13
  import type { RangeHeader } from '../utils/get-range-header.ts'
14
14
  import type { AbortOptions } from '@libp2p/interface'
15
15
  import type { IdentityNode, RawNode, UnixFSEntry, UnixFSFile } from 'ipfs-unixfs-exporter'
16
+ import type { CID } from 'multiformats/cid'
16
17
 
17
18
  /**
18
19
  * @see https://specs.ipfs.tech/http-gateways/path-gateway/#use-in-directory-url-normalization
19
20
  */
20
- function getRedirectUrl (resource: string, url: URL, terminalElement: UnixFSEntry): string | undefined {
21
+ function getRedirectUrl (resource: Resource, url: URL, terminalElement: UnixFSEntry): string | undefined {
21
22
  let uri: URL
22
23
 
23
24
  try {
24
25
  // try the requested resource
25
- uri = new URL(resource)
26
+ uri = new URL(resource.toString())
26
27
  } catch {
27
28
  // fall back to the canonical URL
28
29
  uri = url
@@ -99,7 +100,7 @@ export class UnixFSPlugin extends BasePlugin {
99
100
 
100
101
  this.log.trace('found directory index at %c/%s with cid %c', dirCid, rootFilePath, entry.cid)
101
102
 
102
- return await this.streamFile(resource, entry, filename, redirected, context.range, context.options)
103
+ return await this.streamFile(resource, entry, filename, ipfsRoots, redirected, context.range, context.options)
103
104
  } catch (err: any) {
104
105
  if (err.name !== 'NotFoundError') {
105
106
  this.log.error('error loading path %c/%s - %e', dirCid, rootFilePath, err)
@@ -125,14 +126,14 @@ export class UnixFSPlugin extends BasePlugin {
125
126
  })
126
127
  } else if (terminalElement.type === 'file' || terminalElement.type === 'raw' || terminalElement.type === 'identity') {
127
128
  this.log('streaming file')
128
- return this.streamFile(resource, terminalElement, filename, redirected, context.range, context.options)
129
+ return this.streamFile(resource, terminalElement, filename, ipfsRoots, redirected, context.range, context.options)
129
130
  } else {
130
131
  this.log.error('cannot stream terminal element type %s', terminalElement.type)
131
132
  return badGatewayResponse(resource, 'Unable to stream content')
132
133
  }
133
134
  }
134
135
 
135
- private async streamFile (resource: string, entry: UnixFSFile | RawNode | IdentityNode, filename: string, redirected?: boolean, rangeHeader?: RangeHeader, options?: AbortOptions): Promise<Response> {
136
+ private async streamFile (resource: Resource, entry: UnixFSFile | RawNode | IdentityNode, filename: string, ipfsRoots: CID[], redirected?: boolean, rangeHeader?: RangeHeader, options?: AbortOptions): Promise<Response> {
136
137
  let contentType = MEDIA_TYPE_OCTET_STREAM
137
138
 
138
139
  // only detect content type for non-range requests to avoid loading blocks
@@ -154,7 +155,7 @@ export class UnixFSPlugin extends BasePlugin {
154
155
  'content-disposition': `inline; ${
155
156
  getContentDispositionFilename(filename)
156
157
  }`,
157
- 'x-ipfs-roots': entry.cid.toString(),
158
+ 'x-ipfs-roots': ipfsRoots.map(cid => cid.toV1()).join(','),
158
159
  'accept-ranges': 'bytes'
159
160
  },
160
161
  redirected
@@ -170,7 +171,7 @@ export class UnixFSPlugin extends BasePlugin {
170
171
  'content-disposition': `inline; ${
171
172
  getContentDispositionFilename(filename)
172
173
  }`,
173
- 'x-ipfs-roots': entry.cid.toString(),
174
+ 'x-ipfs-roots': ipfsRoots.map(cid => cid.toV1()).join(','),
174
175
  'accept-ranges': 'bytes'
175
176
  },
176
177
  redirected
@@ -10,7 +10,6 @@ import * as json from 'multiformats/codecs/json'
10
10
  import * as raw from 'multiformats/codecs/raw'
11
11
  import QuickLRU from 'quick-lru'
12
12
  import { SESSION_CACHE_MAX_SIZE, SESSION_CACHE_TTL_MS, CODEC_CBOR, CODEC_IDENTITY } from './constants.ts'
13
- import { resourceToSessionCacheKey } from './utils/resource-to-cache-key.ts'
14
13
  import { ServerTiming } from './utils/server-timing.ts'
15
14
  import type { ResolveURLResult, URLResolver as URLResolverInterface } from './index.ts'
16
15
  import type { DNSLink } from '@helia/dnslink'
@@ -118,7 +117,7 @@ export class URLResolver implements URLResolverInterface {
118
117
  return this.components.helia.blockstore
119
118
  }
120
119
 
121
- const key = resourceToSessionCacheKey(root)
120
+ const key = `ipfs:${root}`
122
121
  let session = this.blockstoreSessions.get(key)
123
122
 
124
123
  if (session == null) {
@@ -1,45 +1,48 @@
1
1
  import { badGatewayResponse, gatewayTimeoutResponse, internalServerErrorResponse, notFoundResponse, preconditionFailedResponse } from './responses.js'
2
2
  import type { Resource } from '../index.js'
3
3
 
4
- export function errorToResponse (resource: Resource | string, err: any): Response {
5
- // if a signal abort caused the error, throw the error
6
- if (err.name === 'AbortError') {
4
+ export function errorToResponse (resource: Resource | string, err: any, init?: RequestInit): Response {
5
+ // throw an AbortError if the passed signal has aborted
6
+ init?.signal?.throwIfAborted()
7
+
8
+ // rethrow these errors
9
+ if (['AbortError', 'InvalidParametersError'].includes(err.name)) {
7
10
  throw err
8
11
  }
9
12
 
10
13
  // could not reach an upstream server, bad connection or offline
11
14
  if (err.code === 'ECONNREFUSED' || err.code === 'ECANCELLED' || err.name === 'DNSQueryFailedError') {
12
- return gatewayTimeoutResponse(resource.toString(), err)
15
+ return gatewayTimeoutResponse(resource, err)
13
16
  }
14
17
 
15
18
  // data was not parseable, user may be able to request raw block
16
19
  if (['NotUnixFSError'].includes(err.name)) {
17
- return badGatewayResponse(resource.toString(), err)
20
+ return badGatewayResponse(resource, err)
18
21
  }
19
22
 
20
23
  // an upstream server didn't respond in time but inside the signal timeout
21
24
  if (err.code === 'ETIMEOUT' || err.name === 'TimeoutError') {
22
- return gatewayTimeoutResponse(resource.toString(), err)
25
+ return gatewayTimeoutResponse(resource, err)
23
26
  }
24
27
 
25
28
  // path was not under DAG root
26
29
  if (['ERR_NO_PROP', 'ERR_NO_TERMINAL_ELEMENT', 'ERR_NOT_FOUND'].includes(err.code)) {
27
- return notFoundResponse(resource.toString())
30
+ return notFoundResponse(resource)
28
31
  }
29
32
 
30
33
  // path was not under DAG root
31
34
  if (['DoesNotExistError'].includes(err.name)) {
32
- return notFoundResponse(resource.toString())
35
+ return notFoundResponse(resource)
33
36
  }
34
37
 
35
38
  if (['BlockNotFoundWhileOfflineError'].includes(err.name)) {
36
- return preconditionFailedResponse(resource.toString())
39
+ return preconditionFailedResponse(resource)
37
40
  }
38
41
 
39
42
  if (['RecordNotFoundError', 'LoadBlockFailedError'].includes(err.name)) {
40
- return gatewayTimeoutResponse(resource.toString(), err)
43
+ return gatewayTimeoutResponse(resource, err)
41
44
  }
42
45
 
43
46
  // can't tell what went wrong, return a generic error
44
- return internalServerErrorResponse(resource.toString(), err)
47
+ return internalServerErrorResponse(resource, err)
45
48
  }
@@ -1,5 +1,6 @@
1
1
  import { InvalidRangeError } from '../errors.ts'
2
2
  import { badRequestResponse, notSatisfiableResponse } from './responses.ts'
3
+ import type { Resource } from '../index.ts'
3
4
 
4
5
  /**
5
6
  * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Range
@@ -78,7 +79,7 @@ function getByteRangeFromHeader (rangeHeader?: string): Range[] {
78
79
  return ranges
79
80
  }
80
81
 
81
- export function getRangeHeader (resource: string, headers: Headers): RangeHeader | undefined | Response {
82
+ export function getRangeHeader (resource: Resource, headers: Headers): RangeHeader | undefined | Response {
82
83
  const header = headers.get('range')
83
84
 
84
85
  // not a range request
@@ -0,0 +1,62 @@
1
+ import { InvalidParametersError } from '@libp2p/interface'
2
+ import { peerIdFromString } from '@libp2p/peer-id'
3
+ import { CID } from 'multiformats/cid'
4
+
5
+ /**
6
+ * Turns an IPFS or IPNS path into a URL
7
+ *
8
+ * - `/ipfs/cid` -> `ipfs://cid`
9
+ * - `/ipns/name` -> `ipns://name`
10
+ */
11
+ function ipfsPathToIpfsUrl (path: string): string {
12
+ if (!path.startsWith('/ipfs/') && !path.startsWith('/ipns/')) {
13
+ throw new InvalidParametersError(`Path ${path} did not start with /ipfs/ or /ipns/`)
14
+ }
15
+
16
+ // use non-http protocol as otherwise an empty path will become "/"
17
+ const url = new URL(`not-http://example.com${path}`)
18
+ const [
19
+ ,
20
+ protocol,
21
+ name,
22
+ ...rest
23
+ ] = url.pathname.split('/')
24
+
25
+ return `${protocol}://${name}${rest.length > 0 ? `/${rest.join('/')}` : ''}${url.search}${url.hash}`
26
+ }
27
+
28
+ /**
29
+ * Accepts the following url strings:
30
+ *
31
+ * - /ipfs/Qmfoo/path
32
+ * - /ipns/Qmfoo/path
33
+ * - ipfs://cid/path
34
+ * - ipns://name/path
35
+ */
36
+ export function stringToIpfsUrl (urlString: string): URL {
37
+ if (urlString.startsWith('/ipfs/') || urlString.startsWith('/ipns/')) {
38
+ urlString = ipfsPathToIpfsUrl(urlString)
39
+ }
40
+
41
+ if (urlString.startsWith('ipfs://') || urlString.startsWith('ipns://') || urlString.startsWith('dnslink://')) {
42
+ const url = new URL(urlString)
43
+
44
+ // ensure IPNS name can be parsed as a CID or peer id, otherwise treat as
45
+ // dnslink
46
+ if (url.protocol === 'ipns:') {
47
+ try {
48
+ CID.parse(url.hostname)
49
+ } catch {
50
+ try {
51
+ peerIdFromString(url.hostname)
52
+ } catch {
53
+ url.protocol = 'dnslink'
54
+ }
55
+ }
56
+ }
57
+
58
+ return url
59
+ }
60
+
61
+ throw new InvalidParametersError(`URL did not start with ipfs:// or ipns:// - ${urlString}`)
62
+ }