@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 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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kbve/droid",
3
- "version": "0.0.5",
3
+ "version": "0.0.6",
4
4
  "description": "A manager for web, shared and service workers, aimming to make it as modular and upgradable.",
5
5
  "keywords": [
6
6
  "workers",
@@ -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 Vite-style import
52
- try {
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
- // 4. Try provided URL
84
- if (!api && opts?.workerURL) {
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
- // 5. Final failure
95
- if (!api) {
96
- console.error('[DROID] No WS Worker Comlink Initialized');
97
- throw new Error('[DROID] Failed to initialize ws-worker');
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
- return api;
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
- workerRef?: Worker;
137
- workerURL?: string;
148
+ workerRef?: Worker;
149
+ workerURL?: string;
138
150
  }): Promise<Remote<CanvasWorkerAPI>> {
139
- // 1. Try Vite-style import resolution
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
- // 2. Try hardcoded path fallback
151
- try {
152
- const worker = new Worker('./canvas-worker.js', { type: 'module' });
153
- return wrap<CanvasWorkerAPI>(worker);
154
- } catch (err) {
155
- console.warn('[DROID] Fallback /canvas-worker.js failed:', err);
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
- // 3. Try direct Worker instance
159
- if (opts?.workerRef) {
160
- try {
161
- return wrap<CanvasWorkerAPI>(opts.workerRef);
162
- } catch (err) {
163
- console.warn('[DROID] Provided workerRef failed:', err);
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
- // 4. Try provided URL
168
- if (opts?.workerURL) {
169
- try {
170
- const worker = new Worker(opts.workerURL, { type: 'module' });
171
- return wrap<CanvasWorkerAPI>(worker);
172
- } catch (err) {
173
- console.warn('[DROID] Provided workerURL failed:', err);
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
- // 5. Failure
178
- console.error('[DROID] No Canvas Comlink Initialized');
179
- throw new Error('[DROID] Failed to initialize canvas worker');
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
- workerRef?: SharedWorker;
337
- workerURL?: string;
366
+ workerRef?: SharedWorker;
367
+ workerURL?: string;
338
368
  }): Promise<Remote<LocalStorageAPI>> {
339
- let api: Remote<LocalStorageAPI> | null = null;
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
- // 2. Try hardcoded path
355
- if (!api) {
356
- try {
357
- const worker = new SharedWorker('/db-worker.js', {
358
- type: 'module',
359
- });
360
- worker.port.start();
361
- api = wrap<LocalStorageAPI>(worker.port);
362
- } catch (err) {
363
- console.warn('[DROID] db-worker hardcoded fallback failed:', err);
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
- // 3. Try provided SharedWorker reference
368
- if (!api && opts?.workerRef) {
369
- try {
370
- opts.workerRef.port.start();
371
- api = wrap<LocalStorageAPI>(opts.workerRef.port);
372
- } catch (err) {
373
- console.warn('[DROID] db-worker workerRef failed:', err);
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
- // 4. Try provided URL
378
- if (!api && opts?.workerURL) {
379
- try {
380
- const worker = new SharedWorker(opts.workerURL, { type: 'module' });
381
- worker.port.start();
382
- api = wrap<LocalStorageAPI>(worker.port);
383
- } catch (err) {
384
- console.warn('[DROID] db-worker workerURL failed:', err);
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
- // 5. Final failure
389
- if (!api) {
390
- console.error('[DROID] No DB Worker Comlink Initialized');
391
- throw new Error('[DROID] Failed to initialize db-worker');
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
- return api;
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