@kbve/droid 0.0.5 → 0.1.1
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/comlink.js +1 -7
- package/droid.mjs +191 -61
- package/index.d.ts +29 -0
- package/index.js +9054 -2763
- package/lib/gateway/SupabaseGateway.d.ts +38 -0
- package/lib/gateway/SupabaseGateway.d.ts.map +1 -0
- package/lib/gateway/WorkerCommunication.d.ts +39 -0
- package/lib/gateway/WorkerCommunication.d.ts.map +1 -0
- package/lib/gateway/WorkerPool.d.ts +55 -0
- package/lib/gateway/WorkerPool.d.ts.map +1 -0
- package/lib/gateway/capabilities.d.ts +23 -0
- package/lib/gateway/capabilities.d.ts.map +1 -0
- package/lib/gateway/index.d.ts +9 -0
- package/lib/gateway/index.d.ts.map +1 -0
- package/lib/gateway/strategies/DirectStrategy.d.ts +52 -0
- package/lib/gateway/strategies/DirectStrategy.d.ts.map +1 -0
- package/lib/gateway/strategies/SharedWorkerStrategy.d.ts +46 -0
- package/lib/gateway/strategies/SharedWorkerStrategy.d.ts.map +1 -0
- package/lib/gateway/strategies/WebWorkerStrategy.d.ts +45 -0
- package/lib/gateway/strategies/WebWorkerStrategy.d.ts.map +1 -0
- package/lib/gateway/types.d.ts +81 -0
- package/lib/gateway/types.d.ts.map +1 -0
- package/lib/workers/canvas-ui-renderer.d.ts +25 -0
- package/lib/workers/canvas-ui-renderer.d.ts.map +1 -0
- package/lib/workers/canvas-worker.d.ts +14 -0
- package/lib/workers/canvas-worker.d.ts.map +1 -0
- package/lib/workers/canvas-worker.js +291 -145
- package/lib/workers/data.d.ts +40 -0
- package/lib/workers/data.d.ts.map +1 -0
- package/lib/workers/db-worker.d.ts +69 -0
- package/lib/workers/db-worker.d.ts.map +1 -0
- package/lib/workers/db-worker.js +2680 -2147
- package/lib/workers/events.d.ts +11 -0
- package/lib/workers/events.d.ts.map +1 -0
- package/lib/workers/flexbuilder.d.ts +4 -0
- package/lib/workers/flexbuilder.d.ts.map +1 -0
- package/lib/workers/init.d.ts +11 -0
- package/lib/workers/init.d.ts.map +1 -0
- package/lib/workers/main.d.ts +107 -0
- package/lib/workers/main.d.ts.map +1 -0
- package/lib/workers/supabase-db-worker.d.ts +2 -0
- package/lib/workers/supabase-db-worker.d.ts.map +1 -0
- package/lib/workers/supabase-db-worker.js +9337 -0
- package/lib/workers/supabase-shared-worker.d.ts +2 -0
- package/lib/workers/supabase-shared-worker.d.ts.map +1 -0
- package/lib/workers/supabase-shared-worker.js +12635 -0
- package/lib/workers/tools.d.ts +4 -0
- package/lib/workers/tools.d.ts.map +1 -0
- package/lib/workers/validate.d.ts +15 -0
- package/lib/workers/validate.d.ts.map +1 -0
- package/lib/workers/ws-worker.d.ts +11 -0
- package/lib/workers/ws-worker.d.ts.map +1 -0
- package/lib/workers/ws-worker.js +174 -115
- package/main.js +4875 -0
- package/package.json +17 -6
- package/reference.js +688 -228
- package/src/index.ts +38 -13
- package/src/lib/droid.spec.ts +14 -19
- package/src/lib/droid.ts +48 -4
- package/src/lib/gateway/SupabaseGateway.ts +183 -0
- package/src/lib/gateway/WorkerCommunication.ts +132 -0
- package/src/lib/gateway/WorkerPool.ts +304 -0
- package/src/lib/gateway/capabilities.ts +80 -0
- package/src/lib/gateway/index.ts +15 -0
- package/src/lib/gateway/strategies/DirectStrategy.ts +443 -0
- package/src/lib/gateway/strategies/SharedWorkerStrategy.ts +278 -0
- package/src/lib/gateway/strategies/WebWorkerStrategy.ts +278 -0
- package/src/lib/gateway/types.ts +112 -0
- package/src/lib/mod/mod-manager.ts +13 -8
- package/src/lib/mod/module/bento/mod-bento.worker.ts +1 -1
- package/src/lib/mod/module/supabase/mod-supabase.spec.ts +21 -25
- package/src/lib/mod/module/supabase/mod-supabase.ts +68 -0
- package/src/lib/mod/module/supabase/mod-supabase.worker.ts +1 -56
- package/src/lib/state/auth.spec.ts +58 -0
- package/src/lib/state/auth.ts +30 -0
- package/src/lib/state/index.ts +34 -0
- package/src/lib/state/overlay-manager.ts +125 -0
- package/src/lib/state/router.ts +24 -0
- package/src/lib/state/theme-sync.ts +75 -0
- package/src/lib/state/toasts.spec.ts +106 -0
- package/src/lib/state/toasts.ts +34 -0
- package/src/lib/state/ui.spec.ts +148 -0
- package/src/lib/state/ui.ts +45 -0
- package/src/lib/state/welcome-toast.ts +76 -0
- package/src/lib/types/bento.spec.ts +116 -0
- package/src/lib/types/bento.ts +94 -55
- package/src/lib/types/event-types.spec.ts +93 -0
- package/src/lib/types/event-types.ts +39 -3
- package/src/lib/types/modules.ts +12 -5
- package/src/lib/types/ui-event-types.ts +66 -0
- package/src/lib/workers/canvas-ui-renderer.ts +266 -0
- package/src/lib/workers/canvas-worker.ts +94 -9
- package/src/lib/workers/data.ts +59 -36
- package/src/lib/workers/db-worker.ts +79 -32
- package/src/lib/workers/events.spec.ts +208 -0
- package/src/lib/workers/events.ts +27 -14
- package/src/lib/workers/flexbuilder.ts +2 -2
- package/src/lib/workers/init.ts +25 -17
- package/src/lib/workers/main.ts +509 -272
- package/src/lib/workers/supabase-db-worker.ts +221 -0
- package/src/lib/workers/supabase-shared-worker.ts +572 -0
- package/src/lib/workers/validate.ts +64 -0
- package/src/lib/workers/ws-worker.ts +156 -25
- package/src/setup-vitest.ts +4 -2
- package/src/types.ts +30 -0
- package/src/vite-env.d.ts +1 -0
- package/workers/main.js +10 -1089
- package/src/types.d.ts +0 -31
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
/// <reference lib="webworker" />
|
|
2
|
+
// Database worker for Supabase operations (used in worker pool)
|
|
3
|
+
// Uses in-memory storage — the SharedWorker is the single auth writer to IndexedDB.
|
|
4
|
+
|
|
5
|
+
import { createClient, type SupabaseClient } from '@supabase/supabase-js';
|
|
6
|
+
|
|
7
|
+
type WorkerMessage =
|
|
8
|
+
| { id: string; type: 'ping'; payload?: unknown }
|
|
9
|
+
| {
|
|
10
|
+
id: string;
|
|
11
|
+
type: 'init';
|
|
12
|
+
payload: {
|
|
13
|
+
url: string;
|
|
14
|
+
anonKey: string;
|
|
15
|
+
options?: Record<string, unknown>;
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
| {
|
|
19
|
+
id: string;
|
|
20
|
+
type: 'from.select';
|
|
21
|
+
payload: {
|
|
22
|
+
table: string;
|
|
23
|
+
columns?: string;
|
|
24
|
+
match?: Record<string, unknown>;
|
|
25
|
+
limit?: number;
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
| {
|
|
29
|
+
id: string;
|
|
30
|
+
type: 'from.insert';
|
|
31
|
+
payload: {
|
|
32
|
+
table: string;
|
|
33
|
+
data: Record<string, unknown> | Record<string, unknown>[];
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
| {
|
|
37
|
+
id: string;
|
|
38
|
+
type: 'from.update';
|
|
39
|
+
payload: {
|
|
40
|
+
table: string;
|
|
41
|
+
data: Record<string, unknown>;
|
|
42
|
+
match: Record<string, unknown>;
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
| {
|
|
46
|
+
id: string;
|
|
47
|
+
type: 'from.upsert';
|
|
48
|
+
payload: {
|
|
49
|
+
table: string;
|
|
50
|
+
data: Record<string, unknown> | Record<string, unknown>[];
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
| {
|
|
54
|
+
id: string;
|
|
55
|
+
type: 'from.delete';
|
|
56
|
+
payload: { table: string; match: Record<string, unknown> };
|
|
57
|
+
}
|
|
58
|
+
| {
|
|
59
|
+
id: string;
|
|
60
|
+
type: 'rpc';
|
|
61
|
+
payload: { fn: string; args?: Record<string, unknown> };
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
declare const self: DedicatedWorkerGlobalScope;
|
|
65
|
+
|
|
66
|
+
let client: SupabaseClient | null = null;
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* In-memory storage for DB workers.
|
|
70
|
+
* DB workers only need the access token to make authenticated API calls.
|
|
71
|
+
* The SharedWorker is the single writer to IndexedDB (sb-auth-v2).
|
|
72
|
+
*/
|
|
73
|
+
const memoryStore = new Map<string, string>();
|
|
74
|
+
const memoryStorage = {
|
|
75
|
+
async getItem(key: string): Promise<string | null> {
|
|
76
|
+
return memoryStore.get(key) ?? null;
|
|
77
|
+
},
|
|
78
|
+
async setItem(key: string, value: string): Promise<void> {
|
|
79
|
+
memoryStore.set(key, value);
|
|
80
|
+
},
|
|
81
|
+
async removeItem(key: string): Promise<void> {
|
|
82
|
+
memoryStore.delete(key);
|
|
83
|
+
},
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
console.log('[DB Worker] Initializing...');
|
|
87
|
+
|
|
88
|
+
self.onmessage = async (e: MessageEvent<WorkerMessage>) => {
|
|
89
|
+
const msg = e.data;
|
|
90
|
+
const { id, type, payload } = msg;
|
|
91
|
+
|
|
92
|
+
try {
|
|
93
|
+
switch (type) {
|
|
94
|
+
case 'ping': {
|
|
95
|
+
respond(id, { ok: true, data: 'pong' });
|
|
96
|
+
break;
|
|
97
|
+
}
|
|
98
|
+
case 'init': {
|
|
99
|
+
const { url, anonKey, options } = payload;
|
|
100
|
+
|
|
101
|
+
const authOverrides =
|
|
102
|
+
options?.['auth'] && typeof options['auth'] === 'object'
|
|
103
|
+
? (options['auth'] as Record<string, unknown>)
|
|
104
|
+
: {};
|
|
105
|
+
|
|
106
|
+
client = createClient(url, anonKey, {
|
|
107
|
+
...options,
|
|
108
|
+
auth: {
|
|
109
|
+
...authOverrides,
|
|
110
|
+
storage: memoryStorage,
|
|
111
|
+
storageKey: 'sb-auth-token',
|
|
112
|
+
autoRefreshToken: true,
|
|
113
|
+
persistSession: true,
|
|
114
|
+
detectSessionInUrl: false,
|
|
115
|
+
},
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
const {
|
|
119
|
+
data: { session },
|
|
120
|
+
error,
|
|
121
|
+
} = await client.auth.getSession();
|
|
122
|
+
if (error) console.error('[DB Worker] Session error:', error);
|
|
123
|
+
|
|
124
|
+
respond(id, {
|
|
125
|
+
ok: true,
|
|
126
|
+
data: { session, user: session?.user || null },
|
|
127
|
+
});
|
|
128
|
+
break;
|
|
129
|
+
}
|
|
130
|
+
case 'from.select': {
|
|
131
|
+
if (!client) throw new Error('Client not initialized');
|
|
132
|
+
const { table, columns, match, limit } = payload;
|
|
133
|
+
let query = client.from(table).select(columns || '*');
|
|
134
|
+
if (match) {
|
|
135
|
+
for (const [key, value] of Object.entries(match)) {
|
|
136
|
+
query = query.eq(key, value);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
if (limit) query = query.limit(limit);
|
|
140
|
+
const { data, error } = await query;
|
|
141
|
+
if (error) throw error;
|
|
142
|
+
respond(id, { ok: true, data });
|
|
143
|
+
break;
|
|
144
|
+
}
|
|
145
|
+
case 'from.insert': {
|
|
146
|
+
if (!client) throw new Error('Client not initialized');
|
|
147
|
+
const { table, data } = payload;
|
|
148
|
+
const { data: result, error } = await client
|
|
149
|
+
.from(table)
|
|
150
|
+
.insert(data)
|
|
151
|
+
.select();
|
|
152
|
+
if (error) throw error;
|
|
153
|
+
respond(id, { ok: true, data: result });
|
|
154
|
+
break;
|
|
155
|
+
}
|
|
156
|
+
case 'from.update': {
|
|
157
|
+
if (!client) throw new Error('Client not initialized');
|
|
158
|
+
const { table, data, match } = payload;
|
|
159
|
+
let query = client.from(table).update(data);
|
|
160
|
+
for (const [key, value] of Object.entries(match)) {
|
|
161
|
+
query = query.eq(key, value);
|
|
162
|
+
}
|
|
163
|
+
const { data: result, error } = await query.select();
|
|
164
|
+
if (error) throw error;
|
|
165
|
+
respond(id, { ok: true, data: result });
|
|
166
|
+
break;
|
|
167
|
+
}
|
|
168
|
+
case 'from.upsert': {
|
|
169
|
+
if (!client) throw new Error('Client not initialized');
|
|
170
|
+
const { table, data } = payload;
|
|
171
|
+
const { data: result, error } = await client
|
|
172
|
+
.from(table)
|
|
173
|
+
.upsert(data)
|
|
174
|
+
.select();
|
|
175
|
+
if (error) throw error;
|
|
176
|
+
respond(id, { ok: true, data: result });
|
|
177
|
+
break;
|
|
178
|
+
}
|
|
179
|
+
case 'from.delete': {
|
|
180
|
+
if (!client) throw new Error('Client not initialized');
|
|
181
|
+
const { table, match } = payload;
|
|
182
|
+
let query = client.from(table).delete();
|
|
183
|
+
for (const [key, value] of Object.entries(match)) {
|
|
184
|
+
query = query.eq(key, value);
|
|
185
|
+
}
|
|
186
|
+
const { data: result, error } = await query.select();
|
|
187
|
+
if (error) throw error;
|
|
188
|
+
respond(id, { ok: true, data: result });
|
|
189
|
+
break;
|
|
190
|
+
}
|
|
191
|
+
case 'rpc': {
|
|
192
|
+
if (!client) throw new Error('Client not initialized');
|
|
193
|
+
const { fn, args } = payload;
|
|
194
|
+
const { data, error } = await client.rpc(fn, args || {});
|
|
195
|
+
if (error) throw error;
|
|
196
|
+
respond(id, { ok: true, data });
|
|
197
|
+
break;
|
|
198
|
+
}
|
|
199
|
+
default:
|
|
200
|
+
respond(id, {
|
|
201
|
+
ok: false,
|
|
202
|
+
error: `Unknown message type: ${type}`,
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
} catch (err: unknown) {
|
|
206
|
+
console.error('[DB Worker] Error handling %s:', String(type), err);
|
|
207
|
+
respond(id, {
|
|
208
|
+
ok: false,
|
|
209
|
+
error: err instanceof Error ? err.message : String(err),
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
};
|
|
213
|
+
|
|
214
|
+
function respond(
|
|
215
|
+
id: string,
|
|
216
|
+
response: { ok: true; data?: unknown } | { ok: false; error: string },
|
|
217
|
+
) {
|
|
218
|
+
self.postMessage({ id, ...response });
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
console.log('[DB Worker] Ready');
|