voltkit 0.1.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.
- package/dist/app.d.ts +61 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +98 -0
- package/dist/app.js.map +1 -0
- package/dist/clipboard.d.ts +38 -0
- package/dist/clipboard.d.ts.map +1 -0
- package/dist/clipboard.js +64 -0
- package/dist/clipboard.js.map +1 -0
- package/dist/dialog.d.ts +95 -0
- package/dist/dialog.d.ts.map +1 -0
- package/dist/dialog.js +70 -0
- package/dist/dialog.js.map +1 -0
- package/dist/fs.d.ts +62 -0
- package/dist/fs.d.ts.map +1 -0
- package/dist/fs.js +110 -0
- package/dist/fs.js.map +1 -0
- package/dist/globalShortcut.d.ts +32 -0
- package/dist/globalShortcut.d.ts.map +1 -0
- package/dist/globalShortcut.js +103 -0
- package/dist/globalShortcut.js.map +1 -0
- package/dist/index.d.ts +26 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/internal.d.ts +6 -0
- package/dist/internal.d.ts.map +1 -0
- package/dist/internal.js +6 -0
- package/dist/internal.js.map +1 -0
- package/dist/ipc-contract/aliases.d.ts +4 -0
- package/dist/ipc-contract/aliases.d.ts.map +1 -0
- package/dist/ipc-contract/aliases.js +38 -0
- package/dist/ipc-contract/aliases.js.map +1 -0
- package/dist/ipc-contract/define.d.ts +3 -0
- package/dist/ipc-contract/define.d.ts.map +1 -0
- package/dist/ipc-contract/define.js +7 -0
- package/dist/ipc-contract/define.js.map +1 -0
- package/dist/ipc-contract/handlers.d.ts +3 -0
- package/dist/ipc-contract/handlers.d.ts.map +1 -0
- package/dist/ipc-contract/handlers.js +26 -0
- package/dist/ipc-contract/handlers.js.map +1 -0
- package/dist/ipc-contract/invoker.d.ts +4 -0
- package/dist/ipc-contract/invoker.d.ts.map +1 -0
- package/dist/ipc-contract/invoker.js +32 -0
- package/dist/ipc-contract/invoker.js.map +1 -0
- package/dist/ipc-contract/schema.d.ts +17 -0
- package/dist/ipc-contract/schema.d.ts.map +1 -0
- package/dist/ipc-contract/schema.js +78 -0
- package/dist/ipc-contract/schema.js.map +1 -0
- package/dist/ipc-contract/types.d.ts +45 -0
- package/dist/ipc-contract/types.d.ts.map +1 -0
- package/dist/ipc-contract/types.js +17 -0
- package/dist/ipc-contract/types.js.map +1 -0
- package/dist/ipc-contract/validation.d.ts +4 -0
- package/dist/ipc-contract/validation.d.ts.map +1 -0
- package/dist/ipc-contract/validation.js +24 -0
- package/dist/ipc-contract/validation.js.map +1 -0
- package/dist/ipc-contract.d.ts +25 -0
- package/dist/ipc-contract.d.ts.map +1 -0
- package/dist/ipc-contract.js +9 -0
- package/dist/ipc-contract.js.map +1 -0
- package/dist/ipc.d.ts +85 -0
- package/dist/ipc.d.ts.map +1 -0
- package/dist/ipc.js +196 -0
- package/dist/ipc.js.map +1 -0
- package/dist/menu.d.ts +72 -0
- package/dist/menu.d.ts.map +1 -0
- package/dist/menu.js +179 -0
- package/dist/menu.js.map +1 -0
- package/dist/notification.d.ts +34 -0
- package/dist/notification.d.ts.map +1 -0
- package/dist/notification.js +42 -0
- package/dist/notification.js.map +1 -0
- package/dist/renderer.d.ts +9 -0
- package/dist/renderer.d.ts.map +1 -0
- package/dist/renderer.js +7 -0
- package/dist/renderer.js.map +1 -0
- package/dist/runtime-modules.d.ts +161 -0
- package/dist/runtime-modules.d.ts.map +1 -0
- package/dist/runtime-modules.js +2 -0
- package/dist/runtime-modules.js.map +1 -0
- package/dist/shell.d.ts +22 -0
- package/dist/shell.d.ts.map +1 -0
- package/dist/shell.js +36 -0
- package/dist/shell.js.map +1 -0
- package/dist/tray.d.ts +59 -0
- package/dist/tray.d.ts.map +1 -0
- package/dist/tray.js +114 -0
- package/dist/tray.js.map +1 -0
- package/dist/types.d.ts +200 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/updater.d.ts +61 -0
- package/dist/updater.d.ts.map +1 -0
- package/dist/updater.js +128 -0
- package/dist/updater.js.map +1 -0
- package/dist/window/browser-window.d.ts +41 -0
- package/dist/window/browser-window.d.ts.map +1 -0
- package/dist/window/browser-window.js +219 -0
- package/dist/window/browser-window.js.map +1 -0
- package/dist/window/native-bridge.d.ts +13 -0
- package/dist/window/native-bridge.d.ts.map +1 -0
- package/dist/window/native-bridge.js +44 -0
- package/dist/window/native-bridge.js.map +1 -0
- package/dist/window/registry.d.ts +9 -0
- package/dist/window/registry.d.ts.map +1 -0
- package/dist/window/registry.js +32 -0
- package/dist/window/registry.js.map +1 -0
- package/dist/window/types.d.ts +23 -0
- package/dist/window/types.d.ts.map +1 -0
- package/dist/window/types.js +2 -0
- package/dist/window/types.js.map +1 -0
- package/dist/window.d.ts +3 -0
- package/dist/window.d.ts.map +1 -0
- package/dist/window.js +2 -0
- package/dist/window.js.map +1 -0
- package/package.json +51 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"globalShortcut.d.ts","sourceRoot":"","sources":["../src/globalShortcut.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,KAAK,gBAAgB,GAAG,MAAM,IAAI,CAAC;AAwDnC;;;;;;;;;GASG;AACH,iBAAS,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,gBAAgB,GAAG,OAAO,CAW1E;AAED,6CAA6C;AAC7C,iBAAS,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAI7C;AAED,gDAAgD;AAChD,iBAAS,aAAa,IAAI,IAAI,CAG7B;AAED,yCAAyC;AACzC,iBAAS,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAGlD;AAED,0FAA0F;AAC1F,eAAO,MAAM,cAAc;;;;;CAK1B,CAAC"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Global keyboard shortcut module.
|
|
3
|
+
* Provides registration of global hotkeys that work even when the app is not focused.
|
|
4
|
+
* Requires `permissions: ['globalShortcut']` in volt.config.ts.
|
|
5
|
+
*/
|
|
6
|
+
import { VoltGlobalShortcut } from '@voltkit/volt-native';
|
|
7
|
+
let nativeManager = null;
|
|
8
|
+
const callbackMap = new Map();
|
|
9
|
+
function getNativeManager() {
|
|
10
|
+
if (!nativeManager) {
|
|
11
|
+
nativeManager = new VoltGlobalShortcut();
|
|
12
|
+
}
|
|
13
|
+
return nativeManager;
|
|
14
|
+
}
|
|
15
|
+
const VALID_MODIFIER_TOKENS = new Set([
|
|
16
|
+
'cmdorctrl',
|
|
17
|
+
'cmd',
|
|
18
|
+
'command',
|
|
19
|
+
'meta',
|
|
20
|
+
'super',
|
|
21
|
+
'ctrl',
|
|
22
|
+
'control',
|
|
23
|
+
'alt',
|
|
24
|
+
'option',
|
|
25
|
+
'shift',
|
|
26
|
+
]);
|
|
27
|
+
function isValidKeyToken(token) {
|
|
28
|
+
const upper = token.toUpperCase();
|
|
29
|
+
if (/^[A-Z]$/.test(upper))
|
|
30
|
+
return true;
|
|
31
|
+
if (/^[0-9]$/.test(upper))
|
|
32
|
+
return true;
|
|
33
|
+
if (/^F([1-9]|1[0-9]|2[0-4])$/.test(upper))
|
|
34
|
+
return true;
|
|
35
|
+
return ['SPACE', 'ENTER', 'RETURN', 'ESC', 'ESCAPE', 'TAB', 'UP', 'DOWN', 'LEFT', 'RIGHT'].includes(upper);
|
|
36
|
+
}
|
|
37
|
+
function assertValidAccelerator(accelerator) {
|
|
38
|
+
const parts = accelerator.split('+').map((part) => part.trim()).filter(Boolean);
|
|
39
|
+
if (parts.length < 2) {
|
|
40
|
+
throw new Error(`Invalid accelerator "${accelerator}". Expected at least one modifier and one key.`);
|
|
41
|
+
}
|
|
42
|
+
let keyCount = 0;
|
|
43
|
+
for (const part of parts) {
|
|
44
|
+
const lowered = part.toLowerCase();
|
|
45
|
+
if (VALID_MODIFIER_TOKENS.has(lowered)) {
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
if (!isValidKeyToken(part)) {
|
|
49
|
+
throw new Error(`Invalid accelerator key token "${part}" in "${accelerator}".`);
|
|
50
|
+
}
|
|
51
|
+
keyCount += 1;
|
|
52
|
+
}
|
|
53
|
+
if (keyCount !== 1) {
|
|
54
|
+
throw new Error(`Invalid accelerator "${accelerator}". Exactly one non-modifier key token is required.`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Register a global keyboard shortcut.
|
|
59
|
+
*
|
|
60
|
+
* @example
|
|
61
|
+
* ```ts
|
|
62
|
+
* globalShortcut.register('CmdOrCtrl+Shift+P', () => {
|
|
63
|
+
* console.log('Shortcut triggered!');
|
|
64
|
+
* });
|
|
65
|
+
* ```
|
|
66
|
+
*/
|
|
67
|
+
function register(accelerator, callback) {
|
|
68
|
+
assertValidAccelerator(accelerator);
|
|
69
|
+
if (callbackMap.has(accelerator)) {
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
getNativeManager().register(accelerator, () => {
|
|
73
|
+
const cb = callbackMap.get(accelerator);
|
|
74
|
+
if (cb)
|
|
75
|
+
cb();
|
|
76
|
+
});
|
|
77
|
+
callbackMap.set(accelerator, callback);
|
|
78
|
+
return true;
|
|
79
|
+
}
|
|
80
|
+
/** Unregister a global keyboard shortcut. */
|
|
81
|
+
function unregister(accelerator) {
|
|
82
|
+
assertValidAccelerator(accelerator);
|
|
83
|
+
getNativeManager().unregister(accelerator);
|
|
84
|
+
callbackMap.delete(accelerator);
|
|
85
|
+
}
|
|
86
|
+
/** Unregister all global keyboard shortcuts. */
|
|
87
|
+
function unregisterAll() {
|
|
88
|
+
getNativeManager().unregisterAll();
|
|
89
|
+
callbackMap.clear();
|
|
90
|
+
}
|
|
91
|
+
/** Check if a shortcut is registered. */
|
|
92
|
+
function isRegistered(accelerator) {
|
|
93
|
+
assertValidAccelerator(accelerator);
|
|
94
|
+
return getNativeManager().isRegistered(accelerator);
|
|
95
|
+
}
|
|
96
|
+
/** Global shortcut APIs. Requires `permissions: ['globalShortcut']` in volt.config.ts. */
|
|
97
|
+
export const globalShortcut = {
|
|
98
|
+
register,
|
|
99
|
+
unregister,
|
|
100
|
+
unregisterAll,
|
|
101
|
+
isRegistered,
|
|
102
|
+
};
|
|
103
|
+
//# sourceMappingURL=globalShortcut.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"globalShortcut.js","sourceRoot":"","sources":["../src/globalShortcut.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import './runtime-modules.js';
|
|
2
|
+
export { VoltApp, createApp, getApp } from './app.js';
|
|
3
|
+
export { BrowserWindow } from './window.js';
|
|
4
|
+
export { ipcMain, invoke, on, off } from './ipc.js';
|
|
5
|
+
export type { IpcErrorCode, IpcProcessOptions, IpcProcessResponse } from './ipc.js';
|
|
6
|
+
export { createContractInvoker, createLegacyInvokeAdapter, createSchema, defineCommands, isIpcContractValidationError, registerContractHandlers, resolveContractChannel, IpcContractValidationError, IpcSchema, } from './ipc-contract.js';
|
|
7
|
+
export type { ContractHandlers, InferCommandRequest, InferCommandResponse, InferSchemaValue, IpcCommandDefinition, IpcCommandMap, IpcInvokeFn, IpcRegistrar, IpcSchema as IpcSchemaType, TypedIpcInvoker, } from './ipc-contract.js';
|
|
8
|
+
export { Tray } from './tray.js';
|
|
9
|
+
export { Menu, MenuItem } from './menu.js';
|
|
10
|
+
export { dialog } from './dialog.js';
|
|
11
|
+
export { clipboard } from './clipboard.js';
|
|
12
|
+
export { Notification } from './notification.js';
|
|
13
|
+
export { fs } from './fs.js';
|
|
14
|
+
export { shell } from './shell.js';
|
|
15
|
+
export { globalShortcut } from './globalShortcut.js';
|
|
16
|
+
export { autoUpdater } from './updater.js';
|
|
17
|
+
export { defineConfig } from './types.js';
|
|
18
|
+
export type { VoltConfig, WindowOptions, Permission, BuildConfig, PackageConfig, SigningConfig, MacOSSigningConfig, WindowsSigningConfig, AzureTrustedSigningConfig, DigiCertKeyLockerConfig, UpdaterConfig, UpdaterTelemetryConfig, RuntimeConfig, } from './types.js';
|
|
19
|
+
export type { TrayOptions, TrayMenuItem } from './tray.js';
|
|
20
|
+
export type { MenuItemOptions, MenuItemRole } from './menu.js';
|
|
21
|
+
export type { OpenDialogOptions, OpenDialogResult, SaveDialogOptions, SaveDialogResult, MessageBoxOptions, MessageBoxResult, FileFilter, } from './dialog.js';
|
|
22
|
+
export type { ClipboardImage } from './clipboard.js';
|
|
23
|
+
export type { NotificationOptions } from './notification.js';
|
|
24
|
+
export type { FileInfo } from './fs.js';
|
|
25
|
+
export type { UpdateInfo } from './updater.js';
|
|
26
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAE9B,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AACpD,YAAY,EAAE,YAAY,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AACpF,OAAO,EACL,qBAAqB,EACrB,yBAAyB,EACzB,YAAY,EACZ,cAAc,EACd,4BAA4B,EAC5B,wBAAwB,EACxB,sBAAsB,EACtB,0BAA0B,EAC1B,SAAS,GACV,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EACV,gBAAgB,EAChB,mBAAmB,EACnB,oBAAoB,EACpB,gBAAgB,EAChB,oBAAoB,EACpB,aAAa,EACb,WAAW,EACX,YAAY,EACZ,SAAS,IAAI,aAAa,EAC1B,eAAe,GAChB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAC7B,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,YAAY,EACV,UAAU,EACV,aAAa,EACb,UAAU,EACV,WAAW,EACX,aAAa,EACb,aAAa,EACb,kBAAkB,EAClB,oBAAoB,EACpB,yBAAyB,EACzB,uBAAuB,EACvB,aAAa,EACb,sBAAsB,EACtB,aAAa,GACd,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAC3D,YAAY,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAC/D,YAAY,EACV,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,EAChB,UAAU,GACX,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACrD,YAAY,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACxC,YAAY,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import './runtime-modules.js';
|
|
2
|
+
export { VoltApp, createApp, getApp } from './app.js';
|
|
3
|
+
export { BrowserWindow } from './window.js';
|
|
4
|
+
export { ipcMain, invoke, on, off } from './ipc.js';
|
|
5
|
+
export { createContractInvoker, createLegacyInvokeAdapter, createSchema, defineCommands, isIpcContractValidationError, registerContractHandlers, resolveContractChannel, IpcContractValidationError, IpcSchema, } from './ipc-contract.js';
|
|
6
|
+
export { Tray } from './tray.js';
|
|
7
|
+
export { Menu, MenuItem } from './menu.js';
|
|
8
|
+
export { dialog } from './dialog.js';
|
|
9
|
+
export { clipboard } from './clipboard.js';
|
|
10
|
+
export { Notification } from './notification.js';
|
|
11
|
+
export { fs } from './fs.js';
|
|
12
|
+
export { shell } from './shell.js';
|
|
13
|
+
export { globalShortcut } from './globalShortcut.js';
|
|
14
|
+
export { autoUpdater } from './updater.js';
|
|
15
|
+
export { defineConfig } from './types.js';
|
|
16
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAE9B,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAEpD,OAAO,EACL,qBAAqB,EACrB,yBAAyB,EACzB,YAAY,EACZ,cAAc,EACd,4BAA4B,EAC5B,wBAAwB,EACxB,sBAAsB,EACtB,0BAA0B,EAC1B,SAAS,GACV,MAAM,mBAAmB,CAAC;AAa3B,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAC7B,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"internal.d.ts","sourceRoot":"","sources":["../src/internal.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,2BAA2B,EAAE,MAAM,WAAW,CAAC"}
|
package/dist/internal.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"internal.js","sourceRoot":"","sources":["../src/internal.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,2BAA2B,EAAE,MAAM,WAAW,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { IpcCommandMap } from './types.js';
|
|
2
|
+
export declare function buildAliasLookup<TCommands extends IpcCommandMap>(commands: TCommands): Map<string, string>;
|
|
3
|
+
export declare function resolveContractChannel<TCommands extends IpcCommandMap>(commands: TCommands, channel: string): string;
|
|
4
|
+
//# sourceMappingURL=aliases.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aliases.d.ts","sourceRoot":"","sources":["../../src/ipc-contract/aliases.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAkBhD,wBAAgB,gBAAgB,CAAC,SAAS,SAAS,aAAa,EAC9D,QAAQ,EAAE,SAAS,GAClB,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAyBrB;AAED,wBAAgB,sBAAsB,CAAC,SAAS,SAAS,aAAa,EACpE,QAAQ,EAAE,SAAS,EACnB,OAAO,EAAE,MAAM,GACd,MAAM,CAGR"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
function normalizeAliases(aliases) {
|
|
2
|
+
if (!aliases || aliases.length === 0) {
|
|
3
|
+
return [];
|
|
4
|
+
}
|
|
5
|
+
const unique = new Set();
|
|
6
|
+
for (const alias of aliases) {
|
|
7
|
+
const normalized = alias.trim();
|
|
8
|
+
if (!normalized) {
|
|
9
|
+
continue;
|
|
10
|
+
}
|
|
11
|
+
unique.add(normalized);
|
|
12
|
+
}
|
|
13
|
+
return [...unique];
|
|
14
|
+
}
|
|
15
|
+
export function buildAliasLookup(commands) {
|
|
16
|
+
const lookup = new Map();
|
|
17
|
+
const commandKeys = Object.keys(commands);
|
|
18
|
+
for (const commandKey of commandKeys) {
|
|
19
|
+
const existing = lookup.get(commandKey);
|
|
20
|
+
if (existing && existing !== commandKey) {
|
|
21
|
+
throw new Error(`IPC contract alias conflict: channel "${commandKey}" already mapped to "${existing}"`);
|
|
22
|
+
}
|
|
23
|
+
lookup.set(commandKey, commandKey);
|
|
24
|
+
for (const alias of normalizeAliases(commands[commandKey].aliases)) {
|
|
25
|
+
const aliasOwner = lookup.get(alias);
|
|
26
|
+
if (aliasOwner && aliasOwner !== commandKey) {
|
|
27
|
+
throw new Error(`IPC contract alias conflict: alias "${alias}" is mapped to both "${aliasOwner}" and "${commandKey}"`);
|
|
28
|
+
}
|
|
29
|
+
lookup.set(alias, commandKey);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return lookup;
|
|
33
|
+
}
|
|
34
|
+
export function resolveContractChannel(commands, channel) {
|
|
35
|
+
const aliasLookup = buildAliasLookup(commands);
|
|
36
|
+
return aliasLookup.get(channel) ?? channel;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=aliases.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aliases.js","sourceRoot":"","sources":["../../src/ipc-contract/aliases.ts"],"names":[],"mappings":"AAEA,SAAS,gBAAgB,CAAC,OAAsC;IAC9D,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrC,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;IACjC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;QAChC,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,SAAS;QACX,CAAC;QACD,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACzB,CAAC;IACD,OAAO,CAAC,GAAG,MAAM,CAAC,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,QAAmB;IAEnB,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAoC,CAAC;IAE7E,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;QACrC,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACxC,IAAI,QAAQ,IAAI,QAAQ,KAAK,UAAU,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CACb,yCAAyC,UAAU,wBAAwB,QAAQ,GAAG,CACvF,CAAC;QACJ,CAAC;QACD,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QAEnC,KAAK,MAAM,KAAK,IAAI,gBAAgB,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;YACnE,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACrC,IAAI,UAAU,IAAI,UAAU,KAAK,UAAU,EAAE,CAAC;gBAC5C,MAAM,IAAI,KAAK,CACb,uCAAuC,KAAK,wBAAwB,UAAU,UAAU,UAAU,GAAG,CACtG,CAAC;YACJ,CAAC;YACD,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,sBAAsB,CACpC,QAAmB,EACnB,OAAe;IAEf,MAAM,WAAW,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAC/C,OAAO,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC;AAC7C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"define.d.ts","sourceRoot":"","sources":["../../src/ipc-contract/define.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,wBAAgB,cAAc,CAAC,KAAK,CAAC,SAAS,SAAS,aAAa,EAClE,QAAQ,EAAE,SAAS,GAClB,SAAS,CAIX"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"define.js","sourceRoot":"","sources":["../../src/ipc-contract/define.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAGhD,MAAM,UAAU,cAAc,CAC5B,QAAmB;IAEnB,0EAA0E;IAC1E,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAC3B,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { ContractHandlers, IpcCommandMap, IpcRegistrar } from './types.js';
|
|
2
|
+
export declare function registerContractHandlers<TCommands extends IpcCommandMap>(ipc: IpcRegistrar, commands: TCommands, handlers: ContractHandlers<TCommands>): void;
|
|
3
|
+
//# sourceMappingURL=handlers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../../src/ipc-contract/handlers.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,gBAAgB,EAEhB,aAAa,EACb,YAAY,EACb,MAAM,YAAY,CAAC;AAEpB,wBAAgB,wBAAwB,CAAC,SAAS,SAAS,aAAa,EACtE,GAAG,EAAE,YAAY,EACjB,QAAQ,EAAE,SAAS,EACnB,QAAQ,EAAE,gBAAgB,CAAC,SAAS,CAAC,GACpC,IAAI,CA0BN"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { buildAliasLookup } from './aliases.js';
|
|
2
|
+
import { parseWithSchema, registerChannel } from './validation.js';
|
|
3
|
+
export function registerContractHandlers(ipc, commands, handlers) {
|
|
4
|
+
const aliasLookup = buildAliasLookup(commands);
|
|
5
|
+
const commandKeys = Object.keys(commands);
|
|
6
|
+
for (const commandKey of commandKeys) {
|
|
7
|
+
const command = commands[commandKey];
|
|
8
|
+
const handler = handlers[commandKey];
|
|
9
|
+
if (typeof handler !== 'function') {
|
|
10
|
+
throw new Error(`Missing handler for IPC command: ${commandKey}`);
|
|
11
|
+
}
|
|
12
|
+
const wrapped = async (rawArgs) => {
|
|
13
|
+
const args = parseWithSchema(command.request, rawArgs, commandKey, 'request');
|
|
14
|
+
const result = await handler(args);
|
|
15
|
+
return parseWithSchema(command.response, result, commandKey, 'response');
|
|
16
|
+
};
|
|
17
|
+
registerChannel(ipc, commandKey, wrapped);
|
|
18
|
+
for (const [alias, canonical] of aliasLookup.entries()) {
|
|
19
|
+
if (canonical !== commandKey || alias === commandKey) {
|
|
20
|
+
continue;
|
|
21
|
+
}
|
|
22
|
+
registerChannel(ipc, alias, wrapped);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=handlers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handlers.js","sourceRoot":"","sources":["../../src/ipc-contract/handlers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAQnE,MAAM,UAAU,wBAAwB,CACtC,GAAiB,EACjB,QAAmB,EACnB,QAAqC;IAErC,MAAM,WAAW,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAC/C,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAoC,CAAC;IAE7E,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;QACrC,MAAM,OAAO,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;QACrC,MAAM,OAAO,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;QACrC,IAAI,OAAO,OAAO,KAAK,UAAU,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,oCAAoC,UAAU,EAAE,CAAC,CAAC;QACpE,CAAC;QAED,MAAM,OAAO,GAAG,KAAK,EAAE,OAAgB,EAAoB,EAAE;YAC3D,MAAM,IAAI,GAAG,eAAe,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;YAC9E,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAA2C,CAAC,CAAC;YAC1E,OAAO,eAAe,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;QAC3E,CAAC,CAAC;QAEF,eAAe,CAAC,GAAG,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;QAE1C,KAAK,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE,CAAC;YACvD,IAAI,SAAS,KAAK,UAAU,IAAI,KAAK,KAAK,UAAU,EAAE,CAAC;gBACrD,SAAS;YACX,CAAC;YACD,eAAe,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { IpcCommandMap, IpcInvokeFn, TypedIpcInvoker } from './types.js';
|
|
2
|
+
export declare function createLegacyInvokeAdapter<TCommands extends IpcCommandMap>(commands: TCommands, invokeFn: IpcInvokeFn): (channel: string, args: unknown) => Promise<unknown>;
|
|
3
|
+
export declare function createContractInvoker<TCommands extends IpcCommandMap>(commands: TCommands, invokeFn: IpcInvokeFn): TypedIpcInvoker<TCommands>;
|
|
4
|
+
//# sourceMappingURL=invoker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invoker.d.ts","sourceRoot":"","sources":["../../src/ipc-contract/invoker.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAGV,aAAa,EACb,WAAW,EACX,eAAe,EAChB,MAAM,YAAY,CAAC;AAEpB,wBAAgB,yBAAyB,CAAC,SAAS,SAAS,aAAa,EACvE,QAAQ,EAAE,SAAS,EACnB,QAAQ,EAAE,WAAW,GACpB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAMtD;AAED,wBAAgB,qBAAqB,CAAC,SAAS,SAAS,aAAa,EACnE,QAAQ,EAAE,SAAS,EACnB,QAAQ,EAAE,WAAW,GACpB,eAAe,CAAC,SAAS,CAAC,CAiC5B"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { buildAliasLookup } from './aliases.js';
|
|
2
|
+
import { parseWithSchema } from './validation.js';
|
|
3
|
+
export function createLegacyInvokeAdapter(commands, invokeFn) {
|
|
4
|
+
const aliasLookup = buildAliasLookup(commands);
|
|
5
|
+
return async (channel, args) => {
|
|
6
|
+
const resolvedChannel = aliasLookup.get(channel) ?? channel;
|
|
7
|
+
return invokeFn(resolvedChannel, args);
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
export function createContractInvoker(commands, invokeFn) {
|
|
11
|
+
const aliasLookup = buildAliasLookup(commands);
|
|
12
|
+
const resolveChannel = (channel) => aliasLookup.get(channel) ?? channel;
|
|
13
|
+
const invokeLegacy = async (channel, args) => {
|
|
14
|
+
const resolvedChannel = resolveChannel(channel);
|
|
15
|
+
return invokeFn(resolvedChannel, args);
|
|
16
|
+
};
|
|
17
|
+
return {
|
|
18
|
+
resolveChannel,
|
|
19
|
+
invokeLegacy,
|
|
20
|
+
async invoke(channel, args) {
|
|
21
|
+
const resolvedChannel = resolveChannel(channel);
|
|
22
|
+
if (!Object.prototype.hasOwnProperty.call(commands, resolvedChannel)) {
|
|
23
|
+
throw new Error(`Unknown IPC contract channel: ${String(channel)}`);
|
|
24
|
+
}
|
|
25
|
+
const command = commands[resolvedChannel];
|
|
26
|
+
const parsedArgs = parseWithSchema(command.request, args, resolvedChannel, 'request');
|
|
27
|
+
const rawResult = await invokeFn(resolvedChannel, parsedArgs);
|
|
28
|
+
return parseWithSchema(command.response, rawResult, resolvedChannel, 'response');
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=invoker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invoker.js","sourceRoot":"","sources":["../../src/ipc-contract/invoker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AASlD,MAAM,UAAU,yBAAyB,CACvC,QAAmB,EACnB,QAAqB;IAErB,MAAM,WAAW,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAC/C,OAAO,KAAK,EAAE,OAAe,EAAE,IAAa,EAAoB,EAAE;QAChE,MAAM,eAAe,GAAG,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC;QAC5D,OAAO,QAAQ,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;IACzC,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,QAAmB,EACnB,QAAqB;IAErB,MAAM,WAAW,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAE/C,MAAM,cAAc,GAAG,CAAC,OAAe,EAAU,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC;IAExF,MAAM,YAAY,GAAG,KAAK,EAAE,OAAe,EAAE,IAAa,EAAoB,EAAE;QAC9E,MAAM,eAAe,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;QAChD,OAAO,QAAQ,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;IACzC,CAAC,CAAC;IAEF,OAAO;QACL,cAAc;QACd,YAAY;QACZ,KAAK,CAAC,MAAM,CACV,OAAa,EACb,IAA0C;YAE1C,MAAM,eAAe,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;YAChD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC,EAAE,CAAC;gBACrE,MAAM,IAAI,KAAK,CAAC,iCAAiC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACtE,CAAC;YAED,MAAM,OAAO,GAAG,QAAQ,CAAC,eAAkC,CAAC,CAAC;YAC7D,MAAM,UAAU,GAAG,eAAe,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,SAAS,CAAC,CAAC;YACtF,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;YAC9D,OAAO,eAAe,CACpB,OAAO,CAAC,QAAQ,EAChB,SAAS,EACT,eAAe,EACf,UAAU,CAC8B,CAAC;QAC7C,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { InferSchemaValue, IpcSchema as IpcSchemaType } from './types.js';
|
|
2
|
+
type IpcObjectShape = Record<string, IpcSchemaType<unknown>>;
|
|
3
|
+
export declare function createSchema<T>(name: string, guard: (value: unknown) => value is T): IpcSchemaType<T>;
|
|
4
|
+
export declare const IpcSchema: {
|
|
5
|
+
readonly custom: <T>(name: string, guard: (value: unknown) => value is T) => IpcSchemaType<T>;
|
|
6
|
+
readonly unknown: (name?: string) => IpcSchemaType<unknown>;
|
|
7
|
+
readonly null: (name?: string) => IpcSchemaType<null>;
|
|
8
|
+
readonly string: (name?: string) => IpcSchemaType<string>;
|
|
9
|
+
readonly number: (name?: string) => IpcSchemaType<number>;
|
|
10
|
+
readonly boolean: (name?: string) => IpcSchemaType<boolean>;
|
|
11
|
+
readonly literal: <TLiteral extends string | number | boolean | null>(expected: TLiteral, name?: string) => IpcSchemaType<TLiteral>;
|
|
12
|
+
readonly optional: <T>(schema: IpcSchemaType<T>, name?: string) => IpcSchemaType<T | undefined>;
|
|
13
|
+
readonly array: <TItem>(itemSchema: IpcSchemaType<TItem>, name?: string) => IpcSchemaType<TItem[]>;
|
|
14
|
+
readonly object: <TShape extends IpcObjectShape>(shape: TShape, name?: string) => IpcSchemaType<{ [TKey in keyof TShape]: InferSchemaValue<TShape[TKey]>; }>;
|
|
15
|
+
};
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/ipc-contract/schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,SAAS,IAAI,aAAa,EAAE,MAAM,YAAY,CAAC;AAE/E,KAAK,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC;AAE7D,wBAAgB,YAAY,CAAC,CAAC,EAC5B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,KAAK,IAAI,CAAC,GACpC,aAAa,CAAC,CAAC,CAAC,CAUlB;AAED,eAAO,MAAM,SAAS;sBACb,CAAC,QAAQ,MAAM,SAAS,CAAC,KAAK,EAAE,OAAO,KAAK,KAAK,IAAI,CAAC,KAAG,aAAa,CAAC,CAAC,CAAC;yCAIrD,aAAa,CAAC,OAAO,CAAC;sCAS5B,aAAa,CAAC,IAAI,CAAC;wCAIf,aAAa,CAAC,MAAM,CAAC;wCAIrB,aAAa,CAAC,MAAM,CAAC;yCAInB,aAAa,CAAC,OAAO,CAAC;uBAIzC,QAAQ,SAAS,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,YAC7C,QAAQ,oBAEjB,aAAa,CAAC,QAAQ,CAAC;wBAIjB,CAAC,UACA,aAAa,CAAC,CAAC,CAAC,oBAEvB,aAAa,CAAC,CAAC,GAAG,SAAS,CAAC;qBAYzB,KAAK,cACG,aAAa,CAAC,KAAK,CAAC,oBAE/B,aAAa,CAAC,KAAK,EAAE,CAAC;sBAYlB,MAAM,SAAS,cAAc,SAC3B,MAAM,oBAEZ,aAAa,CAAC,GAAG,IAAI,IAAI,MAAM,MAAM,GAAG,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAE,CAAC;CAiBpE,CAAC"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
export function createSchema(name, guard) {
|
|
2
|
+
return {
|
|
3
|
+
name,
|
|
4
|
+
parse(value) {
|
|
5
|
+
if (guard(value)) {
|
|
6
|
+
return value;
|
|
7
|
+
}
|
|
8
|
+
throw new Error(`expected ${name}`);
|
|
9
|
+
},
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
export const IpcSchema = {
|
|
13
|
+
custom(name, guard) {
|
|
14
|
+
return createSchema(name, guard);
|
|
15
|
+
},
|
|
16
|
+
unknown(name = 'unknown') {
|
|
17
|
+
return {
|
|
18
|
+
name,
|
|
19
|
+
parse(value) {
|
|
20
|
+
return value;
|
|
21
|
+
},
|
|
22
|
+
};
|
|
23
|
+
},
|
|
24
|
+
null(name = 'null') {
|
|
25
|
+
return createSchema(name, (value) => value === null);
|
|
26
|
+
},
|
|
27
|
+
string(name = 'string') {
|
|
28
|
+
return createSchema(name, (value) => typeof value === 'string');
|
|
29
|
+
},
|
|
30
|
+
number(name = 'number') {
|
|
31
|
+
return createSchema(name, (value) => typeof value === 'number');
|
|
32
|
+
},
|
|
33
|
+
boolean(name = 'boolean') {
|
|
34
|
+
return createSchema(name, (value) => typeof value === 'boolean');
|
|
35
|
+
},
|
|
36
|
+
literal(expected, name = `literal(${String(expected)})`) {
|
|
37
|
+
return createSchema(name, (value) => value === expected);
|
|
38
|
+
},
|
|
39
|
+
optional(schema, name = `optional(${schema.name ?? 'value'})`) {
|
|
40
|
+
return {
|
|
41
|
+
name,
|
|
42
|
+
parse(value) {
|
|
43
|
+
if (value === undefined) {
|
|
44
|
+
return undefined;
|
|
45
|
+
}
|
|
46
|
+
return schema.parse(value);
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
},
|
|
50
|
+
array(itemSchema, name = `array(${itemSchema.name ?? 'item'})`) {
|
|
51
|
+
return {
|
|
52
|
+
name,
|
|
53
|
+
parse(value) {
|
|
54
|
+
if (!Array.isArray(value)) {
|
|
55
|
+
throw new Error(`expected ${name}`);
|
|
56
|
+
}
|
|
57
|
+
return value.map((item) => itemSchema.parse(item));
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
},
|
|
61
|
+
object(shape, name = 'object') {
|
|
62
|
+
return {
|
|
63
|
+
name,
|
|
64
|
+
parse(value) {
|
|
65
|
+
if (!value || typeof value !== 'object' || Array.isArray(value)) {
|
|
66
|
+
throw new Error(`expected ${name}`);
|
|
67
|
+
}
|
|
68
|
+
const record = value;
|
|
69
|
+
const parsed = {};
|
|
70
|
+
for (const key of Object.keys(shape)) {
|
|
71
|
+
parsed[key] = shape[key].parse(record[key]);
|
|
72
|
+
}
|
|
73
|
+
return parsed;
|
|
74
|
+
},
|
|
75
|
+
};
|
|
76
|
+
},
|
|
77
|
+
};
|
|
78
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/ipc-contract/schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
export interface IpcSchema<T> {
|
|
2
|
+
/** Human-readable schema name used in validation errors. */
|
|
3
|
+
readonly name?: string;
|
|
4
|
+
/** Parse and validate a value. Throw when validation fails. */
|
|
5
|
+
parse(value: unknown): T;
|
|
6
|
+
}
|
|
7
|
+
export type InferSchemaValue<TSchema> = TSchema extends IpcSchema<infer TValue> ? TValue : never;
|
|
8
|
+
export interface IpcCommandDefinition<TRequest = unknown, TResponse = unknown> {
|
|
9
|
+
/** Request payload schema (renderer -> backend). */
|
|
10
|
+
request?: IpcSchema<TRequest>;
|
|
11
|
+
/** Response payload schema (backend -> renderer). */
|
|
12
|
+
response?: IpcSchema<TResponse>;
|
|
13
|
+
/** Legacy channel names that should map to this command key. */
|
|
14
|
+
aliases?: readonly string[];
|
|
15
|
+
}
|
|
16
|
+
export type IpcCommandMap = Record<string, IpcCommandDefinition<unknown, unknown>>;
|
|
17
|
+
export type InferCommandRequest<TCommand> = TCommand extends IpcCommandDefinition<infer TRequest, unknown> ? TRequest : never;
|
|
18
|
+
export type InferCommandResponse<TCommand> = TCommand extends IpcCommandDefinition<unknown, infer TResponse> ? TResponse : never;
|
|
19
|
+
export type ContractHandlers<TCommands extends IpcCommandMap> = {
|
|
20
|
+
[TKey in keyof TCommands]: (args: InferCommandRequest<TCommands[TKey]>) => Promise<InferCommandResponse<TCommands[TKey]>> | InferCommandResponse<TCommands[TKey]>;
|
|
21
|
+
};
|
|
22
|
+
export interface IpcRegistrar {
|
|
23
|
+
handle(channel: string, handler: (args: unknown) => Promise<unknown> | unknown): void;
|
|
24
|
+
hasHandler?(channel: string): boolean;
|
|
25
|
+
}
|
|
26
|
+
export type IpcInvokeFn = (channel: string, args: unknown) => Promise<unknown>;
|
|
27
|
+
export interface TypedIpcInvoker<TCommands extends IpcCommandMap> {
|
|
28
|
+
invoke<TKey extends keyof TCommands & string>(channel: TKey, args: InferCommandRequest<TCommands[TKey]>): Promise<InferCommandResponse<TCommands[TKey]>>;
|
|
29
|
+
/**
|
|
30
|
+
* Compatibility path for untyped, legacy callers.
|
|
31
|
+
* Legacy aliases are resolved to canonical command keys before dispatch.
|
|
32
|
+
*/
|
|
33
|
+
invokeLegacy(channel: string, args: unknown): Promise<unknown>;
|
|
34
|
+
/** Resolve a legacy alias to its canonical command key. */
|
|
35
|
+
resolveChannel(channel: string): string;
|
|
36
|
+
}
|
|
37
|
+
export declare class IpcContractValidationError extends Error {
|
|
38
|
+
readonly channel: string;
|
|
39
|
+
readonly phase: 'request' | 'response';
|
|
40
|
+
readonly details?: unknown | undefined;
|
|
41
|
+
readonly code: "IPC_CONTRACT_VALIDATION_ERROR";
|
|
42
|
+
constructor(channel: string, phase: 'request' | 'response', message: string, details?: unknown | undefined);
|
|
43
|
+
}
|
|
44
|
+
export declare function isIpcContractValidationError(error: unknown): error is IpcContractValidationError;
|
|
45
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/ipc-contract/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export class IpcContractValidationError extends Error {
|
|
2
|
+
channel;
|
|
3
|
+
phase;
|
|
4
|
+
details;
|
|
5
|
+
code = 'IPC_CONTRACT_VALIDATION_ERROR';
|
|
6
|
+
constructor(channel, phase, message, details) {
|
|
7
|
+
super(message);
|
|
8
|
+
this.channel = channel;
|
|
9
|
+
this.phase = phase;
|
|
10
|
+
this.details = details;
|
|
11
|
+
this.name = 'IpcContractValidationError';
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
export function isIpcContractValidationError(error) {
|
|
15
|
+
return error instanceof IpcContractValidationError;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/ipc-contract/types.ts"],"names":[],"mappings":"AAyDA,MAAM,OAAO,0BAA2B,SAAQ,KAAK;IAIxC;IACA;IAEA;IANF,IAAI,GAAG,+BAAwC,CAAC;IAEzD,YACW,OAAe,EACf,KAA6B,EACtC,OAAe,EACN,OAAiB;QAE1B,KAAK,CAAC,OAAO,CAAC,CAAC;QALN,YAAO,GAAP,OAAO,CAAQ;QACf,UAAK,GAAL,KAAK,CAAwB;QAE7B,YAAO,GAAP,OAAO,CAAU;QAG1B,IAAI,CAAC,IAAI,GAAG,4BAA4B,CAAC;IAC3C,CAAC;CACF;AAED,MAAM,UAAU,4BAA4B,CAAC,KAAc;IACzD,OAAO,KAAK,YAAY,0BAA0B,CAAC;AACrD,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { type IpcRegistrar, type IpcSchema } from './types.js';
|
|
2
|
+
export declare function registerChannel(ipc: IpcRegistrar, channel: string, handler: (args: unknown) => Promise<unknown> | unknown): void;
|
|
3
|
+
export declare function parseWithSchema<T>(schema: IpcSchema<T> | undefined, value: unknown, channel: string, phase: 'request' | 'response'): T;
|
|
4
|
+
//# sourceMappingURL=validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/ipc-contract/validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,YAAY,EACjB,KAAK,SAAS,EACf,MAAM,YAAY,CAAC;AAEpB,wBAAgB,eAAe,CAC7B,GAAG,EAAE,YAAY,EACjB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,GACrD,IAAI,CAKN;AAED,wBAAgB,eAAe,CAAC,CAAC,EAC/B,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,EAChC,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,SAAS,GAAG,UAAU,GAC5B,CAAC,CAoBH"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { IpcContractValidationError, isIpcContractValidationError, } from './types.js';
|
|
2
|
+
export function registerChannel(ipc, channel, handler) {
|
|
3
|
+
if (typeof ipc.hasHandler === 'function' && ipc.hasHandler(channel)) {
|
|
4
|
+
throw new Error(`IPC handler already registered for channel: ${channel}`);
|
|
5
|
+
}
|
|
6
|
+
ipc.handle(channel, handler);
|
|
7
|
+
}
|
|
8
|
+
export function parseWithSchema(schema, value, channel, phase) {
|
|
9
|
+
if (!schema) {
|
|
10
|
+
return value;
|
|
11
|
+
}
|
|
12
|
+
try {
|
|
13
|
+
return schema.parse(value);
|
|
14
|
+
}
|
|
15
|
+
catch (error) {
|
|
16
|
+
if (isIpcContractValidationError(error)) {
|
|
17
|
+
throw error;
|
|
18
|
+
}
|
|
19
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
20
|
+
const schemaName = schema.name ? ` (${schema.name})` : '';
|
|
21
|
+
throw new IpcContractValidationError(channel, phase, `IPC contract ${phase} validation failed for "${channel}"${schemaName}: ${message}`, error);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/ipc-contract/validation.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,0BAA0B,EAC1B,4BAA4B,GAG7B,MAAM,YAAY,CAAC;AAEpB,MAAM,UAAU,eAAe,CAC7B,GAAiB,EACjB,OAAe,EACf,OAAsD;IAEtD,IAAI,OAAO,GAAG,CAAC,UAAU,KAAK,UAAU,IAAI,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACpE,MAAM,IAAI,KAAK,CAAC,+CAA+C,OAAO,EAAE,CAAC,CAAC;IAC5E,CAAC;IACD,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,MAAgC,EAChC,KAAc,EACd,OAAe,EACf,KAA6B;IAE7B,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,KAAU,CAAC;IACpB,CAAC;IAED,IAAI,CAAC;QACH,OAAO,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,4BAA4B,CAAC,KAAK,CAAC,EAAE,CAAC;YACxC,MAAM,KAAK,CAAC;QACd,CAAC;QACD,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1D,MAAM,IAAI,0BAA0B,CAClC,OAAO,EACP,KAAK,EACL,gBAAgB,KAAK,2BAA2B,OAAO,IAAI,UAAU,KAAK,OAAO,EAAE,EACnF,KAAK,CACN,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export type { ContractHandlers, InferCommandRequest, InferCommandResponse, InferSchemaValue, IpcCommandDefinition, IpcCommandMap, IpcInvokeFn, IpcRegistrar, TypedIpcInvoker, } from './ipc-contract/types.js';
|
|
2
|
+
import { createSchema } from './ipc-contract/schema.js';
|
|
3
|
+
import type { IpcSchema as IpcSchemaType } from './ipc-contract/types.js';
|
|
4
|
+
export { IpcContractValidationError, isIpcContractValidationError, } from './ipc-contract/types.js';
|
|
5
|
+
export type IpcSchema<T> = IpcSchemaType<T>;
|
|
6
|
+
export declare const IpcSchema: {
|
|
7
|
+
readonly custom: <T>(name: string, guard: (value: unknown) => value is T) => IpcSchemaType<T>;
|
|
8
|
+
readonly unknown: (name?: string) => IpcSchemaType<unknown>;
|
|
9
|
+
readonly null: (name?: string) => IpcSchemaType<null>;
|
|
10
|
+
readonly string: (name?: string) => IpcSchemaType<string>;
|
|
11
|
+
readonly number: (name?: string) => IpcSchemaType<number>;
|
|
12
|
+
readonly boolean: (name?: string) => IpcSchemaType<boolean>;
|
|
13
|
+
readonly literal: <TLiteral extends string | number | boolean | null>(expected: TLiteral, name?: string) => IpcSchemaType<TLiteral>;
|
|
14
|
+
readonly optional: <T>(schema: IpcSchemaType<T>, name?: string) => IpcSchemaType<T | undefined>;
|
|
15
|
+
readonly array: <TItem>(itemSchema: IpcSchemaType<TItem>, name?: string) => IpcSchemaType<TItem[]>;
|
|
16
|
+
readonly object: <TShape extends {
|
|
17
|
+
[x: string]: IpcSchemaType<unknown>;
|
|
18
|
+
}>(shape: TShape, name?: string) => IpcSchemaType<{ [TKey in keyof TShape]: import("./ipc-contract.js").InferSchemaValue<TShape[TKey]>; }>;
|
|
19
|
+
};
|
|
20
|
+
export { createSchema };
|
|
21
|
+
export { defineCommands } from './ipc-contract/define.js';
|
|
22
|
+
export { resolveContractChannel } from './ipc-contract/aliases.js';
|
|
23
|
+
export { registerContractHandlers } from './ipc-contract/handlers.js';
|
|
24
|
+
export { createContractInvoker, createLegacyInvokeAdapter, } from './ipc-contract/invoker.js';
|
|
25
|
+
//# sourceMappingURL=ipc-contract.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ipc-contract.d.ts","sourceRoot":"","sources":["../src/ipc-contract.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,gBAAgB,EAChB,mBAAmB,EACnB,oBAAoB,EACpB,gBAAgB,EAChB,oBAAoB,EACpB,aAAa,EACb,WAAW,EACX,YAAY,EACZ,eAAe,GAChB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAA+B,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACrF,OAAO,KAAK,EAAE,SAAS,IAAI,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAE1E,OAAO,EACL,0BAA0B,EAC1B,4BAA4B,GAC7B,MAAM,yBAAyB,CAAC;AAEjC,MAAM,MAAM,SAAS,CAAC,CAAC,IAAI,aAAa,CAAC,CAAC,CAAC,CAAC;AAC5C,eAAO,MAAM,SAAS;;;;;;;;;;;;;CAAiB,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EACL,qBAAqB,EACrB,yBAAyB,GAC1B,MAAM,2BAA2B,CAAC"}
|