@peerbit/react 0.0.13 → 0.0.14

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.
@@ -1,5 +1,8 @@
1
- export { PeerProvider, PeerContext, usePeer } from "./usePeer.js";
1
+ export { PeerProvider, PeerContext, usePeer, ClientBusyError, } from "./usePeer.js";
2
2
  export * from "./utils.js";
3
3
  export { FastMutex } from "./lockstorage.js";
4
4
  export { useProgram } from "./useProgram.js";
5
5
  export { useLocal } from "./useLocal.js";
6
+ export { useOnline } from "./useOnline.js";
7
+ export { useCount } from "./useCount.js";
8
+ export { debounceLeadingTrailing } from "./utils.js";
package/lib/esm/index.js CHANGED
@@ -1,6 +1,9 @@
1
- export { PeerProvider, PeerContext, usePeer } from "./usePeer.js";
1
+ export { PeerProvider, PeerContext, usePeer, ClientBusyError, } from "./usePeer.js";
2
2
  export * from "./utils.js";
3
3
  export { FastMutex } from "./lockstorage.js";
4
4
  export { useProgram } from "./useProgram.js";
5
5
  export { useLocal } from "./useLocal.js";
6
+ export { useOnline } from "./useOnline.js";
7
+ export { useCount } from "./useCount.js";
8
+ export { debounceLeadingTrailing } from "./utils.js";
6
9
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAClE,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,YAAY,EACZ,WAAW,EACX,OAAO,EACP,eAAe,GAClB,MAAM,cAAc,CAAC;AACtB,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC"}
@@ -12,9 +12,11 @@ export declare class FastMutex {
12
12
  timeout?: number | undefined;
13
13
  localStorage?: any;
14
14
  });
15
- lock(key: string, keepLocked?: () => boolean): Promise<{
15
+ lock(key: string, keepLocked?: () => boolean, options?: {
16
+ replaceIfSameClient?: boolean;
17
+ }): Promise<{
16
18
  restartCount: number;
17
- contentionCount: any;
19
+ contentionCount: number;
18
20
  locksLost: number;
19
21
  }>;
20
22
  isLocked(key: string): boolean;
@@ -32,71 +32,84 @@ export class FastMutex {
32
32
  this.intervals = new Map();
33
33
  this.localStorage = localStorage || window.localStorage;
34
34
  }
35
- lock(key, keepLocked) {
35
+ lock(key, keepLocked, options) {
36
36
  debug('Attempting to acquire Lock on "%s" using FastMutex instance "%s"', key, this.clientId);
37
37
  const x = this.xPrefix + key;
38
38
  const y = this.yPrefix + key;
39
- let acquireStart = +new Date();
39
+ let acquireStart = Date.now();
40
40
  return new Promise((resolve, reject) => {
41
- // we need to differentiate between API calls to lock() and our internal
42
- // recursive calls so that we can timeout based on the original lock() and
43
- // not each subsequent call. Therefore, create a new function here within
44
- // the promise closure that we use for subsequent calls:
45
41
  let restartCount = 0;
46
42
  let contentionCount = 0;
47
43
  let locksLost = 0;
48
44
  const acquireLock = (key) => {
45
+ // If the option is set and the same client already holds both keys,
46
+ // update the expiry and resolve immediately.
47
+ if (options?.replaceIfSameClient) {
48
+ const currentX = this.getItem(x);
49
+ const currentY = this.getItem(y);
50
+ if (currentX === this.clientId &&
51
+ currentY === this.clientId) {
52
+ // Update expiry so that the lock is effectively "replaced"
53
+ this.setItem(x, this.clientId, keepLocked);
54
+ this.setItem(y, this.clientId, keepLocked);
55
+ debug('FastMutex client "%s" replaced its own lock on "%s".', this.clientId, key);
56
+ return resolve({
57
+ restartCount,
58
+ contentionCount,
59
+ locksLost,
60
+ });
61
+ }
62
+ }
63
+ // Check for overall retries/timeouts.
49
64
  if (restartCount > 1000 ||
50
65
  contentionCount > 1000 ||
51
66
  locksLost > 1000) {
52
- reject("Failed to resolve lock");
67
+ return reject("Failed to resolve lock");
53
68
  }
54
- const elapsedTime = new Date().getTime() - acquireStart;
69
+ const elapsedTime = Date.now() - acquireStart;
55
70
  if (elapsedTime >= this.timeout) {
56
71
  debug('Lock on "%s" could not be acquired within %sms by FastMutex client "%s"', key, this.timeout, this.clientId);
57
72
  return reject(new Error(`Lock could not be acquired within ${this.timeout}ms`));
58
73
  }
74
+ // First, set key X.
59
75
  this.setItem(x, this.clientId, keepLocked);
60
- // if y exists, another client is getting a lock, so retry in a bit
76
+ // Check if key Y exists (another client may be acquiring the lock)
61
77
  let lsY = this.getItem(y);
62
78
  if (lsY) {
63
79
  debug("Lock exists on Y (%s), restarting...", lsY);
64
80
  restartCount++;
65
- setTimeout(() => acquireLock(key));
81
+ setTimeout(() => acquireLock(key), 10);
66
82
  return;
67
83
  }
68
- // ask for inner lock
84
+ // Request the inner lock by setting Y.
69
85
  this.setItem(y, this.clientId, keepLocked);
70
- // if x was changed, another client is contending for an inner lock
86
+ // Re-check X; if it was changed, we have contention.
71
87
  let lsX = this.getItem(x);
72
88
  if (lsX !== this.clientId) {
73
89
  contentionCount++;
74
90
  debug('Lock contention detected. X="%s"', lsX);
75
- // Give enough time for critical section:
76
91
  setTimeout(() => {
77
92
  lsY = this.getItem(y);
78
93
  if (lsY === this.clientId) {
79
- // we have a lock
80
94
  debug('FastMutex client "%s" won the lock contention on "%s"', this.clientId, key);
81
95
  resolve({
96
+ restartCount,
82
97
  contentionCount,
83
98
  locksLost,
84
- restartCount,
85
99
  });
86
100
  }
87
101
  else {
88
- // we lost the lock, restart the process again
89
102
  restartCount++;
90
103
  locksLost++;
91
104
  debug('FastMutex client "%s" lost the lock contention on "%s" to another process (%s). Restarting...', this.clientId, key, lsY);
92
- setTimeout(() => acquireLock(key));
105
+ setTimeout(() => acquireLock(key), 10);
93
106
  }
94
107
  }, 50);
95
108
  return;
96
109
  }
97
- // no contention:
110
+ // No contention: lock is acquired.
98
111
  debug('FastMutex client "%s" acquired a lock on "%s" with no contention', this.clientId, key);
99
- resolve({ contentionCount, locksLost, restartCount });
112
+ resolve({ restartCount, contentionCount, locksLost });
100
113
  };
101
114
  acquireLock(key);
102
115
  });
@@ -1 +1 @@
1
- {"version":3,"file":"lockstorage.js","sourceRoot":"","sources":["../../src/lockstorage.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"lockstorage.js","sourceRoot":"","sources":["../../src/lockstorage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { Documents } from "@peerbit/document";
2
+ import * as indexerTypes from "@peerbit/indexer-interface";
3
+ type QueryOptons = {
4
+ query: indexerTypes.Query[] | indexerTypes.QueryLike;
5
+ id: string;
6
+ };
7
+ export declare const useCount: <T extends Record<string, any>>(db?: Documents<T, any, any>, options?: {
8
+ debounce?: number;
9
+ debug?: boolean;
10
+ } & QueryOptons) => number;
11
+ export {};
@@ -0,0 +1,40 @@
1
+ import { ClosedError } from "@peerbit/document";
2
+ import { useEffect, useRef, useState } from "react";
3
+ import { debounceLeadingTrailing } from "./utils";
4
+ export const useCount = (db, options) => {
5
+ const [count, setCount] = useState(0);
6
+ const countRef = useRef(0);
7
+ useEffect(() => {
8
+ if (!db || db.closed) {
9
+ return;
10
+ }
11
+ const _l = async (args) => {
12
+ try {
13
+ const count = await db.count({
14
+ query: options?.query,
15
+ approximate: true,
16
+ });
17
+ countRef.current = count;
18
+ setCount(count);
19
+ }
20
+ catch (error) {
21
+ if (error instanceof ClosedError) {
22
+ return;
23
+ }
24
+ throw error;
25
+ }
26
+ };
27
+ const debounced = debounceLeadingTrailing(_l, options?.debounce ?? 1000);
28
+ const handleChange = () => {
29
+ debounced();
30
+ };
31
+ debounced();
32
+ db.events.addEventListener("change", handleChange);
33
+ return () => {
34
+ db.events.removeEventListener("change", handleChange);
35
+ debounced.cancel();
36
+ };
37
+ }, [db?.closed ? undefined : db?.rootAddress, options?.id]);
38
+ return count;
39
+ };
40
+ //# sourceMappingURL=useCount.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useCount.js","sourceRoot":"","sources":["../../src/useCount.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAA0B,MAAM,mBAAmB,CAAC;AACxE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEpD,OAAO,EAAE,uBAAuB,EAAE,MAAM,SAAS,CAAC;AAMlD,MAAM,CAAC,MAAM,QAAQ,GAAG,CACpB,EAA2B,EAC3B,OAGe,EACjB,EAAE;IACA,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAS,CAAC,CAAC,CAAC;IAC9C,MAAM,QAAQ,GAAG,MAAM,CAAS,CAAC,CAAC,CAAC;IAEnC,SAAS,CAAC,GAAG,EAAE;QACX,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,CAAC;YACnB,OAAO;QACX,CAAC;QAED,MAAM,EAAE,GAAG,KAAK,EAAE,IAAU,EAAE,EAAE;YAC5B,IAAI,CAAC;gBACD,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC;oBACzB,KAAK,EAAE,OAAO,EAAE,KAAK;oBACrB,WAAW,EAAE,IAAI;iBACpB,CAAC,CAAC;gBACH,QAAQ,CAAC,OAAO,GAAG,KAAK,CAAC;gBACzB,QAAQ,CAAC,KAAK,CAAC,CAAC;YACpB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACb,IAAI,KAAK,YAAY,WAAW,EAAE,CAAC;oBAC/B,OAAO;gBACX,CAAC;gBACD,MAAM,KAAK,CAAC;YAChB,CAAC;QACL,CAAC,CAAC;QAEF,MAAM,SAAS,GAAG,uBAAuB,CACrC,EAAE,EACF,OAAO,EAAE,QAAQ,IAAI,IAAI,CAC5B,CAAC;QAEF,MAAM,YAAY,GAAG,GAAG,EAAE;YACtB,SAAS,EAAE,CAAC;QAChB,CAAC,CAAC;QAEF,SAAS,EAAE,CAAC;QACZ,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QAEnD,OAAO,GAAG,EAAE;YACR,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;YACtD,SAAS,CAAC,MAAM,EAAE,CAAC;QACvB,CAAC,CAAC;IACN,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;IAE5D,OAAO,KAAK,CAAC;AACjB,CAAC,CAAC"}
@@ -1,2 +1,18 @@
1
- import { Documents } from "@peerbit/document";
2
- export declare const useLocal: <T extends Record<string, any>>(db?: Documents<T, any>) => T[];
1
+ import { Documents, WithContext } from "@peerbit/document";
2
+ import * as indexerTypes from "@peerbit/indexer-interface";
3
+ type QueryLike = {
4
+ query?: indexerTypes.Query[] | indexerTypes.QueryLike;
5
+ sort?: indexerTypes.Sort[] | indexerTypes.Sort | indexerTypes.SortLike;
6
+ };
7
+ type QueryOptons = {
8
+ query: QueryLike;
9
+ id: string;
10
+ };
11
+ export declare const useLocal: <T extends Record<string, any>, I extends Record<string, any>, R extends boolean | undefined = true, RT = R extends false ? WithContext<I> : WithContext<T>>(db?: Documents<T, I>, options?: {
12
+ resolve?: R;
13
+ transform?: (result: RT) => Promise<RT>;
14
+ onChanges?: (all: RT[]) => void;
15
+ debounce?: number;
16
+ debug?: boolean;
17
+ } & QueryOptons) => RT[];
18
+ export {};
@@ -1,30 +1,67 @@
1
- import { ClosedError, SearchRequest } from "@peerbit/document";
2
- import { useEffect, useState } from "react";
3
- export const useLocal = (db) => {
1
+ import { ClosedError } from "@peerbit/document";
2
+ import { useEffect, useRef, useState } from "react";
3
+ import { debounceLeadingTrailing } from "./utils";
4
+ export const useLocal = (db, options) => {
4
5
  const [all, setAll] = useState([]);
6
+ const emptyResultsRef = useRef(false);
5
7
  useEffect(() => {
6
8
  if (!db || db.closed) {
7
9
  return;
8
10
  }
9
- const changeListener = async () => {
11
+ const _l = async (args) => {
10
12
  try {
11
- setAll(await db.index.search(new SearchRequest(), {
13
+ const iterator = db.index.iterate(options?.query ?? {}, {
12
14
  local: true,
13
15
  remote: false,
14
- }));
16
+ resolve: options?.resolve,
17
+ });
18
+ let results = (await iterator.all());
19
+ if (options?.transform) {
20
+ results = await Promise.all(results.map((x) => options.transform(x)));
21
+ }
22
+ emptyResultsRef.current = results.length === 0;
23
+ setAll(() => {
24
+ options?.onChanges?.(results);
25
+ return results;
26
+ });
15
27
  }
16
28
  catch (error) {
17
29
  if (error instanceof ClosedError) {
18
- // ignore
19
30
  return;
20
31
  }
21
32
  throw error;
22
33
  }
23
34
  };
24
- changeListener();
25
- db.events.addEventListener("change", changeListener);
26
- return () => db.events.addEventListener("change", changeListener);
27
- }, [db?.address, db?.closed]);
35
+ const debounced = debounceLeadingTrailing(_l, options?.debounce ?? 1000);
36
+ let ts = setTimeout(() => {
37
+ _l();
38
+ }, 3000);
39
+ const handleChange = () => {
40
+ if (emptyResultsRef.current) {
41
+ debounced.cancel();
42
+ if (options?.debug) {
43
+ console.log("Empty results detected. Bypassing debounce for immediate search.");
44
+ }
45
+ _l();
46
+ }
47
+ else {
48
+ debounced();
49
+ }
50
+ };
51
+ debounced();
52
+ db.events.addEventListener("change", handleChange);
53
+ return () => {
54
+ db.events.removeEventListener("change", handleChange);
55
+ debounced.cancel();
56
+ clearTimeout(ts);
57
+ };
58
+ }, [
59
+ db?.closed ? undefined : db?.rootAddress,
60
+ options?.id,
61
+ options?.resolve,
62
+ options?.onChanges,
63
+ options?.transform,
64
+ ]);
28
65
  return all;
29
66
  };
30
67
  //# sourceMappingURL=useLocal.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useLocal.js","sourceRoot":"","sources":["../../src/useLocal.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAa,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAC1E,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC5C,MAAM,CAAC,MAAM,QAAQ,GAAG,CACpB,EAAsB,EACxB,EAAE;IACA,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,QAAQ,CAAM,EAAE,CAAC,CAAC;IACxC,SAAS,CAAC,GAAG,EAAE;QACX,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,CAAC;YACnB,OAAO;QACX,CAAC;QAED,MAAM,cAAc,GAAG,KAAK,IAAI,EAAE;YAC9B,IAAI,CAAC;gBACD,MAAM,CACF,MAAM,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,aAAa,EAAE,EAAE;oBACvC,KAAK,EAAE,IAAI;oBACX,MAAM,EAAE,KAAK;iBAChB,CAAC,CACL,CAAC;YACN,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACb,IAAI,KAAK,YAAY,WAAW,EAAE,CAAC;oBAC/B,SAAS;oBACT,OAAO;gBACX,CAAC;gBACD,MAAM,KAAK,CAAC;YAChB,CAAC;QACL,CAAC,CAAC;QAEF,cAAc,EAAE,CAAC;QACjB,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;QAErD,OAAO,GAAG,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;IACtE,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;IAC9B,OAAO,GAAG,CAAC;AACf,CAAC,CAAC"}
1
+ {"version":3,"file":"useLocal.js","sourceRoot":"","sources":["../../src/useLocal.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { Program, ProgramEvents } from "@peerbit/program";
2
+ import { PublicSignKey } from "@peerbit/crypto";
3
+ type ExtractArgs<T> = T extends Program<infer Args> ? Args : never;
4
+ type ExtractEvents<T> = T extends Program<any, infer Events> ? Events : never;
5
+ export declare const useOnline: <P extends Program<ExtractArgs<P>, ExtractEvents<P>> & Program<any, ProgramEvents>>(program?: P, options?: {
6
+ id?: string;
7
+ }) => {
8
+ peers: PublicSignKey[];
9
+ };
10
+ export {};
@@ -0,0 +1,52 @@
1
+ import { useEffect, useState } from "react";
2
+ const addressOrDefined = (p) => {
3
+ try {
4
+ return p?.rootAddress;
5
+ }
6
+ catch (error) {
7
+ return !!p;
8
+ }
9
+ };
10
+ export const useOnline = (program, options) => {
11
+ const [peers, setPeers] = useState([]);
12
+ useEffect(() => {
13
+ if (!program || program.closed) {
14
+ return;
15
+ }
16
+ let changeListener;
17
+ let closed = false;
18
+ const p = program;
19
+ changeListener = () => {
20
+ p.getReady()
21
+ .then((set) => {
22
+ setPeers([...set.values()]);
23
+ })
24
+ .catch((e) => {
25
+ console.error(e, closed);
26
+ });
27
+ };
28
+ p.events.addEventListener("join", changeListener);
29
+ p.events.addEventListener("leave", changeListener);
30
+ p.getReady()
31
+ .then((set) => {
32
+ setPeers([...set.values()]);
33
+ })
34
+ .catch((e) => {
35
+ console.log("Error getReady()", {
36
+ closed,
37
+ pClosed: p.closed,
38
+ e,
39
+ });
40
+ });
41
+ // TODO AbortController?
42
+ return () => {
43
+ closed = true;
44
+ p.events.removeEventListener("join", changeListener);
45
+ p.events.removeEventListener("leave", changeListener);
46
+ };
47
+ }, [options?.id, addressOrDefined(program)]);
48
+ return {
49
+ peers,
50
+ };
51
+ };
52
+ //# sourceMappingURL=useOnline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useOnline.js","sourceRoot":"","sources":["../../src/useOnline.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC5C,MAAM,gBAAgB,GAAG,CACrB,CAAK,EACP,EAAE;IACA,IAAI,CAAC;QACD,OAAO,CAAC,EAAE,WAAW,CAAC;IAC1B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,OAAO,CAAC,CAAC,CAAC,CAAC;IACf,CAAC;AACL,CAAC,CAAC;AAIF,MAAM,CAAC,MAAM,SAAS,GAAG,CAIrB,OAAW,EACX,OAAyB,EAC3B,EAAE;IACA,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAkB,EAAE,CAAC,CAAC;IAExD,SAAS,CAAC,GAAG,EAAE;QACX,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YAC7B,OAAO;QACX,CAAC;QACD,IAAI,cAA0B,CAAC;QAE/B,IAAI,MAAM,GAAG,KAAK,CAAC;QACnB,MAAM,CAAC,GAAG,OAAO,CAAC;QAClB,cAAc,GAAG,GAAG,EAAE;YAClB,CAAC,CAAC,QAAQ,EAAE;iBACP,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE;gBACV,QAAQ,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YAChC,CAAC,CAAC;iBACD,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;gBACT,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;YAC7B,CAAC,CAAC,CAAC;QACX,CAAC,CAAC;QACF,CAAC,CAAC,MAAM,CAAC,gBAAgB,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;QAClD,CAAC,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;QACnD,CAAC,CAAC,QAAQ,EAAE;aACP,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE;YACV,QAAQ,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAChC,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;YACT,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE;gBAC5B,MAAM;gBACN,OAAO,EAAE,CAAC,CAAC,MAAM;gBACjB,CAAC;aACJ,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;QACP,wBAAwB;QAExB,OAAO,GAAG,EAAE;YACR,MAAM,GAAG,IAAI,CAAC;YACd,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;YACrD,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;QAC1D,CAAC,CAAC;IACN,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,EAAE,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC7C,OAAO;QACH,KAAK;KACR,CAAC;AACN,CAAC,CAAC"}
@@ -2,13 +2,32 @@ import React from "react";
2
2
  import { Multiaddr } from "@multiformats/multiaddr";
3
3
  import { Ed25519Keypair } from "@peerbit/crypto";
4
4
  import { ProgramClient } from "@peerbit/program";
5
+ export declare class ClientBusyError extends Error {
6
+ constructor(message: string);
7
+ }
5
8
  export type ConnectionStatus = "disconnected" | "connected" | "connecting" | "failed";
6
- interface IPeerContext {
9
+ /** Discriminated union for PeerContext */
10
+ export type IPeerContext = (ProxyPeerContext | NodePeerContext) & {
11
+ error?: Error;
12
+ };
13
+ export interface ProxyPeerContext {
14
+ type: "proxy";
15
+ peer: ProgramClient | undefined;
16
+ promise: Promise<void> | undefined;
17
+ loading: boolean;
18
+ status: ConnectionStatus;
19
+ persisted: boolean | undefined;
20
+ /** Present only in proxy (iframe) mode */
21
+ targetOrigin: string;
22
+ }
23
+ export interface NodePeerContext {
24
+ type: "node";
7
25
  peer: ProgramClient | undefined;
8
26
  promise: Promise<void> | undefined;
9
27
  loading: boolean;
10
28
  status: ConnectionStatus;
11
29
  persisted: boolean | undefined;
30
+ tabIndex: number;
12
31
  }
13
32
  export declare const PeerContext: React.Context<IPeerContext>;
14
33
  export declare const usePeer: () => IPeerContext;
@@ -23,15 +42,15 @@ type NodeOptions = {
23
42
  keypair?: Ed25519Keypair;
24
43
  bootstrap?: (Multiaddr | string)[];
25
44
  host?: boolean;
45
+ singleton?: boolean;
46
+ };
47
+ type TopOptions = NodeOptions & {
48
+ inMemory?: boolean;
26
49
  };
27
- type TopOptions = NodeOptions & WithMemory;
28
50
  type TopAndIframeOptions = {
29
51
  iframe: IFrameOptions | NodeOptions;
30
52
  top: TopOptions;
31
53
  };
32
- type WithMemory = {
33
- inMemory?: boolean;
34
- };
35
54
  type WithChildren = {
36
55
  children: JSX.Element;
37
56
  };