@opsimathically/nodenetproccalld 0.0.2 → 0.0.3

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.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/classes/apikeyauthorizer/ApiKeyAuthorizer.class.ts","../src/classes/configfileloader/ConfigFileLoader.class.ts","../node_modules/json5/dist/index.mjs","../src/classes/configvalidator/ConfigValidator.class.ts","../src/classes/daemoncli/DaemonCli.class.ts","../src/classes/networkprocedurecalldaemon/NetworkProcedureCallDaemon.class.ts","../src/classes/daemonprocess/DaemonProcess.class.ts","../src/classes/defaultconfiggenerator/DefaultConfigGenerator.class.ts","../src/classes/tlsmaterialgenerator/TlsMaterialGenerator.class.ts"],"sourcesContent":["import { ApiKeyAuthorizer } from '@src/classes/apikeyauthorizer/ApiKeyAuthorizer.class';\nimport { ConfigFileLoader } from '@src/classes/configfileloader/ConfigFileLoader.class';\nimport { ConfigValidator } from '@src/classes/configvalidator/ConfigValidator.class';\nimport { DaemonCli } from '@src/classes/daemoncli/DaemonCli.class';\nimport { DaemonProcess } from '@src/classes/daemonprocess/DaemonProcess.class';\nimport { DefaultConfigGenerator } from '@src/classes/defaultconfiggenerator/DefaultConfigGenerator.class';\nimport { NetworkProcedureCallDaemon } from '@src/classes/networkprocedurecalldaemon/NetworkProcedureCallDaemon.class';\nimport { TlsMaterialGenerator } from '@src/classes/tlsmaterialgenerator/TlsMaterialGenerator.class';\n\nexport {\n ApiKeyAuthorizer,\n ConfigFileLoader,\n ConfigValidator,\n DaemonCli,\n DaemonProcess,\n DefaultConfigGenerator,\n NetworkProcedureCallDaemon,\n TlsMaterialGenerator\n};\n\nexport type {\n daemon_api_key_entry_t,\n daemon_api_keys_config_file_t,\n daemon_api_key_identity_constraints_t,\n daemon_cli_options_t,\n daemon_config_paths_t,\n daemon_default_config_generation_options_t,\n daemon_generated_default_config_t,\n daemon_generated_tls_material_t,\n daemon_observability_config_t,\n daemon_runtime_api_key_entry_t,\n daemon_runtime_config_t,\n daemon_server_config_file_t,\n daemon_tls_generation_options_t,\n daemon_tls_file_config_t,\n daemon_worker_config_t\n} from '@src/types/project_types';\n\nasync function StartDaemonFromCli(): Promise<void> {\n const daemon_cli = new DaemonCli();\n const cli_options = daemon_cli.parseOptions();\n if (cli_options.help) {\n daemon_cli.printHelp();\n return;\n }\n\n if (cli_options.default_config_generation.enabled) {\n const default_config_generator = new DefaultConfigGenerator();\n const generated_default_config = default_config_generator.generateDefaultConfig({\n default_config_generation_options: cli_options.default_config_generation\n });\n\n console.log('Default config generated successfully.');\n console.log(`Output directory: ${generated_default_config.output_dir}`);\n console.log(`Server config: ${generated_default_config.server_config_path}`);\n console.log(`API keys config: ${generated_default_config.api_keys_config_path}`);\n return;\n }\n\n if (cli_options.tls_generation.enabled) {\n const tls_material_generator = new TlsMaterialGenerator();\n const generated_tls_material = tls_material_generator.generateTlsMaterial({\n tls_generation_options: cli_options.tls_generation\n });\n\n console.log('TLS material generated successfully.');\n console.log(`Output directory: ${generated_tls_material.output_dir}`);\n console.log(`CA cert: ${generated_tls_material.ca_cert_path}`);\n console.log(`Server cert: ${generated_tls_material.server_cert_path}`);\n console.log(`Server key: ${generated_tls_material.server_key_path}`);\n console.log(`Client cert: ${generated_tls_material.client_cert_path}`);\n console.log(`Client key: ${generated_tls_material.client_key_path}`);\n console.log('');\n console.log(\n 'If using default config, set tls_mtls key_file/cert_file/ca_file in config/server.config.json5 to these files.'\n );\n return;\n }\n\n const daemon_process = new DaemonProcess({\n config_paths: {\n server_config_path: cli_options.server_config_path,\n api_keys_config_path: cli_options.api_keys_config_path\n }\n });\n\n await daemon_process.run();\n}\n\nif (require.main === module) {\n void StartDaemonFromCli().catch((error) => {\n const error_message = error instanceof Error ? error.stack ?? error.message : String(error);\n console.error(`Daemon startup failed: ${error_message}`);\n process.exitCode = 1;\n });\n}\n","import crypto from 'node:crypto';\n\nimport type { networkprocedurecall_auth_success_t } from '@opsimathically/networkprocedurecall';\n\nimport type {\n daemon_auth_callback_params_t,\n daemon_runtime_api_key_entry_t\n} from '@src/types/project_types';\n\nfunction SafeTimingEqual(params: { left_value: string; right_value: string }): boolean {\n const left_buffer = Buffer.from(params.left_value, 'utf8');\n const right_buffer = Buffer.from(params.right_value, 'utf8');\n\n if (left_buffer.length !== right_buffer.length) {\n const left_digest = crypto.createHash('sha256').update(left_buffer).digest();\n const right_digest = crypto.createHash('sha256').update(right_buffer).digest();\n crypto.timingSafeEqual(left_digest, right_digest);\n return false;\n }\n\n return crypto.timingSafeEqual(left_buffer, right_buffer);\n}\n\nexport class ApiKeyAuthorizer {\n private readonly api_key_entries: daemon_runtime_api_key_entry_t[];\n\n constructor(params: { api_key_entries: daemon_runtime_api_key_entry_t[] }) {\n this.api_key_entries = [...params.api_key_entries];\n }\n\n async authenticate(params: {\n auth_callback_params: daemon_auth_callback_params_t;\n }): Promise<'failed' | networkprocedurecall_auth_success_t> {\n for (const api_key_entry of this.api_key_entries) {\n if (!api_key_entry.enabled) {\n continue;\n }\n\n if (\n !SafeTimingEqual({\n left_value: api_key_entry.api_key,\n right_value: params.auth_callback_params.api_key\n })\n ) {\n continue;\n }\n\n if (\n !this.matchesIdentityConstraints({\n api_key_entry,\n auth_callback_params: params.auth_callback_params\n })\n ) {\n continue;\n }\n\n return {\n state: 'authenticated',\n privileges: [...api_key_entry.privileges]\n };\n }\n\n return 'failed';\n }\n\n private matchesIdentityConstraints(params: {\n api_key_entry: daemon_runtime_api_key_entry_t;\n auth_callback_params: daemon_auth_callback_params_t;\n }): boolean {\n const constraints = params.api_key_entry.identity_constraints;\n if (!constraints) {\n return true;\n }\n\n if (\n constraints.remote_address_regex &&\n !constraints.remote_address_regex.test(params.auth_callback_params.remote_address)\n ) {\n return false;\n }\n if (\n constraints.tls_peer_subject_regex &&\n !this.matchOptionalValue({\n regex: constraints.tls_peer_subject_regex,\n value: params.auth_callback_params.tls_peer_subject\n })\n ) {\n return false;\n }\n if (\n constraints.tls_peer_san_regex &&\n !this.matchOptionalValue({\n regex: constraints.tls_peer_san_regex,\n value: params.auth_callback_params.tls_peer_san\n })\n ) {\n return false;\n }\n if (\n constraints.tls_peer_fingerprint256_regex &&\n !this.matchOptionalValue({\n regex: constraints.tls_peer_fingerprint256_regex,\n value: params.auth_callback_params.tls_peer_fingerprint256\n })\n ) {\n return false;\n }\n if (\n constraints.tls_peer_serial_number_regex &&\n !this.matchOptionalValue({\n regex: constraints.tls_peer_serial_number_regex,\n value: params.auth_callback_params.tls_peer_serial_number\n })\n ) {\n return false;\n }\n\n return true;\n }\n\n private matchOptionalValue(params: { regex: RegExp; value?: string }): boolean {\n if (!params.value) {\n return false;\n }\n return params.regex.test(params.value);\n }\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\n\nimport JSON5 from 'json5';\n\nimport { ConfigValidator } from '@src/classes/configvalidator/ConfigValidator.class';\n\nimport type {\n daemon_config_paths_t,\n daemon_resolved_tls_mtls_t,\n daemon_runtime_config_t,\n daemon_tls_file_config_t\n} from '@src/types/project_types';\n\nfunction ReadUtf8File(params: { file_path: string }): string {\n try {\n return fs.readFileSync(params.file_path, 'utf8');\n } catch (error) {\n const error_message = error instanceof Error ? error.message : String(error);\n throw new Error(`Unable to read file \"${params.file_path}\": ${error_message}`);\n }\n}\n\nfunction ResolvePath(params: { file_path: string; base_dir: string }): string {\n if (path.isAbsolute(params.file_path)) {\n return params.file_path;\n }\n return path.resolve(params.base_dir, params.file_path);\n}\n\nfunction ParseJson5(params: { content: string; source_path: string }): unknown {\n try {\n return JSON5.parse(params.content);\n } catch (error) {\n const error_message = error instanceof Error ? error.message : String(error);\n throw new Error(`Invalid JSON5 in \"${params.source_path}\": ${error_message}`);\n }\n}\n\nexport class ConfigFileLoader {\n private readonly config_validator: ConfigValidator;\n\n constructor(params?: { config_validator?: ConfigValidator }) {\n this.config_validator = params?.config_validator ?? new ConfigValidator();\n }\n\n loadDaemonConfig(params: { config_paths: daemon_config_paths_t }): daemon_runtime_config_t {\n const server_config_path = ResolvePath({\n file_path: params.config_paths.server_config_path,\n base_dir: process.cwd()\n });\n const api_keys_config_path = ResolvePath({\n file_path: params.config_paths.api_keys_config_path,\n base_dir: process.cwd()\n });\n\n const server_config_raw = this.readJson5File({\n file_path: server_config_path\n });\n const api_keys_config_raw = this.readJson5File({\n file_path: api_keys_config_path\n });\n\n const server_config = this.config_validator.validateServerConfig({\n server_config_raw\n });\n const api_keys_config = this.config_validator.validateApiKeysConfig({\n api_keys_config_raw\n });\n\n const runtime_tls_mtls = this.resolveTlsMaterial({\n tls_file_config: server_config.tls_mtls,\n config_file_dir: path.dirname(server_config_path)\n });\n\n const runtime_api_keys = this.config_validator.toRuntimeApiKeysConfig({\n api_keys_config\n });\n\n return {\n server_config: {\n ...server_config,\n tls_mtls: runtime_tls_mtls\n },\n api_keys_config: {\n api_keys: runtime_api_keys\n }\n };\n }\n\n private readJson5File(params: { file_path: string }): unknown {\n const file_content = ReadUtf8File({\n file_path: params.file_path\n });\n return ParseJson5({\n content: file_content,\n source_path: params.file_path\n });\n }\n\n private resolveTlsMaterial(params: {\n tls_file_config: daemon_tls_file_config_t;\n config_file_dir: string;\n }): daemon_resolved_tls_mtls_t {\n const key_pem = this.readPemFile({\n pem_path: params.tls_file_config.key_file,\n config_file_dir: params.config_file_dir,\n label: 'tls_mtls.key_file'\n });\n const cert_pem = this.readPemFile({\n pem_path: params.tls_file_config.cert_file,\n config_file_dir: params.config_file_dir,\n label: 'tls_mtls.cert_file'\n });\n const ca_pem = this.readPemFile({\n pem_path: params.tls_file_config.ca_file,\n config_file_dir: params.config_file_dir,\n label: 'tls_mtls.ca_file'\n });\n const crl_pem = params.tls_file_config.crl_file\n ? this.readPemFile({\n pem_path: params.tls_file_config.crl_file,\n config_file_dir: params.config_file_dir,\n label: 'tls_mtls.crl_file'\n })\n : undefined;\n\n return {\n key_pem,\n cert_pem,\n ca_pem,\n crl_pem,\n min_version: params.tls_file_config.min_version,\n cipher_suites: params.tls_file_config.cipher_suites,\n handshake_timeout_ms: params.tls_file_config.handshake_timeout_ms,\n request_timeout_ms: params.tls_file_config.request_timeout_ms,\n max_frame_bytes: params.tls_file_config.max_frame_bytes\n };\n }\n\n private readPemFile(params: {\n pem_path: string;\n config_file_dir: string;\n label: string;\n }): string {\n const absolute_file_path = ResolvePath({\n file_path: params.pem_path,\n base_dir: params.config_file_dir\n });\n\n const pem_content = ReadUtf8File({\n file_path: absolute_file_path\n }).trim();\n\n if (!pem_content.includes('BEGIN')) {\n throw new Error(\n `File \"${absolute_file_path}\" for ${params.label} does not look like a PEM file.`\n );\n }\n\n return `${pem_content}\\n`;\n }\n}\n","// This is a generated file. Do not edit.\nvar Space_Separator = /[\\u1680\\u2000-\\u200A\\u202F\\u205F\\u3000]/;\nvar ID_Start = /[\\xAA\\xB5\\xBA\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0370-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\u052F\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0620-\\u064A\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06E5\\u06E6\\u06EE\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA\\u07F4\\u07F5\\u07FA\\u0800-\\u0815\\u081A\\u0824\\u0828\\u0840-\\u0858\\u0860-\\u086A\\u08A0-\\u08B4\\u08B6-\\u08BD\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0971-\\u0980\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF-\\u09E1\\u09F0\\u09F1\\u09FC\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0AF9\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D\\u0C58-\\u0C5A\\u0C60\\u0C61\\u0C80\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDE\\u0CE0\\u0CE1\\u0CF1\\u0CF2\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D\\u0D4E\\u0D54-\\u0D56\\u0D5F-\\u0D61\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E46\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EDC-\\u0EDF\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8C\\u1000-\\u102A\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u13A0-\\u13F5\\u13F8-\\u13FD\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16EE-\\u16F8\\u1700-\\u170C\\u170E-\\u1711\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17D7\\u17DC\\u1820-\\u1877\\u1880-\\u1884\\u1887-\\u18A8\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19B0-\\u19C9\\u1A00-\\u1A16\\u1A20-\\u1A54\\u1AA7\\u1B05-\\u1B33\\u1B45-\\u1B4B\\u1B83-\\u1BA0\\u1BAE\\u1BAF\\u1BBA-\\u1BE5\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C7D\\u1C80-\\u1C88\\u1CE9-\\u1CEC\\u1CEE-\\u1CF1\\u1CF5\\u1CF6\\u1D00-\\u1DBF\\u1E00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2071\\u207F\\u2090-\\u209C\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2160-\\u2188\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CEE\\u2CF2\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2E2F\\u3005-\\u3007\\u3021-\\u3029\\u3031-\\u3035\\u3038-\\u303C\\u3041-\\u3096\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312E\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FEA\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA61F\\uA62A\\uA62B\\uA640-\\uA66E\\uA67F-\\uA69D\\uA6A0-\\uA6EF\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA7AE\\uA7B0-\\uA7B7\\uA7F7-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA8F2-\\uA8F7\\uA8FB\\uA8FD\\uA90A-\\uA925\\uA930-\\uA946\\uA960-\\uA97C\\uA984-\\uA9B2\\uA9CF\\uA9E0-\\uA9E4\\uA9E6-\\uA9EF\\uA9FA-\\uA9FE\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAA60-\\uAA76\\uAA7A\\uAA7E-\\uAAAF\\uAAB1\\uAAB5\\uAAB6\\uAAB9-\\uAABD\\uAAC0\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEA\\uAAF2-\\uAAF4\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAB30-\\uAB5A\\uAB5C-\\uAB65\\uAB70-\\uABE2\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC]|\\uD800[\\uDC00-\\uDC0B\\uDC0D-\\uDC26\\uDC28-\\uDC3A\\uDC3C\\uDC3D\\uDC3F-\\uDC4D\\uDC50-\\uDC5D\\uDC80-\\uDCFA\\uDD40-\\uDD74\\uDE80-\\uDE9C\\uDEA0-\\uDED0\\uDF00-\\uDF1F\\uDF2D-\\uDF4A\\uDF50-\\uDF75\\uDF80-\\uDF9D\\uDFA0-\\uDFC3\\uDFC8-\\uDFCF\\uDFD1-\\uDFD5]|\\uD801[\\uDC00-\\uDC9D\\uDCB0-\\uDCD3\\uDCD8-\\uDCFB\\uDD00-\\uDD27\\uDD30-\\uDD63\\uDE00-\\uDF36\\uDF40-\\uDF55\\uDF60-\\uDF67]|\\uD802[\\uDC00-\\uDC05\\uDC08\\uDC0A-\\uDC35\\uDC37\\uDC38\\uDC3C\\uDC3F-\\uDC55\\uDC60-\\uDC76\\uDC80-\\uDC9E\\uDCE0-\\uDCF2\\uDCF4\\uDCF5\\uDD00-\\uDD15\\uDD20-\\uDD39\\uDD80-\\uDDB7\\uDDBE\\uDDBF\\uDE00\\uDE10-\\uDE13\\uDE15-\\uDE17\\uDE19-\\uDE33\\uDE60-\\uDE7C\\uDE80-\\uDE9C\\uDEC0-\\uDEC7\\uDEC9-\\uDEE4\\uDF00-\\uDF35\\uDF40-\\uDF55\\uDF60-\\uDF72\\uDF80-\\uDF91]|\\uD803[\\uDC00-\\uDC48\\uDC80-\\uDCB2\\uDCC0-\\uDCF2]|\\uD804[\\uDC03-\\uDC37\\uDC83-\\uDCAF\\uDCD0-\\uDCE8\\uDD03-\\uDD26\\uDD50-\\uDD72\\uDD76\\uDD83-\\uDDB2\\uDDC1-\\uDDC4\\uDDDA\\uDDDC\\uDE00-\\uDE11\\uDE13-\\uDE2B\\uDE80-\\uDE86\\uDE88\\uDE8A-\\uDE8D\\uDE8F-\\uDE9D\\uDE9F-\\uDEA8\\uDEB0-\\uDEDE\\uDF05-\\uDF0C\\uDF0F\\uDF10\\uDF13-\\uDF28\\uDF2A-\\uDF30\\uDF32\\uDF33\\uDF35-\\uDF39\\uDF3D\\uDF50\\uDF5D-\\uDF61]|\\uD805[\\uDC00-\\uDC34\\uDC47-\\uDC4A\\uDC80-\\uDCAF\\uDCC4\\uDCC5\\uDCC7\\uDD80-\\uDDAE\\uDDD8-\\uDDDB\\uDE00-\\uDE2F\\uDE44\\uDE80-\\uDEAA\\uDF00-\\uDF19]|\\uD806[\\uDCA0-\\uDCDF\\uDCFF\\uDE00\\uDE0B-\\uDE32\\uDE3A\\uDE50\\uDE5C-\\uDE83\\uDE86-\\uDE89\\uDEC0-\\uDEF8]|\\uD807[\\uDC00-\\uDC08\\uDC0A-\\uDC2E\\uDC40\\uDC72-\\uDC8F\\uDD00-\\uDD06\\uDD08\\uDD09\\uDD0B-\\uDD30\\uDD46]|\\uD808[\\uDC00-\\uDF99]|\\uD809[\\uDC00-\\uDC6E\\uDC80-\\uDD43]|[\\uD80C\\uD81C-\\uD820\\uD840-\\uD868\\uD86A-\\uD86C\\uD86F-\\uD872\\uD874-\\uD879][\\uDC00-\\uDFFF]|\\uD80D[\\uDC00-\\uDC2E]|\\uD811[\\uDC00-\\uDE46]|\\uD81A[\\uDC00-\\uDE38\\uDE40-\\uDE5E\\uDED0-\\uDEED\\uDF00-\\uDF2F\\uDF40-\\uDF43\\uDF63-\\uDF77\\uDF7D-\\uDF8F]|\\uD81B[\\uDF00-\\uDF44\\uDF50\\uDF93-\\uDF9F\\uDFE0\\uDFE1]|\\uD821[\\uDC00-\\uDFEC]|\\uD822[\\uDC00-\\uDEF2]|\\uD82C[\\uDC00-\\uDD1E\\uDD70-\\uDEFB]|\\uD82F[\\uDC00-\\uDC6A\\uDC70-\\uDC7C\\uDC80-\\uDC88\\uDC90-\\uDC99]|\\uD835[\\uDC00-\\uDC54\\uDC56-\\uDC9C\\uDC9E\\uDC9F\\uDCA2\\uDCA5\\uDCA6\\uDCA9-\\uDCAC\\uDCAE-\\uDCB9\\uDCBB\\uDCBD-\\uDCC3\\uDCC5-\\uDD05\\uDD07-\\uDD0A\\uDD0D-\\uDD14\\uDD16-\\uDD1C\\uDD1E-\\uDD39\\uDD3B-\\uDD3E\\uDD40-\\uDD44\\uDD46\\uDD4A-\\uDD50\\uDD52-\\uDEA5\\uDEA8-\\uDEC0\\uDEC2-\\uDEDA\\uDEDC-\\uDEFA\\uDEFC-\\uDF14\\uDF16-\\uDF34\\uDF36-\\uDF4E\\uDF50-\\uDF6E\\uDF70-\\uDF88\\uDF8A-\\uDFA8\\uDFAA-\\uDFC2\\uDFC4-\\uDFCB]|\\uD83A[\\uDC00-\\uDCC4\\uDD00-\\uDD43]|\\uD83B[\\uDE00-\\uDE03\\uDE05-\\uDE1F\\uDE21\\uDE22\\uDE24\\uDE27\\uDE29-\\uDE32\\uDE34-\\uDE37\\uDE39\\uDE3B\\uDE42\\uDE47\\uDE49\\uDE4B\\uDE4D-\\uDE4F\\uDE51\\uDE52\\uDE54\\uDE57\\uDE59\\uDE5B\\uDE5D\\uDE5F\\uDE61\\uDE62\\uDE64\\uDE67-\\uDE6A\\uDE6C-\\uDE72\\uDE74-\\uDE77\\uDE79-\\uDE7C\\uDE7E\\uDE80-\\uDE89\\uDE8B-\\uDE9B\\uDEA1-\\uDEA3\\uDEA5-\\uDEA9\\uDEAB-\\uDEBB]|\\uD869[\\uDC00-\\uDED6\\uDF00-\\uDFFF]|\\uD86D[\\uDC00-\\uDF34\\uDF40-\\uDFFF]|\\uD86E[\\uDC00-\\uDC1D\\uDC20-\\uDFFF]|\\uD873[\\uDC00-\\uDEA1\\uDEB0-\\uDFFF]|\\uD87A[\\uDC00-\\uDFE0]|\\uD87E[\\uDC00-\\uDE1D]/;\nvar ID_Continue = /[\\xAA\\xB5\\xBA\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0300-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u0483-\\u0487\\u048A-\\u052F\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u0591-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0610-\\u061A\\u0620-\\u0669\\u066E-\\u06D3\\u06D5-\\u06DC\\u06DF-\\u06E8\\u06EA-\\u06FC\\u06FF\\u0710-\\u074A\\u074D-\\u07B1\\u07C0-\\u07F5\\u07FA\\u0800-\\u082D\\u0840-\\u085B\\u0860-\\u086A\\u08A0-\\u08B4\\u08B6-\\u08BD\\u08D4-\\u08E1\\u08E3-\\u0963\\u0966-\\u096F\\u0971-\\u0983\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BC-\\u09C4\\u09C7\\u09C8\\u09CB-\\u09CE\\u09D7\\u09DC\\u09DD\\u09DF-\\u09E3\\u09E6-\\u09F1\\u09FC\\u0A01-\\u0A03\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A3C\\u0A3E-\\u0A42\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A51\\u0A59-\\u0A5C\\u0A5E\\u0A66-\\u0A75\\u0A81-\\u0A83\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABC-\\u0AC5\\u0AC7-\\u0AC9\\u0ACB-\\u0ACD\\u0AD0\\u0AE0-\\u0AE3\\u0AE6-\\u0AEF\\u0AF9-\\u0AFF\\u0B01-\\u0B03\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3C-\\u0B44\\u0B47\\u0B48\\u0B4B-\\u0B4D\\u0B56\\u0B57\\u0B5C\\u0B5D\\u0B5F-\\u0B63\\u0B66-\\u0B6F\\u0B71\\u0B82\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BBE-\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCD\\u0BD0\\u0BD7\\u0BE6-\\u0BEF\\u0C00-\\u0C03\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D-\\u0C44\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56\\u0C58-\\u0C5A\\u0C60-\\u0C63\\u0C66-\\u0C6F\\u0C80-\\u0C83\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBC-\\u0CC4\\u0CC6-\\u0CC8\\u0CCA-\\u0CCD\\u0CD5\\u0CD6\\u0CDE\\u0CE0-\\u0CE3\\u0CE6-\\u0CEF\\u0CF1\\u0CF2\\u0D00-\\u0D03\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D44\\u0D46-\\u0D48\\u0D4A-\\u0D4E\\u0D54-\\u0D57\\u0D5F-\\u0D63\\u0D66-\\u0D6F\\u0D7A-\\u0D7F\\u0D82\\u0D83\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0DCA\\u0DCF-\\u0DD4\\u0DD6\\u0DD8-\\u0DDF\\u0DE6-\\u0DEF\\u0DF2\\u0DF3\\u0E01-\\u0E3A\\u0E40-\\u0E4E\\u0E50-\\u0E59\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB9\\u0EBB-\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EC8-\\u0ECD\\u0ED0-\\u0ED9\\u0EDC-\\u0EDF\\u0F00\\u0F18\\u0F19\\u0F20-\\u0F29\\u0F35\\u0F37\\u0F39\\u0F3E-\\u0F47\\u0F49-\\u0F6C\\u0F71-\\u0F84\\u0F86-\\u0F97\\u0F99-\\u0FBC\\u0FC6\\u1000-\\u1049\\u1050-\\u109D\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u135D-\\u135F\\u1380-\\u138F\\u13A0-\\u13F5\\u13F8-\\u13FD\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16EE-\\u16F8\\u1700-\\u170C\\u170E-\\u1714\\u1720-\\u1734\\u1740-\\u1753\\u1760-\\u176C\\u176E-\\u1770\\u1772\\u1773\\u1780-\\u17D3\\u17D7\\u17DC\\u17DD\\u17E0-\\u17E9\\u180B-\\u180D\\u1810-\\u1819\\u1820-\\u1877\\u1880-\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1920-\\u192B\\u1930-\\u193B\\u1946-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19B0-\\u19C9\\u19D0-\\u19D9\\u1A00-\\u1A1B\\u1A20-\\u1A5E\\u1A60-\\u1A7C\\u1A7F-\\u1A89\\u1A90-\\u1A99\\u1AA7\\u1AB0-\\u1ABD\\u1B00-\\u1B4B\\u1B50-\\u1B59\\u1B6B-\\u1B73\\u1B80-\\u1BF3\\u1C00-\\u1C37\\u1C40-\\u1C49\\u1C4D-\\u1C7D\\u1C80-\\u1C88\\u1CD0-\\u1CD2\\u1CD4-\\u1CF9\\u1D00-\\u1DF9\\u1DFB-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u203F\\u2040\\u2054\\u2071\\u207F\\u2090-\\u209C\\u20D0-\\u20DC\\u20E1\\u20E5-\\u20F0\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2160-\\u2188\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D7F-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2DE0-\\u2DFF\\u2E2F\\u3005-\\u3007\\u3021-\\u302F\\u3031-\\u3035\\u3038-\\u303C\\u3041-\\u3096\\u3099\\u309A\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312E\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FEA\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA62B\\uA640-\\uA66F\\uA674-\\uA67D\\uA67F-\\uA6F1\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA7AE\\uA7B0-\\uA7B7\\uA7F7-\\uA827\\uA840-\\uA873\\uA880-\\uA8C5\\uA8D0-\\uA8D9\\uA8E0-\\uA8F7\\uA8FB\\uA8FD\\uA900-\\uA92D\\uA930-\\uA953\\uA960-\\uA97C\\uA980-\\uA9C0\\uA9CF-\\uA9D9\\uA9E0-\\uA9FE\\uAA00-\\uAA36\\uAA40-\\uAA4D\\uAA50-\\uAA59\\uAA60-\\uAA76\\uAA7A-\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEF\\uAAF2-\\uAAF6\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAB30-\\uAB5A\\uAB5C-\\uAB65\\uAB70-\\uABEA\\uABEC\\uABED\\uABF0-\\uABF9\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE00-\\uFE0F\\uFE20-\\uFE2F\\uFE33\\uFE34\\uFE4D-\\uFE4F\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF10-\\uFF19\\uFF21-\\uFF3A\\uFF3F\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC]|\\uD800[\\uDC00-\\uDC0B\\uDC0D-\\uDC26\\uDC28-\\uDC3A\\uDC3C\\uDC3D\\uDC3F-\\uDC4D\\uDC50-\\uDC5D\\uDC80-\\uDCFA\\uDD40-\\uDD74\\uDDFD\\uDE80-\\uDE9C\\uDEA0-\\uDED0\\uDEE0\\uDF00-\\uDF1F\\uDF2D-\\uDF4A\\uDF50-\\uDF7A\\uDF80-\\uDF9D\\uDFA0-\\uDFC3\\uDFC8-\\uDFCF\\uDFD1-\\uDFD5]|\\uD801[\\uDC00-\\uDC9D\\uDCA0-\\uDCA9\\uDCB0-\\uDCD3\\uDCD8-\\uDCFB\\uDD00-\\uDD27\\uDD30-\\uDD63\\uDE00-\\uDF36\\uDF40-\\uDF55\\uDF60-\\uDF67]|\\uD802[\\uDC00-\\uDC05\\uDC08\\uDC0A-\\uDC35\\uDC37\\uDC38\\uDC3C\\uDC3F-\\uDC55\\uDC60-\\uDC76\\uDC80-\\uDC9E\\uDCE0-\\uDCF2\\uDCF4\\uDCF5\\uDD00-\\uDD15\\uDD20-\\uDD39\\uDD80-\\uDDB7\\uDDBE\\uDDBF\\uDE00-\\uDE03\\uDE05\\uDE06\\uDE0C-\\uDE13\\uDE15-\\uDE17\\uDE19-\\uDE33\\uDE38-\\uDE3A\\uDE3F\\uDE60-\\uDE7C\\uDE80-\\uDE9C\\uDEC0-\\uDEC7\\uDEC9-\\uDEE6\\uDF00-\\uDF35\\uDF40-\\uDF55\\uDF60-\\uDF72\\uDF80-\\uDF91]|\\uD803[\\uDC00-\\uDC48\\uDC80-\\uDCB2\\uDCC0-\\uDCF2]|\\uD804[\\uDC00-\\uDC46\\uDC66-\\uDC6F\\uDC7F-\\uDCBA\\uDCD0-\\uDCE8\\uDCF0-\\uDCF9\\uDD00-\\uDD34\\uDD36-\\uDD3F\\uDD50-\\uDD73\\uDD76\\uDD80-\\uDDC4\\uDDCA-\\uDDCC\\uDDD0-\\uDDDA\\uDDDC\\uDE00-\\uDE11\\uDE13-\\uDE37\\uDE3E\\uDE80-\\uDE86\\uDE88\\uDE8A-\\uDE8D\\uDE8F-\\uDE9D\\uDE9F-\\uDEA8\\uDEB0-\\uDEEA\\uDEF0-\\uDEF9\\uDF00-\\uDF03\\uDF05-\\uDF0C\\uDF0F\\uDF10\\uDF13-\\uDF28\\uDF2A-\\uDF30\\uDF32\\uDF33\\uDF35-\\uDF39\\uDF3C-\\uDF44\\uDF47\\uDF48\\uDF4B-\\uDF4D\\uDF50\\uDF57\\uDF5D-\\uDF63\\uDF66-\\uDF6C\\uDF70-\\uDF74]|\\uD805[\\uDC00-\\uDC4A\\uDC50-\\uDC59\\uDC80-\\uDCC5\\uDCC7\\uDCD0-\\uDCD9\\uDD80-\\uDDB5\\uDDB8-\\uDDC0\\uDDD8-\\uDDDD\\uDE00-\\uDE40\\uDE44\\uDE50-\\uDE59\\uDE80-\\uDEB7\\uDEC0-\\uDEC9\\uDF00-\\uDF19\\uDF1D-\\uDF2B\\uDF30-\\uDF39]|\\uD806[\\uDCA0-\\uDCE9\\uDCFF\\uDE00-\\uDE3E\\uDE47\\uDE50-\\uDE83\\uDE86-\\uDE99\\uDEC0-\\uDEF8]|\\uD807[\\uDC00-\\uDC08\\uDC0A-\\uDC36\\uDC38-\\uDC40\\uDC50-\\uDC59\\uDC72-\\uDC8F\\uDC92-\\uDCA7\\uDCA9-\\uDCB6\\uDD00-\\uDD06\\uDD08\\uDD09\\uDD0B-\\uDD36\\uDD3A\\uDD3C\\uDD3D\\uDD3F-\\uDD47\\uDD50-\\uDD59]|\\uD808[\\uDC00-\\uDF99]|\\uD809[\\uDC00-\\uDC6E\\uDC80-\\uDD43]|[\\uD80C\\uD81C-\\uD820\\uD840-\\uD868\\uD86A-\\uD86C\\uD86F-\\uD872\\uD874-\\uD879][\\uDC00-\\uDFFF]|\\uD80D[\\uDC00-\\uDC2E]|\\uD811[\\uDC00-\\uDE46]|\\uD81A[\\uDC00-\\uDE38\\uDE40-\\uDE5E\\uDE60-\\uDE69\\uDED0-\\uDEED\\uDEF0-\\uDEF4\\uDF00-\\uDF36\\uDF40-\\uDF43\\uDF50-\\uDF59\\uDF63-\\uDF77\\uDF7D-\\uDF8F]|\\uD81B[\\uDF00-\\uDF44\\uDF50-\\uDF7E\\uDF8F-\\uDF9F\\uDFE0\\uDFE1]|\\uD821[\\uDC00-\\uDFEC]|\\uD822[\\uDC00-\\uDEF2]|\\uD82C[\\uDC00-\\uDD1E\\uDD70-\\uDEFB]|\\uD82F[\\uDC00-\\uDC6A\\uDC70-\\uDC7C\\uDC80-\\uDC88\\uDC90-\\uDC99\\uDC9D\\uDC9E]|\\uD834[\\uDD65-\\uDD69\\uDD6D-\\uDD72\\uDD7B-\\uDD82\\uDD85-\\uDD8B\\uDDAA-\\uDDAD\\uDE42-\\uDE44]|\\uD835[\\uDC00-\\uDC54\\uDC56-\\uDC9C\\uDC9E\\uDC9F\\uDCA2\\uDCA5\\uDCA6\\uDCA9-\\uDCAC\\uDCAE-\\uDCB9\\uDCBB\\uDCBD-\\uDCC3\\uDCC5-\\uDD05\\uDD07-\\uDD0A\\uDD0D-\\uDD14\\uDD16-\\uDD1C\\uDD1E-\\uDD39\\uDD3B-\\uDD3E\\uDD40-\\uDD44\\uDD46\\uDD4A-\\uDD50\\uDD52-\\uDEA5\\uDEA8-\\uDEC0\\uDEC2-\\uDEDA\\uDEDC-\\uDEFA\\uDEFC-\\uDF14\\uDF16-\\uDF34\\uDF36-\\uDF4E\\uDF50-\\uDF6E\\uDF70-\\uDF88\\uDF8A-\\uDFA8\\uDFAA-\\uDFC2\\uDFC4-\\uDFCB\\uDFCE-\\uDFFF]|\\uD836[\\uDE00-\\uDE36\\uDE3B-\\uDE6C\\uDE75\\uDE84\\uDE9B-\\uDE9F\\uDEA1-\\uDEAF]|\\uD838[\\uDC00-\\uDC06\\uDC08-\\uDC18\\uDC1B-\\uDC21\\uDC23\\uDC24\\uDC26-\\uDC2A]|\\uD83A[\\uDC00-\\uDCC4\\uDCD0-\\uDCD6\\uDD00-\\uDD4A\\uDD50-\\uDD59]|\\uD83B[\\uDE00-\\uDE03\\uDE05-\\uDE1F\\uDE21\\uDE22\\uDE24\\uDE27\\uDE29-\\uDE32\\uDE34-\\uDE37\\uDE39\\uDE3B\\uDE42\\uDE47\\uDE49\\uDE4B\\uDE4D-\\uDE4F\\uDE51\\uDE52\\uDE54\\uDE57\\uDE59\\uDE5B\\uDE5D\\uDE5F\\uDE61\\uDE62\\uDE64\\uDE67-\\uDE6A\\uDE6C-\\uDE72\\uDE74-\\uDE77\\uDE79-\\uDE7C\\uDE7E\\uDE80-\\uDE89\\uDE8B-\\uDE9B\\uDEA1-\\uDEA3\\uDEA5-\\uDEA9\\uDEAB-\\uDEBB]|\\uD869[\\uDC00-\\uDED6\\uDF00-\\uDFFF]|\\uD86D[\\uDC00-\\uDF34\\uDF40-\\uDFFF]|\\uD86E[\\uDC00-\\uDC1D\\uDC20-\\uDFFF]|\\uD873[\\uDC00-\\uDEA1\\uDEB0-\\uDFFF]|\\uD87A[\\uDC00-\\uDFE0]|\\uD87E[\\uDC00-\\uDE1D]|\\uDB40[\\uDD00-\\uDDEF]/;\n\nvar unicode = {\n\tSpace_Separator: Space_Separator,\n\tID_Start: ID_Start,\n\tID_Continue: ID_Continue\n};\n\nvar util = {\n isSpaceSeparator (c) {\n return typeof c === 'string' && unicode.Space_Separator.test(c)\n },\n\n isIdStartChar (c) {\n return typeof c === 'string' && (\n (c >= 'a' && c <= 'z') ||\n (c >= 'A' && c <= 'Z') ||\n (c === '$') || (c === '_') ||\n unicode.ID_Start.test(c)\n )\n },\n\n isIdContinueChar (c) {\n return typeof c === 'string' && (\n (c >= 'a' && c <= 'z') ||\n (c >= 'A' && c <= 'Z') ||\n (c >= '0' && c <= '9') ||\n (c === '$') || (c === '_') ||\n (c === '\\u200C') || (c === '\\u200D') ||\n unicode.ID_Continue.test(c)\n )\n },\n\n isDigit (c) {\n return typeof c === 'string' && /[0-9]/.test(c)\n },\n\n isHexDigit (c) {\n return typeof c === 'string' && /[0-9A-Fa-f]/.test(c)\n },\n};\n\nlet source;\nlet parseState;\nlet stack;\nlet pos;\nlet line;\nlet column;\nlet token;\nlet key;\nlet root;\n\nvar parse = function parse (text, reviver) {\n source = String(text);\n parseState = 'start';\n stack = [];\n pos = 0;\n line = 1;\n column = 0;\n token = undefined;\n key = undefined;\n root = undefined;\n\n do {\n token = lex();\n\n // This code is unreachable.\n // if (!parseStates[parseState]) {\n // throw invalidParseState()\n // }\n\n parseStates[parseState]();\n } while (token.type !== 'eof')\n\n if (typeof reviver === 'function') {\n return internalize({'': root}, '', reviver)\n }\n\n return root\n};\n\nfunction internalize (holder, name, reviver) {\n const value = holder[name];\n if (value != null && typeof value === 'object') {\n if (Array.isArray(value)) {\n for (let i = 0; i < value.length; i++) {\n const key = String(i);\n const replacement = internalize(value, key, reviver);\n if (replacement === undefined) {\n delete value[key];\n } else {\n Object.defineProperty(value, key, {\n value: replacement,\n writable: true,\n enumerable: true,\n configurable: true,\n });\n }\n }\n } else {\n for (const key in value) {\n const replacement = internalize(value, key, reviver);\n if (replacement === undefined) {\n delete value[key];\n } else {\n Object.defineProperty(value, key, {\n value: replacement,\n writable: true,\n enumerable: true,\n configurable: true,\n });\n }\n }\n }\n }\n\n return reviver.call(holder, name, value)\n}\n\nlet lexState;\nlet buffer;\nlet doubleQuote;\nlet sign;\nlet c;\n\nfunction lex () {\n lexState = 'default';\n buffer = '';\n doubleQuote = false;\n sign = 1;\n\n for (;;) {\n c = peek();\n\n // This code is unreachable.\n // if (!lexStates[lexState]) {\n // throw invalidLexState(lexState)\n // }\n\n const token = lexStates[lexState]();\n if (token) {\n return token\n }\n }\n}\n\nfunction peek () {\n if (source[pos]) {\n return String.fromCodePoint(source.codePointAt(pos))\n }\n}\n\nfunction read () {\n const c = peek();\n\n if (c === '\\n') {\n line++;\n column = 0;\n } else if (c) {\n column += c.length;\n } else {\n column++;\n }\n\n if (c) {\n pos += c.length;\n }\n\n return c\n}\n\nconst lexStates = {\n default () {\n switch (c) {\n case '\\t':\n case '\\v':\n case '\\f':\n case ' ':\n case '\\u00A0':\n case '\\uFEFF':\n case '\\n':\n case '\\r':\n case '\\u2028':\n case '\\u2029':\n read();\n return\n\n case '/':\n read();\n lexState = 'comment';\n return\n\n case undefined:\n read();\n return newToken('eof')\n }\n\n if (util.isSpaceSeparator(c)) {\n read();\n return\n }\n\n // This code is unreachable.\n // if (!lexStates[parseState]) {\n // throw invalidLexState(parseState)\n // }\n\n return lexStates[parseState]()\n },\n\n comment () {\n switch (c) {\n case '*':\n read();\n lexState = 'multiLineComment';\n return\n\n case '/':\n read();\n lexState = 'singleLineComment';\n return\n }\n\n throw invalidChar(read())\n },\n\n multiLineComment () {\n switch (c) {\n case '*':\n read();\n lexState = 'multiLineCommentAsterisk';\n return\n\n case undefined:\n throw invalidChar(read())\n }\n\n read();\n },\n\n multiLineCommentAsterisk () {\n switch (c) {\n case '*':\n read();\n return\n\n case '/':\n read();\n lexState = 'default';\n return\n\n case undefined:\n throw invalidChar(read())\n }\n\n read();\n lexState = 'multiLineComment';\n },\n\n singleLineComment () {\n switch (c) {\n case '\\n':\n case '\\r':\n case '\\u2028':\n case '\\u2029':\n read();\n lexState = 'default';\n return\n\n case undefined:\n read();\n return newToken('eof')\n }\n\n read();\n },\n\n value () {\n switch (c) {\n case '{':\n case '[':\n return newToken('punctuator', read())\n\n case 'n':\n read();\n literal('ull');\n return newToken('null', null)\n\n case 't':\n read();\n literal('rue');\n return newToken('boolean', true)\n\n case 'f':\n read();\n literal('alse');\n return newToken('boolean', false)\n\n case '-':\n case '+':\n if (read() === '-') {\n sign = -1;\n }\n\n lexState = 'sign';\n return\n\n case '.':\n buffer = read();\n lexState = 'decimalPointLeading';\n return\n\n case '0':\n buffer = read();\n lexState = 'zero';\n return\n\n case '1':\n case '2':\n case '3':\n case '4':\n case '5':\n case '6':\n case '7':\n case '8':\n case '9':\n buffer = read();\n lexState = 'decimalInteger';\n return\n\n case 'I':\n read();\n literal('nfinity');\n return newToken('numeric', Infinity)\n\n case 'N':\n read();\n literal('aN');\n return newToken('numeric', NaN)\n\n case '\"':\n case \"'\":\n doubleQuote = (read() === '\"');\n buffer = '';\n lexState = 'string';\n return\n }\n\n throw invalidChar(read())\n },\n\n identifierNameStartEscape () {\n if (c !== 'u') {\n throw invalidChar(read())\n }\n\n read();\n const u = unicodeEscape();\n switch (u) {\n case '$':\n case '_':\n break\n\n default:\n if (!util.isIdStartChar(u)) {\n throw invalidIdentifier()\n }\n\n break\n }\n\n buffer += u;\n lexState = 'identifierName';\n },\n\n identifierName () {\n switch (c) {\n case '$':\n case '_':\n case '\\u200C':\n case '\\u200D':\n buffer += read();\n return\n\n case '\\\\':\n read();\n lexState = 'identifierNameEscape';\n return\n }\n\n if (util.isIdContinueChar(c)) {\n buffer += read();\n return\n }\n\n return newToken('identifier', buffer)\n },\n\n identifierNameEscape () {\n if (c !== 'u') {\n throw invalidChar(read())\n }\n\n read();\n const u = unicodeEscape();\n switch (u) {\n case '$':\n case '_':\n case '\\u200C':\n case '\\u200D':\n break\n\n default:\n if (!util.isIdContinueChar(u)) {\n throw invalidIdentifier()\n }\n\n break\n }\n\n buffer += u;\n lexState = 'identifierName';\n },\n\n sign () {\n switch (c) {\n case '.':\n buffer = read();\n lexState = 'decimalPointLeading';\n return\n\n case '0':\n buffer = read();\n lexState = 'zero';\n return\n\n case '1':\n case '2':\n case '3':\n case '4':\n case '5':\n case '6':\n case '7':\n case '8':\n case '9':\n buffer = read();\n lexState = 'decimalInteger';\n return\n\n case 'I':\n read();\n literal('nfinity');\n return newToken('numeric', sign * Infinity)\n\n case 'N':\n read();\n literal('aN');\n return newToken('numeric', NaN)\n }\n\n throw invalidChar(read())\n },\n\n zero () {\n switch (c) {\n case '.':\n buffer += read();\n lexState = 'decimalPoint';\n return\n\n case 'e':\n case 'E':\n buffer += read();\n lexState = 'decimalExponent';\n return\n\n case 'x':\n case 'X':\n buffer += read();\n lexState = 'hexadecimal';\n return\n }\n\n return newToken('numeric', sign * 0)\n },\n\n decimalInteger () {\n switch (c) {\n case '.':\n buffer += read();\n lexState = 'decimalPoint';\n return\n\n case 'e':\n case 'E':\n buffer += read();\n lexState = 'decimalExponent';\n return\n }\n\n if (util.isDigit(c)) {\n buffer += read();\n return\n }\n\n return newToken('numeric', sign * Number(buffer))\n },\n\n decimalPointLeading () {\n if (util.isDigit(c)) {\n buffer += read();\n lexState = 'decimalFraction';\n return\n }\n\n throw invalidChar(read())\n },\n\n decimalPoint () {\n switch (c) {\n case 'e':\n case 'E':\n buffer += read();\n lexState = 'decimalExponent';\n return\n }\n\n if (util.isDigit(c)) {\n buffer += read();\n lexState = 'decimalFraction';\n return\n }\n\n return newToken('numeric', sign * Number(buffer))\n },\n\n decimalFraction () {\n switch (c) {\n case 'e':\n case 'E':\n buffer += read();\n lexState = 'decimalExponent';\n return\n }\n\n if (util.isDigit(c)) {\n buffer += read();\n return\n }\n\n return newToken('numeric', sign * Number(buffer))\n },\n\n decimalExponent () {\n switch (c) {\n case '+':\n case '-':\n buffer += read();\n lexState = 'decimalExponentSign';\n return\n }\n\n if (util.isDigit(c)) {\n buffer += read();\n lexState = 'decimalExponentInteger';\n return\n }\n\n throw invalidChar(read())\n },\n\n decimalExponentSign () {\n if (util.isDigit(c)) {\n buffer += read();\n lexState = 'decimalExponentInteger';\n return\n }\n\n throw invalidChar(read())\n },\n\n decimalExponentInteger () {\n if (util.isDigit(c)) {\n buffer += read();\n return\n }\n\n return newToken('numeric', sign * Number(buffer))\n },\n\n hexadecimal () {\n if (util.isHexDigit(c)) {\n buffer += read();\n lexState = 'hexadecimalInteger';\n return\n }\n\n throw invalidChar(read())\n },\n\n hexadecimalInteger () {\n if (util.isHexDigit(c)) {\n buffer += read();\n return\n }\n\n return newToken('numeric', sign * Number(buffer))\n },\n\n string () {\n switch (c) {\n case '\\\\':\n read();\n buffer += escape();\n return\n\n case '\"':\n if (doubleQuote) {\n read();\n return newToken('string', buffer)\n }\n\n buffer += read();\n return\n\n case \"'\":\n if (!doubleQuote) {\n read();\n return newToken('string', buffer)\n }\n\n buffer += read();\n return\n\n case '\\n':\n case '\\r':\n throw invalidChar(read())\n\n case '\\u2028':\n case '\\u2029':\n separatorChar(c);\n break\n\n case undefined:\n throw invalidChar(read())\n }\n\n buffer += read();\n },\n\n start () {\n switch (c) {\n case '{':\n case '[':\n return newToken('punctuator', read())\n\n // This code is unreachable since the default lexState handles eof.\n // case undefined:\n // return newToken('eof')\n }\n\n lexState = 'value';\n },\n\n beforePropertyName () {\n switch (c) {\n case '$':\n case '_':\n buffer = read();\n lexState = 'identifierName';\n return\n\n case '\\\\':\n read();\n lexState = 'identifierNameStartEscape';\n return\n\n case '}':\n return newToken('punctuator', read())\n\n case '\"':\n case \"'\":\n doubleQuote = (read() === '\"');\n lexState = 'string';\n return\n }\n\n if (util.isIdStartChar(c)) {\n buffer += read();\n lexState = 'identifierName';\n return\n }\n\n throw invalidChar(read())\n },\n\n afterPropertyName () {\n if (c === ':') {\n return newToken('punctuator', read())\n }\n\n throw invalidChar(read())\n },\n\n beforePropertyValue () {\n lexState = 'value';\n },\n\n afterPropertyValue () {\n switch (c) {\n case ',':\n case '}':\n return newToken('punctuator', read())\n }\n\n throw invalidChar(read())\n },\n\n beforeArrayValue () {\n if (c === ']') {\n return newToken('punctuator', read())\n }\n\n lexState = 'value';\n },\n\n afterArrayValue () {\n switch (c) {\n case ',':\n case ']':\n return newToken('punctuator', read())\n }\n\n throw invalidChar(read())\n },\n\n end () {\n // This code is unreachable since it's handled by the default lexState.\n // if (c === undefined) {\n // read()\n // return newToken('eof')\n // }\n\n throw invalidChar(read())\n },\n};\n\nfunction newToken (type, value) {\n return {\n type,\n value,\n line,\n column,\n }\n}\n\nfunction literal (s) {\n for (const c of s) {\n const p = peek();\n\n if (p !== c) {\n throw invalidChar(read())\n }\n\n read();\n }\n}\n\nfunction escape () {\n const c = peek();\n switch (c) {\n case 'b':\n read();\n return '\\b'\n\n case 'f':\n read();\n return '\\f'\n\n case 'n':\n read();\n return '\\n'\n\n case 'r':\n read();\n return '\\r'\n\n case 't':\n read();\n return '\\t'\n\n case 'v':\n read();\n return '\\v'\n\n case '0':\n read();\n if (util.isDigit(peek())) {\n throw invalidChar(read())\n }\n\n return '\\0'\n\n case 'x':\n read();\n return hexEscape()\n\n case 'u':\n read();\n return unicodeEscape()\n\n case '\\n':\n case '\\u2028':\n case '\\u2029':\n read();\n return ''\n\n case '\\r':\n read();\n if (peek() === '\\n') {\n read();\n }\n\n return ''\n\n case '1':\n case '2':\n case '3':\n case '4':\n case '5':\n case '6':\n case '7':\n case '8':\n case '9':\n throw invalidChar(read())\n\n case undefined:\n throw invalidChar(read())\n }\n\n return read()\n}\n\nfunction hexEscape () {\n let buffer = '';\n let c = peek();\n\n if (!util.isHexDigit(c)) {\n throw invalidChar(read())\n }\n\n buffer += read();\n\n c = peek();\n if (!util.isHexDigit(c)) {\n throw invalidChar(read())\n }\n\n buffer += read();\n\n return String.fromCodePoint(parseInt(buffer, 16))\n}\n\nfunction unicodeEscape () {\n let buffer = '';\n let count = 4;\n\n while (count-- > 0) {\n const c = peek();\n if (!util.isHexDigit(c)) {\n throw invalidChar(read())\n }\n\n buffer += read();\n }\n\n return String.fromCodePoint(parseInt(buffer, 16))\n}\n\nconst parseStates = {\n start () {\n if (token.type === 'eof') {\n throw invalidEOF()\n }\n\n push();\n },\n\n beforePropertyName () {\n switch (token.type) {\n case 'identifier':\n case 'string':\n key = token.value;\n parseState = 'afterPropertyName';\n return\n\n case 'punctuator':\n // This code is unreachable since it's handled by the lexState.\n // if (token.value !== '}') {\n // throw invalidToken()\n // }\n\n pop();\n return\n\n case 'eof':\n throw invalidEOF()\n }\n\n // This code is unreachable since it's handled by the lexState.\n // throw invalidToken()\n },\n\n afterPropertyName () {\n // This code is unreachable since it's handled by the lexState.\n // if (token.type !== 'punctuator' || token.value !== ':') {\n // throw invalidToken()\n // }\n\n if (token.type === 'eof') {\n throw invalidEOF()\n }\n\n parseState = 'beforePropertyValue';\n },\n\n beforePropertyValue () {\n if (token.type === 'eof') {\n throw invalidEOF()\n }\n\n push();\n },\n\n beforeArrayValue () {\n if (token.type === 'eof') {\n throw invalidEOF()\n }\n\n if (token.type === 'punctuator' && token.value === ']') {\n pop();\n return\n }\n\n push();\n },\n\n afterPropertyValue () {\n // This code is unreachable since it's handled by the lexState.\n // if (token.type !== 'punctuator') {\n // throw invalidToken()\n // }\n\n if (token.type === 'eof') {\n throw invalidEOF()\n }\n\n switch (token.value) {\n case ',':\n parseState = 'beforePropertyName';\n return\n\n case '}':\n pop();\n }\n\n // This code is unreachable since it's handled by the lexState.\n // throw invalidToken()\n },\n\n afterArrayValue () {\n // This code is unreachable since it's handled by the lexState.\n // if (token.type !== 'punctuator') {\n // throw invalidToken()\n // }\n\n if (token.type === 'eof') {\n throw invalidEOF()\n }\n\n switch (token.value) {\n case ',':\n parseState = 'beforeArrayValue';\n return\n\n case ']':\n pop();\n }\n\n // This code is unreachable since it's handled by the lexState.\n // throw invalidToken()\n },\n\n end () {\n // This code is unreachable since it's handled by the lexState.\n // if (token.type !== 'eof') {\n // throw invalidToken()\n // }\n },\n};\n\nfunction push () {\n let value;\n\n switch (token.type) {\n case 'punctuator':\n switch (token.value) {\n case '{':\n value = {};\n break\n\n case '[':\n value = [];\n break\n }\n\n break\n\n case 'null':\n case 'boolean':\n case 'numeric':\n case 'string':\n value = token.value;\n break\n\n // This code is unreachable.\n // default:\n // throw invalidToken()\n }\n\n if (root === undefined) {\n root = value;\n } else {\n const parent = stack[stack.length - 1];\n if (Array.isArray(parent)) {\n parent.push(value);\n } else {\n Object.defineProperty(parent, key, {\n value,\n writable: true,\n enumerable: true,\n configurable: true,\n });\n }\n }\n\n if (value !== null && typeof value === 'object') {\n stack.push(value);\n\n if (Array.isArray(value)) {\n parseState = 'beforeArrayValue';\n } else {\n parseState = 'beforePropertyName';\n }\n } else {\n const current = stack[stack.length - 1];\n if (current == null) {\n parseState = 'end';\n } else if (Array.isArray(current)) {\n parseState = 'afterArrayValue';\n } else {\n parseState = 'afterPropertyValue';\n }\n }\n}\n\nfunction pop () {\n stack.pop();\n\n const current = stack[stack.length - 1];\n if (current == null) {\n parseState = 'end';\n } else if (Array.isArray(current)) {\n parseState = 'afterArrayValue';\n } else {\n parseState = 'afterPropertyValue';\n }\n}\n\n// This code is unreachable.\n// function invalidParseState () {\n// return new Error(`JSON5: invalid parse state '${parseState}'`)\n// }\n\n// This code is unreachable.\n// function invalidLexState (state) {\n// return new Error(`JSON5: invalid lex state '${state}'`)\n// }\n\nfunction invalidChar (c) {\n if (c === undefined) {\n return syntaxError(`JSON5: invalid end of input at ${line}:${column}`)\n }\n\n return syntaxError(`JSON5: invalid character '${formatChar(c)}' at ${line}:${column}`)\n}\n\nfunction invalidEOF () {\n return syntaxError(`JSON5: invalid end of input at ${line}:${column}`)\n}\n\n// This code is unreachable.\n// function invalidToken () {\n// if (token.type === 'eof') {\n// return syntaxError(`JSON5: invalid end of input at ${line}:${column}`)\n// }\n\n// const c = String.fromCodePoint(token.value.codePointAt(0))\n// return syntaxError(`JSON5: invalid character '${formatChar(c)}' at ${line}:${column}`)\n// }\n\nfunction invalidIdentifier () {\n column -= 5;\n return syntaxError(`JSON5: invalid identifier character at ${line}:${column}`)\n}\n\nfunction separatorChar (c) {\n console.warn(`JSON5: '${formatChar(c)}' in strings is not valid ECMAScript; consider escaping`);\n}\n\nfunction formatChar (c) {\n const replacements = {\n \"'\": \"\\\\'\",\n '\"': '\\\\\"',\n '\\\\': '\\\\\\\\',\n '\\b': '\\\\b',\n '\\f': '\\\\f',\n '\\n': '\\\\n',\n '\\r': '\\\\r',\n '\\t': '\\\\t',\n '\\v': '\\\\v',\n '\\0': '\\\\0',\n '\\u2028': '\\\\u2028',\n '\\u2029': '\\\\u2029',\n };\n\n if (replacements[c]) {\n return replacements[c]\n }\n\n if (c < ' ') {\n const hexString = c.charCodeAt(0).toString(16);\n return '\\\\x' + ('00' + hexString).substring(hexString.length)\n }\n\n return c\n}\n\nfunction syntaxError (message) {\n const err = new SyntaxError(message);\n err.lineNumber = line;\n err.columnNumber = column;\n return err\n}\n\nvar stringify = function stringify (value, replacer, space) {\n const stack = [];\n let indent = '';\n let propertyList;\n let replacerFunc;\n let gap = '';\n let quote;\n\n if (\n replacer != null &&\n typeof replacer === 'object' &&\n !Array.isArray(replacer)\n ) {\n space = replacer.space;\n quote = replacer.quote;\n replacer = replacer.replacer;\n }\n\n if (typeof replacer === 'function') {\n replacerFunc = replacer;\n } else if (Array.isArray(replacer)) {\n propertyList = [];\n for (const v of replacer) {\n let item;\n\n if (typeof v === 'string') {\n item = v;\n } else if (\n typeof v === 'number' ||\n v instanceof String ||\n v instanceof Number\n ) {\n item = String(v);\n }\n\n if (item !== undefined && propertyList.indexOf(item) < 0) {\n propertyList.push(item);\n }\n }\n }\n\n if (space instanceof Number) {\n space = Number(space);\n } else if (space instanceof String) {\n space = String(space);\n }\n\n if (typeof space === 'number') {\n if (space > 0) {\n space = Math.min(10, Math.floor(space));\n gap = ' '.substr(0, space);\n }\n } else if (typeof space === 'string') {\n gap = space.substr(0, 10);\n }\n\n return serializeProperty('', {'': value})\n\n function serializeProperty (key, holder) {\n let value = holder[key];\n if (value != null) {\n if (typeof value.toJSON5 === 'function') {\n value = value.toJSON5(key);\n } else if (typeof value.toJSON === 'function') {\n value = value.toJSON(key);\n }\n }\n\n if (replacerFunc) {\n value = replacerFunc.call(holder, key, value);\n }\n\n if (value instanceof Number) {\n value = Number(value);\n } else if (value instanceof String) {\n value = String(value);\n } else if (value instanceof Boolean) {\n value = value.valueOf();\n }\n\n switch (value) {\n case null: return 'null'\n case true: return 'true'\n case false: return 'false'\n }\n\n if (typeof value === 'string') {\n return quoteString(value, false)\n }\n\n if (typeof value === 'number') {\n return String(value)\n }\n\n if (typeof value === 'object') {\n return Array.isArray(value) ? serializeArray(value) : serializeObject(value)\n }\n\n return undefined\n }\n\n function quoteString (value) {\n const quotes = {\n \"'\": 0.1,\n '\"': 0.2,\n };\n\n const replacements = {\n \"'\": \"\\\\'\",\n '\"': '\\\\\"',\n '\\\\': '\\\\\\\\',\n '\\b': '\\\\b',\n '\\f': '\\\\f',\n '\\n': '\\\\n',\n '\\r': '\\\\r',\n '\\t': '\\\\t',\n '\\v': '\\\\v',\n '\\0': '\\\\0',\n '\\u2028': '\\\\u2028',\n '\\u2029': '\\\\u2029',\n };\n\n let product = '';\n\n for (let i = 0; i < value.length; i++) {\n const c = value[i];\n switch (c) {\n case \"'\":\n case '\"':\n quotes[c]++;\n product += c;\n continue\n\n case '\\0':\n if (util.isDigit(value[i + 1])) {\n product += '\\\\x00';\n continue\n }\n }\n\n if (replacements[c]) {\n product += replacements[c];\n continue\n }\n\n if (c < ' ') {\n let hexString = c.charCodeAt(0).toString(16);\n product += '\\\\x' + ('00' + hexString).substring(hexString.length);\n continue\n }\n\n product += c;\n }\n\n const quoteChar = quote || Object.keys(quotes).reduce((a, b) => (quotes[a] < quotes[b]) ? a : b);\n\n product = product.replace(new RegExp(quoteChar, 'g'), replacements[quoteChar]);\n\n return quoteChar + product + quoteChar\n }\n\n function serializeObject (value) {\n if (stack.indexOf(value) >= 0) {\n throw TypeError('Converting circular structure to JSON5')\n }\n\n stack.push(value);\n\n let stepback = indent;\n indent = indent + gap;\n\n let keys = propertyList || Object.keys(value);\n let partial = [];\n for (const key of keys) {\n const propertyString = serializeProperty(key, value);\n if (propertyString !== undefined) {\n let member = serializeKey(key) + ':';\n if (gap !== '') {\n member += ' ';\n }\n member += propertyString;\n partial.push(member);\n }\n }\n\n let final;\n if (partial.length === 0) {\n final = '{}';\n } else {\n let properties;\n if (gap === '') {\n properties = partial.join(',');\n final = '{' + properties + '}';\n } else {\n let separator = ',\\n' + indent;\n properties = partial.join(separator);\n final = '{\\n' + indent + properties + ',\\n' + stepback + '}';\n }\n }\n\n stack.pop();\n indent = stepback;\n return final\n }\n\n function serializeKey (key) {\n if (key.length === 0) {\n return quoteString(key, true)\n }\n\n const firstChar = String.fromCodePoint(key.codePointAt(0));\n if (!util.isIdStartChar(firstChar)) {\n return quoteString(key, true)\n }\n\n for (let i = firstChar.length; i < key.length; i++) {\n if (!util.isIdContinueChar(String.fromCodePoint(key.codePointAt(i)))) {\n return quoteString(key, true)\n }\n }\n\n return key\n }\n\n function serializeArray (value) {\n if (stack.indexOf(value) >= 0) {\n throw TypeError('Converting circular structure to JSON5')\n }\n\n stack.push(value);\n\n let stepback = indent;\n indent = indent + gap;\n\n let partial = [];\n for (let i = 0; i < value.length; i++) {\n const propertyString = serializeProperty(String(i), value);\n partial.push((propertyString !== undefined) ? propertyString : 'null');\n }\n\n let final;\n if (partial.length === 0) {\n final = '[]';\n } else {\n if (gap === '') {\n let properties = partial.join(',');\n final = '[' + properties + ']';\n } else {\n let separator = ',\\n' + indent;\n let properties = partial.join(separator);\n final = '[\\n' + indent + properties + ',\\n' + stepback + ']';\n }\n }\n\n stack.pop();\n indent = stepback;\n return final\n }\n};\n\nconst JSON5 = {\n parse,\n stringify,\n};\n\nvar lib = JSON5;\n\nexport default lib;\n","import { z } from 'zod';\n\nimport type {\n daemon_api_key_entry_t,\n daemon_api_keys_config_file_t,\n daemon_compiled_identity_constraints_t,\n daemon_runtime_api_key_entry_t,\n daemon_server_config_file_t\n} from '@src/types/project_types';\n\nconst privilege_name_list = [\n 'invoke_functions',\n 'define_functions',\n 'undefine_functions',\n 'define_constants',\n 'undefine_constants',\n 'define_dependencies',\n 'undefine_dependencies',\n 'admin_privileges',\n 'all_privileges'\n] as const;\n\nconst tls_min_version_list = ['TLSv1.2', 'TLSv1.3'] as const;\n\nconst worker_runtime_options_schema = z\n .object({\n call_timeout_ms: z.number().int().positive().optional(),\n control_timeout_ms: z.number().int().positive().optional(),\n start_timeout_ms: z.number().int().positive().optional(),\n stop_timeout_ms: z.number().int().positive().optional(),\n restart_on_failure: z.boolean().optional(),\n max_restarts_per_worker: z.number().int().nonnegative().optional(),\n max_pending_calls_per_worker: z.number().int().positive().optional(),\n restart_base_delay_ms: z.number().int().positive().optional(),\n restart_max_delay_ms: z.number().int().positive().optional(),\n restart_jitter_ms: z.number().int().nonnegative().optional()\n })\n .strict();\n\nconst rate_limiter_schema = z\n .object({\n enabled: z.boolean().optional(),\n tokens_per_interval: z.number().int().positive().optional(),\n interval_ms: z.number().int().positive().optional(),\n burst_tokens: z.number().int().positive().optional(),\n disconnect_on_limit: z.boolean().optional()\n })\n .strict();\n\nconst abuse_controls_schema = z\n .object({\n connection_controls: z\n .object({\n max_concurrent_sockets: z.number().int().positive().optional(),\n max_concurrent_handshakes: z.number().int().positive().optional(),\n max_unauthenticated_sessions: z.number().int().positive().optional(),\n global_connection_window_ms: z.number().int().positive().optional(),\n global_max_new_connections_per_window: z.number().int().positive().optional(),\n per_ip_max_new_connections_per_window: z.number().int().positive().optional(),\n tls_handshake_timeout_ms: z.number().int().positive().optional(),\n auth_message_timeout_ms: z.number().int().positive().optional(),\n max_pre_auth_frame_bytes: z.number().int().positive().optional(),\n max_post_auth_frame_bytes: z.number().int().positive().optional()\n })\n .strict()\n .optional(),\n auth_controls: z\n .object({\n pending_auth_window_ms: z.number().int().positive().optional(),\n max_pending_auth_attempts_per_ip_per_window: z.number().int().positive().optional(),\n failed_auth_window_ms: z.number().int().positive().optional(),\n max_failed_auth_per_ip_per_window: z.number().int().positive().optional(),\n max_failed_auth_per_api_key_per_window: z.number().int().positive().optional(),\n block_duration_ms: z.number().int().positive().optional(),\n enable_blocklist: z.boolean().optional()\n })\n .strict()\n .optional(),\n request_controls: z\n .object({\n max_in_flight_requests_per_connection: z.number().int().positive().optional(),\n per_connection: rate_limiter_schema.optional(),\n per_api_key: rate_limiter_schema.optional(),\n per_ip: rate_limiter_schema.optional()\n })\n .strict()\n .optional(),\n observability: z\n .object({\n enable_console_log: z.boolean().optional()\n })\n .strict()\n .optional()\n })\n .strict();\n\nconst daemon_server_config_schema = z\n .object({\n information: z\n .object({\n server_name: z.string().min(1)\n })\n .strict(),\n network: z\n .object({\n bind_addr: z.string().min(1),\n tcp_listen_port: z.number().int().positive().max(65535)\n })\n .strict(),\n tls_mtls: z\n .object({\n key_file: z.string().min(1),\n cert_file: z.string().min(1),\n ca_file: z.string().min(1),\n crl_file: z.string().min(1).optional(),\n min_version: z.enum(tls_min_version_list).optional(),\n cipher_suites: z.string().min(1).optional(),\n handshake_timeout_ms: z.number().int().positive().optional(),\n request_timeout_ms: z.number().int().positive().optional(),\n max_frame_bytes: z.number().int().positive().optional()\n })\n .strict(),\n workerprocedurecall: z\n .object({\n count: z.number().int().positive(),\n constructor_options: worker_runtime_options_schema.optional(),\n start_options: worker_runtime_options_schema.optional()\n })\n .strict(),\n abuse_controls: abuse_controls_schema.optional(),\n observability: z\n .object({\n enable_console_log: z.boolean().optional(),\n log_worker_events: z.boolean().optional(),\n metrics_log_interval_ms: z.number().int().positive().optional()\n })\n .strict()\n .optional()\n })\n .strict();\n\nconst daemon_api_key_config_schema = z\n .object({\n api_keys: z\n .array(\n z\n .object({\n key_id: z.string().min(1),\n api_key: z.string().min(1),\n privileges: z.array(z.enum(privilege_name_list)).min(1),\n enabled: z.boolean().optional(),\n identity_constraints: z\n .object({\n remote_address_regex: z.string().min(1).optional(),\n tls_peer_subject_regex: z.string().min(1).optional(),\n tls_peer_san_regex: z.string().min(1).optional(),\n tls_peer_fingerprint256_regex: z.string().min(1).optional(),\n tls_peer_serial_number_regex: z.string().min(1).optional()\n })\n .strict()\n .optional()\n })\n .strict()\n )\n .min(1)\n })\n .strict();\n\nfunction BuildZodErrorMessage(params: { prefix: string; error: z.ZodError }): string {\n const message_lines = params.error.issues.map((issue) => {\n const issue_path = issue.path.length > 0 ? issue.path.join('.') : '<root>';\n return `${issue_path}: ${issue.message}`;\n });\n\n return `${params.prefix}\\n${message_lines.join('\\n')}`;\n}\n\nfunction CompileRegex(params: { source: string; label: string }): RegExp {\n try {\n return new RegExp(params.source);\n } catch (error) {\n const error_message = error instanceof Error ? error.message : String(error);\n throw new Error(`Invalid regex for ${params.label}: ${error_message}`);\n }\n}\n\nexport class ConfigValidator {\n validateServerConfig(params: { server_config_raw: unknown }): daemon_server_config_file_t {\n const parse_result = daemon_server_config_schema.safeParse(params.server_config_raw);\n if (!parse_result.success) {\n throw new Error(\n BuildZodErrorMessage({\n prefix: 'Invalid server config.',\n error: parse_result.error\n })\n );\n }\n\n return parse_result.data as daemon_server_config_file_t;\n }\n\n validateApiKeysConfig(params: { api_keys_config_raw: unknown }): daemon_api_keys_config_file_t {\n const parse_result = daemon_api_key_config_schema.safeParse(params.api_keys_config_raw);\n if (!parse_result.success) {\n throw new Error(\n BuildZodErrorMessage({\n prefix: 'Invalid api-keys config.',\n error: parse_result.error\n })\n );\n }\n\n this.assertUniqueApiKeys({\n api_keys: parse_result.data.api_keys as daemon_api_key_entry_t[]\n });\n this.assertUniqueKeyIds({\n api_keys: parse_result.data.api_keys as daemon_api_key_entry_t[]\n });\n\n return parse_result.data as daemon_api_keys_config_file_t;\n }\n\n toRuntimeApiKeysConfig(params: {\n api_keys_config: daemon_api_keys_config_file_t;\n }): daemon_runtime_api_key_entry_t[] {\n return params.api_keys_config.api_keys.map((api_key_entry) => {\n const compiled_identity_constraints = this.compileIdentityConstraints({\n api_key_entry\n });\n\n const runtime_entry: daemon_runtime_api_key_entry_t = {\n key_id: api_key_entry.key_id,\n api_key: api_key_entry.api_key,\n privileges: [...api_key_entry.privileges],\n enabled: api_key_entry.enabled ?? true,\n identity_constraints: compiled_identity_constraints\n };\n\n return runtime_entry;\n });\n }\n\n private compileIdentityConstraints(params: {\n api_key_entry: daemon_api_key_entry_t;\n }): daemon_compiled_identity_constraints_t | undefined {\n const constraints = params.api_key_entry.identity_constraints;\n if (!constraints) {\n return undefined;\n }\n\n const compiled_constraints: daemon_compiled_identity_constraints_t = {};\n if (constraints.remote_address_regex) {\n compiled_constraints.remote_address_regex = CompileRegex({\n source: constraints.remote_address_regex,\n label: `api_keys[${params.api_key_entry.key_id}].identity_constraints.remote_address_regex`\n });\n }\n if (constraints.tls_peer_subject_regex) {\n compiled_constraints.tls_peer_subject_regex = CompileRegex({\n source: constraints.tls_peer_subject_regex,\n label: `api_keys[${params.api_key_entry.key_id}].identity_constraints.tls_peer_subject_regex`\n });\n }\n if (constraints.tls_peer_san_regex) {\n compiled_constraints.tls_peer_san_regex = CompileRegex({\n source: constraints.tls_peer_san_regex,\n label: `api_keys[${params.api_key_entry.key_id}].identity_constraints.tls_peer_san_regex`\n });\n }\n if (constraints.tls_peer_fingerprint256_regex) {\n compiled_constraints.tls_peer_fingerprint256_regex = CompileRegex({\n source: constraints.tls_peer_fingerprint256_regex,\n label: `api_keys[${params.api_key_entry.key_id}].identity_constraints.tls_peer_fingerprint256_regex`\n });\n }\n if (constraints.tls_peer_serial_number_regex) {\n compiled_constraints.tls_peer_serial_number_regex = CompileRegex({\n source: constraints.tls_peer_serial_number_regex,\n label: `api_keys[${params.api_key_entry.key_id}].identity_constraints.tls_peer_serial_number_regex`\n });\n }\n\n return compiled_constraints;\n }\n\n private assertUniqueApiKeys(params: { api_keys: daemon_api_key_entry_t[] }): void {\n const seen_api_keys = new Set<string>();\n for (const api_key_entry of params.api_keys) {\n if (seen_api_keys.has(api_key_entry.api_key)) {\n throw new Error(`Duplicate api_key found in api-keys config: ${api_key_entry.api_key}`);\n }\n seen_api_keys.add(api_key_entry.api_key);\n }\n }\n\n private assertUniqueKeyIds(params: { api_keys: daemon_api_key_entry_t[] }): void {\n const seen_key_ids = new Set<string>();\n for (const api_key_entry of params.api_keys) {\n if (seen_key_ids.has(api_key_entry.key_id)) {\n throw new Error(`Duplicate key_id found in api-keys config: ${api_key_entry.key_id}`);\n }\n seen_key_ids.add(api_key_entry.key_id);\n }\n }\n}\n","import type { daemon_cli_options_t } from '@src/types/project_types';\n\nconst default_server_config_path = './config/server.config.json5';\nconst default_api_keys_config_path = './config/api_keys.config.json5';\nconst default_config_output_dir = './config';\nconst default_tls_output_dir = './config/certs';\nconst default_ca_common_name = 'nodenetproccalld-local-ca';\nconst default_server_common_name = 'localhost';\nconst default_client_common_name = 'nodenetproccalld-client';\nconst default_tls_valid_days = 825;\n\nexport class DaemonCli {\n parseOptions(): daemon_cli_options_t {\n const options: daemon_cli_options_t = {\n server_config_path: default_server_config_path,\n api_keys_config_path: default_api_keys_config_path,\n help: false,\n default_config_generation: {\n enabled: false,\n output_dir: default_config_output_dir,\n overwrite: false\n },\n tls_generation: {\n enabled: false,\n output_dir: default_tls_output_dir,\n overwrite: false,\n ca_common_name: default_ca_common_name,\n server_common_name: default_server_common_name,\n client_common_name: default_client_common_name,\n valid_days: default_tls_valid_days\n }\n };\n\n const argv = process.argv.slice(2);\n for (let index = 0; index < argv.length; index += 1) {\n const token = argv[index];\n\n if (token === '--help' || token === '-h') {\n options.help = true;\n continue;\n }\n\n if (token === '--server-config') {\n const next_value = argv[index + 1];\n if (!next_value) {\n throw new Error('Missing value for --server-config');\n }\n options.server_config_path = next_value;\n index += 1;\n continue;\n }\n\n if (token === '--api-keys-config') {\n const next_value = argv[index + 1];\n if (!next_value) {\n throw new Error('Missing value for --api-keys-config');\n }\n options.api_keys_config_path = next_value;\n index += 1;\n continue;\n }\n\n if (token === '--generate-default-config') {\n options.default_config_generation.enabled = true;\n continue;\n }\n\n if (token === '--default-config-output-dir') {\n const next_value = argv[index + 1];\n if (!next_value) {\n throw new Error('Missing value for --default-config-output-dir');\n }\n options.default_config_generation.output_dir = next_value;\n index += 1;\n continue;\n }\n\n if (token === '--default-config-overwrite') {\n options.default_config_generation.overwrite = true;\n continue;\n }\n\n if (token === '--generate-tls-material') {\n options.tls_generation.enabled = true;\n continue;\n }\n\n if (token === '--tls-output-dir') {\n const next_value = argv[index + 1];\n if (!next_value) {\n throw new Error('Missing value for --tls-output-dir');\n }\n options.tls_generation.output_dir = next_value;\n index += 1;\n continue;\n }\n\n if (token === '--tls-overwrite') {\n options.tls_generation.overwrite = true;\n continue;\n }\n\n if (token === '--tls-ca-cn') {\n const next_value = argv[index + 1];\n if (!next_value) {\n throw new Error('Missing value for --tls-ca-cn');\n }\n options.tls_generation.ca_common_name = next_value;\n index += 1;\n continue;\n }\n\n if (token === '--tls-server-cn') {\n const next_value = argv[index + 1];\n if (!next_value) {\n throw new Error('Missing value for --tls-server-cn');\n }\n options.tls_generation.server_common_name = next_value;\n index += 1;\n continue;\n }\n\n if (token === '--tls-client-cn') {\n const next_value = argv[index + 1];\n if (!next_value) {\n throw new Error('Missing value for --tls-client-cn');\n }\n options.tls_generation.client_common_name = next_value;\n index += 1;\n continue;\n }\n\n if (token === '--tls-valid-days') {\n const next_value = argv[index + 1];\n if (!next_value) {\n throw new Error('Missing value for --tls-valid-days');\n }\n\n const valid_days = Number(next_value);\n if (!Number.isInteger(valid_days) || valid_days <= 0) {\n throw new Error('--tls-valid-days must be a positive integer.');\n }\n\n options.tls_generation.valid_days = valid_days;\n index += 1;\n continue;\n }\n\n throw new Error(`Unknown argument: ${token}`);\n }\n\n return options;\n }\n\n printHelp(): void {\n const help_text = [\n 'nodenetproccalld',\n '',\n 'Usage:',\n ' nodenetproccalld [options]',\n '',\n 'Options:',\n ' --server-config <path> Path to server JSON5 config file.',\n ' Default: ./config/server.config.json5',\n ' --api-keys-config <path> Path to api keys JSON5 config file.',\n ' Default: ./config/api_keys.config.json5',\n ' --generate-default-config Generate default JSON5 daemon config files and exit.',\n ' --default-config-output-dir <path>',\n ' Output directory for server/api-key config files.',\n ' Default: ./config',\n ' --default-config-overwrite Overwrite existing default config files.',\n ' --generate-tls-material Generate CA/server/client TLS material and exit.',\n ' --tls-output-dir <path> Output directory for generated TLS files.',\n ' Default: ./config/certs',\n ' --tls-overwrite Overwrite existing TLS files in output dir.',\n ' --tls-ca-cn <value> CA certificate common name.',\n ' Default: nodenetproccalld-local-ca',\n ' --tls-server-cn <value> Server certificate common name.',\n ' Default: localhost',\n ' --tls-client-cn <value> Client certificate common name.',\n ' Default: nodenetproccalld-client',\n ' --tls-valid-days <number> Certificate validity in days.',\n ' Default: 825',\n ' -h, --help Show this help message.'\n ].join('\\n');\n\n console.log(help_text);\n }\n}\n","import {\n NetworkProcedureCall,\n type networkprocedurecall_abuse_metrics_t,\n type networkprocedurecall_auth_callback_t,\n type networkprocedurecall_server_start_params_t\n} from '@opsimathically/networkprocedurecall';\nimport {\n WorkerProcedureCall,\n type worker_event_t\n} from '@opsimathically/workerprocedurecall';\n\nimport { ApiKeyAuthorizer } from '@src/classes/apikeyauthorizer/ApiKeyAuthorizer.class';\nimport { ConfigFileLoader } from '@src/classes/configfileloader/ConfigFileLoader.class';\n\nimport type {\n daemon_config_paths_t,\n daemon_runtime_config_t\n} from '@src/types/project_types';\n\ntype daemon_lifecycle_state_t = 'stopped' | 'starting' | 'running' | 'stopping';\ntype networkprocedurecall_workerprocedurecall_t = ConstructorParameters<\n typeof NetworkProcedureCall\n>[0]['workerprocedurecall'];\n\ntype daemon_runtime_snapshot_t = {\n lifecycle_state: daemon_lifecycle_state_t;\n server_name?: string;\n bind_addr?: string;\n tcp_listen_port?: number;\n worker_health_states?: unknown;\n abuse_metrics?: networkprocedurecall_abuse_metrics_t;\n};\n\nfunction ToIsoTimestamp(): string {\n return new Date().toISOString();\n}\n\nexport class NetworkProcedureCallDaemon {\n private readonly config_paths: daemon_config_paths_t;\n private readonly config_file_loader: ConfigFileLoader;\n\n private lifecycle_state: daemon_lifecycle_state_t = 'stopped';\n private daemon_config: daemon_runtime_config_t | null = null;\n private workerprocedurecall: WorkerProcedureCall | null = null;\n private networkprocedurecall: NetworkProcedureCall | null = null;\n private api_key_authorizer: ApiKeyAuthorizer | null = null;\n private worker_event_listener_id: number | null = null;\n private metrics_log_interval_handle: NodeJS.Timeout | null = null;\n\n constructor(params: {\n config_paths: daemon_config_paths_t;\n config_file_loader?: ConfigFileLoader;\n }) {\n this.config_paths = params.config_paths;\n this.config_file_loader = params.config_file_loader ?? new ConfigFileLoader();\n }\n\n async start(): Promise<void> {\n if (this.lifecycle_state === 'running') {\n throw new Error('Daemon is already running.');\n }\n if (this.lifecycle_state === 'starting') {\n throw new Error('Daemon startup is already in progress.');\n }\n if (this.lifecycle_state === 'stopping') {\n throw new Error('Daemon stop is in progress. Wait for stop to complete.');\n }\n\n this.lifecycle_state = 'starting';\n\n try {\n this.daemon_config = this.config_file_loader.loadDaemonConfig({\n config_paths: this.config_paths\n });\n this.api_key_authorizer = new ApiKeyAuthorizer({\n api_key_entries: this.daemon_config.api_keys_config.api_keys\n });\n\n const constructor_options =\n this.daemon_config.server_config.workerprocedurecall.constructor_options;\n this.workerprocedurecall = constructor_options\n ? new WorkerProcedureCall(constructor_options)\n : new WorkerProcedureCall();\n\n const log_worker_events =\n this.daemon_config.server_config.observability?.log_worker_events ?? true;\n if (log_worker_events) {\n this.worker_event_listener_id = this.workerprocedurecall.onWorkerEvent({\n listener: (worker_event): void => {\n this.logWorkerEvent({\n worker_event\n });\n }\n });\n }\n\n await this.workerprocedurecall.startWorkers({\n count: this.daemon_config.server_config.workerprocedurecall.count,\n ...(this.daemon_config.server_config.workerprocedurecall.start_options ?? {})\n });\n\n const networkprocedurecall_workerprocedurecall =\n this.workerprocedurecall as unknown as networkprocedurecall_workerprocedurecall_t;\n\n this.networkprocedurecall = new NetworkProcedureCall({\n workerprocedurecall: networkprocedurecall_workerprocedurecall\n });\n\n const auth_callback = this.createAuthCallback();\n const start_params = this.buildServerStartParams({\n auth_callback\n });\n await this.networkprocedurecall.start(start_params);\n\n this.startMetricsLogging();\n this.lifecycle_state = 'running';\n\n this.logMessage({\n severity: 'info',\n message:\n `Daemon started: ${start_params.information.server_name} ` +\n `on ${start_params.network.bind_addr}:${start_params.network.tcp_listen_port}`\n });\n } catch (error) {\n this.lifecycle_state = 'stopped';\n await this.stopBestEffort();\n throw error;\n }\n }\n\n async stop(): Promise<void> {\n if (this.lifecycle_state === 'stopped') {\n return;\n }\n if (this.lifecycle_state === 'stopping') {\n return;\n }\n\n this.lifecycle_state = 'stopping';\n await this.stopBestEffort();\n this.lifecycle_state = 'stopped';\n\n this.logMessage({\n severity: 'info',\n message: 'Daemon stopped.'\n });\n }\n\n getRuntimeSnapshot(): daemon_runtime_snapshot_t {\n return {\n lifecycle_state: this.lifecycle_state,\n server_name: this.daemon_config?.server_config.information.server_name,\n bind_addr: this.daemon_config?.server_config.network.bind_addr,\n tcp_listen_port: this.daemon_config?.server_config.network.tcp_listen_port,\n worker_health_states: this.workerprocedurecall?.getWorkerHealthStates(),\n abuse_metrics: this.networkprocedurecall?.getAbuseMetrics()\n };\n }\n\n private createAuthCallback(): networkprocedurecall_auth_callback_t {\n return async (auth_callback_params) => {\n const authorizer = this.requireApiKeyAuthorizer();\n return await authorizer.authenticate({\n auth_callback_params\n });\n };\n }\n\n private buildServerStartParams(params: {\n auth_callback: networkprocedurecall_auth_callback_t;\n }): networkprocedurecall_server_start_params_t {\n const daemon_config = this.requireDaemonConfig();\n const abuse_controls_from_file = daemon_config.server_config.abuse_controls;\n const enable_console_log = daemon_config.server_config.observability?.enable_console_log;\n\n let merged_abuse_controls = abuse_controls_from_file;\n if (enable_console_log !== undefined) {\n merged_abuse_controls = {\n ...(abuse_controls_from_file ?? {}),\n observability: {\n ...(abuse_controls_from_file?.observability ?? {}),\n enable_console_log\n }\n };\n }\n\n return {\n information: {\n server_name: daemon_config.server_config.information.server_name\n },\n network: {\n bind_addr: daemon_config.server_config.network.bind_addr,\n tcp_listen_port: daemon_config.server_config.network.tcp_listen_port\n },\n tls_mtls: {\n ...daemon_config.server_config.tls_mtls\n },\n abuse_controls: merged_abuse_controls,\n auth_callback: params.auth_callback\n };\n }\n\n private startMetricsLogging(): void {\n this.clearMetricsLoggingInterval();\n\n const daemon_config = this.requireDaemonConfig();\n const metrics_log_interval_ms =\n daemon_config.server_config.observability?.metrics_log_interval_ms;\n if (!metrics_log_interval_ms) {\n return;\n }\n\n this.metrics_log_interval_handle = setInterval(() => {\n if (!this.networkprocedurecall || !this.workerprocedurecall) {\n return;\n }\n\n const abuse_metrics = this.networkprocedurecall.getAbuseMetrics();\n const worker_health_states = this.workerprocedurecall.getWorkerHealthStates();\n\n this.logMessage({\n severity: 'info',\n message:\n `runtime_metrics abuse=${JSON.stringify(abuse_metrics)} ` +\n `worker_health=${JSON.stringify(worker_health_states)}`\n });\n }, metrics_log_interval_ms);\n\n this.metrics_log_interval_handle.unref();\n }\n\n private clearMetricsLoggingInterval(): void {\n if (this.metrics_log_interval_handle) {\n clearInterval(this.metrics_log_interval_handle);\n this.metrics_log_interval_handle = null;\n }\n }\n\n private async stopBestEffort(): Promise<void> {\n this.clearMetricsLoggingInterval();\n\n const stop_errors: unknown[] = [];\n\n if (this.networkprocedurecall) {\n try {\n await this.networkprocedurecall.stop();\n } catch (error) {\n stop_errors.push(error);\n }\n this.networkprocedurecall = null;\n }\n\n if (this.workerprocedurecall && this.worker_event_listener_id !== null) {\n try {\n this.workerprocedurecall.offWorkerEvent({\n listener_id: this.worker_event_listener_id\n });\n } catch (error) {\n stop_errors.push(error);\n }\n this.worker_event_listener_id = null;\n }\n\n if (this.workerprocedurecall) {\n try {\n await this.workerprocedurecall.stopWorkers();\n } catch (error) {\n stop_errors.push(error);\n }\n this.workerprocedurecall = null;\n }\n\n this.api_key_authorizer = null;\n this.daemon_config = null;\n\n if (stop_errors.length > 0) {\n const first_error = stop_errors[0];\n throw first_error;\n }\n }\n\n private requireDaemonConfig(): daemon_runtime_config_t {\n if (!this.daemon_config) {\n throw new Error('Daemon config is not initialized.');\n }\n return this.daemon_config;\n }\n\n private requireApiKeyAuthorizer(): ApiKeyAuthorizer {\n if (!this.api_key_authorizer) {\n throw new Error('ApiKeyAuthorizer is not initialized.');\n }\n return this.api_key_authorizer;\n }\n\n private logWorkerEvent(params: { worker_event: worker_event_t }): void {\n this.logMessage({\n severity: params.worker_event.severity,\n message: `worker_event ${JSON.stringify(params.worker_event)}`\n });\n }\n\n private logMessage(params: { severity: 'info' | 'warn' | 'error'; message: string }): void {\n const output_message = `[${ToIsoTimestamp()}] [${params.severity}] ${params.message}`;\n\n if (params.severity === 'error') {\n console.error(output_message);\n return;\n }\n if (params.severity === 'warn') {\n console.warn(output_message);\n return;\n }\n console.log(output_message);\n }\n}\n","import { NetworkProcedureCallDaemon } from '@src/classes/networkprocedurecalldaemon/NetworkProcedureCallDaemon.class';\n\nimport type { daemon_config_paths_t } from '@src/types/project_types';\n\nexport class DaemonProcess {\n private readonly daemon: NetworkProcedureCallDaemon;\n\n private is_running = false;\n private stop_in_progress = false;\n private stop_resolve: (() => void) | null = null;\n private readonly stop_waiter: Promise<void>;\n\n constructor(params: { config_paths: daemon_config_paths_t }) {\n this.daemon = new NetworkProcedureCallDaemon({\n config_paths: params.config_paths\n });\n this.stop_waiter = new Promise<void>((resolve) => {\n this.stop_resolve = resolve;\n });\n }\n\n async run(): Promise<void> {\n if (this.is_running) {\n throw new Error('DaemonProcess is already running.');\n }\n\n this.is_running = true;\n this.attachProcessHandlers();\n\n try {\n await this.daemon.start();\n } catch (error) {\n this.detachProcessHandlers();\n this.is_running = false;\n throw error;\n }\n\n await this.stop_waiter;\n }\n\n private attachProcessHandlers(): void {\n process.on('SIGINT', this.handleSignal);\n process.on('SIGTERM', this.handleSignal);\n process.on('uncaughtException', this.handleUncaughtException);\n process.on('unhandledRejection', this.handleUnhandledRejection);\n }\n\n private detachProcessHandlers(): void {\n process.off('SIGINT', this.handleSignal);\n process.off('SIGTERM', this.handleSignal);\n process.off('uncaughtException', this.handleUncaughtException);\n process.off('unhandledRejection', this.handleUnhandledRejection);\n }\n\n private readonly handleSignal = (signal: NodeJS.Signals): void => {\n void this.requestStop({\n reason: `Received ${signal}.`\n });\n };\n\n private readonly handleUncaughtException = (error: Error): void => {\n console.error(`Uncaught exception: ${error.stack ?? error.message}`);\n process.exitCode = 1;\n void this.requestStop({\n reason: 'Stopping daemon after uncaught exception.'\n });\n };\n\n private readonly handleUnhandledRejection = (error: unknown): void => {\n const error_message = error instanceof Error ? error.stack ?? error.message : String(error);\n console.error(`Unhandled rejection: ${error_message}`);\n process.exitCode = 1;\n void this.requestStop({\n reason: 'Stopping daemon after unhandled rejection.'\n });\n };\n\n private async requestStop(params: { reason: string }): Promise<void> {\n if (!this.is_running || this.stop_in_progress) {\n return;\n }\n\n this.stop_in_progress = true;\n console.log(params.reason);\n\n try {\n await this.daemon.stop();\n } catch (error) {\n const error_message = error instanceof Error ? error.stack ?? error.message : String(error);\n console.error(`Error while stopping daemon: ${error_message}`);\n process.exitCode = 1;\n } finally {\n this.detachProcessHandlers();\n this.is_running = false;\n this.stop_in_progress = false;\n if (this.stop_resolve) {\n this.stop_resolve();\n }\n }\n }\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\n\nimport type {\n daemon_default_config_generation_options_t,\n daemon_generated_default_config_t\n} from '@src/types/project_types';\n\nconst default_server_config_template = `{\n // Friendly name that clients can use in their own config maps.\n information: {\n server_name: 'daemon_server_1'\n },\n\n // Bind target for tls.createServer.\n network: {\n bind_addr: '0.0.0.0',\n tcp_listen_port: 6767\n },\n\n // PEM files are resolved relative to this config file unless absolute paths are used.\n tls_mtls: {\n key_file: './certs/server.key.pem',\n cert_file: './certs/server.cert.pem',\n ca_file: './certs/ca.cert.pem',\n // crl_file: './certs/ca.crl.pem',\n min_version: 'TLSv1.3',\n handshake_timeout_ms: 5000,\n request_timeout_ms: 15000,\n max_frame_bytes: 1048576\n },\n\n workerprocedurecall: {\n count: 4,\n constructor_options: {\n call_timeout_ms: 30000,\n control_timeout_ms: 10000,\n restart_on_failure: true,\n max_restarts_per_worker: 6,\n max_pending_calls_per_worker: 500\n },\n start_options: {\n restart_base_delay_ms: 150,\n restart_max_delay_ms: 5000,\n restart_jitter_ms: 250\n }\n },\n\n // Optional abuse controls from @opsimathically/networkprocedurecall.\n abuse_controls: {\n connection_controls: {\n max_concurrent_sockets: 1024,\n max_concurrent_handshakes: 256,\n max_unauthenticated_sessions: 256,\n per_ip_max_new_connections_per_window: 64,\n tls_handshake_timeout_ms: 5000,\n auth_message_timeout_ms: 5000\n },\n request_controls: {\n max_in_flight_requests_per_connection: 128,\n per_connection: {\n enabled: true,\n tokens_per_interval: 200,\n interval_ms: 1000,\n burst_tokens: 400\n },\n per_api_key: {\n enabled: true,\n tokens_per_interval: 1000,\n interval_ms: 1000,\n burst_tokens: 2000\n },\n per_ip: {\n enabled: true,\n tokens_per_interval: 500,\n interval_ms: 1000,\n burst_tokens: 1000\n }\n }\n },\n\n observability: {\n enable_console_log: true,\n log_worker_events: true,\n metrics_log_interval_ms: 30000\n }\n}\n`;\n\nconst default_api_keys_config_template = `{\n // API keys and privilege grants for auth_callback.\n api_keys: [\n {\n key_id: 'admin_key_1',\n api_key: 'replace_me_with_random_secret',\n privileges: ['all_privileges'],\n enabled: true,\n identity_constraints: {\n // Example: accept loopback clients only.\n remote_address_regex: '^(127\\\\\\\\.0\\\\\\\\.0\\\\\\\\.1|::1|::ffff:127\\\\\\\\.0\\\\\\\\.0\\\\\\\\.1)$'\n }\n },\n {\n key_id: 'invoke_only_key_1',\n api_key: 'replace_me_with_second_secret',\n privileges: ['invoke_functions'],\n enabled: false\n }\n ]\n}\n`;\n\nfunction EnsureParentDirectory(params: { file_path: string }): void {\n fs.mkdirSync(path.dirname(params.file_path), { recursive: true });\n}\n\nfunction WriteFileIfAllowed(params: { file_path: string; content: string; overwrite: boolean }): void {\n if (!params.overwrite && fs.existsSync(params.file_path)) {\n throw new Error(\n `Refusing to overwrite existing config \"${params.file_path}\". Use --default-config-overwrite to replace it.`\n );\n }\n\n EnsureParentDirectory({\n file_path: params.file_path\n });\n fs.writeFileSync(params.file_path, params.content, 'utf8');\n}\n\nexport class DefaultConfigGenerator {\n generateDefaultConfig(params: {\n default_config_generation_options: daemon_default_config_generation_options_t;\n }): daemon_generated_default_config_t {\n const options = params.default_config_generation_options;\n const output_dir = path.resolve(process.cwd(), options.output_dir);\n const server_config_path = path.join(output_dir, 'server.config.json5');\n const api_keys_config_path = path.join(output_dir, 'api_keys.config.json5');\n\n fs.mkdirSync(output_dir, { recursive: true });\n\n WriteFileIfAllowed({\n file_path: server_config_path,\n content: default_server_config_template,\n overwrite: options.overwrite\n });\n WriteFileIfAllowed({\n file_path: api_keys_config_path,\n content: default_api_keys_config_template,\n overwrite: options.overwrite\n });\n\n return {\n output_dir,\n server_config_path,\n api_keys_config_path\n };\n }\n}\n","import { execFileSync } from 'node:child_process';\nimport fs from 'node:fs';\nimport path from 'node:path';\n\nimport type {\n daemon_generated_tls_material_t,\n daemon_tls_generation_options_t\n} from '@src/types/project_types';\n\ntype tls_file_map_t = {\n ca_key_path: string;\n ca_cert_path: string;\n server_key_path: string;\n server_csr_path: string;\n server_cert_path: string;\n server_ext_path: string;\n client_key_path: string;\n client_csr_path: string;\n client_cert_path: string;\n client_ext_path: string;\n ca_serial_path: string;\n};\n\nfunction EnsurePositiveInteger(params: { value: number; label: string }): void {\n if (!Number.isInteger(params.value) || params.value <= 0) {\n throw new Error(`${params.label} must be a positive integer.`);\n }\n}\n\nfunction MakeDirRecursive(params: { dir_path: string }): void {\n fs.mkdirSync(params.dir_path, { recursive: true });\n}\n\nfunction WriteTextFile(params: { file_path: string; content: string }): void {\n fs.writeFileSync(params.file_path, params.content, 'utf8');\n}\n\nexport class TlsMaterialGenerator {\n generateTlsMaterial(params: {\n tls_generation_options: daemon_tls_generation_options_t;\n }): daemon_generated_tls_material_t {\n const options = params.tls_generation_options;\n EnsurePositiveInteger({\n value: options.valid_days,\n label: 'tls_generation.valid_days'\n });\n\n const output_dir = path.resolve(process.cwd(), options.output_dir);\n MakeDirRecursive({\n dir_path: output_dir\n });\n\n this.assertOpenSslAvailable();\n\n const tls_files = this.buildTlsFileMap({\n output_dir\n });\n this.assertTargetFilesAreWritable({\n tls_files,\n overwrite: options.overwrite\n });\n\n try {\n this.generateCa({\n tls_files,\n valid_days: options.valid_days,\n ca_common_name: options.ca_common_name\n });\n this.generateServerCertificate({\n tls_files,\n valid_days: options.valid_days,\n server_common_name: options.server_common_name\n });\n this.generateClientCertificate({\n tls_files,\n valid_days: options.valid_days,\n client_common_name: options.client_common_name\n });\n this.cleanupIntermediateFiles({\n tls_files\n });\n } catch (error) {\n throw new Error(\n `Failed to generate TLS material in \"${output_dir}\": ${this.getErrorMessage({\n error\n })}`\n );\n }\n\n return {\n output_dir,\n ca_key_path: tls_files.ca_key_path,\n ca_cert_path: tls_files.ca_cert_path,\n server_key_path: tls_files.server_key_path,\n server_cert_path: tls_files.server_cert_path,\n client_key_path: tls_files.client_key_path,\n client_cert_path: tls_files.client_cert_path\n };\n }\n\n private assertOpenSslAvailable(): void {\n try {\n execFileSync('openssl', ['version'], { stdio: 'ignore' });\n } catch {\n throw new Error(\n 'openssl command is required but was not found. Please install openssl and retry.'\n );\n }\n }\n\n private buildTlsFileMap(params: { output_dir: string }): tls_file_map_t {\n return {\n ca_key_path: path.join(params.output_dir, 'ca.key.pem'),\n ca_cert_path: path.join(params.output_dir, 'ca.cert.pem'),\n server_key_path: path.join(params.output_dir, 'server.key.pem'),\n server_csr_path: path.join(params.output_dir, 'server.csr.pem'),\n server_cert_path: path.join(params.output_dir, 'server.cert.pem'),\n server_ext_path: path.join(params.output_dir, 'server.ext'),\n client_key_path: path.join(params.output_dir, 'client.key.pem'),\n client_csr_path: path.join(params.output_dir, 'client.csr.pem'),\n client_cert_path: path.join(params.output_dir, 'client.cert.pem'),\n client_ext_path: path.join(params.output_dir, 'client.ext'),\n ca_serial_path: path.join(params.output_dir, 'ca.cert.srl')\n };\n }\n\n private assertTargetFilesAreWritable(params: {\n tls_files: tls_file_map_t;\n overwrite: boolean;\n }): void {\n const target_paths: string[] = [\n params.tls_files.ca_key_path,\n params.tls_files.ca_cert_path,\n params.tls_files.server_key_path,\n params.tls_files.server_cert_path,\n params.tls_files.client_key_path,\n params.tls_files.client_cert_path\n ];\n\n if (!params.overwrite) {\n for (const target_path of target_paths) {\n if (fs.existsSync(target_path)) {\n throw new Error(\n `Refusing to overwrite existing file \"${target_path}\". Use --tls-overwrite to replace existing material.`\n );\n }\n }\n return;\n }\n\n for (const target_path of target_paths) {\n fs.rmSync(target_path, { force: true });\n }\n fs.rmSync(params.tls_files.ca_serial_path, { force: true });\n }\n\n private generateCa(params: {\n tls_files: tls_file_map_t;\n valid_days: number;\n ca_common_name: string;\n }): void {\n this.runOpenSslCommand({\n args: [\n 'req',\n '-x509',\n '-newkey',\n 'rsa:4096',\n '-sha256',\n '-nodes',\n '-keyout',\n params.tls_files.ca_key_path,\n '-out',\n params.tls_files.ca_cert_path,\n '-days',\n String(params.valid_days),\n '-subj',\n `/CN=${params.ca_common_name}`\n ]\n });\n }\n\n private generateServerCertificate(params: {\n tls_files: tls_file_map_t;\n valid_days: number;\n server_common_name: string;\n }): void {\n WriteTextFile({\n file_path: params.tls_files.server_ext_path,\n content: [\n 'subjectAltName=DNS:localhost,IP:127.0.0.1',\n 'extendedKeyUsage=serverAuth',\n 'keyUsage=digitalSignature,keyEncipherment'\n ].join('\\n')\n });\n\n this.runOpenSslCommand({\n args: [\n 'req',\n '-new',\n '-newkey',\n 'rsa:4096',\n '-sha256',\n '-nodes',\n '-keyout',\n params.tls_files.server_key_path,\n '-out',\n params.tls_files.server_csr_path,\n '-subj',\n `/CN=${params.server_common_name}`\n ]\n });\n\n this.runOpenSslCommand({\n args: [\n 'x509',\n '-req',\n '-in',\n params.tls_files.server_csr_path,\n '-CA',\n params.tls_files.ca_cert_path,\n '-CAkey',\n params.tls_files.ca_key_path,\n '-CAserial',\n params.tls_files.ca_serial_path,\n '-CAcreateserial',\n '-out',\n params.tls_files.server_cert_path,\n '-days',\n String(params.valid_days),\n '-sha256',\n '-extfile',\n params.tls_files.server_ext_path\n ]\n });\n }\n\n private generateClientCertificate(params: {\n tls_files: tls_file_map_t;\n valid_days: number;\n client_common_name: string;\n }): void {\n const client_uri = `spiffe://nodenetproccalld/${params.client_common_name\n .replace(/[^a-zA-Z0-9_.-]/g, '_')\n .toLowerCase()}`;\n\n WriteTextFile({\n file_path: params.tls_files.client_ext_path,\n content: [\n 'extendedKeyUsage=clientAuth',\n 'keyUsage=digitalSignature,keyEncipherment',\n `subjectAltName=URI:${client_uri}`\n ].join('\\n')\n });\n\n this.runOpenSslCommand({\n args: [\n 'req',\n '-new',\n '-newkey',\n 'rsa:4096',\n '-sha256',\n '-nodes',\n '-keyout',\n params.tls_files.client_key_path,\n '-out',\n params.tls_files.client_csr_path,\n '-subj',\n `/CN=${params.client_common_name}`\n ]\n });\n\n this.runOpenSslCommand({\n args: [\n 'x509',\n '-req',\n '-in',\n params.tls_files.client_csr_path,\n '-CA',\n params.tls_files.ca_cert_path,\n '-CAkey',\n params.tls_files.ca_key_path,\n '-CAserial',\n params.tls_files.ca_serial_path,\n '-out',\n params.tls_files.client_cert_path,\n '-days',\n String(params.valid_days),\n '-sha256',\n '-extfile',\n params.tls_files.client_ext_path\n ]\n });\n }\n\n private cleanupIntermediateFiles(params: { tls_files: tls_file_map_t }): void {\n fs.rmSync(params.tls_files.server_csr_path, { force: true });\n fs.rmSync(params.tls_files.client_csr_path, { force: true });\n fs.rmSync(params.tls_files.server_ext_path, { force: true });\n fs.rmSync(params.tls_files.client_ext_path, { force: true });\n fs.rmSync(params.tls_files.ca_serial_path, { force: true });\n }\n\n private runOpenSslCommand(params: { args: string[] }): void {\n execFileSync('openssl', params.args, { stdio: 'ignore' });\n }\n\n private getErrorMessage(params: { error: unknown }): string {\n if (params.error instanceof Error) {\n return params.error.message;\n }\n return String(params.error);\n }\n}\n"],"mappings":"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","names":["SafeTimingEqual","params","left_buffer","Buffer","from","left_value","right_buffer","right_value","length","left_digest","crypto","createHash","update","digest","right_digest","timingSafeEqual","ApiKeyAuthorizer","api_key_entries","authenticate","api_key_entry","enabled","api_key","auth_callback_params","matchesIdentityConstraints","state","privileges","constraints","identity_constraints","remote_address_regex","test","remote_address","tls_peer_subject_regex","matchOptionalValue","regex","value","tls_peer_subject","tls_peer_san_regex","tls_peer_san","tls_peer_fingerprint256_regex","tls_peer_fingerprint256","tls_peer_serial_number_regex","tls_peer_serial_number","c","parse","key","token","buffer","stringify","stack","value","privilege_name_list","tls_min_version_list","worker_runtime_options_schema","z","object","call_timeout_ms","number","int","positive","optional","control_timeout_ms","start_timeout_ms","stop_timeout_ms","restart_on_failure","boolean","max_restarts_per_worker","nonnegative","max_pending_calls_per_worker","restart_base_delay_ms","restart_max_delay_ms","restart_jitter_ms","strict","rate_limiter_schema","enabled","tokens_per_interval","interval_ms","burst_tokens","disconnect_on_limit","abuse_controls_schema","connection_controls","max_concurrent_sockets","max_concurrent_handshakes","max_unauthenticated_sessions","global_connection_window_ms","global_max_new_connections_per_window","per_ip_max_new_connections_per_window","tls_handshake_timeout_ms","auth_message_timeout_ms","max_pre_auth_frame_bytes","max_post_auth_frame_bytes","auth_controls","pending_auth_window_ms","max_pending_auth_attempts_per_ip_per_window","failed_auth_window_ms","max_failed_auth_per_ip_per_window","max_failed_auth_per_api_key_per_window","block_duration_ms","enable_blocklist","request_controls","max_in_flight_requests_per_connection","per_connection","per_api_key","per_ip","observability","enable_console_log","daemon_server_config_schema","information","server_name","string","min","network","bind_addr","tcp_listen_port","max","tls_mtls","key_file","cert_file","ca_file","crl_file","min_version","enum","cipher_suites","handshake_timeout_ms","request_timeout_ms","max_frame_bytes","workerprocedurecall","count","constructor_options","start_options","abuse_controls","log_worker_events","metrics_log_interval_ms","daemon_api_key_config_schema","api_keys","array","key_id","api_key","privileges","identity_constraints","remote_address_regex","tls_peer_subject_regex","tls_peer_san_regex","tls_peer_fingerprint256_regex","tls_peer_serial_number_regex","BuildZodErrorMessage","params","message_lines","error","issues","map","issue","issue_path","path","length","join","message","prefix","CompileRegex","RegExp","source","error_message","Error","String","label","ConfigValidator","validateServerConfig","parse_result","safeParse","server_config_raw","success","data","validateApiKeysConfig","api_keys_config_raw","assertUniqueApiKeys","assertUniqueKeyIds","toRuntimeApiKeysConfig","api_keys_config","api_key_entry","compiled_identity_constraints","compileIdentityConstraints","runtime_entry","constraints","undefined","compiled_constraints","seen_api_keys","Set","has","add","seen_key_ids","ReadUtf8File","params","fs","readFileSync","file_path","error","error_message","Error","message","String","ResolvePath","path","isAbsolute","resolve","base_dir","ParseJson5","JSON5","parse","content","source_path","ConfigFileLoader","config_validator","ConfigValidator","loadDaemonConfig","server_config_path","config_paths","process","cwd","api_keys_config_path","server_config_raw","readJson5File","api_keys_config_raw","server_config","validateServerConfig","api_keys_config","validateApiKeysConfig","runtime_tls_mtls","resolveTlsMaterial","tls_file_config","tls_mtls","config_file_dir","dirname","runtime_api_keys","toRuntimeApiKeysConfig","api_keys","file_content","key_pem","readPemFile","pem_path","key_file","label","cert_pem","cert_file","ca_pem","ca_file","crl_pem","crl_file","undefined","min_version","cipher_suites","handshake_timeout_ms","request_timeout_ms","max_frame_bytes","absolute_file_path","pem_content","trim","includes","default_server_config_path","default_api_keys_config_path","default_config_output_dir","default_tls_output_dir","default_ca_common_name","default_server_common_name","default_client_common_name","default_tls_valid_days","DaemonCli","parseOptions","options","server_config_path","api_keys_config_path","help","default_config_generation","enabled","output_dir","overwrite","tls_generation","ca_common_name","server_common_name","client_common_name","valid_days","argv","process","slice","index","length","token","next_value","Error","Number","isInteger","printHelp","help_text","join","console","log","ToIsoTimestamp","Date","toISOString","NetworkProcedureCallDaemon","params","config_paths","config_file_loader","lifecycle_state","daemon_config","workerprocedurecall","networkprocedurecall","api_key_authorizer","worker_event_listener_id","metrics_log_interval_handle","ConfigFileLoader","start","Error","loadDaemonConfig","ApiKeyAuthorizer","api_key_entries","api_keys_config","api_keys","constructor_options","server_config","WorkerProcedureCall","log_worker_events","observability","onWorkerEvent","listener","worker_event","logWorkerEvent","startWorkers","count","start_options","networkprocedurecall_workerprocedurecall","NetworkProcedureCall","auth_callback","createAuthCallback","start_params","buildServerStartParams","startMetricsLogging","logMessage","severity","message","information","server_name","network","bind_addr","tcp_listen_port","error","stopBestEffort","stop","getRuntimeSnapshot","worker_health_states","getWorkerHealthStates","abuse_metrics","getAbuseMetrics","auth_callback_params","authorizer","requireApiKeyAuthorizer","authenticate","requireDaemonConfig","abuse_controls_from_file","abuse_controls","enable_console_log","merged_abuse_controls","undefined","tls_mtls","clearMetricsLoggingInterval","metrics_log_interval_ms","setInterval","JSON","stringify","unref","clearInterval","stop_errors","push","offWorkerEvent","listener_id","stopWorkers","length","first_error","output_message","console","warn","log","DaemonProcess","params","daemon","is_running","stop_in_progress","stop_resolve","stop_waiter","handleSignal","signal","requestStop","reason","handleUncaughtException","error","console","stack","message","process","exitCode","handleUnhandledRejection","error_message","Error","String","NetworkProcedureCallDaemon","config_paths","Promise","resolve","run","attachProcessHandlers","start","detachProcessHandlers","on","off","log","stop","import_node_fs","import_node_path","default_server_config_template","default_api_keys_config_template","EnsureParentDirectory","params","fs","mkdirSync","path","dirname","file_path","recursive","WriteFileIfAllowed","overwrite","existsSync","Error","writeFileSync","content","DefaultConfigGenerator","generateDefaultConfig","options","default_config_generation_options","output_dir","resolve","process","cwd","server_config_path","join","api_keys_config_path","import_node_fs","import_node_path","EnsurePositiveInteger","params","Number","isInteger","value","Error","label","MakeDirRecursive","fs","mkdirSync","dir_path","recursive","WriteTextFile","writeFileSync","file_path","content","TlsMaterialGenerator","generateTlsMaterial","options","tls_generation_options","valid_days","output_dir","path","resolve","process","cwd","assertOpenSslAvailable","tls_files","buildTlsFileMap","assertTargetFilesAreWritable","overwrite","generateCa","ca_common_name","generateServerCertificate","server_common_name","generateClientCertificate","client_common_name","cleanupIntermediateFiles","error","getErrorMessage","ca_key_path","ca_cert_path","server_key_path","server_cert_path","client_key_path","client_cert_path","execFileSync","stdio","join","server_csr_path","server_ext_path","client_csr_path","client_ext_path","ca_serial_path","target_paths","target_path","existsSync","rmSync","force","runOpenSslCommand","args","String","client_uri","replace","toLowerCase","message","StartDaemonFromCli","daemon_cli","DaemonCli","cli_options","parseOptions","help","printHelp","default_config_generation","enabled","default_config_generator","DefaultConfigGenerator","generated_default_config","generateDefaultConfig","default_config_generation_options","console","log","output_dir","server_config_path","api_keys_config_path","tls_generation","tls_material_generator","TlsMaterialGenerator","generated_tls_material","generateTlsMaterial","tls_generation_options","ca_cert_path","server_cert_path","server_key_path","client_cert_path","client_key_path","daemon_process","DaemonProcess","config_paths","run","require","main","module","catch","error","error_message","Error","stack","message","String","process","exitCode"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/classes/apikeyauthorizer/ApiKeyAuthorizer.class.ts","../src/classes/clienttlspackageconfigfileloader/ClientTlsPackageConfigFileLoader.class.ts","../node_modules/json5/dist/index.mjs","../src/classes/clienttlspackagegenerator/ClientTlsPackageGenerator.class.ts","../src/classes/configfileloader/ConfigFileLoader.class.ts","../src/classes/configvalidator/ConfigValidator.class.ts","../src/classes/daemoncli/DaemonCli.class.ts","../src/classes/networkprocedurecalldaemon/NetworkProcedureCallDaemon.class.ts","../src/classes/daemonprocess/DaemonProcess.class.ts","../src/classes/defaultclienttlsgenerationconfiggenerator/DefaultClientTlsGenerationConfigGenerator.class.ts","../src/classes/defaultconfiggenerator/DefaultConfigGenerator.class.ts","../src/classes/defaulttlsgenerationconfiggenerator/DefaultTlsGenerationConfigGenerator.class.ts","../src/classes/tlsgenerationconfigfileloader/TlsGenerationConfigFileLoader.class.ts","../src/classes/tlsmaterialgenerator/TlsMaterialGenerator.class.ts"],"sourcesContent":["import { ApiKeyAuthorizer } from '@src/classes/apikeyauthorizer/ApiKeyAuthorizer.class';\nimport { ClientTlsPackageConfigFileLoader } from '@src/classes/clienttlspackageconfigfileloader/ClientTlsPackageConfigFileLoader.class';\nimport { ClientTlsPackageGenerator } from '@src/classes/clienttlspackagegenerator/ClientTlsPackageGenerator.class';\nimport { ConfigFileLoader } from '@src/classes/configfileloader/ConfigFileLoader.class';\nimport { ConfigValidator } from '@src/classes/configvalidator/ConfigValidator.class';\nimport { DaemonCli } from '@src/classes/daemoncli/DaemonCli.class';\nimport { DaemonProcess } from '@src/classes/daemonprocess/DaemonProcess.class';\nimport { DefaultClientTlsGenerationConfigGenerator } from '@src/classes/defaultclienttlsgenerationconfiggenerator/DefaultClientTlsGenerationConfigGenerator.class';\nimport { DefaultConfigGenerator } from '@src/classes/defaultconfiggenerator/DefaultConfigGenerator.class';\nimport { DefaultTlsGenerationConfigGenerator } from '@src/classes/defaulttlsgenerationconfiggenerator/DefaultTlsGenerationConfigGenerator.class';\nimport { NetworkProcedureCallDaemon } from '@src/classes/networkprocedurecalldaemon/NetworkProcedureCallDaemon.class';\nimport { TlsGenerationConfigFileLoader } from '@src/classes/tlsgenerationconfigfileloader/TlsGenerationConfigFileLoader.class';\nimport { TlsMaterialGenerator } from '@src/classes/tlsmaterialgenerator/TlsMaterialGenerator.class';\n\nexport {\n ApiKeyAuthorizer,\n ClientTlsPackageConfigFileLoader,\n ClientTlsPackageGenerator,\n ConfigFileLoader,\n ConfigValidator,\n DaemonCli,\n DaemonProcess,\n DefaultClientTlsGenerationConfigGenerator,\n DefaultConfigGenerator,\n DefaultTlsGenerationConfigGenerator,\n NetworkProcedureCallDaemon,\n TlsGenerationConfigFileLoader,\n TlsMaterialGenerator\n};\n\nexport type {\n daemon_api_key_entry_t,\n daemon_api_keys_config_file_t,\n daemon_api_key_identity_constraints_t,\n daemon_client_tls_package_config_client_t,\n daemon_client_tls_package_generation_config_file_t,\n daemon_client_tls_package_generation_options_t,\n daemon_client_tls_package_generation_runtime_options_t,\n daemon_client_tls_package_runtime_client_t,\n daemon_cli_options_t,\n daemon_config_paths_t,\n daemon_default_client_tls_config_generation_options_t,\n daemon_default_config_generation_options_t,\n daemon_default_tls_config_generation_options_t,\n daemon_generated_client_tls_package_entry_t,\n daemon_generated_client_tls_packages_t,\n daemon_generated_default_client_tls_config_t,\n daemon_generated_default_config_t,\n daemon_generated_default_tls_config_t,\n daemon_generated_tls_material_t,\n daemon_observability_config_t,\n daemon_runtime_api_key_entry_t,\n daemon_runtime_config_t,\n daemon_server_config_file_t,\n daemon_tls_generation_config_file_t,\n daemon_tls_generation_options_t,\n daemon_tls_file_config_t,\n daemon_worker_config_t\n} from '@src/types/project_types';\n\nasync function StartDaemonFromCli(): Promise<void> {\n const daemon_cli = new DaemonCli();\n const cli_options = daemon_cli.parseOptions();\n if (cli_options.help) {\n daemon_cli.printHelp();\n return;\n }\n\n if (cli_options.default_config_generation.enabled) {\n const default_config_generator = new DefaultConfigGenerator();\n const generated_default_config = default_config_generator.generateDefaultConfig({\n default_config_generation_options: cli_options.default_config_generation\n });\n\n console.log('Default config generated successfully.');\n console.log(`Output directory: ${generated_default_config.output_dir}`);\n console.log(`Server config: ${generated_default_config.server_config_path}`);\n console.log(`API keys config: ${generated_default_config.api_keys_config_path}`);\n return;\n }\n\n if (cli_options.default_tls_config_generation.enabled) {\n const default_tls_generation_config_generator = new DefaultTlsGenerationConfigGenerator();\n const generated_default_tls_config =\n default_tls_generation_config_generator.generateDefaultTlsGenerationConfig({\n default_tls_config_generation_options: cli_options.default_tls_config_generation\n });\n\n console.log('Default TLS-generation config generated successfully.');\n console.log(`TLS-generation config: ${generated_default_tls_config.output_file_path}`);\n return;\n }\n\n if (cli_options.default_client_tls_config_generation.enabled) {\n const default_client_tls_config_generator = new DefaultClientTlsGenerationConfigGenerator();\n const generated_default_client_tls_config =\n default_client_tls_config_generator.generateDefaultClientTlsGenerationConfig({\n default_client_tls_config_generation_options:\n cli_options.default_client_tls_config_generation\n });\n\n console.log('Default client TLS package config generated successfully.');\n console.log(`Client TLS package config: ${generated_default_client_tls_config.output_file_path}`);\n return;\n }\n\n if (cli_options.tls_generation.enabled) {\n let tls_generation_options = cli_options.tls_generation;\n if (cli_options.tls_generation.config_file_path) {\n const tls_generation_config_file_loader = new TlsGenerationConfigFileLoader();\n tls_generation_options = tls_generation_config_file_loader.loadTlsGenerationOptions({\n config_file_path: cli_options.tls_generation.config_file_path,\n fallback_options: tls_generation_options\n });\n }\n\n const tls_material_generator = new TlsMaterialGenerator();\n const generated_tls_material = tls_material_generator.generateTlsMaterial({\n tls_generation_options\n });\n\n console.log('TLS material generated successfully.');\n console.log(`Output directory: ${generated_tls_material.output_dir}`);\n console.log(`CA cert: ${generated_tls_material.ca_cert_path}`);\n console.log(`Server cert: ${generated_tls_material.server_cert_path}`);\n console.log(`Server key: ${generated_tls_material.server_key_path}`);\n console.log(`Client cert: ${generated_tls_material.client_cert_path}`);\n console.log(`Client key: ${generated_tls_material.client_key_path}`);\n console.log('');\n console.log(\n 'If using default config, set tls_mtls key_file/cert_file/ca_file in config/server.config.json5 to these files.'\n );\n return;\n }\n\n if (cli_options.client_tls_package_generation.enabled) {\n const client_tls_package_config_file_loader = new ClientTlsPackageConfigFileLoader();\n const runtime_options = client_tls_package_config_file_loader.loadClientTlsPackageOptions({\n client_tls_package_generation_options: cli_options.client_tls_package_generation\n });\n\n const client_tls_package_generator = new ClientTlsPackageGenerator();\n const generated_client_tls_packages = client_tls_package_generator.generateClientTlsPackages({\n runtime_options\n });\n\n console.log('Client TLS packages generated successfully.');\n console.log(`Output directory: ${generated_client_tls_packages.output_dir}`);\n for (const generated_package of generated_client_tls_packages.packages) {\n console.log(\n `Client ${generated_package.client_name}: ${generated_package.package_path}`\n );\n }\n return;\n }\n\n const daemon_process = new DaemonProcess({\n config_paths: {\n server_config_path: cli_options.server_config_path,\n api_keys_config_path: cli_options.api_keys_config_path\n }\n });\n\n await daemon_process.run();\n}\n\nif (require.main === module) {\n void StartDaemonFromCli().catch((error) => {\n const error_message = error instanceof Error ? error.stack ?? error.message : String(error);\n console.error(`Daemon startup failed: ${error_message}`);\n process.exitCode = 1;\n });\n}\n","import crypto from 'node:crypto';\n\nimport type { networkprocedurecall_auth_success_t } from '@opsimathically/networkprocedurecall';\n\nimport type {\n daemon_auth_callback_params_t,\n daemon_runtime_api_key_entry_t\n} from '@src/types/project_types';\n\nfunction SafeTimingEqual(params: { left_value: string; right_value: string }): boolean {\n const left_buffer = Buffer.from(params.left_value, 'utf8');\n const right_buffer = Buffer.from(params.right_value, 'utf8');\n\n if (left_buffer.length !== right_buffer.length) {\n const left_digest = crypto.createHash('sha256').update(left_buffer).digest();\n const right_digest = crypto.createHash('sha256').update(right_buffer).digest();\n crypto.timingSafeEqual(left_digest, right_digest);\n return false;\n }\n\n return crypto.timingSafeEqual(left_buffer, right_buffer);\n}\n\nexport class ApiKeyAuthorizer {\n private readonly api_key_entries: daemon_runtime_api_key_entry_t[];\n\n constructor(params: { api_key_entries: daemon_runtime_api_key_entry_t[] }) {\n this.api_key_entries = [...params.api_key_entries];\n }\n\n async authenticate(params: {\n auth_callback_params: daemon_auth_callback_params_t;\n }): Promise<'failed' | networkprocedurecall_auth_success_t> {\n for (const api_key_entry of this.api_key_entries) {\n if (!api_key_entry.enabled) {\n continue;\n }\n\n if (\n !SafeTimingEqual({\n left_value: api_key_entry.api_key,\n right_value: params.auth_callback_params.api_key\n })\n ) {\n continue;\n }\n\n if (\n !this.matchesIdentityConstraints({\n api_key_entry,\n auth_callback_params: params.auth_callback_params\n })\n ) {\n continue;\n }\n\n return {\n state: 'authenticated',\n privileges: [...api_key_entry.privileges]\n };\n }\n\n return 'failed';\n }\n\n private matchesIdentityConstraints(params: {\n api_key_entry: daemon_runtime_api_key_entry_t;\n auth_callback_params: daemon_auth_callback_params_t;\n }): boolean {\n const constraints = params.api_key_entry.identity_constraints;\n if (!constraints) {\n return true;\n }\n\n if (\n constraints.remote_address_regex &&\n !constraints.remote_address_regex.test(params.auth_callback_params.remote_address)\n ) {\n return false;\n }\n if (\n constraints.tls_peer_subject_regex &&\n !this.matchOptionalValue({\n regex: constraints.tls_peer_subject_regex,\n value: params.auth_callback_params.tls_peer_subject\n })\n ) {\n return false;\n }\n if (\n constraints.tls_peer_san_regex &&\n !this.matchOptionalValue({\n regex: constraints.tls_peer_san_regex,\n value: params.auth_callback_params.tls_peer_san\n })\n ) {\n return false;\n }\n if (\n constraints.tls_peer_fingerprint256_regex &&\n !this.matchOptionalValue({\n regex: constraints.tls_peer_fingerprint256_regex,\n value: params.auth_callback_params.tls_peer_fingerprint256\n })\n ) {\n return false;\n }\n if (\n constraints.tls_peer_serial_number_regex &&\n !this.matchOptionalValue({\n regex: constraints.tls_peer_serial_number_regex,\n value: params.auth_callback_params.tls_peer_serial_number\n })\n ) {\n return false;\n }\n\n return true;\n }\n\n private matchOptionalValue(params: { regex: RegExp; value?: string }): boolean {\n if (!params.value) {\n return false;\n }\n return params.regex.test(params.value);\n }\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\n\nimport JSON5 from 'json5';\nimport { z } from 'zod';\n\nimport type {\n daemon_client_tls_package_config_client_t,\n daemon_client_tls_package_generation_config_file_t,\n daemon_client_tls_package_generation_options_t,\n daemon_client_tls_package_generation_runtime_options_t,\n daemon_client_tls_package_runtime_client_t\n} from '@src/types/project_types';\n\nconst client_tls_package_config_schema = z\n .object({\n ca_key_file: z.string().min(1),\n ca_cert_file: z.string().min(1),\n output_dir: z.string().min(1).optional(),\n overwrite: z.boolean().optional(),\n default_valid_days: z.number().int().positive().optional(),\n clients: z\n .array(\n z\n .object({\n client_name: z.string().min(1),\n common_name: z.string().min(1).optional(),\n uri_san: z.string().min(1).optional(),\n package_name: z.string().min(1).optional(),\n valid_days: z.number().int().positive().optional()\n })\n .strict()\n )\n .min(1)\n })\n .strict();\n\nfunction ParseJson5File(params: { file_path: string }): unknown {\n const absolute_file_path = path.resolve(process.cwd(), params.file_path);\n let file_content: string;\n\n try {\n file_content = fs.readFileSync(absolute_file_path, 'utf8');\n } catch (error) {\n const error_message = error instanceof Error ? error.message : String(error);\n throw new Error(\n `Unable to read client TLS package config file \"${absolute_file_path}\": ${error_message}`\n );\n }\n\n try {\n return JSON5.parse(file_content);\n } catch (error) {\n const error_message = error instanceof Error ? error.message : String(error);\n throw new Error(\n `Invalid JSON5 in client TLS package config \"${absolute_file_path}\": ${error_message}`\n );\n }\n}\n\nfunction BuildZodErrorMessage(params: { error: z.ZodError }): string {\n const lines = params.error.issues.map((issue) => {\n const issue_path = issue.path.length > 0 ? issue.path.join('.') : '<root>';\n return `${issue_path}: ${issue.message}`;\n });\n\n return `Invalid client TLS package config file.\\n${lines.join('\\n')}`;\n}\n\nfunction ResolvePath(params: { file_path: string; base_dir: string }): string {\n if (path.isAbsolute(params.file_path)) {\n return params.file_path;\n }\n return path.resolve(params.base_dir, params.file_path);\n}\n\nfunction BuildUriSanFromCommonName(params: { common_name: string }): string {\n const normalized_common_name = params.common_name\n .replace(/[^a-zA-Z0-9_.-]/g, '_')\n .toLowerCase();\n\n return `spiffe://nodenetproccalld/${normalized_common_name}`;\n}\n\nexport class ClientTlsPackageConfigFileLoader {\n loadClientTlsPackageOptions(params: {\n client_tls_package_generation_options: daemon_client_tls_package_generation_options_t;\n }): daemon_client_tls_package_generation_runtime_options_t {\n const absolute_config_file_path = path.resolve(\n process.cwd(),\n params.client_tls_package_generation_options.config_file_path\n );\n const config_dir = path.dirname(absolute_config_file_path);\n\n const config_raw = ParseJson5File({\n file_path: absolute_config_file_path\n });\n\n const parse_result = client_tls_package_config_schema.safeParse(config_raw);\n if (!parse_result.success) {\n throw new Error(\n BuildZodErrorMessage({\n error: parse_result.error\n })\n );\n }\n\n const config_from_file = parse_result.data as daemon_client_tls_package_generation_config_file_t;\n const output_dir = ResolvePath({\n file_path: config_from_file.output_dir ?? './client_certs',\n base_dir: config_dir\n });\n const overwrite = config_from_file.overwrite ?? false;\n const default_valid_days = config_from_file.default_valid_days ?? 36500;\n\n const clients = this.buildRuntimeClients({\n clients: config_from_file.clients,\n default_valid_days\n });\n this.assertUniqueClientNames({\n clients\n });\n this.assertUniquePackageNames({\n clients\n });\n\n return {\n ca_key_file: ResolvePath({\n file_path: config_from_file.ca_key_file,\n base_dir: config_dir\n }),\n ca_cert_file: ResolvePath({\n file_path: config_from_file.ca_cert_file,\n base_dir: config_dir\n }),\n output_dir,\n overwrite,\n default_valid_days,\n clients\n };\n }\n\n private buildRuntimeClients(params: {\n clients: daemon_client_tls_package_config_client_t[];\n default_valid_days: number;\n }): daemon_client_tls_package_runtime_client_t[] {\n return params.clients.map((client_definition) => {\n const common_name = client_definition.common_name ?? client_definition.client_name;\n const client_uri_san = client_definition.uri_san ?? BuildUriSanFromCommonName({ common_name });\n const package_name = client_definition.package_name ?? client_definition.client_name;\n const valid_days = client_definition.valid_days ?? params.default_valid_days;\n\n return {\n client_name: client_definition.client_name,\n common_name,\n uri_san: client_uri_san,\n package_name,\n valid_days\n };\n });\n }\n\n private assertUniqueClientNames(params: {\n clients: daemon_client_tls_package_runtime_client_t[];\n }): void {\n const seen_client_names = new Set<string>();\n for (const client of params.clients) {\n if (seen_client_names.has(client.client_name)) {\n throw new Error(\n `Duplicate client_name \"${client.client_name}\" in client TLS package config file.`\n );\n }\n seen_client_names.add(client.client_name);\n }\n }\n\n private assertUniquePackageNames(params: {\n clients: daemon_client_tls_package_runtime_client_t[];\n }): void {\n const seen_package_names = new Set<string>();\n for (const client of params.clients) {\n if (seen_package_names.has(client.package_name)) {\n throw new Error(\n `Duplicate package_name \"${client.package_name}\" in client TLS package config file.`\n );\n }\n seen_package_names.add(client.package_name);\n }\n }\n}\n","// This is a generated file. Do not edit.\nvar Space_Separator = /[\\u1680\\u2000-\\u200A\\u202F\\u205F\\u3000]/;\nvar ID_Start = /[\\xAA\\xB5\\xBA\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0370-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\u052F\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0620-\\u064A\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06E5\\u06E6\\u06EE\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA\\u07F4\\u07F5\\u07FA\\u0800-\\u0815\\u081A\\u0824\\u0828\\u0840-\\u0858\\u0860-\\u086A\\u08A0-\\u08B4\\u08B6-\\u08BD\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0971-\\u0980\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF-\\u09E1\\u09F0\\u09F1\\u09FC\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0AF9\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D\\u0C58-\\u0C5A\\u0C60\\u0C61\\u0C80\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDE\\u0CE0\\u0CE1\\u0CF1\\u0CF2\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D\\u0D4E\\u0D54-\\u0D56\\u0D5F-\\u0D61\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E46\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EDC-\\u0EDF\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8C\\u1000-\\u102A\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u13A0-\\u13F5\\u13F8-\\u13FD\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16EE-\\u16F8\\u1700-\\u170C\\u170E-\\u1711\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17D7\\u17DC\\u1820-\\u1877\\u1880-\\u1884\\u1887-\\u18A8\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19B0-\\u19C9\\u1A00-\\u1A16\\u1A20-\\u1A54\\u1AA7\\u1B05-\\u1B33\\u1B45-\\u1B4B\\u1B83-\\u1BA0\\u1BAE\\u1BAF\\u1BBA-\\u1BE5\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C7D\\u1C80-\\u1C88\\u1CE9-\\u1CEC\\u1CEE-\\u1CF1\\u1CF5\\u1CF6\\u1D00-\\u1DBF\\u1E00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2071\\u207F\\u2090-\\u209C\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2160-\\u2188\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CEE\\u2CF2\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2E2F\\u3005-\\u3007\\u3021-\\u3029\\u3031-\\u3035\\u3038-\\u303C\\u3041-\\u3096\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312E\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FEA\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA61F\\uA62A\\uA62B\\uA640-\\uA66E\\uA67F-\\uA69D\\uA6A0-\\uA6EF\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA7AE\\uA7B0-\\uA7B7\\uA7F7-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA8F2-\\uA8F7\\uA8FB\\uA8FD\\uA90A-\\uA925\\uA930-\\uA946\\uA960-\\uA97C\\uA984-\\uA9B2\\uA9CF\\uA9E0-\\uA9E4\\uA9E6-\\uA9EF\\uA9FA-\\uA9FE\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAA60-\\uAA76\\uAA7A\\uAA7E-\\uAAAF\\uAAB1\\uAAB5\\uAAB6\\uAAB9-\\uAABD\\uAAC0\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEA\\uAAF2-\\uAAF4\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAB30-\\uAB5A\\uAB5C-\\uAB65\\uAB70-\\uABE2\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC]|\\uD800[\\uDC00-\\uDC0B\\uDC0D-\\uDC26\\uDC28-\\uDC3A\\uDC3C\\uDC3D\\uDC3F-\\uDC4D\\uDC50-\\uDC5D\\uDC80-\\uDCFA\\uDD40-\\uDD74\\uDE80-\\uDE9C\\uDEA0-\\uDED0\\uDF00-\\uDF1F\\uDF2D-\\uDF4A\\uDF50-\\uDF75\\uDF80-\\uDF9D\\uDFA0-\\uDFC3\\uDFC8-\\uDFCF\\uDFD1-\\uDFD5]|\\uD801[\\uDC00-\\uDC9D\\uDCB0-\\uDCD3\\uDCD8-\\uDCFB\\uDD00-\\uDD27\\uDD30-\\uDD63\\uDE00-\\uDF36\\uDF40-\\uDF55\\uDF60-\\uDF67]|\\uD802[\\uDC00-\\uDC05\\uDC08\\uDC0A-\\uDC35\\uDC37\\uDC38\\uDC3C\\uDC3F-\\uDC55\\uDC60-\\uDC76\\uDC80-\\uDC9E\\uDCE0-\\uDCF2\\uDCF4\\uDCF5\\uDD00-\\uDD15\\uDD20-\\uDD39\\uDD80-\\uDDB7\\uDDBE\\uDDBF\\uDE00\\uDE10-\\uDE13\\uDE15-\\uDE17\\uDE19-\\uDE33\\uDE60-\\uDE7C\\uDE80-\\uDE9C\\uDEC0-\\uDEC7\\uDEC9-\\uDEE4\\uDF00-\\uDF35\\uDF40-\\uDF55\\uDF60-\\uDF72\\uDF80-\\uDF91]|\\uD803[\\uDC00-\\uDC48\\uDC80-\\uDCB2\\uDCC0-\\uDCF2]|\\uD804[\\uDC03-\\uDC37\\uDC83-\\uDCAF\\uDCD0-\\uDCE8\\uDD03-\\uDD26\\uDD50-\\uDD72\\uDD76\\uDD83-\\uDDB2\\uDDC1-\\uDDC4\\uDDDA\\uDDDC\\uDE00-\\uDE11\\uDE13-\\uDE2B\\uDE80-\\uDE86\\uDE88\\uDE8A-\\uDE8D\\uDE8F-\\uDE9D\\uDE9F-\\uDEA8\\uDEB0-\\uDEDE\\uDF05-\\uDF0C\\uDF0F\\uDF10\\uDF13-\\uDF28\\uDF2A-\\uDF30\\uDF32\\uDF33\\uDF35-\\uDF39\\uDF3D\\uDF50\\uDF5D-\\uDF61]|\\uD805[\\uDC00-\\uDC34\\uDC47-\\uDC4A\\uDC80-\\uDCAF\\uDCC4\\uDCC5\\uDCC7\\uDD80-\\uDDAE\\uDDD8-\\uDDDB\\uDE00-\\uDE2F\\uDE44\\uDE80-\\uDEAA\\uDF00-\\uDF19]|\\uD806[\\uDCA0-\\uDCDF\\uDCFF\\uDE00\\uDE0B-\\uDE32\\uDE3A\\uDE50\\uDE5C-\\uDE83\\uDE86-\\uDE89\\uDEC0-\\uDEF8]|\\uD807[\\uDC00-\\uDC08\\uDC0A-\\uDC2E\\uDC40\\uDC72-\\uDC8F\\uDD00-\\uDD06\\uDD08\\uDD09\\uDD0B-\\uDD30\\uDD46]|\\uD808[\\uDC00-\\uDF99]|\\uD809[\\uDC00-\\uDC6E\\uDC80-\\uDD43]|[\\uD80C\\uD81C-\\uD820\\uD840-\\uD868\\uD86A-\\uD86C\\uD86F-\\uD872\\uD874-\\uD879][\\uDC00-\\uDFFF]|\\uD80D[\\uDC00-\\uDC2E]|\\uD811[\\uDC00-\\uDE46]|\\uD81A[\\uDC00-\\uDE38\\uDE40-\\uDE5E\\uDED0-\\uDEED\\uDF00-\\uDF2F\\uDF40-\\uDF43\\uDF63-\\uDF77\\uDF7D-\\uDF8F]|\\uD81B[\\uDF00-\\uDF44\\uDF50\\uDF93-\\uDF9F\\uDFE0\\uDFE1]|\\uD821[\\uDC00-\\uDFEC]|\\uD822[\\uDC00-\\uDEF2]|\\uD82C[\\uDC00-\\uDD1E\\uDD70-\\uDEFB]|\\uD82F[\\uDC00-\\uDC6A\\uDC70-\\uDC7C\\uDC80-\\uDC88\\uDC90-\\uDC99]|\\uD835[\\uDC00-\\uDC54\\uDC56-\\uDC9C\\uDC9E\\uDC9F\\uDCA2\\uDCA5\\uDCA6\\uDCA9-\\uDCAC\\uDCAE-\\uDCB9\\uDCBB\\uDCBD-\\uDCC3\\uDCC5-\\uDD05\\uDD07-\\uDD0A\\uDD0D-\\uDD14\\uDD16-\\uDD1C\\uDD1E-\\uDD39\\uDD3B-\\uDD3E\\uDD40-\\uDD44\\uDD46\\uDD4A-\\uDD50\\uDD52-\\uDEA5\\uDEA8-\\uDEC0\\uDEC2-\\uDEDA\\uDEDC-\\uDEFA\\uDEFC-\\uDF14\\uDF16-\\uDF34\\uDF36-\\uDF4E\\uDF50-\\uDF6E\\uDF70-\\uDF88\\uDF8A-\\uDFA8\\uDFAA-\\uDFC2\\uDFC4-\\uDFCB]|\\uD83A[\\uDC00-\\uDCC4\\uDD00-\\uDD43]|\\uD83B[\\uDE00-\\uDE03\\uDE05-\\uDE1F\\uDE21\\uDE22\\uDE24\\uDE27\\uDE29-\\uDE32\\uDE34-\\uDE37\\uDE39\\uDE3B\\uDE42\\uDE47\\uDE49\\uDE4B\\uDE4D-\\uDE4F\\uDE51\\uDE52\\uDE54\\uDE57\\uDE59\\uDE5B\\uDE5D\\uDE5F\\uDE61\\uDE62\\uDE64\\uDE67-\\uDE6A\\uDE6C-\\uDE72\\uDE74-\\uDE77\\uDE79-\\uDE7C\\uDE7E\\uDE80-\\uDE89\\uDE8B-\\uDE9B\\uDEA1-\\uDEA3\\uDEA5-\\uDEA9\\uDEAB-\\uDEBB]|\\uD869[\\uDC00-\\uDED6\\uDF00-\\uDFFF]|\\uD86D[\\uDC00-\\uDF34\\uDF40-\\uDFFF]|\\uD86E[\\uDC00-\\uDC1D\\uDC20-\\uDFFF]|\\uD873[\\uDC00-\\uDEA1\\uDEB0-\\uDFFF]|\\uD87A[\\uDC00-\\uDFE0]|\\uD87E[\\uDC00-\\uDE1D]/;\nvar ID_Continue = /[\\xAA\\xB5\\xBA\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0300-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u0483-\\u0487\\u048A-\\u052F\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u0591-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0610-\\u061A\\u0620-\\u0669\\u066E-\\u06D3\\u06D5-\\u06DC\\u06DF-\\u06E8\\u06EA-\\u06FC\\u06FF\\u0710-\\u074A\\u074D-\\u07B1\\u07C0-\\u07F5\\u07FA\\u0800-\\u082D\\u0840-\\u085B\\u0860-\\u086A\\u08A0-\\u08B4\\u08B6-\\u08BD\\u08D4-\\u08E1\\u08E3-\\u0963\\u0966-\\u096F\\u0971-\\u0983\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BC-\\u09C4\\u09C7\\u09C8\\u09CB-\\u09CE\\u09D7\\u09DC\\u09DD\\u09DF-\\u09E3\\u09E6-\\u09F1\\u09FC\\u0A01-\\u0A03\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A3C\\u0A3E-\\u0A42\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A51\\u0A59-\\u0A5C\\u0A5E\\u0A66-\\u0A75\\u0A81-\\u0A83\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABC-\\u0AC5\\u0AC7-\\u0AC9\\u0ACB-\\u0ACD\\u0AD0\\u0AE0-\\u0AE3\\u0AE6-\\u0AEF\\u0AF9-\\u0AFF\\u0B01-\\u0B03\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3C-\\u0B44\\u0B47\\u0B48\\u0B4B-\\u0B4D\\u0B56\\u0B57\\u0B5C\\u0B5D\\u0B5F-\\u0B63\\u0B66-\\u0B6F\\u0B71\\u0B82\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BBE-\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCD\\u0BD0\\u0BD7\\u0BE6-\\u0BEF\\u0C00-\\u0C03\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D-\\u0C44\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56\\u0C58-\\u0C5A\\u0C60-\\u0C63\\u0C66-\\u0C6F\\u0C80-\\u0C83\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBC-\\u0CC4\\u0CC6-\\u0CC8\\u0CCA-\\u0CCD\\u0CD5\\u0CD6\\u0CDE\\u0CE0-\\u0CE3\\u0CE6-\\u0CEF\\u0CF1\\u0CF2\\u0D00-\\u0D03\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D44\\u0D46-\\u0D48\\u0D4A-\\u0D4E\\u0D54-\\u0D57\\u0D5F-\\u0D63\\u0D66-\\u0D6F\\u0D7A-\\u0D7F\\u0D82\\u0D83\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0DCA\\u0DCF-\\u0DD4\\u0DD6\\u0DD8-\\u0DDF\\u0DE6-\\u0DEF\\u0DF2\\u0DF3\\u0E01-\\u0E3A\\u0E40-\\u0E4E\\u0E50-\\u0E59\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB9\\u0EBB-\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EC8-\\u0ECD\\u0ED0-\\u0ED9\\u0EDC-\\u0EDF\\u0F00\\u0F18\\u0F19\\u0F20-\\u0F29\\u0F35\\u0F37\\u0F39\\u0F3E-\\u0F47\\u0F49-\\u0F6C\\u0F71-\\u0F84\\u0F86-\\u0F97\\u0F99-\\u0FBC\\u0FC6\\u1000-\\u1049\\u1050-\\u109D\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u135D-\\u135F\\u1380-\\u138F\\u13A0-\\u13F5\\u13F8-\\u13FD\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16EE-\\u16F8\\u1700-\\u170C\\u170E-\\u1714\\u1720-\\u1734\\u1740-\\u1753\\u1760-\\u176C\\u176E-\\u1770\\u1772\\u1773\\u1780-\\u17D3\\u17D7\\u17DC\\u17DD\\u17E0-\\u17E9\\u180B-\\u180D\\u1810-\\u1819\\u1820-\\u1877\\u1880-\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1920-\\u192B\\u1930-\\u193B\\u1946-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19B0-\\u19C9\\u19D0-\\u19D9\\u1A00-\\u1A1B\\u1A20-\\u1A5E\\u1A60-\\u1A7C\\u1A7F-\\u1A89\\u1A90-\\u1A99\\u1AA7\\u1AB0-\\u1ABD\\u1B00-\\u1B4B\\u1B50-\\u1B59\\u1B6B-\\u1B73\\u1B80-\\u1BF3\\u1C00-\\u1C37\\u1C40-\\u1C49\\u1C4D-\\u1C7D\\u1C80-\\u1C88\\u1CD0-\\u1CD2\\u1CD4-\\u1CF9\\u1D00-\\u1DF9\\u1DFB-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u203F\\u2040\\u2054\\u2071\\u207F\\u2090-\\u209C\\u20D0-\\u20DC\\u20E1\\u20E5-\\u20F0\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2160-\\u2188\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D7F-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2DE0-\\u2DFF\\u2E2F\\u3005-\\u3007\\u3021-\\u302F\\u3031-\\u3035\\u3038-\\u303C\\u3041-\\u3096\\u3099\\u309A\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312E\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FEA\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA62B\\uA640-\\uA66F\\uA674-\\uA67D\\uA67F-\\uA6F1\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA7AE\\uA7B0-\\uA7B7\\uA7F7-\\uA827\\uA840-\\uA873\\uA880-\\uA8C5\\uA8D0-\\uA8D9\\uA8E0-\\uA8F7\\uA8FB\\uA8FD\\uA900-\\uA92D\\uA930-\\uA953\\uA960-\\uA97C\\uA980-\\uA9C0\\uA9CF-\\uA9D9\\uA9E0-\\uA9FE\\uAA00-\\uAA36\\uAA40-\\uAA4D\\uAA50-\\uAA59\\uAA60-\\uAA76\\uAA7A-\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEF\\uAAF2-\\uAAF6\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAB30-\\uAB5A\\uAB5C-\\uAB65\\uAB70-\\uABEA\\uABEC\\uABED\\uABF0-\\uABF9\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE00-\\uFE0F\\uFE20-\\uFE2F\\uFE33\\uFE34\\uFE4D-\\uFE4F\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF10-\\uFF19\\uFF21-\\uFF3A\\uFF3F\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC]|\\uD800[\\uDC00-\\uDC0B\\uDC0D-\\uDC26\\uDC28-\\uDC3A\\uDC3C\\uDC3D\\uDC3F-\\uDC4D\\uDC50-\\uDC5D\\uDC80-\\uDCFA\\uDD40-\\uDD74\\uDDFD\\uDE80-\\uDE9C\\uDEA0-\\uDED0\\uDEE0\\uDF00-\\uDF1F\\uDF2D-\\uDF4A\\uDF50-\\uDF7A\\uDF80-\\uDF9D\\uDFA0-\\uDFC3\\uDFC8-\\uDFCF\\uDFD1-\\uDFD5]|\\uD801[\\uDC00-\\uDC9D\\uDCA0-\\uDCA9\\uDCB0-\\uDCD3\\uDCD8-\\uDCFB\\uDD00-\\uDD27\\uDD30-\\uDD63\\uDE00-\\uDF36\\uDF40-\\uDF55\\uDF60-\\uDF67]|\\uD802[\\uDC00-\\uDC05\\uDC08\\uDC0A-\\uDC35\\uDC37\\uDC38\\uDC3C\\uDC3F-\\uDC55\\uDC60-\\uDC76\\uDC80-\\uDC9E\\uDCE0-\\uDCF2\\uDCF4\\uDCF5\\uDD00-\\uDD15\\uDD20-\\uDD39\\uDD80-\\uDDB7\\uDDBE\\uDDBF\\uDE00-\\uDE03\\uDE05\\uDE06\\uDE0C-\\uDE13\\uDE15-\\uDE17\\uDE19-\\uDE33\\uDE38-\\uDE3A\\uDE3F\\uDE60-\\uDE7C\\uDE80-\\uDE9C\\uDEC0-\\uDEC7\\uDEC9-\\uDEE6\\uDF00-\\uDF35\\uDF40-\\uDF55\\uDF60-\\uDF72\\uDF80-\\uDF91]|\\uD803[\\uDC00-\\uDC48\\uDC80-\\uDCB2\\uDCC0-\\uDCF2]|\\uD804[\\uDC00-\\uDC46\\uDC66-\\uDC6F\\uDC7F-\\uDCBA\\uDCD0-\\uDCE8\\uDCF0-\\uDCF9\\uDD00-\\uDD34\\uDD36-\\uDD3F\\uDD50-\\uDD73\\uDD76\\uDD80-\\uDDC4\\uDDCA-\\uDDCC\\uDDD0-\\uDDDA\\uDDDC\\uDE00-\\uDE11\\uDE13-\\uDE37\\uDE3E\\uDE80-\\uDE86\\uDE88\\uDE8A-\\uDE8D\\uDE8F-\\uDE9D\\uDE9F-\\uDEA8\\uDEB0-\\uDEEA\\uDEF0-\\uDEF9\\uDF00-\\uDF03\\uDF05-\\uDF0C\\uDF0F\\uDF10\\uDF13-\\uDF28\\uDF2A-\\uDF30\\uDF32\\uDF33\\uDF35-\\uDF39\\uDF3C-\\uDF44\\uDF47\\uDF48\\uDF4B-\\uDF4D\\uDF50\\uDF57\\uDF5D-\\uDF63\\uDF66-\\uDF6C\\uDF70-\\uDF74]|\\uD805[\\uDC00-\\uDC4A\\uDC50-\\uDC59\\uDC80-\\uDCC5\\uDCC7\\uDCD0-\\uDCD9\\uDD80-\\uDDB5\\uDDB8-\\uDDC0\\uDDD8-\\uDDDD\\uDE00-\\uDE40\\uDE44\\uDE50-\\uDE59\\uDE80-\\uDEB7\\uDEC0-\\uDEC9\\uDF00-\\uDF19\\uDF1D-\\uDF2B\\uDF30-\\uDF39]|\\uD806[\\uDCA0-\\uDCE9\\uDCFF\\uDE00-\\uDE3E\\uDE47\\uDE50-\\uDE83\\uDE86-\\uDE99\\uDEC0-\\uDEF8]|\\uD807[\\uDC00-\\uDC08\\uDC0A-\\uDC36\\uDC38-\\uDC40\\uDC50-\\uDC59\\uDC72-\\uDC8F\\uDC92-\\uDCA7\\uDCA9-\\uDCB6\\uDD00-\\uDD06\\uDD08\\uDD09\\uDD0B-\\uDD36\\uDD3A\\uDD3C\\uDD3D\\uDD3F-\\uDD47\\uDD50-\\uDD59]|\\uD808[\\uDC00-\\uDF99]|\\uD809[\\uDC00-\\uDC6E\\uDC80-\\uDD43]|[\\uD80C\\uD81C-\\uD820\\uD840-\\uD868\\uD86A-\\uD86C\\uD86F-\\uD872\\uD874-\\uD879][\\uDC00-\\uDFFF]|\\uD80D[\\uDC00-\\uDC2E]|\\uD811[\\uDC00-\\uDE46]|\\uD81A[\\uDC00-\\uDE38\\uDE40-\\uDE5E\\uDE60-\\uDE69\\uDED0-\\uDEED\\uDEF0-\\uDEF4\\uDF00-\\uDF36\\uDF40-\\uDF43\\uDF50-\\uDF59\\uDF63-\\uDF77\\uDF7D-\\uDF8F]|\\uD81B[\\uDF00-\\uDF44\\uDF50-\\uDF7E\\uDF8F-\\uDF9F\\uDFE0\\uDFE1]|\\uD821[\\uDC00-\\uDFEC]|\\uD822[\\uDC00-\\uDEF2]|\\uD82C[\\uDC00-\\uDD1E\\uDD70-\\uDEFB]|\\uD82F[\\uDC00-\\uDC6A\\uDC70-\\uDC7C\\uDC80-\\uDC88\\uDC90-\\uDC99\\uDC9D\\uDC9E]|\\uD834[\\uDD65-\\uDD69\\uDD6D-\\uDD72\\uDD7B-\\uDD82\\uDD85-\\uDD8B\\uDDAA-\\uDDAD\\uDE42-\\uDE44]|\\uD835[\\uDC00-\\uDC54\\uDC56-\\uDC9C\\uDC9E\\uDC9F\\uDCA2\\uDCA5\\uDCA6\\uDCA9-\\uDCAC\\uDCAE-\\uDCB9\\uDCBB\\uDCBD-\\uDCC3\\uDCC5-\\uDD05\\uDD07-\\uDD0A\\uDD0D-\\uDD14\\uDD16-\\uDD1C\\uDD1E-\\uDD39\\uDD3B-\\uDD3E\\uDD40-\\uDD44\\uDD46\\uDD4A-\\uDD50\\uDD52-\\uDEA5\\uDEA8-\\uDEC0\\uDEC2-\\uDEDA\\uDEDC-\\uDEFA\\uDEFC-\\uDF14\\uDF16-\\uDF34\\uDF36-\\uDF4E\\uDF50-\\uDF6E\\uDF70-\\uDF88\\uDF8A-\\uDFA8\\uDFAA-\\uDFC2\\uDFC4-\\uDFCB\\uDFCE-\\uDFFF]|\\uD836[\\uDE00-\\uDE36\\uDE3B-\\uDE6C\\uDE75\\uDE84\\uDE9B-\\uDE9F\\uDEA1-\\uDEAF]|\\uD838[\\uDC00-\\uDC06\\uDC08-\\uDC18\\uDC1B-\\uDC21\\uDC23\\uDC24\\uDC26-\\uDC2A]|\\uD83A[\\uDC00-\\uDCC4\\uDCD0-\\uDCD6\\uDD00-\\uDD4A\\uDD50-\\uDD59]|\\uD83B[\\uDE00-\\uDE03\\uDE05-\\uDE1F\\uDE21\\uDE22\\uDE24\\uDE27\\uDE29-\\uDE32\\uDE34-\\uDE37\\uDE39\\uDE3B\\uDE42\\uDE47\\uDE49\\uDE4B\\uDE4D-\\uDE4F\\uDE51\\uDE52\\uDE54\\uDE57\\uDE59\\uDE5B\\uDE5D\\uDE5F\\uDE61\\uDE62\\uDE64\\uDE67-\\uDE6A\\uDE6C-\\uDE72\\uDE74-\\uDE77\\uDE79-\\uDE7C\\uDE7E\\uDE80-\\uDE89\\uDE8B-\\uDE9B\\uDEA1-\\uDEA3\\uDEA5-\\uDEA9\\uDEAB-\\uDEBB]|\\uD869[\\uDC00-\\uDED6\\uDF00-\\uDFFF]|\\uD86D[\\uDC00-\\uDF34\\uDF40-\\uDFFF]|\\uD86E[\\uDC00-\\uDC1D\\uDC20-\\uDFFF]|\\uD873[\\uDC00-\\uDEA1\\uDEB0-\\uDFFF]|\\uD87A[\\uDC00-\\uDFE0]|\\uD87E[\\uDC00-\\uDE1D]|\\uDB40[\\uDD00-\\uDDEF]/;\n\nvar unicode = {\n\tSpace_Separator: Space_Separator,\n\tID_Start: ID_Start,\n\tID_Continue: ID_Continue\n};\n\nvar util = {\n isSpaceSeparator (c) {\n return typeof c === 'string' && unicode.Space_Separator.test(c)\n },\n\n isIdStartChar (c) {\n return typeof c === 'string' && (\n (c >= 'a' && c <= 'z') ||\n (c >= 'A' && c <= 'Z') ||\n (c === '$') || (c === '_') ||\n unicode.ID_Start.test(c)\n )\n },\n\n isIdContinueChar (c) {\n return typeof c === 'string' && (\n (c >= 'a' && c <= 'z') ||\n (c >= 'A' && c <= 'Z') ||\n (c >= '0' && c <= '9') ||\n (c === '$') || (c === '_') ||\n (c === '\\u200C') || (c === '\\u200D') ||\n unicode.ID_Continue.test(c)\n )\n },\n\n isDigit (c) {\n return typeof c === 'string' && /[0-9]/.test(c)\n },\n\n isHexDigit (c) {\n return typeof c === 'string' && /[0-9A-Fa-f]/.test(c)\n },\n};\n\nlet source;\nlet parseState;\nlet stack;\nlet pos;\nlet line;\nlet column;\nlet token;\nlet key;\nlet root;\n\nvar parse = function parse (text, reviver) {\n source = String(text);\n parseState = 'start';\n stack = [];\n pos = 0;\n line = 1;\n column = 0;\n token = undefined;\n key = undefined;\n root = undefined;\n\n do {\n token = lex();\n\n // This code is unreachable.\n // if (!parseStates[parseState]) {\n // throw invalidParseState()\n // }\n\n parseStates[parseState]();\n } while (token.type !== 'eof')\n\n if (typeof reviver === 'function') {\n return internalize({'': root}, '', reviver)\n }\n\n return root\n};\n\nfunction internalize (holder, name, reviver) {\n const value = holder[name];\n if (value != null && typeof value === 'object') {\n if (Array.isArray(value)) {\n for (let i = 0; i < value.length; i++) {\n const key = String(i);\n const replacement = internalize(value, key, reviver);\n if (replacement === undefined) {\n delete value[key];\n } else {\n Object.defineProperty(value, key, {\n value: replacement,\n writable: true,\n enumerable: true,\n configurable: true,\n });\n }\n }\n } else {\n for (const key in value) {\n const replacement = internalize(value, key, reviver);\n if (replacement === undefined) {\n delete value[key];\n } else {\n Object.defineProperty(value, key, {\n value: replacement,\n writable: true,\n enumerable: true,\n configurable: true,\n });\n }\n }\n }\n }\n\n return reviver.call(holder, name, value)\n}\n\nlet lexState;\nlet buffer;\nlet doubleQuote;\nlet sign;\nlet c;\n\nfunction lex () {\n lexState = 'default';\n buffer = '';\n doubleQuote = false;\n sign = 1;\n\n for (;;) {\n c = peek();\n\n // This code is unreachable.\n // if (!lexStates[lexState]) {\n // throw invalidLexState(lexState)\n // }\n\n const token = lexStates[lexState]();\n if (token) {\n return token\n }\n }\n}\n\nfunction peek () {\n if (source[pos]) {\n return String.fromCodePoint(source.codePointAt(pos))\n }\n}\n\nfunction read () {\n const c = peek();\n\n if (c === '\\n') {\n line++;\n column = 0;\n } else if (c) {\n column += c.length;\n } else {\n column++;\n }\n\n if (c) {\n pos += c.length;\n }\n\n return c\n}\n\nconst lexStates = {\n default () {\n switch (c) {\n case '\\t':\n case '\\v':\n case '\\f':\n case ' ':\n case '\\u00A0':\n case '\\uFEFF':\n case '\\n':\n case '\\r':\n case '\\u2028':\n case '\\u2029':\n read();\n return\n\n case '/':\n read();\n lexState = 'comment';\n return\n\n case undefined:\n read();\n return newToken('eof')\n }\n\n if (util.isSpaceSeparator(c)) {\n read();\n return\n }\n\n // This code is unreachable.\n // if (!lexStates[parseState]) {\n // throw invalidLexState(parseState)\n // }\n\n return lexStates[parseState]()\n },\n\n comment () {\n switch (c) {\n case '*':\n read();\n lexState = 'multiLineComment';\n return\n\n case '/':\n read();\n lexState = 'singleLineComment';\n return\n }\n\n throw invalidChar(read())\n },\n\n multiLineComment () {\n switch (c) {\n case '*':\n read();\n lexState = 'multiLineCommentAsterisk';\n return\n\n case undefined:\n throw invalidChar(read())\n }\n\n read();\n },\n\n multiLineCommentAsterisk () {\n switch (c) {\n case '*':\n read();\n return\n\n case '/':\n read();\n lexState = 'default';\n return\n\n case undefined:\n throw invalidChar(read())\n }\n\n read();\n lexState = 'multiLineComment';\n },\n\n singleLineComment () {\n switch (c) {\n case '\\n':\n case '\\r':\n case '\\u2028':\n case '\\u2029':\n read();\n lexState = 'default';\n return\n\n case undefined:\n read();\n return newToken('eof')\n }\n\n read();\n },\n\n value () {\n switch (c) {\n case '{':\n case '[':\n return newToken('punctuator', read())\n\n case 'n':\n read();\n literal('ull');\n return newToken('null', null)\n\n case 't':\n read();\n literal('rue');\n return newToken('boolean', true)\n\n case 'f':\n read();\n literal('alse');\n return newToken('boolean', false)\n\n case '-':\n case '+':\n if (read() === '-') {\n sign = -1;\n }\n\n lexState = 'sign';\n return\n\n case '.':\n buffer = read();\n lexState = 'decimalPointLeading';\n return\n\n case '0':\n buffer = read();\n lexState = 'zero';\n return\n\n case '1':\n case '2':\n case '3':\n case '4':\n case '5':\n case '6':\n case '7':\n case '8':\n case '9':\n buffer = read();\n lexState = 'decimalInteger';\n return\n\n case 'I':\n read();\n literal('nfinity');\n return newToken('numeric', Infinity)\n\n case 'N':\n read();\n literal('aN');\n return newToken('numeric', NaN)\n\n case '\"':\n case \"'\":\n doubleQuote = (read() === '\"');\n buffer = '';\n lexState = 'string';\n return\n }\n\n throw invalidChar(read())\n },\n\n identifierNameStartEscape () {\n if (c !== 'u') {\n throw invalidChar(read())\n }\n\n read();\n const u = unicodeEscape();\n switch (u) {\n case '$':\n case '_':\n break\n\n default:\n if (!util.isIdStartChar(u)) {\n throw invalidIdentifier()\n }\n\n break\n }\n\n buffer += u;\n lexState = 'identifierName';\n },\n\n identifierName () {\n switch (c) {\n case '$':\n case '_':\n case '\\u200C':\n case '\\u200D':\n buffer += read();\n return\n\n case '\\\\':\n read();\n lexState = 'identifierNameEscape';\n return\n }\n\n if (util.isIdContinueChar(c)) {\n buffer += read();\n return\n }\n\n return newToken('identifier', buffer)\n },\n\n identifierNameEscape () {\n if (c !== 'u') {\n throw invalidChar(read())\n }\n\n read();\n const u = unicodeEscape();\n switch (u) {\n case '$':\n case '_':\n case '\\u200C':\n case '\\u200D':\n break\n\n default:\n if (!util.isIdContinueChar(u)) {\n throw invalidIdentifier()\n }\n\n break\n }\n\n buffer += u;\n lexState = 'identifierName';\n },\n\n sign () {\n switch (c) {\n case '.':\n buffer = read();\n lexState = 'decimalPointLeading';\n return\n\n case '0':\n buffer = read();\n lexState = 'zero';\n return\n\n case '1':\n case '2':\n case '3':\n case '4':\n case '5':\n case '6':\n case '7':\n case '8':\n case '9':\n buffer = read();\n lexState = 'decimalInteger';\n return\n\n case 'I':\n read();\n literal('nfinity');\n return newToken('numeric', sign * Infinity)\n\n case 'N':\n read();\n literal('aN');\n return newToken('numeric', NaN)\n }\n\n throw invalidChar(read())\n },\n\n zero () {\n switch (c) {\n case '.':\n buffer += read();\n lexState = 'decimalPoint';\n return\n\n case 'e':\n case 'E':\n buffer += read();\n lexState = 'decimalExponent';\n return\n\n case 'x':\n case 'X':\n buffer += read();\n lexState = 'hexadecimal';\n return\n }\n\n return newToken('numeric', sign * 0)\n },\n\n decimalInteger () {\n switch (c) {\n case '.':\n buffer += read();\n lexState = 'decimalPoint';\n return\n\n case 'e':\n case 'E':\n buffer += read();\n lexState = 'decimalExponent';\n return\n }\n\n if (util.isDigit(c)) {\n buffer += read();\n return\n }\n\n return newToken('numeric', sign * Number(buffer))\n },\n\n decimalPointLeading () {\n if (util.isDigit(c)) {\n buffer += read();\n lexState = 'decimalFraction';\n return\n }\n\n throw invalidChar(read())\n },\n\n decimalPoint () {\n switch (c) {\n case 'e':\n case 'E':\n buffer += read();\n lexState = 'decimalExponent';\n return\n }\n\n if (util.isDigit(c)) {\n buffer += read();\n lexState = 'decimalFraction';\n return\n }\n\n return newToken('numeric', sign * Number(buffer))\n },\n\n decimalFraction () {\n switch (c) {\n case 'e':\n case 'E':\n buffer += read();\n lexState = 'decimalExponent';\n return\n }\n\n if (util.isDigit(c)) {\n buffer += read();\n return\n }\n\n return newToken('numeric', sign * Number(buffer))\n },\n\n decimalExponent () {\n switch (c) {\n case '+':\n case '-':\n buffer += read();\n lexState = 'decimalExponentSign';\n return\n }\n\n if (util.isDigit(c)) {\n buffer += read();\n lexState = 'decimalExponentInteger';\n return\n }\n\n throw invalidChar(read())\n },\n\n decimalExponentSign () {\n if (util.isDigit(c)) {\n buffer += read();\n lexState = 'decimalExponentInteger';\n return\n }\n\n throw invalidChar(read())\n },\n\n decimalExponentInteger () {\n if (util.isDigit(c)) {\n buffer += read();\n return\n }\n\n return newToken('numeric', sign * Number(buffer))\n },\n\n hexadecimal () {\n if (util.isHexDigit(c)) {\n buffer += read();\n lexState = 'hexadecimalInteger';\n return\n }\n\n throw invalidChar(read())\n },\n\n hexadecimalInteger () {\n if (util.isHexDigit(c)) {\n buffer += read();\n return\n }\n\n return newToken('numeric', sign * Number(buffer))\n },\n\n string () {\n switch (c) {\n case '\\\\':\n read();\n buffer += escape();\n return\n\n case '\"':\n if (doubleQuote) {\n read();\n return newToken('string', buffer)\n }\n\n buffer += read();\n return\n\n case \"'\":\n if (!doubleQuote) {\n read();\n return newToken('string', buffer)\n }\n\n buffer += read();\n return\n\n case '\\n':\n case '\\r':\n throw invalidChar(read())\n\n case '\\u2028':\n case '\\u2029':\n separatorChar(c);\n break\n\n case undefined:\n throw invalidChar(read())\n }\n\n buffer += read();\n },\n\n start () {\n switch (c) {\n case '{':\n case '[':\n return newToken('punctuator', read())\n\n // This code is unreachable since the default lexState handles eof.\n // case undefined:\n // return newToken('eof')\n }\n\n lexState = 'value';\n },\n\n beforePropertyName () {\n switch (c) {\n case '$':\n case '_':\n buffer = read();\n lexState = 'identifierName';\n return\n\n case '\\\\':\n read();\n lexState = 'identifierNameStartEscape';\n return\n\n case '}':\n return newToken('punctuator', read())\n\n case '\"':\n case \"'\":\n doubleQuote = (read() === '\"');\n lexState = 'string';\n return\n }\n\n if (util.isIdStartChar(c)) {\n buffer += read();\n lexState = 'identifierName';\n return\n }\n\n throw invalidChar(read())\n },\n\n afterPropertyName () {\n if (c === ':') {\n return newToken('punctuator', read())\n }\n\n throw invalidChar(read())\n },\n\n beforePropertyValue () {\n lexState = 'value';\n },\n\n afterPropertyValue () {\n switch (c) {\n case ',':\n case '}':\n return newToken('punctuator', read())\n }\n\n throw invalidChar(read())\n },\n\n beforeArrayValue () {\n if (c === ']') {\n return newToken('punctuator', read())\n }\n\n lexState = 'value';\n },\n\n afterArrayValue () {\n switch (c) {\n case ',':\n case ']':\n return newToken('punctuator', read())\n }\n\n throw invalidChar(read())\n },\n\n end () {\n // This code is unreachable since it's handled by the default lexState.\n // if (c === undefined) {\n // read()\n // return newToken('eof')\n // }\n\n throw invalidChar(read())\n },\n};\n\nfunction newToken (type, value) {\n return {\n type,\n value,\n line,\n column,\n }\n}\n\nfunction literal (s) {\n for (const c of s) {\n const p = peek();\n\n if (p !== c) {\n throw invalidChar(read())\n }\n\n read();\n }\n}\n\nfunction escape () {\n const c = peek();\n switch (c) {\n case 'b':\n read();\n return '\\b'\n\n case 'f':\n read();\n return '\\f'\n\n case 'n':\n read();\n return '\\n'\n\n case 'r':\n read();\n return '\\r'\n\n case 't':\n read();\n return '\\t'\n\n case 'v':\n read();\n return '\\v'\n\n case '0':\n read();\n if (util.isDigit(peek())) {\n throw invalidChar(read())\n }\n\n return '\\0'\n\n case 'x':\n read();\n return hexEscape()\n\n case 'u':\n read();\n return unicodeEscape()\n\n case '\\n':\n case '\\u2028':\n case '\\u2029':\n read();\n return ''\n\n case '\\r':\n read();\n if (peek() === '\\n') {\n read();\n }\n\n return ''\n\n case '1':\n case '2':\n case '3':\n case '4':\n case '5':\n case '6':\n case '7':\n case '8':\n case '9':\n throw invalidChar(read())\n\n case undefined:\n throw invalidChar(read())\n }\n\n return read()\n}\n\nfunction hexEscape () {\n let buffer = '';\n let c = peek();\n\n if (!util.isHexDigit(c)) {\n throw invalidChar(read())\n }\n\n buffer += read();\n\n c = peek();\n if (!util.isHexDigit(c)) {\n throw invalidChar(read())\n }\n\n buffer += read();\n\n return String.fromCodePoint(parseInt(buffer, 16))\n}\n\nfunction unicodeEscape () {\n let buffer = '';\n let count = 4;\n\n while (count-- > 0) {\n const c = peek();\n if (!util.isHexDigit(c)) {\n throw invalidChar(read())\n }\n\n buffer += read();\n }\n\n return String.fromCodePoint(parseInt(buffer, 16))\n}\n\nconst parseStates = {\n start () {\n if (token.type === 'eof') {\n throw invalidEOF()\n }\n\n push();\n },\n\n beforePropertyName () {\n switch (token.type) {\n case 'identifier':\n case 'string':\n key = token.value;\n parseState = 'afterPropertyName';\n return\n\n case 'punctuator':\n // This code is unreachable since it's handled by the lexState.\n // if (token.value !== '}') {\n // throw invalidToken()\n // }\n\n pop();\n return\n\n case 'eof':\n throw invalidEOF()\n }\n\n // This code is unreachable since it's handled by the lexState.\n // throw invalidToken()\n },\n\n afterPropertyName () {\n // This code is unreachable since it's handled by the lexState.\n // if (token.type !== 'punctuator' || token.value !== ':') {\n // throw invalidToken()\n // }\n\n if (token.type === 'eof') {\n throw invalidEOF()\n }\n\n parseState = 'beforePropertyValue';\n },\n\n beforePropertyValue () {\n if (token.type === 'eof') {\n throw invalidEOF()\n }\n\n push();\n },\n\n beforeArrayValue () {\n if (token.type === 'eof') {\n throw invalidEOF()\n }\n\n if (token.type === 'punctuator' && token.value === ']') {\n pop();\n return\n }\n\n push();\n },\n\n afterPropertyValue () {\n // This code is unreachable since it's handled by the lexState.\n // if (token.type !== 'punctuator') {\n // throw invalidToken()\n // }\n\n if (token.type === 'eof') {\n throw invalidEOF()\n }\n\n switch (token.value) {\n case ',':\n parseState = 'beforePropertyName';\n return\n\n case '}':\n pop();\n }\n\n // This code is unreachable since it's handled by the lexState.\n // throw invalidToken()\n },\n\n afterArrayValue () {\n // This code is unreachable since it's handled by the lexState.\n // if (token.type !== 'punctuator') {\n // throw invalidToken()\n // }\n\n if (token.type === 'eof') {\n throw invalidEOF()\n }\n\n switch (token.value) {\n case ',':\n parseState = 'beforeArrayValue';\n return\n\n case ']':\n pop();\n }\n\n // This code is unreachable since it's handled by the lexState.\n // throw invalidToken()\n },\n\n end () {\n // This code is unreachable since it's handled by the lexState.\n // if (token.type !== 'eof') {\n // throw invalidToken()\n // }\n },\n};\n\nfunction push () {\n let value;\n\n switch (token.type) {\n case 'punctuator':\n switch (token.value) {\n case '{':\n value = {};\n break\n\n case '[':\n value = [];\n break\n }\n\n break\n\n case 'null':\n case 'boolean':\n case 'numeric':\n case 'string':\n value = token.value;\n break\n\n // This code is unreachable.\n // default:\n // throw invalidToken()\n }\n\n if (root === undefined) {\n root = value;\n } else {\n const parent = stack[stack.length - 1];\n if (Array.isArray(parent)) {\n parent.push(value);\n } else {\n Object.defineProperty(parent, key, {\n value,\n writable: true,\n enumerable: true,\n configurable: true,\n });\n }\n }\n\n if (value !== null && typeof value === 'object') {\n stack.push(value);\n\n if (Array.isArray(value)) {\n parseState = 'beforeArrayValue';\n } else {\n parseState = 'beforePropertyName';\n }\n } else {\n const current = stack[stack.length - 1];\n if (current == null) {\n parseState = 'end';\n } else if (Array.isArray(current)) {\n parseState = 'afterArrayValue';\n } else {\n parseState = 'afterPropertyValue';\n }\n }\n}\n\nfunction pop () {\n stack.pop();\n\n const current = stack[stack.length - 1];\n if (current == null) {\n parseState = 'end';\n } else if (Array.isArray(current)) {\n parseState = 'afterArrayValue';\n } else {\n parseState = 'afterPropertyValue';\n }\n}\n\n// This code is unreachable.\n// function invalidParseState () {\n// return new Error(`JSON5: invalid parse state '${parseState}'`)\n// }\n\n// This code is unreachable.\n// function invalidLexState (state) {\n// return new Error(`JSON5: invalid lex state '${state}'`)\n// }\n\nfunction invalidChar (c) {\n if (c === undefined) {\n return syntaxError(`JSON5: invalid end of input at ${line}:${column}`)\n }\n\n return syntaxError(`JSON5: invalid character '${formatChar(c)}' at ${line}:${column}`)\n}\n\nfunction invalidEOF () {\n return syntaxError(`JSON5: invalid end of input at ${line}:${column}`)\n}\n\n// This code is unreachable.\n// function invalidToken () {\n// if (token.type === 'eof') {\n// return syntaxError(`JSON5: invalid end of input at ${line}:${column}`)\n// }\n\n// const c = String.fromCodePoint(token.value.codePointAt(0))\n// return syntaxError(`JSON5: invalid character '${formatChar(c)}' at ${line}:${column}`)\n// }\n\nfunction invalidIdentifier () {\n column -= 5;\n return syntaxError(`JSON5: invalid identifier character at ${line}:${column}`)\n}\n\nfunction separatorChar (c) {\n console.warn(`JSON5: '${formatChar(c)}' in strings is not valid ECMAScript; consider escaping`);\n}\n\nfunction formatChar (c) {\n const replacements = {\n \"'\": \"\\\\'\",\n '\"': '\\\\\"',\n '\\\\': '\\\\\\\\',\n '\\b': '\\\\b',\n '\\f': '\\\\f',\n '\\n': '\\\\n',\n '\\r': '\\\\r',\n '\\t': '\\\\t',\n '\\v': '\\\\v',\n '\\0': '\\\\0',\n '\\u2028': '\\\\u2028',\n '\\u2029': '\\\\u2029',\n };\n\n if (replacements[c]) {\n return replacements[c]\n }\n\n if (c < ' ') {\n const hexString = c.charCodeAt(0).toString(16);\n return '\\\\x' + ('00' + hexString).substring(hexString.length)\n }\n\n return c\n}\n\nfunction syntaxError (message) {\n const err = new SyntaxError(message);\n err.lineNumber = line;\n err.columnNumber = column;\n return err\n}\n\nvar stringify = function stringify (value, replacer, space) {\n const stack = [];\n let indent = '';\n let propertyList;\n let replacerFunc;\n let gap = '';\n let quote;\n\n if (\n replacer != null &&\n typeof replacer === 'object' &&\n !Array.isArray(replacer)\n ) {\n space = replacer.space;\n quote = replacer.quote;\n replacer = replacer.replacer;\n }\n\n if (typeof replacer === 'function') {\n replacerFunc = replacer;\n } else if (Array.isArray(replacer)) {\n propertyList = [];\n for (const v of replacer) {\n let item;\n\n if (typeof v === 'string') {\n item = v;\n } else if (\n typeof v === 'number' ||\n v instanceof String ||\n v instanceof Number\n ) {\n item = String(v);\n }\n\n if (item !== undefined && propertyList.indexOf(item) < 0) {\n propertyList.push(item);\n }\n }\n }\n\n if (space instanceof Number) {\n space = Number(space);\n } else if (space instanceof String) {\n space = String(space);\n }\n\n if (typeof space === 'number') {\n if (space > 0) {\n space = Math.min(10, Math.floor(space));\n gap = ' '.substr(0, space);\n }\n } else if (typeof space === 'string') {\n gap = space.substr(0, 10);\n }\n\n return serializeProperty('', {'': value})\n\n function serializeProperty (key, holder) {\n let value = holder[key];\n if (value != null) {\n if (typeof value.toJSON5 === 'function') {\n value = value.toJSON5(key);\n } else if (typeof value.toJSON === 'function') {\n value = value.toJSON(key);\n }\n }\n\n if (replacerFunc) {\n value = replacerFunc.call(holder, key, value);\n }\n\n if (value instanceof Number) {\n value = Number(value);\n } else if (value instanceof String) {\n value = String(value);\n } else if (value instanceof Boolean) {\n value = value.valueOf();\n }\n\n switch (value) {\n case null: return 'null'\n case true: return 'true'\n case false: return 'false'\n }\n\n if (typeof value === 'string') {\n return quoteString(value, false)\n }\n\n if (typeof value === 'number') {\n return String(value)\n }\n\n if (typeof value === 'object') {\n return Array.isArray(value) ? serializeArray(value) : serializeObject(value)\n }\n\n return undefined\n }\n\n function quoteString (value) {\n const quotes = {\n \"'\": 0.1,\n '\"': 0.2,\n };\n\n const replacements = {\n \"'\": \"\\\\'\",\n '\"': '\\\\\"',\n '\\\\': '\\\\\\\\',\n '\\b': '\\\\b',\n '\\f': '\\\\f',\n '\\n': '\\\\n',\n '\\r': '\\\\r',\n '\\t': '\\\\t',\n '\\v': '\\\\v',\n '\\0': '\\\\0',\n '\\u2028': '\\\\u2028',\n '\\u2029': '\\\\u2029',\n };\n\n let product = '';\n\n for (let i = 0; i < value.length; i++) {\n const c = value[i];\n switch (c) {\n case \"'\":\n case '\"':\n quotes[c]++;\n product += c;\n continue\n\n case '\\0':\n if (util.isDigit(value[i + 1])) {\n product += '\\\\x00';\n continue\n }\n }\n\n if (replacements[c]) {\n product += replacements[c];\n continue\n }\n\n if (c < ' ') {\n let hexString = c.charCodeAt(0).toString(16);\n product += '\\\\x' + ('00' + hexString).substring(hexString.length);\n continue\n }\n\n product += c;\n }\n\n const quoteChar = quote || Object.keys(quotes).reduce((a, b) => (quotes[a] < quotes[b]) ? a : b);\n\n product = product.replace(new RegExp(quoteChar, 'g'), replacements[quoteChar]);\n\n return quoteChar + product + quoteChar\n }\n\n function serializeObject (value) {\n if (stack.indexOf(value) >= 0) {\n throw TypeError('Converting circular structure to JSON5')\n }\n\n stack.push(value);\n\n let stepback = indent;\n indent = indent + gap;\n\n let keys = propertyList || Object.keys(value);\n let partial = [];\n for (const key of keys) {\n const propertyString = serializeProperty(key, value);\n if (propertyString !== undefined) {\n let member = serializeKey(key) + ':';\n if (gap !== '') {\n member += ' ';\n }\n member += propertyString;\n partial.push(member);\n }\n }\n\n let final;\n if (partial.length === 0) {\n final = '{}';\n } else {\n let properties;\n if (gap === '') {\n properties = partial.join(',');\n final = '{' + properties + '}';\n } else {\n let separator = ',\\n' + indent;\n properties = partial.join(separator);\n final = '{\\n' + indent + properties + ',\\n' + stepback + '}';\n }\n }\n\n stack.pop();\n indent = stepback;\n return final\n }\n\n function serializeKey (key) {\n if (key.length === 0) {\n return quoteString(key, true)\n }\n\n const firstChar = String.fromCodePoint(key.codePointAt(0));\n if (!util.isIdStartChar(firstChar)) {\n return quoteString(key, true)\n }\n\n for (let i = firstChar.length; i < key.length; i++) {\n if (!util.isIdContinueChar(String.fromCodePoint(key.codePointAt(i)))) {\n return quoteString(key, true)\n }\n }\n\n return key\n }\n\n function serializeArray (value) {\n if (stack.indexOf(value) >= 0) {\n throw TypeError('Converting circular structure to JSON5')\n }\n\n stack.push(value);\n\n let stepback = indent;\n indent = indent + gap;\n\n let partial = [];\n for (let i = 0; i < value.length; i++) {\n const propertyString = serializeProperty(String(i), value);\n partial.push((propertyString !== undefined) ? propertyString : 'null');\n }\n\n let final;\n if (partial.length === 0) {\n final = '[]';\n } else {\n if (gap === '') {\n let properties = partial.join(',');\n final = '[' + properties + ']';\n } else {\n let separator = ',\\n' + indent;\n let properties = partial.join(separator);\n final = '[\\n' + indent + properties + ',\\n' + stepback + ']';\n }\n }\n\n stack.pop();\n indent = stepback;\n return final\n }\n};\n\nconst JSON5 = {\n parse,\n stringify,\n};\n\nvar lib = JSON5;\n\nexport default lib;\n","import { execFileSync } from 'node:child_process';\nimport fs from 'node:fs';\nimport path from 'node:path';\n\nimport type {\n daemon_client_tls_package_generation_runtime_options_t,\n daemon_generated_client_tls_package_entry_t,\n daemon_generated_client_tls_packages_t\n} from '@src/types/project_types';\n\ntype client_tls_file_map_t = {\n client_dir: string;\n client_key_path: string;\n client_csr_path: string;\n client_cert_path: string;\n client_ext_path: string;\n package_path: string;\n ca_cert_copy_path: string;\n};\n\nfunction WriteTextFile(params: { file_path: string; content: string }): void {\n fs.writeFileSync(params.file_path, params.content, 'utf8');\n}\n\nfunction EnsureReadableFile(params: { file_path: string; label: string }): void {\n if (!fs.existsSync(params.file_path)) {\n throw new Error(`${params.label} does not exist: ${params.file_path}`);\n }\n const stat_result = fs.statSync(params.file_path);\n if (!stat_result.isFile()) {\n throw new Error(`${params.label} is not a file: ${params.file_path}`);\n }\n}\n\nexport class ClientTlsPackageGenerator {\n generateClientTlsPackages(params: {\n runtime_options: daemon_client_tls_package_generation_runtime_options_t;\n }): daemon_generated_client_tls_packages_t {\n this.assertOpenSslAvailable();\n this.assertTarAvailable();\n this.assertCaFiles({\n runtime_options: params.runtime_options\n });\n\n fs.mkdirSync(params.runtime_options.output_dir, { recursive: true });\n\n const ca_serial_path = path.join(params.runtime_options.output_dir, 'client_ca.cert.srl');\n if (params.runtime_options.overwrite) {\n fs.rmSync(ca_serial_path, { force: true });\n }\n\n const generated_packages: daemon_generated_client_tls_package_entry_t[] = [];\n\n for (const client_definition of params.runtime_options.clients) {\n const client_files = this.buildClientFileMap({\n output_dir: params.runtime_options.output_dir,\n client_name: client_definition.client_name,\n package_name: client_definition.package_name\n });\n this.prepareClientOutput({\n client_files,\n overwrite: params.runtime_options.overwrite\n });\n\n try {\n this.generateClientCertificate({\n client_files,\n ca_key_file: params.runtime_options.ca_key_file,\n ca_cert_file: params.runtime_options.ca_cert_file,\n ca_serial_path,\n common_name: client_definition.common_name,\n uri_san: client_definition.uri_san,\n valid_days: client_definition.valid_days\n });\n\n fs.rmSync(client_files.client_csr_path, { force: true });\n fs.rmSync(client_files.client_ext_path, { force: true });\n fs.copyFileSync(params.runtime_options.ca_cert_file, client_files.ca_cert_copy_path);\n this.writeClientReadme({\n client_files,\n client_name: client_definition.client_name\n });\n this.createTarPackage({\n client_files\n });\n\n generated_packages.push({\n client_name: client_definition.client_name,\n package_path: client_files.package_path,\n directory_path: client_files.client_dir,\n client_cert_path: client_files.client_cert_path,\n client_key_path: client_files.client_key_path,\n ca_cert_path: client_files.ca_cert_copy_path\n });\n } finally {\n fs.rmSync(client_files.client_csr_path, { force: true });\n fs.rmSync(client_files.client_ext_path, { force: true });\n }\n }\n\n fs.rmSync(ca_serial_path, { force: true });\n\n return {\n output_dir: params.runtime_options.output_dir,\n packages: generated_packages\n };\n }\n\n private assertOpenSslAvailable(): void {\n try {\n execFileSync('openssl', ['version'], { stdio: 'ignore' });\n } catch {\n throw new Error(\n 'openssl command is required but was not found. Please install openssl and retry.'\n );\n }\n }\n\n private assertTarAvailable(): void {\n try {\n execFileSync('tar', ['--version'], { stdio: 'ignore' });\n } catch {\n throw new Error('tar command is required but was not found. Please install tar and retry.');\n }\n }\n\n private assertCaFiles(params: {\n runtime_options: daemon_client_tls_package_generation_runtime_options_t;\n }): void {\n EnsureReadableFile({\n file_path: params.runtime_options.ca_key_file,\n label: 'ca_key_file'\n });\n EnsureReadableFile({\n file_path: params.runtime_options.ca_cert_file,\n label: 'ca_cert_file'\n });\n }\n\n private buildClientFileMap(params: {\n output_dir: string;\n client_name: string;\n package_name: string;\n }): client_tls_file_map_t {\n const client_dir = path.join(params.output_dir, params.client_name);\n\n return {\n client_dir,\n client_key_path: path.join(client_dir, 'client.key.pem'),\n client_csr_path: path.join(client_dir, 'client.csr.pem'),\n client_cert_path: path.join(client_dir, 'client.cert.pem'),\n client_ext_path: path.join(client_dir, 'client.ext'),\n package_path: path.join(params.output_dir, `${params.package_name}.tar.gz`),\n ca_cert_copy_path: path.join(client_dir, 'ca.cert.pem')\n };\n }\n\n private prepareClientOutput(params: { client_files: client_tls_file_map_t; overwrite: boolean }): void {\n if (!params.overwrite) {\n if (fs.existsSync(params.client_files.client_dir)) {\n throw new Error(\n `Refusing to overwrite existing client directory \"${params.client_files.client_dir}\". ` +\n 'Set overwrite=true in client TLS package config.'\n );\n }\n if (fs.existsSync(params.client_files.package_path)) {\n throw new Error(\n `Refusing to overwrite existing client package \"${params.client_files.package_path}\". ` +\n 'Set overwrite=true in client TLS package config.'\n );\n }\n } else {\n fs.rmSync(params.client_files.client_dir, { recursive: true, force: true });\n fs.rmSync(params.client_files.package_path, { force: true });\n }\n\n fs.mkdirSync(params.client_files.client_dir, { recursive: true });\n }\n\n private generateClientCertificate(params: {\n client_files: client_tls_file_map_t;\n ca_key_file: string;\n ca_cert_file: string;\n ca_serial_path: string;\n common_name: string;\n uri_san: string;\n valid_days: number;\n }): void {\n WriteTextFile({\n file_path: params.client_files.client_ext_path,\n content: [\n 'extendedKeyUsage=clientAuth',\n 'keyUsage=digitalSignature,keyEncipherment',\n `subjectAltName=URI:${params.uri_san}`\n ].join('\\n')\n });\n\n this.runOpenSslCommand({\n args: [\n 'req',\n '-new',\n '-newkey',\n 'rsa:4096',\n '-sha256',\n '-nodes',\n '-keyout',\n params.client_files.client_key_path,\n '-out',\n params.client_files.client_csr_path,\n '-subj',\n `/CN=${params.common_name}`\n ]\n });\n\n const ca_sign_args = [\n 'x509',\n '-req',\n '-in',\n params.client_files.client_csr_path,\n '-CA',\n params.ca_cert_file,\n '-CAkey',\n params.ca_key_file,\n '-CAserial',\n params.ca_serial_path,\n '-out',\n params.client_files.client_cert_path,\n '-days',\n String(params.valid_days),\n '-sha256',\n '-extfile',\n params.client_files.client_ext_path\n ];\n\n if (!fs.existsSync(params.ca_serial_path)) {\n const with_create_serial = [...ca_sign_args];\n with_create_serial.splice(10, 0, '-CAcreateserial');\n this.runOpenSslCommand({\n args: with_create_serial\n });\n } else {\n this.runOpenSslCommand({\n args: ca_sign_args\n });\n }\n\n fs.chmodSync(params.client_files.client_key_path, 0o600);\n fs.chmodSync(params.client_files.client_cert_path, 0o644);\n fs.chmodSync(params.client_files.client_ext_path, 0o600);\n fs.chmodSync(params.client_files.client_csr_path, 0o600);\n }\n\n private writeClientReadme(params: { client_files: client_tls_file_map_t; client_name: string }): void {\n const readme_content = [\n `Client TLS bundle for: ${params.client_name}`,\n '',\n 'Files:',\n '- client.key.pem',\n '- client.cert.pem',\n '- ca.cert.pem',\n '',\n 'Use these with NetworkProcedureCallClient tls_mtls fields.'\n ].join('\\n');\n\n WriteTextFile({\n file_path: path.join(params.client_files.client_dir, 'README.txt'),\n content: `${readme_content}\\n`\n });\n }\n\n private createTarPackage(params: { client_files: client_tls_file_map_t }): void {\n execFileSync('tar', ['-C', params.client_files.client_dir, '-czf', params.client_files.package_path, '.'], {\n stdio: 'ignore'\n });\n }\n\n private runOpenSslCommand(params: { args: string[] }): void {\n execFileSync('openssl', params.args, { stdio: 'ignore' });\n }\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\n\nimport JSON5 from 'json5';\n\nimport { ConfigValidator } from '@src/classes/configvalidator/ConfigValidator.class';\n\nimport type {\n daemon_config_paths_t,\n daemon_resolved_tls_mtls_t,\n daemon_runtime_config_t,\n daemon_tls_file_config_t\n} from '@src/types/project_types';\n\nfunction ReadUtf8File(params: { file_path: string }): string {\n try {\n return fs.readFileSync(params.file_path, 'utf8');\n } catch (error) {\n const error_message = error instanceof Error ? error.message : String(error);\n throw new Error(`Unable to read file \"${params.file_path}\": ${error_message}`);\n }\n}\n\nfunction ResolvePath(params: { file_path: string; base_dir: string }): string {\n if (path.isAbsolute(params.file_path)) {\n return params.file_path;\n }\n return path.resolve(params.base_dir, params.file_path);\n}\n\nfunction ParseJson5(params: { content: string; source_path: string }): unknown {\n try {\n return JSON5.parse(params.content);\n } catch (error) {\n const error_message = error instanceof Error ? error.message : String(error);\n throw new Error(`Invalid JSON5 in \"${params.source_path}\": ${error_message}`);\n }\n}\n\nexport class ConfigFileLoader {\n private readonly config_validator: ConfigValidator;\n\n constructor(params?: { config_validator?: ConfigValidator }) {\n this.config_validator = params?.config_validator ?? new ConfigValidator();\n }\n\n loadDaemonConfig(params: { config_paths: daemon_config_paths_t }): daemon_runtime_config_t {\n const server_config_path = ResolvePath({\n file_path: params.config_paths.server_config_path,\n base_dir: process.cwd()\n });\n const api_keys_config_path = ResolvePath({\n file_path: params.config_paths.api_keys_config_path,\n base_dir: process.cwd()\n });\n\n const server_config_raw = this.readJson5File({\n file_path: server_config_path\n });\n const api_keys_config_raw = this.readJson5File({\n file_path: api_keys_config_path\n });\n\n const server_config = this.config_validator.validateServerConfig({\n server_config_raw\n });\n const api_keys_config = this.config_validator.validateApiKeysConfig({\n api_keys_config_raw\n });\n\n const runtime_tls_mtls = this.resolveTlsMaterial({\n tls_file_config: server_config.tls_mtls,\n config_file_dir: path.dirname(server_config_path)\n });\n\n const runtime_api_keys = this.config_validator.toRuntimeApiKeysConfig({\n api_keys_config\n });\n\n return {\n server_config: {\n ...server_config,\n tls_mtls: runtime_tls_mtls\n },\n api_keys_config: {\n api_keys: runtime_api_keys\n }\n };\n }\n\n private readJson5File(params: { file_path: string }): unknown {\n const file_content = ReadUtf8File({\n file_path: params.file_path\n });\n return ParseJson5({\n content: file_content,\n source_path: params.file_path\n });\n }\n\n private resolveTlsMaterial(params: {\n tls_file_config: daemon_tls_file_config_t;\n config_file_dir: string;\n }): daemon_resolved_tls_mtls_t {\n const key_pem = this.readPemFile({\n pem_path: params.tls_file_config.key_file,\n config_file_dir: params.config_file_dir,\n label: 'tls_mtls.key_file'\n });\n const cert_pem = this.readPemFile({\n pem_path: params.tls_file_config.cert_file,\n config_file_dir: params.config_file_dir,\n label: 'tls_mtls.cert_file'\n });\n const ca_pem = this.readPemFile({\n pem_path: params.tls_file_config.ca_file,\n config_file_dir: params.config_file_dir,\n label: 'tls_mtls.ca_file'\n });\n const crl_pem = params.tls_file_config.crl_file\n ? this.readPemFile({\n pem_path: params.tls_file_config.crl_file,\n config_file_dir: params.config_file_dir,\n label: 'tls_mtls.crl_file'\n })\n : undefined;\n\n return {\n key_pem,\n cert_pem,\n ca_pem,\n crl_pem,\n min_version: params.tls_file_config.min_version,\n cipher_suites: params.tls_file_config.cipher_suites,\n handshake_timeout_ms: params.tls_file_config.handshake_timeout_ms,\n request_timeout_ms: params.tls_file_config.request_timeout_ms,\n max_frame_bytes: params.tls_file_config.max_frame_bytes\n };\n }\n\n private readPemFile(params: {\n pem_path: string;\n config_file_dir: string;\n label: string;\n }): string {\n const absolute_file_path = ResolvePath({\n file_path: params.pem_path,\n base_dir: params.config_file_dir\n });\n\n const pem_content = ReadUtf8File({\n file_path: absolute_file_path\n }).trim();\n\n if (!pem_content.includes('BEGIN')) {\n throw new Error(\n `File \"${absolute_file_path}\" for ${params.label} does not look like a PEM file.`\n );\n }\n\n return `${pem_content}\\n`;\n }\n}\n","import { z } from 'zod';\n\nimport type {\n daemon_api_key_entry_t,\n daemon_api_keys_config_file_t,\n daemon_compiled_identity_constraints_t,\n daemon_runtime_api_key_entry_t,\n daemon_server_config_file_t\n} from '@src/types/project_types';\n\nconst privilege_name_list = [\n 'invoke_functions',\n 'define_functions',\n 'undefine_functions',\n 'define_constants',\n 'undefine_constants',\n 'define_dependencies',\n 'undefine_dependencies',\n 'admin_privileges',\n 'all_privileges'\n] as const;\n\nconst tls_min_version_list = ['TLSv1.2', 'TLSv1.3'] as const;\n\nconst worker_runtime_options_schema = z\n .object({\n call_timeout_ms: z.number().int().positive().optional(),\n control_timeout_ms: z.number().int().positive().optional(),\n start_timeout_ms: z.number().int().positive().optional(),\n stop_timeout_ms: z.number().int().positive().optional(),\n restart_on_failure: z.boolean().optional(),\n max_restarts_per_worker: z.number().int().nonnegative().optional(),\n max_pending_calls_per_worker: z.number().int().positive().optional(),\n restart_base_delay_ms: z.number().int().positive().optional(),\n restart_max_delay_ms: z.number().int().positive().optional(),\n restart_jitter_ms: z.number().int().nonnegative().optional()\n })\n .strict();\n\nconst rate_limiter_schema = z\n .object({\n enabled: z.boolean().optional(),\n tokens_per_interval: z.number().int().positive().optional(),\n interval_ms: z.number().int().positive().optional(),\n burst_tokens: z.number().int().positive().optional(),\n disconnect_on_limit: z.boolean().optional()\n })\n .strict();\n\nconst abuse_controls_schema = z\n .object({\n connection_controls: z\n .object({\n max_concurrent_sockets: z.number().int().positive().optional(),\n max_concurrent_handshakes: z.number().int().positive().optional(),\n max_unauthenticated_sessions: z.number().int().positive().optional(),\n global_connection_window_ms: z.number().int().positive().optional(),\n global_max_new_connections_per_window: z.number().int().positive().optional(),\n per_ip_max_new_connections_per_window: z.number().int().positive().optional(),\n tls_handshake_timeout_ms: z.number().int().positive().optional(),\n auth_message_timeout_ms: z.number().int().positive().optional(),\n max_pre_auth_frame_bytes: z.number().int().positive().optional(),\n max_post_auth_frame_bytes: z.number().int().positive().optional()\n })\n .strict()\n .optional(),\n auth_controls: z\n .object({\n pending_auth_window_ms: z.number().int().positive().optional(),\n max_pending_auth_attempts_per_ip_per_window: z.number().int().positive().optional(),\n failed_auth_window_ms: z.number().int().positive().optional(),\n max_failed_auth_per_ip_per_window: z.number().int().positive().optional(),\n max_failed_auth_per_api_key_per_window: z.number().int().positive().optional(),\n block_duration_ms: z.number().int().positive().optional(),\n enable_blocklist: z.boolean().optional()\n })\n .strict()\n .optional(),\n request_controls: z\n .object({\n max_in_flight_requests_per_connection: z.number().int().positive().optional(),\n per_connection: rate_limiter_schema.optional(),\n per_api_key: rate_limiter_schema.optional(),\n per_ip: rate_limiter_schema.optional()\n })\n .strict()\n .optional(),\n observability: z\n .object({\n enable_console_log: z.boolean().optional()\n })\n .strict()\n .optional()\n })\n .strict();\n\nconst daemon_server_config_schema = z\n .object({\n information: z\n .object({\n server_name: z.string().min(1)\n })\n .strict(),\n network: z\n .object({\n bind_addr: z.string().min(1),\n tcp_listen_port: z.number().int().positive().max(65535)\n })\n .strict(),\n tls_mtls: z\n .object({\n key_file: z.string().min(1),\n cert_file: z.string().min(1),\n ca_file: z.string().min(1),\n crl_file: z.string().min(1).optional(),\n min_version: z.enum(tls_min_version_list).optional(),\n cipher_suites: z.string().min(1).optional(),\n handshake_timeout_ms: z.number().int().positive().optional(),\n request_timeout_ms: z.number().int().positive().optional(),\n max_frame_bytes: z.number().int().positive().optional()\n })\n .strict(),\n workerprocedurecall: z\n .object({\n count: z.number().int().positive(),\n constructor_options: worker_runtime_options_schema.optional(),\n start_options: worker_runtime_options_schema.optional()\n })\n .strict(),\n abuse_controls: abuse_controls_schema.optional(),\n observability: z\n .object({\n enable_console_log: z.boolean().optional(),\n log_worker_events: z.boolean().optional(),\n metrics_log_interval_ms: z.number().int().positive().optional()\n })\n .strict()\n .optional()\n })\n .strict();\n\nconst daemon_api_key_config_schema = z\n .object({\n api_keys: z\n .array(\n z\n .object({\n key_id: z.string().min(1),\n api_key: z.string().min(1),\n privileges: z.array(z.enum(privilege_name_list)).min(1),\n enabled: z.boolean().optional(),\n identity_constraints: z\n .object({\n remote_address_regex: z.string().min(1).optional(),\n tls_peer_subject_regex: z.string().min(1).optional(),\n tls_peer_san_regex: z.string().min(1).optional(),\n tls_peer_fingerprint256_regex: z.string().min(1).optional(),\n tls_peer_serial_number_regex: z.string().min(1).optional()\n })\n .strict()\n .optional()\n })\n .strict()\n )\n .min(1)\n })\n .strict();\n\nfunction BuildZodErrorMessage(params: { prefix: string; error: z.ZodError }): string {\n const message_lines = params.error.issues.map((issue) => {\n const issue_path = issue.path.length > 0 ? issue.path.join('.') : '<root>';\n return `${issue_path}: ${issue.message}`;\n });\n\n return `${params.prefix}\\n${message_lines.join('\\n')}`;\n}\n\nfunction CompileRegex(params: { source: string; label: string }): RegExp {\n try {\n return new RegExp(params.source);\n } catch (error) {\n const error_message = error instanceof Error ? error.message : String(error);\n throw new Error(`Invalid regex for ${params.label}: ${error_message}`);\n }\n}\n\nexport class ConfigValidator {\n validateServerConfig(params: { server_config_raw: unknown }): daemon_server_config_file_t {\n const parse_result = daemon_server_config_schema.safeParse(params.server_config_raw);\n if (!parse_result.success) {\n throw new Error(\n BuildZodErrorMessage({\n prefix: 'Invalid server config.',\n error: parse_result.error\n })\n );\n }\n\n return parse_result.data as daemon_server_config_file_t;\n }\n\n validateApiKeysConfig(params: { api_keys_config_raw: unknown }): daemon_api_keys_config_file_t {\n const parse_result = daemon_api_key_config_schema.safeParse(params.api_keys_config_raw);\n if (!parse_result.success) {\n throw new Error(\n BuildZodErrorMessage({\n prefix: 'Invalid api-keys config.',\n error: parse_result.error\n })\n );\n }\n\n this.assertUniqueApiKeys({\n api_keys: parse_result.data.api_keys as daemon_api_key_entry_t[]\n });\n this.assertUniqueKeyIds({\n api_keys: parse_result.data.api_keys as daemon_api_key_entry_t[]\n });\n\n return parse_result.data as daemon_api_keys_config_file_t;\n }\n\n toRuntimeApiKeysConfig(params: {\n api_keys_config: daemon_api_keys_config_file_t;\n }): daemon_runtime_api_key_entry_t[] {\n return params.api_keys_config.api_keys.map((api_key_entry) => {\n const compiled_identity_constraints = this.compileIdentityConstraints({\n api_key_entry\n });\n\n const runtime_entry: daemon_runtime_api_key_entry_t = {\n key_id: api_key_entry.key_id,\n api_key: api_key_entry.api_key,\n privileges: [...api_key_entry.privileges],\n enabled: api_key_entry.enabled ?? true,\n identity_constraints: compiled_identity_constraints\n };\n\n return runtime_entry;\n });\n }\n\n private compileIdentityConstraints(params: {\n api_key_entry: daemon_api_key_entry_t;\n }): daemon_compiled_identity_constraints_t | undefined {\n const constraints = params.api_key_entry.identity_constraints;\n if (!constraints) {\n return undefined;\n }\n\n const compiled_constraints: daemon_compiled_identity_constraints_t = {};\n if (constraints.remote_address_regex) {\n compiled_constraints.remote_address_regex = CompileRegex({\n source: constraints.remote_address_regex,\n label: `api_keys[${params.api_key_entry.key_id}].identity_constraints.remote_address_regex`\n });\n }\n if (constraints.tls_peer_subject_regex) {\n compiled_constraints.tls_peer_subject_regex = CompileRegex({\n source: constraints.tls_peer_subject_regex,\n label: `api_keys[${params.api_key_entry.key_id}].identity_constraints.tls_peer_subject_regex`\n });\n }\n if (constraints.tls_peer_san_regex) {\n compiled_constraints.tls_peer_san_regex = CompileRegex({\n source: constraints.tls_peer_san_regex,\n label: `api_keys[${params.api_key_entry.key_id}].identity_constraints.tls_peer_san_regex`\n });\n }\n if (constraints.tls_peer_fingerprint256_regex) {\n compiled_constraints.tls_peer_fingerprint256_regex = CompileRegex({\n source: constraints.tls_peer_fingerprint256_regex,\n label: `api_keys[${params.api_key_entry.key_id}].identity_constraints.tls_peer_fingerprint256_regex`\n });\n }\n if (constraints.tls_peer_serial_number_regex) {\n compiled_constraints.tls_peer_serial_number_regex = CompileRegex({\n source: constraints.tls_peer_serial_number_regex,\n label: `api_keys[${params.api_key_entry.key_id}].identity_constraints.tls_peer_serial_number_regex`\n });\n }\n\n return compiled_constraints;\n }\n\n private assertUniqueApiKeys(params: { api_keys: daemon_api_key_entry_t[] }): void {\n const seen_api_keys = new Set<string>();\n for (const api_key_entry of params.api_keys) {\n if (seen_api_keys.has(api_key_entry.api_key)) {\n throw new Error(`Duplicate api_key found in api-keys config: ${api_key_entry.api_key}`);\n }\n seen_api_keys.add(api_key_entry.api_key);\n }\n }\n\n private assertUniqueKeyIds(params: { api_keys: daemon_api_key_entry_t[] }): void {\n const seen_key_ids = new Set<string>();\n for (const api_key_entry of params.api_keys) {\n if (seen_key_ids.has(api_key_entry.key_id)) {\n throw new Error(`Duplicate key_id found in api-keys config: ${api_key_entry.key_id}`);\n }\n seen_key_ids.add(api_key_entry.key_id);\n }\n }\n}\n","import type { daemon_cli_options_t } from '@src/types/project_types';\n\nconst default_server_config_path = './config/server.config.json5';\nconst default_api_keys_config_path = './config/api_keys.config.json5';\nconst default_config_output_dir = './config';\nconst default_tls_config_file_path = './config/tls_generation.config.json5';\nconst default_client_tls_config_file_path = './config/client_tls_packages.config.json5';\nconst default_tls_output_dir = './config/certs';\nconst default_ca_common_name = 'nodenetproccalld-local-ca';\nconst default_server_common_name = 'localhost';\nconst default_client_common_name = 'nodenetproccalld-client';\nconst default_tls_valid_days = 36500;\n\nexport class DaemonCli {\n parseOptions(): daemon_cli_options_t {\n const options: daemon_cli_options_t = {\n server_config_path: default_server_config_path,\n api_keys_config_path: default_api_keys_config_path,\n help: false,\n default_config_generation: {\n enabled: false,\n output_dir: default_config_output_dir,\n overwrite: false\n },\n default_tls_config_generation: {\n enabled: false,\n output_file_path: default_tls_config_file_path,\n overwrite: false\n },\n default_client_tls_config_generation: {\n enabled: false,\n output_file_path: default_client_tls_config_file_path,\n overwrite: false\n },\n tls_generation: {\n enabled: false,\n config_file_path: undefined,\n output_dir: default_tls_output_dir,\n overwrite: false,\n ca_common_name: default_ca_common_name,\n server_common_name: default_server_common_name,\n client_common_name: default_client_common_name,\n server_dns_sans: ['localhost'],\n server_ip_sans: ['127.0.0.1'],\n client_uri_san: undefined,\n valid_days: default_tls_valid_days\n },\n client_tls_package_generation: {\n enabled: false,\n config_file_path: default_client_tls_config_file_path\n }\n };\n\n const argv = process.argv.slice(2);\n for (let index = 0; index < argv.length; index += 1) {\n const token = argv[index];\n\n if (token === '--help' || token === '-h') {\n options.help = true;\n continue;\n }\n\n if (token === '--server-config') {\n const next_value = argv[index + 1];\n if (!next_value) {\n throw new Error('Missing value for --server-config');\n }\n options.server_config_path = next_value;\n index += 1;\n continue;\n }\n\n if (token === '--api-keys-config') {\n const next_value = argv[index + 1];\n if (!next_value) {\n throw new Error('Missing value for --api-keys-config');\n }\n options.api_keys_config_path = next_value;\n index += 1;\n continue;\n }\n\n if (token === '--generate-default-config') {\n options.default_config_generation.enabled = true;\n continue;\n }\n\n if (token === '--default-config-output-dir') {\n const next_value = argv[index + 1];\n if (!next_value) {\n throw new Error('Missing value for --default-config-output-dir');\n }\n options.default_config_generation.output_dir = next_value;\n index += 1;\n continue;\n }\n\n if (token === '--default-config-overwrite') {\n options.default_config_generation.overwrite = true;\n continue;\n }\n\n if (token === '--generate-tls-material') {\n options.tls_generation.enabled = true;\n continue;\n }\n\n if (token === '--tls-generation-config') {\n const next_value = argv[index + 1];\n if (!next_value) {\n throw new Error('Missing value for --tls-generation-config');\n }\n options.tls_generation.config_file_path = next_value;\n index += 1;\n continue;\n }\n\n if (token === '--generate-default-tls-config') {\n options.default_tls_config_generation.enabled = true;\n continue;\n }\n\n if (token === '--default-tls-config-file') {\n const next_value = argv[index + 1];\n if (!next_value) {\n throw new Error('Missing value for --default-tls-config-file');\n }\n options.default_tls_config_generation.output_file_path = next_value;\n index += 1;\n continue;\n }\n\n if (token === '--default-tls-config-overwrite') {\n options.default_tls_config_generation.overwrite = true;\n continue;\n }\n\n if (token === '--generate-default-client-tls-config') {\n options.default_client_tls_config_generation.enabled = true;\n continue;\n }\n\n if (token === '--default-client-tls-config-file') {\n const next_value = argv[index + 1];\n if (!next_value) {\n throw new Error('Missing value for --default-client-tls-config-file');\n }\n options.default_client_tls_config_generation.output_file_path = next_value;\n index += 1;\n continue;\n }\n\n if (token === '--default-client-tls-config-overwrite') {\n options.default_client_tls_config_generation.overwrite = true;\n continue;\n }\n\n if (token === '--generate-client-tls-packages') {\n options.client_tls_package_generation.enabled = true;\n continue;\n }\n\n if (token === '--client-tls-generation-config') {\n const next_value = argv[index + 1];\n if (!next_value) {\n throw new Error('Missing value for --client-tls-generation-config');\n }\n options.client_tls_package_generation.config_file_path = next_value;\n index += 1;\n continue;\n }\n\n if (token === '--tls-output-dir') {\n const next_value = argv[index + 1];\n if (!next_value) {\n throw new Error('Missing value for --tls-output-dir');\n }\n options.tls_generation.output_dir = next_value;\n index += 1;\n continue;\n }\n\n if (token === '--tls-overwrite') {\n options.tls_generation.overwrite = true;\n continue;\n }\n\n if (token === '--tls-ca-cn') {\n const next_value = argv[index + 1];\n if (!next_value) {\n throw new Error('Missing value for --tls-ca-cn');\n }\n options.tls_generation.ca_common_name = next_value;\n index += 1;\n continue;\n }\n\n if (token === '--tls-server-cn') {\n const next_value = argv[index + 1];\n if (!next_value) {\n throw new Error('Missing value for --tls-server-cn');\n }\n options.tls_generation.server_common_name = next_value;\n index += 1;\n continue;\n }\n\n if (token === '--tls-client-cn') {\n const next_value = argv[index + 1];\n if (!next_value) {\n throw new Error('Missing value for --tls-client-cn');\n }\n options.tls_generation.client_common_name = next_value;\n index += 1;\n continue;\n }\n\n if (token === '--tls-valid-days') {\n const next_value = argv[index + 1];\n if (!next_value) {\n throw new Error('Missing value for --tls-valid-days');\n }\n\n const valid_days = Number(next_value);\n if (!Number.isInteger(valid_days) || valid_days <= 0) {\n throw new Error('--tls-valid-days must be a positive integer.');\n }\n\n options.tls_generation.valid_days = valid_days;\n index += 1;\n continue;\n }\n\n throw new Error(`Unknown argument: ${token}`);\n }\n\n return options;\n }\n\n printHelp(): void {\n const help_text = [\n 'nodenetproccalld',\n '',\n 'Usage:',\n ' nodenetproccalld [options]',\n '',\n 'Options:',\n ' --server-config <path> Path to server JSON5 config file.',\n ' Default: ./config/server.config.json5',\n ' --api-keys-config <path> Path to api keys JSON5 config file.',\n ' Default: ./config/api_keys.config.json5',\n ' --generate-default-config Generate default JSON5 daemon config files and exit.',\n ' --default-config-output-dir <path>',\n ' Output directory for server/api-key config files.',\n ' Default: ./config',\n ' --default-config-overwrite Overwrite existing default config files.',\n ' --generate-default-tls-config',\n ' Generate a default TLS-generation JSON5 config and exit.',\n ' --default-tls-config-file <path>',\n ' Output path for default TLS-generation config.',\n ' Default: ./config/tls_generation.config.json5',\n ' --default-tls-config-overwrite',\n ' Overwrite existing TLS-generation config file.',\n ' --generate-default-client-tls-config',\n ' Generate a default client TLS package JSON5 config and exit.',\n ' --default-client-tls-config-file <path>',\n ' Output path for default client TLS package config.',\n ' Default: ./config/client_tls_packages.config.json5',\n ' --default-client-tls-config-overwrite',\n ' Overwrite existing client TLS package config file.',\n ' --generate-tls-material Generate CA/server/client TLS material and exit.',\n ' --tls-generation-config <path>',\n ' Load TLS-generation options from JSON5 file.',\n ' --generate-client-tls-packages',\n ' Generate client cert/key packages from JSON5 config.',\n ' --client-tls-generation-config <path>',\n ' Path to client TLS package generation JSON5 config.',\n ' Default: ./config/client_tls_packages.config.json5',\n ' --tls-output-dir <path> Output directory for generated TLS files.',\n ' Default: ./config/certs',\n ' --tls-overwrite Overwrite existing TLS files in output dir.',\n ' --tls-ca-cn <value> CA certificate common name.',\n ' Default: nodenetproccalld-local-ca',\n ' --tls-server-cn <value> Server certificate common name.',\n ' Default: localhost',\n ' --tls-client-cn <value> Client certificate common name.',\n ' Default: nodenetproccalld-client',\n ' --tls-valid-days <number> Certificate validity in days.',\n ' Default: 36500',\n ' -h, --help Show this help message.'\n ].join('\\n');\n\n console.log(help_text);\n }\n}\n","import {\n NetworkProcedureCall,\n type networkprocedurecall_abuse_metrics_t,\n type networkprocedurecall_auth_callback_t,\n type networkprocedurecall_server_start_params_t\n} from '@opsimathically/networkprocedurecall';\nimport {\n WorkerProcedureCall,\n type worker_event_t\n} from '@opsimathically/workerprocedurecall';\n\nimport { ApiKeyAuthorizer } from '@src/classes/apikeyauthorizer/ApiKeyAuthorizer.class';\nimport { ConfigFileLoader } from '@src/classes/configfileloader/ConfigFileLoader.class';\n\nimport type {\n daemon_config_paths_t,\n daemon_runtime_config_t\n} from '@src/types/project_types';\n\ntype daemon_lifecycle_state_t = 'stopped' | 'starting' | 'running' | 'stopping';\ntype networkprocedurecall_workerprocedurecall_t = ConstructorParameters<\n typeof NetworkProcedureCall\n>[0]['workerprocedurecall'];\n\ntype daemon_runtime_snapshot_t = {\n lifecycle_state: daemon_lifecycle_state_t;\n server_name?: string;\n bind_addr?: string;\n tcp_listen_port?: number;\n worker_health_states?: unknown;\n abuse_metrics?: networkprocedurecall_abuse_metrics_t;\n};\n\nfunction ToIsoTimestamp(): string {\n return new Date().toISOString();\n}\n\nexport class NetworkProcedureCallDaemon {\n private readonly config_paths: daemon_config_paths_t;\n private readonly config_file_loader: ConfigFileLoader;\n\n private lifecycle_state: daemon_lifecycle_state_t = 'stopped';\n private daemon_config: daemon_runtime_config_t | null = null;\n private workerprocedurecall: WorkerProcedureCall | null = null;\n private networkprocedurecall: NetworkProcedureCall | null = null;\n private api_key_authorizer: ApiKeyAuthorizer | null = null;\n private worker_event_listener_id: number | null = null;\n private metrics_log_interval_handle: NodeJS.Timeout | null = null;\n\n constructor(params: {\n config_paths: daemon_config_paths_t;\n config_file_loader?: ConfigFileLoader;\n }) {\n this.config_paths = params.config_paths;\n this.config_file_loader = params.config_file_loader ?? new ConfigFileLoader();\n }\n\n async start(): Promise<void> {\n if (this.lifecycle_state === 'running') {\n throw new Error('Daemon is already running.');\n }\n if (this.lifecycle_state === 'starting') {\n throw new Error('Daemon startup is already in progress.');\n }\n if (this.lifecycle_state === 'stopping') {\n throw new Error('Daemon stop is in progress. Wait for stop to complete.');\n }\n\n this.lifecycle_state = 'starting';\n\n try {\n this.daemon_config = this.config_file_loader.loadDaemonConfig({\n config_paths: this.config_paths\n });\n this.api_key_authorizer = new ApiKeyAuthorizer({\n api_key_entries: this.daemon_config.api_keys_config.api_keys\n });\n\n const constructor_options =\n this.daemon_config.server_config.workerprocedurecall.constructor_options;\n this.workerprocedurecall = constructor_options\n ? new WorkerProcedureCall(constructor_options)\n : new WorkerProcedureCall();\n\n const log_worker_events =\n this.daemon_config.server_config.observability?.log_worker_events ?? true;\n if (log_worker_events) {\n this.worker_event_listener_id = this.workerprocedurecall.onWorkerEvent({\n listener: (worker_event): void => {\n this.logWorkerEvent({\n worker_event\n });\n }\n });\n }\n\n await this.workerprocedurecall.startWorkers({\n count: this.daemon_config.server_config.workerprocedurecall.count,\n ...(this.daemon_config.server_config.workerprocedurecall.start_options ?? {})\n });\n\n const networkprocedurecall_workerprocedurecall =\n this.workerprocedurecall as unknown as networkprocedurecall_workerprocedurecall_t;\n\n this.networkprocedurecall = new NetworkProcedureCall({\n workerprocedurecall: networkprocedurecall_workerprocedurecall\n });\n\n const auth_callback = this.createAuthCallback();\n const start_params = this.buildServerStartParams({\n auth_callback\n });\n await this.networkprocedurecall.start(start_params);\n\n this.startMetricsLogging();\n this.lifecycle_state = 'running';\n\n this.logMessage({\n severity: 'info',\n message:\n `Daemon started: ${start_params.information.server_name} ` +\n `on ${start_params.network.bind_addr}:${start_params.network.tcp_listen_port}`\n });\n } catch (error) {\n this.lifecycle_state = 'stopped';\n await this.stopBestEffort();\n throw error;\n }\n }\n\n async stop(): Promise<void> {\n if (this.lifecycle_state === 'stopped') {\n return;\n }\n if (this.lifecycle_state === 'stopping') {\n return;\n }\n\n this.lifecycle_state = 'stopping';\n await this.stopBestEffort();\n this.lifecycle_state = 'stopped';\n\n this.logMessage({\n severity: 'info',\n message: 'Daemon stopped.'\n });\n }\n\n getRuntimeSnapshot(): daemon_runtime_snapshot_t {\n return {\n lifecycle_state: this.lifecycle_state,\n server_name: this.daemon_config?.server_config.information.server_name,\n bind_addr: this.daemon_config?.server_config.network.bind_addr,\n tcp_listen_port: this.daemon_config?.server_config.network.tcp_listen_port,\n worker_health_states: this.workerprocedurecall?.getWorkerHealthStates(),\n abuse_metrics: this.networkprocedurecall?.getAbuseMetrics()\n };\n }\n\n private createAuthCallback(): networkprocedurecall_auth_callback_t {\n return async (auth_callback_params) => {\n const authorizer = this.requireApiKeyAuthorizer();\n return await authorizer.authenticate({\n auth_callback_params\n });\n };\n }\n\n private buildServerStartParams(params: {\n auth_callback: networkprocedurecall_auth_callback_t;\n }): networkprocedurecall_server_start_params_t {\n const daemon_config = this.requireDaemonConfig();\n const abuse_controls_from_file = daemon_config.server_config.abuse_controls;\n const enable_console_log = daemon_config.server_config.observability?.enable_console_log;\n\n let merged_abuse_controls = abuse_controls_from_file;\n if (enable_console_log !== undefined) {\n merged_abuse_controls = {\n ...(abuse_controls_from_file ?? {}),\n observability: {\n ...(abuse_controls_from_file?.observability ?? {}),\n enable_console_log\n }\n };\n }\n\n return {\n information: {\n server_name: daemon_config.server_config.information.server_name\n },\n network: {\n bind_addr: daemon_config.server_config.network.bind_addr,\n tcp_listen_port: daemon_config.server_config.network.tcp_listen_port\n },\n tls_mtls: {\n ...daemon_config.server_config.tls_mtls\n },\n abuse_controls: merged_abuse_controls,\n auth_callback: params.auth_callback\n };\n }\n\n private startMetricsLogging(): void {\n this.clearMetricsLoggingInterval();\n\n const daemon_config = this.requireDaemonConfig();\n const metrics_log_interval_ms =\n daemon_config.server_config.observability?.metrics_log_interval_ms;\n if (!metrics_log_interval_ms) {\n return;\n }\n\n this.metrics_log_interval_handle = setInterval(() => {\n if (!this.networkprocedurecall || !this.workerprocedurecall) {\n return;\n }\n\n const abuse_metrics = this.networkprocedurecall.getAbuseMetrics();\n const worker_health_states = this.workerprocedurecall.getWorkerHealthStates();\n\n this.logMessage({\n severity: 'info',\n message:\n `runtime_metrics abuse=${JSON.stringify(abuse_metrics)} ` +\n `worker_health=${JSON.stringify(worker_health_states)}`\n });\n }, metrics_log_interval_ms);\n\n this.metrics_log_interval_handle.unref();\n }\n\n private clearMetricsLoggingInterval(): void {\n if (this.metrics_log_interval_handle) {\n clearInterval(this.metrics_log_interval_handle);\n this.metrics_log_interval_handle = null;\n }\n }\n\n private async stopBestEffort(): Promise<void> {\n this.clearMetricsLoggingInterval();\n\n const stop_errors: unknown[] = [];\n\n if (this.networkprocedurecall) {\n try {\n await this.networkprocedurecall.stop();\n } catch (error) {\n stop_errors.push(error);\n }\n this.networkprocedurecall = null;\n }\n\n if (this.workerprocedurecall && this.worker_event_listener_id !== null) {\n try {\n this.workerprocedurecall.offWorkerEvent({\n listener_id: this.worker_event_listener_id\n });\n } catch (error) {\n stop_errors.push(error);\n }\n this.worker_event_listener_id = null;\n }\n\n if (this.workerprocedurecall) {\n try {\n await this.workerprocedurecall.stopWorkers();\n } catch (error) {\n stop_errors.push(error);\n }\n this.workerprocedurecall = null;\n }\n\n this.api_key_authorizer = null;\n this.daemon_config = null;\n\n if (stop_errors.length > 0) {\n const first_error = stop_errors[0];\n throw first_error;\n }\n }\n\n private requireDaemonConfig(): daemon_runtime_config_t {\n if (!this.daemon_config) {\n throw new Error('Daemon config is not initialized.');\n }\n return this.daemon_config;\n }\n\n private requireApiKeyAuthorizer(): ApiKeyAuthorizer {\n if (!this.api_key_authorizer) {\n throw new Error('ApiKeyAuthorizer is not initialized.');\n }\n return this.api_key_authorizer;\n }\n\n private logWorkerEvent(params: { worker_event: worker_event_t }): void {\n this.logMessage({\n severity: params.worker_event.severity,\n message: `worker_event ${JSON.stringify(params.worker_event)}`\n });\n }\n\n private logMessage(params: { severity: 'info' | 'warn' | 'error'; message: string }): void {\n const output_message = `[${ToIsoTimestamp()}] [${params.severity}] ${params.message}`;\n\n if (params.severity === 'error') {\n console.error(output_message);\n return;\n }\n if (params.severity === 'warn') {\n console.warn(output_message);\n return;\n }\n console.log(output_message);\n }\n}\n","import { NetworkProcedureCallDaemon } from '@src/classes/networkprocedurecalldaemon/NetworkProcedureCallDaemon.class';\n\nimport type { daemon_config_paths_t } from '@src/types/project_types';\n\nexport class DaemonProcess {\n private readonly daemon: NetworkProcedureCallDaemon;\n\n private is_running = false;\n private stop_in_progress = false;\n private stop_resolve: (() => void) | null = null;\n private readonly stop_waiter: Promise<void>;\n\n constructor(params: { config_paths: daemon_config_paths_t }) {\n this.daemon = new NetworkProcedureCallDaemon({\n config_paths: params.config_paths\n });\n this.stop_waiter = new Promise<void>((resolve) => {\n this.stop_resolve = resolve;\n });\n }\n\n async run(): Promise<void> {\n if (this.is_running) {\n throw new Error('DaemonProcess is already running.');\n }\n\n this.is_running = true;\n this.attachProcessHandlers();\n\n try {\n await this.daemon.start();\n } catch (error) {\n this.detachProcessHandlers();\n this.is_running = false;\n throw error;\n }\n\n await this.stop_waiter;\n }\n\n private attachProcessHandlers(): void {\n process.on('SIGINT', this.handleSignal);\n process.on('SIGTERM', this.handleSignal);\n process.on('uncaughtException', this.handleUncaughtException);\n process.on('unhandledRejection', this.handleUnhandledRejection);\n }\n\n private detachProcessHandlers(): void {\n process.off('SIGINT', this.handleSignal);\n process.off('SIGTERM', this.handleSignal);\n process.off('uncaughtException', this.handleUncaughtException);\n process.off('unhandledRejection', this.handleUnhandledRejection);\n }\n\n private readonly handleSignal = (signal: NodeJS.Signals): void => {\n void this.requestStop({\n reason: `Received ${signal}.`\n });\n };\n\n private readonly handleUncaughtException = (error: Error): void => {\n console.error(`Uncaught exception: ${error.stack ?? error.message}`);\n process.exitCode = 1;\n void this.requestStop({\n reason: 'Stopping daemon after uncaught exception.'\n });\n };\n\n private readonly handleUnhandledRejection = (error: unknown): void => {\n const error_message = error instanceof Error ? error.stack ?? error.message : String(error);\n console.error(`Unhandled rejection: ${error_message}`);\n process.exitCode = 1;\n void this.requestStop({\n reason: 'Stopping daemon after unhandled rejection.'\n });\n };\n\n private async requestStop(params: { reason: string }): Promise<void> {\n if (!this.is_running || this.stop_in_progress) {\n return;\n }\n\n this.stop_in_progress = true;\n console.log(params.reason);\n\n try {\n await this.daemon.stop();\n } catch (error) {\n const error_message = error instanceof Error ? error.stack ?? error.message : String(error);\n console.error(`Error while stopping daemon: ${error_message}`);\n process.exitCode = 1;\n } finally {\n this.detachProcessHandlers();\n this.is_running = false;\n this.stop_in_progress = false;\n if (this.stop_resolve) {\n this.stop_resolve();\n }\n }\n }\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\n\nimport type {\n daemon_default_client_tls_config_generation_options_t,\n daemon_generated_default_client_tls_config_t\n} from '@src/types/project_types';\n\nconst default_client_tls_generation_config_template = `{\n // Existing CA files used to sign client certificates.\n // Paths are resolved relative to this config file.\n ca_key_file: './certs/ca.key.pem',\n ca_cert_file: './certs/ca.cert.pem',\n\n // Where client cert bundles will be written.\n output_dir: './client_certs',\n\n // Set true to replace existing client bundles.\n overwrite: false,\n\n // Default validity period for generated client certs.\n default_valid_days: 36500,\n\n clients: [\n {\n client_name: 'your_client_name_here',\n common_name: 'your_client_name_here',\n uri_san: 'spiffe://nodenetproccalld/your_client_name_here',\n package_name: 'your_client_name_here_bundle'\n },\n {\n client_name: 'localhost',\n common_name: 'localhost',\n uri_san: 'spiffe://nodenetproccalld/localhost',\n package_name: 'localhost_bundle'\n }\n ]\n}\n`;\n\nexport class DefaultClientTlsGenerationConfigGenerator {\n generateDefaultClientTlsGenerationConfig(params: {\n default_client_tls_config_generation_options: daemon_default_client_tls_config_generation_options_t;\n }): daemon_generated_default_client_tls_config_t {\n const output_file_path = path.resolve(\n process.cwd(),\n params.default_client_tls_config_generation_options.output_file_path\n );\n\n if (\n !params.default_client_tls_config_generation_options.overwrite &&\n fs.existsSync(output_file_path)\n ) {\n throw new Error(\n `Refusing to overwrite existing client TLS config \"${output_file_path}\". ` +\n 'Use --default-client-tls-config-overwrite to replace it.'\n );\n }\n\n fs.mkdirSync(path.dirname(output_file_path), { recursive: true });\n fs.writeFileSync(output_file_path, default_client_tls_generation_config_template, 'utf8');\n\n return {\n output_file_path\n };\n }\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\n\nimport type {\n daemon_default_config_generation_options_t,\n daemon_generated_default_config_t\n} from '@src/types/project_types';\n\nconst default_server_config_template = `{\n // Friendly name that clients can use in their own config maps.\n information: {\n server_name: 'daemon_server_1'\n },\n\n // Bind target for tls.createServer.\n network: {\n bind_addr: '0.0.0.0',\n tcp_listen_port: 6767\n },\n\n // PEM files are resolved relative to this config file unless absolute paths are used.\n tls_mtls: {\n key_file: './certs/server.key.pem',\n cert_file: './certs/server.cert.pem',\n ca_file: './certs/ca.cert.pem',\n // crl_file: './certs/ca.crl.pem',\n min_version: 'TLSv1.3',\n handshake_timeout_ms: 5000,\n request_timeout_ms: 15000,\n max_frame_bytes: 1048576\n },\n\n workerprocedurecall: {\n count: 4,\n constructor_options: {\n call_timeout_ms: 30000,\n control_timeout_ms: 10000,\n restart_on_failure: true,\n max_restarts_per_worker: 6,\n max_pending_calls_per_worker: 500\n },\n start_options: {\n restart_base_delay_ms: 150,\n restart_max_delay_ms: 5000,\n restart_jitter_ms: 250\n }\n },\n\n // Optional abuse controls from @opsimathically/networkprocedurecall.\n abuse_controls: {\n connection_controls: {\n max_concurrent_sockets: 1024,\n max_concurrent_handshakes: 256,\n max_unauthenticated_sessions: 256,\n per_ip_max_new_connections_per_window: 64,\n tls_handshake_timeout_ms: 5000,\n auth_message_timeout_ms: 5000\n },\n request_controls: {\n max_in_flight_requests_per_connection: 128,\n per_connection: {\n enabled: true,\n tokens_per_interval: 200,\n interval_ms: 1000,\n burst_tokens: 400\n },\n per_api_key: {\n enabled: true,\n tokens_per_interval: 1000,\n interval_ms: 1000,\n burst_tokens: 2000\n },\n per_ip: {\n enabled: true,\n tokens_per_interval: 500,\n interval_ms: 1000,\n burst_tokens: 1000\n }\n }\n },\n\n observability: {\n enable_console_log: true,\n log_worker_events: true,\n metrics_log_interval_ms: 30000\n }\n}\n`;\n\nconst default_api_keys_config_template = `{\n // API keys and privilege grants for auth_callback.\n api_keys: [\n {\n key_id: 'admin_key_1',\n api_key: 'replace_me_with_random_secret',\n privileges: ['all_privileges'],\n enabled: true,\n identity_constraints: {\n // Example: accept loopback clients only.\n remote_address_regex: '^(127\\\\\\\\.0\\\\\\\\.0\\\\\\\\.1|::1|::ffff:127\\\\\\\\.0\\\\\\\\.0\\\\\\\\.1)$'\n }\n },\n {\n key_id: 'invoke_only_key_1',\n api_key: 'replace_me_with_second_secret',\n privileges: ['invoke_functions'],\n enabled: false\n }\n ]\n}\n`;\n\nfunction EnsureParentDirectory(params: { file_path: string }): void {\n fs.mkdirSync(path.dirname(params.file_path), { recursive: true });\n}\n\nfunction WriteFileIfAllowed(params: { file_path: string; content: string; overwrite: boolean }): void {\n if (!params.overwrite && fs.existsSync(params.file_path)) {\n throw new Error(\n `Refusing to overwrite existing config \"${params.file_path}\". Use --default-config-overwrite to replace it.`\n );\n }\n\n EnsureParentDirectory({\n file_path: params.file_path\n });\n fs.writeFileSync(params.file_path, params.content, 'utf8');\n}\n\nexport class DefaultConfigGenerator {\n generateDefaultConfig(params: {\n default_config_generation_options: daemon_default_config_generation_options_t;\n }): daemon_generated_default_config_t {\n const options = params.default_config_generation_options;\n const output_dir = path.resolve(process.cwd(), options.output_dir);\n const server_config_path = path.join(output_dir, 'server.config.json5');\n const api_keys_config_path = path.join(output_dir, 'api_keys.config.json5');\n\n fs.mkdirSync(output_dir, { recursive: true });\n\n WriteFileIfAllowed({\n file_path: server_config_path,\n content: default_server_config_template,\n overwrite: options.overwrite\n });\n WriteFileIfAllowed({\n file_path: api_keys_config_path,\n content: default_api_keys_config_template,\n overwrite: options.overwrite\n });\n\n return {\n output_dir,\n server_config_path,\n api_keys_config_path\n };\n }\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\n\nimport type {\n daemon_default_tls_config_generation_options_t,\n daemon_generated_default_tls_config_t\n} from '@src/types/project_types';\n\nconst default_tls_generation_config_template = `{\n // Where generated CA/server/client cert + key files should be written.\n output_dir: './config/certs',\n\n // Set true to replace existing files in output_dir.\n overwrite: false,\n\n // X.509 subject common names.\n ca_common_name: 'nodenetproccalld-local-ca',\n server_common_name: 'your_server_name_here',\n client_common_name: 'nodenetproccalld-client',\n\n // Server certificate SAN entries used by hostname validation.\n // Add the DNS names and IPs clients will actually connect to.\n server_dns_sans: ['your_server_name_here', 'localhost'],\n server_ip_sans: ['127.0.0.1'],\n\n // Optional explicit client URI SAN; when omitted, generator derives one from client_common_name.\n // client_uri_san: 'spiffe://nodenetproccalld/client',\n\n // Certificate validity period.\n valid_days: 36500\n}\n`;\n\nexport class DefaultTlsGenerationConfigGenerator {\n generateDefaultTlsGenerationConfig(params: {\n default_tls_config_generation_options: daemon_default_tls_config_generation_options_t;\n }): daemon_generated_default_tls_config_t {\n const output_file_path = path.resolve(\n process.cwd(),\n params.default_tls_config_generation_options.output_file_path\n );\n\n if (\n !params.default_tls_config_generation_options.overwrite &&\n fs.existsSync(output_file_path)\n ) {\n throw new Error(\n `Refusing to overwrite existing TLS generation config \"${output_file_path}\". ` +\n 'Use --default-tls-config-overwrite to replace it.'\n );\n }\n\n fs.mkdirSync(path.dirname(output_file_path), { recursive: true });\n fs.writeFileSync(output_file_path, default_tls_generation_config_template, 'utf8');\n\n return {\n output_file_path\n };\n }\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\n\nimport JSON5 from 'json5';\nimport { z } from 'zod';\n\nimport type {\n daemon_tls_generation_config_file_t,\n daemon_tls_generation_options_t\n} from '@src/types/project_types';\n\nconst tls_generation_config_schema = z\n .object({\n output_dir: z.string().min(1).optional(),\n overwrite: z.boolean().optional(),\n ca_common_name: z.string().min(1).optional(),\n server_common_name: z.string().min(1).optional(),\n client_common_name: z.string().min(1).optional(),\n server_dns_sans: z.array(z.string().min(1)).optional(),\n server_ip_sans: z.array(z.string().min(1)).optional(),\n client_uri_san: z.string().min(1).optional(),\n valid_days: z.number().int().positive().optional()\n })\n .strict();\n\nfunction ParseJson5File(params: { file_path: string }): unknown {\n const absolute_file_path = path.resolve(process.cwd(), params.file_path);\n let file_content: string;\n\n try {\n file_content = fs.readFileSync(absolute_file_path, 'utf8');\n } catch (error) {\n const error_message = error instanceof Error ? error.message : String(error);\n throw new Error(`Unable to read TLS generation config file \"${absolute_file_path}\": ${error_message}`);\n }\n\n try {\n return JSON5.parse(file_content);\n } catch (error) {\n const error_message = error instanceof Error ? error.message : String(error);\n throw new Error(`Invalid JSON5 in TLS generation config \"${absolute_file_path}\": ${error_message}`);\n }\n}\n\nfunction BuildZodErrorMessage(params: { error: z.ZodError }): string {\n const lines = params.error.issues.map((issue) => {\n const issue_path = issue.path.length > 0 ? issue.path.join('.') : '<root>';\n return `${issue_path}: ${issue.message}`;\n });\n\n return `Invalid TLS generation config file.\\n${lines.join('\\n')}`;\n}\n\nexport class TlsGenerationConfigFileLoader {\n loadTlsGenerationOptions(params: {\n config_file_path: string;\n fallback_options: daemon_tls_generation_options_t;\n }): daemon_tls_generation_options_t {\n const config_raw = ParseJson5File({\n file_path: params.config_file_path\n });\n\n const parse_result = tls_generation_config_schema.safeParse(config_raw);\n if (!parse_result.success) {\n throw new Error(\n BuildZodErrorMessage({\n error: parse_result.error\n })\n );\n }\n\n const config_from_file = parse_result.data as daemon_tls_generation_config_file_t;\n\n return {\n ...params.fallback_options,\n ...config_from_file\n };\n }\n}\n","import { execFileSync } from 'node:child_process';\nimport fs from 'node:fs';\nimport path from 'node:path';\n\nimport type {\n daemon_generated_tls_material_t,\n daemon_tls_generation_options_t\n} from '@src/types/project_types';\n\ntype tls_file_map_t = {\n ca_key_path: string;\n ca_cert_path: string;\n server_key_path: string;\n server_csr_path: string;\n server_cert_path: string;\n server_ext_path: string;\n client_key_path: string;\n client_csr_path: string;\n client_cert_path: string;\n client_ext_path: string;\n ca_serial_path: string;\n};\n\nfunction EnsurePositiveInteger(params: { value: number; label: string }): void {\n if (!Number.isInteger(params.value) || params.value <= 0) {\n throw new Error(`${params.label} must be a positive integer.`);\n }\n}\n\nfunction MakeDirRecursive(params: { dir_path: string }): void {\n fs.mkdirSync(params.dir_path, { recursive: true });\n}\n\nfunction WriteTextFile(params: { file_path: string; content: string }): void {\n fs.writeFileSync(params.file_path, params.content, 'utf8');\n}\n\nfunction BuildServerSubjectAltNameLine(params: {\n server_dns_sans: string[];\n server_ip_sans: string[];\n}): string {\n const san_entries: string[] = [];\n\n for (const dns_name of params.server_dns_sans) {\n if (dns_name.trim().length === 0) {\n continue;\n }\n san_entries.push(`DNS:${dns_name.trim()}`);\n }\n\n for (const ip_addr of params.server_ip_sans) {\n if (ip_addr.trim().length === 0) {\n continue;\n }\n san_entries.push(`IP:${ip_addr.trim()}`);\n }\n\n if (san_entries.length === 0) {\n throw new Error(\n 'TLS generation requires at least one SAN entry. Provide server_dns_sans or server_ip_sans.'\n );\n }\n\n return `subjectAltName=${san_entries.join(',')}`;\n}\n\nexport class TlsMaterialGenerator {\n generateTlsMaterial(params: {\n tls_generation_options: daemon_tls_generation_options_t;\n }): daemon_generated_tls_material_t {\n const options = params.tls_generation_options;\n EnsurePositiveInteger({\n value: options.valid_days,\n label: 'tls_generation.valid_days'\n });\n\n const output_dir = path.resolve(process.cwd(), options.output_dir);\n MakeDirRecursive({\n dir_path: output_dir\n });\n\n this.assertOpenSslAvailable();\n\n const tls_files = this.buildTlsFileMap({\n output_dir\n });\n this.assertTargetFilesAreWritable({\n tls_files,\n overwrite: options.overwrite\n });\n\n try {\n this.generateCa({\n tls_files,\n valid_days: options.valid_days,\n ca_common_name: options.ca_common_name\n });\n this.generateServerCertificate({\n tls_files,\n valid_days: options.valid_days,\n server_common_name: options.server_common_name,\n server_dns_sans: options.server_dns_sans,\n server_ip_sans: options.server_ip_sans\n });\n this.generateClientCertificate({\n tls_files,\n valid_days: options.valid_days,\n client_common_name: options.client_common_name,\n client_uri_san: options.client_uri_san\n });\n this.cleanupIntermediateFiles({\n tls_files\n });\n } catch (error) {\n throw new Error(\n `Failed to generate TLS material in \"${output_dir}\": ${this.getErrorMessage({\n error\n })}`\n );\n }\n\n return {\n output_dir,\n ca_key_path: tls_files.ca_key_path,\n ca_cert_path: tls_files.ca_cert_path,\n server_key_path: tls_files.server_key_path,\n server_cert_path: tls_files.server_cert_path,\n client_key_path: tls_files.client_key_path,\n client_cert_path: tls_files.client_cert_path\n };\n }\n\n private assertOpenSslAvailable(): void {\n try {\n execFileSync('openssl', ['version'], { stdio: 'ignore' });\n } catch {\n throw new Error(\n 'openssl command is required but was not found. Please install openssl and retry.'\n );\n }\n }\n\n private buildTlsFileMap(params: { output_dir: string }): tls_file_map_t {\n return {\n ca_key_path: path.join(params.output_dir, 'ca.key.pem'),\n ca_cert_path: path.join(params.output_dir, 'ca.cert.pem'),\n server_key_path: path.join(params.output_dir, 'server.key.pem'),\n server_csr_path: path.join(params.output_dir, 'server.csr.pem'),\n server_cert_path: path.join(params.output_dir, 'server.cert.pem'),\n server_ext_path: path.join(params.output_dir, 'server.ext'),\n client_key_path: path.join(params.output_dir, 'client.key.pem'),\n client_csr_path: path.join(params.output_dir, 'client.csr.pem'),\n client_cert_path: path.join(params.output_dir, 'client.cert.pem'),\n client_ext_path: path.join(params.output_dir, 'client.ext'),\n ca_serial_path: path.join(params.output_dir, 'ca.cert.srl')\n };\n }\n\n private assertTargetFilesAreWritable(params: {\n tls_files: tls_file_map_t;\n overwrite: boolean;\n }): void {\n const target_paths: string[] = [\n params.tls_files.ca_key_path,\n params.tls_files.ca_cert_path,\n params.tls_files.server_key_path,\n params.tls_files.server_cert_path,\n params.tls_files.client_key_path,\n params.tls_files.client_cert_path\n ];\n\n if (!params.overwrite) {\n for (const target_path of target_paths) {\n if (fs.existsSync(target_path)) {\n throw new Error(\n `Refusing to overwrite existing file \"${target_path}\". Use --tls-overwrite to replace existing material.`\n );\n }\n }\n return;\n }\n\n for (const target_path of target_paths) {\n fs.rmSync(target_path, { force: true });\n }\n fs.rmSync(params.tls_files.ca_serial_path, { force: true });\n }\n\n private generateCa(params: {\n tls_files: tls_file_map_t;\n valid_days: number;\n ca_common_name: string;\n }): void {\n this.runOpenSslCommand({\n args: [\n 'req',\n '-x509',\n '-newkey',\n 'rsa:4096',\n '-sha256',\n '-nodes',\n '-keyout',\n params.tls_files.ca_key_path,\n '-out',\n params.tls_files.ca_cert_path,\n '-days',\n String(params.valid_days),\n '-subj',\n `/CN=${params.ca_common_name}`\n ]\n });\n }\n\n private generateServerCertificate(params: {\n tls_files: tls_file_map_t;\n valid_days: number;\n server_common_name: string;\n server_dns_sans: string[];\n server_ip_sans: string[];\n }): void {\n WriteTextFile({\n file_path: params.tls_files.server_ext_path,\n content: [\n BuildServerSubjectAltNameLine({\n server_dns_sans: params.server_dns_sans,\n server_ip_sans: params.server_ip_sans\n }),\n 'extendedKeyUsage=serverAuth',\n 'keyUsage=digitalSignature,keyEncipherment'\n ].join('\\n')\n });\n\n this.runOpenSslCommand({\n args: [\n 'req',\n '-new',\n '-newkey',\n 'rsa:4096',\n '-sha256',\n '-nodes',\n '-keyout',\n params.tls_files.server_key_path,\n '-out',\n params.tls_files.server_csr_path,\n '-subj',\n `/CN=${params.server_common_name}`\n ]\n });\n\n this.runOpenSslCommand({\n args: [\n 'x509',\n '-req',\n '-in',\n params.tls_files.server_csr_path,\n '-CA',\n params.tls_files.ca_cert_path,\n '-CAkey',\n params.tls_files.ca_key_path,\n '-CAserial',\n params.tls_files.ca_serial_path,\n '-CAcreateserial',\n '-out',\n params.tls_files.server_cert_path,\n '-days',\n String(params.valid_days),\n '-sha256',\n '-extfile',\n params.tls_files.server_ext_path\n ]\n });\n }\n\n private generateClientCertificate(params: {\n tls_files: tls_file_map_t;\n valid_days: number;\n client_common_name: string;\n client_uri_san?: string;\n }): void {\n const client_uri =\n params.client_uri_san ??\n `spiffe://nodenetproccalld/${params.client_common_name\n .replace(/[^a-zA-Z0-9_.-]/g, '_')\n .toLowerCase()}`;\n\n WriteTextFile({\n file_path: params.tls_files.client_ext_path,\n content: [\n 'extendedKeyUsage=clientAuth',\n 'keyUsage=digitalSignature,keyEncipherment',\n `subjectAltName=URI:${client_uri}`\n ].join('\\n')\n });\n\n this.runOpenSslCommand({\n args: [\n 'req',\n '-new',\n '-newkey',\n 'rsa:4096',\n '-sha256',\n '-nodes',\n '-keyout',\n params.tls_files.client_key_path,\n '-out',\n params.tls_files.client_csr_path,\n '-subj',\n `/CN=${params.client_common_name}`\n ]\n });\n\n this.runOpenSslCommand({\n args: [\n 'x509',\n '-req',\n '-in',\n params.tls_files.client_csr_path,\n '-CA',\n params.tls_files.ca_cert_path,\n '-CAkey',\n params.tls_files.ca_key_path,\n '-CAserial',\n params.tls_files.ca_serial_path,\n '-out',\n params.tls_files.client_cert_path,\n '-days',\n String(params.valid_days),\n '-sha256',\n '-extfile',\n params.tls_files.client_ext_path\n ]\n });\n }\n\n private cleanupIntermediateFiles(params: { tls_files: tls_file_map_t }): void {\n fs.rmSync(params.tls_files.server_csr_path, { force: true });\n fs.rmSync(params.tls_files.client_csr_path, { force: true });\n fs.rmSync(params.tls_files.server_ext_path, { force: true });\n fs.rmSync(params.tls_files.client_ext_path, { force: true });\n fs.rmSync(params.tls_files.ca_serial_path, { force: true });\n }\n\n private runOpenSslCommand(params: { args: string[] }): void {\n execFileSync('openssl', params.args, { stdio: 'ignore' });\n }\n\n private getErrorMessage(params: { error: unknown }): string {\n if (params.error instanceof Error) {\n return params.error.message;\n }\n return String(params.error);\n }\n}\n"],"mappings":"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","names":["SafeTimingEqual","params","left_buffer","Buffer","from","left_value","right_buffer","right_value","length","left_digest","crypto","createHash","update","digest","right_digest","timingSafeEqual","ApiKeyAuthorizer","api_key_entries","authenticate","api_key_entry","enabled","api_key","auth_callback_params","matchesIdentityConstraints","state","privileges","constraints","identity_constraints","remote_address_regex","test","remote_address","tls_peer_subject_regex","matchOptionalValue","regex","value","tls_peer_subject","tls_peer_san_regex","tls_peer_san","tls_peer_fingerprint256_regex","tls_peer_fingerprint256","tls_peer_serial_number_regex","tls_peer_serial_number","c","parse","key","token","buffer","stringify","stack","value","client_tls_package_config_schema","z","object","ca_key_file","string","min","ca_cert_file","output_dir","optional","overwrite","boolean","default_valid_days","number","int","positive","clients","array","client_name","common_name","uri_san","package_name","valid_days","strict","ParseJson5File","params","absolute_file_path","path","resolve","process","cwd","file_path","file_content","fs","readFileSync","error","error_message","Error","message","String","JSON5","parse","BuildZodErrorMessage","lines","issues","map","issue","issue_path","length","join","ResolvePath","isAbsolute","base_dir","BuildUriSanFromCommonName","normalized_common_name","replace","toLowerCase","ClientTlsPackageConfigFileLoader","loadClientTlsPackageOptions","absolute_config_file_path","client_tls_package_generation_options","config_file_path","config_dir","dirname","config_raw","parse_result","safeParse","success","config_from_file","data","buildRuntimeClients","assertUniqueClientNames","assertUniquePackageNames","client_definition","client_uri_san","seen_client_names","Set","client","has","add","seen_package_names","import_node_fs","import_node_path","WriteTextFile","params","fs","writeFileSync","file_path","content","EnsureReadableFile","existsSync","Error","label","stat_result","statSync","isFile","ClientTlsPackageGenerator","generateClientTlsPackages","assertOpenSslAvailable","assertTarAvailable","assertCaFiles","runtime_options","mkdirSync","output_dir","recursive","ca_serial_path","path","join","overwrite","rmSync","force","generated_packages","client_definition","clients","client_files","buildClientFileMap","client_name","package_name","prepareClientOutput","generateClientCertificate","ca_key_file","ca_cert_file","common_name","uri_san","valid_days","client_csr_path","client_ext_path","copyFileSync","ca_cert_copy_path","writeClientReadme","createTarPackage","push","package_path","directory_path","client_dir","client_cert_path","client_key_path","ca_cert_path","packages","execFileSync","stdio","runOpenSslCommand","args","ca_sign_args","String","with_create_serial","splice","chmodSync","readme_content","import_node_fs","import_node_path","import_zod","privilege_name_list","tls_min_version_list","worker_runtime_options_schema","z","object","call_timeout_ms","number","int","positive","optional","control_timeout_ms","start_timeout_ms","stop_timeout_ms","restart_on_failure","boolean","max_restarts_per_worker","nonnegative","max_pending_calls_per_worker","restart_base_delay_ms","restart_max_delay_ms","restart_jitter_ms","strict","rate_limiter_schema","enabled","tokens_per_interval","interval_ms","burst_tokens","disconnect_on_limit","abuse_controls_schema","connection_controls","max_concurrent_sockets","max_concurrent_handshakes","max_unauthenticated_sessions","global_connection_window_ms","global_max_new_connections_per_window","per_ip_max_new_connections_per_window","tls_handshake_timeout_ms","auth_message_timeout_ms","max_pre_auth_frame_bytes","max_post_auth_frame_bytes","auth_controls","pending_auth_window_ms","max_pending_auth_attempts_per_ip_per_window","failed_auth_window_ms","max_failed_auth_per_ip_per_window","max_failed_auth_per_api_key_per_window","block_duration_ms","enable_blocklist","request_controls","max_in_flight_requests_per_connection","per_connection","per_api_key","per_ip","observability","enable_console_log","daemon_server_config_schema","information","server_name","string","min","network","bind_addr","tcp_listen_port","max","tls_mtls","key_file","cert_file","ca_file","crl_file","min_version","enum","cipher_suites","handshake_timeout_ms","request_timeout_ms","max_frame_bytes","workerprocedurecall","count","constructor_options","start_options","abuse_controls","log_worker_events","metrics_log_interval_ms","daemon_api_key_config_schema","api_keys","array","key_id","api_key","privileges","identity_constraints","remote_address_regex","tls_peer_subject_regex","tls_peer_san_regex","tls_peer_fingerprint256_regex","tls_peer_serial_number_regex","BuildZodErrorMessage","params","message_lines","error","issues","map","issue","issue_path","path","length","join","message","prefix","CompileRegex","RegExp","source","error_message","Error","String","label","ConfigValidator","validateServerConfig","parse_result","safeParse","server_config_raw","success","data","validateApiKeysConfig","api_keys_config_raw","assertUniqueApiKeys","assertUniqueKeyIds","toRuntimeApiKeysConfig","api_keys_config","api_key_entry","compiled_identity_constraints","compileIdentityConstraints","runtime_entry","constraints","undefined","compiled_constraints","seen_api_keys","Set","has","add","seen_key_ids","ReadUtf8File","params","fs","readFileSync","file_path","error","error_message","Error","message","String","ResolvePath","path","isAbsolute","resolve","base_dir","ParseJson5","JSON5","parse","content","source_path","ConfigFileLoader","config_validator","ConfigValidator","loadDaemonConfig","server_config_path","config_paths","process","cwd","api_keys_config_path","server_config_raw","readJson5File","api_keys_config_raw","server_config","validateServerConfig","api_keys_config","validateApiKeysConfig","runtime_tls_mtls","resolveTlsMaterial","tls_file_config","tls_mtls","config_file_dir","dirname","runtime_api_keys","toRuntimeApiKeysConfig","api_keys","file_content","key_pem","readPemFile","pem_path","key_file","label","cert_pem","cert_file","ca_pem","ca_file","crl_pem","crl_file","undefined","min_version","cipher_suites","handshake_timeout_ms","request_timeout_ms","max_frame_bytes","absolute_file_path","pem_content","trim","includes","default_server_config_path","default_api_keys_config_path","default_config_output_dir","default_tls_config_file_path","default_client_tls_config_file_path","default_tls_output_dir","default_ca_common_name","default_server_common_name","default_client_common_name","default_tls_valid_days","DaemonCli","parseOptions","options","server_config_path","api_keys_config_path","help","default_config_generation","enabled","output_dir","overwrite","default_tls_config_generation","output_file_path","default_client_tls_config_generation","tls_generation","config_file_path","undefined","ca_common_name","server_common_name","client_common_name","server_dns_sans","server_ip_sans","client_uri_san","valid_days","client_tls_package_generation","argv","process","slice","index","length","token","next_value","Error","Number","isInteger","printHelp","help_text","join","console","log","ToIsoTimestamp","Date","toISOString","NetworkProcedureCallDaemon","params","config_paths","config_file_loader","lifecycle_state","daemon_config","workerprocedurecall","networkprocedurecall","api_key_authorizer","worker_event_listener_id","metrics_log_interval_handle","ConfigFileLoader","start","Error","loadDaemonConfig","ApiKeyAuthorizer","api_key_entries","api_keys_config","api_keys","constructor_options","server_config","WorkerProcedureCall","log_worker_events","observability","onWorkerEvent","listener","worker_event","logWorkerEvent","startWorkers","count","start_options","networkprocedurecall_workerprocedurecall","NetworkProcedureCall","auth_callback","createAuthCallback","start_params","buildServerStartParams","startMetricsLogging","logMessage","severity","message","information","server_name","network","bind_addr","tcp_listen_port","error","stopBestEffort","stop","getRuntimeSnapshot","worker_health_states","getWorkerHealthStates","abuse_metrics","getAbuseMetrics","auth_callback_params","authorizer","requireApiKeyAuthorizer","authenticate","requireDaemonConfig","abuse_controls_from_file","abuse_controls","enable_console_log","merged_abuse_controls","undefined","tls_mtls","clearMetricsLoggingInterval","metrics_log_interval_ms","setInterval","JSON","stringify","unref","clearInterval","stop_errors","push","offWorkerEvent","listener_id","stopWorkers","length","first_error","output_message","console","warn","log","DaemonProcess","params","daemon","is_running","stop_in_progress","stop_resolve","stop_waiter","handleSignal","signal","requestStop","reason","handleUncaughtException","error","console","stack","message","process","exitCode","handleUnhandledRejection","error_message","Error","String","NetworkProcedureCallDaemon","config_paths","Promise","resolve","run","attachProcessHandlers","start","detachProcessHandlers","on","off","log","stop","import_node_fs","import_node_path","default_client_tls_generation_config_template","DefaultClientTlsGenerationConfigGenerator","generateDefaultClientTlsGenerationConfig","params","output_file_path","path","resolve","process","cwd","default_client_tls_config_generation_options","overwrite","fs","existsSync","Error","mkdirSync","dirname","recursive","writeFileSync","import_node_fs","import_node_path","default_server_config_template","default_api_keys_config_template","EnsureParentDirectory","params","fs","mkdirSync","path","dirname","file_path","recursive","WriteFileIfAllowed","overwrite","existsSync","Error","writeFileSync","content","DefaultConfigGenerator","generateDefaultConfig","options","default_config_generation_options","output_dir","resolve","process","cwd","server_config_path","join","api_keys_config_path","import_node_fs","import_node_path","default_tls_generation_config_template","DefaultTlsGenerationConfigGenerator","generateDefaultTlsGenerationConfig","params","output_file_path","path","resolve","process","cwd","default_tls_config_generation_options","overwrite","fs","existsSync","Error","mkdirSync","dirname","recursive","writeFileSync","import_node_fs","import_node_path","import_zod","tls_generation_config_schema","z","object","output_dir","string","min","optional","overwrite","boolean","ca_common_name","server_common_name","client_common_name","server_dns_sans","array","server_ip_sans","client_uri_san","valid_days","number","int","positive","strict","ParseJson5File","params","absolute_file_path","path","resolve","process","cwd","file_path","file_content","fs","readFileSync","error","error_message","Error","message","String","JSON5","parse","BuildZodErrorMessage","lines","issues","map","issue","issue_path","length","join","TlsGenerationConfigFileLoader","loadTlsGenerationOptions","config_raw","config_file_path","parse_result","safeParse","success","config_from_file","data","fallback_options","import_node_child_process","import_node_fs","import_node_path","EnsurePositiveInteger","params","Number","isInteger","value","Error","label","MakeDirRecursive","fs","mkdirSync","dir_path","recursive","WriteTextFile","writeFileSync","file_path","content","BuildServerSubjectAltNameLine","san_entries","dns_name","server_dns_sans","trim","length","push","ip_addr","server_ip_sans","join","TlsMaterialGenerator","generateTlsMaterial","options","tls_generation_options","valid_days","output_dir","path","resolve","process","cwd","assertOpenSslAvailable","tls_files","buildTlsFileMap","assertTargetFilesAreWritable","overwrite","generateCa","ca_common_name","generateServerCertificate","server_common_name","generateClientCertificate","client_common_name","client_uri_san","cleanupIntermediateFiles","error","getErrorMessage","ca_key_path","ca_cert_path","server_key_path","server_cert_path","client_key_path","client_cert_path","execFileSync","stdio","server_csr_path","server_ext_path","client_csr_path","client_ext_path","ca_serial_path","target_paths","target_path","existsSync","rmSync","force","runOpenSslCommand","args","String","client_uri","replace","toLowerCase","message","StartDaemonFromCli","daemon_cli","DaemonCli","cli_options","parseOptions","help","printHelp","default_config_generation","enabled","default_config_generator","DefaultConfigGenerator","generated_default_config","generateDefaultConfig","default_config_generation_options","console","log","output_dir","server_config_path","api_keys_config_path","default_tls_config_generation","default_tls_generation_config_generator","DefaultTlsGenerationConfigGenerator","generated_default_tls_config","generateDefaultTlsGenerationConfig","default_tls_config_generation_options","output_file_path","default_client_tls_config_generation","default_client_tls_config_generator","DefaultClientTlsGenerationConfigGenerator","generated_default_client_tls_config","generateDefaultClientTlsGenerationConfig","default_client_tls_config_generation_options","tls_generation","tls_generation_options","config_file_path","tls_generation_config_file_loader","TlsGenerationConfigFileLoader","loadTlsGenerationOptions","fallback_options","tls_material_generator","TlsMaterialGenerator","generated_tls_material","generateTlsMaterial","ca_cert_path","server_cert_path","server_key_path","client_cert_path","client_key_path","client_tls_package_generation","client_tls_package_config_file_loader","ClientTlsPackageConfigFileLoader","runtime_options","loadClientTlsPackageOptions","client_tls_package_generation_options","client_tls_package_generator","ClientTlsPackageGenerator","generated_client_tls_packages","generateClientTlsPackages","generated_package","packages","client_name","package_path","daemon_process","DaemonProcess","config_paths","run","require","main","module","catch","error","error_message","Error","stack","message","String","process","exitCode"]}