@libp2p/record 1.0.2 → 1.0.5
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/dist/src/record.d.ts +2 -1
- package/dist/src/record.d.ts.map +1 -1
- package/dist/src/record.js.map +1 -1
- package/dist/src/selectors.d.ts +1 -10
- package/dist/src/selectors.d.ts.map +1 -1
- package/dist/src/selectors.js +4 -4
- package/dist/src/selectors.js.map +1 -1
- package/dist/src/utils.js +1 -1
- package/dist/src/utils.js.map +1 -1
- package/dist/src/validators.d.ts +1 -6
- package/dist/src/validators.d.ts.map +1 -1
- package/dist/src/validators.js +8 -12
- package/dist/src/validators.js.map +1 -1
- package/package.json +4 -4
- package/src/record.ts +2 -1
- package/src/selectors.ts +5 -5
- package/src/utils.ts +1 -1
- package/src/validators.ts +9 -14
package/dist/src/record.d.ts
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
|
+
import type { Codec } from 'protons-runtime';
|
|
1
2
|
export interface Record {
|
|
2
3
|
key: Uint8Array;
|
|
3
4
|
value: Uint8Array;
|
|
4
5
|
timeReceived: string;
|
|
5
6
|
}
|
|
6
7
|
export declare namespace Record {
|
|
7
|
-
const codec: () =>
|
|
8
|
+
const codec: () => Codec<Record>;
|
|
8
9
|
const encode: (obj: Record) => Uint8Array;
|
|
9
10
|
const decode: (buf: Uint8Array) => Record;
|
|
10
11
|
}
|
package/dist/src/record.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"record.d.ts","sourceRoot":"","sources":["../../src/record.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"record.d.ts","sourceRoot":"","sources":["../../src/record.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAA;AAE5C,MAAM,WAAW,MAAM;IACrB,GAAG,EAAE,UAAU,CAAA;IACf,KAAK,EAAE,UAAU,CAAA;IACjB,YAAY,EAAE,MAAM,CAAA;CACrB;AAED,yBAAiB,MAAM,CAAC;IACf,MAAM,KAAK,QAAO,MAAM,MAAM,CAMpC,CAAA;IAEM,MAAM,MAAM,QAAS,MAAM,KAAG,UAEpC,CAAA;IAEM,MAAM,MAAM,QAAS,UAAU,KAAG,MAExC,CAAA;CACF"}
|
package/dist/src/record.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"record.js","sourceRoot":"","sources":["../../src/record.ts"],"names":[],"mappings":"AAAA,kCAAkC;AAClC,oDAAoD;AAEpD,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;
|
|
1
|
+
{"version":3,"file":"record.js","sourceRoot":"","sources":["../../src/record.ts"],"names":[],"mappings":"AAAA,kCAAkC;AAClC,oDAAoD;AAEpD,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAStF,MAAM,KAAW,MAAM,CAgBtB;AAhBD,WAAiB,MAAM;IACR,YAAK,GAAG,GAAkB,EAAE;QACvC,OAAO,OAAO,CAAS;YACrB,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE;YAChC,CAAC,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE;YAClC,CAAC,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,EAAE;SAC3C,CAAC,CAAA;IACJ,CAAC,CAAA;IAEY,aAAM,GAAG,CAAC,GAAW,EAAc,EAAE;QAChD,OAAO,aAAa,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAA;IAC3C,CAAC,CAAA;IAEY,aAAM,GAAG,CAAC,GAAe,EAAU,EAAE;QAChD,OAAO,aAAa,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAA;IAC3C,CAAC,CAAA;AACH,CAAC,EAhBgB,MAAM,KAAN,MAAM,QAgBtB"}
|
package/dist/src/selectors.d.ts
CHANGED
|
@@ -3,14 +3,5 @@ import type { Selectors } from '@libp2p/interfaces/dht';
|
|
|
3
3
|
* Select the best record out of the given records
|
|
4
4
|
*/
|
|
5
5
|
export declare function bestRecord(selectors: Selectors, k: Uint8Array, records: Uint8Array[]): number;
|
|
6
|
-
|
|
7
|
-
* Best record selector, for public key records.
|
|
8
|
-
* Simply returns the first record, as all valid public key
|
|
9
|
-
* records are equal
|
|
10
|
-
*/
|
|
11
|
-
declare function publickKey(k: Uint8Array, records: Uint8Array[]): number;
|
|
12
|
-
export declare const selectors: {
|
|
13
|
-
pk: typeof publickKey;
|
|
14
|
-
};
|
|
15
|
-
export {};
|
|
6
|
+
export declare const selectors: Selectors;
|
|
16
7
|
//# sourceMappingURL=selectors.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"selectors.d.ts","sourceRoot":"","sources":["../../src/selectors.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AAEvD;;GAEG;AACH,wBAAgB,UAAU,CAAE,SAAS,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE,UA6BrF;
|
|
1
|
+
{"version":3,"file":"selectors.d.ts","sourceRoot":"","sources":["../../src/selectors.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AAEvD;;GAEG;AACH,wBAAgB,UAAU,CAAE,SAAS,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE,UA6BrF;AAWD,eAAO,MAAM,SAAS,EAAE,SAEvB,CAAA"}
|
package/dist/src/selectors.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import errCode from 'err-code';
|
|
2
2
|
import { toString as uint8ArrayToString } from 'uint8arrays/to-string';
|
|
3
3
|
/**
|
|
4
4
|
* Select the best record out of the given records
|
|
@@ -6,18 +6,18 @@ import { toString as uint8ArrayToString } from 'uint8arrays/to-string';
|
|
|
6
6
|
export function bestRecord(selectors, k, records) {
|
|
7
7
|
if (records.length === 0) {
|
|
8
8
|
const errMsg = 'No records given';
|
|
9
|
-
throw
|
|
9
|
+
throw errCode(new Error(errMsg), 'ERR_NO_RECORDS_RECEIVED');
|
|
10
10
|
}
|
|
11
11
|
const kStr = uint8ArrayToString(k);
|
|
12
12
|
const parts = kStr.split('/');
|
|
13
13
|
if (parts.length < 3) {
|
|
14
14
|
const errMsg = 'Record key does not have a selector function';
|
|
15
|
-
throw
|
|
15
|
+
throw errCode(new Error(errMsg), 'ERR_NO_SELECTOR_FUNCTION_FOR_RECORD_KEY');
|
|
16
16
|
}
|
|
17
17
|
const selector = selectors[parts[1].toString()];
|
|
18
18
|
if (selector == null) {
|
|
19
19
|
const errMsg = `Unrecognized key prefix: ${parts[1]}`;
|
|
20
|
-
throw
|
|
20
|
+
throw errCode(new Error(errMsg), 'ERR_UNRECOGNIZED_KEY_PREFIX');
|
|
21
21
|
}
|
|
22
22
|
if (records.length === 1) {
|
|
23
23
|
return 0;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"selectors.js","sourceRoot":"","sources":["../../src/selectors.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,UAAU,CAAA;AAC9B,OAAO,EAAE,QAAQ,IAAI,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AAGtE;;GAEG;AACH,MAAM,UAAU,UAAU,CAAE,SAAoB,EAAE,CAAa,EAAE,OAAqB;IACpF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;QACxB,MAAM,MAAM,GAAG,kBAAkB,CAAA;QAEjC,MAAM,OAAO,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,EAAE,yBAAyB,CAAC,CAAA;KAC5D;IAED,MAAM,IAAI,GAAG,kBAAkB,CAAC,CAAC,CAAC,CAAA;IAClC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAE7B,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;QACpB,MAAM,MAAM,GAAG,8CAA8C,CAAA;QAE7D,MAAM,OAAO,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,EAAE,yCAAyC,CAAC,CAAA;KAC5E;IAED,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAA;IAE/C,IAAI,QAAQ,IAAI,IAAI,EAAE;QACpB,MAAM,MAAM,GAAG,4BAA4B,KAAK,CAAC,CAAC,CAAC,EAAE,CAAA;QAErD,MAAM,OAAO,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,EAAE,6BAA6B,CAAC,CAAA;KAChE;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;QACxB,OAAO,CAAC,CAAA;KACT;IAED,OAAO,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC,CAAA;AAC7B,CAAC;AAED;;;;GAIG;AACH,SAAS,UAAU,CAAE,CAAa,EAAE,OAAqB;IACvD,OAAO,CAAC,CAAA;AACV,CAAC;AAED,MAAM,CAAC,MAAM,SAAS,
|
|
1
|
+
{"version":3,"file":"selectors.js","sourceRoot":"","sources":["../../src/selectors.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,UAAU,CAAA;AAC9B,OAAO,EAAE,QAAQ,IAAI,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AAGtE;;GAEG;AACH,MAAM,UAAU,UAAU,CAAE,SAAoB,EAAE,CAAa,EAAE,OAAqB;IACpF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;QACxB,MAAM,MAAM,GAAG,kBAAkB,CAAA;QAEjC,MAAM,OAAO,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,EAAE,yBAAyB,CAAC,CAAA;KAC5D;IAED,MAAM,IAAI,GAAG,kBAAkB,CAAC,CAAC,CAAC,CAAA;IAClC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAE7B,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;QACpB,MAAM,MAAM,GAAG,8CAA8C,CAAA;QAE7D,MAAM,OAAO,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,EAAE,yCAAyC,CAAC,CAAA;KAC5E;IAED,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAA;IAE/C,IAAI,QAAQ,IAAI,IAAI,EAAE;QACpB,MAAM,MAAM,GAAG,4BAA4B,KAAK,CAAC,CAAC,CAAC,EAAE,CAAA;QAErD,MAAM,OAAO,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,EAAE,6BAA6B,CAAC,CAAA;KAChE;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;QACxB,OAAO,CAAC,CAAA;KACT;IAED,OAAO,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC,CAAA;AAC7B,CAAC;AAED;;;;GAIG;AACH,SAAS,UAAU,CAAE,CAAa,EAAE,OAAqB;IACvD,OAAO,CAAC,CAAA;AACV,CAAC;AAED,MAAM,CAAC,MAAM,SAAS,GAAc;IAClC,EAAE,EAAE,UAAU;CACf,CAAA"}
|
package/dist/src/utils.js
CHANGED
|
@@ -10,7 +10,7 @@ export function toRFC3339(time) {
|
|
|
10
10
|
const minute = String(time.getUTCMinutes()).padStart(2, '0');
|
|
11
11
|
const seconds = String(time.getUTCSeconds()).padStart(2, '0');
|
|
12
12
|
const milliseconds = time.getUTCMilliseconds();
|
|
13
|
-
const nanoseconds = milliseconds * 1000 * 1000;
|
|
13
|
+
const nanoseconds = String(milliseconds * 1000 * 1000).padStart(9, '0');
|
|
14
14
|
return `${year}-${month}-${day}T${hour}:${minute}:${seconds}.${nanoseconds}Z`;
|
|
15
15
|
}
|
|
16
16
|
/**
|
package/dist/src/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAE,IAAU;IACnC,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,EAAE,CAAA;IAClC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;IAC7D,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;IACtD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;IACxD,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;IAC5D,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;IAC7D,MAAM,YAAY,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAA;IAC9C,MAAM,WAAW,GAAG,YAAY,GAAG,IAAI,GAAG,IAAI,CAAA;
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAE,IAAU;IACnC,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,EAAE,CAAA;IAClC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;IAC7D,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;IACtD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;IACxD,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;IAC5D,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;IAC7D,MAAM,YAAY,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAA;IAC9C,MAAM,WAAW,GAAG,MAAM,CAAC,YAAY,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;IAEvE,OAAO,GAAG,IAAI,IAAI,KAAK,IAAI,GAAG,IAAI,IAAI,IAAI,MAAM,IAAI,OAAO,IAAI,WAAW,GAAG,CAAA;AAC/E,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAE,IAAY;IACxC,MAAM,cAAc,GAAG,IAAI,MAAM;IAC/B,cAAc;IACd,6BAA6B;QAC7B,WAAW;QACX,4BAA4B;QAC5B,cAAc;QACd,YAAY,CACb,CAAA;IACD,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,CAAA;IAEnD,IAAI,CAAC,IAAI,IAAI,EAAE;QACb,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAA;KAClC;IAED,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;IAC/B,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAA;IACpC,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;IAC/B,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;IAC/B,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;IACjC,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;IACjC,MAAM,WAAW,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;IAEnD,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,CAAA;AACjF,CAAC"}
|
package/dist/src/validators.d.ts
CHANGED
|
@@ -6,10 +6,5 @@ import type { Validators } from '@libp2p/interfaces/dht';
|
|
|
6
6
|
* If verification fails the returned Promise will reject with the error.
|
|
7
7
|
*/
|
|
8
8
|
export declare function verifyRecord(validators: Validators, record: Libp2pRecord): Promise<void> | undefined;
|
|
9
|
-
export declare const validators:
|
|
10
|
-
pk: {
|
|
11
|
-
func: (key: Uint8Array, publicKey: Uint8Array) => Promise<void>;
|
|
12
|
-
sign: boolean;
|
|
13
|
-
};
|
|
14
|
-
};
|
|
9
|
+
export declare const validators: Validators;
|
|
15
10
|
//# sourceMappingURL=validators.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../../src/validators.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAC9C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAIxD;;;;GAIG;AACH,wBAAgB,YAAY,CAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,YAAY,6BAmBzE;
|
|
1
|
+
{"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../../src/validators.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAC9C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAIxD;;;;GAIG;AACH,wBAAgB,YAAY,CAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,YAAY,6BAmBzE;AAmCD,eAAO,MAAM,UAAU,EAAE,UAExB,CAAA"}
|
package/dist/src/validators.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import errCode from 'err-code';
|
|
2
2
|
import { toString as uint8ArrayToString } from 'uint8arrays/to-string';
|
|
3
3
|
import { sha256 } from 'multiformats/hashes/sha2';
|
|
4
4
|
import { equals as uint8ArrayEquals } from 'uint8arrays/equals';
|
|
@@ -18,9 +18,9 @@ export function verifyRecord(validators, record) {
|
|
|
18
18
|
const validator = validators[parts[1].toString()];
|
|
19
19
|
if (validator == null) {
|
|
20
20
|
const errMsg = 'Invalid record keytype';
|
|
21
|
-
throw
|
|
21
|
+
throw errCode(new Error(errMsg), 'ERR_INVALID_RECORD_KEY_TYPE');
|
|
22
22
|
}
|
|
23
|
-
return validator
|
|
23
|
+
return validator(key, record.value);
|
|
24
24
|
}
|
|
25
25
|
/**
|
|
26
26
|
* Validator for public key records.
|
|
@@ -33,26 +33,22 @@ export function verifyRecord(validators, record) {
|
|
|
33
33
|
*/
|
|
34
34
|
const validatePublicKeyRecord = async (key, publicKey) => {
|
|
35
35
|
if (!(key instanceof Uint8Array)) {
|
|
36
|
-
throw
|
|
36
|
+
throw errCode(new Error('"key" must be a Uint8Array'), 'ERR_INVALID_RECORD_KEY_NOT_BUFFER');
|
|
37
37
|
}
|
|
38
38
|
if (key.byteLength < 5) {
|
|
39
|
-
throw
|
|
39
|
+
throw errCode(new Error('invalid public key record'), 'ERR_INVALID_RECORD_KEY_TOO_SHORT');
|
|
40
40
|
}
|
|
41
41
|
const prefix = uint8ArrayToString(key.subarray(0, 4));
|
|
42
42
|
if (prefix !== '/pk/') {
|
|
43
|
-
throw
|
|
43
|
+
throw errCode(new Error('key was not prefixed with /pk/'), 'ERR_INVALID_RECORD_KEY_BAD_PREFIX');
|
|
44
44
|
}
|
|
45
45
|
const keyhash = key.slice(4);
|
|
46
46
|
const publicKeyHash = await sha256.digest(publicKey);
|
|
47
47
|
if (!uint8ArrayEquals(keyhash, publicKeyHash.bytes)) {
|
|
48
|
-
throw
|
|
48
|
+
throw errCode(new Error('public key does not match passed in key'), 'ERR_INVALID_RECORD_HASH_MISMATCH');
|
|
49
49
|
}
|
|
50
50
|
};
|
|
51
|
-
const publicKey = {
|
|
52
|
-
func: validatePublicKeyRecord,
|
|
53
|
-
sign: false
|
|
54
|
-
};
|
|
55
51
|
export const validators = {
|
|
56
|
-
pk:
|
|
52
|
+
pk: validatePublicKeyRecord
|
|
57
53
|
};
|
|
58
54
|
//# sourceMappingURL=validators.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validators.js","sourceRoot":"","sources":["../../src/validators.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,UAAU,CAAA;AAC9B,OAAO,EAAE,QAAQ,IAAI,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AAGtE,OAAO,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAA;AACjD,OAAO,EAAE,MAAM,IAAI,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AAE/D;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAE,UAAsB,EAAE,MAAoB;IACxE,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAA;IACtB,MAAM,SAAS,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAA;IACzC,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAElC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;QACpB,yBAAyB;QACzB,OAAM;KACP;IAED,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAA;IAEjD,IAAI,SAAS,IAAI,IAAI,EAAE;QACrB,MAAM,MAAM,GAAG,wBAAwB,CAAA;QAEvC,MAAM,OAAO,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,EAAE,6BAA6B,CAAC,CAAA;KAChE;IAED,OAAO,SAAS,CAAC,
|
|
1
|
+
{"version":3,"file":"validators.js","sourceRoot":"","sources":["../../src/validators.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,UAAU,CAAA;AAC9B,OAAO,EAAE,QAAQ,IAAI,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AAGtE,OAAO,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAA;AACjD,OAAO,EAAE,MAAM,IAAI,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AAE/D;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAE,UAAsB,EAAE,MAAoB;IACxE,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAA;IACtB,MAAM,SAAS,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAA;IACzC,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAElC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;QACpB,yBAAyB;QACzB,OAAM;KACP;IAED,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAA;IAEjD,IAAI,SAAS,IAAI,IAAI,EAAE;QACrB,MAAM,MAAM,GAAG,wBAAwB,CAAA;QAEvC,MAAM,OAAO,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,EAAE,6BAA6B,CAAC,CAAA;KAChE;IAED,OAAO,SAAS,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAA;AACrC,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,uBAAuB,GAAG,KAAK,EAAE,GAAe,EAAE,SAAqB,EAAE,EAAE;IAC/E,IAAI,CAAC,CAAC,GAAG,YAAY,UAAU,CAAC,EAAE;QAChC,MAAM,OAAO,CAAC,IAAI,KAAK,CAAC,4BAA4B,CAAC,EAAE,mCAAmC,CAAC,CAAA;KAC5F;IAED,IAAI,GAAG,CAAC,UAAU,GAAG,CAAC,EAAE;QACtB,MAAM,OAAO,CAAC,IAAI,KAAK,CAAC,2BAA2B,CAAC,EAAE,kCAAkC,CAAC,CAAA;KAC1F;IAED,MAAM,MAAM,GAAG,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;IAErD,IAAI,MAAM,KAAK,MAAM,EAAE;QACrB,MAAM,OAAO,CAAC,IAAI,KAAK,CAAC,gCAAgC,CAAC,EAAE,mCAAmC,CAAC,CAAA;KAChG;IAED,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IAE5B,MAAM,aAAa,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;IAEpD,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,aAAa,CAAC,KAAK,CAAC,EAAE;QACnD,MAAM,OAAO,CAAC,IAAI,KAAK,CAAC,yCAAyC,CAAC,EAAE,kCAAkC,CAAC,CAAA;KACxG;AACH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,UAAU,GAAe;IACpC,EAAE,EAAE,uBAAuB;CAC5B,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@libp2p/record",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.5",
|
|
4
4
|
"description": "libp2p record implementation",
|
|
5
5
|
"author": "Friedel Ziegelmayer <dignifiedquire@gmail.com>",
|
|
6
6
|
"license": "Apache-2.0 OR MIT",
|
|
@@ -159,15 +159,15 @@
|
|
|
159
159
|
"release": "aegir release"
|
|
160
160
|
},
|
|
161
161
|
"dependencies": {
|
|
162
|
+
"@libp2p/interfaces": "^2.0.2",
|
|
162
163
|
"err-code": "^3.0.1",
|
|
163
164
|
"multiformats": "^9.4.5",
|
|
164
165
|
"protons-runtime": "^1.0.2",
|
|
165
166
|
"uint8arrays": "^3.0.0"
|
|
166
167
|
},
|
|
167
168
|
"devDependencies": {
|
|
168
|
-
"@libp2p/crypto": "^0.22.
|
|
169
|
-
"
|
|
170
|
-
"aegir": "^37.0.10",
|
|
169
|
+
"@libp2p/crypto": "^0.22.10",
|
|
170
|
+
"aegir": "^37.0.13",
|
|
171
171
|
"protons": "^3.0.2"
|
|
172
172
|
}
|
|
173
173
|
}
|
package/src/record.ts
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
/* eslint-disable @typescript-eslint/no-namespace */
|
|
3
3
|
|
|
4
4
|
import { encodeMessage, decodeMessage, message, bytes, string } from 'protons-runtime'
|
|
5
|
+
import type { Codec } from 'protons-runtime'
|
|
5
6
|
|
|
6
7
|
export interface Record {
|
|
7
8
|
key: Uint8Array
|
|
@@ -10,7 +11,7 @@ export interface Record {
|
|
|
10
11
|
}
|
|
11
12
|
|
|
12
13
|
export namespace Record {
|
|
13
|
-
export const codec = () => {
|
|
14
|
+
export const codec = (): Codec<Record> => {
|
|
14
15
|
return message<Record>({
|
|
15
16
|
1: { name: 'key', codec: bytes },
|
|
16
17
|
2: { name: 'value', codec: bytes },
|
package/src/selectors.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import errCode from 'err-code'
|
|
2
2
|
import { toString as uint8ArrayToString } from 'uint8arrays/to-string'
|
|
3
3
|
import type { Selectors } from '@libp2p/interfaces/dht'
|
|
4
4
|
|
|
@@ -9,7 +9,7 @@ export function bestRecord (selectors: Selectors, k: Uint8Array, records: Uint8A
|
|
|
9
9
|
if (records.length === 0) {
|
|
10
10
|
const errMsg = 'No records given'
|
|
11
11
|
|
|
12
|
-
throw
|
|
12
|
+
throw errCode(new Error(errMsg), 'ERR_NO_RECORDS_RECEIVED')
|
|
13
13
|
}
|
|
14
14
|
|
|
15
15
|
const kStr = uint8ArrayToString(k)
|
|
@@ -18,7 +18,7 @@ export function bestRecord (selectors: Selectors, k: Uint8Array, records: Uint8A
|
|
|
18
18
|
if (parts.length < 3) {
|
|
19
19
|
const errMsg = 'Record key does not have a selector function'
|
|
20
20
|
|
|
21
|
-
throw
|
|
21
|
+
throw errCode(new Error(errMsg), 'ERR_NO_SELECTOR_FUNCTION_FOR_RECORD_KEY')
|
|
22
22
|
}
|
|
23
23
|
|
|
24
24
|
const selector = selectors[parts[1].toString()]
|
|
@@ -26,7 +26,7 @@ export function bestRecord (selectors: Selectors, k: Uint8Array, records: Uint8A
|
|
|
26
26
|
if (selector == null) {
|
|
27
27
|
const errMsg = `Unrecognized key prefix: ${parts[1]}`
|
|
28
28
|
|
|
29
|
-
throw
|
|
29
|
+
throw errCode(new Error(errMsg), 'ERR_UNRECOGNIZED_KEY_PREFIX')
|
|
30
30
|
}
|
|
31
31
|
|
|
32
32
|
if (records.length === 1) {
|
|
@@ -45,6 +45,6 @@ function publickKey (k: Uint8Array, records: Uint8Array[]) {
|
|
|
45
45
|
return 0
|
|
46
46
|
}
|
|
47
47
|
|
|
48
|
-
export const selectors = {
|
|
48
|
+
export const selectors: Selectors = {
|
|
49
49
|
pk: publickKey
|
|
50
50
|
}
|
package/src/utils.ts
CHANGED
|
@@ -10,7 +10,7 @@ export function toRFC3339 (time: Date) {
|
|
|
10
10
|
const minute = String(time.getUTCMinutes()).padStart(2, '0')
|
|
11
11
|
const seconds = String(time.getUTCSeconds()).padStart(2, '0')
|
|
12
12
|
const milliseconds = time.getUTCMilliseconds()
|
|
13
|
-
const nanoseconds = milliseconds * 1000 * 1000
|
|
13
|
+
const nanoseconds = String(milliseconds * 1000 * 1000).padStart(9, '0')
|
|
14
14
|
|
|
15
15
|
return `${year}-${month}-${day}T${hour}:${minute}:${seconds}.${nanoseconds}Z`
|
|
16
16
|
}
|
package/src/validators.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import errCode from 'err-code'
|
|
2
2
|
import { toString as uint8ArrayToString } from 'uint8arrays/to-string'
|
|
3
3
|
import type { Libp2pRecord } from './index.js'
|
|
4
4
|
import type { Validators } from '@libp2p/interfaces/dht'
|
|
@@ -25,10 +25,10 @@ export function verifyRecord (validators: Validators, record: Libp2pRecord) {
|
|
|
25
25
|
if (validator == null) {
|
|
26
26
|
const errMsg = 'Invalid record keytype'
|
|
27
27
|
|
|
28
|
-
throw
|
|
28
|
+
throw errCode(new Error(errMsg), 'ERR_INVALID_RECORD_KEY_TYPE')
|
|
29
29
|
}
|
|
30
30
|
|
|
31
|
-
return validator
|
|
31
|
+
return validator(key, record.value)
|
|
32
32
|
}
|
|
33
33
|
|
|
34
34
|
/**
|
|
@@ -42,17 +42,17 @@ export function verifyRecord (validators: Validators, record: Libp2pRecord) {
|
|
|
42
42
|
*/
|
|
43
43
|
const validatePublicKeyRecord = async (key: Uint8Array, publicKey: Uint8Array) => {
|
|
44
44
|
if (!(key instanceof Uint8Array)) {
|
|
45
|
-
throw
|
|
45
|
+
throw errCode(new Error('"key" must be a Uint8Array'), 'ERR_INVALID_RECORD_KEY_NOT_BUFFER')
|
|
46
46
|
}
|
|
47
47
|
|
|
48
48
|
if (key.byteLength < 5) {
|
|
49
|
-
throw
|
|
49
|
+
throw errCode(new Error('invalid public key record'), 'ERR_INVALID_RECORD_KEY_TOO_SHORT')
|
|
50
50
|
}
|
|
51
51
|
|
|
52
52
|
const prefix = uint8ArrayToString(key.subarray(0, 4))
|
|
53
53
|
|
|
54
54
|
if (prefix !== '/pk/') {
|
|
55
|
-
throw
|
|
55
|
+
throw errCode(new Error('key was not prefixed with /pk/'), 'ERR_INVALID_RECORD_KEY_BAD_PREFIX')
|
|
56
56
|
}
|
|
57
57
|
|
|
58
58
|
const keyhash = key.slice(4)
|
|
@@ -60,15 +60,10 @@ const validatePublicKeyRecord = async (key: Uint8Array, publicKey: Uint8Array) =
|
|
|
60
60
|
const publicKeyHash = await sha256.digest(publicKey)
|
|
61
61
|
|
|
62
62
|
if (!uint8ArrayEquals(keyhash, publicKeyHash.bytes)) {
|
|
63
|
-
throw
|
|
63
|
+
throw errCode(new Error('public key does not match passed in key'), 'ERR_INVALID_RECORD_HASH_MISMATCH')
|
|
64
64
|
}
|
|
65
65
|
}
|
|
66
66
|
|
|
67
|
-
const
|
|
68
|
-
|
|
69
|
-
sign: false
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
export const validators = {
|
|
73
|
-
pk: publicKey
|
|
67
|
+
export const validators: Validators = {
|
|
68
|
+
pk: validatePublicKeyRecord
|
|
74
69
|
}
|