@atproto/common-web 0.3.0 → 0.3.2
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/CHANGELOG.md +18 -0
- package/dist/arrays.d.ts.map +1 -1
- package/dist/arrays.js.map +1 -1
- package/dist/async.d.ts +16 -2
- package/dist/async.d.ts.map +1 -1
- package/dist/async.js +31 -9
- package/dist/async.js.map +1 -1
- package/dist/check.d.ts +2 -2
- package/dist/check.d.ts.map +1 -1
- package/dist/check.js +5 -1
- package/dist/check.js.map +1 -1
- package/dist/did-doc.d.ts +5 -19
- package/dist/did-doc.d.ts.map +1 -1
- package/dist/did-doc.js +58 -43
- package/dist/did-doc.js.map +1 -1
- package/dist/retry.d.ts +4 -2
- package/dist/retry.d.ts.map +1 -1
- package/dist/retry.js +6 -3
- package/dist/retry.js.map +1 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/util.d.ts +5 -1
- package/dist/util.d.ts.map +1 -1
- package/dist/util.js +15 -0
- package/dist/util.js.map +1 -1
- package/package.json +4 -3
- package/src/arrays.ts +7 -4
- package/src/async.ts +58 -7
- package/src/check.ts +8 -2
- package/src/did-doc.ts +83 -39
- package/src/retry.ts +8 -2
- package/src/util.ts +30 -0
- package/tsconfig.build.tsbuildinfo +1 -0
- package/tsconfig.tests.tsbuildinfo +1 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,23 @@
|
|
|
1
1
|
# @atproto/common-web
|
|
2
2
|
|
|
3
|
+
## 0.3.2
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [#3177](https://github.com/bluesky-social/atproto/pull/3177) [`72eba67af`](https://github.com/bluesky-social/atproto/commit/72eba67af1af8320b5400bcb9319d5c3c8407d99) Thanks [@matthieusieben](https://github.com/matthieusieben)! - Add `createRetryable` utility function
|
|
8
|
+
|
|
9
|
+
- [#3177](https://github.com/bluesky-social/atproto/pull/3177) [`72eba67af`](https://github.com/bluesky-social/atproto/commit/72eba67af1af8320b5400bcb9319d5c3c8407d99) Thanks [@matthieusieben](https://github.com/matthieusieben)! - Add `allFulfilled` utility
|
|
10
|
+
|
|
11
|
+
## 0.3.1
|
|
12
|
+
|
|
13
|
+
### Patch Changes
|
|
14
|
+
|
|
15
|
+
- [#2770](https://github.com/bluesky-social/atproto/pull/2770) [`a07b21151`](https://github.com/bluesky-social/atproto/commit/a07b21151f1850340c4b7797ebb11521b1a6cdf3) Thanks [@matthieusieben](https://github.com/matthieusieben)! - Add omit() utility
|
|
16
|
+
|
|
17
|
+
- [#2770](https://github.com/bluesky-social/atproto/pull/2770) [`a07b21151`](https://github.com/bluesky-social/atproto/commit/a07b21151f1850340c4b7797ebb11521b1a6cdf3) Thanks [@matthieusieben](https://github.com/matthieusieben)! - DID document parsing optimization
|
|
18
|
+
|
|
19
|
+
- [#2835](https://github.com/bluesky-social/atproto/pull/2835) [`eb20ff64a`](https://github.com/bluesky-social/atproto/commit/eb20ff64a2d8e3061c652e1e247bf9b0fe3c41a6) Thanks [@matthieusieben](https://github.com/matthieusieben)! - ponyfill URL.canParse
|
|
20
|
+
|
|
3
21
|
## 0.3.0
|
|
4
22
|
|
|
5
23
|
### Minor Changes
|
package/dist/arrays.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"arrays.d.ts","sourceRoot":"","sources":["../src/arrays.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,KAAK,
|
|
1
|
+
{"version":3,"file":"arrays.d.ts","sourceRoot":"","sources":["../src/arrays.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,KAAK,GAAI,CAAC,OAAO,CAAC,EAAE,OAAO,MAAM,KAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAQhE,CAAA;AAED,eAAO,MAAM,UAAU,GAAI,CAAC,EAAE,CAAC,OACxB,CAAC,EAAE,MACJ,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,SAAS,KAC5B,CAAC,EASH,CAAA"}
|
package/dist/arrays.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"arrays.js","sourceRoot":"","sources":["../src/arrays.ts"],"names":[],"mappings":";;;AAAO,MAAM,KAAK,GAAG,CAAI,GAAQ,EAAE,GAAW,EAAqB,EAAE;IACnE,OAAO,GAAG,CAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"arrays.js","sourceRoot":"","sources":["../src/arrays.ts"],"names":[],"mappings":";;;AAAO,MAAM,KAAK,GAAG,CAAI,GAAQ,EAAE,GAAW,EAAqB,EAAE;IACnE,OAAO,GAAG,CAAC,MAAM,CACf,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QACX,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAA;QACnB,OAAO,GAAG,CAAA;IACZ,CAAC,EACD,EAAuB,CACxB,CAAA;AACH,CAAC,CAAA;AARY,QAAA,KAAK,SAQjB;AAEM,MAAM,UAAU,GAAG,CACxB,GAAQ,EACR,EAA6B,EACxB,EAAE;IACP,MAAM,MAAM,GAAQ,EAAE,CAAA;IACtB,KAAK,MAAM,IAAI,IAAI,GAAG,EAAE,CAAC;QACvB,MAAM,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,CAAA;QACpB,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAClB,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC,CAAA;AAZY,QAAA,UAAU,cAYtB"}
|
package/dist/async.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export declare const readFromGenerator: <T>(gen: AsyncGenerator<T
|
|
1
|
+
export declare const readFromGenerator: <T>(gen: AsyncGenerator<T>, isDone: (last?: T) => Promise<boolean> | boolean, waitFor?: Promise<unknown>, maxLength?: number) => Promise<T[]>;
|
|
2
2
|
export type Deferrable = {
|
|
3
3
|
resolve: () => void;
|
|
4
4
|
complete: Promise<void>;
|
|
@@ -27,5 +27,19 @@ export declare class AsyncBuffer<T> {
|
|
|
27
27
|
export declare class AsyncBufferFullError extends Error {
|
|
28
28
|
constructor(maxSize: number);
|
|
29
29
|
}
|
|
30
|
-
|
|
30
|
+
/**
|
|
31
|
+
* Utility function that behaves like {@link Promise.allSettled} but returns the
|
|
32
|
+
* same result as {@link Promise.all} in case every promise is fulfilled, and
|
|
33
|
+
* throws an {@link AggregateError} if there are more than one errors.
|
|
34
|
+
*/
|
|
35
|
+
export declare function allFulfilled<T extends readonly unknown[] | []>(promises: T): Promise<{
|
|
36
|
+
-readonly [P in keyof T]: Awaited<T[P]>;
|
|
37
|
+
}>;
|
|
38
|
+
export declare function allFulfilled<T>(promises: Iterable<T | PromiseLike<T>>): Promise<Awaited<T>[]>;
|
|
39
|
+
export declare function handleAllSettledErrors<T extends readonly PromiseSettledResult<unknown>[] | []>(results: T): {
|
|
40
|
+
-readonly [P in keyof T]: T[P] extends PromiseSettledResult<infer U> ? U : never;
|
|
41
|
+
};
|
|
42
|
+
export declare function handleAllSettledErrors<T>(results: PromiseSettledResult<T>[]): T[];
|
|
43
|
+
export declare function isRejectedResult(result: PromiseSettledResult<unknown>): result is PromiseRejectedResult;
|
|
44
|
+
export declare function isFulfilledResult<T>(result: PromiseSettledResult<T>): result is PromiseFulfilledResult<T>;
|
|
31
45
|
//# sourceMappingURL=async.d.ts.map
|
package/dist/async.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"async.d.ts","sourceRoot":"","sources":["../src/async.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,iBAAiB,
|
|
1
|
+
{"version":3,"file":"async.d.ts","sourceRoot":"","sources":["../src/async.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,iBAAiB,GAAU,CAAC,OAClC,cAAc,CAAC,CAAC,CAAC,UACd,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,YACvC,OAAO,CAAC,OAAO,CAAC,yBAExB,OAAO,CAAC,CAAC,EAAE,CAiCb,CAAA;AAED,MAAM,MAAM,UAAU,GAAG;IACvB,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;CACxB,CAAA;AAED,eAAO,MAAM,gBAAgB,QAAO,UAMnC,CAAA;AAED,eAAO,MAAM,iBAAiB,UAAW,MAAM,KAAG,UAAU,EAM3D,CAAA;AAED,eAAO,MAAM,WAAW,gBAAuB,UAAU,EAAE,KAAG,OAAO,CAAC,IAAI,CAEzE,CAAA;AAED,qBAAa,WAAW,CAAC,CAAC;IAOL,OAAO,CAAC,EAAE,MAAM;IANnC,OAAO,CAAC,MAAM,CAAU;IACxB,OAAO,CAAC,OAAO,CAAe;IAC9B,OAAO,CAAC,OAAO,CAAY;IAC3B,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,OAAO,CAAqB;gBAEjB,OAAO,CAAC,EAAE,MAAM,YAAA;IAOnC,IAAI,IAAI,IAAI,CAAC,EAAE,CAEd;IAED,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED,YAAY;IAIZ,IAAI,CAAC,IAAI,EAAE,CAAC;IAKZ,QAAQ,CAAC,KAAK,EAAE,CAAC,EAAE;IAKZ,MAAM,IAAI,cAAc,CAAC,CAAC,CAAC;IA0BlC,KAAK,CAAC,GAAG,EAAE,OAAO;IAMlB,KAAK;CAIN;AAED,qBAAa,oBAAqB,SAAQ,KAAK;gBACjC,OAAO,EAAE,MAAM;CAG5B;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,CAAC,SAAS,SAAS,OAAO,EAAE,GAAG,EAAE,EAC5D,QAAQ,EAAE,CAAC,GACV,OAAO,CAAC;IAAE,CAAC,UAAU,CAAC,IAAI,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAAE,CAAC,CAAA;AACvD,wBAAgB,YAAY,CAAC,CAAC,EAC5B,QAAQ,EAAE,QAAQ,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,GACrC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;AAOxB,wBAAgB,sBAAsB,CACpC,CAAC,SAAS,SAAS,oBAAoB,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,EAEvD,OAAO,EAAE,CAAC,GACT;IACD,CAAC,UAAU,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,oBAAoB,CAAC,MAAM,CAAC,CAAC,GAChE,CAAC,GACD,KAAK;CACV,CAAA;AACD,wBAAgB,sBAAsB,CAAC,CAAC,EACtC,OAAO,EAAE,oBAAoB,CAAC,CAAC,CAAC,EAAE,GACjC,CAAC,EAAE,CAAA;AAkBN,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,oBAAoB,CAAC,OAAO,CAAC,GACpC,MAAM,IAAI,qBAAqB,CAEjC;AAMD,wBAAgB,iBAAiB,CAAC,CAAC,EACjC,MAAM,EAAE,oBAAoB,CAAC,CAAC,CAAC,GAC9B,MAAM,IAAI,sBAAsB,CAAC,CAAC,CAAC,CAErC"}
|
package/dist/async.js
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.AsyncBufferFullError = exports.AsyncBuffer = exports.allComplete = exports.createDeferrables = exports.createDeferrable = exports.readFromGenerator = void 0;
|
|
4
|
+
exports.allFulfilled = allFulfilled;
|
|
5
|
+
exports.handleAllSettledErrors = handleAllSettledErrors;
|
|
6
|
+
exports.isRejectedResult = isRejectedResult;
|
|
7
|
+
exports.isFulfilledResult = isFulfilledResult;
|
|
4
8
|
const util_1 = require("./util");
|
|
5
9
|
// reads values from a generator into a list
|
|
6
10
|
// breaks when isDone signals `true` AND `waitFor` completes OR when a max length is reached
|
|
@@ -170,18 +174,36 @@ class AsyncBufferFullError extends Error {
|
|
|
170
174
|
}
|
|
171
175
|
}
|
|
172
176
|
exports.AsyncBufferFullError = AsyncBufferFullError;
|
|
173
|
-
|
|
174
|
-
|
|
177
|
+
function allFulfilled(promises) {
|
|
178
|
+
return Promise.allSettled(promises).then(handleAllSettledErrors);
|
|
179
|
+
}
|
|
180
|
+
function handleAllSettledErrors(results) {
|
|
181
|
+
const errors = results.filter(isRejectedResult).map(extractReason);
|
|
175
182
|
if (errors.length === 0) {
|
|
176
|
-
|
|
183
|
+
// No need to filter here, it is safe to assume that all promises are fulfilled
|
|
184
|
+
return results.map(extractValue);
|
|
177
185
|
}
|
|
178
186
|
if (errors.length === 1) {
|
|
179
187
|
throw errors[0];
|
|
180
188
|
}
|
|
181
|
-
throw new AggregateError(errors,
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
const isRejected = (result) => {
|
|
189
|
+
throw new AggregateError(errors, `Multiple errors: ${errors.map(stringifyReason).join('\n')}`);
|
|
190
|
+
}
|
|
191
|
+
function isRejectedResult(result) {
|
|
185
192
|
return result.status === 'rejected';
|
|
186
|
-
}
|
|
193
|
+
}
|
|
194
|
+
function extractReason(result) {
|
|
195
|
+
return result.reason;
|
|
196
|
+
}
|
|
197
|
+
function isFulfilledResult(result) {
|
|
198
|
+
return result.status === 'fulfilled';
|
|
199
|
+
}
|
|
200
|
+
function extractValue(result) {
|
|
201
|
+
return result.value;
|
|
202
|
+
}
|
|
203
|
+
function stringifyReason(reason) {
|
|
204
|
+
if (reason instanceof Error) {
|
|
205
|
+
return reason.message;
|
|
206
|
+
}
|
|
207
|
+
return String(reason);
|
|
208
|
+
}
|
|
187
209
|
//# sourceMappingURL=async.js.map
|
package/dist/async.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"async.js","sourceRoot":"","sources":["../src/async.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"async.js","sourceRoot":"","sources":["../src/async.ts"],"names":[],"mappings":";;;AAqKA,oCAIC;AAcD,wDAeC;AAED,4CAIC;AAMD,8CAIC;AAtND,iCAAqC;AAErC,4CAA4C;AAC5C,4FAA4F;AAC5F,iFAAiF;AAC1E,MAAM,iBAAiB,GAAG,KAAK,EACpC,GAAsB,EACtB,MAAgD,EAChD,UAA4B,OAAO,CAAC,OAAO,EAAE,EAC7C,SAAS,GAAG,MAAM,CAAC,gBAAgB,EACrB,EAAE;IAChB,MAAM,IAAI,GAAQ,EAAE,CAAA;IACpB,IAAI,IAA8B,CAAA;IAClC,IAAI,QAAQ,GAAG,KAAK,CAAA;IACpB,MAAM,SAAS,GAAG,KAAK,IAAI,EAAE;QAC3B,IAAI,MAAM,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9B,OAAO,IAAI,CAAA;QACb,CAAC;QACD,MAAM,QAAQ,GAAG,IAAA,mBAAY,EAAC,EAAE,CAAC,CAAA;QACjC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;QACrB,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAA;QACpB,IAAI,QAAQ;YAAE,OAAO,KAAK,CAAA;QAC1B,OAAO,MAAM,SAAS,EAAE,CAAA;IAC1B,CAAC,CAAA;IACD,MAAM,OAAO,GAAkB,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QACrD,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE;YAChB,SAAS,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAA;QACnC,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,MAAM,GAAG,SAAS,EAAE,CAAC;YAC/B,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,OAAO,CAAC,CAAC,CAAA;YAC1D,IAAI,CAAC,QAAQ;gBAAE,MAAK;YACpB,MAAM,GAAG,GAAG,QAA6B,CAAA;YACzC,IAAI,GAAG,CAAC,IAAI;gBAAE,MAAK;YACnB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;QACtB,CAAC;IACH,CAAC;YAAS,CAAC;QACT,QAAQ,GAAG,IAAI,CAAA;QACf,IAAI,IAAI,IAAI,EAAE,CAAA;IAChB,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AAtCY,QAAA,iBAAiB,qBAsC7B;AAOM,MAAM,gBAAgB,GAAG,GAAe,EAAE;IAC/C,IAAI,OAAO,CAAA;IACX,MAAM,OAAO,GAAkB,IAAI,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;QACjD,OAAO,GAAG,GAAG,EAAE,CAAC,GAAG,EAAE,CAAA;IACvB,CAAC,CAAC,CAAA;IACF,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAA;AACvC,CAAC,CAAA;AANY,QAAA,gBAAgB,oBAM5B;AAEM,MAAM,iBAAiB,GAAG,CAAC,KAAa,EAAgB,EAAE;IAC/D,MAAM,IAAI,GAAiB,EAAE,CAAA;IAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/B,IAAI,CAAC,IAAI,CAAC,IAAA,wBAAgB,GAAE,CAAC,CAAA;IAC/B,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AANY,QAAA,iBAAiB,qBAM7B;AAEM,MAAM,WAAW,GAAG,KAAK,EAAE,WAAyB,EAAiB,EAAE;IAC5E,MAAM,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAA;AACvD,CAAC,CAAA;AAFY,QAAA,WAAW,eAEvB;AAED,MAAa,WAAW;IAOtB,YAAmB,OAAgB;QAAvB;;;;mBAAO,OAAO;WAAS;QAN3B;;;;mBAAc,EAAE;WAAA;QAChB;;;;;WAAsB;QACtB;;;;;WAAmB;QACnB;;;;mBAAS,KAAK;WAAA;QACd;;;;;WAA4B;QAGlC,2EAA2E;QAC3E,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,EAAE,CAAA;QAChC,IAAI,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC,IAAI,CAAA;QACzB,IAAI,CAAC,YAAY,EAAE,CAAA;IACrB,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,MAAM,CAAA;IACpB,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAA;IAC3B,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,MAAM,CAAA;IACpB,CAAC;IAED,YAAY;QACV,IAAI,CAAC,OAAO,GAAG,IAAI,OAAO,CAAO,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAA;IAC7D,CAAC;IAED,IAAI,CAAC,IAAO;QACV,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACtB,IAAI,CAAC,OAAO,EAAE,CAAA;IAChB,CAAC;IAED,QAAQ,CAAC,KAAU;QACjB,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;QACzC,IAAI,CAAC,OAAO,EAAE,CAAA;IAChB,CAAC;IAED,KAAK,CAAC,CAAC,MAAM;QACX,OAAO,IAAI,EAAE,CAAC;YACZ,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC5C,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;oBACjB,MAAM,IAAI,CAAC,OAAO,CAAA;gBACpB,CAAC;qBAAM,CAAC;oBACN,OAAM;gBACR,CAAC;YACH,CAAC;YACD,MAAM,IAAI,CAAC,OAAO,CAAA;YAClB,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBACjB,MAAM,IAAI,CAAC,OAAO,CAAA;YACpB,CAAC;YACD,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;gBAC7C,MAAM,IAAI,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;YAC9C,CAAC;YACD,MAAM,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,CAAA;YACpC,IAAI,KAAK,EAAE,CAAC;gBACV,IAAI,CAAC,MAAM,GAAG,IAAI,CAAA;gBAClB,MAAM,KAAK,CAAA;YACb,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,YAAY,EAAE,CAAA;YACrB,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,CAAC,GAAY;QAChB,IAAI,CAAC,OAAO,GAAG,GAAG,CAAA;QAClB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAA;QAClB,IAAI,CAAC,OAAO,EAAE,CAAA;IAChB,CAAC;IAED,KAAK;QACH,IAAI,CAAC,MAAM,GAAG,IAAI,CAAA;QAClB,IAAI,CAAC,OAAO,EAAE,CAAA;IAChB,CAAC;CACF;AA5ED,kCA4EC;AAED,MAAa,oBAAqB,SAAQ,KAAK;IAC7C,YAAY,OAAe;QACzB,KAAK,CAAC,yBAAyB,OAAO,EAAE,CAAC,CAAA;IAC3C,CAAC;CACF;AAJD,oDAIC;AAaD,SAAgB,YAAY,CAC1B,QAAoC;IAEpC,OAAO,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAA;AAClE,CAAC;AAcD,SAAgB,sBAAsB,CACpC,OAAwC;IAExC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAA;IAClE,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,+EAA+E;QAC/E,OAAQ,OAA6C,CAAC,GAAG,CAAC,YAAY,CAAC,CAAA;IACzE,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,MAAM,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IACD,MAAM,IAAI,cAAc,CACtB,MAAM,EACN,oBAAoB,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC7D,CAAA;AACH,CAAC;AAED,SAAgB,gBAAgB,CAC9B,MAAqC;IAErC,OAAO,MAAM,CAAC,MAAM,KAAK,UAAU,CAAA;AACrC,CAAC;AAED,SAAS,aAAa,CAAC,MAA6B;IAClD,OAAO,MAAM,CAAC,MAAM,CAAA;AACtB,CAAC;AAED,SAAgB,iBAAiB,CAC/B,MAA+B;IAE/B,OAAO,MAAM,CAAC,MAAM,KAAK,WAAW,CAAA;AACtC,CAAC;AAED,SAAS,YAAY,CAAI,MAAiC;IACxD,OAAO,MAAM,CAAC,KAAK,CAAA;AACrB,CAAC;AAED,SAAS,eAAe,CAAC,MAAe;IACtC,IAAI,MAAM,YAAY,KAAK,EAAE,CAAC;QAC5B,OAAO,MAAM,CAAC,OAAO,CAAA;IACvB,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,CAAA;AACvB,CAAC"}
|
package/dist/check.d.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { ZodError } from 'zod';
|
|
2
1
|
export interface Checkable<T> {
|
|
3
2
|
parse: (obj: unknown) => T;
|
|
4
3
|
safeParse: (obj: unknown) => {
|
|
@@ -6,7 +5,7 @@ export interface Checkable<T> {
|
|
|
6
5
|
data: T;
|
|
7
6
|
} | {
|
|
8
7
|
success: false;
|
|
9
|
-
error:
|
|
8
|
+
error: Error;
|
|
10
9
|
};
|
|
11
10
|
}
|
|
12
11
|
export interface Def<T> {
|
|
@@ -14,6 +13,7 @@ export interface Def<T> {
|
|
|
14
13
|
schema: Checkable<T>;
|
|
15
14
|
}
|
|
16
15
|
export declare const is: <T>(obj: unknown, def: Checkable<T>) => obj is T;
|
|
16
|
+
export declare const create: <T>(def: Checkable<T>) => (v: unknown) => v is T;
|
|
17
17
|
export declare const assure: <T>(def: Checkable<T>, obj: unknown) => T;
|
|
18
18
|
export declare const isObject: (obj: unknown) => obj is Record<string, unknown>;
|
|
19
19
|
//# sourceMappingURL=check.d.ts.map
|
package/dist/check.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../src/check.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../src/check.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,SAAS,CAAC,CAAC;IAC1B,KAAK,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,CAAC,CAAA;IAC1B,SAAS,EAAE,CACT,GAAG,EAAE,OAAO,KACT;QAAE,OAAO,EAAE,IAAI,CAAC;QAAC,IAAI,EAAE,CAAC,CAAA;KAAE,GAAG;QAAE,OAAO,EAAE,KAAK,CAAC;QAAC,KAAK,EAAE,KAAK,CAAA;KAAE,CAAA;CACnE;AAED,MAAM,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,CAAA;CACrB;AAED,eAAO,MAAM,EAAE,GAAI,CAAC,OAAO,OAAO,OAAO,SAAS,CAAC,CAAC,CAAC,KAAG,GAAG,IAAI,CAE9D,CAAA;AAED,eAAO,MAAM,MAAM,GAChB,CAAC,OAAO,SAAS,CAAC,CAAC,CAAC,SACjB,OAAO,KAAG,CAAC,IAAI,CACO,CAAA;AAE5B,eAAO,MAAM,MAAM,GAAI,CAAC,OAAO,SAAS,CAAC,CAAC,CAAC,OAAO,OAAO,KAAG,CAE3D,CAAA;AAED,eAAO,MAAM,QAAQ,QAAS,OAAO,KAAG,GAAG,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAEpE,CAAA"}
|
package/dist/check.js
CHANGED
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
// Explicitly not using "zod" types here to avoid mismatching types due to
|
|
3
|
+
// version differences.
|
|
2
4
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.isObject = exports.assure = exports.is = void 0;
|
|
5
|
+
exports.isObject = exports.assure = exports.create = exports.is = void 0;
|
|
4
6
|
const is = (obj, def) => {
|
|
5
7
|
return def.safeParse(obj).success;
|
|
6
8
|
};
|
|
7
9
|
exports.is = is;
|
|
10
|
+
const create = (def) => (v) => def.safeParse(v).success;
|
|
11
|
+
exports.create = create;
|
|
8
12
|
const assure = (def, obj) => {
|
|
9
13
|
return def.parse(obj);
|
|
10
14
|
};
|
package/dist/check.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"check.js","sourceRoot":"","sources":["../src/check.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"check.js","sourceRoot":"","sources":["../src/check.ts"],"names":[],"mappings":";AAAA,0EAA0E;AAC1E,uBAAuB;;;AAchB,MAAM,EAAE,GAAG,CAAI,GAAY,EAAE,GAAiB,EAAY,EAAE;IACjE,OAAO,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,OAAO,CAAA;AACnC,CAAC,CAAA;AAFY,QAAA,EAAE,MAEd;AAEM,MAAM,MAAM,GACjB,CAAI,GAAiB,EAAE,EAAE,CACzB,CAAC,CAAU,EAAU,EAAE,CACrB,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAA;AAHf,QAAA,MAAM,UAGS;AAErB,MAAM,MAAM,GAAG,CAAI,GAAiB,EAAE,GAAY,EAAK,EAAE;IAC9D,OAAO,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;AACvB,CAAC,CAAA;AAFY,QAAA,MAAM,UAElB;AAEM,MAAM,QAAQ,GAAG,CAAC,GAAY,EAAkC,EAAE;IACvE,OAAO,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,CAAA;AAChD,CAAC,CAAA;AAFY,QAAA,QAAQ,YAEpB"}
|
package/dist/did-doc.d.ts
CHANGED
|
@@ -1,19 +1,5 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
export declare const isValidDidDoc: (doc: unknown) => doc is
|
|
3
|
-
id: string;
|
|
4
|
-
alsoKnownAs?: string[] | undefined;
|
|
5
|
-
verificationMethod?: {
|
|
6
|
-
id: string;
|
|
7
|
-
type: string;
|
|
8
|
-
controller: string;
|
|
9
|
-
publicKeyMultibase?: string | undefined;
|
|
10
|
-
}[] | undefined;
|
|
11
|
-
service?: {
|
|
12
|
-
id: string;
|
|
13
|
-
type: string;
|
|
14
|
-
serviceEndpoint: (string | Record<string, unknown>) & (string | Record<string, unknown> | undefined);
|
|
15
|
-
}[] | undefined;
|
|
16
|
-
};
|
|
2
|
+
export declare const isValidDidDoc: (doc: unknown) => doc is DidDocument;
|
|
17
3
|
export declare const getDid: (doc: DidDocument) => string;
|
|
18
4
|
export declare const getHandle: (doc: DidDocument) => string | undefined;
|
|
19
5
|
export declare const getSigningKey: (doc: DidDocument) => {
|
|
@@ -58,11 +44,11 @@ export declare const didDocument: z.ZodObject<{
|
|
|
58
44
|
}, "strip", z.ZodTypeAny, {
|
|
59
45
|
id: string;
|
|
60
46
|
type: string;
|
|
61
|
-
serviceEndpoint:
|
|
47
|
+
serviceEndpoint: string | Record<string, unknown>;
|
|
62
48
|
}, {
|
|
63
49
|
id: string;
|
|
64
50
|
type: string;
|
|
65
|
-
serviceEndpoint:
|
|
51
|
+
serviceEndpoint: string | Record<string, unknown>;
|
|
66
52
|
}>, "many">>;
|
|
67
53
|
}, "strip", z.ZodTypeAny, {
|
|
68
54
|
id: string;
|
|
@@ -76,7 +62,7 @@ export declare const didDocument: z.ZodObject<{
|
|
|
76
62
|
service?: {
|
|
77
63
|
id: string;
|
|
78
64
|
type: string;
|
|
79
|
-
serviceEndpoint:
|
|
65
|
+
serviceEndpoint: string | Record<string, unknown>;
|
|
80
66
|
}[] | undefined;
|
|
81
67
|
}, {
|
|
82
68
|
id: string;
|
|
@@ -90,7 +76,7 @@ export declare const didDocument: z.ZodObject<{
|
|
|
90
76
|
service?: {
|
|
91
77
|
id: string;
|
|
92
78
|
type: string;
|
|
93
|
-
serviceEndpoint:
|
|
79
|
+
serviceEndpoint: string | Record<string, unknown>;
|
|
94
80
|
}[] | undefined;
|
|
95
81
|
}>;
|
|
96
82
|
export type DidDocument = z.infer<typeof didDocument>;
|
package/dist/did-doc.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"did-doc.d.ts","sourceRoot":"","sources":["../src/did-doc.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAKvB,eAAO,MAAM,aAAa,QAAS,OAAO
|
|
1
|
+
{"version":3,"file":"did-doc.d.ts","sourceRoot":"","sources":["../src/did-doc.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAKvB,eAAO,MAAM,aAAa,QAAS,OAAO,KAAG,GAAG,IAAI,WAEnD,CAAA;AAED,eAAO,MAAM,MAAM,QAAS,WAAW,KAAG,MAMzC,CAAA;AAED,eAAO,MAAM,SAAS,QAAS,WAAW,KAAG,MAAM,GAAG,SAYrD,CAAA;AAGD,eAAO,MAAM,aAAa,QACnB,WAAW,KACf;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,kBAAkB,EAAE,MAAM,CAAA;CAAE,GAAG,SAEjD,CAAA;AAED,eAAO,MAAM,uBAAuB,QAC7B,WAAW,SACT,MAAM,KACZ;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,kBAAkB,EAAE,MAAM,CAAA;CAAE,GAAG,SAgBjD,CAAA;AAED,eAAO,MAAM,gBAAgB,QAAS,WAAW,KAAG,MAAM,GAAG,SAI5D,CAAA;AAED,eAAO,MAAM,cAAc,QAAS,WAAW,KAAG,MAAM,GAAG,SAK1D,CAAA;AAED,eAAO,MAAM,kBAAkB,QAAS,WAAW,KAAG,MAAM,GAAG,SAK9D,CAAA;AAED,eAAO,MAAM,gBAAgB,QAAS,WAAW,KAAG,MAAM,GAAG,SAK5D,CAAA;AAED,eAAO,MAAM,kBAAkB,QACxB,WAAW,QACV;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,uBAkBpC,CAAA;AA4ED,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAKtB,CAAA;AAEF,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAA"}
|
package/dist/did-doc.js
CHANGED
|
@@ -18,13 +18,16 @@ const getDid = (doc) => {
|
|
|
18
18
|
exports.getDid = getDid;
|
|
19
19
|
const getHandle = (doc) => {
|
|
20
20
|
const aka = doc.alsoKnownAs;
|
|
21
|
-
if (
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
21
|
+
if (aka) {
|
|
22
|
+
for (let i = 0; i < aka.length; i++) {
|
|
23
|
+
const alias = aka[i];
|
|
24
|
+
if (alias.startsWith('at://')) {
|
|
25
|
+
// strip off "at://" prefix
|
|
26
|
+
return alias.slice(5);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return undefined;
|
|
28
31
|
};
|
|
29
32
|
exports.getHandle = getHandle;
|
|
30
33
|
// @NOTE we parse to type/publicKeyMultibase to avoid the dependency on @atproto/crypto
|
|
@@ -33,21 +36,17 @@ const getSigningKey = (doc) => {
|
|
|
33
36
|
};
|
|
34
37
|
exports.getSigningKey = getSigningKey;
|
|
35
38
|
const getVerificationMaterial = (doc, keyId) => {
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
if (!
|
|
39
|
-
return undefined;
|
|
40
|
-
if (typeof keys !== 'object')
|
|
39
|
+
// /!\ Hot path
|
|
40
|
+
const key = findItemById(doc, 'verificationMethod', `#${keyId}`);
|
|
41
|
+
if (!key) {
|
|
41
42
|
return undefined;
|
|
42
|
-
if (!Array.isArray(keys)) {
|
|
43
|
-
keys = [keys];
|
|
44
43
|
}
|
|
45
|
-
|
|
46
|
-
if (!found?.publicKeyMultibase)
|
|
44
|
+
if (!key.publicKeyMultibase) {
|
|
47
45
|
return undefined;
|
|
46
|
+
}
|
|
48
47
|
return {
|
|
49
|
-
type:
|
|
50
|
-
publicKeyMultibase:
|
|
48
|
+
type: key.type,
|
|
49
|
+
publicKeyMultibase: key.publicKeyMultibase,
|
|
51
50
|
};
|
|
52
51
|
};
|
|
53
52
|
exports.getVerificationMaterial = getVerificationMaterial;
|
|
@@ -80,46 +79,62 @@ const getNotifEndpoint = (doc) => {
|
|
|
80
79
|
};
|
|
81
80
|
exports.getNotifEndpoint = getNotifEndpoint;
|
|
82
81
|
const getServiceEndpoint = (doc, opts) => {
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
if (!
|
|
86
|
-
return undefined;
|
|
87
|
-
if (typeof services !== 'object')
|
|
82
|
+
// /!\ Hot path
|
|
83
|
+
const service = findItemById(doc, 'service', opts.id);
|
|
84
|
+
if (!service) {
|
|
88
85
|
return undefined;
|
|
89
|
-
if (!Array.isArray(services)) {
|
|
90
|
-
services = [services];
|
|
91
86
|
}
|
|
92
|
-
|
|
93
|
-
if (!found)
|
|
94
|
-
return undefined;
|
|
95
|
-
if (opts.type && found.type !== opts.type) {
|
|
87
|
+
if (opts.type && service.type !== opts.type) {
|
|
96
88
|
return undefined;
|
|
97
89
|
}
|
|
98
|
-
if (typeof
|
|
90
|
+
if (typeof service.serviceEndpoint !== 'string') {
|
|
99
91
|
return undefined;
|
|
100
92
|
}
|
|
101
|
-
return validateUrl(
|
|
93
|
+
return validateUrl(service.serviceEndpoint);
|
|
102
94
|
};
|
|
103
95
|
exports.getServiceEndpoint = getServiceEndpoint;
|
|
96
|
+
function findItemById(doc, type, id) {
|
|
97
|
+
// /!\ Hot path
|
|
98
|
+
const items = doc[type];
|
|
99
|
+
if (items) {
|
|
100
|
+
for (let i = 0; i < items.length; i++) {
|
|
101
|
+
const item = items[i];
|
|
102
|
+
const itemId = item.id;
|
|
103
|
+
if (itemId[0] === '#'
|
|
104
|
+
? itemId === id
|
|
105
|
+
: // Optimized version of: itemId === `${doc.id}${id}`
|
|
106
|
+
itemId.length === doc.id.length + id.length &&
|
|
107
|
+
itemId[doc.id.length] === '#' &&
|
|
108
|
+
itemId.endsWith(id) &&
|
|
109
|
+
itemId.startsWith(doc.id) // <== We could probably skip this check
|
|
110
|
+
) {
|
|
111
|
+
return item;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return undefined;
|
|
116
|
+
}
|
|
104
117
|
// Check protocol and hostname to prevent potential SSRF
|
|
105
118
|
const validateUrl = (urlStr) => {
|
|
106
|
-
|
|
107
|
-
try {
|
|
108
|
-
url = new URL(urlStr);
|
|
109
|
-
}
|
|
110
|
-
catch {
|
|
111
|
-
return undefined;
|
|
112
|
-
}
|
|
113
|
-
if (!['http:', 'https:'].includes(url.protocol)) {
|
|
119
|
+
if (!urlStr.startsWith('http://') && !urlStr.startsWith('https://')) {
|
|
114
120
|
return undefined;
|
|
115
121
|
}
|
|
116
|
-
|
|
122
|
+
if (!canParseUrl(urlStr)) {
|
|
117
123
|
return undefined;
|
|
118
124
|
}
|
|
119
|
-
|
|
120
|
-
return urlStr;
|
|
121
|
-
}
|
|
125
|
+
return urlStr;
|
|
122
126
|
};
|
|
127
|
+
const canParseUrl = URL.canParse ??
|
|
128
|
+
// URL.canParse is not available in Node.js < 18.17.0
|
|
129
|
+
((urlStr) => {
|
|
130
|
+
try {
|
|
131
|
+
new URL(urlStr);
|
|
132
|
+
return true;
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
return false;
|
|
136
|
+
}
|
|
137
|
+
});
|
|
123
138
|
// Types
|
|
124
139
|
// --------
|
|
125
140
|
const verificationMethod = zod_1.z.object({
|
package/dist/did-doc.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"did-doc.js","sourceRoot":"","sources":["../src/did-doc.ts"],"names":[],"mappings":";;;AAAA,6BAAuB;AAEvB,uBAAuB;AACvB,WAAW;AAEJ,MAAM,aAAa,GAAG,CAAC,GAAY,EAAsB,EAAE;IAChE,OAAO,mBAAW,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,OAAO,CAAA;AAC3C,CAAC,CAAA;AAFY,QAAA,aAAa,iBAEzB;AAEM,MAAM,MAAM,GAAG,CAAC,GAAgB,EAAU,EAAE;IACjD,MAAM,EAAE,GAAG,GAAG,CAAC,EAAE,CAAA;IACjB,IAAI,OAAO,EAAE,KAAK,QAAQ,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAA;IACxC,CAAC;IACD,OAAO,EAAE,CAAA;AACX,CAAC,CAAA;AANY,QAAA,MAAM,UAMlB;AAEM,MAAM,SAAS,GAAG,CAAC,GAAgB,EAAsB,EAAE;IAChE,MAAM,GAAG,GAAG,GAAG,CAAC,WAAW,CAAA;IAC3B,IAAI,
|
|
1
|
+
{"version":3,"file":"did-doc.js","sourceRoot":"","sources":["../src/did-doc.ts"],"names":[],"mappings":";;;AAAA,6BAAuB;AAEvB,uBAAuB;AACvB,WAAW;AAEJ,MAAM,aAAa,GAAG,CAAC,GAAY,EAAsB,EAAE;IAChE,OAAO,mBAAW,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,OAAO,CAAA;AAC3C,CAAC,CAAA;AAFY,QAAA,aAAa,iBAEzB;AAEM,MAAM,MAAM,GAAG,CAAC,GAAgB,EAAU,EAAE;IACjD,MAAM,EAAE,GAAG,GAAG,CAAC,EAAE,CAAA;IACjB,IAAI,OAAO,EAAE,KAAK,QAAQ,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAA;IACxC,CAAC;IACD,OAAO,EAAE,CAAA;AACX,CAAC,CAAA;AANY,QAAA,MAAM,UAMlB;AAEM,MAAM,SAAS,GAAG,CAAC,GAAgB,EAAsB,EAAE;IAChE,MAAM,GAAG,GAAG,GAAG,CAAC,WAAW,CAAA;IAC3B,IAAI,GAAG,EAAE,CAAC;QACR,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACpC,MAAM,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,CAAA;YACpB,IAAI,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC9B,2BAA2B;gBAC3B,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;YACvB,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC,CAAA;AAZY,QAAA,SAAS,aAYrB;AAED,uFAAuF;AAChF,MAAM,aAAa,GAAG,CAC3B,GAAgB,EAC0C,EAAE;IAC5D,OAAO,IAAA,+BAAuB,EAAC,GAAG,EAAE,SAAS,CAAC,CAAA;AAChD,CAAC,CAAA;AAJY,QAAA,aAAa,iBAIzB;AAEM,MAAM,uBAAuB,GAAG,CACrC,GAAgB,EAChB,KAAa,EAC6C,EAAE;IAC5D,eAAe;IAEf,MAAM,GAAG,GAAG,YAAY,CAAC,GAAG,EAAE,oBAAoB,EAAE,IAAI,KAAK,EAAE,CAAC,CAAA;IAChE,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,IAAI,CAAC,GAAG,CAAC,kBAAkB,EAAE,CAAC;QAC5B,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,OAAO;QACL,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,kBAAkB,EAAE,GAAG,CAAC,kBAAkB;KAC3C,CAAA;AACH,CAAC,CAAA;AAnBY,QAAA,uBAAuB,2BAmBnC;AAEM,MAAM,gBAAgB,GAAG,CAAC,GAAgB,EAAsB,EAAE;IACvE,MAAM,MAAM,GAAG,IAAA,qBAAa,EAAC,GAAG,CAAC,CAAA;IACjC,IAAI,CAAC,MAAM;QAAE,OAAM;IACnB,OAAO,WAAW,MAAM,CAAC,kBAAkB,EAAE,CAAA;AAC/C,CAAC,CAAA;AAJY,QAAA,gBAAgB,oBAI5B;AAEM,MAAM,cAAc,GAAG,CAAC,GAAgB,EAAsB,EAAE;IACrE,OAAO,IAAA,0BAAkB,EAAC,GAAG,EAAE;QAC7B,EAAE,EAAE,cAAc;QAClB,IAAI,EAAE,2BAA2B;KAClC,CAAC,CAAA;AACJ,CAAC,CAAA;AALY,QAAA,cAAc,kBAK1B;AAEM,MAAM,kBAAkB,GAAG,CAAC,GAAgB,EAAsB,EAAE;IACzE,OAAO,IAAA,0BAAkB,EAAC,GAAG,EAAE;QAC7B,EAAE,EAAE,UAAU;QACd,IAAI,EAAE,mBAAmB;KAC1B,CAAC,CAAA;AACJ,CAAC,CAAA;AALY,QAAA,kBAAkB,sBAK9B;AAEM,MAAM,gBAAgB,GAAG,CAAC,GAAgB,EAAsB,EAAE;IACvE,OAAO,IAAA,0BAAkB,EAAC,GAAG,EAAE;QAC7B,EAAE,EAAE,aAAa;QACjB,IAAI,EAAE,yBAAyB;KAChC,CAAC,CAAA;AACJ,CAAC,CAAA;AALY,QAAA,gBAAgB,oBAK5B;AAEM,MAAM,kBAAkB,GAAG,CAChC,GAAgB,EAChB,IAAmC,EACnC,EAAE;IACF,eAAe;IAEf,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,EAAE,SAAS,EAAE,IAAI,CAAC,EAAE,CAAC,CAAA;IACrD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,IAAI,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5C,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,IAAI,OAAO,OAAO,CAAC,eAAe,KAAK,QAAQ,EAAE,CAAC;QAChD,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,OAAO,WAAW,CAAC,OAAO,CAAC,eAAe,CAAC,CAAA;AAC7C,CAAC,CAAA;AApBY,QAAA,kBAAkB,sBAoB9B;AAMD,SAAS,YAAY,CACnB,GAAgB,EAChB,IAAsC,EACtC,EAAU;IAEV,eAAe;IAEf,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,CAAA;IACvB,IAAI,KAAK,EAAE,CAAC;QACV,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;YACrB,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,CAAA;YAEtB,IACE,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG;gBACf,CAAC,CAAC,MAAM,KAAK,EAAE;gBACf,CAAC,CAAC,oDAAoD;oBACpD,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,EAAE,CAAC,MAAM,GAAG,EAAE,CAAC,MAAM;wBAC3C,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,GAAG;wBAC7B,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;wBACnB,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,wCAAwC;cACtE,CAAC;gBACD,OAAO,IAAI,CAAA;YACb,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,wDAAwD;AACxD,MAAM,WAAW,GAAG,CAAC,MAAc,EAAsB,EAAE;IACzD,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QACpE,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;QACzB,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC,CAAA;AAED,MAAM,WAAW,GACf,GAAG,CAAC,QAAQ;IACZ,qDAAqD;IACrD,CAAC,CAAC,MAAc,EAAW,EAAE;QAC3B,IAAI,CAAC;YACH,IAAI,GAAG,CAAC,MAAM,CAAC,CAAA;YACf,OAAO,IAAI,CAAA;QACb,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAA;QACd,CAAC;IACH,CAAC,CAAC,CAAA;AAEJ,QAAQ;AACR,WAAW;AAEX,MAAM,kBAAkB,GAAG,OAAC,CAAC,MAAM,CAAC;IAClC,EAAE,EAAE,OAAC,CAAC,MAAM,EAAE;IACd,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE;IAChB,UAAU,EAAE,OAAC,CAAC,MAAM,EAAE;IACtB,kBAAkB,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC1C,CAAC,CAAA;AAEF,MAAM,OAAO,GAAG,OAAC,CAAC,MAAM,CAAC;IACvB,EAAE,EAAE,OAAC,CAAC,MAAM,EAAE;IACd,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE;IAChB,eAAe,EAAE,OAAC,CAAC,KAAK,CAAC,CAAC,OAAC,CAAC,MAAM,EAAE,EAAE,OAAC,CAAC,MAAM,CAAC,OAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;CAC9D,CAAC,CAAA;AAEW,QAAA,WAAW,GAAG,OAAC,CAAC,MAAM,CAAC;IAClC,EAAE,EAAE,OAAC,CAAC,MAAM,EAAE;IACd,WAAW,EAAE,OAAC,CAAC,KAAK,CAAC,OAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IAC3C,kBAAkB,EAAE,OAAC,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,QAAQ,EAAE;IAC1D,OAAO,EAAE,OAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE;CACrC,CAAC,CAAA"}
|
package/dist/retry.d.ts
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
export type RetryOptions = {
|
|
2
2
|
maxRetries?: number;
|
|
3
3
|
getWaitMs?: (n: number) => number | null;
|
|
4
|
-
retryable?: (err: unknown) => boolean;
|
|
5
4
|
};
|
|
6
|
-
export declare function retry<T>(fn: () => Promise<T>, opts?: RetryOptions
|
|
5
|
+
export declare function retry<T>(fn: () => Promise<T>, opts?: RetryOptions & {
|
|
6
|
+
retryable?: (err: unknown) => boolean;
|
|
7
|
+
}): Promise<T>;
|
|
8
|
+
export declare function createRetryable(retryable: (err: unknown) => boolean): <T>(fn: () => Promise<T>, opts?: RetryOptions) => Promise<T>;
|
|
7
9
|
export declare function backoffMs(n: number, multiplier?: number, max?: number): number;
|
|
8
10
|
//# sourceMappingURL=retry.d.ts.map
|
package/dist/retry.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../src/retry.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,YAAY,GAAG;IACzB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAA;
|
|
1
|
+
{"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../src/retry.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,YAAY,GAAG;IACzB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAA;CACzC,CAAA;AAED,wBAAsB,KAAK,CAAC,CAAC,EAC3B,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,IAAI,GAAE,YAAY,GAAG;IACnB,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAA;CACjC,GACL,OAAO,CAAC,CAAC,CAAC,CAsBZ;AAED,wBAAgB,eAAe,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,IACpD,CAAC,MAAM,MAAM,OAAO,CAAC,CAAC,CAAC,SAAS,YAAY,gBAE3D;AAGD,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,SAAM,EAAE,GAAG,SAAO,UAIhE"}
|
package/dist/retry.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.retry = retry;
|
|
4
|
+
exports.createRetryable = createRetryable;
|
|
5
|
+
exports.backoffMs = backoffMs;
|
|
4
6
|
const util_1 = require("./util");
|
|
5
7
|
async function retry(fn, opts = {}) {
|
|
6
8
|
const { maxRetries = 3, retryable = () => true, getWaitMs = backoffMs } = opts;
|
|
@@ -26,14 +28,15 @@ async function retry(fn, opts = {}) {
|
|
|
26
28
|
}
|
|
27
29
|
throw doneError;
|
|
28
30
|
}
|
|
29
|
-
|
|
31
|
+
function createRetryable(retryable) {
|
|
32
|
+
return async (fn, opts) => retry(fn, { ...opts, retryable });
|
|
33
|
+
}
|
|
30
34
|
// Waits exponential backoff with max and jitter: ~100, ~200, ~400, ~800, ~1000, ~1000, ...
|
|
31
35
|
function backoffMs(n, multiplier = 100, max = 1000) {
|
|
32
36
|
const exponentialMs = Math.pow(2, n) * multiplier;
|
|
33
37
|
const ms = Math.min(exponentialMs, max);
|
|
34
38
|
return jitter(ms);
|
|
35
39
|
}
|
|
36
|
-
exports.backoffMs = backoffMs;
|
|
37
40
|
// Adds randomness +/-15% of value
|
|
38
41
|
function jitter(value) {
|
|
39
42
|
const delta = value * 0.15;
|
package/dist/retry.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retry.js","sourceRoot":"","sources":["../src/retry.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"retry.js","sourceRoot":"","sources":["../src/retry.ts"],"names":[],"mappings":";;AAOA,sBA2BC;AAED,0CAGC;AAGD,8BAIC;AA9CD,iCAA6B;AAOtB,KAAK,UAAU,KAAK,CACzB,EAAoB,EACpB,OAEI,EAAE;IAEN,MAAM,EAAE,UAAU,GAAG,CAAC,EAAE,SAAS,GAAG,GAAG,EAAE,CAAC,IAAI,EAAE,SAAS,GAAG,SAAS,EAAE,GAAG,IAAI,CAAA;IAC9E,IAAI,OAAO,GAAG,CAAC,CAAA;IACf,IAAI,SAAkB,CAAA;IACtB,OAAO,CAAC,SAAS,EAAE,CAAC;QAClB,IAAI,CAAC;YACH,OAAO,MAAM,EAAE,EAAE,CAAA;QACnB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAAA;YACjC,MAAM,SAAS,GACb,OAAO,GAAG,UAAU,IAAI,MAAM,KAAK,IAAI,IAAI,SAAS,CAAC,GAAG,CAAC,CAAA;YAC3D,IAAI,SAAS,EAAE,CAAC;gBACd,OAAO,IAAI,CAAC,CAAA;gBACZ,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC;oBACjB,MAAM,IAAA,WAAI,EAAC,MAAM,CAAC,CAAA;gBACpB,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,SAAS,GAAG,GAAG,CAAA;YACjB,CAAC;QACH,CAAC;IACH,CAAC;IACD,MAAM,SAAS,CAAA;AACjB,CAAC;AAED,SAAgB,eAAe,CAAC,SAAoC;IAClE,OAAO,KAAK,EAAK,EAAoB,EAAE,IAAmB,EAAE,EAAE,CAC5D,KAAK,CAAC,EAAE,EAAE,EAAE,GAAG,IAAI,EAAE,SAAS,EAAE,CAAC,CAAA;AACrC,CAAC;AAED,2FAA2F;AAC3F,SAAgB,SAAS,CAAC,CAAS,EAAE,UAAU,GAAG,GAAG,EAAE,GAAG,GAAG,IAAI;IAC/D,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,UAAU,CAAA;IACjD,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,GAAG,CAAC,CAAA;IACvC,OAAO,MAAM,CAAC,EAAE,CAAC,CAAA;AACnB,CAAC;AAED,kCAAkC;AAClC,SAAS,MAAM,CAAC,KAAa;IAC3B,MAAM,KAAK,GAAG,KAAK,GAAG,IAAI,CAAA;IAC1B,OAAO,KAAK,GAAG,WAAW,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;AAC3C,CAAC;AAED,SAAS,WAAW,CAAC,IAAY,EAAE,EAAU;IAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,CAAA;IACxC,OAAO,IAAI,GAAG,IAAI,CAAA;AACpB,CAAC"}
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AACtC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,GAAG,EAAE,MAAM,SAAS,CAAA;AAS7B,eAAO,MAAM,MAAM;;;;;;;CAOlB,CAAA;AAED,eAAO,MAAM,GAAG
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AACtC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,GAAG,EAAE,MAAM,SAAS,CAAA;AAS7B,eAAO,MAAM,MAAM;;;;;;;CAOlB,CAAA;AAED,eAAO,MAAM,GAAG;SAIT,GAAG,CAAC,GAAG,CAAC;WAIR,GAAG,CAAC,UAAU,CAAC;YAIf,GAAG,CAAC,MAAM,CAAC;SAIX,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;aAI5B,GAAG,CAAC,OAAO,CAAC;CAClB,CAAA;AAED,MAAM,MAAM,OAAO,CAAC,CAAC,IAAI,CAAC,SAAS,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,KAAK,CAAA;AAEnE,MAAM,MAAM,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAA"}
|
package/dist/util.d.ts
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
|
-
/// <reference types="node" />
|
|
2
1
|
export declare const noUndefinedVals: <T>(obj: Record<string, T | undefined>) => Record<string, T>;
|
|
2
|
+
/**
|
|
3
|
+
* Returns a shallow copy of the object without the specified keys. If the input
|
|
4
|
+
* is nullish, it returns the input.
|
|
5
|
+
*/
|
|
6
|
+
export declare function omit<T extends undefined | null | Record<string, unknown>, K extends keyof NonNullable<T>>(object: T, rejectedKeys: readonly K[]): T extends undefined ? undefined : T extends null ? null : Omit<T, K>;
|
|
3
7
|
export declare const jitter: (maxMs: number) => number;
|
|
4
8
|
export declare const wait: (ms: number) => Promise<unknown>;
|
|
5
9
|
export type BailableWait = {
|
package/dist/util.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,eAAe,GAAI,CAAC,OAC1B,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,SAAS,CAAC,KACjC,MAAM,CAAC,MAAM,EAAE,CAAC,CAOlB,CAAA;AAED;;;GAGG;AACH,wBAAgB,IAAI,CAClB,CAAC,SAAS,SAAS,GAAG,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACpD,CAAC,SAAS,MAAM,WAAW,CAAC,CAAC,CAAC,EAE9B,MAAM,EAAE,CAAC,EACT,YAAY,EAAE,SAAS,CAAC,EAAE,GACzB,CAAC,SAAS,SAAS,GAAG,SAAS,GAAG,CAAC,SAAS,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;AAoBvE,eAAO,MAAM,MAAM,UAAW,MAAM,WAEnC,CAAA;AAED,eAAO,MAAM,IAAI,OAAQ,MAAM,qBAE9B,CAAA;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,MAAM,IAAI,CAAA;IAChB,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAC1B,CAAA;AAED,eAAO,MAAM,YAAY,OAAQ,MAAM,KAAG,YAUzC,CAAA;AAED,eAAO,MAAM,kBAAkB,SAAU,UAAU,EAAE,KAAG,UAWvD,CAAA;AAED,eAAO,MAAM,cAAc,WACjB,aAAa,CAAC,UAAU,CAAC,KAChC,OAAO,CAAC,UAAU,CAMpB,CAAA;AAID,eAAO,MAAM,SAAS,MAAO,MAAM,KAAG,MAQrC,CAAA;AAED,eAAO,MAAM,SAAS,MAAO,MAAM,KAAG,MAMrC,CAAA;AAED,eAAO,MAAM,WAAW,GAAU,CAAC,OAC5B,CAAC,EAAE,MACJ,CAAC,CAAC,EAAE,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,iBAI/B,CAAA;AAED,eAAO,MAAM,gBAAgB,QACtB,OAAO,KACX,GAAG,IAAI,MAAM,CAAC,cAEhB,CAAA;AAED,eAAO,MAAM,SAAS,QAAS,OAAO,OAAO,MAAM,KAAG,OAErD,CAAA;AAED,eAAO,MAAM,UAAU,GAAI,CAAC,OAAO,CAAC,EAAE,aAAa,MAAM,KAAG,CAAC,EAAE,EAS9D,CAAA;AAED,eAAO,MAAM,KAAK,QAAS,MAAM,KAAG,MAAM,EAMzC,CAAA;AAED,eAAO,MAAM,UAAU,SAAU,MAAM,EAAE,KAAG,MAAM,EAEjD,CAAA;AAED,eAAO,MAAM,oBAAoB,GAAI,CAAC,SAC7B,MAAM,GAAG,SAAS,YACf,CAAC,KACV,MAAM,GAAG,CAGX,CAAA"}
|
package/dist/util.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.parseIntWithFallback = exports.dedupeStrs = exports.range = exports.chunkArray = exports.errHasMsg = exports.isErrnoException = exports.asyncFilter = exports.s32decode = exports.s32encode = exports.streamToBuffer = exports.flattenUint8Arrays = exports.bailableWait = exports.wait = exports.jitter = exports.noUndefinedVals = void 0;
|
|
4
|
+
exports.omit = omit;
|
|
4
5
|
const noUndefinedVals = (obj) => {
|
|
5
6
|
Object.keys(obj).forEach((k) => {
|
|
6
7
|
if (obj[k] === undefined) {
|
|
@@ -10,6 +11,20 @@ const noUndefinedVals = (obj) => {
|
|
|
10
11
|
return obj;
|
|
11
12
|
};
|
|
12
13
|
exports.noUndefinedVals = noUndefinedVals;
|
|
14
|
+
function omit(src, rejectedKeys) {
|
|
15
|
+
// Hot path
|
|
16
|
+
if (!src)
|
|
17
|
+
return src;
|
|
18
|
+
const dst = {};
|
|
19
|
+
const srcKeys = Object.keys(src);
|
|
20
|
+
for (let i = 0; i < srcKeys.length; i++) {
|
|
21
|
+
const key = srcKeys[i];
|
|
22
|
+
if (!rejectedKeys.includes(key)) {
|
|
23
|
+
dst[key] = src[key];
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return dst;
|
|
27
|
+
}
|
|
13
28
|
const jitter = (maxMs) => {
|
|
14
29
|
return Math.round((Math.random() - 0.5) * maxMs * 2);
|
|
15
30
|
};
|
package/dist/util.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@atproto/common-web",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.2",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"description": "Shared web-platform-friendly code for atproto libraries",
|
|
6
6
|
"keywords": [
|
|
@@ -18,10 +18,11 @@
|
|
|
18
18
|
"graphemer": "^1.4.0",
|
|
19
19
|
"multiformats": "^9.9.0",
|
|
20
20
|
"uint8arrays": "3.0.0",
|
|
21
|
-
"zod": "^3.
|
|
21
|
+
"zod": "^3.23.8"
|
|
22
22
|
},
|
|
23
23
|
"devDependencies": {
|
|
24
|
-
"jest": "^28.1.2"
|
|
24
|
+
"jest": "^28.1.2",
|
|
25
|
+
"typescript": "^5.6.3"
|
|
25
26
|
},
|
|
26
27
|
"scripts": {
|
|
27
28
|
"test": "jest",
|
package/src/arrays.ts
CHANGED
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
export const keyBy = <T>(arr: T[], key: string): Record<string, T> => {
|
|
2
|
-
return arr.reduce(
|
|
3
|
-
acc
|
|
4
|
-
|
|
5
|
-
|
|
2
|
+
return arr.reduce(
|
|
3
|
+
(acc, cur) => {
|
|
4
|
+
acc[cur[key]] = cur
|
|
5
|
+
return acc
|
|
6
|
+
},
|
|
7
|
+
{} as Record<string, T>,
|
|
8
|
+
)
|
|
6
9
|
}
|
|
7
10
|
|
|
8
11
|
export const mapDefined = <T, S>(
|
package/src/async.ts
CHANGED
|
@@ -152,24 +152,75 @@ export class AsyncBufferFullError extends Error {
|
|
|
152
152
|
}
|
|
153
153
|
}
|
|
154
154
|
|
|
155
|
-
|
|
155
|
+
/**
|
|
156
|
+
* Utility function that behaves like {@link Promise.allSettled} but returns the
|
|
157
|
+
* same result as {@link Promise.all} in case every promise is fulfilled, and
|
|
158
|
+
* throws an {@link AggregateError} if there are more than one errors.
|
|
159
|
+
*/
|
|
160
|
+
export function allFulfilled<T extends readonly unknown[] | []>(
|
|
161
|
+
promises: T,
|
|
162
|
+
): Promise<{ -readonly [P in keyof T]: Awaited<T[P]> }>
|
|
163
|
+
export function allFulfilled<T>(
|
|
164
|
+
promises: Iterable<T | PromiseLike<T>>,
|
|
165
|
+
): Promise<Awaited<T>[]>
|
|
166
|
+
export function allFulfilled(
|
|
167
|
+
promises: Iterable<Promise<unknown>>,
|
|
168
|
+
): Promise<unknown[]> {
|
|
169
|
+
return Promise.allSettled(promises).then(handleAllSettledErrors)
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
export function handleAllSettledErrors<
|
|
173
|
+
T extends readonly PromiseSettledResult<unknown>[] | [],
|
|
174
|
+
>(
|
|
175
|
+
results: T,
|
|
176
|
+
): {
|
|
177
|
+
-readonly [P in keyof T]: T[P] extends PromiseSettledResult<infer U>
|
|
178
|
+
? U
|
|
179
|
+
: never
|
|
180
|
+
}
|
|
181
|
+
export function handleAllSettledErrors<T>(
|
|
182
|
+
results: PromiseSettledResult<T>[],
|
|
183
|
+
): T[]
|
|
184
|
+
export function handleAllSettledErrors(
|
|
156
185
|
results: PromiseSettledResult<unknown>[],
|
|
157
|
-
)
|
|
158
|
-
const errors = results.filter(
|
|
186
|
+
): unknown[] {
|
|
187
|
+
const errors = results.filter(isRejectedResult).map(extractReason)
|
|
159
188
|
if (errors.length === 0) {
|
|
160
|
-
|
|
189
|
+
// No need to filter here, it is safe to assume that all promises are fulfilled
|
|
190
|
+
return (results as PromiseFulfilledResult<unknown>[]).map(extractValue)
|
|
161
191
|
}
|
|
162
192
|
if (errors.length === 1) {
|
|
163
193
|
throw errors[0]
|
|
164
194
|
}
|
|
165
195
|
throw new AggregateError(
|
|
166
196
|
errors,
|
|
167
|
-
|
|
197
|
+
`Multiple errors: ${errors.map(stringifyReason).join('\n')}`,
|
|
168
198
|
)
|
|
169
199
|
}
|
|
170
200
|
|
|
171
|
-
|
|
201
|
+
export function isRejectedResult(
|
|
172
202
|
result: PromiseSettledResult<unknown>,
|
|
173
|
-
): result is PromiseRejectedResult
|
|
203
|
+
): result is PromiseRejectedResult {
|
|
174
204
|
return result.status === 'rejected'
|
|
175
205
|
}
|
|
206
|
+
|
|
207
|
+
function extractReason(result: PromiseRejectedResult): unknown {
|
|
208
|
+
return result.reason
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
export function isFulfilledResult<T>(
|
|
212
|
+
result: PromiseSettledResult<T>,
|
|
213
|
+
): result is PromiseFulfilledResult<T> {
|
|
214
|
+
return result.status === 'fulfilled'
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
function extractValue<T>(result: PromiseFulfilledResult<T>): T {
|
|
218
|
+
return result.value
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
function stringifyReason(reason: unknown): string {
|
|
222
|
+
if (reason instanceof Error) {
|
|
223
|
+
return reason.message
|
|
224
|
+
}
|
|
225
|
+
return String(reason)
|
|
226
|
+
}
|
package/src/check.ts
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
|
|
1
|
+
// Explicitly not using "zod" types here to avoid mismatching types due to
|
|
2
|
+
// version differences.
|
|
2
3
|
|
|
3
4
|
export interface Checkable<T> {
|
|
4
5
|
parse: (obj: unknown) => T
|
|
5
6
|
safeParse: (
|
|
6
7
|
obj: unknown,
|
|
7
|
-
) => { success: true; data: T } | { success: false; error:
|
|
8
|
+
) => { success: true; data: T } | { success: false; error: Error }
|
|
8
9
|
}
|
|
9
10
|
|
|
10
11
|
export interface Def<T> {
|
|
@@ -16,6 +17,11 @@ export const is = <T>(obj: unknown, def: Checkable<T>): obj is T => {
|
|
|
16
17
|
return def.safeParse(obj).success
|
|
17
18
|
}
|
|
18
19
|
|
|
20
|
+
export const create =
|
|
21
|
+
<T>(def: Checkable<T>) =>
|
|
22
|
+
(v: unknown): v is T =>
|
|
23
|
+
def.safeParse(v).success
|
|
24
|
+
|
|
19
25
|
export const assure = <T>(def: Checkable<T>, obj: unknown): T => {
|
|
20
26
|
return def.parse(obj)
|
|
21
27
|
}
|
package/src/did-doc.ts
CHANGED
|
@@ -17,11 +17,16 @@ export const getDid = (doc: DidDocument): string => {
|
|
|
17
17
|
|
|
18
18
|
export const getHandle = (doc: DidDocument): string | undefined => {
|
|
19
19
|
const aka = doc.alsoKnownAs
|
|
20
|
-
if (
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
20
|
+
if (aka) {
|
|
21
|
+
for (let i = 0; i < aka.length; i++) {
|
|
22
|
+
const alias = aka[i]
|
|
23
|
+
if (alias.startsWith('at://')) {
|
|
24
|
+
// strip off "at://" prefix
|
|
25
|
+
return alias.slice(5)
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return undefined
|
|
25
30
|
}
|
|
26
31
|
|
|
27
32
|
// @NOTE we parse to type/publicKeyMultibase to avoid the dependency on @atproto/crypto
|
|
@@ -35,20 +40,20 @@ export const getVerificationMaterial = (
|
|
|
35
40
|
doc: DidDocument,
|
|
36
41
|
keyId: string,
|
|
37
42
|
): { type: string; publicKeyMultibase: string } | undefined => {
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
if (
|
|
42
|
-
|
|
43
|
-
|
|
43
|
+
// /!\ Hot path
|
|
44
|
+
|
|
45
|
+
const key = findItemById(doc, 'verificationMethod', `#${keyId}`)
|
|
46
|
+
if (!key) {
|
|
47
|
+
return undefined
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
if (!key.publicKeyMultibase) {
|
|
51
|
+
return undefined
|
|
44
52
|
}
|
|
45
|
-
|
|
46
|
-
(key) => key.id === `#${keyId}` || key.id === `${did}#${keyId}`,
|
|
47
|
-
)
|
|
48
|
-
if (!found?.publicKeyMultibase) return undefined
|
|
53
|
+
|
|
49
54
|
return {
|
|
50
|
-
type:
|
|
51
|
-
publicKeyMultibase:
|
|
55
|
+
type: key.type,
|
|
56
|
+
publicKeyMultibase: key.publicKeyMultibase,
|
|
52
57
|
}
|
|
53
58
|
}
|
|
54
59
|
|
|
@@ -83,43 +88,82 @@ export const getServiceEndpoint = (
|
|
|
83
88
|
doc: DidDocument,
|
|
84
89
|
opts: { id: string; type?: string },
|
|
85
90
|
) => {
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
if (
|
|
90
|
-
|
|
91
|
-
services = [services]
|
|
91
|
+
// /!\ Hot path
|
|
92
|
+
|
|
93
|
+
const service = findItemById(doc, 'service', opts.id)
|
|
94
|
+
if (!service) {
|
|
95
|
+
return undefined
|
|
92
96
|
}
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
)
|
|
96
|
-
if (!found) return undefined
|
|
97
|
-
if (opts.type && found.type !== opts.type) {
|
|
97
|
+
|
|
98
|
+
if (opts.type && service.type !== opts.type) {
|
|
98
99
|
return undefined
|
|
99
100
|
}
|
|
100
|
-
|
|
101
|
+
|
|
102
|
+
if (typeof service.serviceEndpoint !== 'string') {
|
|
101
103
|
return undefined
|
|
102
104
|
}
|
|
103
|
-
|
|
105
|
+
|
|
106
|
+
return validateUrl(service.serviceEndpoint)
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
function findItemById<
|
|
110
|
+
D extends DidDocument,
|
|
111
|
+
T extends 'verificationMethod' | 'service',
|
|
112
|
+
>(doc: D, type: T, id: string): NonNullable<D[T]>[number] | undefined
|
|
113
|
+
function findItemById(
|
|
114
|
+
doc: DidDocument,
|
|
115
|
+
type: 'verificationMethod' | 'service',
|
|
116
|
+
id: string,
|
|
117
|
+
) {
|
|
118
|
+
// /!\ Hot path
|
|
119
|
+
|
|
120
|
+
const items = doc[type]
|
|
121
|
+
if (items) {
|
|
122
|
+
for (let i = 0; i < items.length; i++) {
|
|
123
|
+
const item = items[i]
|
|
124
|
+
const itemId = item.id
|
|
125
|
+
|
|
126
|
+
if (
|
|
127
|
+
itemId[0] === '#'
|
|
128
|
+
? itemId === id
|
|
129
|
+
: // Optimized version of: itemId === `${doc.id}${id}`
|
|
130
|
+
itemId.length === doc.id.length + id.length &&
|
|
131
|
+
itemId[doc.id.length] === '#' &&
|
|
132
|
+
itemId.endsWith(id) &&
|
|
133
|
+
itemId.startsWith(doc.id) // <== We could probably skip this check
|
|
134
|
+
) {
|
|
135
|
+
return item
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
return undefined
|
|
104
140
|
}
|
|
105
141
|
|
|
106
142
|
// Check protocol and hostname to prevent potential SSRF
|
|
107
143
|
const validateUrl = (urlStr: string): string | undefined => {
|
|
108
|
-
|
|
109
|
-
try {
|
|
110
|
-
url = new URL(urlStr)
|
|
111
|
-
} catch {
|
|
144
|
+
if (!urlStr.startsWith('http://') && !urlStr.startsWith('https://')) {
|
|
112
145
|
return undefined
|
|
113
146
|
}
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
} else if (!url.hostname) {
|
|
147
|
+
|
|
148
|
+
if (!canParseUrl(urlStr)) {
|
|
117
149
|
return undefined
|
|
118
|
-
} else {
|
|
119
|
-
return urlStr
|
|
120
150
|
}
|
|
151
|
+
|
|
152
|
+
return urlStr
|
|
121
153
|
}
|
|
122
154
|
|
|
155
|
+
const canParseUrl =
|
|
156
|
+
URL.canParse ??
|
|
157
|
+
// URL.canParse is not available in Node.js < 18.17.0
|
|
158
|
+
((urlStr: string): boolean => {
|
|
159
|
+
try {
|
|
160
|
+
new URL(urlStr)
|
|
161
|
+
return true
|
|
162
|
+
} catch {
|
|
163
|
+
return false
|
|
164
|
+
}
|
|
165
|
+
})
|
|
166
|
+
|
|
123
167
|
// Types
|
|
124
168
|
// --------
|
|
125
169
|
|
package/src/retry.ts
CHANGED
|
@@ -3,12 +3,13 @@ import { wait } from './util'
|
|
|
3
3
|
export type RetryOptions = {
|
|
4
4
|
maxRetries?: number
|
|
5
5
|
getWaitMs?: (n: number) => number | null
|
|
6
|
-
retryable?: (err: unknown) => boolean
|
|
7
6
|
}
|
|
8
7
|
|
|
9
8
|
export async function retry<T>(
|
|
10
9
|
fn: () => Promise<T>,
|
|
11
|
-
opts: RetryOptions
|
|
10
|
+
opts: RetryOptions & {
|
|
11
|
+
retryable?: (err: unknown) => boolean
|
|
12
|
+
} = {},
|
|
12
13
|
): Promise<T> {
|
|
13
14
|
const { maxRetries = 3, retryable = () => true, getWaitMs = backoffMs } = opts
|
|
14
15
|
let retries = 0
|
|
@@ -33,6 +34,11 @@ export async function retry<T>(
|
|
|
33
34
|
throw doneError
|
|
34
35
|
}
|
|
35
36
|
|
|
37
|
+
export function createRetryable(retryable: (err: unknown) => boolean) {
|
|
38
|
+
return async <T>(fn: () => Promise<T>, opts?: RetryOptions) =>
|
|
39
|
+
retry(fn, { ...opts, retryable })
|
|
40
|
+
}
|
|
41
|
+
|
|
36
42
|
// Waits exponential backoff with max and jitter: ~100, ~200, ~400, ~800, ~1000, ~1000, ...
|
|
37
43
|
export function backoffMs(n: number, multiplier = 100, max = 1000) {
|
|
38
44
|
const exponentialMs = Math.pow(2, n) * multiplier
|
package/src/util.ts
CHANGED
|
@@ -9,6 +9,36 @@ export const noUndefinedVals = <T>(
|
|
|
9
9
|
return obj as Record<string, T>
|
|
10
10
|
}
|
|
11
11
|
|
|
12
|
+
/**
|
|
13
|
+
* Returns a shallow copy of the object without the specified keys. If the input
|
|
14
|
+
* is nullish, it returns the input.
|
|
15
|
+
*/
|
|
16
|
+
export function omit<
|
|
17
|
+
T extends undefined | null | Record<string, unknown>,
|
|
18
|
+
K extends keyof NonNullable<T>,
|
|
19
|
+
>(
|
|
20
|
+
object: T,
|
|
21
|
+
rejectedKeys: readonly K[],
|
|
22
|
+
): T extends undefined ? undefined : T extends null ? null : Omit<T, K>
|
|
23
|
+
export function omit(
|
|
24
|
+
src: undefined | null | Record<string, unknown>,
|
|
25
|
+
rejectedKeys: readonly string[],
|
|
26
|
+
): undefined | null | Record<string, unknown> {
|
|
27
|
+
// Hot path
|
|
28
|
+
|
|
29
|
+
if (!src) return src
|
|
30
|
+
|
|
31
|
+
const dst = {}
|
|
32
|
+
const srcKeys = Object.keys(src)
|
|
33
|
+
for (let i = 0; i < srcKeys.length; i++) {
|
|
34
|
+
const key = srcKeys[i]
|
|
35
|
+
if (!rejectedKeys.includes(key)) {
|
|
36
|
+
dst[key] = src[key]
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return dst
|
|
40
|
+
}
|
|
41
|
+
|
|
12
42
|
export const jitter = (maxMs: number) => {
|
|
13
43
|
return Math.round((Math.random() - 0.5) * maxMs * 2)
|
|
14
44
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"root":["./src/arrays.ts","./src/async.ts","./src/check.ts","./src/did-doc.ts","./src/index.ts","./src/ipld.ts","./src/retry.ts","./src/strings.ts","./src/tid.ts","./src/times.ts","./src/types.ts","./src/util.ts"],"version":"5.6.3"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"root":["./tests/check.test.ts","./tests/retry.test.ts","./tests/strings.test.ts","./tests/tid.test.ts","./tests/util.test.ts"],"version":"5.6.3"}
|