@stackframe/stack-shared 1.1.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/dist/helpers/fetch-token.d.ts +1 -0
  2. package/dist/helpers/password.d.ts +1 -0
  3. package/dist/hooks/use-async-external-store.d.ts +1 -0
  4. package/dist/hooks/use-strict-memo.d.ts +1 -0
  5. package/dist/index.d.ts +3 -2
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/interface/adminInterface.d.ts +44 -53
  8. package/dist/interface/adminInterface.d.ts.map +1 -1
  9. package/dist/interface/adminInterface.js +10 -52
  10. package/dist/interface/clientInterface.d.ts +30 -21
  11. package/dist/interface/clientInterface.d.ts.map +1 -1
  12. package/dist/interface/clientInterface.js +38 -56
  13. package/dist/interface/serverInterface.d.ts +4 -6
  14. package/dist/interface/serverInterface.d.ts.map +1 -1
  15. package/dist/interface/serverInterface.js +0 -23
  16. package/dist/utils/arrays.d.ts +1 -0
  17. package/dist/utils/bytes.d.ts +1 -0
  18. package/dist/utils/caches.d.ts +30 -28
  19. package/dist/utils/caches.d.ts.map +1 -1
  20. package/dist/utils/caches.js +66 -46
  21. package/dist/utils/crypto.d.ts +1 -0
  22. package/dist/utils/dates.d.ts +1 -0
  23. package/dist/utils/dom.d.ts +1 -0
  24. package/dist/utils/env.d.ts +1 -0
  25. package/dist/utils/errors.d.ts +1 -0
  26. package/dist/utils/html.d.ts +1 -0
  27. package/dist/utils/json.d.ts +1 -0
  28. package/dist/utils/jwt.d.ts +1 -0
  29. package/dist/utils/maps.d.ts +2 -0
  30. package/dist/utils/maps.d.ts.map +1 -1
  31. package/dist/utils/maps.js +3 -0
  32. package/dist/utils/math.d.ts +1 -0
  33. package/dist/utils/numbers.d.ts +1 -0
  34. package/dist/utils/objects.d.ts +1 -0
  35. package/dist/utils/password.d.ts +1 -0
  36. package/dist/utils/promises.d.ts +2 -0
  37. package/dist/utils/promises.d.ts.map +1 -1
  38. package/dist/utils/promises.js +4 -1
  39. package/dist/utils/react.d.ts +1 -0
  40. package/dist/utils/results.d.ts +1 -0
  41. package/dist/utils/stores.d.ts +1 -0
  42. package/dist/utils/stores.d.ts.map +1 -1
  43. package/dist/utils/stores.js +2 -4
  44. package/dist/utils/strings.d.ts +1 -0
  45. package/dist/utils/types.d.ts +11 -13
  46. package/dist/utils/types.d.ts.map +1 -1
  47. package/dist/utils/uuids.d.ts +1 -0
  48. package/package.json +1 -1
@@ -1,7 +1,6 @@
1
- import { ClientInterfaceOptions, UserCustomizableJson, UserJson, TokenStore, StackClientInterface } from "./clientInterface";
1
+ import { ClientInterfaceOptions, UserCustomizableJson, UserJson, TokenStore, StackClientInterface, ReadonlyTokenStore } from "./clientInterface";
2
2
  import { Result } from "../utils/results";
3
- import { ReadonlyJson } from "../utils/types";
4
- import { AsyncCache } from "../utils/caches";
3
+ import { ReadonlyJson } from "../utils/json";
5
4
  export type ServerUserJson = UserJson & {
6
5
  readonly serverMetadata: ReadonlyJson;
7
6
  };
@@ -13,13 +12,11 @@ export type ServerUserCustomizableJson = UserCustomizableJson & {
13
12
  export type ServerAuthApplicationOptions = (ClientInterfaceOptions & ({
14
13
  readonly secretServerKey: string;
15
14
  } | {
16
- readonly internalAdminAccessToken: string;
15
+ readonly projectOwnerTokens: ReadonlyTokenStore;
17
16
  }));
18
17
  export declare class StackServerInterface extends StackClientInterface {
19
18
  options: ServerAuthApplicationOptions;
20
- readonly currentServerUserCache: AsyncCache<TokenStore, ServerUserJson | null>;
21
19
  constructor(options: ServerAuthApplicationOptions);
22
- refreshUser(tokenStore: TokenStore): Promise<void>;
23
20
  protected sendServerRequest(path: string, options: RequestInit, tokenStore: TokenStore | null): Promise<Response & {
24
21
  usedTokens: Readonly<{
25
22
  refreshToken: string | null;
@@ -31,3 +28,4 @@ export declare class StackServerInterface extends StackClientInterface {
31
28
  setServerUserCustomizableData(userId: string, update: Partial<ServerUserCustomizableJson>): Promise<void>;
32
29
  deleteServerUser(userId: string): Promise<void>;
33
30
  }
31
+ //# sourceMappingURL=serverInterface.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"serverInterface.d.ts","sourceRoot":"","sources":["../../src/interface/serverInterface.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,oBAAoB,EACpB,QAAQ,EACR,UAAU,EACV,oBAAoB,EACrB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAG7C,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG;IACtC,QAAQ,CAAC,cAAc,EAAE,YAAY,CAAC;CACvC,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG,oBAAoB,GAAG;IAC9D,QAAQ,CAAC,cAAc,EAAE,YAAY,CAAC;IACtC,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,QAAQ,CAAC,oBAAoB,EAAE,OAAO,CAAC;CACxC,CAAA;AAGD,MAAM,MAAM,4BAA4B,GAAG,CACvC,sBAAsB,GACtB,CACE;IACA,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;CAClC,GACC;IACA,QAAQ,CAAC,wBAAwB,EAAE,MAAM,CAAC;CAC3C,CACF,CACF,CAAC;AAGF,qBAAa,oBAAqB,SAAQ,oBAAoB;IAKhC,OAAO,EAAE,4BAA4B;IAFjE,SAAgB,sBAAsB,EAAE,UAAU,CAAC,UAAU,EAAE,cAAc,GAAG,IAAI,CAAC,CAAC;gBAE1D,OAAO,EAAE,4BAA4B;IAelD,WAAW,CAAC,UAAU,EAAE,UAAU;cAOjC,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,GAAG,IAAI;;;;;;IAc7F,oBAAoB,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;IAW7E,SAAS,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IAKtC,6BAA6B,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,0BAA0B,CAAC;IAczF,gBAAgB,CAAC,MAAM,EAAE,MAAM;CAatC"}
1
+ {"version":3,"file":"serverInterface.d.ts","sourceRoot":"","sources":["../../src/interface/serverInterface.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,oBAAoB,EACpB,QAAQ,EACR,UAAU,EACV,oBAAoB,EACpB,kBAAkB,EACnB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAG1C,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG;IACtC,QAAQ,CAAC,cAAc,EAAE,YAAY,CAAC;CACvC,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG,oBAAoB,GAAG;IAC9D,QAAQ,CAAC,cAAc,EAAE,YAAY,CAAC;IACtC,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,QAAQ,CAAC,oBAAoB,EAAE,OAAO,CAAC;CACxC,CAAA;AAGD,MAAM,MAAM,4BAA4B,GAAG,CACvC,sBAAsB,GACtB,CACE;IACA,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;CAClC,GACC;IACA,QAAQ,CAAC,kBAAkB,EAAE,kBAAkB,CAAC;CACjD,CACF,CACF,CAAC;AAGF,qBAAa,oBAAqB,SAAQ,oBAAoB;IAChC,OAAO,EAAE,4BAA4B;gBAArC,OAAO,EAAE,4BAA4B;cAIjD,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,GAAG,IAAI;;;;;;IAc7F,oBAAoB,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;IAW7E,SAAS,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IAKtC,6BAA6B,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,0BAA0B,CAAC;IAczF,gBAAgB,CAAC,MAAM,EAAE,MAAM;CAatC"}
@@ -1,33 +1,10 @@
1
1
  import { StackClientInterface, } from "./clientInterface";
2
2
  import { Result } from "../utils/results";
3
- import { AsyncCache } from "../utils/caches";
4
- import { runAsynchronously } from "../utils/promises";
5
3
  export class StackServerInterface extends StackClientInterface {
6
4
  options;
7
- // note that we intentionally use TokenStore (a reference type) as a key, as different token stores with the same tokens should be treated differently
8
- // (if we wouldn't do that, we would cache users across requests, which may cause caching issues)
9
- currentServerUserCache;
10
5
  constructor(options) {
11
6
  super(options);
12
7
  this.options = options;
13
- this.currentServerUserCache = new AsyncCache(async (key, isFirst) => {
14
- if (isFirst) {
15
- key.onChange((newValue, oldValue) => {
16
- if (JSON.stringify(newValue) === JSON.stringify(oldValue))
17
- return;
18
- runAsynchronously(this.currentServerUserCache.refresh(key));
19
- });
20
- }
21
- const user = await this.getServerUserByToken(key);
22
- return Result.or(user, null);
23
- });
24
- // TODO override the client user cache to use the server user cache, so we save some requests
25
- }
26
- async refreshUser(tokenStore) {
27
- await Promise.all([
28
- super.refreshUser(tokenStore),
29
- this.currentServerUserCache.refresh(tokenStore),
30
- ]);
31
8
  }
32
9
  async sendServerRequest(path, options, tokenStore) {
33
10
  return await this.sendClientRequest(path, {
@@ -8,3 +8,4 @@ export declare function range(startInclusive: number, endExclusive: number, step
8
8
  export declare function rotateLeft(arr: readonly any[], n: number): any[];
9
9
  export declare function rotateRight(arr: readonly any[], n: number): any[];
10
10
  export declare function shuffle<T>(arr: readonly T[]): T[];
11
+ //# sourceMappingURL=arrays.d.ts.map
@@ -1,2 +1,3 @@
1
1
  export declare function encodeBase32(input: Uint8Array): string;
2
2
  export declare function decodeBase32(input: string): Uint8Array;
3
+ //# sourceMappingURL=bytes.d.ts.map
@@ -1,19 +1,21 @@
1
1
  import { RateLimitOptions, ReactPromise } from "./promises";
2
- import { ReadonlyAsyncStore } from "./stores";
3
2
  /**
4
3
  * Can be used to cache the result of a function call, for example for the `use` hook in React.
5
4
  */
6
5
  export declare function cacheFunction<F extends Function>(f: F): F;
7
- export declare class AsyncCache<K extends object, T> {
6
+ type CacheStrategy = "write-only" | "read-write" | "never";
7
+ export declare class AsyncCache<D extends any[], T> {
8
8
  private readonly _fetcher;
9
- private readonly _rateLimitOptions;
10
- private _map;
11
- constructor(_fetcher: (key: K, isFirst: boolean) => Promise<T>, _rateLimitOptions?: Omit<RateLimitOptions, "batchCalls">);
9
+ private readonly _options;
10
+ private readonly _map;
11
+ constructor(_fetcher: (dependencies: D) => Promise<T>, _options?: {
12
+ onSubscribe?: (key: D, refresh: () => void) => (() => void);
13
+ rateLimiter?: Omit<RateLimitOptions, "batchCalls">;
14
+ });
12
15
  private _createKeyed;
13
- getValueCache(key: K): AsyncValueCache<T>;
14
- isAvailable: (key: K) => boolean;
15
- setUnavailable: (key: K) => void;
16
- get: (key: K) => ({
16
+ getValueCache(dependencies: D): AsyncValueCache<T>;
17
+ readonly isCacheAvailable: (key: D) => boolean;
18
+ readonly getIfCached: (key: D) => ({
17
19
  status: "pending";
18
20
  } & {
19
21
  progress: void;
@@ -30,25 +32,26 @@ export declare class AsyncCache<K extends object, T> {
30
32
  } & {
31
33
  status: "ok";
32
34
  });
33
- getOrWait: (key: K) => ReactPromise<T>;
34
- refresh: (key: K) => Promise<T>;
35
- invalidate: (key: K) => Promise<T>;
36
- onChange: (key: K, callback: (value: T, oldValue: T | undefined) => void) => {
37
- unsubscribe: () => void;
38
- };
39
- onceChange: (key: K, callback: (value: T, oldValue: T | undefined) => void) => {
35
+ readonly getOrWait: (key: D, cacheStrategy: CacheStrategy) => ReactPromise<T>;
36
+ readonly refresh: (key: D) => Promise<T>;
37
+ readonly invalidate: (key: D) => Promise<T>;
38
+ readonly onChange: (key: D, callback: (value: T, oldValue: T | undefined) => void) => {
40
39
  unsubscribe: () => void;
41
40
  };
42
41
  }
43
- export declare class AsyncValueCache<T> implements ReadonlyAsyncStore<T> {
44
- private readonly _rateLimitOptions;
42
+ declare class AsyncValueCache<T> {
43
+ private readonly _options;
45
44
  private _store;
46
- private _firstFetcher;
47
- private _laterFetcher;
48
- constructor(fetcher: (isFirst: boolean) => Promise<T>, _rateLimitOptions?: Omit<RateLimitOptions, "batchCalls">);
49
- isAvailable(): boolean;
50
- setUnavailable(): void;
51
- get(): ({
45
+ private _fetcher;
46
+ private readonly _rateLimitOptions;
47
+ private _subscriptionsCount;
48
+ private _unsubscribers;
49
+ constructor(fetcher: () => Promise<T>, _options?: {
50
+ onSubscribe?: (refresh: () => void) => (() => void);
51
+ rateLimiter?: Omit<RateLimitOptions, "batchCalls">;
52
+ });
53
+ isCacheAvailable(): boolean;
54
+ getIfCached(): ({
52
55
  status: "pending";
53
56
  } & {
54
57
  progress: void;
@@ -65,7 +68,7 @@ export declare class AsyncValueCache<T> implements ReadonlyAsyncStore<T> {
65
68
  } & {
66
69
  status: "ok";
67
70
  });
68
- getOrWait(): ReactPromise<T>;
71
+ getOrWait(cacheStrategy: CacheStrategy): ReactPromise<T>;
69
72
  private _set;
70
73
  private _setAsync;
71
74
  private _refetch;
@@ -74,7 +77,6 @@ export declare class AsyncValueCache<T> implements ReadonlyAsyncStore<T> {
74
77
  onChange(callback: (value: T, oldValue: T | undefined) => void): {
75
78
  unsubscribe: () => void;
76
79
  };
77
- onceChange(callback: (value: T, oldValue: T | undefined) => void): {
78
- unsubscribe: () => void;
79
- };
80
80
  }
81
+ export {};
82
+ //# sourceMappingURL=caches.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"caches.d.ts","sourceRoot":"","sources":["../../src/utils/caches.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAe,MAAM,YAAY,CAAC;AACzE,OAAO,EAAc,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAE1D;;GAEG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS,QAAQ,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAYzD;AAGD,qBAAa,UAAU,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC;IAIvC,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAJpC,OAAO,CAAC,IAAI,CAA6C;gBAGtC,QAAQ,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,EAClD,iBAAiB,GAAE,IAAI,CAAC,gBAAgB,EAAE,YAAY,CAAoC;IAK7G,OAAO,CAAC,YAAY;IASpB,aAAa,CAAC,GAAG,EAAE,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC;IAWzC,WAAW,QAlBF,CAAC,aAkBqC;IAC/C,cAAc,QAnBL,CAAC,UAmB2C;IACrD,GAAG,QApBM,CAAC;;;;;;;;;;;;;;;;OAoBqB;IAC/B,SAAS,QArBA,CAAC,qBAqBiC;IAC3C,OAAO,QAtBE,CAAC,gBAsB6B;IACvC,UAAU,QAvBD,CAAC,gBAuBmC;IAC7C,QAAQ,QAxBC,CAAC;;MAwB+B;IACzC,UAAU,QAzBD,CAAC;;MAyBmC;CAC9C;AAED,qBAAa,eAAe,CAAC,CAAC,CAAE,YAAW,kBAAkB,CAAC,CAAC,CAAC;IAO5D,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IANpC,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,aAAa,CAAmB;IACxC,OAAO,CAAC,aAAa,CAAmB;gBAGtC,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,EACxB,iBAAiB,GAAE,IAAI,CAAC,gBAAgB,EAAE,YAAY,CAAyC;IAmBlH,WAAW,IAAI,OAAO;IAItB,cAAc,IAAI,IAAI;IAItB,GAAG;;;;;;;;;;;;;;;;;IAIH,SAAS,IAAI,YAAY,CAAC,CAAC,CAAC;IAI5B,OAAO,CAAC,IAAI;YAIE,SAAS;YAIT,QAAQ;IAWhB,OAAO,IAAI,OAAO,CAAC,CAAC,CAAC;IAIrB,UAAU,IAAI,OAAO,CAAC,CAAC,CAAC;IAK9B,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,SAAS,KAAK,IAAI,GAAG;QAAE,WAAW,EAAE,MAAM,IAAI,CAAA;KAAE;IAI5F,UAAU,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,SAAS,KAAK,IAAI,GAAG;QAAE,WAAW,EAAE,MAAM,IAAI,CAAA;KAAE;CAG/F"}
1
+ {"version":3,"file":"caches.d.ts","sourceRoot":"","sources":["../../src/utils/caches.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAqD,MAAM,YAAY,CAAC;AAG/G;;GAEG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS,QAAQ,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAYzD;AAGD,KAAK,aAAa,GAAG,YAAY,GAAG,YAAY,GAAG,OAAO,CAAC;AAE3D,qBAAa,UAAU,CAAC,CAAC,SAAS,GAAG,EAAE,EAAE,CAAC;IAItC,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAJ3B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAgD;gBAGlD,QAAQ,EAAE,CAAC,YAAY,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,EACzC,QAAQ,GAAE;QACzB,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC;QAC5D,WAAW,CAAC,EAAE,IAAI,CAAC,gBAAgB,EAAE,YAAY,CAAC,CAAC;KAC/C;IAKR,OAAO,CAAC,YAAY;IASpB,aAAa,CAAC,YAAY,EAAE,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC;IAelD,QAAQ,CAAC,gBAAgB,QAtBhB,CAAC,aAsBwD;IAClE,QAAQ,CAAC,WAAW,QAvBX,CAAC;;;;;;;;;;;;;;;;OAuB8C;IACxD,QAAQ,CAAC,SAAS,QAxBT,CAAC,mDAwB0C;IACpD,QAAQ,CAAC,OAAO,QAzBP,CAAC,gBAyBsC;IAChD,QAAQ,CAAC,UAAU,QA1BV,CAAC,gBA0B4C;IACtD,QAAQ,CAAC,QAAQ,QA3BR,CAAC;;MA2BwC;CACnD;AAED,cAAM,eAAe,CAAC,CAAC;IASnB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAR3B,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,QAAQ,CAAmB;IACnC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAuC;IACzE,OAAO,CAAC,mBAAmB,CAAK;IAChC,OAAO,CAAC,cAAc,CAAsB;gBAG1C,OAAO,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACR,QAAQ,GAAE;QACzB,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC;QACpD,WAAW,CAAC,EAAE,IAAI,CAAC,gBAAgB,EAAE,YAAY,CAAC,CAAC;KAC/C;IAgBR,gBAAgB,IAAI,OAAO;IAI3B,WAAW;;;;;;;;;;;;;;;;;IAIX,SAAS,CAAC,aAAa,EAAE,aAAa,GAAG,YAAY,CAAC,CAAC,CAAC;IASxD,OAAO,CAAC,IAAI;YAIE,SAAS;YAIT,QAAQ;IAahB,OAAO,IAAI,OAAO,CAAC,CAAC,CAAC;IAIrB,UAAU,IAAI,OAAO,CAAC,CAAC,CAAC;IAK9B,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,SAAS,KAAK,IAAI,GAAG;QAAE,WAAW,EAAE,MAAM,IAAI,CAAA;KAAE;CA0B7F"}
@@ -1,5 +1,6 @@
1
1
  import { DependenciesMap } from "./maps";
2
- import { rateLimited } from "./promises";
2
+ import { filterUndefined } from "./objects";
3
+ import { pending, rateLimited, resolved, runAsynchronously } from "./promises";
3
4
  import { AsyncStore } from "./stores";
4
5
  /**
5
6
  * Can be used to cache the result of a function call, for example for the `use` hook in React.
@@ -17,11 +18,11 @@ export function cacheFunction(f) {
17
18
  }
18
19
  export class AsyncCache {
19
20
  _fetcher;
20
- _rateLimitOptions;
21
- _map = new Map();
22
- constructor(_fetcher, _rateLimitOptions = { concurrency: 1, gapMs: 3_000 }) {
21
+ _options;
22
+ _map = new DependenciesMap();
23
+ constructor(_fetcher, _options = {}) {
23
24
  this._fetcher = _fetcher;
24
- this._rateLimitOptions = _rateLimitOptions;
25
+ this._options = _options;
25
26
  // nothing here yet
26
27
  }
27
28
  _createKeyed(functionName) {
@@ -30,57 +31,56 @@ export class AsyncCache {
30
31
  return valueCache[functionName].apply(valueCache, args);
31
32
  };
32
33
  }
33
- getValueCache(key) {
34
- let cache = this._map.get(key);
34
+ getValueCache(dependencies) {
35
+ let cache = this._map.get(dependencies);
35
36
  if (!cache) {
36
- cache = new AsyncValueCache(async (isFirst) => {
37
- return await this._fetcher(key, isFirst);
38
- }, this._rateLimitOptions);
39
- this._map.set(key, cache);
37
+ cache = new AsyncValueCache(async () => await this._fetcher(dependencies), {
38
+ ...this._options,
39
+ onSubscribe: this._options.onSubscribe ? (cb) => this._options.onSubscribe(dependencies, cb) : undefined,
40
+ });
41
+ this._map.set(dependencies, cache);
40
42
  }
41
43
  return cache;
42
44
  }
43
- isAvailable = this._createKeyed("isAvailable");
44
- setUnavailable = this._createKeyed("setUnavailable");
45
- get = this._createKeyed("get");
45
+ isCacheAvailable = this._createKeyed("isCacheAvailable");
46
+ getIfCached = this._createKeyed("getIfCached");
46
47
  getOrWait = this._createKeyed("getOrWait");
47
48
  refresh = this._createKeyed("refresh");
48
49
  invalidate = this._createKeyed("invalidate");
49
50
  onChange = this._createKeyed("onChange");
50
- onceChange = this._createKeyed("onceChange");
51
51
  }
52
- export class AsyncValueCache {
53
- _rateLimitOptions;
52
+ class AsyncValueCache {
53
+ _options;
54
54
  _store;
55
- _firstFetcher;
56
- _laterFetcher;
57
- constructor(fetcher, _rateLimitOptions = { concurrency: 1, debounceMs: 3_000 }) {
58
- this._rateLimitOptions = _rateLimitOptions;
55
+ _fetcher;
56
+ _rateLimitOptions;
57
+ _subscriptionsCount = 0;
58
+ _unsubscribers = [];
59
+ constructor(fetcher, _options = {}) {
60
+ this._options = _options;
59
61
  this._store = new AsyncStore();
60
- this._firstFetcher = async () => {
61
- return await fetcher(true);
62
+ this._rateLimitOptions = {
63
+ concurrency: 1,
64
+ debounceMs: 300,
65
+ ...filterUndefined(_options.rateLimiter ?? {}),
62
66
  };
63
- this._laterFetcher = rateLimited(async () => {
64
- return await fetcher(false);
65
- }, {
67
+ this._fetcher = rateLimited(fetcher, {
66
68
  ...this._rateLimitOptions,
67
69
  batchCalls: true,
68
70
  });
69
- this._refetch(true).catch(() => {
70
- this._store.setRejected(new Error("unavailable"));
71
- });
72
71
  }
73
- isAvailable() {
72
+ isCacheAvailable() {
74
73
  return this._store.isAvailable();
75
74
  }
76
- setUnavailable() {
77
- this._store.setUnavailable();
78
- }
79
- get() {
75
+ getIfCached() {
80
76
  return this._store.get();
81
77
  }
82
- getOrWait() {
83
- return this._store.getOrWait();
78
+ getOrWait(cacheStrategy) {
79
+ const cached = this.getIfCached();
80
+ if (cacheStrategy === "read-write" && cached.status === "ok") {
81
+ return resolved(cached.data);
82
+ }
83
+ return pending(this._refetch(cacheStrategy === "read-write" ? "write-only" : cacheStrategy));
84
84
  }
85
85
  _set(value) {
86
86
  this._store.set(value);
@@ -88,10 +88,12 @@ export class AsyncValueCache {
88
88
  async _setAsync(value) {
89
89
  return await this._store.setAsync(value);
90
90
  }
91
- async _refetch(isFirst) {
91
+ async _refetch(cacheStrategy) {
92
92
  try {
93
- const res = isFirst ? this._firstFetcher() : this._laterFetcher();
94
- await this._setAsync(res);
93
+ const res = this._fetcher();
94
+ if (cacheStrategy === "write-only") {
95
+ await this._setAsync(res);
96
+ }
95
97
  return await res;
96
98
  }
97
99
  catch (e) {
@@ -100,16 +102,34 @@ export class AsyncValueCache {
100
102
  }
101
103
  }
102
104
  async refresh() {
103
- return await this._refetch(false);
105
+ return await this.getOrWait("write-only");
104
106
  }
105
107
  async invalidate() {
106
- this.setUnavailable();
107
- return await this._refetch(false);
108
+ this._store.setUnavailable();
109
+ return await this.refresh();
108
110
  }
109
111
  onChange(callback) {
110
- return this._store.onChange(callback);
111
- }
112
- onceChange(callback) {
113
- return this._store.onceChange(callback);
112
+ const storeObj = this._store.onChange(callback);
113
+ if (this._subscriptionsCount++ === 0 && this._options.onSubscribe) {
114
+ const unsubscribe = this._options.onSubscribe(() => {
115
+ runAsynchronously(this.refresh());
116
+ });
117
+ this._unsubscribers.push(unsubscribe);
118
+ }
119
+ runAsynchronously(this.refresh());
120
+ let hasUnsubscribed = false;
121
+ return {
122
+ unsubscribe: () => {
123
+ if (hasUnsubscribed)
124
+ return;
125
+ hasUnsubscribed = true;
126
+ storeObj.unsubscribe();
127
+ if (--this._subscriptionsCount === 0) {
128
+ for (const unsubscribe of this._unsubscribers) {
129
+ unsubscribe();
130
+ }
131
+ }
132
+ },
133
+ };
114
134
  }
115
135
  }
@@ -1 +1,2 @@
1
1
  export declare function generateSecureRandomString(minBitsOfEntropy?: number): string;
2
+ //# sourceMappingURL=crypto.d.ts.map
@@ -10,3 +10,4 @@ export declare function fromNowDetailed(date: Date): {
10
10
  * Returns a string representation of the given date in the format expected by the `datetime-local` input type.
11
11
  */
12
12
  export declare function getInputDatetimeLocalString(date: Date): string;
13
+ //# sourceMappingURL=dates.d.ts.map
@@ -2,3 +2,4 @@
2
2
  * https://n2d4.github.io/frontend-starter/guides/advanced-concepts#clickable-parents
3
3
  */
4
4
  export declare function hasClickableParent(element: HTMLElement): boolean;
5
+ //# sourceMappingURL=dom.d.ts.map
@@ -2,3 +2,4 @@
2
2
  * Returns the environment variable with the given name, throwing an error if it's undefined or the empty string.
3
3
  */
4
4
  export declare function getEnvVariable(name: string): string;
5
+ //# sourceMappingURL=env.d.ts.map
@@ -182,3 +182,4 @@ export declare class StatusError extends Error {
182
182
  isServerError(): boolean;
183
183
  }
184
184
  export {};
185
+ //# sourceMappingURL=errors.d.ts.map
@@ -1,2 +1,3 @@
1
1
  export declare function escapeHtml(unsafe: string): string;
2
2
  export declare function html(strings: TemplateStringsArray, ...values: any[]): string;
3
+ //# sourceMappingURL=html.d.ts.map
@@ -8,3 +8,4 @@ export type ReadonlyJson = null | boolean | number | string | readonly ReadonlyJ
8
8
  export declare function isJson(value: unknown): value is Json;
9
9
  export declare function parseJson(json: string): Result<Json>;
10
10
  export declare function stringifyJson(json: Json): Result<string>;
11
+ //# sourceMappingURL=json.d.ts.map
@@ -1,3 +1,4 @@
1
1
  import * as jose from "jose";
2
2
  export declare function encryptJWT(payload: any, expirationTime?: string): Promise<string>;
3
3
  export declare function decryptJWT(jwt: string): Promise<jose.JWTPayload>;
4
+ //# sourceMappingURL=jwt.d.ts.map
@@ -18,5 +18,7 @@ export declare class DependenciesMap<K extends any[], V> {
18
18
  set(dependencies: K, value: V): this;
19
19
  delete(dependencies: K): boolean;
20
20
  has(dependencies: K): boolean;
21
+ clear(): void;
21
22
  [Symbol.toStringTag]: string;
22
23
  }
24
+ //# sourceMappingURL=maps.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"maps.d.ts","sourceRoot":"","sources":["../../src/utils/maps.tsx"],"names":[],"mappings":"AAEA,qBAAa,YAAY,CAAC,CAAC,EAAE,CAAC;IAC5B,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAY;IAC1C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA0B;gBAEvC,OAAO,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI;IAMzD,OAAO,CAAC,mBAAmB;IAI3B,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,SAAS;IAQ1B,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI;IAS3B,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO;IAQvB,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO;IAQpB,CAAC,MAAM,CAAC,WAAW,CAAC,SAAkB;CACvC;AAWD,qBAAa,eAAe,CAAC,CAAC,SAAS,GAAG,EAAE,EAAE,CAAC;IAC7C,OAAO,CAAC,MAAM,CAA2F;IAEzG,OAAO,CAAC,cAAc;IAStB,OAAO,CAAC,gBAAgB;IAaxB,OAAO,CAAC,WAAW;IAqBnB,GAAG,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,GAAG,SAAS;IAInC,GAAG,CAAC,YAAY,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI;IAKpC,MAAM,CAAC,YAAY,EAAE,CAAC,GAAG,OAAO;IAIhC,GAAG,CAAC,YAAY,EAAE,CAAC,GAAG,OAAO;IAI7B,CAAC,MAAM,CAAC,WAAW,CAAC,SAAqB;CAC1C"}
1
+ {"version":3,"file":"maps.d.ts","sourceRoot":"","sources":["../../src/utils/maps.tsx"],"names":[],"mappings":"AAEA,qBAAa,YAAY,CAAC,CAAC,EAAE,CAAC;IAC5B,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAY;IAC1C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA0B;gBAEvC,OAAO,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI;IAMzD,OAAO,CAAC,mBAAmB;IAI3B,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,SAAS;IAQ1B,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI;IAS3B,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO;IAQvB,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO;IAQpB,CAAC,MAAM,CAAC,WAAW,CAAC,SAAkB;CACvC;AAWD,qBAAa,eAAe,CAAC,CAAC,SAAS,GAAG,EAAE,EAAE,CAAC;IAC7C,OAAO,CAAC,MAAM,CAA2F;IAEzG,OAAO,CAAC,cAAc;IAStB,OAAO,CAAC,gBAAgB;IAaxB,OAAO,CAAC,WAAW;IAqBnB,GAAG,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,GAAG,SAAS;IAInC,GAAG,CAAC,YAAY,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI;IAKpC,MAAM,CAAC,YAAY,EAAE,CAAC,GAAG,OAAO;IAIhC,GAAG,CAAC,YAAY,EAAE,CAAC,GAAG,OAAO;IAI7B,KAAK,IAAI,IAAI;IAIb,CAAC,MAAM,CAAC,WAAW,CAAC,SAAqB;CAC1C"}
@@ -103,5 +103,8 @@ export class DependenciesMap {
103
103
  has(dependencies) {
104
104
  return this._unwrapFromInner(dependencies, this._inner).status === "ok";
105
105
  }
106
+ clear() {
107
+ this._inner = { map: new MaybeWeakMap(), hasValue: false, value: undefined };
108
+ }
106
109
  [Symbol.toStringTag] = "DependenciesMap";
107
110
  }
@@ -2,3 +2,4 @@
2
2
  * Similar to the modulo operator, but always returns a positive number (even when the input is negative).
3
3
  */
4
4
  export declare function remainder(n: number, d: number): number;
5
+ //# sourceMappingURL=math.d.ts.map
@@ -1,2 +1,3 @@
1
1
  export declare function prettyPrintWithMagnitudes(num: number): string;
2
2
  export declare function toFixedMax(num: number, maxDecimals: number): string;
3
+ //# sourceMappingURL=numbers.d.ts.map
@@ -16,3 +16,4 @@ export declare function typedAssign<T extends {}, U extends {}>(target: T, sourc
16
16
  export declare function filterUndefined<T extends {}>(obj: T): {
17
17
  [k in keyof T]+?: T[k] & ({} | null);
18
18
  };
19
+ //# sourceMappingURL=objects.d.ts.map
@@ -1,2 +1,3 @@
1
1
  export declare function hashPassword(password: string): Promise<string>;
2
2
  export declare function comparePassword(password: string, hash: string): Promise<boolean>;
3
+ //# sourceMappingURL=password.d.ts.map
@@ -13,6 +13,7 @@ export declare function resolved<T>(value: T): ReactPromise<T>;
13
13
  */
14
14
  export declare function rejected<T>(reason: unknown): ReactPromise<T>;
15
15
  export declare function neverResolve(): ReactPromise<never>;
16
+ export declare function pending<T>(promise: Promise<T>): ReactPromise<T>;
16
17
  export declare function wait(ms: number): Promise<void>;
17
18
  export declare function waitUntil(date: Date): Promise<void>;
18
19
  export declare function runAsynchronously(promiseOrFunc: Promise<unknown> | (() => Promise<unknown>) | undefined): void;
@@ -47,3 +48,4 @@ export type RateLimitOptions = {
47
48
  export declare function rateLimited<T>(func: () => Promise<T>, options: RateLimitOptions): () => Promise<T>;
48
49
  export declare function throttled<T, A extends any[]>(func: (...args: A) => Promise<T>, delayMs: number): (...args: A) => Promise<T>;
49
50
  export {};
51
+ //# sourceMappingURL=promises.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"promises.d.ts","sourceRoot":"","sources":["../../src/utils/promises.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAEnC,OAAO,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,OAAO,CAAC;AAElF,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,GAAG,CACvC,gBAAgB,CAAC,CAAC,CAAC,GACnB,iBAAiB,CAAC,CAAC,CAAC,GACpB,eAAe,CAAC,CAAC,CAAC,CACrB,CAAC;AAEF,KAAK,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;AACrC,KAAK,MAAM,GAAG,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;AACxC,wBAAgB,aAAa,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,GAAG,YAAY,CAAC,CAAC,CAAC,CA0BzG;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAKrD;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,GAAG,YAAY,CAAC,CAAC,CAAC,CAK5D;AAED,wBAAgB,YAAY,IAAI,YAAY,CAAC,KAAK,CAAC,CAIlD;AAED,wBAAsB,IAAI,CAAC,EAAE,EAAE,MAAM,iBAEpC;AAED,wBAAsB,SAAS,CAAC,IAAI,EAAE,IAAI,iBAEzC;AAED,wBAAgB,iBAAiB,CAAC,aAAa,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,SAAS,GAAG,IAAI,CAa9G;AAGD,cAAM,YAAa,SAAQ,KAAK;aACF,EAAE,EAAE,MAAM;gBAAV,EAAE,EAAE,MAAM;CAIvC;AAED,wBAAsB,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAKlG;AAED,wBAAsB,YAAY,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAEjF;AAGD,MAAM,MAAM,gBAAgB,GAAG;IAC7B;;OAEG;IACH,WAAW,EAAE,CAAC,CAAC;IAEf;;OAEG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,wBAAgB,WAAW,CAAC,CAAC,EAC3B,IAAI,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACtB,OAAO,EAAE,gBAAgB,GACxB,MAAM,OAAO,CAAC,CAAC,CAAC,CAoDlB;AAED,wBAAgB,SAAS,CAAC,CAAC,EAAE,CAAC,SAAS,GAAG,EAAE,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAe3H"}
1
+ {"version":3,"file":"promises.d.ts","sourceRoot":"","sources":["../../src/utils/promises.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAEnC,OAAO,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,OAAO,CAAC;AAElF,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,GAAG,CACvC,gBAAgB,CAAC,CAAC,CAAC,GACnB,iBAAiB,CAAC,CAAC,CAAC,GACpB,eAAe,CAAC,CAAC,CAAC,CACrB,CAAC;AAEF,KAAK,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;AACrC,KAAK,MAAM,GAAG,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;AACxC,wBAAgB,aAAa,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,GAAG,YAAY,CAAC,CAAC,CAAC,CA0BzG;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAKrD;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,GAAG,YAAY,CAAC,CAAC,CAAC,CAK5D;AAED,wBAAgB,YAAY,IAAI,YAAY,CAAC,KAAK,CAAC,CAElD;AAED,wBAAgB,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAI/D;AAED,wBAAsB,IAAI,CAAC,EAAE,EAAE,MAAM,iBAEpC;AAED,wBAAsB,SAAS,CAAC,IAAI,EAAE,IAAI,iBAEzC;AAED,wBAAgB,iBAAiB,CAAC,aAAa,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,SAAS,GAAG,IAAI,CAa9G;AAGD,cAAM,YAAa,SAAQ,KAAK;aACF,EAAE,EAAE,MAAM;gBAAV,EAAE,EAAE,MAAM;CAIvC;AAED,wBAAsB,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAKlG;AAED,wBAAsB,YAAY,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAEjF;AAGD,MAAM,MAAM,gBAAgB,GAAG;IAC7B;;OAEG;IACH,WAAW,EAAE,CAAC,CAAC;IAEf;;OAEG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,wBAAgB,WAAW,CAAC,CAAC,EAC3B,IAAI,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACtB,OAAO,EAAE,gBAAgB,GACxB,MAAM,OAAO,CAAC,CAAC,CAAC,CAoDlB;AAED,wBAAgB,SAAS,CAAC,CAAC,EAAE,CAAC,SAAS,GAAG,EAAE,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAe3H"}
@@ -47,7 +47,10 @@ export function rejected(reason) {
47
47
  });
48
48
  }
49
49
  export function neverResolve() {
50
- return Object.assign(new Promise(() => { }), {
50
+ return pending(new Promise(() => { }));
51
+ }
52
+ export function pending(promise) {
53
+ return Object.assign(promise, {
51
54
  status: "pending",
52
55
  });
53
56
  }
@@ -10,3 +10,4 @@ export declare function suspend(): never;
10
10
  * Use this in a component or a hook to disable SSR.
11
11
  */
12
12
  export declare function suspendIfSsr(): void;
13
+ //# sourceMappingURL=react.d.ts.map
@@ -71,3 +71,4 @@ declare function retry<T>(fn: () => Result<T> | Promise<Result<T>>, retries: num
71
71
  exponentialDelayBase?: number | undefined;
72
72
  }): Promise<Result<T, RetryError>>;
73
73
  export {};
74
+ //# sourceMappingURL=results.d.ts.map
@@ -55,3 +55,4 @@ export declare class AsyncStore<T> implements ReadonlyAsyncStore<T> {
55
55
  unsubscribe: () => void;
56
56
  };
57
57
  }
58
+ //# sourceMappingURL=stores.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"stores.d.ts","sourceRoot":"","sources":["../../src/utils/stores.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,OAAO,EAAE,YAAY,EAAsB,MAAM,YAAY,CAAC;AAE9D,MAAM,MAAM,kBAAkB,CAAC,CAAC,IAAI;IAClC,WAAW,IAAI,OAAO,CAAC;IACvB,GAAG,IAAI,WAAW,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;IACrC,SAAS,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,SAAS,KAAK,IAAI,GAAG;QAAE,WAAW,EAAE,MAAM,IAAI,CAAA;KAAE,CAAC;IAC7F,UAAU,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,SAAS,KAAK,IAAI,GAAG;QAAE,WAAW,EAAE,MAAM,IAAI,CAAA;KAAE,CAAC;CAChG,CAAC;AAEF,qBAAa,UAAU,CAAC,CAAC,CAAE,YAAW,kBAAkB,CAAC,CAAC,CAAC;IACzD,OAAO,CAAC,YAAY,CAAU;IAC9B,OAAO,CAAC,MAAM,CAA4B;IAE1C,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,eAAe,CAAU;IACjC,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAiD;IAEzF,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAyE;IAEpG,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,qBAAqB,CAAM;gBAEvB,GAAG,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;IAS7B,WAAW,IAAI,OAAO;IAItB,UAAU,IAAI,OAAO;IAIrB,GAAG;;;;;;;;;;;;;;;;;IAUH,SAAS,IAAI,YAAY,CAAC,CAAC,CAAC;IAqB5B,YAAY,CAAC,KAAK,EAAE,CAAC,EAAE,UAAU,EAAE,MAAM;IAgBzC,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI;IAInB,MAAM,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,GAAG,SAAS,KAAK,CAAC,GAAG,CAAC;IAMzC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAMrD,cAAc,IAAI,IAAI;IAMtB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAOjC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC;IAQ9C,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,SAAS,KAAK,IAAI,GAAG;QAAE,WAAW,EAAE,MAAM,IAAI,CAAA;KAAE;IAU5F,UAAU,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,SAAS,KAAK,IAAI,GAAG;QAAE,WAAW,EAAE,MAAM,IAAI,CAAA;KAAE;CAO/F"}
1
+ {"version":3,"file":"stores.d.ts","sourceRoot":"","sources":["../../src/utils/stores.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,OAAO,EAAE,YAAY,EAA+B,MAAM,YAAY,CAAC;AAEvE,MAAM,MAAM,kBAAkB,CAAC,CAAC,IAAI;IAClC,WAAW,IAAI,OAAO,CAAC;IACvB,GAAG,IAAI,WAAW,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;IACrC,SAAS,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,SAAS,KAAK,IAAI,GAAG;QAAE,WAAW,EAAE,MAAM,IAAI,CAAA;KAAE,CAAC;IAC7F,UAAU,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,SAAS,KAAK,IAAI,GAAG;QAAE,WAAW,EAAE,MAAM,IAAI,CAAA;KAAE,CAAC;CAChG,CAAC;AAEF,qBAAa,UAAU,CAAC,CAAC,CAAE,YAAW,kBAAkB,CAAC,CAAC,CAAC;IACzD,OAAO,CAAC,YAAY,CAAU;IAC9B,OAAO,CAAC,MAAM,CAA4B;IAE1C,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,eAAe,CAAU;IACjC,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAiD;IAEzF,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAyE;IAEpG,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,qBAAqB,CAAM;gBAEvB,GAAG,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;IAS7B,WAAW,IAAI,OAAO;IAItB,UAAU,IAAI,OAAO;IAIrB,GAAG;;;;;;;;;;;;;;;;;IAUH,SAAS,IAAI,YAAY,CAAC,CAAC,CAAC;IAmB5B,YAAY,CAAC,KAAK,EAAE,CAAC,EAAE,UAAU,EAAE,MAAM;IAgBzC,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI;IAInB,MAAM,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,GAAG,SAAS,KAAK,CAAC,GAAG,CAAC;IAMzC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAMrD,cAAc,IAAI,IAAI;IAMtB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAOjC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC;IAQ9C,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,SAAS,KAAK,IAAI,GAAG;QAAE,WAAW,EAAE,MAAM,IAAI,CAAA;KAAE;IAU5F,UAAU,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,SAAS,KAAK,IAAI,GAAG;QAAE,WAAW,EAAE,MAAM,IAAI,CAAA;KAAE;CAO/F"}
@@ -1,6 +1,6 @@
1
1
  import { AsyncResult } from "./results";
2
2
  import { generateUuid } from "./uuids";
3
- import { rejected, resolved } from "./promises";
3
+ import { pending, rejected, resolved } from "./promises";
4
4
  export class AsyncStore {
5
5
  _isAvailable;
6
6
  _value = undefined;
@@ -53,9 +53,7 @@ export class AsyncStore {
53
53
  const withFinally = promise.finally(() => {
54
54
  this._waitingRejectFunctions.delete(uuid);
55
55
  });
56
- return Object.assign(withFinally, {
57
- status: "pending",
58
- });
56
+ return pending(withFinally);
59
57
  }
60
58
  _setIfLatest(value, curCounter) {
61
59
  if (!this._isAvailable || this._isRejected || this._value !== value) {
@@ -38,3 +38,4 @@ export declare function trimLines(s: string): string;
38
38
  export declare function templateIdentity(strings: TemplateStringsArray | readonly string[], ...values: any[]): string;
39
39
  export declare function deindent(code: string): string;
40
40
  export declare function deindent(strings: TemplateStringsArray | readonly string[], ...values: any[]): string;
41
+ //# sourceMappingURL=strings.d.ts.map
@@ -1,7 +1,4 @@
1
1
  import { StatusError } from "./errors";
2
- export type ReadonlyJson = null | boolean | number | string | readonly ReadonlyJson[] | {
3
- readonly [key: string]: ReadonlyJson;
4
- };
5
2
  export declare const AccessTokenExpiredErrorCode = "ACCESS_TOKEN_EXPIRED";
6
3
  export declare const GrantInvalidErrorCode = "GRANT_INVALID";
7
4
  export declare const UserAlreadyExistErrorCode = "USER_ALREADY_EXIST";
@@ -17,17 +14,18 @@ export declare const EmailVerificationLinkUsedErrorCode = "EMAIL_VERIFICATION_LI
17
14
  export declare const PasswordResetLinkInvalidErrorCode = "PASSWORD_RESET_LINK_INVALID";
18
15
  export declare const PasswordResetLinkExpiredErrorCode = "PASSWORD_RESET_LINK_EXPIRED";
19
16
  export declare const PasswordResetLinkUsedErrorCode = "PASSWORD_RESET_LINK_USED";
20
- export type KnownErrorCode = typeof GrantInvalidErrorCode | typeof AccessTokenExpiredErrorCode | typeof UserAlreadyExistErrorCode | typeof UserNotExistErrorCode | typeof UserNotVerifiedErrorCode | typeof EmailPasswordMissMatchErrorCode | typeof RedirectUrlInvalidErrorCode | typeof PasswordFormatInvalidErrorCode | typeof ProjectIdOrKeyInvalidErrorCode | typeof EmailVerificationLinkInvalidErrorCode | typeof EmailVerificationLinkExpiredErrorCode | typeof EmailVerificationLinkUsedErrorCode | typeof PasswordResetLinkInvalidErrorCode | typeof PasswordResetLinkExpiredErrorCode | typeof PasswordResetLinkUsedErrorCode;
21
- export declare const KnownErrorCodes: string[];
22
- export type SignUpErrorCode = typeof UserAlreadyExistErrorCode;
23
- export declare const SignUpErrorCodes: string[];
24
- export type SignInErrorCode = typeof EmailPasswordMissMatchErrorCode | typeof UserNotExistErrorCode;
25
- export declare const SignInErrorCodes: string[];
26
- export type EmailVerificationLinkErrorCode = typeof EmailVerificationLinkInvalidErrorCode | typeof EmailVerificationLinkExpiredErrorCode | typeof EmailVerificationLinkUsedErrorCode;
27
- export declare const EmailVerificationLinkErrorCodes: string[];
28
- export type PasswordResetLinkErrorCode = typeof PasswordResetLinkInvalidErrorCode | typeof PasswordResetLinkExpiredErrorCode | typeof PasswordResetLinkUsedErrorCode;
29
- export declare const PasswordResetLinkErrorCodes: string[];
17
+ export declare const KnownErrorCodes: readonly ["ACCESS_TOKEN_EXPIRED", "GRANT_INVALID", "USER_ALREADY_EXIST", "USER_NOT_EXIST", "USER_NOT_VERIFIED", "EMAIL_PASSWORD_MISS_MATCH", "REDIRECT_URL_INVALID", "PASSWORD_FORMAT_INVALID", "PROJECT_ID_OR_KEY_INVALID", "EMAIL_VERIFICATION_LINK_INVALID", "EMAIL_VERIFICATION_LINK_EXPIRED", "EMAIL_VERIFICATION_LINK_USED", "PASSWORD_RESET_LINK_INVALID", "PASSWORD_RESET_LINK_EXPIRED", "PASSWORD_RESET_LINK_USED"];
18
+ export type KnownErrorCode = typeof KnownErrorCodes[number];
19
+ export declare const SignUpErrorCodes: readonly ["USER_ALREADY_EXIST"];
20
+ export type SignUpErrorCode = typeof SignUpErrorCodes[number];
21
+ export declare const SignInErrorCodes: readonly ["EMAIL_PASSWORD_MISS_MATCH", "USER_NOT_EXIST"];
22
+ export type SignInErrorCode = typeof SignInErrorCodes[number];
23
+ export declare const EmailVerificationLinkErrorCodes: readonly ["EMAIL_VERIFICATION_LINK_INVALID", "EMAIL_VERIFICATION_LINK_EXPIRED", "EMAIL_VERIFICATION_LINK_USED"];
24
+ export type EmailVerificationLinkErrorCode = typeof EmailVerificationLinkErrorCodes[number];
25
+ export declare const PasswordResetLinkErrorCodes: readonly ["PASSWORD_RESET_LINK_INVALID", "PASSWORD_RESET_LINK_EXPIRED", "PASSWORD_RESET_LINK_USED"];
26
+ export type PasswordResetLinkErrorCode = typeof PasswordResetLinkErrorCodes[number];
30
27
  export declare class KnownError extends StatusError {
31
28
  readonly errorCode: KnownErrorCode;
32
29
  constructor(errorCode: KnownErrorCode);
33
30
  }
31
+ //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/utils/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAKvC,MAAM,MAAM,YAAY,GACpB,IAAI,GACJ,OAAO,GACP,MAAM,GACN,MAAM,GACN,SAAS,YAAY,EAAE,GACvB;IAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,YAAY,CAAA;CAAE,CAAC;AAE7C,eAAO,MAAM,2BAA2B,yBAAyB,CAAC;AAClE,eAAO,MAAM,qBAAqB,kBAAkB,CAAC;AACrD,eAAO,MAAM,yBAAyB,uBAAuB,CAAC;AAC9D,eAAO,MAAM,qBAAqB,mBAAmB,CAAC;AACtD,eAAO,MAAM,wBAAwB,sBAAsB,CAAC;AAC5D,eAAO,MAAM,+BAA+B,8BAA8B,CAAC;AAC3E,eAAO,MAAM,2BAA2B,yBAAyB,CAAC;AAClE,eAAO,MAAM,8BAA8B,4BAA4B,CAAC;AACxE,eAAO,MAAM,8BAA8B,8BAA8B,CAAC;AAC1E,eAAO,MAAM,qCAAqC,oCAAoC,CAAC;AACvF,eAAO,MAAM,qCAAqC,oCAAoC,CAAC;AACvF,eAAO,MAAM,kCAAkC,iCAAiC,CAAC;AACjF,eAAO,MAAM,iCAAiC,gCAAgC,CAAC;AAC/E,eAAO,MAAM,iCAAiC,gCAAgC,CAAC;AAC/E,eAAO,MAAM,8BAA8B,6BAA6B,CAAC;AAEzE,MAAM,MAAM,cAAc,GACtB,OAAO,qBAAqB,GAC5B,OAAO,2BAA2B,GAClC,OAAO,yBAAyB,GAChC,OAAO,qBAAqB,GAC5B,OAAO,wBAAwB,GAC/B,OAAO,+BAA+B,GACtC,OAAO,2BAA2B,GAClC,OAAO,8BAA8B,GACrC,OAAO,8BAA8B,GACrC,OAAO,qCAAqC,GAC5C,OAAO,qCAAqC,GAC5C,OAAO,kCAAkC,GACzC,OAAO,iCAAiC,GACxC,OAAO,iCAAiC,GACxC,OAAO,8BAA8B,CAAA;AACzC,eAAO,MAAM,eAAe,UAgB3B,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG,OAAO,yBAAyB,CAAA;AAC9D,eAAO,MAAM,gBAAgB,UAA8B,CAAC;AAE5D,MAAM,MAAM,eAAe,GAAG,OAAO,+BAA+B,GAChE,OAAO,qBAAqB,CAAA;AAChC,eAAO,MAAM,gBAAgB,UAG5B,CAAC;AAEF,MAAM,MAAM,8BAA8B,GAAG,OAAO,qCAAqC,GACrF,OAAO,qCAAqC,GAAG,OAAO,kCAAkC,CAAA;AAC5F,eAAO,MAAM,+BAA+B,UAI3C,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG,OAAO,iCAAiC,GAC7E,OAAO,iCAAiC,GAAG,OAAO,8BAA8B,CAAA;AACpF,eAAO,MAAM,2BAA2B,UAIvC,CAAC;AAEF,qBAAa,UAAW,SAAQ,WAAW;aACb,SAAS,EAAE,cAAc;gBAAzB,SAAS,EAAE,cAAc;CAatD"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/utils/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEvC,eAAO,MAAM,2BAA2B,yBAAyB,CAAC;AAClE,eAAO,MAAM,qBAAqB,kBAAkB,CAAC;AACrD,eAAO,MAAM,yBAAyB,uBAAuB,CAAC;AAC9D,eAAO,MAAM,qBAAqB,mBAAmB,CAAC;AACtD,eAAO,MAAM,wBAAwB,sBAAsB,CAAC;AAC5D,eAAO,MAAM,+BAA+B,8BAA8B,CAAC;AAC3E,eAAO,MAAM,2BAA2B,yBAAyB,CAAC;AAClE,eAAO,MAAM,8BAA8B,4BAA4B,CAAC;AACxE,eAAO,MAAM,8BAA8B,8BAA8B,CAAC;AAC1E,eAAO,MAAM,qCAAqC,oCAAoC,CAAC;AACvF,eAAO,MAAM,qCAAqC,oCAAoC,CAAC;AACvF,eAAO,MAAM,kCAAkC,iCAAiC,CAAC;AACjF,eAAO,MAAM,iCAAiC,gCAAgC,CAAC;AAC/E,eAAO,MAAM,iCAAiC,gCAAgC,CAAC;AAC/E,eAAO,MAAM,8BAA8B,6BAA6B,CAAC;AAEzE,eAAO,MAAM,eAAe,8ZAgBlB,CAAC;AACX,MAAM,MAAM,cAAc,GAAG,OAAO,eAAe,CAAC,MAAM,CAAC,CAAC;AAE5D,eAAO,MAAM,gBAAgB,iCAAuC,CAAC;AACrE,MAAM,MAAM,eAAe,GAAG,OAAO,gBAAgB,CAAC,MAAM,CAAC,CAAC;AAE9D,eAAO,MAAM,gBAAgB,0DAGnB,CAAC;AACX,MAAM,MAAM,eAAe,GAAG,OAAO,gBAAgB,CAAC,MAAM,CAAC,CAAC;AAE9D,eAAO,MAAM,+BAA+B,iHAIlC,CAAC;AACX,MAAM,MAAM,8BAA8B,GAAG,OAAO,+BAA+B,CAAC,MAAM,CAAC,CAAA;AAE3F,eAAO,MAAM,2BAA2B,qGAI9B,CAAC;AACX,MAAM,MAAM,0BAA0B,GAAG,OAAO,2BAA2B,CAAC,MAAM,CAAC,CAAA;AAEnF,qBAAa,UAAW,SAAQ,WAAW;aACb,SAAS,EAAE,cAAc;gBAAzB,SAAS,EAAE,cAAc;CAatD"}
@@ -1 +1,2 @@
1
1
  export declare function generateUuid(): string;
2
+ //# sourceMappingURL=uuids.d.ts.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stackframe/stack-shared",
3
- "version": "1.1.0",
3
+ "version": "1.2.0",
4
4
  "main": "./dist/index.js",
5
5
  "types": "./dist/index.d.ts",
6
6
  "files": [