dignity.js 0.1.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/LICENSE +201 -0
- package/README.md +197 -0
- package/dist/dignity.cjs.js +3585 -0
- package/dist/dignity.cjs.js.map +7 -0
- package/dist/dignity.esm.js +3606 -0
- package/dist/dignity.esm.js.map +7 -0
- package/dist/dignity.min.js +1 -0
- package/docs/assets/dignity-logo.svg +54 -0
- package/docs/assets/styles.css +68 -0
- package/docs/index.html +117 -0
- package/docs/openapi-like.json +64 -0
- package/examples/decentralized-chess-lite.js +102 -0
- package/examples/decentralized-tictactoe.js +112 -0
- package/package.json +53 -0
- package/src/core/dignity-p2p.js +604 -0
- package/src/index.js +41 -0
- package/src/network/in-memory-network.js +77 -0
- package/src/security/message-security-service.js +462 -0
- package/src/security/sloth-vdf.js +83 -0
- package/src/security/vdf.js +23 -0
- package/src/signaling/create-default-signaling-pool.js +44 -0
- package/src/signaling/default-signaling-config.js +15 -0
- package/src/signaling/signaling-pool.js +75 -0
- package/src/signaling/websocket-signaling-provider.js +69 -0
- package/src/utils/event-emitter.js +38 -0
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
class WebSocketSignalingProvider {
|
|
2
|
+
constructor({ id, url, WebSocketImpl, priority = 0 }) {
|
|
3
|
+
if (!url) {
|
|
4
|
+
throw new Error('WebSocket signaling provider requires a url');
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
this.id = id || url;
|
|
8
|
+
this.url = url;
|
|
9
|
+
this.priority = priority;
|
|
10
|
+
this.WebSocketImpl = WebSocketImpl || globalThis.WebSocket;
|
|
11
|
+
this.socket = null;
|
|
12
|
+
this.messageHandlers = new Set();
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
async connect() {
|
|
16
|
+
if (!this.WebSocketImpl) {
|
|
17
|
+
throw new Error('WebSocket implementation is not available');
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
await new Promise((resolve, reject) => {
|
|
21
|
+
const socket = new this.WebSocketImpl(this.url);
|
|
22
|
+
|
|
23
|
+
socket.onopen = () => {
|
|
24
|
+
this.socket = socket;
|
|
25
|
+
resolve();
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
socket.onerror = () => {
|
|
29
|
+
reject(new Error(`Unable to connect to signaling url ${this.url}`));
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
socket.onmessage = (event) => {
|
|
33
|
+
let payload = event.data;
|
|
34
|
+
try {
|
|
35
|
+
payload = JSON.parse(event.data);
|
|
36
|
+
} catch (error) {
|
|
37
|
+
payload = event.data;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
for (const handler of this.messageHandlers) {
|
|
41
|
+
handler(payload);
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
onMessage(handler) {
|
|
48
|
+
this.messageHandlers.add(handler);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
async send(message) {
|
|
52
|
+
if (!this.socket || this.socket.readyState !== 1) {
|
|
53
|
+
throw new Error(`Signaling socket is not open for ${this.url}`);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
this.socket.send(JSON.stringify(message));
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
async disconnect() {
|
|
60
|
+
if (!this.socket) {
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
this.socket.close();
|
|
65
|
+
this.socket = null;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
module.exports = WebSocketSignalingProvider;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
class EventEmitter {
|
|
2
|
+
constructor() {
|
|
3
|
+
this.handlers = new Map();
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
on(eventName, handler) {
|
|
7
|
+
if (!this.handlers.has(eventName)) {
|
|
8
|
+
this.handlers.set(eventName, new Set());
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
this.handlers.get(eventName).add(handler);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
off(eventName, handler) {
|
|
15
|
+
const eventHandlers = this.handlers.get(eventName);
|
|
16
|
+
if (!eventHandlers) {
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
eventHandlers.delete(handler);
|
|
21
|
+
if (eventHandlers.size === 0) {
|
|
22
|
+
this.handlers.delete(eventName);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
emit(eventName, payload) {
|
|
27
|
+
const eventHandlers = this.handlers.get(eventName);
|
|
28
|
+
if (!eventHandlers) {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
for (const handler of eventHandlers) {
|
|
33
|
+
handler(payload);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
module.exports = EventEmitter;
|