@napuketto/loader 0.0.39 → 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/host/self-host.cjs +245 -23
- package/dist/index.cjs +135 -3
- package/dist/index.d.cts +53 -1
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +53 -1
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +128 -4
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.d.cts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.cts","names":[],"sources":["../src/host/ipc/ipc-types.ts","../src/host/ipc/native-noise.ts","../src/instance-lock.ts","../src/locate-qq.ts","../src/win-node.ts","../src/launcher.ts","../src/pid-cmdline.ts","../src/qq-download.ts","../src/qq-extract.ts","../src/qq-releases.ts","../src/wine.ts"],"mappings":";;;;cAaa;;cAGA,oBAAkB,EAAA;;;;;;;;;cAUlB,mBAAiB,EAAA;;;;;;;;;cAajB,wBAAsB,EAAA;;;;;;;;;;;;;;GAIjC,EAAA,KAAA;;cAGW,uBAAqB,EAAA;;;;;;;;;;;;;;GAKhC,EAAA,KAAA;;cAGW,uBAAqB,EAAA;;;;GAIhC,EAAA,KAAA;;cAGW,qBAAmB,EAAA;;;;;;;;;;GAG9B,EAAA,KAAA;;cAGW,wBAAsB,EAAA,mBAAA,EAAA;;;;;;;;;GAGjC,EAAA,KAAA;;cAGW,wBAAsB,EAAA;;;GAGjC,EAAA,KAAA;;cAGW,yBAAuB,EAAA,mBAAA,EAAA;;;;;;;;;;GASlC,EAAA,KAAA;cAII,wBAAsB,EAAA;;;;;;;;;;;;;;;;;;GAI1B,EAAA,KAAA;cAEI,uBAAqB,EAAA;;;;;;;;;;;;;;;;;;GAIzB,EAAA,KAAA;cAEI,oBAAkB,EAAA;;;;;;;GAItB,EAAA,KAAA;cAEI,uBAAqB,EAAA;;;;;;;;GAIzB,EAAA,KAAA;cAEI,wBAAsB,EAAA;;;;;;;;;;;;;;GAK1B,EAAA,KAAA;cAEI,qBAAmB,EAAA;;;;;;;;;;;;;;GAIvB,EAAA,KAAA;cAEI,sBAAoB,EAAA;;;GAGxB,EAAA,KAAA;cAEI,sBAAoB,EAAA;;;GAGxB,EAAA,KAAA;cAEI,wBAAsB,EAAA;;;;;;;;GAK1B,EAAA,KAAA;cAEI,yBAAuB,EAAA;;;;;;;;;;;;;;GAI3B,EAAA,KAAA;;cAGW,kBAAgB,EAAA,uBAAA,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAW3B,EAAA,KAAA;KAIU,eAAe,EAAE,aAAa;KAC9B,cAAc,EAAE,aAAa;KAC7B,mBAAmB,EAAE,aAAa;KAClC,kBAAkB,EAAE,aAAa;KACjC,kBAAkB,EAAE,aAAa;KACjC,gBAAgB,EAAE,aAAa;KAC/B,mBAAmB,EAAE,aAAa;KAClC,mBAAmB,EAAE,aAAa;KAClC,oBAAoB,EAAE,aAAa;KACnC,mBAAmB,EAAE,aAAa;KAClC,kBAAkB,EAAE,aAAa;KACjC,eAAe,EAAE,aAAa;KAC9B,kBAAkB,EAAE,aAAa;KACjC,mBAAmB,EAAE,aAAa;KAClC,gBAAgB,EAAE,aAAa;KAC/B,iBAAiB,EAAE,aAAa;KAChC,iBAAiB,EAAE,aAAa;KAChC,mBAAmB,EAAE,aAAa;KAClC,oBAAoB,EAAE,aAAa;KACnC,aAAa,EAAE,aAAa;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"index.d.cts","names":[],"sources":["../src/host/ipc/ipc-types.ts","../src/host/ipc/native-noise.ts","../src/instance-lock.ts","../src/locate-qq.ts","../src/win-node.ts","../src/launcher.ts","../src/pid-cmdline.ts","../src/qq-download.ts","../src/qq-extract.ts","../src/qq-releases.ts","../src/shutdown.ts","../src/wine.ts"],"mappings":";;;;cAaa;;cAGA,oBAAkB,EAAA;;;;;;;;;cAUlB,mBAAiB,EAAA;;;;;;;;;cAajB,wBAAsB,EAAA;;;;;;;;;;;;;;GAIjC,EAAA,KAAA;;cAGW,uBAAqB,EAAA;;;;;;;;;;;;;;GAKhC,EAAA,KAAA;;cAGW,uBAAqB,EAAA;;;;GAIhC,EAAA,KAAA;;cAGW,qBAAmB,EAAA;;;;;;;;;;GAG9B,EAAA,KAAA;;cAGW,wBAAsB,EAAA,mBAAA,EAAA;;;;;;;;;GAGjC,EAAA,KAAA;;cAGW,wBAAsB,EAAA;;;GAGjC,EAAA,KAAA;;cAGW,yBAAuB,EAAA,mBAAA,EAAA;;;;;;;;;;GASlC,EAAA,KAAA;cAII,wBAAsB,EAAA;;;;;;;;;;;;;;;;;;GAI1B,EAAA,KAAA;cAEI,uBAAqB,EAAA;;;;;;;;;;;;;;;;;;GAIzB,EAAA,KAAA;cAEI,oBAAkB,EAAA;;;;;;;GAItB,EAAA,KAAA;cAEI,uBAAqB,EAAA;;;;;;;;GAIzB,EAAA,KAAA;cAEI,wBAAsB,EAAA;;;;;;;;;;;;;;GAK1B,EAAA,KAAA;cAEI,qBAAmB,EAAA;;;;;;;;;;;;;;GAIvB,EAAA,KAAA;cAEI,sBAAoB,EAAA;;;GAGxB,EAAA,KAAA;cAEI,sBAAoB,EAAA;;;GAGxB,EAAA,KAAA;cAEI,wBAAsB,EAAA;;;;;;;;GAK1B,EAAA,KAAA;cAEI,yBAAuB,EAAA;;;;;;;;;;;;;;GAI3B,EAAA,KAAA;;cAGW,kBAAgB,EAAA,uBAAA,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAW3B,EAAA,KAAA;KAIU,eAAe,EAAE,aAAa;KAC9B,cAAc,EAAE,aAAa;KAC7B,mBAAmB,EAAE,aAAa;KAClC,kBAAkB,EAAE,aAAa;KACjC,kBAAkB,EAAE,aAAa;KACjC,gBAAgB,EAAE,aAAa;KAC/B,mBAAmB,EAAE,aAAa;KAClC,mBAAmB,EAAE,aAAa;KAClC,oBAAoB,EAAE,aAAa;KACnC,mBAAmB,EAAE,aAAa;KAClC,kBAAkB,EAAE,aAAa;KACjC,eAAe,EAAE,aAAa;KAC9B,kBAAkB,EAAE,aAAa;KACjC,mBAAmB,EAAE,aAAa;KAClC,gBAAgB,EAAE,aAAa;KAC/B,iBAAiB,EAAE,aAAa;KAChC,iBAAiB,EAAE,aAAa;KAChC,mBAAmB,EAAE,aAAa;KAClC,oBAAoB,EAAE,aAAa;KACnC,aAAa,EAAE,aAAa;;;;;;;;;iBC5JxB,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cCQrB;;UAGI;;EAEb;;EAEA;;EAEA;;;UAIa;;EAEb;;EAEA;;EAEA;;;;;;;iBAQY,kBAAkB,kBAAkB;;;;;iBA4CpC,oBAAoB,iBAAiB;;;;;iBA8BrC,oBAAoB;;iBAapB,oBAAoB;;;;cCrIvB;;KAoFD;;UAGK;;EAEb;;EAEA;;EAEA;;EAEA;;EAEA,QAAQ;;;UAIK;;EAEb;;EAEA;;EAEA;;EAEA;;EAEA;;;;;EAKA,WAAW;;;iBAIC;;iBAwCA,iBAAiB,kBAAkB;;;;;;iBAe7B,eAAe,UAAS,wBAA6B,QAAQ;;;;;iBA8DnE;;;;;;;;;;;iBAiBM,oBAClB;EAAW;IACZ;EAAU;EAAa;;;;;;;;;iBAkDJ,cAClB;;EAEI;;EAEA;;EAEA,WAAW;IAEhB,QAAQ;;;;cCzTE;;UAGI;;EAEb;;EAEA;;;iBAIY,WAAW;;;;;iBAQL,cAClB;;EAEI;;EAEA;;EAEA;IAEL,QAAQ;;;UCnBM;;EAEb,IAAI;;EAEJ;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA;;;;;;;;EAQA;;;;;;EAMA,QAAQ;;;;;;EAMR,WAAW;;;;;EAKX,WAAW;;UAGE;;EAEb,OAAO,kBAAkB;;EAEzB;;;;;;;;;;;;;iBAckB,eAAe,SAAS,gBAAgB,QAAQ;;;;;iBAgOtD;;cAyCH;WACT;WACA;WACA;WACA;WACA;;WAEA;;WAEA;;WAEA;;WAEA;;WAEA;;WAEA;;WAEA;;WAEA;;WAEA;;;;;;;;;;iBCpWY,kBAAkB;;;;UCVjB;;EAEb;;EAEA;;EAEA;;EAEA;;;UAIa;;EAEb;;EAEA;;;cAIS,sBAAsB;EAC/B,YAAY;;;;;;iBA8CM,aAAa,SAAS,kBAAkB,QAAQ;;;;UC5DrD;;EAEb;;EAEA;;;UAIa;;EAEb;;EAEA;;EAEA;;EAEA;;;;;;;iBAQY,gBAAgB;;iBAwBV,iBAClB,uBACA,iBACA,wBACD;;;;;;iBA+BmB,oBAClB,sBACA,iBACA,oBACD,QAAQ;;iBAkDW,kBAAkB,mBAAmB,kBAAkB;;;;UClJ5D;;EAEb;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA;;;UAIa;EACb;EACA,OAAO;;;cAIE,wBAAwB;EACjC,YAAY;;;iBAYA,kBAAkB;;iBAoBlB,cAAc,UAAU,iBAAiB;;;;;iBAYzC,mBAAmB,SAAS;;;;cClE/B;;iBAKG,iBAAiB;;;;;iBAQjB,kBAAkB,kBAAkB;;iBAKpC,mBAAmB;;UAqBlB;;EAEb;;EAEA;;EAEA;;EAEA;;;;;;iBAOY,kBAAkB,MAAM;;KAqCnC,4BAA4B;;iBAMjB,qBAAqB,MAAM;;;;;iBAUrB,gBAAgB,iBAAiB;;;;;;iBA0BvC;;;;;;;;;;;;;;;iBChJA,WAAW;;iBAiBX;;iBAoBA;;UAuCC;;EAEb;;EAEA;;;iBAIY,kBAAkB;;EAE9B,WAAW,OAAO;;EAElB;;EAEA;;EAEA;IACA"}
|
package/dist/index.d.mts
CHANGED
|
@@ -572,6 +572,12 @@ interface LaunchOptions {
|
|
|
572
572
|
* 查找失败警告),其余转发——原生 printf 直写 fd 的字节无法从 JS 层拦截。
|
|
573
573
|
*/
|
|
574
574
|
stdio?: StdioOptions;
|
|
575
|
+
/**
|
|
576
|
+
* 追加注入子进程的环境变量(覆盖同名继承值;值按原样传递,不转 wine 路径)。
|
|
577
|
+
* cli 用:传播有效控制台渲染决策(NAPUKETTO_LOG_FORMAT/COLORIZE——子进程
|
|
578
|
+
* stdout 恒为 pipe,TTY 判定失真)与数据根(NAPUTO_DATA_ROOT,停止哨兵用)。
|
|
579
|
+
*/
|
|
580
|
+
extraEnv?: Record<string, string>;
|
|
575
581
|
/**
|
|
576
582
|
* 阶段回调(stub 校验/win-node 下载/spawn 提示,2026-08-23 起——下载
|
|
577
583
|
* 313MB 安装包与 win-node 全程静默的坑)。调用方接 logger.info。
|
|
@@ -624,6 +630,8 @@ declare const ENV: {
|
|
|
624
630
|
readonly QR_ONLY: "NAPUTO_QR_ONLY";
|
|
625
631
|
/** IPC 子进程模式(koishi 插件驱动:stdout JSON 行 + stdin action/control)。 */
|
|
626
632
|
readonly IPC: "NAPUTO_IPC";
|
|
633
|
+
/** 数据根(cli 注入:停止哨兵目录解析用,self-host 不再从 CFG_DIR 反推)。 */
|
|
634
|
+
readonly DATA_ROOT: "NAPUTO_DATA_ROOT";
|
|
627
635
|
};
|
|
628
636
|
//#endregion
|
|
629
637
|
//#region src/pid-cmdline.d.ts
|
|
@@ -735,6 +743,50 @@ declare function latestRelease(releases: QqReleasesFile): QqReleaseEntry;
|
|
|
735
743
|
*/
|
|
736
744
|
declare function resolveDownloadUrl(release: QqReleaseEntry): string;
|
|
737
745
|
//#endregion
|
|
746
|
+
//#region src/shutdown.d.ts
|
|
747
|
+
/** 哨兵文件名(置于数据根)。 */
|
|
748
|
+
declare const STOP_SENTINEL_FILENAME = "napuketto.stop";
|
|
749
|
+
/** 哨兵文件路径。 */
|
|
750
|
+
declare function stopSentinelPath(dataRoot: string): string;
|
|
751
|
+
/**
|
|
752
|
+
* 写停止哨兵(请求优雅关停)。target = "all"/空 = 全部账号;"<uin>" = 单账号。
|
|
753
|
+
* 任何内容(含空)都视为请求;mtime 由写入时刻决定。
|
|
754
|
+
*/
|
|
755
|
+
declare function writeStopSentinel(dataRoot: string, target: "all" | string): void;
|
|
756
|
+
/** 删除停止哨兵(napuketto stop 等待结束后清理,防陈旧文件累积)。 */
|
|
757
|
+
declare function removeStopSentinel(dataRoot: string): void;
|
|
758
|
+
/** 哨兵观察选项。 */
|
|
759
|
+
interface StopSentinelWatchOptions {
|
|
760
|
+
/** 数据根(哨兵所在目录)。 */
|
|
761
|
+
dataRoot: string;
|
|
762
|
+
/** 本进程对应账号(uin 或 "default";undefined = 仅响应 all/空)。 */
|
|
763
|
+
account?: string;
|
|
764
|
+
/** 触发回调(每进程至多一次)。 */
|
|
765
|
+
onTrigger: () => void;
|
|
766
|
+
/** 轮询间隔(测试注入用)。 */
|
|
767
|
+
pollMs?: number;
|
|
768
|
+
}
|
|
769
|
+
/**
|
|
770
|
+
* 观察停止哨兵:存在、mtime 晚于进程启动且内容命中 → onTrigger(一次性)。
|
|
771
|
+
* 返回取消函数。mtime 守卫:进程启动前遗留的哨兵不触发(守护重启安全)。
|
|
772
|
+
*/
|
|
773
|
+
declare function watchStopSentinel(opts: StopSentinelWatchOptions): () => void;
|
|
774
|
+
/** 关停钩子(自建宿主引导链注册:协议适配器停止 / 桥退订等)。 */
|
|
775
|
+
type ShutdownHook = () => void | Promise<void>;
|
|
776
|
+
/** 注册关停钩子(按注册逆序执行)。 */
|
|
777
|
+
declare function registerShutdownHook(hook: ShutdownHook): void;
|
|
778
|
+
/**
|
|
779
|
+
* 执行关停编排:逆序跑全部钩子(单钩子异常不阻断后续)后 exit 0。
|
|
780
|
+
* 幂等(重复调用只跑一次)。退出码 0 = 请求式正常退出(生命周期契约)。
|
|
781
|
+
*/
|
|
782
|
+
declare function requestShutdown(reason: string): Promise<void>;
|
|
783
|
+
/**
|
|
784
|
+
* 信号接入(SIGINT/SIGTERM/SIGBREAK → requestShutdown)。
|
|
785
|
+
* Windows CTRL_BREAK_EVENT 以 SIGBREAK 到达(宿主 CREATE_NEW_PROCESS_GROUP +
|
|
786
|
+
* GenerateConsoleCtrlEvent 可优雅停整树);终端 Ctrl+C 以 SIGINT 到达。
|
|
787
|
+
*/
|
|
788
|
+
declare function installSignalShutdown(): void;
|
|
789
|
+
//#endregion
|
|
738
790
|
//#region src/wine.d.ts
|
|
739
791
|
/**
|
|
740
792
|
* wine.ts:Linux 上经 wine 运行 Windows 版 node.exe 的路径与 spawn 组装(P2)。
|
|
@@ -772,5 +824,5 @@ declare function buildSpawnCommand(options: {
|
|
|
772
824
|
selfHostPath: string;
|
|
773
825
|
}): SpawnCommand;
|
|
774
826
|
//#endregion
|
|
775
|
-
export { DownloadError, type DownloadOptions, type DownloadResult, ENV, type ExtractOptions, INSTANCE_LOCK_FILE, IPC_VERSION, type InstanceLockCheck, type InstanceLockInfo, type IpcActionMessage, type IpcActionPayload, IpcActionPayloadSchema, type IpcBootPhase, IpcBootPhaseSchema, type IpcControlMessage, type IpcControlPayload, IpcControlPayloadSchema, type IpcEventMessage, type IpcEventPayload, IpcEventPayloadSchema, type IpcLogLevel, IpcLogLevelSchema, type IpcLogMessage, type IpcLogPayload, IpcLogPayloadSchema, type IpcLoginMessage, type IpcLoginPayload, IpcLoginPayloadSchema, type IpcMessage, IpcMessageSchema, type IpcPingMessage, type IpcPongMessage, type IpcQrMessage, type IpcResultMessage, type IpcResultPayload, IpcResultPayloadSchema, type IpcStatusMessage, type IpcStatusPayload, IpcStatusPayloadSchema, type LaunchOptions, type LaunchResult, QQ_FILES_DIR_NAME, type QqFileSource, type QqInstallInfo, type QqReleaseEntry, QqReleasesError, type QqReleasesFile, type ResolveQqFilesOptions, type SevenZipResult, type SpawnCommand, WIN_NODE_DIR_NAME, type WinNodeInfo, acquireInstanceLock, buildSpawnCommand, checkInstanceLock, clearCacheVersion, defaultStubDir, downloadFile, ensureLinuxSevenZip, ensureQqFiles, ensureWinNode, extractInstaller, extractWrapperFiles, findSevenZip, isLinux, isNativeNoiseLine, latestRelease, launchSelfHost, linuxSevenZipUrl, loadQqReleases, locateQqPath, nodeZipUrl, readCmdlineForPid, registerLockCleanup, releaseInstanceLock, resolveDownloadUrl, resolveQqFiles, resolveQqInstall, toWinePath, wineBinary };
|
|
827
|
+
export { DownloadError, type DownloadOptions, type DownloadResult, ENV, type ExtractOptions, INSTANCE_LOCK_FILE, IPC_VERSION, type InstanceLockCheck, type InstanceLockInfo, type IpcActionMessage, type IpcActionPayload, IpcActionPayloadSchema, type IpcBootPhase, IpcBootPhaseSchema, type IpcControlMessage, type IpcControlPayload, IpcControlPayloadSchema, type IpcEventMessage, type IpcEventPayload, IpcEventPayloadSchema, type IpcLogLevel, IpcLogLevelSchema, type IpcLogMessage, type IpcLogPayload, IpcLogPayloadSchema, type IpcLoginMessage, type IpcLoginPayload, IpcLoginPayloadSchema, type IpcMessage, IpcMessageSchema, type IpcPingMessage, type IpcPongMessage, type IpcQrMessage, type IpcResultMessage, type IpcResultPayload, IpcResultPayloadSchema, type IpcStatusMessage, type IpcStatusPayload, IpcStatusPayloadSchema, type LaunchOptions, type LaunchResult, QQ_FILES_DIR_NAME, type QqFileSource, type QqInstallInfo, type QqReleaseEntry, QqReleasesError, type QqReleasesFile, type ResolveQqFilesOptions, STOP_SENTINEL_FILENAME, type SevenZipResult, type SpawnCommand, type StopSentinelWatchOptions, WIN_NODE_DIR_NAME, type WinNodeInfo, acquireInstanceLock, buildSpawnCommand, checkInstanceLock, clearCacheVersion, defaultStubDir, downloadFile, ensureLinuxSevenZip, ensureQqFiles, ensureWinNode, extractInstaller, extractWrapperFiles, findSevenZip, installSignalShutdown, isLinux, isNativeNoiseLine, latestRelease, launchSelfHost, linuxSevenZipUrl, loadQqReleases, locateQqPath, nodeZipUrl, readCmdlineForPid, registerLockCleanup, registerShutdownHook, releaseInstanceLock, removeStopSentinel, requestShutdown, resolveDownloadUrl, resolveQqFiles, resolveQqInstall, stopSentinelPath, toWinePath, watchStopSentinel, wineBinary, writeStopSentinel };
|
|
776
828
|
//# sourceMappingURL=index.d.mts.map
|
package/dist/index.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/host/ipc/ipc-types.ts","../src/host/ipc/native-noise.ts","../src/instance-lock.ts","../src/locate-qq.ts","../src/win-node.ts","../src/launcher.ts","../src/pid-cmdline.ts","../src/qq-download.ts","../src/qq-extract.ts","../src/qq-releases.ts","../src/wine.ts"],"mappings":";;;;cAaa;;cAGA,oBAAkB,EAAA;;;;;;;;;cAUlB,mBAAiB,EAAA;;;;;;;;;cAajB,wBAAsB,EAAA;;;;;;;;;;;;;;GAIjC,EAAA,KAAA;;cAGW,uBAAqB,EAAA;;;;;;;;;;;;;;GAKhC,EAAA,KAAA;;cAGW,uBAAqB,EAAA;;;;GAIhC,EAAA,KAAA;;cAGW,qBAAmB,EAAA;;;;;;;;;;GAG9B,EAAA,KAAA;;cAGW,wBAAsB,EAAA,mBAAA,EAAA;;;;;;;;;GAGjC,EAAA,KAAA;;cAGW,wBAAsB,EAAA;;;GAGjC,EAAA,KAAA;;cAGW,yBAAuB,EAAA,mBAAA,EAAA;;;;;;;;;;GASlC,EAAA,KAAA;cAII,wBAAsB,EAAA;;;;;;;;;;;;;;;;;;GAI1B,EAAA,KAAA;cAEI,uBAAqB,EAAA;;;;;;;;;;;;;;;;;;GAIzB,EAAA,KAAA;cAEI,oBAAkB,EAAA;;;;;;;GAItB,EAAA,KAAA;cAEI,uBAAqB,EAAA;;;;;;;;GAIzB,EAAA,KAAA;cAEI,wBAAsB,EAAA;;;;;;;;;;;;;;GAK1B,EAAA,KAAA;cAEI,qBAAmB,EAAA;;;;;;;;;;;;;;GAIvB,EAAA,KAAA;cAEI,sBAAoB,EAAA;;;GAGxB,EAAA,KAAA;cAEI,sBAAoB,EAAA;;;GAGxB,EAAA,KAAA;cAEI,wBAAsB,EAAA;;;;;;;;GAK1B,EAAA,KAAA;cAEI,yBAAuB,EAAA;;;;;;;;;;;;;;GAI3B,EAAA,KAAA;;cAGW,kBAAgB,EAAA,uBAAA,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAW3B,EAAA,KAAA;KAIU,eAAe,EAAE,aAAa;KAC9B,cAAc,EAAE,aAAa;KAC7B,mBAAmB,EAAE,aAAa;KAClC,kBAAkB,EAAE,aAAa;KACjC,kBAAkB,EAAE,aAAa;KACjC,gBAAgB,EAAE,aAAa;KAC/B,mBAAmB,EAAE,aAAa;KAClC,mBAAmB,EAAE,aAAa;KAClC,oBAAoB,EAAE,aAAa;KACnC,mBAAmB,EAAE,aAAa;KAClC,kBAAkB,EAAE,aAAa;KACjC,eAAe,EAAE,aAAa;KAC9B,kBAAkB,EAAE,aAAa;KACjC,mBAAmB,EAAE,aAAa;KAClC,gBAAgB,EAAE,aAAa;KAC/B,iBAAiB,EAAE,aAAa;KAChC,iBAAiB,EAAE,aAAa;KAChC,mBAAmB,EAAE,aAAa;KAClC,oBAAoB,EAAE,aAAa;KACnC,aAAa,EAAE,aAAa;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/host/ipc/ipc-types.ts","../src/host/ipc/native-noise.ts","../src/instance-lock.ts","../src/locate-qq.ts","../src/win-node.ts","../src/launcher.ts","../src/pid-cmdline.ts","../src/qq-download.ts","../src/qq-extract.ts","../src/qq-releases.ts","../src/shutdown.ts","../src/wine.ts"],"mappings":"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"}
|
package/dist/index.mjs
CHANGED
|
@@ -185,11 +185,13 @@ const IpcMessageSchema = z.discriminatedUnion("type", [
|
|
|
185
185
|
* 失败的加载警告(无害,纯噪音)
|
|
186
186
|
* - `loaded [mmkv.*] with N key-values`:MMKV 初始化完成行(野生日志,风格三,
|
|
187
187
|
* 无统一前缀/时间戳,过滤)
|
|
188
|
+
* - `:N::loadFromFile> loading [mmkv.*] with crc`:MMKV 载入变体行
|
|
189
|
+
* (2026-10-25 补:`loading` 拼写与 `loaded` 并存,此前漏过滤外泄到宿主控制台)
|
|
188
190
|
*
|
|
189
191
|
* 边界:只处理「整条」噪音行;原生输出插进 JSON 协议行字节中间的撕裂不归这里管
|
|
190
192
|
* (IPC 路径由 status 重播与脏行诊断兜底,见 ipc-sender.ts / koishi 插件 client)。
|
|
191
193
|
*/
|
|
192
|
-
const NATIVE_NOISE = /<MMKV|<MemoryFile_Win32|<MMKV_IO|loadSymbolFromShell|getNodeGetJsListApi|get symbol failed|loaded \[mmkv/i;
|
|
194
|
+
const NATIVE_NOISE = /<MMKV|<MemoryFile_Win32|<MMKV_IO|loadSymbolFromShell|getNodeGetJsListApi|get symbol failed|loaded \[mmkv|loadFromFile> loading \[mmkv/i;
|
|
193
195
|
/** IPC 协议行前缀(encodeIpcMessage 走 JSON.stringify 无空白,前缀恒定)。 */
|
|
194
196
|
const IPC_LINE_PREFIX = `{"v":1`;
|
|
195
197
|
/**
|
|
@@ -1097,7 +1099,8 @@ function buildLaunchEnv(options, useWine) {
|
|
|
1097
1099
|
...options.configPath !== void 0 ? { [ENV.CONFIG_PATH]: p(resolve(options.configPath)) } : {},
|
|
1098
1100
|
...options.quickUin !== void 0 ? { [ENV.QUICK_UIN]: options.quickUin } : {},
|
|
1099
1101
|
...options.qrOnly === true ? { [ENV.QR_ONLY]: "1" } : {},
|
|
1100
|
-
...options.ipc === true ? { [ENV.IPC]: "1" } : {}
|
|
1102
|
+
...options.ipc === true ? { [ENV.IPC]: "1" } : {},
|
|
1103
|
+
...options.extraEnv !== void 0 ? options.extraEnv : {}
|
|
1101
1104
|
};
|
|
1102
1105
|
return {
|
|
1103
1106
|
...env,
|
|
@@ -1126,7 +1129,9 @@ const ENV = {
|
|
|
1126
1129
|
/** 强制扫码登录(跳过快速登录直接 QR;koishi 面板「扫码登录」重启路径用)。 */
|
|
1127
1130
|
QR_ONLY: "NAPUTO_QR_ONLY",
|
|
1128
1131
|
/** IPC 子进程模式(koishi 插件驱动:stdout JSON 行 + stdin action/control)。 */
|
|
1129
|
-
IPC: "NAPUTO_IPC"
|
|
1132
|
+
IPC: "NAPUTO_IPC",
|
|
1133
|
+
/** 数据根(cli 注入:停止哨兵目录解析用,self-host 不再从 CFG_DIR 反推)。 */
|
|
1134
|
+
DATA_ROOT: "NAPUTO_DATA_ROOT"
|
|
1130
1135
|
};
|
|
1131
1136
|
//#endregion
|
|
1132
1137
|
//#region src/locate-qq.ts
|
|
@@ -1370,6 +1375,125 @@ async function ensureQqFiles(options = {}) {
|
|
|
1370
1375
|
}
|
|
1371
1376
|
}
|
|
1372
1377
|
//#endregion
|
|
1373
|
-
|
|
1378
|
+
//#region src/shutdown.ts
|
|
1379
|
+
/**
|
|
1380
|
+
* 优雅关停(2026-10-25 生命周期契约):停止哨兵 + 关停钩子 + 信号接入。
|
|
1381
|
+
*
|
|
1382
|
+
* 背景:Windows 下 SIGTERM 无法投递给无控制台进程(嵌入式宿主 pipe 场景),
|
|
1383
|
+
* 既有 `napuketto stop` / 宿主只能 taskkill /T /F 树杀——被杀进程退出码 1,
|
|
1384
|
+
* 与真实崩溃无法区分。本模块提供两层机制,三层常驻进程
|
|
1385
|
+
* (supervisor / cli boot / self-host)共用:
|
|
1386
|
+
*
|
|
1387
|
+
* 1. 停止哨兵(规范化通道,宿主零 win32 依赖):向 `<数据根>/napuketto.stop`
|
|
1388
|
+
* 写文件即请求该数据根下的进程树优雅退出。文件内容为目标账号
|
|
1389
|
+
* (空 / "all" = 全部;"<uin>" = 单账号——`napuketto stop -q` 用)。
|
|
1390
|
+
* 守卫:mtime 晚于进程启动才触发(陈旧哨兵不触发,守护重启不误杀),
|
|
1391
|
+
* 每进程至多触发一次。轮询 500ms(fs.watch 跨平台创建事件不可靠)。
|
|
1392
|
+
* 2. 信号(终端场景):SIGINT/SIGTERM/SIGBREAK(Windows CTRL_BREAK_EVENT
|
|
1393
|
+
* 可达)→ requestShutdown,走同一关停编排。
|
|
1394
|
+
*
|
|
1395
|
+
* 退出码契约:0 = 请求式正常退出;非 0 = 引导失败/运行时致命。taskkill /F
|
|
1396
|
+
* 兜底仍产出 code 1,宿主应优先用哨兵通道。
|
|
1397
|
+
*/
|
|
1398
|
+
/** 哨兵文件名(置于数据根)。 */
|
|
1399
|
+
const STOP_SENTINEL_FILENAME = "napuketto.stop";
|
|
1400
|
+
/** 哨兵轮询间隔(毫秒)。 */
|
|
1401
|
+
const SENTINEL_POLL_MS = 500;
|
|
1402
|
+
/** 哨兵文件路径。 */
|
|
1403
|
+
function stopSentinelPath(dataRoot) {
|
|
1404
|
+
return join(dataRoot, STOP_SENTINEL_FILENAME);
|
|
1405
|
+
}
|
|
1406
|
+
/**
|
|
1407
|
+
* 写停止哨兵(请求优雅关停)。target = "all"/空 = 全部账号;"<uin>" = 单账号。
|
|
1408
|
+
* 任何内容(含空)都视为请求;mtime 由写入时刻决定。
|
|
1409
|
+
*/
|
|
1410
|
+
function writeStopSentinel(dataRoot, target) {
|
|
1411
|
+
writeFileSync(stopSentinelPath(dataRoot), target === "all" ? "all\n" : `${target}\n`, "utf8");
|
|
1412
|
+
}
|
|
1413
|
+
/** 删除停止哨兵(napuketto stop 等待结束后清理,防陈旧文件累积)。 */
|
|
1414
|
+
function removeStopSentinel(dataRoot) {
|
|
1415
|
+
const path = stopSentinelPath(dataRoot);
|
|
1416
|
+
if (existsSync(path)) try {
|
|
1417
|
+
rmSync(path);
|
|
1418
|
+
} catch {}
|
|
1419
|
+
}
|
|
1420
|
+
/** 哨兵内容是否命中本观察者(all/空 = 全部;否则精确匹配账号)。 */
|
|
1421
|
+
function sentinelMatches(content, account) {
|
|
1422
|
+
const trimmed = content.trim();
|
|
1423
|
+
if (trimmed === "" || trimmed === "all") return true;
|
|
1424
|
+
return account !== void 0 && trimmed === account;
|
|
1425
|
+
}
|
|
1426
|
+
/**
|
|
1427
|
+
* 观察停止哨兵:存在、mtime 晚于进程启动且内容命中 → onTrigger(一次性)。
|
|
1428
|
+
* 返回取消函数。mtime 守卫:进程启动前遗留的哨兵不触发(守护重启安全)。
|
|
1429
|
+
*/
|
|
1430
|
+
function watchStopSentinel(opts) {
|
|
1431
|
+
const path = stopSentinelPath(opts.dataRoot);
|
|
1432
|
+
const processStartMs = performance.timeOrigin;
|
|
1433
|
+
let triggered = false;
|
|
1434
|
+
const timer = setInterval(() => {
|
|
1435
|
+
if (triggered) return;
|
|
1436
|
+
let mtimeMs = 0;
|
|
1437
|
+
let content = "";
|
|
1438
|
+
try {
|
|
1439
|
+
if (!existsSync(path)) return;
|
|
1440
|
+
mtimeMs = statSync(path).mtimeMs;
|
|
1441
|
+
content = readFileSync(path, "utf8");
|
|
1442
|
+
} catch {
|
|
1443
|
+
return;
|
|
1444
|
+
}
|
|
1445
|
+
if (mtimeMs <= processStartMs) return;
|
|
1446
|
+
if (sentinelMatches(content, opts.account)) {
|
|
1447
|
+
triggered = true;
|
|
1448
|
+
opts.onTrigger();
|
|
1449
|
+
}
|
|
1450
|
+
}, opts.pollMs ?? SENTINEL_POLL_MS);
|
|
1451
|
+
timer.unref?.();
|
|
1452
|
+
return () => {
|
|
1453
|
+
triggered = true;
|
|
1454
|
+
clearInterval(timer);
|
|
1455
|
+
};
|
|
1456
|
+
}
|
|
1457
|
+
const shutdownHooks = [];
|
|
1458
|
+
let shutdownStarted = false;
|
|
1459
|
+
/** 注册关停钩子(按注册逆序执行)。 */
|
|
1460
|
+
function registerShutdownHook(hook) {
|
|
1461
|
+
if (!shutdownStarted) shutdownHooks.push(hook);
|
|
1462
|
+
}
|
|
1463
|
+
/**
|
|
1464
|
+
* 执行关停编排:逆序跑全部钩子(单钩子异常不阻断后续)后 exit 0。
|
|
1465
|
+
* 幂等(重复调用只跑一次)。退出码 0 = 请求式正常退出(生命周期契约)。
|
|
1466
|
+
*/
|
|
1467
|
+
async function requestShutdown(reason) {
|
|
1468
|
+
if (shutdownStarted) return;
|
|
1469
|
+
shutdownStarted = true;
|
|
1470
|
+
process$1.stdout.write(`[self-host] 优雅关停:${reason}\n`);
|
|
1471
|
+
while (shutdownHooks.length > 0) {
|
|
1472
|
+
const hook = shutdownHooks.pop();
|
|
1473
|
+
if (hook === void 0) break;
|
|
1474
|
+
try {
|
|
1475
|
+
await hook();
|
|
1476
|
+
} catch (err) {
|
|
1477
|
+
const message = err?.message ?? String(err);
|
|
1478
|
+
process$1.stdout.write(`[self-host] 关停钩子异常(继续): ${message}\n`);
|
|
1479
|
+
}
|
|
1480
|
+
}
|
|
1481
|
+
process$1.exit(0);
|
|
1482
|
+
}
|
|
1483
|
+
/**
|
|
1484
|
+
* 信号接入(SIGINT/SIGTERM/SIGBREAK → requestShutdown)。
|
|
1485
|
+
* Windows CTRL_BREAK_EVENT 以 SIGBREAK 到达(宿主 CREATE_NEW_PROCESS_GROUP +
|
|
1486
|
+
* GenerateConsoleCtrlEvent 可优雅停整树);终端 Ctrl+C 以 SIGINT 到达。
|
|
1487
|
+
*/
|
|
1488
|
+
function installSignalShutdown() {
|
|
1489
|
+
const handler = (signal) => {
|
|
1490
|
+
requestShutdown(`信号 ${signal}`);
|
|
1491
|
+
};
|
|
1492
|
+
process$1.on("SIGINT", () => handler("SIGINT"));
|
|
1493
|
+
process$1.on("SIGTERM", () => handler("SIGTERM"));
|
|
1494
|
+
process$1.on("SIGBREAK", () => handler("SIGBREAK"));
|
|
1495
|
+
}
|
|
1496
|
+
//#endregion
|
|
1497
|
+
export { DownloadError, ENV, INSTANCE_LOCK_FILE, IPC_VERSION, IpcActionPayloadSchema, IpcBootPhaseSchema, IpcControlPayloadSchema, IpcEventPayloadSchema, IpcLogLevelSchema, IpcLogPayloadSchema, IpcLoginPayloadSchema, IpcMessageSchema, IpcResultPayloadSchema, IpcStatusPayloadSchema, QQ_FILES_DIR_NAME, QqReleasesError, STOP_SENTINEL_FILENAME, WIN_NODE_DIR_NAME, acquireInstanceLock, buildSpawnCommand, checkInstanceLock, clearCacheVersion, defaultStubDir, downloadFile, ensureLinuxSevenZip, ensureQqFiles, ensureWinNode, extractInstaller, extractWrapperFiles, findSevenZip, installSignalShutdown, isLinux, isNativeNoiseLine, latestRelease, launchSelfHost, linuxSevenZipUrl, loadQqReleases, locateQqPath, nodeZipUrl, readCmdlineForPid, registerLockCleanup, registerShutdownHook, releaseInstanceLock, removeStopSentinel, requestShutdown, resolveDownloadUrl, resolveQqFiles, resolveQqInstall, stopSentinelPath, toWinePath, watchStopSentinel, wineBinary, writeStopSentinel };
|
|
1374
1498
|
|
|
1375
1499
|
//# sourceMappingURL=index.mjs.map
|