|
| 1 | +/// <reference types="tampermonkey" /> |
1 | 2 | import type { Storage, ListenerId, SyncStorage, Listener } from '../common/storage'; |
2 | 3 | import { get, set, del, keys, createStore } from 'idb-keyval'; |
3 | 4 | import type { JsonValue } from 'type-fest'; |
@@ -74,52 +75,32 @@ class AsyncPolyfill implements Storage { |
74 | 75 | } |
75 | 76 | } |
76 | 77 |
|
| 78 | +function runAsync<T>(f: () => T): Promise<T> { |
| 79 | + return new Promise((resolve, reject) => { |
| 80 | + setTimeout(() => { |
| 81 | + try { |
| 82 | + resolve(f()); |
| 83 | + } catch (ex) { |
| 84 | + reject(ex instanceof Error ? ex : new Error(String(ex))); |
| 85 | + } |
| 86 | + }); |
| 87 | + }); |
| 88 | +} |
| 89 | + |
77 | 90 | class GmAsyncStorage implements Storage { |
78 | 91 | get(key: string): Promise<JsonValue | undefined> { |
79 | | - return new Promise((resolve, reject) => { |
80 | | - setTimeout(() => { |
81 | | - try { |
82 | | - resolve(parse(GM_getValue(key))); |
83 | | - } catch (ex) { |
84 | | - reject(ex as Error); |
85 | | - } |
86 | | - }); |
87 | | - }); |
| 92 | + return runAsync(() => parse(GM_getValue(key))); |
88 | 93 | } |
89 | 94 | set(key: string, value: JsonValue): Promise<void> { |
90 | | - return new Promise((resolve, reject) => { |
91 | | - setTimeout(() => { |
92 | | - try { |
93 | | - GM_setValue(key, serialize(value)); |
94 | | - resolve(); |
95 | | - } catch (ex) { |
96 | | - reject(ex as Error); |
97 | | - } |
98 | | - }); |
99 | | - }); |
| 95 | + return runAsync(() => GM_setValue(key, serialize(value))); |
100 | 96 | } |
101 | 97 | delete(key: string): Promise<void> { |
102 | | - return new Promise((resolve, reject) => { |
103 | | - setTimeout(() => { |
104 | | - try { |
105 | | - GM_deleteValue(key); |
106 | | - resolve(); |
107 | | - } catch (ex) { |
108 | | - reject(ex as Error); |
109 | | - } |
110 | | - }); |
111 | | - }); |
| 98 | + return runAsync(() => GM_deleteValue(key)); |
112 | 99 | } |
113 | 100 | keys(): Promise<string[]> { |
114 | | - return new Promise((resolve, reject) => { |
115 | | - setTimeout(() => { |
116 | | - try { |
117 | | - const ks = GM_listValues(); |
118 | | - resolve(ks.filter((k) => !k.startsWith(syncMark))); |
119 | | - } catch (ex) { |
120 | | - reject(ex as Error); |
121 | | - } |
122 | | - }); |
| 101 | + return runAsync(() => { |
| 102 | + const ks = GM_listValues(); |
| 103 | + return ks.filter((k) => !k.startsWith(syncMark)); |
123 | 104 | }); |
124 | 105 | } |
125 | 106 | on(key: string, listener: Listener): ListenerId { |
|
0 commit comments