{"_id":"ironflock","_rev":"28-ae0c9d2d159db112fa5465dc39adcf3d","name":"ironflock","dist-tags":{"latest":"1.8.4"},"versions":{"0.0.6":{"name":"ironflock","version":"0.0.6","keywords":["ironflock","messaging"],"author":{"name":"Record Evolution GmbH"},"license":"MIT","_id":"ironflock@0.0.6","homepage":"https://github.com/RecordEvolution/reswarm-js#readme","bugs":{"url":"https://github.com/RecordEvolution/reswarm-js/issues"},"dist":{"shasum":"6a7603407effa346c00943ffe9f1903c1599ea05","tarball":"https://registry.npmjs.org/ironflock/-/ironflock-0.0.6.tgz","fileCount":21,"integrity":"sha512-kc3dOJ/7e3qFvMb/EOnioZ3mkiCR814Yk/QaaXQf0nPSOr8Fqxqtc+g+lQmxbxRCoyhm54/Vnl1l/V+gZ45UkQ==","signatures":[{"sig":"MEUCIQDI2kDJxd7mTgR6cKNOrAr/8HNuYkFlH/7W8qwAeQzrTAIgDXNiOpTJBLDO8Q26bZ0rwN8X78AJw+LxagA+4ra9qRI=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":34483},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"e6f94ac9c9d4adf1ced3d3c022e8184901bbd100","scripts":{"release":"npm version patch --tag-version-prefix='' && git push && git push --tag","prepublish":"rm -rf dist && tsc"},"_npmUser":{"name":"markope","email":"marko.petzold@record-evolution.de"},"repository":{"url":"git+https://github.com/RecordEvolution/reswarm-js.git","type":"git"},"_npmVersion":"10.2.0","description":"Collect data in the IronFlock Storage architecture","directories":{},"_nodeVersion":"18.18.2","dependencies":{"ws":"^7.5.5","cbor":"^9.0.1","autobahn":"https://gitpkg.now.sh/jszczypk/autobahn-js/packages/autobahn?patch-1","msgpack5":"^6.0.2","node-gyp":"^10.0.1","msgpack-lite":"^0.1.26"},"_hasShrinkwrap":false,"devDependencies":{"@types/node":"^16.11.10","@types/autobahn":"^20.9.4","@types/msgpack-lite":"^0.1.11"},"_npmOperationalInternal":{"tmp":"tmp/ironflock_0.0.6_1719477731012_0.9185161176077377","host":"s3://npm-registry-packages"}},"0.0.7":{"name":"ironflock","version":"0.0.7","keywords":["ironflock","messaging"],"author":{"name":"Record Evolution GmbH"},"license":"MIT","_id":"ironflock@0.0.7","homepage":"https://github.com/RecordEvolution/ironflock-js#readme","bugs":{"url":"https://github.com/RecordEvolution/ironflock-js/issues"},"dist":{"shasum":"85fdf5cb360cc3303039251fe71009c561f9181e","tarball":"https://registry.npmjs.org/ironflock/-/ironflock-0.0.7.tgz","fileCount":21,"integrity":"sha512-ETgwm80znsCMXuH1tL/xgEVagDC7dWtkjvNat5QpfJuXGrolHaM02VvfN3eWLTYp5lbA+EeMPJA6vPoApmpc6Q==","signatures":[{"sig":"MEQCIAHJCJFun75aT6I94/JPwZM7q9dYF7PBfNQSBNBelYmMAiAxNZCp/1+9mrN8IGIYzR3ZjWvwRVvuD47fXI+Whq8IAQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":35884},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"777b35d7ee5c6584717aff7c006af7a729322f41","scripts":{"publish":"npm publish","release":"npm version patch --tag-version-prefix='' && git push && git push --tag","prepublish":"rm -rf dist && tsc"},"_npmUser":{"name":"markope","email":"marko.petzold@record-evolution.de"},"repository":{"url":"git+https://github.com/RecordEvolution/ironflock-js.git","type":"git"},"_npmVersion":"10.2.0","description":"Collect data in the IronFlock Storage architecture","directories":{},"_nodeVersion":"18.18.2","dependencies":{"ws":"^7.5.5","cbor":"^9.0.1","autobahn":"https://gitpkg.now.sh/jszczypk/autobahn-js/packages/autobahn?patch-1","msgpack5":"^6.0.2","node-gyp":"^10.0.1","msgpack-lite":"^0.1.26"},"_hasShrinkwrap":false,"devDependencies":{"@types/node":"^16.11.10","@types/autobahn":"^20.9.4","@types/msgpack-lite":"^0.1.11"},"_npmOperationalInternal":{"tmp":"tmp/ironflock_0.0.7_1719478302595_0.11412800442340743","host":"s3://npm-registry-packages"}},"0.0.8":{"name":"ironflock","version":"0.0.8","keywords":["ironflock","messaging"],"author":{"name":"Record Evolution GmbH"},"license":"MIT","_id":"ironflock@0.0.8","homepage":"https://github.com/RecordEvolution/ironflock-js#readme","bugs":{"url":"https://github.com/RecordEvolution/ironflock-js/issues"},"dist":{"shasum":"f9a2d9476ba1ef6c8de3fdf19a2396414c75a8b2","tarball":"https://registry.npmjs.org/ironflock/-/ironflock-0.0.8.tgz","fileCount":21,"integrity":"sha512-dq5DWau2TvuAe073/jt39/gVCfH5wpvvPHFPilRTJDTv8iN8zkHHsuVCEZA8/oURgjSt5omBU668U4aMN7G/Eg==","signatures":[{"sig":"MEYCIQC9miQN6zCwZqZIUU+wpnPZ7oe4EmbjvXqpjEmQXA+gGAIhALz7DTXcioL+N9AslvpbbjnAFso8NlN599tcBXPYhew3","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":35884},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"f8eb22489f65f6e7348350c0565c7d466eb602f5","scripts":{"publish":"npm publish","release":"npm version patch --tag-version-prefix='' && git push && git push --tag","prepublish":"rm -rf dist && tsc"},"_npmUser":{"name":"markope","email":"marko.petzold@record-evolution.de"},"repository":{"url":"git+https://github.com/RecordEvolution/ironflock-js.git","type":"git"},"_npmVersion":"10.2.0","description":"Collect data in the IronFlock Storage architecture","directories":{},"_nodeVersion":"18.18.2","dependencies":{"ws":"^7.5.5","cbor":"^9.0.1","autobahn":"https://gitpkg.now.sh/jszczypk/autobahn-js/packages/autobahn?patch-1","msgpack5":"^6.0.2","node-gyp":"^10.0.1","msgpack-lite":"^0.1.26"},"_hasShrinkwrap":false,"devDependencies":{"@types/node":"^16.11.10","@types/autobahn":"^20.9.4","@types/msgpack-lite":"^0.1.11"},"_npmOperationalInternal":{"tmp":"tmp/ironflock_0.0.8_1719478338042_0.66975303441276","host":"s3://npm-registry-packages"}},"0.1.0":{"name":"ironflock","version":"0.1.0","keywords":["ironflock","messaging"],"author":{"name":"Record Evolution GmbH"},"license":"MIT","_id":"ironflock@0.1.0","homepage":"https://github.com/RecordEvolution/ironflock-js#readme","bugs":{"url":"https://github.com/RecordEvolution/ironflock-js/issues"},"dist":{"shasum":"55fdc991943c392f2c904def94774e9616b1774e","tarball":"https://registry.npmjs.org/ironflock/-/ironflock-0.1.0.tgz","fileCount":21,"integrity":"sha512-/eWtEwgZIKDNnOgDOvXk+cmA4m3A/p6cDM+0Pkow/7Pq8e2B6WUt/QSfyKdHLuR2XjGpSshs7t//iA8/Il665w==","signatures":[{"sig":"MEYCIQC3i7Tbhi3TFThl0w5x2eJcG2mTybDeRUdfvHm3gIqHnwIhANbbyGO4u1JIafMq71tiGQVkCWGZPu6KAmCaBCrTBBpO","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":35884},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"19e392b17f65896845b9eaf7ac216eef9eae217d","scripts":{"publish":"npm publish","release":"npm version minor --tag-version-prefix='' && git push && git push --tag","prepublish":"rm -rf dist && tsc"},"_npmUser":{"name":"markope","email":"marko.petzold@record-evolution.de"},"repository":{"url":"git+https://github.com/RecordEvolution/ironflock-js.git","type":"git"},"_npmVersion":"10.2.0","description":"Collect data in the IronFlock Storage architecture","directories":{},"_nodeVersion":"18.18.2","dependencies":{"ws":"^7.5.5","cbor":"^9.0.1","autobahn":"https://gitpkg.now.sh/jszczypk/autobahn-js/packages/autobahn?patch-1","msgpack5":"^6.0.2","node-gyp":"^10.0.1","msgpack-lite":"^0.1.26"},"_hasShrinkwrap":false,"devDependencies":{"@types/node":"^16.11.10","@types/autobahn":"^20.9.4","@types/msgpack-lite":"^0.1.11"},"_npmOperationalInternal":{"tmp":"tmp/ironflock_0.1.0_1719478391425_0.48225158579327654","host":"s3://npm-registry-packages"}},"0.1.1":{"name":"ironflock","version":"0.1.1","keywords":["ironflock","messaging"],"author":{"name":"Record Evolution GmbH"},"license":"MIT","_id":"ironflock@0.1.1","homepage":"https://github.com/RecordEvolution/ironflock-js#readme","bugs":{"url":"https://github.com/RecordEvolution/ironflock-js/issues"},"dist":{"shasum":"7d774de81569748a761b57e3407854cb5dcb9aab","tarball":"https://registry.npmjs.org/ironflock/-/ironflock-0.1.1.tgz","fileCount":21,"integrity":"sha512-os6aQMg1B7vocqafWxMimS0yqDhaicGKHUpkeGB7bjM7wqYxaiAdkc7U42YL2XBoJqPlXNCfJNBSHTJ6iwbDgA==","signatures":[{"sig":"MEUCIGELzG1cy2GrvPZ+1ON4LujZuABiy1ziiOo+5AmJ2r/LAiEAnCn28kqClnt0WFT+Gjc/TeONk7wy5CCJkdcaGwfXcbE=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":36046},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"3986b01d9c41d7adeb8d474c337a7d0531d10a32","scripts":{"build":"rm -rf dist && tsc","publish":"npm publish","release":"npm version patch --tag-version-prefix='' && git push && git push --tag"},"_npmUser":{"name":"markope","email":"marko.petzold@record-evolution.de"},"repository":{"url":"git+https://github.com/RecordEvolution/ironflock-js.git","type":"git"},"_npmVersion":"10.2.0","description":"Collect data in the IronFlock Storage architecture","directories":{},"_nodeVersion":"18.18.2","dependencies":{"ws":"^7.5.5","cbor":"^9.0.1","autobahn":"https://gitpkg.now.sh/jszczypk/autobahn-js/packages/autobahn?patch-1","msgpack5":"^6.0.2","node-gyp":"^10.0.1","msgpack-lite":"^0.1.26"},"_hasShrinkwrap":false,"devDependencies":{"@types/node":"^16.11.10","@types/autobahn":"^20.9.4","@types/msgpack-lite":"^0.1.11"},"_npmOperationalInternal":{"tmp":"tmp/ironflock_0.1.1_1719478923054_0.4049113947649896","host":"s3://npm-registry-packages"}},"1.0.1":{"name":"ironflock","version":"1.0.1","keywords":["ironflock","messaging"],"author":{"name":"Record Evolution GmbH"},"license":"MIT","_id":"ironflock@1.0.1","maintainers":[{"name":"markope","email":"marko.petzold@record-evolution.de"}],"homepage":"https://github.com/RecordEvolution/ironflock-js#readme","bugs":{"url":"https://github.com/RecordEvolution/ironflock-js/issues"},"dist":{"shasum":"78957a10af11f4edb0545a8d3fdb5bd4d5ca8716","tarball":"https://registry.npmjs.org/ironflock/-/ironflock-1.0.1.tgz","fileCount":21,"integrity":"sha512-cjImh4IBnTlAO0iC2Smz3dAh6DH/FQs5vs83ZB/JaogE6Y36mNXD/nr5xQBH6Z0KWpqbKxH3zQJR+rCNLtB8sw==","signatures":[{"sig":"MEUCIBOiuhB4/PNG44J6icklbGDp2lGZCO9UTOEPsXnOZZ2jAiEAwP4D8tLBi8Y8fhrujFAkGLR39wu6wfEwRA1kaamuTFM=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":36275},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"ea26f0f966909d61f8dc8add91ed6a5e46ee48e8","scripts":{"build":"rm -rf dist && tsc","publish":"npm publish","release":"npm version patch --tag-version-prefix='' && git push && git push --tag"},"_npmUser":{"name":"markope","email":"marko.petzold@record-evolution.de"},"repository":{"url":"git+https://github.com/RecordEvolution/ironflock-js.git","type":"git"},"_npmVersion":"10.2.0","description":"Collect data in the IronFlock Storage architecture","directories":{},"_nodeVersion":"18.18.2","dependencies":{"ws":"^7.5.5","cbor":"^9.0.1","autobahn":"https://gitpkg.now.sh/jszczypk/autobahn-js/packages/autobahn?patch-1","msgpack5":"^6.0.2","node-gyp":"^10.0.1","msgpack-lite":"^0.1.26"},"_hasShrinkwrap":false,"devDependencies":{"@types/node":"^16.11.10","@types/autobahn":"^20.9.4","@types/msgpack-lite":"^0.1.11"},"_npmOperationalInternal":{"tmp":"tmp/ironflock_1.0.1_1722433772803_0.3760398894915895","host":"s3://npm-registry-packages"}},"1.0.2":{"name":"ironflock","version":"1.0.2","keywords":["ironflock","messaging"],"author":{"name":"Record Evolution GmbH"},"license":"MIT","_id":"ironflock@1.0.2","maintainers":[{"name":"markope","email":"marko.petzold@record-evolution.de"}],"homepage":"https://github.com/RecordEvolution/ironflock-js#readme","bugs":{"url":"https://github.com/RecordEvolution/ironflock-js/issues"},"dist":{"shasum":"8844d7089c7ff7bf453a975fc233384df83a7653","tarball":"https://registry.npmjs.org/ironflock/-/ironflock-1.0.2.tgz","fileCount":21,"integrity":"sha512-3orJ9Y3v52BMMkmPkuZwAWcATZFIgQhMrnEERN7+JsMPJYLiXoQooNlWY5lC7eykRXWh2BRCj3sBF7eqyKYWxQ==","signatures":[{"sig":"MEUCIB8S53S1OT5Tm/0ZLgUsbH2EdycEmSGPE+Tu2uHBEhn0AiEA1uXj3LanWA28r5wegrNUdCB/fXOSlrzkMm6QuP6blg4=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":36515},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"88a85d7f3f0c5a345e30d2fcff1838d556e71928","scripts":{"build":"rm -rf dist && tsc","publish":"npm publish","release":"npm version patch --tag-version-prefix='' && git push && git push --tag"},"_npmUser":{"name":"markope","email":"marko.petzold@record-evolution.de"},"repository":{"url":"git+https://github.com/RecordEvolution/ironflock-js.git","type":"git"},"_npmVersion":"10.2.0","description":"Collect data in the IronFlock Storage architecture","directories":{},"_nodeVersion":"18.18.2","dependencies":{"ws":"^7.5.5","cbor":"^9.0.1","autobahn":"https://gitpkg.now.sh/jszczypk/autobahn-js/packages/autobahn?patch-1","msgpack5":"^6.0.2","node-gyp":"^10.0.1","msgpack-lite":"^0.1.26"},"_hasShrinkwrap":false,"devDependencies":{"@types/node":"^16.11.10","@types/autobahn":"^20.9.4","@types/msgpack-lite":"^0.1.11"},"_npmOperationalInternal":{"tmp":"tmp/ironflock_1.0.2_1722434177696_0.015177370752080366","host":"s3://npm-registry-packages"}},"1.1.1":{"name":"ironflock","version":"1.1.1","keywords":["ironflock","messaging"],"author":{"name":"IronFlock GmbH"},"license":"MIT","_id":"ironflock@1.1.1","maintainers":[{"name":"markope","email":"marko.petzold@record-evolution.de"}],"homepage":"https://github.com/RecordEvolution/ironflock-js#readme","bugs":{"url":"https://github.com/RecordEvolution/ironflock-js/issues"},"dist":{"shasum":"b2716e2473a3eab4f568eaec230d780114c23228","tarball":"https://registry.npmjs.org/ironflock/-/ironflock-1.1.1.tgz","fileCount":7,"integrity":"sha512-DD2kbzLu0UnISGGVdPPEEqrTLZgmDMPsVYlxL1VeepToxPQch9u8A50dXTJSe6/SI20SptP4spaqbVPqympxbQ==","signatures":[{"sig":"MEUCIBgAkoELGqfxP2Jc06LRDFCRsG18Wq1Ine+ynTe33cL/AiEAis0P0C3tcMwx/fbNk2Sue2xkN1vLI5X5CoTg71+tBxE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":152768},"main":"dist/index.cjs","type":"module","types":"dist/index.d.ts","module":"dist/index.mjs","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.cjs"}}},"gitHead":"eff0b92bfb71f999eabb788d13d20de95be0db3e","scripts":{"dev":"vite build --watch","test":"vitest run","build":"vite build","release":"npm run build && npm version patch --tag-version-prefix='' && git push && git push --tag","typecheck":"tsc --noEmit","test:watch":"vitest","postinstall":"patch-package && node scripts/patch-typia-exports.mjs","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"markope","email":"marko.petzold@record-evolution.de"},"repository":{"url":"git+https://github.com/RecordEvolution/ironflock-js.git","type":"git"},"_npmVersion":"10.9.4","description":"Collect data in the IronFlock Storage architecture","directories":{},"_nodeVersion":"22.22.1","dependencies":{"ws":"^7.5.5","cbor":"^9.0.1","autobahn":"22.11.1","msgpack5":"^6.0.2","msgpack-lite":"^0.1.26"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","typia":"^12.0.1","vitest":"^3.0.0","typescript":"^5.7.0","@types/node":"^20.11.0","patch-package":"^8.0.0","@types/autobahn":"^20.9.4","vite-plugin-dts":"^4.5.0","@types/msgpack-lite":"^0.1.11","@kennethwkz/unplugin-typia":"^2.6.7"},"_npmOperationalInternal":{"tmp":"tmp/ironflock_1.1.1_1773913318926_0.5483968806147173","host":"s3://npm-registry-packages-npm-production"}},"1.2.1":{"name":"ironflock","version":"1.2.1","keywords":["ironflock","messaging"],"author":{"name":"IronFlock GmbH"},"license":"MIT","_id":"ironflock@1.2.1","maintainers":[{"name":"markope","email":"marko.petzold@record-evolution.de"}],"homepage":"https://github.com/RecordEvolution/ironflock-js#readme","bugs":{"url":"https://github.com/RecordEvolution/ironflock-js/issues"},"dist":{"shasum":"e5f460d95c840d5bb124a8c08ecc3c89e3d355dc","tarball":"https://registry.npmjs.org/ironflock/-/ironflock-1.2.1.tgz","fileCount":7,"integrity":"sha512-p8hYlo+fwJpTxIU54alsVMKfPJ/s6DnbvgWi4gInENFrwUCsE1KIYy+2OKzIDf7iWJWKO3wjWB/glg+ORa6Njw==","signatures":[{"sig":"MEQCIFo9AeG0x78n7GK7irZi2TfEMFn4DOtZ5/pbgfgro+L5AiBtF+tEhoShpui+QeVyF1xPxzauVbdVgZgYY8iVS6XUAA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":198166},"main":"dist/index.cjs","type":"module","types":"dist/index.d.ts","module":"dist/index.mjs","browser":{"ws":false},"engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.cjs"}}},"gitHead":"6d4ea239a34aec9d893255b9740a95aeb0b5c610","scripts":{"dev":"vite build --watch","test":"vitest run","build":"vite build","release":"npm run build && npm version patch --tag-version-prefix='' && git push && git push --tag","test:all":"vitest run && vitest run --config vitest.browser.config.ts","typecheck":"tsc --noEmit","test:watch":"vitest","postinstall":"patch-package && node scripts/patch-typia-exports.mjs","test:browser":"vitest run --config vitest.browser.config.ts","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"markope","email":"marko.petzold@record-evolution.de"},"repository":{"url":"git+https://github.com/RecordEvolution/ironflock-js.git","type":"git"},"_npmVersion":"10.9.4","description":"Collect data in the IronFlock Storage architecture","directories":{},"_nodeVersion":"22.22.1","dependencies":{"autobahn":"22.11.1","eventemitter3":"^5.0.4"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","typia":"^12.0.1","vitest":"^3.0.0","happy-dom":"^20.8.4","typescript":"^5.7.0","@types/node":"^20.11.0","patch-package":"^8.0.0","@types/autobahn":"^20.9.4","vite-plugin-dts":"^4.5.0","@kennethwkz/unplugin-typia":"^2.6.7"},"_npmOperationalInternal":{"tmp":"tmp/ironflock_1.2.1_1773926272011_0.8618272585713198","host":"s3://npm-registry-packages-npm-production"}},"1.2.2":{"name":"ironflock","version":"1.2.2","keywords":["ironflock","messaging"],"author":{"name":"IronFlock GmbH"},"license":"MIT","_id":"ironflock@1.2.2","maintainers":[{"name":"markope","email":"marko.petzold@record-evolution.de"}],"homepage":"https://github.com/RecordEvolution/ironflock-js#readme","bugs":{"url":"https://github.com/RecordEvolution/ironflock-js/issues"},"dist":{"shasum":"b6c344aeccb06a97be93b9d0117897c4bec8b9da","tarball":"https://registry.npmjs.org/ironflock/-/ironflock-1.2.2.tgz","fileCount":7,"integrity":"sha512-tRw/ZxkZ6zpwTkC1hkVLgxHfte+uXxfOKqpOIZT/lxAr+Usc1mGINr83dhXczSqPvA9ts2YcQ7jN3c8xH7OWrQ==","signatures":[{"sig":"MEQCIH9QWseaH2+GmP+auqQBHCzZ+GQze8o5mVM+MxP4BAsaAiAIvO4PWjom54oBJf+UOhnUFPh/LlZG4l9+LdTMkbIIGA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":202374},"main":"dist/index.cjs","type":"module","types":"dist/index.d.ts","module":"dist/index.mjs","browser":{"ws":false},"engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.cjs"}}},"gitHead":"1a0460dc826ea7fd4d1ef936c90d4f39fa8cfbd1","scripts":{"dev":"vite build --watch","test":"vitest run","build":"vite build","release":"npm run build && npm version patch --tag-version-prefix='' && git push && git push --tag","test:all":"vitest run && vitest run --config vitest.browser.config.ts","typecheck":"tsc --noEmit","test:watch":"vitest","postinstall":"patch-package && node scripts/patch-typia-exports.mjs","test:browser":"vitest run --config vitest.browser.config.ts","test:coverage":"vitest run --coverage && node scripts/update-coverage-badge.mjs"},"_npmUser":{"name":"markope","email":"marko.petzold@record-evolution.de"},"repository":{"url":"git+https://github.com/RecordEvolution/ironflock-js.git","type":"git"},"_npmVersion":"10.9.4","description":"Collect data in the IronFlock Storage architecture","directories":{},"_nodeVersion":"22.22.1","dependencies":{"autobahn":"26.3.1","eventemitter3":"^5.0.4"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","typia":"^12.0.1","vitest":"^3.0.0","happy-dom":"^20.8.4","typescript":"^5.7.0","@types/node":"^20.11.0","patch-package":"^8.0.0","@types/autobahn":"^20.9.4","vite-plugin-dts":"^4.5.0","@vitest/coverage-v8":"^3.2.4","@kennethwkz/unplugin-typia":"^2.6.7"},"_npmOperationalInternal":{"tmp":"tmp/ironflock_1.2.2_1774096060985_0.8810686370921608","host":"s3://npm-registry-packages-npm-production"}},"1.2.3":{"name":"ironflock","version":"1.2.3","keywords":["ironflock","messaging"],"author":{"name":"IronFlock GmbH"},"license":"MIT","_id":"ironflock@1.2.3","maintainers":[{"name":"markope","email":"marko.petzold@record-evolution.de"}],"homepage":"https://github.com/RecordEvolution/ironflock-js#readme","bugs":{"url":"https://github.com/RecordEvolution/ironflock-js/issues"},"dist":{"shasum":"c44633ef40434321c9659e180f9b2a99023f4095","tarball":"https://registry.npmjs.org/ironflock/-/ironflock-1.2.3.tgz","fileCount":7,"integrity":"sha512-+3gprUope96F2Or+EbFybHzFqB1YZP1tdLHJnT9oyuwZmevHB6UjJRC7RBMwHH6+LwLIfAULhNQo3ujvIkmxiA==","signatures":[{"sig":"MEUCIQDZlWMVN01GcyLzc5BCsNJoF4qOJMxHyKA4nAiZzZEqcAIgXyOnmY2fd6wOS8x0tGMBOCcIgGnROg4r0e3thNUa2dI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":203409},"main":"dist/index.cjs","type":"module","types":"dist/index.d.ts","module":"dist/index.mjs","browser":{"ws":false},"engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.cjs"}}},"gitHead":"d8caf81c094051a351000383b4626ebe731ee1e6","scripts":{"dev":"vite build --watch","test":"vitest run","build":"vite build","release":"npm run build && npm version patch --tag-version-prefix='' && git push && git push --tag","test:all":"vitest run && vitest run --config vitest.browser.config.ts","typecheck":"tsc --noEmit","test:watch":"vitest","postinstall":"patch-package && node scripts/patch-typia-exports.mjs","test:browser":"vitest run --config vitest.browser.config.ts","test:coverage":"vitest run --coverage && node scripts/update-coverage-badge.mjs"},"_npmUser":{"name":"markope","email":"marko.petzold@record-evolution.de"},"repository":{"url":"git+https://github.com/RecordEvolution/ironflock-js.git","type":"git"},"_npmVersion":"10.9.4","description":"Collect data in the IronFlock Storage architecture","directories":{},"_nodeVersion":"22.22.1","dependencies":{"autobahn":"26.3.1","eventemitter3":"^5.0.4"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","typia":"^12.0.1","vitest":"^3.0.0","happy-dom":"^20.8.4","typescript":"^5.7.0","@types/node":"^20.11.0","patch-package":"^8.0.0","@types/autobahn":"^20.9.4","vite-plugin-dts":"^4.5.0","@vitest/coverage-v8":"^3.2.4","@kennethwkz/unplugin-typia":"^2.6.7"},"_npmOperationalInternal":{"tmp":"tmp/ironflock_1.2.3_1774171898890_0.9234766837453607","host":"s3://npm-registry-packages-npm-production"}},"1.2.4":{"name":"ironflock","version":"1.2.4","keywords":["ironflock","messaging"],"author":{"name":"IronFlock GmbH"},"license":"MIT","_id":"ironflock@1.2.4","maintainers":[{"name":"markope","email":"marko.petzold@record-evolution.de"}],"homepage":"https://github.com/RecordEvolution/ironflock-js#readme","bugs":{"url":"https://github.com/RecordEvolution/ironflock-js/issues"},"dist":{"shasum":"f6b2bf4a15d4f8363a72b6341bd33aee52a207b0","tarball":"https://registry.npmjs.org/ironflock/-/ironflock-1.2.4.tgz","fileCount":7,"integrity":"sha512-gtd1DjfQYp5Tj5jg2eE5RbDSXIvXIKLk+QcusvvjCnv4aI7h2sKn+p6xjlNRYbkjsw3srJvUXsAfJIdIp4ZRxA==","signatures":[{"sig":"MEUCIQDPqxWQRfX/QxdI/WPZPI27OPHe0ETKYVGIM64BJBr8OgIgbocHpDWyQTFrriboFN3hNb+YoCxJtbrXZV8i90VQoqU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":208516},"main":"dist/index.cjs","type":"module","types":"dist/index.d.ts","module":"dist/index.mjs","browser":{"ws":false},"engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.cjs"}}},"gitHead":"ee19f0d64b1c892059c5b5c8ab634e8c360589d7","scripts":{"dev":"vite build --watch","test":"vitest run","build":"vite build","release":"npm run build && npm version patch --tag-version-prefix='' && git push && git push --tag","test:all":"vitest run && vitest run --config vitest.browser.config.ts","typecheck":"tsc --noEmit","test:watch":"vitest","postinstall":"patch-package && node scripts/patch-typia-exports.mjs","test:browser":"vitest run --config vitest.browser.config.ts","test:coverage":"vitest run --coverage && node scripts/update-coverage-badge.mjs"},"_npmUser":{"name":"markope","email":"marko.petzold@record-evolution.de"},"repository":{"url":"git+https://github.com/RecordEvolution/ironflock-js.git","type":"git"},"_npmVersion":"10.9.4","description":"Collect data in the IronFlock Storage architecture","directories":{},"_nodeVersion":"22.22.1","dependencies":{"autobahn":"26.3.1","eventemitter3":"^5.0.4"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","typia":"^12.0.1","vitest":"^3.0.0","happy-dom":"^20.8.4","typescript":"^5.7.0","@types/node":"^20.11.0","patch-package":"^8.0.0","@types/autobahn":"^20.9.4","vite-plugin-dts":"^4.5.0","@vitest/coverage-v8":"^3.2.4","@kennethwkz/unplugin-typia":"^2.6.7"},"_npmOperationalInternal":{"tmp":"tmp/ironflock_1.2.4_1774371752905_0.7351757583967091","host":"s3://npm-registry-packages-npm-production"}},"1.2.6":{"name":"ironflock","version":"1.2.6","keywords":["ironflock","messaging"],"author":{"name":"IronFlock GmbH"},"license":"MIT","_id":"ironflock@1.2.6","maintainers":[{"name":"markope","email":"marko.petzold@record-evolution.de"}],"homepage":"https://github.com/RecordEvolution/ironflock-js#readme","bugs":{"url":"https://github.com/RecordEvolution/ironflock-js/issues"},"dist":{"shasum":"b5c282ae1f94bf8122b8bd267efbed219cf4197d","tarball":"https://registry.npmjs.org/ironflock/-/ironflock-1.2.6.tgz","fileCount":7,"integrity":"sha512-iUCNMCNPP8d21ijMgsIZLu+bEI8Bua7q6H5fuJBBYW5dCpLxVP24V6WVaSSzKo6rrEPYcMVqE3f+sqGqPHB6sQ==","signatures":[{"sig":"MEQCIHJyv9IETmbNkmRasaVNq7hscKo0B0fJG3QVOVaWlMH6AiBx9ViOGL2U0dmQQDpP50c0TWxwOhEW/8VGwlrpFnO8ZQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":208926},"main":"dist/index.cjs","type":"module","types":"dist/index.d.ts","module":"dist/index.mjs","browser":{"ws":false},"engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.cjs"}}},"gitHead":"96f58234218af368e6224946e8d84860fa9a5914","scripts":{"dev":"vite build --watch","test":"vitest run","build":"vite build","release":"npm run build && npm version patch --tag-version-prefix='' && git push && git push --tag","test:all":"vitest run && vitest run --config vitest.browser.config.ts","typecheck":"tsc --noEmit","test:watch":"vitest","postinstall":"patch-package && node scripts/patch-typia-exports.mjs","test:browser":"vitest run --config vitest.browser.config.ts","test:coverage":"vitest run --coverage && node scripts/update-coverage-badge.mjs"},"_npmUser":{"name":"markope","email":"marko.petzold@record-evolution.de"},"repository":{"url":"git+https://github.com/RecordEvolution/ironflock-js.git","type":"git"},"_npmVersion":"10.9.4","description":"Collect data in the IronFlock Storage architecture","directories":{},"_nodeVersion":"22.22.1","dependencies":{"autobahn":"26.3.1","eventemitter3":"^5.0.4"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","typia":"^12.0.1","vitest":"^3.0.0","happy-dom":"^20.8.4","typescript":"^5.7.0","@types/node":"^20.11.0","patch-package":"^8.0.0","@types/autobahn":"^20.9.4","vite-plugin-dts":"^4.5.0","@vitest/coverage-v8":"^3.2.4","@kennethwkz/unplugin-typia":"^2.6.7"},"_npmOperationalInternal":{"tmp":"tmp/ironflock_1.2.6_1774719886623_0.18942291309603076","host":"s3://npm-registry-packages-npm-production"}},"1.2.8":{"name":"ironflock","version":"1.2.8","keywords":["ironflock","messaging"],"author":{"name":"IronFlock GmbH"},"license":"MIT","_id":"ironflock@1.2.8","maintainers":[{"name":"markope","email":"marko.petzold@record-evolution.de"}],"homepage":"https://github.com/RecordEvolution/ironflock-js#readme","bugs":{"url":"https://github.com/RecordEvolution/ironflock-js/issues"},"dist":{"shasum":"94b02708309e5d33c1314665b5c71a32eddb05fc","tarball":"https://registry.npmjs.org/ironflock/-/ironflock-1.2.8.tgz","fileCount":7,"integrity":"sha512-Z5YsP8hLMH0dT3ygT22CocK1dPAGiJYpzdWCLckVzwKQLPINB4HxcN36SmhCYdZlHegOziXLCAeMuInAfWOp1Q==","signatures":[{"sig":"MEYCIQDKwQ+uAVpQ6wCm3jrWL69xtMq+SYkT1TSsnmkFeRXRpwIhANhHwxzH6qUvZpAzzVMbGVnGtp0srrkCh0LkUIZ56ZIg","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":218748},"main":"dist/index.cjs","type":"module","types":"dist/index.d.ts","module":"dist/index.mjs","browser":{"ws":false},"engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.cjs"}}},"gitHead":"8c2062729f39c114d2920cac3b1f44381bd76471","scripts":{"dev":"vite build --watch","test":"vitest run","build":"vite build","release":"npm run build && npm version patch --tag-version-prefix='' && git push && git push --tag","test:all":"vitest run && vitest run --config vitest.browser.config.ts","typecheck":"tsc --noEmit","test:watch":"vitest","postinstall":"patch-package && node scripts/patch-typia-exports.mjs","test:browser":"vitest run --config vitest.browser.config.ts","test:coverage":"vitest run --coverage && node scripts/update-coverage-badge.mjs"},"_npmUser":{"name":"markope","email":"marko.petzold@record-evolution.de"},"repository":{"url":"git+https://github.com/RecordEvolution/ironflock-js.git","type":"git"},"_npmVersion":"10.9.7","description":"Collect data in the IronFlock Storage architecture","directories":{},"_nodeVersion":"22.22.2","dependencies":{"autobahn":"26.3.1","eventemitter3":"^5.0.4"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","typia":"^12.0.1","vitest":"^3.0.0","happy-dom":"^20.8.4","typescript":"^5.7.0","@types/node":"^20.11.0","patch-package":"^8.0.0","@types/autobahn":"^20.9.4","vite-plugin-dts":"^4.5.0","@vitest/coverage-v8":"^3.2.4","@kennethwkz/unplugin-typia":"^2.6.7"},"_npmOperationalInternal":{"tmp":"tmp/ironflock_1.2.8_1778270543067_0.6640167530672159","host":"s3://npm-registry-packages-npm-production"}},"1.2.9":{"name":"ironflock","version":"1.2.9","keywords":["ironflock","messaging"],"author":{"name":"IronFlock GmbH"},"license":"MIT","_id":"ironflock@1.2.9","maintainers":[{"name":"markope","email":"marko.petzold@record-evolution.de"}],"homepage":"https://github.com/RecordEvolution/ironflock-js#readme","bugs":{"url":"https://github.com/RecordEvolution/ironflock-js/issues"},"dist":{"shasum":"b7982adf3780dd326346967b2675b247764100a4","tarball":"https://registry.npmjs.org/ironflock/-/ironflock-1.2.9.tgz","fileCount":7,"integrity":"sha512-f55ZqmaB1JxV6y5zsdb0kEhu+ecusEUMhFY3J4UASn8L96iF1KUeFZVWZiCJKdJm6JdTOZ/CkX0BH3raaafFzQ==","signatures":[{"sig":"MEQCIGCwC9bTL9O7O6dptwqfZqG3bxNPIzMiKGO/pKSEe19XAiAzGh06gncKnVYyGkYQei8LdftQJQIM8EKE5z/u34uMaA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":221341},"main":"dist/index.cjs","type":"module","types":"dist/index.d.ts","module":"dist/index.mjs","browser":{"ws":false},"engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.cjs"}}},"gitHead":"006d383b4109a505ce4e9e9ede5067390fb08d42","scripts":{"dev":"vite build --watch","test":"vitest run","build":"vite build","release":"npm run build && npm version patch --tag-version-prefix='' && git push && git push --tag","test:all":"vitest run && vitest run --config vitest.browser.config.ts","typecheck":"tsc --noEmit","test:watch":"vitest","postinstall":"patch-package && node scripts/patch-typia-exports.mjs","test:browser":"vitest run --config vitest.browser.config.ts","test:coverage":"vitest run --coverage && node scripts/update-coverage-badge.mjs"},"_npmUser":{"name":"markope","email":"marko.petzold@record-evolution.de"},"repository":{"url":"git+https://github.com/RecordEvolution/ironflock-js.git","type":"git"},"_npmVersion":"10.9.7","description":"Collect data in the IronFlock Storage architecture","directories":{},"_nodeVersion":"22.22.2","dependencies":{"autobahn":"26.3.1","eventemitter3":"^5.0.4"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","typia":"^12.0.1","vitest":"^3.0.0","happy-dom":"^20.8.4","typescript":"^5.7.0","@types/node":"^20.11.0","patch-package":"^8.0.0","@types/autobahn":"^20.9.4","vite-plugin-dts":"^4.5.0","@vitest/coverage-v8":"^3.2.4","@kennethwkz/unplugin-typia":"^2.6.7"},"_npmOperationalInternal":{"tmp":"tmp/ironflock_1.2.9_1778579564452_0.3947138564192769","host":"s3://npm-registry-packages-npm-production"}},"1.3.2":{"name":"ironflock","version":"1.3.2","keywords":["ironflock","messaging"],"author":{"name":"IronFlock GmbH"},"license":"MIT","_id":"ironflock@1.3.2","maintainers":[{"name":"markope","email":"marko.petzold@record-evolution.de"}],"homepage":"https://github.com/RecordEvolution/ironflock-js#readme","bugs":{"url":"https://github.com/RecordEvolution/ironflock-js/issues"},"dist":{"shasum":"1aa5c8527ffc2dc4835b810005745e41012412e1","tarball":"https://registry.npmjs.org/ironflock/-/ironflock-1.3.2.tgz","fileCount":7,"integrity":"sha512-+YcwfsfGxeROa5vevTKt2Ykwb5Ozv1TEpwBv1ArmSKduxBSR/lmoczLD2EZd0OSzz+iKKItRUHa8RPrRIb4I5g==","signatures":[{"sig":"MEYCIQCz2/3e5YSewZRsR9K+Hamf9ywglTVydxc1eCm8eXoqqgIhAMulKF63ikysnzCkruS71gPlMDehct2WwDJsB0lJcS6N","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":248529},"main":"dist/index.cjs","type":"module","types":"dist/index.d.ts","module":"dist/index.mjs","browser":{"ws":false},"engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.cjs"}}},"gitHead":"7bf414866fd68cc144f537ce8229748327b3641c","scripts":{"dev":"vite build --watch","test":"vitest run","build":"vite build","release":"npm run build && npm version patch --tag-version-prefix='' && git push && git push --tag","test:all":"vitest run && vitest run --config vitest.browser.config.ts","typecheck":"tsc --noEmit","test:watch":"vitest","postinstall":"patch-package && node scripts/patch-typia-exports.mjs","test:browser":"vitest run --config vitest.browser.config.ts","test:coverage":"vitest run --coverage && node scripts/update-coverage-badge.mjs"},"_npmUser":{"name":"markope","email":"marko.petzold@record-evolution.de"},"repository":{"url":"git+https://github.com/RecordEvolution/ironflock-js.git","type":"git"},"_npmVersion":"10.9.8","description":"Collect data in the IronFlock Storage architecture","directories":{},"_nodeVersion":"22.22.3","dependencies":{"autobahn":"26.3.1","eventemitter3":"^5.0.4"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","typia":"^12.0.1","vitest":"^3.0.0","happy-dom":"^20.8.4","typescript":"^5.7.0","@types/node":"^20.11.0","patch-package":"^8.0.0","@types/autobahn":"^20.9.4","vite-plugin-dts":"^4.5.0","@vitest/coverage-v8":"^3.2.4","@kennethwkz/unplugin-typia":"^2.6.7"},"_npmOperationalInternal":{"tmp":"tmp/ironflock_1.3.2_1781527948337_0.5997134491882155","host":"s3://npm-registry-packages-npm-production"}},"1.3.3":{"name":"ironflock","version":"1.3.3","keywords":["ironflock","messaging"],"author":{"name":"IronFlock GmbH"},"license":"MIT","_id":"ironflock@1.3.3","maintainers":[{"name":"markope","email":"marko.petzold@record-evolution.de"}],"homepage":"https://github.com/RecordEvolution/ironflock-js#readme","bugs":{"url":"https://github.com/RecordEvolution/ironflock-js/issues"},"dist":{"shasum":"d6ed0bc2f99843ebfc8edfd49e745935218a4496","tarball":"https://registry.npmjs.org/ironflock/-/ironflock-1.3.3.tgz","fileCount":7,"integrity":"sha512-SoxRB44SE2BISmjj/0bqDtKKQpbGrdTPn0yBuW3sU3BjYX7FM8JQl7n/jSf1GTSGW+dh8+G6N9WewPwxdkGmMw==","signatures":[{"sig":"MEUCICeI0HId4rAFMJMCYZFsG1MD990BGFTGlMXBrb362Z1+AiEAiHi68wWbgVKXcOsSIDptIQnyK4YW2RhMo2oyP7aW/vo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":258862},"main":"dist/index.cjs","type":"module","types":"dist/index.d.ts","module":"dist/index.mjs","browser":{"ws":false},"engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.cjs"}}},"gitHead":"9d5182b2e1a14859c217445f221d94f1b60e842e","scripts":{"dev":"vite build --watch","test":"vitest run","build":"vite build","release":"npm run build && npm version patch --tag-version-prefix='' && git push && git push --tag","test:all":"vitest run && vitest run --config vitest.browser.config.ts","typecheck":"tsc --noEmit","test:watch":"vitest","postinstall":"patch-package && node scripts/patch-typia-exports.mjs","test:browser":"vitest run --config vitest.browser.config.ts","test:coverage":"vitest run --coverage && node scripts/update-coverage-badge.mjs"},"_npmUser":{"name":"markope","email":"marko.petzold@record-evolution.de"},"repository":{"url":"git+https://github.com/RecordEvolution/ironflock-js.git","type":"git"},"_npmVersion":"10.9.8","description":"Collect data in the IronFlock Storage architecture","directories":{},"_nodeVersion":"22.22.3","dependencies":{"autobahn":"26.3.1","eventemitter3":"^5.0.4"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","typia":"^12.0.1","vitest":"^3.0.0","happy-dom":"^20.8.4","typescript":"^5.7.0","@types/node":"^20.11.0","patch-package":"^8.0.0","@types/autobahn":"^20.9.4","vite-plugin-dts":"^4.5.0","@vitest/coverage-v8":"^3.2.4","@kennethwkz/unplugin-typia":"^2.6.7"},"_npmOperationalInternal":{"tmp":"tmp/ironflock_1.3.3_1782049624839_0.5397011047210478","host":"s3://npm-registry-packages-npm-production"}},"1.5.1":{"name":"ironflock","version":"1.5.1","keywords":["ironflock","messaging"],"author":{"name":"IronFlock GmbH"},"license":"MIT","_id":"ironflock@1.5.1","maintainers":[{"name":"markope","email":"marko.petzold@record-evolution.de"}],"homepage":"https://github.com/RecordEvolution/ironflock-js#readme","bugs":{"url":"https://github.com/RecordEvolution/ironflock-js/issues"},"dist":{"shasum":"da58e65168a132bc3ee864568a0ce66e533f00f8","tarball":"https://registry.npmjs.org/ironflock/-/ironflock-1.5.1.tgz","fileCount":7,"integrity":"sha512-f2H1RwYYeSCMEYRMWJByUOSfQOCMRqrSactQGzHFAEzJvKzNK09DxT45kNWTZ6f9kNWFGlGP4rsk4y8jBrYx4w==","signatures":[{"sig":"MEQCICYFtJwGFkz9EggAC3iprAx+nbSu9gELKsVbk4oVyizjAiA3+rtVwBA2WpiN+4L4b4N4tYHWQWNWo4O7sEQFsp47uA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":354970},"main":"dist/index.cjs","type":"module","types":"dist/index.d.ts","module":"dist/index.mjs","browser":{"ws":false},"engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.cjs"}}},"gitHead":"a283b9e4f47300cbc072b20d68d773bc0693d793","scripts":{"dev":"vite build --watch","test":"vitest run","build":"vite build","release":"npm run build && npm version patch --tag-version-prefix='' && git push && git push --tag","test:all":"vitest run && vitest run --config vitest.browser.config.ts","typecheck":"tsc --noEmit","test:watch":"vitest","postinstall":"patch-package && node scripts/patch-typia-exports.mjs","test:browser":"vitest run --config vitest.browser.config.ts","test:coverage":"vitest run --coverage && node scripts/update-coverage-badge.mjs"},"_npmUser":{"name":"markope","email":"marko.petzold@record-evolution.de"},"repository":{"url":"git+https://github.com/RecordEvolution/ironflock-js.git","type":"git"},"_npmVersion":"10.9.8","description":"Collect data in the IronFlock Storage architecture","directories":{},"_nodeVersion":"22.23.1","dependencies":{"autobahn":"26.3.1","eventemitter3":"^5.0.4"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","typia":"^12.0.1","vitest":"^3.0.0","happy-dom":"^20.8.4","typescript":"^5.7.0","@types/node":"^20.11.0","patch-package":"^8.0.0","@types/autobahn":"^20.9.4","vite-plugin-dts":"^4.5.0","@vitest/coverage-v8":"^3.2.4","@kennethwkz/unplugin-typia":"^2.6.7"},"_npmOperationalInternal":{"tmp":"tmp/ironflock_1.5.1_1783340127779_0.3048571409377281","host":"s3://npm-registry-packages-npm-production"}},"1.5.2":{"name":"ironflock","version":"1.5.2","keywords":["ironflock","messaging"],"author":{"name":"IronFlock GmbH"},"license":"MIT","_id":"ironflock@1.5.2","maintainers":[{"name":"markope","email":"marko.petzold@record-evolution.de"}],"homepage":"https://github.com/RecordEvolution/ironflock-js#readme","bugs":{"url":"https://github.com/RecordEvolution/ironflock-js/issues"},"dist":{"shasum":"1335aba640e053c28ffeafaf4df8b3ab1f63e7f6","tarball":"https://registry.npmjs.org/ironflock/-/ironflock-1.5.2.tgz","fileCount":7,"integrity":"sha512-Fc5EYghyaOKQm+gFuRs8Y8XhvlcrPbNZUqkdnr7g1CQZPkMfOastNsNaNiHI/WKPaAt1imSjfkdqSCbkpOkgGw==","signatures":[{"sig":"MEUCIDhx1Occ8TDWRKf5JBQX5XAxTL4Cmqs660yM591M4A9GAiEAsFyxZduToerHlrLIkz3/YoXy6vp0mPLsjEYwZHaRaOs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":379798},"main":"dist/index.cjs","type":"module","types":"dist/index.d.ts","module":"dist/index.mjs","browser":{"ws":false},"engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.cjs"}}},"gitHead":"471288a6fbb6ee38b97f8a761876696314965de8","scripts":{"dev":"vite build --watch","test":"vitest run","build":"vite build","release":"npm run build && npm version patch --tag-version-prefix='' && git push && git push --tag","test:all":"vitest run && vitest run --config vitest.browser.config.ts","typecheck":"tsc --noEmit","test:watch":"vitest","postinstall":"patch-package && node scripts/patch-typia-exports.mjs","test:browser":"vitest run --config vitest.browser.config.ts","test:coverage":"vitest run --coverage && node scripts/update-coverage-badge.mjs"},"_npmUser":{"name":"markope","email":"marko.petzold@record-evolution.de"},"repository":{"url":"git+https://github.com/RecordEvolution/ironflock-js.git","type":"git"},"_npmVersion":"11.6.0","description":"Collect data in the IronFlock Storage architecture","directories":{},"_nodeVersion":"24.9.0","dependencies":{"autobahn":"26.3.1","eventemitter3":"^5.0.4"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","typia":"^12.0.1","vitest":"^3.0.0","happy-dom":"^20.8.4","typescript":"^5.7.0","@types/node":"^20.11.0","patch-package":"^8.0.0","@types/autobahn":"^20.9.4","vite-plugin-dts":"^4.5.0","@vitest/coverage-v8":"^3.2.4","@kennethwkz/unplugin-typia":"^2.6.7"},"_npmOperationalInternal":{"tmp":"tmp/ironflock_1.5.2_1783517007656_0.43615697904896367","host":"s3://npm-registry-packages-npm-production"}},"1.5.3":{"name":"ironflock","version":"1.5.3","keywords":["ironflock","messaging"],"author":{"name":"IronFlock GmbH"},"license":"MIT","_id":"ironflock@1.5.3","maintainers":[{"name":"markope","email":"marko.petzold@record-evolution.de"}],"homepage":"https://github.com/RecordEvolution/ironflock-js#readme","bugs":{"url":"https://github.com/RecordEvolution/ironflock-js/issues"},"dist":{"shasum":"b26fd36d6cfb667b1850404cd9a513da5bb24c58","tarball":"https://registry.npmjs.org/ironflock/-/ironflock-1.5.3.tgz","fileCount":7,"integrity":"sha512-ZTLvgzgU91O01RH6Eu94LRyvZ1MUCjES+wrj5ODTQU2Ox9zg6IZDrs2dK2WLVenLDsS4prC8Ok+ggFx93yYVWw==","signatures":[{"sig":"MEQCIAzGBOdVeZiBeQbJA9r/XbsTZvouPA8O7exWjjvAvx7TAiAP/qR189zS7r7y6KqpSdZuokoq5abLO443wm8CYTp0aA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":397263},"main":"dist/index.cjs","type":"module","types":"dist/index.d.ts","module":"dist/index.mjs","browser":{"ws":false},"engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.cjs"}}},"gitHead":"e8850859f6c4fff842aa186390d824a2c8fbe94e","scripts":{"dev":"vite build --watch","test":"vitest run","build":"vite build","release":"npm run build && npm version patch --tag-version-prefix='' && git push && git push --tag","test:all":"vitest run && vitest run --config vitest.browser.config.ts","typecheck":"tsc --noEmit","test:watch":"vitest","postinstall":"patch-package && node scripts/patch-typia-exports.mjs","test:browser":"vitest run --config vitest.browser.config.ts","test:coverage":"vitest run --coverage && node scripts/update-coverage-badge.mjs"},"_npmUser":{"name":"markope","email":"marko.petzold@record-evolution.de"},"repository":{"url":"git+https://github.com/RecordEvolution/ironflock-js.git","type":"git"},"_npmVersion":"11.6.0","description":"Collect data in the IronFlock Storage architecture","directories":{},"_nodeVersion":"24.9.0","dependencies":{"autobahn":"26.3.1","eventemitter3":"^5.0.4"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","typia":"^12.0.1","vitest":"^3.0.0","happy-dom":"^20.8.4","typescript":"^5.7.0","@types/node":"^20.11.0","patch-package":"^8.0.0","@types/autobahn":"^20.9.4","vite-plugin-dts":"^4.5.0","@vitest/coverage-v8":"^3.2.4","@kennethwkz/unplugin-typia":"^2.6.7"},"_npmOperationalInternal":{"tmp":"tmp/ironflock_1.5.3_1783758294071_0.753194957710972","host":"s3://npm-registry-packages-npm-production"}},"1.6.0":{"name":"ironflock","version":"1.6.0","keywords":["ironflock","messaging"],"author":{"name":"IronFlock GmbH"},"license":"MIT","_id":"ironflock@1.6.0","maintainers":[{"name":"markope","email":"marko.petzold@record-evolution.de"}],"homepage":"https://github.com/RecordEvolution/ironflock-js#readme","bugs":{"url":"https://github.com/RecordEvolution/ironflock-js/issues"},"dist":{"shasum":"0562d7d0ab53c1912f54cd11a9aad0086d5b74b5","tarball":"https://registry.npmjs.org/ironflock/-/ironflock-1.6.0.tgz","fileCount":7,"integrity":"sha512-xzhcNrI4XXAeEivF6pCiGy9qELpTnUUxTUXs897amjNxLvC6Ztpa21StT2GGcL601f6Z+Zj1Tn5T9sXJx8LO5w==","signatures":[{"sig":"MEUCICy7nQqAimRy6a+sdIh3w0jo/QQFbNdFRse7C9yaGjRnAiEA9a8OlDXjC4qjEPyovm2MrFaWII9qhsB3kuriWQjwmfM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":436471},"main":"dist/index.cjs","type":"module","types":"dist/index.d.ts","module":"dist/index.mjs","browser":{"ws":false},"engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.cjs"}}},"gitHead":"1ceea0f41b5e7100036fe89ca7942002d7a7c266","scripts":{"dev":"vite build --watch","test":"vitest run","build":"vite build","release":"npm run build && npm version patch --tag-version-prefix='' && git push && git push --tag","test:all":"vitest run && vitest run --config vitest.browser.config.ts","typecheck":"tsc --noEmit","test:watch":"vitest","postinstall":"patch-package && node scripts/patch-typia-exports.mjs","test:browser":"vitest run --config vitest.browser.config.ts","test:coverage":"vitest run --coverage && node scripts/update-coverage-badge.mjs"},"_npmUser":{"name":"markope","email":"marko.petzold@record-evolution.de"},"repository":{"url":"git+https://github.com/RecordEvolution/ironflock-js.git","type":"git"},"_npmVersion":"11.6.0","description":"Collect data in the IronFlock Storage architecture","directories":{},"_nodeVersion":"24.9.0","dependencies":{"autobahn":"26.3.1","eventemitter3":"^5.0.4"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","typia":"^12.0.1","vitest":"^3.0.0","happy-dom":"^20.8.4","typescript":"^5.7.0","@types/node":"^20.11.0","patch-package":"^8.0.0","@types/autobahn":"^20.9.4","vite-plugin-dts":"^4.5.0","@vitest/coverage-v8":"^3.2.4","@kennethwkz/unplugin-typia":"^2.6.7"},"_npmOperationalInternal":{"tmp":"tmp/ironflock_1.6.0_1784978857461_0.8367724862090808","host":"s3://npm-registry-packages-npm-production"}},"1.6.2":{"name":"ironflock","version":"1.6.2","keywords":["ironflock","messaging"],"author":{"name":"IronFlock GmbH"},"license":"MIT","_id":"ironflock@1.6.2","maintainers":[{"name":"markope","email":"marko.petzold@record-evolution.de"}],"homepage":"https://github.com/RecordEvolution/ironflock-js#readme","bugs":{"url":"https://github.com/RecordEvolution/ironflock-js/issues"},"dist":{"shasum":"49aa3780fb2eb5bd915d3acc7f3b25feb9d91f8b","tarball":"https://registry.npmjs.org/ironflock/-/ironflock-1.6.2.tgz","fileCount":7,"integrity":"sha512-IrM3dKBLYsBV13irlZPGid3KJRu3qsfr3XlpZxTTcXct+gMkUKp1IPw1fySlpst/5rGvsvs/gK1k3Xopn3zvWQ==","signatures":[{"sig":"MEUCIQCDN2+IedKWoUwDa0eNgSaMswEHlChbXLxZOjnLPE74/wIgArOnVSlEur9I5fNknxIa81Nr6+CGkXpNGsNgUlyneCc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":441340},"main":"dist/index.cjs","type":"module","types":"dist/index.d.ts","module":"dist/index.mjs","browser":{"ws":false},"engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.cjs"}}},"gitHead":"9021cb0059735180605f08ac0d4e33a36b7b564f","scripts":{"dev":"vite build --watch","test":"vitest run","build":"vite build","release":"npm run build && npm version patch --tag-version-prefix='' && git push && git push --tag","test:all":"vitest run && vitest run --config vitest.browser.config.ts","typecheck":"tsc --noEmit","test:watch":"vitest","postinstall":"patch-package && node scripts/patch-typia-exports.mjs","test:browser":"vitest run --config vitest.browser.config.ts","test:coverage":"vitest run --coverage && node scripts/update-coverage-badge.mjs"},"_npmUser":{"name":"markope","email":"marko.petzold@record-evolution.de"},"repository":{"url":"git+https://github.com/RecordEvolution/ironflock-js.git","type":"git"},"_npmVersion":"11.6.0","description":"Collect data in the IronFlock Storage architecture","directories":{},"_nodeVersion":"24.9.0","dependencies":{"autobahn":"26.3.1","eventemitter3":"^5.0.4"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","typia":"^12.0.1","vitest":"^3.0.0","happy-dom":"^20.8.4","typescript":"^5.7.0","@types/node":"^20.11.0","patch-package":"^8.0.0","@types/autobahn":"^20.9.4","vite-plugin-dts":"^4.5.0","@vitest/coverage-v8":"^3.2.4","@kennethwkz/unplugin-typia":"^2.6.7"},"_npmOperationalInternal":{"tmp":"tmp/ironflock_1.6.2_1786550782373_0.6707187061845963","host":"s3://npm-registry-packages-npm-production"}},"1.7.0":{"name":"ironflock","version":"1.7.0","keywords":["ironflock","messaging"],"author":{"name":"IronFlock GmbH"},"license":"MIT","_id":"ironflock@1.7.0","maintainers":[{"name":"markope","email":"marko.petzold@record-evolution.de"}],"homepage":"https://github.com/RecordEvolution/ironflock-js#readme","bugs":{"url":"https://github.com/RecordEvolution/ironflock-js/issues"},"dist":{"shasum":"9b51b1484d54307b025c138a2576f818fabaf9ac","tarball":"https://registry.npmjs.org/ironflock/-/ironflock-1.7.0.tgz","fileCount":7,"integrity":"sha512-w+G3HIqEooQjBP6ClV3iyr1PQ9L5YZP4xy1DmlEgPC+0LRZ3kTG557TAWFzyU4ysvLI3qSHR7b4qNY2gQTfVgA==","signatures":[{"sig":"MEQCIFkwq55BMPShN0p1DIavVljYlPGTRwpRIV9iB6aXqzKhAiA5vXXU2H4jk/HlJOVloXcDDWVWQ3K9QgrrOBZEhIlW5w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":547891},"main":"dist/index.cjs","type":"module","types":"dist/index.d.ts","module":"dist/index.mjs","browser":{"ws":false},"engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.cjs"}}},"gitHead":"024b78678e05d1a435eca992d01c5e391bab25e7","scripts":{"dev":"vite build --watch","test":"vitest run","build":"vite build","release":"npm run build && npm version patch --tag-version-prefix='' && git push && git push --tag","test:all":"vitest run && vitest run --config vitest.browser.config.ts","typecheck":"tsc --noEmit","test:watch":"vitest","postinstall":"patch-package && node scripts/patch-typia-exports.mjs","test:browser":"vitest run --config vitest.browser.config.ts","test:coverage":"vitest run --coverage && node scripts/update-coverage-badge.mjs"},"_npmUser":{"name":"markope","email":"marko.petzold@record-evolution.de"},"repository":{"url":"git+https://github.com/RecordEvolution/ironflock-js.git","type":"git"},"_npmVersion":"11.6.0","description":"Collect data in the IronFlock Storage architecture","directories":{},"_nodeVersion":"24.9.0","dependencies":{"autobahn":"26.3.1","eventemitter3":"^5.0.4"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","typia":"^12.0.1","vitest":"^3.0.0","happy-dom":"^20.8.4","typescript":"^5.7.0","@types/node":"^20.11.0","patch-package":"^8.0.0","@types/autobahn":"^20.9.4","vite-plugin-dts":"^4.5.0","@vitest/coverage-v8":"^3.2.4","@kennethwkz/unplugin-typia":"^2.6.7"},"_npmOperationalInternal":{"tmp":"tmp/ironflock_1.7.0_1786618807031_0.21769119045745788","host":"s3://npm-registry-packages-npm-production"}},"1.7.2":{"name":"ironflock","version":"1.7.2","keywords":["ironflock","messaging"],"author":{"name":"IronFlock GmbH"},"license":"MIT","_id":"ironflock@1.7.2","maintainers":[{"name":"markope","email":"marko.petzold@record-evolution.de"}],"homepage":"https://github.com/RecordEvolution/ironflock-js#readme","bugs":{"url":"https://github.com/RecordEvolution/ironflock-js/issues"},"dist":{"shasum":"d83b424d385ff7be01f9d33873d0ced58f43279c","tarball":"https://registry.npmjs.org/ironflock/-/ironflock-1.7.2.tgz","fileCount":7,"integrity":"sha512-sy63ZNLnmIbhOJPV/Td71bLtDVoJ8bvAuuooqaSOBBqQ56Hr78+ozxjZ5SH+7jpiMkjtCxNR8KPZECH8B9dlbw==","signatures":[{"sig":"MEYCIQC055FY8cnGk6m4sHZge6x2y3DkTs1sWhKfWpoIESQZ+AIhAKPgPusww3Nhhdf/rLIcSnPBSAryu35Tt2asaWK9Sstl","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":555732},"main":"dist/index.cjs","type":"module","types":"dist/index.d.ts","module":"dist/index.mjs","browser":{"ws":false},"engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.cjs"}}},"gitHead":"8c7e397e5d9f22e5462b669af1be198d9fc10be3","scripts":{"dev":"vite build --watch","test":"vitest run","build":"vite build","release":"npm run build && npm version patch --tag-version-prefix='' && git push && git push --tag","test:all":"vitest run && vitest run --config vitest.browser.config.ts","typecheck":"tsc --noEmit","test:watch":"vitest","postinstall":"patch-package && node scripts/patch-typia-exports.mjs","test:browser":"vitest run --config vitest.browser.config.ts","test:coverage":"vitest run --coverage && node scripts/update-coverage-badge.mjs"},"_npmUser":{"name":"markope","email":"marko.petzold@record-evolution.de"},"repository":{"url":"git+https://github.com/RecordEvolution/ironflock-js.git","type":"git"},"_npmVersion":"11.6.0","description":"Collect data in the IronFlock Storage architecture","directories":{},"_nodeVersion":"24.9.0","dependencies":{"autobahn":"26.3.1","eventemitter3":"^5.0.4"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","typia":"^12.0.1","vitest":"^3.0.0","happy-dom":"^20.8.4","typescript":"^5.7.0","@types/node":"^20.11.0","patch-package":"^8.0.0","@types/autobahn":"^20.9.4","vite-plugin-dts":"^4.5.0","@vitest/coverage-v8":"^3.2.4","@kennethwkz/unplugin-typia":"^2.6.7"},"_npmOperationalInternal":{"tmp":"tmp/ironflock_1.7.2_1786621382279_0.9122661780461128","host":"s3://npm-registry-packages-npm-production"}},"1.8.1":{"name":"ironflock","version":"1.8.1","keywords":["ironflock","messaging"],"author":{"name":"IronFlock GmbH"},"license":"MIT","_id":"ironflock@1.8.1","maintainers":[{"name":"markope","email":"marko.petzold@record-evolution.de"}],"homepage":"https://github.com/RecordEvolution/ironflock-js#readme","bugs":{"url":"https://github.com/RecordEvolution/ironflock-js/issues"},"dist":{"shasum":"83cf36d04d9eac8bfbc10f59a2b6a3d4629eaa7e","tarball":"https://registry.npmjs.org/ironflock/-/ironflock-1.8.1.tgz","fileCount":7,"integrity":"sha512-2rhzobJYbU3l7mNwh5X/jLXGzhtocSl/8pRqgt+ToUztejVGE/k0QWlZ/p9L1z5bIDfmCNjD8Bvhq2aVWDCCCQ==","signatures":[{"sig":"MEUCIQDc0NSCF3ItTmlx1K4tBn3yO8rb4+KBDCfNkg9wpTFBdQIgZoY9XC6gHYmZvXZlSKsbm0Go2EL+xvhd7MKuM756fhM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":641377},"main":"dist/index.cjs","type":"module","types":"dist/index.d.ts","module":"dist/index.mjs","browser":{"ws":false},"engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.cjs"}}},"gitHead":"2085ddabaeeeaf86ff25428e1c5049be4e90ae8a","scripts":{"dev":"vite build --watch","test":"vitest run","build":"vite build","release":"npm run build && npm version patch --tag-version-prefix='' && git push && git push --tag","test:all":"vitest run && vitest run --config vitest.browser.config.ts","typecheck":"tsc --noEmit","test:watch":"vitest","postinstall":"patch-package && node scripts/patch-typia-exports.mjs","test:browser":"vitest run --config vitest.browser.config.ts","test:coverage":"vitest run --coverage && node scripts/update-coverage-badge.mjs"},"_npmUser":{"name":"markope","email":"marko.petzold@record-evolution.de"},"repository":{"url":"git+https://github.com/RecordEvolution/ironflock-js.git","type":"git"},"_npmVersion":"11.6.0","description":"Collect data in the IronFlock Storage architecture","directories":{},"_nodeVersion":"24.9.0","dependencies":{"autobahn":"26.3.1","eventemitter3":"^5.0.4"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","typia":"^12.0.1","vitest":"^3.0.0","happy-dom":"^20.8.4","typescript":"^5.7.0","@types/node":"^20.11.0","patch-package":"^8.0.0","@types/autobahn":"^20.9.4","vite-plugin-dts":"^4.5.0","@vitest/coverage-v8":"^3.2.4","@kennethwkz/unplugin-typia":"^2.6.7"},"_npmOperationalInternal":{"tmp":"tmp/ironflock_1.8.1_1787747968816_0.7989790159168104","host":"s3://npm-registry-packages-npm-production"}},"1.8.2":{"name":"ironflock","version":"1.8.2","keywords":["ironflock","messaging"],"author":{"name":"IronFlock GmbH"},"license":"MIT","_id":"ironflock@1.8.2","maintainers":[{"name":"markope","email":"marko.petzold@record-evolution.de"}],"homepage":"https://github.com/RecordEvolution/ironflock-js#readme","bugs":{"url":"https://github.com/RecordEvolution/ironflock-js/issues"},"dist":{"shasum":"7d7148f9212672eb0ca5e9040cba9c7ca5b497c7","tarball":"https://registry.npmjs.org/ironflock/-/ironflock-1.8.2.tgz","fileCount":7,"integrity":"sha512-5WWkdyWtU414OjDCyeZaoHk00ax7mJJqmkzma66FCeMzGLJIbnln/Ampx1SmUBbPFxHkWCIoA6smFlZvw//ugQ==","signatures":[{"sig":"MEYCIQC9p6QvWR1ORYzhn+QMZvOOwXvTsfFZXF5QYwFjaRCAPQIhAOsY9tZfIv1/HeIBQ783u5wxnaI19mIRBDaonnamTQ0M","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":700597},"main":"dist/index.cjs","type":"module","types":"dist/index.d.ts","module":"dist/index.mjs","browser":{"ws":false},"engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.cjs"}}},"gitHead":"8f95f09ffe4ec906e54b287abd5bb998ea38fe23","scripts":{"dev":"vite build --watch","test":"vitest run","build":"vite build","release":"npm run build && npm version patch --tag-version-prefix='' && git push && git push --tag","test:all":"vitest run && vitest run --config vitest.browser.config.ts","typecheck":"tsc --noEmit","test:watch":"vitest","postinstall":"patch-package && node scripts/patch-typia-exports.mjs","test:browser":"vitest run --config vitest.browser.config.ts","test:coverage":"vitest run --coverage && node scripts/update-coverage-badge.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:d6beb84a-da0d-4812-99b0-60d02ad7991c"}},"repository":{"url":"git+https://github.com/RecordEvolution/ironflock-js.git","type":"git"},"_npmVersion":"11.19.0","description":"Collect data in the IronFlock Storage architecture","directories":{},"_nodeVersion":"24.20.0","dependencies":{"autobahn":"26.3.1","eventemitter3":"^5.0.4"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","typia":"^12.0.1","vitest":"^3.0.0","happy-dom":"^20.8.4","typescript":"^5.7.0","@types/node":"^20.11.0","patch-package":"^8.0.0","@types/autobahn":"^20.9.4","vite-plugin-dts":"^4.5.0","@vitest/coverage-v8":"^3.2.4","@kennethwkz/unplugin-typia":"^2.6.7"},"_npmOperationalInternal":{"tmp":"tmp/ironflock_1.8.2_1788025406843_0.3677586322860642","host":"s3://npm-registry-packages-npm-production"}},"1.8.3":{"name":"ironflock","version":"1.8.3","keywords":["ironflock","messaging"],"author":{"name":"IronFlock GmbH"},"license":"MIT","_id":"ironflock@1.8.3","maintainers":[{"name":"markope","email":"marko.petzold@record-evolution.de"}],"homepage":"https://github.com/RecordEvolution/ironflock-js#readme","bugs":{"url":"https://github.com/RecordEvolution/ironflock-js/issues"},"dist":{"shasum":"8212dc3605834372d3265445168214c752a972ec","tarball":"https://registry.npmjs.org/ironflock/-/ironflock-1.8.3.tgz","fileCount":7,"integrity":"sha512-n/+bgRc+YQ4gkjdqBTSWxs5pRizSPtwpt2o7+hJkhS3aBfBGHARwL5Eq0Dr475pQvTA18i1kUMsLx4T1v37Ckw==","signatures":[{"sig":"MEYCIQDlzZzyCim7041QZyK0bvVbgfO0mah3Zqt2XPbuDKELpAIhAL1TiBjz2GAETameVDYS+WYV+fT+MaYgJdzPikl3Kpri","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":715297},"main":"dist/index.cjs","type":"module","types":"dist/index.d.ts","module":"dist/index.mjs","browser":{"ws":false},"engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.cjs"}}},"gitHead":"1b3b15597ffef11bc3d43ba4f297795531f612c0","scripts":{"dev":"vite build --watch","test":"vitest run","build":"vite build","release":"npm run build && npm version patch --tag-version-prefix='' && git push && git push --tag","test:all":"vitest run && vitest run --config vitest.browser.config.ts","typecheck":"tsc --noEmit","test:watch":"vitest","postinstall":"patch-package && node scripts/patch-typia-exports.mjs","test:browser":"vitest run --config vitest.browser.config.ts","test:coverage":"vitest run --coverage && node scripts/update-coverage-badge.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:d6beb84a-da0d-4812-99b0-60d02ad7991c"}},"repository":{"url":"git+https://github.com/RecordEvolution/ironflock-js.git","type":"git"},"_npmVersion":"11.19.0","description":"Collect data in the IronFlock Storage architecture","directories":{},"_nodeVersion":"24.20.0","dependencies":{"autobahn":"26.3.1","eventemitter3":"^5.0.4"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","typia":"^12.0.1","vitest":"^3.0.0","happy-dom":"^20.8.4","typescript":"^5.7.0","@types/node":"^20.11.0","patch-package":"^8.0.0","@types/autobahn":"^20.9.4","vite-plugin-dts":"^4.5.0","@vitest/coverage-v8":"^3.2.4","@kennethwkz/unplugin-typia":"^2.6.7"},"_npmOperationalInternal":{"tmp":"tmp/ironflock_1.8.3_1788825143247_0.4126027691271652","host":"s3://npm-registry-packages-npm-production"}},"1.8.4":{"_id":"ironflock@1.8.4","bugs":{"url":"https://github.com/RecordEvolution/ironflock-js/issues"},"dist":{"shasum":"52de1918aec6c12bf20b21e0d288e503a5403dce","tarball":"https://registry.npmjs.org/ironflock/-/ironflock-1.8.4.tgz","fileCount":7,"integrity":"sha512-ZJz8wT/2npahd1a6TPqwk1IXp42x7yw/aVJl8OaAp+Q0P156IDxLiERi29YPDV71y8LftgzVHxvbCoOHAILubg==","signatures":[{"sig":"MEUCIH2rtbLrX/JNZkvu9HOfqcuCPtwMJeZt5xyjjhYmeFMtAiEAuLNpcIOBNAjcHFPU9Sdr1JDIWUGASa4mzuDga/irhjw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCICT/Dx0POU/YWGFNcXwX0zZi2MOva0M4CCxQZ7Psk++RAiABCQ5npQ4bOeNmqY+W2q7YwcEEx92VU0W/JqxEYHSapA=="}],"unpackedSize":760446},"main":"dist/index.cjs","name":"ironflock","type":"module","types":"dist/index.d.ts","author":{"name":"IronFlock GmbH"},"module":"dist/index.mjs","browser":{"ws":false},"engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.cjs"}}},"gitHead":"3ad1c7d06c963de37719b4a5c000673a35123b6d","license":"MIT","scripts":{"dev":"vite build --watch","test":"vitest run","build":"vite build","release":"npm run build && npm version patch --tag-version-prefix='' && git push && git push --tag","test:all":"vitest run && vitest run --config vitest.browser.config.ts","typecheck":"tsc --noEmit","test:watch":"vitest","postinstall":"patch-package && node scripts/patch-typia-exports.mjs","test:browser":"vitest run --config vitest.browser.config.ts","test:coverage":"vitest run --coverage && node scripts/update-coverage-badge.mjs"},"version":"1.8.4","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:d6beb84a-da0d-4812-99b0-60d02ad7991c"}},"homepage":"https://github.com/RecordEvolution/ironflock-js#readme","keywords":["ironflock","messaging"],"repository":{"url":"git+https://github.com/RecordEvolution/ironflock-js.git","type":"git"},"_npmVersion":"11.19.0","description":"Collect data in the IronFlock Storage architecture","directories":{},"maintainers":[{"name":"markope","email":"marko.petzold@record-evolution.de"}],"_nodeVersion":"24.20.0","dependencies":{"autobahn":"26.3.1","eventemitter3":"^5.0.4"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^6.0.0","typia":"^12.0.1","vitest":"^3.0.0","happy-dom":"^20.8.4","typescript":"^5.7.0","@types/node":"^20.11.0","patch-package":"^8.0.0","@types/autobahn":"^20.9.4","vite-plugin-dts":"^4.5.0","@vitest/coverage-v8":"^3.2.4","@kennethwkz/unplugin-typia":"^2.6.7"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/ironflock_1.8.4_1789468656303_0.7863023722335645"}}},"time":{"created":"2024-06-27T08:42:11.011Z","modified":"2026-09-15T10:37:36.582Z","0.0.6":"2024-06-27T08:42:11.150Z","0.0.7":"2024-06-27T08:51:42.818Z","0.0.8":"2024-06-27T08:52:18.187Z","0.1.0":"2024-06-27T08:53:11.603Z","0.1.1":"2024-06-27T09:02:03.236Z","1.0.1":"2024-07-31T13:49:33.026Z","1.0.2":"2024-07-31T13:56:17.893Z","1.1.1":"2026-03-19T09:41:59.079Z","1.2.1":"2026-03-19T13:17:52.153Z","1.2.2":"2026-03-21T12:27:41.134Z","1.2.3":"2026-03-22T09:31:39.070Z","1.2.4":"2026-03-24T17:02:33.073Z","1.2.6":"2026-03-28T17:44:46.779Z","1.2.8":"2026-05-08T20:02:23.224Z","1.2.9":"2026-05-12T09:52:44.615Z","1.3.2":"2026-06-15T12:52:28.504Z","1.3.3":"2026-06-21T13:47:04.982Z","1.5.1":"2026-07-06T12:15:27.950Z","1.5.2":"2026-07-08T13:23:27.782Z","1.5.3":"2026-07-11T08:24:54.263Z","1.6.0":"2026-07-25T11:27:37.635Z","1.6.2":"2026-08-12T16:06:22.540Z","1.7.0":"2026-08-13T11:00:07.232Z","1.7.2":"2026-08-13T11:43:02.426Z","1.8.1":"2026-08-26T12:39:28.994Z","1.8.2":"2026-08-29T17:43:27.015Z","1.8.3":"2026-09-07T23:52:23.428Z","1.8.4":"2026-09-15T10:37:36.433Z"},"bugs":{"url":"https://github.com/RecordEvolution/ironflock-js/issues"},"author":{"name":"IronFlock GmbH"},"license":"MIT","homepage":"https://github.com/RecordEvolution/ironflock-js#readme","keywords":["ironflock","messaging"],"repository":{"url":"git+https://github.com/RecordEvolution/ironflock-js.git","type":"git"},"description":"Collect data in the IronFlock Storage architecture","maintainers":[{"name":"markope","email":"marko.petzold@record-evolution.de"}],"readme":"# ironflock\n\n![Coverage](https://img.shields.io/badge/coverage-89%25-green)\n\n## About\n\nWith this library you can publish data from your apps on your IoT edge hardware to the fleet data storage of the [IronFlock](https://studio.ironflock.com) devops platform.\nWhen this library is used on a certain device the library automatically uses the private messaging realm (Unified Name Space)\nof the device's fleet and the data is collected in the respective fleet database.\n\nSo if you use the library in your app, the data collection will always be private to the app user's fleet.\n\nFor more information on the IronFlock IoT Devops Platform for engineers and developers visit our [IronFlock](https://www.ironflock.com) home page.\n\n## Requirements\n\n- **Node.js**: 18 or higher\n- **Browser**: Any modern browser with WebSocket support (Chrome, Firefox, Safari, Edge)\n\n## Installation\n\n```shell\nnpm install ironflock\n```\n\n## Usage\n\n```ts\nimport { IronFlock } from \"ironflock\";\n\n// Create an IronFlock instance to connect to the IronFlock platform data infrastructure.\n// The IronFlock instance handles authentication when run on a device registered in IronFlock.\nconst ironflock = new IronFlock();\n\n// Start the connection to the platform\nawait ironflock.start();\n\n// Publish an event\nawait ironflock.publish(\"test.publish.example\", [{ temperature: 20 }]);\n\n// Stop the connection when done\nawait ironflock.stop();\n```\n\n## Options\n\nThe `IronFlock` constructor accepts an options object. In Node.js, values fall back to environment variables. In the browser, all config must be passed explicitly.\n\n```ts\n{\n  serialNumber?: string;  // Device serial number (env: DEVICE_SERIAL_NUMBER)\n  deviceName?: string;    // Device display name (env: DEVICE_NAME)\n  deviceKey?: string;     // Device key for auth (env: DEVICE_KEY)\n  appName?: string;       // Application name (env: APP_NAME)\n  swarmKey?: number;      // Fleet/swarm key (env: SWARM_KEY)\n  appKey?: number;        // Application key (env: APP_KEY)\n  env?: string;           // Environment: \"DEV\" or \"PROD\" (env: ENV)\n  reswarmUrl?: string;    // Studio URL to resolve WebSocket URI (env: RESWARM_URL)\n  cburl?: string;         // Direct WebSocket URI override\n}\n```\n\nAll fields are optional in the type, but `serialNumber` is required at runtime (either via the option or the `DEVICE_SERIAL_NUMBER` environment variable).\n\n## Browser Usage\n\nThe library works in modern browsers. Since browsers don't have environment variables, pass all config via the constructor:\n\n```ts\nimport { IronFlock } from \"ironflock\";\n\nconst ironflock = new IronFlock({\n  serialNumber: \"device-serial-from-server\",\n  deviceKey: \"my-device-key\",\n  appName: \"MyWebApp\",\n  swarmKey: 10,\n  appKey: 20,\n  env: \"PROD\",\n});\n\nawait ironflock.start();\nawait ironflock.publish(\"sensor.readings\", [{ temperature: 22 }]);\n```\n\n### Loading config from a server\n\nUse `IronFlock.fromServer()` to fetch configuration from your backend:\n\n```ts\nimport { IronFlock } from \"ironflock\";\n\n// Your backend endpoint returns a JSON object matching IronFlockOptions\nconst ironflock = await IronFlock.fromServer(\"/api/ironflock-config\");\nawait ironflock.start();\n```\n\nYour backend endpoint should return JSON like:\n\n```json\n{\n  \"serialNumber\": \"device-serial-123\",\n  \"deviceKey\": \"dev-key-1\",\n  \"appName\": \"MyApp\",\n  \"swarmKey\": 10,\n  \"appKey\": 20,\n  \"env\": \"PROD\"\n}\n```\n\nNormally the server should extracts these values from the environment variables of the server process, since they depend on the execution environment. i.e. the edge device the server is running on.\n\n> **Security note:** The endpoint providing device credentials should be protected by authentication. This is normally already provided by the IronFlock remote access proxy when executed in an IronFlock project.\n\n## API Reference\n\n### `publish(topic, args?, kwargs?)`\n\nPublishes an event to a topic on the IronFlock message router.\n\n```ts\nconst publication = await ironflock.publish(\"com.myapp.mytopic\", [{ temperature: 20 }]);\n```\n\n| Parameter | Type | Description |\n|-----------|------|-------------|\n| `topic` | `string` | The URI of the topic to publish to |\n| `args` | `unknown[]`, optional | Payload arguments |\n| `kwargs` | `Record<string, unknown>`, optional | Payload keyword arguments |\n\n**Returns:** `Promise<unknown>` — The publication object (an acknowledged publish receipt).\n\n---\n\n### `publishToTable(tablename, args?, kwargs?)`\n\nConvenience function to publish data to a fleet table in the IronFlock platform. Automatically constructs the correct topic using the `SWARM_KEY` and `APP_KEY` environment variables.\n\n```ts\nawait ironflock.publishToTable(\"sensordata\", [{ temperature: 22.5, humidity: 60 }]);\n```\n\n| Parameter | Type | Description |\n|-----------|------|-------------|\n| `tablename` | `string` | The name of the table, e.g. `\"sensordata\"` |\n| `args` | `unknown[]`, optional | Row data to publish |\n| `kwargs` | `Record<string, unknown>`, optional | Row data as keyword arguments |\n\n**Returns:** `Promise<unknown>` — The publication object (an acknowledged publish receipt).\n\n---\n\n### `appendToTable(tablename, args?, kwargs?)`\n\nAppends data to a fleet table by calling the registered append procedure at `append.<SWARM_KEY>.<APP_KEY>.<tablename>`. Unlike `publishToTable`, this uses a remote procedure call rather than a pub/sub event.\n\n```ts\nawait ironflock.appendToTable(\"sensordata\", [{ temperature: 22.5, humidity: 60 }]);\n```\n\n| Parameter | Type | Description |\n|-----------|------|-------------|\n| `tablename` | `string` | The name of the table, e.g. `\"sensordata\"` |\n| `args` | `unknown[]`, optional | Row data to append |\n| `kwargs` | `Record<string, unknown>`, optional | Row data as keyword arguments |\n\n**Returns:** `Promise<unknown>` — The result of the remote procedure call.\n\n---\n\n### `publishRowsToTable(tablename, rows, kwargs?)`\n\nPublishes **many rows in a single message** (bulk insert) to the dedicated topic `bulk.<SWARM_KEY>.<APP_KEY>.<tablename>`. The platform inserts the whole batch atomically (all-or-nothing) in one operation. Use this for high-frequency data where one round-trip per row is too costly. Like `publishToTable`, this is fire-and-forget — the ack confirms delivery to the router, not the DB insert.\n\n```ts\nawait ironflock.publishRowsToTable(\"sensordata\", [\n  { tsp: \"2024-01-15T10:30:00.000Z\", temperature: 22.5 },\n  { tsp: \"2024-01-15T10:30:01.000Z\", temperature: 22.7 },\n]);\n```\n\n| Parameter | Type | Description |\n|-----------|------|-------------|\n| `tablename` | `string` | The name of the table, e.g. `\"sensordata\"` |\n| `rows` | `Record<string, unknown>[]` | Non-empty array of row objects to insert |\n| `kwargs` | `Record<string, unknown>`, optional | Extra arguments shared by the whole batch |\n\n**Returns:** `Promise<unknown>` — The publication object (an acknowledged publish receipt).\n\n---\n\n### `appendRowsToTable(tablename, rows, kwargs?)`\n\nAppends **many rows in a single RPC** (bulk insert) by calling the dedicated procedure `appendBulk.<SWARM_KEY>.<APP_KEY>.<tablename>`. The platform inserts the whole batch atomically (all-or-nothing): if any row is invalid the entire batch is rejected and nothing is persisted. Prefer this over `publishRowsToTable` when you need the insert outcome.\n\n```ts\nconst result = await ironflock.appendRowsToTable(\"sensordata\", [\n  { tsp: \"2024-01-15T10:30:00.000Z\", temperature: 22.5 },\n  { tsp: \"2024-01-15T10:30:01.000Z\", temperature: 22.7 },\n]);\n// result -> { success: true, count: 2 }\n```\n\n| Parameter | Type | Description |\n|-----------|------|-------------|\n| `tablename` | `string` | The name of the table, e.g. `\"sensordata\"` |\n| `rows` | `Record<string, unknown>[]` | Non-empty array of row objects to insert |\n| `kwargs` | `Record<string, unknown>`, optional | Extra arguments shared by the whole batch |\n\n**Returns:** `Promise<unknown>` — The result of the remote procedure call (e.g. `{ success: true, count: N }`).\n\n---\n\n### `reportError(error, opts?)`\n\nReports an application error into the fleet's `error-logs` table. This is a convenience wrapper over `publishToTable` / `appendToTable`: it stamps the row with `source: \"app\"`, a severity `level`, and a timestamp, then writes it like any normal table row. The error lands in the same per-databackend `error-logs` table that fleetdb system errors use (tagged `source: \"system\"`), so it is queryable with `getHistory`, streamable with `subscribeToTable`, usable in board-templates, and delivered in realtime on `transformed.error-logs` — without firing the platform's system-error toast.\n\n```ts\n// Fire-and-forget (default): publishes to the error-logs table\nawait ironflock.reportError(\"Sensor read timed out\", { level: \"warn\" });\n\n// Pass an Error to capture its stack (falls back to the message)\ntry {\n  riskyOperation();\n} catch (err) {\n  await ironflock.reportError(err as Error);\n}\n\n// Use the append RPC when you want to await the insert outcome\nawait ironflock.reportError(\"Calibration failed\", { level: \"error\", append: true });\n```\n\n| Parameter | Type | Description |\n|-----------|------|-------------|\n| `error` | `string \\| Error` | The error message, or an `Error` whose stack (or message) is recorded |\n| `opts` | `ReportErrorOptions`, optional | Options (see below) |\n\n**opts fields:**\n\n| Field | Type | Description |\n|-------|------|-------------|\n| `level` | `ErrorLevel`, optional | Severity: `\"error\"`, `\"warn\"`, `\"info\"` or `\"debug\"`. Defaults to `\"error\"` |\n| `append` | `boolean`, optional | When `true`, use the append RPC (resolves with the insert outcome). Defaults to `false` (fire-and-forget publish) |\n| `tsp` | `string`, optional | ISO-8601 timestamp override. Defaults to the current time |\n\n**Returns:** `Promise<unknown>` — The publication object, or — with `append: true` — the result of the remote procedure call.\n\n---\n\n### `subscribe(topic, handler)`\n\nSubscribes to a topic on the IronFlock message router.\n\n```ts\nfunction onMessage(...args: any[]) {\n  console.log(\"Received:\", args);\n}\n\nconst subscription = await ironflock.subscribe(\"com.myapp.mytopic\", onMessage);\n```\n\n| Parameter | Type | Description |\n|-----------|------|-------------|\n| `topic` | `string` | The URI of the topic to subscribe to |\n| `handler` | `(...args: any[]) => void` | Function called when a message is received |\n\n**Returns:** `Promise<Subscription | undefined>` — The subscription object.\n\n---\n\n### `subscribeToTable(tablename, handler)`\n\nConvenience function to subscribe to a fleet table. Automatically constructs the correct topic using the `SWARM_KEY` and `APP_KEY` environment variables. Receives rows written via both the single-row and the bulk insert paths — rows from a bulk insert are delivered to your handler one at a time, so handler code stays the same.\n\n```ts\nfunction onTableData(...args: any[]) {\n  console.log(\"New row:\", args);\n}\n\nawait ironflock.subscribeToTable(\"sensordata\", onTableData);\n```\n\n| Parameter | Type | Description |\n|-----------|------|-------------|\n| `tablename` | `string` | The name of the table to subscribe to |\n| `handler` | `(...args: any[]) => void` | Function called when new data arrives |\n\n**Returns:** `Promise<Subscription | undefined>` — The subscription object.\n\n---\n\n### `getHistory(tablename, queryParams?)`\n\nRetrieves historical data from a fleet table.\n\n```ts\n// Simple query with limit\nconst data = await ironflock.getHistory(\"sensordata\", { limit: 100 });\n\n// Query with time range and filters\nconst data = await ironflock.getHistory(\"sensordata\", {\n  limit: 500,\n  offset: 0,\n  timeRange: [\"2026-01-01T00:00:00Z\", \"2026-03-01T00:00:00Z\"],\n  filterAnd: [\n    { column: \"temperature\", operator: \">\", value: 20 },\n    { column: \"humidity\", operator: \"<=\", value: 80 },\n  ],\n});\n\n// Current value(s) only: add the `latest` marker. The data backend derives\n// the latest row per entity in SQL (entity = the table's maintainLatestFlagFor\n// columns from the data-template; without one, the single most recent row).\nconst current = await ironflock.getHistory(\"sensordata\", {\n  limit: 100,\n  filterAnd: [{ latest: true }],\n});\n```\n\n| Parameter | Type | Description |\n|-----------|------|-------------|\n| `tablename` | `string` | The name of the table to query |\n| `queryParams` | `TableQueryParams` | Query parameters (see below) |\n\n**queryParams fields:**\n\n| Field | Type | Description |\n|-------|------|-------------|\n| `limit` | `number` | Maximum number of rows to return (1–10000, required) |\n| `offset` | `number`, optional | Offset for pagination |\n| `timeRange` | `TimeRangePair`, optional | `[start, end]` — ISO strings or epoch-ms numbers; `null` = open end. A legacy `{ start, end }` object is still accepted and sent as the pair |\n| `filterAnd` | `TableFilter[]`, optional | List of AND filter conditions `{ column: string, operator: string, value: ... }`, and/or the `{ latest: true }` mode marker (see below) |\n| `columns` | `string[]`, optional | Columns to return (`tsp`, `device_key` and `authid` are always included). Omit for all columns |\n\nSupported filter operators: `=`, `!=`, `<>`, `>`, `<`, `>=`, `<=`, `LIKE`, `ILIKE`, `NOT LIKE`, `NOT ILIKE`, `IN`, `NOT IN`, `IS NULL`, `IS NOT NULL`.\n\n`IS NULL` and `IS NOT NULL` take no `value`, and they are the only way to ask about NULL: every other operator yields unknown on a NULL column and excludes the row, exactly as it does in SQL. `LIKE` is case-sensitive; use `ILIKE` to match case-insensitively.\n\n**Combining with OR:** entries of `filterAnd` are AND-ed. A group entry combines its own entries with one operator, so the soft-delete pattern becomes:\n\n```ts\nfilterAnd: [\n  {\n    combinator: \"OR\",\n    filters: [\n      { column: \"deleted\", operator: \"IS NULL\" },\n      { column: \"deleted\", operator: \"=\", value: false },\n    ],\n  },\n]\n```\n\nA data backend that predates groups rejects this shape rather than applying part of it, so it fails loudly instead of quietly returning rows the filter excludes.\n\n**Latest values:** a `{ latest: true }` entry in `filterAnd` is not a WHERE predicate but a mode switch: the data backend returns only the latest row per entity, derived on the fly in SQL (`DISTINCT ON` over the entity key declared as `maintainLatestFlagFor` in the table's data-template; a table without an entity key yields the single most recent row). The former physical `latest_flag` column no longer exists — a legacy `{ column: \"latest_flag\", operator: \"=\", value: true }` filter is still accepted and treated as the marker, but new code should use `{ latest: true }`. Other predicates combine with the marker as expected: entity-key predicates narrow which entities are returned, all other predicates and `timeRange` filter the resulting latest rows.\n\n**Returns:** `Promise<unknown>` — The query result data (typically an array of row objects).\n\n**Throws:** `Error` with a descriptive message on invalid parameters, when the history procedure is not registered (table not declared / data backend not running), or when the router rejects the call.\n\n---\n\n### `getSeriesHistory(tablename, params)`\n\nRetrieves **down-sampled time-series** data from a fleet table — numeric columns aggregated into time namespaces (e.g. hourly averages). Ideal for charts over long time ranges. Available for tables (not transforms).\n\n```ts\nconst series = await ironflock.getSeriesHistory(\"sensordata\", {\n  metrics: [\"temperature\", \"humidity\"],\n  method: \"AVG\",\n  limit: 500,\n  timeRange: [\"2026-01-01T00:00:00Z\", \"2026-03-01T00:00:00Z\"],\n  groupBy: [\"device_id\"],\n});\n```\n\n| Parameter | Type | Description |\n|-----------|------|-------------|\n| `tablename` | `string` | The name of the table to query |\n| `params` | `SeriesQueryParams` | Series query parameters (see below) |\n\n**params fields:**\n\n| Field | Type | Description |\n|-------|------|-------------|\n| `metrics` | `string[]` | Numeric columns to down-sample |\n| `method` | `DownSampleMethod` | Aggregation per namespace: `\"AVG\"`, `\"SUM\"`, `\"COUNT\"`, `\"MIN\"`, `\"MAX\"`, `\"FIRST\"` or `\"LAST\"` |\n| `limit` | `number` | Maximum number of namespaces (1–10000) |\n| `timeRange` | `SeriesTimeRange` | `[start, end]` — ISO strings or epoch-ms numbers; `null` = open end (required) |\n| `groupBy` | `string[]`, optional | Columns to group the series by |\n| `filterAnd` | `SQLFilterAnd[]`, optional | AND filter conditions (WHERE predicates only — the `{ latest: true }` marker is not supported in series queries; use `getHistory` for latest values) |\n\n**Returns:** `Promise<unknown>` — The down-sampled series rows.\n\n**Throws:** `Error` with a descriptive message on invalid parameters, when the series procedure is not registered, or when the router rejects the call.\n\n---\n\n## Secret columns\n\nA column declared `secret: true` in the app's data-template (string columns only, never `tsp`, and never a column used as an entity key via `maintainLatestFlagFor` — the template is rejected otherwise) is encrypted at rest with AES-256-GCM. **No normal read path ever returns the plaintext**, not even to the app that wrote it:\n\n| Read path | What a secret column looks like |\n|-----------|--------------------------------|\n| `getHistory`, `subscribeToTable`, and everything else over WAMP | the redaction sentinel `\"__secret__\"` (exported as `SECRET_PLACEHOLDER`) |\n| SQL — `sys.dataservice.select_query`, the FleetDB Access Postgres login | the raw stored ciphertext, `\"ifsec:1:<base64url>\"` |\n| `revealSecrets` | the decrypted plaintext |\n\n`NULL` is passed through as `NULL` on every path, so \"set but hidden\" stays distinguishable from \"never written\".\n\n```ts\n// Written like any other column — the data backend encrypts on insert.\nawait ironflock.publishToTable(\"credentials\", [{ device_id: \"d-1\", api_token: \"hunter2\" }]);\n\n// A normal read redacts it.\nconst rows = await ironflock.getHistory(\"credentials\", { limit: 1 });\n// [{ tsp: \"...\", device_id: \"d-1\", api_token: \"__secret__\" }]\n```\n\nEach row is encrypted under its own random IV, so two rows holding the same plaintext store **different** ciphertext. Equality filters, `GROUP BY`, `ORDER BY`, `DISTINCT` and entity keys (`maintainLatestFlagFor`) over a secret column are therefore impossible rather than merely discouraged — use `verifySecret` instead of an `=` filter.\n\nBoth functions below are callable **only from the app's own containers**. The router denies them to every browser role and to consuming apps, which is why `ConsumedApp` has no equivalent: a consumed app's secret columns arrive redacted and stay that way.\n\n### `revealSecrets(tablename, queryParams?)`\n\nReads rows of an own table with its secret columns decrypted, via `secret.reveal.{tablename}`.\n\n```ts\nconst rows = await ironflock.revealSecrets(\"credentials\", {\n  limit: 1,\n  filterAnd: [{ column: \"device_id\", operator: \"=\", value: \"d-1\" }],\n});\n// [{ tsp: \"...\", device_id: \"d-1\", api_token: \"hunter2\" }]\n```\n\n| Parameter | Type | Description |\n|-----------|------|-------------|\n| `tablename` | `string` | The table to read |\n| `queryParams` | `SecretQueryParams` | Same fields as [`getHistory`](#gethistorytablename-queryparams), except that `limit` may not exceed 100 — the data backend rejects a larger one rather than clamping it |\n\n**Returns:** `Promise<any[]>` — Rows in the same shape as `getHistory`, with secret columns in clear.\n\n**Throws:** `Error` on invalid parameters, when the reveal procedure is not registered (a data backend predating secret columns), or when the router rejects the call.\n\n### `verifySecret(tablename, column, candidate, queryParams?)`\n\nChecks a candidate value against a secret column without revealing it — the password-check counterpart of `revealSecrets`. The comparison runs server-side in constant time.\n\n```ts\nconst { match, checked } = await ironflock.verifySecret(\n  \"credentials\",\n  \"api_token\",\n  submittedToken,\n  {\n    limit: 1,\n    filterAnd: [{ column: \"device_id\", operator: \"=\", value: \"d-1\" }],\n  }\n);\n\nif (checked === 0) {\n  // No row matched the selector at all — not a wrong token, an unknown device.\n}\n```\n\n| Parameter | Type | Description |\n|-----------|------|-------------|\n| `tablename` | `string` | The table to check against |\n| `column` | `string` | The secret column to compare |\n| `candidate` | `string` | The plaintext being tested |\n| `queryParams` | `SecretQueryParams` | Which rows take part. Defaults to `{ limit: 1 }` — the most recent row. `limit` may not exceed 100; a larger one is rejected, not clamped |\n\n**Returns:** `Promise<SecretVerifyResult>` — `{ match, checked }`. `match` is `true` when **any** selected row's column decrypts equal to `candidate`; `checked` is how many rows were compared, which is what distinguishes a wrong candidate (`checked > 0`) from a selector that matched no rows (`checked === 0`).\n\n**Throws:** `Error` on invalid parameters, when the verify procedure is not registered, or when the router rejects the call.\n\n---\n\n### `call(topic, args?, kwargs?)`\n\nCalls a remote procedure on the IronFlock message router using a full WAMP topic URI.\n\n```ts\nconst result = await ironflock.call(\"some.full.wamp.topic\", [42]);\n```\n\n| Parameter | Type | Description |\n|-----------|------|-------------|\n| `topic` | `string` | The full WAMP URI of the procedure to call |\n| `args` | `unknown[]`, optional | Positional arguments |\n| `kwargs` | `Record<string, unknown>`, optional | Keyword arguments |\n\n**Returns:** `Promise<unknown>` — The result of the remote procedure call.\n\n---\n\n### `callDeviceFunction(deviceKey, topic, args?, kwargs?)`\n\nCalls a remote procedure registered by another IronFlock device. Automatically assembles the full WAMP topic as `{swarmKey}.{deviceKey}.{appKey}.{env}.{topic}`.\n\n```ts\nconst result = await ironflock.callDeviceFunction(42, \"com.myapp.myprocedure\", [42]);\n```\n\n| Parameter | Type | Description |\n|-----------|------|-------------|\n| `deviceKey` | `number` | The device key of the target device |\n| `topic` | `string` | The URI of the procedure to call |\n| `args` | `unknown[]`, optional | Positional arguments |\n| `kwargs` | `Record<string, unknown>`, optional | Keyword arguments |\n\n**Returns:** `Promise<unknown>` — The result of the remote procedure call.\n\n> `callFunction()` is a deprecated alias for `callDeviceFunction()`.\n\n---\n\n### `IronFlock.fromServer(url)` (static)\n\nFetches configuration from a server endpoint and creates an `IronFlock` instance. Useful in browser environments where the backend provides device credentials.\n\n```ts\nconst ironflock = await IronFlock.fromServer(\"/api/ironflock-config\");\nawait ironflock.start();\n```\n\n| Parameter | Type | Description |\n|-----------|------|-------------|\n| `url` | `string` | URL of the endpoint returning `IronFlockOptions` JSON |\n\n**Returns:** `Promise<IronFlock>` — A configured IronFlock instance.\n\n---\n\n### `registerDeviceFunction(topic, endpoint)`\n\nRegisters a procedure that can be called by other devices in the fleet. Automatically constructs the full WAMP topic as `{swarmKey}.{deviceKey}.{appKey}.{env}.{topic}`.\n\n```ts\nfunction add(args: any[]) {\n  return args[0] + args[1];\n}\n\nawait ironflock.registerDeviceFunction(\"com.myapp.add\", add);\n```\n\n| Parameter | Type | Description |\n|-----------|------|-------------|\n| `topic` | `string` | The URI of the procedure to register |\n| `endpoint` | `(...args: any[]) => any` | The function to register |\n\n**Returns:** `Promise<Registration | undefined>` — The registration object.\n\n> `register()` is an alias for `registerDeviceFunction()`. `registerFunction()` is a deprecated alias.\n\n---\n\n### `setDeviceLocation(long, lat)`\n\nUpdates the device's location in the platform master data. The maps in device or group overviews will reflect the new location in realtime.\n\n```ts\nawait ironflock.setDeviceLocation(8.6821, 50.1109);\n```\n\n| Parameter | Type | Description |\n|-----------|------|-------------|\n| `long` | `number` | Longitude (-180 to 180) |\n| `lat` | `number` | Latitude (-90 to 90) |\n\n**Returns:** `Promise<unknown>` — The result of the location update call.\n\n**Throws:** `Error` with a descriptive message on invalid coordinates or when the location service call fails.\n\n> **Note:** Location history is not stored. If you need location history, create a dedicated table and use `publishToTable`.\n\n---\n\n### `getRemoteAccessUrlForPort(port)`\n\nReturns the remote access URL for a given port on the device.\n\n```ts\nconst url = ironflock.getRemoteAccessUrlForPort(8080);\n// e.g. \"https://<device_key>-<app_name>-8080.app.ironflock.com\"\n```\n\n| Parameter | Type | Description |\n|-----------|------|-------------|\n| `port` | `number` | The port number |\n\n**Returns:** `string | null` — The remote access URL string, or `null` if the device key or app name is not available.\n\n---\n\n### Properties\n\n| Property | Type | Description |\n|----------|------|-------------|\n| `isConnected` | `boolean` | `true` if the connection to the platform is established |\n| `files` | `FileStore` | The app's managed object storage — see [Managed File Storage](#managed-file-storage). Safe to access before `start()`; each call waits for the connection just like the table API |\n| `connection` | `CrossbarConnection` | The underlying connection instance (for advanced use) |\n\n### Lifecycle Methods\n\n| Method | Description |\n|--------|-------------|\n| `await start(cburl?)` | Configures and starts the connection to the platform |\n| `await stop()` | Stops the connection |\n\n## Connection reliability\n\nThe connection reconnects on its own. When the socket drops, the SDK retries\nuntil the router is back, then restores every subscription and every registered\ndevice function — you do not need to re-subscribe after a reconnect. If one\ntopic cannot be restored — a permission that changed, a transient router error —\nthe rest still are, and the failed one is retried on the next reconnect.\n\nA special case is a router that is reachable but has no realm for the app yet.\nThe concurrent-install race boots the app container before the databackend has\nprovisioned its realm, so the first joins are refused with\n`wamp.error.no_such_realm`; the SDK keeps retrying every couple of seconds and\nthe app comes up the moment the realm does. A realm still missing after a\nminute is most likely never going to appear — the app was deleted, or has no\ndatabackend for this stage — so from then on the SDK slows to one attempt every\ntwo minutes rather than hitting the router every second forever. The fast\ncadence returns as soon as the realm appears, or the router itself goes away\nand comes back.\n\nThe harder case is a socket that dies *silently*: an idle NAT or proxy cuts the\nconnection without telling either side, or a router restarts behind a load\nbalancer. Nothing arrives to signal the loss. A connection that only publishes\nfinds out on its next failing write, but a connection that only subscribes never\nwrites at all, so without help it sits dead until the process restarts.\n\nA **WAMP heartbeat** closes that gap. Every 30 seconds the SDK makes a small\nround trip to the router. If the router answers — with a result *or* an error,\neither proves the link carries traffic — the connection is healthy. Only silence\ncounts as failure: if nothing comes back within 10 seconds, the SDK drops the\nconnection so the normal reconnect path runs.\n\nThis is on by default and needs no configuration. The knobs live on the\n`connection` object and must be set before `start()`:\n\n```ts\nconst ironflock = new IronFlock();\n\nironflock.connection.heartbeatIntervalMs = 60000; // probe every 60s\nironflock.connection.heartbeatTimeoutMs = 15000;  // allow 15s to answer\n\nawait ironflock.start();\n```\n\n| Property | Type | Default | Description |\n|----------|------|---------|-------------|\n| `heartbeatIntervalMs` | `number` | `30000` | How often to probe the router. Set to `0` to disable the heartbeat |\n| `heartbeatTimeoutMs` | `number` | `10000` | How long a probe may go unanswered before the connection is dropped and reconnected |\n| `heartbeatProcedure` | `string` | `\"wamp.session.get\"` | The procedure called as the probe |\n\nRaise the interval to cut idle traffic on constrained links; lower it to notice a\ndead connection sooner. The timeout should stay well above your worst-case round\ntrip, or a slow link will be mistaken for a dead one.\n\n> The heartbeat exists because the browser WebSocket API exposes no ping, so\n> there is no transport-level keepalive available to this SDK. The Python SDK\n> solves the same problem with real WebSocket pings and therefore has no\n> equivalent setting.\n\nCross-app connections from `connectToApp()` are typically subscribe-only, which\nis exactly the case the heartbeat protects. They are covered automatically —\neach `ConsumedApp` exposes its own `connection` with the same properties.\n\n## Cross-App Data Access\n\nRead another app's fleet data from within your app, in the same project and fleet. The provider app must list your app in its data-template `consumes:` section, and the project user must grant access. Access is **read-only**: you can query history and subscribe to realtime rows of the tables and transforms (views) the provider shares — you cannot write to them.\n\n```ts\nimport { IronFlock, CrossAppAccessError } from \"ironflock\";\n\nconst ironflock = new IronFlock();\nawait ironflock.start();\n\n// Open a read-only handle on another app's data backend\nconst weather = await ironflock.connectToApp(\"weather-app\");\n\n// Inspect what the provider shares (non-private tables / transforms)\nconsole.log(weather.tables.map((t) => t.tablename));\n\n// Query history, just like your own tables\nconst rows = await weather.getHistory(\"forecasts\", { limit: 100 });\n\n// Subscribe to realtime rows\nawait weather.subscribeToTable(\"forecasts\", (...args) => {\n  console.log(\"New forecast:\", args);\n});\n\n// Access errors carry a machine-readable code\ntry {\n  await ironflock.connectToApp(\"unshared-app\");\n} catch (err) {\n  if (err instanceof CrossAppAccessError) {\n    console.error(err.code); // e.g. \"NO_GRANT\"\n  }\n}\n```\n\nConsumed-app connections are cached per app + stage and are closed automatically by `ironflock.stop()`.\n\nIf your app holds the **wildcard** grant (`consumes: [{ app: \"*\" }]`), use [`listConsumableApps`](#listconsumableapps) to discover every provider in the project and [`connectToAllApps`](#connecttoallappsopts) to open them all at once.\n\n### `connectToApp(appName, opts?)`\n\nOpens a read-only connection to another app's data backend in the same project and returns a `ConsumedApp` handle. Resolves the provider and connects to its realm using this device's credentials.\n\n```ts\nconst weather = await ironflock.connectToApp(\"weather-app\", { stage: \"prod\" });\n```\n\n| Parameter | Type | Description |\n|-----------|------|-------------|\n| `appName` | `string` | Provider app name, as declared in your `consumes:` section |\n| `opts` | `ConnectToAppOptions`, optional | Options (see below) |\n\n**opts fields:**\n\n| Field | Type | Description |\n|-------|------|-------------|\n| `stage` | `\"dev\" \\| \"prod\"`, optional | Provider stage to connect to. Defaults to this app's own stage (`ENV`) |\n| `onError` | `(error: CrossAppAccessError) => void`, optional | Called when the connection is fatally denied *after* `connectToApp` resolved (e.g. the grant is later revoked) |\n\n**Returns:** `Promise<ConsumedApp>` — A read-only handle on the provider's data backend.\n\n**Throws:** `CrossAppAccessError` (`code`: `NO_GRANT`, `PROVIDER_NOT_INSTALLED`, `UNKNOWN_APP`, or `NOT_AUTHORIZED`).\n\n---\n\n### `listConsumableApps()`\n\nLists **every** non-private provider in the project — the discovery primitive for apps that hold the **wildcard** consume grant (`consumes: [{ app: \"*\" }]` in your data-template, granted by the project user). Performs a single `sys.appaccess.list` call and opens **no** connections: render the returned catalogs in a picker, then call [`connectToApp`](#connecttoappappname-opts) for the ones you want — or [`connectToAllApps`](#connecttoallappsopts) to open them all at once.\n\n> **Note:** Declare the grant in your app's `data-template.yml`, and **quote the `*`** — a bare `*` is a YAML alias and won't parse:\n>\n> ```yaml\n> consumes:\n>   - app: \"*\"\n> ```\n\n```ts\nconst providers = await ironflock.listConsumableApps();\n\nfor (const p of providers) {\n  console.log(p.app, Object.keys(p.stages)); // e.g. \"weather-app\" [\"dev\", \"prod\"]\n}\n```\n\n**Returns:** `Promise<ConsumedAppInfo[]>` — one entry per non-private provider:\n\n| Field | Type | Description |\n|-------|------|-------------|\n| `app` | `string` | Provider app name |\n| `provider_app_key` | `number` | The provider's app key |\n| `stages` | `{ dev?, prod? }` | Per-stage catalog; a stage is present only if the provider has a data backend for it. Each catalog is the non-private `{ tables, transforms }` it shares |\n\n**Throws:** `CrossAppAccessError` (`code`: `NO_GRANT`) when your app holds no wildcard grant.\n\n---\n\n### `connectToAllApps(opts?)`\n\nOpens read-only connections to **every** non-private provider in the project in one go (wildcard consumers only). Enumerates providers via [`listConsumableApps`](#listconsumableapps) and opens each one, skipping any that lack a data backend for the requested stage. Each handle is cached under the same app + stage key as [`connectToApp`](#connecttoappappname-opts), so a later `connectToApp(name)` returns the already-warmed handle instead of opening a duplicate.\n\n```ts\nconst apps = await ironflock.connectToAllApps({\n  onError: (err) => console.warn(\"Provider skipped:\", err),\n});\n\nfor (const app of apps) {\n  const rows = await app.getHistory(app.tables[0]?.tablename, { limit: 10 });\n  console.log(app.app, rows);\n}\n```\n\n| Parameter | Type | Description |\n|-----------|------|-------------|\n| `opts` | `ConnectToAllAppsOptions`, optional | Options (see below) |\n\n**opts fields:**\n\n| Field | Type | Description |\n|-------|------|-------------|\n| `stage` | `\"dev\" \\| \"prod\"`, optional | Provider stage to connect to. Defaults to this app's own stage (`ENV`) |\n| `continueOnError` | `boolean`, optional | When `true` (the default), a provider that fails to open is reported via `onError` and omitted from the result. When `false`, the first failure rejects the whole call |\n| `onError` | `(error: unknown) => void`, optional | Called with each provider that could not be opened (while `continueOnError` is `true`), and with a `CrossAppAccessError` if an already-opened connection is later fatally denied (e.g. the grant is revoked) |\n\n**Returns:** `Promise<ConsumedApp[]>` — the successfully-opened provider handles. Closed together by `ironflock.stop()`.\n\n**Throws:** `CrossAppAccessError` (`code`: `NO_GRANT`) when your app holds no wildcard grant. With `continueOnError: false`, also rejects with the first provider's open failure.\n\n---\n\n### `ConsumedApp` handle\n\nReturned by `connectToApp`. A read-only view of a provider app's shared tables and transforms.\n\n**Properties:**\n\n| Property | Type | Description |\n|----------|------|-------------|\n| `app` | `string` | Provider app name |\n| `stage` | `\"dev\" \\| \"prod\"` | Provider stage this handle is connected to |\n| `tables` | `ProviderTableInfo[]` | Non-private tables the provider shares |\n| `transforms` | `ProviderTableInfo[]` | Non-private transforms (views) the provider shares |\n| `isConnected` | `boolean` | `true` while the connection to the provider is open |\n| `connection` | `CrossbarConnection` | The underlying connection (advanced use) |\n\n#### `consumedApp.getHistory(tablename, queryParams?)`\n\nQueries history rows of a shared table or transform. Takes the same query parameters as [`getHistory`](#gethistorytablename-queryparams) (`limit`, `offset`, `timeRange`, `filterAnd`, `columns`) — including the `{ latest: true }` marker in `filterAnd` for reading the provider's current values.\n\n```ts\nconst rows = await weather.getHistory(\"forecasts\", { limit: 100 });\nconst current = await weather.getHistory(\"forecasts\", {\n  limit: 100,\n  filterAnd: [{ latest: true }],\n});\n```\n\nColumns the provider marks [`secret`](#secret-columns) arrive redacted as `\"__secret__\"` and can never be read in clear by a consumer — decrypting is the owning app's privilege, and the router refuses `secret.reveal` / `secret.verify` to consuming apps. Naming such a column in `filterAnd` or `columns` throws `CrossAppAccessError` with code `SECRET_COLUMN` rather than quietly returning ciphertext or a filter that can never match.\n\n**Returns:** `Promise<unknown>` — The query result rows.\n\n#### `consumedApp.subscribeToTable(tablename, handler)`\n\nSubscribes to realtime rows of a shared table or transform. Bulk-inserted rows are delivered one at a time, exactly like [`subscribeToTable`](#subscribetotabletablename-handler).\n\n```ts\nawait weather.subscribeToTable(\"forecasts\", (...args) => console.log(args));\n```\n\n**Returns:** `Promise<Subscription | undefined>` — The subscription object.\n\n#### `consumedApp.getSeriesHistory(tablename, params)`\n\nQueries down-sampled time-series history of a shared **table** (not available for transforms).\n\n```ts\nconst series = await weather.getSeriesHistory(\"forecasts\", {\n  metrics: [\"temperature\"],\n  method: \"AVG\",\n  limit: 500,\n  timeRange: [\"2026-01-01T00:00:00Z\", \"2026-03-01T00:00:00Z\"],\n});\n```\n\n**params fields (`SeriesQueryParams`):**\n\n| Field | Type | Description |\n|-------|------|-------------|\n| `metrics` | `string[]` | Numeric columns to down-sample |\n| `method` | `DownSampleMethod` | Aggregation per namespace: `\"AVG\"`, `\"SUM\"`, `\"COUNT\"`, `\"MIN\"`, `\"MAX\"`, `\"FIRST\"` or `\"LAST\"` |\n| `limit` | `number` | Maximum number of rows (1–10000) |\n| `timeRange` | `SeriesTimeRange` | `[start, end]` — ISO strings or epoch-ms numbers; `null` = open end (required) |\n| `groupBy` | `string[]`, optional | Columns to group the series by |\n| `filterAnd` | `SQLFilterAnd[]`, optional | AND filter conditions (WHERE predicates only — no `{ latest: true }` marker) |\n\n**Returns:** `Promise<unknown>` — The down-sampled series rows.\n\n#### `consumedApp.close()`\n\nCloses this handle's connection to the provider. (All consumed-app connections are also closed by `ironflock.stop()`.)\n\n**Returns:** `Promise<void>`\n\n---\n\n### `CrossAppAccessError`\n\nThrown by `connectToApp` and the `ConsumedApp` methods when cross-app access is denied or misused. Exposes a machine-readable `code`:\n\n| `code` | Meaning |\n|--------|---------|\n| `NO_GRANT` | The project user has not granted your app access to the provider |\n| `PROVIDER_NOT_INSTALLED` | The provider app has no data backend for that stage in this project |\n| `UNKNOWN_APP` | No app by that name |\n| `PRIVATE_TABLE` | The requested table/transform is not in the provider's shared catalog |\n| `SECRET_COLUMN` | The query filters on or projects a column the provider marks `secret` — its values are encrypted per row and never readable by a consumer |\n| `NOT_AUTHORIZED` | The router/provider denied access (e.g. the grant was revoked) |\n\n---\n\n### `WampError`\n\nAll SDK methods fail with a descriptive `Error` — nothing is silently swallowed. When the failure originates from the WAMP router or a remote handler, the error is a `WampError` (a native `Error` subclass) whose message names the operation, the topic and the reason, and which preserves the raw WAMP payload:\n\n| Property | Type | Description |\n|----------|------|-------------|\n| `message` | `string` | e.g. `Call of procedure 'history.transformed.foo' failed with WAMP error 'wamp.error.no_such_procedure'` |\n| `error` | `string` | The WAMP error URI |\n| `args` | `unknown[]` | The WAMP error's positional payload |\n| `kwargs` | `Record<string, unknown>` | The WAMP error's keyword payload |\n\nOperations attempted while not connected fail with a plain `Error` explaining that no session is available and pointing to `start()`.\n\n## Managed File Storage\n\nEvery app databackend gets private object storage alongside its tables. With no\n`files:` section in the data template you still get one namespace named `default`,\nso this works against apps released before FleetFiles existed.\n\n```ts\n// Store an object and get a permanent URL back in the same call\nconst info = await ironflock.files.put(\"part-1.jpg\", jpegBytes, {\n  contentType: \"image/jpeg\",\n});\n\n// That URL is safe to put in a FleetDB column — a dashboard widget can render\n// <img src=\"{{photo_url}}\"> and it just works\nawait ironflock.publishToTable(\"inspections\", { part_id: \"1\", photo_url: info.url });\n\nconst data = await ironflock.files.get(\"part-1.jpg\");\nfor await (const obj of ironflock.files.iterate({ prefix: \"2026/\" })) {\n  console.log(obj.key, obj.size);\n}\n```\n\nThe URL never expires, yet stays readable **only** to an authenticated requestor\nholding READ on this databackend — an auth proxy re-checks on every request, so\nit is safe to store but not a public link.\n\nA **namespace** is a key prefix that carries policy — retention, sharing,\nallowed content types. It is not a separate S3 bucket; every namespace lives in\nthe app's one bucket. Declare one only when a set of objects needs *different\nrules*; otherwise stay in `default` and organise with key paths.\n\nDeclare additional namespaces in `data-template.yml`:\n\n```yaml\nfiles:\n  # Budget the app suggests for itself; the project user's setting is what gets\n  # enforced. catalog() reports both as quotaBytes and suggestedQuotaBytes.\n  quotaBytes: 5368709120\n  namespaces:\n    - name: frames\n      description: Raw camera frames, one JPEG per inspected part.\n      contentTypes: [\"image/jpeg\"]\n      maxObjectBytes: 20971520\n      retention: { deleteAfter: 30 days }\n```\n\nThe budget is app-wide, not per namespace — a namespace is only a key prefix inside the app's one storage area, so there is nothing for a per-prefix budget to be enforced against. `maxObjectBytes` *is* per namespace: it caps a single object, not a total.\n\n### `files.put(key, data, options?)`\n\nStores a `Uint8Array`. Options: `namespace`, `contentType`. Returns `ObjectInfo`\nwith `key`, `size`, `etag`, `contentType` and `url`.\n\n### `files.get(key, namespace?)`\n\nReturns a `Uint8Array`.\n\n### `files.list(options?)`\n\nOne page: `.objects`, `.prefixes`, `.isTruncated`, `.cursor`. Options: `namespace`,\n`prefix`, `limit`, `cursor`.\n\n### `files.iterate(options?)`\n\nAsync iterator over every object under a prefix, paginating for you.\n\n### `files.stat(key, namespace?)` / `files.exists(key, namespace?)`\n\nMetadata without transferring; `exists` returns a boolean.\n\n### `files.delete(key, namespace?)` / `files.copy(key, to, namespace?, toNamespace?)` / `files.move(key, to, namespace?, toNamespace?)`\n\n`move` is copy-then-delete on the client (the service has no move verb), so it\nis **not atomic** — a failed delete leaves both copies.\n\n### `files.url(key, namespace?, version?)`\n\nThe permanent URL. Resolves to `undefined` where the deployment has no HTTP edge\n(a plain-HTTP appliance) — the signal to fall back to `files.get()`. Pass an ETag\nas `version` to let browsers cache it immutably.\n\n### `files.usage(options?)`\n\nWhat the object store reports, in one call: `sizeBytes`, `objectCount`,\n`quotaBytes` (the **enforced** budget) and `freeBytes`. `freeBytes` is `-1` when\nthere is no quota — a quota of `0` means unlimited, and `0` free would read as\nfull.\n\nPass `{ detail: true }` for a `perNamespace` breakdown. That costs one listing per\nnamespace (the store accounts per bucket; a namespace is a prefix), so it is off\nby default.\n\n### `files.namespaces()` / `files.catalog()`\n\nWhat this app may use. `catalog()` reports `quotaBytes` (**enforced**, read from\nthe object store) alongside `suggestedQuotaBytes` (what the app's data template\nasked for) — the quota is a user setting, so those two can differ. `catalog()` also reports\n`inlineMaxBytes` and `publicBaseUrl`; it is cached after the first call.\n\n### `files.shareUrl(key, namespace?, ttl?)`\n\nAn expiring link anyone holding it can fetch. Unlike `files.url()` this is a\n**bearer capability** — nothing re-checks authorization when it is used. Hand it\nto a person; do not store it in a column. The server clamps `ttl`.\n\n### `files.uploadUrl(key, options?)`\n\nAn expiring URL that accepts a direct upload. Returns `url`, `method`, `headers`\nand `expiresIn`; send exactly those headers or the signature will not verify.\nOptions: `namespace`, `contentType`, `ttl`, `size`.\n\n### Large objects\n\nThe SDK picks the transport by **size**, automatically:\n\n| Size | Path |\n| --- | --- |\n| ≤ `inlineMaxBytes` (6 MiB) | one WAMP call |\n| larger | direct to object storage over HTTPS, bypassing the router |\n\n`put`/`get` work on `Uint8Array`, so the object is held in memory. For very large\nfiles in Node, stream it yourself against `uploadUrl()` / `shareUrl()` rather\nthan materialising it.\n\nTwo ceilings remain, and both throw `TOO_LARGE` with a reason naming which one:\n\n- **5 GiB** — S3's single-upload limit. Multipart is not implemented yet.\n- **`inlineMaxBytes` where there is no direct endpoint** — an air-gapped\n  appliance cannot transfer a large object at all. The message says so, because\n  no retry or smaller chunk can help.\n\nThe direct path needs to reach the object store host, not just the router. Two\nfield failures have their own codes rather than looking like auth problems:\n`PRESIGN_UNREACHABLE` (a proxy allowing only the router) and `CLOCK_SKEW` (S3\nrejects requests more than 15 minutes out of step — check NTP).\n\nThere are no Node-only entry points: `put`/`get` work on `Uint8Array` in both\nNode and the browser, so read or write local files yourself with `fs`.\n\n### `FileStoreError`\n\nEvery failure throws `FileStoreError` with a stable `.code` and a human-readable\n`.reason`. **Branch on `.code`, never on `.reason`.**\n\n```ts\nimport { FileStoreError } from \"ironflock\";\n\ntry {\n  await ironflock.files.put(\"huge.bin\", payload);\n} catch (e) {\n  if (e instanceof FileStoreError && e.code === \"QUOTA_EXCEEDED\") {\n    // ...\n  }\n}\n```\n\n| Code | Meaning |\n| --- | --- |\n| `NOT_AUTHORIZED` | Caller may not perform this operation |\n| `NO_SUCH_NAMESPACE` | Namespace is not declared in the data template |\n| `NO_SUCH_OBJECT` | Key does not exist |\n| `TOO_LARGE` | Exceeds the single-call transfer limit |\n| `OBJECT_TOO_LARGE` | Exceeds the namespace's own `maxObjectBytes` |\n| `QUOTA_EXCEEDED` | Filestore is full |\n| `CONTENT_TYPE_NOT_ALLOWED` | Namespace restricts `contentTypes` |\n| `NOT_SUPPORTED` | Backend cannot do this |\n| `NOT_AVAILABLE` | No file service on this deployment |\n| `PRESIGN_UNREACHABLE` | Object store not reachable directly (proxy?) |\n| `CLOCK_SKEW` | Device clock too far out of step for S3 |\n| `INTERNAL` | Anything else |\n\nA newer server may add codes; unknown ones pass through as `.code` rather than\nthrowing something else, so treat anything unrecognised as a generic failure.\n\n## Development\n\nInstall dependencies:\n\n```shell\nnpm install\n```\n\nRun tests:\n\n```shell\nnpm test              # Node.js tests\nnpm run test:browser  # Browser environment tests\nnpm run test:all      # Both\n```\n\nType check:\n\n```shell\nnpm run typecheck\n```\n\nBuild:\n\n```shell\nnpm run build\n```\n\nPublish a new release:\n\n```shell\nnpm run release\n```\n\n","readmeFilename":"README.md"}