@protoc-gen-go-wasmjs/runtime 0.0.14 → 0.0.15
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/dist/client/index.d.mts +3 -1
- package/dist/client/index.d.ts +3 -1
- package/dist/client/index.js +12 -3
- package/dist/client/index.js.map +1 -1
- package/dist/client/index.mjs +12 -3
- package/dist/client/index.mjs.map +1 -1
- package/dist/index.js +12 -3
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +12 -3
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/client/index.d.mts
CHANGED
|
@@ -84,6 +84,7 @@ interface WASMBundleConfig {
|
|
|
84
84
|
declare class WASMBundle {
|
|
85
85
|
private wasm;
|
|
86
86
|
private wasmLoadPromise;
|
|
87
|
+
private wasmLoaded;
|
|
87
88
|
private browserServiceManager;
|
|
88
89
|
private config;
|
|
89
90
|
constructor(config: WASMBundleConfig);
|
|
@@ -97,6 +98,7 @@ declare class WASMBundle {
|
|
|
97
98
|
isReady(): boolean;
|
|
98
99
|
/**
|
|
99
100
|
* Wait for WASM to be ready (use during initialization)
|
|
101
|
+
* Ensure WASM module is loaded before API calls
|
|
100
102
|
*/
|
|
101
103
|
waitUntilReady(): Promise<void>;
|
|
102
104
|
/**
|
|
@@ -122,7 +124,7 @@ declare class WASMBundle {
|
|
|
122
124
|
/**
|
|
123
125
|
* Ensure WASM module is loaded (synchronous version for service calls)
|
|
124
126
|
*/
|
|
125
|
-
|
|
127
|
+
ensureReady(): void;
|
|
126
128
|
/**
|
|
127
129
|
* Load the WASM module implementation
|
|
128
130
|
*/
|
package/dist/client/index.d.ts
CHANGED
|
@@ -84,6 +84,7 @@ interface WASMBundleConfig {
|
|
|
84
84
|
declare class WASMBundle {
|
|
85
85
|
private wasm;
|
|
86
86
|
private wasmLoadPromise;
|
|
87
|
+
private wasmLoaded;
|
|
87
88
|
private browserServiceManager;
|
|
88
89
|
private config;
|
|
89
90
|
constructor(config: WASMBundleConfig);
|
|
@@ -97,6 +98,7 @@ declare class WASMBundle {
|
|
|
97
98
|
isReady(): boolean;
|
|
98
99
|
/**
|
|
99
100
|
* Wait for WASM to be ready (use during initialization)
|
|
101
|
+
* Ensure WASM module is loaded before API calls
|
|
100
102
|
*/
|
|
101
103
|
waitUntilReady(): Promise<void>;
|
|
102
104
|
/**
|
|
@@ -122,7 +124,7 @@ declare class WASMBundle {
|
|
|
122
124
|
/**
|
|
123
125
|
* Ensure WASM module is loaded (synchronous version for service calls)
|
|
124
126
|
*/
|
|
125
|
-
|
|
127
|
+
ensureReady(): void;
|
|
126
128
|
/**
|
|
127
129
|
* Load the WASM module implementation
|
|
128
130
|
*/
|
package/dist/client/index.js
CHANGED
|
@@ -228,6 +228,7 @@ var WASMBundle = class {
|
|
|
228
228
|
constructor(config) {
|
|
229
229
|
this.wasm = null;
|
|
230
230
|
this.wasmLoadPromise = null;
|
|
231
|
+
this.wasmLoaded = false;
|
|
231
232
|
this.browserServiceManager = null;
|
|
232
233
|
this.config = config;
|
|
233
234
|
this.browserServiceManager = new BrowserServiceManager();
|
|
@@ -249,12 +250,19 @@ var WASMBundle = class {
|
|
|
249
250
|
}
|
|
250
251
|
/**
|
|
251
252
|
* Wait for WASM to be ready (use during initialization)
|
|
253
|
+
* Ensure WASM module is loaded before API calls
|
|
252
254
|
*/
|
|
253
255
|
async waitUntilReady() {
|
|
256
|
+
if (this.wasmLoaded && this.isReady()) {
|
|
257
|
+
return;
|
|
258
|
+
}
|
|
254
259
|
if (!this.wasmLoadPromise) {
|
|
255
260
|
throw new Error("WASM loading not started. Call loadWasm() first.");
|
|
256
261
|
}
|
|
257
262
|
await this.wasmLoadPromise;
|
|
263
|
+
if (!this.wasmLoaded || !this.isReady()) {
|
|
264
|
+
throw new Error("WASM module failed to load");
|
|
265
|
+
}
|
|
258
266
|
}
|
|
259
267
|
/**
|
|
260
268
|
* Load the WASM module asynchronously (singleton pattern)
|
|
@@ -264,13 +272,14 @@ var WASMBundle = class {
|
|
|
264
272
|
return this.wasmLoadPromise;
|
|
265
273
|
}
|
|
266
274
|
this.wasmLoadPromise = this.loadWASMModule(wasmPath);
|
|
267
|
-
|
|
275
|
+
await this.wasmLoadPromise;
|
|
276
|
+
this.wasmLoaded = true;
|
|
268
277
|
}
|
|
269
278
|
/**
|
|
270
279
|
* Get WASM method function by path
|
|
271
280
|
*/
|
|
272
281
|
getWasmMethod(methodPath) {
|
|
273
|
-
this.
|
|
282
|
+
this.ensureReady();
|
|
274
283
|
switch (this.config.apiStructure) {
|
|
275
284
|
case "namespaced":
|
|
276
285
|
const parts = methodPath.split(".");
|
|
@@ -381,7 +390,7 @@ var WASMBundle = class {
|
|
|
381
390
|
/**
|
|
382
391
|
* Ensure WASM module is loaded (synchronous version for service calls)
|
|
383
392
|
*/
|
|
384
|
-
|
|
393
|
+
ensureReady() {
|
|
385
394
|
if (!this.isReady()) {
|
|
386
395
|
throw new Error("WASM module not loaded. Call loadWasm() and waitUntilReady() first.");
|
|
387
396
|
}
|
package/dist/client/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/client/types.ts","../../src/browser/service-manager.ts","../../src/client/base-client.ts","../../src/client/wasm-bundle.ts","../../src/client/service-client.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["// Copyright 2025 Sri Panyam\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * WASM Response interface for all service calls\n */\nexport interface WASMResponse<T = any> {\n success: boolean;\n message: string;\n data: T;\n}\n\n/**\n * Error class for WASM-specific errors\n */\nexport class WasmError extends Error {\n constructor(message: string, public readonly methodPath?: string) {\n super(message);\n this.name = 'WasmError';\n }\n}\n","// Copyright 2025 Sri Panyam\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * Browser Service Manager\n * Handles FIFO processing of browser service calls from WASM\n * This is a shared component used by all WASM clients that interact with browser services\n */\nexport class BrowserServiceManager {\n private processing = false;\n private serviceImplementations = new Map<string, any>();\n private wasmModule: any;\n\n constructor() {\n // WASM will set up the global functions __wasmGetNextBrowserCall and __wasmDeliverBrowserResponse\n // We'll just use them when they're available\n }\n\n /**\n * Register a browser service implementation\n */\n registerService(name: string, implementation: any): void {\n this.serviceImplementations.set(name, implementation);\n }\n\n /**\n * Set the WASM module reference\n */\n setWasmModule(wasmModule: any): void {\n this.wasmModule = wasmModule;\n }\n\n /**\n * Start processing browser service calls\n */\n async startProcessing(): Promise<void> {\n if (this.processing) return;\n this.processing = true;\n\n // Process calls in a loop\n while (this.processing) {\n const call = this.getNextBrowserCall();\n if (!call) {\n // No pending calls, wait a bit\n await new Promise(resolve => setTimeout(resolve, 10));\n continue;\n }\n\n // Process each call asynchronously without blocking the loop\n this.processCall(call);\n }\n }\n\n /**\n * Process a single browser service call asynchronously\n */\n private async processCall(call: any): Promise<void> {\n try {\n // Get the service implementation\n const service = this.serviceImplementations.get(call.service);\n if (!service) {\n throw new Error(`No implementation registered for service: ${call.service}`);\n }\n\n // Get the method\n const methodName = call.method.charAt(0).toLowerCase() + call.method.slice(1);\n const method = service[methodName];\n if (!method) {\n throw new Error(`Method ${methodName} not found on service ${call.service}`);\n }\n\n // Parse request\n const request = JSON.parse(call.request);\n\n // Call the method (auto-await if async)\n const response = await Promise.resolve(method.call(service, request));\n \n console.log(`DEBUG: Browser service response for ${call.service}.${call.method}:`, response);\n const jsonResponse = JSON.stringify(response);\n console.log(`DEBUG: JSON stringified response:`, jsonResponse);\n\n // Deliver response\n this.deliverBrowserResponse(call.id, jsonResponse, null);\n } catch (error: any) {\n // Deliver error\n this.deliverBrowserResponse(call.id, null, error.message || String(error));\n }\n }\n\n /**\n * Stop processing browser service calls\n */\n stopProcessing(): void {\n this.processing = false;\n }\n\n /**\n * Get the next browser call from WASM\n */\n private getNextBrowserCall(): any {\n // The __wasmGetNextBrowserCall function should be provided by WASM\n if (typeof (window as any).__wasmGetNextBrowserCall === 'function') {\n return (window as any).__wasmGetNextBrowserCall();\n }\n return null;\n }\n\n /**\n * Deliver a response back to WASM (called internally)\n */\n private deliverBrowserResponse(callId: string, response: string | null, error: string | null): boolean {\n if (!(window as any).__wasmDeliverBrowserResponse) {\n return false;\n }\n return (window as any).__wasmDeliverBrowserResponse(callId, response, error);\n }\n}\n","// Copyright 2025 Sri Panyam\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { BrowserServiceManager } from '../browser/service-manager.js';\nimport { WasmError } from './types.js';\n\n/**\n * Base WASM service client containing all non-template-dependent logic\n */\nexport abstract class WASMServiceClient {\n protected wasm: any;\n protected wasmLoadPromise: Promise<void> | null = null;\n protected browserServiceManager: BrowserServiceManager | null = null;\n\n constructor() {\n this.browserServiceManager = new BrowserServiceManager();\n }\n\n /**\n * Register a browser service implementation\n * Can be used to register browser services from any package\n */\n public registerBrowserService(name: string, implementation: any): void {\n if (!this.browserServiceManager) {\n throw new Error('Browser service manager not initialized');\n }\n this.browserServiceManager.registerService(name, implementation);\n }\n\n /**\n * Check if WASM is ready for operations\n */\n public isReady(): boolean {\n return this.wasm !== null && this.wasm !== undefined;\n }\n\n /**\n * Wait for WASM to be ready (use during initialization)\n */\n public async waitUntilReady(): Promise<void> {\n if (!this.wasmLoadPromise) {\n throw new Error('WASM loading not started. Call loadWasm() first.');\n }\n await this.wasmLoadPromise;\n }\n\n /**\n * Internal method to call WASM functions with JSON conversion\n */\n public callMethod<TRequest, TResponse>(\n methodPath: string,\n request: TRequest\n ): Promise<TResponse> {\n this.ensureWASMLoaded();\n\n try {\n // Convert request to JSON\n const jsonReq = JSON.parse(JSON.stringify(request));\n const wasmMethod = this.getWasmMethod(methodPath);\n const wasmResponse = wasmMethod(JSON.stringify(jsonReq));\n\n if (!wasmResponse.success) {\n throw new WasmError(wasmResponse.message, methodPath);\n }\n\n // Return response data directly\n return wasmResponse.data;\n } catch (error) {\n if (error instanceof WasmError) {\n throw error;\n }\n throw new WasmError(\n `Call error: ${error instanceof Error ? error.message : String(error)}`,\n methodPath\n );\n }\n }\n\n /**\n * Internal method to call async WASM functions with callback\n */\n public callMethodWithCallback<TRequest>(\n methodPath: string,\n request: TRequest,\n callback: (response: any, error?: string) => void\n ): Promise<void> {\n this.ensureWASMLoaded();\n\n try {\n // Convert request to JSON\n const jsonReq = JSON.parse(JSON.stringify(request));\n const wasmMethod = this.getWasmMethod(methodPath);\n \n // Call WASM method with callback function\n // WASM now passes proper JS objects, not JSON strings\n const wasmResponse = wasmMethod(JSON.stringify(jsonReq), callback);\n\n if (!wasmResponse.success) {\n throw new WasmError(wasmResponse.message, methodPath);\n }\n\n // Async methods return immediately\n return Promise.resolve();\n } catch (error) {\n if (error instanceof WasmError) {\n throw error;\n }\n throw new WasmError(\n `Call error: ${error instanceof Error ? error.message : String(error)}`,\n methodPath\n );\n }\n }\n\n /**\n * Internal method to call server streaming WASM functions\n */\n public callStreamingMethod<TRequest, TResponse>(\n methodPath: string,\n request: TRequest,\n callback: (response: TResponse | null, error: string | null, done: boolean) => boolean\n ): void {\n this.ensureWASMLoaded();\n\n try {\n // Convert request to JSON\n const jsonReq = JSON.parse(JSON.stringify(request));\n const wasmMethod = this.getWasmMethod(methodPath);\n\n // Wrap the callback to parse JSON responses\n const wrappedCallback = (responseStr: string | null, error: string | null, done: boolean): boolean => {\n let response: TResponse | null = null;\n if (responseStr && !error) {\n try {\n response = JSON.parse(responseStr);\n } catch (e) {\n // If parsing fails, pass the raw string\n response = responseStr as any;\n }\n }\n return callback(response, error, done);\n };\n\n // Call WASM streaming method with wrapped callback\n const wasmResponse = wasmMethod(JSON.stringify(jsonReq), wrappedCallback);\n\n if (!wasmResponse.success) {\n throw new WasmError(wasmResponse.message, methodPath);\n }\n\n // Streaming methods return immediately\n } catch (error) {\n if (error instanceof WasmError) {\n throw error;\n }\n throw new WasmError(\n `Streaming call error: ${error instanceof Error ? error.message : String(error)}`,\n methodPath\n );\n }\n }\n\n /**\n * Ensure WASM module is loaded (synchronous version for service calls)\n */\n protected ensureWASMLoaded(): void {\n if (!this.isReady()) {\n throw new Error('WASM module not loaded. Call loadWasm() and waitUntilReady() first.');\n }\n }\n\n /**\n * Load the WASM module asynchronously\n */\n public async loadWasm(wasmPath: string): Promise<void> {\n if (this.wasmLoadPromise) {\n return this.wasmLoadPromise;\n }\n\n this.wasmLoadPromise = this.loadWASMModule(wasmPath);\n return this.wasmLoadPromise;\n }\n\n /**\n * Load the WASM module implementation (implemented by subclasses)\n * This is abstract because it contains template-specific logic\n */\n protected abstract loadWASMModule(wasmPath: string): Promise<void>;\n\n /**\n * Abstract method for getting WASM method function by path\n * Implementation depends on API structure (namespaced, flat, service_based)\n */\n protected abstract getWasmMethod(methodPath: string): Function;\n}\n","// Copyright 2025 Sri Panyam\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { BrowserServiceManager } from '../browser/service-manager.js';\nimport { WasmError } from './types.js';\n\n/**\n * Configuration for API structure and bundle behavior\n */\nexport interface WASMBundleConfig {\n moduleName: string;\n apiStructure: 'namespaced' | 'flat' | 'service_based';\n jsNamespace: string;\n}\n\n/**\n * WASM Bundle - manages loading and shared access to a WASM module\n * One bundle per WASM file, shared by multiple service clients\n */\nexport class WASMBundle {\n private wasm: any = null;\n private wasmLoadPromise: Promise<void> | null = null;\n private browserServiceManager: BrowserServiceManager | null = null;\n private config: WASMBundleConfig;\n\n constructor(config: WASMBundleConfig) {\n this.config = config;\n this.browserServiceManager = new BrowserServiceManager();\n }\n\n /**\n * Register a browser service implementation\n */\n public registerBrowserService(name: string, implementation: any): void {\n if (!this.browserServiceManager) {\n throw new Error('Browser service manager not initialized');\n }\n this.browserServiceManager.registerService(name, implementation);\n }\n\n /**\n * Check if WASM is ready for operations\n */\n public isReady(): boolean {\n return this.wasm !== null && this.wasm !== undefined;\n }\n\n /**\n * Wait for WASM to be ready (use during initialization)\n */\n public async waitUntilReady(): Promise<void> {\n if (!this.wasmLoadPromise) {\n throw new Error('WASM loading not started. Call loadWasm() first.');\n }\n await this.wasmLoadPromise;\n }\n\n /**\n * Load the WASM module asynchronously (singleton pattern)\n */\n public async loadWasm(wasmPath: string): Promise<void> {\n if (this.wasmLoadPromise) {\n return this.wasmLoadPromise;\n }\n\n this.wasmLoadPromise = this.loadWASMModule(wasmPath);\n return this.wasmLoadPromise;\n }\n\n /**\n * Get WASM method function by path\n */\n public getWasmMethod(methodPath: string): Function {\n this.ensureWASMLoaded();\n\n switch (this.config.apiStructure) {\n case 'namespaced':\n // Handle namespaced structure: namespace.service.method\n const parts = methodPath.split('.');\n let current = this.wasm;\n for (const part of parts) {\n current = current[part];\n if (!current) {\n throw new Error(`Method not found: ${methodPath}`);\n }\n }\n return current;\n\n case 'flat':\n // Handle flat structure: direct method name\n const method = this.wasm[methodPath];\n if (!method) {\n throw new Error(`Method not found: ${methodPath}`);\n }\n return method;\n\n case 'service_based':\n // Handle service-based structure: services.service.method\n const serviceParts = methodPath.split('.');\n let serviceCurrent = this.wasm;\n for (const part of serviceParts) {\n serviceCurrent = serviceCurrent[part];\n if (!serviceCurrent) {\n throw new Error(`Method not found: ${methodPath}`);\n }\n }\n return serviceCurrent;\n\n default:\n throw new Error(`Unsupported API structure: ${this.config.apiStructure}`);\n }\n }\n\n /**\n * Internal method to call WASM functions with JSON conversion\n */\n public callMethod<TRequest, TResponse>(\n methodPath: string,\n request: TRequest\n ): Promise<TResponse> {\n try {\n // Convert request to JSON\n const jsonReq = JSON.parse(JSON.stringify(request));\n const wasmMethod = this.getWasmMethod(methodPath);\n const wasmResponse = wasmMethod(JSON.stringify(jsonReq));\n\n if (!wasmResponse.success) {\n throw new WasmError(wasmResponse.message, methodPath);\n }\n\n // Return response data directly\n return wasmResponse.data;\n } catch (error) {\n if (error instanceof WasmError) {\n throw error;\n }\n throw new WasmError(\n `Call error: ${error instanceof Error ? error.message : String(error)}`,\n methodPath\n );\n }\n }\n\n /**\n * Internal method to call async WASM functions with callback\n */\n public callMethodWithCallback<TRequest>(\n methodPath: string,\n request: TRequest,\n callback: (response: any, error?: string) => void\n ): Promise<void> {\n try {\n // Convert request to JSON\n const jsonReq = JSON.parse(JSON.stringify(request));\n const wasmMethod = this.getWasmMethod(methodPath);\n \n // Call WASM method with callback function\n const wasmResponse = wasmMethod(JSON.stringify(jsonReq), callback);\n\n if (!wasmResponse.success) {\n throw new WasmError(wasmResponse.message, methodPath);\n }\n\n // Async methods return immediately\n return Promise.resolve();\n } catch (error) {\n if (error instanceof WasmError) {\n throw error;\n }\n throw new WasmError(\n `Call error: ${error instanceof Error ? error.message : String(error)}`,\n methodPath\n );\n }\n }\n\n /**\n * Internal method to call server streaming WASM functions\n */\n public callStreamingMethod<TRequest, TResponse>(\n methodPath: string,\n request: TRequest,\n callback: (response: TResponse | null, error: string | null, done: boolean) => boolean\n ): void {\n try {\n // Convert request to JSON\n const jsonReq = JSON.parse(JSON.stringify(request));\n const wasmMethod = this.getWasmMethod(methodPath);\n\n // Wrap the callback to parse JSON responses\n const wrappedCallback = (responseStr: string | null, error: string | null, done: boolean): boolean => {\n let response: TResponse | null = null;\n if (responseStr && !error) {\n try {\n response = JSON.parse(responseStr);\n } catch (e) {\n // If parsing fails, pass the raw string\n response = responseStr as any;\n }\n }\n return callback(response, error, done);\n };\n\n // Call WASM streaming method with wrapped callback\n const wasmResponse = wasmMethod(JSON.stringify(jsonReq), wrappedCallback);\n\n if (!wasmResponse.success) {\n throw new WasmError(wasmResponse.message, methodPath);\n }\n\n // Streaming methods return immediately\n } catch (error) {\n if (error instanceof WasmError) {\n throw error;\n }\n throw new WasmError(\n `Streaming call error: ${error instanceof Error ? error.message : String(error)}`,\n methodPath\n );\n }\n }\n\n /**\n * Ensure WASM module is loaded (synchronous version for service calls)\n */\n private ensureWASMLoaded(): void {\n if (!this.isReady()) {\n throw new Error('WASM module not loaded. Call loadWasm() and waitUntilReady() first.');\n }\n }\n\n /**\n * Load the WASM module implementation\n */\n private async loadWASMModule(wasmPath: string): Promise<void> {\n console.log(`Loading ${this.config.moduleName} WASM module...`);\n\n // Check if WASM is already loaded (for testing environments) \n if (this.checkIfPreLoaded()) {\n console.log('WASM module already loaded (pre-loaded in test environment)');\n return;\n }\n\n // Load Go's WASM support\n if (!(window as any).Go) {\n const script = document.createElement('script');\n script.src = '/wasm_exec.js';\n document.head.appendChild(script);\n\n await new Promise<void>((resolve, reject) => {\n script.onload = () => resolve();\n script.onerror = () => reject(new Error('Failed to load wasm_exec.js'));\n });\n }\n\n // Initialize Go WASM runtime\n const go = new (window as any).Go();\n const wasmModule = await WebAssembly.instantiateStreaming(\n fetch(wasmPath),\n go.importObject\n );\n\n // Run the WASM module\n go.run(wasmModule.instance);\n\n // Start browser service manager\n if (this.browserServiceManager) {\n this.browserServiceManager.setWasmModule(window);\n this.browserServiceManager.startProcessing();\n }\n\n // Verify WASM APIs are available\n this.verifyWASMLoaded();\n\n console.log(`${this.config.moduleName} WASM module loaded successfully`);\n }\n\n /**\n * Check if WASM is pre-loaded (for testing)\n */\n private checkIfPreLoaded(): boolean {\n switch (this.config.apiStructure) {\n case 'namespaced':\n if ((window as any)[this.config.jsNamespace]) {\n this.wasm = (window as any)[this.config.jsNamespace];\n return true;\n }\n return false;\n\n case 'flat':\n // For flat structure, we need to check for any method existence\n // This is a simplified check - in reality we'd check for a known method\n if ((window as any)[this.config.jsNamespace + 'LoadUserData']) {\n this.wasm = window as any;\n return true;\n }\n return false;\n\n case 'service_based':\n if ((window as any).services) {\n this.wasm = (window as any).services;\n return true;\n }\n return false;\n\n default:\n return false;\n }\n }\n\n /**\n * Verify WASM APIs are available after loading\n */\n private verifyWASMLoaded(): void {\n switch (this.config.apiStructure) {\n case 'namespaced':\n if (!(window as any)[this.config.jsNamespace]) {\n throw new Error('WASM APIs not found - module may not have loaded correctly');\n }\n this.wasm = (window as any)[this.config.jsNamespace];\n break;\n\n case 'flat':\n // For flat structure, check for a known method\n if (!(window as any)[this.config.jsNamespace + 'LoadUserData']) {\n throw new Error('WASM APIs not found - module may not have loaded correctly');\n }\n this.wasm = window as any;\n break;\n\n case 'service_based':\n if (!(window as any).services) {\n throw new Error('WASM APIs not found - module may not have loaded correctly');\n }\n this.wasm = (window as any).services;\n break;\n\n default:\n throw new Error(`Unsupported API structure: ${this.config.apiStructure}`);\n }\n }\n}\n","// Copyright 2025 Sri Panyam\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { WASMBundle } from './wasm-bundle.js';\n\n/**\n * Base service client that references a shared WASM bundle\n * Lightweight facade for service-specific method calls\n */\nexport abstract class ServiceClient {\n protected bundle: WASMBundle;\n\n constructor(bundle: WASMBundle) {\n this.bundle = bundle;\n }\n\n /**\n * Check if the underlying WASM bundle is ready\n */\n public isReady(): boolean {\n return this.bundle.isReady();\n }\n\n /**\n * Wait for the underlying WASM bundle to be ready\n */\n public async waitUntilReady(): Promise<void> {\n return this.bundle.waitUntilReady();\n }\n\n /**\n * Call a synchronous WASM method\n */\n protected callMethod<TRequest, TResponse>(\n methodPath: string,\n request: TRequest\n ): Promise<TResponse> {\n return this.bundle.callMethod(methodPath, request);\n }\n\n /**\n * Call an asynchronous WASM method with callback\n */\n protected callMethodWithCallback<TRequest>(\n methodPath: string,\n request: TRequest,\n callback: (response: any, error?: string) => void\n ): Promise<void> {\n return this.bundle.callMethodWithCallback(methodPath, request, callback);\n }\n\n /**\n * Call a server streaming WASM method\n */\n protected callStreamingMethod<TRequest, TResponse>(\n methodPath: string,\n request: TRequest,\n callback: (response: TResponse | null, error: string | null, done: boolean) => boolean\n ): void {\n return this.bundle.callStreamingMethod(methodPath, request, callback);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/client/types.ts","../../src/browser/service-manager.ts","../../src/client/base-client.ts","../../src/client/wasm-bundle.ts","../../src/client/service-client.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["// Copyright 2025 Sri Panyam\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * WASM Response interface for all service calls\n */\nexport interface WASMResponse<T = any> {\n success: boolean;\n message: string;\n data: T;\n}\n\n/**\n * Error class for WASM-specific errors\n */\nexport class WasmError extends Error {\n constructor(message: string, public readonly methodPath?: string) {\n super(message);\n this.name = 'WasmError';\n }\n}\n","// Copyright 2025 Sri Panyam\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * Browser Service Manager\n * Handles FIFO processing of browser service calls from WASM\n * This is a shared component used by all WASM clients that interact with browser services\n */\nexport class BrowserServiceManager {\n private processing = false;\n private serviceImplementations = new Map<string, any>();\n private wasmModule: any;\n\n constructor() {\n // WASM will set up the global functions __wasmGetNextBrowserCall and __wasmDeliverBrowserResponse\n // We'll just use them when they're available\n }\n\n /**\n * Register a browser service implementation\n */\n registerService(name: string, implementation: any): void {\n this.serviceImplementations.set(name, implementation);\n }\n\n /**\n * Set the WASM module reference\n */\n setWasmModule(wasmModule: any): void {\n this.wasmModule = wasmModule;\n }\n\n /**\n * Start processing browser service calls\n */\n async startProcessing(): Promise<void> {\n if (this.processing) return;\n this.processing = true;\n\n // Process calls in a loop\n while (this.processing) {\n const call = this.getNextBrowserCall();\n if (!call) {\n // No pending calls, wait a bit\n await new Promise(resolve => setTimeout(resolve, 10));\n continue;\n }\n\n // Process each call asynchronously without blocking the loop\n this.processCall(call);\n }\n }\n\n /**\n * Process a single browser service call asynchronously\n */\n private async processCall(call: any): Promise<void> {\n try {\n // Get the service implementation\n const service = this.serviceImplementations.get(call.service);\n if (!service) {\n throw new Error(`No implementation registered for service: ${call.service}`);\n }\n\n // Get the method\n const methodName = call.method.charAt(0).toLowerCase() + call.method.slice(1);\n const method = service[methodName];\n if (!method) {\n throw new Error(`Method ${methodName} not found on service ${call.service}`);\n }\n\n // Parse request\n const request = JSON.parse(call.request);\n\n // Call the method (auto-await if async)\n const response = await Promise.resolve(method.call(service, request));\n \n console.log(`DEBUG: Browser service response for ${call.service}.${call.method}:`, response);\n const jsonResponse = JSON.stringify(response);\n console.log(`DEBUG: JSON stringified response:`, jsonResponse);\n\n // Deliver response\n this.deliverBrowserResponse(call.id, jsonResponse, null);\n } catch (error: any) {\n // Deliver error\n this.deliverBrowserResponse(call.id, null, error.message || String(error));\n }\n }\n\n /**\n * Stop processing browser service calls\n */\n stopProcessing(): void {\n this.processing = false;\n }\n\n /**\n * Get the next browser call from WASM\n */\n private getNextBrowserCall(): any {\n // The __wasmGetNextBrowserCall function should be provided by WASM\n if (typeof (window as any).__wasmGetNextBrowserCall === 'function') {\n return (window as any).__wasmGetNextBrowserCall();\n }\n return null;\n }\n\n /**\n * Deliver a response back to WASM (called internally)\n */\n private deliverBrowserResponse(callId: string, response: string | null, error: string | null): boolean {\n if (!(window as any).__wasmDeliverBrowserResponse) {\n return false;\n }\n return (window as any).__wasmDeliverBrowserResponse(callId, response, error);\n }\n}\n","// Copyright 2025 Sri Panyam\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { BrowserServiceManager } from '../browser/service-manager.js';\nimport { WasmError } from './types.js';\n\n/**\n * Base WASM service client containing all non-template-dependent logic\n */\nexport abstract class WASMServiceClient {\n protected wasm: any;\n protected wasmLoadPromise: Promise<void> | null = null;\n protected browserServiceManager: BrowserServiceManager | null = null;\n\n constructor() {\n this.browserServiceManager = new BrowserServiceManager();\n }\n\n /**\n * Register a browser service implementation\n * Can be used to register browser services from any package\n */\n public registerBrowserService(name: string, implementation: any): void {\n if (!this.browserServiceManager) {\n throw new Error('Browser service manager not initialized');\n }\n this.browserServiceManager.registerService(name, implementation);\n }\n\n /**\n * Check if WASM is ready for operations\n */\n public isReady(): boolean {\n return this.wasm !== null && this.wasm !== undefined;\n }\n\n /**\n * Wait for WASM to be ready (use during initialization)\n */\n public async waitUntilReady(): Promise<void> {\n if (!this.wasmLoadPromise) {\n throw new Error('WASM loading not started. Call loadWasm() first.');\n }\n await this.wasmLoadPromise;\n }\n\n /**\n * Internal method to call WASM functions with JSON conversion\n */\n public callMethod<TRequest, TResponse>(\n methodPath: string,\n request: TRequest\n ): Promise<TResponse> {\n this.ensureWASMLoaded();\n\n try {\n // Convert request to JSON\n const jsonReq = JSON.parse(JSON.stringify(request));\n const wasmMethod = this.getWasmMethod(methodPath);\n const wasmResponse = wasmMethod(JSON.stringify(jsonReq));\n\n if (!wasmResponse.success) {\n throw new WasmError(wasmResponse.message, methodPath);\n }\n\n // Return response data directly\n return wasmResponse.data;\n } catch (error) {\n if (error instanceof WasmError) {\n throw error;\n }\n throw new WasmError(\n `Call error: ${error instanceof Error ? error.message : String(error)}`,\n methodPath\n );\n }\n }\n\n /**\n * Internal method to call async WASM functions with callback\n */\n public callMethodWithCallback<TRequest>(\n methodPath: string,\n request: TRequest,\n callback: (response: any, error?: string) => void\n ): Promise<void> {\n this.ensureWASMLoaded();\n\n try {\n // Convert request to JSON\n const jsonReq = JSON.parse(JSON.stringify(request));\n const wasmMethod = this.getWasmMethod(methodPath);\n \n // Call WASM method with callback function\n // WASM now passes proper JS objects, not JSON strings\n const wasmResponse = wasmMethod(JSON.stringify(jsonReq), callback);\n\n if (!wasmResponse.success) {\n throw new WasmError(wasmResponse.message, methodPath);\n }\n\n // Async methods return immediately\n return Promise.resolve();\n } catch (error) {\n if (error instanceof WasmError) {\n throw error;\n }\n throw new WasmError(\n `Call error: ${error instanceof Error ? error.message : String(error)}`,\n methodPath\n );\n }\n }\n\n /**\n * Internal method to call server streaming WASM functions\n */\n public callStreamingMethod<TRequest, TResponse>(\n methodPath: string,\n request: TRequest,\n callback: (response: TResponse | null, error: string | null, done: boolean) => boolean\n ): void {\n this.ensureWASMLoaded();\n\n try {\n // Convert request to JSON\n const jsonReq = JSON.parse(JSON.stringify(request));\n const wasmMethod = this.getWasmMethod(methodPath);\n\n // Wrap the callback to parse JSON responses\n const wrappedCallback = (responseStr: string | null, error: string | null, done: boolean): boolean => {\n let response: TResponse | null = null;\n if (responseStr && !error) {\n try {\n response = JSON.parse(responseStr);\n } catch (e) {\n // If parsing fails, pass the raw string\n response = responseStr as any;\n }\n }\n return callback(response, error, done);\n };\n\n // Call WASM streaming method with wrapped callback\n const wasmResponse = wasmMethod(JSON.stringify(jsonReq), wrappedCallback);\n\n if (!wasmResponse.success) {\n throw new WasmError(wasmResponse.message, methodPath);\n }\n\n // Streaming methods return immediately\n } catch (error) {\n if (error instanceof WasmError) {\n throw error;\n }\n throw new WasmError(\n `Streaming call error: ${error instanceof Error ? error.message : String(error)}`,\n methodPath\n );\n }\n }\n\n /**\n * Ensure WASM module is loaded (synchronous version for service calls)\n */\n protected ensureWASMLoaded(): void {\n if (!this.isReady()) {\n throw new Error('WASM module not loaded. Call loadWasm() and waitUntilReady() first.');\n }\n }\n\n /**\n * Load the WASM module asynchronously\n */\n public async loadWasm(wasmPath: string): Promise<void> {\n if (this.wasmLoadPromise) {\n return this.wasmLoadPromise;\n }\n\n this.wasmLoadPromise = this.loadWASMModule(wasmPath);\n return this.wasmLoadPromise;\n }\n\n /**\n * Load the WASM module implementation (implemented by subclasses)\n * This is abstract because it contains template-specific logic\n */\n protected abstract loadWASMModule(wasmPath: string): Promise<void>;\n\n /**\n * Abstract method for getting WASM method function by path\n * Implementation depends on API structure (namespaced, flat, service_based)\n */\n protected abstract getWasmMethod(methodPath: string): Function;\n}\n","// Copyright 2025 Sri Panyam\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { BrowserServiceManager } from '../browser/service-manager.js';\nimport { WasmError } from './types.js';\n\n/**\n * Configuration for API structure and bundle behavior\n */\nexport interface WASMBundleConfig {\n moduleName: string;\n apiStructure: 'namespaced' | 'flat' | 'service_based';\n jsNamespace: string;\n}\n\n/**\n * WASM Bundle - manages loading and shared access to a WASM module\n * One bundle per WASM file, shared by multiple service clients\n */\nexport class WASMBundle {\n private wasm: any = null;\n private wasmLoadPromise: Promise<void> | null = null;\n private wasmLoaded = false\n private browserServiceManager: BrowserServiceManager | null = null;\n private config: WASMBundleConfig;\n\n constructor(config: WASMBundleConfig) {\n this.config = config;\n this.browserServiceManager = new BrowserServiceManager();\n }\n\n /**\n * Register a browser service implementation\n */\n public registerBrowserService(name: string, implementation: any): void {\n if (!this.browserServiceManager) {\n throw new Error('Browser service manager not initialized');\n }\n this.browserServiceManager.registerService(name, implementation);\n }\n\n /**\n * Check if WASM is ready for operations\n */\n public isReady(): boolean {\n return this.wasm !== null && this.wasm !== undefined;\n }\n\n /**\n * Wait for WASM to be ready (use during initialization)\n * Ensure WASM module is loaded before API calls\n */\n public async waitUntilReady() {\n if (this.wasmLoaded && this.isReady()) {\n return\n }\n\n if (!this.wasmLoadPromise) {\n throw new Error('WASM loading not started. Call loadWasm() first.');\n }\n\n await this.wasmLoadPromise;\n\n if (!this.wasmLoaded || !this.isReady()) {\n throw new Error('WASM module failed to load');\n }\n }\n\n /**\n * Load the WASM module asynchronously (singleton pattern)\n */\n public async loadWasm(wasmPath: string): Promise<void> {\n if (this.wasmLoadPromise) {\n return this.wasmLoadPromise;\n }\n\n this.wasmLoadPromise = this.loadWASMModule(wasmPath);\n await this.wasmLoadPromise\n this.wasmLoaded = true\n }\n\n /**\n * Get WASM method function by path\n */\n public getWasmMethod(methodPath: string): Function {\n this.ensureReady();\n\n switch (this.config.apiStructure) {\n case 'namespaced':\n // Handle namespaced structure: namespace.service.method\n const parts = methodPath.split('.');\n let current = this.wasm;\n for (const part of parts) {\n current = current[part];\n if (!current) {\n throw new Error(`Method not found: ${methodPath}`);\n }\n }\n return current;\n\n case 'flat':\n // Handle flat structure: direct method name\n const method = this.wasm[methodPath];\n if (!method) {\n throw new Error(`Method not found: ${methodPath}`);\n }\n return method;\n\n case 'service_based':\n // Handle service-based structure: services.service.method\n const serviceParts = methodPath.split('.');\n let serviceCurrent = this.wasm;\n for (const part of serviceParts) {\n serviceCurrent = serviceCurrent[part];\n if (!serviceCurrent) {\n throw new Error(`Method not found: ${methodPath}`);\n }\n }\n return serviceCurrent;\n\n default:\n throw new Error(`Unsupported API structure: ${this.config.apiStructure}`);\n }\n }\n\n /**\n * Internal method to call WASM functions with JSON conversion\n */\n public callMethod<TRequest, TResponse>(\n methodPath: string,\n request: TRequest\n ): Promise<TResponse> {\n try {\n // Convert request to JSON\n const jsonReq = JSON.parse(JSON.stringify(request));\n const wasmMethod = this.getWasmMethod(methodPath);\n const wasmResponse = wasmMethod(JSON.stringify(jsonReq));\n\n if (!wasmResponse.success) {\n throw new WasmError(wasmResponse.message, methodPath);\n }\n\n // Return response data directly\n return wasmResponse.data;\n } catch (error) {\n if (error instanceof WasmError) {\n throw error;\n }\n throw new WasmError(\n `Call error: ${error instanceof Error ? error.message : String(error)}`,\n methodPath\n );\n }\n }\n\n /**\n * Internal method to call async WASM functions with callback\n */\n public callMethodWithCallback<TRequest>(\n methodPath: string,\n request: TRequest,\n callback: (response: any, error?: string) => void\n ): Promise<void> {\n try {\n // Convert request to JSON\n const jsonReq = JSON.parse(JSON.stringify(request));\n const wasmMethod = this.getWasmMethod(methodPath);\n \n // Call WASM method with callback function\n const wasmResponse = wasmMethod(JSON.stringify(jsonReq), callback);\n\n if (!wasmResponse.success) {\n throw new WasmError(wasmResponse.message, methodPath);\n }\n\n // Async methods return immediately\n return Promise.resolve();\n } catch (error) {\n if (error instanceof WasmError) {\n throw error;\n }\n throw new WasmError(\n `Call error: ${error instanceof Error ? error.message : String(error)}`,\n methodPath\n );\n }\n }\n\n /**\n * Internal method to call server streaming WASM functions\n */\n public callStreamingMethod<TRequest, TResponse>(\n methodPath: string,\n request: TRequest,\n callback: (response: TResponse | null, error: string | null, done: boolean) => boolean\n ): void {\n try {\n // Convert request to JSON\n const jsonReq = JSON.parse(JSON.stringify(request));\n const wasmMethod = this.getWasmMethod(methodPath);\n\n // Wrap the callback to parse JSON responses\n const wrappedCallback = (responseStr: string | null, error: string | null, done: boolean): boolean => {\n let response: TResponse | null = null;\n if (responseStr && !error) {\n try {\n response = JSON.parse(responseStr);\n } catch (e) {\n // If parsing fails, pass the raw string\n response = responseStr as any;\n }\n }\n return callback(response, error, done);\n };\n\n // Call WASM streaming method with wrapped callback\n const wasmResponse = wasmMethod(JSON.stringify(jsonReq), wrappedCallback);\n\n if (!wasmResponse.success) {\n throw new WasmError(wasmResponse.message, methodPath);\n }\n\n // Streaming methods return immediately\n } catch (error) {\n if (error instanceof WasmError) {\n throw error;\n }\n throw new WasmError(\n `Streaming call error: ${error instanceof Error ? error.message : String(error)}`,\n methodPath\n );\n }\n }\n\n /**\n * Ensure WASM module is loaded (synchronous version for service calls)\n */\n public ensureReady(): void {\n if (!this.isReady()) {\n throw new Error('WASM module not loaded. Call loadWasm() and waitUntilReady() first.');\n }\n }\n\n /**\n * Load the WASM module implementation\n */\n private async loadWASMModule(wasmPath: string): Promise<void> {\n console.log(`Loading ${this.config.moduleName} WASM module...`);\n\n // Check if WASM is already loaded (for testing environments) \n if (this.checkIfPreLoaded()) {\n console.log('WASM module already loaded (pre-loaded in test environment)');\n return;\n }\n\n // Load Go's WASM support\n if (!(window as any).Go) {\n const script = document.createElement('script');\n script.src = '/wasm_exec.js';\n document.head.appendChild(script);\n\n await new Promise<void>((resolve, reject) => {\n script.onload = () => resolve();\n script.onerror = () => reject(new Error('Failed to load wasm_exec.js'));\n });\n }\n\n // Initialize Go WASM runtime\n const go = new (window as any).Go();\n const wasmModule = await WebAssembly.instantiateStreaming(\n fetch(wasmPath),\n go.importObject\n );\n\n // Run the WASM module\n go.run(wasmModule.instance);\n\n // Start browser service manager\n if (this.browserServiceManager) {\n this.browserServiceManager.setWasmModule(window);\n this.browserServiceManager.startProcessing();\n }\n\n // Verify WASM APIs are available\n this.verifyWASMLoaded();\n\n console.log(`${this.config.moduleName} WASM module loaded successfully`);\n }\n\n /**\n * Check if WASM is pre-loaded (for testing)\n */\n private checkIfPreLoaded(): boolean {\n switch (this.config.apiStructure) {\n case 'namespaced':\n if ((window as any)[this.config.jsNamespace]) {\n this.wasm = (window as any)[this.config.jsNamespace];\n return true;\n }\n return false;\n\n case 'flat':\n // For flat structure, we need to check for any method existence\n // This is a simplified check - in reality we'd check for a known method\n if ((window as any)[this.config.jsNamespace + 'LoadUserData']) {\n this.wasm = window as any;\n return true;\n }\n return false;\n\n case 'service_based':\n if ((window as any).services) {\n this.wasm = (window as any).services;\n return true;\n }\n return false;\n\n default:\n return false;\n }\n }\n\n /**\n * Verify WASM APIs are available after loading\n */\n private verifyWASMLoaded(): void {\n switch (this.config.apiStructure) {\n case 'namespaced':\n if (!(window as any)[this.config.jsNamespace]) {\n throw new Error('WASM APIs not found - module may not have loaded correctly');\n }\n this.wasm = (window as any)[this.config.jsNamespace];\n break;\n\n case 'flat':\n // For flat structure, check for a known method\n if (!(window as any)[this.config.jsNamespace + 'LoadUserData']) {\n throw new Error('WASM APIs not found - module may not have loaded correctly');\n }\n this.wasm = window as any;\n break;\n\n case 'service_based':\n if (!(window as any).services) {\n throw new Error('WASM APIs not found - module may not have loaded correctly');\n }\n this.wasm = (window as any).services;\n break;\n\n default:\n throw new Error(`Unsupported API structure: ${this.config.apiStructure}`);\n }\n }\n}\n","// Copyright 2025 Sri Panyam\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { WASMBundle } from './wasm-bundle.js';\n\n/**\n * Base service client that references a shared WASM bundle\n * Lightweight facade for service-specific method calls\n */\nexport abstract class ServiceClient {\n protected bundle: WASMBundle;\n\n constructor(bundle: WASMBundle) {\n this.bundle = bundle;\n }\n\n /**\n * Check if the underlying WASM bundle is ready\n */\n public isReady(): boolean {\n return this.bundle.isReady();\n }\n\n /**\n * Wait for the underlying WASM bundle to be ready\n */\n public async waitUntilReady(): Promise<void> {\n return this.bundle.waitUntilReady();\n }\n\n /**\n * Call a synchronous WASM method\n */\n protected callMethod<TRequest, TResponse>(\n methodPath: string,\n request: TRequest\n ): Promise<TResponse> {\n return this.bundle.callMethod(methodPath, request);\n }\n\n /**\n * Call an asynchronous WASM method with callback\n */\n protected callMethodWithCallback<TRequest>(\n methodPath: string,\n request: TRequest,\n callback: (response: any, error?: string) => void\n ): Promise<void> {\n return this.bundle.callMethodWithCallback(methodPath, request, callback);\n }\n\n /**\n * Call a server streaming WASM method\n */\n protected callStreamingMethod<TRequest, TResponse>(\n methodPath: string,\n request: TRequest,\n callback: (response: TResponse | null, error: string | null, done: boolean) => boolean\n ): void {\n return this.bundle.callStreamingMethod(methodPath, request, callback);\n }\n}\n"]}
|
package/dist/client/index.mjs
CHANGED
|
@@ -226,6 +226,7 @@ var WASMBundle = class {
|
|
|
226
226
|
constructor(config) {
|
|
227
227
|
this.wasm = null;
|
|
228
228
|
this.wasmLoadPromise = null;
|
|
229
|
+
this.wasmLoaded = false;
|
|
229
230
|
this.browserServiceManager = null;
|
|
230
231
|
this.config = config;
|
|
231
232
|
this.browserServiceManager = new BrowserServiceManager();
|
|
@@ -247,12 +248,19 @@ var WASMBundle = class {
|
|
|
247
248
|
}
|
|
248
249
|
/**
|
|
249
250
|
* Wait for WASM to be ready (use during initialization)
|
|
251
|
+
* Ensure WASM module is loaded before API calls
|
|
250
252
|
*/
|
|
251
253
|
async waitUntilReady() {
|
|
254
|
+
if (this.wasmLoaded && this.isReady()) {
|
|
255
|
+
return;
|
|
256
|
+
}
|
|
252
257
|
if (!this.wasmLoadPromise) {
|
|
253
258
|
throw new Error("WASM loading not started. Call loadWasm() first.");
|
|
254
259
|
}
|
|
255
260
|
await this.wasmLoadPromise;
|
|
261
|
+
if (!this.wasmLoaded || !this.isReady()) {
|
|
262
|
+
throw new Error("WASM module failed to load");
|
|
263
|
+
}
|
|
256
264
|
}
|
|
257
265
|
/**
|
|
258
266
|
* Load the WASM module asynchronously (singleton pattern)
|
|
@@ -262,13 +270,14 @@ var WASMBundle = class {
|
|
|
262
270
|
return this.wasmLoadPromise;
|
|
263
271
|
}
|
|
264
272
|
this.wasmLoadPromise = this.loadWASMModule(wasmPath);
|
|
265
|
-
|
|
273
|
+
await this.wasmLoadPromise;
|
|
274
|
+
this.wasmLoaded = true;
|
|
266
275
|
}
|
|
267
276
|
/**
|
|
268
277
|
* Get WASM method function by path
|
|
269
278
|
*/
|
|
270
279
|
getWasmMethod(methodPath) {
|
|
271
|
-
this.
|
|
280
|
+
this.ensureReady();
|
|
272
281
|
switch (this.config.apiStructure) {
|
|
273
282
|
case "namespaced":
|
|
274
283
|
const parts = methodPath.split(".");
|
|
@@ -379,7 +388,7 @@ var WASMBundle = class {
|
|
|
379
388
|
/**
|
|
380
389
|
* Ensure WASM module is loaded (synchronous version for service calls)
|
|
381
390
|
*/
|
|
382
|
-
|
|
391
|
+
ensureReady() {
|
|
383
392
|
if (!this.isReady()) {
|
|
384
393
|
throw new Error("WASM module not loaded. Call loadWasm() and waitUntilReady() first.");
|
|
385
394
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/client/types.ts","../../src/browser/service-manager.ts","../../src/client/base-client.ts","../../src/client/wasm-bundle.ts","../../src/client/service-client.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["// Copyright 2025 Sri Panyam\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * WASM Response interface for all service calls\n */\nexport interface WASMResponse<T = any> {\n success: boolean;\n message: string;\n data: T;\n}\n\n/**\n * Error class for WASM-specific errors\n */\nexport class WasmError extends Error {\n constructor(message: string, public readonly methodPath?: string) {\n super(message);\n this.name = 'WasmError';\n }\n}\n","// Copyright 2025 Sri Panyam\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * Browser Service Manager\n * Handles FIFO processing of browser service calls from WASM\n * This is a shared component used by all WASM clients that interact with browser services\n */\nexport class BrowserServiceManager {\n private processing = false;\n private serviceImplementations = new Map<string, any>();\n private wasmModule: any;\n\n constructor() {\n // WASM will set up the global functions __wasmGetNextBrowserCall and __wasmDeliverBrowserResponse\n // We'll just use them when they're available\n }\n\n /**\n * Register a browser service implementation\n */\n registerService(name: string, implementation: any): void {\n this.serviceImplementations.set(name, implementation);\n }\n\n /**\n * Set the WASM module reference\n */\n setWasmModule(wasmModule: any): void {\n this.wasmModule = wasmModule;\n }\n\n /**\n * Start processing browser service calls\n */\n async startProcessing(): Promise<void> {\n if (this.processing) return;\n this.processing = true;\n\n // Process calls in a loop\n while (this.processing) {\n const call = this.getNextBrowserCall();\n if (!call) {\n // No pending calls, wait a bit\n await new Promise(resolve => setTimeout(resolve, 10));\n continue;\n }\n\n // Process each call asynchronously without blocking the loop\n this.processCall(call);\n }\n }\n\n /**\n * Process a single browser service call asynchronously\n */\n private async processCall(call: any): Promise<void> {\n try {\n // Get the service implementation\n const service = this.serviceImplementations.get(call.service);\n if (!service) {\n throw new Error(`No implementation registered for service: ${call.service}`);\n }\n\n // Get the method\n const methodName = call.method.charAt(0).toLowerCase() + call.method.slice(1);\n const method = service[methodName];\n if (!method) {\n throw new Error(`Method ${methodName} not found on service ${call.service}`);\n }\n\n // Parse request\n const request = JSON.parse(call.request);\n\n // Call the method (auto-await if async)\n const response = await Promise.resolve(method.call(service, request));\n \n console.log(`DEBUG: Browser service response for ${call.service}.${call.method}:`, response);\n const jsonResponse = JSON.stringify(response);\n console.log(`DEBUG: JSON stringified response:`, jsonResponse);\n\n // Deliver response\n this.deliverBrowserResponse(call.id, jsonResponse, null);\n } catch (error: any) {\n // Deliver error\n this.deliverBrowserResponse(call.id, null, error.message || String(error));\n }\n }\n\n /**\n * Stop processing browser service calls\n */\n stopProcessing(): void {\n this.processing = false;\n }\n\n /**\n * Get the next browser call from WASM\n */\n private getNextBrowserCall(): any {\n // The __wasmGetNextBrowserCall function should be provided by WASM\n if (typeof (window as any).__wasmGetNextBrowserCall === 'function') {\n return (window as any).__wasmGetNextBrowserCall();\n }\n return null;\n }\n\n /**\n * Deliver a response back to WASM (called internally)\n */\n private deliverBrowserResponse(callId: string, response: string | null, error: string | null): boolean {\n if (!(window as any).__wasmDeliverBrowserResponse) {\n return false;\n }\n return (window as any).__wasmDeliverBrowserResponse(callId, response, error);\n }\n}\n","// Copyright 2025 Sri Panyam\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { BrowserServiceManager } from '../browser/service-manager.js';\nimport { WasmError } from './types.js';\n\n/**\n * Base WASM service client containing all non-template-dependent logic\n */\nexport abstract class WASMServiceClient {\n protected wasm: any;\n protected wasmLoadPromise: Promise<void> | null = null;\n protected browserServiceManager: BrowserServiceManager | null = null;\n\n constructor() {\n this.browserServiceManager = new BrowserServiceManager();\n }\n\n /**\n * Register a browser service implementation\n * Can be used to register browser services from any package\n */\n public registerBrowserService(name: string, implementation: any): void {\n if (!this.browserServiceManager) {\n throw new Error('Browser service manager not initialized');\n }\n this.browserServiceManager.registerService(name, implementation);\n }\n\n /**\n * Check if WASM is ready for operations\n */\n public isReady(): boolean {\n return this.wasm !== null && this.wasm !== undefined;\n }\n\n /**\n * Wait for WASM to be ready (use during initialization)\n */\n public async waitUntilReady(): Promise<void> {\n if (!this.wasmLoadPromise) {\n throw new Error('WASM loading not started. Call loadWasm() first.');\n }\n await this.wasmLoadPromise;\n }\n\n /**\n * Internal method to call WASM functions with JSON conversion\n */\n public callMethod<TRequest, TResponse>(\n methodPath: string,\n request: TRequest\n ): Promise<TResponse> {\n this.ensureWASMLoaded();\n\n try {\n // Convert request to JSON\n const jsonReq = JSON.parse(JSON.stringify(request));\n const wasmMethod = this.getWasmMethod(methodPath);\n const wasmResponse = wasmMethod(JSON.stringify(jsonReq));\n\n if (!wasmResponse.success) {\n throw new WasmError(wasmResponse.message, methodPath);\n }\n\n // Return response data directly\n return wasmResponse.data;\n } catch (error) {\n if (error instanceof WasmError) {\n throw error;\n }\n throw new WasmError(\n `Call error: ${error instanceof Error ? error.message : String(error)}`,\n methodPath\n );\n }\n }\n\n /**\n * Internal method to call async WASM functions with callback\n */\n public callMethodWithCallback<TRequest>(\n methodPath: string,\n request: TRequest,\n callback: (response: any, error?: string) => void\n ): Promise<void> {\n this.ensureWASMLoaded();\n\n try {\n // Convert request to JSON\n const jsonReq = JSON.parse(JSON.stringify(request));\n const wasmMethod = this.getWasmMethod(methodPath);\n \n // Call WASM method with callback function\n // WASM now passes proper JS objects, not JSON strings\n const wasmResponse = wasmMethod(JSON.stringify(jsonReq), callback);\n\n if (!wasmResponse.success) {\n throw new WasmError(wasmResponse.message, methodPath);\n }\n\n // Async methods return immediately\n return Promise.resolve();\n } catch (error) {\n if (error instanceof WasmError) {\n throw error;\n }\n throw new WasmError(\n `Call error: ${error instanceof Error ? error.message : String(error)}`,\n methodPath\n );\n }\n }\n\n /**\n * Internal method to call server streaming WASM functions\n */\n public callStreamingMethod<TRequest, TResponse>(\n methodPath: string,\n request: TRequest,\n callback: (response: TResponse | null, error: string | null, done: boolean) => boolean\n ): void {\n this.ensureWASMLoaded();\n\n try {\n // Convert request to JSON\n const jsonReq = JSON.parse(JSON.stringify(request));\n const wasmMethod = this.getWasmMethod(methodPath);\n\n // Wrap the callback to parse JSON responses\n const wrappedCallback = (responseStr: string | null, error: string | null, done: boolean): boolean => {\n let response: TResponse | null = null;\n if (responseStr && !error) {\n try {\n response = JSON.parse(responseStr);\n } catch (e) {\n // If parsing fails, pass the raw string\n response = responseStr as any;\n }\n }\n return callback(response, error, done);\n };\n\n // Call WASM streaming method with wrapped callback\n const wasmResponse = wasmMethod(JSON.stringify(jsonReq), wrappedCallback);\n\n if (!wasmResponse.success) {\n throw new WasmError(wasmResponse.message, methodPath);\n }\n\n // Streaming methods return immediately\n } catch (error) {\n if (error instanceof WasmError) {\n throw error;\n }\n throw new WasmError(\n `Streaming call error: ${error instanceof Error ? error.message : String(error)}`,\n methodPath\n );\n }\n }\n\n /**\n * Ensure WASM module is loaded (synchronous version for service calls)\n */\n protected ensureWASMLoaded(): void {\n if (!this.isReady()) {\n throw new Error('WASM module not loaded. Call loadWasm() and waitUntilReady() first.');\n }\n }\n\n /**\n * Load the WASM module asynchronously\n */\n public async loadWasm(wasmPath: string): Promise<void> {\n if (this.wasmLoadPromise) {\n return this.wasmLoadPromise;\n }\n\n this.wasmLoadPromise = this.loadWASMModule(wasmPath);\n return this.wasmLoadPromise;\n }\n\n /**\n * Load the WASM module implementation (implemented by subclasses)\n * This is abstract because it contains template-specific logic\n */\n protected abstract loadWASMModule(wasmPath: string): Promise<void>;\n\n /**\n * Abstract method for getting WASM method function by path\n * Implementation depends on API structure (namespaced, flat, service_based)\n */\n protected abstract getWasmMethod(methodPath: string): Function;\n}\n","// Copyright 2025 Sri Panyam\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { BrowserServiceManager } from '../browser/service-manager.js';\nimport { WasmError } from './types.js';\n\n/**\n * Configuration for API structure and bundle behavior\n */\nexport interface WASMBundleConfig {\n moduleName: string;\n apiStructure: 'namespaced' | 'flat' | 'service_based';\n jsNamespace: string;\n}\n\n/**\n * WASM Bundle - manages loading and shared access to a WASM module\n * One bundle per WASM file, shared by multiple service clients\n */\nexport class WASMBundle {\n private wasm: any = null;\n private wasmLoadPromise: Promise<void> | null = null;\n private browserServiceManager: BrowserServiceManager | null = null;\n private config: WASMBundleConfig;\n\n constructor(config: WASMBundleConfig) {\n this.config = config;\n this.browserServiceManager = new BrowserServiceManager();\n }\n\n /**\n * Register a browser service implementation\n */\n public registerBrowserService(name: string, implementation: any): void {\n if (!this.browserServiceManager) {\n throw new Error('Browser service manager not initialized');\n }\n this.browserServiceManager.registerService(name, implementation);\n }\n\n /**\n * Check if WASM is ready for operations\n */\n public isReady(): boolean {\n return this.wasm !== null && this.wasm !== undefined;\n }\n\n /**\n * Wait for WASM to be ready (use during initialization)\n */\n public async waitUntilReady(): Promise<void> {\n if (!this.wasmLoadPromise) {\n throw new Error('WASM loading not started. Call loadWasm() first.');\n }\n await this.wasmLoadPromise;\n }\n\n /**\n * Load the WASM module asynchronously (singleton pattern)\n */\n public async loadWasm(wasmPath: string): Promise<void> {\n if (this.wasmLoadPromise) {\n return this.wasmLoadPromise;\n }\n\n this.wasmLoadPromise = this.loadWASMModule(wasmPath);\n return this.wasmLoadPromise;\n }\n\n /**\n * Get WASM method function by path\n */\n public getWasmMethod(methodPath: string): Function {\n this.ensureWASMLoaded();\n\n switch (this.config.apiStructure) {\n case 'namespaced':\n // Handle namespaced structure: namespace.service.method\n const parts = methodPath.split('.');\n let current = this.wasm;\n for (const part of parts) {\n current = current[part];\n if (!current) {\n throw new Error(`Method not found: ${methodPath}`);\n }\n }\n return current;\n\n case 'flat':\n // Handle flat structure: direct method name\n const method = this.wasm[methodPath];\n if (!method) {\n throw new Error(`Method not found: ${methodPath}`);\n }\n return method;\n\n case 'service_based':\n // Handle service-based structure: services.service.method\n const serviceParts = methodPath.split('.');\n let serviceCurrent = this.wasm;\n for (const part of serviceParts) {\n serviceCurrent = serviceCurrent[part];\n if (!serviceCurrent) {\n throw new Error(`Method not found: ${methodPath}`);\n }\n }\n return serviceCurrent;\n\n default:\n throw new Error(`Unsupported API structure: ${this.config.apiStructure}`);\n }\n }\n\n /**\n * Internal method to call WASM functions with JSON conversion\n */\n public callMethod<TRequest, TResponse>(\n methodPath: string,\n request: TRequest\n ): Promise<TResponse> {\n try {\n // Convert request to JSON\n const jsonReq = JSON.parse(JSON.stringify(request));\n const wasmMethod = this.getWasmMethod(methodPath);\n const wasmResponse = wasmMethod(JSON.stringify(jsonReq));\n\n if (!wasmResponse.success) {\n throw new WasmError(wasmResponse.message, methodPath);\n }\n\n // Return response data directly\n return wasmResponse.data;\n } catch (error) {\n if (error instanceof WasmError) {\n throw error;\n }\n throw new WasmError(\n `Call error: ${error instanceof Error ? error.message : String(error)}`,\n methodPath\n );\n }\n }\n\n /**\n * Internal method to call async WASM functions with callback\n */\n public callMethodWithCallback<TRequest>(\n methodPath: string,\n request: TRequest,\n callback: (response: any, error?: string) => void\n ): Promise<void> {\n try {\n // Convert request to JSON\n const jsonReq = JSON.parse(JSON.stringify(request));\n const wasmMethod = this.getWasmMethod(methodPath);\n \n // Call WASM method with callback function\n const wasmResponse = wasmMethod(JSON.stringify(jsonReq), callback);\n\n if (!wasmResponse.success) {\n throw new WasmError(wasmResponse.message, methodPath);\n }\n\n // Async methods return immediately\n return Promise.resolve();\n } catch (error) {\n if (error instanceof WasmError) {\n throw error;\n }\n throw new WasmError(\n `Call error: ${error instanceof Error ? error.message : String(error)}`,\n methodPath\n );\n }\n }\n\n /**\n * Internal method to call server streaming WASM functions\n */\n public callStreamingMethod<TRequest, TResponse>(\n methodPath: string,\n request: TRequest,\n callback: (response: TResponse | null, error: string | null, done: boolean) => boolean\n ): void {\n try {\n // Convert request to JSON\n const jsonReq = JSON.parse(JSON.stringify(request));\n const wasmMethod = this.getWasmMethod(methodPath);\n\n // Wrap the callback to parse JSON responses\n const wrappedCallback = (responseStr: string | null, error: string | null, done: boolean): boolean => {\n let response: TResponse | null = null;\n if (responseStr && !error) {\n try {\n response = JSON.parse(responseStr);\n } catch (e) {\n // If parsing fails, pass the raw string\n response = responseStr as any;\n }\n }\n return callback(response, error, done);\n };\n\n // Call WASM streaming method with wrapped callback\n const wasmResponse = wasmMethod(JSON.stringify(jsonReq), wrappedCallback);\n\n if (!wasmResponse.success) {\n throw new WasmError(wasmResponse.message, methodPath);\n }\n\n // Streaming methods return immediately\n } catch (error) {\n if (error instanceof WasmError) {\n throw error;\n }\n throw new WasmError(\n `Streaming call error: ${error instanceof Error ? error.message : String(error)}`,\n methodPath\n );\n }\n }\n\n /**\n * Ensure WASM module is loaded (synchronous version for service calls)\n */\n private ensureWASMLoaded(): void {\n if (!this.isReady()) {\n throw new Error('WASM module not loaded. Call loadWasm() and waitUntilReady() first.');\n }\n }\n\n /**\n * Load the WASM module implementation\n */\n private async loadWASMModule(wasmPath: string): Promise<void> {\n console.log(`Loading ${this.config.moduleName} WASM module...`);\n\n // Check if WASM is already loaded (for testing environments) \n if (this.checkIfPreLoaded()) {\n console.log('WASM module already loaded (pre-loaded in test environment)');\n return;\n }\n\n // Load Go's WASM support\n if (!(window as any).Go) {\n const script = document.createElement('script');\n script.src = '/wasm_exec.js';\n document.head.appendChild(script);\n\n await new Promise<void>((resolve, reject) => {\n script.onload = () => resolve();\n script.onerror = () => reject(new Error('Failed to load wasm_exec.js'));\n });\n }\n\n // Initialize Go WASM runtime\n const go = new (window as any).Go();\n const wasmModule = await WebAssembly.instantiateStreaming(\n fetch(wasmPath),\n go.importObject\n );\n\n // Run the WASM module\n go.run(wasmModule.instance);\n\n // Start browser service manager\n if (this.browserServiceManager) {\n this.browserServiceManager.setWasmModule(window);\n this.browserServiceManager.startProcessing();\n }\n\n // Verify WASM APIs are available\n this.verifyWASMLoaded();\n\n console.log(`${this.config.moduleName} WASM module loaded successfully`);\n }\n\n /**\n * Check if WASM is pre-loaded (for testing)\n */\n private checkIfPreLoaded(): boolean {\n switch (this.config.apiStructure) {\n case 'namespaced':\n if ((window as any)[this.config.jsNamespace]) {\n this.wasm = (window as any)[this.config.jsNamespace];\n return true;\n }\n return false;\n\n case 'flat':\n // For flat structure, we need to check for any method existence\n // This is a simplified check - in reality we'd check for a known method\n if ((window as any)[this.config.jsNamespace + 'LoadUserData']) {\n this.wasm = window as any;\n return true;\n }\n return false;\n\n case 'service_based':\n if ((window as any).services) {\n this.wasm = (window as any).services;\n return true;\n }\n return false;\n\n default:\n return false;\n }\n }\n\n /**\n * Verify WASM APIs are available after loading\n */\n private verifyWASMLoaded(): void {\n switch (this.config.apiStructure) {\n case 'namespaced':\n if (!(window as any)[this.config.jsNamespace]) {\n throw new Error('WASM APIs not found - module may not have loaded correctly');\n }\n this.wasm = (window as any)[this.config.jsNamespace];\n break;\n\n case 'flat':\n // For flat structure, check for a known method\n if (!(window as any)[this.config.jsNamespace + 'LoadUserData']) {\n throw new Error('WASM APIs not found - module may not have loaded correctly');\n }\n this.wasm = window as any;\n break;\n\n case 'service_based':\n if (!(window as any).services) {\n throw new Error('WASM APIs not found - module may not have loaded correctly');\n }\n this.wasm = (window as any).services;\n break;\n\n default:\n throw new Error(`Unsupported API structure: ${this.config.apiStructure}`);\n }\n }\n}\n","// Copyright 2025 Sri Panyam\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { WASMBundle } from './wasm-bundle.js';\n\n/**\n * Base service client that references a shared WASM bundle\n * Lightweight facade for service-specific method calls\n */\nexport abstract class ServiceClient {\n protected bundle: WASMBundle;\n\n constructor(bundle: WASMBundle) {\n this.bundle = bundle;\n }\n\n /**\n * Check if the underlying WASM bundle is ready\n */\n public isReady(): boolean {\n return this.bundle.isReady();\n }\n\n /**\n * Wait for the underlying WASM bundle to be ready\n */\n public async waitUntilReady(): Promise<void> {\n return this.bundle.waitUntilReady();\n }\n\n /**\n * Call a synchronous WASM method\n */\n protected callMethod<TRequest, TResponse>(\n methodPath: string,\n request: TRequest\n ): Promise<TResponse> {\n return this.bundle.callMethod(methodPath, request);\n }\n\n /**\n * Call an asynchronous WASM method with callback\n */\n protected callMethodWithCallback<TRequest>(\n methodPath: string,\n request: TRequest,\n callback: (response: any, error?: string) => void\n ): Promise<void> {\n return this.bundle.callMethodWithCallback(methodPath, request, callback);\n }\n\n /**\n * Call a server streaming WASM method\n */\n protected callStreamingMethod<TRequest, TResponse>(\n methodPath: string,\n request: TRequest,\n callback: (response: TResponse | null, error: string | null, done: boolean) => boolean\n ): void {\n return this.bundle.callStreamingMethod(methodPath, request, callback);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/client/types.ts","../../src/browser/service-manager.ts","../../src/client/base-client.ts","../../src/client/wasm-bundle.ts","../../src/client/service-client.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["// Copyright 2025 Sri Panyam\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * WASM Response interface for all service calls\n */\nexport interface WASMResponse<T = any> {\n success: boolean;\n message: string;\n data: T;\n}\n\n/**\n * Error class for WASM-specific errors\n */\nexport class WasmError extends Error {\n constructor(message: string, public readonly methodPath?: string) {\n super(message);\n this.name = 'WasmError';\n }\n}\n","// Copyright 2025 Sri Panyam\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * Browser Service Manager\n * Handles FIFO processing of browser service calls from WASM\n * This is a shared component used by all WASM clients that interact with browser services\n */\nexport class BrowserServiceManager {\n private processing = false;\n private serviceImplementations = new Map<string, any>();\n private wasmModule: any;\n\n constructor() {\n // WASM will set up the global functions __wasmGetNextBrowserCall and __wasmDeliverBrowserResponse\n // We'll just use them when they're available\n }\n\n /**\n * Register a browser service implementation\n */\n registerService(name: string, implementation: any): void {\n this.serviceImplementations.set(name, implementation);\n }\n\n /**\n * Set the WASM module reference\n */\n setWasmModule(wasmModule: any): void {\n this.wasmModule = wasmModule;\n }\n\n /**\n * Start processing browser service calls\n */\n async startProcessing(): Promise<void> {\n if (this.processing) return;\n this.processing = true;\n\n // Process calls in a loop\n while (this.processing) {\n const call = this.getNextBrowserCall();\n if (!call) {\n // No pending calls, wait a bit\n await new Promise(resolve => setTimeout(resolve, 10));\n continue;\n }\n\n // Process each call asynchronously without blocking the loop\n this.processCall(call);\n }\n }\n\n /**\n * Process a single browser service call asynchronously\n */\n private async processCall(call: any): Promise<void> {\n try {\n // Get the service implementation\n const service = this.serviceImplementations.get(call.service);\n if (!service) {\n throw new Error(`No implementation registered for service: ${call.service}`);\n }\n\n // Get the method\n const methodName = call.method.charAt(0).toLowerCase() + call.method.slice(1);\n const method = service[methodName];\n if (!method) {\n throw new Error(`Method ${methodName} not found on service ${call.service}`);\n }\n\n // Parse request\n const request = JSON.parse(call.request);\n\n // Call the method (auto-await if async)\n const response = await Promise.resolve(method.call(service, request));\n \n console.log(`DEBUG: Browser service response for ${call.service}.${call.method}:`, response);\n const jsonResponse = JSON.stringify(response);\n console.log(`DEBUG: JSON stringified response:`, jsonResponse);\n\n // Deliver response\n this.deliverBrowserResponse(call.id, jsonResponse, null);\n } catch (error: any) {\n // Deliver error\n this.deliverBrowserResponse(call.id, null, error.message || String(error));\n }\n }\n\n /**\n * Stop processing browser service calls\n */\n stopProcessing(): void {\n this.processing = false;\n }\n\n /**\n * Get the next browser call from WASM\n */\n private getNextBrowserCall(): any {\n // The __wasmGetNextBrowserCall function should be provided by WASM\n if (typeof (window as any).__wasmGetNextBrowserCall === 'function') {\n return (window as any).__wasmGetNextBrowserCall();\n }\n return null;\n }\n\n /**\n * Deliver a response back to WASM (called internally)\n */\n private deliverBrowserResponse(callId: string, response: string | null, error: string | null): boolean {\n if (!(window as any).__wasmDeliverBrowserResponse) {\n return false;\n }\n return (window as any).__wasmDeliverBrowserResponse(callId, response, error);\n }\n}\n","// Copyright 2025 Sri Panyam\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { BrowserServiceManager } from '../browser/service-manager.js';\nimport { WasmError } from './types.js';\n\n/**\n * Base WASM service client containing all non-template-dependent logic\n */\nexport abstract class WASMServiceClient {\n protected wasm: any;\n protected wasmLoadPromise: Promise<void> | null = null;\n protected browserServiceManager: BrowserServiceManager | null = null;\n\n constructor() {\n this.browserServiceManager = new BrowserServiceManager();\n }\n\n /**\n * Register a browser service implementation\n * Can be used to register browser services from any package\n */\n public registerBrowserService(name: string, implementation: any): void {\n if (!this.browserServiceManager) {\n throw new Error('Browser service manager not initialized');\n }\n this.browserServiceManager.registerService(name, implementation);\n }\n\n /**\n * Check if WASM is ready for operations\n */\n public isReady(): boolean {\n return this.wasm !== null && this.wasm !== undefined;\n }\n\n /**\n * Wait for WASM to be ready (use during initialization)\n */\n public async waitUntilReady(): Promise<void> {\n if (!this.wasmLoadPromise) {\n throw new Error('WASM loading not started. Call loadWasm() first.');\n }\n await this.wasmLoadPromise;\n }\n\n /**\n * Internal method to call WASM functions with JSON conversion\n */\n public callMethod<TRequest, TResponse>(\n methodPath: string,\n request: TRequest\n ): Promise<TResponse> {\n this.ensureWASMLoaded();\n\n try {\n // Convert request to JSON\n const jsonReq = JSON.parse(JSON.stringify(request));\n const wasmMethod = this.getWasmMethod(methodPath);\n const wasmResponse = wasmMethod(JSON.stringify(jsonReq));\n\n if (!wasmResponse.success) {\n throw new WasmError(wasmResponse.message, methodPath);\n }\n\n // Return response data directly\n return wasmResponse.data;\n } catch (error) {\n if (error instanceof WasmError) {\n throw error;\n }\n throw new WasmError(\n `Call error: ${error instanceof Error ? error.message : String(error)}`,\n methodPath\n );\n }\n }\n\n /**\n * Internal method to call async WASM functions with callback\n */\n public callMethodWithCallback<TRequest>(\n methodPath: string,\n request: TRequest,\n callback: (response: any, error?: string) => void\n ): Promise<void> {\n this.ensureWASMLoaded();\n\n try {\n // Convert request to JSON\n const jsonReq = JSON.parse(JSON.stringify(request));\n const wasmMethod = this.getWasmMethod(methodPath);\n \n // Call WASM method with callback function\n // WASM now passes proper JS objects, not JSON strings\n const wasmResponse = wasmMethod(JSON.stringify(jsonReq), callback);\n\n if (!wasmResponse.success) {\n throw new WasmError(wasmResponse.message, methodPath);\n }\n\n // Async methods return immediately\n return Promise.resolve();\n } catch (error) {\n if (error instanceof WasmError) {\n throw error;\n }\n throw new WasmError(\n `Call error: ${error instanceof Error ? error.message : String(error)}`,\n methodPath\n );\n }\n }\n\n /**\n * Internal method to call server streaming WASM functions\n */\n public callStreamingMethod<TRequest, TResponse>(\n methodPath: string,\n request: TRequest,\n callback: (response: TResponse | null, error: string | null, done: boolean) => boolean\n ): void {\n this.ensureWASMLoaded();\n\n try {\n // Convert request to JSON\n const jsonReq = JSON.parse(JSON.stringify(request));\n const wasmMethod = this.getWasmMethod(methodPath);\n\n // Wrap the callback to parse JSON responses\n const wrappedCallback = (responseStr: string | null, error: string | null, done: boolean): boolean => {\n let response: TResponse | null = null;\n if (responseStr && !error) {\n try {\n response = JSON.parse(responseStr);\n } catch (e) {\n // If parsing fails, pass the raw string\n response = responseStr as any;\n }\n }\n return callback(response, error, done);\n };\n\n // Call WASM streaming method with wrapped callback\n const wasmResponse = wasmMethod(JSON.stringify(jsonReq), wrappedCallback);\n\n if (!wasmResponse.success) {\n throw new WasmError(wasmResponse.message, methodPath);\n }\n\n // Streaming methods return immediately\n } catch (error) {\n if (error instanceof WasmError) {\n throw error;\n }\n throw new WasmError(\n `Streaming call error: ${error instanceof Error ? error.message : String(error)}`,\n methodPath\n );\n }\n }\n\n /**\n * Ensure WASM module is loaded (synchronous version for service calls)\n */\n protected ensureWASMLoaded(): void {\n if (!this.isReady()) {\n throw new Error('WASM module not loaded. Call loadWasm() and waitUntilReady() first.');\n }\n }\n\n /**\n * Load the WASM module asynchronously\n */\n public async loadWasm(wasmPath: string): Promise<void> {\n if (this.wasmLoadPromise) {\n return this.wasmLoadPromise;\n }\n\n this.wasmLoadPromise = this.loadWASMModule(wasmPath);\n return this.wasmLoadPromise;\n }\n\n /**\n * Load the WASM module implementation (implemented by subclasses)\n * This is abstract because it contains template-specific logic\n */\n protected abstract loadWASMModule(wasmPath: string): Promise<void>;\n\n /**\n * Abstract method for getting WASM method function by path\n * Implementation depends on API structure (namespaced, flat, service_based)\n */\n protected abstract getWasmMethod(methodPath: string): Function;\n}\n","// Copyright 2025 Sri Panyam\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { BrowserServiceManager } from '../browser/service-manager.js';\nimport { WasmError } from './types.js';\n\n/**\n * Configuration for API structure and bundle behavior\n */\nexport interface WASMBundleConfig {\n moduleName: string;\n apiStructure: 'namespaced' | 'flat' | 'service_based';\n jsNamespace: string;\n}\n\n/**\n * WASM Bundle - manages loading and shared access to a WASM module\n * One bundle per WASM file, shared by multiple service clients\n */\nexport class WASMBundle {\n private wasm: any = null;\n private wasmLoadPromise: Promise<void> | null = null;\n private wasmLoaded = false\n private browserServiceManager: BrowserServiceManager | null = null;\n private config: WASMBundleConfig;\n\n constructor(config: WASMBundleConfig) {\n this.config = config;\n this.browserServiceManager = new BrowserServiceManager();\n }\n\n /**\n * Register a browser service implementation\n */\n public registerBrowserService(name: string, implementation: any): void {\n if (!this.browserServiceManager) {\n throw new Error('Browser service manager not initialized');\n }\n this.browserServiceManager.registerService(name, implementation);\n }\n\n /**\n * Check if WASM is ready for operations\n */\n public isReady(): boolean {\n return this.wasm !== null && this.wasm !== undefined;\n }\n\n /**\n * Wait for WASM to be ready (use during initialization)\n * Ensure WASM module is loaded before API calls\n */\n public async waitUntilReady() {\n if (this.wasmLoaded && this.isReady()) {\n return\n }\n\n if (!this.wasmLoadPromise) {\n throw new Error('WASM loading not started. Call loadWasm() first.');\n }\n\n await this.wasmLoadPromise;\n\n if (!this.wasmLoaded || !this.isReady()) {\n throw new Error('WASM module failed to load');\n }\n }\n\n /**\n * Load the WASM module asynchronously (singleton pattern)\n */\n public async loadWasm(wasmPath: string): Promise<void> {\n if (this.wasmLoadPromise) {\n return this.wasmLoadPromise;\n }\n\n this.wasmLoadPromise = this.loadWASMModule(wasmPath);\n await this.wasmLoadPromise\n this.wasmLoaded = true\n }\n\n /**\n * Get WASM method function by path\n */\n public getWasmMethod(methodPath: string): Function {\n this.ensureReady();\n\n switch (this.config.apiStructure) {\n case 'namespaced':\n // Handle namespaced structure: namespace.service.method\n const parts = methodPath.split('.');\n let current = this.wasm;\n for (const part of parts) {\n current = current[part];\n if (!current) {\n throw new Error(`Method not found: ${methodPath}`);\n }\n }\n return current;\n\n case 'flat':\n // Handle flat structure: direct method name\n const method = this.wasm[methodPath];\n if (!method) {\n throw new Error(`Method not found: ${methodPath}`);\n }\n return method;\n\n case 'service_based':\n // Handle service-based structure: services.service.method\n const serviceParts = methodPath.split('.');\n let serviceCurrent = this.wasm;\n for (const part of serviceParts) {\n serviceCurrent = serviceCurrent[part];\n if (!serviceCurrent) {\n throw new Error(`Method not found: ${methodPath}`);\n }\n }\n return serviceCurrent;\n\n default:\n throw new Error(`Unsupported API structure: ${this.config.apiStructure}`);\n }\n }\n\n /**\n * Internal method to call WASM functions with JSON conversion\n */\n public callMethod<TRequest, TResponse>(\n methodPath: string,\n request: TRequest\n ): Promise<TResponse> {\n try {\n // Convert request to JSON\n const jsonReq = JSON.parse(JSON.stringify(request));\n const wasmMethod = this.getWasmMethod(methodPath);\n const wasmResponse = wasmMethod(JSON.stringify(jsonReq));\n\n if (!wasmResponse.success) {\n throw new WasmError(wasmResponse.message, methodPath);\n }\n\n // Return response data directly\n return wasmResponse.data;\n } catch (error) {\n if (error instanceof WasmError) {\n throw error;\n }\n throw new WasmError(\n `Call error: ${error instanceof Error ? error.message : String(error)}`,\n methodPath\n );\n }\n }\n\n /**\n * Internal method to call async WASM functions with callback\n */\n public callMethodWithCallback<TRequest>(\n methodPath: string,\n request: TRequest,\n callback: (response: any, error?: string) => void\n ): Promise<void> {\n try {\n // Convert request to JSON\n const jsonReq = JSON.parse(JSON.stringify(request));\n const wasmMethod = this.getWasmMethod(methodPath);\n \n // Call WASM method with callback function\n const wasmResponse = wasmMethod(JSON.stringify(jsonReq), callback);\n\n if (!wasmResponse.success) {\n throw new WasmError(wasmResponse.message, methodPath);\n }\n\n // Async methods return immediately\n return Promise.resolve();\n } catch (error) {\n if (error instanceof WasmError) {\n throw error;\n }\n throw new WasmError(\n `Call error: ${error instanceof Error ? error.message : String(error)}`,\n methodPath\n );\n }\n }\n\n /**\n * Internal method to call server streaming WASM functions\n */\n public callStreamingMethod<TRequest, TResponse>(\n methodPath: string,\n request: TRequest,\n callback: (response: TResponse | null, error: string | null, done: boolean) => boolean\n ): void {\n try {\n // Convert request to JSON\n const jsonReq = JSON.parse(JSON.stringify(request));\n const wasmMethod = this.getWasmMethod(methodPath);\n\n // Wrap the callback to parse JSON responses\n const wrappedCallback = (responseStr: string | null, error: string | null, done: boolean): boolean => {\n let response: TResponse | null = null;\n if (responseStr && !error) {\n try {\n response = JSON.parse(responseStr);\n } catch (e) {\n // If parsing fails, pass the raw string\n response = responseStr as any;\n }\n }\n return callback(response, error, done);\n };\n\n // Call WASM streaming method with wrapped callback\n const wasmResponse = wasmMethod(JSON.stringify(jsonReq), wrappedCallback);\n\n if (!wasmResponse.success) {\n throw new WasmError(wasmResponse.message, methodPath);\n }\n\n // Streaming methods return immediately\n } catch (error) {\n if (error instanceof WasmError) {\n throw error;\n }\n throw new WasmError(\n `Streaming call error: ${error instanceof Error ? error.message : String(error)}`,\n methodPath\n );\n }\n }\n\n /**\n * Ensure WASM module is loaded (synchronous version for service calls)\n */\n public ensureReady(): void {\n if (!this.isReady()) {\n throw new Error('WASM module not loaded. Call loadWasm() and waitUntilReady() first.');\n }\n }\n\n /**\n * Load the WASM module implementation\n */\n private async loadWASMModule(wasmPath: string): Promise<void> {\n console.log(`Loading ${this.config.moduleName} WASM module...`);\n\n // Check if WASM is already loaded (for testing environments) \n if (this.checkIfPreLoaded()) {\n console.log('WASM module already loaded (pre-loaded in test environment)');\n return;\n }\n\n // Load Go's WASM support\n if (!(window as any).Go) {\n const script = document.createElement('script');\n script.src = '/wasm_exec.js';\n document.head.appendChild(script);\n\n await new Promise<void>((resolve, reject) => {\n script.onload = () => resolve();\n script.onerror = () => reject(new Error('Failed to load wasm_exec.js'));\n });\n }\n\n // Initialize Go WASM runtime\n const go = new (window as any).Go();\n const wasmModule = await WebAssembly.instantiateStreaming(\n fetch(wasmPath),\n go.importObject\n );\n\n // Run the WASM module\n go.run(wasmModule.instance);\n\n // Start browser service manager\n if (this.browserServiceManager) {\n this.browserServiceManager.setWasmModule(window);\n this.browserServiceManager.startProcessing();\n }\n\n // Verify WASM APIs are available\n this.verifyWASMLoaded();\n\n console.log(`${this.config.moduleName} WASM module loaded successfully`);\n }\n\n /**\n * Check if WASM is pre-loaded (for testing)\n */\n private checkIfPreLoaded(): boolean {\n switch (this.config.apiStructure) {\n case 'namespaced':\n if ((window as any)[this.config.jsNamespace]) {\n this.wasm = (window as any)[this.config.jsNamespace];\n return true;\n }\n return false;\n\n case 'flat':\n // For flat structure, we need to check for any method existence\n // This is a simplified check - in reality we'd check for a known method\n if ((window as any)[this.config.jsNamespace + 'LoadUserData']) {\n this.wasm = window as any;\n return true;\n }\n return false;\n\n case 'service_based':\n if ((window as any).services) {\n this.wasm = (window as any).services;\n return true;\n }\n return false;\n\n default:\n return false;\n }\n }\n\n /**\n * Verify WASM APIs are available after loading\n */\n private verifyWASMLoaded(): void {\n switch (this.config.apiStructure) {\n case 'namespaced':\n if (!(window as any)[this.config.jsNamespace]) {\n throw new Error('WASM APIs not found - module may not have loaded correctly');\n }\n this.wasm = (window as any)[this.config.jsNamespace];\n break;\n\n case 'flat':\n // For flat structure, check for a known method\n if (!(window as any)[this.config.jsNamespace + 'LoadUserData']) {\n throw new Error('WASM APIs not found - module may not have loaded correctly');\n }\n this.wasm = window as any;\n break;\n\n case 'service_based':\n if (!(window as any).services) {\n throw new Error('WASM APIs not found - module may not have loaded correctly');\n }\n this.wasm = (window as any).services;\n break;\n\n default:\n throw new Error(`Unsupported API structure: ${this.config.apiStructure}`);\n }\n }\n}\n","// Copyright 2025 Sri Panyam\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { WASMBundle } from './wasm-bundle.js';\n\n/**\n * Base service client that references a shared WASM bundle\n * Lightweight facade for service-specific method calls\n */\nexport abstract class ServiceClient {\n protected bundle: WASMBundle;\n\n constructor(bundle: WASMBundle) {\n this.bundle = bundle;\n }\n\n /**\n * Check if the underlying WASM bundle is ready\n */\n public isReady(): boolean {\n return this.bundle.isReady();\n }\n\n /**\n * Wait for the underlying WASM bundle to be ready\n */\n public async waitUntilReady(): Promise<void> {\n return this.bundle.waitUntilReady();\n }\n\n /**\n * Call a synchronous WASM method\n */\n protected callMethod<TRequest, TResponse>(\n methodPath: string,\n request: TRequest\n ): Promise<TResponse> {\n return this.bundle.callMethod(methodPath, request);\n }\n\n /**\n * Call an asynchronous WASM method with callback\n */\n protected callMethodWithCallback<TRequest>(\n methodPath: string,\n request: TRequest,\n callback: (response: any, error?: string) => void\n ): Promise<void> {\n return this.bundle.callMethodWithCallback(methodPath, request, callback);\n }\n\n /**\n * Call a server streaming WASM method\n */\n protected callStreamingMethod<TRequest, TResponse>(\n methodPath: string,\n request: TRequest,\n callback: (response: TResponse | null, error: string | null, done: boolean) => boolean\n ): void {\n return this.bundle.callStreamingMethod(methodPath, request, callback);\n }\n}\n"]}
|
package/dist/index.js
CHANGED
|
@@ -448,6 +448,7 @@ var WASMBundle = class {
|
|
|
448
448
|
constructor(config) {
|
|
449
449
|
this.wasm = null;
|
|
450
450
|
this.wasmLoadPromise = null;
|
|
451
|
+
this.wasmLoaded = false;
|
|
451
452
|
this.browserServiceManager = null;
|
|
452
453
|
this.config = config;
|
|
453
454
|
this.browserServiceManager = new BrowserServiceManager();
|
|
@@ -469,12 +470,19 @@ var WASMBundle = class {
|
|
|
469
470
|
}
|
|
470
471
|
/**
|
|
471
472
|
* Wait for WASM to be ready (use during initialization)
|
|
473
|
+
* Ensure WASM module is loaded before API calls
|
|
472
474
|
*/
|
|
473
475
|
async waitUntilReady() {
|
|
476
|
+
if (this.wasmLoaded && this.isReady()) {
|
|
477
|
+
return;
|
|
478
|
+
}
|
|
474
479
|
if (!this.wasmLoadPromise) {
|
|
475
480
|
throw new Error("WASM loading not started. Call loadWasm() first.");
|
|
476
481
|
}
|
|
477
482
|
await this.wasmLoadPromise;
|
|
483
|
+
if (!this.wasmLoaded || !this.isReady()) {
|
|
484
|
+
throw new Error("WASM module failed to load");
|
|
485
|
+
}
|
|
478
486
|
}
|
|
479
487
|
/**
|
|
480
488
|
* Load the WASM module asynchronously (singleton pattern)
|
|
@@ -484,13 +492,14 @@ var WASMBundle = class {
|
|
|
484
492
|
return this.wasmLoadPromise;
|
|
485
493
|
}
|
|
486
494
|
this.wasmLoadPromise = this.loadWASMModule(wasmPath);
|
|
487
|
-
|
|
495
|
+
await this.wasmLoadPromise;
|
|
496
|
+
this.wasmLoaded = true;
|
|
488
497
|
}
|
|
489
498
|
/**
|
|
490
499
|
* Get WASM method function by path
|
|
491
500
|
*/
|
|
492
501
|
getWasmMethod(methodPath) {
|
|
493
|
-
this.
|
|
502
|
+
this.ensureReady();
|
|
494
503
|
switch (this.config.apiStructure) {
|
|
495
504
|
case "namespaced":
|
|
496
505
|
const parts = methodPath.split(".");
|
|
@@ -601,7 +610,7 @@ var WASMBundle = class {
|
|
|
601
610
|
/**
|
|
602
611
|
* Ensure WASM module is loaded (synchronous version for service calls)
|
|
603
612
|
*/
|
|
604
|
-
|
|
613
|
+
ensureReady() {
|
|
605
614
|
if (!this.isReady()) {
|
|
606
615
|
throw new Error("WASM module not loaded. Call loadWasm() and waitUntilReady() first.");
|
|
607
616
|
}
|