@helia/ipns 10.1.1 → 10.2.0-bbf05cb7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +40 -0
- package/dist/index.min.js +5 -5
- package/dist/index.min.js.map +4 -4
- package/dist/src/errors.d.ts +11 -0
- package/dist/src/errors.d.ts.map +1 -1
- package/dist/src/errors.js +13 -0
- package/dist/src/errors.js.map +1 -1
- package/dist/src/index.d.ts +136 -7
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +41 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/ipns/publisher.d.ts +3 -3
- package/dist/src/ipns/publisher.d.ts.map +1 -1
- package/dist/src/ipns/publisher.js +17 -18
- package/dist/src/ipns/publisher.js.map +1 -1
- package/dist/src/ipns/republisher.d.ts +6 -1
- package/dist/src/ipns/republisher.d.ts.map +1 -1
- package/dist/src/ipns/republisher.js +157 -24
- package/dist/src/ipns/republisher.js.map +1 -1
- package/dist/src/ipns/resolver.d.ts +13 -1
- package/dist/src/ipns/resolver.d.ts.map +1 -1
- package/dist/src/ipns/resolver.js +40 -31
- package/dist/src/ipns/resolver.js.map +1 -1
- package/dist/src/ipns.d.ts +6 -3
- package/dist/src/ipns.d.ts.map +1 -1
- package/dist/src/ipns.js +12 -3
- package/dist/src/ipns.js.map +1 -1
- package/dist/src/local-store.d.ts +5 -0
- package/dist/src/local-store.d.ts.map +1 -1
- package/dist/src/local-store.js +68 -23
- package/dist/src/local-store.js.map +1 -1
- package/dist/src/pb/ipns.js +1 -1
- package/dist/src/pb/metadata.d.ts +14 -1
- package/dist/src/pb/metadata.d.ts.map +1 -1
- package/dist/src/pb/metadata.js +36 -3
- package/dist/src/pb/metadata.js.map +1 -1
- package/dist/src/routing/index.d.ts +13 -1
- package/dist/src/routing/index.d.ts.map +1 -1
- package/dist/src/routing/index.js +17 -0
- package/dist/src/routing/index.js.map +1 -1
- package/dist/src/utils.d.ts +5 -0
- package/dist/src/utils.d.ts.map +1 -1
- package/dist/src/utils.js +18 -0
- package/dist/src/utils.js.map +1 -1
- package/dist/src/validator.d.ts +6 -0
- package/dist/src/validator.d.ts.map +1 -1
- package/dist/src/validator.js +24 -14
- package/dist/src/validator.js.map +1 -1
- package/package.json +4 -4
- package/src/errors.ts +18 -0
- package/src/index.ts +145 -7
- package/src/ipns/publisher.ts +22 -20
- package/src/ipns/republisher.ts +182 -26
- package/src/ipns/resolver.ts +54 -36
- package/src/ipns.ts +20 -6
- package/src/local-store.ts +77 -22
- package/src/pb/ipns.ts +1 -1
- package/src/pb/metadata.proto +10 -0
- package/src/pb/metadata.ts +45 -4
- package/src/routing/index.ts +30 -1
- package/src/utils.ts +19 -0
- package/src/validator.ts +30 -18
- package/dist/typedoc-urls.json +0 -68
package/dist/src/errors.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { IPNSEntry } from './pb/ipns.ts';
|
|
1
2
|
export declare class RecordsFailedValidationError extends Error {
|
|
2
3
|
static name: string;
|
|
3
4
|
name: string;
|
|
@@ -14,6 +15,16 @@ export declare class RecordNotFoundError extends Error {
|
|
|
14
15
|
static name: string;
|
|
15
16
|
name: string;
|
|
16
17
|
}
|
|
18
|
+
export declare class RecordObsoleteError extends Error {
|
|
19
|
+
static name: string;
|
|
20
|
+
name: string;
|
|
21
|
+
/**
|
|
22
|
+
* The more suitable record that made the one being imported or republished
|
|
23
|
+
* obsolete.
|
|
24
|
+
*/
|
|
25
|
+
readonly record: IPNSEntry;
|
|
26
|
+
constructor(message: string, record: IPNSEntry);
|
|
27
|
+
}
|
|
17
28
|
export declare class SignatureCreationError extends Error {
|
|
18
29
|
static name: string;
|
|
19
30
|
name: string;
|
package/dist/src/errors.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,4BAA6B,SAAQ,KAAK;IACrD,MAAM,CAAC,IAAI,SAAiC;IAC5C,IAAI,SAAiC;CACtC;AAED,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,MAAM,CAAC,IAAI,SAAsB;IACjC,IAAI,SAAsB;CAC3B;AAED,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,MAAM,CAAC,IAAI,SAAsB;IACjC,IAAI,SAAsB;CAC3B;AAED,qBAAa,mBAAoB,SAAQ,KAAK;IAC5C,MAAM,CAAC,IAAI,SAAwB;IACnC,IAAI,SAAwB;CAC7B;AAED,qBAAa,sBAAuB,SAAQ,KAAK;IAC/C,MAAM,CAAC,IAAI,SAA2B;IACtC,IAAI,SAA2B;CAChC;AAED,qBAAa,0BAA2B,SAAQ,KAAK;IACnD,MAAM,CAAC,IAAI,SAA+B;IAC1C,IAAI,SAA+B;CACpC;AAED,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,MAAM,CAAC,IAAI,SAAuB;IAClC,IAAI,SAAuB;CAC5B;AAED,qBAAa,wBAAyB,SAAQ,KAAK;IACjD,MAAM,CAAC,IAAI,SAA6B;IACxC,IAAI,SAA6B;CAClC;AAED,qBAAa,mBAAoB,SAAQ,KAAK;IAC5C,MAAM,CAAC,IAAI,SAAwB;IACnC,IAAI,SAAwB;CAC7B;AAED,qBAAa,sBAAuB,SAAQ,KAAK;IAC/C,MAAM,CAAC,IAAI,SAA2B;IACtC,IAAI,SAA2B;CAChC;AAED,qBAAa,6BAA8B,SAAQ,KAAK;IACtD,MAAM,CAAC,IAAI,SAAkC;IAC7C,IAAI,SAAkC;CACvC"}
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAE7C,qBAAa,4BAA6B,SAAQ,KAAK;IACrD,MAAM,CAAC,IAAI,SAAiC;IAC5C,IAAI,SAAiC;CACtC;AAED,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,MAAM,CAAC,IAAI,SAAsB;IACjC,IAAI,SAAsB;CAC3B;AAED,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,MAAM,CAAC,IAAI,SAAsB;IACjC,IAAI,SAAsB;CAC3B;AAED,qBAAa,mBAAoB,SAAQ,KAAK;IAC5C,MAAM,CAAC,IAAI,SAAwB;IACnC,IAAI,SAAwB;CAC7B;AAED,qBAAa,mBAAoB,SAAQ,KAAK;IAC5C,MAAM,CAAC,IAAI,SAAwB;IACnC,IAAI,SAAwB;IAC5B;;;OAGG;IACH,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAA;gBAEb,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS;CAKhD;AAED,qBAAa,sBAAuB,SAAQ,KAAK;IAC/C,MAAM,CAAC,IAAI,SAA2B;IACtC,IAAI,SAA2B;CAChC;AAED,qBAAa,0BAA2B,SAAQ,KAAK;IACnD,MAAM,CAAC,IAAI,SAA+B;IAC1C,IAAI,SAA+B;CACpC;AAED,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,MAAM,CAAC,IAAI,SAAuB;IAClC,IAAI,SAAuB;CAC5B;AAED,qBAAa,wBAAyB,SAAQ,KAAK;IACjD,MAAM,CAAC,IAAI,SAA6B;IACxC,IAAI,SAA6B;CAClC;AAED,qBAAa,mBAAoB,SAAQ,KAAK;IAC5C,MAAM,CAAC,IAAI,SAAwB;IACnC,IAAI,SAAwB;CAC7B;AAED,qBAAa,sBAAuB,SAAQ,KAAK;IAC/C,MAAM,CAAC,IAAI,SAA2B;IACtC,IAAI,SAA2B;CAChC;AAED,qBAAa,6BAA8B,SAAQ,KAAK;IACtD,MAAM,CAAC,IAAI,SAAkC;IAC7C,IAAI,SAAkC;CACvC"}
|
package/dist/src/errors.js
CHANGED
|
@@ -14,6 +14,19 @@ export class RecordNotFoundError extends Error {
|
|
|
14
14
|
static name = 'RecordNotFoundError';
|
|
15
15
|
name = 'RecordNotFoundError';
|
|
16
16
|
}
|
|
17
|
+
export class RecordObsoleteError extends Error {
|
|
18
|
+
static name = 'RecordObsoleteError';
|
|
19
|
+
name = 'RecordObsoleteError';
|
|
20
|
+
/**
|
|
21
|
+
* The more suitable record that made the one being imported or republished
|
|
22
|
+
* obsolete.
|
|
23
|
+
*/
|
|
24
|
+
record;
|
|
25
|
+
constructor(message, record) {
|
|
26
|
+
super(message);
|
|
27
|
+
this.record = record;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
17
30
|
export class SignatureCreationError extends Error {
|
|
18
31
|
static name = 'SignatureCreationError';
|
|
19
32
|
name = 'SignatureCreationError';
|
package/dist/src/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,4BAA6B,SAAQ,KAAK;IACrD,MAAM,CAAC,IAAI,GAAG,8BAA8B,CAAA;IAC5C,IAAI,GAAG,8BAA8B,CAAA;;AAGvC,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IAC1C,MAAM,CAAC,IAAI,GAAG,mBAAmB,CAAA;IACjC,IAAI,GAAG,mBAAmB,CAAA;;AAG5B,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IAC1C,MAAM,CAAC,IAAI,GAAG,mBAAmB,CAAA;IACjC,IAAI,GAAG,mBAAmB,CAAA;;AAG5B,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IAC5C,MAAM,CAAC,IAAI,GAAG,qBAAqB,CAAA;IACnC,IAAI,GAAG,qBAAqB,CAAA;;AAG9B,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IAC5C,MAAM,CAAC,IAAI,GAAG,qBAAqB,CAAA;IACnC,IAAI,GAAG,qBAAqB,CAAA;IAC5B;;;OAGG;IACM,MAAM,CAAW;IAE1B,YAAa,OAAe,EAAE,MAAiB;QAC7C,KAAK,CAAC,OAAO,CAAC,CAAA;QAEd,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;IACtB,CAAC;;AAGH,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IAC/C,MAAM,CAAC,IAAI,GAAG,wBAAwB,CAAA;IACtC,IAAI,GAAG,wBAAwB,CAAA;;AAGjC,MAAM,OAAO,0BAA2B,SAAQ,KAAK;IACnD,MAAM,CAAC,IAAI,GAAG,4BAA4B,CAAA;IAC1C,IAAI,GAAG,4BAA4B,CAAA;;AAGrC,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAC3C,MAAM,CAAC,IAAI,GAAG,oBAAoB,CAAA;IAClC,IAAI,GAAG,oBAAoB,CAAA;;AAG7B,MAAM,OAAO,wBAAyB,SAAQ,KAAK;IACjD,MAAM,CAAC,IAAI,GAAG,0BAA0B,CAAA;IACxC,IAAI,GAAG,0BAA0B,CAAA;;AAGnC,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IAC5C,MAAM,CAAC,IAAI,GAAG,qBAAqB,CAAA;IACnC,IAAI,GAAG,qBAAqB,CAAA;;AAG9B,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IAC/C,MAAM,CAAC,IAAI,GAAG,wBAAwB,CAAA;IACtC,IAAI,GAAG,wBAAwB,CAAA;;AAGjC,MAAM,OAAO,6BAA8B,SAAQ,KAAK;IACtD,MAAM,CAAC,IAAI,GAAG,+BAA+B,CAAA;IAC7C,IAAI,GAAG,+BAA+B,CAAA"}
|
package/dist/src/index.d.ts
CHANGED
|
@@ -135,6 +135,46 @@
|
|
|
135
135
|
* console.info(result.record.value)
|
|
136
136
|
* }
|
|
137
137
|
* ```
|
|
138
|
+
*
|
|
139
|
+
* @example Republishing an existing IPNS record
|
|
140
|
+
*
|
|
141
|
+
* It is sometimes useful to be able to republish an existing IPNS record
|
|
142
|
+
* without needing the private key. This allows you to extend the availability
|
|
143
|
+
* of a record that was created elsewhere.
|
|
144
|
+
*
|
|
145
|
+
* There should be only one republisher per IPNS key. Multiple machines
|
|
146
|
+
* republishing the same key flood the routers with redundant writes.
|
|
147
|
+
*
|
|
148
|
+
* ```TypeScript
|
|
149
|
+
* import { createHelia } from 'helia'
|
|
150
|
+
* import { ipns } from '@helia/ipns'
|
|
151
|
+
* import { delegatedRoutingV1HttpApiClient } from '@helia/delegated-routing-v1-http-api-client'
|
|
152
|
+
* import { defaultLogger } from 'birnam'
|
|
153
|
+
* import { CID } from 'multiformats/cid'
|
|
154
|
+
*
|
|
155
|
+
* const helia = await createHelia()
|
|
156
|
+
* const name = ipns(helia)
|
|
157
|
+
*
|
|
158
|
+
* const ipnsName = 'k51qzi5uqu5dktsyfv7xz8h631pri4ct7osmb43nibxiojpttxzoft6hdyyzg4'
|
|
159
|
+
* const parsedCid: CID<unknown, 114, 0 | 18, 1> = CID.parse(ipnsName)
|
|
160
|
+
* const delegatedClient = delegatedRoutingV1HttpApiClient({
|
|
161
|
+
* url: 'https://delegated-ipfs.dev'
|
|
162
|
+
* })({
|
|
163
|
+
* logger: defaultLogger()
|
|
164
|
+
* })
|
|
165
|
+
* const record = await delegatedClient.getIPNS(parsedCid)
|
|
166
|
+
*
|
|
167
|
+
* // import the record into the local store (validates and stores it locally,
|
|
168
|
+
* // but does not publish it to the routers)
|
|
169
|
+
* await name.import(parsedCid, record)
|
|
170
|
+
*
|
|
171
|
+
* // start republishing it; throws RecordObsoleteError if the routers
|
|
172
|
+
* // already have a newer record for this key
|
|
173
|
+
* const { record: latestRecord } = await name.republish(parsedCid)
|
|
174
|
+
*
|
|
175
|
+
* // stop republishing a key
|
|
176
|
+
* await name.unpublish(parsedCid)
|
|
177
|
+
* ```
|
|
138
178
|
*/
|
|
139
179
|
import { CID } from 'multiformats/cid';
|
|
140
180
|
import type { IPNSResolverComponents } from './ipns/resolver.ts';
|
|
@@ -148,12 +188,20 @@ import type { MultihashDigest } from 'multiformats/hashes/interface';
|
|
|
148
188
|
import type { ProgressEvent, ProgressOptions } from 'progress-events';
|
|
149
189
|
export * from './routing/index.ts';
|
|
150
190
|
export * from './pb/ipns.ts';
|
|
191
|
+
export * from './errors.ts';
|
|
151
192
|
export { multihashFromIPNSRoutingKey, multihashToIPNSRoutingKey } from './utils.ts';
|
|
152
193
|
export { createIPNSRecord } from './records.ts';
|
|
153
194
|
export type { CreateIPNSRecordOptions } from './records.ts';
|
|
154
195
|
export type PublishProgressEvents = ProgressEvent<'ipns:publish:start'> | ProgressEvent<'ipns:publish:success', IPNSEntry> | ProgressEvent<'ipns:publish:error', Error>;
|
|
155
196
|
export type ResolveProgressEvents = ProgressEvent<'ipns:resolve:start', unknown> | ProgressEvent<'ipns:resolve:success', IPNSEntry> | ProgressEvent<'ipns:resolve:error', Error>;
|
|
156
197
|
export type DatastoreProgressEvents = ProgressEvent<'ipns:routing:datastore:put'> | ProgressEvent<'ipns:routing:datastore:get'> | ProgressEvent<'ipns:routing:datastore:list'> | ProgressEvent<'ipns:routing:datastore:error', Error>;
|
|
198
|
+
/**
|
|
199
|
+
* The automated upkeep policy for a stored IPNS record. `republish()` accepts
|
|
200
|
+
* every policy except `reissue`, which needs the private key to re-sign.
|
|
201
|
+
*
|
|
202
|
+
* These strings must match the `Upkeep` enum values in `pb/metadata.proto`.
|
|
203
|
+
*/
|
|
204
|
+
export type UpkeepPolicy = 'reissue' | 'rebroadcast' | 'none';
|
|
157
205
|
export interface PublishOptions extends AbortOptions, ProgressOptions<PublishProgressEvents | IPNSRoutingProgressEvents> {
|
|
158
206
|
/**
|
|
159
207
|
* Time duration of the signature validity in ms - after this many ms have
|
|
@@ -185,6 +233,16 @@ export interface PublishOptions extends AbortOptions, ProgressOptions<PublishPro
|
|
|
185
233
|
* @default 300_000
|
|
186
234
|
*/
|
|
187
235
|
ttl?: number;
|
|
236
|
+
/**
|
|
237
|
+
* Automated record upkeep policy.
|
|
238
|
+
*
|
|
239
|
+
* - `reissue`: re-sign the record with a new validity
|
|
240
|
+
* - `rebroadcast`: re-publish the existing record until it expires
|
|
241
|
+
* - `none`: disable automated publishing
|
|
242
|
+
*
|
|
243
|
+
* @default 'reissue'
|
|
244
|
+
*/
|
|
245
|
+
upkeep?: UpkeepPolicy;
|
|
188
246
|
/**
|
|
189
247
|
* Extensible data that will be added to the IPNS record data and signed to
|
|
190
248
|
* verify it's integrity.
|
|
@@ -234,6 +292,40 @@ export interface IPNSResolveOptions extends AbortOptions, ProgressOptions<Resolv
|
|
|
234
292
|
*/
|
|
235
293
|
validate?: boolean;
|
|
236
294
|
}
|
|
295
|
+
export interface RepublishOptions extends AbortOptions, ProgressOptions<IPNSRoutingProgressEvents> {
|
|
296
|
+
/**
|
|
297
|
+
* Skip resolution of latest record before republishing.
|
|
298
|
+
*
|
|
299
|
+
* It's important to resolve the latest record before republishing to routers
|
|
300
|
+
*
|
|
301
|
+
* Resolution should only be skipped when confident the latest record is
|
|
302
|
+
* already known.
|
|
303
|
+
*
|
|
304
|
+
* @default false
|
|
305
|
+
*/
|
|
306
|
+
skipResolution?: boolean;
|
|
307
|
+
/**
|
|
308
|
+
* Automated record upkeep policy.
|
|
309
|
+
*
|
|
310
|
+
* Defaults to `rebroadcast` since `republish()` cannot sign new records
|
|
311
|
+
* without the private key.
|
|
312
|
+
*
|
|
313
|
+
* - `rebroadcast`: re-publish the existing record until it expires
|
|
314
|
+
* - `none`: disable automated publishing
|
|
315
|
+
*
|
|
316
|
+
* @default 'rebroadcast'
|
|
317
|
+
*/
|
|
318
|
+
upkeep?: Exclude<UpkeepPolicy, 'reissue'>;
|
|
319
|
+
}
|
|
320
|
+
export interface UnpublishOptions extends AbortOptions {
|
|
321
|
+
/**
|
|
322
|
+
* Also delete the record from the local store, so the node stops serving it
|
|
323
|
+
* immediately instead of keeping it until it expires.
|
|
324
|
+
*
|
|
325
|
+
* @default false
|
|
326
|
+
*/
|
|
327
|
+
removeRecord?: boolean;
|
|
328
|
+
}
|
|
237
329
|
export interface IPNSResolveResult {
|
|
238
330
|
/**
|
|
239
331
|
* The resolved record
|
|
@@ -258,6 +350,16 @@ export interface IPNSPublishResult {
|
|
|
258
350
|
*/
|
|
259
351
|
publicKey: PublicKey;
|
|
260
352
|
}
|
|
353
|
+
export interface RepublishResult {
|
|
354
|
+
/**
|
|
355
|
+
* The published record
|
|
356
|
+
*/
|
|
357
|
+
record: IPNSEntry;
|
|
358
|
+
/**
|
|
359
|
+
* The public key that the record is published under
|
|
360
|
+
*/
|
|
361
|
+
publicKey: PublicKey;
|
|
362
|
+
}
|
|
261
363
|
export interface IPNSResolver {
|
|
262
364
|
/**
|
|
263
365
|
* Accepts a CID with the libp2p-key codec and either the identity hash (for
|
|
@@ -299,7 +401,7 @@ export interface IPNS {
|
|
|
299
401
|
* signal: AbortSignal.timeout(5_000)
|
|
300
402
|
* })
|
|
301
403
|
*
|
|
302
|
-
* console.info(result) // {
|
|
404
|
+
* console.info(result) // { record, name, publicKey }
|
|
303
405
|
* ```
|
|
304
406
|
*/
|
|
305
407
|
publish(keyName: string, value: CID | PublicKey | MultihashDigest | string, options?: PublishOptions): Promise<IPNSPublishResult>;
|
|
@@ -310,16 +412,43 @@ export interface IPNS {
|
|
|
310
412
|
* (e.g. the value can be parsed as a string that does not start with
|
|
311
413
|
* `/ipns/`).
|
|
312
414
|
*/
|
|
313
|
-
resolve(name: CID | PublicKey | MultihashDigest | string, options?: IPNSResolveOptions): AsyncGenerator<IPNSResolveResult>;
|
|
415
|
+
resolve(name: CID<unknown, 0x72> | PublicKey | MultihashDigest | string, options?: IPNSResolveOptions): AsyncGenerator<IPNSResolveResult>;
|
|
416
|
+
/**
|
|
417
|
+
* Stop automatically republishing an IPNS record
|
|
418
|
+
*
|
|
419
|
+
* By default this removes only the republishing metadata, keeping the record
|
|
420
|
+
* in the datastore so it is still served until it expires. Pass
|
|
421
|
+
* `removeRecord: true` to also delete the record so the node stops serving it.
|
|
422
|
+
* If a key name is passed, the key remains in the keychain.
|
|
423
|
+
*/
|
|
424
|
+
unpublish(key: CID<unknown, 0x72> | PublicKey | MultihashDigest | string, options?: UnpublishOptions): Promise<void>;
|
|
314
425
|
/**
|
|
315
|
-
*
|
|
426
|
+
* Republish the record already in the local store, setting its upkeep policy.
|
|
427
|
+
*
|
|
428
|
+
* Sets the record's upkeep policy to `options.upkeep` (default `rebroadcast`)
|
|
429
|
+
* so the background republisher keeps it available on the routers.
|
|
430
|
+
*
|
|
431
|
+
* @throws {NotFoundError} when there is no local record to republish
|
|
432
|
+
* @throws {RecordObsoleteError} when the routers already have a newer record
|
|
433
|
+
*/
|
|
434
|
+
republish(key: CID<unknown, 0x72> | PublicKey | MultihashDigest | string, options?: RepublishOptions): Promise<RepublishResult>;
|
|
435
|
+
/**
|
|
436
|
+
* Import an existing IPNS record into the local store without publishing it.
|
|
437
|
+
*
|
|
438
|
+
* The record is validated and stored so this node serves it on a GET, but it
|
|
439
|
+
* is not broadcast to the routers. A newly imported record (for a key with no
|
|
440
|
+
* existing upkeep policy) is not automatically republished; call `republish`
|
|
441
|
+
* with an upkeep policy to start keeping it alive.
|
|
316
442
|
*
|
|
317
|
-
*
|
|
443
|
+
* Overwrites an older record already stored under this key, or rejects with
|
|
444
|
+
* `RecordObsoleteError` if the stored record is newer. Importing never changes
|
|
445
|
+
* the key's upkeep metadata, so a key that already has an upkeep policy keeps
|
|
446
|
+
* it and continues to be republished automatically.
|
|
318
447
|
*
|
|
319
|
-
*
|
|
320
|
-
*
|
|
448
|
+
* @throws {RecordExpiredError} (or another validation error) when the record fails validation
|
|
449
|
+
* @throws {RecordObsoleteError} when the stored record is more suitable than the one being imported
|
|
321
450
|
*/
|
|
322
|
-
|
|
451
|
+
import(key: CID<unknown, 0x72> | PublicKey | MultihashDigest | string, record: IPNSEntry | Uint8Array, options?: AbortOptions): Promise<void>;
|
|
323
452
|
}
|
|
324
453
|
export interface IPNSComponents {
|
|
325
454
|
datastore: Datastore;
|
package/dist/src/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/src/index.js
CHANGED
|
@@ -135,6 +135,46 @@
|
|
|
135
135
|
* console.info(result.record.value)
|
|
136
136
|
* }
|
|
137
137
|
* ```
|
|
138
|
+
*
|
|
139
|
+
* @example Republishing an existing IPNS record
|
|
140
|
+
*
|
|
141
|
+
* It is sometimes useful to be able to republish an existing IPNS record
|
|
142
|
+
* without needing the private key. This allows you to extend the availability
|
|
143
|
+
* of a record that was created elsewhere.
|
|
144
|
+
*
|
|
145
|
+
* There should be only one republisher per IPNS key. Multiple machines
|
|
146
|
+
* republishing the same key flood the routers with redundant writes.
|
|
147
|
+
*
|
|
148
|
+
* ```TypeScript
|
|
149
|
+
* import { createHelia } from 'helia'
|
|
150
|
+
* import { ipns } from '@helia/ipns'
|
|
151
|
+
* import { delegatedRoutingV1HttpApiClient } from '@helia/delegated-routing-v1-http-api-client'
|
|
152
|
+
* import { defaultLogger } from 'birnam'
|
|
153
|
+
* import { CID } from 'multiformats/cid'
|
|
154
|
+
*
|
|
155
|
+
* const helia = await createHelia()
|
|
156
|
+
* const name = ipns(helia)
|
|
157
|
+
*
|
|
158
|
+
* const ipnsName = 'k51qzi5uqu5dktsyfv7xz8h631pri4ct7osmb43nibxiojpttxzoft6hdyyzg4'
|
|
159
|
+
* const parsedCid: CID<unknown, 114, 0 | 18, 1> = CID.parse(ipnsName)
|
|
160
|
+
* const delegatedClient = delegatedRoutingV1HttpApiClient({
|
|
161
|
+
* url: 'https://delegated-ipfs.dev'
|
|
162
|
+
* })({
|
|
163
|
+
* logger: defaultLogger()
|
|
164
|
+
* })
|
|
165
|
+
* const record = await delegatedClient.getIPNS(parsedCid)
|
|
166
|
+
*
|
|
167
|
+
* // import the record into the local store (validates and stores it locally,
|
|
168
|
+
* // but does not publish it to the routers)
|
|
169
|
+
* await name.import(parsedCid, record)
|
|
170
|
+
*
|
|
171
|
+
* // start republishing it; throws RecordObsoleteError if the routers
|
|
172
|
+
* // already have a newer record for this key
|
|
173
|
+
* const { record: latestRecord } = await name.republish(parsedCid)
|
|
174
|
+
*
|
|
175
|
+
* // stop republishing a key
|
|
176
|
+
* await name.unpublish(parsedCid)
|
|
177
|
+
* ```
|
|
138
178
|
*/
|
|
139
179
|
import { CID } from 'multiformats/cid';
|
|
140
180
|
import { IPNSResolver as IPNSResolverClass } from "./ipns/resolver.js";
|
|
@@ -144,6 +184,7 @@ import { heliaIPNSRouting } from "./routing/index.js";
|
|
|
144
184
|
import { localStoreIPNSRouting } from "./routing/local-store.js";
|
|
145
185
|
export * from "./routing/index.js";
|
|
146
186
|
export * from "./pb/ipns.js";
|
|
187
|
+
export * from "./errors.js";
|
|
147
188
|
export { multihashFromIPNSRoutingKey, multihashToIPNSRoutingKey } from "./utils.js";
|
|
148
189
|
export { createIPNSRecord } from "./records.js";
|
|
149
190
|
export function ipns(components, options = {}) {
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiLG;AAEH,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AACtC,OAAO,EAAE,YAAY,IAAI,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AACtE,OAAO,EAAE,IAAI,IAAI,SAAS,EAAE,MAAM,WAAW,CAAA;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAA;AAWhE,cAAc,oBAAoB,CAAA;AAClC,cAAc,cAAc,CAAA;AAC5B,cAAc,aAAa,CAAA;AAE3B,OAAO,EACL,2BAA2B,EAC3B,yBAAyB,EAC1B,MAAM,YAAY,CAAA;AAEnB,OAAO,EACL,gBAAgB,EACjB,MAAM,cAAc,CAAA;AAqVrB,MAAM,UAAU,IAAI,CAAE,UAA0B,EAAE,UAAuB,EAAE;IACzE,OAAO,IAAI,SAAS,CAAC,UAAU,EAAE,OAAO,CAAC,CAAA;AAC3C,CAAC;AAED,MAAM,UAAU,YAAY,CAAE,UAAkC,EAAE,UAA+B,EAAE;IACjG,MAAM,KAAK,GAAG,UAAU,CAAC,UAAU,CAAC,SAAS,EAAE,UAAU,CAAC,MAAM,CAAC,YAAY,CAAC,wBAAwB,CAAC,CAAC,CAAA;IACxG,MAAM,OAAO,GAAG;QACd,qBAAqB,CAAC,KAAK,CAAC;QAC5B,gBAAgB,CAAC,UAAU,CAAC,OAAO,CAAC;QACpC,GAAG,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;KAC3B,CAAA;IAED,OAAO,IAAI,iBAAiB,CAAC,UAAU,EAAE;QACvC,OAAO;QACP,UAAU,EAAE,KAAK;KAClB,CAAC,CAAA;AACJ,CAAC;AAGD,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import type { IPNSPublishResult, PublishOptions } from '../index.ts';
|
|
1
|
+
import type { IPNSPublishResult, PublishOptions, UnpublishOptions } from '../index.ts';
|
|
2
2
|
import type { LocalStore } from '../local-store.ts';
|
|
3
3
|
import type { IPNSRouting } from '../routing/index.ts';
|
|
4
4
|
import type { Keychain, PublicKey } from '@helia/interface';
|
|
5
|
-
import type {
|
|
5
|
+
import type { ComponentLogger } from '@libp2p/interface';
|
|
6
6
|
import type { Datastore } from 'interface-datastore';
|
|
7
7
|
import type { CID } from 'multiformats/cid';
|
|
8
8
|
import type { MultihashDigest } from 'multiformats/hashes/interface';
|
|
@@ -22,6 +22,6 @@ export declare class IPNSPublisher {
|
|
|
22
22
|
private readonly keychain;
|
|
23
23
|
constructor(components: IPNSPublisherComponents, init: IPNSPublisherInit);
|
|
24
24
|
publish(keyName: string, value: PublicKey | CID | MultihashDigest | string, options?: PublishOptions): Promise<IPNSPublishResult>;
|
|
25
|
-
unpublish(keyName: string, options?:
|
|
25
|
+
unpublish(keyName: string | MultihashDigest, options?: UnpublishOptions): Promise<void>;
|
|
26
26
|
}
|
|
27
27
|
//# sourceMappingURL=publisher.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"publisher.d.ts","sourceRoot":"","sources":["../../../src/ipns/publisher.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"publisher.d.ts","sourceRoot":"","sources":["../../../src/ipns/publisher.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AACtF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AACtD,OAAO,KAAK,EAAE,QAAQ,EAAc,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACvE,OAAO,KAAK,EAAgB,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACtE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AACpD,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAEpE,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,SAAS,CAAA;IACpB,MAAM,EAAE,eAAe,CAAA;IACvB,QAAQ,EAAE,QAAQ,CAAA;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,UAAU,CAAA;IACtB,OAAO,EAAE,WAAW,EAAE,CAAA;CACvB;AAED,qBAAa,aAAa;;IACxB,SAAgB,OAAO,EAAE,WAAW,EAAE,CAAA;IACtC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAY;IACvC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAU;gBAEtB,UAAU,EAAE,uBAAuB,EAAE,IAAI,EAAE,iBAAiB;IAMnE,OAAO,CAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,GAAG,GAAG,eAAe,GAAG,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IA8DtI,SAAS,CAAE,OAAO,EAAE,MAAM,GAAG,eAAe,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;CAkB/F"}
|
|
@@ -2,6 +2,7 @@ import { base36 } from 'multiformats/bases/base36';
|
|
|
2
2
|
import { CustomProgressEvent } from 'progress-events';
|
|
3
3
|
import { DEFAULT_LIFETIME_MS } from "../constants.js";
|
|
4
4
|
import { IPNSEntry } from "../pb/ipns.js";
|
|
5
|
+
import { Upkeep } from "../pb/metadata.js";
|
|
5
6
|
import { createIPNSRecord } from "../records.js";
|
|
6
7
|
import { decodeExtensibleData, multihashToIPNSRoutingKey } from "../utils.js";
|
|
7
8
|
export class IPNSPublisher {
|
|
@@ -33,26 +34,15 @@ export class IPNSPublisher {
|
|
|
33
34
|
ttlNs: options.ttl != null ? BigInt(options.ttl) * 1000000n : undefined
|
|
34
35
|
});
|
|
35
36
|
const marshaledRecord = IPNSEntry.encode(record);
|
|
37
|
+
const metadata = { keyName, lifetime, upkeep: Upkeep[options.upkeep ?? 'reissue'] };
|
|
36
38
|
if (options.offline === true) {
|
|
37
39
|
// only store record locally
|
|
38
|
-
await this.localStore.put(routingKey, marshaledRecord, {
|
|
39
|
-
...options,
|
|
40
|
-
metadata: {
|
|
41
|
-
keyName,
|
|
42
|
-
lifetime
|
|
43
|
-
}
|
|
44
|
-
});
|
|
40
|
+
await this.localStore.put(routingKey, marshaledRecord, { ...options, metadata });
|
|
45
41
|
}
|
|
46
42
|
else {
|
|
47
43
|
// publish record to routing (including the local store)
|
|
48
44
|
await Promise.all(this.routers.map(async (r) => {
|
|
49
|
-
await r.put(routingKey, marshaledRecord, {
|
|
50
|
-
...options,
|
|
51
|
-
metadata: {
|
|
52
|
-
keyName,
|
|
53
|
-
lifetime
|
|
54
|
-
}
|
|
55
|
-
});
|
|
45
|
+
await r.put(routingKey, marshaledRecord, { ...options, metadata });
|
|
56
46
|
}));
|
|
57
47
|
}
|
|
58
48
|
return {
|
|
@@ -85,10 +75,19 @@ export class IPNSPublisher {
|
|
|
85
75
|
}
|
|
86
76
|
}
|
|
87
77
|
async unpublish(keyName, options) {
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
78
|
+
if (typeof keyName === 'string') {
|
|
79
|
+
const key = await this.keychain.exportKey(keyName, options);
|
|
80
|
+
keyName = key.publicKey.toMultihash();
|
|
81
|
+
}
|
|
82
|
+
const routingKey = multihashToIPNSRoutingKey(keyName);
|
|
83
|
+
if (options?.removeRecord === true) {
|
|
84
|
+
// delete the record and its metadata so this node stops serving it
|
|
85
|
+
await this.localStore.delete(routingKey, options);
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
// remove only the metadata so the record is still served but no longer
|
|
89
|
+
// automatically republished; it expires naturally at its validity
|
|
90
|
+
await this.localStore.deleteMetadata(routingKey, options);
|
|
92
91
|
}
|
|
93
92
|
}
|
|
94
93
|
//# sourceMappingURL=publisher.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"publisher.js","sourceRoot":"","sources":["../../../src/ipns/publisher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAA;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAChD,OAAO,EAAE,oBAAoB,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAA;AAqB7E,MAAM,OAAO,aAAa;IACR,OAAO,CAAe;IACrB,UAAU,CAAY;IACtB,QAAQ,CAAU;IAEnC,YAAa,UAAmC,EAAE,IAAuB;QACvE,IAAI,CAAC,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAA;QACnC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAA;QACjC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAA;IAC7B,CAAC;IAED,KAAK,CAAC,OAAO,CAAE,OAAe,EAAE,KAAiD,EAAE,UAA0B,EAAE;QAC7G,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;YACzD,MAAM,MAAM,GAAG,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,CAAA;YAC1C,MAAM,UAAU,GAAG,yBAAyB,CAAC,MAAM,CAAC,CAAA;YACpD,IAAI,cAAc,GAAG,EAAE,CAAA;YAEvB,IAAI,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC,EAAE,CAAC;gBACnD,4EAA4E;gBAC5E,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC,CAAA;gBACjE,MAAM,cAAc,GAAG,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;gBAC/C,MAAM,IAAI,GAAG,oBAAoB,CAAC,cAAc,CAAC,IAAI,CAAC,CAAA;gBACtD,cAAc,GAAG,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,GAAG,EAAE,CAAA;YAC7C,CAAC;YAED,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,mBAAmB,CAAA;YACxD,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,GAAG,EAAE,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE;gBAC1E,GAAG,OAAO;gBACV,2EAA2E;gBAC3E,KAAK,EAAE,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,QAAU,CAAC,CAAC,CAAC,SAAS;aAC1E,CAAC,CAAA;YACF,MAAM,eAAe,GAAG,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;YAEhD,IAAI,OAAO,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;gBAC7B,4BAA4B;gBAC5B,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,EAAE,eAAe,EAAE
|
|
1
|
+
{"version":3,"file":"publisher.js","sourceRoot":"","sources":["../../../src/ipns/publisher.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,10 @@
|
|
|
1
|
+
import { IPNSEntry } from '../pb/ipns.ts';
|
|
2
|
+
import type { RepublishOptions, RepublishResult } from '../index.ts';
|
|
1
3
|
import type { LocalStore } from '../local-store.ts';
|
|
2
4
|
import type { IPNSRouting } from '../routing/index.ts';
|
|
3
5
|
import type { Keychain } from '@helia/interface';
|
|
4
|
-
import type { ComponentLogger } from '@libp2p/interface';
|
|
6
|
+
import type { AbortOptions, ComponentLogger } from '@libp2p/interface';
|
|
7
|
+
import type { MultihashDigest } from 'multiformats';
|
|
5
8
|
export interface IPNSRepublisherComponents {
|
|
6
9
|
logger: ComponentLogger;
|
|
7
10
|
keychain: Keychain;
|
|
@@ -24,5 +27,7 @@ export declare class IPNSRepublisher {
|
|
|
24
27
|
constructor(components: IPNSRepublisherComponents, init: IPNSRepublisherInit);
|
|
25
28
|
start(): void;
|
|
26
29
|
stop(): void;
|
|
30
|
+
republish(key: MultihashDigest, options?: RepublishOptions): Promise<RepublishResult>;
|
|
31
|
+
import(key: MultihashDigest, record: IPNSEntry | Uint8Array, options?: AbortOptions): Promise<void>;
|
|
27
32
|
}
|
|
28
33
|
//# sourceMappingURL=republisher.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"republisher.d.ts","sourceRoot":"","sources":["../../../src/ipns/republisher.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"republisher.d.ts","sourceRoot":"","sources":["../../../src/ipns/republisher.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAQzC,OAAO,KAAK,EAAkB,gBAAgB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AACpF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,KAAK,EAAE,WAAW,EAAyB,MAAM,qBAAqB,CAAA;AAC7E,OAAO,KAAK,EAAE,QAAQ,EAAc,MAAM,kBAAkB,CAAA;AAC5D,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAU,MAAM,mBAAmB,CAAA;AAE9E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAEnD,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,eAAe,CAAA;IACvB,QAAQ,EAAE,QAAQ,CAAA;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAC7B,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,OAAO,EAAE,WAAW,EAAE,CAAA;IACtB,UAAU,EAAE,UAAU,CAAA;CACvB;AAED,qBAAa,eAAe;;IAC1B,SAAgB,OAAO,EAAE,WAAW,EAAE,CAAA;IACtC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAY;IACvC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAe;IAC7C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAQ;IAC5B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAU;IACnC,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAQ;gBAEhC,UAAU,EAAE,yBAAyB,EAAE,IAAI,EAAE,mBAAmB;IAiB7E,KAAK,IAAK,IAAI;IASd,IAAI,IAAK,IAAI;IAmLP,SAAS,CAAE,GAAG,EAAE,eAAe,EAAE,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,eAAe,CAAC;IAmD1F,MAAM,CAAE,GAAG,EAAE,eAAe,EAAE,MAAM,EAAE,SAAS,GAAG,UAAU,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;CA6B3G"}
|