@openlv/signaling 0.0.1-beta.7 → 0.0.1-beta.8
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/base.js +134 -136
- package/dist/base.js.map +1 -1
- package/dist/dynamic.js +16 -9
- package/dist/dynamic.js.map +1 -1
- package/dist/gundb/index.js.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.test.js +138 -58
- package/dist/index.test.js.map +1 -1
- package/dist/layer.js.map +1 -1
- package/dist/messages/index.js.map +1 -1
- package/dist/mqtt/index.js.map +1 -1
- package/dist/ntfy/index.js +15 -15
- package/dist/ntfy/index.js.map +1 -1
- package/dist/ntfy/url.js +3 -3
- package/dist/ntfy/url.js.map +1 -1
- package/dist/ntfy/url.test.js.map +1 -1
- package/dist/utils/log.js.map +1 -1
- package/package.json +3 -3
package/dist/base.js
CHANGED
|
@@ -10,154 +10,152 @@ export const XR_H_PREFIX = "h";
|
|
|
10
10
|
*
|
|
11
11
|
* https://openlv.sh/api/signaling
|
|
12
12
|
*/
|
|
13
|
-
export const createSignalingLayer = (init) => {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
const
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
13
|
+
export const createSignalingLayer = (init) => async ({ canEncrypt, encrypt, decrypt, rpDiscovered, k, publicKey, isHost, }) => {
|
|
14
|
+
const emitter = new EventEmitter();
|
|
15
|
+
let state = SIGNAL_STATE.STANDBY;
|
|
16
|
+
const setState = (_state) => {
|
|
17
|
+
state = _state;
|
|
18
|
+
emitter.emit("state_change", _state);
|
|
19
|
+
};
|
|
20
|
+
const handshakeKey = k || undefined;
|
|
21
|
+
const send = async (method, recipient, payload) => {
|
|
22
|
+
const prefix = match(method)
|
|
23
|
+
.with("handshake", () => XR_H_PREFIX)
|
|
24
|
+
.with("encrypted", () => XR_PREFIX)
|
|
25
|
+
.exhaustive();
|
|
26
|
+
const message = await match(method)
|
|
27
|
+
.with("handshake", () => {
|
|
28
|
+
if (!handshakeKey)
|
|
29
|
+
return;
|
|
30
|
+
return handshakeKey.encrypt(JSON.stringify(payload));
|
|
31
|
+
})
|
|
32
|
+
.with("encrypted", () => {
|
|
33
|
+
if (!canEncrypt())
|
|
34
|
+
return;
|
|
35
|
+
return encrypt(JSON.stringify(payload));
|
|
36
|
+
})
|
|
37
|
+
.exhaustive();
|
|
38
|
+
await init.publish(prefix + recipient + message);
|
|
39
|
+
};
|
|
40
|
+
const handleReceive = async (payload) => {
|
|
41
|
+
const prefix = payload.slice(0, XR_H_PREFIX.length);
|
|
42
|
+
const recipient = payload.slice(XR_H_PREFIX.length, XR_H_PREFIX.length + 1);
|
|
43
|
+
const body = payload.slice(XR_PREFIX.length + 1);
|
|
44
|
+
const isRecipient = (isHost ? "h" : "c") === recipient;
|
|
45
|
+
log("isRecipient", isRecipient);
|
|
46
|
+
if (!isRecipient)
|
|
47
|
+
return;
|
|
48
|
+
await match({ prefix, body })
|
|
49
|
+
.with({ prefix: XR_H_PREFIX }, async () => {
|
|
50
|
+
if (!handshakeKey)
|
|
51
|
+
return;
|
|
52
|
+
const message = await handshakeKey.decrypt(body);
|
|
53
|
+
const msg = JSON.parse(message);
|
|
54
|
+
await match(msg)
|
|
55
|
+
.with({ type: "flash" }, async () => {
|
|
56
|
+
if (!isHost)
|
|
30
57
|
return;
|
|
31
|
-
|
|
58
|
+
setState(SIGNAL_STATE.HANDSHAKE);
|
|
59
|
+
await send("handshake", "c", {
|
|
60
|
+
type: "pubkey",
|
|
61
|
+
payload: {
|
|
62
|
+
publicKey: publicKey.toString(),
|
|
63
|
+
},
|
|
64
|
+
timestamp: Date.now(),
|
|
65
|
+
});
|
|
32
66
|
})
|
|
33
|
-
.with("
|
|
34
|
-
if (
|
|
67
|
+
.with({ type: "pubkey" }, async ({ payload }) => {
|
|
68
|
+
if (isHost)
|
|
35
69
|
return;
|
|
36
|
-
|
|
70
|
+
await rpDiscovered(payload.publicKey);
|
|
71
|
+
setState(SIGNAL_STATE.HANDSHAKE_PARTIAL);
|
|
72
|
+
return await send("encrypted", "h", {
|
|
73
|
+
type: "pubkey",
|
|
74
|
+
payload: {
|
|
75
|
+
publicKey: publicKey.toString(),
|
|
76
|
+
},
|
|
77
|
+
timestamp: Date.now(),
|
|
78
|
+
});
|
|
37
79
|
})
|
|
38
|
-
.
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
const
|
|
44
|
-
const
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
return;
|
|
49
|
-
await match({ prefix, body })
|
|
50
|
-
.with({ prefix: XR_H_PREFIX }, async () => {
|
|
51
|
-
if (!handshakeKey)
|
|
80
|
+
.otherwise(() => {
|
|
81
|
+
log("Received invalid message H", msg);
|
|
82
|
+
});
|
|
83
|
+
})
|
|
84
|
+
.with({ prefix: XR_PREFIX }, async () => {
|
|
85
|
+
const message = await decrypt(body);
|
|
86
|
+
const msg = JSON.parse(message);
|
|
87
|
+
await match(msg)
|
|
88
|
+
.with({ type: "pubkey" }, async ({ payload }) => {
|
|
89
|
+
if (!isHost)
|
|
52
90
|
return;
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
await
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
setState(SIGNAL_STATE.HANDSHAKE);
|
|
60
|
-
await send("handshake", "c", {
|
|
61
|
-
type: "pubkey",
|
|
62
|
-
payload: {
|
|
63
|
-
publicKey: publicKey.toString(),
|
|
64
|
-
},
|
|
65
|
-
timestamp: Date.now(),
|
|
66
|
-
});
|
|
67
|
-
})
|
|
68
|
-
.with({ type: "pubkey" }, async ({ payload }) => {
|
|
69
|
-
if (isHost)
|
|
70
|
-
return;
|
|
71
|
-
await rpDiscovered(payload.publicKey);
|
|
72
|
-
setState(SIGNAL_STATE.HANDSHAKE_PARTIAL);
|
|
73
|
-
return await send("encrypted", "h", {
|
|
74
|
-
type: "pubkey",
|
|
75
|
-
payload: {
|
|
76
|
-
publicKey: publicKey.toString(),
|
|
77
|
-
},
|
|
78
|
-
timestamp: Date.now(),
|
|
79
|
-
});
|
|
80
|
-
})
|
|
81
|
-
.otherwise(() => {
|
|
82
|
-
log("Received invalid message H", msg);
|
|
91
|
+
await rpDiscovered(payload.publicKey);
|
|
92
|
+
setState(SIGNAL_STATE.HANDSHAKE_PARTIAL);
|
|
93
|
+
return await send("encrypted", "c", {
|
|
94
|
+
type: "ack",
|
|
95
|
+
payload: undefined,
|
|
96
|
+
timestamp: Date.now(),
|
|
83
97
|
});
|
|
84
98
|
})
|
|
85
|
-
.with({
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
type: "ack",
|
|
96
|
-
payload: undefined,
|
|
97
|
-
timestamp: Date.now(),
|
|
98
|
-
});
|
|
99
|
-
})
|
|
100
|
-
.with({ type: "ack" }, async () => {
|
|
101
|
-
if (state !== SIGNAL_STATE.HANDSHAKE_PARTIAL)
|
|
102
|
-
return;
|
|
103
|
-
setState(SIGNAL_STATE.ENCRYPTED);
|
|
104
|
-
if (isHost)
|
|
105
|
-
return;
|
|
106
|
-
return await send("encrypted", "h", {
|
|
107
|
-
type: "ack",
|
|
108
|
-
payload: undefined,
|
|
109
|
-
timestamp: Date.now(),
|
|
110
|
-
});
|
|
111
|
-
})
|
|
112
|
-
.with({ type: "data" }, async () => emitter.emit("message", msg.payload))
|
|
113
|
-
.otherwise(() => {
|
|
114
|
-
log("Received invalid message X", msg);
|
|
99
|
+
.with({ type: "ack" }, async () => {
|
|
100
|
+
if (state !== SIGNAL_STATE.HANDSHAKE_PARTIAL)
|
|
101
|
+
return;
|
|
102
|
+
setState(SIGNAL_STATE.ENCRYPTED);
|
|
103
|
+
if (isHost)
|
|
104
|
+
return;
|
|
105
|
+
return await send("encrypted", "h", {
|
|
106
|
+
type: "ack",
|
|
107
|
+
payload: undefined,
|
|
108
|
+
timestamp: Date.now(),
|
|
115
109
|
});
|
|
116
110
|
})
|
|
111
|
+
.with({ type: "data" }, async () => emitter.emit("message", msg.payload))
|
|
117
112
|
.otherwise(() => {
|
|
118
|
-
log("Received invalid message",
|
|
113
|
+
log("Received invalid message X", msg);
|
|
119
114
|
});
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
async setup() {
|
|
124
|
-
setState(SIGNAL_STATE.CONNECTING);
|
|
125
|
-
await init.setup();
|
|
126
|
-
if (!canEncrypt()) {
|
|
127
|
-
if (!isHost) {
|
|
128
|
-
setState(SIGNAL_STATE.READY);
|
|
129
|
-
await send("handshake", "h", {
|
|
130
|
-
type: "flash",
|
|
131
|
-
payload: {},
|
|
132
|
-
timestamp: Date.now(),
|
|
133
|
-
});
|
|
134
|
-
setState(SIGNAL_STATE.HANDSHAKE);
|
|
135
|
-
}
|
|
136
|
-
if (isHost) {
|
|
137
|
-
setState(SIGNAL_STATE.READY);
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
await init.subscribe(handleReceive);
|
|
141
|
-
},
|
|
142
|
-
async teardown() {
|
|
143
|
-
log("teardown");
|
|
144
|
-
await init.teardown?.();
|
|
145
|
-
},
|
|
146
|
-
send(message) {
|
|
147
|
-
if (!canEncrypt()) {
|
|
148
|
-
return Promise.reject(new Error("Cannot encrypt message before keys are exchanged"));
|
|
149
|
-
}
|
|
150
|
-
const them = isHost ? "c" : "h";
|
|
151
|
-
return send("encrypted", them, {
|
|
152
|
-
type: "data",
|
|
153
|
-
payload: message,
|
|
154
|
-
timestamp: Date.now(),
|
|
155
|
-
});
|
|
156
|
-
},
|
|
157
|
-
getState() {
|
|
158
|
-
return { state: state };
|
|
159
|
-
},
|
|
115
|
+
})
|
|
116
|
+
.otherwise(() => {
|
|
117
|
+
log("Received invalid message", payload);
|
|
160
118
|
});
|
|
161
119
|
};
|
|
120
|
+
return make(emitter, {
|
|
121
|
+
type: init.type,
|
|
122
|
+
async setup() {
|
|
123
|
+
setState(SIGNAL_STATE.CONNECTING);
|
|
124
|
+
await init.setup();
|
|
125
|
+
if (!canEncrypt()) {
|
|
126
|
+
if (!isHost) {
|
|
127
|
+
setState(SIGNAL_STATE.READY);
|
|
128
|
+
await send("handshake", "h", {
|
|
129
|
+
type: "flash",
|
|
130
|
+
payload: {},
|
|
131
|
+
timestamp: Date.now(),
|
|
132
|
+
});
|
|
133
|
+
setState(SIGNAL_STATE.HANDSHAKE);
|
|
134
|
+
}
|
|
135
|
+
if (isHost) {
|
|
136
|
+
setState(SIGNAL_STATE.READY);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
await init.subscribe(handleReceive);
|
|
140
|
+
},
|
|
141
|
+
async teardown() {
|
|
142
|
+
log("teardown");
|
|
143
|
+
await init.teardown?.();
|
|
144
|
+
},
|
|
145
|
+
send(message) {
|
|
146
|
+
if (!canEncrypt()) {
|
|
147
|
+
return Promise.reject(new Error("Cannot encrypt message before keys are exchanged"));
|
|
148
|
+
}
|
|
149
|
+
const them = isHost ? "c" : "h";
|
|
150
|
+
return send("encrypted", them, {
|
|
151
|
+
type: "data",
|
|
152
|
+
payload: message,
|
|
153
|
+
timestamp: Date.now(),
|
|
154
|
+
});
|
|
155
|
+
},
|
|
156
|
+
getState() {
|
|
157
|
+
return { state: state };
|
|
158
|
+
},
|
|
159
|
+
});
|
|
162
160
|
};
|
|
163
161
|
//# sourceMappingURL=base.js.map
|
package/dist/base.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.js","sourceRoot":"","sources":["../src/base.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEpC,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAInC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,OAAO,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAoDrC,MAAM,CAAC,MAAM,SAAS,GAAG,GAAG,CAAC;AAC7B,MAAM,CAAC,MAAM,WAAW,GAAG,GAAG,CAAC;AAE/B;;;;GAIG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAClC,IAAwB,EACN,EAAE;IACpB,OAAO,KAAK,EAAE,EACZ,UAAU,EACV,OAAO,EACP,OAAO,EACP,YAAY,EACZ,CAAC,EACD,SAAS,EACT,MAAM,GACc,EAAE,EAAE;QACxB,MAAM,OAAO,GAAG,IAAI,YAAY,EAAkB,CAAC;QACnD,IAAI,KAAK,GAAgB,YAAY,CAAC,OAAO,CAAC;QAC9C,MAAM,QAAQ,GAAG,CAAC,MAAmB,EAAE,EAAE;YACvC,KAAK,GAAG,MAAM,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;QACvC,CAAC,CAAC;QACF,MAAM,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAEvC,MAAM,IAAI,GAAG,KAAK,EAChB,MAAiC,EACjC,SAAoB,EACpB,OAAsB,EACtB,EAAE;YACF,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;iBACzB,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC;iBACpC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC;iBAClC,UAAU,EAAE,CAAC;YAEhB,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC;iBAChC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE;gBACtB,IAAI,CAAC,YAAY;oBAAE,OAAO;gBAE1B,OAAO,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;YACvD,CAAC,CAAC;iBACD,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE;gBACtB,IAAI,CAAC,UAAU,EAAE;oBAAE,OAAO;gBAE1B,OAAO,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;YAC1C,CAAC,CAAC;iBACD,UAAU,EAAE,CAAC;YAEhB,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,CAAC;QACnD,CAAC,CAAC;QAEF,MAAM,aAAa,GAAG,KAAK,EAAE,OAAe,EAAE,EAAE;YAC9C,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;YACpD,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAC7B,WAAW,CAAC,MAAM,EAClB,WAAW,CAAC,MAAM,GAAG,CAAC,CACvB,CAAC;YACF,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACjD,MAAM,WAAW,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,SAAS,CAAC;YAEvD,GAAG,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;YAEhC,IAAI,CAAC,WAAW;gBAAE,OAAO;YAEzB,MAAM,KAAK,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;iBAC1B,IAAI,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,KAAK,IAAI,EAAE;gBACxC,IAAI,CAAC,YAAY;oBAAE,OAAO;gBAE1B,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;gBACjD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAkB,CAAC;gBAEjD,MAAM,KAAK,CAAC,GAAG,CAAC;qBACb,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,KAAK,IAAI,EAAE;oBAClC,IAAI,CAAC,MAAM;wBAAE,OAAO;oBAEpB,QAAQ,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;oBACjC,MAAM,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE;wBAC3B,IAAI,EAAE,QAAQ;wBACd,OAAO,EAAE;4BACP,SAAS,EAAE,SAAS,CAAC,QAAQ,EAAE;yBAChC;wBACD,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;qBACtB,CAAC,CAAC;gBACL,CAAC,CAAC;qBACD,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;oBAC9C,IAAI,MAAM;wBAAE,OAAO;oBAEnB,MAAM,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;oBACtC,QAAQ,CAAC,YAAY,CAAC,iBAAiB,CAAC,CAAC;oBAEzC,OAAO,MAAM,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE;wBAClC,IAAI,EAAE,QAAQ;wBACd,OAAO,EAAE;4BACP,SAAS,EAAE,SAAS,CAAC,QAAQ,EAAE;yBAChC;wBACD,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;qBACtB,CAAC,CAAC;gBACL,CAAC,CAAC;qBACD,SAAS,CAAC,GAAG,EAAE;oBACd,GAAG,CAAC,4BAA4B,EAAE,GAAG,CAAC,CAAC;gBACzC,CAAC,CAAC,CAAC;YACP,CAAC,CAAC;iBACD,IAAI,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,KAAK,IAAI,EAAE;gBACtC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;gBACpC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAkB,CAAC;gBAEjD,MAAM,KAAK,CAAC,GAAG,CAAC;qBACb,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;oBAC9C,IAAI,CAAC,MAAM;wBAAE,OAAO;oBAEpB,MAAM,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;oBACtC,QAAQ,CAAC,YAAY,CAAC,iBAAiB,CAAC,CAAC;oBAEzC,OAAO,MAAM,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE;wBAClC,IAAI,EAAE,KAAK;wBACX,OAAO,EAAE,SAAS;wBAClB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;qBACtB,CAAC,CAAC;gBACL,CAAC,CAAC;qBACD,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,KAAK,IAAI,EAAE;oBAChC,IAAI,KAAK,KAAK,YAAY,CAAC,iBAAiB;wBAAE,OAAO;oBAErD,QAAQ,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;oBAEjC,IAAI,MAAM;wBAAE,OAAO;oBAEnB,OAAO,MAAM,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE;wBAClC,IAAI,EAAE,KAAK;wBACX,OAAO,EAAE,SAAS;wBAClB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;qBACtB,CAAC,CAAC;gBACL,CAAC,CAAC;qBACD,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,IAAI,EAAE,CACjC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,OAAiB,CAAC,CAC/C;qBACA,SAAS,CAAC,GAAG,EAAE;oBACd,GAAG,CAAC,4BAA4B,EAAE,GAAG,CAAC,CAAC;gBACzC,CAAC,CAAC,CAAC;YACP,CAAC,CAAC;iBACD,SAAS,CAAC,GAAG,EAAE;gBACd,GAAG,CAAC,0BAA0B,EAAE,OAAO,CAAC,CAAC;YAC3C,CAAC,CAAC,CAAC;QACP,CAAC,CAAC;QAEF,OAAO,IAAI,CAAC,OAAO,EAAE;YACnB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,KAAK,CAAC,KAAK;gBACT,QAAQ,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;gBAClC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;gBAEnB,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC;oBAClB,IAAI,CAAC,MAAM,EAAE,CAAC;wBACZ,QAAQ,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;wBAC7B,MAAM,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE;4BAC3B,IAAI,EAAE,OAAO;4BACb,OAAO,EAAE,EAAE;4BACX,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;yBACtB,CAAC,CAAC;wBACH,QAAQ,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;oBACnC,CAAC;oBAED,IAAI,MAAM,EAAE,CAAC;wBACX,QAAQ,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;oBAC/B,CAAC;gBACH,CAAC;gBAED,MAAM,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;YACtC,CAAC;YACD,KAAK,CAAC,QAAQ;gBACZ,GAAG,CAAC,UAAU,CAAC,CAAC;gBAChB,MAAM,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;YAC1B,CAAC;YACD,IAAI,CAAC,OAAe;gBAClB,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC;oBAClB,OAAO,OAAO,CAAC,MAAM,CACnB,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAC9D,CAAC;gBACJ,CAAC;gBAED,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;gBAEhC,OAAO,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE;oBAC7B,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE,OAAO;oBAChB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;iBACtB,CAAC,CAAC;YACL,CAAC;YACD,QAAQ;gBACN,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;YAC1B,CAAC;SACF,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"base.js","sourceRoot":"","sources":["../src/base.ts"],"names":[],"mappings":"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","sourcesContent":["import { make } from \"@openlv/core\";\nimport type { EncryptionKey, SymmetricKey } from \"@openlv/core/encryption\";\nimport { EventEmitter } from \"eventemitter3\";\nimport { match } from \"ts-pattern\";\nimport type { MaybePromise } from \"viem\";\n\nimport type { SignalEventMap, SignalState } from \"./layer.js\";\nimport { SIGNAL_STATE } from \"./layer.js\";\nimport type { SignalMessage } from \"./messages/index.js\";\nimport { log } from \"./utils/log.js\";\n\nexport type SignalBaseProperties = {\n topic: string;\n url: string;\n};\n\nexport type SignalingBaseLayer = {\n type: string;\n setup: () => MaybePromise<void>;\n teardown: () => MaybePromise<void>;\n publish: (payload: string) => MaybePromise<void>;\n subscribe: (handler: (payload: string) => void) => MaybePromise<void>;\n};\n\nexport type CreateSignalLayerFn = (\n properties: SignalBaseProperties,\n) => MaybePromise<SignalingLayerFn>;\n\nexport type SignalingProperties = {\n isHost: boolean;\n h: string;\n k?: SymmetricKey;\n rpDiscovered: (rpKey: string) => MaybePromise<void>;\n // Decrypt using our private key\n decrypt: (message: string) => MaybePromise<string>;\n // Encrypt to relying party\n encrypt: (message: string) => MaybePromise<string>;\n // our public key\n publicKey: EncryptionKey;\n canEncrypt: () => boolean;\n};\n\nexport type SignalingContext = {\n type: string;\n // waitForConnection: () => Promise<void>;\n // reconnect: () => void;\n\n // Sending only works once keys are exchanged\n send: (message: object) => MaybePromise<void>;\n setup: () => MaybePromise<void>;\n teardown: () => MaybePromise<void>;\n\n getState: () => {\n state: SignalState;\n };\n};\nexport type SignalingLayer = EventEmitter<SignalEventMap> & SignalingContext;\nexport type SignalingLayerFn = (\n properties: SignalingProperties,\n) => Promise<SignalingLayer>;\n\nexport const XR_PREFIX = \"x\";\nexport const XR_H_PREFIX = \"h\";\n\n/**\n * Base Signaling Layer implementation\n *\n * https://openlv.sh/api/signaling\n */\nexport const createSignalingLayer = (\n init: SignalingBaseLayer,\n): SignalingLayerFn => async ({\n canEncrypt,\n encrypt,\n decrypt,\n rpDiscovered,\n k,\n publicKey,\n isHost,\n}: SignalingProperties) => {\n const emitter = new EventEmitter<SignalEventMap>();\n let state: SignalState = SIGNAL_STATE.STANDBY;\n const setState = (_state: SignalState) => {\n state = _state;\n emitter.emit(\"state_change\", _state);\n };\n const handshakeKey = k || undefined;\n\n const send = async (\n method: \"handshake\" | \"encrypted\",\n recipient: \"h\" | \"c\",\n payload: SignalMessage,\n ) => {\n const prefix = match(method)\n .with(\"handshake\", () => XR_H_PREFIX)\n .with(\"encrypted\", () => XR_PREFIX)\n .exhaustive();\n\n const message = await match(method)\n .with(\"handshake\", () => {\n if (!handshakeKey) return;\n\n return handshakeKey.encrypt(JSON.stringify(payload));\n })\n .with(\"encrypted\", () => {\n if (!canEncrypt()) return;\n\n return encrypt(JSON.stringify(payload));\n })\n .exhaustive();\n\n await init.publish(prefix + recipient + message);\n };\n\n const handleReceive = async (payload: string) => {\n const prefix = payload.slice(0, XR_H_PREFIX.length);\n const recipient = payload.slice(\n XR_H_PREFIX.length,\n XR_H_PREFIX.length + 1,\n );\n const body = payload.slice(XR_PREFIX.length + 1);\n const isRecipient = (isHost ? \"h\" : \"c\") === recipient;\n\n log(\"isRecipient\", isRecipient);\n\n if (!isRecipient) return;\n\n await match({ prefix, body })\n .with({ prefix: XR_H_PREFIX }, async () => {\n if (!handshakeKey) return;\n\n const message = await handshakeKey.decrypt(body);\n const msg = JSON.parse(message) as SignalMessage;\n\n await match(msg)\n .with({ type: \"flash\" }, async () => {\n if (!isHost) return;\n\n setState(SIGNAL_STATE.HANDSHAKE);\n await send(\"handshake\", \"c\", {\n type: \"pubkey\",\n payload: {\n publicKey: publicKey.toString(),\n },\n timestamp: Date.now(),\n });\n })\n .with({ type: \"pubkey\" }, async ({ payload }) => {\n if (isHost) return;\n\n await rpDiscovered(payload.publicKey);\n setState(SIGNAL_STATE.HANDSHAKE_PARTIAL);\n\n return await send(\"encrypted\", \"h\", {\n type: \"pubkey\",\n payload: {\n publicKey: publicKey.toString(),\n },\n timestamp: Date.now(),\n });\n })\n .otherwise(() => {\n log(\"Received invalid message H\", msg);\n });\n })\n .with({ prefix: XR_PREFIX }, async () => {\n const message = await decrypt(body);\n const msg = JSON.parse(message) as SignalMessage;\n\n await match(msg)\n .with({ type: \"pubkey\" }, async ({ payload }) => {\n if (!isHost) return;\n\n await rpDiscovered(payload.publicKey);\n setState(SIGNAL_STATE.HANDSHAKE_PARTIAL);\n\n return await send(\"encrypted\", \"c\", {\n type: \"ack\",\n payload: undefined,\n timestamp: Date.now(),\n });\n })\n .with({ type: \"ack\" }, async () => {\n if (state !== SIGNAL_STATE.HANDSHAKE_PARTIAL) return;\n\n setState(SIGNAL_STATE.ENCRYPTED);\n\n if (isHost) return;\n\n return await send(\"encrypted\", \"h\", {\n type: \"ack\",\n payload: undefined,\n timestamp: Date.now(),\n });\n })\n .with({ type: \"data\" }, async () =>\n emitter.emit(\"message\", msg.payload as object),\n )\n .otherwise(() => {\n log(\"Received invalid message X\", msg);\n });\n })\n .otherwise(() => {\n log(\"Received invalid message\", payload);\n });\n };\n\n return make(emitter, {\n type: init.type,\n async setup() {\n setState(SIGNAL_STATE.CONNECTING);\n await init.setup();\n\n if (!canEncrypt()) {\n if (!isHost) {\n setState(SIGNAL_STATE.READY);\n await send(\"handshake\", \"h\", {\n type: \"flash\",\n payload: {},\n timestamp: Date.now(),\n });\n setState(SIGNAL_STATE.HANDSHAKE);\n }\n\n if (isHost) {\n setState(SIGNAL_STATE.READY);\n }\n }\n\n await init.subscribe(handleReceive);\n },\n async teardown() {\n log(\"teardown\");\n await init.teardown?.();\n },\n send(message: object) {\n if (!canEncrypt()) {\n return Promise.reject(\n new Error(\"Cannot encrypt message before keys are exchanged\"),\n );\n }\n\n const them = isHost ? \"c\" : \"h\";\n\n return send(\"encrypted\", them, {\n type: \"data\",\n payload: message,\n timestamp: Date.now(),\n });\n },\n getState() {\n return { state: state };\n },\n });\n};\n"]}
|
package/dist/dynamic.js
CHANGED
|
@@ -4,13 +4,20 @@ import { match } from "ts-pattern";
|
|
|
4
4
|
*
|
|
5
5
|
* TODO: Make this a built-in feature of session/provider
|
|
6
6
|
*/
|
|
7
|
-
export const dynamicSignalingLayer = async (protocol) =>
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
}
|
|
7
|
+
export const dynamicSignalingLayer = async (protocol) => match(protocol)
|
|
8
|
+
.with("mqtt", async () => {
|
|
9
|
+
const mod = await import("./mqtt/index.js");
|
|
10
|
+
return mod.mqtt;
|
|
11
|
+
})
|
|
12
|
+
.with("ntfy", async () => {
|
|
13
|
+
const mod = await import("./ntfy/index.js");
|
|
14
|
+
return mod.ntfy;
|
|
15
|
+
})
|
|
16
|
+
.with("gun", async () => {
|
|
17
|
+
const mod = await import("./gundb/index.js");
|
|
18
|
+
return mod.gundb;
|
|
19
|
+
})
|
|
20
|
+
.otherwise(() => {
|
|
21
|
+
throw new Error(`Unknown signaling protocol: ${protocol}`);
|
|
22
|
+
});
|
|
16
23
|
//# sourceMappingURL=dynamic.js.map
|
package/dist/dynamic.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dynamic.js","sourceRoot":"","sources":["../src/dynamic.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC;;;;GAIG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,KAAK,EAAE,QAAgB,EAAE,EAAE
|
|
1
|
+
{"version":3,"file":"dynamic.js","sourceRoot":"","sources":["../src/dynamic.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC;;;;GAIG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,KAAK,EAAE,QAAgB,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC;KAC7E,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,EAAE;IACvB,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAE5C,OAAO,GAAG,CAAC,IAAI,CAAC;AAClB,CAAC,CAAC;KACD,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,EAAE;IACvB,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAE5C,OAAO,GAAG,CAAC,IAAI,CAAC;AAClB,CAAC,CAAC;KACD,IAAI,CAAC,KAAK,EAAE,KAAK,IAAI,EAAE;IACtB,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;IAE7C,OAAO,GAAG,CAAC,KAAK,CAAC;AACnB,CAAC,CAAC;KACD,SAAS,CAAC,GAAG,EAAE;IACd,MAAM,IAAI,KAAK,CAAC,+BAA+B,QAAQ,EAAE,CAAC,CAAC;AAC7D,CAAC,CAAC,CAAC","sourcesContent":["import { match } from \"ts-pattern\";\n\n/**\n * Imports the signaling layer based on the protocol at runtime\n *\n * TODO: Make this a built-in feature of session/provider\n */\nexport const dynamicSignalingLayer = async (protocol: string) => match(protocol)\n .with(\"mqtt\", async () => {\n const mod = await import(\"./mqtt/index.js\");\n\n return mod.mqtt;\n })\n .with(\"ntfy\", async () => {\n const mod = await import(\"./ntfy/index.js\");\n\n return mod.ntfy;\n })\n .with(\"gun\", async () => {\n const mod = await import(\"./gundb/index.js\");\n\n return mod.gundb;\n })\n .otherwise(() => {\n throw new Error(`Unknown signaling protocol: ${protocol}`);\n });\n"]}
|
package/dist/gundb/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/gundb/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,GAAG,EAAE,EAAgC,MAAM,KAAK,CAAC;AAExD,OAAO,EAAE,oBAAoB,EAA4B,MAAM,YAAY,CAAC;AAC5E,OAAO,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAEtC;;;GAGG;AACH,MAAM,CAAC,MAAM,KAAK,GAAwB,CAAC,EACzC,KAAK,EACL,GAAG,GAAG,uBAAuB,GAC9B,EAAE,EAAE;IACH,IAAI,UAAoC,CAAC;IAEzC,OAAO,oBAAoB,CAAC;QAC1B,IAAI,EAAE,OAAO;QACb,KAAK,CAAC,KAAK;YACT,GAAG,CAAC,mBAAmB,CAAC,CAAC;YACzB,MAAM,CAAC,GAAG,IAAK,GAAuB,CAAC;gBACrC,KAAK,EAAE,CAAC,GAAG,CAAC;gBACZ,IAAI,EAAE,SAAS;gBACf,YAAY,EAAE,SAAS;aACxB,CAAC,CAAC;YAEH,UAAU,GAAG,CAAC,CAAC;YAEf,MAAM,UAAU,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC;QACD,QAAQ;YACN,kBAAkB;YAClB,UAAU,GAAG,SAAS,CAAC;QACzB,CAAC;QACD,KAAK,CAAC,OAAO,CAAC,OAAO;YACnB,IAAI,CAAC,UAAU;gBAAE,MAAM,IAAI,uBAAuB,EAAE,CAAC;YAErD,GAAG,CAAC,2BAA2B,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;YACjD,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QAC/C,CAAC;QACD,KAAK,CAAC,SAAS,CAAC,OAAO;YACrB,IAAI,CAAC,UAAU;gBAAE,MAAM,IAAI,uBAAuB,EAAE,CAAC;YAErD,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE;gBAChC,GAAG,CAAC,yBAAyB,EAAE,IAAI,CAAC,CAAC;gBAErC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC;gBAEtC,IAAI,CAAC,OAAO;oBAAE,OAAO;gBAErB,OAAO,CAAC,OAAO,CAAC,CAAC;YACnB,CAAC,CAAC,CAAC;QACL,CAAC;KACF,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE;IACnB,MAAM,EAAE,OAAO;CAChB,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/gundb/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,GAAG,EAAE,EAAgC,MAAM,KAAK,CAAC;AAExD,OAAO,EAAE,oBAAoB,EAA4B,MAAM,YAAY,CAAC;AAC5E,OAAO,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAEtC;;;GAGG;AACH,MAAM,CAAC,MAAM,KAAK,GAAwB,CAAC,EACzC,KAAK,EACL,GAAG,GAAG,uBAAuB,GAC9B,EAAE,EAAE;IACH,IAAI,UAAoC,CAAC;IAEzC,OAAO,oBAAoB,CAAC;QAC1B,IAAI,EAAE,OAAO;QACb,KAAK,CAAC,KAAK;YACT,GAAG,CAAC,mBAAmB,CAAC,CAAC;YACzB,MAAM,CAAC,GAAG,IAAK,GAAuB,CAAC;gBACrC,KAAK,EAAE,CAAC,GAAG,CAAC;gBACZ,IAAI,EAAE,SAAS;gBACf,YAAY,EAAE,SAAS;aACxB,CAAC,CAAC;YAEH,UAAU,GAAG,CAAC,CAAC;YAEf,MAAM,UAAU,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC;QACD,QAAQ;YACN,kBAAkB;YAClB,UAAU,GAAG,SAAS,CAAC;QACzB,CAAC;QACD,KAAK,CAAC,OAAO,CAAC,OAAO;YACnB,IAAI,CAAC,UAAU;gBAAE,MAAM,IAAI,uBAAuB,EAAE,CAAC;YAErD,GAAG,CAAC,2BAA2B,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;YACjD,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QAC/C,CAAC;QACD,KAAK,CAAC,SAAS,CAAC,OAAO;YACrB,IAAI,CAAC,UAAU;gBAAE,MAAM,IAAI,uBAAuB,EAAE,CAAC;YAErD,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE;gBAChC,GAAG,CAAC,yBAAyB,EAAE,IAAI,CAAC,CAAC;gBAErC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC;gBAEtC,IAAI,CAAC,OAAO;oBAAE,OAAO;gBAErB,OAAO,CAAC,OAAO,CAAC,CAAC;YACnB,CAAC,CAAC,CAAC;QACL,CAAC;KACF,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE;IACnB,MAAM,EAAE,OAAO;CAChB,CAAC,CAAC","sourcesContent":["import { SignalNoConnectionError } from \"@openlv/core/errors\";\nimport Gun, { type IGun, type IGunInstance } from \"gun\";\n\nimport { createSignalingLayer, type CreateSignalLayerFn } from \"../base.js\";\nimport { log } from \"../utils/log.js\";\n\n/**\n * GunDB Signaling Layer\n * https://openlv.sh/api/signaling/gun\n */\nexport const gundb: CreateSignalLayerFn = ({\n topic,\n url = \"wss://try.axe.eco/gun\",\n}) => {\n let connection: IGunInstance | undefined;\n\n return createSignalingLayer({\n type: \"gundb\",\n async setup() {\n log(\"GUNDB: Setting up\");\n const x = new (Gun as unknown as IGun)({\n peers: [url],\n file: undefined,\n localStorage: undefined,\n });\n\n connection = x;\n\n await connection?.get(topic);\n },\n teardown() {\n // connection?.();\n connection = undefined;\n },\n async publish(payload) {\n if (!connection) throw new SignalNoConnectionError();\n\n log(\"GUNDB: Publishing message\", topic, payload);\n connection.get(topic).put({ data: payload });\n },\n async subscribe(handler) {\n if (!connection) throw new SignalNoConnectionError();\n\n connection.get(topic).on((data) => {\n log(\"GUNDB: Received message\", data);\n\n const message = data.data?.toString();\n\n if (!message) return;\n\n handler(message);\n });\n },\n });\n};\n\nObject.assign(gundb, {\n __name: \"gundb\",\n});\n"]}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,yEAAyE;AAEzE,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,qBAAqB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,yEAAyE;AAEzE,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,qBAAqB,CAAC","sourcesContent":["/** biome-ignore-all lint/performance/noReExportAll: package entrypoint */\n/** biome-ignore-all lint/performance/noBarrelFile: package entrypoint */\n\nexport * from \"./base.js\";\nexport * from \"./layer.js\";\nexport * from \"./messages/index.js\";\n"]}
|
package/dist/index.test.js
CHANGED
|
@@ -5,68 +5,148 @@ import { mqtt } from "./mqtt/index.js";
|
|
|
5
5
|
import { ntfy } from "./ntfy/index.js";
|
|
6
6
|
import { log } from "./utils/log.js";
|
|
7
7
|
const hKey = "test";
|
|
8
|
-
const
|
|
9
|
-
// [
|
|
10
|
-
// mqtt,
|
|
11
|
-
// { topic: "mytesttopic1111", url: "wss://test.mosquitto.org:8081/mqtt" },
|
|
12
|
-
// ],
|
|
8
|
+
const providersByType = [
|
|
13
9
|
[
|
|
14
|
-
mqtt,
|
|
15
|
-
|
|
10
|
+
"mqtt",
|
|
11
|
+
[
|
|
12
|
+
[
|
|
13
|
+
"mqtt-dashboard",
|
|
14
|
+
mqtt,
|
|
15
|
+
{
|
|
16
|
+
topic: "mytesttopic1111",
|
|
17
|
+
url: "wss://mqtt-dashboard.com:8884/mqtt",
|
|
18
|
+
},
|
|
19
|
+
],
|
|
20
|
+
[
|
|
21
|
+
"broker.emqx.io",
|
|
22
|
+
mqtt,
|
|
23
|
+
{
|
|
24
|
+
topic: "mytesttopic1111",
|
|
25
|
+
url: "ws://broker.emqx.io:8083/mqtt",
|
|
26
|
+
},
|
|
27
|
+
],
|
|
28
|
+
[
|
|
29
|
+
"test.mosquitto.org",
|
|
30
|
+
mqtt,
|
|
31
|
+
{
|
|
32
|
+
topic: "mytesttopic1111",
|
|
33
|
+
url: "ws://test.mosquitto.org:8080/mqtt",
|
|
34
|
+
},
|
|
35
|
+
],
|
|
36
|
+
[
|
|
37
|
+
"broker.itdata.nu",
|
|
38
|
+
mqtt,
|
|
39
|
+
{
|
|
40
|
+
topic: "mytesttopic1111",
|
|
41
|
+
url: "wss://broker.itdata.nu/mqtt",
|
|
42
|
+
},
|
|
43
|
+
],
|
|
44
|
+
],
|
|
45
|
+
],
|
|
46
|
+
[
|
|
47
|
+
"ntfy",
|
|
48
|
+
[
|
|
49
|
+
[
|
|
50
|
+
"ntfy.sh",
|
|
51
|
+
ntfy,
|
|
52
|
+
{ topic: "mytesttopic1111", url: "https://ntfy.sh/" },
|
|
53
|
+
],
|
|
54
|
+
[
|
|
55
|
+
"ntfy.envs.net",
|
|
56
|
+
ntfy,
|
|
57
|
+
{ topic: "mytesttopic1111", url: "https://ntfy.envs.net/" },
|
|
58
|
+
],
|
|
59
|
+
],
|
|
60
|
+
],
|
|
61
|
+
[
|
|
62
|
+
"gundb",
|
|
63
|
+
[
|
|
64
|
+
[
|
|
65
|
+
"try.axe.eco",
|
|
66
|
+
gundb,
|
|
67
|
+
{ topic: "mytesttopic1111", url: "wss://try.axe.eco/gun" },
|
|
68
|
+
],
|
|
69
|
+
],
|
|
16
70
|
],
|
|
17
|
-
[mqtt, { topic: "mytesttopic1111", url: "ws://broker.emqx.io:8083/mqtt" }],
|
|
18
|
-
[ntfy, { topic: "mytesttopic1111", url: "https://ntfy.sh/" }],
|
|
19
|
-
[gundb, { topic: "mytesttopic1111", url: "wss://try.axe.eco/gun" }],
|
|
20
71
|
];
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
log("messageReceivedB", message);
|
|
59
|
-
expect(message).toEqual({ data: "test1" });
|
|
60
|
-
resolve();
|
|
61
|
-
});
|
|
62
|
-
});
|
|
63
|
-
await signalA.send({ data: "test1" });
|
|
64
|
-
await messageReceivedB;
|
|
65
|
-
await signalB.send({ data: "test2" });
|
|
66
|
-
await messageReceivedA;
|
|
67
|
-
await signalA.teardown();
|
|
68
|
-
await signalB.teardown();
|
|
72
|
+
const testSignalingLayer = async (layer, props) => {
|
|
73
|
+
const { encryptionKey: publicKey, decryptionKey } = await generateKeyPair();
|
|
74
|
+
const h = hKey;
|
|
75
|
+
const signalingLayer = await layer(props);
|
|
76
|
+
const signalA = await signalingLayer({
|
|
77
|
+
h,
|
|
78
|
+
rpDiscovered: v => log("rpKey", v),
|
|
79
|
+
canEncrypt: () => true,
|
|
80
|
+
encrypt: publicKey.encrypt,
|
|
81
|
+
decrypt: decryptionKey.decrypt,
|
|
82
|
+
publicKey,
|
|
83
|
+
isHost: true,
|
|
84
|
+
});
|
|
85
|
+
const signalB = await signalingLayer({
|
|
86
|
+
h,
|
|
87
|
+
rpDiscovered: v => log("rpKey", v),
|
|
88
|
+
canEncrypt: () => true,
|
|
89
|
+
encrypt: publicKey.encrypt,
|
|
90
|
+
decrypt: decryptionKey.decrypt,
|
|
91
|
+
publicKey,
|
|
92
|
+
isHost: false,
|
|
93
|
+
});
|
|
94
|
+
expect(signalA).toBeDefined();
|
|
95
|
+
expect(signalB).toBeDefined();
|
|
96
|
+
await Promise.all([signalA.setup(), signalB.setup()]);
|
|
97
|
+
const messageReceivedA = new Promise((resolve) => {
|
|
98
|
+
signalA.on("message", (message) => {
|
|
99
|
+
log("messageReceivedA", message);
|
|
100
|
+
expect(message).toEqual({ data: "test2" });
|
|
101
|
+
resolve();
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
const messageReceivedB = new Promise((resolve) => {
|
|
105
|
+
signalB.on("message", (message) => {
|
|
106
|
+
log("messageReceivedB", message);
|
|
107
|
+
expect(message).toEqual({ data: "test1" });
|
|
108
|
+
resolve();
|
|
69
109
|
});
|
|
70
110
|
});
|
|
111
|
+
await signalA.send({ data: "test1" });
|
|
112
|
+
await messageReceivedB;
|
|
113
|
+
await signalB.send({ data: "test2" });
|
|
114
|
+
await messageReceivedA;
|
|
115
|
+
await signalA.teardown();
|
|
116
|
+
await signalB.teardown();
|
|
117
|
+
};
|
|
118
|
+
const PROVIDER_TIMEOUT_MS = 5000;
|
|
119
|
+
const testProvider = async (layer, props) => {
|
|
120
|
+
const timeout = new Promise((_, reject) => setTimeout(() => reject(new Error(`Timeout after ${PROVIDER_TIMEOUT_MS}ms`)), PROVIDER_TIMEOUT_MS));
|
|
121
|
+
const startTime = performance.now();
|
|
122
|
+
try {
|
|
123
|
+
await Promise.race([testSignalingLayer(layer, props), timeout]);
|
|
124
|
+
const duration = Math.round(performance.now() - startTime);
|
|
125
|
+
return { url: props.url, ok: true, duration };
|
|
126
|
+
}
|
|
127
|
+
catch (error) {
|
|
128
|
+
return {
|
|
129
|
+
url: props.url,
|
|
130
|
+
ok: false,
|
|
131
|
+
error: error.message,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
};
|
|
135
|
+
const formatResults = (typeName, results) => {
|
|
136
|
+
const passed = results.filter(r => r.ok).length;
|
|
137
|
+
const total = results.length;
|
|
138
|
+
return [
|
|
139
|
+
`${typeName.toUpperCase()}: ${passed}/${total}`,
|
|
140
|
+
...results.map(r => (r.ok ? `✓ ${r.url} ${r.duration}ms` : `✗ ${r.url} - ${r.error}`)),
|
|
141
|
+
].join("\n");
|
|
142
|
+
};
|
|
143
|
+
describe.for(providersByType)("signaling: %s", ([typeName, providers]) => {
|
|
144
|
+
it("should pass signaling messages between peers", { timeout: PROVIDER_TIMEOUT_MS * providers.length + 5000 }, async () => {
|
|
145
|
+
const results = await Promise.all(providers.map(([, layer, props]) => testProvider(layer, props)));
|
|
146
|
+
const summary = formatResults(typeName, results);
|
|
147
|
+
console.log(`\n${summary}`);
|
|
148
|
+
const passed = results.filter(r => r.ok).length;
|
|
149
|
+
expect(passed).toBeGreaterThan(0);
|
|
150
|
+
});
|
|
71
151
|
});
|
|
72
152
|
//# sourceMappingURL=index.test.js.map
|
package/dist/index.test.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.test.js","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAG9C,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACvC,OAAO,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAErC,MAAM,IAAI,GAAG,MAAM,CAAC;AAEpB,MAAM,
|
|
1
|
+
{"version":3,"file":"index.test.js","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { generateKeyPair } from \"@openlv/core/encryption\";\nimport { describe, expect, it } from \"vitest\";\n\nimport type { CreateSignalLayerFn, SignalBaseProperties } from \"./base.js\";\nimport { gundb } from \"./gundb/index.js\";\nimport { mqtt } from \"./mqtt/index.js\";\nimport { ntfy } from \"./ntfy/index.js\";\nimport { log } from \"./utils/log.js\";\n\nconst hKey = \"test\";\n\nconst providersByType: readonly [\n string,\n readonly [string, CreateSignalLayerFn, SignalBaseProperties][],\n][] = [\n [\n \"mqtt\",\n [\n [\n \"mqtt-dashboard\",\n mqtt,\n {\n topic: \"mytesttopic1111\",\n url: \"wss://mqtt-dashboard.com:8884/mqtt\",\n },\n ],\n [\n \"broker.emqx.io\",\n mqtt,\n {\n topic: \"mytesttopic1111\",\n url: \"ws://broker.emqx.io:8083/mqtt\",\n },\n ],\n [\n \"test.mosquitto.org\",\n mqtt,\n {\n topic: \"mytesttopic1111\",\n url: \"ws://test.mosquitto.org:8080/mqtt\",\n },\n ],\n [\n \"broker.itdata.nu\",\n mqtt,\n {\n topic: \"mytesttopic1111\",\n url: \"wss://broker.itdata.nu/mqtt\",\n },\n ],\n ],\n ],\n [\n \"ntfy\",\n [\n [\n \"ntfy.sh\",\n ntfy,\n { topic: \"mytesttopic1111\", url: \"https://ntfy.sh/\" },\n ],\n [\n \"ntfy.envs.net\",\n ntfy,\n { topic: \"mytesttopic1111\", url: \"https://ntfy.envs.net/\" },\n ],\n ],\n ],\n [\n \"gundb\",\n [\n [\n \"try.axe.eco\",\n gundb,\n { topic: \"mytesttopic1111\", url: \"wss://try.axe.eco/gun\" },\n ],\n ],\n ],\n] as const;\n\nconst testSignalingLayer = async (\n layer: CreateSignalLayerFn,\n props: SignalBaseProperties,\n): Promise<void> => {\n const { encryptionKey: publicKey, decryptionKey } = await generateKeyPair();\n const h = hKey;\n\n const signalingLayer = await layer(props);\n const signalA = await signalingLayer({\n h,\n rpDiscovered: v => log(\"rpKey\", v),\n canEncrypt: () => true,\n encrypt: publicKey.encrypt,\n decrypt: decryptionKey.decrypt,\n publicKey,\n isHost: true,\n });\n const signalB = await signalingLayer({\n h,\n rpDiscovered: v => log(\"rpKey\", v),\n canEncrypt: () => true,\n encrypt: publicKey.encrypt,\n decrypt: decryptionKey.decrypt,\n publicKey,\n isHost: false,\n });\n\n expect(signalA).toBeDefined();\n expect(signalB).toBeDefined();\n\n await Promise.all([signalA.setup(), signalB.setup()]);\n\n const messageReceivedA = new Promise<void>((resolve) => {\n signalA.on(\"message\", (message) => {\n log(\"messageReceivedA\", message);\n expect(message).toEqual({ data: \"test2\" });\n resolve();\n });\n });\n const messageReceivedB = new Promise<void>((resolve) => {\n signalB.on(\"message\", (message) => {\n log(\"messageReceivedB\", message);\n expect(message).toEqual({ data: \"test1\" });\n resolve();\n });\n });\n\n await signalA.send({ data: \"test1\" });\n\n await messageReceivedB;\n\n await signalB.send({ data: \"test2\" });\n\n await messageReceivedA;\n\n await signalA.teardown();\n await signalB.teardown();\n};\n\nconst PROVIDER_TIMEOUT_MS = 5000;\n\ntype ProviderResult =\n | { url: string; ok: true; duration: number; }\n | { url: string; ok: false; error: string; };\n\nconst testProvider = async (\n layer: CreateSignalLayerFn,\n props: SignalBaseProperties,\n): Promise<ProviderResult> => {\n const timeout = new Promise<never>((_, reject) =>\n setTimeout(\n () => reject(new Error(`Timeout after ${PROVIDER_TIMEOUT_MS}ms`)),\n PROVIDER_TIMEOUT_MS,\n ),\n );\n\n const startTime = performance.now();\n\n try {\n await Promise.race([testSignalingLayer(layer, props), timeout]);\n const duration = Math.round(performance.now() - startTime);\n\n return { url: props.url, ok: true, duration };\n }\n catch (error) {\n return {\n url: props.url,\n ok: false,\n error: (error as Error).message,\n };\n }\n};\n\nconst formatResults = (typeName: string, results: ProviderResult[]): string => {\n const passed = results.filter(r => r.ok).length;\n const total = results.length;\n\n return [\n `${typeName.toUpperCase()}: ${passed}/${total}`,\n ...results.map(r =>\n (r.ok ? `✓ ${r.url} ${r.duration}ms` : `✗ ${r.url} - ${r.error}`),\n ),\n ].join(\"\\n\");\n};\n\ndescribe.for(providersByType)(\"signaling: %s\", ([typeName, providers]) => {\n it(\n \"should pass signaling messages between peers\",\n { timeout: PROVIDER_TIMEOUT_MS * providers.length + 5000 },\n async () => {\n const results = await Promise.all(\n providers.map(([, layer, props]) => testProvider(layer, props)),\n );\n\n const summary = formatResults(typeName, results);\n\n console.log(`\\n${summary}`);\n\n const passed = results.filter(r => r.ok).length;\n\n expect(passed).toBeGreaterThan(0);\n },\n );\n});\n"]}
|
package/dist/layer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layer.js","sourceRoot":"","sources":["../src/layer.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,OAAO,EAAE,SAAS;IAClB,UAAU,EAAE,YAAY;IACxB,KAAK,EAAE,OAAO;IACd,SAAS,EAAE,WAAW;IACtB,iBAAiB,EAAE,mBAAmB;IACtC,SAAS,EAAE,WAAW;IACtB,KAAK,EAAE,OAAO;CACN,CAAC"}
|
|
1
|
+
{"version":3,"file":"layer.js","sourceRoot":"","sources":["../src/layer.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,OAAO,EAAE,SAAS;IAClB,UAAU,EAAE,YAAY;IACxB,KAAK,EAAE,OAAO;IACd,SAAS,EAAE,WAAW;IACtB,iBAAiB,EAAE,mBAAmB;IACtC,SAAS,EAAE,WAAW;IACtB,KAAK,EAAE,OAAO;CACN,CAAC","sourcesContent":["export const SIGNAL_STATE = {\n STANDBY: \"standby\",\n CONNECTING: \"connecting\",\n READY: \"ready\",\n HANDSHAKE: \"handshake\",\n HANDSHAKE_PARTIAL: \"handshake-partial\",\n ENCRYPTED: \"encrypted\",\n ERROR: \"error\",\n} as const;\nexport type SignalState = (typeof SIGNAL_STATE)[keyof typeof SIGNAL_STATE];\n\nexport type SignalEventMap = {\n state_change: (state: SignalState) => void;\n message: (message: object) => void;\n};\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/messages/index.ts"],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/messages/index.ts"],"names":[],"mappings":"","sourcesContent":["export type SignalMessageBase<T extends string, P> = {\n type: T;\n payload: P;\n timestamp: number;\n};\n\n/**\n * Flash message\n * Sent to initiate handshake by non-host\n */\nexport type SignalMessageFlash = SignalMessageBase<\"flash\", object>;\n\nexport type SignalMessagePubkey = SignalMessageBase<\n \"pubkey\",\n {\n publicKey: string;\n dAppInfo?: {\n name: string;\n url: string;\n icon: string;\n };\n }\n>;\n\nexport type SignalMessageAck = SignalMessageBase<\"ack\", undefined>;\n\nexport type SignalMessageData = SignalMessageBase<\"data\", object>;\n\nexport type SignalMessage =\n | SignalMessageFlash\n | SignalMessagePubkey\n | SignalMessageAck\n | SignalMessageData;\n"]}
|
package/dist/mqtt/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mqtt/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAmB,MAAM,gBAAgB,CAAC;AAG7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAEtC;;;;GAIG;AACH,MAAM,CAAC,MAAM,IAAI,GAAwB,CAAC,EACxC,GAAG,GAAG,oCAAoC,EAC1C,KAAK,GACgB,EAAE,EAAE;IACzB,IAAI,UAAkC,CAAC;IAEvC,OAAO,oBAAoB,CAAC;QAC1B,IAAI,EAAE,MAAM;QACZ,KAAK;YACH,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBACrC,UAAU,GAAG,UAAU,CAAC;oBACtB,GAAG;oBACH,kCAAkC;oBAClC,yBAAyB;oBACzB,wBAAwB;iBACzB,CAAC,CAAC;gBAEH,UAAU,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;oBAC5B,OAAO,EAAE,CAAC;gBACZ,CAAC,CAAC,CAAC;gBACH,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;oBAC/B,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,KAAK,CAAC,CAAC;oBACtD,MAAM,CAAC,KAAK,CAAC,CAAC;gBAChB,CAAC,CAAC,CAAC;gBAEH,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;oBAC1B,MAAM,CAAC,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC,CAAC;gBACtD,CAAC,CAAC,CAAC;gBAEH,UAAU,CAAC,OAAO,EAAE,CAAC;YACvB,CAAC,CAAC,CAAC;QACL,CAAC;QACD,QAAQ;YACN,UAAU,EAAE,KAAK,EAAE,CAAC;YACpB,UAAU,GAAG,SAAS,CAAC;QACzB,CAAC;QACD,KAAK,CAAC,OAAO,CAAC,OAAO;YACnB,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;YACvD,CAAC;YAED,UAAU,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;QACzD,CAAC;QACD,KAAK,CAAC,SAAS,CAAC,OAAO;YACrB,IAAI,CAAC,UAAU;gBAAE,MAAM,IAAI,uBAAuB,EAAE,CAAC;YAErD,GAAG,CAAC,4BAA4B,EAAE,KAAK,CAAC,CAAC;YAEzC,UAAU,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,aAAa,EAAE,OAAO,EAAE,EAAE;gBAClD,GAAG,CAAC,iCAAiC,EAAE,KAAK,CAAC,CAAC;gBAE9C,IAAI,aAAa,KAAK,KAAK;oBAAE,OAAO;gBAEpC,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;gBAElD,OAAO,CAAC,OAAO,CAAC,CAAC;YACnB,CAAC,CAAC,CAAC;YAEH,MAAM,UAAU,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC;QACrC,CAAC;KACF,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mqtt/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAmB,MAAM,gBAAgB,CAAC;AAG7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAEtC;;;;GAIG;AACH,MAAM,CAAC,MAAM,IAAI,GAAwB,CAAC,EACxC,GAAG,GAAG,oCAAoC,EAC1C,KAAK,GACgB,EAAE,EAAE;IACzB,IAAI,UAAkC,CAAC;IAEvC,OAAO,oBAAoB,CAAC;QAC1B,IAAI,EAAE,MAAM;QACZ,KAAK;YACH,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBACrC,UAAU,GAAG,UAAU,CAAC;oBACtB,GAAG;oBACH,kCAAkC;oBAClC,yBAAyB;oBACzB,wBAAwB;iBACzB,CAAC,CAAC;gBAEH,UAAU,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;oBAC5B,OAAO,EAAE,CAAC;gBACZ,CAAC,CAAC,CAAC;gBACH,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;oBAC/B,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,KAAK,CAAC,CAAC;oBACtD,MAAM,CAAC,KAAK,CAAC,CAAC;gBAChB,CAAC,CAAC,CAAC;gBAEH,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;oBAC1B,MAAM,CAAC,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC,CAAC;gBACtD,CAAC,CAAC,CAAC;gBAEH,UAAU,CAAC,OAAO,EAAE,CAAC;YACvB,CAAC,CAAC,CAAC;QACL,CAAC;QACD,QAAQ;YACN,UAAU,EAAE,KAAK,EAAE,CAAC;YACpB,UAAU,GAAG,SAAS,CAAC;QACzB,CAAC;QACD,KAAK,CAAC,OAAO,CAAC,OAAO;YACnB,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;YACvD,CAAC;YAED,UAAU,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;QACzD,CAAC;QACD,KAAK,CAAC,SAAS,CAAC,OAAO;YACrB,IAAI,CAAC,UAAU;gBAAE,MAAM,IAAI,uBAAuB,EAAE,CAAC;YAErD,GAAG,CAAC,4BAA4B,EAAE,KAAK,CAAC,CAAC;YAEzC,UAAU,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,aAAa,EAAE,OAAO,EAAE,EAAE;gBAClD,GAAG,CAAC,iCAAiC,EAAE,KAAK,CAAC,CAAC;gBAE9C,IAAI,aAAa,KAAK,KAAK;oBAAE,OAAO;gBAEpC,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;gBAElD,OAAO,CAAC,OAAO,CAAC,CAAC;YACnB,CAAC,CAAC,CAAC;YAEH,MAAM,UAAU,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC;QACrC,CAAC;KACF,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC","sourcesContent":["import { SignalNoConnectionError } from \"@openlv/core/errors\";\nimport { createMqtt, type MqttClient } from \"websocket-mqtt\";\n\nimport type { CreateSignalLayerFn, SignalBaseProperties } from \"../base.js\";\nimport { createSignalingLayer } from \"../index.js\";\nimport { log } from \"../utils/log.js\";\n\n/**\n * MQTT Signaling Layer\n *\n * https://openlv.sh/api/signaling/mqtt\n */\nexport const mqtt: CreateSignalLayerFn = ({\n url = \"wss://test.mosquitto.org:8081/mqtt\",\n topic,\n}: SignalBaseProperties) => {\n let connection: MqttClient | undefined;\n\n return createSignalingLayer({\n type: \"mqtt\",\n setup() {\n return new Promise((resolve, reject) => {\n connection = createMqtt({\n url,\n // reconnectOnConnackError: false,\n // reconnectPeriod: 5000,\n // connectTimeout: 5000,\n });\n\n connection.on(\"connect\", () => {\n resolve();\n });\n connection.on(\"error\", (error) => {\n console.error(\"MQTT: Error connecting to URL\", error);\n reject(error);\n });\n\n connection.on(\"close\", () => {\n reject(new Error(\"MQTT: Closed connection to URL\"));\n });\n\n connection.connect();\n });\n },\n teardown() {\n connection?.close();\n connection = undefined;\n },\n async publish(payload) {\n if (!connection) {\n throw new Error(\"MQTT: No connection to publish to\");\n }\n\n connection?.publish(topic, payload, { retain: false });\n },\n async subscribe(handler) {\n if (!connection) throw new SignalNoConnectionError();\n\n log(\"MQTT: Subscribing to topic\", topic);\n\n connection.on(\"message\", (receivedTopic, message) => {\n log(\"MQTT: Received message on topic\", topic);\n\n if (receivedTopic !== topic) return;\n\n const decoded = new TextDecoder().decode(message);\n\n handler(decoded);\n });\n\n await connection?.subscribe(topic);\n },\n });\n};\n\nObject.defineProperty(mqtt, \"__name\", { value: \"mqtt\" });\n"]}
|
package/dist/ntfy/index.js
CHANGED
|
@@ -20,7 +20,7 @@ import { parseNtfyUrl } from "./url.js";
|
|
|
20
20
|
* https://openlv.sh/api/signaling/ntfy
|
|
21
21
|
*/
|
|
22
22
|
export const ntfy = ({ topic, url }) => {
|
|
23
|
-
let connection
|
|
23
|
+
let connection;
|
|
24
24
|
const connectionInfo = parseNtfyUrl(url);
|
|
25
25
|
const wsProtocol = match(connectionInfo.protocol)
|
|
26
26
|
.with("https", () => "wss")
|
|
@@ -31,21 +31,21 @@ export const ntfy = ({ topic, url }) => {
|
|
|
31
31
|
type: "ntfy",
|
|
32
32
|
async setup() {
|
|
33
33
|
log("NTFY: Setting up");
|
|
34
|
-
const wsUrl = wsProtocol
|
|
35
|
-
"://"
|
|
36
|
-
connectionInfo.host
|
|
37
|
-
"/"
|
|
38
|
-
topic
|
|
39
|
-
"/ws"
|
|
40
|
-
(connectionInfo.parameters || "");
|
|
34
|
+
const wsUrl = wsProtocol
|
|
35
|
+
+ "://"
|
|
36
|
+
+ connectionInfo.host
|
|
37
|
+
+ "/"
|
|
38
|
+
+ topic
|
|
39
|
+
+ "/ws"
|
|
40
|
+
+ (connectionInfo.parameters || "");
|
|
41
41
|
log("NTFY: Connecting to WebSocket", wsUrl);
|
|
42
42
|
connection = new WebSocket(wsUrl);
|
|
43
43
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
44
|
-
connection
|
|
44
|
+
connection?.addEventListener("error", (_event) => { });
|
|
45
45
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
46
|
-
connection.
|
|
46
|
+
connection.addEventListener("close", (_event) => { });
|
|
47
47
|
const awaitOpenConfirm = new Promise((resolve) => {
|
|
48
|
-
connection.
|
|
48
|
+
connection.addEventListener("message", (event) => {
|
|
49
49
|
log("NTFY: Received message:", event.data);
|
|
50
50
|
const data = JSON.parse(event.data);
|
|
51
51
|
if (data.event === "open") {
|
|
@@ -54,13 +54,13 @@ export const ntfy = ({ topic, url }) => {
|
|
|
54
54
|
else if (data.event === "message") {
|
|
55
55
|
events.emit("message", data.message);
|
|
56
56
|
}
|
|
57
|
-
};
|
|
57
|
+
});
|
|
58
58
|
});
|
|
59
59
|
const awaitOpen = new Promise((resolve) => {
|
|
60
|
-
connection.
|
|
60
|
+
connection.addEventListener("open", () => {
|
|
61
61
|
log("NTFY: Connected to WebSocket");
|
|
62
62
|
resolve();
|
|
63
|
-
};
|
|
63
|
+
});
|
|
64
64
|
});
|
|
65
65
|
await awaitOpen;
|
|
66
66
|
await awaitOpenConfirm;
|
|
@@ -71,7 +71,7 @@ export const ntfy = ({ topic, url }) => {
|
|
|
71
71
|
async publish(body) {
|
|
72
72
|
const headers = { "Content-Type": "application/json" };
|
|
73
73
|
// TODO: Add response handling
|
|
74
|
-
// @ts-expect-error
|
|
74
|
+
// @ts-expect-error - TODO: Add response handling
|
|
75
75
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
76
76
|
const _response = await fetch(`${connectionInfo.protocol}://${connectionInfo.host}/${topic}`, { method: "POST", body, headers });
|
|
77
77
|
},
|
package/dist/ntfy/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ntfy/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAGnC,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAYxC;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,IAAI,GAAwB,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,EAAE;IAC1D,IAAI,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ntfy/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAGnC,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAYxC;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,IAAI,GAAwB,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,EAAE;IAC1D,IAAI,UAAiC,CAAC;IACtC,MAAM,cAAc,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IACzC,MAAM,UAAU,GAAG,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC;SAC9C,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC;SAC1B,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC;SACxB,UAAU,EAAE,CAAC;IAChB,MAAM,MAAM,GAAG,IAAI,YAAY,EAAwB,CAAC;IAExD,OAAO,oBAAoB,CAAC;QAC1B,IAAI,EAAE,MAAM;QACZ,KAAK,CAAC,KAAK;YACT,GAAG,CAAC,kBAAkB,CAAC,CAAC;YAExB,MAAM,KAAK,GACP,UAAU;kBACR,KAAK;kBACL,cAAc,CAAC,IAAI;kBACnB,GAAG;kBACH,KAAK;kBACL,KAAK;kBACL,CAAC,cAAc,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC;YAExC,GAAG,CAAC,+BAA+B,EAAE,KAAK,CAAC,CAAC;YAC5C,UAAU,GAAG,IAAI,SAAS,CAAC,KAAK,CAAC,CAAC;YAElC,6DAA6D;YAC7D,UAAU,EAAE,gBAAgB,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,EAAE,GAAE,CAAC,CAAC,CAAC;YAEtD,6DAA6D;YAC7D,UAAU,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,EAAE,GAAE,CAAC,CAAC,CAAC;YAErD,MAAM,gBAAgB,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;gBACrD,UAAW,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE;oBAChD,GAAG,CAAC,yBAAyB,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;oBAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAgB,CAAC;oBAEnD,IAAI,IAAI,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC;wBAC1B,OAAO,EAAE,CAAC;oBACZ,CAAC;yBACI,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;wBAClC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;oBACvC,CAAC;gBACH,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YAEH,MAAM,SAAS,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;gBAC9C,UAAW,CAAC,gBAAgB,CAAC,MAAM,EAAE,GAAG,EAAE;oBACxC,GAAG,CAAC,8BAA8B,CAAC,CAAC;oBACpC,OAAO,EAAE,CAAC;gBACZ,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YAEH,MAAM,SAAS,CAAC;YAChB,MAAM,gBAAgB,CAAC;QACzB,CAAC;QACD,QAAQ;YACN,UAAU,EAAE,KAAK,EAAE,CAAC;QACtB,CAAC;QACD,KAAK,CAAC,OAAO,CAAC,IAAI;YAChB,MAAM,OAAO,GAAG,EAAE,cAAc,EAAE,kBAAkB,EAAiB,CAAC;YAEtE,8BAA8B;YAC9B,iDAAiD;YACjD,6DAA6D;YAC7D,MAAM,SAAS,GAAG,MAAM,KAAK,CAC3B,GAAG,cAAc,CAAC,QAAQ,MAAM,cAAc,CAAC,IAAI,IAAI,KAAK,EAAE,EAC9D,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAClC,CAAC;QACJ,CAAC;QACD,SAAS,EAAE,CAAC,OAAO,EAAE,EAAE;YACrB,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAChC,CAAC;KACF,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC","sourcesContent":["import { EventEmitter } from \"eventemitter3\";\nimport { match } from \"ts-pattern\";\n\nimport type { CreateSignalLayerFn } from \"../base.js\";\nimport { createSignalingLayer } from \"../index.js\";\nimport { log } from \"../utils/log.js\";\nimport { parseNtfyUrl } from \"./url.js\";\n\nexport type NtfyMessage = {\n // eslint-disable-next-line no-restricted-syntax\n id: string;\n time: number;\n expires: number;\n event: string;\n topic: string;\n message: string;\n};\n\n/**\n * Ntfy Signaling Layer\n *\n * Uses HTTP Post for publishing\n * Uses WebSocket for subscribing\n *\n * URL format supports the ?auth= parameter\n * example: https://ntfy.sh/mytopic?auth=mytoken\n *\n * The same goes for apprise ntfy urls\n * example: ntfy://{token}@{hostname}/{topic}\n * example: ntfy://{user}:{password}@{hostname}/{topic}\n * https variant: ntfys://{user}:{password}@{hostname}/{topic}\n *\n * https://openlv.sh/api/signaling/ntfy\n */\nexport const ntfy: CreateSignalLayerFn = ({ topic, url }) => {\n let connection: WebSocket | undefined;\n const connectionInfo = parseNtfyUrl(url);\n const wsProtocol = match(connectionInfo.protocol)\n .with(\"https\", () => \"wss\")\n .with(\"http\", () => \"ws\")\n .exhaustive();\n const events = new EventEmitter<{ message: string; }>();\n\n return createSignalingLayer({\n type: \"ntfy\",\n async setup() {\n log(\"NTFY: Setting up\");\n\n const wsUrl\n = wsProtocol\n + \"://\"\n + connectionInfo.host\n + \"/\"\n + topic\n + \"/ws\"\n + (connectionInfo.parameters || \"\");\n\n log(\"NTFY: Connecting to WebSocket\", wsUrl);\n connection = new WebSocket(wsUrl);\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n connection?.addEventListener(\"error\", (_event) => {});\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n connection.addEventListener(\"close\", (_event) => {});\n\n const awaitOpenConfirm = new Promise<void>((resolve) => {\n connection!.addEventListener(\"message\", (event) => {\n log(\"NTFY: Received message:\", event.data);\n const data = JSON.parse(event.data) as NtfyMessage;\n\n if (data.event === \"open\") {\n resolve();\n }\n else if (data.event === \"message\") {\n events.emit(\"message\", data.message);\n }\n });\n });\n\n const awaitOpen = new Promise<void>((resolve) => {\n connection!.addEventListener(\"open\", () => {\n log(\"NTFY: Connected to WebSocket\");\n resolve();\n });\n });\n\n await awaitOpen;\n await awaitOpenConfirm;\n },\n teardown() {\n connection?.close();\n },\n async publish(body) {\n const headers = { \"Content-Type\": \"application/json\" } as HeadersInit;\n\n // TODO: Add response handling\n // @ts-expect-error - TODO: Add response handling\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const _response = await fetch(\n `${connectionInfo.protocol}://${connectionInfo.host}/${topic}`,\n { method: \"POST\", body, headers },\n );\n },\n subscribe: (handler) => {\n events.on(\"message\", handler);\n },\n });\n};\n\nObject.defineProperty(ntfy, \"__name\", { value: \"ntfy\" });\n"]}
|
package/dist/ntfy/url.js
CHANGED
|
@@ -28,14 +28,14 @@ export const parseNtfyUrl = (url) => {
|
|
|
28
28
|
}
|
|
29
29
|
const credentials = user
|
|
30
30
|
? { user, password }
|
|
31
|
-
: password
|
|
31
|
+
: (password
|
|
32
32
|
? { token: password }
|
|
33
|
-
: undefined;
|
|
33
|
+
: undefined);
|
|
34
34
|
return {
|
|
35
35
|
host,
|
|
36
36
|
protocol,
|
|
37
37
|
credentials,
|
|
38
|
-
parameters: parameters
|
|
38
|
+
parameters: parameters || undefined,
|
|
39
39
|
};
|
|
40
40
|
};
|
|
41
41
|
//# sourceMappingURL=url.js.map
|
package/dist/ntfy/url.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"url.js","sourceRoot":"","sources":["../../src/ntfy/url.ts"],"names":[],"mappings":"AAYA,MAAM,CAAC,MAAM,cAAc,
|
|
1
|
+
{"version":3,"file":"url.js","sourceRoot":"","sources":["../../src/ntfy/url.ts"],"names":[],"mappings":"AAYA,MAAM,CAAC,MAAM,cAAc,GACvB,oHAAoH,CAAC;AAEzH;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,GAAW,EAAW,EAAE;IACnD,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IAExC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,qBAAqB,GAAG,EAAE,CAAC,CAAC;IAC9C,CAAC;IAED,MAAM,EACJ,QAAQ,EAAE,YAAY,EACtB,IAAI,EACJ,QAAQ,EACR,IAAI,EACJ,UAAU,GACX,GAAG,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC;IAEvB,qBAAqB;IACrB,IAAI,QAA0B,CAAC;IAE/B,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;QAC5C,QAAQ,GAAG,MAAM,CAAC;IACpB,CAAC;SACI,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;QACnD,QAAQ,GAAG,OAAO,CAAC;IACrB,CAAC;SACI,CAAC;QACJ,MAAM,IAAI,KAAK,CAAC,qBAAqB,GAAG,EAAE,CAAC,CAAC;IAC9C,CAAC;IAED,MAAM,WAAW,GAAG,IAAI;QACtB,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE;QACpB,CAAC,CAAC,CAAC,QAAQ;YACP,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE;YACrB,CAAC,CAAC,SAAS,CAAC,CAAC;IAEnB,OAAO;QACL,IAAI;QACJ,QAAQ;QACR,WAAW;QACX,UAAU,EAAE,UAAU,IAAI,SAAS;KACpC,CAAC;AACJ,CAAC,CAAC","sourcesContent":["export type NtfyUrl = {\n host: string;\n protocol: \"http\" | \"https\";\n credentials?:\n | {\n user: string;\n password: string;\n }\n | { token: string; };\n parameters?: string;\n};\n\nexport const NTFY_URL_REGEX\n = /^(?<protocol>https?|ntfys?):\\/\\/(?:(?:(?<user>[^:@]+):)?(?<password>[^@]+)?@)?(?<host>[^/?]+)\\/?(?<parameters>.*)$/;\n\n/*\n * URL format supports the ?auth= parameter\n * example: https://ntfy.sh/?auth=mytoken\n * example: http://authtoken123@myserver.example.com/\n *\n * The same goes for apprise ntfy urls\n * example: ntfy://{token}@{host}/\n * example: ntfy://{user}:{password}@{host}/\n * https variant: ntfys://{user}:{password}@{host}/\n */\nexport const parseNtfyUrl = (url: string): NtfyUrl => {\n const match = url.match(NTFY_URL_REGEX);\n\n if (!match) {\n throw new Error(`Invalid NTFY URL: ${url}`);\n }\n\n const {\n protocol: protocolType,\n user,\n password,\n host,\n parameters,\n } = match.groups || {};\n\n // Determine protocol\n let protocol: \"http\" | \"https\";\n\n if ([\"http\", \"ntfy\"].includes(protocolType)) {\n protocol = \"http\";\n }\n else if ([\"https\", \"ntfys\"].includes(protocolType)) {\n protocol = \"https\";\n }\n else {\n throw new Error(`Invalid NTFY URL: ${url}`);\n }\n\n const credentials = user\n ? { user, password }\n : (password\n ? { token: password }\n : undefined);\n\n return {\n host,\n protocol,\n credentials,\n parameters: parameters || undefined,\n };\n};\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"url.test.js","sourceRoot":"","sources":["../../src/ntfy/url.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAExC,MAAM,SAAS,GAAG;IAChB;QACE,GAAG,EAAE,gCAAgC;QACrC,QAAQ,EAAE;YACR,IAAI,EAAE,SAAS;YACf,QAAQ,EAAE,OAAO;YACjB,UAAU,EAAE,gBAAgB;SAC7B;KACF;IACD;QACE,GAAG,EAAE,+BAA+B;QACpC,QAAQ,EAAE;YACR,IAAI,EAAE,SAAS;YACf,QAAQ,EAAE,MAAM;YAChB,UAAU,EAAE,gBAAgB;SAC7B;KACF;IACD;QACE,GAAG,EAAE,4BAA4B;QACjC,QAAQ,EAAE;YACR,IAAI,EAAE,aAAa;YACnB,QAAQ,EAAE,MAAM;YAChB,WAAW,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE;SAClC;KACF;IACD;QACE,GAAG,EAAE,oCAAoC;QACzC,QAAQ,EAAE;YACR,IAAI,EAAE,SAAS;YACf,QAAQ,EAAE,OAAO;YACjB,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE;SACxD;KACF;IACD;QACE,GAAG,EAAE,sCAAsC;QAC3C,QAAQ,EAAE;YACR,IAAI,EAAE,SAAS;YACf,QAAQ,EAAE,MAAM;YAChB,WAAW,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE;YACjC,UAAU,EAAE,eAAe;SAC5B;KACF;CACF,CAAC;AAEF,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;QAC7B,EAAE,CAAC,yBAAyB,QAAQ,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE;YAC/C,MAAM,MAAM,GAAG,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAE1C,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"url.test.js","sourceRoot":"","sources":["../../src/ntfy/url.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAExC,MAAM,SAAS,GAAG;IAChB;QACE,GAAG,EAAE,gCAAgC;QACrC,QAAQ,EAAE;YACR,IAAI,EAAE,SAAS;YACf,QAAQ,EAAE,OAAO;YACjB,UAAU,EAAE,gBAAgB;SAC7B;KACF;IACD;QACE,GAAG,EAAE,+BAA+B;QACpC,QAAQ,EAAE;YACR,IAAI,EAAE,SAAS;YACf,QAAQ,EAAE,MAAM;YAChB,UAAU,EAAE,gBAAgB;SAC7B;KACF;IACD;QACE,GAAG,EAAE,4BAA4B;QACjC,QAAQ,EAAE;YACR,IAAI,EAAE,aAAa;YACnB,QAAQ,EAAE,MAAM;YAChB,WAAW,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE;SAClC;KACF;IACD;QACE,GAAG,EAAE,oCAAoC;QACzC,QAAQ,EAAE;YACR,IAAI,EAAE,SAAS;YACf,QAAQ,EAAE,OAAO;YACjB,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE;SACxD;KACF;IACD;QACE,GAAG,EAAE,sCAAsC;QAC3C,QAAQ,EAAE;YACR,IAAI,EAAE,SAAS;YACf,QAAQ,EAAE,MAAM;YAChB,WAAW,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE;YACjC,UAAU,EAAE,eAAe;SAC5B;KACF;CACF,CAAC;AAEF,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;QAC7B,EAAE,CAAC,yBAAyB,QAAQ,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE;YAC/C,MAAM,MAAM,GAAG,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAE1C,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { describe, expect, it } from \"vitest\";\n\nimport { parseNtfyUrl } from \"./url.js\";\n\nconst testCases = [\n {\n url: \"https://ntfy.sh/?auth=mytoken1\",\n expected: {\n host: \"ntfy.sh\",\n protocol: \"https\",\n parameters: \"?auth=mytoken1\",\n },\n },\n {\n url: \"http://ntfy.sh/?auth=mytoken2\",\n expected: {\n host: \"ntfy.sh\",\n protocol: \"http\",\n parameters: \"?auth=mytoken2\",\n },\n },\n {\n url: \"ntfy://mytoken@example.com\",\n expected: {\n host: \"example.com\",\n protocol: \"http\",\n credentials: { token: \"mytoken\" },\n },\n },\n {\n url: \"ntfys://myuser:mypassword@ntfy.sh/\",\n expected: {\n host: \"ntfy.sh\",\n protocol: \"https\",\n credentials: { user: \"myuser\", password: \"mypassword\" },\n },\n },\n {\n url: \"ntfy://mytoken@ntfy.sh/?auth=mytoken\",\n expected: {\n host: \"ntfy.sh\",\n protocol: \"http\",\n credentials: { token: \"mytoken\" },\n parameters: \"?auth=mytoken\",\n },\n },\n];\n\ndescribe(\"should parse NTFY URL\", () => {\n testCases.forEach((testCase) => {\n it(`should parse NTFY URL ${testCase.url}`, () => {\n const result = parseNtfyUrl(testCase.url);\n\n expect(result).toEqual(testCase.expected);\n });\n });\n});\n"]}
|
package/dist/utils/log.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"log.js","sourceRoot":"","sources":["../../src/utils/log.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,GAAG,CAAiC,EAAE,EAAE,CAC1D,OAAO,CAAC,GAAG,CACT,iBAAiB,EACjB,qCAAqC,EACrC,qCAAqC,EACrC,GAAG,CAAC,CACL,CAAC"}
|
|
1
|
+
{"version":3,"file":"log.js","sourceRoot":"","sources":["../../src/utils/log.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,GAAG,CAAiC,EAAE,EAAE,CAC1D,OAAO,CAAC,GAAG,CACT,iBAAiB,EACjB,qCAAqC,EACrC,qCAAqC,EACrC,GAAG,CAAC,CACL,CAAC","sourcesContent":["export const log = (...x: Parameters<typeof console.log>) =>\n console.log(\n \"%c[signaling]%c\",\n \"color: lightblue; font-weight: bold\",\n \"color: inherit; font-weight: normal\",\n ...x,\n );\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@openlv/signaling",
|
|
3
|
-
"version": "0.0.1-beta.
|
|
3
|
+
"version": "0.0.1-beta.8",
|
|
4
4
|
"keywords": [
|
|
5
5
|
"open-lavatory"
|
|
6
6
|
],
|
|
@@ -57,9 +57,9 @@
|
|
|
57
57
|
"eventemitter3": "^5",
|
|
58
58
|
"globals": "^16",
|
|
59
59
|
"gun": "^0.2020.1241",
|
|
60
|
-
"websocket-mqtt": "0.0.
|
|
60
|
+
"websocket-mqtt": "0.0.7",
|
|
61
61
|
"ts-pattern": "^5",
|
|
62
|
-
"@openlv/core": "0.0.1-beta.
|
|
62
|
+
"@openlv/core": "0.0.1-beta.9"
|
|
63
63
|
},
|
|
64
64
|
"devDependencies": {
|
|
65
65
|
"typescript": "^5",
|