@kbve/droid 0.0.5 → 0.0.6
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/README.md +3 -1
- package/package.json +1 -1
- package/src/lib/workers/main.ts +177 -134
- package/workers/main.js +616 -582
package/README.md
CHANGED
|
@@ -20,6 +20,7 @@ Droid requires a few runtime dependencies to provide its full feature set:
|
|
|
20
20
|
- [@nanostores/persistent](https://www.npmjs.com/package/@nanostores/persistent): Persistent state management
|
|
21
21
|
- [dexie](https://www.npmjs.com/package/dexie): IndexedDB wrapper for browser storage
|
|
22
22
|
- [zod](https://www.npmjs.com/package/zod): TypeScript-first schema validation
|
|
23
|
+
- [flatbuffers](https://www.npmjs.com/flatbuffers) - Flatbuffers
|
|
23
24
|
|
|
24
25
|
These dependencies are automatically installed when you add Droid to your project. If you plan to use Droid with specific frameworks or build tools, you may need to install related peer dependencies (such as React, Vue, or Angular) according to your project requirements.
|
|
25
26
|
|
|
@@ -40,4 +41,5 @@ For questions, help, or to connect with the community, support can be reached vi
|
|
|
40
41
|
|
|
41
42
|
### Chores
|
|
42
43
|
|
|
43
|
-
Preparing to release next batch, trying to resolving the CDN issue, which might still be broken.
|
|
44
|
+
Preparing to release next batch, trying to resolving the CDN issue, which might still be broken.
|
|
45
|
+
Updating the order on the init functions, but we will still have a CDN error that needs to be resolved.
|
package/package.json
CHANGED
package/src/lib/workers/main.ts
CHANGED
|
@@ -41,66 +41,78 @@ function deepProxy<T>(obj: T): T {
|
|
|
41
41
|
|
|
42
42
|
return obj;
|
|
43
43
|
}
|
|
44
|
-
|
|
45
44
|
async function initWsComlink(opts?: {
|
|
46
45
|
workerRef?: SharedWorker;
|
|
47
46
|
workerURL?: string;
|
|
48
47
|
}): Promise<Remote<WSInstance>> {
|
|
49
48
|
let api: Remote<WSInstance> | null = null;
|
|
50
49
|
|
|
51
|
-
// 1. Try
|
|
52
|
-
|
|
53
|
-
const worker = new SharedWorker(new URL('./ws-worker.ts', import.meta.url), {
|
|
54
|
-
type: 'module',
|
|
55
|
-
});
|
|
56
|
-
worker.port.start();
|
|
57
|
-
api = wrap<WSInstance>(worker.port);
|
|
58
|
-
} catch (err) {
|
|
59
|
-
console.warn('[DROID] ws-worker import.meta fallback failed:', err);
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
// 2. Try hardcoded path
|
|
63
|
-
if (!api) {
|
|
64
|
-
try {
|
|
65
|
-
const worker = new SharedWorker('/ws-worker.js', { type: 'module' });
|
|
66
|
-
worker.port.start();
|
|
67
|
-
api = wrap<WSInstance>(worker.port);
|
|
68
|
-
} catch (err) {
|
|
69
|
-
console.warn('[DROID] ws-worker hardcoded fallback failed:', err);
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
// 3. Try provided SharedWorker reference
|
|
74
|
-
if (!api && opts?.workerRef) {
|
|
50
|
+
// 1. Try provided SharedWorker reference
|
|
51
|
+
if (opts?.workerRef) {
|
|
75
52
|
try {
|
|
76
53
|
opts.workerRef.port.start();
|
|
77
54
|
api = wrap<WSInstance>(opts.workerRef.port);
|
|
55
|
+
return api;
|
|
78
56
|
} catch (err) {
|
|
79
57
|
console.warn('[DROID] ws-worker workerRef failed:', err);
|
|
80
58
|
}
|
|
81
59
|
}
|
|
82
60
|
|
|
83
|
-
//
|
|
84
|
-
if (
|
|
61
|
+
// 2. Try provided URL (e.g. from CDN or blob)
|
|
62
|
+
if (opts?.workerURL) {
|
|
85
63
|
try {
|
|
86
64
|
const worker = new SharedWorker(opts.workerURL, { type: 'module' });
|
|
87
65
|
worker.port.start();
|
|
88
66
|
api = wrap<WSInstance>(worker.port);
|
|
67
|
+
return api;
|
|
89
68
|
} catch (err) {
|
|
90
69
|
console.warn('[DROID] ws-worker workerURL failed:', err);
|
|
91
70
|
}
|
|
92
71
|
}
|
|
93
72
|
|
|
94
|
-
//
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
73
|
+
// 3. Vite-style TS import
|
|
74
|
+
try {
|
|
75
|
+
const worker = new SharedWorker(
|
|
76
|
+
new URL('./ws-worker.ts', import.meta.url),
|
|
77
|
+
{ type: 'module' },
|
|
78
|
+
);
|
|
79
|
+
worker.port.start();
|
|
80
|
+
api = wrap<WSInstance>(worker.port);
|
|
81
|
+
return api;
|
|
82
|
+
} catch (err) {
|
|
83
|
+
console.warn('[DROID] ws-worker vite-style .ts import failed:', err);
|
|
98
84
|
}
|
|
99
85
|
|
|
100
|
-
|
|
86
|
+
// 4. Same-dir JS fallback (post-build)
|
|
87
|
+
try {
|
|
88
|
+
const worker = new SharedWorker(
|
|
89
|
+
new URL('./ws-worker.js', import.meta.url),
|
|
90
|
+
{ type: 'module' },
|
|
91
|
+
);
|
|
92
|
+
worker.port.start();
|
|
93
|
+
api = wrap<WSInstance>(worker.port);
|
|
94
|
+
return api;
|
|
95
|
+
} catch (err) {
|
|
96
|
+
console.warn('[DROID] ws-worker ./ws-worker.js fallback failed:', err);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// 5. Browser-root hardcoded path (static /public/)
|
|
100
|
+
try {
|
|
101
|
+
const worker = new SharedWorker('/ws-worker.js', { type: 'module' });
|
|
102
|
+
worker.port.start();
|
|
103
|
+
api = wrap<WSInstance>(worker.port);
|
|
104
|
+
return api;
|
|
105
|
+
} catch (err) {
|
|
106
|
+
console.warn('[DROID] ws-worker absolute hardcoded fallback failed:', err);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// 6. Final failure
|
|
110
|
+
console.error('[DROID] No WS Worker Comlink Initialized');
|
|
111
|
+
throw new Error('[DROID] Failed to initialize ws-worker');
|
|
101
112
|
}
|
|
102
113
|
|
|
103
114
|
|
|
115
|
+
|
|
104
116
|
// * UIUX
|
|
105
117
|
const uiuxState = persistentMap<{
|
|
106
118
|
panelManager: Record<
|
|
@@ -133,52 +145,71 @@ const uiuxState = persistentMap<{
|
|
|
133
145
|
);
|
|
134
146
|
|
|
135
147
|
async function initCanvasComlink(opts?: {
|
|
136
|
-
|
|
137
|
-
|
|
148
|
+
workerRef?: Worker;
|
|
149
|
+
workerURL?: string;
|
|
138
150
|
}): Promise<Remote<CanvasWorkerAPI>> {
|
|
139
|
-
|
|
140
|
-
try {
|
|
141
|
-
const worker = new Worker(
|
|
142
|
-
new URL('./canvas-worker.ts', import.meta.url),
|
|
143
|
-
{ type: 'module' },
|
|
144
|
-
);
|
|
145
|
-
return wrap<CanvasWorkerAPI>(worker);
|
|
146
|
-
} catch (err) {
|
|
147
|
-
console.warn('[DROID] Vite-style canvas-worker import failed:', err);
|
|
148
|
-
}
|
|
151
|
+
let api: Remote<CanvasWorkerAPI> | null = null;
|
|
149
152
|
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
153
|
+
// 1. Try direct Worker reference
|
|
154
|
+
if (opts?.workerRef) {
|
|
155
|
+
try {
|
|
156
|
+
api = wrap<CanvasWorkerAPI>(opts.workerRef);
|
|
157
|
+
return api;
|
|
158
|
+
} catch (err) {
|
|
159
|
+
console.warn('[DROID] Provided canvasWorkerRef failed:', err);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
157
162
|
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
163
|
+
// 2. Try provided worker URL
|
|
164
|
+
if (opts?.workerURL) {
|
|
165
|
+
try {
|
|
166
|
+
const worker = new Worker(opts.workerURL, { type: 'module' });
|
|
167
|
+
api = wrap<CanvasWorkerAPI>(worker);
|
|
168
|
+
return api;
|
|
169
|
+
} catch (err) {
|
|
170
|
+
console.warn('[DROID] Provided canvasWorkerURL failed:', err);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
166
173
|
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
174
|
+
// 3. Vite-style dev import (.ts)
|
|
175
|
+
try {
|
|
176
|
+
const worker = new Worker(
|
|
177
|
+
new URL('./canvas-worker.ts', import.meta.url),
|
|
178
|
+
{ type: 'module' },
|
|
179
|
+
);
|
|
180
|
+
api = wrap<CanvasWorkerAPI>(worker);
|
|
181
|
+
return api;
|
|
182
|
+
} catch (err) {
|
|
183
|
+
console.warn('[DROID] Vite-style canvas-worker.ts import failed:', err);
|
|
184
|
+
}
|
|
176
185
|
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
186
|
+
// 4. Same-dir .js fallback (build output)
|
|
187
|
+
try {
|
|
188
|
+
const worker = new Worker(
|
|
189
|
+
new URL('./canvas-worker.js', import.meta.url),
|
|
190
|
+
{ type: 'module' },
|
|
191
|
+
);
|
|
192
|
+
api = wrap<CanvasWorkerAPI>(worker);
|
|
193
|
+
return api;
|
|
194
|
+
} catch (err) {
|
|
195
|
+
console.warn('[DROID] canvas-worker.js (same dir) fallback failed:', err);
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
// 5. Runtime hardcoded absolute path (public/)
|
|
199
|
+
try {
|
|
200
|
+
const worker = new Worker('/canvas-worker.js', { type: 'module' });
|
|
201
|
+
api = wrap<CanvasWorkerAPI>(worker);
|
|
202
|
+
return api;
|
|
203
|
+
} catch (err) {
|
|
204
|
+
console.warn('[DROID] canvas-worker.js (absolute root) fallback failed:', err);
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
// 6. Final failure
|
|
208
|
+
console.error('[DROID] No Canvas Comlink Initialized');
|
|
209
|
+
throw new Error('[DROID] Failed to initialize canvas worker');
|
|
180
210
|
}
|
|
181
211
|
|
|
212
|
+
|
|
182
213
|
export const uiux = {
|
|
183
214
|
state: uiuxState,
|
|
184
215
|
openPanel(id: PanelId, payload?: PanelPayload) {
|
|
@@ -331,77 +362,89 @@ function initSWComlink() {
|
|
|
331
362
|
]);
|
|
332
363
|
channel.port1.start();
|
|
333
364
|
}
|
|
334
|
-
|
|
335
365
|
async function initStorageComlink(opts?: {
|
|
336
|
-
|
|
337
|
-
|
|
366
|
+
workerRef?: SharedWorker;
|
|
367
|
+
workerURL?: string;
|
|
338
368
|
}): Promise<Remote<LocalStorageAPI>> {
|
|
339
|
-
|
|
340
|
-
// 1. Try Vite-style import
|
|
341
|
-
try {
|
|
342
|
-
const worker = new SharedWorker(
|
|
343
|
-
new URL('./db-worker.ts', import.meta.url),
|
|
344
|
-
{
|
|
345
|
-
type: 'module',
|
|
346
|
-
},
|
|
347
|
-
);
|
|
348
|
-
worker.port.start();
|
|
349
|
-
api = wrap<LocalStorageAPI>(worker.port);
|
|
350
|
-
} catch (err) {
|
|
351
|
-
console.warn('[DROID] db-worker import.meta fallback failed:', err);
|
|
352
|
-
}
|
|
369
|
+
let api: Remote<LocalStorageAPI> | null = null;
|
|
353
370
|
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
}
|
|
365
|
-
}
|
|
371
|
+
// 1. Try provided SharedWorker reference
|
|
372
|
+
if (opts?.workerRef) {
|
|
373
|
+
try {
|
|
374
|
+
opts.workerRef.port.start();
|
|
375
|
+
api = wrap<LocalStorageAPI>(opts.workerRef.port);
|
|
376
|
+
return await finalize(api);
|
|
377
|
+
} catch (err) {
|
|
378
|
+
console.warn('[DROID] db-worker workerRef failed:', err);
|
|
379
|
+
}
|
|
380
|
+
}
|
|
366
381
|
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
382
|
+
// 2. Try provided worker URL
|
|
383
|
+
if (opts?.workerURL) {
|
|
384
|
+
try {
|
|
385
|
+
const worker = new SharedWorker(opts.workerURL, { type: 'module' });
|
|
386
|
+
worker.port.start();
|
|
387
|
+
api = wrap<LocalStorageAPI>(worker.port);
|
|
388
|
+
return await finalize(api);
|
|
389
|
+
} catch (err) {
|
|
390
|
+
console.warn('[DROID] db-worker workerURL failed:', err);
|
|
391
|
+
}
|
|
392
|
+
}
|
|
376
393
|
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
394
|
+
// 3. Vite-style TS dev import
|
|
395
|
+
try {
|
|
396
|
+
const worker = new SharedWorker(
|
|
397
|
+
new URL('./db-worker.ts', import.meta.url),
|
|
398
|
+
{ type: 'module' },
|
|
399
|
+
);
|
|
400
|
+
worker.port.start();
|
|
401
|
+
api = wrap<LocalStorageAPI>(worker.port);
|
|
402
|
+
return await finalize(api);
|
|
403
|
+
} catch (err) {
|
|
404
|
+
console.warn('[DROID] db-worker .ts vite-style import failed:', err);
|
|
405
|
+
}
|
|
387
406
|
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
407
|
+
// 4. Same-dir .js fallback (production build output)
|
|
408
|
+
try {
|
|
409
|
+
const worker = new SharedWorker(
|
|
410
|
+
new URL('./db-worker.js', import.meta.url),
|
|
411
|
+
{ type: 'module' },
|
|
412
|
+
);
|
|
413
|
+
worker.port.start();
|
|
414
|
+
api = wrap<LocalStorageAPI>(worker.port);
|
|
415
|
+
return await finalize(api);
|
|
416
|
+
} catch (err) {
|
|
417
|
+
console.warn('[DROID] db-worker.js same-dir fallback failed:', err);
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
// 5. Hardcoded browser-root fallback (e.g. /public)
|
|
421
|
+
try {
|
|
422
|
+
const worker = new SharedWorker('/db-worker.js', { type: 'module' });
|
|
423
|
+
worker.port.start();
|
|
424
|
+
api = wrap<LocalStorageAPI>(worker.port);
|
|
425
|
+
return await finalize(api);
|
|
426
|
+
} catch (err) {
|
|
427
|
+
console.warn('[DROID] db-worker.js absolute hardcoded fallback failed:', err);
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
// 6. Final failure
|
|
431
|
+
console.error('[DROID] No DB Worker Comlink Initialized');
|
|
432
|
+
throw new Error('[DROID] Failed to initialize db-worker');
|
|
433
|
+
}
|
|
393
434
|
|
|
394
|
-
const version = await api.getVersion();
|
|
395
|
-
if (version !== EXPECTED_DB_VERSION) {
|
|
396
|
-
await initializeWorkerDatabase(api, {
|
|
397
|
-
version: EXPECTED_DB_VERSION,
|
|
398
|
-
i18nPath: 'https://discord.sh/i18n/db.json',
|
|
399
|
-
locale: 'en',
|
|
400
|
-
defaults: { welcome: 'Welcome!', theme: 'dark' },
|
|
401
|
-
});
|
|
402
|
-
}
|
|
403
435
|
|
|
404
|
-
|
|
436
|
+
// Internal helper to finalize storage worker setup
|
|
437
|
+
async function finalize(api: Remote<LocalStorageAPI>): Promise<Remote<LocalStorageAPI>> {
|
|
438
|
+
const version = await api.getVersion();
|
|
439
|
+
if (version !== EXPECTED_DB_VERSION) {
|
|
440
|
+
await initializeWorkerDatabase(api, {
|
|
441
|
+
version: EXPECTED_DB_VERSION,
|
|
442
|
+
i18nPath: 'https://discord.sh/i18n/db.json',
|
|
443
|
+
locale: 'en',
|
|
444
|
+
defaults: { welcome: 'Welcome!', theme: 'dark' },
|
|
445
|
+
});
|
|
446
|
+
}
|
|
447
|
+
return api;
|
|
405
448
|
}
|
|
406
449
|
|
|
407
450
|
// * Bridge
|