@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.
@@ -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.1.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": {