@weapp-vite/devtools-runtime 0.5.0 → 0.6.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/index.d.ts +2 -2
- package/dist/index.js +52 -19
- package/package.json +2 -2
package/dist/index.d.ts
CHANGED
|
@@ -114,11 +114,11 @@ export declare function resolveSharedMiniProgramSessionKey(options: SharedMiniPr
|
|
|
114
114
|
*/
|
|
115
115
|
export declare function acquireSharedMiniProgram(hooks: DevtoolsRuntimeHooks, options: DevtoolsRuntimeSessionOptions): Promise<AutomatorMiniProgram>;
|
|
116
116
|
/** 使用创建连接时的精确键释放订阅。 */
|
|
117
|
-
export declare function releaseSharedMiniProgramByKey(sessionKey: string): void
|
|
117
|
+
export declare function releaseSharedMiniProgramByKey(sessionKey: string): Promise<void>;
|
|
118
118
|
/**
|
|
119
119
|
* @description 释放指定项目的共享会话引用;会话对象会继续缓存,直到显式关闭或重置。
|
|
120
120
|
*/
|
|
121
|
-
export declare function releaseSharedMiniProgram(projectPath: string, sessionIdOrPort?: string | number, installation?: Omit<SharedMiniProgramSessionOptions, 'projectPath'>): void
|
|
121
|
+
export declare function releaseSharedMiniProgram(projectPath: string, sessionIdOrPort?: string | number, installation?: Omit<SharedMiniProgramSessionOptions, 'projectPath'>): Promise<void>;
|
|
122
122
|
/**
|
|
123
123
|
* @description 关闭并移除指定项目的共享 automator 会话。
|
|
124
124
|
*/
|
package/dist/index.js
CHANGED
|
@@ -838,6 +838,18 @@ function resolveExistingSessionKey(options) {
|
|
|
838
838
|
});
|
|
839
839
|
return matching.length === 1 ? matching[0][0] : void 0;
|
|
840
840
|
}
|
|
841
|
+
/** 确认连接关闭后移除缓存;关闭失败的条目只允许重试清理。 */
|
|
842
|
+
function closeSharedEntry(sessionKey, entry) {
|
|
843
|
+
entry.closeRequested = true;
|
|
844
|
+
entry.closing ??= (async () => {
|
|
845
|
+
await (await entry.session).disconnect();
|
|
846
|
+
if (sharedMiniProgramSessions.get(sessionKey) === entry) sharedMiniProgramSessions.delete(sessionKey);
|
|
847
|
+
})().catch((error) => {
|
|
848
|
+
entry.closing = void 0;
|
|
849
|
+
throw error;
|
|
850
|
+
});
|
|
851
|
+
return entry.closing;
|
|
852
|
+
}
|
|
841
853
|
/**
|
|
842
854
|
* @description 获取指定项目的共享 automator 会话;若不存在则自动创建。
|
|
843
855
|
*/
|
|
@@ -846,6 +858,10 @@ async function acquireSharedMiniProgram(hooks, options) {
|
|
|
846
858
|
const sessionKey = resolveSharedMiniProgramSessionKey(options);
|
|
847
859
|
const existing = sharedMiniProgramSessions.get(sessionKey);
|
|
848
860
|
if (existing) {
|
|
861
|
+
if (existing.closeRequested) {
|
|
862
|
+
await closeSharedEntry(sessionKey, existing);
|
|
863
|
+
return await acquireSharedMiniProgram(hooks, options);
|
|
864
|
+
}
|
|
849
865
|
existing.refs += 1;
|
|
850
866
|
return await existing.session;
|
|
851
867
|
}
|
|
@@ -868,11 +884,9 @@ function releaseSharedMiniProgramByKey(sessionKey) {
|
|
|
868
884
|
const entry = sharedMiniProgramSessions.get(sessionKey);
|
|
869
885
|
if (entry) {
|
|
870
886
|
entry.refs = Math.max(0, entry.refs - 1);
|
|
871
|
-
if (entry.refs === 0 && entry.closeWhenUnused)
|
|
872
|
-
sharedMiniProgramSessions.delete(sessionKey);
|
|
873
|
-
entry.session.then((program) => program.disconnect()).catch(() => void 0);
|
|
874
|
-
}
|
|
887
|
+
if (entry.refs === 0 && entry.closeWhenUnused) return closeSharedEntry(sessionKey, entry);
|
|
875
888
|
}
|
|
889
|
+
return Promise.resolve();
|
|
876
890
|
}
|
|
877
891
|
/**
|
|
878
892
|
* @description 释放指定项目的共享会话引用;会话对象会继续缓存,直到显式关闭或重置。
|
|
@@ -884,7 +898,8 @@ function releaseSharedMiniProgram(projectPath, sessionIdOrPort, installation = {
|
|
|
884
898
|
...typeof sessionIdOrPort === "number" ? { port: sessionIdOrPort } : {},
|
|
885
899
|
...typeof sessionIdOrPort === "string" ? { sessionId: sessionIdOrPort } : {}
|
|
886
900
|
});
|
|
887
|
-
if (key) releaseSharedMiniProgramByKey(key);
|
|
901
|
+
if (key) return releaseSharedMiniProgramByKey(key);
|
|
902
|
+
return Promise.resolve();
|
|
888
903
|
}
|
|
889
904
|
/**
|
|
890
905
|
* @description 关闭并移除指定项目的共享 automator 会话。
|
|
@@ -898,8 +913,7 @@ async function closeSharedMiniProgram(projectPath, sessionIdOrPort, installation
|
|
|
898
913
|
});
|
|
899
914
|
const entry = sessionKey ? sharedMiniProgramSessions.get(sessionKey) : void 0;
|
|
900
915
|
if (!entry || !sessionKey) return;
|
|
901
|
-
|
|
902
|
-
(await entry.session.catch(() => null))?.disconnect();
|
|
916
|
+
await closeSharedEntry(sessionKey, entry);
|
|
903
917
|
}
|
|
904
918
|
/**
|
|
905
919
|
* @description 获取当前共享会话数量,供测试断言使用。
|
|
@@ -915,24 +929,45 @@ async function withMiniProgram(hooks, options, runner) {
|
|
|
915
929
|
options = await hooks.resolveSessionOptions?.(options) ?? options;
|
|
916
930
|
if (options.sharedSession) {
|
|
917
931
|
const miniProgram = await acquireSharedMiniProgram(hooks, options);
|
|
932
|
+
let result;
|
|
933
|
+
let failure;
|
|
918
934
|
try {
|
|
919
|
-
|
|
935
|
+
result = await runner(miniProgram);
|
|
920
936
|
} catch (error) {
|
|
937
|
+
failure = normalizeError(hooks, error);
|
|
938
|
+
}
|
|
939
|
+
const cleanupErrors = [];
|
|
940
|
+
if (failure) try {
|
|
921
941
|
await closeSharedMiniProgram(options.projectPath, options.sessionId || options.port, options);
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
releaseSharedMiniProgram(options.projectPath, options.sessionId || options.port, options);
|
|
942
|
+
} catch (cleanupError) {
|
|
943
|
+
cleanupErrors.push(cleanupError);
|
|
925
944
|
}
|
|
945
|
+
try {
|
|
946
|
+
await releaseSharedMiniProgram(options.projectPath, options.sessionId || options.port, options);
|
|
947
|
+
} catch (cleanupError) {
|
|
948
|
+
cleanupErrors.push(cleanupError);
|
|
949
|
+
}
|
|
950
|
+
if (cleanupErrors.length) throw new AggregateError([...failure ? [failure] : [], ...cleanupErrors], "MiniProgram operation and shared connection cleanup failed", { cause: failure });
|
|
951
|
+
if (failure) throw failure;
|
|
952
|
+
return result;
|
|
926
953
|
}
|
|
927
954
|
let miniProgram = null;
|
|
955
|
+
let result;
|
|
956
|
+
let failure;
|
|
928
957
|
try {
|
|
929
958
|
miniProgram = await hooks.connectMiniProgram(options);
|
|
930
|
-
|
|
959
|
+
result = await runner(miniProgram);
|
|
931
960
|
} catch (error) {
|
|
932
|
-
|
|
933
|
-
}
|
|
934
|
-
|
|
961
|
+
failure = normalizeError(hooks, error);
|
|
962
|
+
}
|
|
963
|
+
if (miniProgram) try {
|
|
964
|
+
await miniProgram.disconnect();
|
|
965
|
+
} catch (cleanupError) {
|
|
966
|
+
if (failure) throw new AggregateError([failure, cleanupError], "MiniProgram operation and connection cleanup failed", { cause: failure });
|
|
967
|
+
throw cleanupError;
|
|
935
968
|
}
|
|
969
|
+
if (failure) throw failure;
|
|
970
|
+
return result;
|
|
936
971
|
}
|
|
937
972
|
/** 检查缓存,供调用方记录其实际创建的连接。 */
|
|
938
973
|
function hasSharedMiniProgram(options) {
|
|
@@ -943,14 +978,12 @@ async function closeOwnedSharedMiniProgram(options, owned) {
|
|
|
943
978
|
const key = resolveSharedMiniProgramSessionKey(options);
|
|
944
979
|
const entry = sharedMiniProgramSessions.get(key);
|
|
945
980
|
if (!entry) return;
|
|
946
|
-
|
|
947
|
-
if (program !== owned || sharedMiniProgramSessions.get(key) !== entry) return;
|
|
981
|
+
if (await entry.session.catch(() => null) !== owned || sharedMiniProgramSessions.get(key) !== entry) return;
|
|
948
982
|
if (entry.refs !== 0) {
|
|
949
983
|
entry.closeWhenUnused = true;
|
|
950
984
|
return;
|
|
951
985
|
}
|
|
952
|
-
|
|
953
|
-
program?.disconnect();
|
|
986
|
+
await closeSharedEntry(key, entry);
|
|
954
987
|
}
|
|
955
988
|
/** 单独保留管理器订阅,避免与正在执行的操作共享引用计数。 */
|
|
956
989
|
function retainSharedMiniProgram(sessionKey) {
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@weapp-vite/devtools-runtime",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.6.0",
|
|
5
5
|
"description": "Shared WeChat DevTools runtime automation helpers for weapp-vite packages",
|
|
6
6
|
"author": "ice breaker <1324318532@qq.com>",
|
|
7
7
|
"license": "MIT",
|
|
@@ -49,7 +49,7 @@
|
|
|
49
49
|
"registry": "https://registry.npmjs.org"
|
|
50
50
|
},
|
|
51
51
|
"dependencies": {
|
|
52
|
-
"@weapp-vite/miniprogram-automator": "1.
|
|
52
|
+
"@weapp-vite/miniprogram-automator": "1.4.0"
|
|
53
53
|
},
|
|
54
54
|
"scripts": {
|
|
55
55
|
"dev": "tsdown -w --sourcemap",
|