@automerge/automerge-repo-network-broadcastchannel 1.2.1 → 2.0.0-alpha.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.
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +40 -3
- package/package.json +3 -3
- package/src/index.ts +47 -4
package/dist/index.d.ts
CHANGED
|
@@ -19,9 +19,11 @@ export type BroadcastChannelNetworkAdapterOptions = {
|
|
|
19
19
|
};
|
|
20
20
|
export declare class BroadcastChannelNetworkAdapter extends NetworkAdapter {
|
|
21
21
|
#private;
|
|
22
|
+
isReady(): boolean;
|
|
23
|
+
whenReady(): Promise<void>;
|
|
22
24
|
constructor(options?: BroadcastChannelNetworkAdapterOptions);
|
|
23
25
|
connect(peerId: PeerId, peerMetadata?: PeerMetadata): void;
|
|
24
|
-
send(message: Message):
|
|
26
|
+
send(message: Message): false | undefined;
|
|
25
27
|
disconnect(): void;
|
|
26
28
|
}
|
|
27
29
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EACL,cAAc,EACd,KAAK,OAAO,EACZ,KAAK,MAAM,EACX,KAAK,YAAY,EAClB,MAAM,gCAAgC,CAAA;AAEvC,MAAM,MAAM,qCAAqC,GAAG;IAClD,WAAW,EAAE,MAAM,CAAA;CACpB,CAAA;AAED,qBAAa,8BAA+B,SAAQ,cAAc;;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EACL,cAAc,EACd,KAAK,OAAO,EACZ,KAAK,MAAM,EACX,KAAK,YAAY,EAClB,MAAM,gCAAgC,CAAA;AAEvC,MAAM,MAAM,qCAAqC,GAAG;IAClD,WAAW,EAAE,MAAM,CAAA;CACpB,CAAA;AAED,qBAAa,8BAA+B,SAAQ,cAAc;;IAahE,OAAO;IAIP,SAAS;gBAWG,OAAO,CAAC,EAAE,qCAAqC;IAM3D,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,YAAY;IAwEnD,IAAI,CAAC,OAAO,EAAE,OAAO;IAmBrB,UAAU;CAUX"}
|
package/dist/index.js
CHANGED
|
@@ -16,7 +16,26 @@
|
|
|
16
16
|
import { NetworkAdapter, } from "@automerge/automerge-repo/slim";
|
|
17
17
|
export class BroadcastChannelNetworkAdapter extends NetworkAdapter {
|
|
18
18
|
#broadcastChannel;
|
|
19
|
+
#disconnected = false;
|
|
19
20
|
#options;
|
|
21
|
+
#ready = false;
|
|
22
|
+
#readyResolver;
|
|
23
|
+
#readyPromise = new Promise(resolve => {
|
|
24
|
+
this.#readyResolver = resolve;
|
|
25
|
+
});
|
|
26
|
+
#connectedPeers = [];
|
|
27
|
+
isReady() {
|
|
28
|
+
return this.#ready;
|
|
29
|
+
}
|
|
30
|
+
whenReady() {
|
|
31
|
+
return this.#readyPromise;
|
|
32
|
+
}
|
|
33
|
+
#forceReady() {
|
|
34
|
+
if (!this.#ready) {
|
|
35
|
+
this.#ready = true;
|
|
36
|
+
this.#readyResolver?.();
|
|
37
|
+
}
|
|
38
|
+
}
|
|
20
39
|
constructor(options) {
|
|
21
40
|
super();
|
|
22
41
|
this.#options = { channelName: "broadcast", ...(options ?? {}) };
|
|
@@ -25,11 +44,15 @@ export class BroadcastChannelNetworkAdapter extends NetworkAdapter {
|
|
|
25
44
|
connect(peerId, peerMetadata) {
|
|
26
45
|
this.peerId = peerId;
|
|
27
46
|
this.peerMetadata = peerMetadata;
|
|
47
|
+
this.#disconnected = false;
|
|
28
48
|
this.#broadcastChannel.addEventListener("message", (e) => {
|
|
29
49
|
const message = e.data;
|
|
30
50
|
if ("targetId" in message && message.targetId !== this.peerId) {
|
|
31
51
|
return;
|
|
32
52
|
}
|
|
53
|
+
if (this.#disconnected) {
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
33
56
|
const { senderId, type } = message;
|
|
34
57
|
switch (type) {
|
|
35
58
|
case "arrive":
|
|
@@ -50,6 +73,10 @@ export class BroadcastChannelNetworkAdapter extends NetworkAdapter {
|
|
|
50
73
|
this.#announceConnection(senderId, peerMetadata);
|
|
51
74
|
}
|
|
52
75
|
break;
|
|
76
|
+
case "leave":
|
|
77
|
+
this.#connectedPeers = this.#connectedPeers.filter(p => p !== senderId);
|
|
78
|
+
this.emit("peer-disconnected", { peerId: senderId });
|
|
79
|
+
break;
|
|
53
80
|
default:
|
|
54
81
|
if (!("data" in message)) {
|
|
55
82
|
this.emit("message", message);
|
|
@@ -69,12 +96,16 @@ export class BroadcastChannelNetworkAdapter extends NetworkAdapter {
|
|
|
69
96
|
type: "arrive",
|
|
70
97
|
peerMetadata,
|
|
71
98
|
});
|
|
72
|
-
this.emit("ready", { network: this });
|
|
73
99
|
}
|
|
74
100
|
#announceConnection(peerId, peerMetadata) {
|
|
101
|
+
this.#forceReady();
|
|
102
|
+
this.#connectedPeers.push(peerId);
|
|
75
103
|
this.emit("peer-candidate", { peerId, peerMetadata });
|
|
76
104
|
}
|
|
77
105
|
send(message) {
|
|
106
|
+
if (this.#disconnected) {
|
|
107
|
+
return false;
|
|
108
|
+
}
|
|
78
109
|
if ("data" in message) {
|
|
79
110
|
this.#broadcastChannel.postMessage({
|
|
80
111
|
...message,
|
|
@@ -88,7 +119,13 @@ export class BroadcastChannelNetworkAdapter extends NetworkAdapter {
|
|
|
88
119
|
}
|
|
89
120
|
}
|
|
90
121
|
disconnect() {
|
|
91
|
-
|
|
92
|
-
|
|
122
|
+
this.#broadcastChannel.postMessage({
|
|
123
|
+
senderId: this.peerId,
|
|
124
|
+
type: "leave",
|
|
125
|
+
});
|
|
126
|
+
for (const peerId of this.#connectedPeers) {
|
|
127
|
+
this.emit("peer-disconnected", { peerId });
|
|
128
|
+
}
|
|
129
|
+
this.#disconnected = true;
|
|
93
130
|
}
|
|
94
131
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@automerge/automerge-repo-network-broadcastchannel",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.0-alpha.0",
|
|
4
4
|
"description": "BroadcastChannel network adapter for Automerge Repo",
|
|
5
5
|
"repository": "https://github.com/automerge/automerge-repo/tree/master/packages/automerge-repo-network-broadcastchannel",
|
|
6
6
|
"author": "Peter van Hardenberg <pvh@pvh.ca>",
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
"test": "vitest"
|
|
14
14
|
},
|
|
15
15
|
"dependencies": {
|
|
16
|
-
"@automerge/automerge-repo": "
|
|
16
|
+
"@automerge/automerge-repo": "2.0.0-alpha.0"
|
|
17
17
|
},
|
|
18
18
|
"watch": {
|
|
19
19
|
"build": {
|
|
@@ -26,5 +26,5 @@
|
|
|
26
26
|
"publishConfig": {
|
|
27
27
|
"access": "public"
|
|
28
28
|
},
|
|
29
|
-
"gitHead": "
|
|
29
|
+
"gitHead": "16356392fb2ed9245565ae04f6e6b49e61195e65"
|
|
30
30
|
}
|
package/src/index.ts
CHANGED
|
@@ -27,9 +27,32 @@ export type BroadcastChannelNetworkAdapterOptions = {
|
|
|
27
27
|
|
|
28
28
|
export class BroadcastChannelNetworkAdapter extends NetworkAdapter {
|
|
29
29
|
#broadcastChannel: BroadcastChannel
|
|
30
|
+
#disconnected = false
|
|
30
31
|
|
|
31
32
|
#options: BroadcastChannelNetworkAdapterOptions
|
|
32
33
|
|
|
34
|
+
#ready = false
|
|
35
|
+
#readyResolver?: () => void
|
|
36
|
+
#readyPromise: Promise<void> = new Promise<void>(resolve => {
|
|
37
|
+
this.#readyResolver = resolve
|
|
38
|
+
})
|
|
39
|
+
#connectedPeers: PeerId[] = []
|
|
40
|
+
|
|
41
|
+
isReady() {
|
|
42
|
+
return this.#ready
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
whenReady() {
|
|
46
|
+
return this.#readyPromise
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
#forceReady() {
|
|
50
|
+
if (!this.#ready) {
|
|
51
|
+
this.#ready = true
|
|
52
|
+
this.#readyResolver?.()
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
33
56
|
constructor(options?: BroadcastChannelNetworkAdapterOptions) {
|
|
34
57
|
super()
|
|
35
58
|
this.#options = { channelName: "broadcast", ...(options ?? {}) }
|
|
@@ -39,6 +62,7 @@ export class BroadcastChannelNetworkAdapter extends NetworkAdapter {
|
|
|
39
62
|
connect(peerId: PeerId, peerMetadata?: PeerMetadata) {
|
|
40
63
|
this.peerId = peerId
|
|
41
64
|
this.peerMetadata = peerMetadata
|
|
65
|
+
this.#disconnected = false
|
|
42
66
|
|
|
43
67
|
this.#broadcastChannel.addEventListener(
|
|
44
68
|
"message",
|
|
@@ -48,6 +72,10 @@ export class BroadcastChannelNetworkAdapter extends NetworkAdapter {
|
|
|
48
72
|
return
|
|
49
73
|
}
|
|
50
74
|
|
|
75
|
+
if (this.#disconnected) {
|
|
76
|
+
return
|
|
77
|
+
}
|
|
78
|
+
|
|
51
79
|
const { senderId, type } = message
|
|
52
80
|
|
|
53
81
|
switch (type) {
|
|
@@ -69,6 +97,12 @@ export class BroadcastChannelNetworkAdapter extends NetworkAdapter {
|
|
|
69
97
|
this.#announceConnection(senderId, peerMetadata)
|
|
70
98
|
}
|
|
71
99
|
break
|
|
100
|
+
case "leave":
|
|
101
|
+
this.#connectedPeers = this.#connectedPeers.filter(
|
|
102
|
+
p => p !== senderId
|
|
103
|
+
)
|
|
104
|
+
this.emit("peer-disconnected", { peerId: senderId })
|
|
105
|
+
break
|
|
72
106
|
default:
|
|
73
107
|
if (!("data" in message)) {
|
|
74
108
|
this.emit("message", message)
|
|
@@ -89,15 +123,18 @@ export class BroadcastChannelNetworkAdapter extends NetworkAdapter {
|
|
|
89
123
|
type: "arrive",
|
|
90
124
|
peerMetadata,
|
|
91
125
|
})
|
|
92
|
-
|
|
93
|
-
this.emit("ready", { network: this })
|
|
94
126
|
}
|
|
95
127
|
|
|
96
128
|
#announceConnection(peerId: PeerId, peerMetadata: PeerMetadata) {
|
|
129
|
+
this.#forceReady()
|
|
130
|
+
this.#connectedPeers.push(peerId)
|
|
97
131
|
this.emit("peer-candidate", { peerId, peerMetadata })
|
|
98
132
|
}
|
|
99
133
|
|
|
100
134
|
send(message: Message) {
|
|
135
|
+
if (this.#disconnected) {
|
|
136
|
+
return false
|
|
137
|
+
}
|
|
101
138
|
if ("data" in message) {
|
|
102
139
|
this.#broadcastChannel.postMessage({
|
|
103
140
|
...message,
|
|
@@ -114,8 +151,14 @@ export class BroadcastChannelNetworkAdapter extends NetworkAdapter {
|
|
|
114
151
|
}
|
|
115
152
|
|
|
116
153
|
disconnect() {
|
|
117
|
-
|
|
118
|
-
|
|
154
|
+
this.#broadcastChannel.postMessage({
|
|
155
|
+
senderId: this.peerId,
|
|
156
|
+
type: "leave",
|
|
157
|
+
})
|
|
158
|
+
for (const peerId of this.#connectedPeers) {
|
|
159
|
+
this.emit("peer-disconnected", { peerId })
|
|
160
|
+
}
|
|
161
|
+
this.#disconnected = true
|
|
119
162
|
}
|
|
120
163
|
}
|
|
121
164
|
|