@peerbit/react 0.0.4 → 0.0.6

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,3 +1,4 @@
1
1
  export { PeerProvider, PeerContext, usePeer } from "./usePeer.js";
2
2
  export * from "./utils.js";
3
3
  export { FastMutex } from "./lockstorage.js";
4
+ export { useProgram } from "./useProgram.js";
package/lib/esm/index.js CHANGED
@@ -1,4 +1,5 @@
1
1
  export { PeerProvider, PeerContext, usePeer } from "./usePeer.js";
2
2
  export * from "./utils.js";
3
3
  export { FastMutex } from "./lockstorage.js";
4
+ export { useProgram } from "./useProgram.js";
4
5
  //# 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"}
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"}
@@ -148,7 +148,7 @@ export class FastMutex {
148
148
  }
149
149
  else {
150
150
  this.localStorage.setItem(key, JSON.stringify({
151
- expiresAt: getExpiry(),
151
+ expiresAt: getExpiry(), // bump expiry
152
152
  value,
153
153
  }));
154
154
  }
@@ -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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"}
@@ -1 +1 @@
1
- {"version":3,"file":"useMount.js","sourceRoot":"","sources":["../../src/useMount.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAuB,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAE/D,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,MAAsB,EAAE,EAAE;IAC/C,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAE9B,SAAS,CAAC,GAAG,EAAE;QACX,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;YAClB,MAAM,EAAE,CAAC;SACZ;QAED,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;QAEvB,OAAO,GAAG,EAAE,GAAE,CAAC,CAAC;IACpB,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;AAC1B,CAAC,CAAC"}
1
+ {"version":3,"file":"useMount.js","sourceRoot":"","sources":["../../src/useMount.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAuB,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAE/D,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,MAAsB,EAAE,EAAE;IAC/C,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAE9B,SAAS,CAAC,GAAG,EAAE;QACX,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YACnB,MAAM,EAAE,CAAC;QACb,CAAC;QAED,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;QAEvB,OAAO,GAAG,EAAE,GAAE,CAAC,CAAC;IACpB,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;AAC1B,CAAC,CAAC"}
@@ -8,6 +8,7 @@ interface IPeerContext {
8
8
  promise: Promise<void> | undefined;
9
9
  loading: boolean;
10
10
  status: ConnectionStatus;
11
+ persisted: boolean | undefined;
11
12
  }
12
13
  export declare const PeerContext: React.Context<IPeerContext>;
13
14
  export declare const usePeer: () => IPeerContext;
@@ -3,7 +3,7 @@ import React, { useContext } from "react";
3
3
  import { Peerbit } from "peerbit";
4
4
  import { webSockets } from "@libp2p/websockets";
5
5
  import { DirectSub } from "@peerbit/pubsub";
6
- import { mplex } from "@libp2p/mplex";
6
+ import { yamux } from "@chainsafe/libp2p-yamux";
7
7
  import { getFreeKeypair, getTabId, inIframe } from "./utils.js";
8
8
  import { noise } from "@dao-xyz/libp2p-noise";
9
9
  import { v4 as uuid } from "uuid";
@@ -12,6 +12,10 @@ import sodium from "libsodium-wrappers";
12
12
  import * as filters from "@libp2p/websockets/filters";
13
13
  import { useMount } from "./useMount.js";
14
14
  import { createClient, createHost } from "@peerbit/proxy-window";
15
+ import { circuitRelayTransport } from "@libp2p/circuit-relay-v2";
16
+ import { webRTC } from "@libp2p/webrtc";
17
+ import { identify } from "@libp2p/identify";
18
+ import { detectIncognito } from "detectincognitojs";
15
19
  if (!window.name) {
16
20
  window.name = uuid();
17
21
  }
@@ -20,7 +24,8 @@ export const usePeer = () => useContext(PeerContext);
20
24
  export const PeerProvider = (options) => {
21
25
  const [peer, setPeer] = React.useState(undefined);
22
26
  const [promise, setPromise] = React.useState(undefined);
23
- const [loading, setLoading] = React.useState(false);
27
+ const [persisted, setPersisted] = React.useState(undefined);
28
+ const [loading, setLoading] = React.useState(true);
24
29
  const [connectionState, setConnectionState] = React.useState("disconnected");
25
30
  const memo = React.useMemo(() => ({
26
31
  peer,
@@ -28,11 +33,13 @@ export const PeerProvider = (options) => {
28
33
  loading,
29
34
  connectionState,
30
35
  status: connectionState,
36
+ persisted: persisted,
31
37
  }), [
32
38
  loading,
33
39
  !!promise,
34
40
  connectionState,
35
- peer?.identity?.publicKey.toString(),
41
+ peer?.identity?.publicKey?.hashcode(),
42
+ persisted,
36
43
  ]);
37
44
  useMount(() => {
38
45
  setLoading(true);
@@ -55,21 +62,40 @@ export const PeerProvider = (options) => {
55
62
  timeout: 1000,
56
63
  }), undefined, true // reuse keypairs from same tab, (force release)
57
64
  )).key;
65
+ const peerId = await nodeId.toPeerId();
66
+ let directory = undefined;
67
+ if (!nodeOptions.inMemory &&
68
+ !(await detectIncognito()).isPrivate) {
69
+ const persisted = await navigator.storage.persist();
70
+ console.log("CAN PERSIST?", persisted);
71
+ setPersisted(persisted);
72
+ if (!persisted) {
73
+ setPersisted(false);
74
+ if (window["chrome"]) {
75
+ console.error("Request persistance but was not given permission by browser. Adding this site to your bookmarks or enabling push notifications might allow your chrome browser to persist data");
76
+ }
77
+ else {
78
+ console.error("Request persistance but was not given permission by browser.");
79
+ }
80
+ }
81
+ else {
82
+ directory = `./repo/${peerId.toString()}/`;
83
+ }
84
+ }
58
85
  // We create a new directrory to make tab to tab communication go smoothly
86
+ console.log("Create client");
59
87
  newPeer = await Peerbit.create({
60
88
  libp2p: {
61
89
  addresses: {
62
- listen: [
63
- /* '/webrtc' */
64
- ],
90
+ listen: ["/webrtc"],
65
91
  },
66
92
  connectionEncryption: [noise()],
67
- peerId: await nodeId.toPeerId(),
93
+ peerId, //, having the same peer accross broswers does not work, only one tab will be recognized by other peers
68
94
  connectionManager: {
69
95
  maxConnections: 100,
70
- minConnections: 0,
96
+ minConnections: 1,
71
97
  },
72
- streamMuxers: [mplex()],
98
+ streamMuxers: [yamux()],
73
99
  ...(nodeOptions.network === "local"
74
100
  ? {
75
101
  connectionGater: {
@@ -86,29 +112,35 @@ export const PeerProvider = (options) => {
86
112
  webSockets({
87
113
  filter: filters.all,
88
114
  }),
89
- /* circuitRelayTransport({ discoverRelays: 1 }),
90
- webRTC(), */
115
+ circuitRelayTransport({
116
+ discoverRelays: 1,
117
+ }),
118
+ webRTC(),
91
119
  ],
92
120
  }
93
121
  : {
94
122
  transports: [
95
123
  webSockets({ filter: filters.wss }),
96
- /* circuitRelayTransport({ discoverRelays: 1 }),
97
- webRTC(), */
124
+ circuitRelayTransport({
125
+ discoverRelays: 1,
126
+ }),
127
+ webRTC(),
98
128
  ],
99
129
  }),
100
130
  services: {
101
131
  pubsub: (c) => new DirectSub(c, {
102
132
  canRelayMessage: true,
103
- emitSelf: true,
133
+ /* connectionManager: {
134
+ autoDial: false,
135
+ }, */
104
136
  }),
137
+ identify: identify(),
105
138
  },
106
139
  },
107
- directory: !nodeOptions.inMemory
108
- ? "./repo"
109
- : undefined,
110
- limitSigning: true,
140
+ directory,
111
141
  });
142
+ console.log("Create done");
143
+ console.log(newPeer?.identity.publicKey.hashcode());
112
144
  setConnectionState("connecting");
113
145
  // Resolve bootstrap nodes async (we want to return before this is done)
114
146
  const connectFn = async () => {
@@ -119,7 +151,14 @@ export const PeerProvider = (options) => {
119
151
  }
120
152
  else {
121
153
  // TODO fix types. When proxy client this will not be available
122
- await newPeer["bootstrap"]?.();
154
+ if (nodeOptions.bootstrap) {
155
+ for (const addr of nodeOptions.bootstrap) {
156
+ await newPeer.dial(addr);
157
+ }
158
+ }
159
+ else {
160
+ await newPeer["bootstrap"]?.();
161
+ }
123
162
  }
124
163
  setConnectionState("connected");
125
164
  }
@@ -131,9 +170,13 @@ export const PeerProvider = (options) => {
131
170
  newPeer = await createHost(newPeer);
132
171
  }
133
172
  };
173
+ console.log("Bootstrap start...");
134
174
  const promise = connectFn();
175
+ promise.then(() => {
176
+ console.log("Bootstrap done");
177
+ });
135
178
  // Make sure data flow as expected between tabs and windows locally (offline states)
136
- if (nodeOptions.waitForConnnected) {
179
+ if (nodeOptions.waitForConnnected !== false) {
137
180
  await promise;
138
181
  }
139
182
  }
@@ -1 +1 @@
1
- {"version":3,"file":"usePeer.js","sourceRoot":"","sources":["../../src/usePeer.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"usePeer.js","sourceRoot":"","sources":["../../src/usePeer.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { Program, OpenOptions, ProgramEvents } from "@peerbit/program";
2
+ type ExtractArgs<T> = T extends Program<infer Args> ? Args : never;
3
+ type ExtractEvents<T> = T extends Program<any, infer Events> ? Events : never;
4
+ export declare const useProgram: <P extends Program<ExtractArgs<P>, ExtractEvents<P>> & Program<any, ProgramEvents>>(addressOrOpen?: string | P | undefined, options?: OpenOptions<P> | undefined) => {
5
+ program: P | undefined;
6
+ session: any;
7
+ loading: boolean;
8
+ promise: Promise<P> | undefined;
9
+ peerCounter: number;
10
+ };
11
+ export {};
@@ -0,0 +1,75 @@
1
+ import { usePeer } from "./usePeer.js";
2
+ import { useEffect, useReducer, useRef, useState } from "react";
3
+ const addressOrUndefined = (p) => {
4
+ try {
5
+ return p?.address;
6
+ }
7
+ catch (error) {
8
+ return undefined;
9
+ }
10
+ };
11
+ export const useProgram = (addressOrOpen, options) => {
12
+ const { peer } = usePeer();
13
+ let [program, setProgram] = useState();
14
+ let [loading, setLoading] = useState(true);
15
+ const [session, forceUpdate] = useReducer((x) => x + 1, 0);
16
+ let programLoadingRef = useRef();
17
+ const [peerCounter, setPeerCounter] = useState(1);
18
+ let closingRef = useRef(Promise.resolve());
19
+ useEffect(() => {
20
+ if (!peer || !addressOrOpen) {
21
+ return;
22
+ }
23
+ setLoading(true);
24
+ let changeListener;
25
+ closingRef.current.then(() => {
26
+ programLoadingRef.current = peer
27
+ ?.open(addressOrOpen, { ...options, existing: "reuse" })
28
+ .then((p) => {
29
+ changeListener = () => {
30
+ p.getReady().then((set) => {
31
+ setPeerCounter(set.size);
32
+ });
33
+ };
34
+ p.events.addEventListener("join", changeListener);
35
+ p.events.addEventListener("leave", changeListener);
36
+ p.getReady().then((set) => {
37
+ setPeerCounter(set.size);
38
+ });
39
+ setProgram(p);
40
+ forceUpdate();
41
+ return p;
42
+ })
43
+ .finally(() => {
44
+ setLoading(false);
45
+ });
46
+ });
47
+ // TODO AbortController?
48
+ return () => {
49
+ let startRef = programLoadingRef.current;
50
+ // TODO don't close on reopen the same db?
51
+ closingRef.current =
52
+ programLoadingRef.current?.then((p) => p.close().then(() => {
53
+ p.events.removeEventListener("join", changeListener);
54
+ p.events.removeEventListener("leave", changeListener);
55
+ if (programLoadingRef.current === startRef) {
56
+ setProgram(undefined);
57
+ programLoadingRef.current = undefined;
58
+ }
59
+ })) || Promise.resolve();
60
+ };
61
+ }, [
62
+ peer?.identity.publicKey.hashcode(),
63
+ typeof addressOrOpen === "string"
64
+ ? addressOrOpen
65
+ : addressOrUndefined(addressOrOpen),
66
+ ]);
67
+ return {
68
+ program,
69
+ session,
70
+ loading,
71
+ promise: programLoadingRef.current,
72
+ peerCounter,
73
+ };
74
+ };
75
+ //# sourceMappingURL=useProgram.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useProgram.js","sourceRoot":"","sources":["../../src/useProgram.tsx"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@peerbit/react",
3
- "version": "0.0.4",
3
+ "version": "0.0.6",
4
4
  "homepage": "https://dao-xyz.github.io/peerbit-examples",
5
5
  "module": "lib/esm/index.js",
6
6
  "types": "lib/esm/index.d.ts",
@@ -22,19 +22,17 @@
22
22
  "react": "*"
23
23
  },
24
24
  "dependencies": {
25
- "@emotion/react": "^11.10.5",
26
- "@emotion/styled": "^11.10.5",
27
- "@libp2p/webrtc": "^2.0.11",
28
- "@mui/icons-material": "^5.10.16",
29
- "@mui/material": "^5.10.13",
30
- "@peerbit/proxy-window": "^1.0.1",
31
- "@types/react": "^18.0.25",
32
- "@types/react-dom": "^18.0.8",
25
+ "@chainsafe/libp2p-yamux": "^6",
26
+ "@libp2p/webrtc": "^4",
27
+ "@peerbit/proxy-window": "^3",
28
+ "@types/react": "^18.2.46",
29
+ "@types/react-dom": "^18.2.18",
30
+ "detectincognitojs": "^1.3.0",
33
31
  "path-browserify": "^1.0.1",
34
- "peerbit": "^1",
32
+ "peerbit": "^4",
35
33
  "react": "^18.2.0",
36
34
  "react-dom": "^18.2.0",
37
- "react-router-dom": "^6.8.0",
35
+ "react-router-dom": "^6.16.0",
38
36
  "react-use": "^17.4.0"
39
37
  },
40
38
  "devDependencies": {
@@ -71,5 +69,5 @@
71
69
  "last 1 safari version"
72
70
  ]
73
71
  },
74
- "gitHead": "61243721632f276a5b6109e147ec375947da9afd"
72
+ "gitHead": "158537c6f6818e35e766329a6b4a5ccf7ae57ea0"
75
73
  }
package/src/index.ts CHANGED
@@ -1,3 +1,4 @@
1
1
  export { PeerProvider, PeerContext, usePeer } from "./usePeer.js";
2
2
  export * from "./utils.js";
3
3
  export { FastMutex } from "./lockstorage.js";
4
+ export { useProgram } from "./useProgram.js";
package/src/usePeer.tsx CHANGED
@@ -1,9 +1,9 @@
1
1
  import React, { useContext } from "react";
2
- import { multiaddr, Multiaddr } from "@multiformats/multiaddr";
2
+ import { Multiaddr } from "@multiformats/multiaddr";
3
3
  import { Peerbit } from "peerbit";
4
4
  import { webSockets } from "@libp2p/websockets";
5
5
  import { DirectSub } from "@peerbit/pubsub";
6
- import { mplex } from "@libp2p/mplex";
6
+ import { yamux } from "@chainsafe/libp2p-yamux";
7
7
  import { getFreeKeypair, getTabId, inIframe } from "./utils.js";
8
8
  import { noise } from "@dao-xyz/libp2p-noise";
9
9
  import { v4 as uuid } from "uuid";
@@ -14,6 +14,10 @@ import * as filters from "@libp2p/websockets/filters";
14
14
  import { useMount } from "./useMount.js";
15
15
  import { createClient, createHost } from "@peerbit/proxy-window";
16
16
  import { ProgramClient } from "@peerbit/program";
17
+ import { circuitRelayTransport } from "@libp2p/circuit-relay-v2";
18
+ import { webRTC } from "@libp2p/webrtc";
19
+ import { identify } from "@libp2p/identify";
20
+ import { detectIncognito } from "detectincognitojs";
17
21
 
18
22
  export type ConnectionStatus =
19
23
  | "disconnected"
@@ -25,6 +29,7 @@ interface IPeerContext {
25
29
  promise: Promise<void> | undefined;
26
30
  loading: boolean;
27
31
  status: ConnectionStatus;
32
+ persisted: boolean | undefined;
28
33
  }
29
34
 
30
35
  if (!window.name) {
@@ -33,7 +38,6 @@ if (!window.name) {
33
38
 
34
39
  export const PeerContext = React.createContext<IPeerContext>({} as any);
35
40
  export const usePeer = () => useContext(PeerContext);
36
-
37
41
  type IFrameOptions = {
38
42
  type: "proxy";
39
43
  targetOrigin: string;
@@ -68,7 +72,11 @@ export const PeerProvider = (options: PeerOptions) => {
68
72
  undefined
69
73
  );
70
74
 
71
- const [loading, setLoading] = React.useState<boolean>(false);
75
+ const [persisted, setPersisted] = React.useState<boolean | undefined>(
76
+ undefined
77
+ );
78
+
79
+ const [loading, setLoading] = React.useState<boolean>(true);
72
80
  const [connectionState, setConnectionState] =
73
81
  React.useState<ConnectionStatus>("disconnected");
74
82
  const memo = React.useMemo<IPeerContext>(
@@ -78,12 +86,14 @@ export const PeerProvider = (options: PeerOptions) => {
78
86
  loading,
79
87
  connectionState,
80
88
  status: connectionState,
89
+ persisted: persisted,
81
90
  }),
82
91
  [
83
92
  loading,
84
93
  !!promise,
85
94
  connectionState,
86
- peer?.identity?.publicKey.toString(),
95
+ peer?.identity?.publicKey?.hashcode(),
96
+ persisted,
87
97
  ]
88
98
  );
89
99
 
@@ -102,6 +112,7 @@ export const PeerProvider = (options: PeerOptions) => {
102
112
  ? (options as TopAndIframeOptions).iframe
103
113
  : (options as TopAndIframeOptions).top
104
114
  : (options as TopOptions);
115
+
105
116
  if (nodeOptions.type !== "proxy") {
106
117
  const nodeId =
107
118
  nodeOptions.keypair ||
@@ -116,63 +127,94 @@ export const PeerProvider = (options: PeerOptions) => {
116
127
  true // reuse keypairs from same tab, (force release)
117
128
  )
118
129
  ).key;
130
+ const peerId = await nodeId.toPeerId();
131
+
132
+ let directory: string | undefined = undefined;
133
+ if (
134
+ !(nodeOptions as WithMemory).inMemory &&
135
+ !(await detectIncognito()).isPrivate
136
+ ) {
137
+ const persisted = await navigator.storage.persist();
138
+ console.log("CAN PERSIST?", persisted);
139
+ setPersisted(persisted);
140
+ if (!persisted) {
141
+ setPersisted(false);
142
+ if (window["chrome"]) {
143
+ console.error(
144
+ "Request persistance but was not given permission by browser. Adding this site to your bookmarks or enabling push notifications might allow your chrome browser to persist data"
145
+ );
146
+ } else {
147
+ console.error(
148
+ "Request persistance but was not given permission by browser."
149
+ );
150
+ }
151
+ } else {
152
+ directory = `./repo/${peerId.toString()}/`;
153
+ }
154
+ }
119
155
 
120
156
  // We create a new directrory to make tab to tab communication go smoothly
157
+ console.log("Create client");
121
158
  newPeer = await Peerbit.create({
122
159
  libp2p: {
123
160
  addresses: {
124
- listen: [
125
- /* '/webrtc' */
126
- ],
161
+ listen: ["/webrtc"],
127
162
  },
128
163
  connectionEncryption: [noise()],
129
- peerId: await nodeId.toPeerId(), //, having the same peer accross broswers does not work, only one tab will be recognized by other peers
164
+ peerId, //, having the same peer accross broswers does not work, only one tab will be recognized by other peers
130
165
  connectionManager: {
131
166
  maxConnections: 100,
132
- minConnections: 0,
167
+ minConnections: 1,
133
168
  },
134
- streamMuxers: [mplex()],
169
+
170
+ streamMuxers: [yamux()],
135
171
  ...(nodeOptions.network === "local"
136
172
  ? {
137
- connectionGater: {
138
- denyDialMultiaddr: () => {
139
- // by default we refuse to dial local addresses from the browser since they
140
- // are usually sent by remote peers broadcasting undialable multiaddrs but
141
- // here we are explicitly connecting to a local node so do not deny dialing
142
- // any discovered address
143
- return false;
144
- },
145
- },
146
- transports: [
147
- // Add websocket impl so we can connect to "unsafe" ws (production only allows wss)
148
- webSockets({
149
- filter: filters.all,
150
- }),
151
- /* circuitRelayTransport({ discoverRelays: 1 }),
152
- webRTC(), */
153
- ],
154
- }
173
+ connectionGater: {
174
+ denyDialMultiaddr: () => {
175
+ // by default we refuse to dial local addresses from the browser since they
176
+ // are usually sent by remote peers broadcasting undialable multiaddrs but
177
+ // here we are explicitly connecting to a local node so do not deny dialing
178
+ // any discovered address
179
+ return false;
180
+ },
181
+ },
182
+ transports: [
183
+ // Add websocket impl so we can connect to "unsafe" ws (production only allows wss)
184
+ webSockets({
185
+ filter: filters.all,
186
+ }),
187
+ circuitRelayTransport({
188
+ discoverRelays: 1,
189
+ }),
190
+ webRTC(),
191
+ ],
192
+ }
155
193
  : {
156
- transports: [
157
- webSockets({ filter: filters.wss }),
158
- /* circuitRelayTransport({ discoverRelays: 1 }),
159
- webRTC(), */
160
- ],
161
- }),
194
+ transports: [
195
+ webSockets({ filter: filters.wss }),
196
+ circuitRelayTransport({
197
+ discoverRelays: 1,
198
+ }),
199
+ webRTC(),
200
+ ],
201
+ }),
162
202
 
163
203
  services: {
164
204
  pubsub: (c) =>
165
205
  new DirectSub(c, {
166
206
  canRelayMessage: true,
167
- emitSelf: true,
207
+ /* connectionManager: {
208
+ autoDial: false,
209
+ }, */
168
210
  }),
211
+ identify: identify(),
169
212
  },
170
213
  },
171
- directory: !(nodeOptions as WithMemory).inMemory
172
- ? "./repo"
173
- : undefined,
174
- limitSigning: true,
214
+ directory,
175
215
  });
216
+ console.log("Create done");
217
+ console.log(newPeer?.identity.publicKey.hashcode());
176
218
 
177
219
  setConnectionState("connecting");
178
220
 
@@ -182,15 +224,21 @@ export const PeerProvider = (options: PeerOptions) => {
182
224
  if (nodeOptions.network === "local") {
183
225
  await newPeer.dial(
184
226
  "/ip4/127.0.0.1/tcp/8002/ws/p2p/" +
185
- (await (
186
- await fetch(
187
- "http://localhost:8082/peer/id"
188
- )
189
- ).text())
227
+ (await (
228
+ await fetch(
229
+ "http://localhost:8082/peer/id"
230
+ )
231
+ ).text())
190
232
  );
191
233
  } else {
192
234
  // TODO fix types. When proxy client this will not be available
193
- await newPeer["bootstrap"]?.();
235
+ if (nodeOptions.bootstrap) {
236
+ for (const addr of nodeOptions.bootstrap) {
237
+ await newPeer.dial(addr);
238
+ }
239
+ } else {
240
+ await newPeer["bootstrap"]?.();
241
+ }
194
242
  }
195
243
  setConnectionState("connected");
196
244
  } catch (err: any) {
@@ -205,16 +253,20 @@ export const PeerProvider = (options: PeerOptions) => {
205
253
  }
206
254
  };
207
255
 
256
+ console.log("Bootstrap start...");
208
257
  const promise = connectFn();
209
-
258
+ promise.then(() => {
259
+ console.log("Bootstrap done");
260
+ });
210
261
  // Make sure data flow as expected between tabs and windows locally (offline states)
211
262
 
212
- if (nodeOptions.waitForConnnected) {
263
+ if (nodeOptions.waitForConnnected !== false) {
213
264
  await promise;
214
265
  }
215
266
  } else {
216
267
  newPeer = await createClient(nodeOptions.targetOrigin);
217
268
  }
269
+
218
270
  setPeer(newPeer);
219
271
  setLoading(false);
220
272
  };
@@ -0,0 +1,96 @@
1
+ import { Program, OpenOptions, ProgramEvents } from "@peerbit/program";
2
+ import { usePeer } from "./usePeer.js";
3
+ import { useEffect, useReducer, useRef, useState } from "react";
4
+ const addressOrUndefined = <
5
+ A,
6
+ B extends ProgramEvents,
7
+ P extends Program<A, B>
8
+ >(
9
+ p?: P
10
+ ) => {
11
+ try {
12
+ return p?.address;
13
+ } catch (error) {
14
+ return undefined;
15
+ }
16
+ };
17
+ type ExtractArgs<T> = T extends Program<infer Args> ? Args : never;
18
+ type ExtractEvents<T> = T extends Program<any, infer Events> ? Events : never;
19
+
20
+ export const useProgram = <
21
+ P extends Program<ExtractArgs<P>, ExtractEvents<P>> &
22
+ Program<any, ProgramEvents>
23
+ >(
24
+ addressOrOpen?: P | string,
25
+ options?: OpenOptions<P>
26
+ ) => {
27
+ const { peer } = usePeer();
28
+ let [program, setProgram] = useState<P | undefined>();
29
+ let [loading, setLoading] = useState(true);
30
+ const [session, forceUpdate] = useReducer((x) => x + 1, 0);
31
+ let programLoadingRef = useRef<Promise<P>>();
32
+ const [peerCounter, setPeerCounter] = useState<number>(1);
33
+ let closingRef = useRef<Promise<any>>(Promise.resolve());
34
+
35
+ useEffect(() => {
36
+ if (!peer || !addressOrOpen) {
37
+ return;
38
+ }
39
+ setLoading(true);
40
+ let changeListener: () => void;
41
+ closingRef.current.then(() => {
42
+ programLoadingRef.current = peer
43
+ ?.open(addressOrOpen, { ...options, existing: "reuse" })
44
+ .then((p) => {
45
+ changeListener = () => {
46
+ p.getReady().then((set) => {
47
+ setPeerCounter(set.size);
48
+ });
49
+ };
50
+ p.events.addEventListener("join", changeListener);
51
+ p.events.addEventListener("leave", changeListener);
52
+ p.getReady().then((set) => {
53
+ setPeerCounter(set.size);
54
+ });
55
+ setProgram(p);
56
+ forceUpdate();
57
+
58
+ return p;
59
+ })
60
+ .finally(() => {
61
+ setLoading(false);
62
+ });
63
+ });
64
+
65
+ // TODO AbortController?
66
+ return () => {
67
+ let startRef = programLoadingRef.current;
68
+
69
+ // TODO don't close on reopen the same db?
70
+ closingRef.current =
71
+ programLoadingRef.current?.then((p) =>
72
+ p.close().then(() => {
73
+ p.events.removeEventListener("join", changeListener);
74
+ p.events.removeEventListener("leave", changeListener);
75
+
76
+ if (programLoadingRef.current === startRef) {
77
+ setProgram(undefined);
78
+ programLoadingRef.current = undefined;
79
+ }
80
+ })
81
+ ) || Promise.resolve();
82
+ };
83
+ }, [
84
+ peer?.identity.publicKey.hashcode(),
85
+ typeof addressOrOpen === "string"
86
+ ? addressOrOpen
87
+ : addressOrUndefined(addressOrOpen),
88
+ ]);
89
+ return {
90
+ program,
91
+ session,
92
+ loading,
93
+ promise: programLoadingRef.current,
94
+ peerCounter,
95
+ };
96
+ };