@react-native-harness/bridge 1.3.0 → 1.4.0-rc.1

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 (69) hide show
  1. package/dist/__tests__/client.test.d.ts +2 -0
  2. package/dist/__tests__/client.test.d.ts.map +1 -0
  3. package/dist/__tests__/client.test.js +81 -0
  4. package/dist/__tests__/heartbeat.test.d.ts +2 -0
  5. package/dist/__tests__/heartbeat.test.d.ts.map +1 -0
  6. package/dist/__tests__/heartbeat.test.js +37 -0
  7. package/dist/__tests__/protocol.test.d.ts +2 -0
  8. package/dist/__tests__/protocol.test.d.ts.map +1 -0
  9. package/dist/__tests__/protocol.test.js +37 -0
  10. package/dist/__tests__/rpc-peer.test.d.ts +2 -0
  11. package/dist/__tests__/rpc-peer.test.d.ts.map +1 -0
  12. package/dist/__tests__/rpc-peer.test.js +127 -0
  13. package/dist/client.d.ts +7 -14
  14. package/dist/client.d.ts.map +1 -1
  15. package/dist/client.js +96 -42
  16. package/dist/errors.d.ts +5 -0
  17. package/dist/errors.d.ts.map +1 -1
  18. package/dist/errors.js +23 -0
  19. package/dist/heartbeat.d.ts +13 -0
  20. package/dist/heartbeat.d.ts.map +1 -0
  21. package/dist/heartbeat.js +49 -0
  22. package/dist/index.d.ts +1 -0
  23. package/dist/index.d.ts.map +1 -1
  24. package/dist/index.js +1 -0
  25. package/dist/protocol.d.ts +51 -0
  26. package/dist/protocol.d.ts.map +1 -0
  27. package/dist/protocol.js +132 -0
  28. package/dist/rpc-peer.d.ts +28 -0
  29. package/dist/rpc-peer.d.ts.map +1 -0
  30. package/dist/rpc-peer.js +146 -0
  31. package/dist/server.d.ts +1 -20
  32. package/dist/server.d.ts.map +1 -1
  33. package/dist/server.js +122 -71
  34. package/dist/shared/test-collector.d.ts +2 -0
  35. package/dist/shared/test-collector.d.ts.map +1 -1
  36. package/dist/shared/test-runner.d.ts +13 -0
  37. package/dist/shared/test-runner.d.ts.map +1 -1
  38. package/dist/shared.d.ts +0 -2
  39. package/dist/shared.d.ts.map +1 -1
  40. package/dist/transport.d.ts +22 -0
  41. package/dist/transport.d.ts.map +1 -0
  42. package/dist/transport.js +22 -0
  43. package/dist/tsconfig.lib.tsbuildinfo +1 -1
  44. package/dist/websocket-client-transport.d.ts +3 -0
  45. package/dist/websocket-client-transport.d.ts.map +1 -0
  46. package/dist/websocket-client-transport.js +45 -0
  47. package/dist/websocket-server-transport.d.ts +4 -0
  48. package/dist/websocket-server-transport.d.ts.map +1 -0
  49. package/dist/websocket-server-transport.js +43 -0
  50. package/eslint.config.mjs +5 -1
  51. package/package.json +6 -5
  52. package/src/__tests__/client.test.ts +99 -0
  53. package/src/__tests__/heartbeat.test.ts +47 -0
  54. package/src/__tests__/protocol.test.ts +51 -0
  55. package/src/__tests__/rpc-peer.test.ts +181 -0
  56. package/src/client.ts +146 -57
  57. package/src/errors.ts +32 -0
  58. package/src/heartbeat.ts +67 -0
  59. package/src/index.ts +1 -0
  60. package/src/protocol.ts +233 -0
  61. package/src/rpc-peer.ts +222 -0
  62. package/src/server.ts +179 -114
  63. package/src/shared/test-collector.ts +3 -0
  64. package/src/shared/test-runner.ts +14 -0
  65. package/src/shared.ts +0 -2
  66. package/src/transport.ts +47 -0
  67. package/src/websocket-client-transport.ts +85 -0
  68. package/src/websocket-server-transport.ts +54 -0
  69. package/vite.config.ts +18 -0
package/dist/server.js CHANGED
@@ -1,5 +1,4 @@
1
1
  import { WebSocketServer } from 'ws';
2
- import { createBirpc } from 'birpc';
3
2
  import { EventEmitter } from 'node:events';
4
3
  import fs from 'node:fs/promises';
5
4
  import os from 'node:os';
@@ -7,14 +6,16 @@ import path from 'node:path';
7
6
  import { randomUUID } from 'node:crypto';
8
7
  import { logger } from '@react-native-harness/tools';
9
8
  import { BinaryStore, parseBinaryFrame } from './binary-transfer.js';
10
- import { deserialize, serialize } from './serializer.js';
11
- import { DeviceNotRespondingError } from './errors.js';
9
+ import { AppBridgeDisconnectedError, DeviceNotRespondingError, } from './errors.js';
10
+ import { createHeartbeat } from './heartbeat.js';
12
11
  import { matchImageSnapshot } from './image-snapshot.js';
13
- export { DeviceNotRespondingError } from './errors.js';
12
+ import { serializeBridgeMessage } from './protocol.js';
13
+ import { createRpcPeer } from './rpc-peer.js';
14
+ import { createRpcTransport, } from './transport.js';
15
+ import { createNodeWebSocketTransport } from './websocket-server-transport.js';
16
+ export { AppBridgeDisconnectedError, DeviceNotRespondingError, } from './errors.js';
14
17
  const bridgeLogger = logger.child('bridge');
15
- // ---------------------------------------------------------------------------
16
- // Helpers
17
- // ---------------------------------------------------------------------------
18
+ const noop = () => undefined;
18
19
  const createWss = (transport) => {
19
20
  if ('port' in transport) {
20
21
  return new Promise((resolve) => {
@@ -35,91 +36,141 @@ const receiveScreenshot = async (binaryStore, reference) => {
35
36
  await fs.writeFile(file, data);
36
37
  return { path: file };
37
38
  };
38
- // ---------------------------------------------------------------------------
39
- // Factory
40
- // ---------------------------------------------------------------------------
41
39
  export const createHarnessBridge = async (options) => {
42
- const { timeout, context, ...transport } = options;
43
- const wss = await createWss(transport);
40
+ const { timeout, context, ...transportOptions } = options;
41
+ const wss = await createWss(transportOptions);
44
42
  bridgeLogger.debug('bridge server ready');
45
43
  const emitter = new EventEmitter();
46
44
  let currentConnection = null;
45
+ let activeSession = null;
47
46
  const connectionWaiters = [];
48
47
  wss.on('connection', (ws) => {
48
+ if (activeSession) {
49
+ bridgeLogger.info('replacing existing app connection with a newer client');
50
+ activeSession.disconnect(new AppBridgeDisconnectedError('app-replaced'));
51
+ }
49
52
  bridgeLogger.debug('app connected');
53
+ const transport = createNodeWebSocketTransport(ws);
50
54
  const binaryStore = new BinaryStore();
51
55
  let readyConnection = null;
52
56
  let disconnected = false;
53
- const serverFunctions = {
54
- reportReady: (device) => {
55
- const conn = {
56
- device,
57
- runTests: (testPath, opts) => rpc.runTests(testPath, opts),
58
- };
59
- readyConnection = conn;
60
- currentConnection = conn;
61
- bridgeLogger.debug('app ready: platform=%s model=%s', device.platform, device.model);
62
- emitter.emit('connected', conn);
63
- for (const { resolve } of connectionWaiters.splice(0))
64
- resolve(conn);
57
+ let offMessage = noop;
58
+ let offClose = noop;
59
+ let offError = noop;
60
+ const closeTransport = () => {
61
+ if (transport.state === 'closing' || transport.state === 'closed') {
62
+ return;
63
+ }
64
+ transport.close(1012);
65
+ };
66
+ const rpc = createRpcPeer({
67
+ localMethods: {
68
+ 'device.screenshot.receive': (ref) => receiveScreenshot(binaryStore, ref),
69
+ 'test.matchImageSnapshot': (screenshot, testPath, opts) => matchImageSnapshot(screenshot, testPath, opts, context.platform.name),
65
70
  },
66
- emitEvent: (_, data) => {
67
- emitter.emit('event', data);
71
+ transport: createRpcTransport(transport),
72
+ onEvent: (event) => {
73
+ emitter.emit('event', event);
68
74
  },
69
- 'device.screenshot.receive': (ref) => receiveScreenshot(binaryStore, ref),
70
- 'test.matchImageSnapshot': (screenshot, testPath, opts) => matchImageSnapshot(screenshot, testPath, opts, context.platform.name),
71
- };
72
- const rpc = createBirpc(serverFunctions, {
73
- post: (data) => ws.send(data),
74
- on: (handler) => {
75
- ws.on('message', (msg, isBinary) => {
76
- if (isBinary) {
77
- try {
78
- const messageBuffer = Array.isArray(msg)
79
- ? Buffer.concat(msg)
80
- : Buffer.isBuffer(msg)
81
- ? msg
82
- : Buffer.from(msg);
83
- const { transferId, data } = parseBinaryFrame(new Uint8Array(messageBuffer));
84
- binaryStore.add(transferId, data);
85
- }
86
- catch (err) {
87
- bridgeLogger.warn('failed to parse binary frame: %s', err);
88
- }
89
- }
90
- else {
91
- handler(msg.toString());
92
- }
93
- });
75
+ callTimeoutMs: timeout,
76
+ createTimeoutError: (functionName, args) => {
77
+ return new DeviceNotRespondingError(functionName, args);
94
78
  },
95
- serialize,
96
- deserialize,
97
- timeout,
98
- onFunctionError: (error, functionName, args) => {
99
- bridgeLogger.error('rpc function failed: %s args=%o', functionName, args);
100
- throw error;
79
+ });
80
+ const heartbeat = createHeartbeat({
81
+ sendPing: (id) => {
82
+ transport.send(serializeBridgeMessage({ type: 'ping', id }));
101
83
  },
102
- onTimeoutError: (fn, args) => {
103
- throw new DeviceNotRespondingError(fn, args);
84
+ onTimeout: () => {
85
+ bridgeLogger.warn('app heartbeat timed out');
86
+ disconnect(new AppBridgeDisconnectedError('heartbeat-timeout'));
104
87
  },
105
88
  });
106
89
  const disconnect = (reason) => {
107
- if (disconnected)
90
+ if (disconnected) {
108
91
  return;
92
+ }
109
93
  disconnected = true;
94
+ offMessage();
95
+ offClose();
96
+ offError();
110
97
  bridgeLogger.debug('app disconnected');
98
+ heartbeat.dispose();
111
99
  binaryStore.dispose();
100
+ if (activeSession?.transport === transport) {
101
+ activeSession = null;
102
+ }
112
103
  if (currentConnection === readyConnection) {
113
104
  currentConnection = null;
114
105
  }
115
- rpc.$close(reason ?? new Error('App bridge disconnected'));
116
- emitter.emit('disconnected');
106
+ rpc.close(reason ?? new AppBridgeDisconnectedError('app-disconnected'));
107
+ closeTransport();
108
+ if (readyConnection) {
109
+ emitter.emit('disconnected');
110
+ }
117
111
  };
118
- ws.on('close', () => {
112
+ activeSession = { disconnect, transport };
113
+ const handleControlMessage = async (message) => {
114
+ const controlMessage = await rpc.handleMessage(message);
115
+ if (!controlMessage) {
116
+ return;
117
+ }
118
+ switch (controlMessage.type) {
119
+ case 'ready': {
120
+ if (readyConnection) {
121
+ return;
122
+ }
123
+ const conn = {
124
+ device: controlMessage.device,
125
+ runTests: (testPath, opts) => rpc.invoke('runTests', testPath, opts),
126
+ };
127
+ readyConnection = conn;
128
+ currentConnection = conn;
129
+ bridgeLogger.debug('app ready: platform=%s model=%s', controlMessage.device.platform, controlMessage.device.model);
130
+ emitter.emit('connected', conn);
131
+ for (const { resolve } of connectionWaiters.splice(0)) {
132
+ resolve(conn);
133
+ }
134
+ return;
135
+ }
136
+ case 'ping': {
137
+ transport.send(serializeBridgeMessage({ type: 'pong', id: controlMessage.id }));
138
+ return;
139
+ }
140
+ case 'pong': {
141
+ heartbeat.notifyPong(controlMessage.id);
142
+ return;
143
+ }
144
+ }
145
+ };
146
+ const handleBinaryMessage = (message) => {
147
+ try {
148
+ const { transferId, data } = parseBinaryFrame(message);
149
+ binaryStore.add(transferId, data);
150
+ }
151
+ catch (error) {
152
+ bridgeLogger.warn('failed to parse binary frame: %s', error);
153
+ }
154
+ };
155
+ offMessage = transport.onMessage((message) => {
156
+ if (typeof message !== 'string') {
157
+ handleBinaryMessage(message);
158
+ return;
159
+ }
160
+ void handleControlMessage(message).catch((error) => {
161
+ bridgeLogger.warn('failed to handle bridge message: %s', error);
162
+ disconnect(error instanceof Error
163
+ ? error
164
+ : new Error('Received invalid app bridge message'));
165
+ });
166
+ });
167
+ offClose = transport.onClose(() => {
119
168
  disconnect();
120
169
  });
121
- ws.on('error', (error) => {
122
- disconnect(error instanceof Error ? error : new Error('App bridge socket error'));
170
+ offError = transport.onError((error) => {
171
+ disconnect(error instanceof Error
172
+ ? error
173
+ : new AppBridgeDisconnectedError('socket-error'));
123
174
  });
124
175
  });
125
176
  return {
@@ -133,9 +184,6 @@ export const createHarnessBridge = async (options) => {
133
184
  if (signal?.aborted) {
134
185
  return Promise.reject(signal.reason ?? new DOMException('Aborted', 'AbortError'));
135
186
  }
136
- // If the app already connected before this call (e.g. fast simulator
137
- // startup between startAttempt and waitForReady), return it immediately
138
- // rather than waiting for a second reportReady that will never come.
139
187
  if (currentConnection) {
140
188
  return Promise.resolve(currentConnection);
141
189
  }
@@ -144,8 +192,9 @@ export const createHarnessBridge = async (options) => {
144
192
  connectionWaiters.push(entry);
145
193
  signal?.addEventListener('abort', () => {
146
194
  const idx = connectionWaiters.indexOf(entry);
147
- if (idx !== -1)
195
+ if (idx !== -1) {
148
196
  connectionWaiters.splice(idx, 1);
197
+ }
149
198
  reject(signal.reason ?? new DOMException('Aborted', 'AbortError'));
150
199
  }, { once: true });
151
200
  });
@@ -155,10 +204,12 @@ export const createHarnessBridge = async (options) => {
155
204
  dispose: () => {
156
205
  bridgeLogger.debug('disposing bridge');
157
206
  for (const { reject } of connectionWaiters.splice(0)) {
158
- reject(new Error('Bridge disposed'));
207
+ reject(new AppBridgeDisconnectedError('bridge-disposed'));
159
208
  }
160
- for (const client of wss.clients)
209
+ activeSession?.disconnect(new AppBridgeDisconnectedError('bridge-disposed'));
210
+ for (const client of wss.clients) {
161
211
  client.terminate();
212
+ }
162
213
  wss.close();
163
214
  emitter.removeAllListeners();
164
215
  },
@@ -1,11 +1,13 @@
1
1
  import type { HarnessTestContext } from './test-context.js';
2
2
  export type TestStatus = 'active' | 'skipped' | 'todo';
3
+ export type TestDeclarationMode = 'only' | 'skip' | 'todo';
3
4
  export type TestFn = (context: HarnessTestContext) => void | Promise<void>;
4
5
  export type SuiteHookFn = () => void | Promise<void>;
5
6
  export type TestCase = {
6
7
  name: string;
7
8
  fn: TestFn;
8
9
  status: TestStatus;
10
+ declarationMode?: TestDeclarationMode;
9
11
  };
10
12
  export type TestSuite = {
11
13
  name: string;
@@ -1 +1 @@
1
- {"version":3,"file":"test-collector.d.ts","sourceRoot":"","sources":["../../src/shared/test-collector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAE5D,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAC;AAEvD,MAAM,MAAM,MAAM,GAAG,CAAC,OAAO,EAAE,kBAAkB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAE3E,MAAM,MAAM,WAAW,GAAG,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAErD,MAAM,MAAM,QAAQ,GAAG;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,UAAU,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,SAAS,EAAE,WAAW,EAAE,CAAC;IACzB,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,SAAS,EAAE,SAAS,CAAC;IACrB,uFAAuF;IACvF,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG;IACvC,IAAI,EAAE,oBAAoB,CAAC;IAC3B,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG;IACxC,IAAI,EAAE,qBAAqB,CAAC;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAC3B,0BAA0B,GAC1B,2BAA2B,CAAC"}
1
+ {"version":3,"file":"test-collector.d.ts","sourceRoot":"","sources":["../../src/shared/test-collector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAE5D,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAC;AAEvD,MAAM,MAAM,mBAAmB,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAE3D,MAAM,MAAM,MAAM,GAAG,CAAC,OAAO,EAAE,kBAAkB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAE3E,MAAM,MAAM,WAAW,GAAG,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAErD,MAAM,MAAM,QAAQ,GAAG;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,UAAU,CAAC;IACnB,eAAe,CAAC,EAAE,mBAAmB,CAAC;CACvC,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,SAAS,EAAE,WAAW,EAAE,CAAC;IACzB,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,SAAS,EAAE,SAAS,CAAC;IACrB,uFAAuF;IACvF,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG;IACvC,IAAI,EAAE,oBAAoB,CAAC;IAC3B,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG;IACxC,IAAI,EAAE,qBAAqB,CAAC;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAC3B,0BAA0B,GAC1B,2BAA2B,CAAC"}
@@ -1,3 +1,4 @@
1
+ import type { TestDeclarationMode } from './test-collector.js';
1
2
  export type CodeFrame = {
2
3
  content: string;
3
4
  location?: {
@@ -31,12 +32,20 @@ export type TestRunnerTestStartedEvent = {
31
32
  name: string;
32
33
  suite: string;
33
34
  file: string;
35
+ ancestorTitles: string[];
36
+ fullName: string;
37
+ startedAt: number;
38
+ declarationMode?: TestDeclarationMode;
34
39
  };
35
40
  export type TestRunnerTestFinishedEvent = {
36
41
  type: 'test-finished';
37
42
  name: string;
38
43
  suite: string;
39
44
  file: string;
45
+ ancestorTitles: string[];
46
+ fullName: string;
47
+ startedAt: number;
48
+ declarationMode?: TestDeclarationMode;
40
49
  duration: number;
41
50
  error?: SerializedError;
42
51
  status: TestResultStatus;
@@ -55,6 +64,10 @@ export type TestResult = {
55
64
  status: TestResultStatus;
56
65
  error?: SerializedError;
57
66
  duration: number;
67
+ ancestorTitles?: string[];
68
+ fullName?: string;
69
+ startedAt?: number;
70
+ declarationMode?: TestDeclarationMode;
58
71
  };
59
72
  export type TestSuiteResult = {
60
73
  name: string;
@@ -1 +1 @@
1
- {"version":3,"file":"test-runner.d.ts","sourceRoot":"","sources":["../../src/shared/test-runner.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,GAAG;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE;QACT,GAAG,EAAE,MAAM,CAAC;QACZ,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAC;AAExE,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG;IACvC,IAAI,EAAE,cAAc,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG;IACxC,IAAI,EAAE,eAAe,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG;IACxC,IAAI,EAAE,eAAe,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG;IACvC,IAAI,EAAE,cAAc,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG;IACxC,IAAI,EAAE,eAAe,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,eAAe,CAAC;IACxB,MAAM,EAAE,gBAAgB,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,4BAA4B,GAAG;IACzC,IAAI,EAAE,gBAAgB,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,eAAe,CAAC;IACxB,MAAM,EAAE,gBAAgB,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,gBAAgB,GACxB,0BAA0B,GAC1B,2BAA2B,GAC3B,0BAA0B,GAC1B,2BAA2B,GAC3B,2BAA2B,GAC3B,4BAA4B,CAAC;AAEjC,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,gBAAgB,CAAC;IACzB,KAAK,CAAC,EAAE,eAAe,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,MAAM,EAAE,gBAAgB,CAAC;IACzB,KAAK,CAAC,EAAE,eAAe,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC"}
1
+ {"version":3,"file":"test-runner.d.ts","sourceRoot":"","sources":["../../src/shared/test-runner.ts"],"names":[],"mappings":"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"}
package/dist/shared.d.ts CHANGED
@@ -100,8 +100,6 @@ export type BinaryDataReference = {
100
100
  };
101
101
  export type ScreenshotData = BinaryDataReference;
102
102
  export type BridgeServerFunctions = {
103
- reportReady: (device: DeviceDescriptor) => void;
104
- emitEvent: (event: BridgeEvents['type'], data: BridgeEvents) => void;
105
103
  'device.screenshot.receive': (reference: BinaryDataReference, metadata: {
106
104
  width: number;
107
105
  height: number;
@@ -1 +1 @@
1
- {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../src/shared.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../src/shared.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ export type BridgeTransportState = 'connecting' | 'open' | 'closing' | 'closed';
2
+ export type BridgeTransportMessage = string | Uint8Array;
3
+ export type BridgeTransportCloseEvent = {
4
+ code: number;
5
+ reason: string;
6
+ };
7
+ export type BridgeTransport = {
8
+ readonly state: BridgeTransportState;
9
+ send: (message: BridgeTransportMessage) => void;
10
+ close: (code?: number, reason?: string) => void;
11
+ onOpen: (listener: () => void) => () => void;
12
+ onMessage: (listener: (message: BridgeTransportMessage) => void) => () => void;
13
+ onClose: (listener: (event: BridgeTransportCloseEvent) => void) => () => void;
14
+ onError: (listener: (error: Error) => void) => () => void;
15
+ };
16
+ export type RpcTransport = {
17
+ readonly state: BridgeTransportState;
18
+ send: (message: string) => void;
19
+ };
20
+ export declare const toTransportState: (readyState: number) => BridgeTransportState;
21
+ export declare const createRpcTransport: (transport: BridgeTransport) => RpcTransport;
22
+ //# sourceMappingURL=transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,oBAAoB,GAAG,YAAY,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,CAAC;AAEhF,MAAM,MAAM,sBAAsB,GAAG,MAAM,GAAG,UAAU,CAAC;AAEzD,MAAM,MAAM,yBAAyB,GAAG;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,CAAC,KAAK,EAAE,oBAAoB,CAAC;IACrC,IAAI,EAAE,CAAC,OAAO,EAAE,sBAAsB,KAAK,IAAI,CAAC;IAChD,KAAK,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD,MAAM,EAAE,CAAC,QAAQ,EAAE,MAAM,IAAI,KAAK,MAAM,IAAI,CAAC;IAC7C,SAAS,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,sBAAsB,KAAK,IAAI,KAAK,MAAM,IAAI,CAAC;IAC/E,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,yBAAyB,KAAK,IAAI,KAAK,MAAM,IAAI,CAAC;IAC9E,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,KAAK,MAAM,IAAI,CAAC;CAC3D,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,CAAC,KAAK,EAAE,oBAAoB,CAAC;IACrC,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,YAAY,MAAM,KAAG,oBAWrD,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAAI,WAAW,eAAe,KAAG,YAS/D,CAAC"}
@@ -0,0 +1,22 @@
1
+ export const toTransportState = (readyState) => {
2
+ switch (readyState) {
3
+ case 0:
4
+ return 'connecting';
5
+ case 1:
6
+ return 'open';
7
+ case 2:
8
+ return 'closing';
9
+ default:
10
+ return 'closed';
11
+ }
12
+ };
13
+ export const createRpcTransport = (transport) => {
14
+ return {
15
+ get state() {
16
+ return transport.state;
17
+ },
18
+ send: (message) => {
19
+ transport.send(message);
20
+ },
21
+ };
22
+ };