@openlv/transport 0.0.1-beta.9 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +73 -5
- package/dist/index.js +77 -8
- package/dist/index.js.map +1 -1
- package/dist/index.test.js +1 -1
- package/dist/index.test.js.map +1 -1
- package/dist/webrtc/index.d.ts +1 -1
- package/dist/webrtc/index.js +1 -1
- package/dist/webrtc/index.js.map +1 -1
- package/package.json +2 -2
- package/dist/base.d.ts +0 -51
- package/dist/base.js +0 -75
- package/dist/base.js.map +0 -1
- package/dist/layer.d.ts +0 -24
- package/dist/layer.js +0 -8
- package/dist/layer.js.map +0 -1
package/dist/index.d.ts
CHANGED
|
@@ -1,11 +1,79 @@
|
|
|
1
|
-
/** biome-ignore-all lint/performance/noBarrelFile: package entrypoint */
|
|
2
|
-
/** biome-ignore-all lint/performance/noReExportAll: package entrypoint */
|
|
3
1
|
/**
|
|
4
2
|
* Open Lavatory Protocol - Decentralized Wallet Connection Library
|
|
5
3
|
*
|
|
6
4
|
* A privacy-first, peer-to-peer protocol for connecting dApps with wallets
|
|
7
5
|
* without relying on centralized infrastructure.
|
|
8
6
|
*/
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
7
|
+
import type { DecryptionKey, EncryptionKey } from "@openlv/core/encryption";
|
|
8
|
+
import { EventEmitter } from "eventemitter3";
|
|
9
|
+
import type { MaybePromise } from "viem";
|
|
10
|
+
import type { WebRTCConfig } from "./webrtc/index.js";
|
|
11
|
+
export declare const TRANSPORT_STATE: {
|
|
12
|
+
readonly STANDBY: "standby";
|
|
13
|
+
readonly CONNECTING: "connecting";
|
|
14
|
+
readonly READY: "ready";
|
|
15
|
+
readonly CONNECTED: "connected";
|
|
16
|
+
readonly ERROR: "error";
|
|
17
|
+
};
|
|
18
|
+
export type TransportState = (typeof TRANSPORT_STATE)[keyof typeof TRANSPORT_STATE];
|
|
19
|
+
export type TLayerEventMap = {
|
|
20
|
+
state_change: (state: TransportState) => void;
|
|
21
|
+
};
|
|
22
|
+
export type TransportLayerParameters = {
|
|
23
|
+
isHost: boolean;
|
|
24
|
+
encrypt: EncryptionKey["encrypt"];
|
|
25
|
+
decrypt: DecryptionKey["decrypt"];
|
|
26
|
+
subsend: (message: TransportMessage) => Promise<void>;
|
|
27
|
+
onmessage: (message: {
|
|
28
|
+
type: string;
|
|
29
|
+
payload: object;
|
|
30
|
+
messageId: string;
|
|
31
|
+
}) => void;
|
|
32
|
+
};
|
|
33
|
+
export type TransportMessage = {
|
|
34
|
+
type: "offer";
|
|
35
|
+
payload: string;
|
|
36
|
+
} | {
|
|
37
|
+
type: "answer";
|
|
38
|
+
payload: string;
|
|
39
|
+
} | {
|
|
40
|
+
type: "candidate";
|
|
41
|
+
payload: string;
|
|
42
|
+
};
|
|
43
|
+
export type TransportLayer = {
|
|
44
|
+
type: string;
|
|
45
|
+
setup: () => MaybePromise<void>;
|
|
46
|
+
teardown: () => MaybePromise<void>;
|
|
47
|
+
send: (message: object) => Promise<void>;
|
|
48
|
+
handle: (message: TransportMessage) => Promise<void>;
|
|
49
|
+
waitFor: (state: TransportState) => Promise<void>;
|
|
50
|
+
emitter: EventEmitter<TLayerEventMap>;
|
|
51
|
+
};
|
|
52
|
+
export type TLayer = (parameters: TransportLayerParameters) => TransportLayer;
|
|
53
|
+
export type CreateTransportLayerFn = (config?: WebRTCConfig) => TLayer;
|
|
54
|
+
export type TransportLayerBase = {
|
|
55
|
+
type: string;
|
|
56
|
+
setup: () => MaybePromise<void>;
|
|
57
|
+
teardown: () => MaybePromise<void>;
|
|
58
|
+
handle: (message: TransportMessage) => Promise<void>;
|
|
59
|
+
send: (message: string) => Promise<void>;
|
|
60
|
+
};
|
|
61
|
+
export type TransportLayerBaseEventMap = {
|
|
62
|
+
offer: (offer: string) => void;
|
|
63
|
+
answer: (answer: string) => void;
|
|
64
|
+
candidate: (candidate: string) => void;
|
|
65
|
+
connected: () => void;
|
|
66
|
+
message: (message: string) => void;
|
|
67
|
+
};
|
|
68
|
+
export type TransportLayerBaseEmitter = EventEmitter<TransportLayerBaseEventMap>;
|
|
69
|
+
export type TransportLayerBaseParameters = {
|
|
70
|
+
emitter: TransportLayerBaseEmitter;
|
|
71
|
+
isHost: boolean;
|
|
72
|
+
};
|
|
73
|
+
export type TransportLayerBaseInit = (parameters: TransportLayerBaseParameters) => TransportLayerBase;
|
|
74
|
+
/**
|
|
75
|
+
* Base Transport Layer implementation
|
|
76
|
+
*
|
|
77
|
+
* https://openlv.sh/api/transport
|
|
78
|
+
*/
|
|
79
|
+
export declare const createTransportBase: (init: TransportLayerBaseInit) => TLayer;
|
package/dist/index.js
CHANGED
|
@@ -1,12 +1,81 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
import { EventEmitter } from "eventemitter3";
|
|
2
|
+
import { log } from "./utils/log.js";
|
|
3
|
+
export const TRANSPORT_STATE = {
|
|
4
|
+
STANDBY: "standby",
|
|
5
|
+
CONNECTING: "connecting",
|
|
6
|
+
READY: "ready",
|
|
7
|
+
CONNECTED: "connected",
|
|
8
|
+
ERROR: "error",
|
|
9
|
+
};
|
|
3
10
|
/**
|
|
4
|
-
*
|
|
11
|
+
* Base Transport Layer implementation
|
|
5
12
|
*
|
|
6
|
-
*
|
|
7
|
-
* without relying on centralized infrastructure.
|
|
13
|
+
* https://openlv.sh/api/transport
|
|
8
14
|
*/
|
|
9
|
-
export
|
|
10
|
-
|
|
11
|
-
|
|
15
|
+
export const createTransportBase = (init) => ({ encrypt, decrypt, subsend, isHost, onmessage }) => {
|
|
16
|
+
const emitter = new EventEmitter();
|
|
17
|
+
const internalEmitter = new EventEmitter();
|
|
18
|
+
let state = TRANSPORT_STATE.STANDBY;
|
|
19
|
+
const setState = (newState) => {
|
|
20
|
+
state = newState;
|
|
21
|
+
emitter.emit("state_change", newState);
|
|
22
|
+
};
|
|
23
|
+
internalEmitter.on("offer", (offer) => {
|
|
24
|
+
log("onOffer", offer);
|
|
25
|
+
subsend({ type: "offer", payload: offer });
|
|
26
|
+
});
|
|
27
|
+
internalEmitter.on("answer", (answer) => {
|
|
28
|
+
log("onAnswer", answer);
|
|
29
|
+
subsend({ type: "answer", payload: answer });
|
|
30
|
+
});
|
|
31
|
+
internalEmitter.on("candidate", (candidate) => {
|
|
32
|
+
log("onCandidate", candidate);
|
|
33
|
+
subsend({ type: "candidate", payload: candidate });
|
|
34
|
+
});
|
|
35
|
+
internalEmitter.on("connected", () => {
|
|
36
|
+
log("onConnected");
|
|
37
|
+
setState(TRANSPORT_STATE.CONNECTED);
|
|
38
|
+
});
|
|
39
|
+
internalEmitter.on("message", async (message) => {
|
|
40
|
+
log("onMessage", message);
|
|
41
|
+
const data = await decrypt(message);
|
|
42
|
+
onmessage(JSON.parse(data));
|
|
43
|
+
});
|
|
44
|
+
const { setup, teardown, type, send: sendLayer, handle, } = init({
|
|
45
|
+
emitter: internalEmitter,
|
|
46
|
+
isHost,
|
|
47
|
+
});
|
|
48
|
+
const send = async (message) => {
|
|
49
|
+
if (state !== TRANSPORT_STATE.CONNECTED)
|
|
50
|
+
throw new Error("Transport not connected");
|
|
51
|
+
const payload = await encrypt(JSON.stringify(message));
|
|
52
|
+
await sendLayer(payload);
|
|
53
|
+
};
|
|
54
|
+
const waitFor = async (targetState) => {
|
|
55
|
+
if (state === targetState)
|
|
56
|
+
return;
|
|
57
|
+
return new Promise((resolve) => {
|
|
58
|
+
const handler = (newState) => {
|
|
59
|
+
if (newState === targetState) {
|
|
60
|
+
emitter.off("state_change", handler);
|
|
61
|
+
resolve();
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
emitter.on("state_change", handler);
|
|
65
|
+
});
|
|
66
|
+
};
|
|
67
|
+
return {
|
|
68
|
+
type,
|
|
69
|
+
async setup() {
|
|
70
|
+
setState(TRANSPORT_STATE.CONNECTING);
|
|
71
|
+
await setup();
|
|
72
|
+
setState(TRANSPORT_STATE.READY);
|
|
73
|
+
},
|
|
74
|
+
teardown,
|
|
75
|
+
handle,
|
|
76
|
+
send,
|
|
77
|
+
waitFor,
|
|
78
|
+
emitter,
|
|
79
|
+
};
|
|
80
|
+
};
|
|
12
81
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Open Lavatory Protocol - Decentralized Wallet Connection Library\n *\n * A privacy-first, peer-to-peer protocol for connecting dApps with wallets\n * without relying on centralized infrastructure.\n */\nimport type { DecryptionKey, EncryptionKey } from \"@openlv/core/encryption\";\nimport { EventEmitter } from \"eventemitter3\";\nimport type { MaybePromise } from \"viem\";\n\nimport { log } from \"./utils/log.js\";\nimport type { WebRTCConfig } from \"./webrtc/index.js\";\n\nexport const TRANSPORT_STATE = {\n STANDBY: \"standby\",\n CONNECTING: \"connecting\",\n READY: \"ready\",\n CONNECTED: \"connected\",\n ERROR: \"error\",\n} as const;\nexport type TransportState =\n (typeof TRANSPORT_STATE)[keyof typeof TRANSPORT_STATE];\n\nexport type TLayerEventMap = {\n state_change: (state: TransportState) => void;\n};\n\nexport type TransportLayerParameters = {\n isHost: boolean;\n encrypt: EncryptionKey[\"encrypt\"];\n decrypt: DecryptionKey[\"decrypt\"];\n subsend: (message: TransportMessage) => Promise<void>;\n onmessage: (message: { type: string; payload: object; messageId: string; }) => void;\n};\n\nexport type TransportMessage =\n | {\n type: \"offer\";\n payload: string;\n }\n | {\n type: \"answer\";\n payload: string;\n }\n | {\n type: \"candidate\";\n payload: string;\n };\nexport type TransportLayer = {\n type: string;\n setup: () => MaybePromise<void>;\n teardown: () => MaybePromise<void>;\n send: (message: object) => Promise<void>;\n handle: (message: TransportMessage) => Promise<void>;\n waitFor: (state: TransportState) => Promise<void>;\n emitter: EventEmitter<TLayerEventMap>;\n};\nexport type TLayer = (parameters: TransportLayerParameters) => TransportLayer;\nexport type CreateTransportLayerFn = (config?: WebRTCConfig) => TLayer;\nexport type TransportLayerBase = {\n type: string;\n setup: () => MaybePromise<void>;\n teardown: () => MaybePromise<void>;\n handle: (message: TransportMessage) => Promise<void>;\n send: (message: string) => Promise<void>;\n};\nexport type TransportLayerBaseEventMap = {\n offer: (offer: string) => void;\n answer: (answer: string) => void;\n candidate: (candidate: string) => void;\n connected: () => void;\n message: (message: string) => void;\n};\nexport type TransportLayerBaseEmitter =\n EventEmitter<TransportLayerBaseEventMap>;\nexport type TransportLayerBaseParameters = {\n emitter: TransportLayerBaseEmitter;\n isHost: boolean;\n};\nexport type TransportLayerBaseInit = (\n parameters: TransportLayerBaseParameters,\n) => TransportLayerBase;\n\n/**\n * Base Transport Layer implementation\n *\n * https://openlv.sh/api/transport\n */\nexport const createTransportBase = (init: TransportLayerBaseInit): TLayer => ({ encrypt, decrypt, subsend, isHost, onmessage }) => {\n const emitter = new EventEmitter<TLayerEventMap>();\n const internalEmitter = new EventEmitter<TransportLayerBaseEventMap>();\n let state: TransportState = TRANSPORT_STATE.STANDBY;\n\n const setState = (newState: TransportState) => {\n state = newState;\n emitter.emit(\"state_change\", newState);\n };\n\n internalEmitter.on(\"offer\", (offer) => {\n log(\"onOffer\", offer);\n subsend({ type: \"offer\", payload: offer });\n });\n internalEmitter.on(\"answer\", (answer) => {\n log(\"onAnswer\", answer);\n subsend({ type: \"answer\", payload: answer });\n });\n internalEmitter.on(\"candidate\", (candidate) => {\n log(\"onCandidate\", candidate);\n subsend({ type: \"candidate\", payload: candidate });\n });\n internalEmitter.on(\"connected\", () => {\n log(\"onConnected\");\n setState(TRANSPORT_STATE.CONNECTED);\n });\n internalEmitter.on(\"message\", async (message) => {\n log(\"onMessage\", message);\n const data = await decrypt(message);\n\n onmessage(JSON.parse(data) as { type: string; payload: object; messageId: string; });\n });\n\n const {\n setup,\n teardown,\n type,\n send: sendLayer,\n handle,\n } = init({\n emitter: internalEmitter,\n isHost,\n });\n\n const send = async (message: object) => {\n if (state !== TRANSPORT_STATE.CONNECTED)\n throw new Error(\"Transport not connected\");\n\n const payload = await encrypt(JSON.stringify(message));\n\n await sendLayer(payload);\n };\n\n const waitFor = async (targetState: TransportState) => {\n if (state === targetState) return;\n\n return new Promise<void>((resolve) => {\n const handler = (newState: TransportState) => {\n if (newState === targetState) {\n emitter.off(\"state_change\", handler);\n resolve();\n }\n };\n\n emitter.on(\"state_change\", handler);\n });\n };\n\n return {\n type,\n async setup() {\n setState(TRANSPORT_STATE.CONNECTING);\n await setup();\n setState(TRANSPORT_STATE.READY);\n },\n teardown,\n handle,\n send,\n waitFor,\n emitter,\n };\n};\n"]}
|
package/dist/index.test.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { generateKeyPair } from "@openlv/core/encryption";
|
|
2
2
|
import { EventEmitter } from "eventemitter3";
|
|
3
3
|
import { describe, expect, it } from "vitest";
|
|
4
|
-
import { TRANSPORT_STATE } from "./
|
|
4
|
+
import { TRANSPORT_STATE } from "./index.js";
|
|
5
5
|
import { webrtc } from "./webrtc/index.js";
|
|
6
6
|
describe("Transport", () => {
|
|
7
7
|
it("should be able to create a transport", async () => {
|
package/dist/index.test.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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 { EventEmitter } from \"eventemitter3\";\nimport { describe, expect, it } from \"vitest\";\n\nimport { TRANSPORT_STATE } from \"./
|
|
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,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAE3C,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IACzB,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;QACpD,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,aAAa,EAAE,GAAG,MAAM,eAAe,EAAE,CAAC;QAC5E,MAAM,EAAE,OAAO,EAAE,GAAG,SAAS,CAAC;QAC9B,MAAM,EAAE,OAAO,EAAE,GAAG,aAAa,CAAC;QAClC,MAAM,OAAO,GAAG,IAAI,YAAY,EAAwC,CAAC;QACzE,MAAM,OAAO,GAAG,IAAI,YAAY,EAAwC,CAAC;QAEzE,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC;YAC1B,OAAO;YACP,OAAO;YACP,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;gBACnB,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;YAC5B,CAAC;YACD,MAAM,EAAE,IAAI;YACZ,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE;gBACf,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;YAC7B,CAAC;SACF,CAAC,CAAC;QACH,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC;YAC1B,OAAO;YACP,OAAO;YACP,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;gBACnB,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;YAC5B,CAAC;YACD,MAAM,EAAE,KAAK;YACb,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE;gBACf,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;YAC7B,CAAC;SACF,CAAC,CAAC;QAEH,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE;YACzB,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;YAC3B,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACvB,CAAC,CAAC,CAAC;QACH,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE;YACzB,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;YAC3B,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACvB,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QAC3B,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAE5D,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;QACvC,MAAM,OAAO,CAAC,GAAG,CAAC;YAChB,UAAU,CAAC,OAAO,CAAC,eAAe,CAAC,SAAS,CAAC;YAC7C,UAAU,CAAC,OAAO,CAAC,eAAe,CAAC,SAAS,CAAC;SAC9C,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QAE/B,MAAM,iBAAiB,GAAG,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,EAAE;YACxD,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE;gBAC1B,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;gBAC3B,OAAO,CAAC,CAAC,CAAC,CAAC;YACb,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;QACvC,MAAM,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;QAE5C,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;QACxC,MAAM,UAAU,GAAG,MAAM,iBAAiB,CAAC;QAE3C,MAAM,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;QAEjD,OAAO,CAAC,GAAG,CAAC,oBAAoB,EAAE,UAAU,CAAC,CAAC;QAC9C,MAAM,iBAAiB,GAAG,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,EAAE;YACxD,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE;gBAC1B,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;gBAC3B,OAAO,CAAC,CAAC,CAAC,CAAC;YACb,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,MAAM,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;QAC5C,MAAM,UAAU,GAAG,MAAM,iBAAiB,CAAC;QAE3C,MAAM,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;QAEjD,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,QAAQ,EAAE,EAAE,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QAElE,MAAM,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,CAAC;QACjC,MAAM,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,CAAC;IACnC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { generateKeyPair } from \"@openlv/core/encryption\";\nimport { EventEmitter } from \"eventemitter3\";\nimport { describe, expect, it } from \"vitest\";\n\nimport { TRANSPORT_STATE } from \"./index.js\";\nimport { webrtc } from \"./webrtc/index.js\";\n\ndescribe(\"Transport\", () => {\n it(\"should be able to create a transport\", async () => {\n const { encryptionKey: publicKey, decryptionKey } = await generateKeyPair();\n const { encrypt } = publicKey;\n const { decrypt } = decryptionKey;\n const signalA = new EventEmitter<{ signal: string; message: object; }>();\n const signalB = new EventEmitter<{ signal: string; message: object; }>();\n\n const transportA = webrtc()({\n encrypt,\n decrypt,\n subsend: async (m) => {\n signalA.emit(\"signal\", m);\n },\n isHost: true,\n onmessage: (m) => {\n signalA.emit(\"message\", m);\n },\n });\n const transportB = webrtc()({\n encrypt,\n decrypt,\n subsend: async (m) => {\n signalB.emit(\"signal\", m);\n },\n isHost: false,\n onmessage: (m) => {\n signalB.emit(\"message\", m);\n },\n });\n\n signalA.on(\"signal\", (m) => {\n console.log(\"messageA\", m);\n transportB.handle(m);\n });\n signalB.on(\"signal\", (m) => {\n console.log(\"messageB\", m);\n transportA.handle(m);\n });\n\n console.log(\"test: setup\");\n await Promise.all([transportA.setup(), transportB.setup()]);\n\n console.log(\"test: waitFor connected\");\n await Promise.all([\n transportA.waitFor(TRANSPORT_STATE.CONNECTED),\n transportB.waitFor(TRANSPORT_STATE.CONNECTED),\n ]);\n\n console.log(\"test: connected\");\n\n const awaitedMessageAtB = new Promise<object>((resolve) => {\n signalB.on(\"message\", (m) => {\n console.log(\"messageB\", m);\n resolve(m);\n });\n });\n\n console.log(\"test: send message to A\");\n await transportA.send({ data: \"test_123\" });\n\n console.log(\"test: await message at B\");\n const messageAtB = await awaitedMessageAtB;\n\n expect(messageAtB).toEqual({ data: \"test_123\" });\n\n console.log(\"test: message at B\", messageAtB);\n const awaitedMessageAtA = new Promise<object>((resolve) => {\n signalA.on(\"message\", (m) => {\n console.log(\"messageA\", m);\n resolve(m);\n });\n });\n\n await transportB.send({ data: \"test_456\" });\n const messageAtA = await awaitedMessageAtA;\n\n expect(messageAtA).toEqual({ data: \"test_456\" });\n\n await Promise.all([transportA.teardown(), transportB.teardown()]);\n\n expect(transportA).toBeDefined();\n expect(transportB).toBeDefined();\n });\n});\n"]}
|
package/dist/webrtc/index.d.ts
CHANGED
package/dist/webrtc/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { match } from "ts-pattern";
|
|
2
|
-
import { createTransportBase, } from "../
|
|
2
|
+
import { createTransportBase, } from "../index.js";
|
|
3
3
|
import { log } from "../utils/log.js";
|
|
4
4
|
// TODO: decide wether we want defaults, and if so what defaults
|
|
5
5
|
const defaultConfig = {
|
package/dist/webrtc/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/webrtc/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,OAAO,EACL,mBAAmB,GAGpB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAMtC,gEAAgE;AAChE,MAAM,aAAa,GAAiB;IAClC,UAAU,EAAE;QACV,EAAE,IAAI,EAAE,8BAA8B,EAAE;QACxC,EAAE,IAAI,EAAE,+BAA+B,EAAE;QACzC,EAAE,IAAI,EAAE,qCAAqC,EAAE;QAC/C;YACE,IAAI,EAAE,CAAC,8BAA8B,EAAE,+BAA+B,CAAC;YACvE,QAAQ,EAAE,kBAAkB;YAC5B,UAAU,EAAE,kBAAkB;SAC/B;KACF;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,MAAM,GAA2B,CAC5C,SAAuB,aAAa,EACpC,EAAE;IACF,MAAM,EAAE,UAAU,GAAG,aAAa,CAAC,UAAU,EAAE,GAAG,MAAM,CAAC;IAEzD,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAC;IACzC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC;SACrC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC;IAErB,OAAO,mBAAmB,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE;QACjD,MAAM,SAAS,GAAqB,EAAE,UAAU,EAAE,CAAC;QACnD,IAAI,UAAyC,CAAC;QAC9C,IAAI,OAAmC,CAAC;QAExC,MAAM,uBAAuB,GAAG,GAAG,EAAE;YACnC,GAAG,CAAC,KAAK,EAAE,yBAAyB,EAAE,UAAU,EAAE,eAAe,CAAC,CAAC;YAEnE,MAAM,KAAK,GAAG,UAAU,EAAE,eAAe,CAAC;YAE1C,KAAK,CAAC,KAAK,CAAC;iBACT,IAAI,CAAC,cAAc,EAAE,GAAG,EAAE;gBACzB,kBAAkB;YACpB,CAAC,CAAC;iBACD,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC;iBACxB,SAAS,CAAC,GAAG,EAAE;gBACd,GAAG,CAAC,KAAK,EAAE,gCAAgC,EAAE,KAAK,CAAC,CAAC;YACtD,CAAC,CAAC,CAAC;QACP,CAAC,CAAC;QACF,MAAM,cAAc,GAAG,CAAC,CAA4B,EAAE,EAAE;YACtD,IAAI,OAAO,EAAE,UAAU,KAAK,MAAM;gBAAE,OAAO;YAE3C,GAAG,CAAC,KAAK,EAAE,gBAAgB,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC;YAC1C,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;QACnE,CAAC,CAAC;QACF,MAAM,aAAa,GAAG,CAAC,CAAsB,EAAE,EAAE;YAC/C,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC;YACpB,WAAW,CAAC,OAAO,CAAC,CAAC;YACrB,GAAG,CAAC,KAAK,EAAE,eAAe,EAAE,OAAO,CAAC,CAAC;QACvC,CAAC,CAAC;QACF,MAAM,iBAAiB,GAAG,GAAG,EAAE;YAC7B,GAAG,CAAC,KAAK,EAAE,mBAAmB,CAAC,CAAC;YAChC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC5B,CAAC,CAAC;QACF,MAAM,oBAAoB,GAAG,CAAC,CAAuB,EAAE,EAAE;YACvD,GAAG,CAAC,KAAK,EAAE,sBAAsB,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;YAC3C,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QAClC,CAAC,CAAC;QACF,MAAM,mBAAmB,GAAG,KAAK,IAAI,EAAE;YACrC,GAAG,CAAC,KAAK,EAAE,qBAAqB,CAAC,CAAC;YAElC,IAAI,MAAM,IAAI,UAAU,EAAE,CAAC;gBACzB,MAAM,UAAU,CAAC,mBAAmB,EAAE,CAAC;gBAEvC,IAAI,UAAU,CAAC,gBAAgB;oBAC7B,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC,CAAC;YACvE,CAAC;QACH,CAAC,CAAC;QAEF,MAAM,WAAW,GAAG,CAAC,OAAuB,EAAE,EAAE;YAC9C,OAAO,CAAC,gBAAgB,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;YACpD,OAAO,CAAC,gBAAgB,CAAC,SAAS,EAAE,oBAAoB,CAAC,CAAC;QAC5D,CAAC,CAAC;QAEF,MAAM,MAAM,GAAG,KAAK,EAAE,OAAyB,EAAiB,EAAE;YAChE,GAAG,CAAC,KAAK,EAAE,eAAe,EAAE,OAAO,CAAC,CAAC;YAErC,IAAI,CAAC,UAAU;gBAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;YAEzD,OAAO,KAAK,CAAC,OAAO,CAAC;iBAClB,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;gBAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAA8B,CAAC;gBAE/D,MAAM,UAAW,CAAC,oBAAoB,CACpC,IAAI,qBAAqB,CAAC,KAAK,CAAC,CACjC,CAAC;gBAEF,MAAM,MAAM,GAAG,MAAM,UAAW,CAAC,YAAY,EAAE,CAAC;gBAEhD,MAAM,UAAW,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;gBAC9C,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;YACjD,CAAC,CAAC;iBACD,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;gBAC9C,IAAI,CAAC,UAAU;oBAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;gBAEzD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAA8B,CAAC;gBAEhE,MAAM,UAAU,CAAC,oBAAoB,CACnC,IAAI,qBAAqB,CAAC,MAAM,CAAC,CAClC,CAAC;YACJ,CAAC,CAAC;iBACD,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;gBACjD,IAAI,CAAC,UAAU;oBAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;gBAEzD,IAAI,CAAC,OAAO;oBAAE,OAAO;gBAErB,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAwB,CAAC;gBAE7D,MAAM,UAAU,CAAC,eAAe,CAAC,IAAI,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC;YACnE,CAAC,CAAC;iBACD,SAAS,CAAC,GAAG,EAAE;gBACd,GAAG,CAAC,KAAK,EAAE,yCAAyC,EAAE,OAAO,CAAC,CAAC;YACjE,CAAC,CAAC,CAAC;QACP,CAAC,CAAC;QAEF,MAAM,IAAI,GAAG,KAAK,EAAE,OAAe,EAAE,EAAE;YACrC,IAAI,CAAC,OAAO;gBAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;YAEnD,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC,CAAC;QAEF,OAAO;YACL,IAAI,EAAE,QAAQ;YACd,KAAK,CAAC,KAAK;gBACT,GAAG,CAAC,eAAe,EAAE,SAAS,CAAC,CAAC;gBAEhC,UAAU,GAAG,IAAI,iBAAiB,CAAC,SAAS,CAAC,CAAC;gBAC9C,UAAU,CAAC,uBAAuB,GAAG,uBAAuB,CAAC;gBAC7D,UAAU,CAAC,cAAc,GAAG,cAAc,CAAC;gBAC3C,UAAU,CAAC,aAAa,GAAG,aAAa,CAAC;gBACzC,UAAU,CAAC,mBAAmB,GAAG,mBAAmB,CAAC;gBAErD,IAAI,MAAM,EAAE,CAAC;oBACX,OAAO,GAAG,UAAU,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC;oBACtD,WAAW,CAAC,OAAO,CAAC,CAAC;gBACvB,CAAC;YACH,CAAC;YACD,QAAQ;gBACN,GAAG,CAAC,iBAAiB,CAAC,CAAC;gBAEvB,IAAI,OAAO,EAAE,CAAC;oBACZ,OAAO,CAAC,KAAK,EAAE,CAAC;oBAChB,OAAO,GAAG,SAAS,CAAC;gBACtB,CAAC;gBAED,IAAI,UAAU,EAAE,CAAC;oBACf,UAAU,CAAC,KAAK,EAAE,CAAC;oBACnB,UAAU,GAAG,SAAS,CAAC;gBACzB,CAAC;YACH,CAAC;YACD,MAAM;YACN,IAAI;SACL,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC","sourcesContent":["import { match } from \"ts-pattern\";\n\nimport {\n createTransportBase,\n type CreateTransportLayerFn,\n type TransportMessage,\n} from \"../base.js\";\nimport { log } from \"../utils/log.js\";\n\nexport type WebRTCConfig = {\n iceServers?: RTCConfiguration[\"iceServers\"];\n};\n\n// TODO: decide wether we want defaults, and if so what defaults\nconst defaultConfig: WebRTCConfig = {\n iceServers: [\n { urls: \"stun:stun.l.google.com:19302\" },\n { urls: \"stun:stun1.l.google.com:19302\" },\n { urls: \"stun:stun.services.mozilla.com:3478\" },\n {\n urls: [\"turn:openrelay.metered.ca:80\", \"turn:openrelay.metered.ca:443\"],\n username: \"openrelayproject\",\n credential: \"openrelayproject\",\n },\n ],\n};\n\nexport const webrtc: CreateTransportLayerFn = (\n config: WebRTCConfig = defaultConfig,\n) => {\n const { iceServers = defaultConfig.iceServers } = config;\n\n console.log(\"WEBRTC ICE CONFIG\", config);\n const ident = Math.random().toString(36)\n .slice(2, 4) + \"#\";\n\n return createTransportBase(({ emitter, isHost }) => {\n const rtcConfig: RTCConfiguration = { iceServers };\n let connection: RTCPeerConnection | undefined;\n let channel: RTCDataChannel | undefined;\n\n const onConnectionStateChange = () => {\n log(ident, \"onConnectionStateChange\", connection?.connectionState);\n\n const state = connection?.connectionState;\n\n match(state)\n .with(\"disconnected\", () => {\n // TODO: implement\n })\n .with(\"failed\", () => {})\n .otherwise(() => {\n log(ident, \"onConnectionStateChangeUnknown\", state);\n });\n };\n const onIceCandidate = (c: RTCPeerConnectionIceEvent) => {\n if (channel?.readyState === \"open\") return;\n\n log(ident, \"onIceCandidate\", c.candidate);\n emitter.emit(\"candidate\", JSON.stringify(c.candidate?.toJSON()));\n };\n const onDataChannel = (e: RTCDataChannelEvent) => {\n channel = e.channel;\n hookChannel(channel);\n log(ident, \"onDataChannel\", channel);\n };\n const onDataChannelOpen = () => {\n log(ident, \"onDataChannelOpen\");\n emitter.emit(\"connected\");\n };\n const onDataChannelMessage = (e: MessageEvent<string>) => {\n log(ident, \"onDataChannelMessage\", e.data);\n emitter.emit(\"message\", e.data);\n };\n const onNegotiationNeeded = async () => {\n log(ident, \"onNegotiationNeeded\");\n\n if (isHost && connection) {\n await connection.setLocalDescription();\n\n if (connection.localDescription)\n emitter.emit(\"offer\", JSON.stringify(connection.localDescription));\n }\n };\n\n const hookChannel = (channel: RTCDataChannel) => {\n channel.addEventListener(\"open\", onDataChannelOpen);\n channel.addEventListener(\"message\", onDataChannelMessage);\n };\n\n const handle = async (message: TransportMessage): Promise<void> => {\n log(ident, \"webrtc handle\", message);\n\n if (!connection) throw new Error(\"Connection not found\");\n\n return match(message)\n .with({ type: \"offer\" }, async ({ payload }) => {\n const offer = JSON.parse(payload) as RTCSessionDescriptionInit;\n\n await connection!.setRemoteDescription(\n new RTCSessionDescription(offer),\n );\n\n const answer = await connection!.createAnswer();\n\n await connection!.setLocalDescription(answer);\n emitter.emit(\"answer\", JSON.stringify(answer));\n })\n .with({ type: \"answer\" }, async ({ payload }) => {\n if (!connection) throw new Error(\"Connection not found\");\n\n const answer = JSON.parse(payload) as RTCSessionDescriptionInit;\n\n await connection.setRemoteDescription(\n new RTCSessionDescription(answer),\n );\n })\n .with({ type: \"candidate\" }, async ({ payload }) => {\n if (!connection) throw new Error(\"Connection not found\");\n\n if (!payload) return;\n\n const candidate = JSON.parse(payload) as RTCIceCandidateInit;\n\n await connection.addIceCandidate(new RTCIceCandidate(candidate));\n })\n .otherwise(() => {\n log(ident, \"received unknown transport message type\", message);\n });\n };\n\n const send = async (message: string) => {\n if (!channel) throw new Error(\"Channel not found\");\n\n channel.send(message);\n };\n\n return {\n type: \"webrtc\",\n async setup() {\n log(\"webrtc setupz\", rtcConfig);\n\n connection = new RTCPeerConnection(rtcConfig);\n connection.onconnectionstatechange = onConnectionStateChange;\n connection.onicecandidate = onIceCandidate;\n connection.ondatachannel = onDataChannel;\n connection.onnegotiationneeded = onNegotiationNeeded;\n\n if (isHost) {\n channel = connection.createDataChannel(\"openlv-data\");\n hookChannel(channel);\n }\n },\n teardown() {\n log(\"webrtc teardown\");\n\n if (channel) {\n channel.close();\n channel = undefined;\n }\n\n if (connection) {\n connection.close();\n connection = undefined;\n }\n },\n handle,\n send,\n };\n });\n};\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/webrtc/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { match } from \"ts-pattern\";\n\nimport {\n createTransportBase,\n type CreateTransportLayerFn,\n type TransportMessage,\n} from \"../index.js\";\nimport { log } from \"../utils/log.js\";\n\nexport type WebRTCConfig = {\n iceServers?: RTCConfiguration[\"iceServers\"];\n};\n\n// TODO: decide wether we want defaults, and if so what defaults\nconst defaultConfig: WebRTCConfig = {\n iceServers: [\n { urls: \"stun:stun.l.google.com:19302\" },\n { urls: \"stun:stun1.l.google.com:19302\" },\n { urls: \"stun:stun.services.mozilla.com:3478\" },\n {\n urls: [\"turn:openrelay.metered.ca:80\", \"turn:openrelay.metered.ca:443\"],\n username: \"openrelayproject\",\n credential: \"openrelayproject\",\n },\n ],\n};\n\nexport const webrtc: CreateTransportLayerFn = (\n config: WebRTCConfig = defaultConfig,\n) => {\n const { iceServers = defaultConfig.iceServers } = config;\n\n console.log(\"WEBRTC ICE CONFIG\", config);\n const ident = Math.random().toString(36)\n .slice(2, 4) + \"#\";\n\n return createTransportBase(({ emitter, isHost }) => {\n const rtcConfig: RTCConfiguration = { iceServers };\n let connection: RTCPeerConnection | undefined;\n let channel: RTCDataChannel | undefined;\n\n const onConnectionStateChange = () => {\n log(ident, \"onConnectionStateChange\", connection?.connectionState);\n\n const state = connection?.connectionState;\n\n match(state)\n .with(\"disconnected\", () => {\n // TODO: implement\n })\n .with(\"failed\", () => {})\n .otherwise(() => {\n log(ident, \"onConnectionStateChangeUnknown\", state);\n });\n };\n const onIceCandidate = (c: RTCPeerConnectionIceEvent) => {\n if (channel?.readyState === \"open\") return;\n\n log(ident, \"onIceCandidate\", c.candidate);\n emitter.emit(\"candidate\", JSON.stringify(c.candidate?.toJSON()));\n };\n const onDataChannel = (e: RTCDataChannelEvent) => {\n channel = e.channel;\n hookChannel(channel);\n log(ident, \"onDataChannel\", channel);\n };\n const onDataChannelOpen = () => {\n log(ident, \"onDataChannelOpen\");\n emitter.emit(\"connected\");\n };\n const onDataChannelMessage = (e: MessageEvent<string>) => {\n log(ident, \"onDataChannelMessage\", e.data);\n emitter.emit(\"message\", e.data);\n };\n const onNegotiationNeeded = async () => {\n log(ident, \"onNegotiationNeeded\");\n\n if (isHost && connection) {\n await connection.setLocalDescription();\n\n if (connection.localDescription)\n emitter.emit(\"offer\", JSON.stringify(connection.localDescription));\n }\n };\n\n const hookChannel = (channel: RTCDataChannel) => {\n channel.addEventListener(\"open\", onDataChannelOpen);\n channel.addEventListener(\"message\", onDataChannelMessage);\n };\n\n const handle = async (message: TransportMessage): Promise<void> => {\n log(ident, \"webrtc handle\", message);\n\n if (!connection) throw new Error(\"Connection not found\");\n\n return match(message)\n .with({ type: \"offer\" }, async ({ payload }) => {\n const offer = JSON.parse(payload) as RTCSessionDescriptionInit;\n\n await connection!.setRemoteDescription(\n new RTCSessionDescription(offer),\n );\n\n const answer = await connection!.createAnswer();\n\n await connection!.setLocalDescription(answer);\n emitter.emit(\"answer\", JSON.stringify(answer));\n })\n .with({ type: \"answer\" }, async ({ payload }) => {\n if (!connection) throw new Error(\"Connection not found\");\n\n const answer = JSON.parse(payload) as RTCSessionDescriptionInit;\n\n await connection.setRemoteDescription(\n new RTCSessionDescription(answer),\n );\n })\n .with({ type: \"candidate\" }, async ({ payload }) => {\n if (!connection) throw new Error(\"Connection not found\");\n\n if (!payload) return;\n\n const candidate = JSON.parse(payload) as RTCIceCandidateInit;\n\n await connection.addIceCandidate(new RTCIceCandidate(candidate));\n })\n .otherwise(() => {\n log(ident, \"received unknown transport message type\", message);\n });\n };\n\n const send = async (message: string) => {\n if (!channel) throw new Error(\"Channel not found\");\n\n channel.send(message);\n };\n\n return {\n type: \"webrtc\",\n async setup() {\n log(\"webrtc setupz\", rtcConfig);\n\n connection = new RTCPeerConnection(rtcConfig);\n connection.onconnectionstatechange = onConnectionStateChange;\n connection.onicecandidate = onIceCandidate;\n connection.ondatachannel = onDataChannel;\n connection.onnegotiationneeded = onNegotiationNeeded;\n\n if (isHost) {\n channel = connection.createDataChannel(\"openlv-data\");\n hookChannel(channel);\n }\n },\n teardown() {\n log(\"webrtc teardown\");\n\n if (channel) {\n channel.close();\n channel = undefined;\n }\n\n if (connection) {\n connection.close();\n connection = undefined;\n }\n },\n handle,\n send,\n };\n });\n};\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@openlv/transport",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.2",
|
|
4
4
|
"keywords": [
|
|
5
5
|
"open-lavatory"
|
|
6
6
|
],
|
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
"eventemitter3": "^5.0.1",
|
|
43
43
|
"globals": "^16.2.0",
|
|
44
44
|
"ts-pattern": "^5",
|
|
45
|
-
"@openlv/core": "0.0.1
|
|
45
|
+
"@openlv/core": "0.0.1"
|
|
46
46
|
},
|
|
47
47
|
"devDependencies": {
|
|
48
48
|
"@vitest/browser-playwright": "^4.0.8",
|
package/dist/base.d.ts
DELETED
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
import { EventEmitter } from "eventemitter3";
|
|
2
|
-
import type { MaybePromise } from "viem";
|
|
3
|
-
import { type TLayerEventMap, type TransportLayerParameters, type TransportState } from "./layer.js";
|
|
4
|
-
import type { WebRTCConfig } from "./webrtc/index.js";
|
|
5
|
-
export type TransportMessage = {
|
|
6
|
-
type: "offer";
|
|
7
|
-
payload: string;
|
|
8
|
-
} | {
|
|
9
|
-
type: "answer";
|
|
10
|
-
payload: string;
|
|
11
|
-
} | {
|
|
12
|
-
type: "candidate";
|
|
13
|
-
payload: string;
|
|
14
|
-
};
|
|
15
|
-
export type TransportLayer = {
|
|
16
|
-
type: string;
|
|
17
|
-
setup: () => MaybePromise<void>;
|
|
18
|
-
teardown: () => MaybePromise<void>;
|
|
19
|
-
send: (message: object) => Promise<void>;
|
|
20
|
-
handle: (message: TransportMessage) => Promise<void>;
|
|
21
|
-
waitFor: (state: TransportState) => Promise<void>;
|
|
22
|
-
emitter: EventEmitter<TLayerEventMap>;
|
|
23
|
-
};
|
|
24
|
-
export type TLayer = (parameters: TransportLayerParameters) => TransportLayer;
|
|
25
|
-
export type CreateTransportLayerFn = (config?: WebRTCConfig) => TLayer;
|
|
26
|
-
export type TransportLayerBase = {
|
|
27
|
-
type: string;
|
|
28
|
-
setup: () => MaybePromise<void>;
|
|
29
|
-
teardown: () => MaybePromise<void>;
|
|
30
|
-
handle: (message: TransportMessage) => Promise<void>;
|
|
31
|
-
send: (message: string) => Promise<void>;
|
|
32
|
-
};
|
|
33
|
-
export type TransportLayerBaseEventMap = {
|
|
34
|
-
offer: (offer: string) => void;
|
|
35
|
-
answer: (answer: string) => void;
|
|
36
|
-
candidate: (candidate: string) => void;
|
|
37
|
-
connected: () => void;
|
|
38
|
-
message: (message: string) => void;
|
|
39
|
-
};
|
|
40
|
-
export type TransportLayerBaseEmitter = EventEmitter<TransportLayerBaseEventMap>;
|
|
41
|
-
export type TransportLayerBaseParameters = {
|
|
42
|
-
emitter: TransportLayerBaseEmitter;
|
|
43
|
-
isHost: boolean;
|
|
44
|
-
};
|
|
45
|
-
export type TransportLayerBaseInit = (parameters: TransportLayerBaseParameters) => TransportLayerBase;
|
|
46
|
-
/**
|
|
47
|
-
* Base Transport Layer implementation
|
|
48
|
-
*
|
|
49
|
-
* https://openlv.sh/api/transport
|
|
50
|
-
*/
|
|
51
|
-
export declare const createTransportBase: (init: TransportLayerBaseInit) => TLayer;
|
package/dist/base.js
DELETED
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
import { EventEmitter } from "eventemitter3";
|
|
2
|
-
import { TRANSPORT_STATE, } from "./layer.js";
|
|
3
|
-
import { log } from "./utils/log.js";
|
|
4
|
-
/**
|
|
5
|
-
* Base Transport Layer implementation
|
|
6
|
-
*
|
|
7
|
-
* https://openlv.sh/api/transport
|
|
8
|
-
*/
|
|
9
|
-
export const createTransportBase = (init) => ({ encrypt, decrypt, subsend, isHost, onmessage }) => {
|
|
10
|
-
const emitter = new EventEmitter();
|
|
11
|
-
const internalEmitter = new EventEmitter();
|
|
12
|
-
let state = TRANSPORT_STATE.STANDBY;
|
|
13
|
-
const setState = (newState) => {
|
|
14
|
-
state = newState;
|
|
15
|
-
emitter.emit("state_change", newState);
|
|
16
|
-
};
|
|
17
|
-
internalEmitter.on("offer", (offer) => {
|
|
18
|
-
log("onOffer", offer);
|
|
19
|
-
subsend({ type: "offer", payload: offer });
|
|
20
|
-
});
|
|
21
|
-
internalEmitter.on("answer", (answer) => {
|
|
22
|
-
log("onAnswer", answer);
|
|
23
|
-
subsend({ type: "answer", payload: answer });
|
|
24
|
-
});
|
|
25
|
-
internalEmitter.on("candidate", (candidate) => {
|
|
26
|
-
log("onCandidate", candidate);
|
|
27
|
-
subsend({ type: "candidate", payload: candidate });
|
|
28
|
-
});
|
|
29
|
-
internalEmitter.on("connected", () => {
|
|
30
|
-
log("onConnected");
|
|
31
|
-
setState(TRANSPORT_STATE.CONNECTED);
|
|
32
|
-
});
|
|
33
|
-
internalEmitter.on("message", async (message) => {
|
|
34
|
-
log("onMessage", message);
|
|
35
|
-
const data = await decrypt(message);
|
|
36
|
-
onmessage(JSON.parse(data));
|
|
37
|
-
});
|
|
38
|
-
const { setup, teardown, type, send: sendLayer, handle, } = init({
|
|
39
|
-
emitter: internalEmitter,
|
|
40
|
-
isHost,
|
|
41
|
-
});
|
|
42
|
-
const send = async (message) => {
|
|
43
|
-
if (state !== TRANSPORT_STATE.CONNECTED)
|
|
44
|
-
throw new Error("Transport not connected");
|
|
45
|
-
const payload = await encrypt(JSON.stringify(message));
|
|
46
|
-
await sendLayer(payload);
|
|
47
|
-
};
|
|
48
|
-
const waitFor = async (targetState) => {
|
|
49
|
-
if (state === targetState)
|
|
50
|
-
return;
|
|
51
|
-
return new Promise((resolve) => {
|
|
52
|
-
const handler = (newState) => {
|
|
53
|
-
if (newState === targetState) {
|
|
54
|
-
emitter.off("state_change", handler);
|
|
55
|
-
resolve();
|
|
56
|
-
}
|
|
57
|
-
};
|
|
58
|
-
emitter.on("state_change", handler);
|
|
59
|
-
});
|
|
60
|
-
};
|
|
61
|
-
return {
|
|
62
|
-
type,
|
|
63
|
-
async setup() {
|
|
64
|
-
setState(TRANSPORT_STATE.CONNECTING);
|
|
65
|
-
await setup();
|
|
66
|
-
setState(TRANSPORT_STATE.READY);
|
|
67
|
-
},
|
|
68
|
-
teardown,
|
|
69
|
-
handle,
|
|
70
|
-
send,
|
|
71
|
-
waitFor,
|
|
72
|
-
emitter,
|
|
73
|
-
};
|
|
74
|
-
};
|
|
75
|
-
//# sourceMappingURL=base.js.map
|
package/dist/base.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"base.js","sourceRoot":"","sources":["../src/base.ts"],"names":[],"mappings":"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","sourcesContent":["import { EventEmitter } from \"eventemitter3\";\nimport type { MaybePromise } from \"viem\";\n\nimport {\n type TLayerEventMap,\n TRANSPORT_STATE,\n type TransportLayerParameters,\n type TransportState,\n} from \"./layer.js\";\nimport { log } from \"./utils/log.js\";\nimport type { WebRTCConfig } from \"./webrtc/index.js\";\n\nexport type TransportMessage =\n | {\n type: \"offer\";\n payload: string;\n }\n | {\n type: \"answer\";\n payload: string;\n }\n | {\n type: \"candidate\";\n payload: string;\n };\nexport type TransportLayer = {\n type: string;\n setup: () => MaybePromise<void>;\n teardown: () => MaybePromise<void>;\n send: (message: object) => Promise<void>;\n handle: (message: TransportMessage) => Promise<void>;\n waitFor: (state: TransportState) => Promise<void>;\n emitter: EventEmitter<TLayerEventMap>;\n};\nexport type TLayer = (parameters: TransportLayerParameters) => TransportLayer;\nexport type CreateTransportLayerFn = (config?: WebRTCConfig) => TLayer;\nexport type TransportLayerBase = {\n type: string;\n setup: () => MaybePromise<void>;\n teardown: () => MaybePromise<void>;\n handle: (message: TransportMessage) => Promise<void>;\n send: (message: string) => Promise<void>;\n};\nexport type TransportLayerBaseEventMap = {\n offer: (offer: string) => void;\n answer: (answer: string) => void;\n candidate: (candidate: string) => void;\n connected: () => void;\n message: (message: string) => void;\n};\nexport type TransportLayerBaseEmitter =\n EventEmitter<TransportLayerBaseEventMap>;\nexport type TransportLayerBaseParameters = {\n emitter: TransportLayerBaseEmitter;\n isHost: boolean;\n};\nexport type TransportLayerBaseInit = (\n parameters: TransportLayerBaseParameters,\n) => TransportLayerBase;\n\n/**\n * Base Transport Layer implementation\n *\n * https://openlv.sh/api/transport\n */\nexport const createTransportBase = (init: TransportLayerBaseInit): TLayer => ({ encrypt, decrypt, subsend, isHost, onmessage }) => {\n const emitter = new EventEmitter<TLayerEventMap>();\n const internalEmitter = new EventEmitter<TransportLayerBaseEventMap>();\n let state: TransportState = TRANSPORT_STATE.STANDBY;\n\n const setState = (newState: TransportState) => {\n state = newState;\n emitter.emit(\"state_change\", newState);\n };\n\n internalEmitter.on(\"offer\", (offer) => {\n log(\"onOffer\", offer);\n subsend({ type: \"offer\", payload: offer });\n });\n internalEmitter.on(\"answer\", (answer) => {\n log(\"onAnswer\", answer);\n subsend({ type: \"answer\", payload: answer });\n });\n internalEmitter.on(\"candidate\", (candidate) => {\n log(\"onCandidate\", candidate);\n subsend({ type: \"candidate\", payload: candidate });\n });\n internalEmitter.on(\"connected\", () => {\n log(\"onConnected\");\n setState(TRANSPORT_STATE.CONNECTED);\n });\n internalEmitter.on(\"message\", async (message) => {\n log(\"onMessage\", message);\n const data = await decrypt(message);\n\n onmessage(JSON.parse(data) as { type: string; payload: object; messageId: string; });\n });\n\n const {\n setup,\n teardown,\n type,\n send: sendLayer,\n handle,\n } = init({\n emitter: internalEmitter,\n isHost,\n });\n\n const send = async (message: object) => {\n if (state !== TRANSPORT_STATE.CONNECTED)\n throw new Error(\"Transport not connected\");\n\n const payload = await encrypt(JSON.stringify(message));\n\n await sendLayer(payload);\n };\n\n const waitFor = async (targetState: TransportState) => {\n if (state === targetState) return;\n\n return new Promise<void>((resolve) => {\n const handler = (newState: TransportState) => {\n if (newState === targetState) {\n emitter.off(\"state_change\", handler);\n resolve();\n }\n };\n\n emitter.on(\"state_change\", handler);\n });\n };\n\n return {\n type,\n async setup() {\n setState(TRANSPORT_STATE.CONNECTING);\n await setup();\n setState(TRANSPORT_STATE.READY);\n },\n teardown,\n handle,\n send,\n waitFor,\n emitter,\n };\n};\n"]}
|
package/dist/layer.d.ts
DELETED
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import type { DecryptionKey, EncryptionKey } from "@openlv/core/encryption";
|
|
2
|
-
import type { TransportMessage } from "./base.js";
|
|
3
|
-
export declare const TRANSPORT_STATE: {
|
|
4
|
-
readonly STANDBY: "standby";
|
|
5
|
-
readonly CONNECTING: "connecting";
|
|
6
|
-
readonly READY: "ready";
|
|
7
|
-
readonly CONNECTED: "connected";
|
|
8
|
-
readonly ERROR: "error";
|
|
9
|
-
};
|
|
10
|
-
export type TransportState = (typeof TRANSPORT_STATE)[keyof typeof TRANSPORT_STATE];
|
|
11
|
-
export type TLayerEventMap = {
|
|
12
|
-
state_change: (state: TransportState) => void;
|
|
13
|
-
};
|
|
14
|
-
export type TransportLayerParameters = {
|
|
15
|
-
isHost: boolean;
|
|
16
|
-
encrypt: EncryptionKey["encrypt"];
|
|
17
|
-
decrypt: DecryptionKey["decrypt"];
|
|
18
|
-
subsend: (message: TransportMessage) => Promise<void>;
|
|
19
|
-
onmessage: (message: {
|
|
20
|
-
type: string;
|
|
21
|
-
payload: object;
|
|
22
|
-
messageId: string;
|
|
23
|
-
}) => void;
|
|
24
|
-
};
|
package/dist/layer.js
DELETED
package/dist/layer.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"layer.js","sourceRoot":"","sources":["../src/layer.ts"],"names":[],"mappings":"AAIA,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,OAAO,EAAE,SAAS;IAClB,UAAU,EAAE,YAAY;IACxB,KAAK,EAAE,OAAO;IACd,SAAS,EAAE,WAAW;IACtB,KAAK,EAAE,OAAO;CACN,CAAC","sourcesContent":["import type { DecryptionKey, EncryptionKey } from \"@openlv/core/encryption\";\n\nimport type { TransportMessage } from \"./base.js\";\n\nexport const TRANSPORT_STATE = {\n STANDBY: \"standby\",\n CONNECTING: \"connecting\",\n READY: \"ready\",\n CONNECTED: \"connected\",\n ERROR: \"error\",\n} as const;\nexport type TransportState =\n (typeof TRANSPORT_STATE)[keyof typeof TRANSPORT_STATE];\n\nexport type TLayerEventMap = {\n state_change: (state: TransportState) => void;\n};\n\nexport type TransportLayerParameters = {\n isHost: boolean;\n encrypt: EncryptionKey[\"encrypt\"];\n decrypt: DecryptionKey[\"decrypt\"];\n subsend: (message: TransportMessage) => Promise<void>;\n onmessage: (message: { type: string; payload: object; messageId: string; }) => void;\n};\n"]}
|