@bytezhang/trezor-transport-electron 0.0.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.
@@ -0,0 +1,62 @@
1
+ import {
2
+ __require
3
+ } from "./chunk-BJTO5JO5.mjs";
4
+
5
+ // src/main.ts
6
+ import { ipcMain } from "electron";
7
+ var TrezorConnect = __require("@trezor/connect").default;
8
+ function createElectronTrezorBridge(win) {
9
+ let initialized = false;
10
+ let eventsRegistered = false;
11
+ ipcMain.handle("tc:init", async (_event, settings) => {
12
+ if (!eventsRegistered) {
13
+ eventsRegistered = true;
14
+ for (const eventType of [
15
+ "DEVICE_EVENT",
16
+ "UI_EVENT",
17
+ "TRANSPORT_EVENT"
18
+ ]) {
19
+ TrezorConnect.on(eventType, (event) => {
20
+ if (!win.isDestroyed()) {
21
+ win.webContents.send("tc:event", event);
22
+ }
23
+ });
24
+ }
25
+ }
26
+ if (initialized) {
27
+ TrezorConnect.dispose();
28
+ initialized = false;
29
+ }
30
+ await TrezorConnect.init(settings);
31
+ initialized = true;
32
+ });
33
+ ipcMain.handle("tc:dispose", async () => {
34
+ if (initialized) {
35
+ TrezorConnect.dispose();
36
+ initialized = false;
37
+ }
38
+ });
39
+ ipcMain.handle(
40
+ "tc:call",
41
+ async (_event, { method, params }) => {
42
+ if (typeof TrezorConnect[method] !== "function") {
43
+ return {
44
+ success: false,
45
+ payload: { error: `Unknown method: ${method}` }
46
+ };
47
+ }
48
+ return TrezorConnect[method](params);
49
+ }
50
+ );
51
+ ipcMain.handle("tc:cancel", async (_event, reason) => {
52
+ TrezorConnect.cancel(reason);
53
+ });
54
+ ipcMain.handle("tc:uiResponse", async (_event, response) => {
55
+ TrezorConnect.uiResponse(response);
56
+ });
57
+ }
58
+
59
+ export {
60
+ createElectronTrezorBridge
61
+ };
62
+ //# sourceMappingURL=chunk-5PQU6ERJ.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/main.ts"],"sourcesContent":["import { ipcMain, type BrowserWindow } from 'electron';\n\n// IMPORTANT: Use require(), not import.\n// @trezor/connect's browser field redirects import to a stub in bundlers.\n// require() in Node.js main process loads the real implementation.\n// eslint-disable-next-line @typescript-eslint/no-var-requires\nconst TrezorConnect = require('@trezor/connect').default;\n\n/**\n * Set up all Trezor Connect IPC handlers in the Electron main process.\n *\n * This function:\n * - Registers IPC handlers for init, dispose, call, cancel, uiResponse\n * - Forwards DEVICE_EVENT, UI_EVENT, TRANSPORT_EVENT to the renderer\n * - Manages the TrezorConnect singleton lifecycle (dispose before re-init)\n *\n * Call once after creating the BrowserWindow.\n */\nexport function createElectronTrezorBridge(win: BrowserWindow): void {\n let initialized = false;\n let eventsRegistered = false;\n\n ipcMain.handle('tc:init', async (_event, settings) => {\n // Register event forwarding only once (TrezorConnect is singleton)\n if (!eventsRegistered) {\n eventsRegistered = true;\n for (const eventType of [\n 'DEVICE_EVENT',\n 'UI_EVENT',\n 'TRANSPORT_EVENT',\n ]) {\n TrezorConnect.on(eventType, (event: any) => {\n if (!win.isDestroyed()) {\n win.webContents.send('tc:event', event);\n }\n });\n }\n }\n\n // Dispose before re-init (singleton constraint)\n if (initialized) {\n TrezorConnect.dispose();\n initialized = false;\n }\n\n await TrezorConnect.init(settings);\n initialized = true;\n });\n\n ipcMain.handle('tc:dispose', async () => {\n if (initialized) {\n TrezorConnect.dispose();\n initialized = false;\n }\n });\n\n ipcMain.handle(\n 'tc:call',\n async (_event, { method, params }: { method: string; params: any }) => {\n if (typeof (TrezorConnect as any)[method] !== 'function') {\n return {\n success: false,\n payload: { error: `Unknown method: ${method}` },\n };\n }\n return (TrezorConnect as any)[method](params);\n },\n );\n\n ipcMain.handle('tc:cancel', async (_event, reason?: string) => {\n TrezorConnect.cancel(reason);\n });\n\n ipcMain.handle('tc:uiResponse', async (_event, response: any) => {\n TrezorConnect.uiResponse(response);\n });\n}\n"],"mappings":";;;;;AAAA,SAAS,eAAmC;AAM5C,IAAM,gBAAgB,UAAQ,iBAAiB,EAAE;AAY1C,SAAS,2BAA2B,KAA0B;AACnE,MAAI,cAAc;AAClB,MAAI,mBAAmB;AAEvB,UAAQ,OAAO,WAAW,OAAO,QAAQ,aAAa;AAEpD,QAAI,CAAC,kBAAkB;AACrB,yBAAmB;AACnB,iBAAW,aAAa;AAAA,QACtB;AAAA,QACA;AAAA,QACA;AAAA,MACF,GAAG;AACD,sBAAc,GAAG,WAAW,CAAC,UAAe;AAC1C,cAAI,CAAC,IAAI,YAAY,GAAG;AACtB,gBAAI,YAAY,KAAK,YAAY,KAAK;AAAA,UACxC;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAGA,QAAI,aAAa;AACf,oBAAc,QAAQ;AACtB,oBAAc;AAAA,IAChB;AAEA,UAAM,cAAc,KAAK,QAAQ;AACjC,kBAAc;AAAA,EAChB,CAAC;AAED,UAAQ,OAAO,cAAc,YAAY;AACvC,QAAI,aAAa;AACf,oBAAc,QAAQ;AACtB,oBAAc;AAAA,IAChB;AAAA,EACF,CAAC;AAED,UAAQ;AAAA,IACN;AAAA,IACA,OAAO,QAAQ,EAAE,QAAQ,OAAO,MAAuC;AACrE,UAAI,OAAQ,cAAsB,MAAM,MAAM,YAAY;AACxD,eAAO;AAAA,UACL,SAAS;AAAA,UACT,SAAS,EAAE,OAAO,mBAAmB,MAAM,GAAG;AAAA,QAChD;AAAA,MACF;AACA,aAAQ,cAAsB,MAAM,EAAE,MAAM;AAAA,IAC9C;AAAA,EACF;AAEA,UAAQ,OAAO,aAAa,OAAO,QAAQ,WAAoB;AAC7D,kBAAc,OAAO,MAAM;AAAA,EAC7B,CAAC;AAED,UAAQ,OAAO,iBAAiB,OAAO,QAAQ,aAAkB;AAC/D,kBAAc,WAAW,QAAQ;AAAA,EACnC,CAAC;AACH;","names":[]}
@@ -0,0 +1,11 @@
1
+ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
2
+ get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
3
+ }) : x)(function(x) {
4
+ if (typeof require !== "undefined") return require.apply(this, arguments);
5
+ throw Error('Dynamic require of "' + x + '" is not supported');
6
+ });
7
+
8
+ export {
9
+ __require
10
+ };
11
+ //# sourceMappingURL=chunk-BJTO5JO5.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,23 @@
1
+ // src/preload.ts
2
+ import { ipcRenderer, contextBridge } from "electron";
3
+ function exposeTrezorConnectApi(apiName = "trezorConnect") {
4
+ const api = {
5
+ init: (settings) => ipcRenderer.invoke("tc:init", settings),
6
+ dispose: () => ipcRenderer.invoke("tc:dispose"),
7
+ call: (method, params) => ipcRenderer.invoke("tc:call", { method, params }),
8
+ cancel: (reason) => ipcRenderer.invoke("tc:cancel", reason),
9
+ uiResponse: (response) => ipcRenderer.invoke("tc:uiResponse", response),
10
+ onEvent: (callback) => {
11
+ ipcRenderer.on("tc:event", (_event, data) => callback(data));
12
+ },
13
+ removeEventListeners: () => {
14
+ ipcRenderer.removeAllListeners("tc:event");
15
+ }
16
+ };
17
+ contextBridge.exposeInMainWorld(apiName, api);
18
+ }
19
+
20
+ export {
21
+ exposeTrezorConnectApi
22
+ };
23
+ //# sourceMappingURL=chunk-XEHCGRYI.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/preload.ts"],"sourcesContent":["import { ipcRenderer, contextBridge } from 'electron';\nimport type { TrezorConnectBridge } from './types';\n\n/**\n * Expose a TrezorConnect IPC bridge to the renderer process via contextBridge.\n *\n * Call this in your Electron preload script. The renderer can then access\n * the bridge at `window[apiName]` (default: `window.trezorConnect`).\n *\n * @param apiName — the key on `window` where the bridge is exposed\n */\nexport function exposeTrezorConnectApi(apiName = 'trezorConnect'): void {\n const api: TrezorConnectBridge = {\n init: (settings) => ipcRenderer.invoke('tc:init', settings),\n dispose: () => ipcRenderer.invoke('tc:dispose'),\n call: (method, params) =>\n ipcRenderer.invoke('tc:call', { method, params }),\n cancel: (reason) => ipcRenderer.invoke('tc:cancel', reason),\n uiResponse: (response) => ipcRenderer.invoke('tc:uiResponse', response),\n onEvent: (callback) => {\n ipcRenderer.on('tc:event', (_event, data) => callback(data));\n },\n removeEventListeners: () => {\n ipcRenderer.removeAllListeners('tc:event');\n },\n };\n\n contextBridge.exposeInMainWorld(apiName, api);\n}\n"],"mappings":";AAAA,SAAS,aAAa,qBAAqB;AAWpC,SAAS,uBAAuB,UAAU,iBAAuB;AACtE,QAAM,MAA2B;AAAA,IAC/B,MAAM,CAAC,aAAa,YAAY,OAAO,WAAW,QAAQ;AAAA,IAC1D,SAAS,MAAM,YAAY,OAAO,YAAY;AAAA,IAC9C,MAAM,CAAC,QAAQ,WACb,YAAY,OAAO,WAAW,EAAE,QAAQ,OAAO,CAAC;AAAA,IAClD,QAAQ,CAAC,WAAW,YAAY,OAAO,aAAa,MAAM;AAAA,IAC1D,YAAY,CAAC,aAAa,YAAY,OAAO,iBAAiB,QAAQ;AAAA,IACtE,SAAS,CAAC,aAAa;AACrB,kBAAY,GAAG,YAAY,CAAC,QAAQ,SAAS,SAAS,IAAI,CAAC;AAAA,IAC7D;AAAA,IACA,sBAAsB,MAAM;AAC1B,kBAAY,mBAAmB,UAAU;AAAA,IAC3C;AAAA,EACF;AAEA,gBAAc,kBAAkB,SAAS,GAAG;AAC9C;","names":[]}
@@ -0,0 +1,33 @@
1
+ // src/renderer.ts
2
+ import { TrezorProxyClient } from "@bytezhang/hardware-trezor-adapter";
3
+ var TrezorIpcConnect = class _TrezorIpcConnect extends TrezorProxyClient {
4
+ constructor(bridge) {
5
+ super();
6
+ this.bridge = bridge;
7
+ bridge.onEvent((event) => this.dispatchEvent(event));
8
+ }
9
+ static async create(bridge, initSettings) {
10
+ const instance = new _TrezorIpcConnect(bridge);
11
+ await bridge.init(initSettings);
12
+ return instance;
13
+ }
14
+ sendCall(method, params) {
15
+ return this.bridge.call(method, params);
16
+ }
17
+ dispose() {
18
+ this.removeAllListeners();
19
+ this.bridge.removeEventListeners();
20
+ this.bridge.dispose();
21
+ }
22
+ cancel(reason) {
23
+ this.bridge.cancel(reason);
24
+ }
25
+ uiResponse(response) {
26
+ this.bridge.uiResponse(response);
27
+ }
28
+ };
29
+
30
+ export {
31
+ TrezorIpcConnect
32
+ };
33
+ //# sourceMappingURL=chunk-Z33SFKVN.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/renderer.ts"],"sourcesContent":["import { TrezorProxyClient } from '@bytezhang/hardware-trezor-adapter';\nimport type { TrezorConnectBridge } from './types';\n\n/**\n * ITrezorConnect-compatible proxy that forwards all calls to\n * the Electron main process via IPC.\n *\n * Usage:\n * ```ts\n * const bridge = (window as any).trezorConnect;\n * const connect = await TrezorIpcConnect.create(bridge, {\n * manifest: { appUrl: '...', email: '...' },\n * transports: ['NodeUsbTransport'],\n * });\n * // connect now implements ITrezorConnect\n * ```\n */\nexport class TrezorIpcConnect extends TrezorProxyClient {\n constructor(private bridge: TrezorConnectBridge) {\n super();\n bridge.onEvent((event: any) => this.dispatchEvent(event));\n }\n\n static async create(\n bridge: TrezorConnectBridge,\n initSettings: {\n manifest: { appUrl: string; email: string };\n transports?: string[];\n [key: string]: any;\n },\n ): Promise<TrezorIpcConnect> {\n const instance = new TrezorIpcConnect(bridge);\n await bridge.init(initSettings);\n return instance;\n }\n\n protected sendCall(method: string, params?: unknown): Promise<unknown> {\n return this.bridge.call(method, params);\n }\n\n dispose(): void {\n this.removeAllListeners();\n this.bridge.removeEventListeners();\n this.bridge.dispose();\n }\n\n cancel(reason?: string): void {\n this.bridge.cancel(reason);\n }\n\n uiResponse(response: { type: string; payload: unknown }): void {\n this.bridge.uiResponse(response);\n }\n}\n"],"mappings":";AAAA,SAAS,yBAAyB;AAiB3B,IAAM,mBAAN,MAAM,0BAAyB,kBAAkB;AAAA,EACtD,YAAoB,QAA6B;AAC/C,UAAM;AADY;AAElB,WAAO,QAAQ,CAAC,UAAe,KAAK,cAAc,KAAK,CAAC;AAAA,EAC1D;AAAA,EAEA,aAAa,OACX,QACA,cAK2B;AAC3B,UAAM,WAAW,IAAI,kBAAiB,MAAM;AAC5C,UAAM,OAAO,KAAK,YAAY;AAC9B,WAAO;AAAA,EACT;AAAA,EAEU,SAAS,QAAgB,QAAoC;AACrE,WAAO,KAAK,OAAO,KAAK,QAAQ,MAAM;AAAA,EACxC;AAAA,EAEA,UAAgB;AACd,SAAK,mBAAmB;AACxB,SAAK,OAAO,qBAAqB;AACjC,SAAK,OAAO,QAAQ;AAAA,EACtB;AAAA,EAEA,OAAO,QAAuB;AAC5B,SAAK,OAAO,OAAO,MAAM;AAAA,EAC3B;AAAA,EAEA,WAAW,UAAoD;AAC7D,SAAK,OAAO,WAAW,QAAQ;AAAA,EACjC;AACF;","names":[]}
@@ -0,0 +1,6 @@
1
+ export { createElectronTrezorBridge } from './main.mjs';
2
+ export { exposeTrezorConnectApi } from './preload.mjs';
3
+ export { TrezorIpcConnect } from './renderer.mjs';
4
+ export { TrezorConnectBridge } from './types.mjs';
5
+ import 'electron';
6
+ import '@bytezhang/hardware-trezor-adapter';
@@ -0,0 +1,6 @@
1
+ export { createElectronTrezorBridge } from './main.js';
2
+ export { exposeTrezorConnectApi } from './preload.js';
3
+ export { TrezorIpcConnect } from './renderer.js';
4
+ export { TrezorConnectBridge } from './types.js';
5
+ import 'electron';
6
+ import '@bytezhang/hardware-trezor-adapter';
package/dist/index.js ADDED
@@ -0,0 +1,136 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/index.ts
21
+ var src_exports = {};
22
+ __export(src_exports, {
23
+ TrezorIpcConnect: () => TrezorIpcConnect,
24
+ createElectronTrezorBridge: () => createElectronTrezorBridge,
25
+ exposeTrezorConnectApi: () => exposeTrezorConnectApi
26
+ });
27
+ module.exports = __toCommonJS(src_exports);
28
+
29
+ // src/main.ts
30
+ var import_electron = require("electron");
31
+ var TrezorConnect = require("@trezor/connect").default;
32
+ function createElectronTrezorBridge(win) {
33
+ let initialized = false;
34
+ let eventsRegistered = false;
35
+ import_electron.ipcMain.handle("tc:init", async (_event, settings) => {
36
+ if (!eventsRegistered) {
37
+ eventsRegistered = true;
38
+ for (const eventType of [
39
+ "DEVICE_EVENT",
40
+ "UI_EVENT",
41
+ "TRANSPORT_EVENT"
42
+ ]) {
43
+ TrezorConnect.on(eventType, (event) => {
44
+ if (!win.isDestroyed()) {
45
+ win.webContents.send("tc:event", event);
46
+ }
47
+ });
48
+ }
49
+ }
50
+ if (initialized) {
51
+ TrezorConnect.dispose();
52
+ initialized = false;
53
+ }
54
+ await TrezorConnect.init(settings);
55
+ initialized = true;
56
+ });
57
+ import_electron.ipcMain.handle("tc:dispose", async () => {
58
+ if (initialized) {
59
+ TrezorConnect.dispose();
60
+ initialized = false;
61
+ }
62
+ });
63
+ import_electron.ipcMain.handle(
64
+ "tc:call",
65
+ async (_event, { method, params }) => {
66
+ if (typeof TrezorConnect[method] !== "function") {
67
+ return {
68
+ success: false,
69
+ payload: { error: `Unknown method: ${method}` }
70
+ };
71
+ }
72
+ return TrezorConnect[method](params);
73
+ }
74
+ );
75
+ import_electron.ipcMain.handle("tc:cancel", async (_event, reason) => {
76
+ TrezorConnect.cancel(reason);
77
+ });
78
+ import_electron.ipcMain.handle("tc:uiResponse", async (_event, response) => {
79
+ TrezorConnect.uiResponse(response);
80
+ });
81
+ }
82
+
83
+ // src/preload.ts
84
+ var import_electron2 = require("electron");
85
+ function exposeTrezorConnectApi(apiName = "trezorConnect") {
86
+ const api = {
87
+ init: (settings) => import_electron2.ipcRenderer.invoke("tc:init", settings),
88
+ dispose: () => import_electron2.ipcRenderer.invoke("tc:dispose"),
89
+ call: (method, params) => import_electron2.ipcRenderer.invoke("tc:call", { method, params }),
90
+ cancel: (reason) => import_electron2.ipcRenderer.invoke("tc:cancel", reason),
91
+ uiResponse: (response) => import_electron2.ipcRenderer.invoke("tc:uiResponse", response),
92
+ onEvent: (callback) => {
93
+ import_electron2.ipcRenderer.on("tc:event", (_event, data) => callback(data));
94
+ },
95
+ removeEventListeners: () => {
96
+ import_electron2.ipcRenderer.removeAllListeners("tc:event");
97
+ }
98
+ };
99
+ import_electron2.contextBridge.exposeInMainWorld(apiName, api);
100
+ }
101
+
102
+ // src/renderer.ts
103
+ var import_hardware_trezor_adapter = require("@bytezhang/hardware-trezor-adapter");
104
+ var TrezorIpcConnect = class _TrezorIpcConnect extends import_hardware_trezor_adapter.TrezorProxyClient {
105
+ constructor(bridge) {
106
+ super();
107
+ this.bridge = bridge;
108
+ bridge.onEvent((event) => this.dispatchEvent(event));
109
+ }
110
+ static async create(bridge, initSettings) {
111
+ const instance = new _TrezorIpcConnect(bridge);
112
+ await bridge.init(initSettings);
113
+ return instance;
114
+ }
115
+ sendCall(method, params) {
116
+ return this.bridge.call(method, params);
117
+ }
118
+ dispose() {
119
+ this.removeAllListeners();
120
+ this.bridge.removeEventListeners();
121
+ this.bridge.dispose();
122
+ }
123
+ cancel(reason) {
124
+ this.bridge.cancel(reason);
125
+ }
126
+ uiResponse(response) {
127
+ this.bridge.uiResponse(response);
128
+ }
129
+ };
130
+ // Annotate the CommonJS export names for ESM import in node:
131
+ 0 && (module.exports = {
132
+ TrezorIpcConnect,
133
+ createElectronTrezorBridge,
134
+ exposeTrezorConnectApi
135
+ });
136
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/main.ts","../src/preload.ts","../src/renderer.ts"],"sourcesContent":["export { createElectronTrezorBridge } from './main';\nexport { exposeTrezorConnectApi } from './preload';\nexport { TrezorIpcConnect } from './renderer';\nexport type { TrezorConnectBridge } from './types';\n","import { ipcMain, type BrowserWindow } from 'electron';\n\n// IMPORTANT: Use require(), not import.\n// @trezor/connect's browser field redirects import to a stub in bundlers.\n// require() in Node.js main process loads the real implementation.\n// eslint-disable-next-line @typescript-eslint/no-var-requires\nconst TrezorConnect = require('@trezor/connect').default;\n\n/**\n * Set up all Trezor Connect IPC handlers in the Electron main process.\n *\n * This function:\n * - Registers IPC handlers for init, dispose, call, cancel, uiResponse\n * - Forwards DEVICE_EVENT, UI_EVENT, TRANSPORT_EVENT to the renderer\n * - Manages the TrezorConnect singleton lifecycle (dispose before re-init)\n *\n * Call once after creating the BrowserWindow.\n */\nexport function createElectronTrezorBridge(win: BrowserWindow): void {\n let initialized = false;\n let eventsRegistered = false;\n\n ipcMain.handle('tc:init', async (_event, settings) => {\n // Register event forwarding only once (TrezorConnect is singleton)\n if (!eventsRegistered) {\n eventsRegistered = true;\n for (const eventType of [\n 'DEVICE_EVENT',\n 'UI_EVENT',\n 'TRANSPORT_EVENT',\n ]) {\n TrezorConnect.on(eventType, (event: any) => {\n if (!win.isDestroyed()) {\n win.webContents.send('tc:event', event);\n }\n });\n }\n }\n\n // Dispose before re-init (singleton constraint)\n if (initialized) {\n TrezorConnect.dispose();\n initialized = false;\n }\n\n await TrezorConnect.init(settings);\n initialized = true;\n });\n\n ipcMain.handle('tc:dispose', async () => {\n if (initialized) {\n TrezorConnect.dispose();\n initialized = false;\n }\n });\n\n ipcMain.handle(\n 'tc:call',\n async (_event, { method, params }: { method: string; params: any }) => {\n if (typeof (TrezorConnect as any)[method] !== 'function') {\n return {\n success: false,\n payload: { error: `Unknown method: ${method}` },\n };\n }\n return (TrezorConnect as any)[method](params);\n },\n );\n\n ipcMain.handle('tc:cancel', async (_event, reason?: string) => {\n TrezorConnect.cancel(reason);\n });\n\n ipcMain.handle('tc:uiResponse', async (_event, response: any) => {\n TrezorConnect.uiResponse(response);\n });\n}\n","import { ipcRenderer, contextBridge } from 'electron';\nimport type { TrezorConnectBridge } from './types';\n\n/**\n * Expose a TrezorConnect IPC bridge to the renderer process via contextBridge.\n *\n * Call this in your Electron preload script. The renderer can then access\n * the bridge at `window[apiName]` (default: `window.trezorConnect`).\n *\n * @param apiName — the key on `window` where the bridge is exposed\n */\nexport function exposeTrezorConnectApi(apiName = 'trezorConnect'): void {\n const api: TrezorConnectBridge = {\n init: (settings) => ipcRenderer.invoke('tc:init', settings),\n dispose: () => ipcRenderer.invoke('tc:dispose'),\n call: (method, params) =>\n ipcRenderer.invoke('tc:call', { method, params }),\n cancel: (reason) => ipcRenderer.invoke('tc:cancel', reason),\n uiResponse: (response) => ipcRenderer.invoke('tc:uiResponse', response),\n onEvent: (callback) => {\n ipcRenderer.on('tc:event', (_event, data) => callback(data));\n },\n removeEventListeners: () => {\n ipcRenderer.removeAllListeners('tc:event');\n },\n };\n\n contextBridge.exposeInMainWorld(apiName, api);\n}\n","import { TrezorProxyClient } from '@bytezhang/hardware-trezor-adapter';\nimport type { TrezorConnectBridge } from './types';\n\n/**\n * ITrezorConnect-compatible proxy that forwards all calls to\n * the Electron main process via IPC.\n *\n * Usage:\n * ```ts\n * const bridge = (window as any).trezorConnect;\n * const connect = await TrezorIpcConnect.create(bridge, {\n * manifest: { appUrl: '...', email: '...' },\n * transports: ['NodeUsbTransport'],\n * });\n * // connect now implements ITrezorConnect\n * ```\n */\nexport class TrezorIpcConnect extends TrezorProxyClient {\n constructor(private bridge: TrezorConnectBridge) {\n super();\n bridge.onEvent((event: any) => this.dispatchEvent(event));\n }\n\n static async create(\n bridge: TrezorConnectBridge,\n initSettings: {\n manifest: { appUrl: string; email: string };\n transports?: string[];\n [key: string]: any;\n },\n ): Promise<TrezorIpcConnect> {\n const instance = new TrezorIpcConnect(bridge);\n await bridge.init(initSettings);\n return instance;\n }\n\n protected sendCall(method: string, params?: unknown): Promise<unknown> {\n return this.bridge.call(method, params);\n }\n\n dispose(): void {\n this.removeAllListeners();\n this.bridge.removeEventListeners();\n this.bridge.dispose();\n }\n\n cancel(reason?: string): void {\n this.bridge.cancel(reason);\n }\n\n uiResponse(response: { type: string; payload: unknown }): void {\n this.bridge.uiResponse(response);\n }\n}\n"],"mappings":"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","names":["import_electron"]}
package/dist/index.mjs ADDED
@@ -0,0 +1,16 @@
1
+ import {
2
+ createElectronTrezorBridge
3
+ } from "./chunk-5PQU6ERJ.mjs";
4
+ import {
5
+ exposeTrezorConnectApi
6
+ } from "./chunk-XEHCGRYI.mjs";
7
+ import {
8
+ TrezorIpcConnect
9
+ } from "./chunk-Z33SFKVN.mjs";
10
+ import "./chunk-BJTO5JO5.mjs";
11
+ export {
12
+ TrezorIpcConnect,
13
+ createElectronTrezorBridge,
14
+ exposeTrezorConnectApi
15
+ };
16
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,15 @@
1
+ import { BrowserWindow } from 'electron';
2
+
3
+ /**
4
+ * Set up all Trezor Connect IPC handlers in the Electron main process.
5
+ *
6
+ * This function:
7
+ * - Registers IPC handlers for init, dispose, call, cancel, uiResponse
8
+ * - Forwards DEVICE_EVENT, UI_EVENT, TRANSPORT_EVENT to the renderer
9
+ * - Manages the TrezorConnect singleton lifecycle (dispose before re-init)
10
+ *
11
+ * Call once after creating the BrowserWindow.
12
+ */
13
+ declare function createElectronTrezorBridge(win: BrowserWindow): void;
14
+
15
+ export { createElectronTrezorBridge };
package/dist/main.d.ts ADDED
@@ -0,0 +1,15 @@
1
+ import { BrowserWindow } from 'electron';
2
+
3
+ /**
4
+ * Set up all Trezor Connect IPC handlers in the Electron main process.
5
+ *
6
+ * This function:
7
+ * - Registers IPC handlers for init, dispose, call, cancel, uiResponse
8
+ * - Forwards DEVICE_EVENT, UI_EVENT, TRANSPORT_EVENT to the renderer
9
+ * - Manages the TrezorConnect singleton lifecycle (dispose before re-init)
10
+ *
11
+ * Call once after creating the BrowserWindow.
12
+ */
13
+ declare function createElectronTrezorBridge(win: BrowserWindow): void;
14
+
15
+ export { createElectronTrezorBridge };
package/dist/main.js ADDED
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/main.ts
21
+ var main_exports = {};
22
+ __export(main_exports, {
23
+ createElectronTrezorBridge: () => createElectronTrezorBridge
24
+ });
25
+ module.exports = __toCommonJS(main_exports);
26
+ var import_electron = require("electron");
27
+ var TrezorConnect = require("@trezor/connect").default;
28
+ function createElectronTrezorBridge(win) {
29
+ let initialized = false;
30
+ let eventsRegistered = false;
31
+ import_electron.ipcMain.handle("tc:init", async (_event, settings) => {
32
+ if (!eventsRegistered) {
33
+ eventsRegistered = true;
34
+ for (const eventType of [
35
+ "DEVICE_EVENT",
36
+ "UI_EVENT",
37
+ "TRANSPORT_EVENT"
38
+ ]) {
39
+ TrezorConnect.on(eventType, (event) => {
40
+ if (!win.isDestroyed()) {
41
+ win.webContents.send("tc:event", event);
42
+ }
43
+ });
44
+ }
45
+ }
46
+ if (initialized) {
47
+ TrezorConnect.dispose();
48
+ initialized = false;
49
+ }
50
+ await TrezorConnect.init(settings);
51
+ initialized = true;
52
+ });
53
+ import_electron.ipcMain.handle("tc:dispose", async () => {
54
+ if (initialized) {
55
+ TrezorConnect.dispose();
56
+ initialized = false;
57
+ }
58
+ });
59
+ import_electron.ipcMain.handle(
60
+ "tc:call",
61
+ async (_event, { method, params }) => {
62
+ if (typeof TrezorConnect[method] !== "function") {
63
+ return {
64
+ success: false,
65
+ payload: { error: `Unknown method: ${method}` }
66
+ };
67
+ }
68
+ return TrezorConnect[method](params);
69
+ }
70
+ );
71
+ import_electron.ipcMain.handle("tc:cancel", async (_event, reason) => {
72
+ TrezorConnect.cancel(reason);
73
+ });
74
+ import_electron.ipcMain.handle("tc:uiResponse", async (_event, response) => {
75
+ TrezorConnect.uiResponse(response);
76
+ });
77
+ }
78
+ // Annotate the CommonJS export names for ESM import in node:
79
+ 0 && (module.exports = {
80
+ createElectronTrezorBridge
81
+ });
82
+ //# sourceMappingURL=main.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/main.ts"],"sourcesContent":["import { ipcMain, type BrowserWindow } from 'electron';\n\n// IMPORTANT: Use require(), not import.\n// @trezor/connect's browser field redirects import to a stub in bundlers.\n// require() in Node.js main process loads the real implementation.\n// eslint-disable-next-line @typescript-eslint/no-var-requires\nconst TrezorConnect = require('@trezor/connect').default;\n\n/**\n * Set up all Trezor Connect IPC handlers in the Electron main process.\n *\n * This function:\n * - Registers IPC handlers for init, dispose, call, cancel, uiResponse\n * - Forwards DEVICE_EVENT, UI_EVENT, TRANSPORT_EVENT to the renderer\n * - Manages the TrezorConnect singleton lifecycle (dispose before re-init)\n *\n * Call once after creating the BrowserWindow.\n */\nexport function createElectronTrezorBridge(win: BrowserWindow): void {\n let initialized = false;\n let eventsRegistered = false;\n\n ipcMain.handle('tc:init', async (_event, settings) => {\n // Register event forwarding only once (TrezorConnect is singleton)\n if (!eventsRegistered) {\n eventsRegistered = true;\n for (const eventType of [\n 'DEVICE_EVENT',\n 'UI_EVENT',\n 'TRANSPORT_EVENT',\n ]) {\n TrezorConnect.on(eventType, (event: any) => {\n if (!win.isDestroyed()) {\n win.webContents.send('tc:event', event);\n }\n });\n }\n }\n\n // Dispose before re-init (singleton constraint)\n if (initialized) {\n TrezorConnect.dispose();\n initialized = false;\n }\n\n await TrezorConnect.init(settings);\n initialized = true;\n });\n\n ipcMain.handle('tc:dispose', async () => {\n if (initialized) {\n TrezorConnect.dispose();\n initialized = false;\n }\n });\n\n ipcMain.handle(\n 'tc:call',\n async (_event, { method, params }: { method: string; params: any }) => {\n if (typeof (TrezorConnect as any)[method] !== 'function') {\n return {\n success: false,\n payload: { error: `Unknown method: ${method}` },\n };\n }\n return (TrezorConnect as any)[method](params);\n },\n );\n\n ipcMain.handle('tc:cancel', async (_event, reason?: string) => {\n TrezorConnect.cancel(reason);\n });\n\n ipcMain.handle('tc:uiResponse', async (_event, response: any) => {\n TrezorConnect.uiResponse(response);\n });\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAA4C;AAM5C,IAAM,gBAAgB,QAAQ,iBAAiB,EAAE;AAY1C,SAAS,2BAA2B,KAA0B;AACnE,MAAI,cAAc;AAClB,MAAI,mBAAmB;AAEvB,0BAAQ,OAAO,WAAW,OAAO,QAAQ,aAAa;AAEpD,QAAI,CAAC,kBAAkB;AACrB,yBAAmB;AACnB,iBAAW,aAAa;AAAA,QACtB;AAAA,QACA;AAAA,QACA;AAAA,MACF,GAAG;AACD,sBAAc,GAAG,WAAW,CAAC,UAAe;AAC1C,cAAI,CAAC,IAAI,YAAY,GAAG;AACtB,gBAAI,YAAY,KAAK,YAAY,KAAK;AAAA,UACxC;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAGA,QAAI,aAAa;AACf,oBAAc,QAAQ;AACtB,oBAAc;AAAA,IAChB;AAEA,UAAM,cAAc,KAAK,QAAQ;AACjC,kBAAc;AAAA,EAChB,CAAC;AAED,0BAAQ,OAAO,cAAc,YAAY;AACvC,QAAI,aAAa;AACf,oBAAc,QAAQ;AACtB,oBAAc;AAAA,IAChB;AAAA,EACF,CAAC;AAED,0BAAQ;AAAA,IACN;AAAA,IACA,OAAO,QAAQ,EAAE,QAAQ,OAAO,MAAuC;AACrE,UAAI,OAAQ,cAAsB,MAAM,MAAM,YAAY;AACxD,eAAO;AAAA,UACL,SAAS;AAAA,UACT,SAAS,EAAE,OAAO,mBAAmB,MAAM,GAAG;AAAA,QAChD;AAAA,MACF;AACA,aAAQ,cAAsB,MAAM,EAAE,MAAM;AAAA,IAC9C;AAAA,EACF;AAEA,0BAAQ,OAAO,aAAa,OAAO,QAAQ,WAAoB;AAC7D,kBAAc,OAAO,MAAM;AAAA,EAC7B,CAAC;AAED,0BAAQ,OAAO,iBAAiB,OAAO,QAAQ,aAAkB;AAC/D,kBAAc,WAAW,QAAQ;AAAA,EACnC,CAAC;AACH;","names":[]}
package/dist/main.mjs ADDED
@@ -0,0 +1,8 @@
1
+ import {
2
+ createElectronTrezorBridge
3
+ } from "./chunk-5PQU6ERJ.mjs";
4
+ import "./chunk-BJTO5JO5.mjs";
5
+ export {
6
+ createElectronTrezorBridge
7
+ };
8
+ //# sourceMappingURL=main.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Expose a TrezorConnect IPC bridge to the renderer process via contextBridge.
3
+ *
4
+ * Call this in your Electron preload script. The renderer can then access
5
+ * the bridge at `window[apiName]` (default: `window.trezorConnect`).
6
+ *
7
+ * @param apiName — the key on `window` where the bridge is exposed
8
+ */
9
+ declare function exposeTrezorConnectApi(apiName?: string): void;
10
+
11
+ export { exposeTrezorConnectApi };
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Expose a TrezorConnect IPC bridge to the renderer process via contextBridge.
3
+ *
4
+ * Call this in your Electron preload script. The renderer can then access
5
+ * the bridge at `window[apiName]` (default: `window.trezorConnect`).
6
+ *
7
+ * @param apiName — the key on `window` where the bridge is exposed
8
+ */
9
+ declare function exposeTrezorConnectApi(apiName?: string): void;
10
+
11
+ export { exposeTrezorConnectApi };
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/preload.ts
21
+ var preload_exports = {};
22
+ __export(preload_exports, {
23
+ exposeTrezorConnectApi: () => exposeTrezorConnectApi
24
+ });
25
+ module.exports = __toCommonJS(preload_exports);
26
+ var import_electron = require("electron");
27
+ function exposeTrezorConnectApi(apiName = "trezorConnect") {
28
+ const api = {
29
+ init: (settings) => import_electron.ipcRenderer.invoke("tc:init", settings),
30
+ dispose: () => import_electron.ipcRenderer.invoke("tc:dispose"),
31
+ call: (method, params) => import_electron.ipcRenderer.invoke("tc:call", { method, params }),
32
+ cancel: (reason) => import_electron.ipcRenderer.invoke("tc:cancel", reason),
33
+ uiResponse: (response) => import_electron.ipcRenderer.invoke("tc:uiResponse", response),
34
+ onEvent: (callback) => {
35
+ import_electron.ipcRenderer.on("tc:event", (_event, data) => callback(data));
36
+ },
37
+ removeEventListeners: () => {
38
+ import_electron.ipcRenderer.removeAllListeners("tc:event");
39
+ }
40
+ };
41
+ import_electron.contextBridge.exposeInMainWorld(apiName, api);
42
+ }
43
+ // Annotate the CommonJS export names for ESM import in node:
44
+ 0 && (module.exports = {
45
+ exposeTrezorConnectApi
46
+ });
47
+ //# sourceMappingURL=preload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/preload.ts"],"sourcesContent":["import { ipcRenderer, contextBridge } from 'electron';\nimport type { TrezorConnectBridge } from './types';\n\n/**\n * Expose a TrezorConnect IPC bridge to the renderer process via contextBridge.\n *\n * Call this in your Electron preload script. The renderer can then access\n * the bridge at `window[apiName]` (default: `window.trezorConnect`).\n *\n * @param apiName — the key on `window` where the bridge is exposed\n */\nexport function exposeTrezorConnectApi(apiName = 'trezorConnect'): void {\n const api: TrezorConnectBridge = {\n init: (settings) => ipcRenderer.invoke('tc:init', settings),\n dispose: () => ipcRenderer.invoke('tc:dispose'),\n call: (method, params) =>\n ipcRenderer.invoke('tc:call', { method, params }),\n cancel: (reason) => ipcRenderer.invoke('tc:cancel', reason),\n uiResponse: (response) => ipcRenderer.invoke('tc:uiResponse', response),\n onEvent: (callback) => {\n ipcRenderer.on('tc:event', (_event, data) => callback(data));\n },\n removeEventListeners: () => {\n ipcRenderer.removeAllListeners('tc:event');\n },\n };\n\n contextBridge.exposeInMainWorld(apiName, api);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAA2C;AAWpC,SAAS,uBAAuB,UAAU,iBAAuB;AACtE,QAAM,MAA2B;AAAA,IAC/B,MAAM,CAAC,aAAa,4BAAY,OAAO,WAAW,QAAQ;AAAA,IAC1D,SAAS,MAAM,4BAAY,OAAO,YAAY;AAAA,IAC9C,MAAM,CAAC,QAAQ,WACb,4BAAY,OAAO,WAAW,EAAE,QAAQ,OAAO,CAAC;AAAA,IAClD,QAAQ,CAAC,WAAW,4BAAY,OAAO,aAAa,MAAM;AAAA,IAC1D,YAAY,CAAC,aAAa,4BAAY,OAAO,iBAAiB,QAAQ;AAAA,IACtE,SAAS,CAAC,aAAa;AACrB,kCAAY,GAAG,YAAY,CAAC,QAAQ,SAAS,SAAS,IAAI,CAAC;AAAA,IAC7D;AAAA,IACA,sBAAsB,MAAM;AAC1B,kCAAY,mBAAmB,UAAU;AAAA,IAC3C;AAAA,EACF;AAEA,gCAAc,kBAAkB,SAAS,GAAG;AAC9C;","names":[]}
@@ -0,0 +1,8 @@
1
+ import {
2
+ exposeTrezorConnectApi
3
+ } from "./chunk-XEHCGRYI.mjs";
4
+ import "./chunk-BJTO5JO5.mjs";
5
+ export {
6
+ exposeTrezorConnectApi
7
+ };
8
+ //# sourceMappingURL=preload.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,38 @@
1
+ import { TrezorProxyClient } from '@bytezhang/hardware-trezor-adapter';
2
+ import { TrezorConnectBridge } from './types.mjs';
3
+
4
+ /**
5
+ * ITrezorConnect-compatible proxy that forwards all calls to
6
+ * the Electron main process via IPC.
7
+ *
8
+ * Usage:
9
+ * ```ts
10
+ * const bridge = (window as any).trezorConnect;
11
+ * const connect = await TrezorIpcConnect.create(bridge, {
12
+ * manifest: { appUrl: '...', email: '...' },
13
+ * transports: ['NodeUsbTransport'],
14
+ * });
15
+ * // connect now implements ITrezorConnect
16
+ * ```
17
+ */
18
+ declare class TrezorIpcConnect extends TrezorProxyClient {
19
+ private bridge;
20
+ constructor(bridge: TrezorConnectBridge);
21
+ static create(bridge: TrezorConnectBridge, initSettings: {
22
+ manifest: {
23
+ appUrl: string;
24
+ email: string;
25
+ };
26
+ transports?: string[];
27
+ [key: string]: any;
28
+ }): Promise<TrezorIpcConnect>;
29
+ protected sendCall(method: string, params?: unknown): Promise<unknown>;
30
+ dispose(): void;
31
+ cancel(reason?: string): void;
32
+ uiResponse(response: {
33
+ type: string;
34
+ payload: unknown;
35
+ }): void;
36
+ }
37
+
38
+ export { TrezorIpcConnect };
@@ -0,0 +1,38 @@
1
+ import { TrezorProxyClient } from '@bytezhang/hardware-trezor-adapter';
2
+ import { TrezorConnectBridge } from './types.js';
3
+
4
+ /**
5
+ * ITrezorConnect-compatible proxy that forwards all calls to
6
+ * the Electron main process via IPC.
7
+ *
8
+ * Usage:
9
+ * ```ts
10
+ * const bridge = (window as any).trezorConnect;
11
+ * const connect = await TrezorIpcConnect.create(bridge, {
12
+ * manifest: { appUrl: '...', email: '...' },
13
+ * transports: ['NodeUsbTransport'],
14
+ * });
15
+ * // connect now implements ITrezorConnect
16
+ * ```
17
+ */
18
+ declare class TrezorIpcConnect extends TrezorProxyClient {
19
+ private bridge;
20
+ constructor(bridge: TrezorConnectBridge);
21
+ static create(bridge: TrezorConnectBridge, initSettings: {
22
+ manifest: {
23
+ appUrl: string;
24
+ email: string;
25
+ };
26
+ transports?: string[];
27
+ [key: string]: any;
28
+ }): Promise<TrezorIpcConnect>;
29
+ protected sendCall(method: string, params?: unknown): Promise<unknown>;
30
+ dispose(): void;
31
+ cancel(reason?: string): void;
32
+ uiResponse(response: {
33
+ type: string;
34
+ payload: unknown;
35
+ }): void;
36
+ }
37
+
38
+ export { TrezorIpcConnect };
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/renderer.ts
21
+ var renderer_exports = {};
22
+ __export(renderer_exports, {
23
+ TrezorIpcConnect: () => TrezorIpcConnect
24
+ });
25
+ module.exports = __toCommonJS(renderer_exports);
26
+ var import_hardware_trezor_adapter = require("@bytezhang/hardware-trezor-adapter");
27
+ var TrezorIpcConnect = class _TrezorIpcConnect extends import_hardware_trezor_adapter.TrezorProxyClient {
28
+ constructor(bridge) {
29
+ super();
30
+ this.bridge = bridge;
31
+ bridge.onEvent((event) => this.dispatchEvent(event));
32
+ }
33
+ static async create(bridge, initSettings) {
34
+ const instance = new _TrezorIpcConnect(bridge);
35
+ await bridge.init(initSettings);
36
+ return instance;
37
+ }
38
+ sendCall(method, params) {
39
+ return this.bridge.call(method, params);
40
+ }
41
+ dispose() {
42
+ this.removeAllListeners();
43
+ this.bridge.removeEventListeners();
44
+ this.bridge.dispose();
45
+ }
46
+ cancel(reason) {
47
+ this.bridge.cancel(reason);
48
+ }
49
+ uiResponse(response) {
50
+ this.bridge.uiResponse(response);
51
+ }
52
+ };
53
+ // Annotate the CommonJS export names for ESM import in node:
54
+ 0 && (module.exports = {
55
+ TrezorIpcConnect
56
+ });
57
+ //# sourceMappingURL=renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/renderer.ts"],"sourcesContent":["import { TrezorProxyClient } from '@bytezhang/hardware-trezor-adapter';\nimport type { TrezorConnectBridge } from './types';\n\n/**\n * ITrezorConnect-compatible proxy that forwards all calls to\n * the Electron main process via IPC.\n *\n * Usage:\n * ```ts\n * const bridge = (window as any).trezorConnect;\n * const connect = await TrezorIpcConnect.create(bridge, {\n * manifest: { appUrl: '...', email: '...' },\n * transports: ['NodeUsbTransport'],\n * });\n * // connect now implements ITrezorConnect\n * ```\n */\nexport class TrezorIpcConnect extends TrezorProxyClient {\n constructor(private bridge: TrezorConnectBridge) {\n super();\n bridge.onEvent((event: any) => this.dispatchEvent(event));\n }\n\n static async create(\n bridge: TrezorConnectBridge,\n initSettings: {\n manifest: { appUrl: string; email: string };\n transports?: string[];\n [key: string]: any;\n },\n ): Promise<TrezorIpcConnect> {\n const instance = new TrezorIpcConnect(bridge);\n await bridge.init(initSettings);\n return instance;\n }\n\n protected sendCall(method: string, params?: unknown): Promise<unknown> {\n return this.bridge.call(method, params);\n }\n\n dispose(): void {\n this.removeAllListeners();\n this.bridge.removeEventListeners();\n this.bridge.dispose();\n }\n\n cancel(reason?: string): void {\n this.bridge.cancel(reason);\n }\n\n uiResponse(response: { type: string; payload: unknown }): void {\n this.bridge.uiResponse(response);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qCAAkC;AAiB3B,IAAM,mBAAN,MAAM,0BAAyB,iDAAkB;AAAA,EACtD,YAAoB,QAA6B;AAC/C,UAAM;AADY;AAElB,WAAO,QAAQ,CAAC,UAAe,KAAK,cAAc,KAAK,CAAC;AAAA,EAC1D;AAAA,EAEA,aAAa,OACX,QACA,cAK2B;AAC3B,UAAM,WAAW,IAAI,kBAAiB,MAAM;AAC5C,UAAM,OAAO,KAAK,YAAY;AAC9B,WAAO;AAAA,EACT;AAAA,EAEU,SAAS,QAAgB,QAAoC;AACrE,WAAO,KAAK,OAAO,KAAK,QAAQ,MAAM;AAAA,EACxC;AAAA,EAEA,UAAgB;AACd,SAAK,mBAAmB;AACxB,SAAK,OAAO,qBAAqB;AACjC,SAAK,OAAO,QAAQ;AAAA,EACtB;AAAA,EAEA,OAAO,QAAuB;AAC5B,SAAK,OAAO,OAAO,MAAM;AAAA,EAC3B;AAAA,EAEA,WAAW,UAAoD;AAC7D,SAAK,OAAO,WAAW,QAAQ;AAAA,EACjC;AACF;","names":[]}
@@ -0,0 +1,8 @@
1
+ import {
2
+ TrezorIpcConnect
3
+ } from "./chunk-Z33SFKVN.mjs";
4
+ import "./chunk-BJTO5JO5.mjs";
5
+ export {
6
+ TrezorIpcConnect
7
+ };
8
+ //# sourceMappingURL=renderer.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,14 @@
1
+ /** Shape of the API exposed by preload to renderer */
2
+ interface TrezorConnectBridge {
3
+ init: (settings: any) => Promise<void>;
4
+ dispose: () => Promise<void>;
5
+ call: (method: string, params: any) => Promise<any>;
6
+ cancel: (reason?: string) => Promise<void>;
7
+ uiResponse: (response: any) => Promise<void>;
8
+ onEvent: (callback: (event: any) => void) => void;
9
+ removeEventListeners: () => void;
10
+ }
11
+ declare const IPC_CHANNEL = "trezor-connect";
12
+ declare const IPC_EVENT_CHANNEL = "trezor-connect-event";
13
+
14
+ export { IPC_CHANNEL, IPC_EVENT_CHANNEL, type TrezorConnectBridge };
@@ -0,0 +1,14 @@
1
+ /** Shape of the API exposed by preload to renderer */
2
+ interface TrezorConnectBridge {
3
+ init: (settings: any) => Promise<void>;
4
+ dispose: () => Promise<void>;
5
+ call: (method: string, params: any) => Promise<any>;
6
+ cancel: (reason?: string) => Promise<void>;
7
+ uiResponse: (response: any) => Promise<void>;
8
+ onEvent: (callback: (event: any) => void) => void;
9
+ removeEventListeners: () => void;
10
+ }
11
+ declare const IPC_CHANNEL = "trezor-connect";
12
+ declare const IPC_EVENT_CHANNEL = "trezor-connect-event";
13
+
14
+ export { IPC_CHANNEL, IPC_EVENT_CHANNEL, type TrezorConnectBridge };
package/dist/types.js ADDED
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/types.ts
21
+ var types_exports = {};
22
+ __export(types_exports, {
23
+ IPC_CHANNEL: () => IPC_CHANNEL,
24
+ IPC_EVENT_CHANNEL: () => IPC_EVENT_CHANNEL
25
+ });
26
+ module.exports = __toCommonJS(types_exports);
27
+ var IPC_CHANNEL = "trezor-connect";
28
+ var IPC_EVENT_CHANNEL = "trezor-connect-event";
29
+ // Annotate the CommonJS export names for ESM import in node:
30
+ 0 && (module.exports = {
31
+ IPC_CHANNEL,
32
+ IPC_EVENT_CHANNEL
33
+ });
34
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/types.ts"],"sourcesContent":["/** Shape of the API exposed by preload to renderer */\nexport interface TrezorConnectBridge {\n init: (settings: any) => Promise<void>;\n dispose: () => Promise<void>;\n call: (method: string, params: any) => Promise<any>;\n cancel: (reason?: string) => Promise<void>;\n uiResponse: (response: any) => Promise<void>;\n onEvent: (callback: (event: any) => void) => void;\n removeEventListeners: () => void;\n}\n\nexport const IPC_CHANNEL = 'trezor-connect';\nexport const IPC_EVENT_CHANNEL = 'trezor-connect-event';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWO,IAAM,cAAc;AACpB,IAAM,oBAAoB;","names":[]}
package/dist/types.mjs ADDED
@@ -0,0 +1,10 @@
1
+ import "./chunk-BJTO5JO5.mjs";
2
+
3
+ // src/types.ts
4
+ var IPC_CHANNEL = "trezor-connect";
5
+ var IPC_EVENT_CHANNEL = "trezor-connect-event";
6
+ export {
7
+ IPC_CHANNEL,
8
+ IPC_EVENT_CHANNEL
9
+ };
10
+ //# sourceMappingURL=types.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/types.ts"],"sourcesContent":["/** Shape of the API exposed by preload to renderer */\nexport interface TrezorConnectBridge {\n init: (settings: any) => Promise<void>;\n dispose: () => Promise<void>;\n call: (method: string, params: any) => Promise<any>;\n cancel: (reason?: string) => Promise<void>;\n uiResponse: (response: any) => Promise<void>;\n onEvent: (callback: (event: any) => void) => void;\n removeEventListeners: () => void;\n}\n\nexport const IPC_CHANNEL = 'trezor-connect';\nexport const IPC_EVENT_CHANNEL = 'trezor-connect-event';\n"],"mappings":";;;AAWO,IAAM,cAAc;AACpB,IAAM,oBAAoB;","names":[]}
package/package.json ADDED
@@ -0,0 +1,48 @@
1
+ {
2
+ "name": "@bytezhang/trezor-transport-electron",
3
+ "version": "0.0.1",
4
+ "description": "Electron IPC bridge for @trezor/connect — handles all main/renderer process communication",
5
+ "author": "OneKey",
6
+ "license": "MIT",
7
+ "main": "dist/index.js",
8
+ "module": "dist/index.mjs",
9
+ "types": "dist/index.d.ts",
10
+ "exports": {
11
+ ".": {
12
+ "import": { "types": "./dist/index.d.mts", "default": "./dist/index.mjs" },
13
+ "require": { "types": "./dist/index.d.ts", "default": "./dist/index.js" }
14
+ },
15
+ "./main": {
16
+ "import": { "types": "./dist/main.d.mts", "default": "./dist/main.mjs" },
17
+ "require": { "types": "./dist/main.d.ts", "default": "./dist/main.js" }
18
+ },
19
+ "./preload": {
20
+ "import": { "types": "./dist/preload.d.mts", "default": "./dist/preload.mjs" },
21
+ "require": { "types": "./dist/preload.d.ts", "default": "./dist/preload.js" }
22
+ },
23
+ "./renderer": {
24
+ "import": { "types": "./dist/renderer.d.mts", "default": "./dist/renderer.mjs" },
25
+ "require": { "types": "./dist/renderer.d.ts", "default": "./dist/renderer.js" }
26
+ }
27
+ },
28
+ "files": ["dist"],
29
+ "scripts": {
30
+ "build": "tsup",
31
+ "dev": "tsup --watch",
32
+ "clean": "rimraf dist"
33
+ },
34
+ "dependencies": {
35
+ "@bytezhang/hardware-trezor-adapter": "0.0.1"
36
+ },
37
+ "peerDependencies": {
38
+ "@trezor/connect": "^9.0.0",
39
+ "electron": ">=35.0.0"
40
+ },
41
+ "peerDependenciesMeta": {
42
+ "electron": { "optional": true }
43
+ },
44
+ "devDependencies": {
45
+ "electron": "^39.0.0",
46
+ "rimraf": "^5.0.0"
47
+ }
48
+ }