@nemu.pm/tachiyomi-runtime 0.1.0 → 0.2.2
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/async/index.d.ts +15 -0
- package/dist/async/index.d.ts.map +1 -0
- package/dist/async/index.js +122 -0
- package/dist/async/index.js.map +1 -0
- package/dist/async/index.node.d.ts +14 -0
- package/dist/async/index.node.d.ts.map +1 -0
- package/dist/async/index.node.js +318 -0
- package/dist/async/index.node.js.map +1 -0
- package/dist/async/types.d.ts +68 -0
- package/dist/async/types.d.ts.map +1 -0
- package/dist/async/types.js +2 -0
- package/dist/async/types.js.map +1 -0
- package/dist/async/worker.d.ts +36 -0
- package/dist/async/worker.d.ts.map +1 -0
- package/dist/async/worker.js +337 -0
- package/dist/async/worker.js.map +1 -0
- package/dist/http/sync-node.d.ts +19 -0
- package/dist/http/sync-node.d.ts.map +1 -0
- package/dist/http/sync-node.js +99 -0
- package/dist/http/sync-node.js.map +1 -0
- package/dist/http/sync-xhr.d.ts +18 -0
- package/dist/http/sync-xhr.d.ts.map +1 -0
- package/dist/http/sync-xhr.js +68 -0
- package/dist/http/sync-xhr.js.map +1 -0
- package/package.json +27 -1
- package/src/async/index.node.ts +376 -0
- package/src/async/index.ts +179 -0
- package/src/async/types.ts +89 -0
- package/src/async/worker.ts +391 -0
- package/src/http/sync-node.ts +127 -0
- package/src/http/sync-xhr.ts +85 -0
|
@@ -0,0 +1,337 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Web Worker for running Tachiyomi Kotlin/JS extension sources
|
|
3
|
+
* Sync XHR works in workers, enabling blocking HTTP calls from Kotlin/JS
|
|
4
|
+
*/
|
|
5
|
+
import * as Comlink from "comlink";
|
|
6
|
+
import { createRuntime } from "../runtime";
|
|
7
|
+
import { createSyncXhrBridge } from "../http/sync-xhr";
|
|
8
|
+
// ============ Preferences Storage ============
|
|
9
|
+
// SharedPreferences implementation for Kotlin/JS
|
|
10
|
+
const prefsStorage = new Map();
|
|
11
|
+
let pendingPrefChanges = [];
|
|
12
|
+
class SharedPreferencesImpl {
|
|
13
|
+
constructor(name) {
|
|
14
|
+
this.name = name;
|
|
15
|
+
if (!prefsStorage.has(name)) {
|
|
16
|
+
prefsStorage.set(name, new Map());
|
|
17
|
+
}
|
|
18
|
+
this.data = prefsStorage.get(name);
|
|
19
|
+
}
|
|
20
|
+
getString(key, defValue) {
|
|
21
|
+
const val = this.data.get(key);
|
|
22
|
+
return typeof val === "string" ? val : defValue;
|
|
23
|
+
}
|
|
24
|
+
getBoolean(key, defValue) {
|
|
25
|
+
const val = this.data.get(key);
|
|
26
|
+
return typeof val === "boolean" ? val : defValue;
|
|
27
|
+
}
|
|
28
|
+
getInt(key, defValue) {
|
|
29
|
+
const val = this.data.get(key);
|
|
30
|
+
return typeof val === "number" ? Math.floor(val) : defValue;
|
|
31
|
+
}
|
|
32
|
+
getLong(key, defValue) {
|
|
33
|
+
return this.getInt(key, defValue);
|
|
34
|
+
}
|
|
35
|
+
getFloat(key, defValue) {
|
|
36
|
+
const val = this.data.get(key);
|
|
37
|
+
return typeof val === "number" ? val : defValue;
|
|
38
|
+
}
|
|
39
|
+
getStringSet(key, defValue) {
|
|
40
|
+
const val = this.data.get(key);
|
|
41
|
+
return Array.isArray(val) ? val : defValue;
|
|
42
|
+
}
|
|
43
|
+
getAll() {
|
|
44
|
+
const result = {};
|
|
45
|
+
for (const [k, v] of this.data.entries()) {
|
|
46
|
+
result[k] = v;
|
|
47
|
+
}
|
|
48
|
+
return result;
|
|
49
|
+
}
|
|
50
|
+
contains(key) {
|
|
51
|
+
return this.data.has(key);
|
|
52
|
+
}
|
|
53
|
+
edit() {
|
|
54
|
+
return new SharedPreferencesEditor(this.name, this.data);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
class SharedPreferencesEditor {
|
|
58
|
+
constructor(name, data) {
|
|
59
|
+
this.changes = new Map();
|
|
60
|
+
this.name = name;
|
|
61
|
+
this.data = data;
|
|
62
|
+
}
|
|
63
|
+
putString(key, value) {
|
|
64
|
+
this.changes.set(key, value);
|
|
65
|
+
return this;
|
|
66
|
+
}
|
|
67
|
+
putBoolean(key, value) {
|
|
68
|
+
this.changes.set(key, value);
|
|
69
|
+
return this;
|
|
70
|
+
}
|
|
71
|
+
putInt(key, value) {
|
|
72
|
+
this.changes.set(key, Math.floor(value));
|
|
73
|
+
return this;
|
|
74
|
+
}
|
|
75
|
+
putLong(key, value) {
|
|
76
|
+
return this.putInt(key, value);
|
|
77
|
+
}
|
|
78
|
+
putFloat(key, value) {
|
|
79
|
+
this.changes.set(key, value);
|
|
80
|
+
return this;
|
|
81
|
+
}
|
|
82
|
+
putStringSet(key, value) {
|
|
83
|
+
this.changes.set(key, value);
|
|
84
|
+
return this;
|
|
85
|
+
}
|
|
86
|
+
remove(key) {
|
|
87
|
+
this.changes.set(key, null);
|
|
88
|
+
return this;
|
|
89
|
+
}
|
|
90
|
+
clear() {
|
|
91
|
+
for (const key of this.data.keys()) {
|
|
92
|
+
this.changes.set(key, null);
|
|
93
|
+
}
|
|
94
|
+
return this;
|
|
95
|
+
}
|
|
96
|
+
apply() {
|
|
97
|
+
this.commit();
|
|
98
|
+
}
|
|
99
|
+
commit() {
|
|
100
|
+
for (const [key, value] of this.changes) {
|
|
101
|
+
if (value === null) {
|
|
102
|
+
this.data.delete(key);
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
this.data.set(key, value);
|
|
106
|
+
}
|
|
107
|
+
pendingPrefChanges.push({ name: this.name, key, value });
|
|
108
|
+
}
|
|
109
|
+
this.changes.clear();
|
|
110
|
+
return true;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
// Expose SharedPreferences factory to Kotlin/JS
|
|
114
|
+
globalThis.getSharedPreferences = (name) => {
|
|
115
|
+
return new SharedPreferencesImpl(name);
|
|
116
|
+
};
|
|
117
|
+
// ============ Worker API ============
|
|
118
|
+
let proxyUrlFn = null;
|
|
119
|
+
let runtime = null;
|
|
120
|
+
let extension = null;
|
|
121
|
+
let manifest = null;
|
|
122
|
+
/**
|
|
123
|
+
* Initialize the runtime with proxy URL
|
|
124
|
+
*/
|
|
125
|
+
function initRuntime(proxyUrl) {
|
|
126
|
+
proxyUrlFn = proxyUrl ? (url) => `${proxyUrl}${encodeURIComponent(url)}` : null;
|
|
127
|
+
const httpBridge = createSyncXhrBridge({ proxyUrl: proxyUrlFn ?? undefined });
|
|
128
|
+
runtime = createRuntime(httpBridge);
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Worker API exposed via Comlink
|
|
132
|
+
*/
|
|
133
|
+
const workerApi = {
|
|
134
|
+
// ============ Preferences Methods ============
|
|
135
|
+
initPreferences(prefsName, values) {
|
|
136
|
+
const prefs = new Map();
|
|
137
|
+
for (const [key, value] of Object.entries(values)) {
|
|
138
|
+
prefs.set(key, value);
|
|
139
|
+
}
|
|
140
|
+
prefsStorage.set(prefsName, prefs);
|
|
141
|
+
},
|
|
142
|
+
flushPrefChanges() {
|
|
143
|
+
const changes = pendingPrefChanges;
|
|
144
|
+
pendingPrefChanges = [];
|
|
145
|
+
return changes;
|
|
146
|
+
},
|
|
147
|
+
getSettingsSchema(sourceId) {
|
|
148
|
+
if (!extension)
|
|
149
|
+
return null;
|
|
150
|
+
try {
|
|
151
|
+
const schema = extension.getSettingsSchema(sourceId);
|
|
152
|
+
return schema ? JSON.stringify(schema) : null;
|
|
153
|
+
}
|
|
154
|
+
catch (e) {
|
|
155
|
+
console.error("[Tachiyomi Worker] getSettingsSchema error:", e);
|
|
156
|
+
return null;
|
|
157
|
+
}
|
|
158
|
+
},
|
|
159
|
+
// ============ Load Extension ============
|
|
160
|
+
async load(jsUrl, manifestData, proxyUrl) {
|
|
161
|
+
try {
|
|
162
|
+
console.log("[Tachiyomi Worker] Loading JS from:", jsUrl);
|
|
163
|
+
// Initialize runtime with proxy
|
|
164
|
+
initRuntime(proxyUrl);
|
|
165
|
+
if (!runtime)
|
|
166
|
+
throw new Error("Failed to initialize runtime");
|
|
167
|
+
manifest = manifestData;
|
|
168
|
+
// Fetch the extension code
|
|
169
|
+
const response = await fetch(jsUrl);
|
|
170
|
+
if (!response.ok) {
|
|
171
|
+
throw new Error(`Failed to fetch extension: ${response.status}`);
|
|
172
|
+
}
|
|
173
|
+
const code = await response.text();
|
|
174
|
+
// Load extension using the runtime
|
|
175
|
+
extension = runtime.loadExtension(code);
|
|
176
|
+
// Get sources metadata
|
|
177
|
+
const sources = extension.getSources();
|
|
178
|
+
manifest.sources = sources;
|
|
179
|
+
console.log("[Tachiyomi Worker] Loaded, sources:", sources.length, sources.map(s => s.name).slice(0, 5));
|
|
180
|
+
return { success: sources.length > 0, manifest };
|
|
181
|
+
}
|
|
182
|
+
catch (e) {
|
|
183
|
+
console.error("[Tachiyomi Worker] Failed to load:", e);
|
|
184
|
+
return { success: false };
|
|
185
|
+
}
|
|
186
|
+
},
|
|
187
|
+
isLoaded() {
|
|
188
|
+
return extension !== null;
|
|
189
|
+
},
|
|
190
|
+
getManifest() {
|
|
191
|
+
return manifest;
|
|
192
|
+
},
|
|
193
|
+
getSources() {
|
|
194
|
+
return manifest?.sources ?? [];
|
|
195
|
+
},
|
|
196
|
+
// ============ Filter Methods ============
|
|
197
|
+
getFilterList(sourceId) {
|
|
198
|
+
if (!extension)
|
|
199
|
+
return [];
|
|
200
|
+
try {
|
|
201
|
+
return extension.getFilterList(sourceId);
|
|
202
|
+
}
|
|
203
|
+
catch (e) {
|
|
204
|
+
console.error("[Tachiyomi Worker] getFilterList error:", e);
|
|
205
|
+
return [];
|
|
206
|
+
}
|
|
207
|
+
},
|
|
208
|
+
resetFilters(sourceId) {
|
|
209
|
+
if (!extension)
|
|
210
|
+
return false;
|
|
211
|
+
try {
|
|
212
|
+
extension.resetFilters(sourceId);
|
|
213
|
+
return true;
|
|
214
|
+
}
|
|
215
|
+
catch (e) {
|
|
216
|
+
console.error("[Tachiyomi Worker] resetFilters error:", e);
|
|
217
|
+
return false;
|
|
218
|
+
}
|
|
219
|
+
},
|
|
220
|
+
applyFilterState(sourceId, filterStateJson) {
|
|
221
|
+
if (!extension)
|
|
222
|
+
return false;
|
|
223
|
+
try {
|
|
224
|
+
const filterState = JSON.parse(filterStateJson);
|
|
225
|
+
extension.applyFilterState(sourceId, filterState);
|
|
226
|
+
return true;
|
|
227
|
+
}
|
|
228
|
+
catch (e) {
|
|
229
|
+
console.error("[Tachiyomi Worker] applyFilterState error:", e);
|
|
230
|
+
return false;
|
|
231
|
+
}
|
|
232
|
+
},
|
|
233
|
+
// ============ Data Methods ============
|
|
234
|
+
getPopularManga(sourceId, page) {
|
|
235
|
+
if (!extension)
|
|
236
|
+
return { mangas: [], hasNextPage: false };
|
|
237
|
+
try {
|
|
238
|
+
return extension.getPopularManga(sourceId, page);
|
|
239
|
+
}
|
|
240
|
+
catch (e) {
|
|
241
|
+
console.error("[Tachiyomi Worker] getPopularManga error:", e);
|
|
242
|
+
return { mangas: [], hasNextPage: false };
|
|
243
|
+
}
|
|
244
|
+
},
|
|
245
|
+
getLatestUpdates(sourceId, page) {
|
|
246
|
+
if (!extension)
|
|
247
|
+
return { mangas: [], hasNextPage: false };
|
|
248
|
+
try {
|
|
249
|
+
return extension.getLatestUpdates(sourceId, page);
|
|
250
|
+
}
|
|
251
|
+
catch (e) {
|
|
252
|
+
console.error("[Tachiyomi Worker] getLatestUpdates error:", e);
|
|
253
|
+
return { mangas: [], hasNextPage: false };
|
|
254
|
+
}
|
|
255
|
+
},
|
|
256
|
+
searchManga(sourceId, page, query) {
|
|
257
|
+
if (!extension)
|
|
258
|
+
return { mangas: [], hasNextPage: false };
|
|
259
|
+
try {
|
|
260
|
+
return extension.searchManga(sourceId, page, query);
|
|
261
|
+
}
|
|
262
|
+
catch (e) {
|
|
263
|
+
console.error("[Tachiyomi Worker] searchManga error:", e);
|
|
264
|
+
return { mangas: [], hasNextPage: false };
|
|
265
|
+
}
|
|
266
|
+
},
|
|
267
|
+
searchMangaWithFilters(sourceId, page, query, filterStateJson) {
|
|
268
|
+
if (!extension)
|
|
269
|
+
return { mangas: [], hasNextPage: false };
|
|
270
|
+
try {
|
|
271
|
+
// Apply filters before searching
|
|
272
|
+
if (filterStateJson && filterStateJson !== "[]") {
|
|
273
|
+
const filterState = JSON.parse(filterStateJson);
|
|
274
|
+
extension.applyFilterState(sourceId, filterState);
|
|
275
|
+
}
|
|
276
|
+
return extension.searchManga(sourceId, page, query);
|
|
277
|
+
}
|
|
278
|
+
catch (e) {
|
|
279
|
+
console.error("[Tachiyomi Worker] searchMangaWithFilters error:", e);
|
|
280
|
+
return { mangas: [], hasNextPage: false };
|
|
281
|
+
}
|
|
282
|
+
},
|
|
283
|
+
getMangaDetails(sourceId, mangaUrl) {
|
|
284
|
+
if (!extension)
|
|
285
|
+
return null;
|
|
286
|
+
try {
|
|
287
|
+
return extension.getMangaDetails(sourceId, { url: mangaUrl });
|
|
288
|
+
}
|
|
289
|
+
catch (e) {
|
|
290
|
+
console.error("[Tachiyomi Worker] getMangaDetails error:", e);
|
|
291
|
+
return null;
|
|
292
|
+
}
|
|
293
|
+
},
|
|
294
|
+
getChapterList(sourceId, mangaUrl) {
|
|
295
|
+
if (!extension)
|
|
296
|
+
return [];
|
|
297
|
+
try {
|
|
298
|
+
return extension.getChapterList(sourceId, { url: mangaUrl });
|
|
299
|
+
}
|
|
300
|
+
catch (e) {
|
|
301
|
+
console.error("[Tachiyomi Worker] getChapterList error:", e);
|
|
302
|
+
return [];
|
|
303
|
+
}
|
|
304
|
+
},
|
|
305
|
+
getPageList(sourceId, chapterUrl) {
|
|
306
|
+
if (!extension)
|
|
307
|
+
return [];
|
|
308
|
+
try {
|
|
309
|
+
return extension.getPageList(sourceId, { url: chapterUrl });
|
|
310
|
+
}
|
|
311
|
+
catch (e) {
|
|
312
|
+
console.error("[Tachiyomi Worker] getPageList error:", e);
|
|
313
|
+
return [];
|
|
314
|
+
}
|
|
315
|
+
},
|
|
316
|
+
fetchImage(sourceId, pageUrl, pageImageUrl) {
|
|
317
|
+
if (!extension) {
|
|
318
|
+
throw new Error("Extension not loaded");
|
|
319
|
+
}
|
|
320
|
+
// Always returns base64 bytes (like Mihon's getImage)
|
|
321
|
+
return extension.fetchImage(sourceId, pageUrl, pageImageUrl);
|
|
322
|
+
},
|
|
323
|
+
getHeaders(sourceId) {
|
|
324
|
+
if (!extension) {
|
|
325
|
+
return {};
|
|
326
|
+
}
|
|
327
|
+
try {
|
|
328
|
+
return extension.getHeaders(sourceId);
|
|
329
|
+
}
|
|
330
|
+
catch (e) {
|
|
331
|
+
console.warn("[Tachiyomi Worker] getHeaders error:", e);
|
|
332
|
+
return {};
|
|
333
|
+
}
|
|
334
|
+
},
|
|
335
|
+
};
|
|
336
|
+
Comlink.expose(workerApi);
|
|
337
|
+
//# sourceMappingURL=worker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker.js","sourceRoot":"","sources":["../../src/async/worker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Node.js/Bun sync HTTP using child_process
|
|
3
|
+
* Uses curl for actual HTTP requests
|
|
4
|
+
*/
|
|
5
|
+
import type { HttpBridge } from "../http";
|
|
6
|
+
export interface SyncNodeOptions {
|
|
7
|
+
/**
|
|
8
|
+
* Proxy URL base - transforms target URL
|
|
9
|
+
* Not typically needed in Node.js (no CORS)
|
|
10
|
+
* Example: "https://proxy.example.com/?url="
|
|
11
|
+
*/
|
|
12
|
+
proxyUrl?: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Create an HttpBridge using synchronous child_process (curl)
|
|
16
|
+
* Works in Node.js and Bun
|
|
17
|
+
*/
|
|
18
|
+
export declare function createSyncNodeBridge(options?: SyncNodeOptions): HttpBridge;
|
|
19
|
+
//# sourceMappingURL=sync-node.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-node.d.ts","sourceRoot":"","sources":["../../src/http/sync-node.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,UAAU,EAA6B,MAAM,SAAS,CAAC;AAGrE,MAAM,WAAW,eAAe;IAC9B;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,GAAE,eAAoB,GAAG,UAAU,CAyG9E"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { spawnSync } from "child_process";
|
|
2
|
+
/**
|
|
3
|
+
* Create an HttpBridge using synchronous child_process (curl)
|
|
4
|
+
* Works in Node.js and Bun
|
|
5
|
+
*/
|
|
6
|
+
export function createSyncNodeBridge(options = {}) {
|
|
7
|
+
const { proxyUrl } = options;
|
|
8
|
+
return {
|
|
9
|
+
request(req, wantBytes) {
|
|
10
|
+
try {
|
|
11
|
+
const url = proxyUrl ? `${proxyUrl}${encodeURIComponent(req.url)}` : req.url;
|
|
12
|
+
// Build curl command
|
|
13
|
+
const args = [
|
|
14
|
+
"-s", // silent
|
|
15
|
+
"-S", // show errors
|
|
16
|
+
"-L", // follow redirects
|
|
17
|
+
"-D", "-", // dump headers to stdout
|
|
18
|
+
"-X", req.method,
|
|
19
|
+
];
|
|
20
|
+
// Add headers
|
|
21
|
+
for (const [key, value] of Object.entries(req.headers)) {
|
|
22
|
+
args.push("-H", `${key}: ${value}`);
|
|
23
|
+
}
|
|
24
|
+
// Add body for POST/PUT
|
|
25
|
+
if (req.body && (req.method === "POST" || req.method === "PUT" || req.method === "PATCH")) {
|
|
26
|
+
args.push("-d", req.body);
|
|
27
|
+
}
|
|
28
|
+
// Request binary output if needed
|
|
29
|
+
if (wantBytes) {
|
|
30
|
+
args.push("-o", "-"); // output to stdout
|
|
31
|
+
}
|
|
32
|
+
args.push(url);
|
|
33
|
+
// Execute curl
|
|
34
|
+
const result = spawnSync("curl", args, {
|
|
35
|
+
encoding: wantBytes ? "buffer" : "utf-8",
|
|
36
|
+
maxBuffer: 50 * 1024 * 1024, // 50MB
|
|
37
|
+
});
|
|
38
|
+
if (result.error) {
|
|
39
|
+
throw result.error;
|
|
40
|
+
}
|
|
41
|
+
// Parse response (headers + body)
|
|
42
|
+
const output = wantBytes
|
|
43
|
+
? result.stdout
|
|
44
|
+
: result.stdout;
|
|
45
|
+
// Find header/body separator
|
|
46
|
+
let headerEnd;
|
|
47
|
+
let bodyStart;
|
|
48
|
+
const separator = "\r\n\r\n";
|
|
49
|
+
if (wantBytes) {
|
|
50
|
+
const buf = output;
|
|
51
|
+
headerEnd = buf.indexOf(separator);
|
|
52
|
+
bodyStart = headerEnd + 4;
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
headerEnd = output.indexOf(separator);
|
|
56
|
+
bodyStart = headerEnd + 4;
|
|
57
|
+
}
|
|
58
|
+
// Parse headers
|
|
59
|
+
const headerSection = wantBytes
|
|
60
|
+
? output.slice(0, headerEnd).toString("utf-8")
|
|
61
|
+
: output.slice(0, headerEnd);
|
|
62
|
+
const headerLines = headerSection.split("\r\n");
|
|
63
|
+
const statusLine = headerLines[0] ?? "";
|
|
64
|
+
const statusMatch = statusLine.match(/HTTP\/[\d.]+ (\d+) (.*)/);
|
|
65
|
+
const status = statusMatch ? parseInt(statusMatch[1], 10) : 0;
|
|
66
|
+
const statusText = statusMatch ? statusMatch[2] : "";
|
|
67
|
+
const headers = {};
|
|
68
|
+
for (let i = 1; i < headerLines.length; i++) {
|
|
69
|
+
const line = headerLines[i];
|
|
70
|
+
const idx = line.indexOf(": ");
|
|
71
|
+
if (idx > 0) {
|
|
72
|
+
const key = line.substring(0, idx).toLowerCase();
|
|
73
|
+
const value = line.substring(idx + 2);
|
|
74
|
+
headers[key] = headers[key] ? `${headers[key]}, ${value}` : value;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
// Extract body
|
|
78
|
+
let body;
|
|
79
|
+
if (wantBytes) {
|
|
80
|
+
const bodyBuf = output.slice(bodyStart);
|
|
81
|
+
body = bodyBuf.toString("base64");
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
body = output.slice(bodyStart);
|
|
85
|
+
}
|
|
86
|
+
return { status, statusText, headers, body };
|
|
87
|
+
}
|
|
88
|
+
catch (e) {
|
|
89
|
+
return {
|
|
90
|
+
status: 0,
|
|
91
|
+
statusText: String(e),
|
|
92
|
+
headers: {},
|
|
93
|
+
body: "",
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
},
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=sync-node.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-node.js","sourceRoot":"","sources":["../../src/http/sync-node.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser sync HTTP using XMLHttpRequest
|
|
3
|
+
* Must run in a Web Worker for sync XHR to work
|
|
4
|
+
*/
|
|
5
|
+
import type { HttpBridge } from "../http";
|
|
6
|
+
export interface SyncXhrOptions {
|
|
7
|
+
/**
|
|
8
|
+
* Proxy URL function - transforms target URL for CORS bypass
|
|
9
|
+
* Example: (url) => `https://proxy.example.com/?url=${encodeURIComponent(url)}`
|
|
10
|
+
*/
|
|
11
|
+
proxyUrl?: (url: string) => string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Create an HttpBridge using synchronous XMLHttpRequest
|
|
15
|
+
* Only works in Web Workers (sync XHR is deprecated on main thread)
|
|
16
|
+
*/
|
|
17
|
+
export declare function createSyncXhrBridge(options?: SyncXhrOptions): HttpBridge;
|
|
18
|
+
//# sourceMappingURL=sync-xhr.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-xhr.d.ts","sourceRoot":"","sources":["../../src/http/sync-xhr.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,UAAU,EAA6B,MAAM,SAAS,CAAC;AAErE,MAAM,WAAW,cAAc;IAC7B;;;OAGG;IACH,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;CACpC;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,GAAE,cAAmB,GAAG,UAAU,CAiE5E"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Create an HttpBridge using synchronous XMLHttpRequest
|
|
3
|
+
* Only works in Web Workers (sync XHR is deprecated on main thread)
|
|
4
|
+
*/
|
|
5
|
+
export function createSyncXhrBridge(options = {}) {
|
|
6
|
+
const { proxyUrl } = options;
|
|
7
|
+
return {
|
|
8
|
+
request(req, wantBytes) {
|
|
9
|
+
try {
|
|
10
|
+
const xhr = new XMLHttpRequest();
|
|
11
|
+
const url = proxyUrl ? proxyUrl(req.url) : req.url;
|
|
12
|
+
xhr.open(req.method, url, false); // false = synchronous
|
|
13
|
+
xhr.responseType = wantBytes ? "arraybuffer" : "text";
|
|
14
|
+
// Set headers with x-proxy- prefix for CORS proxy
|
|
15
|
+
for (const [key, value] of Object.entries(req.headers)) {
|
|
16
|
+
try {
|
|
17
|
+
xhr.setRequestHeader(`x-proxy-${key}`, value);
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
// Some headers can't be set in browsers
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
xhr.send(req.body);
|
|
24
|
+
// Collect response headers
|
|
25
|
+
const responseHeaders = {};
|
|
26
|
+
const headerLines = xhr.getAllResponseHeaders().split("\r\n");
|
|
27
|
+
for (const line of headerLines) {
|
|
28
|
+
const idx = line.indexOf(": ");
|
|
29
|
+
if (idx > 0) {
|
|
30
|
+
const key = line.substring(0, idx).toLowerCase();
|
|
31
|
+
const value = line.substring(idx + 2);
|
|
32
|
+
responseHeaders[key] = responseHeaders[key]
|
|
33
|
+
? `${responseHeaders[key]}, ${value}`
|
|
34
|
+
: value;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
// Get body - text or base64
|
|
38
|
+
let responseBody;
|
|
39
|
+
if (wantBytes) {
|
|
40
|
+
const bytes = new Uint8Array(xhr.response);
|
|
41
|
+
let binary = "";
|
|
42
|
+
for (let i = 0; i < bytes.length; i++) {
|
|
43
|
+
binary += String.fromCharCode(bytes[i]);
|
|
44
|
+
}
|
|
45
|
+
responseBody = btoa(binary);
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
responseBody = xhr.responseText;
|
|
49
|
+
}
|
|
50
|
+
return {
|
|
51
|
+
status: xhr.status,
|
|
52
|
+
statusText: xhr.statusText,
|
|
53
|
+
headers: responseHeaders,
|
|
54
|
+
body: responseBody,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
catch (e) {
|
|
58
|
+
return {
|
|
59
|
+
status: 0,
|
|
60
|
+
statusText: String(e),
|
|
61
|
+
headers: {},
|
|
62
|
+
body: "",
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
},
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=sync-xhr.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-xhr.js","sourceRoot":"","sources":["../../src/http/sync-xhr.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nemu.pm/tachiyomi-runtime",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.2",
|
|
4
4
|
"description": "Runtime for loading and executing Tachiyomi extensions compiled to JavaScript",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -30,6 +30,28 @@
|
|
|
30
30
|
"types": "./dist/index.d.ts",
|
|
31
31
|
"default": "./dist/index.js"
|
|
32
32
|
}
|
|
33
|
+
},
|
|
34
|
+
"./async": {
|
|
35
|
+
"browser": {
|
|
36
|
+
"types": "./dist/async/index.d.ts",
|
|
37
|
+
"default": "./dist/async/index.js"
|
|
38
|
+
},
|
|
39
|
+
"bun": {
|
|
40
|
+
"types": "./dist/async/index.node.d.ts",
|
|
41
|
+
"default": "./dist/async/index.node.js"
|
|
42
|
+
},
|
|
43
|
+
"node": {
|
|
44
|
+
"types": "./dist/async/index.node.d.ts",
|
|
45
|
+
"default": "./dist/async/index.node.js"
|
|
46
|
+
},
|
|
47
|
+
"default": {
|
|
48
|
+
"types": "./dist/async/index.d.ts",
|
|
49
|
+
"default": "./dist/async/index.js"
|
|
50
|
+
}
|
|
51
|
+
},
|
|
52
|
+
"./worker": {
|
|
53
|
+
"types": "./dist/async/worker.d.ts",
|
|
54
|
+
"default": "./dist/async/worker.js"
|
|
33
55
|
}
|
|
34
56
|
},
|
|
35
57
|
"files": [
|
|
@@ -48,7 +70,11 @@
|
|
|
48
70
|
"runtime"
|
|
49
71
|
],
|
|
50
72
|
"license": "MIT",
|
|
73
|
+
"dependencies": {
|
|
74
|
+
"comlink": "^4.4.2"
|
|
75
|
+
},
|
|
51
76
|
"devDependencies": {
|
|
77
|
+
"@types/node": "^22.0.0",
|
|
52
78
|
"typescript": "^5.0.0"
|
|
53
79
|
},
|
|
54
80
|
"optionalDependencies": {
|