@helia/ipns 8.2.3 → 8.2.4-061f3cdb
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 +31 -136
- package/dist/index.min.js +10 -11
- package/dist/index.min.js.map +4 -4
- package/dist/src/constants.d.ts +17 -0
- package/dist/src/constants.d.ts.map +1 -0
- package/dist/src/constants.js +19 -0
- package/dist/src/constants.js.map +1 -0
- package/dist/src/errors.d.ts +0 -4
- package/dist/src/errors.d.ts.map +1 -1
- package/dist/src/errors.js +0 -7
- package/dist/src/errors.js.map +1 -1
- package/dist/src/index.d.ts +109 -201
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +34 -417
- package/dist/src/index.js.map +1 -1
- package/dist/src/ipns.d.ts +22 -0
- package/dist/src/ipns.d.ts.map +1 -0
- package/dist/src/ipns.js +339 -0
- package/dist/src/ipns.js.map +1 -0
- package/dist/src/local-store.d.ts +42 -0
- package/dist/src/local-store.d.ts.map +1 -0
- package/dist/src/local-store.js +119 -0
- package/dist/src/local-store.js.map +1 -0
- package/dist/src/pb/metadata.d.ts +12 -0
- package/dist/src/pb/metadata.d.ts.map +1 -0
- package/dist/src/pb/metadata.js +57 -0
- package/dist/src/pb/metadata.js.map +1 -0
- package/dist/src/routing/index.d.ts +4 -2
- package/dist/src/routing/index.d.ts.map +1 -1
- package/dist/src/routing/index.js.map +1 -1
- package/dist/src/routing/local-store.d.ts +4 -19
- package/dist/src/routing/local-store.d.ts.map +1 -1
- package/dist/src/routing/local-store.js +7 -62
- package/dist/src/routing/local-store.js.map +1 -1
- package/dist/src/routing/pubsub.d.ts +21 -1
- package/dist/src/routing/pubsub.d.ts.map +1 -1
- package/dist/src/routing/pubsub.js +2 -2
- package/dist/src/routing/pubsub.js.map +1 -1
- package/dist/src/utils.d.ts +24 -0
- package/dist/src/utils.d.ts.map +1 -1
- package/dist/src/utils.js +56 -0
- package/dist/src/utils.js.map +1 -1
- package/package.json +21 -23
- package/src/constants.ts +24 -0
- package/src/errors.ts +0 -9
- package/src/index.ts +116 -545
- package/src/ipns.ts +400 -0
- package/src/local-store.ts +162 -0
- package/src/pb/metadata.proto +9 -0
- package/src/pb/metadata.ts +74 -0
- package/src/routing/index.ts +4 -3
- package/src/routing/local-store.ts +9 -87
- package/src/routing/pubsub.ts +28 -4
- package/src/utils.ts +70 -0
- package/dist/src/dnslink.d.ts +0 -9
- package/dist/src/dnslink.d.ts.map +0 -1
- package/dist/src/dnslink.js +0 -138
- package/dist/src/dnslink.js.map +0 -1
- package/dist/typedoc-urls.json +0 -48
- package/src/dnslink.ts +0 -163
package/dist/src/ipns.js
ADDED
|
@@ -0,0 +1,339 @@
|
|
|
1
|
+
import { generateKeyPair } from '@libp2p/crypto/keys';
|
|
2
|
+
import { NotFoundError, NotStartedError, isPeerId, isPublicKey } from '@libp2p/interface';
|
|
3
|
+
import { Queue, repeatingTask } from '@libp2p/utils';
|
|
4
|
+
import { createIPNSRecord, marshalIPNSRecord, multihashToIPNSRoutingKey, unmarshalIPNSRecord } from 'ipns';
|
|
5
|
+
import { ipnsSelector } from 'ipns/selector';
|
|
6
|
+
import { ipnsValidator } from 'ipns/validator';
|
|
7
|
+
import { base36 } from 'multiformats/bases/base36';
|
|
8
|
+
import { base58btc } from 'multiformats/bases/base58';
|
|
9
|
+
import { CID } from 'multiformats/cid';
|
|
10
|
+
import * as Digest from 'multiformats/hashes/digest';
|
|
11
|
+
import { CustomProgressEvent } from 'progress-events';
|
|
12
|
+
import { DEFAULT_LIFETIME_MS, DEFAULT_REPUBLISH_CONCURRENCY, DEFAULT_REPUBLISH_INTERVAL_MS, DEFAULT_TTL_NS } from "./constants.js";
|
|
13
|
+
import { InvalidValueError, RecordsFailedValidationError, UnsupportedMultibasePrefixError, UnsupportedMultihashCodecError } from './errors.js';
|
|
14
|
+
import { localStore } from './local-store.js';
|
|
15
|
+
import { helia } from './routing/helia.js';
|
|
16
|
+
import { localStoreRouting } from "./routing/local-store.js";
|
|
17
|
+
import { isCodec, IDENTITY_CODEC, SHA2_256_CODEC, shouldRepublish, isLibp2pCID } from './utils.js';
|
|
18
|
+
const bases = {
|
|
19
|
+
[base36.prefix]: base36,
|
|
20
|
+
[base58btc.prefix]: base58btc
|
|
21
|
+
};
|
|
22
|
+
export class IPNS {
|
|
23
|
+
routers;
|
|
24
|
+
localStore;
|
|
25
|
+
republishTask;
|
|
26
|
+
log;
|
|
27
|
+
keychain;
|
|
28
|
+
started = false;
|
|
29
|
+
republishConcurrency;
|
|
30
|
+
constructor(components, init = {}) {
|
|
31
|
+
this.log = components.logger.forComponent('helia:ipns');
|
|
32
|
+
this.localStore = localStore(components.datastore, components.logger.forComponent('helia:ipns:local-store'));
|
|
33
|
+
this.keychain = components.libp2p.services.keychain;
|
|
34
|
+
this.republishConcurrency = init.republishConcurrency || DEFAULT_REPUBLISH_CONCURRENCY;
|
|
35
|
+
this.started = components.libp2p.status === 'started';
|
|
36
|
+
this.routers = [
|
|
37
|
+
localStoreRouting(this.localStore),
|
|
38
|
+
helia(components.routing),
|
|
39
|
+
...(init.routers ?? [])
|
|
40
|
+
];
|
|
41
|
+
// start republishing on Helia start
|
|
42
|
+
components.events.addEventListener('start', this.start.bind(this));
|
|
43
|
+
// stop republishing on Helia stop
|
|
44
|
+
components.events.addEventListener('stop', this.stop.bind(this));
|
|
45
|
+
this.republishTask = repeatingTask(this.#republish.bind(this), init.republishInterval ?? DEFAULT_REPUBLISH_INTERVAL_MS, {
|
|
46
|
+
runImmediately: true
|
|
47
|
+
});
|
|
48
|
+
if (this.started) {
|
|
49
|
+
this.republishTask.start();
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
start() {
|
|
53
|
+
if (this.started) {
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
this.started = true;
|
|
57
|
+
this.republishTask.start();
|
|
58
|
+
}
|
|
59
|
+
stop() {
|
|
60
|
+
if (!this.started) {
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
this.started = false;
|
|
64
|
+
this.republishTask.stop();
|
|
65
|
+
}
|
|
66
|
+
#throwIfStopped() {
|
|
67
|
+
if (!this.started) {
|
|
68
|
+
throw new NotStartedError('Helia is stopped, cannot perform IPNS operations');
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
async publish(keyName, value, options = {}) {
|
|
72
|
+
this.#throwIfStopped();
|
|
73
|
+
try {
|
|
74
|
+
const privKey = await this.#loadOrCreateKey(keyName);
|
|
75
|
+
let sequenceNumber = 1n;
|
|
76
|
+
const routingKey = multihashToIPNSRoutingKey(privKey.publicKey.toMultihash());
|
|
77
|
+
if (await this.localStore.has(routingKey, options)) {
|
|
78
|
+
// if we have published under this key before, increment the sequence number
|
|
79
|
+
const { record } = await this.localStore.get(routingKey, options);
|
|
80
|
+
const existingRecord = unmarshalIPNSRecord(record);
|
|
81
|
+
sequenceNumber = existingRecord.sequence + 1n;
|
|
82
|
+
}
|
|
83
|
+
if (isPeerId(value)) {
|
|
84
|
+
value = value.toCID();
|
|
85
|
+
}
|
|
86
|
+
// convert ttl from milliseconds to nanoseconds as createIPNSRecord expects
|
|
87
|
+
const ttlNs = options.ttl != null ? BigInt(options.ttl) * 1000000n : DEFAULT_TTL_NS;
|
|
88
|
+
const lifetime = options.lifetime ?? DEFAULT_LIFETIME_MS;
|
|
89
|
+
const record = await createIPNSRecord(privKey, value, sequenceNumber, lifetime, { ...options, ttlNs });
|
|
90
|
+
const marshaledRecord = marshalIPNSRecord(record);
|
|
91
|
+
if (options.offline === true) {
|
|
92
|
+
// only store record locally
|
|
93
|
+
await this.localStore.put(routingKey, marshaledRecord, { ...options, metadata: { keyName, lifetime } });
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
// publish record to routing (including the local store)
|
|
97
|
+
await Promise.all(this.routers.map(async (r) => {
|
|
98
|
+
await r.put(routingKey, marshaledRecord, { ...options, metadata: { keyName, lifetime } });
|
|
99
|
+
}));
|
|
100
|
+
}
|
|
101
|
+
return {
|
|
102
|
+
record,
|
|
103
|
+
publicKey: privKey.publicKey
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
catch (err) {
|
|
107
|
+
options.onProgress?.(new CustomProgressEvent('ipns:publish:error', err));
|
|
108
|
+
throw err;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
async resolve(key, options = {}) {
|
|
112
|
+
this.#throwIfStopped();
|
|
113
|
+
const digest = isPublicKey(key) || isPeerId(key) ? key.toMultihash() : isLibp2pCID(key) ? key.multihash : key;
|
|
114
|
+
const routingKey = multihashToIPNSRoutingKey(digest);
|
|
115
|
+
const record = await this.#findIpnsRecord(routingKey, options);
|
|
116
|
+
return {
|
|
117
|
+
...(await this.#resolve(record.value, options)),
|
|
118
|
+
record
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
async #loadOrCreateKey(keyName) {
|
|
122
|
+
try {
|
|
123
|
+
return await this.keychain.exportKey(keyName);
|
|
124
|
+
}
|
|
125
|
+
catch (err) {
|
|
126
|
+
// If no named key found in keychain, generate and import
|
|
127
|
+
const privKey = await generateKeyPair('Ed25519');
|
|
128
|
+
await this.keychain.importKey(keyName, privKey);
|
|
129
|
+
return privKey;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
async #republish(options = {}) {
|
|
133
|
+
if (!this.started) {
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
this.log('starting ipns republish records loop');
|
|
137
|
+
const queue = new Queue({
|
|
138
|
+
concurrency: this.republishConcurrency
|
|
139
|
+
});
|
|
140
|
+
try {
|
|
141
|
+
const recordsToRepublish = [];
|
|
142
|
+
// Find all records using the localStore.list method
|
|
143
|
+
for await (const { routingKey, record, metadata, created } of this.localStore.list(options)) {
|
|
144
|
+
if (metadata == null) {
|
|
145
|
+
// Skip if no metadata is found from before we started
|
|
146
|
+
// storing metadata or for records republished without a key
|
|
147
|
+
this.log(`no metadata found for record ${routingKey.toString()}, skipping`);
|
|
148
|
+
continue;
|
|
149
|
+
}
|
|
150
|
+
let ipnsRecord;
|
|
151
|
+
try {
|
|
152
|
+
ipnsRecord = unmarshalIPNSRecord(record);
|
|
153
|
+
}
|
|
154
|
+
catch (err) {
|
|
155
|
+
this.log.error('error unmarshaling record - %e', err);
|
|
156
|
+
continue;
|
|
157
|
+
}
|
|
158
|
+
// Only republish records that are within the DHT or record expiry threshold
|
|
159
|
+
if (!shouldRepublish(ipnsRecord, created)) {
|
|
160
|
+
this.log.trace(`skipping record ${routingKey.toString()}within republish threshold`);
|
|
161
|
+
continue;
|
|
162
|
+
}
|
|
163
|
+
const sequenceNumber = ipnsRecord.sequence + 1n;
|
|
164
|
+
const ttlNs = ipnsRecord.ttl ?? DEFAULT_TTL_NS;
|
|
165
|
+
let privKey;
|
|
166
|
+
try {
|
|
167
|
+
privKey = await this.keychain.exportKey(metadata.keyName);
|
|
168
|
+
}
|
|
169
|
+
catch (err) {
|
|
170
|
+
this.log.error(`missing key ${metadata.keyName}, skipping republishing record`, err);
|
|
171
|
+
continue;
|
|
172
|
+
}
|
|
173
|
+
try {
|
|
174
|
+
const updatedRecord = await createIPNSRecord(privKey, ipnsRecord.value, sequenceNumber, metadata.lifetime, { ...options, ttlNs });
|
|
175
|
+
recordsToRepublish.push({ routingKey, record: updatedRecord });
|
|
176
|
+
}
|
|
177
|
+
catch (err) {
|
|
178
|
+
this.log.error(`error creating updated IPNS record for ${routingKey.toString()}`, err);
|
|
179
|
+
continue;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
this.log(`found ${recordsToRepublish.length} records to republish`);
|
|
183
|
+
// Republish each record
|
|
184
|
+
for (const { routingKey, record } of recordsToRepublish) {
|
|
185
|
+
// Add job to queue to republish the record to all routers
|
|
186
|
+
queue.add(async () => {
|
|
187
|
+
try {
|
|
188
|
+
const marshaledRecord = marshalIPNSRecord(record);
|
|
189
|
+
await Promise.all(this.routers.map(r => r.put(routingKey, marshaledRecord, options)));
|
|
190
|
+
}
|
|
191
|
+
catch (err) {
|
|
192
|
+
this.log.error('error republishing record - %e', err);
|
|
193
|
+
}
|
|
194
|
+
}, options);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
catch (err) {
|
|
198
|
+
this.log.error('error during republish - %e', err);
|
|
199
|
+
}
|
|
200
|
+
await queue.onIdle(options); // Wait for all jobs to complete
|
|
201
|
+
}
|
|
202
|
+
async unpublish(keyName, options) {
|
|
203
|
+
const { publicKey } = await this.keychain.exportKey(keyName);
|
|
204
|
+
const digest = publicKey.toMultihash();
|
|
205
|
+
const routingKey = multihashToIPNSRoutingKey(digest);
|
|
206
|
+
await this.localStore.delete(routingKey, options);
|
|
207
|
+
}
|
|
208
|
+
async #resolve(ipfsPath, options = {}) {
|
|
209
|
+
const parts = ipfsPath.split('/');
|
|
210
|
+
try {
|
|
211
|
+
const scheme = parts[1];
|
|
212
|
+
if (scheme === 'ipns') {
|
|
213
|
+
const str = parts[2];
|
|
214
|
+
const prefix = str.substring(0, 1);
|
|
215
|
+
let buf;
|
|
216
|
+
if (prefix === '1' || prefix === 'Q') {
|
|
217
|
+
buf = base58btc.decode(`z${str}`);
|
|
218
|
+
}
|
|
219
|
+
else if (bases[prefix] != null) {
|
|
220
|
+
buf = bases[prefix].decode(str);
|
|
221
|
+
}
|
|
222
|
+
else {
|
|
223
|
+
throw new UnsupportedMultibasePrefixError(`Unsupported multibase prefix "${prefix}"`);
|
|
224
|
+
}
|
|
225
|
+
let digest;
|
|
226
|
+
try {
|
|
227
|
+
digest = Digest.decode(buf);
|
|
228
|
+
}
|
|
229
|
+
catch {
|
|
230
|
+
digest = CID.decode(buf).multihash;
|
|
231
|
+
}
|
|
232
|
+
if (!isCodec(digest, IDENTITY_CODEC) && !isCodec(digest, SHA2_256_CODEC)) {
|
|
233
|
+
throw new UnsupportedMultihashCodecError(`Unsupported multihash codec "${digest.code}"`);
|
|
234
|
+
}
|
|
235
|
+
const { cid } = await this.resolve(digest, options);
|
|
236
|
+
const path = parts.slice(3).join('/');
|
|
237
|
+
return {
|
|
238
|
+
cid,
|
|
239
|
+
path
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
else if (scheme === 'ipfs') {
|
|
243
|
+
const cid = CID.parse(parts[2]);
|
|
244
|
+
const path = parts.slice(3).join('/');
|
|
245
|
+
return {
|
|
246
|
+
cid,
|
|
247
|
+
path
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
catch (err) {
|
|
252
|
+
this.log.error('error parsing ipfs path - %e', err);
|
|
253
|
+
}
|
|
254
|
+
this.log.error('invalid ipfs path %s', ipfsPath);
|
|
255
|
+
throw new InvalidValueError('Invalid value');
|
|
256
|
+
}
|
|
257
|
+
async #findIpnsRecord(routingKey, options = {}) {
|
|
258
|
+
const records = [];
|
|
259
|
+
const cached = await this.localStore.has(routingKey, options);
|
|
260
|
+
if (cached) {
|
|
261
|
+
this.log('record is present in the cache');
|
|
262
|
+
if (options.nocache !== true) {
|
|
263
|
+
try {
|
|
264
|
+
// check the local cache first
|
|
265
|
+
const { record, created } = await this.localStore.get(routingKey, options);
|
|
266
|
+
this.log('record retrieved from cache');
|
|
267
|
+
// validate the record
|
|
268
|
+
await ipnsValidator(routingKey, record);
|
|
269
|
+
this.log('record was valid');
|
|
270
|
+
// check the TTL
|
|
271
|
+
const ipnsRecord = unmarshalIPNSRecord(record);
|
|
272
|
+
// IPNS TTL is in nanoseconds, convert to milliseconds, default to one
|
|
273
|
+
// hour
|
|
274
|
+
const ttlMs = Number((ipnsRecord.ttl ?? DEFAULT_TTL_NS) / 1000000n);
|
|
275
|
+
const ttlExpires = created.getTime() + ttlMs;
|
|
276
|
+
if (ttlExpires > Date.now()) {
|
|
277
|
+
// the TTL has not yet expired, return the cached record
|
|
278
|
+
this.log('record TTL was valid');
|
|
279
|
+
return ipnsRecord;
|
|
280
|
+
}
|
|
281
|
+
if (options.offline === true) {
|
|
282
|
+
// the TTL has expired but we are skipping the routing search
|
|
283
|
+
this.log('record TTL has been reached but we are resolving offline-only, returning record');
|
|
284
|
+
return ipnsRecord;
|
|
285
|
+
}
|
|
286
|
+
this.log('record TTL has been reached, searching routing for updates');
|
|
287
|
+
// add the local record to our list of resolved record, and also
|
|
288
|
+
// search the routing for updates - the most up to date record will be
|
|
289
|
+
// returned
|
|
290
|
+
records.push(record);
|
|
291
|
+
}
|
|
292
|
+
catch (err) {
|
|
293
|
+
this.log('cached record was invalid - %e', err);
|
|
294
|
+
await this.localStore.delete(routingKey, options);
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
else {
|
|
298
|
+
this.log('ignoring local cache due to nocache=true option');
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
if (options.offline === true) {
|
|
302
|
+
throw new NotFoundError('Record was not present in the cache or has expired');
|
|
303
|
+
}
|
|
304
|
+
this.log('did not have record locally');
|
|
305
|
+
let foundInvalid = 0;
|
|
306
|
+
await Promise.all(this.routers.map(async (router) => {
|
|
307
|
+
let record;
|
|
308
|
+
try {
|
|
309
|
+
record = await router.get(routingKey, {
|
|
310
|
+
...options,
|
|
311
|
+
validate: false
|
|
312
|
+
});
|
|
313
|
+
}
|
|
314
|
+
catch (err) {
|
|
315
|
+
this.log.error('error finding IPNS record - %e', err);
|
|
316
|
+
return;
|
|
317
|
+
}
|
|
318
|
+
try {
|
|
319
|
+
await ipnsValidator(routingKey, record);
|
|
320
|
+
records.push(record);
|
|
321
|
+
}
|
|
322
|
+
catch (err) {
|
|
323
|
+
// we found a record, but the validator rejected it
|
|
324
|
+
foundInvalid++;
|
|
325
|
+
this.log.error('error finding IPNS record - %e', err);
|
|
326
|
+
}
|
|
327
|
+
}));
|
|
328
|
+
if (records.length === 0) {
|
|
329
|
+
if (foundInvalid > 0) {
|
|
330
|
+
throw new RecordsFailedValidationError(`${foundInvalid > 1 ? `${foundInvalid} records` : 'Record'} found for routing key ${foundInvalid > 1 ? 'were' : 'was'} invalid`);
|
|
331
|
+
}
|
|
332
|
+
throw new NotFoundError('Could not find record for routing key');
|
|
333
|
+
}
|
|
334
|
+
const record = records[ipnsSelector(routingKey, records)];
|
|
335
|
+
await this.localStore.put(routingKey, record, options);
|
|
336
|
+
return unmarshalIPNSRecord(record);
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
//# sourceMappingURL=ipns.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ipns.js","sourceRoot":"","sources":["../../src/ipns.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { IPNSPublishMetadata } from './pb/metadata.js';
|
|
2
|
+
import type { DatastoreProgressEvents, GetOptions, PutOptions } from './routing/index.js';
|
|
3
|
+
import type { AbortOptions, Logger } from '@libp2p/interface';
|
|
4
|
+
import type { Datastore } from 'interface-datastore';
|
|
5
|
+
export interface GetResult {
|
|
6
|
+
record: Uint8Array;
|
|
7
|
+
created: Date;
|
|
8
|
+
}
|
|
9
|
+
export interface ListResult {
|
|
10
|
+
routingKey: Uint8Array;
|
|
11
|
+
record: Uint8Array;
|
|
12
|
+
created: Date;
|
|
13
|
+
metadata?: IPNSPublishMetadata;
|
|
14
|
+
}
|
|
15
|
+
export interface ListOptions extends AbortOptions {
|
|
16
|
+
onProgress?(evt: DatastoreProgressEvents): void;
|
|
17
|
+
}
|
|
18
|
+
export interface LocalStore {
|
|
19
|
+
/**
|
|
20
|
+
* Put an IPNS record into the datastore
|
|
21
|
+
*
|
|
22
|
+
* @param routingKey - The routing key for the IPNS record
|
|
23
|
+
* @param marshaledRecord - The marshaled IPNS record
|
|
24
|
+
* @param options - options for the put operation including metadata
|
|
25
|
+
*/
|
|
26
|
+
put(routingKey: Uint8Array, marshaledRecord: Uint8Array, options?: PutOptions): Promise<void>;
|
|
27
|
+
get(routingKey: Uint8Array, options?: GetOptions): Promise<GetResult>;
|
|
28
|
+
has(routingKey: Uint8Array, options?: AbortOptions): Promise<boolean>;
|
|
29
|
+
delete(routingKey: Uint8Array, options?: AbortOptions): Promise<void>;
|
|
30
|
+
/**
|
|
31
|
+
* List all IPNS records in the datastore
|
|
32
|
+
*/
|
|
33
|
+
list(options?: ListOptions): AsyncIterable<ListResult>;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Read/write IPNS records to the datastore as DHT records.
|
|
37
|
+
*
|
|
38
|
+
* This lets us publish IPNS records offline then serve them to the network
|
|
39
|
+
* later in response to DHT queries.
|
|
40
|
+
*/
|
|
41
|
+
export declare function localStore(datastore: Datastore, log: Logger): LocalStore;
|
|
42
|
+
//# sourceMappingURL=local-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-store.d.ts","sourceRoot":"","sources":["../../src/local-store.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAA;AAEtD,OAAO,KAAK,EAAE,uBAAuB,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AACzF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAC7D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAEpD,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,UAAU,CAAA;IAClB,OAAO,EAAE,IAAI,CAAA;CACd;AAED,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,UAAU,CAAA;IACtB,MAAM,EAAE,UAAU,CAAA;IAClB,OAAO,EAAE,IAAI,CAAA;IACb,QAAQ,CAAC,EAAE,mBAAmB,CAAA;CAC/B;AAED,MAAM,WAAW,WAAY,SAAQ,YAAY;IAC/C,UAAU,CAAC,CAAC,GAAG,EAAE,uBAAuB,GAAG,IAAI,CAAA;CAChD;AAED,MAAM,WAAW,UAAU;IACzB;;;;;;OAMG;IACH,GAAG,CAAC,UAAU,EAAE,UAAU,EAAE,eAAe,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC7F,GAAG,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC,CAAA;IACrE,GAAG,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IACrE,MAAM,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACrE;;OAEG;IACH,IAAI,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,aAAa,CAAC,UAAU,CAAC,CAAA;CACvD;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAE,SAAS,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,GAAG,UAAU,CA+GzE"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { Record } from '@libp2p/kad-dht';
|
|
2
|
+
import { CustomProgressEvent } from 'progress-events';
|
|
3
|
+
import { equals as uint8ArrayEquals } from 'uint8arrays/equals';
|
|
4
|
+
import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string';
|
|
5
|
+
import { IPNSPublishMetadata } from './pb/metadata.js';
|
|
6
|
+
import { dhtRoutingKey, DHT_RECORD_PREFIX, ipnsMetadataKey } from './utils.js';
|
|
7
|
+
/**
|
|
8
|
+
* Read/write IPNS records to the datastore as DHT records.
|
|
9
|
+
*
|
|
10
|
+
* This lets us publish IPNS records offline then serve them to the network
|
|
11
|
+
* later in response to DHT queries.
|
|
12
|
+
*/
|
|
13
|
+
export function localStore(datastore, log) {
|
|
14
|
+
return {
|
|
15
|
+
async put(routingKey, marshalledRecord, options = {}) {
|
|
16
|
+
try {
|
|
17
|
+
const key = dhtRoutingKey(routingKey);
|
|
18
|
+
// don't overwrite existing, identical records as this will affect the
|
|
19
|
+
// TTL
|
|
20
|
+
try {
|
|
21
|
+
const existingBuf = await datastore.get(key);
|
|
22
|
+
const existingRecord = Record.deserialize(existingBuf);
|
|
23
|
+
if (uint8ArrayEquals(existingRecord.value, marshalledRecord)) {
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
catch (err) {
|
|
28
|
+
if (err.name !== 'NotFoundError') {
|
|
29
|
+
throw err;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
// Marshal to libp2p record as the DHT does
|
|
33
|
+
const record = new Record(routingKey, marshalledRecord, new Date());
|
|
34
|
+
options.onProgress?.(new CustomProgressEvent('ipns:routing:datastore:put'));
|
|
35
|
+
const batch = datastore.batch();
|
|
36
|
+
batch.put(key, record.serialize());
|
|
37
|
+
if (options.metadata != null) {
|
|
38
|
+
// derive the datastore key for the IPNS metadata from the same routing key
|
|
39
|
+
batch.put(ipnsMetadataKey(routingKey), IPNSPublishMetadata.encode(options.metadata));
|
|
40
|
+
}
|
|
41
|
+
await batch.commit(options);
|
|
42
|
+
}
|
|
43
|
+
catch (err) {
|
|
44
|
+
options.onProgress?.(new CustomProgressEvent('ipns:routing:datastore:error', err));
|
|
45
|
+
throw err;
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
async get(routingKey, options = {}) {
|
|
49
|
+
try {
|
|
50
|
+
const key = dhtRoutingKey(routingKey);
|
|
51
|
+
options.onProgress?.(new CustomProgressEvent('ipns:routing:datastore:get'));
|
|
52
|
+
const buf = await datastore.get(key, options);
|
|
53
|
+
// Unmarshal libp2p record as the DHT does
|
|
54
|
+
const record = Record.deserialize(buf);
|
|
55
|
+
return {
|
|
56
|
+
record: record.value,
|
|
57
|
+
created: record.timeReceived
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
catch (err) {
|
|
61
|
+
options.onProgress?.(new CustomProgressEvent('ipns:routing:datastore:error', err));
|
|
62
|
+
throw err;
|
|
63
|
+
}
|
|
64
|
+
},
|
|
65
|
+
async has(routingKey, options = {}) {
|
|
66
|
+
const key = dhtRoutingKey(routingKey);
|
|
67
|
+
return datastore.has(key, options);
|
|
68
|
+
},
|
|
69
|
+
async delete(routingKey, options) {
|
|
70
|
+
const key = dhtRoutingKey(routingKey);
|
|
71
|
+
const batch = datastore.batch();
|
|
72
|
+
batch.delete(key);
|
|
73
|
+
batch.delete(ipnsMetadataKey(routingKey));
|
|
74
|
+
await batch.commit(options);
|
|
75
|
+
},
|
|
76
|
+
async *list(options = {}) {
|
|
77
|
+
try {
|
|
78
|
+
options.onProgress?.(new CustomProgressEvent('ipns:routing:datastore:list'));
|
|
79
|
+
// Query all records with the DHT_RECORD_PREFIX
|
|
80
|
+
for await (const { key, value } of datastore.query({
|
|
81
|
+
prefix: DHT_RECORD_PREFIX
|
|
82
|
+
}, options)) {
|
|
83
|
+
try {
|
|
84
|
+
// Deserialize the record
|
|
85
|
+
const libp2pRecord = Record.deserialize(value);
|
|
86
|
+
// Extract the routing key from the datastore key
|
|
87
|
+
const keyString = key.toString();
|
|
88
|
+
const routingKeyBase32 = keyString.substring(DHT_RECORD_PREFIX.length);
|
|
89
|
+
const routingKey = uint8ArrayFromString(routingKeyBase32, 'base32');
|
|
90
|
+
const metadataKey = ipnsMetadataKey(routingKey);
|
|
91
|
+
let metadata;
|
|
92
|
+
try {
|
|
93
|
+
const metadataBuf = await datastore.get(metadataKey, options);
|
|
94
|
+
metadata = IPNSPublishMetadata.decode(metadataBuf);
|
|
95
|
+
}
|
|
96
|
+
catch (err) {
|
|
97
|
+
log.error('Error deserializing metadata for %s - %e', routingKeyBase32, err);
|
|
98
|
+
}
|
|
99
|
+
yield {
|
|
100
|
+
routingKey,
|
|
101
|
+
metadata,
|
|
102
|
+
record: libp2pRecord.value,
|
|
103
|
+
created: libp2pRecord.timeReceived
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
catch (err) {
|
|
107
|
+
// Skip invalid records
|
|
108
|
+
log.error('Error deserializing record - %e', err);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
catch (err) {
|
|
113
|
+
options.onProgress?.(new CustomProgressEvent('ipns:routing:datastore:error', err));
|
|
114
|
+
throw err;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=local-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-store.js","sourceRoot":"","sources":["../../src/local-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Codec, DecodeOptions } from 'protons-runtime';
|
|
2
|
+
import type { Uint8ArrayList } from 'uint8arraylist';
|
|
3
|
+
export interface IPNSPublishMetadata {
|
|
4
|
+
keyName: string;
|
|
5
|
+
lifetime: number;
|
|
6
|
+
}
|
|
7
|
+
export declare namespace IPNSPublishMetadata {
|
|
8
|
+
const codec: () => Codec<IPNSPublishMetadata>;
|
|
9
|
+
const encode: (obj: Partial<IPNSPublishMetadata>) => Uint8Array;
|
|
10
|
+
const decode: (buf: Uint8Array | Uint8ArrayList, opts?: DecodeOptions<IPNSPublishMetadata>) => IPNSPublishMetadata;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=metadata.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../../../src/pb/metadata.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAC3D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAEpD,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,yBAAiB,mBAAmB,CAAC;IAG5B,MAAM,KAAK,QAAO,KAAK,CAAC,mBAAmB,CAoDjD,CAAA;IAEM,MAAM,MAAM,GAAI,KAAK,OAAO,CAAC,mBAAmB,CAAC,KAAG,UAE1D,CAAA;IAEM,MAAM,MAAM,GAAI,KAAK,UAAU,GAAG,cAAc,EAAE,OAAO,aAAa,CAAC,mBAAmB,CAAC,KAAG,mBAEpG,CAAA;CACF"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { decodeMessage, encodeMessage, message } from 'protons-runtime';
|
|
2
|
+
export var IPNSPublishMetadata;
|
|
3
|
+
(function (IPNSPublishMetadata) {
|
|
4
|
+
let _codec;
|
|
5
|
+
IPNSPublishMetadata.codec = () => {
|
|
6
|
+
if (_codec == null) {
|
|
7
|
+
_codec = message((obj, w, opts = {}) => {
|
|
8
|
+
if (opts.lengthDelimited !== false) {
|
|
9
|
+
w.fork();
|
|
10
|
+
}
|
|
11
|
+
if ((obj.keyName != null && obj.keyName !== '')) {
|
|
12
|
+
w.uint32(10);
|
|
13
|
+
w.string(obj.keyName);
|
|
14
|
+
}
|
|
15
|
+
if ((obj.lifetime != null && obj.lifetime !== 0)) {
|
|
16
|
+
w.uint32(16);
|
|
17
|
+
w.uint32(obj.lifetime);
|
|
18
|
+
}
|
|
19
|
+
if (opts.lengthDelimited !== false) {
|
|
20
|
+
w.ldelim();
|
|
21
|
+
}
|
|
22
|
+
}, (reader, length, opts = {}) => {
|
|
23
|
+
const obj = {
|
|
24
|
+
keyName: '',
|
|
25
|
+
lifetime: 0
|
|
26
|
+
};
|
|
27
|
+
const end = length == null ? reader.len : reader.pos + length;
|
|
28
|
+
while (reader.pos < end) {
|
|
29
|
+
const tag = reader.uint32();
|
|
30
|
+
switch (tag >>> 3) {
|
|
31
|
+
case 1: {
|
|
32
|
+
obj.keyName = reader.string();
|
|
33
|
+
break;
|
|
34
|
+
}
|
|
35
|
+
case 2: {
|
|
36
|
+
obj.lifetime = reader.uint32();
|
|
37
|
+
break;
|
|
38
|
+
}
|
|
39
|
+
default: {
|
|
40
|
+
reader.skipType(tag & 7);
|
|
41
|
+
break;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return obj;
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
return _codec;
|
|
49
|
+
};
|
|
50
|
+
IPNSPublishMetadata.encode = (obj) => {
|
|
51
|
+
return encodeMessage(obj, IPNSPublishMetadata.codec());
|
|
52
|
+
};
|
|
53
|
+
IPNSPublishMetadata.decode = (buf, opts) => {
|
|
54
|
+
return decodeMessage(buf, IPNSPublishMetadata.codec(), opts);
|
|
55
|
+
};
|
|
56
|
+
})(IPNSPublishMetadata || (IPNSPublishMetadata = {}));
|
|
57
|
+
//# sourceMappingURL=metadata.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metadata.js","sourceRoot":"","sources":["../../../src/pb/metadata.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AASvE,MAAM,KAAW,mBAAmB,CAgEnC;AAhED,WAAiB,mBAAmB;IAClC,IAAI,MAAkC,CAAA;IAEzB,yBAAK,GAAG,GAA+B,EAAE;QACpD,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;YACnB,MAAM,GAAG,OAAO,CAAsB,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,GAAG,EAAE,EAAE,EAAE;gBAC1D,IAAI,IAAI,CAAC,eAAe,KAAK,KAAK,EAAE,CAAC;oBACnC,CAAC,CAAC,IAAI,EAAE,CAAA;gBACV,CAAC;gBAED,IAAI,CAAC,GAAG,CAAC,OAAO,IAAI,IAAI,IAAI,GAAG,CAAC,OAAO,KAAK,EAAE,CAAC,EAAE,CAAC;oBAChD,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;oBACZ,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;gBACvB,CAAC;gBAED,IAAI,CAAC,GAAG,CAAC,QAAQ,IAAI,IAAI,IAAI,GAAG,CAAC,QAAQ,KAAK,CAAC,CAAC,EAAE,CAAC;oBACjD,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;oBACZ,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;gBACxB,CAAC;gBAED,IAAI,IAAI,CAAC,eAAe,KAAK,KAAK,EAAE,CAAC;oBACnC,CAAC,CAAC,MAAM,EAAE,CAAA;gBACZ,CAAC;YACH,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,GAAG,EAAE,EAAE,EAAE;gBAC/B,MAAM,GAAG,GAAQ;oBACf,OAAO,EAAE,EAAE;oBACX,QAAQ,EAAE,CAAC;iBACZ,CAAA;gBAED,MAAM,GAAG,GAAG,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,GAAG,MAAM,CAAA;gBAE7D,OAAO,MAAM,CAAC,GAAG,GAAG,GAAG,EAAE,CAAC;oBACxB,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,CAAA;oBAE3B,QAAQ,GAAG,KAAK,CAAC,EAAE,CAAC;wBAClB,KAAK,CAAC,CAAC,CAAC,CAAC;4BACP,GAAG,CAAC,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,CAAA;4BAC7B,MAAK;wBACP,CAAC;wBACD,KAAK,CAAC,CAAC,CAAC,CAAC;4BACP,GAAG,CAAC,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,CAAA;4BAC9B,MAAK;wBACP,CAAC;wBACD,OAAO,CAAC,CAAC,CAAC;4BACR,MAAM,CAAC,QAAQ,CAAC,GAAG,GAAG,CAAC,CAAC,CAAA;4BACxB,MAAK;wBACP,CAAC;oBACH,CAAC;gBACH,CAAC;gBAED,OAAO,GAAG,CAAA;YACZ,CAAC,CAAC,CAAA;QACJ,CAAC;QAED,OAAO,MAAM,CAAA;IACf,CAAC,CAAA;IAEY,0BAAM,GAAG,CAAC,GAAiC,EAAc,EAAE;QACtE,OAAO,aAAa,CAAC,GAAG,EAAE,mBAAmB,CAAC,KAAK,EAAE,CAAC,CAAA;IACxD,CAAC,CAAA;IAEY,0BAAM,GAAG,CAAC,GAAgC,EAAE,IAAyC,EAAuB,EAAE;QACzH,OAAO,aAAa,CAAC,GAAG,EAAE,mBAAmB,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,CAAA;IAC9D,CAAC,CAAA;AACH,CAAC,EAhEgB,mBAAmB,KAAnB,mBAAmB,QAgEnC"}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import type { HeliaRoutingProgressEvents } from './helia.js';
|
|
2
|
-
import type { DatastoreProgressEvents } from '
|
|
2
|
+
import type { DatastoreProgressEvents } from '../index.js';
|
|
3
3
|
import type { PubSubProgressEvents } from './pubsub.js';
|
|
4
|
+
import type { IPNSPublishMetadata } from '../pb/metadata.ts';
|
|
4
5
|
import type { AbortOptions } from '@libp2p/interface';
|
|
5
6
|
import type { ProgressOptions } from 'progress-events';
|
|
6
7
|
export interface PutOptions extends AbortOptions, ProgressOptions {
|
|
8
|
+
metadata?: IPNSPublishMetadata;
|
|
7
9
|
}
|
|
8
10
|
export interface GetOptions extends AbortOptions, ProgressOptions {
|
|
9
11
|
/**
|
|
@@ -23,5 +25,5 @@ export type { PubSubProgressEvents };
|
|
|
23
25
|
export type IPNSRoutingEvents = DatastoreProgressEvents | HeliaRoutingProgressEvents | PubSubProgressEvents;
|
|
24
26
|
export { helia } from './helia.js';
|
|
25
27
|
export { pubsub } from './pubsub.js';
|
|
26
|
-
export type { PubsubRoutingComponents } from './pubsub.js';
|
|
28
|
+
export type { PubsubRoutingComponents, PubSub, Message, PublishResult, PubSubEvents } from './pubsub.js';
|
|
27
29
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/routing/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAA;AAC5D,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/routing/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAA;AAC5D,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAA;AAC1D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AACvD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AAC5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AACrD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAEtD,MAAM,WAAW,UAAW,SAAQ,YAAY,EAAE,eAAe;IAC/D,QAAQ,CAAC,EAAE,mBAAmB,CAAA;CAC/B;AAED,MAAM,WAAW,UAAW,SAAQ,YAAY,EAAE,eAAe;IAC/D;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,GAAG,CAAC,UAAU,EAAE,UAAU,EAAE,eAAe,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC7F,GAAG,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAAA;CACvE;AAED,YAAY,EAAE,uBAAuB,EAAE,CAAA;AACvC,YAAY,EAAE,0BAA0B,EAAE,CAAA;AAC1C,YAAY,EAAE,oBAAoB,EAAE,CAAA;AAEpC,MAAM,MAAM,iBAAiB,GAC3B,uBAAuB,GACvB,0BAA0B,GAC1B,oBAAoB,CAAA;AAEtB,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAClC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,YAAY,EAAE,uBAAuB,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/routing/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/routing/index.ts"],"names":[],"mappings":"AAkCA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAClC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA"}
|