@openlv/transport 0.0.2 → 0.0.3

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 CHANGED
@@ -19,7 +19,7 @@ export type TransportState = (typeof TRANSPORT_STATE)[keyof typeof TRANSPORT_STA
19
19
  export type TLayerEventMap = {
20
20
  state_change: (state: TransportState) => void;
21
21
  };
22
- export type TransportLayerParameters = {
22
+ export type TransportLayerSetupParameters = {
23
23
  isHost: boolean;
24
24
  encrypt: EncryptionKey["encrypt"];
25
25
  decrypt: DecryptionKey["decrypt"];
@@ -41,7 +41,7 @@ export type TransportMessage = {
41
41
  payload: string;
42
42
  };
43
43
  export type TransportLayer = {
44
- type: string;
44
+ type: TransportProtocol;
45
45
  setup: () => MaybePromise<void>;
46
46
  teardown: () => MaybePromise<void>;
47
47
  send: (message: object) => Promise<void>;
@@ -49,10 +49,11 @@ export type TransportLayer = {
49
49
  waitFor: (state: TransportState) => Promise<void>;
50
50
  emitter: EventEmitter<TLayerEventMap>;
51
51
  };
52
- export type TLayer = (parameters: TransportLayerParameters) => TransportLayer;
53
- export type CreateTransportLayerFn = (config?: WebRTCConfig) => TLayer;
54
- export type TransportLayerBase = {
55
- type: string;
52
+ export type TransportProtocol = "webrtc" | string;
53
+ export type TransportLayerFn = (parameters: TransportLayerSetupParameters) => TransportLayer;
54
+ export type Transport = (config?: WebRTCConfig) => TransportLayerFn;
55
+ export type TransportLayerImpl = {
56
+ type: TransportProtocol;
56
57
  setup: () => MaybePromise<void>;
57
58
  teardown: () => MaybePromise<void>;
58
59
  handle: (message: TransportMessage) => Promise<void>;
@@ -70,10 +71,10 @@ export type TransportLayerBaseParameters = {
70
71
  emitter: TransportLayerBaseEmitter;
71
72
  isHost: boolean;
72
73
  };
73
- export type TransportLayerBaseInit = (parameters: TransportLayerBaseParameters) => TransportLayerBase;
74
+ export type TransportLayerImplFn = (parameters: TransportLayerBaseParameters) => TransportLayerImpl;
74
75
  /**
75
76
  * Base Transport Layer implementation
76
77
  *
77
78
  * https://openlv.sh/api/transport
78
79
  */
79
- export declare const createTransportBase: (init: TransportLayerBaseInit) => TLayer;
80
+ export declare const createTransportBase: (init: TransportLayerImplFn) => TransportLayerFn;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
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"]}
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 TransportLayerSetupParameters = {\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: TransportProtocol;\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 TransportProtocol = \"webrtc\" | string;\nexport type TransportLayerFn = (parameters: TransportLayerSetupParameters) => TransportLayer;\nexport type Transport = (config?: WebRTCConfig) => TransportLayerFn;\n\nexport type TransportLayerImpl = {\n type: TransportProtocol;\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 TransportLayerImplFn = (\n parameters: TransportLayerBaseParameters,\n) => TransportLayerImpl;\n\n/**\n * Base Transport Layer implementation\n *\n * https://openlv.sh/api/transport\n */\nexport const createTransportBase = (init: TransportLayerImplFn): TransportLayerFn => ({ 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"]}
@@ -1,5 +1,5 @@
1
- import { type CreateTransportLayerFn } from "../index.js";
1
+ import { type Transport } from "../index.js";
2
2
  export type WebRTCConfig = {
3
3
  iceServers?: RTCConfiguration["iceServers"];
4
4
  };
5
- export declare const webrtc: CreateTransportLayerFn;
5
+ export declare const webrtc: Transport;
@@ -1 +1 @@
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"]}
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 Transport,\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: Transport = (\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.2",
3
+ "version": "0.0.3",
4
4
  "keywords": [
5
5
  "open-lavatory"
6
6
  ],
@@ -10,7 +10,7 @@
10
10
  },
11
11
  "repository": {
12
12
  "type": "git",
13
- "url": "https://github.com/v3xlabs/open-lavatory.git",
13
+ "url": "git+https://github.com/v3xlabs/open-lavatory.git",
14
14
  "directory": "packages/transport"
15
15
  },
16
16
  "license": "LGPL-3.0-only",
@@ -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.2"
46
46
  },
47
47
  "devDependencies": {
48
48
  "@vitest/browser-playwright": "^4.0.8",
@@ -50,14 +50,8 @@
50
50
  "typescript": "^5",
51
51
  "vitest": "^4"
52
52
  },
53
- "peerDependencies": {
54
- "@wagmi/core": "2",
55
- "viem": "2",
56
- "wagmi": "2"
57
- },
58
53
  "publishConfig": {
59
- "access": "public",
60
- "tag": "beta"
54
+ "access": "public"
61
55
  },
62
56
  "scripts": {
63
57
  "build": "tsc",