e182f03230
- setThreadDpiAwareness checks SetThreadDpiAwarenessContext's return value
and cascades per-monitor-v2 -> per-monitor -> system-aware; DPI stays a
deliberate cosmetic best-effort - a host accepting none (or lacking the
API, pre-1607) still gets the modern dialog instead of a downgrade to the
legacy fallback chain over a cosmetic concern.
- The mocked-koffi world now uses a distinctive 4-byte pointer width and
rejects mis-sized out-buffers and mis-divided vtable offsets, so a
regression to hardcoded 8s fails the suite (the ia32 bug class).
- A keyless built-worker e2e guard loads lib/worker.cjs under plain
worker_threads on POSIX (the workflow-workerthread shape).
- The 'loaded lazily' module claims are reworded to attribute laziness to
the dynamic import('koffi') calls, and the discarded close-attempt
rejection is named at its catch.
38 lines
1.7 KiB
TypeScript
38 lines
1.7 KiB
TypeScript
/**
|
|
* Real-process half of the Win32 dialog driver: spawn the dialog worker
|
|
* (source or built plane) and close a dialog thread's windows. The module
|
|
* itself loads everywhere (the import chain from native-picker.ts is
|
|
* static); what stays win32-only is koffi, imported dynamically inside the
|
|
* bindings' functions. The driver's logic is tested against fakes of this
|
|
* surface instead.
|
|
*/
|
|
|
|
import { fileURLToPath } from 'node:url'
|
|
import { Worker } from 'node:worker_threads'
|
|
import type { Win32DialogWorkerData } from './win32-dialog-worker.ts'
|
|
|
|
/**
|
|
* Spawn the dialog worker. Built consumers load the bundled CJS worker next
|
|
* to this module; unbuilt (source) consumers bootstrap tsx inside the worker
|
|
* first, mirroring `dsh-workflow-workerthread`'s host.
|
|
* @param data - the worker payload (dialog title).
|
|
* @returns the spawned worker thread.
|
|
*/
|
|
export function spawnDialogWorker(data: Win32DialogWorkerData): Worker {
|
|
/* v8 ignore next 3 -- the built-output arm: tests always run unbuilt (src/) */
|
|
if (!import.meta.url.endsWith('.ts')) {
|
|
return new Worker(fileURLToPath(new URL('./worker.cjs', import.meta.url)), { workerData: data })
|
|
}
|
|
const workerEntry = new URL('./win32-dialog-worker.ts', import.meta.url)
|
|
const bootstrap = [
|
|
`import { register as registerEsm } from ${JSON.stringify(import.meta.resolve('tsx/esm/api'))}`,
|
|
`import { register as registerCjs } from ${JSON.stringify(import.meta.resolve('tsx/cjs/api'))}`,
|
|
'registerCjs()',
|
|
'registerEsm()',
|
|
`await import(${JSON.stringify(workerEntry.href)})`,
|
|
].join('\n')
|
|
return new Worker(new URL(`data:text/javascript,${encodeURIComponent(bootstrap)}`), { workerData: data })
|
|
}
|
|
|
|
export { closeThreadWindows } from './win32-dialog-bindings.ts'
|