{"_id":"@onlineapps/service-common","_rev":"31-5b51109cbd5909182cbc38fc1c1b7b2a","name":"@onlineapps/service-common","dist-tags":{"latest":"4.0.0"},"versions":{"1.0.0":{"name":"@onlineapps/service-common","version":"1.0.0","keywords":["microservices","infrastructure","common","utilities"],"author":{"name":"OA Drive Team"},"license":"MIT","_id":"@onlineapps/service-common@1.0.0","maintainers":[{"name":"onlineapps","email":"npmjs@onlineapps.cz"}],"dist":{"shasum":"cc4a1cf58be56cc98875c9218eca3ed2bb1b676b","tarball":"https://registry.npmjs.org/@onlineapps/service-common/-/service-common-1.0.0.tgz","fileCount":4,"integrity":"sha512-DSuRRhrI7uv+bN4cNETTd9T0h8LV0yrvxU7Ifq6QK5S5MWhT0jBc7k8tFcLDJHSStv8kAM0SKrVdQYPHxclO/Q==","signatures":[{"sig":"MEQCID4EyrEngafi+wqbp48ZQ8a3kY573OYjEwd7P+nA6v/2AiBF6F0dn7aO8MLWpGb9z2EeVK0YckM+XQcd1RW4tUG7WQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":9078},"main":"src/index.js","engines":{"node":">=14.0.0"},"gitHead":"b4ebc62a2fcda26c5be09f88604d7ad234072a4d","scripts":{"test":"jest","test:unit":"jest tests/unit","test:integration":"jest tests/integration"},"_npmUser":{"name":"onlineapps","email":"npmjs@onlineapps.cz"},"_npmVersion":"9.2.0","description":"Common utilities for both infrastructure services and business services","directories":{},"_nodeVersion":"18.19.1","dependencies":{"redis":"^4.6.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0"},"_npmOperationalInternal":{"tmp":"tmp/service-common_1.0.0_1764119980478_0.3587475673037106","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@onlineapps/service-common","version":"1.0.1","keywords":["microservices","infrastructure","common","utilities"],"author":{"name":"OA Drive Team"},"license":"MIT","_id":"@onlineapps/service-common@1.0.1","maintainers":[{"name":"onlineapps","email":"npmjs@onlineapps.cz"}],"dist":{"shasum":"d893972ef1daf8a3a42dd425fc16cb93d1da28a6","tarball":"https://registry.npmjs.org/@onlineapps/service-common/-/service-common-1.0.1.tgz","fileCount":7,"integrity":"sha512-K9obP1Wg1UwgaQP1PuoPKzoLLxMjOlabGi5lnLpUqYO4/cAKsZu2iKmDwg044VwsUkDkTDVJi1rpJSNzqHL7GA==","signatures":[{"sig":"MEYCIQCi/hYmG2v8QkF0TakxiUVpm8GNgZkML8i0K/HiHGFX5AIhAOLjF8VvDXpLxSX/xEbS4d3giI/RbzwdU4AjwNd+RNwl","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":17439},"main":"src/index.js","engines":{"node":">=14.0.0"},"gitHead":"dc98ce0314aad1313aa7976b5da23d344e1f45db","scripts":{"test":"jest","test:unit":"jest tests/unit","test:integration":"jest tests/integration"},"_npmUser":{"name":"onlineapps","email":"npmjs@onlineapps.cz"},"_npmVersion":"9.2.0","description":"Common utilities for both infrastructure services and business services","directories":{},"_nodeVersion":"18.19.1","dependencies":{"redis":"^4.6.0","nodemailer":"^6.9.8"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0"},"_npmOperationalInternal":{"tmp":"tmp/service-common_1.0.1_1764280966658_0.8473263874134034","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@onlineapps/service-common","version":"1.0.2","keywords":["microservices","infrastructure","common","utilities"],"author":{"name":"OA Drive Team"},"license":"MIT","_id":"@onlineapps/service-common@1.0.2","maintainers":[{"name":"onlineapps","email":"npmjs@onlineapps.cz"}],"dist":{"shasum":"80c18afaadc7302f2d035135d55b1a7a682ff9cc","tarball":"https://registry.npmjs.org/@onlineapps/service-common/-/service-common-1.0.2.tgz","fileCount":9,"integrity":"sha512-qoBKAsq57usWFl9j/SU1p3xQqtsXJiLB0qWeBSyEcTP4TdYktvmY2ZyhU9rFx3xVJ4aIG0tqcb1ROq8PFhhBvQ==","signatures":[{"sig":"MEUCIHyhFq2B/TeRurrF9Z9q09kAGcyouVPDIljUuhVAlb8YAiEAoHws0Mz+FDNXmZbq301QJkTpBnVzCketq/CcvrTvuyA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":30338},"main":"src/index.js","engines":{"node":">=14.0.0"},"gitHead":"238bfc5a565babfe0dc941f79688e8ddc227e547","scripts":{"test":"jest","test:unit":"jest tests/unit","postpublish":"../../scripts/update-manifest-from-npm.sh && ../../scripts/update-all-services.sh","prepublishOnly":"../../scripts/pre-publish-compatibility-check.sh","test:integration":"jest tests/integration"},"_npmUser":{"name":"onlineapps","email":"npmjs@onlineapps.cz"},"_npmVersion":"9.2.0","description":"Common utilities for both infrastructure services and business services","directories":{},"_nodeVersion":"18.19.1","dependencies":{"redis":"^4.6.0","nodemailer":"^6.9.8"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0"},"_npmOperationalInternal":{"tmp":"tmp/service-common_1.0.2_1764668211117_0.9777070224303741","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"@onlineapps/service-common","version":"1.0.3","keywords":["microservices","infrastructure","common","utilities"],"author":{"name":"OA Drive Team"},"license":"MIT","_id":"@onlineapps/service-common@1.0.3","maintainers":[{"name":"onlineapps","email":"npmjs@onlineapps.cz"}],"dist":{"shasum":"2f2b4281f8c737385f7922da3bcf0e4886b2b522","tarball":"https://registry.npmjs.org/@onlineapps/service-common/-/service-common-1.0.3.tgz","fileCount":10,"integrity":"sha512-UrKYbnPtRuDGiqcg89x7uGaT4L70JE2LYrXlmTokmCiagxshgF8cLoZGcgQ1RG6WhlJnA+nHINlaJkDvKgbe2Q==","signatures":[{"sig":"MEYCIQDTTM6RF81ZFlm+p+oq4/TvHzQGDWub+nbOGkrSJ5pBEQIhAJkwq8ehiH+z/1BK2z+idIgiGhOOpe33NXBKG1qJU8wg","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":35557},"main":"src/index.js","engines":{"node":">=14.0.0"},"gitHead":"4cd30f374778e35eb55948fba21e960a32281b62","scripts":{"test":"jest","test:unit":"jest tests/unit","postpublish":"../../scripts/update-manifest-from-npm.sh && ../../scripts/update-all-services.sh","prepublishOnly":"../../scripts/pre-publish-compatibility-check.sh","test:integration":"jest tests/integration"},"_npmUser":{"name":"onlineapps","email":"npmjs@onlineapps.cz"},"_npmVersion":"9.2.0","description":"Common utilities for both infrastructure services and business services","directories":{},"_nodeVersion":"18.19.1","dependencies":{"redis":"^4.6.0","nodemailer":"^6.9.8"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0"},"_npmOperationalInternal":{"tmp":"tmp/service-common_1.0.3_1764676915178_0.767190339348417","host":"s3://npm-registry-packages-npm-production"}},"1.0.4":{"name":"@onlineapps/service-common","version":"1.0.4","keywords":["microservices","infrastructure","common","utilities"],"author":{"name":"OA Drive Team"},"license":"MIT","_id":"@onlineapps/service-common@1.0.4","maintainers":[{"name":"onlineapps","email":"npmjs@onlineapps.cz"}],"dist":{"shasum":"b8902ecabaa4fe22cd62191f967f945f21fd4279","tarball":"https://registry.npmjs.org/@onlineapps/service-common/-/service-common-1.0.4.tgz","fileCount":11,"integrity":"sha512-6VGIrM9muXFLqHIHhthODNvOSsZWilOU2Yfno5AYYPOAngV3+DSCGiSxsLNkOIWqDnuixP9Pcoh2oAizcYHWJQ==","signatures":[{"sig":"MEYCIQDlCvveFR+RK4EhPxloA5WsXcT0EJrjzoA+4W/V+lj8iQIhANquTImYdWlTGqHT131BPBoN9/AyIsRjjVu8kCo7lIx9","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":41705},"main":"src/index.js","engines":{"node":">=14.0.0"},"gitHead":"9133ffa880bbe899334ad8972d3f5365e90b06ff","scripts":{"test":"jest","test:unit":"jest tests/unit","postpublish":"../../scripts/update-manifest-from-npm.sh && ../../scripts/update-all-services.sh","prepublishOnly":"../../scripts/pre-publish-compatibility-check.sh","test:integration":"jest tests/integration"},"_npmUser":{"name":"onlineapps","email":"npmjs@onlineapps.cz"},"_npmVersion":"9.2.0","description":"Common utilities for both infrastructure services and business services","directories":{},"_nodeVersion":"18.19.1","dependencies":{"redis":"^4.6.0","nodemailer":"^6.9.8"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0"},"_npmOperationalInternal":{"tmp":"tmp/service-common_1.0.4_1764695909060_0.7629978154619248","host":"s3://npm-registry-packages-npm-production"}},"1.0.5":{"name":"@onlineapps/service-common","version":"1.0.5","keywords":["microservices","infrastructure","common","utilities"],"author":{"name":"OA Drive Team"},"license":"MIT","_id":"@onlineapps/service-common@1.0.5","maintainers":[{"name":"onlineapps","email":"npmjs@onlineapps.cz"}],"dist":{"shasum":"089d276d71a0af3beb26b2c91b5c6100dce83a21","tarball":"https://registry.npmjs.org/@onlineapps/service-common/-/service-common-1.0.5.tgz","fileCount":12,"integrity":"sha512-1seLSjFysHMafgmx8ZA0aCmQohhAyzuLadHNqsI7kvVbM8XISOhPnQVOCuE2xLK38/3AyMU3xtE9spoUf1WhLw==","signatures":[{"sig":"MEUCIQCQBSoH4yG07HQ3q34SCag0ArsoZuR2pkib1LSWztwWsQIgOP7yJcXoX+PLTMWv9uObFIqNn9j6ZqTgk3ZYLLg+pks=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":46544},"main":"src/index.js","engines":{"node":">=14.0.0"},"gitHead":"008671c2e1450e3929a54a3e66e7ce643f64a2df","scripts":{"test":"jest","test:unit":"jest tests/unit","postpublish":"../../scripts/update-manifest-from-npm.sh && ../../scripts/update-all-services.sh","prepublishOnly":"../../scripts/pre-publish-compatibility-check.sh","test:integration":"jest tests/integration"},"_npmUser":{"name":"onlineapps","email":"npmjs@onlineapps.cz"},"_npmVersion":"9.2.0","description":"Common utilities for both infrastructure services and business services","directories":{},"_nodeVersion":"18.19.1","dependencies":{"redis":"^4.6.0","nodemailer":"^6.9.8"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0"},"_npmOperationalInternal":{"tmp":"tmp/service-common_1.0.5_1764745780246_0.36895730358404855","host":"s3://npm-registry-packages-npm-production"}},"1.0.6":{"name":"@onlineapps/service-common","version":"1.0.6","keywords":["microservices","infrastructure","common","utilities"],"author":{"name":"OA Drive Team"},"license":"MIT","_id":"@onlineapps/service-common@1.0.6","maintainers":[{"name":"onlineapps","email":"npmjs@onlineapps.cz"}],"dist":{"shasum":"3388157e19158884a9a3d1323ddfbd7e4d5a8253","tarball":"https://registry.npmjs.org/@onlineapps/service-common/-/service-common-1.0.6.tgz","fileCount":14,"integrity":"sha512-9qEg3wNoUigRjzkxAsL6hjq42zbS3hRk4DpdUS8qtuPrLLnRVq9UZ6wPbkAJcXFBrCMpVMXMKMAvCc3OY5vzTA==","signatures":[{"sig":"MEYCIQDocR5SZReG5mgk2g11VK1BxkG61v8d4U8z2eeDiIUdJQIhALKd5nyeF2fk5/JCBhiSQFpjh/t6lJ2zrQ28HE5Ce9Fy","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":44908},"main":"src/index.js","engines":{"node":">=14.0.0"},"gitHead":"3af93721cbc5cc3849955583c61a29d47933834c","scripts":{"test":"jest","test:unit":"jest tests/unit","test:integration":"jest tests/integration"},"_npmUser":{"name":"onlineapps","email":"npmjs@onlineapps.cz"},"_npmVersion":"9.2.0","description":"Common utilities for both infrastructure services and business services","directories":{},"_nodeVersion":"18.19.1","dependencies":{"redis":"^4.6.0","nodemailer":"^6.9.8","@onlineapps/runtime-config":"1.0.1"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0"},"_npmOperationalInternal":{"tmp":"tmp/service-common_1.0.6_1766398310557_0.39919557089297086","host":"s3://npm-registry-packages-npm-production"}},"1.0.7":{"name":"@onlineapps/service-common","version":"1.0.7","keywords":["microservices","infrastructure","common","utilities"],"author":{"name":"OA Drive Team"},"license":"MIT","_id":"@onlineapps/service-common@1.0.7","maintainers":[{"name":"onlineapps","email":"npmjs@onlineapps.cz"}],"dist":{"shasum":"bfa489cb9c4338bd31fe873d985fd97a70819cd6","tarball":"https://registry.npmjs.org/@onlineapps/service-common/-/service-common-1.0.7.tgz","fileCount":14,"integrity":"sha512-feefmifp9cN47QUzUViVwMFAioG+MlkZCQB472T7TpjwlE7MbQ3jL7QBO7PzwMsGh0O5PJQJxWQ/+uSeXgKZDg==","signatures":[{"sig":"MEYCIQDBfnvhoVYcTyAR1n9uiz/EvVRNRLEaqV/OQ5gGc6juGwIhAOxO9cm27DgVdBs0csVp1cTOdBowq4420f6tYx7ZUfDo","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":44908},"main":"src/index.js","engines":{"node":">=14.0.0"},"gitHead":"3af93721cbc5cc3849955583c61a29d47933834c","scripts":{"test":"jest","test:unit":"jest tests/unit","test:integration":"jest tests/integration"},"_npmUser":{"name":"onlineapps","email":"npmjs@onlineapps.cz"},"_npmVersion":"9.2.0","description":"Common utilities for both infrastructure services and business services","directories":{},"_nodeVersion":"18.19.1","dependencies":{"redis":"^4.6.0","nodemailer":"^6.9.8","@onlineapps/runtime-config":"1.0.2"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0"},"_npmOperationalInternal":{"tmp":"tmp/service-common_1.0.7_1766402602757_0.9864978610119435","host":"s3://npm-registry-packages-npm-production"}},"1.0.8":{"name":"@onlineapps/service-common","version":"1.0.8","keywords":["microservices","infrastructure","common","utilities"],"author":{"name":"OA Drive Team"},"license":"MIT","_id":"@onlineapps/service-common@1.0.8","maintainers":[{"name":"onlineapps","email":"npmjs@onlineapps.cz"}],"dist":{"shasum":"29589684a9991c070f111401fbff61cb356f971a","tarball":"https://registry.npmjs.org/@onlineapps/service-common/-/service-common-1.0.8.tgz","fileCount":13,"integrity":"sha512-3afHvkKNvkdHR6LE+ZC1luOZaSRcRlSV3f3z0+yrNXl7YSsE28/IyVr/4W9iNEsrdg6KM7Brn/4K+3/bOdiFwg==","signatures":[{"sig":"MEYCIQCUIQkQVArbJXkum+S1CviIFTL6SrCfG7DUrFOP8UpHQwIhALenWJAYo7IFoUP8Urjkdkjnn0sI0mvnlbHZQWvzkC4t","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":37589},"main":"src/index.js","engines":{"node":">=14.0.0"},"gitHead":"00dec06e469606bacf1882fc49f32678239fec07","scripts":{"test":"jest","test:unit":"jest tests/unit","test:integration":"jest tests/integration"},"_npmUser":{"name":"onlineapps","email":"npmjs@onlineapps.cz"},"_npmVersion":"9.2.0","description":"Common utilities for both infrastructure services and business services","directories":{},"_nodeVersion":"18.19.1","dependencies":{"redis":"^4.6.0","nodemailer":"^6.9.8","@onlineapps/runtime-config":"1.0.2"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0"},"_npmOperationalInternal":{"tmp":"tmp/service-common_1.0.8_1766414661294_0.3095567192768618","host":"s3://npm-registry-packages-npm-production"}},"1.0.9":{"name":"@onlineapps/service-common","version":"1.0.9","keywords":["microservices","infrastructure","common","utilities"],"author":{"name":"OA Drive Team"},"license":"MIT","_id":"@onlineapps/service-common@1.0.9","maintainers":[{"name":"onlineapps","email":"npmjs@onlineapps.cz"}],"dist":{"shasum":"f9b4087c5e9e4e26af8d33327319c0f3d3468351","tarball":"https://registry.npmjs.org/@onlineapps/service-common/-/service-common-1.0.9.tgz","fileCount":13,"integrity":"sha512-AHVZHdCEVUw6uw1xFe+GfE/f+EgQjAfHNBxfYkMAt+Ujaw3ivURM8y+qyEUqkqXfkgGqj20W7ZRBNvxefCsoeQ==","signatures":[{"sig":"MEUCIQDvUYHF/EMZ8dRq0ykR+JQB1k+YFMg6/hP5QAb9k6nHuQIgXAkNsFTkbjiwxtyTQqAEQQRdCL6cnZdh6HE9ZtoC0hI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":37589},"main":"src/index.js","engines":{"node":">=14.0.0"},"gitHead":"00dec06e469606bacf1882fc49f32678239fec07","scripts":{"test":"jest","test:unit":"jest tests/unit","test:integration":"jest tests/integration"},"_npmUser":{"name":"onlineapps","email":"npmjs@onlineapps.cz"},"_npmVersion":"9.2.0","description":"Common utilities for both infrastructure services and business services","directories":{},"_nodeVersion":"18.19.1","dependencies":{"redis":"^4.6.0","nodemailer":"^6.9.8","@onlineapps/runtime-config":"1.0.2"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0"},"_npmOperationalInternal":{"tmp":"tmp/service-common_1.0.9_1766415176078_0.7441292282106471","host":"s3://npm-registry-packages-npm-production"}},"1.0.10":{"name":"@onlineapps/service-common","version":"1.0.10","keywords":["microservices","infrastructure","common","utilities"],"author":{"name":"OA Drive Team"},"license":"MIT","_id":"@onlineapps/service-common@1.0.10","maintainers":[{"name":"onlineapps","email":"npmjs@onlineapps.cz"}],"dist":{"shasum":"98b3c06bd7ac72843a28a175ed23acabc596d8d6","tarball":"https://registry.npmjs.org/@onlineapps/service-common/-/service-common-1.0.10.tgz","fileCount":13,"integrity":"sha512-EJu7r/jcP8tCGBrXmh3q0rR0gjwedOE51+s1nmfctnwkVto81AH7541qoZzPa7k88kPlw3Fr3t0k3f4toC3cRQ==","signatures":[{"sig":"MEYCIQCa64ulXZrc2hDYSsY84cBenN1JjKbZ9ZpB5ED+p1nE4gIhAMbI4N1Cebrnv6oDILie3QX6wfvMGQraygVdzBuK34+Q","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":37590},"main":"src/index.js","engines":{"node":">=14.0.0"},"gitHead":"00dec06e469606bacf1882fc49f32678239fec07","scripts":{"test":"jest","test:unit":"jest tests/unit","test:integration":"jest tests/integration"},"_npmUser":{"name":"onlineapps","email":"npmjs@onlineapps.cz"},"_npmVersion":"9.2.0","description":"Common utilities for both infrastructure services and business services","directories":{},"_nodeVersion":"18.19.1","dependencies":{"redis":"^4.6.0","nodemailer":"^6.9.8","@onlineapps/runtime-config":"1.0.2"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0"},"_npmOperationalInternal":{"tmp":"tmp/service-common_1.0.10_1766415495469_0.7106137875855818","host":"s3://npm-registry-packages-npm-production"}},"1.0.11":{"name":"@onlineapps/service-common","version":"1.0.11","keywords":["microservices","infrastructure","common","utilities"],"author":{"name":"OA Drive Team"},"license":"MIT","_id":"@onlineapps/service-common@1.0.11","maintainers":[{"name":"onlineapps","email":"npmjs@onlineapps.cz"}],"dist":{"shasum":"ca561b7ab0b9167f3c2b731c87bf65c75e666df4","tarball":"https://registry.npmjs.org/@onlineapps/service-common/-/service-common-1.0.11.tgz","fileCount":13,"integrity":"sha512-ZCBLUdpEl6hEDfD57mjal4DnwE7m884LmAnNXNfgfouT0iNCelYDGOKeWIdIp6KQrZLkmG9hZT+GT6W8BrY1Vw==","signatures":[{"sig":"MEQCIAtnjdXEgNHIDtobCrgCkyA9/LdhW9Pmq4uQGHHTe5IAAiBdp6W1/tCkDTOho4b/YDpvMb0Ytw0Iee698GUjv3MsuA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":37590},"main":"src/index.js","engines":{"node":">=14.0.0"},"gitHead":"00dec06e469606bacf1882fc49f32678239fec07","scripts":{"test":"jest","test:unit":"jest tests/unit","test:integration":"jest tests/integration"},"_npmUser":{"name":"onlineapps","email":"npmjs@onlineapps.cz"},"_npmVersion":"9.2.0","description":"Common utilities for both infrastructure services and business services","directories":{},"_nodeVersion":"18.19.1","dependencies":{"redis":"^4.6.0","nodemailer":"^6.9.8","@onlineapps/runtime-config":"1.0.2"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0"},"_npmOperationalInternal":{"tmp":"tmp/service-common_1.0.11_1766415651509_0.31988936642103005","host":"s3://npm-registry-packages-npm-production"}},"1.0.12":{"name":"@onlineapps/service-common","version":"1.0.12","keywords":["microservices","infrastructure","common","utilities"],"author":{"name":"OA Drive Team"},"license":"MIT","_id":"@onlineapps/service-common@1.0.12","maintainers":[{"name":"onlineapps","email":"npmjs@onlineapps.cz"}],"dist":{"shasum":"eb53fa0da8923c9a2a8389476944c38b2980b78a","tarball":"https://registry.npmjs.org/@onlineapps/service-common/-/service-common-1.0.12.tgz","fileCount":13,"integrity":"sha512-dqt13HSp4OjUOb5CRM0gMAPruqgcDAt6gBWHf5SYwePXuKZmJQuh4Py+ysm+o+TSlZXRMjd1mn5kTXmdjArbwA==","signatures":[{"sig":"MEYCIQDQSzqnr1WpKjQaEdR57UVab1GM7gjkVRSSKLhZZ1oHXAIhANOCGQID8/6w/zIqykBg/HKLwYDLm89jVmGHwjXXywRj","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":37590},"main":"src/index.js","engines":{"node":">=14.0.0"},"gitHead":"00dec06e469606bacf1882fc49f32678239fec07","scripts":{"test":"jest","test:unit":"jest tests/unit","test:integration":"jest tests/integration"},"_npmUser":{"name":"onlineapps","email":"npmjs@onlineapps.cz"},"_npmVersion":"9.2.0","description":"Common utilities for both infrastructure services and business services","directories":{},"_nodeVersion":"18.19.1","dependencies":{"redis":"^4.6.0","nodemailer":"^6.9.8","@onlineapps/runtime-config":"1.0.2"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0"},"_npmOperationalInternal":{"tmp":"tmp/service-common_1.0.12_1766416941123_0.5882114167129426","host":"s3://npm-registry-packages-npm-production"}},"1.0.13":{"name":"@onlineapps/service-common","version":"1.0.13","keywords":["microservices","infrastructure","common","utilities"],"author":{"name":"OA Drive Team"},"license":"MIT","_id":"@onlineapps/service-common@1.0.13","maintainers":[{"name":"onlineapps","email":"npmjs@onlineapps.cz"}],"dist":{"shasum":"39f0984720dd09d828119465f47fcce6822eac5e","tarball":"https://registry.npmjs.org/@onlineapps/service-common/-/service-common-1.0.13.tgz","fileCount":13,"integrity":"sha512-i798g17LYXShQxrcBQl7z9M68A8C5q7wqFx90WyFaOfG3Bhip0SHemitDKcqGAxDyp+xgmN/9lDERlZzrHHI7Q==","signatures":[{"sig":"MEUCIQDQ4r6mHnIK3O5gjvHdAShkIWtrnqamTMXngFae55K/eAIgNTBbsG2TAc+pXhXXzz56NsLYXgUw4RfPoje/zs8k/l4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":38353},"main":"src/index.js","engines":{"node":">=14.0.0"},"gitHead":"7eb7ab96a9d47ab31570ab42eca8416ed7baee4f","scripts":{"test":"jest","test:unit":"jest tests/unit","test:integration":"jest tests/integration"},"_npmUser":{"name":"onlineapps","email":"npmjs@onlineapps.cz"},"_npmVersion":"9.2.0","description":"Common utilities for both infrastructure services and business services","directories":{},"_nodeVersion":"18.19.1","dependencies":{"redis":"^4.6.0","nodemailer":"^6.9.8","@onlineapps/runtime-config":"1.0.2"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0"},"_npmOperationalInternal":{"tmp":"tmp/service-common_1.0.13_1766578939481_0.3888336168436137","host":"s3://npm-registry-packages-npm-production"}},"1.0.14":{"name":"@onlineapps/service-common","version":"1.0.14","keywords":["microservices","infrastructure","common","utilities"],"author":{"name":"OA Drive Team"},"license":"MIT","_id":"@onlineapps/service-common@1.0.14","maintainers":[{"name":"onlineapps","email":"npmjs@onlineapps.cz"}],"dist":{"shasum":"3a97100fce33bb415d125feac25eb6cb5ffcf06a","tarball":"https://registry.npmjs.org/@onlineapps/service-common/-/service-common-1.0.14.tgz","fileCount":13,"integrity":"sha512-IA3laRvmRx/s5hMWYeQnSKY8rjPjKYT6osTECMXQDu7aEycP8UnUKnwJjnMSvL/YU8uQ3rJi6nSL02ByUPfADg==","signatures":[{"sig":"MEUCIQDHXtibtO6/7sfZNGpzIMP1c8c3lrnL1TitVAa7dHV66gIgMOWbaj/+0iEEUIkaghvbDu4L5JvZ/7DbeN8UiGvvJ38=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":38349},"main":"src/index.js","engines":{"node":">=14.0.0"},"gitHead":"bb75a2eeb554928a03b61bca686970a57694c98e","scripts":{"test":"jest","test:unit":"jest tests/unit","test:integration":"jest tests/integration"},"_npmUser":{"name":"onlineapps","email":"npmjs@onlineapps.cz"},"_npmVersion":"9.2.0","description":"Common utilities for both infrastructure services and business services","directories":{},"_nodeVersion":"18.19.1","dependencies":{"redis":"^4.6.0","nodemailer":"^6.9.8","@onlineapps/runtime-config":"1.0.2"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0"},"_npmOperationalInternal":{"tmp":"tmp/service-common_1.0.14_1766704205661_0.6695115610238758","host":"s3://npm-registry-packages-npm-production"}},"1.0.15":{"name":"@onlineapps/service-common","version":"1.0.15","keywords":["microservices","infrastructure","common","utilities"],"author":{"name":"OA Drive Team"},"license":"MIT","_id":"@onlineapps/service-common@1.0.15","maintainers":[{"name":"onlineapps","email":"npmjs@onlineapps.cz"}],"dist":{"shasum":"83fa0a6bd3d54fbebf1a30da52be0d101c51d521","tarball":"https://registry.npmjs.org/@onlineapps/service-common/-/service-common-1.0.15.tgz","fileCount":13,"integrity":"sha512-fBai7Euost/5yB781MoaCeTD03zfXdsx1dlHIXkHSSJx5flNexPrXl0wiB5Gp0lvx/6kwO7Cg6BvtY1p8lHcGg==","signatures":[{"sig":"MEYCIQClFxE0OnmAzMisZgriRtb95QhmHsqw9Z6BMy0kWXIWqAIhAJ7Cdj96TmgvdpjVo+610CeANamW5jgLiKj/E6+jh6Qf","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":38349},"main":"src/index.js","engines":{"node":">=14.0.0"},"gitHead":"bb75a2eeb554928a03b61bca686970a57694c98e","scripts":{"test":"jest","test:unit":"jest tests/unit","test:integration":"jest tests/integration"},"_npmUser":{"name":"onlineapps","email":"npmjs@onlineapps.cz"},"_npmVersion":"9.2.0","description":"Common utilities for both infrastructure services and business services","directories":{},"_nodeVersion":"18.19.1","dependencies":{"redis":"^4.6.0","nodemailer":"^6.9.8","@onlineapps/runtime-config":"1.0.2"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0"},"_npmOperationalInternal":{"tmp":"tmp/service-common_1.0.15_1766704469652_0.6704673796192784","host":"s3://npm-registry-packages-npm-production"}},"1.0.16":{"name":"@onlineapps/service-common","version":"1.0.16","keywords":["microservices","infrastructure","common","utilities"],"author":{"name":"OA Drive Team"},"license":"MIT","_id":"@onlineapps/service-common@1.0.16","maintainers":[{"name":"onlineapps","email":"npmjs@onlineapps.cz"}],"dist":{"shasum":"313ff2888f0ff62a4c4f9151321ce2371f682da5","tarball":"https://registry.npmjs.org/@onlineapps/service-common/-/service-common-1.0.16.tgz","fileCount":17,"integrity":"sha512-zGeAK0FUss4ALyDWI63HnYyHsEJTcCxsS3NjJUlEbLUmTOlexOoUhj9EUQuW/R76QyppnHdalepjFlkbFJqb0g==","signatures":[{"sig":"MEQCIEqAn4JunlSsjYbM5w1U9p18/4dOXz43wXmtWjBOQI5gAiB0JriBk+Fhp0L+UpjT+uJY4UVGJkt4BogHypATIjb7yw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":50565},"main":"src/index.js","engines":{"node":">=14.0.0"},"gitHead":"12b6448ca983d66793c950eaa7fcaf724bab1834","scripts":{"test":"jest","test:unit":"jest tests/unit","test:integration":"jest tests/integration"},"_npmUser":{"name":"onlineapps","email":"npmjs@onlineapps.cz"},"_npmVersion":"9.2.0","description":"Common utilities for both infrastructure services and business services","directories":{},"_nodeVersion":"18.19.1","dependencies":{"redis":"^4.6.0","nodemailer":"^6.9.8","@onlineapps/runtime-config":"1.0.2"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0"},"_npmOperationalInternal":{"tmp":"tmp/service-common_1.0.16_1774522675097_0.7773086903320887","host":"s3://npm-registry-packages-npm-production"}},"1.0.17":{"name":"@onlineapps/service-common","version":"1.0.17","keywords":["microservices","infrastructure","common","utilities"],"author":{"name":"OA Drive Team"},"license":"MIT","_id":"@onlineapps/service-common@1.0.17","maintainers":[{"name":"onlineapps","email":"npmjs@onlineapps.cz"}],"dist":{"shasum":"551e697f5920a331332e54b3c60992d1bd93be41","tarball":"https://registry.npmjs.org/@onlineapps/service-common/-/service-common-1.0.17.tgz","fileCount":17,"integrity":"sha512-67jTumIRvnWdh/YfeUfQyRXLKQuji3/S2P6CRn0/MKsCJI1MUeW0ybMW7J9l1u5h9tf2hHZhpPKNPJKhQiUzkA==","signatures":[{"sig":"MEUCIQC0dZqL0EKXuhzu8jcSv8D1qfVOYOlM4LGhm9+91Mmw2AIgQ7Jp2aNO5AyBDi4eHrvwmuWK1O3NmNzGZBpMVx306+8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":50565},"main":"src/index.js","engines":{"node":">=14.0.0"},"gitHead":"12b6448ca983d66793c950eaa7fcaf724bab1834","scripts":{"test":"jest","test:unit":"jest tests/unit","test:integration":"jest tests/integration"},"_npmUser":{"name":"onlineapps","email":"npmjs@onlineapps.cz"},"_npmVersion":"9.2.0","description":"Common utilities for both infrastructure services and business services","directories":{},"_nodeVersion":"18.19.1","dependencies":{"redis":"^4.6.0","nodemailer":"^6.9.8","@onlineapps/runtime-config":"1.0.2"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0"},"_npmOperationalInternal":{"tmp":"tmp/service-common_1.0.17_1774523241726_0.6431563564551863","host":"s3://npm-registry-packages-npm-production"}},"1.0.18":{"name":"@onlineapps/service-common","version":"1.0.18","keywords":["microservices","infrastructure","common","utilities"],"author":{"name":"OA Drive Team"},"license":"MIT","_id":"@onlineapps/service-common@1.0.18","maintainers":[{"name":"onlineapps","email":"npmjs@onlineapps.cz"}],"dist":{"shasum":"5f4b931ba363395609e6bf02b39b87873451350d","tarball":"https://registry.npmjs.org/@onlineapps/service-common/-/service-common-1.0.18.tgz","fileCount":17,"integrity":"sha512-3Kzh0ErbTXGltPJBd3NXEEqbrgMPSTmdA28aZoIc6BXATq7BEIPw9qh92TR1d9pIBDna9Ay66eVAtZgczUMnag==","signatures":[{"sig":"MEYCIQDu1DDNZ6lJ6stgdoFXERVk/WeT4LOzfML7XuST/KvCfQIhAMOFcz8M60VJf+X6+SKJlImUUGzlG97im09dsUVUsK0j","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":50576},"main":"src/index.js","engines":{"node":">=14.0.0"},"gitHead":"a059176cdd0d59dee4ef52fd386e74b4f3f06a4d","scripts":{"test":"jest","test:unit":"jest tests/unit","test:integration":"jest tests/integration"},"_npmUser":{"name":"onlineapps","email":"npmjs@onlineapps.cz"},"_npmVersion":"9.2.0","description":"Common utilities for both infrastructure services and business services","directories":{},"_nodeVersion":"18.19.1","dependencies":{"redis":"^4.6.0","nodemailer":"^6.9.8","@onlineapps/runtime-config":"1.0.2"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0"},"_npmOperationalInternal":{"tmp":"tmp/service-common_1.0.18_1775596755994_0.4551938076117017","host":"s3://npm-registry-packages-npm-production"}},"1.0.19":{"name":"@onlineapps/service-common","version":"1.0.19","keywords":["microservices","infrastructure","common","utilities"],"author":{"name":"OA Drive Team"},"license":"MIT","_id":"@onlineapps/service-common@1.0.19","maintainers":[{"name":"onlineapps","email":"npmjs@onlineapps.cz"}],"dist":{"shasum":"615539e4c01dd8d71a54333acda32f9176e52579","tarball":"https://registry.npmjs.org/@onlineapps/service-common/-/service-common-1.0.19.tgz","fileCount":17,"integrity":"sha512-gED7ZBW9PDWm3ZWTF29iqJ/eNgK+xBQb6mJUBXSNGc+b0KUHnRhvfoHFx+ob9kdBhS2DkSvZYdQkd2MhZj8KFg==","signatures":[{"sig":"MEYCIQDjKOVv9z1xDDrlZWQTcrut2GGXLS/ugECjeNyR6u+xuAIhAMLv8+NVnv6BM2+p1eNqFC/4eJ1HVC6F+pykH/2K5zeY","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":51939},"main":"src/index.js","engines":{"node":">=14.0.0"},"gitHead":"f27fcb5d6c3820e84254739acf05d3a104595f33","scripts":{"test":"jest","test:unit":"jest tests/unit","test:integration":"jest tests/integration"},"_npmUser":{"name":"onlineapps","email":"npmjs@onlineapps.cz"},"_npmVersion":"9.2.0","description":"Common utilities for both infrastructure services and business services","directories":{},"_nodeVersion":"18.19.1","dependencies":{"redis":"^4.6.0","nodemailer":"^6.9.8","@onlineapps/runtime-config":"1.0.2"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0"},"_npmOperationalInternal":{"tmp":"tmp/service-common_1.0.19_1776331899353_0.7339579043183091","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@onlineapps/service-common","version":"1.1.0","keywords":["microservices","infrastructure","common","utilities"],"author":{"name":"OA Drive Team"},"license":"MIT","_id":"@onlineapps/service-common@1.1.0","maintainers":[{"name":"onlineapps","email":"npmjs@onlineapps.cz"}],"dist":{"shasum":"e5b9790330c163ca643da67ce5471d81d5ba8a03","tarball":"https://registry.npmjs.org/@onlineapps/service-common/-/service-common-1.1.0.tgz","fileCount":24,"integrity":"sha512-VPrrDXVllryQvXlIaqxa51gXY/yrk4nAxLKiGUnU2d5F59roQZ7ID7hwB6aS/aGikuJGnehpG/2cMiMFyCzL/g==","signatures":[{"sig":"MEUCIQCJfLo/fn6vL/PlUNeQaUFNjAlP2suNqqsaPfgxnnT6zAIgMuY2SnCsg7aCd/u+os6sT7yx2dHMza+dO/WQcIxUO/w=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":74833},"main":"src/index.js","engines":{"node":">=14.0.0"},"gitHead":"eae26908633875582c07ed7bf2ed4809931bdbe3","scripts":{"test":"jest","test:unit":"jest tests/unit","test:integration":"jest tests/integration"},"_npmUser":{"name":"onlineapps","email":"npmjs@onlineapps.cz"},"_npmVersion":"9.2.0","description":"Common utilities for both infrastructure services and business services (JWT auth, Redis/Postgres clients, business errors, runtime config)","directories":{},"_nodeVersion":"18.19.1","dependencies":{"redis":"^4.6.0","nodemailer":"^6.9.8","jsonwebtoken":"^9.0.3","@onlineapps/runtime-config":"1.0.2"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0"},"_npmOperationalInternal":{"tmp":"tmp/service-common_1.1.0_1776414008055_0.789454253297375","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"@onlineapps/service-common","version":"1.1.1","keywords":["microservices","infrastructure","common","utilities"],"author":{"name":"OA Drive Team"},"license":"MIT","_id":"@onlineapps/service-common@1.1.1","maintainers":[{"name":"onlineapps","email":"npmjs@onlineapps.cz"}],"dist":{"shasum":"1153840ac01cdc65e2e23bf845c3cc4539a32eda","tarball":"https://registry.npmjs.org/@onlineapps/service-common/-/service-common-1.1.1.tgz","fileCount":18,"integrity":"sha512-HoyN2YvUjaNTO3p2Bsm3R/+2yVyIR41kuQojwsPVmhtIDiOAmti2IF7Qjp4uo5U/WsZO8RMbiN4Gt8EajfqOYg==","signatures":[{"sig":"MEQCIB8IK4habMD8a37cDI+/xqBejztemqEJICTu8sTGBt6kAiBckRGWDsxqDTBDg00rhl5UeWCY35aAvW9W2airQCbqtQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":51043},"main":"src/index.js","engines":{"node":">=14.0.0"},"gitHead":"eae26908633875582c07ed7bf2ed4809931bdbe3","scripts":{"test":"jest","test:unit":"jest tests/unit","test:integration":"jest tests/integration"},"_npmUser":{"name":"onlineapps","email":"npmjs@onlineapps.cz"},"_npmVersion":"9.2.0","description":"Common utilities for both infrastructure services and business services (JWT auth, Redis/Postgres clients, business errors, runtime config)","directories":{},"_nodeVersion":"18.19.1","dependencies":{"redis":"^4.6.0","nodemailer":"^6.9.8","jsonwebtoken":"^9.0.3","@onlineapps/runtime-config":"1.0.2"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0"},"_npmOperationalInternal":{"tmp":"tmp/service-common_1.1.1_1776414192217_0.9748181987451991","host":"s3://npm-registry-packages-npm-production"}},"1.1.2":{"name":"@onlineapps/service-common","version":"1.1.2","keywords":["microservices","infrastructure","common","utilities"],"author":{"name":"OA Drive Team"},"license":"MIT","_id":"@onlineapps/service-common@1.1.2","maintainers":[{"name":"onlineapps","email":"npmjs@onlineapps.cz"}],"dist":{"shasum":"014322cfd0471b09417515c80c6eb122afeee623","tarball":"https://registry.npmjs.org/@onlineapps/service-common/-/service-common-1.1.2.tgz","fileCount":18,"integrity":"sha512-GhAJ5+wuh3lTdRapMXmjtiz5BH/Qs+F40RAEdwppn4fLYiFQseM7pV+d2Cf56uNgHuIUPbKbhGZKWDQoge/ZaA==","signatures":[{"sig":"MEYCIQCABVKoz2QzQcpma3LS3F+5p34fZYDMNYAQzE/ZuU+DyQIhAJs7jqLX2sG60jKyGvghXJ/Stst3PbMRDGLBXZ01/tUg","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":51043},"main":"src/index.js","engines":{"node":">=14.0.0"},"gitHead":"fd4eddb38f98833071c41167adf2114d2395088a","scripts":{"test":"jest","test:unit":"jest tests/unit","test:integration":"jest tests/integration"},"_npmUser":{"name":"onlineapps","email":"npmjs@onlineapps.cz"},"_npmVersion":"9.2.0","description":"Common utilities for both infrastructure services and business services (JWT auth, Redis/Postgres clients, business errors, runtime config)","directories":{},"_nodeVersion":"18.19.1","dependencies":{"redis":"^4.6.0","nodemailer":"^6.9.8","jsonwebtoken":"^9.0.3","@onlineapps/runtime-config":"1.0.2"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0"},"_npmOperationalInternal":{"tmp":"tmp/service-common_1.1.2_1776453429649_0.4016706441026521","host":"s3://npm-registry-packages-npm-production"}},"1.1.3":{"name":"@onlineapps/service-common","version":"1.1.3","keywords":["microservices","infrastructure","common","utilities"],"author":{"name":"OA Drive Team"},"license":"MIT","_id":"@onlineapps/service-common@1.1.3","maintainers":[{"name":"onlineapps","email":"npmjs@onlineapps.cz"}],"dist":{"shasum":"c4c30cdf4de04c310799027dc4b049ac0ed08e62","tarball":"https://registry.npmjs.org/@onlineapps/service-common/-/service-common-1.1.3.tgz","fileCount":19,"integrity":"sha512-KBuheXza/UwrMfUq1JSuM/rZzuasthZXzBHDSJvGkLvO20BN9bMG1J9fNMq3nIgyI/gAuNgLUNMqtwLb7eP92Q==","signatures":[{"sig":"MEUCIDGvXp1DeJ0rpVYpKCtRPSTZiQh0I3zTNjEDNiJZw8u8AiEAhNEjk4YTo1/Dwzt16aB8id6jFjn7MX0uFwK7NCntYHo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":54713},"main":"src/index.js","engines":{"node":">=14.0.0"},"gitHead":"ad1a7aa7638d6005c0af5b89680bec8a96ba4c2f","scripts":{"test":"jest","test:unit":"jest tests/unit","test:integration":"jest tests/integration"},"_npmUser":{"name":"onlineapps","email":"npmjs@onlineapps.cz"},"_npmVersion":"11.12.1","description":"Common utilities for both infrastructure services and business services (JWT auth, Redis/Postgres clients, business errors, runtime config)","directories":{},"_nodeVersion":"25.9.0","dependencies":{"redis":"^4.6.0","nodemailer":"^6.9.8","jsonwebtoken":"^9.0.3","@onlineapps/runtime-config":"1.0.2"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0"},"_npmOperationalInternal":{"tmp":"tmp/service-common_1.1.3_1784914184517_0.27141847574845857","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@onlineapps/service-common","version":"1.2.0","keywords":["microservices","infrastructure","common","utilities"],"author":{"name":"OA Drive Team"},"license":"MIT","_id":"@onlineapps/service-common@1.2.0","maintainers":[{"name":"onlineapps","email":"npmjs@onlineapps.cz"}],"dist":{"shasum":"b4e41af1ef64270152eeaafec3700aa43f4dcb4f","tarball":"https://registry.npmjs.org/@onlineapps/service-common/-/service-common-1.2.0.tgz","fileCount":22,"integrity":"sha512-WWLZp4PGOXL5DdaF2RpY8g02dsw2mJHEwG/6+9MbfhWUjqnmlJZSVSJmKo/ab+/mm4d/IHXmkth821sfF/JcgA==","signatures":[{"sig":"MEYCIQDaAbzwr3cz0rHQxbjUYIR9nSDw1htTd2JVCmcvBTwGnQIhAP6QoZ4EDJCxFFThwOjMEqJCZROIw0goNGjz6+Fl/+TM","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":85868},"main":"src/index.js","engines":{"node":">=14.0.0"},"gitHead":"00d438f79fd628e31833d2dc1a7144f1715e05a0","scripts":{"test":"jest","test:unit":"jest tests/unit","test:integration":"jest tests/integration"},"_npmUser":{"name":"onlineapps","email":"npmjs@onlineapps.cz"},"_npmVersion":"11.12.1","description":"Common utilities for both infrastructure services and business services (JWT auth, Redis/Postgres clients, business errors, runtime config)","directories":{},"_nodeVersion":"25.9.0","dependencies":{"redis":"^4.6.0","nodemailer":"^6.9.8","jsonwebtoken":"^9.0.3","@onlineapps/runtime-config":"1.0.2"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0"},"_npmOperationalInternal":{"tmp":"tmp/service-common_1.2.0_1787010107378_0.3306564540135628","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"@onlineapps/service-common","version":"2.0.0","keywords":["microservices","infrastructure","common","utilities"],"author":{"name":"OA Drive Team"},"license":"MIT","_id":"@onlineapps/service-common@2.0.0","maintainers":[{"name":"onlineapps","email":"npmjs@onlineapps.cz"}],"dist":{"shasum":"fe0ed9abecf70affd07139cbb2190f096c453ba6","tarball":"https://registry.npmjs.org/@onlineapps/service-common/-/service-common-2.0.0.tgz","fileCount":21,"integrity":"sha512-WanESlfm0+SYx/3UtlYexCYCxXhh7Oady97ZrmczqnAO8WP0qiLeCivjV1GDuLwr9GGV83tRUXTjQbsYW/xiuQ==","signatures":[{"sig":"MEYCIQDhnJTnsgGrTgwnsmRGE3oEBfz0ML1b4v7tJVnldUI0WAIhANjHjT9GBGHrDUZag9J87rKXtcT03oeTI/qjWJWgqfPt","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":78751},"main":"src/index.js","engines":{"node":">=14.0.0"},"gitHead":"26b81ea2bc3fbd6b9f597a08216f98481b96f3a8","scripts":{"test":"jest","test:unit":"jest tests/unit","test:integration":"jest tests/integration"},"_npmUser":{"name":"onlineapps","email":"npmjs@onlineapps.cz"},"_npmVersion":"11.12.1","description":"Common utilities for both infrastructure services and business services (JWT auth, Redis client, business errors, runtime config)","directories":{},"_nodeVersion":"25.9.0","dependencies":{"redis":"^4.6.0","nodemailer":"^6.9.8","jsonwebtoken":"^9.0.3","@onlineapps/runtime-config":"1.0.2"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0"},"_npmOperationalInternal":{"tmp":"tmp/service-common_2.0.0_1787958333469_0.9764339073601445","host":"s3://npm-registry-packages-npm-production"}},"2.0.1":{"name":"@onlineapps/service-common","version":"2.0.1","keywords":["microservices","infrastructure","common","utilities"],"author":{"name":"OA Drive Team"},"license":"MIT","_id":"@onlineapps/service-common@2.0.1","maintainers":[{"name":"onlineapps","email":"npmjs@onlineapps.cz"}],"dist":{"shasum":"22e2bd51c7f278fe6e3b495dfcded6c68289ba9c","tarball":"https://registry.npmjs.org/@onlineapps/service-common/-/service-common-2.0.1.tgz","fileCount":21,"integrity":"sha512-OUNxRsyyyyMuc5NfVuTxIGRxRhD8MVLsRI5O7VqCf+NgjyFbQJKcite5t38Khm/6/7nISe1e8Z5BXmDBlap2pQ==","signatures":[{"sig":"MEQCIEdY9JsvtVKPviNH5mJzImy1L8rIbeRjQpAmg+K4i04VAiAuO6hRUH6l23ROvSq4qwqobODctEpxN6KQJh4j9hWdsw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":78851},"main":"src/index.js","engines":{"node":">=14.0.0"},"gitHead":"1e5aa1575269c5b96c915dbc8746f00896157a2c","scripts":{"test":"jest","test:all":"npm run test && npm run test:integration","test:unit":"jest tests/unit","test:integration":"jest --config=jest.integration.config.js"},"_npmUser":{"name":"onlineapps","email":"npmjs@onlineapps.cz"},"_npmVersion":"11.12.1","description":"Common utilities for both infrastructure services and business services (JWT auth, Redis client, business errors, runtime config)","directories":{},"_nodeVersion":"25.9.0","dependencies":{"redis":"^4.6.0","nodemailer":"^6.9.8","jsonwebtoken":"^9.0.3","@onlineapps/runtime-config":"1.0.3"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0"},"_npmOperationalInternal":{"tmp":"tmp/service-common_2.0.1_1788035834424_0.27446095510304747","host":"s3://npm-registry-packages-npm-production"}},"3.0.0":{"name":"@onlineapps/service-common","version":"3.0.0","keywords":["microservices","infrastructure","common","utilities"],"author":{"name":"OA Drive Team"},"license":"MIT","_id":"@onlineapps/service-common@3.0.0","maintainers":[{"name":"onlineapps","email":"npmjs@onlineapps.cz"}],"oa":{"category":"runtime"},"dist":{"shasum":"37baf1b07c67415c6dad5b75048894a37aac8e50","tarball":"https://registry.npmjs.org/@onlineapps/service-common/-/service-common-3.0.0.tgz","fileCount":21,"integrity":"sha512-/wEJO7gBFCMkvI613r/gD/0giYLLLyIzhrgbvyspUJH0iclmfsaBS5egC0flJihmB2jGgHKMxJ7d9P+joyB+TA==","signatures":[{"sig":"MEUCIAmxX1ypYhwk2/l0PomYcKBaLcXy19zFyFrVonkF6zspAiEAiobFHDQuitfkNlqybbZGLvMjH8yqJq7szy4tusJszMU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDez6aHg6RXRG+A371LuYPGAEdHd4zogP2k6CYMVw8gzgIhAOMxFwvVxAqwnonpfsHCI/GDBp8Qh6RfioDL3tBmlf56","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":158120},"main":"src/index.js","engines":{"node":">=24.0.0 <25"},"gitHead":"af8c2ce93eaa0f8ea6330b2f309102988f133b99","scripts":{"test":"npm run test:unit && npm run test:integration","test:unit":"jest tests/unit","test:integration":"jest --config=jest.integration.config.js"},"_npmUser":{"name":"onlineapps","email":"npmjs@onlineapps.cz"},"_npmVersion":"11.12.1","description":"Common utilities for both infrastructure services and business services (JWT auth, Redis client, business errors, runtime config)","directories":{},"_nodeVersion":"25.9.0","dependencies":{"redis":"^4.6.0","nodemailer":"^10.0.9","jsonwebtoken":"^9.0.3","@onlineapps/runtime-config":"1.1.0","@onlineapps/logger-contract":"1.1.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0"},"_npmOperationalInternal":{"tmp":"tmp/service-common_3.0.0_1789412041540_0.36655157099716384","host":"s3://npm-registry-packages-npm-production"}},"3.0.1":{"name":"@onlineapps/service-common","version":"3.0.1","keywords":["microservices","infrastructure","common","utilities"],"author":{"name":"OA Drive Team"},"license":"MIT","_id":"@onlineapps/service-common@3.0.1","maintainers":[{"name":"onlineapps","email":"npmjs@onlineapps.cz"}],"oa":{"category":"runtime"},"dist":{"shasum":"dfadf3c2c635e5a23dc730191408664d91fede10","tarball":"https://registry.npmjs.org/@onlineapps/service-common/-/service-common-3.0.1.tgz","fileCount":19,"integrity":"sha512-8m+ZJSH/A5ET1tRJzsQ4ONniRnU6dI1pfFRMODUp64PTRiYxDgaYT/F+EfNfehhOVDVv5XZiLs4zgu/qDvDS4Q==","signatures":[{"sig":"MEQCICaKIy2oTw0OiJm0MoREIdhvlps/k6g6E71RiIIZlwVdAiAsOdsW+41b6yoH/Pj0165VcBmeZIgwO+B7GXkr8tGm7Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDQ1KiRVnTkLiq6InOXVqwdSF4N9X2iXYew3jmu+q4rcQIgamBbmSKXXzXew3YKC+ARcRmaP1o05wPhelrxxrUj9C8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":157452},"main":"src/index.js","engines":{"node":">=24.0.0 <25"},"gitHead":"356b23a61c7a97b714129ffced6c41e142db054f","scripts":{"test":"npm run test:unit && npm run test:integration","test:unit":"jest tests/unit","test:integration":"jest --config=jest.integration.config.js"},"_npmUser":{"name":"onlineapps","email":"npmjs@onlineapps.cz"},"_npmVersion":"11.12.1","description":"Common utilities for both infrastructure services and business services (JWT auth, Redis client, business errors, runtime config)","directories":{},"_nodeVersion":"25.9.0","dependencies":{"redis":"^4.6.0","nodemailer":"^10.0.9","jsonwebtoken":"^9.0.3","@onlineapps/runtime-config":"1.2.0","@onlineapps/logger-contract":"1.3.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0"},"_npmOperationalInternal":{"tmp":"tmp/service-common_3.0.1_1789477242295_0.05145984703115403","host":"s3://npm-registry-packages-npm-production"}},"3.0.2":{"name":"@onlineapps/service-common","version":"3.0.2","keywords":["microservices","infrastructure","common","utilities"],"author":{"name":"OA Drive Team"},"license":"MIT","_id":"@onlineapps/service-common@3.0.2","maintainers":[{"name":"onlineapps","email":"npmjs@onlineapps.cz"}],"oa":{"category":"runtime"},"dist":{"shasum":"b37c60ae06146aa5b4f8f3fef35d7bcac57746a4","tarball":"https://registry.npmjs.org/@onlineapps/service-common/-/service-common-3.0.2.tgz","fileCount":19,"integrity":"sha512-4RVH3CfpXIyVLOI6zjkpx9ZK3a1fLZGhNL3xpYFAUsFftrGWG56WkT3W7Mx2ftazjnGHJ2uKgSbV4nfb2Qm6Ig==","signatures":[{"sig":"MEUCIQCtmf3y+tniFexwpG8qPbM+ZXxFl9TJ1MYl7o3tRVyKWQIgNe5NvGUr5DymoXqPL7BjsWOhUNH0C5whB6RrPndrED0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQCL6X58IEPhPha0hDGGBtyXCaj5Qx+kTnId+GncOaMRxgIhAPa25JypH3y5WPeCXeIbn7r22h/3ra0nez2Jro3mbSrz","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":157479},"main":"src/index.js","engines":{"node":">=24.0.0 <25"},"gitHead":"e80046a96c73223be9b7d8292ef03054a14d17c6","scripts":{"test":"npm run test:unit && npm run test:integration","test:unit":"jest tests/unit","test:integration":"jest --config=jest.integration.config.js"},"_npmUser":{"name":"onlineapps","email":"npmjs@onlineapps.cz"},"_npmVersion":"11.12.1","description":"Common utilities for both infrastructure services and business services (JWT auth, Redis client, business errors, runtime config)","directories":{},"_nodeVersion":"25.9.0","dependencies":{"redis":"^4.6.0","nodemailer":"^10.0.9","jsonwebtoken":"^9.0.3","@onlineapps/runtime-config":"1.2.0","@onlineapps/logger-contract":"2.0.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0"},"_npmOperationalInternal":{"tmp":"tmp/service-common_3.0.2_1789493510213_0.6718526192982273","host":"s3://npm-registry-packages-npm-production"}},"4.0.0":{"oa":{"category":"runtime"},"_id":"@onlineapps/service-common@4.0.0","dist":{"shasum":"0304acff65ba98ee608fc73f066668e901f85818","tarball":"https://registry.npmjs.org/@onlineapps/service-common/-/service-common-4.0.0.tgz","fileCount":19,"integrity":"sha512-wH8bKf7B5oUPt1YqIl8SwuIao4PaIHr3WEIYAxeWrIcgJUI4JmGTlMHpjAOBKJhi4QvplIkGUEqRsfTKtrd5og==","signatures":[{"sig":"MEYCIQDvammrJhYcBrfjcqdANEs3QBhY2jeGp3RfwsQy4LDTiAIhALYsrBfNon8wKPWxeqrMwCMUhgTJ1c+o3p0xPapnizjc","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDR5wiELs2zhbdoJA/oKSaHAgSEJX4yGo8gKhH1lbMZwQIgPKNM6+ETL6g7zKGp8yLA6inifuHYcYeZlGqKEqo5PUw="}],"unpackedSize":165195},"main":"src/index.js","name":"@onlineapps/service-common","author":{"name":"OA Drive Team"},"engines":{"node":">=24.0.0 <25"},"gitHead":"51e68c3064fec755e07e68b7836a5bcc705fee39","license":"MIT","scripts":{"test":"npm run test:unit && npm run test:integration","test:unit":"jest tests/unit","test:integration":"jest --config=jest.integration.config.js"},"version":"4.0.0","_npmUser":{"name":"onlineapps","email":"npmjs@onlineapps.cz"},"keywords":["microservices","infrastructure","common","utilities"],"_npmVersion":"11.12.1","description":"Common utilities for both infrastructure services and business services (JWT auth, Redis client, business errors, runtime config)","directories":{},"maintainers":[{"name":"onlineapps","email":"npmjs@onlineapps.cz"}],"_nodeVersion":"25.9.0","dependencies":{"redis":"^4.6.0","nodemailer":"^10.0.9","jsonwebtoken":"^9.0.3","@onlineapps/runtime-config":"1.2.0","@onlineapps/logger-contract":"2.0.0"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/service-common_4.0.0_1789634619703_0.6354578626195599"}}},"time":{"created":"2025-11-26T01:19:40.398Z","modified":"2026-09-17T08:43:40.048Z","1.0.0":"2025-11-26T01:19:40.693Z","1.0.1":"2025-11-27T22:02:46.865Z","1.0.2":"2025-12-02T09:36:51.294Z","1.0.3":"2025-12-02T12:01:55.378Z","1.0.4":"2025-12-02T17:18:29.259Z","1.0.5":"2025-12-03T07:09:40.432Z","1.0.6":"2025-12-22T10:11:50.721Z","1.0.7":"2025-12-22T11:23:22.901Z","1.0.8":"2025-12-22T14:44:21.441Z","1.0.9":"2025-12-22T14:52:56.240Z","1.0.10":"2025-12-22T14:58:15.635Z","1.0.11":"2025-12-22T15:00:51.644Z","1.0.12":"2025-12-22T15:22:21.268Z","1.0.13":"2025-12-24T12:22:19.617Z","1.0.14":"2025-12-25T23:10:05.824Z","1.0.15":"2025-12-25T23:14:29.792Z","1.0.16":"2026-03-26T10:57:55.234Z","1.0.17":"2026-03-26T11:07:21.907Z","1.0.18":"2026-04-07T21:19:16.140Z","1.0.19":"2026-04-16T09:31:39.494Z","1.1.0":"2026-04-17T08:20:08.206Z","1.1.1":"2026-04-17T08:23:12.370Z","1.1.2":"2026-04-17T19:17:09.832Z","1.1.3":"2026-07-24T17:29:44.681Z","1.2.0":"2026-08-17T23:41:47.536Z","2.0.0":"2026-08-28T23:05:33.620Z","2.0.1":"2026-08-29T20:37:14.571Z","3.0.0":"2026-09-14T18:54:01.622Z","3.0.1":"2026-09-15T13:00:42.388Z","3.0.2":"2026-09-15T17:31:50.318Z","4.0.0":"2026-09-17T08:43:39.804Z"},"author":{"name":"OA Drive Team"},"license":"MIT","keywords":["microservices","infrastructure","common","utilities"],"description":"Common utilities for both infrastructure services and business services (JWT auth, Redis client, business errors, runtime config)","maintainers":[{"name":"onlineapps","email":"npmjs@onlineapps.cz"}],"readme":"> Status: current\n> Owns: the utilities infrastructure and business services share — JWT verification and tenant context, the Redis client, env and config readers, and the scope rules; redakce se sem jen re-exportuje z `@onlineapps/logger-contract`, který ji vlastní\n\n<!-- BEGIN GENERATED: library-uniform — regenerate: npx oa-sync-template readme-uniform --all -->\nUniform: [library/runtime](../connector/conn-orch-validator/manifests/library.manifest.json)\n\nDuty sections that apply:\n\n- `all`: L-MAIN, L-ENGINES, L-TESTS, L-TEST-SCRIPT, L-PACK-TESTS, L-PINS, L-NO-FILE-RANGE, L-CHANGELOG, L-README, L-README-REGION, L-CONSUMER\n- `runtime`: L-RUNTIME-CLIENT\n<!-- END GENERATED: library-uniform -->\n\n# @onlineapps/service-common\n\nCommon utilities for both infrastructure services and business services in OA Drive.\n\n## Purpose\n\nThis library provides shared functionality that is used across the entire system, by both infrastructure services (Gateway, Registry, Validator, etc.) and business services (hello-service, etc.).\n\n## Installation\n\n```bash\nnpm install @onlineapps/service-common\n```\n\n## Usage\n\n### Wait for Infrastructure Ready\n\nWait for all infrastructure services to be ready before creating queues:\n\nThe same call for infrastructure and business services — the timings are not a\nper-caller decision, they come from the environment (see **API** below):\n\n```javascript\nconst { waitForInfrastructureReady } = require('@onlineapps/service-common');\n\nawait waitForInfrastructureReady({\n  redisUrl: process.env.REDIS_URL,\n  logger: logger\n});\n\n// Now safe to create queues\n```\n\nPass `maxWait` / `checkInterval` only to override the environment for one call;\nhard-coding them in a service is how the deployed timings and the documented\nones drift apart.\n\n## API\n\n### `waitForInfrastructureReady(options)`\n\nWaits for all infrastructure services to be reported as healthy by Registry.\n\n**Options:**\n- `redisUrl` (string): Redis URL\n- `maxWait` (number): Maximum wait time in ms — optional override of `INFRASTRUCTURE_HEALTH_WAIT_MAX_TIME`\n- `checkInterval` (number): Check interval in ms — optional override of `INFRASTRUCTURE_HEALTH_WAIT_CHECK_INTERVAL`\n- `logger` (Object): **Required** logger implementing all four contract methods —\n  `info`, `warn`, `error`, `debug` (`@onlineapps/logger-contract`). Validated up front,\n  no console fallback, no shape sniffing. See **The logger contract** below.\n\n**Returns:** `Promise<boolean>` - True if all infrastructure services are ready\n\n**Throws:** `Error` - If timeout is reached\n\n**Where the timings come from** (`src/config.js`, resolved by\n`@onlineapps/runtime-config`): explicit option → environment variable →\nmodule-owned default. The default values themselves live in exactly one place,\n`src/defaults.js` (`infrastructureHealthWaitMaxTimeMs`,\n`infrastructureHealthWaitCheckIntervalMs`) — read them there rather than from a\nnumber copied into this file, which is how this section previously came to\nadvertise timings the code had not used for months.\n\n**Environment Variables:**\n- `REDIS_URL` - Redis connection URL\n- `INFRASTRUCTURE_HEALTH_WAIT_MAX_TIME` - Maximum wait time in ms\n- `INFRASTRUCTURE_HEALTH_WAIT_CHECK_INTERVAL` - Check interval in ms\n\n### `getInfrastructureHealthConfig()` — what this package owns, and what it does not\n\nThe function resolves the eight infrastructure-health timings this package owns:\n`queueName`, `publishInterval`, `waitMaxTime`, `waitCheckInterval`,\n`healthCheckTimeout`, `cleanupInterval`, `queueWaitMaxTime`,\n`queueWaitCheckInterval`.\n\n**`redisKeyTTL` is not among them, on purpose.** The TTL of an\ninfrastructure-health key in Redis is the registry's value: the registry is the\nonly code that writes that key, and the value only makes sense beside the\nthreshold it has to outlive (`gracePeriod`), which this package does not declare.\nUntil d.391 the block carried a second declaration — `INFRASTRUCTURE_HEALTH_REDIS_TTL`\nwith a default of 30 s — that no code read and that contradicted the 90 s the\nregistry actually runs on. One fact, one owner\n(`.claude/rules/change-discipline.md` § One rail per concern); the owner is\n`infra/api_services_registry/src/config/config.js`.\n\n### The logger contract\n\nEvery entry point here that logs demands the same thing, stated once in\n`@onlineapps/logger-contract`: an object with `info`, `warn`, `error` and `debug`,\nvalidated at the entry point (architecture-principles.md §3, §4). There is no\nconsole fallback, and no sniffing of the logger's shape.\n\n**3.0.0 is where that became true of the two infrastructure waits.** Until then\nthey inspected the object they were given — winston's `log({ message, level })`,\nthen `info`, then the logger as a bare function — and picked a rail. The cascade\nwas a fallback chain, its `function` rail had no caller in the workspace, and the\norder alone decided the outcome: a caller passing `{ info, log }` had every\nmessage rendered as `[object Object]`, because the winston rail was tried first\nand its `log` was not winston's.\n\nWhat a caller has to change:\n\n| Caller | Was | Now |\n|---|---|---|\n| `@onlineapps/service-wrapper` `_waitForInfrastructureGate` | `{ info, log }` | four-method delegating logger — done |\n| `api_gateway` `index.js` | `{ log, info }` wrapper | pass the service logger itself (`createInfrastructureLogger` already implements all four) |\n| `api_delivery_dispatcher` `DeliveryDispatcher.js` | `{ log, info }` wrapper | same |\n| `api_monitoring` consumer | `console` | unchanged — `console` implements all four |\n\nThe two wrappers exist only to prefix messages, and both waits already prefix\ntheir own; the prefix now rides on the logger (`src/infrastructure/prefixedLogger.js`),\nso a message written by a neighbour these waits hand the logger to — `connectRedis` —\ncarries the same mark without knowing about it.\n\n### JWT validation — `createJwtValidator(options)`\n\nExpress middleware. On success it sets `req.auth = { person_uuid, person_id,\nemail, tenants }` and calls `next()`; every refusal is a JSON body with a `code`.\n\n| Option | Required | What it is |\n|---|---|---|\n| `logger` | yes | logger with `warn()` and `error()` |\n| `secret` | yes | the HMAC-SHA256 signing secret, resolved by the caller at boot |\n| `readRolesVersion` | yes | `(personId) => Promise<number\\|null>` — the roles-version marker in epoch milliseconds, or `null` when none exists |\n| `excludePaths` | no | paths that pass through without a token |\n\nAll three required options are validated at CONSTRUCTION: an instance that could\nnot verify a token, or could not run the roles-version check, never exists.\n\n#### The roles-version reader\n\nThe validator does not know Redis. It used to take a `redisClient` and call\n`client.isOpen` / `client.get()` — the node-redis v4 API, which meant a service\nwhose client is `ioredis` could not be given the check at all. The reader is a\nfunction now, so every client shape can implement it:\n\n```javascript\nconst { createJwtValidator, ROLES_VERSION_PREFIX } = require('@onlineapps/service-common');\n\nconst readRolesVersion = async (personId) => {\n  const raw = await redis.get(`${ROLES_VERSION_PREFIX}${personId}`);\n  return raw === null ? null : Number(raw);\n};\n\napp.use(createJwtValidator({ logger, secret, readRolesVersion, excludePaths: [] }));\n```\n\nThe key is the FULL, prefixed one — `state:meta:person:roles_version:<person_id>`,\nwhich is what `ROLES_VERSION_PREFIX` carries. The marker is a projection of the\nmeta service state, written by biz-meta through a connector that adds the\n`state:meta:` prefix, so a reader asking for the bare `person:roles_version:<id>`\ngets `null` for every person and the validator answers `TOKEN_STALE` never (owner\ndecision 2026-09-14, `docs/governance/confirmations/redis-state-prefix.md` 002).\n\nThe check is **fail-closed**: if the reader rejects, or answers with anything but\na finite number or `null`, the request is refused with `503`\n`ROLES_VERSION_CHECK_UNAVAILABLE` — the client did nothing wrong, the platform\ncould not verify (`docs/governance/confirmations/jwt-stale-check-fail-closed.md`\n001). A token with no `person_id` claim is refused earlier, with `401`\n`TOKEN_PERSON_ID_MISSING`, before the reader is consulted (002).\n\n#### Units — `iat` counts seconds, the marker milliseconds\n\n`iat` is a whole number of seconds rounded down (RFC 7519 §4.1.6); the marker is\nepoch milliseconds (`docs/standards/redis-key-contract.md`). The comparison\nhappens in the coarser unit: the marker is floored to whole seconds, so a token\nissued in the SAME second as the role change is current. Compared in\nmilliseconds it was not — `addMembership` writes the marker and the new token is\nsigned milliseconds later, inside that same second, so the token that already\ncarried the new roles was answered `TOKEN_STALE`, and so was the one the refresh\nproduced.\n\n### Scoped registry — `isVisible` / `sqlVisible` and friends\n\nThe single home of the registry visibility rule: *a registry row is visible to a\ncaller `{tenant_id, workspace_id}` iff it is `system`, or it is owned by exactly\nthat workspace.* Business services must not hand-write this predicate.\n\nNormative contract: [`api/docs/biz/30-operations/scoped-registry.md`](../../docs/biz/30-operations/scoped-registry.md).\n\n| Export | Purpose |\n|---|---|\n| `isVisible(record, ctx)` | pure predicate — works over SQL rows, Redis, config files, connector responses |\n| `filterVisible(records, ctx)` | apply the predicate to a collection |\n| `pickVisibleOne(records, ctx)` | read-time resolution; throws on 0 or >1 visible rows (no precedence, no `LIMIT 1`) |\n| `sqlVisible(alias)` | the same rule as a `WHERE` fragment, for DB pushdown |\n| `sqlVisibleParams(ctx)` | named replacements (`__vis_tid`, `__vis_wid`) for that fragment |\n| `assertScopeTriple(record)` | write-time invariant: `scope='system' ⟺ owner columns NULL` |\n| `assertUniqueInScope(existingVisible, candidate, keyFn)` | write-time collision guard — refuses a definition that would shadow a visible one |\n\n```js\nconst { sqlVisible, sqlVisibleParams } = require('@onlineapps/service-common');\n\nconst rows = await sequelize.query(\n  `SELECT uuid, code FROM ing_connector c WHERE ${sqlVisible('c')}`,\n  { replacements: sqlVisibleParams(ctx), type: QueryTypes.SELECT }\n);\n```\n\nThe predicate is the source of truth; the SQL fragment is a pushdown\noptimization. A parity unit test evaluates the fragment in-memory with SQL\nthree-valued logic and fails if the two renderings ever disagree.\n\nAll helpers fail fast: a missing or non-integer `tenant_id`/`workspace_id`\nthrows rather than degrading into \"system rows only\", which would silently hide\na workspace's own definitions.\n\n### Registry reader — `createRegistryReader(options)`\n\nThe single Redis-backed reader of Service Registry specifications. The Registry\n(`api_services_registry`) is the only writer; every consumer — infrastructure or\nbusiness — reads the same two key shapes:\n\n| Key | Type | Content |\n|---|---|---|\n| `<keyPrefix>services` | HASH | per-service summary |\n| `<keyPrefix>service:<name>:spec` | STRING | full service specification |\n\nNormative contract: [`api/docs/biz/30-operations/registration-wire.md`](../../docs/biz/30-operations/registration-wire.md)\n§4 (storage model) and §7 (consumer contract); namespace per\n[`api/docs/standards/redis-key-contract.md`](../../docs/standards/redis-key-contract.md).\n\n```js\nconst { createRegistryReader } = require('@onlineapps/service-common');\n\nconst reader = createRegistryReader({\n  keyPrefix: requireEnv('REDIS_REGISTRY_KEY_PREFIX'), // REQUIRED — never assumed\n  redisUrl: requireEnv('REDIS_URL'),                  // or: client: <connected node-redis v4 client>\n  logger                                              // REQUIRED — info/warn/error/debug, no console fallback\n});\nawait reader.connect();\n\nconst op = await reader.getOperation('biz-invoicing', 'create-invoice');\n```\n\n| Export | Purpose |\n|---|---|\n| `connect()` | opens the owned connection through `connectRedis` (hard `connectTimeoutMs` ceiling — one rail: `src/redisClient.js`), or validates an injected client |\n| `getServiceSpec(name)` | full spec, or `null` when the service is not registered |\n| `getOperation(name, key)` | one operation record, or `null` |\n| `listSummary()` | parsed `<keyPrefix>services` hash |\n| `listAll()` | `[{ name, summary, spec }]` for every summarised service |\n| `listWorkspaceScopedServices()` | `[{ name, version, description }]` for `workspaceScoped === true`, sorted by name; `version`/`description` come from `spec.metadata` (§4: `metadata` is required) |\n| `invalidateCache(name?)` | drop one service or the whole cache — for `registry.changes` listeners |\n| `close()` | quits the connection **only** when the reader created it |\n\n**Connection ownership:** pass exactly one of `redisUrl` (the reader owns and\ncloses the client) or `client` (the caller owns it; `close()` never quits it).\n\n**Failure model — an outage is not a cache miss:**\n\n| Situation | Answer |\n|---|---|\n| key absent | `null`, remembered for `negativeTtlMs` (default 30 s) |\n| Redis transport error | the error **propagates** — never `null` |\n| unparseable JSON | throws, naming the key |\n| Redis unreachable at startup | `connect()` rejects after `connectTimeoutMs` (default 15 s) |\n\n`keyPrefix` and `logger` are mandatory and `ttlMs` / `negativeTtlMs` /\n`connectTimeoutMs` are validated: an invalid value throws instead of being\nsilently replaced by the module default (`src/defaults.js` owns the defaults).\n`logger` is the platform contract — `info`, `warn`, `error`, `debug`\n(`@onlineapps/logger-contract`) — checked at construction, because the Redis\nclient the reader owns logs through the same object. A failed `connect()` on the\nowned path raises the `connectRedis` contract message, which names the endpoint\nwith the userinfo stripped and keeps the original error as `cause`.\n\n### Env readers — `requireNumberEnv` vs `requireFloatEnv`\n\nA number from the environment is read by exactly ONE rail:\n`@onlineapps/runtime-config`. The helpers here only hand it a schema and return\nwhat it resolved — neither the coercion nor the message for a malformed value is\nowned by service-common.\n\n| Helper | Resolver type | For |\n|---|---|---|\n| `requireNumberEnv(name, description, options)` | `number` | whole numbers — ports, counts, budgets, ms/second/minute intervals |\n| `requireFloatEnv(name, description, options)` | `float` | ratios and factors, e.g. a completion threshold in `0.0-1.0` |\n| `requireBoolEnv(name, description, options)` | — | the literal `true` / `false` |\n| `requireEnv(name, description, options)` | — | a string |\n\n### `options.file` — who writes the `Fix:` sentence\n\n`architecture-principles.md` §5 requires a missing key to be reported with\n`Fix: set <ENV_KEY> in env-active/*.env`. Since d.399 **the helper composes that\nsentence**, for every caller and in one shape. Before it, the helper appended\nonly `description`, so the sentence existed exactly where a caller had typed it\ninto that description by hand — six call sites in\n`infra/api_delivery_endpoint/src/config.js`, and nowhere else on the platform.\n\n```javascript\nrequireEnv('REDIS_URL', 'Redis connection URL', { file: 'shared.env' });\n// [ServiceConfig] Missing environment variable - REDIS_URL is required.\n// Redis connection URL Fix: set REDIS_URL in config/env-active/shared.env.\n\nrequireEnv('REDIS_URL', 'Redis connection URL');\n// … Fix: set REDIS_URL in env-active/*.env (or pass explicit config).\n```\n\n`file` is a **bare file name** — the helper writes the `config/env-active/`\nprefix, and a value carrying a path or a different suffix is refused at the call\nitself, not the day the key goes missing. It is an INPUT and never a derivation:\n`api/config/shared-env.json` owns the shared key set, but only build-time tooling\n(`oa-sync-template shared-env`) reads it — the file is absent from a service's\nruntime, and a library hunting for it through `__dirname`/cwd would break\nprinciple 1. So the call site names the file and review checks it against the\ndeclaration; without one, the sentence is §5's own generic wording, which is\ncorrect rather than missing.\n\nChoosing between `number` and `float` is a **property of the key**, not of the\nhelper, so it belongs at the call site: a fractional value read as `number`\nloses its fraction today, and stops the boot once the whole-number resolver\n(d.253) is pinned.\n\n⚠️ Open cascade: `TRACE_COMPLETION_RATE_THRESHOLD` (api_monitoring\n`index.js:211`, value `0.8`) must move to `requireFloatEnv` in the same cascade\ncommit as the service-common pin — otherwise monitoring either loses the alert\nsilently (today) or fails to boot (after the wave).\n\nA missing variable is reported by all four in the same shape:\n`[ServiceConfig] Missing environment variable - <NAME> is required. <description>`.\n\n### Monitoring fallback e-mail — `sendMonitoringFailFallbackEmail(subject, text, html, logger)`\n\nThe last reporting channel: when the platform's own monitoring path cannot carry\nan alert, this sends it by SMTP. Every outcome is swallowed into the boolean\nreturn, so the injected `logger` is the only record of what happened — there is\nno console fallback and no throw for a refused send.\n\n**One shared connection.** The transport is pooled (`pool: true`). A burst of\nalerts used to cost one TCP+TLS+AUTH per mail, which is what broke on\n2026-09-11: seven `service_down` episodes in one second, `421 4.7.0 … too many\nconnections` 18×, 12 alerts never delivered. The bounds are declared config, not\nliterals, and their owner defaults are derived from the relay limits recorded in\n[`alert-smtp-relay` 003](../../docs/governance/confirmations/alert-smtp-relay.md)\n(20 connections / 10 AUTH per 60 s):\n\n| Key | Env | Default | Why that value |\n|---|---|---|---|\n| `infraReportSmtpMaxConnections` | `INFRA_REPORT_SMTP_MAX_CONNECTIONS` | `1` | one connection per burst = one AUTH, not one per mail |\n| `infraReportSmtpMaxMessages` | `INFRA_REPORT_SMTP_MAX_MESSAGES` | `100` | messages carried before nodemailer recycles the connection |\n| `infraReportSmtpRateDeltaMs` | `INFRA_REPORT_SMTP_RATE_DELTA` | `60000` | the window the relay's limits are counted in |\n| `infraReportSmtpRateLimit` | `INFRA_REPORT_SMTP_RATE_LIMIT` | `10` | the AUTH limit, so even one connection per message stays inside it |\n| `infraReportSmtpMaxAttempts` | `INFRA_REPORT_SMTP_MAX_ATTEMPTS` | `3` | bounded retry; below `1` is a fail-fast error, not \"no retries\" |\n| `infraReportSmtpRetryDelayMs` | `INFRA_REPORT_SMTP_RETRY_DELAY` | `6000` | 60 000 / 10 = one AUTH every 6 s, the tightest limit on record; the backoff doubles from there |\n\n**A temporary refusal is re-tried here, by the transport, and the caller is told\nonce.** A 4yz reply (RFC 5321 §4.2.1 — `421`, `450`, …) is the relay saying\n\"later\": the send is repeated up to `maxAttempts`, spaced by the doubling\nbackoff, and the function returns a single verdict when that is over. A 5yz\nreply is permanent and is never repeated. An error carrying **no** reply code (a\ndead socket, a failed TLS handshake) is not guessed to be temporary — a retry\nwould spend the relay's rate budget on something the relay never said.\n\nThat placement is not a local choice: `delivery-mail-channel` 001 point 5 says\n\"retry is layered, not doubled … a refused send is the mail service's provider\nretry\". For the alert channel this module IS the mail service, so a retry loop in\nthe monitoring consumer on top of this one would be exactly the doubling that\nentry forbids. What the consumer records (`notification_sent`) is this verdict.\n\n**The account is an optional pair, and it is a pair.** `INFRA_REPORT_SMTP_USER`\nand `INFRA_REPORT_SMTP_PASS` are set together for a relay that authenticates, or\nleft empty together for one that does not — the dev mail sink is the second kind\n([`alert-smtp-relay` 005](../../docs/governance/confirmations/alert-smtp-relay.md)).\nExactly one of the two configured is a deployment that meant to authenticate and\nhalf-configured it; that raises `[MonitoringFallbackEmail] Incomplete SMTP\naccount - …` naming both keys, because sending anonymously instead would\nsilently downgrade an authenticated relay.\n\n**Whether the transport demands STARTTLS is declared, not guessed** — by the\nrequired key `INFRA_REPORT_SMTP_REQUIRE_TLS`, which has no owner default:\n\n| Key | Env | Default | Why no default |\n|---|---|---|---|\n| `infraReportSmtpRequireTls` | `INFRA_REPORT_SMTP_REQUIRE_TLS` | none — **required** | production sets `true`, the dev sink `false`; a library default would pick one of those for every deployment, and either choice is silent |\n\nWith `true` the client insists on STARTTLS and refuses the send if the server\ndoes not offer it: the production relay offers STARTTLS without insisting\n(`smtpd_tls_security_level = may`), so a client that does not insist either hands\n`AUTH PLAIN` to a downgraded connection. With `false` it speaks plaintext to a\nserver that has no TLS at all — the dev sink, which answers `502 5.5.1` to the\ncommand. The value is read only when a transport is actually built, so a service\nthat never configures `INFRA_REPORT_SMTP_HOST` does not have to declare it.\n\n#### Why this is a second mail rail — accepted justification\n\n> **Status: ACCEPTED** by the owner on 2026-09-14\n> (`api/docs/governance/confirmations/duplicity-justification.md` 002). `delivery-mail-channel`\n> 001 § Conditions requires this duplicate to carry \"its own written justification under\n> `duplicity-justification` 001\"; this section is that justification. It holds for exactly\n> the shape described below — platform alerts to the operator, one SMTP transport — and a\n> change that widens the rail leaves it and needs a new entry.\n\nThe platform has one mail rail by decision: a workflow result that travels by\nmail is handed to the mail service over its workflow queue\n(`delivery-mail-channel` 001, model A). This function is a second one, and\n`change-discipline.md` § One rail per concern makes that a defect by default.\n\nThe argument that it is nevertheless the right shape:\n\n1. **The two rails do not serve one concern.** The mail service delivers a\n   *tenant's* result — with the tenant's transport, entitlement check, outbound\n   record, bounce and complaint lifecycle. This function delivers *the\n   platform's own alert about itself*, to the operator, with no tenant, no\n   entitlement and no lifecycle. `markAlertNotified` is the whole record\n   (`monitoring-pg-volume` 003, `biz-readiness-alerting` 002).\n2. **It exists for the case where the first rail cannot run.** An alert is\n   raised precisely when the infrastructure the first rail depends on — the biz\n   layer, MQ, the queue the dispatcher would publish to — is the thing that is\n   broken. A channel whose availability is conditional on the subject of its own\n   message is not a channel. Routing alerts through the mail service would make\n   the report of an outage the first casualty of that outage.\n3. **The dependency direction forbids the reuse.** `service-common` is a shared\n   library used by infrastructure services (layer order,\n   `architecture-principles.md` §7). Reaching the mail service from here would\n   put a biz-service dependency underneath the infrastructure that monitors it.\n4. **It is not a copy of the mail service.** There is no queue, no template\n   engine, no attachment resolution, no provider feedback — one SMTP transport\n   and one `sendMail`. It duplicates the *act* of sending mail, not the\n   mechanism the other rail owns.\n5. **The cost of the alternative is measured, not theoretical.** The rejected\n   alternative (alerts through the mail service) was live on 2026-09-11 in the\n   form of a single relay dependency, and 12 alerts were lost to one burst; the\n   fix documented above is what keeps this rail inside the relay's limits.\n\n\n## Architecture\n\nThis library is used by:\n- **Infrastructure services** (via `@onlineapps/infrastructure-tools` which re-exports from here)\n- **Business services** (via `@onlineapps/service-wrapper` or directly)\n\nThis ensures no duplication and consistent behavior across all services.\n\n","readmeFilename":"README.md"}