@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.
- package/dist/__tests__/client.test.d.ts +2 -0
- package/dist/__tests__/client.test.d.ts.map +1 -0
- package/dist/__tests__/client.test.js +81 -0
- package/dist/__tests__/heartbeat.test.d.ts +2 -0
- package/dist/__tests__/heartbeat.test.d.ts.map +1 -0
- package/dist/__tests__/heartbeat.test.js +37 -0
- package/dist/__tests__/protocol.test.d.ts +2 -0
- package/dist/__tests__/protocol.test.d.ts.map +1 -0
- package/dist/__tests__/protocol.test.js +37 -0
- package/dist/__tests__/rpc-peer.test.d.ts +2 -0
- package/dist/__tests__/rpc-peer.test.d.ts.map +1 -0
- package/dist/__tests__/rpc-peer.test.js +127 -0
- package/dist/client.d.ts +7 -14
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +96 -42
- package/dist/errors.d.ts +5 -0
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +23 -0
- package/dist/heartbeat.d.ts +13 -0
- package/dist/heartbeat.d.ts.map +1 -0
- package/dist/heartbeat.js +49 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/protocol.d.ts +51 -0
- package/dist/protocol.d.ts.map +1 -0
- package/dist/protocol.js +132 -0
- package/dist/rpc-peer.d.ts +28 -0
- package/dist/rpc-peer.d.ts.map +1 -0
- package/dist/rpc-peer.js +146 -0
- package/dist/server.d.ts +1 -20
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +122 -71
- package/dist/shared/test-collector.d.ts +2 -0
- package/dist/shared/test-collector.d.ts.map +1 -1
- package/dist/shared/test-runner.d.ts +13 -0
- package/dist/shared/test-runner.d.ts.map +1 -1
- package/dist/shared.d.ts +0 -2
- package/dist/shared.d.ts.map +1 -1
- package/dist/transport.d.ts +22 -0
- package/dist/transport.d.ts.map +1 -0
- package/dist/transport.js +22 -0
- package/dist/tsconfig.lib.tsbuildinfo +1 -1
- package/dist/websocket-client-transport.d.ts +3 -0
- package/dist/websocket-client-transport.d.ts.map +1 -0
- package/dist/websocket-client-transport.js +45 -0
- package/dist/websocket-server-transport.d.ts +4 -0
- package/dist/websocket-server-transport.d.ts.map +1 -0
- package/dist/websocket-server-transport.js +43 -0
- package/eslint.config.mjs +5 -1
- package/package.json +6 -5
- package/src/__tests__/client.test.ts +99 -0
- package/src/__tests__/heartbeat.test.ts +47 -0
- package/src/__tests__/protocol.test.ts +51 -0
- package/src/__tests__/rpc-peer.test.ts +181 -0
- package/src/client.ts +146 -57
- package/src/errors.ts +32 -0
- package/src/heartbeat.ts +67 -0
- package/src/index.ts +1 -0
- package/src/protocol.ts +233 -0
- package/src/rpc-peer.ts +222 -0
- package/src/server.ts +179 -114
- package/src/shared/test-collector.ts +3 -0
- package/src/shared/test-runner.ts +14 -0
- package/src/shared.ts +0 -2
- package/src/transport.ts +47 -0
- package/src/websocket-client-transport.ts +85 -0
- package/src/websocket-server-transport.ts +54 -0
- 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 {
|
|
11
|
-
import {
|
|
9
|
+
import { AppBridgeDisconnectedError, DeviceNotRespondingError, } from './errors.js';
|
|
10
|
+
import { createHeartbeat } from './heartbeat.js';
|
|
12
11
|
import { matchImageSnapshot } from './image-snapshot.js';
|
|
13
|
-
|
|
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, ...
|
|
43
|
-
const wss = await createWss(
|
|
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
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
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
|
-
|
|
67
|
-
|
|
71
|
+
transport: createRpcTransport(transport),
|
|
72
|
+
onEvent: (event) => {
|
|
73
|
+
emitter.emit('event', event);
|
|
68
74
|
},
|
|
69
|
-
|
|
70
|
-
|
|
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
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
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
|
-
|
|
103
|
-
|
|
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
|
|
116
|
-
|
|
106
|
+
rpc.close(reason ?? new AppBridgeDisconnectedError('app-disconnected'));
|
|
107
|
+
closeTransport();
|
|
108
|
+
if (readyConnection) {
|
|
109
|
+
emitter.emit('disconnected');
|
|
110
|
+
}
|
|
117
111
|
};
|
|
118
|
-
|
|
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
|
-
|
|
122
|
-
disconnect(error instanceof 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
|
|
207
|
+
reject(new AppBridgeDisconnectedError('bridge-disposed'));
|
|
159
208
|
}
|
|
160
|
-
|
|
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;
|
|
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;
|
|
1
|
+
{"version":3,"file":"test-runner.d.ts","sourceRoot":"","sources":["../../src/shared/test-runner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE/D,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;IACb,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,mBAAmB,CAAC;CACvC,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,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,mBAAmB,CAAC;IACtC,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;IACjB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,mBAAmB,CAAC;CACvC,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"}
|
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;
|
package/dist/shared.d.ts.map
CHANGED
|
@@ -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
|
+
};
|