@openlv/transport 0.0.1-beta.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.
Files changed (99) hide show
  1. package/LICENSE +165 -0
  2. package/README.md +3 -0
  3. package/dist/base.d.ts +16 -0
  4. package/dist/base.js +13 -0
  5. package/dist/base.js.map +1 -0
  6. package/dist/connection.d.ts +57 -0
  7. package/dist/connection.js +757 -0
  8. package/dist/connection.js.map +1 -0
  9. package/dist/encryption/asymmetric.d.ts +22 -0
  10. package/dist/encryption/asymmetric.js +88 -0
  11. package/dist/encryption/asymmetric.js.map +1 -0
  12. package/dist/encryption/asymmetric.test.d.ts +1 -0
  13. package/dist/encryption/asymmetric.test.js +38 -0
  14. package/dist/encryption/asymmetric.test.js.map +1 -0
  15. package/dist/encryption/base64.d.ts +2 -0
  16. package/dist/encryption/base64.js +16 -0
  17. package/dist/encryption/base64.js.map +1 -0
  18. package/dist/encryption/base64.test.d.ts +1 -0
  19. package/dist/encryption/base64.test.js +21 -0
  20. package/dist/encryption/base64.test.js.map +1 -0
  21. package/dist/encryption/handshake.d.ts +10 -0
  22. package/dist/encryption/handshake.js +40 -0
  23. package/dist/encryption/handshake.js.map +1 -0
  24. package/dist/encryption/handshake.test.d.ts +1 -0
  25. package/dist/encryption/handshake.test.js +16 -0
  26. package/dist/encryption/handshake.test.js.map +1 -0
  27. package/dist/encryption/hash.d.ts +13 -0
  28. package/dist/encryption/hash.js +32 -0
  29. package/dist/encryption/hash.js.map +1 -0
  30. package/dist/encryption/index.d.ts +4 -0
  31. package/dist/encryption/index.js +5 -0
  32. package/dist/encryption/index.js.map +1 -0
  33. package/dist/encryption/random.d.ts +8 -0
  34. package/dist/encryption/random.js +21 -0
  35. package/dist/encryption/random.js.map +1 -0
  36. package/dist/index.d.ts +7 -0
  37. package/dist/index.js +8 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/index.test.d.ts +1 -0
  40. package/dist/index.test.js +7 -0
  41. package/dist/index.test.js.map +1 -0
  42. package/dist/provider.d.ts +11 -0
  43. package/dist/provider.js +286 -0
  44. package/dist/provider.js.map +1 -0
  45. package/dist/session/index.d.ts +40 -0
  46. package/dist/session/index.js +95 -0
  47. package/dist/session/index.js.map +1 -0
  48. package/dist/session/index.test.d.ts +1 -0
  49. package/dist/session/index.test.js +32 -0
  50. package/dist/session/index.test.js.map +1 -0
  51. package/dist/signaling/base.d.ts +14 -0
  52. package/dist/signaling/base.js +2 -0
  53. package/dist/signaling/base.js.map +1 -0
  54. package/dist/signaling/index.d.ts +28 -0
  55. package/dist/signaling/index.js +152 -0
  56. package/dist/signaling/index.js.map +1 -0
  57. package/dist/signaling/index.test.d.ts +1 -0
  58. package/dist/signaling/index.test.js +62 -0
  59. package/dist/signaling/index.test.js.map +1 -0
  60. package/dist/signaling/messages/index.d.ts +48 -0
  61. package/dist/signaling/messages/index.js +2 -0
  62. package/dist/signaling/messages/index.js.map +1 -0
  63. package/dist/signaling/mqtt/index.d.ts +5 -0
  64. package/dist/signaling/mqtt/index.js +49 -0
  65. package/dist/signaling/mqtt/index.js.map +1 -0
  66. package/dist/signaling/mqtt.d.ts +31 -0
  67. package/dist/signaling/mqtt.js +152 -0
  68. package/dist/signaling/mqtt.js.map +1 -0
  69. package/dist/signaling/ntfy/index.d.ts +25 -0
  70. package/dist/signaling/ntfy/index.js +92 -0
  71. package/dist/signaling/ntfy/index.js.map +1 -0
  72. package/dist/signaling/ntfy/url.d.ts +12 -0
  73. package/dist/signaling/ntfy/url.js +37 -0
  74. package/dist/signaling/ntfy/url.js.map +1 -0
  75. package/dist/signaling/ntfy/url.test.d.ts +1 -0
  76. package/dist/signaling/ntfy/url.test.js +54 -0
  77. package/dist/signaling/ntfy/url.test.js.map +1 -0
  78. package/dist/transport/index.d.ts +11 -0
  79. package/dist/transport/index.js +8 -0
  80. package/dist/transport/index.js.map +1 -0
  81. package/dist/transport/webrtc/index.d.ts +1 -0
  82. package/dist/transport/webrtc/index.js +70 -0
  83. package/dist/transport/webrtc/index.js.map +1 -0
  84. package/dist/types.d.ts +56 -0
  85. package/dist/types.js +6 -0
  86. package/dist/types.js.map +1 -0
  87. package/dist/utils/encryption.d.ts +86 -0
  88. package/dist/utils/encryption.js +243 -0
  89. package/dist/utils/encryption.js.map +1 -0
  90. package/dist/utils/url.d.ts +3 -0
  91. package/dist/utils/url.js +66 -0
  92. package/dist/utils/url.js.map +1 -0
  93. package/dist/utils/url.test.d.ts +1 -0
  94. package/dist/utils/url.test.js +29 -0
  95. package/dist/utils/url.test.js.map +1 -0
  96. package/dist/webrtc/index.d.ts +1 -0
  97. package/dist/webrtc/index.js +70 -0
  98. package/dist/webrtc/index.js.map +1 -0
  99. package/package.json +58 -0
@@ -0,0 +1,286 @@
1
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || ((receiver, state, kind, f) => {
2
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
3
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
4
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
5
+ });
6
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || ((receiver, state, value, kind, f) => {
7
+ if (kind === "m") throw new TypeError("Private method is not writable");
8
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
9
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
10
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
11
+ });
12
+ var _OpenLVProvider_conn, _OpenLVProvider_isConnected, _OpenLVProvider_accounts, _OpenLVProvider_chainId;
13
+ /* eslint-disable sonarjs/no-duplicate-string */
14
+ import { EventEmitter } from 'eventemitter3';
15
+ import { OpenLVConnection } from './index.js';
16
+ export class OpenLVProvider extends EventEmitter {
17
+ constructor() {
18
+ super();
19
+ _OpenLVProvider_conn.set(this, void 0);
20
+ _OpenLVProvider_isConnected.set(this, false);
21
+ _OpenLVProvider_accounts.set(this, []);
22
+ _OpenLVProvider_chainId.set(this, 1);
23
+ }
24
+ get connected() {
25
+ return __classPrivateFieldGet(this, _OpenLVProvider_isConnected, "f");
26
+ }
27
+ async init() {
28
+ __classPrivateFieldSet(this, _OpenLVProvider_conn, new OpenLVConnection(), "f");
29
+ // Set up connection handlers
30
+ __classPrivateFieldGet(this, _OpenLVProvider_conn, "f").onPhaseChange((phase) => {
31
+ console.log(`OpenLV Provider: Connection state changed to ${phase.state}`);
32
+ if (phase.state === 'webrtc-connected') {
33
+ __classPrivateFieldSet(this, _OpenLVProvider_isConnected, true, "f");
34
+ this.emit('connect');
35
+ }
36
+ else if (phase.state === 'key-exchange') {
37
+ __classPrivateFieldSet(this, _OpenLVProvider_isConnected, true, "f");
38
+ this.emit('connect');
39
+ }
40
+ else if (phase.state === 'disconnected') {
41
+ __classPrivateFieldSet(this, _OpenLVProvider_isConnected, false, "f");
42
+ this.emit('disconnect');
43
+ }
44
+ });
45
+ // Set up message handler for incoming JSON-RPC messages
46
+ __classPrivateFieldGet(this, _OpenLVProvider_conn, "f").onMessage(async (message) => {
47
+ console.log('Provider: Received message:', message);
48
+ // **FIX: Always emit the message first**
49
+ this.emit('message', message);
50
+ // Handle responses to our requests (but don't interfere with request handlers)
51
+ if ('result' in message || 'error' in message) {
52
+ const response = message;
53
+ console.log('Provider: Processing response:', response);
54
+ // Check for account changes and update internal state
55
+ if (response.result && Array.isArray(response.result)) {
56
+ const newAccounts = response.result;
57
+ console.log('Provider: Found accounts in response:', newAccounts);
58
+ // Update accounts but don't emit here - let the request handler do it
59
+ const oldAccounts = __classPrivateFieldGet(this, _OpenLVProvider_accounts, "f");
60
+ __classPrivateFieldSet(this, _OpenLVProvider_accounts, newAccounts, "f");
61
+ // Only emit if accounts actually changed
62
+ if (JSON.stringify(oldAccounts) !== JSON.stringify(newAccounts)) {
63
+ console.log('Provider: Emitting accountsChanged:', newAccounts);
64
+ this.emit('accountsChanged', newAccounts);
65
+ }
66
+ }
67
+ // Return the response for request handlers
68
+ return response;
69
+ }
70
+ // For incoming requests, return a default response
71
+ return { status: 'received' };
72
+ });
73
+ const { openLVUrl } = await __classPrivateFieldGet(this, _OpenLVProvider_conn, "f").initSession();
74
+ this.emit('display_uri', openLVUrl);
75
+ }
76
+ async connect(uri) {
77
+ __classPrivateFieldSet(this, _OpenLVProvider_conn, new OpenLVConnection(), "f");
78
+ // Set up connection handlers
79
+ __classPrivateFieldGet(this, _OpenLVProvider_conn, "f").onPhaseChange((phase) => {
80
+ console.log(`OpenLV Provider: Connection state changed to ${phase.state}`);
81
+ if (phase.state === 'webrtc-connected') {
82
+ __classPrivateFieldSet(this, _OpenLVProvider_isConnected, true, "f");
83
+ this.emit('connect');
84
+ }
85
+ else if (phase.state === 'key-exchange') {
86
+ __classPrivateFieldSet(this, _OpenLVProvider_isConnected, true, "f");
87
+ this.emit('connect');
88
+ }
89
+ else if (phase.state === 'disconnected') {
90
+ __classPrivateFieldSet(this, _OpenLVProvider_isConnected, false, "f");
91
+ this.emit('disconnect');
92
+ }
93
+ });
94
+ // Set up message handler
95
+ __classPrivateFieldGet(this, _OpenLVProvider_conn, "f").onMessage(async (message) => {
96
+ console.log('Provider: Received message:', message);
97
+ // **FIX: Always emit the message first**
98
+ this.emit('message', message);
99
+ // Handle responses to our requests
100
+ if ('result' in message || 'error' in message) {
101
+ const response = message;
102
+ // Check for account changes
103
+ if (response.result && Array.isArray(response.result)) {
104
+ const newAccounts = response.result;
105
+ if (JSON.stringify(newAccounts) !== JSON.stringify(__classPrivateFieldGet(this, _OpenLVProvider_accounts, "f"))) {
106
+ __classPrivateFieldSet(this, _OpenLVProvider_accounts, newAccounts, "f");
107
+ this.emit('accountsChanged', newAccounts);
108
+ }
109
+ }
110
+ return response;
111
+ }
112
+ // For incoming requests, return a default response
113
+ return { status: 'received' };
114
+ });
115
+ await __classPrivateFieldGet(this, _OpenLVProvider_conn, "f").connectToSession(uri);
116
+ }
117
+ disconnect() {
118
+ __classPrivateFieldGet(this, _OpenLVProvider_conn, "f")?.disconnect();
119
+ __classPrivateFieldSet(this, _OpenLVProvider_isConnected, false, "f");
120
+ const oldAccounts = __classPrivateFieldGet(this, _OpenLVProvider_accounts, "f");
121
+ __classPrivateFieldSet(this, _OpenLVProvider_accounts, [], "f");
122
+ // Emit account change event if there were accounts
123
+ if (oldAccounts.length > 0) {
124
+ this.emit('accountsChanged', []);
125
+ }
126
+ this.emit('disconnect');
127
+ }
128
+ async request(params) {
129
+ if (!__classPrivateFieldGet(this, _OpenLVProvider_conn, "f")) {
130
+ throw new Error('Connection not established');
131
+ }
132
+ // Convert to JSON-RPC request format
133
+ const jsonRpcRequest = {
134
+ jsonrpc: '2.0',
135
+ id: Date.now(),
136
+ method: params.method,
137
+ params: params.params ? Array.from(params.params) : [],
138
+ };
139
+ console.log('Provider: Sending request:', jsonRpcRequest);
140
+ // Send the request
141
+ await __classPrivateFieldGet(this, _OpenLVProvider_conn, "f").sendMessage(jsonRpcRequest);
142
+ // For some methods, we can return immediately or simulate responses
143
+ switch (params.method) {
144
+ case 'eth_requestAccounts':
145
+ // This will be handled by the wallet, so we need to wait for response
146
+ return new Promise((resolve, reject) => {
147
+ const timeout = setTimeout(() => {
148
+ this.removeListener('message', handleResponse);
149
+ console.log('Provider: Request timeout for eth_requestAccounts');
150
+ reject(new Error('Request timeout'));
151
+ }, 30000);
152
+ const handleResponse = (message) => {
153
+ console.log('Provider: Checking response for eth_requestAccounts:', message);
154
+ console.log('Provider: Request ID:', jsonRpcRequest.id, 'Response ID:', message.id);
155
+ console.log('Provider: Response structure:', {
156
+ hasId: 'id' in message,
157
+ hasResult: 'result' in message,
158
+ hasError: 'error' in message,
159
+ hasMethod: 'method' in message,
160
+ resultType: typeof message.result,
161
+ isArray: Array.isArray(message.result),
162
+ resultLength: Array.isArray(message.result)
163
+ ? message.result.length
164
+ : 'N/A',
165
+ });
166
+ // Check if this is the response to our request
167
+ if (message.id === jsonRpcRequest.id) {
168
+ console.log('Provider: ID match - processing response');
169
+ if (message.error) {
170
+ console.log('Provider: Error in response:', message.error);
171
+ clearTimeout(timeout);
172
+ this.removeListener('message', handleResponse);
173
+ reject(new Error(message.error.message));
174
+ }
175
+ else if ('result' in message && Array.isArray(message.result)) {
176
+ // Validate that these are proper Ethereum addresses
177
+ const accounts = message.result;
178
+ const isValidAccounts = accounts.length > 0 &&
179
+ accounts.every((addr) => {
180
+ if (typeof addr !== 'string')
181
+ return false;
182
+ if (!addr.startsWith('0x'))
183
+ return false;
184
+ if (addr.length !== 42)
185
+ return false;
186
+ // Basic hex validation
187
+ return /^0x[0-9a-fA-F]{40}$/.test(addr);
188
+ });
189
+ if (isValidAccounts) {
190
+ console.log('Provider: Valid account array found:', message.result);
191
+ clearTimeout(timeout);
192
+ this.removeListener('message', handleResponse);
193
+ __classPrivateFieldSet(this, _OpenLVProvider_accounts, message.result, "f");
194
+ console.log('Provider: Updated accounts:', __classPrivateFieldGet(this, _OpenLVProvider_accounts, "f"));
195
+ resolve(message.result);
196
+ }
197
+ else {
198
+ console.log('Provider: Invalid addresses in response:', message.result);
199
+ console.log('Provider: Address validation failed - ignoring this response');
200
+ // Don't resolve/reject yet - wait for a valid response
201
+ }
202
+ }
203
+ else if ('result' in message) {
204
+ console.log('Provider: Non-array result found:', message.result);
205
+ // Don't resolve for non-array results like {status: 'processing'}
206
+ // Keep waiting for the actual account array
207
+ console.log('Provider: Waiting for account array response...');
208
+ }
209
+ else {
210
+ console.log('Provider: Invalid response format - missing result');
211
+ console.log('Provider: Full message:', JSON.stringify(message, null, 2));
212
+ // Don't reject immediately - wallet might send another response
213
+ console.log('Provider: Continuing to wait for valid response...');
214
+ }
215
+ }
216
+ else {
217
+ console.log('Provider: Message ID mismatch - ignoring');
218
+ console.log('Provider: Expected:', jsonRpcRequest.id, 'Got:', message.id);
219
+ }
220
+ };
221
+ this.on('message', handleResponse);
222
+ });
223
+ case 'eth_accounts':
224
+ return __classPrivateFieldGet(this, _OpenLVProvider_accounts, "f");
225
+ case 'eth_chainId':
226
+ return `0x${__classPrivateFieldGet(this, _OpenLVProvider_chainId, "f").toString(16)}`;
227
+ case 'wallet_switchEthereumChain': {
228
+ // Handle chain switching
229
+ const chainIdParam = params.params?.[0]?.chainId;
230
+ if (chainIdParam) {
231
+ const newChainId = typeof chainIdParam === 'string'
232
+ ? parseInt(chainIdParam, 16)
233
+ : Number(chainIdParam);
234
+ if (newChainId !== __classPrivateFieldGet(this, _OpenLVProvider_chainId, "f")) {
235
+ __classPrivateFieldSet(this, _OpenLVProvider_chainId, newChainId, "f");
236
+ this.emit('chainChanged', chainIdParam);
237
+ }
238
+ }
239
+ // Continue with the default case to send the request
240
+ return new Promise((resolve, reject) => {
241
+ const timeout = setTimeout(() => {
242
+ this.removeListener('message', handleResponse);
243
+ reject(new Error('Request timeout'));
244
+ }, 10000);
245
+ const handleResponse = (message) => {
246
+ if (message.id === jsonRpcRequest.id) {
247
+ clearTimeout(timeout);
248
+ this.removeListener('message', handleResponse);
249
+ if (message.error) {
250
+ reject(new Error(message.error.message));
251
+ }
252
+ else {
253
+ resolve(message.result);
254
+ }
255
+ }
256
+ };
257
+ this.on('message', handleResponse);
258
+ });
259
+ }
260
+ default:
261
+ // For other methods, wait for response
262
+ return new Promise((resolve, reject) => {
263
+ const timeout = setTimeout(() => {
264
+ this.removeListener('message', handleResponse);
265
+ reject(new Error('Request timeout'));
266
+ }, 10000);
267
+ const handleResponse = (message) => {
268
+ console.log('Provider: Default handler - checking response:', message);
269
+ if (message.id === jsonRpcRequest.id) {
270
+ clearTimeout(timeout);
271
+ this.removeListener('message', handleResponse);
272
+ if (message.error) {
273
+ reject(new Error(message.error.message));
274
+ }
275
+ else {
276
+ resolve(message.result);
277
+ }
278
+ }
279
+ };
280
+ this.on('message', handleResponse);
281
+ });
282
+ }
283
+ }
284
+ }
285
+ _OpenLVProvider_conn = new WeakMap(), _OpenLVProvider_isConnected = new WeakMap(), _OpenLVProvider_accounts = new WeakMap(), _OpenLVProvider_chainId = new WeakMap();
286
+ //# sourceMappingURL=provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.js","sourceRoot":"","sources":["../src/provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import { DecryptionKey, EncryptionKey } from '../encryption/index.js';
2
+ import { SignalingMode, SignalLayerCreator } from '../signaling/index.js';
3
+ type Hex<L> = string;
4
+ /**
5
+ * The parameters from the connection url
6
+ */
7
+ export type SessionHandshakeParameters = {
8
+ sessionId: Hex<16>;
9
+ h: Hex<16>;
10
+ k: Hex<16>;
11
+ p: string;
12
+ s: string;
13
+ };
14
+ /**
15
+ * The parameters that describe a session
16
+ * these can be used to restart a session
17
+ */
18
+ export type SessionConnectionParameters = SessionHandshakeParameters & {
19
+ relyingPublicKey: EncryptionKey;
20
+ encryptionKey: EncryptionKey;
21
+ decryptionKey: DecryptionKey;
22
+ };
23
+ export type SessionState = 'create' | 'handshake' | 'signaling' | 'encrypted' | 'connected';
24
+ export type Session = {
25
+ getState(): {
26
+ state: SessionState;
27
+ signaling?: {
28
+ state: SignalingMode;
29
+ };
30
+ };
31
+ getHandshakeParameters(): SessionHandshakeParameters;
32
+ connect(): Promise<void>;
33
+ };
34
+ export type SessionCreationParameters = Pick<SessionHandshakeParameters, 'p' | 's'>;
35
+ export type SessionParameters = SessionConnectionParameters | SessionHandshakeParameters | SessionCreationParameters;
36
+ export declare const createSession: (initParameters: SessionParameters, signalLayer: SignalLayerCreator) => Promise<Session>;
37
+ /**
38
+ * Connect to a session from its openlv:// URL
39
+ */
40
+ export declare const connectSession: (connectionUrl: string) => Promise<Session>;
@@ -0,0 +1,95 @@
1
+ import { deriveSymmetricKey, generateHandshakeKey } from '../encryption/handshake.js';
2
+ import { initHash } from '../encryption/hash.js';
3
+ import { initEncryptionKeys, parseEncryptionKey, } from '../encryption/index.js';
4
+ import { generateSessionId } from '../encryption/random.js';
5
+ import { mqtt } from '../signaling/mqtt/index.js';
6
+ import { ntfy } from '../signaling/ntfy/index.js';
7
+ import { decodeConnectionURL } from '../utils/url.js';
8
+ export const createSession = async (initParameters, signalLayer) => {
9
+ const sessionId = 'sessionId' in initParameters ? initParameters.sessionId : generateSessionId();
10
+ const { encryptionKey, decryptionKey } = await initEncryptionKeys(initParameters);
11
+ let relyingPublicKey;
12
+ const handshakeKey = 'k' in initParameters
13
+ ? await deriveSymmetricKey(initParameters.k)
14
+ : await generateHandshakeKey();
15
+ const { hash, isHost } = await initHash('h' in initParameters ? initParameters.h : undefined, encryptionKey);
16
+ const state = 'handshake';
17
+ const protocol = initParameters.p;
18
+ const server = initParameters.s;
19
+ const signaling = await signalLayer({ topic: sessionId, url: server });
20
+ const signal = await signaling({
21
+ h: hash,
22
+ canEncrypt() {
23
+ return relyingPublicKey !== undefined;
24
+ },
25
+ async encrypt(message) {
26
+ if (!relyingPublicKey) {
27
+ throw new Error('Relying party public key not found');
28
+ }
29
+ console.log('encrypting to ' + relyingPublicKey.toString());
30
+ return await relyingPublicKey.encrypt(message);
31
+ },
32
+ async decrypt(message) {
33
+ if (!decryptionKey) {
34
+ throw new Error('Decryption key not found');
35
+ }
36
+ return await decryptionKey.decrypt(message);
37
+ },
38
+ publicKey: encryptionKey,
39
+ sessionId,
40
+ k: handshakeKey,
41
+ async rpDiscovered(rpKey) {
42
+ const role = isHost ? 'host' : 'client';
43
+ console.log('rpKey discovered by ' + role, rpKey);
44
+ relyingPublicKey = await parseEncryptionKey(rpKey);
45
+ },
46
+ isHost,
47
+ });
48
+ // let transport: TransportLayer | undefined;
49
+ return {
50
+ connect: async () => {
51
+ console.log('connecting to session, isHost:', isHost);
52
+ // TODO: implement
53
+ console.log('connecting to session');
54
+ await signal.setup();
55
+ signal.subscribe((message) => {
56
+ console.log('Session: received message from signaling', message);
57
+ });
58
+ },
59
+ getState() {
60
+ return { state, signaling: signal.getState() };
61
+ },
62
+ getHandshakeParameters() {
63
+ return {
64
+ sessionId,
65
+ h: hash,
66
+ k: handshakeKey.toString(),
67
+ p: protocol,
68
+ s: server,
69
+ };
70
+ },
71
+ // getAsParameters() {
72
+ // return {
73
+ // ...initParameters,
74
+ // relyingPublicKey,
75
+ // encryptionKey,
76
+ // decryptionKey,
77
+ // };
78
+ // },
79
+ };
80
+ };
81
+ /**
82
+ * Connect to a session from its openlv:// URL
83
+ */
84
+ export const connectSession = async (connectionUrl) => {
85
+ const initParameters = decodeConnectionURL(connectionUrl);
86
+ const signaling = {
87
+ mqtt: mqtt,
88
+ ntfy: ntfy,
89
+ }[initParameters.p];
90
+ if (!signaling) {
91
+ throw new Error(`Invalid signaling protocol: ${initParameters.p}`);
92
+ }
93
+ return createSession(initParameters, signaling);
94
+ };
95
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/session/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,32 @@
1
+ import { describe, expect, test } from 'vitest';
2
+ import { ntfy } from '../signaling/ntfy/index.js';
3
+ import { decodeConnectionURL, encodeConnectionURL } from '../utils/url.js';
4
+ import { connectSession, createSession } from './index.js';
5
+ describe('Session', () => {
6
+ test('Should be able to create a session', async () => {
7
+ const sessionA = await createSession({
8
+ sessionId: 'mytestsession111',
9
+ p: 'ntfy',
10
+ s: 'https://ntfy.sh/',
11
+ }, ntfy);
12
+ expect(sessionA).toBeDefined();
13
+ console.log(sessionA.getState());
14
+ await sessionA.connect();
15
+ const handshakeParametersA = sessionA.getHandshakeParameters();
16
+ const encodedUrl = encodeConnectionURL(handshakeParametersA);
17
+ console.log(encodedUrl);
18
+ const decodedUrl = decodeConnectionURL(encodedUrl);
19
+ expect(decodedUrl).toEqual(handshakeParametersA);
20
+ //
21
+ await new Promise((resolve) => setTimeout(resolve, 1000));
22
+ console.log('Connecting to session B');
23
+ const sessionB = await connectSession(encodedUrl);
24
+ console.log(sessionB.getState());
25
+ await sessionB.connect();
26
+ await new Promise((resolve) => setTimeout(resolve, 3000));
27
+ //
28
+ console.log('A', sessionA.getState());
29
+ console.log('B', sessionB.getState());
30
+ });
31
+ });
32
+ //# sourceMappingURL=index.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../src/session/index.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAEhD,OAAO,EAAE,IAAI,EAAE,MAAM,4BAA4B,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAC3E,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3D,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE;IACrB,IAAI,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;QAClD,MAAM,QAAQ,GAAG,MAAM,aAAa,CAChC;YACI,SAAS,EAAE,kBAAkB;YAC7B,CAAC,EAAE,MAAM;YACT,CAAC,EAAE,kBAAkB;SACxB,EACD,IAAI,CACP,CAAC;QAEF,MAAM,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;QAEjC,MAAM,QAAQ,CAAC,OAAO,EAAE,CAAC;QAEzB,MAAM,oBAAoB,GAAG,QAAQ,CAAC,sBAAsB,EAAE,CAAC;QAC/D,MAAM,UAAU,GAAG,mBAAmB,CAAC,oBAAoB,CAAC,CAAC;QAE7D,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAExB,MAAM,UAAU,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;QAEnD,MAAM,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;QAEjD,EAAE;QACF,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;QAE1D,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;QAEvC,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,UAAU,CAAC,CAAC;QAElD,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;QACjC,MAAM,QAAQ,CAAC,OAAO,EAAE,CAAC;QAEzB,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;QAE1D,EAAE;QACF,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { MaybePromise } from 'viem';
2
+ import { SignalingLayer } from './index.js';
3
+ export type SignalBaseProperties = {
4
+ topic: string;
5
+ url: string;
6
+ };
7
+ export type SignalingBaseLayer = {
8
+ type: string;
9
+ setup: () => MaybePromise<void>;
10
+ teardown: () => MaybePromise<void>;
11
+ publish: (payload: string) => MaybePromise<void>;
12
+ subscribe: (handler: (payload: string) => void) => MaybePromise<void>;
13
+ };
14
+ export type SignalLayerCreator = (properties: SignalBaseProperties) => MaybePromise<SignalingLayer>;
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/signaling/base.ts"],"names":[],"mappings":""}
@@ -0,0 +1,28 @@
1
+ import { MaybePromise } from 'viem';
2
+ import { SymmetricKey } from '../encryption/handshake.js';
3
+ import { EncryptionKey } from '../encryption/index.js';
4
+ import { SignalingBaseLayer } from './base.js';
5
+ export type SignalingProperties = {
6
+ isHost: boolean;
7
+ h: string;
8
+ k?: SymmetricKey;
9
+ rpDiscovered: (rpKey: string) => MaybePromise<void>;
10
+ decrypt: (message: string) => MaybePromise<string>;
11
+ encrypt: (message: string) => MaybePromise<string>;
12
+ publicKey: EncryptionKey;
13
+ canEncrypt: () => boolean;
14
+ };
15
+ export type SignalingLayer = (properties: SignalingProperties) => Promise<{
16
+ type: string;
17
+ send: (message: object) => MaybePromise<void>;
18
+ subscribe: (handler: (message: object) => void) => MaybePromise<void>;
19
+ setup: () => MaybePromise<void>;
20
+ teardown: () => MaybePromise<void>;
21
+ getState: () => {
22
+ state: SignalingMode;
23
+ };
24
+ }>;
25
+ export declare const XR_PREFIX = "x";
26
+ export declare const XR_H_PREFIX = "h";
27
+ export type SignalingMode = 'handshake-open' | 'handshaking' | 'handshake-closed' | 'xr-encrypted' | 'connecting' | 'disconnected';
28
+ export declare const createSignalingLayer: (init: SignalingBaseLayer) => SignalingLayer;