diff --git a/packages/autocertifier-client/package.json b/packages/autocertifier-client/package.json index 7fe822c17d..6fbebb0aee 100644 --- a/packages/autocertifier-client/package.json +++ b/packages/autocertifier-client/package.json @@ -19,7 +19,7 @@ "prebuild": "./proto.sh", "build": "tsc -b", "check": "tsc --noEmit", - "clean": "rm -rf dist *.tsbuildinfo node_modules/.cache || true", + "clean": "rm -rf dist generated *.tsbuildinfo node_modules/.cache || true", "eslint": "eslint --cache --cache-location=node_modules/.cache/.eslintcache/ '*/**/*.{js,ts}'" }, "dependencies": { diff --git a/packages/dht/package.json b/packages/dht/package.json index d9ae079ad1..756b4c18d1 100644 --- a/packages/dht/package.json +++ b/packages/dht/package.json @@ -27,7 +27,7 @@ "build": "tsc -b", "build-browser": "webpack --mode=development --progress", "check": "tsc -p tsconfig.jest.json", - "clean": "jest --clearCache || true; rm -rf dist *.tsbuildinfo node_modules/.cache || true", + "clean": "jest --clearCache || true; rm -rf dist generated *.tsbuildinfo node_modules/.cache || true", "eslint": "eslint --cache --cache-location=node_modules/.cache/.eslintcache/ '*/**/*.{js,ts}'", "test": "npm run test-unit && npm run test-integration && npm run test-end-to-end", "test-browser": "karma start karma.config.ts", diff --git a/packages/proto-rpc/package.json b/packages/proto-rpc/package.json index 1cab98219c..b1add8f67d 100644 --- a/packages/proto-rpc/package.json +++ b/packages/proto-rpc/package.json @@ -22,7 +22,7 @@ "build": "tsc -b", "build-browser": "webpack --mode=development --progress", "check": "./test-proto.sh && tsc -p tsconfig.jest.json", - "clean": "jest --clearCache || true; rm -rf dist *.tsbuildinfo node_modules/.cache || true", + "clean": "jest --clearCache || true; rm -rf dist generated *.tsbuildinfo node_modules/.cache || true", "eslint": "./test-proto.sh && eslint --cache --cache-location=node_modules/.cache/.eslintcache/ '*/**/*.{js,ts}'", "test": "./test-proto.sh && npm run test-unit && npm run test-integration", "test-browser": "./test-proto.sh && karma start karma.config.ts", diff --git a/packages/sdk/.gitignore b/packages/sdk/.gitignore index b1194d9475..3cb08f35c1 100644 --- a/packages/sdk/.gitignore +++ b/packages/sdk/.gitignore @@ -42,5 +42,4 @@ test/exports/dist test/exports/package-lock.json docs -src/generated/packages -src/generated/google \ No newline at end of file +src/generated diff --git a/packages/sdk/bin/generate-config-validator.js b/packages/sdk/bin/generate-config-validator.js index 1b6d3d813b..5b0c7b4ab8 100644 --- a/packages/sdk/bin/generate-config-validator.js +++ b/packages/sdk/bin/generate-config-validator.js @@ -29,4 +29,5 @@ ajv.addFormat('ethereum-address', /^0x[a-fA-F0-9]{40}$/) const validate = ajv.compile(CONFIG_SCHEMA) const moduleCode = standaloneCode(ajv, validate) +fs.mkdirSync(path.join(__dirname, '../src/generated'), { recursive: true }) fs.writeFileSync(path.join(__dirname, '../src/generated/validateConfig.js'), moduleCode) diff --git a/packages/sdk/package.json b/packages/sdk/package.json index e586b916f5..217f96416f 100644 --- a/packages/sdk/package.json +++ b/packages/sdk/package.json @@ -37,7 +37,7 @@ "build-browser-development": "NODE_ENV=development webpack --mode=development --progress", "build-browser-production": "NODE_ENV=production webpack --mode=production --progress", "check": "tsc -p tsconfig.jest.json", - "clean": "jest --clearCache || true; rm -rf dist *.tsbuildinfo node_modules/.cache || true", + "clean": "jest --clearCache || true; rm -rf dist src/generated *.tsbuildinfo node_modules/.cache || true", "eslint": "eslint --cache --cache-location=node_modules/.cache/.eslintcache/ '*/**/*.{js,ts,mts}'", "generate-protoc-code": "./proto.sh", "test": "npm run test-unit && npm run test-integration && npm run test-end-to-end", diff --git a/packages/sdk/src/generated/validateConfig.js b/packages/sdk/src/generated/validateConfig.js deleted file mode 100644 index ca5f76d3eb..0000000000 --- a/packages/sdk/src/generated/validateConfig.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";module.exports = validate10;module.exports.default = validate10;const schema11 = {"$id":"config.schema.json","$schema":"http://json-schema.org/draft-07/schema#","description":"Client configuration format","type":"object","additionalProperties":false,"properties":{"environment":{"type":"string","enum":["polygon","polygonAmoy","peaq","iotex","dev2"],"description":"applies all environment-specific defaults for the given environment"},"id":{"type":"string"},"logLevel":{"type":"string","enum":["silent","fatal","error","warn","info","debug","trace"],"default":"info"},"auth":{"type":"object","additionalProperties":false,"properties":{"publicKey":{"type":"string","format":"hex-string"},"privateKey":{"type":"string","format":"hex-string"},"keyType":{"type":"string","default":"ECDSA_SECP256K1_EVM"},"ethereum":{"type":"object"},"identity":{"type":"object"}}},"orderMessages":{"type":"boolean","default":true},"gapFill":{"type":"boolean","default":true},"maxGapRequests":{"type":"number","default":5},"retryResendAfter":{"type":"number","default":5000},"gapFillTimeout":{"type":"number","default":5000},"gapFillStrategy":{"type":"string","enum":["light","full"],"default":"light"},"network":{"type":"object","additionalProperties":false,"required":[],"properties":{"controlLayer":{"type":"object","additionalProperties":false,"properties":{"entryPoints":{"type":"array","items":{"$ref":"#/definitions/peerDescriptor"}},"entryPointDiscovery":{"type":"object","additionalProperties":false,"properties":{"enabled":{"type":"boolean"},"maxEntryPoints":{"type":"number"},"maxQueryResults":{"type":"number"},"maxHeartbeatAgeHours":{"type":"number"}},"default":{"enabled":true,"maxEntryPoints":5,"maxQueryResults":50,"maxHeartbeatAgeHours":24}},"websocketPortRange":{"anyOf":[{"type":"null"},{"$ref":"#/definitions/portRange"}],"default":{"min":32200,"max":32250}},"websocketHost":{"type":"string","format":"hostname"},"peerDescriptor":{"$ref":"#/definitions/peerDescriptor"},"maxConnections":{"type":"number","default":80},"tlsCertificate":{"description":"Files to use for TLS","type":"object","required":["certFileName","privateKeyFileName"],"additionalProperties":false,"properties":{"certFileName":{"type":"string","description":"Path of certificate file"},"privateKeyFileName":{"type":"string","description":"Path of private key file"}}},"iceServers":{"type":"array","items":{"type":"object","required":["url","port"],"additionalProperties":false,"properties":{"url":{"type":"string"},"port":{"type":"number"},"username":{"type":"string"},"password":{"type":"string"},"tcp":{"type":"boolean"}}},"default":[{"url":"stun:stun.streamr.network","port":5349},{"url":"turn:turn.streamr.network","port":5349,"username":"BrubeckTurn1","password":"MIlbgtMw4nhpmbgqRrht1Q=="},{"url":"turn:turn.streamr.network","port":5349,"username":"BrubeckTurn1","password":"MIlbgtMw4nhpmbgqRrht1Q==","tcp":true}]},"webrtcAllowPrivateAddresses":{"type":"boolean","default":false},"webrtcDatachannelBufferThresholdLow":{"type":"number","default":32768},"webrtcDatachannelBufferThresholdHigh":{"type":"number","default":131072},"maxMessageSize":{"type":"number","default":1048576},"externalIp":{"type":"string","format":"ipv4"},"webrtcPortRange":{"$ref":"#/definitions/portRange","default":{"min":50000,"max":64000}},"networkConnectivityTimeout":{"type":"number","default":10000},"websocketServerEnableTls":{"type":"boolean","default":true},"autoCertifierUrl":{"type":"string","default":"https://ns1.streamr-nodes.xyz:59833"},"autoCertifierConfigFile":{"type":"string","default":"~/.streamr/certificate.json"},"geoIpDatabaseFolder":{"type":"string"}},"default":{}},"node":{"type":"object","additionalProperties":false,"properties":{"streamPartitionNeighborTargetCount":{"type":"number","default":4},"streamPartitionMinPropagationTargets":{"type":"number","default":2},"streamPartitionMaxPropagationBufferSize":{"type":"number","default":150},"contentDeliveryBufferWhileConnecting":{"type":"boolean","default":true},"acceptProxyConnections":{"type":"boolean","default":false}},"default":{}}},"default":{}},"contracts":{"type":"object","additionalProperties":false,"properties":{"ethereumNetwork":{"type":"object","additionalProperties":false,"properties":{"chainId":{"type":"number"},"overrides":{"type":"object"},"highGasPriceStrategy":{"type":"boolean"}},"default":{}},"streamRegistryChainAddress":{"type":"string","format":"ethereum-address"},"streamStorageRegistryChainAddress":{"type":"string","format":"ethereum-address"},"storageNodeRegistryChainAddress":{"type":"string","format":"ethereum-address"},"sponsorshipFactoryChainAddress":{"type":"string","format":"ethereum-address"},"rpcs":{"type":"array","items":{"type":"object","$ref":"#/definitions/rpcProviderConfig"},"minItems":1},"rpcQuorum":{"type":"number","default":2},"theGraphUrl":{"type":"string","format":"uri"},"maxConcurrentCalls":{"type":"number","default":10},"pollInterval":{"type":"number","default":4000}},"default":{}},"encryption":{"type":"object","additionalProperties":false,"properties":{"keyRequestTimeout":{"type":"number","default":30000},"maxKeyRequestsPerSecond":{"type":"number","default":20},"rsaKeyLength":{"type":"number","default":4096},"requireQuantumResistantKeyExchange":{"type":"boolean","default":false},"requireQuantumResistantSignatures":{"type":"boolean","default":false},"requireQuantumResistantEncryption":{"type":"boolean","default":false},"keys":{"type":"object","propertyNames":{"$ref":"#/definitions/streamIdOrPath"},"additionalProperties":{"$ref":"#/definitions/encryptionKey"}}},"default":{}},"validation":{"type":"object","additionalProperties":false,"properties":{"permissions":{"type":"boolean","default":true},"partitions":{"type":"boolean","default":true}},"default":{}},"metrics":{"anyOf":[{"type":"boolean"},{"type":"object","additionalProperties":false,"properties":{"periods":{"type":"array","items":{"type":"object","required":["streamId","duration"],"properties":{"id":{"type":"string"},"duration":{"type":"number"}}}},"maxPublishDelay":{"type":"number"}}}]},"cache":{"type":"object","additionalProperties":false,"properties":{"maxSize":{"type":"number","default":10000},"maxAge":{"type":"number","default":86400000}},"default":{}},"_timeouts":{"type":"object","additionalProperties":false,"properties":{"theGraph":{"type":"object","additionalProperties":false,"properties":{"indexTimeout":{"type":"number","default":60000},"indexPollInterval":{"type":"number","default":1000},"fetchTimeout":{"type":"number","default":30000}},"default":{}},"storageNode":{"type":"object","additionalProperties":false,"properties":{"timeout":{"type":"number","default":30000},"retryInterval":{"type":"number","default":1000}},"default":{}},"ensStreamCreation":{"type":"object","additionalProperties":false,"properties":{"timeout":{"type":"number","default":180000},"retryInterval":{"type":"number","default":1000}},"default":{}},"jsonRpcTimeout":{"type":"number","default":30000}},"default":{}}},"definitions":{"rpcProviderConfig":{"type":"object","required":["url"],"properties":{"url":{"type":"string","format":"uri"}}},"peerDescriptor":{"type":"object","additionalProperties":false,"properties":{"nodeId":{"type":"string"},"id":{"type":"string","description":"legacy: remove this property and make nodeId required"},"type":{"$ref":"#/definitions/nodeType"},"websocket":{"$ref":"#/definitions/connectivityMethod"}}},"nodeType":{"type":"string","enum":["browser","nodejs"]},"connectivityMethod":{"type":"object","additionalProperties":false,"required":["host","port","tls"],"properties":{"host":{"type":"string"},"port":{"type":"number"},"tls":{"type":"boolean"}}},"portRange":{"type":"object","additionalProperties":false,"required":["min","max"],"properties":{"min":{"type":"number"},"max":{"type":"number"}}},"streamIdOrPath":{"type":"string"},"encryptionKey":{"type":"object","properties":{"id":{"type":"string"},"data":{"type":"string","format":"hex-string"}},"required":["id","data"]}}};const schema15 = {"type":"object","additionalProperties":false,"required":["min","max"],"properties":{"min":{"type":"number"},"max":{"type":"number"}}};const schema17 = {"type":"object","required":["url"],"properties":{"url":{"type":"string","format":"uri"}}};const schema18 = {"type":"string"};const schema19 = {"type":"object","properties":{"id":{"type":"string"},"data":{"type":"string","format":"hex-string"}},"required":["id","data"]};const func2 = Object.prototype.hasOwnProperty;const formats0 = /^(0x)?[a-fA-F0-9]+$/;const formats4 = /^(?=.{1,253}\.?$)[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[-0-9a-z]{0,61}[0-9a-z])?)*\.?$/i;const formats6 = /^(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)\.){3}(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)$/;const formats8 = /^0x[a-fA-F0-9]{40}$/;const formats16 = /^(?:[a-z][a-z0-9+\-.]*:)(?:\/?\/)?[^\s]*$/i;const schema12 = {"type":"object","additionalProperties":false,"properties":{"nodeId":{"type":"string"},"id":{"type":"string","description":"legacy: remove this property and make nodeId required"},"type":{"$ref":"#/definitions/nodeType"},"websocket":{"$ref":"#/definitions/connectivityMethod"}}};const schema13 = {"type":"string","enum":["browser","nodejs"]};const schema14 = {"type":"object","additionalProperties":false,"required":["host","port","tls"],"properties":{"host":{"type":"string"},"port":{"type":"number"},"tls":{"type":"boolean"}}};function validate11(data, {instancePath="", parentData, parentDataProperty, rootData=data}={}){let vErrors = null;let errors = 0;if(errors === 0){if(data && typeof data == "object" && !Array.isArray(data)){const _errs1 = errors;for(const key0 in data){if(!((((key0 === "nodeId") || (key0 === "id")) || (key0 === "type")) || (key0 === "websocket"))){validate11.errors = [{instancePath,schemaPath:"#/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key0},message:"must NOT have additional properties"}];return false;break;}}if(_errs1 === errors){if(data.nodeId !== undefined){const _errs2 = errors;if(typeof data.nodeId !== "string"){validate11.errors = [{instancePath:instancePath+"/nodeId",schemaPath:"#/properties/nodeId/type",keyword:"type",params:{type: "string"},message:"must be string"}];return false;}var valid0 = _errs2 === errors;}else {var valid0 = true;}if(valid0){if(data.id !== undefined){const _errs4 = errors;if(typeof data.id !== "string"){validate11.errors = [{instancePath:instancePath+"/id",schemaPath:"#/properties/id/type",keyword:"type",params:{type: "string"},message:"must be string"}];return false;}var valid0 = _errs4 === errors;}else {var valid0 = true;}if(valid0){if(data.type !== undefined){let data2 = data.type;const _errs6 = errors;if(typeof data2 !== "string"){validate11.errors = [{instancePath:instancePath+"/type",schemaPath:"#/definitions/nodeType/type",keyword:"type",params:{type: "string"},message:"must be string"}];return false;}if(!((data2 === "browser") || (data2 === "nodejs"))){validate11.errors = [{instancePath:instancePath+"/type",schemaPath:"#/definitions/nodeType/enum",keyword:"enum",params:{allowedValues: schema13.enum},message:"must be equal to one of the allowed values"}];return false;}var valid0 = _errs6 === errors;}else {var valid0 = true;}if(valid0){if(data.websocket !== undefined){let data3 = data.websocket;const _errs9 = errors;const _errs10 = errors;if(errors === _errs10){if(data3 && typeof data3 == "object" && !Array.isArray(data3)){let missing0;if((((data3.host === undefined) && (missing0 = "host")) || ((data3.port === undefined) && (missing0 = "port"))) || ((data3.tls === undefined) && (missing0 = "tls"))){validate11.errors = [{instancePath:instancePath+"/websocket",schemaPath:"#/definitions/connectivityMethod/required",keyword:"required",params:{missingProperty: missing0},message:"must have required property '"+missing0+"'"}];return false;}else {const _errs12 = errors;for(const key1 in data3){if(!(((key1 === "host") || (key1 === "port")) || (key1 === "tls"))){validate11.errors = [{instancePath:instancePath+"/websocket",schemaPath:"#/definitions/connectivityMethod/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key1},message:"must NOT have additional properties"}];return false;break;}}if(_errs12 === errors){if(data3.host !== undefined){const _errs13 = errors;if(typeof data3.host !== "string"){validate11.errors = [{instancePath:instancePath+"/websocket/host",schemaPath:"#/definitions/connectivityMethod/properties/host/type",keyword:"type",params:{type: "string"},message:"must be string"}];return false;}var valid3 = _errs13 === errors;}else {var valid3 = true;}if(valid3){if(data3.port !== undefined){let data5 = data3.port;const _errs15 = errors;if(!((typeof data5 == "number") && (isFinite(data5)))){validate11.errors = [{instancePath:instancePath+"/websocket/port",schemaPath:"#/definitions/connectivityMethod/properties/port/type",keyword:"type",params:{type: "number"},message:"must be number"}];return false;}var valid3 = _errs15 === errors;}else {var valid3 = true;}if(valid3){if(data3.tls !== undefined){const _errs17 = errors;if(typeof data3.tls !== "boolean"){validate11.errors = [{instancePath:instancePath+"/websocket/tls",schemaPath:"#/definitions/connectivityMethod/properties/tls/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"}];return false;}var valid3 = _errs17 === errors;}else {var valid3 = true;}}}}}}else {validate11.errors = [{instancePath:instancePath+"/websocket",schemaPath:"#/definitions/connectivityMethod/type",keyword:"type",params:{type: "object"},message:"must be object"}];return false;}}var valid0 = _errs9 === errors;}else {var valid0 = true;}}}}}}else {validate11.errors = [{instancePath,schemaPath:"#/type",keyword:"type",params:{type: "object"},message:"must be object"}];return false;}}validate11.errors = vErrors;return errors === 0;}function validate10(data, {instancePath="", parentData, parentDataProperty, rootData=data}={}){/*# sourceURL="config.schema.json" */;let vErrors = null;let errors = 0;if(errors === 0){if(data && typeof data == "object" && !Array.isArray(data)){if(data.logLevel === undefined){data.logLevel = "info";}if(data.orderMessages === undefined){data.orderMessages = true;}if(data.gapFill === undefined){data.gapFill = true;}if(data.maxGapRequests === undefined){data.maxGapRequests = 5;}if(data.retryResendAfter === undefined){data.retryResendAfter = 5000;}if(data.gapFillTimeout === undefined){data.gapFillTimeout = 5000;}if(data.gapFillStrategy === undefined){data.gapFillStrategy = "light";}if(data.network === undefined){data.network = {};}if(data.contracts === undefined){data.contracts = {};}if(data.encryption === undefined){data.encryption = {};}if(data.validation === undefined){data.validation = {};}if(data.cache === undefined){data.cache = {};}if(data._timeouts === undefined){data._timeouts = {};}const _errs1 = errors;for(const key0 in data){if(!(func2.call(schema11.properties, key0))){validate10.errors = [{instancePath,schemaPath:"#/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key0},message:"must NOT have additional properties"}];return false;break;}}if(_errs1 === errors){if(data.environment !== undefined){let data0 = data.environment;const _errs2 = errors;if(typeof data0 !== "string"){validate10.errors = [{instancePath:instancePath+"/environment",schemaPath:"#/properties/environment/type",keyword:"type",params:{type: "string"},message:"must be string"}];return false;}if(!(((((data0 === "polygon") || (data0 === "polygonAmoy")) || (data0 === "peaq")) || (data0 === "iotex")) || (data0 === "dev2"))){validate10.errors = [{instancePath:instancePath+"/environment",schemaPath:"#/properties/environment/enum",keyword:"enum",params:{allowedValues: schema11.properties.environment.enum},message:"must be equal to one of the allowed values"}];return false;}var valid0 = _errs2 === errors;}else {var valid0 = true;}if(valid0){if(data.id !== undefined){const _errs4 = errors;if(typeof data.id !== "string"){validate10.errors = [{instancePath:instancePath+"/id",schemaPath:"#/properties/id/type",keyword:"type",params:{type: "string"},message:"must be string"}];return false;}var valid0 = _errs4 === errors;}else {var valid0 = true;}if(valid0){let data2 = data.logLevel;const _errs6 = errors;if(typeof data2 !== "string"){validate10.errors = [{instancePath:instancePath+"/logLevel",schemaPath:"#/properties/logLevel/type",keyword:"type",params:{type: "string"},message:"must be string"}];return false;}if(!(((((((data2 === "silent") || (data2 === "fatal")) || (data2 === "error")) || (data2 === "warn")) || (data2 === "info")) || (data2 === "debug")) || (data2 === "trace"))){validate10.errors = [{instancePath:instancePath+"/logLevel",schemaPath:"#/properties/logLevel/enum",keyword:"enum",params:{allowedValues: schema11.properties.logLevel.enum},message:"must be equal to one of the allowed values"}];return false;}var valid0 = _errs6 === errors;if(valid0){if(data.auth !== undefined){let data3 = data.auth;const _errs8 = errors;if(errors === _errs8){if(data3 && typeof data3 == "object" && !Array.isArray(data3)){if(data3.keyType === undefined){data3.keyType = "ECDSA_SECP256K1_EVM";}const _errs10 = errors;for(const key1 in data3){if(!(((((key1 === "publicKey") || (key1 === "privateKey")) || (key1 === "keyType")) || (key1 === "ethereum")) || (key1 === "identity"))){validate10.errors = [{instancePath:instancePath+"/auth",schemaPath:"#/properties/auth/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key1},message:"must NOT have additional properties"}];return false;break;}}if(_errs10 === errors){if(data3.publicKey !== undefined){let data4 = data3.publicKey;const _errs11 = errors;if(errors === _errs11){if(errors === _errs11){if(typeof data4 === "string"){if(!(formats0.test(data4))){validate10.errors = [{instancePath:instancePath+"/auth/publicKey",schemaPath:"#/properties/auth/properties/publicKey/format",keyword:"format",params:{format: "hex-string"},message:"must match format \""+"hex-string"+"\""}];return false;}}else {validate10.errors = [{instancePath:instancePath+"/auth/publicKey",schemaPath:"#/properties/auth/properties/publicKey/type",keyword:"type",params:{type: "string"},message:"must be string"}];return false;}}}var valid1 = _errs11 === errors;}else {var valid1 = true;}if(valid1){if(data3.privateKey !== undefined){let data5 = data3.privateKey;const _errs13 = errors;if(errors === _errs13){if(errors === _errs13){if(typeof data5 === "string"){if(!(formats0.test(data5))){validate10.errors = [{instancePath:instancePath+"/auth/privateKey",schemaPath:"#/properties/auth/properties/privateKey/format",keyword:"format",params:{format: "hex-string"},message:"must match format \""+"hex-string"+"\""}];return false;}}else {validate10.errors = [{instancePath:instancePath+"/auth/privateKey",schemaPath:"#/properties/auth/properties/privateKey/type",keyword:"type",params:{type: "string"},message:"must be string"}];return false;}}}var valid1 = _errs13 === errors;}else {var valid1 = true;}if(valid1){const _errs15 = errors;if(typeof data3.keyType !== "string"){validate10.errors = [{instancePath:instancePath+"/auth/keyType",schemaPath:"#/properties/auth/properties/keyType/type",keyword:"type",params:{type: "string"},message:"must be string"}];return false;}var valid1 = _errs15 === errors;if(valid1){if(data3.ethereum !== undefined){let data7 = data3.ethereum;const _errs17 = errors;if(!(data7 && typeof data7 == "object" && !Array.isArray(data7))){validate10.errors = [{instancePath:instancePath+"/auth/ethereum",schemaPath:"#/properties/auth/properties/ethereum/type",keyword:"type",params:{type: "object"},message:"must be object"}];return false;}var valid1 = _errs17 === errors;}else {var valid1 = true;}if(valid1){if(data3.identity !== undefined){let data8 = data3.identity;const _errs19 = errors;if(!(data8 && typeof data8 == "object" && !Array.isArray(data8))){validate10.errors = [{instancePath:instancePath+"/auth/identity",schemaPath:"#/properties/auth/properties/identity/type",keyword:"type",params:{type: "object"},message:"must be object"}];return false;}var valid1 = _errs19 === errors;}else {var valid1 = true;}}}}}}}else {validate10.errors = [{instancePath:instancePath+"/auth",schemaPath:"#/properties/auth/type",keyword:"type",params:{type: "object"},message:"must be object"}];return false;}}var valid0 = _errs8 === errors;}else {var valid0 = true;}if(valid0){const _errs21 = errors;if(typeof data.orderMessages !== "boolean"){validate10.errors = [{instancePath:instancePath+"/orderMessages",schemaPath:"#/properties/orderMessages/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"}];return false;}var valid0 = _errs21 === errors;if(valid0){const _errs23 = errors;if(typeof data.gapFill !== "boolean"){validate10.errors = [{instancePath:instancePath+"/gapFill",schemaPath:"#/properties/gapFill/type",keyword:"type",params:{type: "boolean"},message:"must be boolean"}];return false;}var valid0 = _errs23 === errors;if(valid0){let data11 = data.maxGapRequests;const _errs25 = errors;if(!((typeof data11 == "number") && (isFinite(data11)))){validate10.errors = [{instancePath:instancePath+"/maxGapRequests",schemaPath:"#/properties/maxGapRequests/type",keyword:"type",params:{type: "number"},message:"must be number"}];return false;}var valid0 = _errs25 === errors;if(valid0){let data12 = data.retryResendAfter;const _errs27 = errors;if(!((typeof data12 == "number") && (isFinite(data12)))){validate10.errors = [{instancePath:instancePath+"/retryResendAfter",schemaPath:"#/properties/retryResendAfter/type",keyword:"type",params:{type: "number"},message:"must be number"}];return false;}var valid0 = _errs27 === errors;if(valid0){let data13 = data.gapFillTimeout;const _errs29 = errors;if(!((typeof data13 == "number") && (isFinite(data13)))){validate10.errors = [{instancePath:instancePath+"/gapFillTimeout",schemaPath:"#/properties/gapFillTimeout/type",keyword:"type",params:{type: "number"},message:"must be number"}];return false;}var valid0 = _errs29 === errors;if(valid0){let data14 = data.gapFillStrategy;const _errs31 = errors;if(typeof data14 !== "string"){validate10.errors = [{instancePath:instancePath+"/gapFillStrategy",schemaPath:"#/properties/gapFillStrategy/type",keyword:"type",params:{type: "string"},message:"must be string"}];return false;}if(!((data14 === "light") || (data14 === "full"))){validate10.errors = [{instancePath:instancePath+"/gapFillStrategy",schemaPath:"#/properties/gapFillStrategy/enum",keyword:"enum",params:{allowedValues: schema11.properties.gapFillStrategy.enum},message:"must be equal to one of the allowed values"}];return false;}var valid0 = _errs31 === errors;if(valid0){let data15 = data.network;const _errs33 = errors;if(errors === _errs33){if(data15 && typeof data15 == "object" && !Array.isArray(data15)){if(data15.controlLayer === undefined){data15.controlLayer = {};}if(data15.node === undefined){data15.node = {};}const _errs35 = errors;for(const key2 in data15){if(!((key2 === "controlLayer") || (key2 === "node"))){validate10.errors = [{instancePath:instancePath+"/network",schemaPath:"#/properties/network/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key2},message:"must NOT have additional properties"}];return false;break;}}if(_errs35 === errors){let data16 = data15.controlLayer;const _errs36 = errors;if(errors === _errs36){if(data16 && typeof data16 == "object" && !Array.isArray(data16)){if(data16.entryPointDiscovery === undefined){data16.entryPointDiscovery = {"enabled":true,"maxEntryPoints":5,"maxQueryResults":50,"maxHeartbeatAgeHours":24};}if(data16.websocketPortRange === undefined){data16.websocketPortRange = {"min":32200,"max":32250};}if(data16.maxConnections === undefined){data16.maxConnections = 80;}if(data16.iceServers === undefined){data16.iceServers = [{"url":"stun:stun.streamr.network","port":5349},{"url":"turn:turn.streamr.network","port":5349,"username":"BrubeckTurn1","password":"MIlbgtMw4nhpmbgqRrht1Q=="},{"url":"turn:turn.streamr.network","port":5349,"username":"BrubeckTurn1","password":"MIlbgtMw4nhpmbgqRrht1Q==","tcp":true}];}if(data16.webrtcAllowPrivateAddresses === undefined){data16.webrtcAllowPrivateAddresses = false;}if(data16.webrtcDatachannelBufferThresholdLow === undefined){data16.webrtcDatachannelBufferThresholdLow = 32768;}if(data16.webrtcDatachannelBufferThresholdHigh === undefined){data16.webrtcDatachannelBufferThresholdHigh = 131072;}if(data16.maxMessageSize === undefined){data16.maxMessageSize = 1048576;}if(data16.webrtcPortRange === undefined){data16.webrtcPortRange = {"min":50000,"max":64000};}if(data16.networkConnectivityTimeout === undefined){data16.networkConnectivityTimeout = 10000;}if(data16.websocketServerEnableTls === undefined){data16.websocketServerEnableTls = true;}if(data16.autoCertifierUrl === undefined){data16.autoCertifierUrl = "https://ns1.streamr-nodes.xyz:59833";}if(data16.autoCertifierConfigFile === undefined){data16.autoCertifierConfigFile = "~/.streamr/certificate.json";}const _errs38 = errors;for(const key3 in data16){if(!(func2.call(schema11.properties.network.properties.controlLayer.properties, key3))){validate10.errors = [{instancePath:instancePath+"/network/controlLayer",schemaPath:"#/properties/network/properties/controlLayer/additionalProperties",keyword:"additionalProperties",params:{additionalProperty: key3},message:"must NOT have additional properties"}];return false;break;}}if(_errs38 === errors){if(data16.entryPoints !== undefined){let data17 = data16.entryPoints;const _errs39 = errors;if(errors === _errs39){if(Array.isArray(data17)){var valid4 = true;const len0 = data17.length;for(let i0=0; i0