@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 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
- return async ({ canEncrypt, encrypt, decrypt, rpDiscovered, k, publicKey, isHost, }) => {
15
- const emitter = new EventEmitter();
16
- let state = SIGNAL_STATE.STANDBY;
17
- const setState = (_state) => {
18
- state = _state;
19
- emitter.emit("state_change", _state);
20
- };
21
- const handshakeKey = k ? k : undefined;
22
- const send = async (method, recipient, payload) => {
23
- const prefix = match(method)
24
- .with("handshake", () => XR_H_PREFIX)
25
- .with("encrypted", () => XR_PREFIX)
26
- .exhaustive();
27
- const message = await match(method)
28
- .with("handshake", () => {
29
- if (!handshakeKey)
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
- return handshakeKey.encrypt(JSON.stringify(payload));
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("encrypted", () => {
34
- if (!canEncrypt())
67
+ .with({ type: "pubkey" }, async ({ payload }) => {
68
+ if (isHost)
35
69
  return;
36
- return encrypt(JSON.stringify(payload));
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
- .exhaustive();
39
- await init.publish(prefix + recipient + message);
40
- };
41
- const handleReceive = async (payload) => {
42
- const prefix = payload.slice(0, XR_H_PREFIX.length);
43
- const recipient = payload.slice(XR_H_PREFIX.length, XR_H_PREFIX.length + 1);
44
- const body = payload.slice(XR_PREFIX.length + 1);
45
- const isRecipient = (isHost ? "h" : "c") === recipient;
46
- log("isRecipient", isRecipient);
47
- if (!isRecipient)
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
- const message = await handshakeKey.decrypt(body);
54
- const msg = JSON.parse(message);
55
- await match(msg)
56
- .with({ type: "flash" }, async () => {
57
- if (!isHost)
58
- return;
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({ prefix: XR_PREFIX }, async () => {
86
- const message = await decrypt(body);
87
- const msg = JSON.parse(message);
88
- await match(msg)
89
- .with({ type: "pubkey" }, async ({ payload }) => {
90
- if (!isHost)
91
- return;
92
- await rpDiscovered(payload.publicKey);
93
- setState(SIGNAL_STATE.HANDSHAKE_PARTIAL);
94
- return await send("encrypted", "c", {
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", payload);
113
+ log("Received invalid message X", msg);
119
114
  });
120
- };
121
- return make(emitter, {
122
- type: init.type,
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":"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"}
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
- return match(protocol)
9
- .with("mqtt", async () => (await import("./mqtt/index.js"))["mqtt"])
10
- .with("ntfy", async () => (await import("./ntfy/index.js"))["ntfy"])
11
- .with("gun", async () => (await import("./gundb/index.js"))["gundb"])
12
- .otherwise(() => {
13
- throw new Error(`Unknown signaling protocol: ${protocol}`);
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
@@ -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;IAC9D,OAAO,KAAK,CAAC,QAAQ,CAAC;SACnB,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;SACnE,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;SACnE,IAAI,CAAC,KAAK,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;SACpE,SAAS,CAAC,GAAG,EAAE;QACd,MAAM,IAAI,KAAK,CAAC,+BAA+B,QAAQ,EAAE,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;AACP,CAAC,CAAC"}
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"]}
@@ -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"]}
@@ -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 layers = [
9
- // [
10
- // mqtt,
11
- // { topic: "mytesttopic1111", url: "wss://test.mosquitto.org:8081/mqtt" },
12
- // ],
8
+ const providersByType = [
13
9
  [
14
- mqtt,
15
- { topic: "mytesttopic1111", url: "wss://mqtt-dashboard.com:8884/mqtt" },
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
- describe("Signaling layers", () => {
22
- layers.forEach(([layer, props]) => {
23
- const layername = layer.__name;
24
- it(`should create a signaling layer for ${layername} - ${props.url}`, async () => {
25
- const { encryptionKey: publicKey, decryptionKey } = await generateKeyPair();
26
- const h = hKey;
27
- const signalingLayer = await layer(props);
28
- const signalA = await signalingLayer({
29
- h,
30
- rpDiscovered: (v) => log("rpKey", v),
31
- canEncrypt: () => true,
32
- encrypt: publicKey.encrypt,
33
- decrypt: decryptionKey.decrypt,
34
- publicKey,
35
- isHost: true,
36
- });
37
- const signalB = await signalingLayer({
38
- h,
39
- rpDiscovered: (v) => log("rpKey", v),
40
- canEncrypt: () => true,
41
- encrypt: publicKey.encrypt,
42
- decrypt: decryptionKey.decrypt,
43
- publicKey,
44
- isHost: false,
45
- });
46
- expect(signalA).toBeDefined();
47
- expect(signalB).toBeDefined();
48
- await Promise.all([signalA.setup(), signalB.setup()]);
49
- const messageReceivedA = new Promise((resolve) => {
50
- signalA.on("message", (message) => {
51
- log("messageReceivedA", message);
52
- expect(message).toEqual({ data: "test2" });
53
- resolve();
54
- });
55
- });
56
- const messageReceivedB = new Promise((resolve) => {
57
- signalB.on("message", (message) => {
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
@@ -1 +1 @@
1
- {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":"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"}
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"]}
@@ -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"]}
@@ -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 = null;
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.onerror = (_event) => { };
44
+ connection?.addEventListener("error", (_event) => { });
45
45
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
46
- connection.onclose = (_event) => { };
46
+ connection.addEventListener("close", (_event) => { });
47
47
  const awaitOpenConfirm = new Promise((resolve) => {
48
- connection.onmessage = (event) => {
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.onopen = () => {
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
  },
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ntfy/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ntfy/index.ts"],"names":[],"mappings":"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","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 ? parameters : undefined,
38
+ parameters: parameters || undefined,
39
39
  };
40
40
  };
41
41
  //# sourceMappingURL=url.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"url.js","sourceRoot":"","sources":["../../src/ntfy/url.ts"],"names":[],"mappings":"AAYA,MAAM,CAAC,MAAM,cAAc,GACzB,oHAAoH,CAAC;AAEvH;;;;;;;;;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;SAAM,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;QACrD,QAAQ,GAAG,OAAO,CAAC;IACrB,CAAC;SAAM,CAAC;QACN,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,QAAQ;YACR,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE;YACrB,CAAC,CAAC,SAAS,CAAC;IAEhB,OAAO;QACL,IAAI;QACJ,QAAQ;QACR,WAAW;QACX,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS;KAChD,CAAC;AACJ,CAAC,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"]}
@@ -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.7",
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.6",
60
+ "websocket-mqtt": "0.0.7",
61
61
  "ts-pattern": "^5",
62
- "@openlv/core": "0.0.1-beta.8"
62
+ "@openlv/core": "0.0.1-beta.9"
63
63
  },
64
64
  "devDependencies": {
65
65
  "typescript": "^5",