Skip to content

Commit cb8edf7

Browse files
authored
✨ 实现异步GM函数 (#492)
1 parent 1b266be commit cb8edf7

1 file changed

Lines changed: 70 additions & 20 deletions

File tree

src/app/service/content/gm_api.ts

Lines changed: 70 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -194,15 +194,47 @@ export default class GMApi {
194194
}
195195
}
196196

197+
@GMContext.API({ depend: ["GM_setValue"] })
198+
public GMDotSetValue(key: string, value: any): Promise<void> {
199+
// Asynchronous wrapper for GM_setValue to support GM.setValue
200+
return new Promise((resolve) => {
201+
this.GM_setValue(key, value);
202+
resolve();
203+
});
204+
}
205+
197206
@GMContext.API({ depend: ["GM_setValue"] })
198207
public GM_deleteValue(name: string): void {
199208
this.GM_setValue(name, undefined);
200209
}
201210

211+
@GMContext.API({ depend: ["GM_deleteValue"] })
212+
public GMDotDeleteValue(name: string): Promise<void> {
213+
// Asynchronous wrapper for GM_deleteValue to support GM.deleteValue
214+
return new Promise((resolve) => {
215+
this.GM_deleteValue(name);
216+
resolve();
217+
});
218+
}
219+
220+
@GMContext.API()
221+
public GM_listValues(): string[] {
222+
return Object.keys(this.scriptRes.value);
223+
}
224+
225+
@GMContext.API({ depend: ["GM_listValues"] })
226+
public GMDotListValues(): Promise<string[]> {
227+
// Asynchronous wrapper for GM_listValues to support GM.listValues
228+
return new Promise((resolve) => {
229+
const ret = this.GM_listValues();
230+
resolve(ret);
231+
});
232+
}
233+
202234
@GMContext.API({ depend: ["GM_setValue"] })
203235
public GM_setValues(values: { [key: string]: any }) {
204236
if (values == null) {
205-
throw new Error("GM_ setValues: values must not be null or undefined");
237+
throw new Error("GM_setValues: values must not be null or undefined");
206238
}
207239
if (typeof values !== "object") {
208240
throw new Error("GM_setValues: values must be an object");
@@ -216,12 +248,13 @@ export default class GMApi {
216248
@GMContext.API({ depend: ["GM_getValue"] })
217249
public GM_getValues(keysOrDefaults: { [key: string]: any } | string[] | null | undefined) {
218250
if (keysOrDefaults == null) {
219-
// returns all
251+
// Returns all values
220252
return this.scriptRes.value;
221253
}
222-
let result = <{ [key: string]: any }>{};
254+
let result: { [key: string]: any } = {};
223255
if (Array.isArray(keysOrDefaults)) {
224256
// 键名数组
257+
// Handle array of keys (e.g., ['foo', 'bar'])
225258
for (let index = 0; index < keysOrDefaults.length; index++) {
226259
const key = keysOrDefaults[index];
227260
if (key in this.scriptRes.value) {
@@ -230,15 +263,24 @@ export default class GMApi {
230263
}
231264
} else {
232265
// 对象 键: 默认值
266+
// Handle object with default values (e.g., { foo: 1, bar: 2, baz: 3 })
233267
Object.keys(keysOrDefaults).forEach((key) => {
234268
let defaultValue = keysOrDefaults[key];
235269
result[key] = this.GM_getValue(key, defaultValue);
236270
});
237271
}
238-
239272
return result;
240273
}
241274

275+
// Asynchronous wrapper for GM.getValues
276+
@GMContext.API({ depend: ["GM_getValues"] })
277+
public GMDotGetValues(keysOrDefaults: { [key: string]: any } | string[] | null | undefined): Promise<{ [key: string]: any }> {
278+
return new Promise((resolve) => {
279+
const ret = this.GM_getValues(keysOrDefaults);
280+
resolve(ret);
281+
});
282+
}
283+
242284
@GMContext.API({ depend: ["GM_deleteValue"] })
243285
public GM_deleteValues(keys: string[]) {
244286
if (!Array.isArray(keys)) {
@@ -250,6 +292,15 @@ export default class GMApi {
250292
});
251293
}
252294

295+
// Asynchronous wrapper for GM.deleteValues
296+
@GMContext.API({ depend: ["GM_deleteValues"] })
297+
public GMDotDeleteValues(keys: string[]): Promise<void> {
298+
return new Promise((resolve) => {
299+
this.GM_deleteValues(keys);
300+
resolve();
301+
});
302+
}
303+
253304
eventId: number = 0;
254305

255306
menuMap: Map<number, string> | undefined;
@@ -268,11 +319,6 @@ export default class GMApi {
268319
this.valueChangeListener.delete(listenerId);
269320
}
270321

271-
@GMContext.API()
272-
public GM_listValues(): string[] {
273-
return Object.keys(this.scriptRes.value);
274-
}
275-
276322
@GMContext.API()
277323
GM_log(message: string, level: GMTypes.LoggerLevel = "info", labels?: GMTypes.LoggerLabel) {
278324
if (typeof message !== "string") {
@@ -971,6 +1017,15 @@ export default class GMApi {
9711017
return undefined;
9721018
}
9731019

1020+
@GMContext.API({ depend: ["GM_getResourceText"] })
1021+
public GMDotGetResourceText(name: string): Promise<string | undefined> {
1022+
// Asynchronous wrapper for GM_getResourceText to support GM.getResourceText
1023+
return new Promise((resolve) => {
1024+
const ret = this.GM_getResourceText(name);
1025+
resolve(ret);
1026+
});
1027+
}
1028+
9741029
@GMContext.API()
9751030
GM_getResourceURL(name: string, isBlobUrl?: boolean): string | undefined {
9761031
if (!this.scriptRes.resource) {
@@ -988,17 +1043,12 @@ export default class GMApi {
9881043

9891044
// GM_getResourceURL的异步版本,用来兼容GM.getResourceUrl
9901045
@GMContext.API({ depend: ["GM_getResourceURL"] })
991-
async GMDotGetResourceUrl(name: string, isBlobUrl?: boolean): Promise<string | undefined> {
992-
if (this.scriptRes.resource) {
993-
const r = this.scriptRes.resource[name];
994-
if (r) {
995-
if (isBlobUrl) {
996-
return URL.createObjectURL(base64ToBlob(r.base64));
997-
}
998-
return r.base64;
999-
}
1000-
}
1001-
return undefined;
1046+
public GMDotGetResourceUrl(name: string, isBlobUrl?: boolean): Promise<string | undefined> {
1047+
// Asynchronous wrapper for GM_getResourceURL to support GM.getResourceURL
1048+
return new Promise((resolve) => {
1049+
const ret = this.GM_getResourceURL(name);
1050+
resolve(ret);
1051+
});
10021052
}
10031053

10041054
@GMContext.API()

0 commit comments

Comments
 (0)