@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,38 @@
|
|
|
1
|
+
import { ISupabaseStrategy, SelectOptions, SessionResponse, WebSocketStatus, StrategyType, GatewayConfig } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* SupabaseGateway: Unified interface for all Supabase operations
|
|
4
|
+
*
|
|
5
|
+
* Automatically selects the best strategy based on browser capabilities:
|
|
6
|
+
* 1. SharedWorker + DB Worker Pool (desktop: Chrome, Firefox, Edge)
|
|
7
|
+
* 2. WebSocket Worker + DB Worker Pool (Android, Safari)
|
|
8
|
+
* 3. Direct/Main thread (fallback)
|
|
9
|
+
*
|
|
10
|
+
* All strategies implement the same interface, so application code is unchanged.
|
|
11
|
+
*/
|
|
12
|
+
export declare class SupabaseGateway implements ISupabaseStrategy {
|
|
13
|
+
private strategy;
|
|
14
|
+
private strategyType;
|
|
15
|
+
constructor(config?: GatewayConfig);
|
|
16
|
+
getStrategyType(): StrategyType;
|
|
17
|
+
getStrategyDescription(): string;
|
|
18
|
+
init(url: string, anonKey: string, options?: Record<string, unknown>): Promise<SessionResponse>;
|
|
19
|
+
on(event: string, callback: (payload: unknown) => void): () => void;
|
|
20
|
+
getSession(): Promise<SessionResponse>;
|
|
21
|
+
signInWithPassword(email: string, password: string): Promise<SessionResponse>;
|
|
22
|
+
signOut(): Promise<void>;
|
|
23
|
+
select(table: string, opts?: SelectOptions): Promise<unknown[]>;
|
|
24
|
+
insert(table: string, data: Record<string, unknown> | Record<string, unknown>[]): Promise<unknown[]>;
|
|
25
|
+
update(table: string, data: Record<string, unknown>, match: Record<string, unknown>): Promise<unknown[]>;
|
|
26
|
+
upsert(table: string, data: Record<string, unknown> | Record<string, unknown>[]): Promise<unknown[]>;
|
|
27
|
+
delete(table: string, match: Record<string, unknown>): Promise<unknown[]>;
|
|
28
|
+
rpc(fn: string, args?: Record<string, unknown>): Promise<unknown>;
|
|
29
|
+
subscribePostgres(key: string, params: Record<string, unknown>, callback: (payload: unknown) => void): () => void;
|
|
30
|
+
connectWebSocket(wsUrl?: string): Promise<WebSocketStatus>;
|
|
31
|
+
disconnectWebSocket(): Promise<void>;
|
|
32
|
+
sendWebSocketMessage(data: unknown): Promise<void>;
|
|
33
|
+
getWebSocketStatus(): Promise<WebSocketStatus>;
|
|
34
|
+
onWebSocketMessage(callback: (message: unknown) => void): () => void;
|
|
35
|
+
onWebSocketStatus(callback: (status: WebSocketStatus) => void): () => void;
|
|
36
|
+
terminate(): void;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=SupabaseGateway.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SupabaseGateway.d.ts","sourceRoot":"","sources":["../../../../../../packages/npm/droid/src/lib/gateway/SupabaseGateway.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACX,iBAAiB,EACjB,aAAa,EACb,eAAe,EACf,eAAe,EACf,YAAY,EACZ,aAAa,EACb,MAAM,SAAS,CAAC;AAejB;;;;;;;;;GASG;AACH,qBAAa,eAAgB,YAAW,iBAAiB;IACxD,OAAO,CAAC,QAAQ,CAAoB;IACpC,OAAO,CAAC,YAAY,CAAe;gBAEvB,MAAM,GAAE,aAAkB;IAsCtC,eAAe,IAAI,YAAY;IAI/B,sBAAsB,IAAI,MAAM;IAMhC,IAAI,CACH,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,OAAO,CAAC,eAAe,CAAC;IAI3B,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,GAAG,MAAM,IAAI;IAInE,UAAU,IAAI,OAAO,CAAC,eAAe,CAAC;IAItC,kBAAkB,CACjB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,GACd,OAAO,CAAC,eAAe,CAAC;IAI3B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAIxB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAI/D,MAAM,CACL,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GACvD,OAAO,CAAC,OAAO,EAAE,CAAC;IAIrB,MAAM,CACL,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,OAAO,EAAE,CAAC;IAIrB,MAAM,CACL,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GACvD,OAAO,CAAC,OAAO,EAAE,CAAC;IAIrB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAIzE,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAIjE,iBAAiB,CAChB,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,QAAQ,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,GAClC,MAAM,IAAI;IAIb,gBAAgB,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAI1D,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC;IAIpC,oBAAoB,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlD,kBAAkB,IAAI,OAAO,CAAC,eAAe,CAAC;IAI9C,kBAAkB,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,GAAG,MAAM,IAAI;IAIpE,iBAAiB,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,IAAI,GAAG,MAAM,IAAI;IAI1E,SAAS;CAGT"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { BroadcastEvent } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* WorkerCommunication: Unified communication layer for workers
|
|
4
|
+
*
|
|
5
|
+
* Features:
|
|
6
|
+
* - BroadcastChannel for real-time events
|
|
7
|
+
* - Works in SharedWorker, WebWorker, and main thread
|
|
8
|
+
*
|
|
9
|
+
* Note: This layer does NOT open IndexedDB. The SharedWorker is the single
|
|
10
|
+
* writer to the auth database (sb-auth-v2). All other contexts receive
|
|
11
|
+
* auth state via BroadcastChannel or postMessage.
|
|
12
|
+
*/
|
|
13
|
+
export declare class WorkerCommunication {
|
|
14
|
+
private bc;
|
|
15
|
+
private listeners;
|
|
16
|
+
private channelName;
|
|
17
|
+
constructor(channelName?: string);
|
|
18
|
+
private initBroadcastChannel;
|
|
19
|
+
/**
|
|
20
|
+
* Broadcast an event to all workers and tabs
|
|
21
|
+
*/
|
|
22
|
+
broadcast(event: BroadcastEvent): void;
|
|
23
|
+
private handleBroadcast;
|
|
24
|
+
/**
|
|
25
|
+
* Subscribe to events (local and broadcast)
|
|
26
|
+
*/
|
|
27
|
+
on(event: string, callback: (payload: unknown) => void): () => void;
|
|
28
|
+
private emit;
|
|
29
|
+
/**
|
|
30
|
+
* Check if BroadcastChannel is available
|
|
31
|
+
*/
|
|
32
|
+
hasBroadcastChannel(): boolean;
|
|
33
|
+
/**
|
|
34
|
+
* Close connections
|
|
35
|
+
*/
|
|
36
|
+
close(): void;
|
|
37
|
+
}
|
|
38
|
+
export declare function getWorkerCommunication(channelName?: string): WorkerCommunication;
|
|
39
|
+
//# sourceMappingURL=WorkerCommunication.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorkerCommunication.d.ts","sourceRoot":"","sources":["../../../../../../packages/npm/droid/src/lib/gateway/WorkerCommunication.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE9C;;;;;;;;;;GAUG;AACH,qBAAa,mBAAmB;IAC/B,OAAO,CAAC,EAAE,CAAiC;IAC3C,OAAO,CAAC,SAAS,CAAsD;IACvE,OAAO,CAAC,WAAW,CAAS;gBAEhB,WAAW,SAAoB;IAK3C,OAAO,CAAC,oBAAoB;IAe5B;;OAEG;IACH,SAAS,CAAC,KAAK,EAAE,cAAc;IAU/B,OAAO,CAAC,eAAe;IAUvB;;OAEG;IACH,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,GAAG,MAAM,IAAI;IAiBnE,OAAO,CAAC,IAAI;IAgBZ;;OAEG;IACH,mBAAmB,IAAI,OAAO;IAI9B;;OAEG;IACH,KAAK;CAOL;AAOD,wBAAgB,sBAAsB,CACrC,WAAW,CAAC,EAAE,MAAM,GAClB,mBAAmB,CAKrB"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
export interface WorkerPoolConfig {
|
|
2
|
+
size: number;
|
|
3
|
+
workerUrl: string | URL;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* WorkerPool: Manages a pool of workers with round-robin load balancing
|
|
7
|
+
*
|
|
8
|
+
* Features:
|
|
9
|
+
* - Fixed-size pool (default: 3 workers)
|
|
10
|
+
* - Round-robin routing for database operations
|
|
11
|
+
* - Request/response tracking with UUIDs
|
|
12
|
+
* - Automatic error handling with exponential backoff retries
|
|
13
|
+
*/
|
|
14
|
+
export declare class WorkerPool {
|
|
15
|
+
private workers;
|
|
16
|
+
private poolSize;
|
|
17
|
+
private roundRobinIndex;
|
|
18
|
+
private pending;
|
|
19
|
+
private workerUrl;
|
|
20
|
+
private workerRetryCount;
|
|
21
|
+
private workerRetryTimers;
|
|
22
|
+
private readonly MAX_RETRY_ATTEMPTS;
|
|
23
|
+
private readonly BASE_RETRY_DELAY_MS;
|
|
24
|
+
private readonly MAX_RETRY_DELAY_MS;
|
|
25
|
+
private readonly REQUEST_TIMEOUT_MS;
|
|
26
|
+
constructor(config: WorkerPoolConfig);
|
|
27
|
+
/**
|
|
28
|
+
* Initialize the worker pool
|
|
29
|
+
*/
|
|
30
|
+
init(): Promise<void>;
|
|
31
|
+
private getNextWorker;
|
|
32
|
+
private sendToWorker;
|
|
33
|
+
/**
|
|
34
|
+
* Send message to next available worker (round-robin)
|
|
35
|
+
*/
|
|
36
|
+
send<T>(type: string, payload?: unknown): Promise<T>;
|
|
37
|
+
private handleMessage;
|
|
38
|
+
private handleError;
|
|
39
|
+
private scheduleWorkerRecreation;
|
|
40
|
+
private recreateWorker;
|
|
41
|
+
/**
|
|
42
|
+
* Terminate all workers
|
|
43
|
+
*/
|
|
44
|
+
terminate(): void;
|
|
45
|
+
/**
|
|
46
|
+
* Get pool statistics
|
|
47
|
+
*/
|
|
48
|
+
getStats(): {
|
|
49
|
+
size: number;
|
|
50
|
+
activeWorkers: number;
|
|
51
|
+
pendingRequests: number;
|
|
52
|
+
nextWorker: number;
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=WorkerPool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorkerPool.d.ts","sourceRoot":"","sources":["../../../../../../packages/npm/droid/src/lib/gateway/WorkerPool.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,gBAAgB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,GAAG,GAAG,CAAC;CACxB;AAED;;;;;;;;GAQG;AACH,qBAAa,UAAU;IACtB,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,eAAe,CAAK;IAC5B,OAAO,CAAC,OAAO,CAOX;IACJ,OAAO,CAAC,SAAS,CAAe;IAChC,OAAO,CAAC,gBAAgB,CAA6B;IACrD,OAAO,CAAC,iBAAiB,CAGrB;IAEJ,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAK;IACxC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAQ;IAC5C,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAQ;IAC3C,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAS;gBAEhC,MAAM,EAAE,gBAAgB;IAKpC;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAyC3B,OAAO,CAAC,aAAa;IAMrB,OAAO,CAAC,YAAY;IA2CpB;;OAEG;IACH,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC;IAQpD,OAAO,CAAC,aAAa;IA4BrB,OAAO,CAAC,WAAW;IAkBnB,OAAO,CAAC,wBAAwB;YAkClB,cAAc;IAoC5B;;OAEG;IACH,SAAS;IAsBT;;OAEG;IACH,QAAQ;;;;;;CAQR"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { BrowserCapabilities, StrategyType } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Detect browser capabilities for worker and communication support
|
|
4
|
+
*/
|
|
5
|
+
export declare function detectCapabilities(): BrowserCapabilities;
|
|
6
|
+
/**
|
|
7
|
+
* Select the best strategy based on browser capabilities
|
|
8
|
+
*
|
|
9
|
+
* Priority:
|
|
10
|
+
* 1. SharedWorker + Worker Pool (desktop Chrome, Firefox, Edge)
|
|
11
|
+
* 2. WebWorker Pool only (Android, Safari, or no SharedWorker)
|
|
12
|
+
* 3. Direct/Main thread (emergency fallback)
|
|
13
|
+
*/
|
|
14
|
+
export declare function selectStrategy(capabilities?: BrowserCapabilities): StrategyType;
|
|
15
|
+
/**
|
|
16
|
+
* Log detected capabilities for debugging
|
|
17
|
+
*/
|
|
18
|
+
export declare function logCapabilities(capabilities: BrowserCapabilities): void;
|
|
19
|
+
/**
|
|
20
|
+
* Get a human-readable description of the selected strategy
|
|
21
|
+
*/
|
|
22
|
+
export declare function getStrategyDescription(strategy: StrategyType): string;
|
|
23
|
+
//# sourceMappingURL=capabilities.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../../../../../../packages/npm/droid/src/lib/gateway/capabilities.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEjE;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,mBAAmB,CAqBxD;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,YAAY,CAAC,EAAE,mBAAmB,GAAG,YAAY,CAe/E;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,YAAY,EAAE,mBAAmB,QAOhE;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,YAAY,GAAG,MAAM,CASrE"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export { SupabaseGateway } from './SupabaseGateway';
|
|
2
|
+
export { WorkerPool } from './WorkerPool';
|
|
3
|
+
export { getWorkerCommunication, WorkerCommunication } from './WorkerCommunication';
|
|
4
|
+
export { detectCapabilities, selectStrategy, logCapabilities, getStrategyDescription } from './capabilities';
|
|
5
|
+
export * from './types';
|
|
6
|
+
export { SharedWorkerStrategy } from './strategies/SharedWorkerStrategy';
|
|
7
|
+
export { WebWorkerStrategy } from './strategies/WebWorkerStrategy';
|
|
8
|
+
export { DirectStrategy } from './strategies/DirectStrategy';
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../packages/npm/droid/src/lib/gateway/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACpF,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,eAAe,EACf,sBAAsB,EACvB,MAAM,gBAAgB,CAAC;AACxB,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { ISupabaseStrategy, SelectOptions, SessionResponse, WebSocketStatus } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* DirectStrategy: Everything runs in main thread
|
|
4
|
+
*
|
|
5
|
+
* Architecture:
|
|
6
|
+
* - No workers, all operations on main thread
|
|
7
|
+
* - Uses Supabase client directly
|
|
8
|
+
* - Implements same interface as worker strategies
|
|
9
|
+
*
|
|
10
|
+
* Best for: Browsers without Worker/BroadcastChannel support, or emergency fallback
|
|
11
|
+
*
|
|
12
|
+
* Note: Requires `@supabase/supabase-js` to be available at runtime.
|
|
13
|
+
* This strategy dynamically imports it to avoid bundling Supabase in the main droid build.
|
|
14
|
+
*/
|
|
15
|
+
export declare class DirectStrategy implements ISupabaseStrategy {
|
|
16
|
+
private client;
|
|
17
|
+
private ws;
|
|
18
|
+
private wsReconnectTimer;
|
|
19
|
+
private wsReconnectAttempts;
|
|
20
|
+
private wsHeartbeatTimer;
|
|
21
|
+
private wsLastPongTime;
|
|
22
|
+
private subscriptions;
|
|
23
|
+
private listeners;
|
|
24
|
+
private readonly WS_MAX_RECONNECT_ATTEMPTS;
|
|
25
|
+
private readonly WS_RECONNECT_DELAY_MS;
|
|
26
|
+
private readonly WS_HEARTBEAT_INTERVAL_MS;
|
|
27
|
+
private readonly WS_HEARTBEAT_TIMEOUT_MS;
|
|
28
|
+
init(url: string, anonKey: string, options?: Record<string, unknown>): Promise<SessionResponse>;
|
|
29
|
+
on(event: string, callback: (payload: unknown) => void): () => void;
|
|
30
|
+
private emit;
|
|
31
|
+
getSession(): Promise<SessionResponse>;
|
|
32
|
+
signInWithPassword(email: string, password: string): Promise<SessionResponse>;
|
|
33
|
+
signOut(): Promise<void>;
|
|
34
|
+
select(table: string, opts?: SelectOptions): Promise<unknown[]>;
|
|
35
|
+
insert(table: string, data: Record<string, unknown> | Record<string, unknown>[]): Promise<unknown[]>;
|
|
36
|
+
update(table: string, data: Record<string, unknown>, match: Record<string, unknown>): Promise<unknown[]>;
|
|
37
|
+
upsert(table: string, data: Record<string, unknown> | Record<string, unknown>[]): Promise<unknown[]>;
|
|
38
|
+
delete(table: string, match: Record<string, unknown>): Promise<unknown[]>;
|
|
39
|
+
rpc(fn: string, args?: Record<string, unknown>): Promise<unknown>;
|
|
40
|
+
subscribePostgres(key: string, params: Record<string, unknown>, callback: (payload: unknown) => void): () => void;
|
|
41
|
+
connectWebSocket(wsUrl?: string): Promise<WebSocketStatus>;
|
|
42
|
+
disconnectWebSocket(): Promise<void>;
|
|
43
|
+
sendWebSocketMessage(data: unknown): Promise<void>;
|
|
44
|
+
getWebSocketStatus(): Promise<WebSocketStatus>;
|
|
45
|
+
onWebSocketMessage(callback: (message: unknown) => void): () => void;
|
|
46
|
+
onWebSocketStatus(callback: (status: WebSocketStatus) => void): () => void;
|
|
47
|
+
private getDefaultWebSocketUrl;
|
|
48
|
+
private startHeartbeat;
|
|
49
|
+
private stopHeartbeat;
|
|
50
|
+
terminate(): void;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=DirectStrategy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DirectStrategy.d.ts","sourceRoot":"","sources":["../../../../../../../packages/npm/droid/src/lib/gateway/strategies/DirectStrategy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { ISupabaseStrategy, SelectOptions, SessionResponse, WebSocketStatus } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* SharedWorkerStrategy: Uses SharedWorker for WebSocket + DB Worker Pool
|
|
4
|
+
*
|
|
5
|
+
* Architecture:
|
|
6
|
+
* - SharedWorker handles WebSocket, auth, and realtime (cross-tab sharing)
|
|
7
|
+
* - Worker pool (3 workers) handles database operations (parallel execution)
|
|
8
|
+
* - BroadcastChannel connects SharedWorker to worker pool
|
|
9
|
+
*
|
|
10
|
+
* Best for: Desktop Chrome, Firefox, Edge
|
|
11
|
+
*/
|
|
12
|
+
export declare class SharedWorkerStrategy implements ISupabaseStrategy {
|
|
13
|
+
private worker?;
|
|
14
|
+
private port?;
|
|
15
|
+
private workerPool?;
|
|
16
|
+
private pending;
|
|
17
|
+
private listeners;
|
|
18
|
+
private comm;
|
|
19
|
+
private sharedWorkerUrl;
|
|
20
|
+
private dbWorkerUrl;
|
|
21
|
+
private poolSize;
|
|
22
|
+
constructor(sharedWorkerUrl: string | URL, dbWorkerUrl: string | URL, poolSize?: number);
|
|
23
|
+
init(url: string, anonKey: string, options?: Record<string, unknown>): Promise<SessionResponse>;
|
|
24
|
+
private onMessage;
|
|
25
|
+
private send;
|
|
26
|
+
on(event: string, callback: (payload: unknown) => void): () => void;
|
|
27
|
+
private emit;
|
|
28
|
+
getSession(): Promise<SessionResponse>;
|
|
29
|
+
signInWithPassword(email: string, password: string): Promise<SessionResponse>;
|
|
30
|
+
signOut(): Promise<void>;
|
|
31
|
+
select(table: string, opts?: SelectOptions): Promise<unknown[]>;
|
|
32
|
+
insert(table: string, data: Record<string, unknown> | Record<string, unknown>[]): Promise<unknown[]>;
|
|
33
|
+
update(table: string, data: Record<string, unknown>, match: Record<string, unknown>): Promise<unknown[]>;
|
|
34
|
+
upsert(table: string, data: Record<string, unknown> | Record<string, unknown>[]): Promise<unknown[]>;
|
|
35
|
+
delete(table: string, match: Record<string, unknown>): Promise<unknown[]>;
|
|
36
|
+
rpc(fn: string, args?: Record<string, unknown>): Promise<unknown>;
|
|
37
|
+
subscribePostgres(key: string, params: Record<string, unknown>, callback: (payload: unknown) => void): () => void;
|
|
38
|
+
connectWebSocket(wsUrl?: string): Promise<WebSocketStatus>;
|
|
39
|
+
disconnectWebSocket(): Promise<void>;
|
|
40
|
+
sendWebSocketMessage(data: unknown): Promise<void>;
|
|
41
|
+
getWebSocketStatus(): Promise<WebSocketStatus>;
|
|
42
|
+
onWebSocketMessage(callback: (message: unknown) => void): () => void;
|
|
43
|
+
onWebSocketStatus(callback: (status: WebSocketStatus) => void): () => void;
|
|
44
|
+
terminate(): void;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=SharedWorkerStrategy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SharedWorkerStrategy.d.ts","sourceRoot":"","sources":["../../../../../../../packages/npm/droid/src/lib/gateway/strategies/SharedWorkerStrategy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { ISupabaseStrategy, SelectOptions, SessionResponse, WebSocketStatus } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* WebWorkerStrategy: Uses dedicated WebSocket worker + DB Worker Pool
|
|
4
|
+
*
|
|
5
|
+
* Architecture:
|
|
6
|
+
* - Dedicated WebSocket worker handles WebSocket, auth, and realtime (no cross-tab)
|
|
7
|
+
* - Worker pool (3 workers) handles database operations (parallel execution)
|
|
8
|
+
* - BroadcastChannel connects WebSocket worker to worker pool
|
|
9
|
+
*
|
|
10
|
+
* Best for: Android, Safari, browsers without SharedWorker
|
|
11
|
+
*/
|
|
12
|
+
export declare class WebWorkerStrategy implements ISupabaseStrategy {
|
|
13
|
+
private wsWorker?;
|
|
14
|
+
private workerPool?;
|
|
15
|
+
private pending;
|
|
16
|
+
private listeners;
|
|
17
|
+
private comm;
|
|
18
|
+
private wsWorkerUrl;
|
|
19
|
+
private dbWorkerUrl;
|
|
20
|
+
private poolSize;
|
|
21
|
+
constructor(wsWorkerUrl: string | URL, dbWorkerUrl: string | URL, poolSize?: number);
|
|
22
|
+
init(url: string, anonKey: string, options?: Record<string, unknown>): Promise<SessionResponse>;
|
|
23
|
+
private onMessage;
|
|
24
|
+
private send;
|
|
25
|
+
on(event: string, callback: (payload: unknown) => void): () => void;
|
|
26
|
+
private emit;
|
|
27
|
+
getSession(): Promise<SessionResponse>;
|
|
28
|
+
signInWithPassword(email: string, password: string): Promise<SessionResponse>;
|
|
29
|
+
signOut(): Promise<void>;
|
|
30
|
+
select(table: string, opts?: SelectOptions): Promise<unknown[]>;
|
|
31
|
+
insert(table: string, data: Record<string, unknown> | Record<string, unknown>[]): Promise<unknown[]>;
|
|
32
|
+
update(table: string, data: Record<string, unknown>, match: Record<string, unknown>): Promise<unknown[]>;
|
|
33
|
+
upsert(table: string, data: Record<string, unknown> | Record<string, unknown>[]): Promise<unknown[]>;
|
|
34
|
+
delete(table: string, match: Record<string, unknown>): Promise<unknown[]>;
|
|
35
|
+
rpc(fn: string, args?: Record<string, unknown>): Promise<unknown>;
|
|
36
|
+
subscribePostgres(key: string, params: Record<string, unknown>, callback: (payload: unknown) => void): () => void;
|
|
37
|
+
connectWebSocket(wsUrl?: string): Promise<WebSocketStatus>;
|
|
38
|
+
disconnectWebSocket(): Promise<void>;
|
|
39
|
+
sendWebSocketMessage(data: unknown): Promise<void>;
|
|
40
|
+
getWebSocketStatus(): Promise<WebSocketStatus>;
|
|
41
|
+
onWebSocketMessage(callback: (message: unknown) => void): () => void;
|
|
42
|
+
onWebSocketStatus(callback: (status: WebSocketStatus) => void): () => void;
|
|
43
|
+
terminate(): void;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=WebWorkerStrategy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WebWorkerStrategy.d.ts","sourceRoot":"","sources":["../../../../../../../packages/npm/droid/src/lib/gateway/strategies/WebWorkerStrategy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
export interface SupabaseConfig {
|
|
2
|
+
url: string;
|
|
3
|
+
anonKey: string;
|
|
4
|
+
options?: Record<string, unknown>;
|
|
5
|
+
}
|
|
6
|
+
export interface Session {
|
|
7
|
+
access_token: string;
|
|
8
|
+
refresh_token: string;
|
|
9
|
+
user: Record<string, unknown>;
|
|
10
|
+
expires_at?: number;
|
|
11
|
+
}
|
|
12
|
+
export interface SessionResponse {
|
|
13
|
+
session: Session | null;
|
|
14
|
+
user?: Record<string, unknown>;
|
|
15
|
+
}
|
|
16
|
+
export interface WebSocketStatus {
|
|
17
|
+
status: 'connected' | 'disconnected' | 'connecting' | 'error';
|
|
18
|
+
readyState: number | null;
|
|
19
|
+
error?: string;
|
|
20
|
+
}
|
|
21
|
+
export interface ISupabaseStrategy {
|
|
22
|
+
init(url: string, anonKey: string, options?: Record<string, unknown>): Promise<SessionResponse>;
|
|
23
|
+
on(event: string, callback: (payload: unknown) => void): () => void;
|
|
24
|
+
getSession(): Promise<SessionResponse>;
|
|
25
|
+
signInWithPassword(email: string, password: string): Promise<SessionResponse>;
|
|
26
|
+
signOut(): Promise<void>;
|
|
27
|
+
select(table: string, opts?: SelectOptions): Promise<unknown[]>;
|
|
28
|
+
insert(table: string, data: Record<string, unknown> | Record<string, unknown>[]): Promise<unknown[]>;
|
|
29
|
+
update(table: string, data: Record<string, unknown>, match: Record<string, unknown>): Promise<unknown[]>;
|
|
30
|
+
upsert(table: string, data: Record<string, unknown> | Record<string, unknown>[]): Promise<unknown[]>;
|
|
31
|
+
delete(table: string, match: Record<string, unknown>): Promise<unknown[]>;
|
|
32
|
+
rpc(fn: string, args?: Record<string, unknown>): Promise<unknown>;
|
|
33
|
+
subscribePostgres(key: string, params: Record<string, unknown>, callback: (payload: unknown) => void): () => void;
|
|
34
|
+
connectWebSocket(wsUrl?: string): Promise<WebSocketStatus>;
|
|
35
|
+
disconnectWebSocket(): Promise<void>;
|
|
36
|
+
sendWebSocketMessage(data: unknown): Promise<void>;
|
|
37
|
+
getWebSocketStatus(): Promise<WebSocketStatus>;
|
|
38
|
+
onWebSocketMessage(callback: (message: unknown) => void): () => void;
|
|
39
|
+
onWebSocketStatus(callback: (status: WebSocketStatus) => void): () => void;
|
|
40
|
+
terminate(): void;
|
|
41
|
+
}
|
|
42
|
+
export interface SelectOptions {
|
|
43
|
+
columns?: string;
|
|
44
|
+
match?: Record<string, unknown>;
|
|
45
|
+
limit?: number;
|
|
46
|
+
}
|
|
47
|
+
export interface WorkerMessage {
|
|
48
|
+
id: string;
|
|
49
|
+
type: string;
|
|
50
|
+
payload?: unknown;
|
|
51
|
+
}
|
|
52
|
+
export interface WorkerResponse {
|
|
53
|
+
id: string;
|
|
54
|
+
ok: boolean;
|
|
55
|
+
data?: unknown;
|
|
56
|
+
error?: string;
|
|
57
|
+
}
|
|
58
|
+
export interface BroadcastEvent {
|
|
59
|
+
type: 'auth' | 'ws.message' | 'ws.status' | 'realtime' | 'ready';
|
|
60
|
+
data?: unknown;
|
|
61
|
+
key?: string;
|
|
62
|
+
payload?: unknown;
|
|
63
|
+
}
|
|
64
|
+
export type StrategyType = 'shared-worker' | 'web-worker' | 'direct';
|
|
65
|
+
export interface BrowserCapabilities {
|
|
66
|
+
hasSharedWorker: boolean;
|
|
67
|
+
hasWorker: boolean;
|
|
68
|
+
hasBroadcastChannel: boolean;
|
|
69
|
+
isAndroid: boolean;
|
|
70
|
+
isSafari: boolean;
|
|
71
|
+
}
|
|
72
|
+
export interface GatewayConfig {
|
|
73
|
+
workerUrls?: {
|
|
74
|
+
sharedWorker?: string | URL;
|
|
75
|
+
dbWorker?: string | URL;
|
|
76
|
+
webSocketWorker?: string | URL;
|
|
77
|
+
};
|
|
78
|
+
forceStrategy?: StrategyType;
|
|
79
|
+
poolSize?: number;
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../../packages/npm/droid/src/lib/gateway/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { ToastPayload, TooltipPayload, ModalPayload } from '../types/ui-event-types';
|
|
2
|
+
export declare class CanvasUIRenderer {
|
|
3
|
+
private ctx;
|
|
4
|
+
private canvas;
|
|
5
|
+
private toasts;
|
|
6
|
+
private tooltip;
|
|
7
|
+
private modal;
|
|
8
|
+
private theme;
|
|
9
|
+
private animFrame;
|
|
10
|
+
private dbGet;
|
|
11
|
+
bind(canvas: OffscreenCanvas, dbGet: (key: string) => Promise<string | null>): Promise<void>;
|
|
12
|
+
refreshTheme(): Promise<void>;
|
|
13
|
+
addToast(payload: ToastPayload): void;
|
|
14
|
+
removeToast(id: string): void;
|
|
15
|
+
showTooltip(payload: TooltipPayload | null): void;
|
|
16
|
+
showModal(payload: ModalPayload | null): void;
|
|
17
|
+
private recalcPositions;
|
|
18
|
+
private startLoop;
|
|
19
|
+
private render;
|
|
20
|
+
private drawToast;
|
|
21
|
+
private drawModal;
|
|
22
|
+
private roundRect;
|
|
23
|
+
unbind(): void;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=canvas-ui-renderer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvas-ui-renderer.d.ts","sourceRoot":"","sources":["../../../../../../packages/npm/droid/src/lib/workers/canvas-ui-renderer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,MAAM,yBAAyB,CAAC;AAiCjC,qBAAa,gBAAgB;IAC5B,OAAO,CAAC,GAAG,CAAkD;IAC7D,OAAO,CAAC,MAAM,CAAgC;IAC9C,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,OAAO,CAA+B;IAC9C,OAAO,CAAC,KAAK,CAA6B;IAC1C,OAAO,CAAC,KAAK,CAYX;IACF,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,KAAK,CAA0D;IAEjE,IAAI,CACT,MAAM,EAAE,eAAe,EACvB,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,GAC5C,OAAO,CAAC,IAAI,CAAC;IAQV,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAmBnC,QAAQ,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI;IAWrC,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAM7B,WAAW,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,GAAG,IAAI;IAIjD,SAAS,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI,GAAG,IAAI;IAI7C,OAAO,CAAC,eAAe;IAMvB,OAAO,CAAC,SAAS;IAQjB,OAAO,CAAC,MAAM;IAiCd,OAAO,CAAC,SAAS;IAoCjB,OAAO,CAAC,SAAS;IAoCjB,OAAO,CAAC,SAAS;IAqBjB,MAAM,IAAI,IAAI;CAWd"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { ToastPayload, TooltipPayload, ModalPayload } from '../types/ui-event-types';
|
|
2
|
+
export interface CanvasWorkerAPI {
|
|
3
|
+
bindCanvas(panelId: string, canvas: OffscreenCanvas, mode?: CanvasDrawMode): Promise<void>;
|
|
4
|
+
unbindCanvas(panelId: string): Promise<void>;
|
|
5
|
+
bindUICanvas(canvas: OffscreenCanvas, dbGet: (key: string) => Promise<string | null>): Promise<void>;
|
|
6
|
+
unbindUICanvas(): void;
|
|
7
|
+
addCanvasToast(payload: ToastPayload): void;
|
|
8
|
+
removeCanvasToast(id: string): void;
|
|
9
|
+
showCanvasTooltip(payload: TooltipPayload | null): void;
|
|
10
|
+
showCanvasModal(payload: ModalPayload | null): void;
|
|
11
|
+
refreshUITheme(): Promise<void>;
|
|
12
|
+
}
|
|
13
|
+
export type CanvasDrawMode = 'static' | 'animated' | 'dynamic';
|
|
14
|
+
//# sourceMappingURL=canvas-worker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvas-worker.d.ts","sourceRoot":"","sources":["../../../../../../packages/npm/droid/src/lib/workers/canvas-worker.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACX,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,MAAM,yBAAyB,CAAC;AAEjC,MAAM,WAAW,eAAe;IAC/B,UAAU,CACT,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,eAAe,EACvB,IAAI,CAAC,EAAE,cAAc,GACnB,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7C,YAAY,CACX,MAAM,EAAE,eAAe,EACvB,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,GAC5C,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB,cAAc,IAAI,IAAI,CAAC;IACvB,cAAc,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI,CAAC;IAC5C,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,iBAAiB,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,GAAG,IAAI,CAAC;IACxD,eAAe,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI,GAAG,IAAI,CAAC;IACpD,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAChC;AAUD,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,UAAU,GAAG,SAAS,CAAC"}
|