@protoc-gen-go-wasmjs/runtime 0.0.25 → 0.0.27

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/index.d.mts CHANGED
@@ -1,5 +1,5 @@
1
1
  export { BrowserServiceManager } from './browser/index.mjs';
2
- export { BaseDeserializer, BaseSchemaRegistry, FieldSchema, FieldType, MessageSchema } from './schema/index.mjs';
2
+ export { BaseDeserializer, BaseSchemaRegistry, FieldSchema, FieldType, MessageSchema, MessageTypeConstructor, MessageTypeProvider } from './schema/index.mjs';
3
3
  export { ServiceClient, WASMBundle, WASMBundleConfig, WASMResponse, WASMServiceClient, WasmError } from './client/index.mjs';
4
4
  export { b as FactoryInterface, a as FactoryMethod, F as FactoryResult } from './factory-DqksufjU.mjs';
5
5
  export { ChangeTransport, MessagePatch, PatchBatch, PatchOperation, PatchResponse, PatchSource } from './types/index.mjs';
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  export { BrowserServiceManager } from './browser/index.js';
2
- export { BaseDeserializer, BaseSchemaRegistry, FieldSchema, FieldType, MessageSchema } from './schema/index.js';
2
+ export { BaseDeserializer, BaseSchemaRegistry, FieldSchema, FieldType, MessageSchema, MessageTypeConstructor, MessageTypeProvider } from './schema/index.js';
3
3
  export { ServiceClient, WASMBundle, WASMBundleConfig, WASMResponse, WASMServiceClient, WasmError } from './client/index.js';
4
4
  export { b as FactoryInterface, a as FactoryMethod, F as FactoryResult } from './factory-DqksufjU.js';
5
5
  export { ChangeTransport, MessagePatch, PatchBatch, PatchOperation, PatchResponse, PatchSource } from './types/index.js';
package/dist/index.js CHANGED
@@ -239,6 +239,20 @@ var BaseDeserializer = class {
239
239
  }
240
240
  return instance;
241
241
  }
242
+ /**
243
+ * Static utility method - infers messageType from type parameter
244
+ * @param typeConstructor Class with static MESSAGE_TYPE field
245
+ * @param data Raw data to deserialize
246
+ * @returns Deserialized instance or null if creation failed
247
+ *
248
+ * @example
249
+ * const user = Deserializer.from(User, rawData);
250
+ * // Instead of: Deserializer.from<User>(User.MESSAGE_TYPE, rawData)
251
+ */
252
+ fromType(typeConstructor, data) {
253
+ const messageType = typeConstructor.MESSAGE_TYPE;
254
+ return this.createAndDeserialize(messageType, data);
255
+ }
242
256
  /**
243
257
  * Create and deserialize a new instance of a message type
244
258
  */
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/browser/service-manager.ts","../src/schema/types.ts","../src/schema/base-deserializer.ts","../src/schema/base-registry.ts","../src/client/types.ts","../src/client/base-client.ts","../src/client/wasm-bundle.ts","../src/client/service-client.ts","../src/types/patches.ts"],"names":["FieldType","PatchOperation","PatchSource"],"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 * 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\n/**\n * Field type enumeration for proto field types\n */\nexport enum FieldType {\n STRING = \"string\",\n NUMBER = \"number\", \n BOOLEAN = \"boolean\",\n MESSAGE = \"message\",\n REPEATED = \"repeated\",\n MAP = \"map\",\n ONEOF = \"oneof\"\n}\n\n/**\n * Schema interface for field definitions\n */\nexport interface FieldSchema {\n name: string;\n type: FieldType;\n id: number; // Proto field number (e.g., text_query = 1)\n messageType?: string; // For MESSAGE type fields\n repeated?: boolean; // For array fields\n mapKeyType?: FieldType; // For MAP type fields\n mapValueType?: FieldType | string; // For MAP type fields\n oneofGroup?: string; // For ONEOF fields\n optional?: boolean;\n}\n\n/**\n * Message schema interface\n */\nexport interface MessageSchema {\n name: string;\n fields: FieldSchema[];\n oneofGroups?: string[]; // List of oneof group names\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 { FieldType, FieldSchema, MessageSchema } from './types.js';\nimport { FactoryInterface, FactoryResult } from '../types/factory.js';\n\n/**\n * Base deserializer class containing all non-template-dependent logic\n */\nexport abstract class BaseDeserializer {\n protected constructor(\n protected schemaRegistry: Record<string, MessageSchema>,\n protected factory: FactoryInterface\n ) {}\n\n /**\n * Deserialize an object using schema information\n * @param instance The target instance to populate\n * @param data The source data to deserialize from\n * @param messageType The fully qualified message type (e.g., \"library.v1.Book\")\n * @returns The populated instance\n */\n deserialize<T>(instance: T, data: any, messageType: string): T {\n if (!data || typeof data !== 'object') {\n return instance;\n }\n\n const schema = this.schemaRegistry[messageType];\n if (!schema) {\n // Fallback to simple property copying if no schema found\n return this.fallbackDeserialize(instance, data);\n }\n\n // Process each field according to its schema\n for (const fieldSchema of schema.fields) {\n const fieldValue = data[fieldSchema.name];\n if (fieldValue === null || fieldValue === undefined) {\n continue;\n }\n\n this.deserializeField(instance, fieldSchema, fieldValue);\n }\n\n return instance;\n }\n\n /**\n * Deserialize a single field based on its schema\n */\n protected deserializeField(instance: any, fieldSchema: FieldSchema, fieldValue: any): void {\n const fieldName = fieldSchema.name;\n\n switch (fieldSchema.type) {\n case FieldType.STRING:\n case FieldType.NUMBER:\n case FieldType.BOOLEAN:\n // Simple primitive types - direct assignment\n instance[fieldName] = fieldValue;\n break;\n\n case FieldType.MESSAGE:\n if (fieldSchema.repeated) {\n // Handle repeated message fields (arrays)\n instance[fieldName] = this.deserializeMessageArray(\n fieldValue,\n fieldSchema.messageType!,\n instance,\n fieldName\n );\n } else {\n // Handle single message field\n instance[fieldName] = this.deserializeMessageField(\n fieldValue,\n fieldSchema.messageType!,\n instance,\n fieldName\n );\n }\n break;\n\n case FieldType.REPEATED:\n // Handle repeated primitive fields\n if (Array.isArray(fieldValue)) {\n instance[fieldName] = [...fieldValue]; // Simple copy for primitives\n }\n break;\n\n case FieldType.ONEOF:\n // Handle oneof fields (would need additional logic for union types)\n instance[fieldName] = fieldValue;\n break;\n\n case FieldType.MAP:\n // Handle map fields (would need additional schema info for key/value types)\n instance[fieldName] = { ...fieldValue };\n break;\n\n default:\n // Fallback to direct assignment\n instance[fieldName] = fieldValue;\n break;\n }\n }\n\n /**\n * Deserialize a single message field\n */\n protected deserializeMessageField(\n fieldValue: any,\n messageType: string,\n parent: any,\n attributeName: string\n ): any {\n // Try to get factory method using cross-package delegation\n let factoryMethod;\n \n if (this.factory.getFactoryMethod) {\n factoryMethod = this.factory.getFactoryMethod(messageType);\n } else {\n // Fallback to simple method name lookup\n const factoryMethodName = this.getFactoryMethodName(messageType);\n factoryMethod = (this.factory as any)[factoryMethodName];\n }\n\n if (factoryMethod) {\n const result = factoryMethod(parent, attributeName, undefined, fieldValue);\n if (result.fullyLoaded) {\n return result.instance;\n } else {\n // Factory created instance but didn't populate - use deserializer\n return this.deserialize(result.instance, fieldValue, messageType);\n }\n }\n\n // No factory method found - fallback\n return this.fallbackDeserialize({}, fieldValue);\n }\n\n /**\n * Deserialize an array of message objects\n */\n protected deserializeMessageArray(\n fieldValue: any[],\n messageType: string,\n parent: any,\n attributeName: string\n ): any[] {\n if (!Array.isArray(fieldValue)) {\n return [];\n }\n\n // Try to get factory method using cross-package delegation\n let factoryMethod;\n \n if (this.factory.getFactoryMethod) {\n factoryMethod = this.factory.getFactoryMethod(messageType);\n } else {\n // Fallback to simple method name lookup\n const factoryMethodName = this.getFactoryMethodName(messageType);\n factoryMethod = (this.factory as any)[factoryMethodName];\n }\n\n return fieldValue.map((item, index) => {\n if (factoryMethod) {\n const result = factoryMethod(parent, attributeName, index, item);\n if (result.fullyLoaded) {\n return result.instance;\n } else {\n // Factory created instance but didn't populate - use deserializer\n return this.deserialize(result.instance, item, messageType);\n }\n }\n\n // No factory method found - fallback\n return this.fallbackDeserialize({}, item);\n });\n }\n\n /**\n * Convert message type to factory method name\n * \"library.v1.Book\" -> \"newBook\"\n */\n protected getFactoryMethodName(messageType: string): string {\n const parts = messageType.split('.');\n const typeName = parts[parts.length - 1]; // Get last part (e.g., \"Book\")\n return 'new' + typeName;\n }\n\n /**\n * Fallback deserializer for when no schema is available\n */\n protected fallbackDeserialize<T>(instance: T, data: any): T {\n if (!data || typeof data !== 'object') {\n return instance;\n }\n\n for (const [key, value] of Object.entries(data)) {\n if (value !== null && value !== undefined) {\n (instance as any)[key] = value;\n }\n }\n\n return instance;\n }\n\n /**\n * Create and deserialize a new instance of a message type\n */\n createAndDeserialize<T>(messageType: string, data: any): T {\n // Try to get factory method using cross-package delegation\n let factoryMethod;\n \n if (this.factory.getFactoryMethod) {\n factoryMethod = this.factory.getFactoryMethod(messageType);\n } else {\n // Fallback to simple method name lookup\n const factoryMethodName = this.getFactoryMethodName(messageType);\n factoryMethod = (this.factory as any)[factoryMethodName];\n }\n\n if (!factoryMethod) {\n throw new Error(`Could not find factory method to deserialize: ${messageType}`)\n }\n\n const result = factoryMethod(undefined, undefined, undefined, data);\n if (result.fullyLoaded) {\n return result.instance;\n } else {\n return this.deserialize(result.instance, data, messageType);\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 { FieldSchema, MessageSchema } from './types.js';\n\n/**\n * Base schema registry with utility methods for schema operations\n */\nexport class BaseSchemaRegistry {\n constructor(protected schemaRegistry: Record<string, MessageSchema>) {}\n\n /**\n * Get schema for a message type\n */\n getSchema(messageType: string): MessageSchema | undefined {\n return this.schemaRegistry[messageType];\n }\n\n /**\n * Get field schema by name\n */\n getFieldSchema(messageType: string, fieldName: string): FieldSchema | undefined {\n const schema = this.getSchema(messageType);\n return schema?.fields.find(field => field.name === fieldName);\n }\n\n /**\n * Get field schema by proto field ID\n */\n getFieldSchemaById(messageType: string, fieldId: number): FieldSchema | undefined {\n const schema = this.getSchema(messageType);\n return schema?.fields.find(field => field.id === fieldId);\n }\n\n /**\n * Check if field is part of a oneof group\n */\n isOneofField(messageType: string, fieldName: string): boolean {\n const fieldSchema = this.getFieldSchema(messageType, fieldName);\n return fieldSchema?.oneofGroup !== undefined;\n }\n\n /**\n * Get all fields in a oneof group\n */\n getOneofFields(messageType: string, oneofGroup: string): FieldSchema[] {\n const schema = this.getSchema(messageType);\n return schema?.fields.filter(field => field.oneofGroup === oneofGroup) || [];\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 * 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\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","// 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 * Patch operations for modifying protobuf message fields\n */\nexport enum PatchOperation {\n SET = 'SET',\n INSERT_LIST = 'INSERT_LIST',\n REMOVE_LIST = 'REMOVE_LIST',\n MOVE_LIST = 'MOVE_LIST',\n INSERT_MAP = 'INSERT_MAP',\n REMOVE_MAP = 'REMOVE_MAP',\n CLEAR_LIST = 'CLEAR_LIST',\n CLEAR_MAP = 'CLEAR_MAP',\n}\n\n/**\n * A single patch operation on a protobuf message field\n */\nexport interface MessagePatch {\n /** The type of operation to perform */\n operation: PatchOperation;\n \n /** Path to the field being modified (e.g., \"players[2].name\", \"places['tile_123'].latitude\") */\n fieldPath: string;\n \n /** The new value to set (for SET, INSERT_LIST, INSERT_MAP operations) */\n value?: any;\n \n /** Index for list operations (INSERT_LIST, REMOVE_LIST, MOVE_LIST) */\n index?: number;\n \n /** Map key for map operations (INSERT_MAP, REMOVE_MAP) */\n key?: string;\n \n /** Source index for MOVE_LIST operations */\n oldIndex?: number;\n \n /** Monotonically increasing change number for ordering */\n changeNumber: number;\n \n /** Timestamp when the change was created (microseconds since epoch) */\n timestamp: number;\n \n /** Optional user ID who made the change (for conflict resolution) */\n userId?: string;\n \n /** Optional transaction ID to group related patches */\n transactionId?: string;\n}\n\n/**\n * A batch of patches applied to a single entity\n */\nexport interface PatchBatch {\n /** The fully qualified protobuf message type (e.g., \"example.Game\") */\n messageType: string;\n \n /** The unique identifier of the entity being modified */\n entityId: string;\n \n /** List of patches to apply in order */\n patches: MessagePatch[];\n \n /** The highest change number in this batch */\n changeNumber: number;\n \n /** Source of the changes */\n source: PatchSource;\n \n /** Optional metadata about the batch */\n metadata?: Record<string, string>;\n}\n\n/**\n * Source of patch changes\n */\nexport enum PatchSource {\n LOCAL = 'LOCAL',\n REMOTE = 'REMOTE', \n SERVER = 'SERVER',\n STORAGE = 'STORAGE',\n}\n\n/**\n * Response message for methods that return patches\n */\nexport interface PatchResponse {\n /** The patches to apply */\n patchBatches: PatchBatch[];\n \n /** Success status */\n success: boolean;\n \n /** Error message if success is false */\n errorMessage?: string;\n \n /** The new change number after applying these patches */\n newChangeNumber: number;\n}\n\n/**\n * Transport interface for receiving patch updates\n */\nexport interface ChangeTransport {\n /** Register callback for incoming changes */\n onChanges(callback: (batches: PatchBatch[]) => void): void;\n \n /** Disconnect from the transport */\n disconnect(): void;\n}\n"]}
1
+ {"version":3,"sources":["../src/browser/service-manager.ts","../src/schema/types.ts","../src/schema/base-deserializer.ts","../src/schema/base-registry.ts","../src/client/types.ts","../src/client/base-client.ts","../src/client/wasm-bundle.ts","../src/client/service-client.ts","../src/types/patches.ts"],"names":["FieldType","PatchOperation","PatchSource"],"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 * 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\n/**\n * Field type enumeration for proto field types\n */\nexport enum FieldType {\n STRING = \"string\",\n NUMBER = \"number\", \n BOOLEAN = \"boolean\",\n MESSAGE = \"message\",\n REPEATED = \"repeated\",\n MAP = \"map\",\n ONEOF = \"oneof\"\n}\n\n/**\n * Schema interface for field definitions\n */\nexport interface FieldSchema {\n name: string;\n type: FieldType;\n id: number; // Proto field number (e.g., text_query = 1)\n messageType?: string; // For MESSAGE type fields\n repeated?: boolean; // For array fields\n mapKeyType?: FieldType; // For MAP type fields\n mapValueType?: FieldType | string; // For MAP type fields\n oneofGroup?: string; // For ONEOF fields\n optional?: boolean;\n}\n\n/**\n * Message schema interface\n */\nexport interface MessageSchema {\n name: string;\n fields: FieldSchema[];\n oneofGroups?: string[]; // List of oneof group names\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 { FieldType, FieldSchema, MessageSchema } from './types.js';\nimport { FactoryInterface, FactoryResult } from '../types/factory.js';\n\n/**\n * Interface for types that have a static MESSAGE_TYPE field\n * This allows us to infer the message type from the class itself\n */\nexport interface MessageTypeProvider {\n readonly MESSAGE_TYPE: string;\n}\n\n/**\n * Constructor type that provides MESSAGE_TYPE\n * Used as a constraint for generic deserialization\n */\nexport type MessageTypeConstructor<T> = {\n new(...args: any[]): T;\n readonly MESSAGE_TYPE: string;\n};\n\n\n/**\n * Base deserializer class containing all non-template-dependent logic\n */\nexport abstract class BaseDeserializer {\n protected constructor(\n protected schemaRegistry: Record<string, MessageSchema>,\n protected factory: FactoryInterface\n ) {}\n\n /**\n * Deserialize an object using schema information\n * @param instance The target instance to populate\n * @param data The source data to deserialize from\n * @param messageType The fully qualified message type (e.g., \"library.v1.Book\")\n * @returns The populated instance\n */\n deserialize<T>(instance: T, data: any, messageType: string): T {\n if (!data || typeof data !== 'object') {\n return instance;\n }\n\n const schema = this.schemaRegistry[messageType];\n if (!schema) {\n // Fallback to simple property copying if no schema found\n return this.fallbackDeserialize(instance, data);\n }\n\n // Process each field according to its schema\n for (const fieldSchema of schema.fields) {\n const fieldValue = data[fieldSchema.name];\n if (fieldValue === null || fieldValue === undefined) {\n continue;\n }\n\n this.deserializeField(instance, fieldSchema, fieldValue);\n }\n\n return instance;\n }\n\n /**\n * Deserialize a single field based on its schema\n */\n protected deserializeField(instance: any, fieldSchema: FieldSchema, fieldValue: any): void {\n const fieldName = fieldSchema.name;\n\n switch (fieldSchema.type) {\n case FieldType.STRING:\n case FieldType.NUMBER:\n case FieldType.BOOLEAN:\n // Simple primitive types - direct assignment\n instance[fieldName] = fieldValue;\n break;\n\n case FieldType.MESSAGE:\n if (fieldSchema.repeated) {\n // Handle repeated message fields (arrays)\n instance[fieldName] = this.deserializeMessageArray(\n fieldValue,\n fieldSchema.messageType!,\n instance,\n fieldName\n );\n } else {\n // Handle single message field\n instance[fieldName] = this.deserializeMessageField(\n fieldValue,\n fieldSchema.messageType!,\n instance,\n fieldName\n );\n }\n break;\n\n case FieldType.REPEATED:\n // Handle repeated primitive fields\n if (Array.isArray(fieldValue)) {\n instance[fieldName] = [...fieldValue]; // Simple copy for primitives\n }\n break;\n\n case FieldType.ONEOF:\n // Handle oneof fields (would need additional logic for union types)\n instance[fieldName] = fieldValue;\n break;\n\n case FieldType.MAP:\n // Handle map fields (would need additional schema info for key/value types)\n instance[fieldName] = { ...fieldValue };\n break;\n\n default:\n // Fallback to direct assignment\n instance[fieldName] = fieldValue;\n break;\n }\n }\n\n /**\n * Deserialize a single message field\n */\n protected deserializeMessageField(\n fieldValue: any,\n messageType: string,\n parent: any,\n attributeName: string\n ): any {\n // Try to get factory method using cross-package delegation\n let factoryMethod;\n \n if (this.factory.getFactoryMethod) {\n factoryMethod = this.factory.getFactoryMethod(messageType);\n } else {\n // Fallback to simple method name lookup\n const factoryMethodName = this.getFactoryMethodName(messageType);\n factoryMethod = (this.factory as any)[factoryMethodName];\n }\n\n if (factoryMethod) {\n const result = factoryMethod(parent, attributeName, undefined, fieldValue);\n if (result.fullyLoaded) {\n return result.instance;\n } else {\n // Factory created instance but didn't populate - use deserializer\n return this.deserialize(result.instance, fieldValue, messageType);\n }\n }\n\n // No factory method found - fallback\n return this.fallbackDeserialize({}, fieldValue);\n }\n\n /**\n * Deserialize an array of message objects\n */\n protected deserializeMessageArray(\n fieldValue: any[],\n messageType: string,\n parent: any,\n attributeName: string\n ): any[] {\n if (!Array.isArray(fieldValue)) {\n return [];\n }\n\n // Try to get factory method using cross-package delegation\n let factoryMethod;\n \n if (this.factory.getFactoryMethod) {\n factoryMethod = this.factory.getFactoryMethod(messageType);\n } else {\n // Fallback to simple method name lookup\n const factoryMethodName = this.getFactoryMethodName(messageType);\n factoryMethod = (this.factory as any)[factoryMethodName];\n }\n\n return fieldValue.map((item, index) => {\n if (factoryMethod) {\n const result = factoryMethod(parent, attributeName, index, item);\n if (result.fullyLoaded) {\n return result.instance;\n } else {\n // Factory created instance but didn't populate - use deserializer\n return this.deserialize(result.instance, item, messageType);\n }\n }\n\n // No factory method found - fallback\n return this.fallbackDeserialize({}, item);\n });\n }\n\n /**\n * Convert message type to factory method name\n * \"library.v1.Book\" -> \"newBook\"\n */\n protected getFactoryMethodName(messageType: string): string {\n const parts = messageType.split('.');\n const typeName = parts[parts.length - 1]; // Get last part (e.g., \"Book\")\n return 'new' + typeName;\n }\n\n /**\n * Fallback deserializer for when no schema is available\n */\n protected fallbackDeserialize<T>(instance: T, data: any): T {\n if (!data || typeof data !== 'object') {\n return instance;\n }\n\n for (const [key, value] of Object.entries(data)) {\n if (value !== null && value !== undefined) {\n (instance as any)[key] = value;\n }\n }\n\n return instance;\n }\n\n\n /**\n * Static utility method - infers messageType from type parameter\n * @param typeConstructor Class with static MESSAGE_TYPE field\n * @param data Raw data to deserialize\n * @returns Deserialized instance or null if creation failed\n *\n * @example\n * const user = Deserializer.from(User, rawData);\n * // Instead of: Deserializer.from<User>(User.MESSAGE_TYPE, rawData)\n */\n fromType<T>(\n typeConstructor: MessageTypeConstructor<T>,\n data: any\n ): T | null {\n const messageType = typeConstructor.MESSAGE_TYPE;\n return this.createAndDeserialize<T>(messageType, data);\n }\n\n\n /**\n * Create and deserialize a new instance of a message type\n */\n createAndDeserialize<T>(messageType: string, data: any): T {\n // Try to get factory method using cross-package delegation\n let factoryMethod;\n \n if (this.factory.getFactoryMethod) {\n factoryMethod = this.factory.getFactoryMethod(messageType);\n } else {\n // Fallback to simple method name lookup\n const factoryMethodName = this.getFactoryMethodName(messageType);\n factoryMethod = (this.factory as any)[factoryMethodName];\n }\n\n if (!factoryMethod) {\n throw new Error(`Could not find factory method to deserialize: ${messageType}`)\n }\n\n const result = factoryMethod(undefined, undefined, undefined, data);\n if (result.fullyLoaded) {\n return result.instance;\n } else {\n return this.deserialize(result.instance, data, messageType);\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 { FieldSchema, MessageSchema } from './types.js';\n\n/**\n * Base schema registry with utility methods for schema operations\n */\nexport class BaseSchemaRegistry {\n constructor(protected schemaRegistry: Record<string, MessageSchema>) {}\n\n /**\n * Get schema for a message type\n */\n getSchema(messageType: string): MessageSchema | undefined {\n return this.schemaRegistry[messageType];\n }\n\n /**\n * Get field schema by name\n */\n getFieldSchema(messageType: string, fieldName: string): FieldSchema | undefined {\n const schema = this.getSchema(messageType);\n return schema?.fields.find(field => field.name === fieldName);\n }\n\n /**\n * Get field schema by proto field ID\n */\n getFieldSchemaById(messageType: string, fieldId: number): FieldSchema | undefined {\n const schema = this.getSchema(messageType);\n return schema?.fields.find(field => field.id === fieldId);\n }\n\n /**\n * Check if field is part of a oneof group\n */\n isOneofField(messageType: string, fieldName: string): boolean {\n const fieldSchema = this.getFieldSchema(messageType, fieldName);\n return fieldSchema?.oneofGroup !== undefined;\n }\n\n /**\n * Get all fields in a oneof group\n */\n getOneofFields(messageType: string, oneofGroup: string): FieldSchema[] {\n const schema = this.getSchema(messageType);\n return schema?.fields.filter(field => field.oneofGroup === oneofGroup) || [];\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 * 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\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","// 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 * Patch operations for modifying protobuf message fields\n */\nexport enum PatchOperation {\n SET = 'SET',\n INSERT_LIST = 'INSERT_LIST',\n REMOVE_LIST = 'REMOVE_LIST',\n MOVE_LIST = 'MOVE_LIST',\n INSERT_MAP = 'INSERT_MAP',\n REMOVE_MAP = 'REMOVE_MAP',\n CLEAR_LIST = 'CLEAR_LIST',\n CLEAR_MAP = 'CLEAR_MAP',\n}\n\n/**\n * A single patch operation on a protobuf message field\n */\nexport interface MessagePatch {\n /** The type of operation to perform */\n operation: PatchOperation;\n \n /** Path to the field being modified (e.g., \"players[2].name\", \"places['tile_123'].latitude\") */\n fieldPath: string;\n \n /** The new value to set (for SET, INSERT_LIST, INSERT_MAP operations) */\n value?: any;\n \n /** Index for list operations (INSERT_LIST, REMOVE_LIST, MOVE_LIST) */\n index?: number;\n \n /** Map key for map operations (INSERT_MAP, REMOVE_MAP) */\n key?: string;\n \n /** Source index for MOVE_LIST operations */\n oldIndex?: number;\n \n /** Monotonically increasing change number for ordering */\n changeNumber: number;\n \n /** Timestamp when the change was created (microseconds since epoch) */\n timestamp: number;\n \n /** Optional user ID who made the change (for conflict resolution) */\n userId?: string;\n \n /** Optional transaction ID to group related patches */\n transactionId?: string;\n}\n\n/**\n * A batch of patches applied to a single entity\n */\nexport interface PatchBatch {\n /** The fully qualified protobuf message type (e.g., \"example.Game\") */\n messageType: string;\n \n /** The unique identifier of the entity being modified */\n entityId: string;\n \n /** List of patches to apply in order */\n patches: MessagePatch[];\n \n /** The highest change number in this batch */\n changeNumber: number;\n \n /** Source of the changes */\n source: PatchSource;\n \n /** Optional metadata about the batch */\n metadata?: Record<string, string>;\n}\n\n/**\n * Source of patch changes\n */\nexport enum PatchSource {\n LOCAL = 'LOCAL',\n REMOTE = 'REMOTE', \n SERVER = 'SERVER',\n STORAGE = 'STORAGE',\n}\n\n/**\n * Response message for methods that return patches\n */\nexport interface PatchResponse {\n /** The patches to apply */\n patchBatches: PatchBatch[];\n \n /** Success status */\n success: boolean;\n \n /** Error message if success is false */\n errorMessage?: string;\n \n /** The new change number after applying these patches */\n newChangeNumber: number;\n}\n\n/**\n * Transport interface for receiving patch updates\n */\nexport interface ChangeTransport {\n /** Register callback for incoming changes */\n onChanges(callback: (batches: PatchBatch[]) => void): void;\n \n /** Disconnect from the transport */\n disconnect(): void;\n}\n"]}
package/dist/index.mjs CHANGED
@@ -237,6 +237,20 @@ var BaseDeserializer = class {
237
237
  }
238
238
  return instance;
239
239
  }
240
+ /**
241
+ * Static utility method - infers messageType from type parameter
242
+ * @param typeConstructor Class with static MESSAGE_TYPE field
243
+ * @param data Raw data to deserialize
244
+ * @returns Deserialized instance or null if creation failed
245
+ *
246
+ * @example
247
+ * const user = Deserializer.from(User, rawData);
248
+ * // Instead of: Deserializer.from<User>(User.MESSAGE_TYPE, rawData)
249
+ */
250
+ fromType(typeConstructor, data) {
251
+ const messageType = typeConstructor.MESSAGE_TYPE;
252
+ return this.createAndDeserialize(messageType, data);
253
+ }
240
254
  /**
241
255
  * Create and deserialize a new instance of a message type
242
256
  */
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/browser/service-manager.ts","../src/schema/types.ts","../src/schema/base-deserializer.ts","../src/schema/base-registry.ts","../src/client/types.ts","../src/client/base-client.ts","../src/client/wasm-bundle.ts","../src/client/service-client.ts","../src/types/patches.ts"],"names":["FieldType","PatchOperation","PatchSource"],"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 * 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\n/**\n * Field type enumeration for proto field types\n */\nexport enum FieldType {\n STRING = \"string\",\n NUMBER = \"number\", \n BOOLEAN = \"boolean\",\n MESSAGE = \"message\",\n REPEATED = \"repeated\",\n MAP = \"map\",\n ONEOF = \"oneof\"\n}\n\n/**\n * Schema interface for field definitions\n */\nexport interface FieldSchema {\n name: string;\n type: FieldType;\n id: number; // Proto field number (e.g., text_query = 1)\n messageType?: string; // For MESSAGE type fields\n repeated?: boolean; // For array fields\n mapKeyType?: FieldType; // For MAP type fields\n mapValueType?: FieldType | string; // For MAP type fields\n oneofGroup?: string; // For ONEOF fields\n optional?: boolean;\n}\n\n/**\n * Message schema interface\n */\nexport interface MessageSchema {\n name: string;\n fields: FieldSchema[];\n oneofGroups?: string[]; // List of oneof group names\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 { FieldType, FieldSchema, MessageSchema } from './types.js';\nimport { FactoryInterface, FactoryResult } from '../types/factory.js';\n\n/**\n * Base deserializer class containing all non-template-dependent logic\n */\nexport abstract class BaseDeserializer {\n protected constructor(\n protected schemaRegistry: Record<string, MessageSchema>,\n protected factory: FactoryInterface\n ) {}\n\n /**\n * Deserialize an object using schema information\n * @param instance The target instance to populate\n * @param data The source data to deserialize from\n * @param messageType The fully qualified message type (e.g., \"library.v1.Book\")\n * @returns The populated instance\n */\n deserialize<T>(instance: T, data: any, messageType: string): T {\n if (!data || typeof data !== 'object') {\n return instance;\n }\n\n const schema = this.schemaRegistry[messageType];\n if (!schema) {\n // Fallback to simple property copying if no schema found\n return this.fallbackDeserialize(instance, data);\n }\n\n // Process each field according to its schema\n for (const fieldSchema of schema.fields) {\n const fieldValue = data[fieldSchema.name];\n if (fieldValue === null || fieldValue === undefined) {\n continue;\n }\n\n this.deserializeField(instance, fieldSchema, fieldValue);\n }\n\n return instance;\n }\n\n /**\n * Deserialize a single field based on its schema\n */\n protected deserializeField(instance: any, fieldSchema: FieldSchema, fieldValue: any): void {\n const fieldName = fieldSchema.name;\n\n switch (fieldSchema.type) {\n case FieldType.STRING:\n case FieldType.NUMBER:\n case FieldType.BOOLEAN:\n // Simple primitive types - direct assignment\n instance[fieldName] = fieldValue;\n break;\n\n case FieldType.MESSAGE:\n if (fieldSchema.repeated) {\n // Handle repeated message fields (arrays)\n instance[fieldName] = this.deserializeMessageArray(\n fieldValue,\n fieldSchema.messageType!,\n instance,\n fieldName\n );\n } else {\n // Handle single message field\n instance[fieldName] = this.deserializeMessageField(\n fieldValue,\n fieldSchema.messageType!,\n instance,\n fieldName\n );\n }\n break;\n\n case FieldType.REPEATED:\n // Handle repeated primitive fields\n if (Array.isArray(fieldValue)) {\n instance[fieldName] = [...fieldValue]; // Simple copy for primitives\n }\n break;\n\n case FieldType.ONEOF:\n // Handle oneof fields (would need additional logic for union types)\n instance[fieldName] = fieldValue;\n break;\n\n case FieldType.MAP:\n // Handle map fields (would need additional schema info for key/value types)\n instance[fieldName] = { ...fieldValue };\n break;\n\n default:\n // Fallback to direct assignment\n instance[fieldName] = fieldValue;\n break;\n }\n }\n\n /**\n * Deserialize a single message field\n */\n protected deserializeMessageField(\n fieldValue: any,\n messageType: string,\n parent: any,\n attributeName: string\n ): any {\n // Try to get factory method using cross-package delegation\n let factoryMethod;\n \n if (this.factory.getFactoryMethod) {\n factoryMethod = this.factory.getFactoryMethod(messageType);\n } else {\n // Fallback to simple method name lookup\n const factoryMethodName = this.getFactoryMethodName(messageType);\n factoryMethod = (this.factory as any)[factoryMethodName];\n }\n\n if (factoryMethod) {\n const result = factoryMethod(parent, attributeName, undefined, fieldValue);\n if (result.fullyLoaded) {\n return result.instance;\n } else {\n // Factory created instance but didn't populate - use deserializer\n return this.deserialize(result.instance, fieldValue, messageType);\n }\n }\n\n // No factory method found - fallback\n return this.fallbackDeserialize({}, fieldValue);\n }\n\n /**\n * Deserialize an array of message objects\n */\n protected deserializeMessageArray(\n fieldValue: any[],\n messageType: string,\n parent: any,\n attributeName: string\n ): any[] {\n if (!Array.isArray(fieldValue)) {\n return [];\n }\n\n // Try to get factory method using cross-package delegation\n let factoryMethod;\n \n if (this.factory.getFactoryMethod) {\n factoryMethod = this.factory.getFactoryMethod(messageType);\n } else {\n // Fallback to simple method name lookup\n const factoryMethodName = this.getFactoryMethodName(messageType);\n factoryMethod = (this.factory as any)[factoryMethodName];\n }\n\n return fieldValue.map((item, index) => {\n if (factoryMethod) {\n const result = factoryMethod(parent, attributeName, index, item);\n if (result.fullyLoaded) {\n return result.instance;\n } else {\n // Factory created instance but didn't populate - use deserializer\n return this.deserialize(result.instance, item, messageType);\n }\n }\n\n // No factory method found - fallback\n return this.fallbackDeserialize({}, item);\n });\n }\n\n /**\n * Convert message type to factory method name\n * \"library.v1.Book\" -> \"newBook\"\n */\n protected getFactoryMethodName(messageType: string): string {\n const parts = messageType.split('.');\n const typeName = parts[parts.length - 1]; // Get last part (e.g., \"Book\")\n return 'new' + typeName;\n }\n\n /**\n * Fallback deserializer for when no schema is available\n */\n protected fallbackDeserialize<T>(instance: T, data: any): T {\n if (!data || typeof data !== 'object') {\n return instance;\n }\n\n for (const [key, value] of Object.entries(data)) {\n if (value !== null && value !== undefined) {\n (instance as any)[key] = value;\n }\n }\n\n return instance;\n }\n\n /**\n * Create and deserialize a new instance of a message type\n */\n createAndDeserialize<T>(messageType: string, data: any): T {\n // Try to get factory method using cross-package delegation\n let factoryMethod;\n \n if (this.factory.getFactoryMethod) {\n factoryMethod = this.factory.getFactoryMethod(messageType);\n } else {\n // Fallback to simple method name lookup\n const factoryMethodName = this.getFactoryMethodName(messageType);\n factoryMethod = (this.factory as any)[factoryMethodName];\n }\n\n if (!factoryMethod) {\n throw new Error(`Could not find factory method to deserialize: ${messageType}`)\n }\n\n const result = factoryMethod(undefined, undefined, undefined, data);\n if (result.fullyLoaded) {\n return result.instance;\n } else {\n return this.deserialize(result.instance, data, messageType);\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 { FieldSchema, MessageSchema } from './types.js';\n\n/**\n * Base schema registry with utility methods for schema operations\n */\nexport class BaseSchemaRegistry {\n constructor(protected schemaRegistry: Record<string, MessageSchema>) {}\n\n /**\n * Get schema for a message type\n */\n getSchema(messageType: string): MessageSchema | undefined {\n return this.schemaRegistry[messageType];\n }\n\n /**\n * Get field schema by name\n */\n getFieldSchema(messageType: string, fieldName: string): FieldSchema | undefined {\n const schema = this.getSchema(messageType);\n return schema?.fields.find(field => field.name === fieldName);\n }\n\n /**\n * Get field schema by proto field ID\n */\n getFieldSchemaById(messageType: string, fieldId: number): FieldSchema | undefined {\n const schema = this.getSchema(messageType);\n return schema?.fields.find(field => field.id === fieldId);\n }\n\n /**\n * Check if field is part of a oneof group\n */\n isOneofField(messageType: string, fieldName: string): boolean {\n const fieldSchema = this.getFieldSchema(messageType, fieldName);\n return fieldSchema?.oneofGroup !== undefined;\n }\n\n /**\n * Get all fields in a oneof group\n */\n getOneofFields(messageType: string, oneofGroup: string): FieldSchema[] {\n const schema = this.getSchema(messageType);\n return schema?.fields.filter(field => field.oneofGroup === oneofGroup) || [];\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 * 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\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","// 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 * Patch operations for modifying protobuf message fields\n */\nexport enum PatchOperation {\n SET = 'SET',\n INSERT_LIST = 'INSERT_LIST',\n REMOVE_LIST = 'REMOVE_LIST',\n MOVE_LIST = 'MOVE_LIST',\n INSERT_MAP = 'INSERT_MAP',\n REMOVE_MAP = 'REMOVE_MAP',\n CLEAR_LIST = 'CLEAR_LIST',\n CLEAR_MAP = 'CLEAR_MAP',\n}\n\n/**\n * A single patch operation on a protobuf message field\n */\nexport interface MessagePatch {\n /** The type of operation to perform */\n operation: PatchOperation;\n \n /** Path to the field being modified (e.g., \"players[2].name\", \"places['tile_123'].latitude\") */\n fieldPath: string;\n \n /** The new value to set (for SET, INSERT_LIST, INSERT_MAP operations) */\n value?: any;\n \n /** Index for list operations (INSERT_LIST, REMOVE_LIST, MOVE_LIST) */\n index?: number;\n \n /** Map key for map operations (INSERT_MAP, REMOVE_MAP) */\n key?: string;\n \n /** Source index for MOVE_LIST operations */\n oldIndex?: number;\n \n /** Monotonically increasing change number for ordering */\n changeNumber: number;\n \n /** Timestamp when the change was created (microseconds since epoch) */\n timestamp: number;\n \n /** Optional user ID who made the change (for conflict resolution) */\n userId?: string;\n \n /** Optional transaction ID to group related patches */\n transactionId?: string;\n}\n\n/**\n * A batch of patches applied to a single entity\n */\nexport interface PatchBatch {\n /** The fully qualified protobuf message type (e.g., \"example.Game\") */\n messageType: string;\n \n /** The unique identifier of the entity being modified */\n entityId: string;\n \n /** List of patches to apply in order */\n patches: MessagePatch[];\n \n /** The highest change number in this batch */\n changeNumber: number;\n \n /** Source of the changes */\n source: PatchSource;\n \n /** Optional metadata about the batch */\n metadata?: Record<string, string>;\n}\n\n/**\n * Source of patch changes\n */\nexport enum PatchSource {\n LOCAL = 'LOCAL',\n REMOTE = 'REMOTE', \n SERVER = 'SERVER',\n STORAGE = 'STORAGE',\n}\n\n/**\n * Response message for methods that return patches\n */\nexport interface PatchResponse {\n /** The patches to apply */\n patchBatches: PatchBatch[];\n \n /** Success status */\n success: boolean;\n \n /** Error message if success is false */\n errorMessage?: string;\n \n /** The new change number after applying these patches */\n newChangeNumber: number;\n}\n\n/**\n * Transport interface for receiving patch updates\n */\nexport interface ChangeTransport {\n /** Register callback for incoming changes */\n onChanges(callback: (batches: PatchBatch[]) => void): void;\n \n /** Disconnect from the transport */\n disconnect(): void;\n}\n"]}
1
+ {"version":3,"sources":["../src/browser/service-manager.ts","../src/schema/types.ts","../src/schema/base-deserializer.ts","../src/schema/base-registry.ts","../src/client/types.ts","../src/client/base-client.ts","../src/client/wasm-bundle.ts","../src/client/service-client.ts","../src/types/patches.ts"],"names":["FieldType","PatchOperation","PatchSource"],"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 * 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\n/**\n * Field type enumeration for proto field types\n */\nexport enum FieldType {\n STRING = \"string\",\n NUMBER = \"number\", \n BOOLEAN = \"boolean\",\n MESSAGE = \"message\",\n REPEATED = \"repeated\",\n MAP = \"map\",\n ONEOF = \"oneof\"\n}\n\n/**\n * Schema interface for field definitions\n */\nexport interface FieldSchema {\n name: string;\n type: FieldType;\n id: number; // Proto field number (e.g., text_query = 1)\n messageType?: string; // For MESSAGE type fields\n repeated?: boolean; // For array fields\n mapKeyType?: FieldType; // For MAP type fields\n mapValueType?: FieldType | string; // For MAP type fields\n oneofGroup?: string; // For ONEOF fields\n optional?: boolean;\n}\n\n/**\n * Message schema interface\n */\nexport interface MessageSchema {\n name: string;\n fields: FieldSchema[];\n oneofGroups?: string[]; // List of oneof group names\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 { FieldType, FieldSchema, MessageSchema } from './types.js';\nimport { FactoryInterface, FactoryResult } from '../types/factory.js';\n\n/**\n * Interface for types that have a static MESSAGE_TYPE field\n * This allows us to infer the message type from the class itself\n */\nexport interface MessageTypeProvider {\n readonly MESSAGE_TYPE: string;\n}\n\n/**\n * Constructor type that provides MESSAGE_TYPE\n * Used as a constraint for generic deserialization\n */\nexport type MessageTypeConstructor<T> = {\n new(...args: any[]): T;\n readonly MESSAGE_TYPE: string;\n};\n\n\n/**\n * Base deserializer class containing all non-template-dependent logic\n */\nexport abstract class BaseDeserializer {\n protected constructor(\n protected schemaRegistry: Record<string, MessageSchema>,\n protected factory: FactoryInterface\n ) {}\n\n /**\n * Deserialize an object using schema information\n * @param instance The target instance to populate\n * @param data The source data to deserialize from\n * @param messageType The fully qualified message type (e.g., \"library.v1.Book\")\n * @returns The populated instance\n */\n deserialize<T>(instance: T, data: any, messageType: string): T {\n if (!data || typeof data !== 'object') {\n return instance;\n }\n\n const schema = this.schemaRegistry[messageType];\n if (!schema) {\n // Fallback to simple property copying if no schema found\n return this.fallbackDeserialize(instance, data);\n }\n\n // Process each field according to its schema\n for (const fieldSchema of schema.fields) {\n const fieldValue = data[fieldSchema.name];\n if (fieldValue === null || fieldValue === undefined) {\n continue;\n }\n\n this.deserializeField(instance, fieldSchema, fieldValue);\n }\n\n return instance;\n }\n\n /**\n * Deserialize a single field based on its schema\n */\n protected deserializeField(instance: any, fieldSchema: FieldSchema, fieldValue: any): void {\n const fieldName = fieldSchema.name;\n\n switch (fieldSchema.type) {\n case FieldType.STRING:\n case FieldType.NUMBER:\n case FieldType.BOOLEAN:\n // Simple primitive types - direct assignment\n instance[fieldName] = fieldValue;\n break;\n\n case FieldType.MESSAGE:\n if (fieldSchema.repeated) {\n // Handle repeated message fields (arrays)\n instance[fieldName] = this.deserializeMessageArray(\n fieldValue,\n fieldSchema.messageType!,\n instance,\n fieldName\n );\n } else {\n // Handle single message field\n instance[fieldName] = this.deserializeMessageField(\n fieldValue,\n fieldSchema.messageType!,\n instance,\n fieldName\n );\n }\n break;\n\n case FieldType.REPEATED:\n // Handle repeated primitive fields\n if (Array.isArray(fieldValue)) {\n instance[fieldName] = [...fieldValue]; // Simple copy for primitives\n }\n break;\n\n case FieldType.ONEOF:\n // Handle oneof fields (would need additional logic for union types)\n instance[fieldName] = fieldValue;\n break;\n\n case FieldType.MAP:\n // Handle map fields (would need additional schema info for key/value types)\n instance[fieldName] = { ...fieldValue };\n break;\n\n default:\n // Fallback to direct assignment\n instance[fieldName] = fieldValue;\n break;\n }\n }\n\n /**\n * Deserialize a single message field\n */\n protected deserializeMessageField(\n fieldValue: any,\n messageType: string,\n parent: any,\n attributeName: string\n ): any {\n // Try to get factory method using cross-package delegation\n let factoryMethod;\n \n if (this.factory.getFactoryMethod) {\n factoryMethod = this.factory.getFactoryMethod(messageType);\n } else {\n // Fallback to simple method name lookup\n const factoryMethodName = this.getFactoryMethodName(messageType);\n factoryMethod = (this.factory as any)[factoryMethodName];\n }\n\n if (factoryMethod) {\n const result = factoryMethod(parent, attributeName, undefined, fieldValue);\n if (result.fullyLoaded) {\n return result.instance;\n } else {\n // Factory created instance but didn't populate - use deserializer\n return this.deserialize(result.instance, fieldValue, messageType);\n }\n }\n\n // No factory method found - fallback\n return this.fallbackDeserialize({}, fieldValue);\n }\n\n /**\n * Deserialize an array of message objects\n */\n protected deserializeMessageArray(\n fieldValue: any[],\n messageType: string,\n parent: any,\n attributeName: string\n ): any[] {\n if (!Array.isArray(fieldValue)) {\n return [];\n }\n\n // Try to get factory method using cross-package delegation\n let factoryMethod;\n \n if (this.factory.getFactoryMethod) {\n factoryMethod = this.factory.getFactoryMethod(messageType);\n } else {\n // Fallback to simple method name lookup\n const factoryMethodName = this.getFactoryMethodName(messageType);\n factoryMethod = (this.factory as any)[factoryMethodName];\n }\n\n return fieldValue.map((item, index) => {\n if (factoryMethod) {\n const result = factoryMethod(parent, attributeName, index, item);\n if (result.fullyLoaded) {\n return result.instance;\n } else {\n // Factory created instance but didn't populate - use deserializer\n return this.deserialize(result.instance, item, messageType);\n }\n }\n\n // No factory method found - fallback\n return this.fallbackDeserialize({}, item);\n });\n }\n\n /**\n * Convert message type to factory method name\n * \"library.v1.Book\" -> \"newBook\"\n */\n protected getFactoryMethodName(messageType: string): string {\n const parts = messageType.split('.');\n const typeName = parts[parts.length - 1]; // Get last part (e.g., \"Book\")\n return 'new' + typeName;\n }\n\n /**\n * Fallback deserializer for when no schema is available\n */\n protected fallbackDeserialize<T>(instance: T, data: any): T {\n if (!data || typeof data !== 'object') {\n return instance;\n }\n\n for (const [key, value] of Object.entries(data)) {\n if (value !== null && value !== undefined) {\n (instance as any)[key] = value;\n }\n }\n\n return instance;\n }\n\n\n /**\n * Static utility method - infers messageType from type parameter\n * @param typeConstructor Class with static MESSAGE_TYPE field\n * @param data Raw data to deserialize\n * @returns Deserialized instance or null if creation failed\n *\n * @example\n * const user = Deserializer.from(User, rawData);\n * // Instead of: Deserializer.from<User>(User.MESSAGE_TYPE, rawData)\n */\n fromType<T>(\n typeConstructor: MessageTypeConstructor<T>,\n data: any\n ): T | null {\n const messageType = typeConstructor.MESSAGE_TYPE;\n return this.createAndDeserialize<T>(messageType, data);\n }\n\n\n /**\n * Create and deserialize a new instance of a message type\n */\n createAndDeserialize<T>(messageType: string, data: any): T {\n // Try to get factory method using cross-package delegation\n let factoryMethod;\n \n if (this.factory.getFactoryMethod) {\n factoryMethod = this.factory.getFactoryMethod(messageType);\n } else {\n // Fallback to simple method name lookup\n const factoryMethodName = this.getFactoryMethodName(messageType);\n factoryMethod = (this.factory as any)[factoryMethodName];\n }\n\n if (!factoryMethod) {\n throw new Error(`Could not find factory method to deserialize: ${messageType}`)\n }\n\n const result = factoryMethod(undefined, undefined, undefined, data);\n if (result.fullyLoaded) {\n return result.instance;\n } else {\n return this.deserialize(result.instance, data, messageType);\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 { FieldSchema, MessageSchema } from './types.js';\n\n/**\n * Base schema registry with utility methods for schema operations\n */\nexport class BaseSchemaRegistry {\n constructor(protected schemaRegistry: Record<string, MessageSchema>) {}\n\n /**\n * Get schema for a message type\n */\n getSchema(messageType: string): MessageSchema | undefined {\n return this.schemaRegistry[messageType];\n }\n\n /**\n * Get field schema by name\n */\n getFieldSchema(messageType: string, fieldName: string): FieldSchema | undefined {\n const schema = this.getSchema(messageType);\n return schema?.fields.find(field => field.name === fieldName);\n }\n\n /**\n * Get field schema by proto field ID\n */\n getFieldSchemaById(messageType: string, fieldId: number): FieldSchema | undefined {\n const schema = this.getSchema(messageType);\n return schema?.fields.find(field => field.id === fieldId);\n }\n\n /**\n * Check if field is part of a oneof group\n */\n isOneofField(messageType: string, fieldName: string): boolean {\n const fieldSchema = this.getFieldSchema(messageType, fieldName);\n return fieldSchema?.oneofGroup !== undefined;\n }\n\n /**\n * Get all fields in a oneof group\n */\n getOneofFields(messageType: string, oneofGroup: string): FieldSchema[] {\n const schema = this.getSchema(messageType);\n return schema?.fields.filter(field => field.oneofGroup === oneofGroup) || [];\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 * 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\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","// 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 * Patch operations for modifying protobuf message fields\n */\nexport enum PatchOperation {\n SET = 'SET',\n INSERT_LIST = 'INSERT_LIST',\n REMOVE_LIST = 'REMOVE_LIST',\n MOVE_LIST = 'MOVE_LIST',\n INSERT_MAP = 'INSERT_MAP',\n REMOVE_MAP = 'REMOVE_MAP',\n CLEAR_LIST = 'CLEAR_LIST',\n CLEAR_MAP = 'CLEAR_MAP',\n}\n\n/**\n * A single patch operation on a protobuf message field\n */\nexport interface MessagePatch {\n /** The type of operation to perform */\n operation: PatchOperation;\n \n /** Path to the field being modified (e.g., \"players[2].name\", \"places['tile_123'].latitude\") */\n fieldPath: string;\n \n /** The new value to set (for SET, INSERT_LIST, INSERT_MAP operations) */\n value?: any;\n \n /** Index for list operations (INSERT_LIST, REMOVE_LIST, MOVE_LIST) */\n index?: number;\n \n /** Map key for map operations (INSERT_MAP, REMOVE_MAP) */\n key?: string;\n \n /** Source index for MOVE_LIST operations */\n oldIndex?: number;\n \n /** Monotonically increasing change number for ordering */\n changeNumber: number;\n \n /** Timestamp when the change was created (microseconds since epoch) */\n timestamp: number;\n \n /** Optional user ID who made the change (for conflict resolution) */\n userId?: string;\n \n /** Optional transaction ID to group related patches */\n transactionId?: string;\n}\n\n/**\n * A batch of patches applied to a single entity\n */\nexport interface PatchBatch {\n /** The fully qualified protobuf message type (e.g., \"example.Game\") */\n messageType: string;\n \n /** The unique identifier of the entity being modified */\n entityId: string;\n \n /** List of patches to apply in order */\n patches: MessagePatch[];\n \n /** The highest change number in this batch */\n changeNumber: number;\n \n /** Source of the changes */\n source: PatchSource;\n \n /** Optional metadata about the batch */\n metadata?: Record<string, string>;\n}\n\n/**\n * Source of patch changes\n */\nexport enum PatchSource {\n LOCAL = 'LOCAL',\n REMOTE = 'REMOTE', \n SERVER = 'SERVER',\n STORAGE = 'STORAGE',\n}\n\n/**\n * Response message for methods that return patches\n */\nexport interface PatchResponse {\n /** The patches to apply */\n patchBatches: PatchBatch[];\n \n /** Success status */\n success: boolean;\n \n /** Error message if success is false */\n errorMessage?: string;\n \n /** The new change number after applying these patches */\n newChangeNumber: number;\n}\n\n/**\n * Transport interface for receiving patch updates\n */\nexport interface ChangeTransport {\n /** Register callback for incoming changes */\n onChanges(callback: (batches: PatchBatch[]) => void): void;\n \n /** Disconnect from the transport */\n disconnect(): void;\n}\n"]}
@@ -35,6 +35,21 @@ interface MessageSchema {
35
35
  oneofGroups?: string[];
36
36
  }
37
37
 
38
+ /**
39
+ * Interface for types that have a static MESSAGE_TYPE field
40
+ * This allows us to infer the message type from the class itself
41
+ */
42
+ interface MessageTypeProvider {
43
+ readonly MESSAGE_TYPE: string;
44
+ }
45
+ /**
46
+ * Constructor type that provides MESSAGE_TYPE
47
+ * Used as a constraint for generic deserialization
48
+ */
49
+ type MessageTypeConstructor<T> = {
50
+ new (...args: any[]): T;
51
+ readonly MESSAGE_TYPE: string;
52
+ };
38
53
  /**
39
54
  * Base deserializer class containing all non-template-dependent logic
40
55
  */
@@ -71,6 +86,17 @@ declare abstract class BaseDeserializer {
71
86
  * Fallback deserializer for when no schema is available
72
87
  */
73
88
  protected fallbackDeserialize<T>(instance: T, data: any): T;
89
+ /**
90
+ * Static utility method - infers messageType from type parameter
91
+ * @param typeConstructor Class with static MESSAGE_TYPE field
92
+ * @param data Raw data to deserialize
93
+ * @returns Deserialized instance or null if creation failed
94
+ *
95
+ * @example
96
+ * const user = Deserializer.from(User, rawData);
97
+ * // Instead of: Deserializer.from<User>(User.MESSAGE_TYPE, rawData)
98
+ */
99
+ fromType<T>(typeConstructor: MessageTypeConstructor<T>, data: any): T | null;
74
100
  /**
75
101
  * Create and deserialize a new instance of a message type
76
102
  */
@@ -105,4 +131,4 @@ declare class BaseSchemaRegistry {
105
131
  getOneofFields(messageType: string, oneofGroup: string): FieldSchema[];
106
132
  }
107
133
 
108
- export { BaseDeserializer, BaseSchemaRegistry, type FieldSchema, FieldType, type MessageSchema };
134
+ export { BaseDeserializer, BaseSchemaRegistry, type FieldSchema, FieldType, type MessageSchema, type MessageTypeConstructor, type MessageTypeProvider };
@@ -35,6 +35,21 @@ interface MessageSchema {
35
35
  oneofGroups?: string[];
36
36
  }
37
37
 
38
+ /**
39
+ * Interface for types that have a static MESSAGE_TYPE field
40
+ * This allows us to infer the message type from the class itself
41
+ */
42
+ interface MessageTypeProvider {
43
+ readonly MESSAGE_TYPE: string;
44
+ }
45
+ /**
46
+ * Constructor type that provides MESSAGE_TYPE
47
+ * Used as a constraint for generic deserialization
48
+ */
49
+ type MessageTypeConstructor<T> = {
50
+ new (...args: any[]): T;
51
+ readonly MESSAGE_TYPE: string;
52
+ };
38
53
  /**
39
54
  * Base deserializer class containing all non-template-dependent logic
40
55
  */
@@ -71,6 +86,17 @@ declare abstract class BaseDeserializer {
71
86
  * Fallback deserializer for when no schema is available
72
87
  */
73
88
  protected fallbackDeserialize<T>(instance: T, data: any): T;
89
+ /**
90
+ * Static utility method - infers messageType from type parameter
91
+ * @param typeConstructor Class with static MESSAGE_TYPE field
92
+ * @param data Raw data to deserialize
93
+ * @returns Deserialized instance or null if creation failed
94
+ *
95
+ * @example
96
+ * const user = Deserializer.from(User, rawData);
97
+ * // Instead of: Deserializer.from<User>(User.MESSAGE_TYPE, rawData)
98
+ */
99
+ fromType<T>(typeConstructor: MessageTypeConstructor<T>, data: any): T | null;
74
100
  /**
75
101
  * Create and deserialize a new instance of a message type
76
102
  */
@@ -105,4 +131,4 @@ declare class BaseSchemaRegistry {
105
131
  getOneofFields(messageType: string, oneofGroup: string): FieldSchema[];
106
132
  }
107
133
 
108
- export { BaseDeserializer, BaseSchemaRegistry, type FieldSchema, FieldType, type MessageSchema };
134
+ export { BaseDeserializer, BaseSchemaRegistry, type FieldSchema, FieldType, type MessageSchema, type MessageTypeConstructor, type MessageTypeProvider };
@@ -156,6 +156,20 @@ var BaseDeserializer = class {
156
156
  }
157
157
  return instance;
158
158
  }
159
+ /**
160
+ * Static utility method - infers messageType from type parameter
161
+ * @param typeConstructor Class with static MESSAGE_TYPE field
162
+ * @param data Raw data to deserialize
163
+ * @returns Deserialized instance or null if creation failed
164
+ *
165
+ * @example
166
+ * const user = Deserializer.from(User, rawData);
167
+ * // Instead of: Deserializer.from<User>(User.MESSAGE_TYPE, rawData)
168
+ */
169
+ fromType(typeConstructor, data) {
170
+ const messageType = typeConstructor.MESSAGE_TYPE;
171
+ return this.createAndDeserialize(messageType, data);
172
+ }
159
173
  /**
160
174
  * Create and deserialize a new instance of a message type
161
175
  */
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/schema/types.ts","../../src/schema/base-deserializer.ts","../../src/schema/base-registry.ts"],"names":["FieldType"],"mappings":";;;AAiBO,IAAK,SAAA,qBAAAA,UAAAA,KAAL;AACL,EAAAA,WAAA,QAAA,CAAA,GAAS,QAAA;AACT,EAAAA,WAAA,QAAA,CAAA,GAAS,QAAA;AACT,EAAAA,WAAA,SAAA,CAAA,GAAU,SAAA;AACV,EAAAA,WAAA,SAAA,CAAA,GAAU,SAAA;AACV,EAAAA,WAAA,UAAA,CAAA,GAAW,UAAA;AACX,EAAAA,WAAA,KAAA,CAAA,GAAM,KAAA;AACN,EAAAA,WAAA,OAAA,CAAA,GAAQ,OAAA;AAPE,EAAA,OAAAA,UAAAA;AAAA,CAAA,EAAA,SAAA,IAAA,EAAA;;;ACGL,IAAe,mBAAf,MAAgC;AAAA,EAC3B,WAAA,CACE,gBACA,OAAA,EACV;AAFU,IAAA,IAAA,CAAA,cAAA,GAAA,cAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASH,WAAA,CAAe,QAAA,EAAa,IAAA,EAAW,WAAA,EAAwB;AAC7D,IAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,EAAU;AACrC,MAAA,OAAO,QAAA;AAAA,IACT;AAEA,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,cAAA,CAAe,WAAW,CAAA;AAC9C,IAAA,IAAI,CAAC,MAAA,EAAQ;AAEX,MAAA,OAAO,IAAA,CAAK,mBAAA,CAAoB,QAAA,EAAU,IAAI,CAAA;AAAA,IAChD;AAGA,IAAA,KAAA,MAAW,WAAA,IAAe,OAAO,MAAA,EAAQ;AACvC,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,WAAA,CAAY,IAAI,CAAA;AACxC,MAAA,IAAI,UAAA,KAAe,IAAA,IAAQ,UAAA,KAAe,MAAA,EAAW;AACnD,QAAA;AAAA,MACF;AAEA,MAAA,IAAA,CAAK,gBAAA,CAAiB,QAAA,EAAU,WAAA,EAAa,UAAU,CAAA;AAAA,IACzD;AAEA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKU,gBAAA,CAAiB,QAAA,EAAe,WAAA,EAA0B,UAAA,EAAuB;AACzF,IAAA,MAAM,YAAY,WAAA,CAAY,IAAA;AAE9B,IAAA,QAAQ,YAAY,IAAA;AAAM,MACxB,KAAA,QAAA;AAAA,MACA,KAAA,QAAA;AAAA,MACA,KAAA,SAAA;AAEE,QAAA,QAAA,CAAS,SAAS,CAAA,GAAI,UAAA;AACtB,QAAA;AAAA,MAEF,KAAA,SAAA;AACE,QAAA,IAAI,YAAY,QAAA,EAAU;AAExB,UAAA,QAAA,CAAS,SAAS,IAAI,IAAA,CAAK,uBAAA;AAAA,YACzB,UAAA;AAAA,YACA,WAAA,CAAY,WAAA;AAAA,YACZ,QAAA;AAAA,YACA;AAAA,WACF;AAAA,QACF,CAAA,MAAO;AAEL,UAAA,QAAA,CAAS,SAAS,IAAI,IAAA,CAAK,uBAAA;AAAA,YACzB,UAAA;AAAA,YACA,WAAA,CAAY,WAAA;AAAA,YACZ,QAAA;AAAA,YACA;AAAA,WACF;AAAA,QACF;AACA,QAAA;AAAA,MAEF,KAAA,UAAA;AAEE,QAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,UAAU,CAAA,EAAG;AAC7B,UAAA,QAAA,CAAS,SAAS,CAAA,GAAI,CAAC,GAAG,UAAU,CAAA;AAAA,QACtC;AACA,QAAA;AAAA,MAEF,KAAA,OAAA;AAEE,QAAA,QAAA,CAAS,SAAS,CAAA,GAAI,UAAA;AACtB,QAAA;AAAA,MAEF,KAAA,KAAA;AAEE,QAAA,QAAA,CAAS,SAAS,CAAA,GAAI,EAAE,GAAG,UAAA,EAAW;AACtC,QAAA;AAAA,MAEF;AAEE,QAAA,QAAA,CAAS,SAAS,CAAA,GAAI,UAAA;AACtB,QAAA;AAAA;AACJ,EACF;AAAA;AAAA;AAAA;AAAA,EAKU,uBAAA,CACR,UAAA,EACA,WAAA,EACA,MAAA,EACA,aAAA,EACK;AAEL,IAAA,IAAI,aAAA;AAEJ,IAAA,IAAI,IAAA,CAAK,QAAQ,gBAAA,EAAkB;AACjC,MAAA,aAAA,GAAgB,IAAA,CAAK,OAAA,CAAQ,gBAAA,CAAiB,WAAW,CAAA;AAAA,IAC3D,CAAA,MAAO;AAEL,MAAA,MAAM,iBAAA,GAAoB,IAAA,CAAK,oBAAA,CAAqB,WAAW,CAAA;AAC/D,MAAA,aAAA,GAAiB,IAAA,CAAK,QAAgB,iBAAiB,CAAA;AAAA,IACzD;AAEA,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,MAAM,MAAA,GAAS,aAAA,CAAc,MAAA,EAAQ,aAAA,EAAe,QAAW,UAAU,CAAA;AACzE,MAAA,IAAI,OAAO,WAAA,EAAa;AACtB,QAAA,OAAO,MAAA,CAAO,QAAA;AAAA,MAChB,CAAA,MAAO;AAEL,QAAA,OAAO,IAAA,CAAK,WAAA,CAAY,MAAA,CAAO,QAAA,EAAU,YAAY,WAAW,CAAA;AAAA,MAClE;AAAA,IACF;AAGA,IAAA,OAAO,IAAA,CAAK,mBAAA,CAAoB,EAAC,EAAG,UAAU,CAAA;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA,EAKU,uBAAA,CACR,UAAA,EACA,WAAA,EACA,MAAA,EACA,aAAA,EACO;AACP,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,UAAU,CAAA,EAAG;AAC9B,MAAA,OAAO,EAAC;AAAA,IACV;AAGA,IAAA,IAAI,aAAA;AAEJ,IAAA,IAAI,IAAA,CAAK,QAAQ,gBAAA,EAAkB;AACjC,MAAA,aAAA,GAAgB,IAAA,CAAK,OAAA,CAAQ,gBAAA,CAAiB,WAAW,CAAA;AAAA,IAC3D,CAAA,MAAO;AAEL,MAAA,MAAM,iBAAA,GAAoB,IAAA,CAAK,oBAAA,CAAqB,WAAW,CAAA;AAC/D,MAAA,aAAA,GAAiB,IAAA,CAAK,QAAgB,iBAAiB,CAAA;AAAA,IACzD;AAEA,IAAA,OAAO,UAAA,CAAW,GAAA,CAAI,CAAC,IAAA,EAAM,KAAA,KAAU;AACrC,MAAA,IAAI,aAAA,EAAe;AACjB,QAAA,MAAM,MAAA,GAAS,aAAA,CAAc,MAAA,EAAQ,aAAA,EAAe,OAAO,IAAI,CAAA;AAC/D,QAAA,IAAI,OAAO,WAAA,EAAa;AACtB,UAAA,OAAO,MAAA,CAAO,QAAA;AAAA,QAChB,CAAA,MAAO;AAEL,UAAA,OAAO,IAAA,CAAK,WAAA,CAAY,MAAA,CAAO,QAAA,EAAU,MAAM,WAAW,CAAA;AAAA,QAC5D;AAAA,MACF;AAGA,MAAA,OAAO,IAAA,CAAK,mBAAA,CAAoB,EAAC,EAAG,IAAI,CAAA;AAAA,IAC1C,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMU,qBAAqB,WAAA,EAA6B;AAC1D,IAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,KAAA,CAAM,GAAG,CAAA;AACnC,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA;AACvC,IAAA,OAAO,KAAA,GAAQ,QAAA;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA,EAKU,mBAAA,CAAuB,UAAa,IAAA,EAAc;AAC1D,IAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,EAAU;AACrC,MAAA,OAAO,QAAA;AAAA,IACT;AAEA,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,EAAG;AAC/C,MAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,EAAW;AACzC,QAAC,QAAA,CAAiB,GAAG,CAAA,GAAI,KAAA;AAAA,MAC3B;AAAA,IACF;AAEA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,oBAAA,CAAwB,aAAqB,IAAA,EAAc;AAEzD,IAAA,IAAI,aAAA;AAEJ,IAAA,IAAI,IAAA,CAAK,QAAQ,gBAAA,EAAkB;AACjC,MAAA,aAAA,GAAgB,IAAA,CAAK,OAAA,CAAQ,gBAAA,CAAiB,WAAW,CAAA;AAAA,IAC3D,CAAA,MAAO;AAEL,MAAA,MAAM,iBAAA,GAAoB,IAAA,CAAK,oBAAA,CAAqB,WAAW,CAAA;AAC/D,MAAA,aAAA,GAAiB,IAAA,CAAK,QAAgB,iBAAiB,CAAA;AAAA,IACzD;AAEA,IAAA,IAAI,CAAC,aAAA,EAAe;AAClB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,8CAAA,EAAiD,WAAW,CAAA,CAAE,CAAA;AAAA,IAChF;AAEA,IAAA,MAAM,MAAA,GAAS,aAAA,CAAc,MAAA,EAAW,MAAA,EAAW,QAAW,IAAI,CAAA;AAClE,IAAA,IAAI,OAAO,WAAA,EAAa;AACtB,MAAA,OAAO,MAAA,CAAO,QAAA;AAAA,IAChB,CAAA,MAAO;AACL,MAAA,OAAO,IAAA,CAAK,WAAA,CAAY,MAAA,CAAO,QAAA,EAAU,MAAM,WAAW,CAAA;AAAA,IAC5D;AAAA,EACF;AACF;;;AC/NO,IAAM,qBAAN,MAAyB;AAAA,EAC9B,YAAsB,cAAA,EAA+C;AAA/C,IAAA,IAAA,CAAA,cAAA,GAAA,cAAA;AAAA,EAAgD;AAAA;AAAA;AAAA;AAAA,EAKtE,UAAU,WAAA,EAAgD;AACxD,IAAA,OAAO,IAAA,CAAK,eAAe,WAAW,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,cAAA,CAAe,aAAqB,SAAA,EAA4C;AAC9E,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,SAAA,CAAU,WAAW,CAAA;AACzC,IAAA,OAAO,QAAQ,MAAA,CAAO,IAAA,CAAK,CAAA,KAAA,KAAS,KAAA,CAAM,SAAS,SAAS,CAAA;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAA,CAAmB,aAAqB,OAAA,EAA0C;AAChF,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,SAAA,CAAU,WAAW,CAAA;AACzC,IAAA,OAAO,QAAQ,MAAA,CAAO,IAAA,CAAK,CAAA,KAAA,KAAS,KAAA,CAAM,OAAO,OAAO,CAAA;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA,EAKA,YAAA,CAAa,aAAqB,SAAA,EAA4B;AAC5D,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,cAAA,CAAe,WAAA,EAAa,SAAS,CAAA;AAC9D,IAAA,OAAO,aAAa,UAAA,KAAe,MAAA;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKA,cAAA,CAAe,aAAqB,UAAA,EAAmC;AACrE,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,SAAA,CAAU,WAAW,CAAA;AACzC,IAAA,OAAO,MAAA,EAAQ,OAAO,MAAA,CAAO,CAAA,KAAA,KAAS,MAAM,UAAA,KAAe,UAAU,KAAK,EAAC;AAAA,EAC7E;AACF","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 * Field type enumeration for proto field types\n */\nexport enum FieldType {\n STRING = \"string\",\n NUMBER = \"number\", \n BOOLEAN = \"boolean\",\n MESSAGE = \"message\",\n REPEATED = \"repeated\",\n MAP = \"map\",\n ONEOF = \"oneof\"\n}\n\n/**\n * Schema interface for field definitions\n */\nexport interface FieldSchema {\n name: string;\n type: FieldType;\n id: number; // Proto field number (e.g., text_query = 1)\n messageType?: string; // For MESSAGE type fields\n repeated?: boolean; // For array fields\n mapKeyType?: FieldType; // For MAP type fields\n mapValueType?: FieldType | string; // For MAP type fields\n oneofGroup?: string; // For ONEOF fields\n optional?: boolean;\n}\n\n/**\n * Message schema interface\n */\nexport interface MessageSchema {\n name: string;\n fields: FieldSchema[];\n oneofGroups?: string[]; // List of oneof group names\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 { FieldType, FieldSchema, MessageSchema } from './types.js';\nimport { FactoryInterface, FactoryResult } from '../types/factory.js';\n\n/**\n * Base deserializer class containing all non-template-dependent logic\n */\nexport abstract class BaseDeserializer {\n protected constructor(\n protected schemaRegistry: Record<string, MessageSchema>,\n protected factory: FactoryInterface\n ) {}\n\n /**\n * Deserialize an object using schema information\n * @param instance The target instance to populate\n * @param data The source data to deserialize from\n * @param messageType The fully qualified message type (e.g., \"library.v1.Book\")\n * @returns The populated instance\n */\n deserialize<T>(instance: T, data: any, messageType: string): T {\n if (!data || typeof data !== 'object') {\n return instance;\n }\n\n const schema = this.schemaRegistry[messageType];\n if (!schema) {\n // Fallback to simple property copying if no schema found\n return this.fallbackDeserialize(instance, data);\n }\n\n // Process each field according to its schema\n for (const fieldSchema of schema.fields) {\n const fieldValue = data[fieldSchema.name];\n if (fieldValue === null || fieldValue === undefined) {\n continue;\n }\n\n this.deserializeField(instance, fieldSchema, fieldValue);\n }\n\n return instance;\n }\n\n /**\n * Deserialize a single field based on its schema\n */\n protected deserializeField(instance: any, fieldSchema: FieldSchema, fieldValue: any): void {\n const fieldName = fieldSchema.name;\n\n switch (fieldSchema.type) {\n case FieldType.STRING:\n case FieldType.NUMBER:\n case FieldType.BOOLEAN:\n // Simple primitive types - direct assignment\n instance[fieldName] = fieldValue;\n break;\n\n case FieldType.MESSAGE:\n if (fieldSchema.repeated) {\n // Handle repeated message fields (arrays)\n instance[fieldName] = this.deserializeMessageArray(\n fieldValue,\n fieldSchema.messageType!,\n instance,\n fieldName\n );\n } else {\n // Handle single message field\n instance[fieldName] = this.deserializeMessageField(\n fieldValue,\n fieldSchema.messageType!,\n instance,\n fieldName\n );\n }\n break;\n\n case FieldType.REPEATED:\n // Handle repeated primitive fields\n if (Array.isArray(fieldValue)) {\n instance[fieldName] = [...fieldValue]; // Simple copy for primitives\n }\n break;\n\n case FieldType.ONEOF:\n // Handle oneof fields (would need additional logic for union types)\n instance[fieldName] = fieldValue;\n break;\n\n case FieldType.MAP:\n // Handle map fields (would need additional schema info for key/value types)\n instance[fieldName] = { ...fieldValue };\n break;\n\n default:\n // Fallback to direct assignment\n instance[fieldName] = fieldValue;\n break;\n }\n }\n\n /**\n * Deserialize a single message field\n */\n protected deserializeMessageField(\n fieldValue: any,\n messageType: string,\n parent: any,\n attributeName: string\n ): any {\n // Try to get factory method using cross-package delegation\n let factoryMethod;\n \n if (this.factory.getFactoryMethod) {\n factoryMethod = this.factory.getFactoryMethod(messageType);\n } else {\n // Fallback to simple method name lookup\n const factoryMethodName = this.getFactoryMethodName(messageType);\n factoryMethod = (this.factory as any)[factoryMethodName];\n }\n\n if (factoryMethod) {\n const result = factoryMethod(parent, attributeName, undefined, fieldValue);\n if (result.fullyLoaded) {\n return result.instance;\n } else {\n // Factory created instance but didn't populate - use deserializer\n return this.deserialize(result.instance, fieldValue, messageType);\n }\n }\n\n // No factory method found - fallback\n return this.fallbackDeserialize({}, fieldValue);\n }\n\n /**\n * Deserialize an array of message objects\n */\n protected deserializeMessageArray(\n fieldValue: any[],\n messageType: string,\n parent: any,\n attributeName: string\n ): any[] {\n if (!Array.isArray(fieldValue)) {\n return [];\n }\n\n // Try to get factory method using cross-package delegation\n let factoryMethod;\n \n if (this.factory.getFactoryMethod) {\n factoryMethod = this.factory.getFactoryMethod(messageType);\n } else {\n // Fallback to simple method name lookup\n const factoryMethodName = this.getFactoryMethodName(messageType);\n factoryMethod = (this.factory as any)[factoryMethodName];\n }\n\n return fieldValue.map((item, index) => {\n if (factoryMethod) {\n const result = factoryMethod(parent, attributeName, index, item);\n if (result.fullyLoaded) {\n return result.instance;\n } else {\n // Factory created instance but didn't populate - use deserializer\n return this.deserialize(result.instance, item, messageType);\n }\n }\n\n // No factory method found - fallback\n return this.fallbackDeserialize({}, item);\n });\n }\n\n /**\n * Convert message type to factory method name\n * \"library.v1.Book\" -> \"newBook\"\n */\n protected getFactoryMethodName(messageType: string): string {\n const parts = messageType.split('.');\n const typeName = parts[parts.length - 1]; // Get last part (e.g., \"Book\")\n return 'new' + typeName;\n }\n\n /**\n * Fallback deserializer for when no schema is available\n */\n protected fallbackDeserialize<T>(instance: T, data: any): T {\n if (!data || typeof data !== 'object') {\n return instance;\n }\n\n for (const [key, value] of Object.entries(data)) {\n if (value !== null && value !== undefined) {\n (instance as any)[key] = value;\n }\n }\n\n return instance;\n }\n\n /**\n * Create and deserialize a new instance of a message type\n */\n createAndDeserialize<T>(messageType: string, data: any): T {\n // Try to get factory method using cross-package delegation\n let factoryMethod;\n \n if (this.factory.getFactoryMethod) {\n factoryMethod = this.factory.getFactoryMethod(messageType);\n } else {\n // Fallback to simple method name lookup\n const factoryMethodName = this.getFactoryMethodName(messageType);\n factoryMethod = (this.factory as any)[factoryMethodName];\n }\n\n if (!factoryMethod) {\n throw new Error(`Could not find factory method to deserialize: ${messageType}`)\n }\n\n const result = factoryMethod(undefined, undefined, undefined, data);\n if (result.fullyLoaded) {\n return result.instance;\n } else {\n return this.deserialize(result.instance, data, messageType);\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 { FieldSchema, MessageSchema } from './types.js';\n\n/**\n * Base schema registry with utility methods for schema operations\n */\nexport class BaseSchemaRegistry {\n constructor(protected schemaRegistry: Record<string, MessageSchema>) {}\n\n /**\n * Get schema for a message type\n */\n getSchema(messageType: string): MessageSchema | undefined {\n return this.schemaRegistry[messageType];\n }\n\n /**\n * Get field schema by name\n */\n getFieldSchema(messageType: string, fieldName: string): FieldSchema | undefined {\n const schema = this.getSchema(messageType);\n return schema?.fields.find(field => field.name === fieldName);\n }\n\n /**\n * Get field schema by proto field ID\n */\n getFieldSchemaById(messageType: string, fieldId: number): FieldSchema | undefined {\n const schema = this.getSchema(messageType);\n return schema?.fields.find(field => field.id === fieldId);\n }\n\n /**\n * Check if field is part of a oneof group\n */\n isOneofField(messageType: string, fieldName: string): boolean {\n const fieldSchema = this.getFieldSchema(messageType, fieldName);\n return fieldSchema?.oneofGroup !== undefined;\n }\n\n /**\n * Get all fields in a oneof group\n */\n getOneofFields(messageType: string, oneofGroup: string): FieldSchema[] {\n const schema = this.getSchema(messageType);\n return schema?.fields.filter(field => field.oneofGroup === oneofGroup) || [];\n }\n}\n"]}
1
+ {"version":3,"sources":["../../src/schema/types.ts","../../src/schema/base-deserializer.ts","../../src/schema/base-registry.ts"],"names":["FieldType"],"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 * Field type enumeration for proto field types\n */\nexport enum FieldType {\n STRING = \"string\",\n NUMBER = \"number\", \n BOOLEAN = \"boolean\",\n MESSAGE = \"message\",\n REPEATED = \"repeated\",\n MAP = \"map\",\n ONEOF = \"oneof\"\n}\n\n/**\n * Schema interface for field definitions\n */\nexport interface FieldSchema {\n name: string;\n type: FieldType;\n id: number; // Proto field number (e.g., text_query = 1)\n messageType?: string; // For MESSAGE type fields\n repeated?: boolean; // For array fields\n mapKeyType?: FieldType; // For MAP type fields\n mapValueType?: FieldType | string; // For MAP type fields\n oneofGroup?: string; // For ONEOF fields\n optional?: boolean;\n}\n\n/**\n * Message schema interface\n */\nexport interface MessageSchema {\n name: string;\n fields: FieldSchema[];\n oneofGroups?: string[]; // List of oneof group names\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 { FieldType, FieldSchema, MessageSchema } from './types.js';\nimport { FactoryInterface, FactoryResult } from '../types/factory.js';\n\n/**\n * Interface for types that have a static MESSAGE_TYPE field\n * This allows us to infer the message type from the class itself\n */\nexport interface MessageTypeProvider {\n readonly MESSAGE_TYPE: string;\n}\n\n/**\n * Constructor type that provides MESSAGE_TYPE\n * Used as a constraint for generic deserialization\n */\nexport type MessageTypeConstructor<T> = {\n new(...args: any[]): T;\n readonly MESSAGE_TYPE: string;\n};\n\n\n/**\n * Base deserializer class containing all non-template-dependent logic\n */\nexport abstract class BaseDeserializer {\n protected constructor(\n protected schemaRegistry: Record<string, MessageSchema>,\n protected factory: FactoryInterface\n ) {}\n\n /**\n * Deserialize an object using schema information\n * @param instance The target instance to populate\n * @param data The source data to deserialize from\n * @param messageType The fully qualified message type (e.g., \"library.v1.Book\")\n * @returns The populated instance\n */\n deserialize<T>(instance: T, data: any, messageType: string): T {\n if (!data || typeof data !== 'object') {\n return instance;\n }\n\n const schema = this.schemaRegistry[messageType];\n if (!schema) {\n // Fallback to simple property copying if no schema found\n return this.fallbackDeserialize(instance, data);\n }\n\n // Process each field according to its schema\n for (const fieldSchema of schema.fields) {\n const fieldValue = data[fieldSchema.name];\n if (fieldValue === null || fieldValue === undefined) {\n continue;\n }\n\n this.deserializeField(instance, fieldSchema, fieldValue);\n }\n\n return instance;\n }\n\n /**\n * Deserialize a single field based on its schema\n */\n protected deserializeField(instance: any, fieldSchema: FieldSchema, fieldValue: any): void {\n const fieldName = fieldSchema.name;\n\n switch (fieldSchema.type) {\n case FieldType.STRING:\n case FieldType.NUMBER:\n case FieldType.BOOLEAN:\n // Simple primitive types - direct assignment\n instance[fieldName] = fieldValue;\n break;\n\n case FieldType.MESSAGE:\n if (fieldSchema.repeated) {\n // Handle repeated message fields (arrays)\n instance[fieldName] = this.deserializeMessageArray(\n fieldValue,\n fieldSchema.messageType!,\n instance,\n fieldName\n );\n } else {\n // Handle single message field\n instance[fieldName] = this.deserializeMessageField(\n fieldValue,\n fieldSchema.messageType!,\n instance,\n fieldName\n );\n }\n break;\n\n case FieldType.REPEATED:\n // Handle repeated primitive fields\n if (Array.isArray(fieldValue)) {\n instance[fieldName] = [...fieldValue]; // Simple copy for primitives\n }\n break;\n\n case FieldType.ONEOF:\n // Handle oneof fields (would need additional logic for union types)\n instance[fieldName] = fieldValue;\n break;\n\n case FieldType.MAP:\n // Handle map fields (would need additional schema info for key/value types)\n instance[fieldName] = { ...fieldValue };\n break;\n\n default:\n // Fallback to direct assignment\n instance[fieldName] = fieldValue;\n break;\n }\n }\n\n /**\n * Deserialize a single message field\n */\n protected deserializeMessageField(\n fieldValue: any,\n messageType: string,\n parent: any,\n attributeName: string\n ): any {\n // Try to get factory method using cross-package delegation\n let factoryMethod;\n \n if (this.factory.getFactoryMethod) {\n factoryMethod = this.factory.getFactoryMethod(messageType);\n } else {\n // Fallback to simple method name lookup\n const factoryMethodName = this.getFactoryMethodName(messageType);\n factoryMethod = (this.factory as any)[factoryMethodName];\n }\n\n if (factoryMethod) {\n const result = factoryMethod(parent, attributeName, undefined, fieldValue);\n if (result.fullyLoaded) {\n return result.instance;\n } else {\n // Factory created instance but didn't populate - use deserializer\n return this.deserialize(result.instance, fieldValue, messageType);\n }\n }\n\n // No factory method found - fallback\n return this.fallbackDeserialize({}, fieldValue);\n }\n\n /**\n * Deserialize an array of message objects\n */\n protected deserializeMessageArray(\n fieldValue: any[],\n messageType: string,\n parent: any,\n attributeName: string\n ): any[] {\n if (!Array.isArray(fieldValue)) {\n return [];\n }\n\n // Try to get factory method using cross-package delegation\n let factoryMethod;\n \n if (this.factory.getFactoryMethod) {\n factoryMethod = this.factory.getFactoryMethod(messageType);\n } else {\n // Fallback to simple method name lookup\n const factoryMethodName = this.getFactoryMethodName(messageType);\n factoryMethod = (this.factory as any)[factoryMethodName];\n }\n\n return fieldValue.map((item, index) => {\n if (factoryMethod) {\n const result = factoryMethod(parent, attributeName, index, item);\n if (result.fullyLoaded) {\n return result.instance;\n } else {\n // Factory created instance but didn't populate - use deserializer\n return this.deserialize(result.instance, item, messageType);\n }\n }\n\n // No factory method found - fallback\n return this.fallbackDeserialize({}, item);\n });\n }\n\n /**\n * Convert message type to factory method name\n * \"library.v1.Book\" -> \"newBook\"\n */\n protected getFactoryMethodName(messageType: string): string {\n const parts = messageType.split('.');\n const typeName = parts[parts.length - 1]; // Get last part (e.g., \"Book\")\n return 'new' + typeName;\n }\n\n /**\n * Fallback deserializer for when no schema is available\n */\n protected fallbackDeserialize<T>(instance: T, data: any): T {\n if (!data || typeof data !== 'object') {\n return instance;\n }\n\n for (const [key, value] of Object.entries(data)) {\n if (value !== null && value !== undefined) {\n (instance as any)[key] = value;\n }\n }\n\n return instance;\n }\n\n\n /**\n * Static utility method - infers messageType from type parameter\n * @param typeConstructor Class with static MESSAGE_TYPE field\n * @param data Raw data to deserialize\n * @returns Deserialized instance or null if creation failed\n *\n * @example\n * const user = Deserializer.from(User, rawData);\n * // Instead of: Deserializer.from<User>(User.MESSAGE_TYPE, rawData)\n */\n fromType<T>(\n typeConstructor: MessageTypeConstructor<T>,\n data: any\n ): T | null {\n const messageType = typeConstructor.MESSAGE_TYPE;\n return this.createAndDeserialize<T>(messageType, data);\n }\n\n\n /**\n * Create and deserialize a new instance of a message type\n */\n createAndDeserialize<T>(messageType: string, data: any): T {\n // Try to get factory method using cross-package delegation\n let factoryMethod;\n \n if (this.factory.getFactoryMethod) {\n factoryMethod = this.factory.getFactoryMethod(messageType);\n } else {\n // Fallback to simple method name lookup\n const factoryMethodName = this.getFactoryMethodName(messageType);\n factoryMethod = (this.factory as any)[factoryMethodName];\n }\n\n if (!factoryMethod) {\n throw new Error(`Could not find factory method to deserialize: ${messageType}`)\n }\n\n const result = factoryMethod(undefined, undefined, undefined, data);\n if (result.fullyLoaded) {\n return result.instance;\n } else {\n return this.deserialize(result.instance, data, messageType);\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 { FieldSchema, MessageSchema } from './types.js';\n\n/**\n * Base schema registry with utility methods for schema operations\n */\nexport class BaseSchemaRegistry {\n constructor(protected schemaRegistry: Record<string, MessageSchema>) {}\n\n /**\n * Get schema for a message type\n */\n getSchema(messageType: string): MessageSchema | undefined {\n return this.schemaRegistry[messageType];\n }\n\n /**\n * Get field schema by name\n */\n getFieldSchema(messageType: string, fieldName: string): FieldSchema | undefined {\n const schema = this.getSchema(messageType);\n return schema?.fields.find(field => field.name === fieldName);\n }\n\n /**\n * Get field schema by proto field ID\n */\n getFieldSchemaById(messageType: string, fieldId: number): FieldSchema | undefined {\n const schema = this.getSchema(messageType);\n return schema?.fields.find(field => field.id === fieldId);\n }\n\n /**\n * Check if field is part of a oneof group\n */\n isOneofField(messageType: string, fieldName: string): boolean {\n const fieldSchema = this.getFieldSchema(messageType, fieldName);\n return fieldSchema?.oneofGroup !== undefined;\n }\n\n /**\n * Get all fields in a oneof group\n */\n getOneofFields(messageType: string, oneofGroup: string): FieldSchema[] {\n const schema = this.getSchema(messageType);\n return schema?.fields.filter(field => field.oneofGroup === oneofGroup) || [];\n }\n}\n"]}
@@ -154,6 +154,20 @@ var BaseDeserializer = class {
154
154
  }
155
155
  return instance;
156
156
  }
157
+ /**
158
+ * Static utility method - infers messageType from type parameter
159
+ * @param typeConstructor Class with static MESSAGE_TYPE field
160
+ * @param data Raw data to deserialize
161
+ * @returns Deserialized instance or null if creation failed
162
+ *
163
+ * @example
164
+ * const user = Deserializer.from(User, rawData);
165
+ * // Instead of: Deserializer.from<User>(User.MESSAGE_TYPE, rawData)
166
+ */
167
+ fromType(typeConstructor, data) {
168
+ const messageType = typeConstructor.MESSAGE_TYPE;
169
+ return this.createAndDeserialize(messageType, data);
170
+ }
157
171
  /**
158
172
  * Create and deserialize a new instance of a message type
159
173
  */
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/schema/types.ts","../../src/schema/base-deserializer.ts","../../src/schema/base-registry.ts"],"names":["FieldType"],"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 * Field type enumeration for proto field types\n */\nexport enum FieldType {\n STRING = \"string\",\n NUMBER = \"number\", \n BOOLEAN = \"boolean\",\n MESSAGE = \"message\",\n REPEATED = \"repeated\",\n MAP = \"map\",\n ONEOF = \"oneof\"\n}\n\n/**\n * Schema interface for field definitions\n */\nexport interface FieldSchema {\n name: string;\n type: FieldType;\n id: number; // Proto field number (e.g., text_query = 1)\n messageType?: string; // For MESSAGE type fields\n repeated?: boolean; // For array fields\n mapKeyType?: FieldType; // For MAP type fields\n mapValueType?: FieldType | string; // For MAP type fields\n oneofGroup?: string; // For ONEOF fields\n optional?: boolean;\n}\n\n/**\n * Message schema interface\n */\nexport interface MessageSchema {\n name: string;\n fields: FieldSchema[];\n oneofGroups?: string[]; // List of oneof group names\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 { FieldType, FieldSchema, MessageSchema } from './types.js';\nimport { FactoryInterface, FactoryResult } from '../types/factory.js';\n\n/**\n * Base deserializer class containing all non-template-dependent logic\n */\nexport abstract class BaseDeserializer {\n protected constructor(\n protected schemaRegistry: Record<string, MessageSchema>,\n protected factory: FactoryInterface\n ) {}\n\n /**\n * Deserialize an object using schema information\n * @param instance The target instance to populate\n * @param data The source data to deserialize from\n * @param messageType The fully qualified message type (e.g., \"library.v1.Book\")\n * @returns The populated instance\n */\n deserialize<T>(instance: T, data: any, messageType: string): T {\n if (!data || typeof data !== 'object') {\n return instance;\n }\n\n const schema = this.schemaRegistry[messageType];\n if (!schema) {\n // Fallback to simple property copying if no schema found\n return this.fallbackDeserialize(instance, data);\n }\n\n // Process each field according to its schema\n for (const fieldSchema of schema.fields) {\n const fieldValue = data[fieldSchema.name];\n if (fieldValue === null || fieldValue === undefined) {\n continue;\n }\n\n this.deserializeField(instance, fieldSchema, fieldValue);\n }\n\n return instance;\n }\n\n /**\n * Deserialize a single field based on its schema\n */\n protected deserializeField(instance: any, fieldSchema: FieldSchema, fieldValue: any): void {\n const fieldName = fieldSchema.name;\n\n switch (fieldSchema.type) {\n case FieldType.STRING:\n case FieldType.NUMBER:\n case FieldType.BOOLEAN:\n // Simple primitive types - direct assignment\n instance[fieldName] = fieldValue;\n break;\n\n case FieldType.MESSAGE:\n if (fieldSchema.repeated) {\n // Handle repeated message fields (arrays)\n instance[fieldName] = this.deserializeMessageArray(\n fieldValue,\n fieldSchema.messageType!,\n instance,\n fieldName\n );\n } else {\n // Handle single message field\n instance[fieldName] = this.deserializeMessageField(\n fieldValue,\n fieldSchema.messageType!,\n instance,\n fieldName\n );\n }\n break;\n\n case FieldType.REPEATED:\n // Handle repeated primitive fields\n if (Array.isArray(fieldValue)) {\n instance[fieldName] = [...fieldValue]; // Simple copy for primitives\n }\n break;\n\n case FieldType.ONEOF:\n // Handle oneof fields (would need additional logic for union types)\n instance[fieldName] = fieldValue;\n break;\n\n case FieldType.MAP:\n // Handle map fields (would need additional schema info for key/value types)\n instance[fieldName] = { ...fieldValue };\n break;\n\n default:\n // Fallback to direct assignment\n instance[fieldName] = fieldValue;\n break;\n }\n }\n\n /**\n * Deserialize a single message field\n */\n protected deserializeMessageField(\n fieldValue: any,\n messageType: string,\n parent: any,\n attributeName: string\n ): any {\n // Try to get factory method using cross-package delegation\n let factoryMethod;\n \n if (this.factory.getFactoryMethod) {\n factoryMethod = this.factory.getFactoryMethod(messageType);\n } else {\n // Fallback to simple method name lookup\n const factoryMethodName = this.getFactoryMethodName(messageType);\n factoryMethod = (this.factory as any)[factoryMethodName];\n }\n\n if (factoryMethod) {\n const result = factoryMethod(parent, attributeName, undefined, fieldValue);\n if (result.fullyLoaded) {\n return result.instance;\n } else {\n // Factory created instance but didn't populate - use deserializer\n return this.deserialize(result.instance, fieldValue, messageType);\n }\n }\n\n // No factory method found - fallback\n return this.fallbackDeserialize({}, fieldValue);\n }\n\n /**\n * Deserialize an array of message objects\n */\n protected deserializeMessageArray(\n fieldValue: any[],\n messageType: string,\n parent: any,\n attributeName: string\n ): any[] {\n if (!Array.isArray(fieldValue)) {\n return [];\n }\n\n // Try to get factory method using cross-package delegation\n let factoryMethod;\n \n if (this.factory.getFactoryMethod) {\n factoryMethod = this.factory.getFactoryMethod(messageType);\n } else {\n // Fallback to simple method name lookup\n const factoryMethodName = this.getFactoryMethodName(messageType);\n factoryMethod = (this.factory as any)[factoryMethodName];\n }\n\n return fieldValue.map((item, index) => {\n if (factoryMethod) {\n const result = factoryMethod(parent, attributeName, index, item);\n if (result.fullyLoaded) {\n return result.instance;\n } else {\n // Factory created instance but didn't populate - use deserializer\n return this.deserialize(result.instance, item, messageType);\n }\n }\n\n // No factory method found - fallback\n return this.fallbackDeserialize({}, item);\n });\n }\n\n /**\n * Convert message type to factory method name\n * \"library.v1.Book\" -> \"newBook\"\n */\n protected getFactoryMethodName(messageType: string): string {\n const parts = messageType.split('.');\n const typeName = parts[parts.length - 1]; // Get last part (e.g., \"Book\")\n return 'new' + typeName;\n }\n\n /**\n * Fallback deserializer for when no schema is available\n */\n protected fallbackDeserialize<T>(instance: T, data: any): T {\n if (!data || typeof data !== 'object') {\n return instance;\n }\n\n for (const [key, value] of Object.entries(data)) {\n if (value !== null && value !== undefined) {\n (instance as any)[key] = value;\n }\n }\n\n return instance;\n }\n\n /**\n * Create and deserialize a new instance of a message type\n */\n createAndDeserialize<T>(messageType: string, data: any): T {\n // Try to get factory method using cross-package delegation\n let factoryMethod;\n \n if (this.factory.getFactoryMethod) {\n factoryMethod = this.factory.getFactoryMethod(messageType);\n } else {\n // Fallback to simple method name lookup\n const factoryMethodName = this.getFactoryMethodName(messageType);\n factoryMethod = (this.factory as any)[factoryMethodName];\n }\n\n if (!factoryMethod) {\n throw new Error(`Could not find factory method to deserialize: ${messageType}`)\n }\n\n const result = factoryMethod(undefined, undefined, undefined, data);\n if (result.fullyLoaded) {\n return result.instance;\n } else {\n return this.deserialize(result.instance, data, messageType);\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 { FieldSchema, MessageSchema } from './types.js';\n\n/**\n * Base schema registry with utility methods for schema operations\n */\nexport class BaseSchemaRegistry {\n constructor(protected schemaRegistry: Record<string, MessageSchema>) {}\n\n /**\n * Get schema for a message type\n */\n getSchema(messageType: string): MessageSchema | undefined {\n return this.schemaRegistry[messageType];\n }\n\n /**\n * Get field schema by name\n */\n getFieldSchema(messageType: string, fieldName: string): FieldSchema | undefined {\n const schema = this.getSchema(messageType);\n return schema?.fields.find(field => field.name === fieldName);\n }\n\n /**\n * Get field schema by proto field ID\n */\n getFieldSchemaById(messageType: string, fieldId: number): FieldSchema | undefined {\n const schema = this.getSchema(messageType);\n return schema?.fields.find(field => field.id === fieldId);\n }\n\n /**\n * Check if field is part of a oneof group\n */\n isOneofField(messageType: string, fieldName: string): boolean {\n const fieldSchema = this.getFieldSchema(messageType, fieldName);\n return fieldSchema?.oneofGroup !== undefined;\n }\n\n /**\n * Get all fields in a oneof group\n */\n getOneofFields(messageType: string, oneofGroup: string): FieldSchema[] {\n const schema = this.getSchema(messageType);\n return schema?.fields.filter(field => field.oneofGroup === oneofGroup) || [];\n }\n}\n"]}
1
+ {"version":3,"sources":["../../src/schema/types.ts","../../src/schema/base-deserializer.ts","../../src/schema/base-registry.ts"],"names":["FieldType"],"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 * Field type enumeration for proto field types\n */\nexport enum FieldType {\n STRING = \"string\",\n NUMBER = \"number\", \n BOOLEAN = \"boolean\",\n MESSAGE = \"message\",\n REPEATED = \"repeated\",\n MAP = \"map\",\n ONEOF = \"oneof\"\n}\n\n/**\n * Schema interface for field definitions\n */\nexport interface FieldSchema {\n name: string;\n type: FieldType;\n id: number; // Proto field number (e.g., text_query = 1)\n messageType?: string; // For MESSAGE type fields\n repeated?: boolean; // For array fields\n mapKeyType?: FieldType; // For MAP type fields\n mapValueType?: FieldType | string; // For MAP type fields\n oneofGroup?: string; // For ONEOF fields\n optional?: boolean;\n}\n\n/**\n * Message schema interface\n */\nexport interface MessageSchema {\n name: string;\n fields: FieldSchema[];\n oneofGroups?: string[]; // List of oneof group names\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 { FieldType, FieldSchema, MessageSchema } from './types.js';\nimport { FactoryInterface, FactoryResult } from '../types/factory.js';\n\n/**\n * Interface for types that have a static MESSAGE_TYPE field\n * This allows us to infer the message type from the class itself\n */\nexport interface MessageTypeProvider {\n readonly MESSAGE_TYPE: string;\n}\n\n/**\n * Constructor type that provides MESSAGE_TYPE\n * Used as a constraint for generic deserialization\n */\nexport type MessageTypeConstructor<T> = {\n new(...args: any[]): T;\n readonly MESSAGE_TYPE: string;\n};\n\n\n/**\n * Base deserializer class containing all non-template-dependent logic\n */\nexport abstract class BaseDeserializer {\n protected constructor(\n protected schemaRegistry: Record<string, MessageSchema>,\n protected factory: FactoryInterface\n ) {}\n\n /**\n * Deserialize an object using schema information\n * @param instance The target instance to populate\n * @param data The source data to deserialize from\n * @param messageType The fully qualified message type (e.g., \"library.v1.Book\")\n * @returns The populated instance\n */\n deserialize<T>(instance: T, data: any, messageType: string): T {\n if (!data || typeof data !== 'object') {\n return instance;\n }\n\n const schema = this.schemaRegistry[messageType];\n if (!schema) {\n // Fallback to simple property copying if no schema found\n return this.fallbackDeserialize(instance, data);\n }\n\n // Process each field according to its schema\n for (const fieldSchema of schema.fields) {\n const fieldValue = data[fieldSchema.name];\n if (fieldValue === null || fieldValue === undefined) {\n continue;\n }\n\n this.deserializeField(instance, fieldSchema, fieldValue);\n }\n\n return instance;\n }\n\n /**\n * Deserialize a single field based on its schema\n */\n protected deserializeField(instance: any, fieldSchema: FieldSchema, fieldValue: any): void {\n const fieldName = fieldSchema.name;\n\n switch (fieldSchema.type) {\n case FieldType.STRING:\n case FieldType.NUMBER:\n case FieldType.BOOLEAN:\n // Simple primitive types - direct assignment\n instance[fieldName] = fieldValue;\n break;\n\n case FieldType.MESSAGE:\n if (fieldSchema.repeated) {\n // Handle repeated message fields (arrays)\n instance[fieldName] = this.deserializeMessageArray(\n fieldValue,\n fieldSchema.messageType!,\n instance,\n fieldName\n );\n } else {\n // Handle single message field\n instance[fieldName] = this.deserializeMessageField(\n fieldValue,\n fieldSchema.messageType!,\n instance,\n fieldName\n );\n }\n break;\n\n case FieldType.REPEATED:\n // Handle repeated primitive fields\n if (Array.isArray(fieldValue)) {\n instance[fieldName] = [...fieldValue]; // Simple copy for primitives\n }\n break;\n\n case FieldType.ONEOF:\n // Handle oneof fields (would need additional logic for union types)\n instance[fieldName] = fieldValue;\n break;\n\n case FieldType.MAP:\n // Handle map fields (would need additional schema info for key/value types)\n instance[fieldName] = { ...fieldValue };\n break;\n\n default:\n // Fallback to direct assignment\n instance[fieldName] = fieldValue;\n break;\n }\n }\n\n /**\n * Deserialize a single message field\n */\n protected deserializeMessageField(\n fieldValue: any,\n messageType: string,\n parent: any,\n attributeName: string\n ): any {\n // Try to get factory method using cross-package delegation\n let factoryMethod;\n \n if (this.factory.getFactoryMethod) {\n factoryMethod = this.factory.getFactoryMethod(messageType);\n } else {\n // Fallback to simple method name lookup\n const factoryMethodName = this.getFactoryMethodName(messageType);\n factoryMethod = (this.factory as any)[factoryMethodName];\n }\n\n if (factoryMethod) {\n const result = factoryMethod(parent, attributeName, undefined, fieldValue);\n if (result.fullyLoaded) {\n return result.instance;\n } else {\n // Factory created instance but didn't populate - use deserializer\n return this.deserialize(result.instance, fieldValue, messageType);\n }\n }\n\n // No factory method found - fallback\n return this.fallbackDeserialize({}, fieldValue);\n }\n\n /**\n * Deserialize an array of message objects\n */\n protected deserializeMessageArray(\n fieldValue: any[],\n messageType: string,\n parent: any,\n attributeName: string\n ): any[] {\n if (!Array.isArray(fieldValue)) {\n return [];\n }\n\n // Try to get factory method using cross-package delegation\n let factoryMethod;\n \n if (this.factory.getFactoryMethod) {\n factoryMethod = this.factory.getFactoryMethod(messageType);\n } else {\n // Fallback to simple method name lookup\n const factoryMethodName = this.getFactoryMethodName(messageType);\n factoryMethod = (this.factory as any)[factoryMethodName];\n }\n\n return fieldValue.map((item, index) => {\n if (factoryMethod) {\n const result = factoryMethod(parent, attributeName, index, item);\n if (result.fullyLoaded) {\n return result.instance;\n } else {\n // Factory created instance but didn't populate - use deserializer\n return this.deserialize(result.instance, item, messageType);\n }\n }\n\n // No factory method found - fallback\n return this.fallbackDeserialize({}, item);\n });\n }\n\n /**\n * Convert message type to factory method name\n * \"library.v1.Book\" -> \"newBook\"\n */\n protected getFactoryMethodName(messageType: string): string {\n const parts = messageType.split('.');\n const typeName = parts[parts.length - 1]; // Get last part (e.g., \"Book\")\n return 'new' + typeName;\n }\n\n /**\n * Fallback deserializer for when no schema is available\n */\n protected fallbackDeserialize<T>(instance: T, data: any): T {\n if (!data || typeof data !== 'object') {\n return instance;\n }\n\n for (const [key, value] of Object.entries(data)) {\n if (value !== null && value !== undefined) {\n (instance as any)[key] = value;\n }\n }\n\n return instance;\n }\n\n\n /**\n * Static utility method - infers messageType from type parameter\n * @param typeConstructor Class with static MESSAGE_TYPE field\n * @param data Raw data to deserialize\n * @returns Deserialized instance or null if creation failed\n *\n * @example\n * const user = Deserializer.from(User, rawData);\n * // Instead of: Deserializer.from<User>(User.MESSAGE_TYPE, rawData)\n */\n fromType<T>(\n typeConstructor: MessageTypeConstructor<T>,\n data: any\n ): T | null {\n const messageType = typeConstructor.MESSAGE_TYPE;\n return this.createAndDeserialize<T>(messageType, data);\n }\n\n\n /**\n * Create and deserialize a new instance of a message type\n */\n createAndDeserialize<T>(messageType: string, data: any): T {\n // Try to get factory method using cross-package delegation\n let factoryMethod;\n \n if (this.factory.getFactoryMethod) {\n factoryMethod = this.factory.getFactoryMethod(messageType);\n } else {\n // Fallback to simple method name lookup\n const factoryMethodName = this.getFactoryMethodName(messageType);\n factoryMethod = (this.factory as any)[factoryMethodName];\n }\n\n if (!factoryMethod) {\n throw new Error(`Could not find factory method to deserialize: ${messageType}`)\n }\n\n const result = factoryMethod(undefined, undefined, undefined, data);\n if (result.fullyLoaded) {\n return result.instance;\n } else {\n return this.deserialize(result.instance, data, messageType);\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 { FieldSchema, MessageSchema } from './types.js';\n\n/**\n * Base schema registry with utility methods for schema operations\n */\nexport class BaseSchemaRegistry {\n constructor(protected schemaRegistry: Record<string, MessageSchema>) {}\n\n /**\n * Get schema for a message type\n */\n getSchema(messageType: string): MessageSchema | undefined {\n return this.schemaRegistry[messageType];\n }\n\n /**\n * Get field schema by name\n */\n getFieldSchema(messageType: string, fieldName: string): FieldSchema | undefined {\n const schema = this.getSchema(messageType);\n return schema?.fields.find(field => field.name === fieldName);\n }\n\n /**\n * Get field schema by proto field ID\n */\n getFieldSchemaById(messageType: string, fieldId: number): FieldSchema | undefined {\n const schema = this.getSchema(messageType);\n return schema?.fields.find(field => field.id === fieldId);\n }\n\n /**\n * Check if field is part of a oneof group\n */\n isOneofField(messageType: string, fieldName: string): boolean {\n const fieldSchema = this.getFieldSchema(messageType, fieldName);\n return fieldSchema?.oneofGroup !== undefined;\n }\n\n /**\n * Get all fields in a oneof group\n */\n getOneofFields(messageType: string, oneofGroup: string): FieldSchema[] {\n const schema = this.getSchema(messageType);\n return schema?.fields.filter(field => field.oneofGroup === oneofGroup) || [];\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@protoc-gen-go-wasmjs/runtime",
3
- "version": "0.0.25",
3
+ "version": "0.0.27",
4
4
  "description": "Runtime utilities for protoc-gen-go-wasmjs generated code",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",