@protoc-gen-go-wasmjs/runtime 0.0.32 → 0.0.33

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.
@@ -110,13 +110,21 @@ declare class WASMBundle {
110
110
  */
111
111
  getWasmMethod(methodPath: string): Function;
112
112
  /**
113
- * Internal method to call WASM functions with JSON conversion
113
+ * Call a synchronous WASM method that returns immediately.
114
+ * Used for SYNC invocation style methods.
114
115
  */
115
- callMethod<TRequest, TResponse>(methodPath: string, request: TRequest): Promise<TResponse>;
116
+ callMethodSync<TRequest, TResponse>(methodPath: string, request: TRequest): TResponse;
116
117
  /**
117
- * Internal method to call async WASM functions with callback
118
+ * Call a WASM method that returns a Promise.
119
+ * Used for PROMISE invocation style methods where Go returns a JS Promise.
118
120
  */
119
- callMethodWithCallback<TRequest>(methodPath: string, request: TRequest, callback: (response: any, error?: string) => void): Promise<void>;
121
+ callMethodAsync<TRequest, TResponse>(methodPath: string, request: TRequest): Promise<TResponse>;
122
+ /**
123
+ * Call a WASM method with callback for async operations.
124
+ * Used for CALLBACK invocation style methods.
125
+ * The callback is invoked by WASM when the operation completes.
126
+ */
127
+ callMethodWithCallback<TRequest>(methodPath: string, request: TRequest, callback: (response: any, error?: string) => void): void;
120
128
  /**
121
129
  * Internal method to call server streaming WASM functions
122
130
  */
@@ -155,13 +163,20 @@ declare abstract class ServiceClient {
155
163
  */
156
164
  waitUntilReady(): Promise<void>;
157
165
  /**
158
- * Call a synchronous WASM method
166
+ * Call a synchronous WASM method that returns immediately.
167
+ * Used for SYNC invocation style methods.
168
+ */
169
+ protected callMethodSync<TRequest, TResponse>(methodPath: string, request: TRequest): TResponse;
170
+ /**
171
+ * Call an async WASM method that returns a Promise.
172
+ * Used for PROMISE invocation style methods.
159
173
  */
160
- protected callMethod<TRequest, TResponse>(methodPath: string, request: TRequest): Promise<TResponse>;
174
+ protected callMethodAsync<TRequest, TResponse>(methodPath: string, request: TRequest): Promise<TResponse>;
161
175
  /**
162
- * Call an asynchronous WASM method with callback
176
+ * Call a WASM method with callback for async operations.
177
+ * Used for CALLBACK invocation style methods.
163
178
  */
164
- protected callMethodWithCallback<TRequest>(methodPath: string, request: TRequest, callback: (response: any, error?: string) => void): Promise<void>;
179
+ protected callMethodWithCallback<TRequest>(methodPath: string, request: TRequest, callback: (response: any, error?: string) => void): void;
165
180
  /**
166
181
  * Call a server streaming WASM method
167
182
  */
@@ -110,13 +110,21 @@ declare class WASMBundle {
110
110
  */
111
111
  getWasmMethod(methodPath: string): Function;
112
112
  /**
113
- * Internal method to call WASM functions with JSON conversion
113
+ * Call a synchronous WASM method that returns immediately.
114
+ * Used for SYNC invocation style methods.
114
115
  */
115
- callMethod<TRequest, TResponse>(methodPath: string, request: TRequest): Promise<TResponse>;
116
+ callMethodSync<TRequest, TResponse>(methodPath: string, request: TRequest): TResponse;
116
117
  /**
117
- * Internal method to call async WASM functions with callback
118
+ * Call a WASM method that returns a Promise.
119
+ * Used for PROMISE invocation style methods where Go returns a JS Promise.
118
120
  */
119
- callMethodWithCallback<TRequest>(methodPath: string, request: TRequest, callback: (response: any, error?: string) => void): Promise<void>;
121
+ callMethodAsync<TRequest, TResponse>(methodPath: string, request: TRequest): Promise<TResponse>;
122
+ /**
123
+ * Call a WASM method with callback for async operations.
124
+ * Used for CALLBACK invocation style methods.
125
+ * The callback is invoked by WASM when the operation completes.
126
+ */
127
+ callMethodWithCallback<TRequest>(methodPath: string, request: TRequest, callback: (response: any, error?: string) => void): void;
120
128
  /**
121
129
  * Internal method to call server streaming WASM functions
122
130
  */
@@ -155,13 +163,20 @@ declare abstract class ServiceClient {
155
163
  */
156
164
  waitUntilReady(): Promise<void>;
157
165
  /**
158
- * Call a synchronous WASM method
166
+ * Call a synchronous WASM method that returns immediately.
167
+ * Used for SYNC invocation style methods.
168
+ */
169
+ protected callMethodSync<TRequest, TResponse>(methodPath: string, request: TRequest): TResponse;
170
+ /**
171
+ * Call an async WASM method that returns a Promise.
172
+ * Used for PROMISE invocation style methods.
159
173
  */
160
- protected callMethod<TRequest, TResponse>(methodPath: string, request: TRequest): Promise<TResponse>;
174
+ protected callMethodAsync<TRequest, TResponse>(methodPath: string, request: TRequest): Promise<TResponse>;
161
175
  /**
162
- * Call an asynchronous WASM method with callback
176
+ * Call a WASM method with callback for async operations.
177
+ * Used for CALLBACK invocation style methods.
163
178
  */
164
- protected callMethodWithCallback<TRequest>(methodPath: string, request: TRequest, callback: (response: any, error?: string) => void): Promise<void>;
179
+ protected callMethodWithCallback<TRequest>(methodPath: string, request: TRequest, callback: (response: any, error?: string) => void): void;
165
180
  /**
166
181
  * Call a server streaming WASM method
167
182
  */
@@ -351,9 +351,10 @@ var WASMBundle = class {
351
351
  }
352
352
  }
353
353
  /**
354
- * Internal method to call WASM functions with JSON conversion
354
+ * Call a synchronous WASM method that returns immediately.
355
+ * Used for SYNC invocation style methods.
355
356
  */
356
- callMethod(methodPath, request) {
357
+ callMethodSync(methodPath, request) {
357
358
  try {
358
359
  const jsonReq = JSON.parse(JSON.stringify(request));
359
360
  const wasmMethod = this.getWasmMethod(methodPath);
@@ -373,7 +374,35 @@ var WASMBundle = class {
373
374
  }
374
375
  }
375
376
  /**
376
- * Internal method to call async WASM functions with callback
377
+ * Call a WASM method that returns a Promise.
378
+ * Used for PROMISE invocation style methods where Go returns a JS Promise.
379
+ */
380
+ callMethodAsync(methodPath, request) {
381
+ try {
382
+ const jsonReq = JSON.parse(JSON.stringify(request));
383
+ const wasmMethod = this.getWasmMethod(methodPath);
384
+ const wasmResponse = wasmMethod(JSON.stringify(jsonReq));
385
+ if (wasmResponse instanceof Promise) {
386
+ return wasmResponse;
387
+ }
388
+ if (!wasmResponse.success) {
389
+ return Promise.reject(new WasmError(wasmResponse.message, methodPath));
390
+ }
391
+ return Promise.resolve(wasmResponse.data);
392
+ } catch (error) {
393
+ if (error instanceof WasmError) {
394
+ return Promise.reject(error);
395
+ }
396
+ return Promise.reject(new WasmError(
397
+ `Call error: ${error instanceof Error ? error.message : String(error)}`,
398
+ methodPath
399
+ ));
400
+ }
401
+ }
402
+ /**
403
+ * Call a WASM method with callback for async operations.
404
+ * Used for CALLBACK invocation style methods.
405
+ * The callback is invoked by WASM when the operation completes.
377
406
  */
378
407
  callMethodWithCallback(methodPath, request, callback) {
379
408
  try {
@@ -383,7 +412,6 @@ var WASMBundle = class {
383
412
  if (!wasmResponse.success) {
384
413
  throw new WasmError(wasmResponse.message, methodPath);
385
414
  }
386
- return Promise.resolve();
387
415
  } catch (error) {
388
416
  if (error instanceof WasmError) {
389
417
  throw error;
@@ -538,16 +566,25 @@ var ServiceClient = class {
538
566
  return this.bundle.waitUntilReady();
539
567
  }
540
568
  /**
541
- * Call a synchronous WASM method
569
+ * Call a synchronous WASM method that returns immediately.
570
+ * Used for SYNC invocation style methods.
542
571
  */
543
- callMethod(methodPath, request) {
544
- return this.bundle.callMethod(methodPath, request);
572
+ callMethodSync(methodPath, request) {
573
+ return this.bundle.callMethodSync(methodPath, request);
574
+ }
575
+ /**
576
+ * Call an async WASM method that returns a Promise.
577
+ * Used for PROMISE invocation style methods.
578
+ */
579
+ callMethodAsync(methodPath, request) {
580
+ return this.bundle.callMethodAsync(methodPath, request);
545
581
  }
546
582
  /**
547
- * Call an asynchronous WASM method with callback
583
+ * Call a WASM method with callback for async operations.
584
+ * Used for CALLBACK invocation style methods.
548
585
  */
549
586
  callMethodWithCallback(methodPath, request, callback) {
550
- return this.bundle.callMethodWithCallback(methodPath, request, callback);
587
+ this.bundle.callMethodWithCallback(methodPath, request, callback);
551
588
  }
552
589
  /**
553
590
  * Call a server streaming WASM method
@@ -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 *\n * Manages browser service implementations that can be called from WASM.\n *\n * There are two calling patterns:\n *\n * 1. Synchronous: WASM calls __browserServices.ServiceName.methodName(request)\n * and receives the result directly. The JS function must return a value (not a Promise).\n *\n * 2. Asynchronous: WASM calls __wasmCallBrowserMethodAsync(service, method, request, callbackId)\n * and JS calls __wasmDeliverBrowserResponse(callbackId, response, error) when done.\n * This is for browser APIs that return Promises (fetch, IndexedDB, etc.)\n */\nexport class BrowserServiceManager {\n private serviceImplementations = new Map<string, any>();\n private initialized = false;\n\n constructor() {}\n\n /**\n * Register a browser service implementation.\n * The service object should have methods matching the proto service definition.\n *\n * Methods can be either:\n * - Synchronous: Return a value directly (for sync browser APIs)\n * - Asynchronous: Return a Promise (for async browser APIs like fetch)\n */\n registerService(name: string, implementation: any): void {\n this.serviceImplementations.set(name, implementation);\n this.updateBrowserServices();\n }\n\n /**\n * Initialize the browser service bridge.\n * This sets up the global functions that WASM uses to call browser services.\n */\n initialize(): void {\n if (this.initialized) return;\n this.initialized = true;\n\n // Set up the async method handler\n // WASM calls this for async browser methods (ones that return Promises)\n (window as any).__wasmCallBrowserMethodAsync = async (\n service: string,\n method: string,\n request: string,\n callbackId: string\n ) => {\n try {\n const impl = this.serviceImplementations.get(service);\n if (!impl) {\n this.deliverResponse(callbackId, null, `Service '${service}' not registered`);\n return;\n }\n\n // Convert method name to camelCase (e.g., \"getLocalStorage\" -> \"getLocalStorage\")\n const methodName = method.charAt(0).toLowerCase() + method.slice(1);\n const methodFunc = impl[methodName];\n if (!methodFunc) {\n this.deliverResponse(callbackId, null, `Method '${methodName}' not found on service '${service}'`);\n return;\n }\n\n // Parse request and call the method\n const requestObj = JSON.parse(request);\n const response = await Promise.resolve(methodFunc.call(impl, requestObj));\n\n // Deliver the response back to WASM\n this.deliverResponse(callbackId, JSON.stringify(response), null);\n } catch (error: any) {\n this.deliverResponse(callbackId, null, error.message || String(error));\n }\n };\n\n // Update the browser services object\n this.updateBrowserServices();\n }\n\n /**\n * Update the __browserServices global object with current registrations.\n * This is called automatically when services are registered.\n */\n private updateBrowserServices(): void {\n const browserServices: Record<string, any> = {};\n\n for (const [name, impl] of this.serviceImplementations) {\n const serviceProxy: Record<string, any> = {};\n\n // Get all methods from the implementation\n // Check both own properties and prototype chain\n const methodNames = this.getAllMethodNames(impl);\n\n for (const methodName of methodNames) {\n // Create a wrapper that handles sync calls\n serviceProxy[methodName] = (request: string): string => {\n try {\n const requestObj = JSON.parse(request);\n const result = impl[methodName](requestObj);\n\n // For sync methods, result should not be a Promise\n // If it is, this is a programming error - async methods should use\n // __wasmCallBrowserMethodAsync instead\n if (result instanceof Promise) {\n console.warn(\n `Method ${name}.${methodName} returned a Promise but was called synchronously. ` +\n `Mark this method as async in the proto definition.`\n );\n return JSON.stringify({ error: 'Method is async but called synchronously' });\n }\n\n return JSON.stringify(result);\n } catch (error: any) {\n return JSON.stringify({ error: error.message || String(error) });\n }\n };\n }\n\n browserServices[name] = serviceProxy;\n }\n\n (window as any).__browserServices = browserServices;\n }\n\n /**\n * Get all method names from an object, including prototype chain.\n */\n private getAllMethodNames(obj: any): string[] {\n const methods = new Set<string>();\n\n // Get own property names (for plain objects)\n for (const name of Object.keys(obj)) {\n if (typeof obj[name] === 'function') {\n methods.add(name);\n }\n }\n\n // Also check prototype chain (for class instances)\n let proto = Object.getPrototypeOf(obj);\n while (proto && proto !== Object.prototype) {\n for (const name of Object.getOwnPropertyNames(proto)) {\n if (name !== 'constructor' && typeof obj[name] === 'function') {\n methods.add(name);\n }\n }\n proto = Object.getPrototypeOf(proto);\n }\n\n return Array.from(methods);\n }\n\n /**\n * Deliver an async response back to WASM.\n */\n private deliverResponse(callbackId: string, response: string | null, error: string | null): void {\n if (typeof (window as any).__wasmDeliverBrowserResponse === 'function') {\n (window as any).__wasmDeliverBrowserResponse(callbackId, response, error);\n } else {\n console.error('__wasmDeliverBrowserResponse not available - WASM not initialized?');\n }\n }\n\n /**\n * Check if a service is registered.\n */\n hasService(name: string): boolean {\n return this.serviceImplementations.has(name);\n }\n\n /**\n * Get the number of registered services.\n */\n getServiceCount(): number {\n return this.serviceImplementations.size;\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 // Initialize browser service manager (sets up __browserServices and __wasmCallBrowserMethodAsync)\n if (this.browserServiceManager) {\n this.browserServiceManager.initialize();\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 *\n * Manages browser service implementations that can be called from WASM.\n *\n * There are two calling patterns:\n *\n * 1. Synchronous: WASM calls __browserServices.ServiceName.methodName(request)\n * and receives the result directly. The JS function must return a value (not a Promise).\n *\n * 2. Asynchronous: WASM calls __wasmCallBrowserMethodAsync(service, method, request, callbackId)\n * and JS calls __wasmDeliverBrowserResponse(callbackId, response, error) when done.\n * This is for browser APIs that return Promises (fetch, IndexedDB, etc.)\n */\nexport class BrowserServiceManager {\n private serviceImplementations = new Map<string, any>();\n private initialized = false;\n\n constructor() {}\n\n /**\n * Register a browser service implementation.\n * The service object should have methods matching the proto service definition.\n *\n * Methods can be either:\n * - Synchronous: Return a value directly (for sync browser APIs)\n * - Asynchronous: Return a Promise (for async browser APIs like fetch)\n */\n registerService(name: string, implementation: any): void {\n this.serviceImplementations.set(name, implementation);\n this.updateBrowserServices();\n }\n\n /**\n * Initialize the browser service bridge.\n * This sets up the global functions that WASM uses to call browser services.\n */\n initialize(): void {\n if (this.initialized) return;\n this.initialized = true;\n\n // Set up the async method handler\n // WASM calls this for async browser methods (ones that return Promises)\n (window as any).__wasmCallBrowserMethodAsync = async (\n service: string,\n method: string,\n request: string,\n callbackId: string\n ) => {\n try {\n const impl = this.serviceImplementations.get(service);\n if (!impl) {\n this.deliverResponse(callbackId, null, `Service '${service}' not registered`);\n return;\n }\n\n // Convert method name to camelCase (e.g., \"getLocalStorage\" -> \"getLocalStorage\")\n const methodName = method.charAt(0).toLowerCase() + method.slice(1);\n const methodFunc = impl[methodName];\n if (!methodFunc) {\n this.deliverResponse(callbackId, null, `Method '${methodName}' not found on service '${service}'`);\n return;\n }\n\n // Parse request and call the method\n const requestObj = JSON.parse(request);\n const response = await Promise.resolve(methodFunc.call(impl, requestObj));\n\n // Deliver the response back to WASM\n this.deliverResponse(callbackId, JSON.stringify(response), null);\n } catch (error: any) {\n this.deliverResponse(callbackId, null, error.message || String(error));\n }\n };\n\n // Update the browser services object\n this.updateBrowserServices();\n }\n\n /**\n * Update the __browserServices global object with current registrations.\n * This is called automatically when services are registered.\n */\n private updateBrowserServices(): void {\n const browserServices: Record<string, any> = {};\n\n for (const [name, impl] of this.serviceImplementations) {\n const serviceProxy: Record<string, any> = {};\n\n // Get all methods from the implementation\n // Check both own properties and prototype chain\n const methodNames = this.getAllMethodNames(impl);\n\n for (const methodName of methodNames) {\n // Create a wrapper that handles sync calls\n serviceProxy[methodName] = (request: string): string => {\n try {\n const requestObj = JSON.parse(request);\n const result = impl[methodName](requestObj);\n\n // For sync methods, result should not be a Promise\n // If it is, this is a programming error - async methods should use\n // __wasmCallBrowserMethodAsync instead\n if (result instanceof Promise) {\n console.warn(\n `Method ${name}.${methodName} returned a Promise but was called synchronously. ` +\n `Mark this method as async in the proto definition.`\n );\n return JSON.stringify({ error: 'Method is async but called synchronously' });\n }\n\n return JSON.stringify(result);\n } catch (error: any) {\n return JSON.stringify({ error: error.message || String(error) });\n }\n };\n }\n\n browserServices[name] = serviceProxy;\n }\n\n (window as any).__browserServices = browserServices;\n }\n\n /**\n * Get all method names from an object, including prototype chain.\n */\n private getAllMethodNames(obj: any): string[] {\n const methods = new Set<string>();\n\n // Get own property names (for plain objects)\n for (const name of Object.keys(obj)) {\n if (typeof obj[name] === 'function') {\n methods.add(name);\n }\n }\n\n // Also check prototype chain (for class instances)\n let proto = Object.getPrototypeOf(obj);\n while (proto && proto !== Object.prototype) {\n for (const name of Object.getOwnPropertyNames(proto)) {\n if (name !== 'constructor' && typeof obj[name] === 'function') {\n methods.add(name);\n }\n }\n proto = Object.getPrototypeOf(proto);\n }\n\n return Array.from(methods);\n }\n\n /**\n * Deliver an async response back to WASM.\n */\n private deliverResponse(callbackId: string, response: string | null, error: string | null): void {\n if (typeof (window as any).__wasmDeliverBrowserResponse === 'function') {\n (window as any).__wasmDeliverBrowserResponse(callbackId, response, error);\n } else {\n console.error('__wasmDeliverBrowserResponse not available - WASM not initialized?');\n }\n }\n\n /**\n * Check if a service is registered.\n */\n hasService(name: string): boolean {\n return this.serviceImplementations.has(name);\n }\n\n /**\n * Get the number of registered services.\n */\n getServiceCount(): number {\n return this.serviceImplementations.size;\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 * Call a synchronous WASM method that returns immediately.\n * Used for SYNC invocation style methods.\n */\n public callMethodSync<TRequest, TResponse>(\n methodPath: string,\n request: TRequest\n ): 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 (synchronously)\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 * Call a WASM method that returns a Promise.\n * Used for PROMISE invocation style methods where Go returns a JS Promise.\n */\n public callMethodAsync<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 the WASM method returns a Promise directly (PROMISE invocation style),\n // return it as-is. Otherwise, it's the legacy wrapped format.\n if (wasmResponse instanceof Promise) {\n return wasmResponse;\n }\n\n // Legacy format: {success, message, data}\n if (!wasmResponse.success) {\n return Promise.reject(new WasmError(wasmResponse.message, methodPath));\n }\n\n // Return response data wrapped in a resolved Promise\n return Promise.resolve(wasmResponse.data);\n } catch (error) {\n if (error instanceof WasmError) {\n return Promise.reject(error);\n }\n return Promise.reject(new WasmError(\n `Call error: ${error instanceof Error ? error.message : String(error)}`,\n methodPath\n ));\n }\n }\n\n /**\n * Call a WASM method with callback for async operations.\n * Used for CALLBACK invocation style methods.\n * The callback is invoked by WASM when the operation completes.\n */\n public callMethodWithCallback<TRequest>(\n methodPath: string,\n request: TRequest,\n callback: (response: any, error?: string) => void\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 // 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 // Callback methods return immediately - WASM will invoke callback later\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 // Initialize browser service manager (sets up __browserServices and __wasmCallBrowserMethodAsync)\n if (this.browserServiceManager) {\n this.browserServiceManager.initialize();\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 that returns immediately.\n * Used for SYNC invocation style methods.\n */\n protected callMethodSync<TRequest, TResponse>(\n methodPath: string,\n request: TRequest\n ): TResponse {\n return this.bundle.callMethodSync(methodPath, request);\n }\n\n /**\n * Call an async WASM method that returns a Promise.\n * Used for PROMISE invocation style methods.\n */\n protected callMethodAsync<TRequest, TResponse>(\n methodPath: string,\n request: TRequest\n ): Promise<TResponse> {\n return this.bundle.callMethodAsync(methodPath, request);\n }\n\n /**\n * Call a WASM method with callback for async operations.\n * Used for CALLBACK invocation style methods.\n */\n protected callMethodWithCallback<TRequest>(\n methodPath: string,\n request: TRequest,\n callback: (response: any, error?: string) => void\n ): void {\n 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"]}
@@ -349,9 +349,10 @@ var WASMBundle = class {
349
349
  }
350
350
  }
351
351
  /**
352
- * Internal method to call WASM functions with JSON conversion
352
+ * Call a synchronous WASM method that returns immediately.
353
+ * Used for SYNC invocation style methods.
353
354
  */
354
- callMethod(methodPath, request) {
355
+ callMethodSync(methodPath, request) {
355
356
  try {
356
357
  const jsonReq = JSON.parse(JSON.stringify(request));
357
358
  const wasmMethod = this.getWasmMethod(methodPath);
@@ -371,7 +372,35 @@ var WASMBundle = class {
371
372
  }
372
373
  }
373
374
  /**
374
- * Internal method to call async WASM functions with callback
375
+ * Call a WASM method that returns a Promise.
376
+ * Used for PROMISE invocation style methods where Go returns a JS Promise.
377
+ */
378
+ callMethodAsync(methodPath, request) {
379
+ try {
380
+ const jsonReq = JSON.parse(JSON.stringify(request));
381
+ const wasmMethod = this.getWasmMethod(methodPath);
382
+ const wasmResponse = wasmMethod(JSON.stringify(jsonReq));
383
+ if (wasmResponse instanceof Promise) {
384
+ return wasmResponse;
385
+ }
386
+ if (!wasmResponse.success) {
387
+ return Promise.reject(new WasmError(wasmResponse.message, methodPath));
388
+ }
389
+ return Promise.resolve(wasmResponse.data);
390
+ } catch (error) {
391
+ if (error instanceof WasmError) {
392
+ return Promise.reject(error);
393
+ }
394
+ return Promise.reject(new WasmError(
395
+ `Call error: ${error instanceof Error ? error.message : String(error)}`,
396
+ methodPath
397
+ ));
398
+ }
399
+ }
400
+ /**
401
+ * Call a WASM method with callback for async operations.
402
+ * Used for CALLBACK invocation style methods.
403
+ * The callback is invoked by WASM when the operation completes.
375
404
  */
376
405
  callMethodWithCallback(methodPath, request, callback) {
377
406
  try {
@@ -381,7 +410,6 @@ var WASMBundle = class {
381
410
  if (!wasmResponse.success) {
382
411
  throw new WasmError(wasmResponse.message, methodPath);
383
412
  }
384
- return Promise.resolve();
385
413
  } catch (error) {
386
414
  if (error instanceof WasmError) {
387
415
  throw error;
@@ -536,16 +564,25 @@ var ServiceClient = class {
536
564
  return this.bundle.waitUntilReady();
537
565
  }
538
566
  /**
539
- * Call a synchronous WASM method
567
+ * Call a synchronous WASM method that returns immediately.
568
+ * Used for SYNC invocation style methods.
540
569
  */
541
- callMethod(methodPath, request) {
542
- return this.bundle.callMethod(methodPath, request);
570
+ callMethodSync(methodPath, request) {
571
+ return this.bundle.callMethodSync(methodPath, request);
572
+ }
573
+ /**
574
+ * Call an async WASM method that returns a Promise.
575
+ * Used for PROMISE invocation style methods.
576
+ */
577
+ callMethodAsync(methodPath, request) {
578
+ return this.bundle.callMethodAsync(methodPath, request);
543
579
  }
544
580
  /**
545
- * Call an asynchronous WASM method with callback
581
+ * Call a WASM method with callback for async operations.
582
+ * Used for CALLBACK invocation style methods.
546
583
  */
547
584
  callMethodWithCallback(methodPath, request, callback) {
548
- return this.bundle.callMethodWithCallback(methodPath, request, callback);
585
+ this.bundle.callMethodWithCallback(methodPath, request, callback);
549
586
  }
550
587
  /**
551
588
  * Call a server streaming WASM method