@ledgerhq/speculos-transport 0.1.8-nightly.0

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.
@@ -0,0 +1,69 @@
1
+ /// <reference types="node" />
2
+ import { ChildProcessWithoutNullStreams } from "child_process";
3
+ import { DeviceModelId } from "@ledgerhq/devices";
4
+ import SpeculosTransportHttp from "@ledgerhq/hw-transport-node-speculos-http";
5
+ import SpeculosTransportWebsocket from "@ledgerhq/hw-transport-node-speculos";
6
+ export type SpeculosDevice = {
7
+ transport: SpeculosTransport;
8
+ id: string;
9
+ appPath: string;
10
+ ports: ReturnType<typeof getPorts>;
11
+ };
12
+ export type SpeculosTransport = SpeculosTransportHttp | SpeculosTransportWebsocket;
13
+ export { DeviceModelId };
14
+ export type SpeculosDeviceInternal = {
15
+ process: ChildProcessWithoutNullStreams;
16
+ apduPort: number;
17
+ buttonPort: number;
18
+ automationPort: number;
19
+ transport: SpeculosTransportWebsocket;
20
+ destroy: () => void;
21
+ } | {
22
+ process: ChildProcessWithoutNullStreams;
23
+ apiPort: string | undefined;
24
+ transport: SpeculosTransportHttp;
25
+ destroy: () => void;
26
+ };
27
+ export declare function getMemorySpeculosDeviceInternal(id: string): SpeculosDeviceInternal | undefined;
28
+ export declare const modelMap: Record<string, DeviceModelId>;
29
+ /**
30
+ * Release a speculos device
31
+ */
32
+ export declare function releaseSpeculosDevice(id: string): Promise<void>;
33
+ /**
34
+ * Close all speculos devices
35
+ */
36
+ export declare function closeAllSpeculosDevices(): Promise<void[]>;
37
+ declare const getPorts: (idCounter: number, isSpeculosWebsocket?: boolean) => {
38
+ apduPort: number;
39
+ vncPort: number;
40
+ buttonPort: number;
41
+ automationPort: number;
42
+ apiPort?: undefined;
43
+ } | {
44
+ apiPort: number;
45
+ vncPort: number;
46
+ apduPort?: undefined;
47
+ buttonPort?: undefined;
48
+ automationPort?: undefined;
49
+ };
50
+ interface Dependency {
51
+ name: string;
52
+ appVersion?: string;
53
+ }
54
+ /**
55
+ * instanciate a speculos device that runs through docker
56
+ */
57
+ export declare function createSpeculosDevice(arg: {
58
+ model: DeviceModelId;
59
+ firmware: string;
60
+ appName: string;
61
+ appVersion: string;
62
+ dependency?: string;
63
+ dependencies?: Dependency[];
64
+ seed: string;
65
+ coinapps: string;
66
+ overridesAppPath?: string;
67
+ onSpeculosDeviceCreated?: (device: SpeculosDevice) => Promise<void>;
68
+ }, maxRetry?: number): Promise<SpeculosDevice>;
69
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA,OAAO,EAAe,8BAA8B,EAAE,MAAM,eAAe,CAAC;AAE5E,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,qBAAqB,MAAM,2CAA2C,CAAC;AAC9E,OAAO,0BAA0B,MAAM,sCAAsC,CAAC;AAI9E,MAAM,MAAM,cAAc,GAAG;IAC3B,SAAS,EAAE,iBAAiB,CAAC;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,UAAU,CAAC,OAAO,QAAQ,CAAC,CAAC;CACpC,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG,qBAAqB,GAAG,0BAA0B,CAAC;AAEnF,OAAO,EAAE,aAAa,EAAE,CAAC;AAEzB,MAAM,MAAM,sBAAsB,GAC9B;IACE,OAAO,EAAE,8BAA8B,CAAC;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,0BAA0B,CAAC;IACtC,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,GACD;IACE,OAAO,EAAE,8BAA8B,CAAC;IACxC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,SAAS,EAAE,qBAAqB,CAAC;IACjC,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,CAAC;AAON,wBAAgB,+BAA+B,CAAC,EAAE,EAAE,MAAM,GAAG,sBAAsB,GAAG,SAAS,CAE9F;AAED,eAAO,MAAM,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAKlD,CAAC;AAMF;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,EAAE,EAAE,MAAM,iBAOrD;AAED;;GAEG;AACH,wBAAgB,uBAAuB,oBAEtC;AAmBD,QAAA,MAAM,QAAQ,cAAe,MAAM,wBAAwB,OAAO;;;;;;;;;;;;CAcjE,CAAC;AAWF,UAAU,UAAU;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,GAAG,EAAE;IACH,KAAK,EAAE,aAAa,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,UAAU,EAAE,CAAC;IAC5B,IAAI,EAAE,MAAM,CAAC;IAEb,QAAQ,EAAE,MAAM,CAAC;IAEjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,uBAAuB,CAAC,EAAE,CAAC,MAAM,EAAE,cAAc,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACrE,EACD,QAAQ,SAAI,GACX,OAAO,CAAC,cAAc,CAAC,CAuMzB"}
@@ -0,0 +1,270 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import { spawn, exec } from "child_process";
11
+ import { log } from "@ledgerhq/logs";
12
+ import { DeviceModelId } from "@ledgerhq/devices";
13
+ import SpeculosTransportHttp from "@ledgerhq/hw-transport-node-speculos-http";
14
+ import SpeculosTransportWebsocket from "@ledgerhq/hw-transport-node-speculos";
15
+ import { getEnv } from "@ledgerhq/live-env";
16
+ import { delay } from "@ledgerhq/live-promise";
17
+ export { DeviceModelId };
18
+ // FIXME we need to figure out a better system, using a filesystem file?
19
+ let idCounter;
20
+ const isSpeculosWebsocket = getEnv("SPECULOS_USE_WEBSOCKET");
21
+ const data = {};
22
+ export function getMemorySpeculosDeviceInternal(id) {
23
+ return data[id];
24
+ }
25
+ export const modelMap = {
26
+ nanos: DeviceModelId.nanoS,
27
+ "nanos+": DeviceModelId.nanoSP,
28
+ nanox: DeviceModelId.nanoX,
29
+ blue: DeviceModelId.blue,
30
+ };
31
+ const reverseModelMap = {};
32
+ for (const k in modelMap) {
33
+ reverseModelMap[modelMap[k]] = k;
34
+ }
35
+ /**
36
+ * Release a speculos device
37
+ */
38
+ export function releaseSpeculosDevice(id) {
39
+ return __awaiter(this, void 0, void 0, function* () {
40
+ log("speculos", "release " + id);
41
+ const obj = data[id];
42
+ if (obj) {
43
+ yield obj.destroy();
44
+ }
45
+ });
46
+ }
47
+ /**
48
+ * Close all speculos devices
49
+ */
50
+ export function closeAllSpeculosDevices() {
51
+ return Promise.all(Object.keys(data).map(releaseSpeculosDevice));
52
+ }
53
+ // to keep in sync from https://github.com/LedgerHQ/speculos/tree/master/speculos/cxlib
54
+ const existingSdks = [
55
+ "nanos-cx-2.0.elf",
56
+ "nanos-cx-2.1.elf",
57
+ "nanosp-cx-1.0.3.elf",
58
+ "nanosp-cx-1.0.elf",
59
+ "nanox-cx-2.0.2.elf",
60
+ "nanox-cx-2.0.elf",
61
+ ];
62
+ function inferSDK(firmware, model) {
63
+ const begin = `${model.toLowerCase()}-cx-`;
64
+ if (existingSdks.includes(begin + firmware + ".elf"))
65
+ return firmware;
66
+ const shortVersion = firmware.slice(0, 3);
67
+ if (existingSdks.includes(begin + shortVersion + ".elf"))
68
+ return shortVersion;
69
+ }
70
+ const getPorts = (idCounter, isSpeculosWebsocket) => {
71
+ if (isSpeculosWebsocket) {
72
+ const apduPort = 30000 + idCounter;
73
+ const vncPort = 35000 + idCounter;
74
+ const buttonPort = 40000 + idCounter;
75
+ const automationPort = 45000 + idCounter;
76
+ return { apduPort, vncPort, buttonPort, automationPort };
77
+ }
78
+ else {
79
+ const apiPort = 30000 + idCounter;
80
+ const vncPort = 35000 + idCounter;
81
+ return { apiPort, vncPort };
82
+ }
83
+ };
84
+ function conventionalAppSubpath(model, firmware, appName, appVersion) {
85
+ return `${reverseModelMap[model]}/${firmware}/${appName.replace(/ /g, "")}/app_${appVersion}.elf`;
86
+ }
87
+ /**
88
+ * instanciate a speculos device that runs through docker
89
+ */
90
+ export function createSpeculosDevice(arg_1) {
91
+ return __awaiter(this, arguments, void 0, function* (arg, maxRetry = 3) {
92
+ var _a, _b, _c;
93
+ const { overridesAppPath, model, firmware, appName, appVersion, seed, coinapps, dependency, dependencies, } = arg;
94
+ idCounter = idCounter !== null && idCounter !== void 0 ? idCounter : getEnv("SPECULOS_PID_OFFSET");
95
+ const speculosID = `speculosID-${++idCounter}`;
96
+ const ports = getPorts(idCounter, isSpeculosWebsocket);
97
+ const sdk = inferSDK(firmware, model);
98
+ const subpath = overridesAppPath || conventionalAppSubpath(model, firmware, appName, appVersion);
99
+ const appPath = `./apps/${subpath}`;
100
+ const params = [
101
+ "run",
102
+ "-v",
103
+ `${coinapps}:/speculos/apps`,
104
+ ...(isSpeculosWebsocket
105
+ ? [
106
+ // websocket ports
107
+ "-p",
108
+ `${ports.apduPort}:40000`,
109
+ "-p",
110
+ `${ports.vncPort}:41000`,
111
+ "-p",
112
+ `${ports.buttonPort}:42000`,
113
+ "-p",
114
+ `${ports.automationPort}:43000`,
115
+ ]
116
+ : [
117
+ // http ports
118
+ "-p",
119
+ `${ports.apiPort}:40000`,
120
+ "-p",
121
+ `${ports.vncPort}:41000`,
122
+ ]),
123
+ "-e",
124
+ `SPECULOS_APPNAME=${appName}:${appVersion}`,
125
+ "--name",
126
+ `${speculosID}`,
127
+ (_a = process.env.SPECULOS_IMAGE_TAG) !== null && _a !== void 0 ? _a : "ghcr.io/ledgerhq/speculos:sha-e262a0c",
128
+ "--model",
129
+ model.toLowerCase(),
130
+ appPath,
131
+ ...(dependency
132
+ ? [
133
+ "-l",
134
+ `${dependency}:./apps/${conventionalAppSubpath(model, firmware, dependency, appVersion)}`,
135
+ ]
136
+ : []),
137
+ ...(dependencies !== undefined
138
+ ? dependencies.flatMap(dependency => [
139
+ "-l",
140
+ `${dependency.name}:./apps/${conventionalAppSubpath(model, firmware, dependency.name, dependency.appVersion ? dependency.appVersion : "1.0.0")}`,
141
+ ])
142
+ : []),
143
+ ...(sdk ? ["--sdk", sdk] : []),
144
+ "--display",
145
+ "headless",
146
+ ...(process.env.CI ? ["--vnc-password", "live", "--vnc-port", "41000"] : []),
147
+ ...(isSpeculosWebsocket
148
+ ? [
149
+ // websocket ports
150
+ "--apdu-port",
151
+ "40000",
152
+ "--button-port",
153
+ "42000",
154
+ "--automation-port",
155
+ "43000",
156
+ ]
157
+ : [
158
+ // http ports
159
+ "--api-port",
160
+ "40000",
161
+ ]),
162
+ ];
163
+ log("speculos", `${speculosID}: spawning = ${params.join(" ")}`);
164
+ const p = spawn("docker", [...params, "--seed", `${seed}`]);
165
+ let resolveReady;
166
+ let rejectReady;
167
+ const ready = new Promise((resolve, reject) => {
168
+ resolveReady = resolve;
169
+ rejectReady = reject;
170
+ });
171
+ let destroyed = false;
172
+ const destroy = () => {
173
+ if (destroyed)
174
+ return;
175
+ destroyed = true;
176
+ new Promise((resolve, reject) => {
177
+ if (!data[speculosID])
178
+ return;
179
+ delete data[speculosID];
180
+ exec(`docker rm -f ${speculosID}`, (error, stdout, stderr) => {
181
+ if (error) {
182
+ log("speculos-error", `${speculosID} not destroyed ${error} ${stderr}`);
183
+ reject(error);
184
+ }
185
+ else {
186
+ log("speculos", `destroyed ${speculosID}`);
187
+ resolve(undefined);
188
+ }
189
+ });
190
+ });
191
+ };
192
+ p.stdout.on("data", data => {
193
+ if (data) {
194
+ log("speculos-stdout", `${speculosID}: ${String(data).trim()}`);
195
+ }
196
+ });
197
+ let latestStderr;
198
+ p.stderr.on("data", data => {
199
+ if (!data)
200
+ return;
201
+ latestStderr = data;
202
+ if (!data.includes("apdu: ")) {
203
+ log("speculos-stderr", `${speculosID}: ${String(data).trim()}`);
204
+ }
205
+ if (/using\s(?:SDK|API_LEVEL)/.test(data)) {
206
+ setTimeout(() => resolveReady(true), 500);
207
+ }
208
+ else if (data.includes("is already in use by container")) {
209
+ rejectReady(new Error("speculos already in use! Try `ledger-live cleanSpeculos` or check logs"));
210
+ }
211
+ else if (data.includes("address already in use")) {
212
+ if (maxRetry > 0) {
213
+ log("speculos", "retrying speculos connection");
214
+ destroy();
215
+ resolveReady(false);
216
+ }
217
+ }
218
+ });
219
+ p.on("close", () => {
220
+ log("speculos", `${speculosID} closed`);
221
+ if (!destroyed) {
222
+ destroy();
223
+ rejectReady(new Error(`speculos process failure. ${latestStderr || ""}`));
224
+ }
225
+ });
226
+ const hasSucceed = yield ready;
227
+ if (!hasSucceed) {
228
+ yield delay(1000);
229
+ return createSpeculosDevice(arg, maxRetry - 1);
230
+ }
231
+ let transport;
232
+ if (isSpeculosWebsocket) {
233
+ transport = yield SpeculosTransportWebsocket.open({
234
+ apduPort: ports === null || ports === void 0 ? void 0 : ports.apduPort,
235
+ buttonPort: ports === null || ports === void 0 ? void 0 : ports.buttonPort,
236
+ automationPort: ports === null || ports === void 0 ? void 0 : ports.automationPort,
237
+ });
238
+ data[speculosID] = {
239
+ process: p,
240
+ apduPort: ports.apduPort,
241
+ buttonPort: ports.buttonPort,
242
+ automationPort: ports.automationPort,
243
+ transport,
244
+ destroy,
245
+ };
246
+ }
247
+ else {
248
+ transport = yield SpeculosTransportHttp.open({
249
+ apiPort: (_b = ports.apiPort) === null || _b === void 0 ? void 0 : _b.toString(),
250
+ });
251
+ data[speculosID] = {
252
+ process: p,
253
+ apiPort: (_c = ports.apiPort) === null || _c === void 0 ? void 0 : _c.toString(),
254
+ transport,
255
+ destroy,
256
+ };
257
+ }
258
+ const device = {
259
+ id: speculosID,
260
+ transport,
261
+ appPath,
262
+ ports,
263
+ };
264
+ if (arg.onSpeculosDeviceCreated != null) {
265
+ yield arg.onSpeculosDeviceCreated(device);
266
+ }
267
+ return device;
268
+ });
269
+ }
270
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,59 @@
1
+ {
2
+ "name": "@ledgerhq/speculos-transport",
3
+ "version": "0.1.8-nightly.0",
4
+ "description": "Ledger Live speculos transport test helper",
5
+ "keywords": [
6
+ "Ledger"
7
+ ],
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "https://github.com/LedgerHQ/ledger-live.git"
11
+ },
12
+ "bugs": {
13
+ "url": "https://github.com/LedgerHQ/ledger-live/issues"
14
+ },
15
+ "homepage": "https://github.com/LedgerHQ/ledger-live/tree/develop/libs/speculos-transport",
16
+ "main": "lib/index.js",
17
+ "module": "lib-es/index.js",
18
+ "types": "lib/index.d.ts",
19
+ "license": "Apache-2.0",
20
+ "dependencies": {
21
+ "@ledgerhq/live-env": "2.4.1-nightly.0",
22
+ "@ledgerhq/live-promise": "0.1.0",
23
+ "@ledgerhq/logs": "6.12.0",
24
+ "@ledgerhq/devices": "8.4.4",
25
+ "@ledgerhq/hw-transport-node-speculos": "6.29.4",
26
+ "@ledgerhq/hw-transport-node-speculos-http": "6.29.4"
27
+ },
28
+ "devDependencies": {
29
+ "@types/node": "^20.8.10",
30
+ "documentation": "14.0.2"
31
+ },
32
+ "typesVersions": {
33
+ "*": {
34
+ "*.json": [
35
+ "*.json"
36
+ ],
37
+ "*": [
38
+ "lib/*"
39
+ ],
40
+ "lib/*": [
41
+ "lib/*"
42
+ ],
43
+ "lib-es/*": [
44
+ "lib-es/*"
45
+ ]
46
+ }
47
+ },
48
+ "scripts": {
49
+ "clean": "rimraf lib lib-es",
50
+ "build": "tsc && tsc -m ES6 --outDir lib-es",
51
+ "prewatch": "pnpm build",
52
+ "watch": "tsc --watch",
53
+ "lint": "eslint ./src --no-error-on-unmatched-pattern --ext .ts,.tsx --cache",
54
+ "lint:fix": "pnpm lint --fix",
55
+ "typecheck": "tsc --noEmit",
56
+ "unimported": "unimported",
57
+ "doc": "documentation readme src/** --section=API --pe ts --re ts --re d.ts"
58
+ }
59
+ }