@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.
- package/lib/esm/index.d.ts +1 -0
- package/lib/esm/index.js +1 -0
- package/lib/esm/index.js.map +1 -1
- package/lib/esm/lockstorage.js +1 -1
- package/lib/esm/lockstorage.js.map +1 -1
- package/lib/esm/useMount.js.map +1 -1
- package/lib/esm/usePeer.d.ts +1 -0
- package/lib/esm/usePeer.js +63 -20
- package/lib/esm/usePeer.js.map +1 -1
- package/lib/esm/useProgram.d.ts +11 -0
- package/lib/esm/useProgram.js +75 -0
- package/lib/esm/useProgram.js.map +1 -0
- package/lib/esm/utils.js.map +1 -1
- package/package.json +10 -12
- package/src/index.ts +1 -0
- package/src/usePeer.tsx +100 -48
- package/src/useProgram.tsx +96 -0
package/lib/esm/index.d.ts
CHANGED
package/lib/esm/index.js
CHANGED
package/lib/esm/index.js.map
CHANGED
|
@@ -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"}
|
package/lib/esm/lockstorage.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lockstorage.js","sourceRoot":"","sources":["../../src/lockstorage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;EAeE;AAEF,OAAO,OAAO,MAAM,OAAO,CAAC;AAC5B,OAAO,EAAE,EAAE,IAAI,IAAI,EAAE,MAAM,MAAM,CAAC;AAClC,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;AAEnC,MAAM,OAAO,SAAS;IAClB,QAAQ,CAAS;IACjB,OAAO,CAAS;IAChB,OAAO,CAAS;IAChB,OAAO,CAAS;IAChB,YAAY,CAAM;IAClB,SAAS,CAAmB;IAE5B,YAAY,EACR,QAAQ,GAAG,IAAI,EAAE,EACjB,OAAO,GAAG,gBAAgB,EAC1B,OAAO,GAAG,gBAAgB,EAC1B,OAAO,GAAG,IAAI,EACd,YAAY,GAAG,SAAS,GAC3B,GAAG,EAAE;QACF,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,SAAS,GAAG,IAAI,GAAG,EAAE,CAAC;QAE3B,IAAI,CAAC,YAAY,GAAG,YAAY,IAAI,MAAM,CAAC,YAAY,CAAC;IAC5D,CAAC;IAED,IAAI,CACA,GAAW,EACX,UAA0B;QAE1B,KAAK,CACD,kEAAkE,EAClE,GAAG,EACH,IAAI,CAAC,QAAQ,CAChB,CAAC;QACF,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC;QAC7B,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC;QAC7B,IAAI,YAAY,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;QAC/B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACnC,wEAAwE;YACxE,0EAA0E;YAC1E,0EAA0E;YAC1E,wDAAwD;YACxD,IAAI,YAAY,GAAG,CAAC,CAAC;YACrB,IAAI,eAAe,GAAG,CAAC,CAAC;YACxB,IAAI,SAAS,GAAG,CAAC,CAAC;YAClB,MAAM,WAAW,GAAG,CAAC,GAAG,EAAE,EAAE;gBACxB,IACI,YAAY,GAAG,IAAI;oBACnB,eAAe,GAAG,IAAI;oBACtB,SAAS,GAAG,IAAI,EAClB;
|
|
1
|
+
{"version":3,"file":"lockstorage.js","sourceRoot":"","sources":["../../src/lockstorage.ts"],"names":[],"mappings":"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"}
|
package/lib/esm/useMount.js.map
CHANGED
|
@@ -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;
|
|
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"}
|
package/lib/esm/usePeer.d.ts
CHANGED
|
@@ -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;
|
package/lib/esm/usePeer.js
CHANGED
|
@@ -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 {
|
|
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 [
|
|
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
|
|
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
|
|
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:
|
|
96
|
+
minConnections: 1,
|
|
71
97
|
},
|
|
72
|
-
streamMuxers: [
|
|
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
|
-
|
|
90
|
-
|
|
115
|
+
circuitRelayTransport({
|
|
116
|
+
discoverRelays: 1,
|
|
117
|
+
}),
|
|
118
|
+
webRTC(),
|
|
91
119
|
],
|
|
92
120
|
}
|
|
93
121
|
: {
|
|
94
122
|
transports: [
|
|
95
123
|
webSockets({ filter: filters.wss }),
|
|
96
|
-
|
|
97
|
-
|
|
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
|
-
|
|
133
|
+
/* connectionManager: {
|
|
134
|
+
autoDial: false,
|
|
135
|
+
}, */
|
|
104
136
|
}),
|
|
137
|
+
identify: identify(),
|
|
105
138
|
},
|
|
106
139
|
},
|
|
107
|
-
directory
|
|
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
|
-
|
|
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
|
}
|
package/lib/esm/usePeer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usePeer.js","sourceRoot":"","sources":["../../src/usePeer.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAE1C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,KAAK,EAAE,MAAM,
|
|
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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"}
|
package/lib/esm/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AACvE,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,EAAE,IAAI,IAAI,EAAE,MAAM,MAAM,CAAC;AAClC,OAAO,MAAM,MAAM,oBAAoB,CAAC;AAExC,MAAM,CAAC,MAAM,QAAQ,GAAG,GAAG,EAAE;IACzB,MAAM,aAAa,GAAG,cAAc,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACvD,IAAI,aAAa,EAAE;
|
|
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.
|
|
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
|
-
"@
|
|
26
|
-
"@
|
|
27
|
-
"@
|
|
28
|
-
"@
|
|
29
|
-
"@
|
|
30
|
-
"
|
|
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": "^
|
|
32
|
+
"peerbit": "^4",
|
|
35
33
|
"react": "^18.2.0",
|
|
36
34
|
"react-dom": "^18.2.0",
|
|
37
|
-
"react-router-dom": "^6.
|
|
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": "
|
|
72
|
+
"gitHead": "158537c6f6818e35e766329a6b4a5ccf7ae57ea0"
|
|
75
73
|
}
|
package/src/index.ts
CHANGED
package/src/usePeer.tsx
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import React, { useContext } from "react";
|
|
2
|
-
import {
|
|
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 {
|
|
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 [
|
|
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
|
|
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
|
|
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:
|
|
167
|
+
minConnections: 1,
|
|
133
168
|
},
|
|
134
|
-
|
|
169
|
+
|
|
170
|
+
streamMuxers: [yamux()],
|
|
135
171
|
...(nodeOptions.network === "local"
|
|
136
172
|
? {
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
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
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
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
|
-
|
|
207
|
+
/* connectionManager: {
|
|
208
|
+
autoDial: false,
|
|
209
|
+
}, */
|
|
168
210
|
}),
|
|
211
|
+
identify: identify(),
|
|
169
212
|
},
|
|
170
213
|
},
|
|
171
|
-
directory
|
|
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
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
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
|
-
|
|
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
|
+
};
|