{"_id":"@asaidimu/utils-remote-store","_rev":"38-afa828d549f33b2d576b849cdcd2b998","name":"@asaidimu/utils-remote-store","dist-tags":{"latest":"2.0.2"},"versions":{"1.0.0":{"name":"@asaidimu/utils-remote-store","version":"1.0.0","_id":"@asaidimu/utils-remote-store@1.0.0","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"dist":{"shasum":"e2375a0f0c05423efd8889f54b8969e3c6aa4130","tarball":"https://registry.npmjs.org/@asaidimu/utils-remote-store/-/utils-remote-store-1.0.0.tgz","fileCount":7,"integrity":"sha512-TFpP6wubSshnX6XqG0RvqbQIzVJlqi80rCGhSIzilkGQrXCkkrrbHjFtrNLmwIQSTh0KeDf4lfV/ESeWeKS7HQ==","signatures":[{"sig":"MEQCIHI4cWsGQ2p4w8Yr0qI9n+QORovDbsIvXuJZoPf8f+e1AiAGP7oDFTozEvXu89vACVeel3LR+sF019hU8PldJwyFIA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":144102},"main":"index.js","types":"index.d.ts","module":"index.mjs","exports":{".":{"import":{"types":"./index.d.ts","default":"./index.mjs"},"require":{"types":"./index.d.ts","default":"./index.js"}}},"gitHead":"8023acb565f9b78326276385db1e8c94e29c80d7","release":{"plugins":[["@semantic-release/npm",{"pkgRoot":"./dist"}],["@semantic-release/git",{"assets":["CHANGELOG.md","package.json"],"message":"chore(release): Release @asaidimu/utils-remote-store v\n{nextRelease.version} [skip ci]\n\n{nextRelease.notes}"}]]},"_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"_npmVersion":"10.9.2","description":"A reactive store for remote data, built on top of @asaidimu/utils-cache","directories":{},"_nodeVersion":"20.19.5","dependencies":{"eventsource":"^4.0.0","@asaidimu/utils-cache":"2.0.5"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/utils-remote-store_1.0.0_1758101270726_0.2986115484263321","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@asaidimu/utils-remote-store","version":"1.1.0","_id":"@asaidimu/utils-remote-store@1.1.0","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"dist":{"shasum":"8fdc32c07c7ae6d5c3b624fb1bc85e6388ea734f","tarball":"https://registry.npmjs.org/@asaidimu/utils-remote-store/-/utils-remote-store-1.1.0.tgz","fileCount":7,"integrity":"sha512-8IWqmzT7F/5GcbL4nSl7/e9DxNI+SKhhox3C0Rf5i8pBCyGGOwBH/jqPqd0Iw3owvadg9dgZpO7UQGBt0nG+Jw==","signatures":[{"sig":"MEUCICN00NjLH9AWiNTUjv2uJer5ZbotKhYWon7Yjnj33hbhAiEAtK2TD5u5d9Zj4P+bOvNhE4ZHWQVqio8iA1PhCw8Jmio=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":145919},"main":"index.js","types":"index.d.ts","module":"index.mjs","exports":{".":{"import":{"types":"./index.d.ts","default":"./index.mjs"},"require":{"types":"./index.d.ts","default":"./index.js"}}},"gitHead":"215d49902cf3845b98c886e72265a171c8ea8b5d","release":{"plugins":[["@semantic-release/npm",{"pkgRoot":"./dist"}],["@semantic-release/git",{"assets":["CHANGELOG.md","package.json"],"message":"chore(release): Release @asaidimu/utils-remote-store v\n{nextRelease.version} [skip ci]\n\n{nextRelease.notes}"}]]},"_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"_npmVersion":"10.9.2","description":"A reactive store for remote data, built on top of @asaidimu/utils-cache","directories":{},"_nodeVersion":"20.19.5","dependencies":{"eventsource":"^4.0.0","@asaidimu/utils-cache":"2.1.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/utils-remote-store_1.1.0_1758115757284_0.7221221601427184","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@asaidimu/utils-remote-store","version":"1.2.0","_id":"@asaidimu/utils-remote-store@1.2.0","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"dist":{"shasum":"b964713b22b9dae57cf2e27c614e4c4bb93357f9","tarball":"https://registry.npmjs.org/@asaidimu/utils-remote-store/-/utils-remote-store-1.2.0.tgz","fileCount":7,"integrity":"sha512-3Q8D7V87hK74QDRAlEBvVAO0BzZ5q287F1ZCr5sUXLw+wsW2Dddzyngfi9KEAiVepCLOPQP2efqZJIimgGRpOw==","signatures":[{"sig":"MEUCIQDlyguU/qR1zQxQFBauirz9Bizk64OjP4wSdi3juypL4gIgDw8aH1yplTuabMD6hZvPGackXKrBVAHC0W2NvNCXxxs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":133492},"main":"index.js","types":"index.d.ts","module":"index.mjs","exports":{".":{"import":{"types":"./index.d.ts","default":"./index.mjs"},"require":{"types":"./index.d.ts","default":"./index.js"}}},"gitHead":"b232a1061aaebd2d3eff37b3ad5d8216f6d1ffb1","release":{"plugins":[["@semantic-release/npm",{"pkgRoot":"./dist"}],["@semantic-release/git",{"assets":["CHANGELOG.md","package.json"],"message":"chore(release): Release @asaidimu/utils-remote-store v\n{nextRelease.version} [skip ci]\n\n{nextRelease.notes}"}]]},"_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"_npmVersion":"10.9.2","description":"A reactive store for remote data, built on top of @asaidimu/utils-cache","directories":{},"_nodeVersion":"20.19.5","dependencies":{"eventsource":"^4.0.0","@asaidimu/utils-cache":"2.1.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/utils-remote-store_1.2.0_1758284674399_0.16572151150946857","host":"s3://npm-registry-packages-npm-production"}},"1.2.1":{"name":"@asaidimu/utils-remote-store","version":"1.2.1","_id":"@asaidimu/utils-remote-store@1.2.1","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"dist":{"shasum":"314615854ed88b44891cb60f9a2de5713aa35da5","tarball":"https://registry.npmjs.org/@asaidimu/utils-remote-store/-/utils-remote-store-1.2.1.tgz","fileCount":7,"integrity":"sha512-uLGQrfCZ0hS3phhIuqrhJU5OnbHzkaIwhhMRtDNcX+TydpU6sntOxBk92pwwV+7xCYlW8m+voQWYSRArOtjC7g==","signatures":[{"sig":"MEQCIBV1+BF4OfaM5juymtDayAsvvTLSYzTBpVUMLOPP0A+QAiB65IOPh1yNjMYmlGifhm7FnHmgnk10LtXv5+Nwc9KEtQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":120197},"main":"index.js","types":"index.d.ts","module":"index.mjs","exports":{".":{"import":{"types":"./index.d.ts","default":"./index.mjs"},"require":{"types":"./index.d.ts","default":"./index.js"}}},"gitHead":"be426e26ac8237b74b1909407f975ca63a6c75ae","release":{"plugins":[["@semantic-release/npm",{"pkgRoot":"./dist"}],["@semantic-release/git",{"assets":["CHANGELOG.md","package.json"],"message":"chore(release): Release @asaidimu/utils-remote-store v\n{nextRelease.version} [skip ci]\n\n{nextRelease.notes}"}]]},"_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"_npmVersion":"10.9.2","description":"A reactive store for remote data, built on top of @asaidimu/utils-cache","directories":{},"_nodeVersion":"20.19.5","dependencies":{"eventsource":"^4.0.0","@asaidimu/utils-cache":"2.1.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/utils-remote-store_1.2.1_1758622932252_0.08863487850409735","host":"s3://npm-registry-packages-npm-production"}},"1.2.2":{"name":"@asaidimu/utils-remote-store","version":"1.2.2","_id":"@asaidimu/utils-remote-store@1.2.2","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"dist":{"shasum":"9b116e52ebae8be67270fd5fa966730b4101aaae","tarball":"https://registry.npmjs.org/@asaidimu/utils-remote-store/-/utils-remote-store-1.2.2.tgz","fileCount":7,"integrity":"sha512-yhQcNsYSSbezZ5QL31TgvNYqT5CH+u865BP9m2LoxJYyIES0LZeUEJymX9Do8W2Yxa8E6+6QsouZi0idpLeZUQ==","signatures":[{"sig":"MEUCIQDNtbCgXAUtJGYNfcsqDqOEQVSJ6IRr4k2VMEfTYueZ4AIgSJWvEFkVHQXORvkma71F5XX5lNA4np8sWB1l4oI1VHU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":149435},"main":"index.js","types":"index.d.ts","module":"index.mjs","exports":{".":{"import":{"types":"./index.d.ts","default":"./index.mjs"},"require":{"types":"./index.d.ts","default":"./index.js"}}},"gitHead":"c34e01a76faa1c94e7ba776737b7e8a3bfefda85","release":{"plugins":[["@semantic-release/npm",{"pkgRoot":"./dist"}],["@semantic-release/git",{"assets":["CHANGELOG.md","package.json"],"message":"chore(release): Release @asaidimu/utils-remote-store v\n{nextRelease.version} [skip ci]\n\n{nextRelease.notes}"}]]},"_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"_npmVersion":"10.9.2","description":"A reactive store for remote data, built on top of @asaidimu/utils-cache","directories":{},"_nodeVersion":"20.19.5","dependencies":{"eventsource":"^4.0.0","@asaidimu/utils-cache":"2.1.2"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/utils-remote-store_1.2.2_1758626909703_0.12590557912067446","host":"s3://npm-registry-packages-npm-production"}},"1.2.3":{"name":"@asaidimu/utils-remote-store","version":"1.2.3","_id":"@asaidimu/utils-remote-store@1.2.3","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"dist":{"shasum":"53214e38b28ce85da8d5b98c4e8f47b887f56b52","tarball":"https://registry.npmjs.org/@asaidimu/utils-remote-store/-/utils-remote-store-1.2.3.tgz","fileCount":7,"integrity":"sha512-oSbA/P/xpsY8v3Iz0Hca9FqKLH+E1d6fbbzjOnoMzbLyrcUZ4IaI0IqljHgMbTnjYG85V+e5emjVqkM2DYZgVQ==","signatures":[{"sig":"MEYCIQD2Qp3EKLmoUoFO65XAHF6qFcFwHIC+td1Izl4OnntrIAIhAISAckuPsRHEW1ZzZcWzU76I+05jRsMNw8a0daNKrUo5","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":149435},"main":"index.js","types":"index.d.ts","module":"index.mjs","exports":{".":{"import":{"types":"./index.d.ts","default":"./index.mjs"},"require":{"types":"./index.d.ts","default":"./index.js"}}},"gitHead":"9cda1715d6e4dcbb6e079c32409e8c7b4347ccbf","release":{"plugins":[["@semantic-release/npm",{"pkgRoot":"./dist"}],["@semantic-release/git",{"assets":["CHANGELOG.md","package.json"],"message":"chore(release): Release @asaidimu/utils-remote-store v\n{nextRelease.version} [skip ci]\n\n{nextRelease.notes}"}]]},"_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"_npmVersion":"10.9.2","description":"A reactive store for remote data, built on top of @asaidimu/utils-cache","directories":{},"_nodeVersion":"20.19.5","dependencies":{"eventsource":"^4.0.0","@asaidimu/utils-cache":"2.1.3"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/utils-remote-store_1.2.3_1764260113970_0.2582803216317877","host":"s3://npm-registry-packages-npm-production"}},"1.2.4":{"name":"@asaidimu/utils-remote-store","version":"1.2.4","_id":"@asaidimu/utils-remote-store@1.2.4","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"dist":{"shasum":"64b40a8b15f83a5e6fe7c2dedfbeccf02b9e7b80","tarball":"https://registry.npmjs.org/@asaidimu/utils-remote-store/-/utils-remote-store-1.2.4.tgz","fileCount":7,"integrity":"sha512-Zhx+2ys+71Whg2kDlWuN56/LJJV2WIYeRC3fch7H12JWdvY0R0/uXJ2ssB+5l+S4AZKIpudrvrZEfPF0cyIWqQ==","signatures":[{"sig":"MEUCID35+G+thkkvn5Iyv4I/RS/K6ezZk+JMCJN3J4cJXPPdAiEAs8ncnCh230vWnkyV4sbAbqMh25miNtMjqWj01LqraN4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":149406},"main":"index.js","types":"index.d.ts","module":"index.mjs","exports":{".":{"import":{"types":"./index.d.ts","default":"./index.mjs"},"require":{"types":"./index.d.ts","default":"./index.js"}}},"gitHead":"669c63c60d8a6b75b4f2f2124f1764e19c59689f","release":{"plugins":[["@semantic-release/npm",{"pkgRoot":"./dist"}],["@semantic-release/git",{"assets":["CHANGELOG.md","package.json"],"message":"chore(release): Release @asaidimu/utils-remote-store v\n{nextRelease.version} [skip ci]\n\n{nextRelease.notes}"}]]},"_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"_npmVersion":"10.9.2","description":"A reactive store for remote data, built on top of @asaidimu/utils-cache","directories":{},"_nodeVersion":"20.19.6","dependencies":{"eventsource":"^4.0.0","@asaidimu/utils-cache":"3.0.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/utils-remote-store_1.2.4_1767043085288_0.6375658459245075","host":"s3://npm-registry-packages-npm-production"}},"1.2.5":{"name":"@asaidimu/utils-remote-store","version":"1.2.5","_id":"@asaidimu/utils-remote-store@1.2.5","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"dist":{"shasum":"5ccd46ba3de21070b0631ee94c2e7f2b99cf42e9","tarball":"https://registry.npmjs.org/@asaidimu/utils-remote-store/-/utils-remote-store-1.2.5.tgz","fileCount":7,"integrity":"sha512-R33wWgShQG/ycS33vaeLeokTtaoB0lLlyQgLfrmv+3xG7XYDDIbbjoLCfmAjF6/iG/bJP5w/AQHf6VRJKq8jzg==","signatures":[{"sig":"MEQCIFxFTNU8jS23twfA6JrfBmfI9KyQsVgTBd5vRptyjxDDAiBtE7mbIVLdmycSAaY6pPuizQLFVvZVm5JY7ucD0uYJYg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":149402},"main":"index.js","types":"index.d.ts","module":"index.mjs","exports":{".":{"import":{"types":"./index.d.ts","default":"./index.mjs"},"require":{"types":"./index.d.ts","default":"./index.js"}}},"gitHead":"a927a297f67894f11e51cda4409d268d9325e7a7","release":{"plugins":[["@semantic-release/npm",{"pkgRoot":"./dist"}],["@semantic-release/git",{"assets":["CHANGELOG.md","package.json"],"message":"chore(release): Release @asaidimu/utils-remote-store v\n{nextRelease.version} [skip ci]\n\n{nextRelease.notes}"}]]},"_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"_npmVersion":"10.9.2","description":"A reactive store for remote data, built on top of @asaidimu/utils-cache","directories":{},"_nodeVersion":"20.20.0","dependencies":{"eventsource":"^4.0.0","@asaidimu/utils-cache":"3.0.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/utils-remote-store_1.2.5_1773069079352_0.4714612231042892","host":"s3://npm-registry-packages-npm-production"}},"1.2.6":{"name":"@asaidimu/utils-remote-store","version":"1.2.6","_id":"@asaidimu/utils-remote-store@1.2.6","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"dist":{"shasum":"2ea30c0079c3f61ddbda868e087c386a90c3538c","tarball":"https://registry.npmjs.org/@asaidimu/utils-remote-store/-/utils-remote-store-1.2.6.tgz","fileCount":7,"integrity":"sha512-GrPhqM3YGgyz1RFzmcOQz5pgKpiUa00dSDK+jBcEgJmQQWybrAsZepzM+kxkhlrRufzpx/8mmrKXgjBcAsSI2w==","signatures":[{"sig":"MEUCIQDHNnBtuJ8qD8E669QKgrCSZ539vPuoq+eZEuFF46ctxgIgDB6H+YXeOgvglOEbmY+VusJqLxOeftbDI52YBTbdqe0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":149402},"main":"index.js","types":"index.d.ts","module":"index.mjs","exports":{".":{"import":{"types":"./index.d.ts","default":"./index.mjs"},"require":{"types":"./index.d.ts","default":"./index.js"}}},"gitHead":"901c1970da475b21796fb973f65abb1bf9c97437","release":{"plugins":[["@semantic-release/npm",{"pkgRoot":"./dist"}],["@semantic-release/git",{"assets":["CHANGELOG.md","package.json"],"message":"chore(release): Release @asaidimu/utils-remote-store v\n{nextRelease.version} [skip ci]\n\n{nextRelease.notes}"}]]},"_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"_npmVersion":"10.9.2","description":"A reactive store for remote data, built on top of @asaidimu/utils-cache","directories":{},"_nodeVersion":"20.20.2","dependencies":{"eventsource":"^4.0.0","@asaidimu/utils-cache":"3.0.2"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/utils-remote-store_1.2.6_1776765647115_0.16411888349995207","host":"s3://npm-registry-packages-npm-production"}},"1.2.7":{"name":"@asaidimu/utils-remote-store","version":"1.2.7","_id":"@asaidimu/utils-remote-store@1.2.7","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"dist":{"shasum":"c3a22b9edc98e453d0b9b47967dfba807f205ad4","tarball":"https://registry.npmjs.org/@asaidimu/utils-remote-store/-/utils-remote-store-1.2.7.tgz","fileCount":7,"integrity":"sha512-IORTDAT1+n1nuip9HPqfJmZNEbXrdH1+vNS65x8iqN9I748a3nLuBNg45KZMdbHyQccEhiDcJJo2EbQynCnEng==","signatures":[{"sig":"MEUCIBWZAhcq9cVkGs5o2GkOZv7xZc6a6q5R1gkOD50efy9GAiEAz3iaahdgCFaHkD+xtLAPtaVD/L2vop5HsZ+0ZZyh9Wo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":149402},"main":"index.js","types":"index.d.ts","module":"index.mjs","exports":{".":{"import":{"types":"./index.d.ts","default":"./index.mjs"},"require":{"types":"./index.d.ts","default":"./index.js"}}},"gitHead":"22396d1b2d8c3ca6a131ebb9e558a8b4b90e0779","release":{"plugins":[["@semantic-release/npm",{"pkgRoot":"./dist"}],["@semantic-release/git",{"assets":["CHANGELOG.md","package.json"],"message":"chore(release): Release @asaidimu/utils-remote-store v\n{nextRelease.version} [skip ci]\n\n{nextRelease.notes}"}]]},"_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"_npmVersion":"10.9.2","description":"A reactive store for remote data, built on top of @asaidimu/utils-cache","directories":{},"_nodeVersion":"20.20.2","dependencies":{"eventsource":"^4.0.0","@asaidimu/utils-cache":"3.0.3"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/utils-remote-store_1.2.7_1776875361432_0.05472869725506935","host":"s3://npm-registry-packages-npm-production"}},"1.2.8":{"name":"@asaidimu/utils-remote-store","version":"1.2.8","_id":"@asaidimu/utils-remote-store@1.2.8","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"dist":{"shasum":"f7e7c8216e5a5d5cacb339c728e72ece30fb410f","tarball":"https://registry.npmjs.org/@asaidimu/utils-remote-store/-/utils-remote-store-1.2.8.tgz","fileCount":7,"integrity":"sha512-+/DH3IXCL8mNqjXlDuSFA6EGDhfDs8a/fuLsokdfa2tQ6+1/WqjToCpeQA8vbsn2CP64mEpuyEgDIVayi9cisA==","signatures":[{"sig":"MEYCIQDUFHmrqrOJ7Fct9FKRO3ZRz2eQboS0x7KLyt/a10J9TQIhAIcsnE+9TF9yoXU4uWhmee1cRdJNiQTwt2lTkMgb4Cpi","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":149402},"main":"index.js","types":"index.d.ts","module":"index.mjs","exports":{".":{"import":{"types":"./index.d.ts","default":"./index.mjs"},"require":{"types":"./index.d.ts","default":"./index.js"}}},"gitHead":"7db331869f38b1901c0feb66b222ec4dca203dfb","release":{"plugins":[["@semantic-release/npm",{"pkgRoot":"./dist"}],["@semantic-release/git",{"assets":["CHANGELOG.md","package.json"],"message":"chore(release): Release @asaidimu/utils-remote-store v\n{nextRelease.version} [skip ci]\n\n{nextRelease.notes}"}]]},"_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"_npmVersion":"10.9.2","description":"A reactive store for remote data, built on top of @asaidimu/utils-cache","directories":{},"_nodeVersion":"20.20.2","dependencies":{"eventsource":"^4.0.0","@asaidimu/utils-cache":"3.0.4"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/utils-remote-store_1.2.8_1776929523622_0.5201602532785163","host":"s3://npm-registry-packages-npm-production"}},"1.2.9":{"name":"@asaidimu/utils-remote-store","version":"1.2.9","_id":"@asaidimu/utils-remote-store@1.2.9","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"dist":{"shasum":"9e7eb3cc589eb72266225d01c786e0128e0d7761","tarball":"https://registry.npmjs.org/@asaidimu/utils-remote-store/-/utils-remote-store-1.2.9.tgz","fileCount":7,"integrity":"sha512-Dmkdg0a7IR0In+MZgXWlMLK0pPiAAz6U7vn/k+3tzs7WksfhbDv/Pizi9b2VEXwUjO4SFyA+f1bdDbWtIu6jRA==","signatures":[{"sig":"MEUCIFCablpgbKRcmk3Hl/mr5s3OERwHex9VQ6pQIiEr0pO+AiEA9K4ywz5cldl6aSls2PtSSuNcjyytxb/9PU1xJBpSttc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":149402},"main":"index.js","types":"index.d.ts","module":"index.mjs","exports":{".":{"import":{"types":"./index.d.ts","default":"./index.mjs"},"require":{"types":"./index.d.ts","default":"./index.js"}}},"gitHead":"884a4acfd758f83e20013031ddb75dd68e0a0017","release":{"plugins":[["@semantic-release/npm",{"pkgRoot":"./dist"}],["@semantic-release/git",{"assets":["CHANGELOG.md","package.json"],"message":"chore(release): Release @asaidimu/utils-remote-store v\n{nextRelease.version} [skip ci]\n\n{nextRelease.notes}"}]]},"_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"_npmVersion":"10.9.2","description":"A reactive store for remote data, built on top of @asaidimu/utils-cache","directories":{},"_nodeVersion":"20.20.2","dependencies":{"eventsource":"^4.0.0","@asaidimu/utils-cache":"3.0.5"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/utils-remote-store_1.2.9_1777907976139_0.21721334325081432","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"@asaidimu/utils-remote-store","version":"1.3.0","_id":"@asaidimu/utils-remote-store@1.3.0","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"dist":{"shasum":"be071b0b58f7aeb3a89e84f3facfd0eb22d565d3","tarball":"https://registry.npmjs.org/@asaidimu/utils-remote-store/-/utils-remote-store-1.3.0.tgz","fileCount":7,"integrity":"sha512-g7bm7DTeXLI1rT9lBJf7akHeam3Yri/92kVaCwAUD0HL9MscyCncXqS1FgDSDPLpxOsXcpxfeTvhIejGrZkRjw==","signatures":[{"sig":"MEYCIQDviERG5oiXaQz2kz4hiyC+qed8F6h37lZ6XpoG3TDKMwIhAMCXZCQlOO9JRES4oHoIWMfYerPmIcEti4/Gh/LTv18Z","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":149482},"main":"index.js","types":"index.d.ts","module":"index.mjs","exports":{".":{"import":{"types":"./index.d.ts","default":"./index.mjs"},"require":{"types":"./index.d.ts","default":"./index.js"}}},"gitHead":"a1c63ff4fcec85d896d1f84fef8afca2893ca47c","release":{"plugins":[["@semantic-release/npm",{"pkgRoot":"./dist"}],["@semantic-release/git",{"assets":["CHANGELOG.md","package.json"],"message":"chore(release): Release @asaidimu/utils-remote-store v\n{nextRelease.version} [skip ci]\n\n{nextRelease.notes}"}]]},"_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"_npmVersion":"10.9.2","description":"A reactive store for remote data, built on top of @asaidimu/utils-cache","directories":{},"_nodeVersion":"20.20.2","dependencies":{"eventsource":"^4.0.0","@asaidimu/utils-cache":"3.0.6"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/utils-remote-store_1.3.0_1778141808287_0.3184019098133506","host":"s3://npm-registry-packages-npm-production"}},"1.3.1":{"name":"@asaidimu/utils-remote-store","version":"1.3.1","_id":"@asaidimu/utils-remote-store@1.3.1","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"dist":{"shasum":"493f0727c6a0b8e6bcc41c04bcb206053844b9e7","tarball":"https://registry.npmjs.org/@asaidimu/utils-remote-store/-/utils-remote-store-1.3.1.tgz","fileCount":7,"integrity":"sha512-2fZodSmbP6pgwI51nwLV7kcwIjx7JOGQzpS3FjZ+2UKVLWmM+0vcT3VE4AN2/LYSuOBc8Ckejj7bv1D9Q1MlEw==","signatures":[{"sig":"MEQCIGNRT+k9PSwz8Yo8E39IEDsfXoe4kT4w2ZB4kM9HS2WRAiBCwYqiVaYX3w6pHvdHyl1R9MLcFHHhtwSDziLbLqnD1Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":143422},"main":"index.js","types":"index.d.ts","module":"index.mjs","exports":{".":{"import":{"types":"./index.d.ts","default":"./index.mjs"},"require":{"types":"./index.d.ts","default":"./index.js"}}},"gitHead":"f7807f0cc3c369515ab27c7af969914160958e30","release":{"plugins":[["@semantic-release/npm",{"pkgRoot":"./dist"}],["@semantic-release/git",{"assets":["CHANGELOG.md","package.json"],"message":"chore(release): Release @asaidimu/utils-remote-store v\n{nextRelease.version} [skip ci]\n\n{nextRelease.notes}"}]]},"_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"_npmVersion":"10.9.2","description":"A reactive store for remote data, built on top of @asaidimu/utils-cache","directories":{},"_nodeVersion":"20.20.2","dependencies":{"eventsource":"^4.0.0","@asaidimu/utils-cache":"3.1.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/utils-remote-store_1.3.1_1778147499239_0.6039638417043725","host":"s3://npm-registry-packages-npm-production"}},"1.3.2":{"name":"@asaidimu/utils-remote-store","version":"1.3.2","_id":"@asaidimu/utils-remote-store@1.3.2","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"dist":{"shasum":"dcfdc53c5ba1fdec7d8bbcf12c6b3cca7f8e780f","tarball":"https://registry.npmjs.org/@asaidimu/utils-remote-store/-/utils-remote-store-1.3.2.tgz","fileCount":7,"integrity":"sha512-kNtGybECSS8WOpRG2Axun2AjoKAldTfBJATNmyFv2XHwSwBubkVClGpagdHFO8eP4+zqBrW1rj5QnOZm8I7WVg==","signatures":[{"sig":"MEUCIDtqxSWt355uU+7YOhNGZ2eZmwXCqea2GusEMBpPdXA1AiEA0Gpn9mxmG2Eu/HivMAxNm4qKE4u1C0QdaYjESOZnmps=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":149482},"main":"index.js","types":"index.d.ts","module":"index.mjs","exports":{".":{"import":{"types":"./index.d.ts","default":"./index.mjs"},"require":{"types":"./index.d.ts","default":"./index.js"}}},"gitHead":"7b8ffe3a306e71fa7fdf319ba8a46aa82ddd2809","release":{"plugins":[["@semantic-release/npm",{"pkgRoot":"./dist"}],["@semantic-release/git",{"assets":["CHANGELOG.md","package.json"],"message":"chore(release): Release @asaidimu/utils-remote-store v\n{nextRelease.version} [skip ci]\n\n{nextRelease.notes}"}]]},"_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"_npmVersion":"10.9.2","description":"A reactive store for remote data, built on top of @asaidimu/utils-cache","directories":{},"_nodeVersion":"20.20.2","dependencies":{"eventsource":"^4.0.0","@asaidimu/utils-cache":"3.1.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/utils-remote-store_1.3.2_1778232121230_0.6100523144380152","host":"s3://npm-registry-packages-npm-production"}},"1.3.3":{"name":"@asaidimu/utils-remote-store","version":"1.3.3","_id":"@asaidimu/utils-remote-store@1.3.3","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"dist":{"shasum":"d59c6c8894623de7048ac5ec1c4011b96663c376","tarball":"https://registry.npmjs.org/@asaidimu/utils-remote-store/-/utils-remote-store-1.3.3.tgz","fileCount":7,"integrity":"sha512-FIa7rl7dzja8xeFic/wBSxfaBWYKoWDXshDSwM3GvAhzaIEMPfdHxqQEhPra6gN2MKZ0PE1NNk26ppmb5h8+Cw==","signatures":[{"sig":"MEUCIQCyo3IaKvho4isp2Gn2f/kNFXBbFlp8pV84GUUD83PGTQIgZyk9FL3KpiDULgRIHHjNto4OP+qBX86eQDJbTy9OQEU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":149482},"main":"index.js","types":"index.d.ts","module":"index.mjs","exports":{".":{"import":{"types":"./index.d.ts","default":"./index.mjs"},"require":{"types":"./index.d.ts","default":"./index.js"}}},"gitHead":"b5a362df3a603484c1cc049f74cf24e0a9fd9f1e","release":{"plugins":[["@semantic-release/npm",{"pkgRoot":"./dist"}],["@semantic-release/git",{"assets":["CHANGELOG.md","package.json"],"message":"chore(release): Release @asaidimu/utils-remote-store v\n{nextRelease.version} [skip ci]\n\n{nextRelease.notes}"}]]},"_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"_npmVersion":"10.9.2","description":"A reactive store for remote data, built on top of @asaidimu/utils-cache","directories":{},"_nodeVersion":"20.20.2","dependencies":{"eventsource":"^4.0.0","@asaidimu/utils-cache":"3.1.2"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/utils-remote-store_1.3.3_1778240344340_0.5662255336438069","host":"s3://npm-registry-packages-npm-production"}},"1.3.4":{"name":"@asaidimu/utils-remote-store","version":"1.3.4","_id":"@asaidimu/utils-remote-store@1.3.4","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"dist":{"shasum":"54d5b0a6d0492f8e38adfad37d14da2704ed32fc","tarball":"https://registry.npmjs.org/@asaidimu/utils-remote-store/-/utils-remote-store-1.3.4.tgz","fileCount":7,"integrity":"sha512-mQ3UL8JLi4wK1zz+fOCdBi6sNcYR8tsK8zV8Qjmnx7lBUQ5PLxYFUc59eLNho+02yiIl+XCUeorHsr1T9FlWfA==","signatures":[{"sig":"MEUCIGXe+TpCz4yLCIZIs0DWRC0THH9SxeQfcx59bvl4rXR3AiEA8GsEAGKvUAh7UKFgsG4mBY6psogUyePOxRgrgJh1EsM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":149482},"main":"index.js","types":"index.d.ts","module":"index.mjs","exports":{".":{"import":{"types":"./index.d.ts","default":"./index.mjs"},"require":{"types":"./index.d.ts","default":"./index.js"}}},"gitHead":"d9551e869331da2b3c28305eb168ea653c0596a0","release":{"plugins":[["@semantic-release/npm",{"pkgRoot":"./dist"}],["@semantic-release/git",{"assets":["CHANGELOG.md","package.json"],"message":"chore(release): Release @asaidimu/utils-remote-store v\n{nextRelease.version} [skip ci]\n\n{nextRelease.notes}"}]]},"_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"_npmVersion":"10.9.2","description":"A reactive store for remote data, built on top of @asaidimu/utils-cache","directories":{},"_nodeVersion":"20.20.2","dependencies":{"eventsource":"^4.0.0","@asaidimu/utils-cache":"3.1.3"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/utils-remote-store_1.3.4_1778307385116_0.03003048093514149","host":"s3://npm-registry-packages-npm-production"}},"1.3.5":{"name":"@asaidimu/utils-remote-store","version":"1.3.5","_id":"@asaidimu/utils-remote-store@1.3.5","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"dist":{"shasum":"3de5dbcd2c1acc78ec11440fd4cbe09decacf6c8","tarball":"https://registry.npmjs.org/@asaidimu/utils-remote-store/-/utils-remote-store-1.3.5.tgz","fileCount":7,"integrity":"sha512-K6QWjR4NnM8s+U4BVOB/mPLz1YaquLLQ7N4tFRk0IYFT2tAeVqlcE+ylKRxgC2C/wtneAVnrn3+pr7Uc4YXFbA==","signatures":[{"sig":"MEUCIQDtOHWsal655FACMlAflu2OTaPpAllTQ2p/zCa34iYuzAIgWAfVwsRu/P/X3AcXQ7S8s/cxpXoq92aarJ8HfHAlDks=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":149482},"main":"index.js","types":"index.d.ts","module":"index.mjs","exports":{".":{"import":{"types":"./index.d.ts","default":"./index.mjs"},"require":{"types":"./index.d.ts","default":"./index.js"}}},"gitHead":"a3182d21c756cbf32525bf39a07085a1a78e5bca","release":{"plugins":[["@semantic-release/npm",{"pkgRoot":"./dist"}],["@semantic-release/git",{"assets":["CHANGELOG.md","package.json"],"message":"chore(release): Release @asaidimu/utils-remote-store v\n{nextRelease.version} [skip ci]\n\n{nextRelease.notes}"}]]},"_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"_npmVersion":"10.9.2","description":"A reactive store for remote data, built on top of @asaidimu/utils-cache","directories":{},"_nodeVersion":"20.20.2","dependencies":{"eventsource":"^4.0.0","@asaidimu/utils-cache":"3.1.4"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/utils-remote-store_1.3.5_1778308069143_0.35573429909714127","host":"s3://npm-registry-packages-npm-production"}},"1.3.6":{"name":"@asaidimu/utils-remote-store","version":"1.3.6","_id":"@asaidimu/utils-remote-store@1.3.6","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"dist":{"shasum":"c10c5581c268d951f2b7dfd5fa22706908ffca23","tarball":"https://registry.npmjs.org/@asaidimu/utils-remote-store/-/utils-remote-store-1.3.6.tgz","fileCount":7,"integrity":"sha512-3x/Ls5xaFDdwwLza9we6iur+WbItlKOu64Qxw7DsUisU0wfC+mB0tWMIKQ65QQQXrXJUY+L/bv4sTOcu5pkY0w==","signatures":[{"sig":"MEUCIAK9YK5itSb17jAk74RRA3l0eT5ztPwpj/TXacfcjnAOAiEAq/N0mmg+KkXw/ijEqk2CTTa65bYcoKIF1e/U9ry+Ww4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":149483},"main":"index.js","types":"index.d.ts","module":"index.mjs","exports":{".":{"import":{"types":"./index.d.ts","default":"./index.mjs"},"require":{"types":"./index.d.ts","default":"./index.js"}}},"gitHead":"0c24074883abc68c8d7252498c048902c8f27015","release":{"plugins":[["@semantic-release/npm",{"pkgRoot":"./dist"}],["@semantic-release/git",{"assets":["CHANGELOG.md","package.json"],"message":"chore(release): Release @asaidimu/utils-remote-store v\n{nextRelease.version} [skip ci]\n\n{nextRelease.notes}"}]]},"_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"_npmVersion":"10.9.2","description":"A reactive store for remote data, built on top of @asaidimu/utils-cache","directories":{},"_nodeVersion":"20.20.2","dependencies":{"eventsource":"^4.0.0","@asaidimu/utils-cache":"^3.1.5"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/utils-remote-store_1.3.6_1778656979742_0.9416738731009027","host":"s3://npm-registry-packages-npm-production"}},"1.3.7":{"name":"@asaidimu/utils-remote-store","version":"1.3.7","_id":"@asaidimu/utils-remote-store@1.3.7","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"dist":{"shasum":"0ba79037583e61a96d2ccb076eb29d8b6383e86f","tarball":"https://registry.npmjs.org/@asaidimu/utils-remote-store/-/utils-remote-store-1.3.7.tgz","fileCount":7,"integrity":"sha512-wJKILFNWX2+yIJvhTGOlVTZrIbl5tYZyzJ+SqQ7PPG9rdmd765VNdDvyi4c7oammf0yRbqD0W5jjI191c0OkMA==","signatures":[{"sig":"MEUCICasESCrw3T0YukHWUzcFnpzxFkqrub9FMMXJN6h0oHMAiEA6Xp4qdad+Te0ux0Y5oR3/PfV81xi+x5tdZtR7dqYkvk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":149483},"main":"index.js","types":"index.d.ts","module":"index.mjs","exports":{".":{"import":{"types":"./index.d.ts","default":"./index.mjs"},"require":{"types":"./index.d.ts","default":"./index.js"}}},"gitHead":"a37503ae5ebb7a632233a05d8a4bf2564a135335","release":{"plugins":[["@semantic-release/npm",{"pkgRoot":"./dist"}],["@semantic-release/git",{"assets":["CHANGELOG.md","package.json"],"message":"chore(release): Release @asaidimu/utils-remote-store v\n{nextRelease.version} [skip ci]\n\n{nextRelease.notes}"}]]},"_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"_npmVersion":"10.9.2","description":"A reactive store for remote data, built on top of @asaidimu/utils-cache","directories":{},"_nodeVersion":"22.22.3","dependencies":{"eventsource":"^4.0.0","@asaidimu/utils-cache":"^3.1.6"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/utils-remote-store_1.3.7_1779712266461_0.2600151139468305","host":"s3://npm-registry-packages-npm-production"}},"1.3.8":{"name":"@asaidimu/utils-remote-store","version":"1.3.8","_id":"@asaidimu/utils-remote-store@1.3.8","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"dist":{"shasum":"473ee8ac65f9fa25c3dcd467c71b1f2c3a2e7817","tarball":"https://registry.npmjs.org/@asaidimu/utils-remote-store/-/utils-remote-store-1.3.8.tgz","fileCount":7,"integrity":"sha512-mspnaS+13Tupi1LRIfUFE9TOgn20QAZ5R65Th0k5qOakYEX5Axuqg79vi5f3OGTul0M6EGun4yHOTZ5XruEblg==","signatures":[{"sig":"MEUCICwIc+imvASP/Q7A64HUz7IVjQI/Whr/sZYzXlkAk7+XAiEAhugnankplfwAG9kEUCg0zmJOv4k6QH3dnxUA8eIfYxo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":149483},"main":"index.js","types":"index.d.ts","module":"index.mjs","exports":{".":{"import":{"types":"./index.d.ts","default":"./index.mjs"},"require":{"types":"./index.d.ts","default":"./index.js"}}},"gitHead":"7b2d676c46a58b9c37d4923949e36424efa30118","release":{"plugins":[["@semantic-release/npm",{"pkgRoot":"./dist"}],["@semantic-release/git",{"assets":["CHANGELOG.md","package.json"],"message":"chore(release): Release @asaidimu/utils-remote-store v\n{nextRelease.version} [skip ci]\n\n{nextRelease.notes}"}]]},"_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"_npmVersion":"10.9.2","description":"A reactive store for remote data, built on top of @asaidimu/utils-cache","directories":{},"_nodeVersion":"22.22.3","dependencies":{"eventsource":"^4.0.0","@asaidimu/utils-cache":"^3.1.7"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/utils-remote-store_1.3.8_1780995853950_0.16393985555270962","host":"s3://npm-registry-packages-npm-production"}},"1.3.9":{"name":"@asaidimu/utils-remote-store","version":"1.3.9","_id":"@asaidimu/utils-remote-store@1.3.9","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"dist":{"shasum":"f1affff7557dc45a9de8a7b59fda447ce14ac796","tarball":"https://registry.npmjs.org/@asaidimu/utils-remote-store/-/utils-remote-store-1.3.9.tgz","fileCount":7,"integrity":"sha512-zm2Yray+iNY7XOhnLq130q6gy0ZxIIY4OK6+Gip1KmKF3V9ZjSdQyvDPKseB8O8rOWfQTzxelKIwui/+31o9RQ==","signatures":[{"sig":"MEUCIFB868NuaK6FRCQxskCIIVNAldhTAFn0/tgR6frVXZgIAiEAhp4ER3wWMbJIutgBqbdczkoKE8MH2GDhMlp1OyNSqI0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":149483},"main":"index.js","types":"index.d.ts","module":"index.mjs","exports":{".":{"import":{"types":"./index.d.ts","default":"./index.mjs"},"require":{"types":"./index.d.ts","default":"./index.js"}}},"gitHead":"d1303e4b53a6261f99f6cac871f683a80d42ceeb","release":{"plugins":[["@semantic-release/npm",{"pkgRoot":"./dist"}],["@semantic-release/git",{"assets":["CHANGELOG.md","package.json"],"message":"chore(release): Release @asaidimu/utils-remote-store v\n{nextRelease.version} [skip ci]\n\n{nextRelease.notes}"}]]},"_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"_npmVersion":"10.9.2","description":"A reactive store for remote data, built on top of @asaidimu/utils-cache","directories":{},"_nodeVersion":"22.22.3","dependencies":{"eventsource":"^4.0.0","@asaidimu/utils-cache":"^3.1.8"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/utils-remote-store_1.3.9_1781280371523_0.9209139603583283","host":"s3://npm-registry-packages-npm-production"}},"1.3.10":{"name":"@asaidimu/utils-remote-store","version":"1.3.10","_id":"@asaidimu/utils-remote-store@1.3.10","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"dist":{"shasum":"0071bee23966650744e9145fb1f1ea3f676d11d3","tarball":"https://registry.npmjs.org/@asaidimu/utils-remote-store/-/utils-remote-store-1.3.10.tgz","fileCount":7,"integrity":"sha512-XtKWYYPZJ5rckIcmkfg+NZqBPJ4Gfa0tNbNMGB1wZBhXpEuSDzBR0pb7ohPkFZKqZYMQ/N4PsDGOL2iOaVm5Ng==","signatures":[{"sig":"MEYCIQD7GoL2Qy/FJvyQYUf96G8G/xnvwvmd83UvxrWbLUbv4wIhAKkiAqKp8nvYEcDMt0bOJc0gzlIaLz4/ADK44yhCJzwR","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":149442},"main":"index.js","types":"index.d.ts","module":"index.mjs","exports":{".":{"import":{"types":"./index.d.ts","default":"./index.mjs"},"require":{"types":"./index.d.ts","default":"./index.js"}}},"gitHead":"b6a62d42c1a5163c627bb3f53872af54f781dcec","release":{"plugins":[["@semantic-release/npm",{"pkgRoot":"./dist"}],["@semantic-release/git",{"assets":["CHANGELOG.md","package.json"],"message":"chore(release): Release @asaidimu/utils-remote-store v\n{nextRelease.version} [skip ci]\n\n{nextRelease.notes}"}]]},"_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"_npmVersion":"10.9.8","description":"A reactive store for remote data, built on top of @asaidimu/utils-cache","directories":{},"_nodeVersion":"22.22.3","dependencies":{"eventsource":"^4.0.0","@asaidimu/utils-cache":"^3.1.9"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/utils-remote-store_1.3.10_1781711417041_0.6731135248346094","host":"s3://npm-registry-packages-npm-production"}},"1.3.11":{"name":"@asaidimu/utils-remote-store","version":"1.3.11","_id":"@asaidimu/utils-remote-store@1.3.11","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"dist":{"shasum":"1600b0500533d654ee661b8db6056c993630f6c3","tarball":"https://registry.npmjs.org/@asaidimu/utils-remote-store/-/utils-remote-store-1.3.11.tgz","fileCount":7,"integrity":"sha512-fWASiMtPKwYybg2Mk9KNJ0iFmTJS6uVdiq9gZPtPNNMPHVwW+5AJnyx6TR1fuPzzWGKL3HYYq22PMPivSUHzpQ==","signatures":[{"sig":"MEQCIHejNxlwy27lGNmkQlPfhMe2Pli7w7HqTomlZLBNtCESAiAsmYKZV4Al4NGx5saOUuB6yGElgyOesBsp4zpf2yvlyA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":149443},"main":"index.js","types":"index.d.ts","module":"index.mjs","exports":{".":{"import":{"types":"./index.d.ts","default":"./index.mjs"},"require":{"types":"./index.d.ts","default":"./index.js"}}},"gitHead":"2e8d19b83b8bbca6b9bdd54b23f1d2ddec5b61ed","release":{"plugins":[["@semantic-release/npm",{"pkgRoot":"./dist"}],["@semantic-release/git",{"assets":["CHANGELOG.md","package.json"],"message":"chore(release): Release @asaidimu/utils-remote-store v\n{nextRelease.version} [skip ci]\n\n{nextRelease.notes}"}]]},"_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"_npmVersion":"10.9.8","description":"A reactive store for remote data, built on top of @asaidimu/utils-cache","directories":{},"_nodeVersion":"22.22.3","dependencies":{"eventsource":"^4.0.0","@asaidimu/utils-cache":"^3.1.10"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/utils-remote-store_1.3.11_1781764071063_0.14512178901154194","host":"s3://npm-registry-packages-npm-production"}},"1.3.12":{"name":"@asaidimu/utils-remote-store","version":"1.3.12","_id":"@asaidimu/utils-remote-store@1.3.12","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"dist":{"shasum":"c23fe26f2b81c7d29ff59f07d02d919014fbb827","tarball":"https://registry.npmjs.org/@asaidimu/utils-remote-store/-/utils-remote-store-1.3.12.tgz","fileCount":7,"integrity":"sha512-SR+S/K1nJUxexAQg85F315kMwfAIOz+dBGAYs3fgKY+RwFvYxt7RxuIyNEZ/NdJCRyVD4m0XewgSHInby+8QTg==","signatures":[{"sig":"MEQCICFORqW0r9l2M/GcYM768yVirqlFlUAsIJOcCLq/4UtvAiBV4jic2B38aRFDFFaaqMWEzVyJK3+bpchm4i6x0QSJVA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":143943},"main":"index.js","types":"index.d.ts","module":"index.mjs","exports":{".":{"import":{"types":"./index.d.ts","default":"./index.mjs"},"require":{"types":"./index.d.ts","default":"./index.js"}}},"gitHead":"71f36e6d9715b22f70a3c178b44fb9a058f9c274","release":{"plugins":[["@semantic-release/npm",{"pkgRoot":"./dist"}],["@semantic-release/git",{"assets":["CHANGELOG.md","package.json"],"message":"chore(release): Release @asaidimu/utils-remote-store v\n{nextRelease.version} [skip ci]\n\n{nextRelease.notes}"}]]},"_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"_npmVersion":"10.9.8","description":"A reactive store for remote data, built on top of @asaidimu/utils-cache","directories":{},"_nodeVersion":"22.22.3","dependencies":{"eventsource":"^4.0.0","@asaidimu/utils-cache":"^3.1.11"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/utils-remote-store_1.3.12_1781944014113_0.17525369525048218","host":"s3://npm-registry-packages-npm-production"}},"1.3.13":{"name":"@asaidimu/utils-remote-store","version":"1.3.13","_id":"@asaidimu/utils-remote-store@1.3.13","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"dist":{"shasum":"2c7c4c08a01928db9d26722ac8b2b09e4501b80a","tarball":"https://registry.npmjs.org/@asaidimu/utils-remote-store/-/utils-remote-store-1.3.13.tgz","fileCount":7,"integrity":"sha512-5XUVjznn3ta0hBK8P5iTsSDswmwMd3AOKCS6vWtXvk4OS4JIscl+ciwSQPCM017GbYMeJUIIwrXP3mSLUvZLHA==","signatures":[{"sig":"MEQCIHD6f/BIwRGV2gBtLpH6OQ/GHociTaa8BS5tQOp2twQsAiAJQ4KvhQ8biJhmBWbC6cc70APegHRwSeJJ1nT579BEXQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":134980},"main":"index.js","types":"index.d.ts","module":"index.mjs","exports":{".":{"import":{"types":"./index.d.ts","default":"./index.mjs"},"require":{"types":"./index.d.ts","default":"./index.js"}}},"gitHead":"9c4c6ed968d3acc4e326f0553bdb6b518612e197","release":{"plugins":[["@semantic-release/npm",{"pkgRoot":"./dist"}],["@semantic-release/git",{"assets":["CHANGELOG.md","package.json"],"message":"chore(release): Release @asaidimu/utils-remote-store v\n{nextRelease.version} [skip ci]\n\n{nextRelease.notes}"}]]},"_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"_npmVersion":"10.9.8","description":"A reactive store for remote data, built on top of @asaidimu/utils-cache","directories":{},"_nodeVersion":"22.22.3","dependencies":{"eventsource":"^4.0.0","@asaidimu/utils-cache":"^3.1.12"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/utils-remote-store_1.3.13_1782113627552_0.8524331330939301","host":"s3://npm-registry-packages-npm-production"}},"1.3.14":{"name":"@asaidimu/utils-remote-store","version":"1.3.14","_id":"@asaidimu/utils-remote-store@1.3.14","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"dist":{"shasum":"63073880474f4dc45da7b00cff2c21ef925e9cb9","tarball":"https://registry.npmjs.org/@asaidimu/utils-remote-store/-/utils-remote-store-1.3.14.tgz","fileCount":7,"integrity":"sha512-iKCzZ8F3ToQM9Ghhsg6N7B+AaD6deD36qRXwbclca5Ss83Hniyx0kezPXGp23aylKVI0yTmhbOLbBYoGTYou2Q==","signatures":[{"sig":"MEYCIQDl5LA7iflClwhsG7HdT+KjEi2pFZEz+7db9P5MKBmEKAIhANLDtmgadiaV2C56jwTG56lH3WMY3+Hk/82lXTy0vMRj","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":134980},"main":"index.js","types":"index.d.ts","module":"index.mjs","exports":{".":{"import":{"types":"./index.d.ts","default":"./index.mjs"},"require":{"types":"./index.d.ts","default":"./index.js"}}},"gitHead":"1d886f4862d6d00e3c8ff91e2bc358bf625eb41a","release":{"plugins":[["@semantic-release/npm",{"pkgRoot":"./dist"}],["@semantic-release/git",{"assets":["CHANGELOG.md","package.json"],"message":"chore(release): Release @asaidimu/utils-remote-store v\n{nextRelease.version} [skip ci]\n\n{nextRelease.notes}"}]]},"_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"_npmVersion":"10.9.8","description":"A reactive store for remote data, built on top of @asaidimu/utils-cache","directories":{},"_nodeVersion":"22.22.3","dependencies":{"eventsource":"^4.0.0","@asaidimu/utils-cache":"^3.1.13"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/utils-remote-store_1.3.14_1782114908360_0.645122524294633","host":"s3://npm-registry-packages-npm-production"}},"1.3.15":{"name":"@asaidimu/utils-remote-store","version":"1.3.15","_id":"@asaidimu/utils-remote-store@1.3.15","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"dist":{"shasum":"45e167cf3b40153caab0468a5b71d51c8558b5ce","tarball":"https://registry.npmjs.org/@asaidimu/utils-remote-store/-/utils-remote-store-1.3.15.tgz","fileCount":7,"integrity":"sha512-2nl0jtQYD3W3LkLlaN2VlSlbTDuWjeC336DH5ETHC6I+n8URasw7XYLYXlVIpSzql8suVbSBhupln6FDMTv7Mg==","signatures":[{"sig":"MEYCIQDsu6a7+OlnX8eEmQq9oUyapgE35eTCqiYUW/DpvvymCQIhANowwmh+UgqaVOn/DYwG5GTMDFSdM8CTE0PbPl7TbTy4","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":134980},"main":"index.js","types":"index.d.ts","module":"index.mjs","exports":{".":{"import":{"types":"./index.d.ts","default":"./index.mjs"},"require":{"types":"./index.d.ts","default":"./index.js"}}},"gitHead":"463323d66134e7387d8be01dfdf06eb39b851882","release":{"plugins":[["@semantic-release/npm",{"pkgRoot":"./dist"}],["@semantic-release/git",{"assets":["CHANGELOG.md","package.json"],"message":"chore(release): Release @asaidimu/utils-remote-store v\n{nextRelease.version} [skip ci]\n\n{nextRelease.notes}"}]]},"_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"_npmVersion":"10.9.8","description":"A reactive store for remote data, built on top of @asaidimu/utils-cache","directories":{},"_nodeVersion":"22.22.3","dependencies":{"eventsource":"^4.0.0","@asaidimu/utils-cache":"^3.1.14"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/utils-remote-store_1.3.15_1782115597006_0.6038204393182047","host":"s3://npm-registry-packages-npm-production"}},"1.3.16":{"name":"@asaidimu/utils-remote-store","version":"1.3.16","_id":"@asaidimu/utils-remote-store@1.3.16","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"dist":{"shasum":"61c834e30c665ae781ca6594cf9b0fab45adc30d","tarball":"https://registry.npmjs.org/@asaidimu/utils-remote-store/-/utils-remote-store-1.3.16.tgz","fileCount":7,"integrity":"sha512-GnRaZXbbuEDgD+03jx86lnzZSGDBToRFoROqBvvTqDg97ax6kgtf6cYvA1xULjh613Du7A+1YlKAR6llZmRgig==","signatures":[{"sig":"MEYCIQDxT9qhgpi/McIUkk/6m0jwAOfxXoZYhi9A4win32SgOgIhAJ0Lm03BePx4NisarREeQO823d6CGzqUiPZycUg3VibQ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":134979},"main":"index.js","types":"index.d.ts","module":"index.mjs","exports":{".":{"import":{"types":"./index.d.ts","default":"./index.mjs"},"require":{"types":"./index.d.ts","default":"./index.js"}}},"gitHead":"c8c74e5a1f4dd268644a927d798d389b6c1e2236","release":{"plugins":[["@semantic-release/npm",{"pkgRoot":"./dist"}],["@semantic-release/git",{"assets":["CHANGELOG.md","package.json"],"message":"chore(release): Release @asaidimu/utils-remote-store v\n{nextRelease.version} [skip ci]\n\n{nextRelease.notes}"}]]},"_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"_npmVersion":"10.9.8","description":"A reactive store for remote data, built on top of @asaidimu/utils-cache","directories":{},"_nodeVersion":"22.22.3","dependencies":{"eventsource":"^4.0.0","@asaidimu/utils-cache":"3.1.15"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/utils-remote-store_1.3.16_1782224092821_0.002846915412531681","host":"s3://npm-registry-packages-npm-production"}},"1.3.17":{"name":"@asaidimu/utils-remote-store","version":"1.3.17","_id":"@asaidimu/utils-remote-store@1.3.17","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"dist":{"shasum":"24f9b15dfccb459dbcee05196fbda1c64addfef2","tarball":"https://registry.npmjs.org/@asaidimu/utils-remote-store/-/utils-remote-store-1.3.17.tgz","fileCount":7,"integrity":"sha512-/IEWZzzuvx5ESSJYFH+8eTfZPJpBdSZN6Xv9PG0PvH2PsbYf51TA6MabT257X01LfMK7o8cCBhsC8c1XTuiG2g==","signatures":[{"sig":"MEYCIQCi+O+xoIrjFMbuEWqbyclgVX7OjWsvaC20H5hsv9OlnAIhAMG4JZCD0e7X8gyv17gAT1Ql/5kTjhFyIB6Q2Oefmha5","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":134980},"main":"index.js","types":"index.d.ts","module":"index.mjs","exports":{".":{"import":{"types":"./index.d.ts","default":"./index.mjs"},"require":{"types":"./index.d.ts","default":"./index.js"}}},"gitHead":"4096e554ff53365c568d61af6e6efc917462de16","release":{"plugins":[["@semantic-release/npm",{"pkgRoot":"./dist"}],["@semantic-release/git",{"assets":["CHANGELOG.md","package.json"],"message":"chore(release): Release @asaidimu/utils-remote-store v\n{nextRelease.version} [skip ci]\n\n{nextRelease.notes}"}]]},"_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"_npmVersion":"10.9.8","description":"A reactive store for remote data, built on top of @asaidimu/utils-cache","directories":{},"_nodeVersion":"22.22.3","dependencies":{"eventsource":"^4.0.0","@asaidimu/utils-cache":"^3.1.16"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/utils-remote-store_1.3.17_1782229199020_0.7908694354347421","host":"s3://npm-registry-packages-npm-production"}},"1.3.18":{"name":"@asaidimu/utils-remote-store","version":"1.3.18","_id":"@asaidimu/utils-remote-store@1.3.18","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"dist":{"shasum":"e84b6c9831bfbf41833ff32985c67425e648c7c0","tarball":"https://registry.npmjs.org/@asaidimu/utils-remote-store/-/utils-remote-store-1.3.18.tgz","fileCount":7,"integrity":"sha512-oIttirWz2L/vTApW7s/ZIy8VJEQFi2idKcNa4roiJEEaTbQHeJRPV0BwrfbHFQTJ/59Dev7Wl+vHUL8wavRzjg==","signatures":[{"sig":"MEUCIQDjb1yJFafcOigz3fFIpHN8w7kNduBgjiBzP/KscKaUzQIgWLn//Sjk3txseiJAnOd0wokR5a4Yi0xduWNHf1KjVpk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":135042},"main":"index.js","types":"index.d.ts","module":"index.mjs","exports":{".":{"import":{"types":"./index.d.ts","default":"./index.mjs"},"require":{"types":"./index.d.ts","default":"./index.js"}}},"gitHead":"3316e0859f8819e21404eaf102ed847499f8cfe2","release":{"plugins":[["@semantic-release/npm",{"pkgRoot":"./dist"}],["@semantic-release/git",{"assets":["CHANGELOG.md","package.json"],"message":"chore(release): Release @asaidimu/utils-remote-store v\n{nextRelease.version} [skip ci]\n\n{nextRelease.notes}"}]]},"_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"_npmVersion":"10.9.8","description":"A reactive store for remote data, built on top of @asaidimu/utils-cache","directories":{},"_nodeVersion":"22.23.0","dependencies":{"eventsource":"^4.0.0","@asaidimu/utils-cache":"^3.1.17"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/utils-remote-store_1.3.18_1782397504943_0.446254790593106","host":"s3://npm-registry-packages-npm-production"}},"1.3.19":{"name":"@asaidimu/utils-remote-store","version":"1.3.19","_id":"@asaidimu/utils-remote-store@1.3.19","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"dist":{"shasum":"a5ddf19e18f7db2c6c3ffc61bbe4c91372a4f8e8","tarball":"https://registry.npmjs.org/@asaidimu/utils-remote-store/-/utils-remote-store-1.3.19.tgz","fileCount":7,"integrity":"sha512-ZiqnV4E8og0XP/6wkG8zjhp2siBeYiXY4Rt7MpvAnVV8zywYvPXV0vWnXu/OV1AJVuEAobmIZ0CcAaSNlvJQ5A==","signatures":[{"sig":"MEYCIQDgL+1bGUaLTUHUBX3c2OoNeTcYzEza6KjBs4NCAhzvDAIhAI2awapB+sYA7uEcvpnAxZ4BQ68RSEgwQEU33xGgDxRZ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":135042},"main":"index.js","types":"index.d.ts","module":"index.mjs","exports":{".":{"import":{"types":"./index.d.ts","default":"./index.mjs"},"require":{"types":"./index.d.ts","default":"./index.js"}}},"gitHead":"66f13b6d9abe29f83a03793659e7426d7864a9c3","release":{"plugins":[["@semantic-release/npm",{"pkgRoot":"./dist"}],["@semantic-release/git",{"assets":["CHANGELOG.md","package.json"],"message":"chore(release): Release @asaidimu/utils-remote-store v\n{nextRelease.version} [skip ci]\n\n{nextRelease.notes}"}]]},"_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"_npmVersion":"10.9.8","description":"A reactive store for remote data, built on top of @asaidimu/utils-cache","directories":{},"_nodeVersion":"22.23.0","dependencies":{"eventsource":"^4.0.0","@asaidimu/utils-cache":"^3.1.18"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/utils-remote-store_1.3.19_1782891919119_0.19303495478356036","host":"s3://npm-registry-packages-npm-production"}},"1.3.20":{"name":"@asaidimu/utils-remote-store","version":"1.3.20","_id":"@asaidimu/utils-remote-store@1.3.20","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"dist":{"shasum":"a61c4fb2d04332703214fd9a6e2df7b2609aff04","tarball":"https://registry.npmjs.org/@asaidimu/utils-remote-store/-/utils-remote-store-1.3.20.tgz","fileCount":7,"integrity":"sha512-ANbdhUICU89fHEEiAWG51nk4J8PrYM6Ii9mm1Kus/HZS+kxcpxD6kvxFiNTPQnUxgvYbfMtiN72IOQIzlhctPA==","signatures":[{"sig":"MEYCIQCd6yNRecrobbOisS+SUUXZU7MdGp2HR/tvL5MNJHxMygIhAOMN8zd8IY4Iq9C2MUn997v9uCfpE+2EQ2c8eNgq7osr","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":127238},"main":"index.js","types":"index.d.ts","module":"index.mjs","exports":{".":{"import":{"types":"./index.d.ts","default":"./index.mjs"},"require":{"types":"./index.d.ts","default":"./index.js"}}},"gitHead":"200e12f0b74a7b633551fbdba38149d361e37527","release":{"plugins":[["@semantic-release/npm",{"pkgRoot":"./dist"}],["@semantic-release/git",{"assets":["CHANGELOG.md","package.json"],"message":"chore(release): Release @asaidimu/utils-remote-store v\n{nextRelease.version} [skip ci]\n\n{nextRelease.notes}"}]]},"_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"_npmVersion":"10.9.8","description":"A reactive store for remote data, built on top of @asaidimu/utils-cache","directories":{},"_nodeVersion":"22.23.1","dependencies":{"eventsource":"^4.0.0","@asaidimu/utils-cache":"^3.1.19"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/utils-remote-store_1.3.20_1783754554436_0.8539710462918702","host":"s3://npm-registry-packages-npm-production"}},"1.3.21":{"name":"@asaidimu/utils-remote-store","version":"1.3.21","_id":"@asaidimu/utils-remote-store@1.3.21","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"dist":{"shasum":"7fc05aac6dce47dc62a5ed9bd2641c6877f6d720","tarball":"https://registry.npmjs.org/@asaidimu/utils-remote-store/-/utils-remote-store-1.3.21.tgz","fileCount":7,"integrity":"sha512-xUPcA13TIf0uenbWymO7PZk9N9l6UwHFedOkfweyB4Dq9rfTnuDvFoL+ZYBZAA9XlAJEBq7wBHUZXXzwjMILeA==","signatures":[{"sig":"MEUCIQCXxmhxnSDccpQXu4wCb1MDwl3UM+olsxXEDBRHZKbOPAIgHedHNkDRJjw/+evSBN/yGiLMihFz6bKNL/NkM4DZWSA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":153487},"main":"index.js","types":"index.d.ts","module":"index.mjs","exports":{".":{"import":{"types":"./index.d.ts","default":"./index.mjs"},"require":{"types":"./index.d.ts","default":"./index.js"}}},"gitHead":"1ca165393da75e2457c4c34bfbe66c622d0bc980","release":{"plugins":[["@semantic-release/npm",{"pkgRoot":"./dist"}],["@semantic-release/git",{"assets":["CHANGELOG.md","package.json"],"message":"chore(release): Release @asaidimu/utils-remote-store v\n{nextRelease.version} [skip ci]\n\n{nextRelease.notes}"}]]},"_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"_npmVersion":"10.9.8","description":"A reactive store for remote data, built on top of @asaidimu/utils-cache","directories":{},"_nodeVersion":"22.23.1","dependencies":{"eventsource":"^4.0.0","@asaidimu/utils-cache":"^3.1.20"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/utils-remote-store_1.3.21_1783861885295_0.8052355574669765","host":"s3://npm-registry-packages-npm-production"}},"1.3.22":{"name":"@asaidimu/utils-remote-store","version":"1.3.22","_id":"@asaidimu/utils-remote-store@1.3.22","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"dist":{"shasum":"c6ceba76944529d9b994175e173cf38de66fb099","tarball":"https://registry.npmjs.org/@asaidimu/utils-remote-store/-/utils-remote-store-1.3.22.tgz","fileCount":7,"integrity":"sha512-YCuWtF92sygPPAKGI8TeaRKrZiv/uiSwC29TbbvLTPFBx5JMtOmvF7phOB5mT9WKrI4r7UTKC0MNO9TtACaenA==","signatures":[{"sig":"MEUCIDyAwEDKPFfnFhH7BTFObrtuWoB9vJ8g9fMks/3jJbPqAiEA6u5u1PTAKfcHiYMYGZuEs7D0F5WDwJcDfx5x4vJT/Hw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":153487},"main":"index.js","types":"index.d.ts","module":"index.mjs","exports":{".":{"import":{"types":"./index.d.ts","default":"./index.mjs"},"require":{"types":"./index.d.ts","default":"./index.js"}}},"gitHead":"2e4c88af554f0aca019eac82d151b35287a65f76","release":{"plugins":[["@semantic-release/npm",{"pkgRoot":"./dist"}],["@semantic-release/git",{"assets":["CHANGELOG.md","package.json"],"message":"chore(release): Release @asaidimu/utils-remote-store v\n{nextRelease.version} [skip ci]\n\n{nextRelease.notes}"}]]},"_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"_npmVersion":"10.9.8","description":"A reactive store for remote data, built on top of @asaidimu/utils-cache","directories":{},"_nodeVersion":"22.23.1","dependencies":{"eventsource":"^4.0.0","@asaidimu/utils-cache":"^3.1.21"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/utils-remote-store_1.3.22_1783863188499_0.24533358749456036","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"@asaidimu/utils-remote-store","version":"2.0.0","_id":"@asaidimu/utils-remote-store@2.0.0","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"dist":{"shasum":"1eb1a02e1427fe8afef82670113d307a5228a5d9","tarball":"https://registry.npmjs.org/@asaidimu/utils-remote-store/-/utils-remote-store-2.0.0.tgz","fileCount":7,"integrity":"sha512-ddkS5JMsca6k/+RDu9NUs//GYqyd85revNLa7Jy+jAeJ5pW6GOpkhyt7ZuIOMzQaRMJs5FGA1Z7oASmwYiDQQA==","signatures":[{"sig":"MEYCIQDEKlc+kmFyOoHVcuL1t4YPqkgV+wd/TrxFAkaW2g9U+gIhALlIju1eorC/+MqH9sP+VQcO3IJEUF6PyWk5rDJXiWud","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCICqHER9Z2WOitjO2HnVrcTA+MxZeDakVu9CH1sF8NeR1AiBPsmjpE9eCzoIEAiLW+y8oHiF1qaJgArjIC9dI+tHYhw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":153486},"main":"index.js","types":"index.d.ts","module":"index.mjs","exports":{".":{"import":{"types":"./index.d.ts","default":"./index.mjs"},"require":{"types":"./index.d.ts","default":"./index.js"}}},"gitHead":"4335d50210f583340aef1bbc532bc0b78509558e","release":{"plugins":[["@semantic-release/npm",{"pkgRoot":"./dist"}],["@semantic-release/git",{"assets":["CHANGELOG.md","package.json"],"message":"chore(release): Release @asaidimu/utils-remote-store v\n{nextRelease.version} [skip ci]\n\n{nextRelease.notes}"}]]},"_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"_npmVersion":"10.9.8","description":"A reactive store for remote data, built on top of @asaidimu/utils-cache","directories":{},"_nodeVersion":"22.23.2","dependencies":{"eventsource":"^4.0.0","@asaidimu/utils-cache":"^3.1.22"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/utils-remote-store_2.0.0_1788167835876_0.8874622966802932","host":"s3://npm-registry-packages-npm-production"}},"2.0.1":{"name":"@asaidimu/utils-remote-store","version":"2.0.1","_id":"@asaidimu/utils-remote-store@2.0.1","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"dist":{"shasum":"9bcea9987125542c972f785924d1cf5e13b51046","tarball":"https://registry.npmjs.org/@asaidimu/utils-remote-store/-/utils-remote-store-2.0.1.tgz","fileCount":7,"integrity":"sha512-HVmht2eT5LDMVMfv2pX8LSkr4ifch+7GeihE0diCcFPGygtyzrHiWZBasxiB4MjavrvYdd2TUG8QvQoyLEkACw==","signatures":[{"sig":"MEUCIQDx8mNHvR8lLFVOPh5DyJavv+yv4VzAOUwVc35UdtQAJgIgNanauMgCW/d/IqvW4+cIzPVnZIl0+wCJYvOadyS7tjA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIB97EzA6H8FP+g4m9MnChNCaVqwmrhSsBP1WhORCvH3aAiBtyFAo0QueSpeYydlX8tACFCvsTVfb51KXPaU+sy0JmQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":153485},"main":"index.js","types":"index.d.ts","module":"index.mjs","exports":{".":{"import":{"types":"./index.d.ts","default":"./index.mjs"},"require":{"types":"./index.d.ts","default":"./index.js"}}},"gitHead":"9a40c41cf110d9c2b3fecedf49c60135aa5aa388","release":{"plugins":[["@semantic-release/npm",{"pkgRoot":"./dist"}],["@semantic-release/git",{"assets":["CHANGELOG.md","package.json"],"message":"chore(release): Release @asaidimu/utils-remote-store v\n{nextRelease.version} [skip ci]\n\n{nextRelease.notes}"}]]},"_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"_npmVersion":"10.9.8","description":"A reactive store for remote data, built on top of @asaidimu/utils-cache","directories":{},"_nodeVersion":"22.23.2","dependencies":{"eventsource":"^4.0.0","@asaidimu/utils-cache":"^4.0.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/utils-remote-store_2.0.1_1788277453378_0.7439974629501946","host":"s3://npm-registry-packages-npm-production"}},"2.0.2":{"_id":"@asaidimu/utils-remote-store@2.0.2","dist":{"shasum":"90819ac4426beb1b7c91ecaae9d7d16f4f4d9442","tarball":"https://registry.npmjs.org/@asaidimu/utils-remote-store/-/utils-remote-store-2.0.2.tgz","fileCount":7,"integrity":"sha512-3Ver+lcVj8XhtdOSTcGSIUz2JyIDmJdcrW7gZlBSxBSedNT7k/uDk3T/BQaGKnTKse3jMW7q+wtsqhuYm9rA/Q==","signatures":[{"sig":"MEUCIE/MdYfjbGCn3Rb6wE3BayOaq0v00xo0SkZsArAAVIsnAiEAmYyFrpevspYMpP2jl2TCqVZkJkTnbaa3tqKivPJwZsQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDIKvLyg1qYiAdn2u+WglS3nfZ7dS8kkY3+mSW0G9sR6wIhAMV5J7OXoz9j4cf6OYf+N0G+da1lK4Q5WyoU/ukAw4mm"}],"unpackedSize":153485},"main":"index.js","name":"@asaidimu/utils-remote-store","types":"index.d.ts","module":"index.mjs","exports":{".":{"import":{"types":"./index.d.ts","default":"./index.mjs"},"require":{"types":"./index.d.ts","default":"./index.js"}}},"gitHead":"787c0be8a25621c87416df332d90cb0b647fa4c3","release":{"plugins":[["@semantic-release/npm",{"pkgRoot":"./dist"}],["@semantic-release/git",{"assets":["CHANGELOG.md","package.json"],"message":"chore(release): Release @asaidimu/utils-remote-store v\n{nextRelease.version} [skip ci]\n\n{nextRelease.notes}"}]]},"version":"2.0.2","_npmUser":{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"},"_npmVersion":"10.9.8","description":"A reactive store for remote data, built on top of @asaidimu/utils-cache","directories":{},"maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"_nodeVersion":"22.23.2","dependencies":{"eventsource":"^4.0.0","@asaidimu/utils-cache":"^4.0.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/utils-remote-store_2.0.2_1789153785166_0.5210219799620339"}}},"time":{"created":"2025-09-17T09:27:50.578Z","modified":"2026-09-11T19:09:45.425Z","1.0.0":"2025-09-17T09:27:50.930Z","1.1.0":"2025-09-17T13:29:17.464Z","1.2.0":"2025-09-19T12:24:34.550Z","1.2.1":"2025-09-23T10:22:12.486Z","1.2.2":"2025-09-23T11:28:29.881Z","1.2.3":"2025-11-27T16:15:14.171Z","1.2.4":"2025-12-29T21:18:05.449Z","1.2.5":"2026-03-09T15:11:19.538Z","1.2.6":"2026-04-21T10:00:47.238Z","1.2.7":"2026-04-22T16:29:21.658Z","1.2.8":"2026-04-23T07:32:03.741Z","1.2.9":"2026-05-04T15:19:36.285Z","1.3.0":"2026-05-07T08:16:48.456Z","1.3.1":"2026-05-07T09:51:39.394Z","1.3.2":"2026-05-08T09:22:01.365Z","1.3.3":"2026-05-08T11:39:04.484Z","1.3.4":"2026-05-09T06:16:25.281Z","1.3.5":"2026-05-09T06:27:49.284Z","1.3.6":"2026-05-13T07:22:59.881Z","1.3.7":"2026-05-25T12:31:06.602Z","1.3.8":"2026-06-09T09:04:14.085Z","1.3.9":"2026-06-12T16:06:11.670Z","1.3.10":"2026-06-17T15:50:17.201Z","1.3.11":"2026-06-18T06:27:51.225Z","1.3.12":"2026-06-20T08:26:54.251Z","1.3.13":"2026-06-22T07:33:47.684Z","1.3.14":"2026-06-22T07:55:08.492Z","1.3.15":"2026-06-22T08:06:37.153Z","1.3.16":"2026-06-23T14:14:52.985Z","1.3.17":"2026-06-23T15:39:59.166Z","1.3.18":"2026-06-25T14:25:05.073Z","1.3.19":"2026-07-01T07:45:19.272Z","1.3.20":"2026-07-11T07:22:34.594Z","1.3.21":"2026-07-12T13:11:25.462Z","1.3.22":"2026-07-12T13:33:08.618Z","2.0.0":"2026-08-31T09:17:15.959Z","2.0.1":"2026-09-01T15:44:13.460Z","2.0.2":"2026-09-11T19:09:45.268Z"},"description":"A reactive store for remote data, built on top of @asaidimu/utils-cache","maintainers":[{"name":"asaidimu","email":"lolokilesaidimu@gmail.com"}],"readme":"# Reactive Remote Store\n\nAn intelligent, reactive data management library for JavaScript/TypeScript applications, designed for optimal performance, real-time data synchronization, and seamless integration with any remote data source.\n\n[![npm version](https://img.shields.io/npm/v/@asaidimu/erp-utils-remote-store.svg)](https://www.npmjs.com/package/@asaidimu/erp-utils-remote-store)\n[![License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)\n[![TypeScript](https://img.shields.io/badge/Built%20with-TypeScript-blue.svg)](https://www.typescriptlang.org/)\n\n---\n\n## 🚀 Quick Links\n\n- [Overview & Features](#-overview--features)\n- [Installation & Setup](#-installation--setup)\n  - [Prerequisites](#prerequisites)\n  - [Installation Steps](#installation-steps)\n  - [Configuration](#configuration)\n  - [Verification](#verification)\n- [Usage Documentation](#-usage-documentation)\n  - [Basic Usage](#basic-usage)\n  - [API Usage](#api-usage)\n  - [Configuration Examples](#configuration-examples)\n  - [Common Use Cases](#common-use-cases)\n- [Project Architecture](#-project-architecture)\n  - [Directory Structure](#directory-structure)\n  - [Core Components](#core-components)\n  - [Data Flow](#data-flow)\n  - [Extension Points](#extension-points)\n- [Development & Contributing](#-development--contributing)\n  - [Development Setup](#development-setup)\n  - [Scripts](#scripts)\n  - [Testing](#testing)\n  - [Contributing Guidelines](#contributing-guidelines)\n  - [Issue Reporting](#issue-reporting)\n- [Additional Information](#-additional-information)\n  - [Troubleshooting](#troubleshooting)\n  - [FAQ](#faq)\n  - [Changelog/Roadmap](#changelogroadmap)\n  - [License](#license)\n  - [Acknowledgments](#acknowledgments)\n\n---\n\n## 📦 Overview & Features\n\n`ReactiveRemoteStore` provides a robust, reactive data management solution for applications that interact with remote APIs. It intelligently handles data fetching, caching, and synchronization, ensuring your application always has access to up-to-date information while minimizing network overhead and improving user experience. By integrating with a `QueryCache` and a `BaseStore` (your API client), it abstracts away the complexities of data lifecycle management, allowing developers to focus on application logic.\n\nKey aspects of `ReactiveRemoteStore` include:\n\n- **Reactive Queries**: Data is exposed through observable query results that automatically update when the underlying data changes, whether from local mutations or external server notifications.\n- **Intelligent Caching**: It leverages a `QueryCache` to store data, reducing redundant API calls and providing instant access to previously fetched information.\n- **Automatic Invalidation**: Mutations (create, update, delete, upload) automatically trigger intelligent cache invalidation, ensuring data consistency across your application.\n- **Real-time Synchronization**: Through the `BaseStore`'s implementation of `subscribe` and `notify` (which can utilize technologies like Server-Sent Events, WebSockets, or other real-time protocols) and custom event correlators, `ReactiveRemoteStore` can react to external changes pushed from your backend, keeping your client-side data in sync with the server in real-time.\n- **Pluggable `BaseStore`**: The library is agnostic to your specific API client. You provide an implementation of the `BaseStore` interface, allowing `ReactiveRemoteStore` to work with any REST, GraphQL, or custom API.\n- **Data Streaming**: Supports consuming continuous data streams from your backend, ideal for dashboards, live feeds, or large datasets.\n\n### Key Features\n\n- **Reactive Data Access**: Consume data through observable queries (`read`, `list`, `find`) that automatically update when data changes.\n- **Query Caching**: Efficiently caches data from `read`, `list`, and `find` operations.\n- **Automatic Invalidation**: Cache entries are intelligently invalidated upon `create`, `update`, `delete`, and `upload` mutations.\n- **Real-time Event Integration**: Reacts to real-time data changes pushed from the `BaseStore` (via `subscribe` and `notify` methods, supporting various protocols like SSE or WebSockets).\n- **Custom Invalidation Logic (Correlators)**: Define custom functions (`Correlator` and `StoreEventCorrelator`) to precisely control which cached queries are invalidated based on mutations or incoming store events.\n- **Data Streaming**: Provides a robust mechanism for consuming real-time data streams from the `BaseStore` via an `AsyncIterable` interface.\n- **Prefetching & Refreshing**: Imperative methods (`prefetch`, `refresh`) to proactively load data or force re-fetches, optimizing user experience.\n- **Type-Safe**: Fully written in TypeScript, providing strong typing for enhanced developer experience, compile-time safety, and autocompletion.\n- **Error Handling**: Centralized error handling for data operations.\n\n---\n\n## 🛠️ Installation & Setup\n\n### Prerequisites\n\n- Node.js (v18.x or higher recommended)\n- `bun`, `npm`, or `yarn` package manager\n- A `QueryCache` implementation (e.g., `@core/cache` if available in your project, or a custom one).\n- An implementation of the `BaseStore` interface that connects to your remote data source.\n\n### Installation Steps\n\nTo install `ReactiveRemoteStore` and its peer dependencies, use your preferred package manager:\n\n```bash\nbun add @asaidimu/erp-utils-remote-store @core/cache\n# or\nnpm install @asaidimu/erp-utils-remote-store @core/cache\n# or\nyarn add @asaidimu/erp-utils-remote-store @core/cache\n```\n\n### Configuration\n\n`ReactiveRemoteStore` is initialized with a `QueryCache` instance and an implementation of the `BaseStore` interface. Optionally, you can provide `correlator` and `storeEventCorrelator` functions for advanced invalidation logic.\n\n```typescript\nimport { ReactiveRemoteStore } from \"@asaidimu/erp-utils-remote-store\";\nimport { QueryCache } from \"@core/cache\"; // Your QueryCache implementation\nimport {\n  BaseStore,\n  Record,\n  Page,\n  StoreEvent,\n  ActiveQuery,\n  MutationOperation,\n} from \"@asaidimu/erp-utils-remote-store/types\";\n\n// --- Example: Define your data types ---\ninterface Product extends Record {\n  name: string;\n  price: number;\n  inStock: boolean;\n}\n\n// --- Example: Implement your BaseStore (API client) ---\n// This would typically interact with your backend via fetch, axios, etc.\nclass MyApiBaseStore implements BaseStore<Product> {\n  private baseUrl: string;\n  constructor(baseUrl: string) {\n    this.baseUrl = baseUrl;\n  }\n\n  async find(options: any): Promise<Page<Product>> {\n    /* ... API call ... */ return {\n      data: [],\n      page: { number: 1, size: 0, count: 0, pages: 0 },\n    };\n  }\n  async read(options: { id: string }): Promise<Product | undefined> {\n    /* ... API call ... */ return undefined;\n  }\n  async list(options: any): Promise<Page<Product>> {\n    /* ... API call ... */ return {\n      data: [],\n      page: { number: 1, size: 0, count: 0, pages: 0 },\n    };\n  }\n  async create(props: {\n    data: Omit<Product, \"id\">;\n    options?: any;\n  }): Promise<Product | undefined> {\n    /* ... API call ... */ return { id: \"new-id\", ...props.data };\n  }\n  async update(props: {\n    id: string;\n    data: Partial<Omit<Product, \"id\">>;\n    options?: any;\n  }): Promise<Product | undefined> {\n    /* ... API call ... */ return { id: props.id, ...props.data };\n  }\n  async delete(options: { id: string }): Promise<void> {\n    /* ... API call ... */\n  }\n  async upload(props: {\n    file: File;\n    options?: any;\n  }): Promise<Product | undefined> {\n    /* ... API call ... */ return {\n      id: \"uploaded-id\",\n      name: \"uploaded\",\n      price: 0,\n      inStock: true,\n    };\n  }\n\n  // For real-time updates, your `BaseStore` implementation would establish and manage\n  // a connection using technologies like Server-Sent Events (SSE), WebSockets, or polling.\n  // The `ReactiveRemoteStore` simply calls these methods on your `BaseStore`.\n  async subscribe(\n    scope: string,\n    callback: (event: StoreEvent) => void,\n  ): Promise<() => void> {\n    console.log(`Subscribing to ${scope}`);\n    // Example: Connect to an SSE endpoint (as in test-server.ts)\n    // const eventSource = new EventSource(`${this.baseUrl}/events?scope=${scope}`);\n    // eventSource.onmessage = (e) => callback(JSON.parse(e.data));\n    // return () => eventSource.close();\n\n    // Example: Using WebSockets\n    // const ws = new WebSocket(`${this.baseUrl}/ws?scope=${scope}`);\n    // ws.onmessage = (e) => callback(JSON.parse(e.data));\n    // return () => ws.close();\n\n    return async () => {\n      console.log(`Unsubscribed from ${scope}`);\n    };\n  }\n  async notify(event: StoreEvent): Promise<void> {\n    console.log(\"Notifying base store:\", event);\n    // Your implementation here to send the event to the backend\n    // e.g., via a POST request, WebSocket message, etc.\n    // await fetch(`${this.baseUrl}/notify`, { method: 'POST', body: JSON.stringify(event) });\n  }\n  stream(options: any): {\n    stream: () => AsyncIterable<Product>;\n    cancel: () => void;\n    status: () => \"active\" | \"cancelled\" | \"completed\";\n  } {\n    console.log(\"Streaming with options:\", options);\n    const mockStream = (async function* () {\n      yield { id: \"p1\", name: \"Streamed Product 1\", price: 10, inStock: true };\n      await new Promise((r) => setTimeout(r, 100));\n      yield { id: \"p2\", name: \"Streamed Product 2\", price: 20, inStock: false };\n    })();\n    return {\n      stream: () => mockStream,\n      cancel: () => console.log(\"Stream cancelled\"),\n      status: () => \"completed\",\n    };\n  }\n}\n\n// --- Optional: Define custom correlators for invalidation ---\nconst myCorrelator = (\n  mutation: { operation: MutationOperation; params: any },\n  activeQueries: ActiveQuery[],\n): string[] => {\n  // Example: Invalidate 'list' queries on any create/delete operation\n  if (mutation.operation === \"create\" || mutation.operation === \"delete\") {\n    return activeQueries\n      .filter((q) => q.operation === \"list\")\n      .map((q) => q.queryKey);\n  }\n  // Example: Invalidate specific 'read' query if its ID matches the updated item\n  if (mutation.operation === \"update\" && mutation.params.id) {\n    return activeQueries\n      .filter(\n        (q) => q.operation === \"read\" && q.params.id === mutation.params.id,\n      )\n      .map((q) => q.queryKey);\n  }\n  return [];\n};\n\nconst myStoreEventCorrelator = (\n  event: StoreEvent, // { scope: string, payload?: any }\n  activeQueries: ActiveQuery[],\n): string[] => {\n  // Example: Invalidate 'read' query if an external event updates its ID\n  if (event.scope === \"product:updated:external\" && event.payload?.id) {\n    return activeQueries\n      .filter((q) => q.operation === \"read\" && q.params.id === event.payload.id)\n      .map((q) => q.queryKey);\n  }\n  return [];\n};\n\n// --- Initialize ReactiveRemoteStore ---\nconst cache = new QueryCache();\nconst baseStore = new MyApiBaseStore(\"https://api.example.com\");\n\nconst productStore = new ReactiveRemoteStore<Product>(\n  cache,\n  baseStore,\n  myCorrelator, // Optional: for mutation-based invalidation\n  myStoreEventCorrelator, // Optional: for store event-based invalidation\n);\n\nconsole.log(\"ReactiveRemoteStore initialized successfully!\");\n```\n\n### Verification\n\nTo verify that `ReactiveRemoteStore` is installed and initialized correctly, you can run a simple test:\n\n```typescript\nimport { ReactiveRemoteStore } from \"@asaidimu/erp-utils-remote-store\";\nimport { QueryCache } from \"@core/cache\";\nimport {\n  BaseStore,\n  Record,\n  Page,\n  StoreEvent,\n} from \"@asaidimu/erp-utils-remote-store/types\";\n\n// Minimal BaseStore for verification\nclass MinimalBaseStore implements BaseStore<Record> {\n  async find(): Promise<Page<Record>> {\n    return { data: [], page: { number: 1, size: 0, count: 0, pages: 0 } };\n  }\n  async read(): Promise<Record | undefined> {\n    return undefined;\n  }\n  async list(): Promise<Page<Record>> {\n    return { data: [], page: { number: 1, size: 0, count: 0, pages: 0 } };\n  }\n  async create(props: any): Promise<Record | undefined> {\n    return { id: \"1\", ...props.data };\n  }\n  async update(props: any): Promise<Record | undefined> {\n    return { id: props.id, ...props.data };\n  }\n  async delete(): Promise<void> {}\n  async upload(): Promise<Record | undefined> {\n    return undefined;\n  }\n  async subscribe(): Promise<() => void> {\n    return () => {};\n  }\n  async notify(): Promise<void> {}\n  stream(): {\n    stream: () => AsyncIterable<Record>;\n    cancel: () => void;\n    status: () => \"active\" | \"cancelled\" | \"completed\";\n  } {\n    return {\n      stream: async function* () {},\n      cancel: () => {},\n      status: () => \"completed\",\n    };\n  }\n}\n\nconst cache = new QueryCache();\nconst baseStore = new MinimalBaseStore();\nconst store = new ReactiveRemoteStore(cache, baseStore);\n\nconsole.log(\"ReactiveRemoteStore instance:\", store);\nconsole.log(\"Store initialized successfully!\");\n\n// You can also run the project's tests to verify full functionality:\n// bun run vitest --run\n```\n\n---\n\n## A Developer's Guide to `BaseStore`\n\nThe `BaseStore` interface is the heart of the `ReactiveRemoteStore`'s extensibility. It acts as a bridge between the reactive store and your backend, allowing you to use any API, protocol, or data source. This guide provides a comprehensive overview of how to implement it.\n\n### The Role of `BaseStore`\n\nThe `BaseStore`'s responsibility is to handle the direct communication with your remote data source. `ReactiveRemoteStore` delegates all data operations (fetching, creating, updating, etc.) to your `BaseStore` implementation. This separation of concerns means `ReactiveRemoteStore` doesn't need to know anything about your API's specifics, such as URLs, headers, or authentication.\n\n### Getting Started\n\nFirst, define the data structure for the records your store will manage. This type must extend `StoreRecord`, which requires an `id: string` property.\n\n```typescript\nimport type {\n  BaseStore,\n  StoreRecord,\n  Page,\n  StoreEvent,\n} from \"@asaidimu/erp-utils-remote-store/types\";\nimport { StoreError } from \"@asaidimu/erp-utils-remote-store/error\";\n\n// Your record type\ninterface Product extends StoreRecord {\n  name: string;\n  price: number;\n  // ... any other fields\n}\n\n// Define the option types for your API\n// These are used for type-safety when calling the store's methods\n\n// Options for reading a single product (e.g., by ID)\ninterface ProductReadOptions {\n  id: string;\n}\n\n// Options for listing products (e.g., with pagination and sorting)\ninterface ProductListOptions {\n  page?: number;\n  pageSize?: number;\n  sortBy?: keyof Product;\n  order?: \"asc\" | \"desc\";\n}\n\n// Options for finding products (e.g., with a search query)\ninterface ProductFindOptions extends ProductListOptions {\n  query: string;\n}\n\n// Now, create your class that implements the BaseStore interface\nclass ProductApiStore implements BaseStore<\n  Product,\n  ProductFindOptions,\n  ProductReadOptions,\n  ProductListOptions\n> {\n  private readonly baseUrl = \"https://api.example.com\";\n\n  // Implementation of each method will go here...\n}\n```\n\n### Implementing the Methods\n\nHere is a detailed look at each method in the `BaseStore` interface.\n\n#### `read(options: TReadOptions): Promise<T | undefined>`\n\n**Purpose**: Fetch a single record by its identifier.\n\n- **`options`**: The parameters for the read operation, typically containing the record's `id`.\n- **Returns**: A `Promise` that resolves to the fetched record or `undefined` if it's not found.\n\n```typescript\n// Example implementation for `read` with error handling\nasync read(options: ProductReadOptions): Promise<Product | undefined> {\n    try {\n        const response = await fetch(`${this.baseUrl}/products/${options.id}`);\n        if (response.status === 404) {\n            return undefined; // Handle not found gracefully\n        }\n        if (!response.ok) {\n            // Throw a generic error for non-404 issues\n            throw new Error(`HTTP error! status: ${response.status}`);\n        }\n        return await response.json();\n    } catch (error: any) {\n        // Convert any caught error into a standardized StoreError\n        throw StoreError.fromError(error, 'read');\n    }\n}\n```\n\n#### `list(options: TListOptions): Promise<Page<T>>`\n\n**Purpose**: Fetch a paginated list of records.\n\n- **`options`**: Parameters for listing, such as `page`, `pageSize`, `sortBy`, etc.\n- **Returns**: A `Promise` that resolves to a `Page<T>` object, which contains the `data` array and pagination details.\n\n```typescript\n// Example implementation for `list`\nasync list(options: ProductListOptions): Promise<Page<Product>> {\n    const params = new URLSearchParams();\n    if (options.page) params.set('page', String(options.page));\n    if (options.pageSize) params.set('pageSize', String(options.pageSize));\n    if (options.sortBy) params.set('sortBy', options.sortBy);\n    if (options.order) params.set('order', options.order);\n\n    try {\n        const response = await fetch(`${this.baseUrl}/products?${params.toString()}`);\n        if (!response.ok) {\n            throw new Error(`HTTP error! status: ${response.status}`);\n        }\n        // Assume the API returns a body like: { data: [...], page: { number, size, count, pages } }\n        return await response.json();\n    } catch (error: any) {\n        throw StoreError.fromError(error, 'list');\n    }\n}\n```\n\n#### `find(options: TFindOptions): Promise<Page<T>>`\n\n**Purpose**: Fetch a paginated list of records based on search criteria.\n\n- **`options`**: Parameters for finding, which might include a search `query` along with pagination and sorting.\n- **Returns**: A `Promise` that resolves to a `Page<T>` object.\n\n```typescript\n// Example implementation for `find`\nasync find(options: ProductFindOptions): Promise<Page<Product>> {\n    const params = new URLSearchParams({ query: options.query });\n    if (options.page) params.set('page', String(options.page));\n    // ... other params\n\n    try {\n        const response = await fetch(`${this.baseUrl}/products/search?${params.toString()}`);\n        if (!response.ok) {\n            throw new Error(`HTTP error! status: ${response.status}`);\n        }\n        return await response.json();\n    } catch (error: any) {\n        throw StoreError.fromError(error, 'find');\n    }\n}\n```\n\n#### `create(props: { data: Partial<T> }): Promise<T | undefined>`\n\n**Purpose**: Create a new record.\n\n- **`props.data`**: The record to create.\n- **Returns**: A `Promise` that resolves to the newly created record as returned by the server (including the server-generated `id`).\n\n```typescript\n// Example implementation for `create`\nasync create(props: { data: Partial<Product> }): Promise<Product | undefined> {\n    try {\n        const response = await fetch(`${this.baseUrl}/products`, {\n            method: 'POST',\n            headers: { 'Content-Type': 'application/json' },\n            body: JSON.stringify(props.data),\n        });\n        if (!response.ok) {\n            throw new Error(`HTTP error! status: ${response.status}`);\n        }\n        return await response.json(); // Important: return the server's response\n    } catch (error: any) {\n        throw StoreError.fromError(error, 'create');\n    }\n}\n```\n\n#### `update(props: { data: Partial<T> }): Promise<T | undefined>`\n\n**Purpose**: Update an existing record.\n\n- **`props.data`**: A partial object of the fields to update, including the `id`.\n- **Returns**: A `Promise` that resolves to the updated record.\n\n```typescript\n// Example implementation for `update`\nasync update(props: { data: Partial<Product> }): Promise<Product | undefined> {\n    try {\n        const response = await fetch(`${this.baseUrl}/products/${props.data.id}`,\n        {\n            method: 'PATCH', // or 'PUT'\n            headers: { 'Content-Type': 'application/json' },\n            body: JSON.stringify(props.data),\n        });\n        if (!response.ok) {\n            throw new Error(`HTTP error! status: ${response.status}`);\n        }\n        return await response.json();\n    } catch (error: any) {\n        throw StoreError.fromError(error, 'update');\n    }\n}\n```\n\n#### `delete(options: TDeleteOptions): Promise<void>`\n\n**Purpose**: Delete a record.\n\n- **`options`**: Parameters for deletion, typically `{ id: string }`.\n- **Returns**: A `Promise` that resolves when the operation is complete.\n\n```typescript\n// Example implementation for `delete`\nasync delete(options: { id: string }): Promise<void> {\n    try {\n        const response = await fetch(`${this.baseUrl}/products/${options.id}`, {\n            method: 'DELETE',\n        });\n        if (!response.ok) {\n            throw new Error(`HTTP error! status: ${response.status}`);\n        }\n    } catch (error: any) {\n        throw StoreError.fromError(error, 'delete');\n    }\n}\n```\n\n### Implementing Real-Time Features\n\n`ReactiveRemoteStore` supports real-time updates through the `subscribe` and `notify` methods.\n\n#### `subscribe(scope: string, callback: (event: StoreEvent) => void): Promise<() => void>`\n\n**Purpose**: Establish a connection to your backend to receive real-time events.\n\n- **`scope`**: A string indicating the event scope to subscribe to. `ReactiveRemoteStore` will call this with `'*'` to listen for all events.\n- **`callback`**: A function that `ReactiveRemoteStore` provides. Your implementation must call this function whenever a `StoreEvent` is received from the backend.\n- **Returns**: A `Promise` that resolves to an `unsubscribe` function. `ReactiveRemoteStore` will call this function when it's destroyed to clean up the connection.\n\n```typescript\n// Example implementation for `subscribe` using Server-Sent Events (SSE)\nasync subscribe(scope: string, callback: (event: StoreEvent) => void): Promise<() => void> {\n    console.log(`Subscribing to event scope: ${scope}`);\n    const eventSource = new EventSource(`${this.baseUrl}/events?scope=${scope}`);\n\n    eventSource.onmessage = (event) => {\n        const storeEvent: StoreEvent = JSON.parse(event.data);\n        callback(storeEvent); // Pass the event to the ReactiveRemoteStore\n    };\n\n    eventSource.onerror = (error) => {\n        console.error('SSE Error:', error);\n        // You might want to add reconnection logic here\n    };\n\n    // Return a function that closes the connection\n    return () => {\n        console.log('Unsubscribing from events.');\n        eventSource.close();\n    };\n}\n```\n\n#### `notify(event: StoreEvent): Promise<void>`\n\n**Purpose**: Send an event from the client to the server. This is less common but can be used for client-initiated notifications.\n\n- **`event`**: The `StoreEvent` to send.\n- **Returns**: A `Promise` that resolves when the event has been sent.\n\n```typescript\n// Example implementation for `notify`\nasync notify(event: StoreEvent): Promise<void> {\n    try {\n        const response = await fetch(`${this.baseUrl}/notify`, {\n            method: 'POST',\n            headers: { 'Content-Type': 'application/json' },\n            body: JSON.stringify(event),\n        });\n        if (!response.ok) {\n            throw new Error(`HTTP error! status: ${response.status}`);\n        }\n    } catch (error: any) {\n        throw StoreError.fromError(error, 'notify');\n    }\n}\n```\n\n### Error Handling\n\nFor robust error handling, your `BaseStore` methods should wrap their logic in a `try...catch` block and convert any caught errors into a `StoreError`. This provides standardized, structured error information to the `ReactiveRemoteStore` and your application.\n\nThe library provides a `StoreError.fromError(error, operation)` utility that intelligently converts various error types (network errors, HTTP errors, timeouts) into a consistent `StoreError` object.\n\n**Benefits of using `StoreError`**:\n\n- **Standardization**: All errors from the data layer have a consistent shape.\n- **Rich Information**: Includes `code`, `status`, `isRetryable`, and the `originalError`.\n- **Automatic Handling**: Correctly identifies common network and HTTP issues from `fetch` responses.\n\nHere is how you should structure your methods:\n\n```typescript\nimport { StoreError } from '@asaidimu/erp-utils-remote-store/error';\n\n// Inside your BaseStore implementation...\n\nasync read(options: ProductReadOptions): Promise<Product | undefined> {\n    try {\n        const response = await fetch(`${this.baseUrl}/products/${options.id}`);\n\n        if (response.status === 404) {\n            return undefined; // Not an error, just not found\n        }\n\n        // The `fromError` utility will automatically handle non-ok responses\n        // if you pass the response object to it, but throwing manually is also fine.\n        if (!response.ok) {\n            throw new Error(`HTTP Error: ${response.status}`);\n        }\n\n        return await response.json();\n\n    } catch (error: any) {\n        // The `fromError` factory will create the appropriate StoreError\n        // based on the type of error caught (e.g., network, timeout, HTTP).\n        console.error('Error in read operation:', error);\n        throw StoreError.fromError(error, 'read');\n    }\n}\n```\n\n## 📖 Usage Documentation\n\n### Basic Usage\n\nThe `ReactiveRemoteStore` simplifies data interactions by providing reactive hooks into your data. Here's how to perform basic CRUD operations and observe data changes.\n\n```typescript\nimport { ReactiveRemoteStore } from \"@asaidimu/erp-utils-remote-store\";\nimport { QueryCache } from \"@core/cache\";\nimport {\n  BaseStore,\n  Record,\n  Page,\n  StoreEvent,\n} from \"@asaidimu/erp-utils-remote-store/types\";\n\n// Assume you have a Todo type and a TodoBaseStore implementation\ninterface Todo extends Record {\n  title: string;\n  completed: boolean;\n}\n\nclass TodoBaseStore implements BaseStore<Todo> {\n  // ... (implementation similar to MyApiBaseStore above)\n  // For simplicity, let's use a mock in-memory store for this example\n  private todos: Todo[] = [];\n  private nextId = 1;\n\n  async create(props: {\n    data: Omit<Todo, \"id\">;\n    options?: any;\n  }): Promise<Todo | undefined> {\n    const newTodo = { id: String(this.nextId++), ...props.data };\n    this.todos.push(newTodo);\n    return newTodo;\n  }\n  async read(options: { id: string }): Promise<Todo | undefined> {\n    return this.todos.find((t) => t.id === options.id);\n  }\n  async list(options: any): Promise<Page<Todo>> {\n    return {\n      data: this.todos,\n      page: {\n        number: 1,\n        size: this.todos.length,\n        count: this.todos.length,\n        pages: 1,\n      },\n    };\n  }\n  async update(props: {\n    id: string;\n    data: Partial<Omit<Todo, \"id\">>;\n    options?: any;\n  }): Promise<Todo | undefined> {\n    const todo = this.todos.find((t) => t.id === props.id);\n    if (todo) {\n      Object.assign(todo, props.data);\n      return todo;\n    }\n    return undefined;\n  }\n  async delete(options: { id: string }): Promise<void> {\n    this.todos = this.todos.filter((t) => t.id !== options.id);\n  }\n  async upload(): Promise<Todo | undefined> {\n    return undefined;\n  }\n  async subscribe(): Promise<() => void> {\n    return () => {};\n  }\n  async notify(): Promise<void> {}\n  stream(): {\n    stream: () => AsyncIterable<Todo>;\n    cancel: () => void;\n    status: () => \"active\" | \"cancelled\" | \"completed\";\n  } {\n    return {\n      stream: async function* () {},\n      cancel: () => {},\n      status: () => \"completed\",\n    };\n  }\n}\n\nconst cache = new QueryCache();\nconst todoBaseStore = new TodoBaseStore();\nconst todoStore = new ReactiveRemoteStore<Todo>(cache, todoBaseStore);\n\nasync function runBasicUsage() {\n  console.log(\"\\n--- Basic Usage Examples ---\");\n\n  // 1. Create a Todo\n  const createdTodo = await todoStore.create({\n    data: { title: \"Buy groceries\", completed: false },\n  });\n  console.log(\"Created Todo:\", createdTodo);\n\n  // 2. Read a Todo and subscribe to changes\n  if (createdTodo) {\n    const { value: selectRead, onValueChange: subscribeRead } = todoStore.read({\n      id: createdTodo.id,\n    });\n    const unsubscribeRead = subscribeRead(() => {\n      const result = selectRead();\n      console.log(\n        \"Read Todo (reactive update):\",\n        result.data,\n        \"loading:\",\n        result.loading,\n      );\n    });\n\n    console.log(\"Initial Read:\", selectRead().data);\n\n    // 3. List all Todos and subscribe to changes\n    const { value, onValueChange: subscribeToList } = todoStore.list({});\n    let result = value();\n    const unsubscribeList = subscribeToList(() => {\n      result = value();\n      console.log(\n        \"List Todos (reactive update):\",\n        result.page?.data,\n        \"loading:\",\n        result.loading,\n      );\n    });\n\n    console.log(\"Initial List:\", result.page?.data);\n\n    // 4. Update the Todo (this will trigger reactive updates in read and list queries)\n    await todoStore.update({ id: createdTodo.id, data: { completed: true } });\n    console.log(\"Updated Todo to completed.\");\n\n    // 5. Delete the Todo (this will trigger reactive updates)\n    await todoStore.delete({ id: createdTodo.id });\n    console.log(\"Deleted Todo.\");\n\n    // Clean up subscriptions\n    unsubscribeRead();\n    unsubscribeList();\n  }\n\n  // Don't forget to destroy the store when your application shuts down\n  todoStore.destroy();\n}\n\nrunBasicUsage();\n```\n\n### API Usage\n\n`ReactiveRemoteStore` exposes a comprehensive API for managing your data. Below are detailed descriptions of its public methods.\n\n#### `constructor(cache: QueryCache, baseStore: BaseStore<T, ...>, correlator?: Correlator, storeEventCorrelator?: StoreEventCorrelator)`\n\nCreates a new instance of `ReactiveRemoteStore`.\n\n- `cache`: An instance of `QueryCache` (or compatible interface) used for caching data.\n- `baseStore`: Your implementation of the `BaseStore` interface, responsible for direct interaction with the remote API.\n- `correlator` (optional): A function (`Correlator` type) that defines how mutations (create, update, delete, upload) should invalidate active queries in the `QueryCache`. If not provided, a default invalidation strategy (invalidating all `list` and `find` queries) is used.\n- `storeEventCorrelator` (optional): A function (`StoreEventCorrelator` type) that defines how incoming `StoreEvent`s (e.g., from SSE) should invalidate active queries. If not provided, external events will be logged but won't trigger invalidation.\n\n#### `read(params: TReadOptions): ReactiveQueryResult<T>`\n\nRetrieves a single record from the store. This method returns an object containing a `selector` function and an `onValueChange` function, enabling reactive data access.\n\n- `params`: Options specific to your `BaseStore`'s `read` operation (e.g., `{ id: string }`).\n\n**Returns:**\n\n- `{ value, onValueChange }`: An object.\n  - `value`: A function `() => QueryResult<T>` that returns the current state of the query, including `data`, `loading` status, `error`, `stale` status, and `updated` timestamp.\n  - `onValueChange`: A function `(callback: () => void) => () => void` that allows you to register a callback to be notified when the query result changes. It returns an `unsubscribe` function.\n\n```typescript\n// Example: Reading a user profile\ninterface UserProfile extends Record {\n  name: string;\n  email: string;\n}\n// Assume userStore is ReactiveRemoteStore<UserProfile>\n\nconst { value: selectUser, onValueChange: subscribeUser } = userStore.read({\n  id: \"user-123\",\n});\n\n// Initial access\nconsole.log(\"Initial User Data:\", selectUser().data);\n\n// Subscribe to changes\nconst unsubscribe = subscribeUser(() => {\n  const result = selectUser();\n  console.log(\n    \"User Data Updated:\",\n    result.data,\n    \"Loading:\",\n    result.loading,\n    \"Stale:\",\n    result.stale,\n  );\n  if (result.error) console.error(\"Error fetching user:\", result.error);\n});\n\n// Later, when no longer needed\n// unsubscribe();\n```\n\n#### `list(params: TListOptions): ReactivePagedQueryResult<T>`\n\nRetrieves a paginated list of records from the store. This method returns an object containing a `selector` function and an `onValueChange` function, enabling reactive data access and pagination controls.\n\n- `params`: Options specific to your `BaseStore`'s `list` operation (e.g., `{ page: number, pageSize: number, filter?: string }`).\n\n**Returns:**\n\n- `{ value, onValueChange }`: An object.\n  - `value`: A function `() => PagedQueryResult<T>` that returns the current state of the paginated query, including `page` data, `loading` status, `error`, `stale` status, `updated` timestamp, and pagination helpers (`hasNext`, `hasPrevious`, `next()`, `previous()`, `fetch(page)`).\n  - `onValueChange`: A function `(callback: () => void) => () => void` that allows you to register a callback to be notified when the query result changes. It returns an `unsubscribe` function.\n\n```typescript\n// Example: Listing products with pagination\ninterface Product extends Record {\n  name: string;\n  price: number;\n}\n// Assume productStore is ReactiveRemoteStore<Product>\n\nconst { value: selectProducts, onValueChange: subscribeProducts } =\n  productStore.list({ page: 1, pageSize: 10 });\n\nconst unsubscribeProducts = subscribeProducts(() => {\n  const result = selectProducts();\n  console.log(\n    \"Products List Updated:\",\n    result.page?.data,\n    \"Loading:\",\n    result.loading,\n  );\n  if (result.page) {\n    console.log(`Page ${result.page.page.number} of ${result.page.page.pages}`);\n  }\n});\n\n// Navigate to the next page\nconst currentProducts = selectProducts();\nif (currentProducts.hasNext) {\n  await currentProducts.next();\n}\n\n// Fetch a specific page\nawait selectProducts().fetch(3);\n\n// unsubscribeProducts();\n```\n\n#### `find(params: TFindOptions): ReactivePagedQueryResult<T>`\n\nRetrieves a paginated list of records based on search criteria. Similar to `list`, but typically used for more complex search queries.\n\n- `params`: Options specific to your `BaseStore`'s `find` operation (e.g., `{ query: string, category: string }`).\n\n**Returns:**\n\n- `{ value, onValueChange }`: An object identical in structure and behavior to the `list` method's return value.\n\n```typescript\n// Example: Finding orders by customer ID\ninterface Order extends Record {\n  customerId: string;\n  amount: number;\n}\n// Assume orderStore is ReactiveRemoteStore<Order>\n\nconst { value: selectOrders, onValueChange: subscribeOrders } = orderStore.find(\n  { customerId: \"cust-456\", status: \"pending\" },\n);\n\nconst unsubscribeOrders = subscribeOrders(() => {\n  const result = selectOrders();\n  console.log(\n    \"Orders Found Updated:\",\n    result.page?.data,\n    \"Loading:\",\n    result.loading,\n  );\n});\n\n// unsubscribeOrders();\n```\n\n#### `create(params: { data: Omit<T, 'id'>, options?: TCreateOptions }): Promise<T | undefined>`\n\nCreates a new record in the remote store. This operation automatically invalidates relevant cached queries (e.g., `list` or `find` queries) to ensure data consistency.\n\n- `params.data`: The data for the new record, excluding the `id` (which is typically generated by the backend).\n- `params.options` (optional): Options specific to your `BaseStore`'s `create` operation.\n\n**Returns:** A promise that resolves to the newly created record (including its `id`) or `undefined` if creation failed.\n\n```typescript\n// Example: Creating a new task\ninterface Task extends Record {\n  description: string;\n  dueDate: string;\n}\n// Assume taskStore is ReactiveRemoteStore<Task>\n\nconst newTask = await taskStore.create({\n  data: { description: \"Write documentation\", dueDate: \"2025-12-31\" },\n});\nconsole.log(\"New Task Created:\", newTask);\n```\n\n#### `update(params: { id: string; data: Partial<Omit<T, 'id'>>; options?: TUpdateOptions }): Promise<T | undefined>`\n\nUpdates an existing record in the remote store. This operation automatically invalidates relevant cached queries (e.g., the specific `read` query for the updated ID, or `list`/`find` queries).\n\n- `params.id`: The `id` of the record to update.\n- `params.data`: A partial object containing the fields to update.\n- `params.options` (optional): Options specific to your `BaseStore`'s `update` operation.\n\n**Returns:** A promise that resolves to the updated record or `undefined` if the record was not found or the update failed.\n\n```typescript\n// Example: Marking a task as completed\n// Assume taskStore is ReactiveRemoteStore<Task> and taskId is known\n\nconst updatedTask = await taskStore.update({\n  id: taskId,\n  data: { completed: true },\n});\nconsole.log(\"Task Updated:\", updatedTask);\n```\n\n#### `delete(params: TDeleteOptions): Promise<void>`\n\nDeletes a record from the remote store. This operation automatically invalidates relevant cached queries.\n\n- `params`: Options specific to your `BaseStore`'s `delete` operation (e.g., `{ id: string }`).\n\n**Returns:** A promise that resolves when the deletion is complete.\n\n```typescript\n// Example: Deleting a task\n// Assume taskStore is ReactiveRemoteStore<Task> and taskId is known\n\nawait taskStore.delete({ id: taskId });\nconsole.log(\"Task Deleted.\");\n```\n\n#### `upload(params: { file: File; options?: TUploadOptions }): Promise<T | undefined>`\n\nUploads a file associated with a record. This operation automatically invalidates relevant cached queries.\n\n- `params.file`: The `File` object to upload.\n- `params.options` (optional): Options specific to your `BaseStore`'s `upload` operation (e.g., `{ id: string, fieldName: string }`).\n\n**Returns:** A promise that resolves to the updated record (if the upload modifies the record) or `undefined` if upload failed.\n\n```typescript\n// Example: Uploading an avatar for a user\ninterface User extends Record {\n  name: string;\n  avatarUrl?: string;\n}\n// Assume userStore is ReactiveRemoteStore<User> and userId is known\n\nconst avatarFile = new File([\"...\"], \"avatar.png\", { type: \"image/png\" });\nconst updatedUser = await userStore.upload({\n  file: avatarFile,\n  options: { id: userId, fieldName: \"avatar\" },\n});\nconsole.log(\"User Avatar Uploaded:\", updatedUser?.avatarUrl);\n```\n\n#### `notify(event: StoreEvent): Promise<void>`\n\nManually notifies the `ReactiveRemoteStore` of a `StoreEvent`. This can be used to simulate external events or trigger custom invalidation logic defined by `storeEventCorrelator`.\n\n- `event`: The `StoreEvent` to process. It should have a `scope` and an optional `payload`.\n\n**Returns:** A promise that resolves when the notification has been processed.\n\n```typescript\n// Example: Notifying the store of an external product price change\n// Assume productStore is ReactiveRemoteStore<Product>\n\nawait productStore.notify({\n  scope: \"product:price:changed\",\n  payload: { id: \"prod-789\", newPrice: 99.99 },\n});\nconsole.log(\"Notified store about product price change.\");\n```\n\n#### `stream(options: TStreamOptions): Promise<{ stream: () => AsyncIterable<T>; cancel: () => void; status: () => 'active' | 'cancelled' | 'completed'; }>`\n\nEstablishes a real-time data stream from the remote store. This method returns an object containing an `AsyncIterable` for consuming data, a `cancel` function to stop the stream, and a `status` getter to check the stream's current state.\n\n- `options`: Options specific to your `BaseStore`'s `stream` operation (e.g., `{ filter: string, batchSize: number }`).\n\n**Returns:** An object with:\n\n- `stream()`: A function that returns an `AsyncIterable<T>` which yields records as they arrive.\n- `cancel()`: A function to call to terminate the stream.\n- `status()`: A getter function that returns the current state of the stream (`'active'`, `'cancelled'`, or `'completed'`).\n\n```typescript\n// Example: Streaming live stock prices\ninterface StockPrice extends Record {\n  symbol: string;\n  price: number;\n  timestamp: number;\n}\n// Assume stockStore is ReactiveRemoteStore<StockPrice>\n\nasync function consumeStockStream() {\n  console.log(\"Starting stock price stream...\");\n  const { stream, cancel, status } = await stockStore.stream({\n    symbols: [\"AAPL\", \"GOOG\"],\n    interval: 1000,\n  });\n\n  const streamInterval = setInterval(() => {\n    console.log(\"Stream Status:\", status());\n  }, 500);\n\n  try {\n    for await (const priceUpdate of stream()) {\n      console.log(\n        `Received: ${priceUpdate.symbol} - $${priceUpdate.price.toFixed(2)}`,\n      );\n    }\n    console.log(\"Stock stream completed.\");\n  } catch (error) {\n    console.error(\"Stock stream error:\", error);\n  } finally {\n    clearInterval(streamInterval);\n    cancel(); // Ensure stream is cancelled\n    console.log(\"Stock stream cleanup.\");\n  }\n}\n\n// consumeStockStream();\n```\n\n#### `refresh(operation: 'read' | 'list' | 'find', params: TReadOptions | TListOptions | TFindOptions): Promise<T | Page<T> | undefined>`\n\nForces a re-fetch of data for a specific query, bypassing staleness checks. This ensures you get the absolute latest data from the `BaseStore`.\n\n- `operation`: The type of operation to refresh (`'read'`, `'list'`, or `'find'`).\n- `params`: The parameters for the query to refresh.\n\n**Returns:** A promise that resolves to the refreshed data (single record or page) or `undefined` if the fetch fails.\n\n```typescript\n// Example: Refreshing a user's session data after an action\n// Assume userStore is ReactiveRemoteStore<UserProfile> and userId is known\n\nconst freshUserData = await userStore.refresh(\"read\", { id: userId });\nconsole.log(\"Refreshed User Data:\", freshUserData);\n\n// Example: Refreshing a list of notifications\n// Assume notificationStore is ReactiveRemoteStore<Notification>\n\nconst freshNotifications = await notificationStore.refresh(\"list\", {\n  status: \"unread\",\n});\nconsole.log(\"Refreshed Notifications:\", freshNotifications?.data);\n```\n\n#### `prefetch(operation: 'read' | 'list' | 'find', params: TReadOptions | TListOptions | TFindOptions): void`\n\nTriggers a background fetch for a specific query if it's not already in cache or is stale. Useful for loading data proactively before it's explicitly requested by the UI.\n\n- `operation`: The type of operation to prefetch (`'read'`, `'list'`, or `'find'`).\n- `params`: The parameters for the query to prefetch.\n\n**Returns:** `void` (the operation runs in the background).\n\n```typescript\n// Example: Prefetching related product details when a user hovers over a product card\n// Assume productStore is ReactiveRemoteStore<Product>\n\nproductStore.prefetch(\"read\", { id: \"prod-hovered-id\" });\nconsole.log(\"Prefetched product details.\");\n\n// Example: Prefetching the next page of a list\n// Assume currentListParams has page: 1, pageSize: 10\n\nconst nextListPageParams = {\n  ...currentListParams,\n  page: currentListParams.page + 1,\n};\nproductStore.prefetch(\"list\", nextListPageParams);\nconsole.log(\"Prefetched next page of products.\");\n```\n\n#### `invalidate(operation: string, params: any): Promise<void>`\n\nManually invalidates a specific query in the cache, marking it as stale. The next time this query is accessed, it will trigger a re-fetch from the `BaseStore`.\n\n- `operation`: The operation type of the query to invalidate (e.g., `'read'`, `'list'`, `'find'`).\n- `params`: The parameters of the query to invalidate.\n\n**Returns:** A promise that resolves when the invalidation is complete.\n\n```typescript\n// Example: Invalidate a specific user's cached data after a direct API call outside the store\n// Assume userStore is ReactiveRemoteStore<UserProfile>\n\nawait userStore.invalidate(\"read\", { id: \"user-123\" });\nconsole.log(\"User-123 data invalidated.\");\n```\n\n#### `invalidateAll(): Promise<void>`\n\nInvalidates all active queries currently managed by the `ReactiveRemoteStore`.\n\n**Returns:** A promise that resolves when all active queries have been invalidated.\n\n```typescript\n// Example: Invalidate all cached data after a global data reset or logout\n// Assume anyStore is ReactiveRemoteStore<any>\n\nawait anyStore.invalidateAll();\nconsole.log(\"All cached data invalidated.\");\n```\n\n#### `getStats(): { size: number; metrics: CacheMetrics; hitRate: number; staleHitRate: number; entries: Array<{ key: string; lastAccessed: number; lastUpdated: number; accessCount: number; isStale: boolean; isLoading?: boolean; error?: boolean }> }`\n\nRetrieves current statistics about the underlying `QueryCache` and the number of active subscriptions within `ReactiveRemoteStore`.\n\n**Returns:** An object containing:\n\n- `size`: Number of active entries in the cache.\n- `metrics`: An object containing raw counts (`hits`, `misses`, `fetches`, `errors`, `evictions`, `staleHits`).\n- `hitRate`: Ratio of hits to total requests (hits + misses).\n- `staleHitRate`: Ratio of stale hits to total hits.\n- `entries`: An array of objects providing details for each cached item (key, lastAccessed, lastUpdated, accessCount, isStale, isLoading, error status).\n- `activeSubscriptions`: Number of currently active query subscriptions in `ReactiveRemoteStore`.\n\n```typescript\n// Example: Logging store statistics\nconst stats = productStore.getStats();\nconsole.log(\"Store Stats:\", stats);\nconsole.log(\"Active Subscriptions:\", stats.activeSubscriptions);\n```\n\n#### `destroy(): void`\n\nCleans up all active subscriptions, internal timers, and resources held by the `ReactiveRemoteStore` instance. This method should be called when the store instance is no longer needed (e.g., on application shutdown or component unmount) to prevent memory leaks.\n\n**Returns:** `void`.\n\n```typescript\n// Example: Cleaning up the store on application exit\n// Assume productStore is ReactiveRemoteStore<Product>\n\nproductStore.destroy();\nconsole.log(\"ReactiveRemoteStore instance destroyed.\");\n```\n\n### Configuration Examples\n\n#### Custom Correlators for Invalidation\n\nCorrelators allow you to define precise rules for cache invalidation based on mutations or external events. This is crucial for maintaining data consistency in complex applications.\n\n```typescript\nimport { ReactiveRemoteStore } from \"@asaidimu/erp-utils-remote-store\";\nimport { QueryCache } from \"@core/cache\";\nimport {\n  BaseStore,\n  Record,\n  Page,\n  StoreEvent,\n  ActiveQuery,\n  MutationOperation,\n  Correlator,\n  StoreEventCorrelator,\n} from \"@asaidimu/erp-utils-remote-store/types\";\n\ninterface Post extends Record {\n  title: string;\n  authorId: string;\n  tags: string[];\n}\n\nclass PostBaseStore implements BaseStore<Post> {\n  /* ... implementation ... */\n  async find(): Promise<Page<Post>> {\n    return { data: [], page: { number: 1, size: 0, count: 0, pages: 0 } };\n  }\n  async read(): Promise<Post | undefined> {\n    return undefined;\n  }\n  async list(): Promise<Page<Post>> {\n    return { data: [], page: { number: 1, size: 0, count: 0, pages: 0 } };\n  }\n  async create(props: any): Promise<Post | undefined> {\n    return { id: \"new-post\", ...props.data };\n  }\n  async update(props: any): Promise<Post | undefined> {\n    return { id: props.id, ...props.data };\n  }\n  async delete(): Promise<void> {}\n  async upload(): Promise<Post | undefined> {\n    return undefined;\n  }\n  async subscribe(): Promise<() => void> {\n    return () => {};\n  }\n  async notify(): Promise<void> {}\n  stream(): {\n    stream: () => AsyncIterable<Post>;\n    cancel: () => void;\n    status: () => \"active\" | \"cancelled\" | \"completed\";\n  } {\n    return {\n      stream: async function* () {},\n      cancel: () => {},\n      status: () => \"completed\",\n    };\n  }\n}\n\n// Correlator for mutations (create, update, delete, upload)\nconst postMutationCorrelator: Correlator = (\n  mutation, // { operation: 'create' | 'update' | 'delete' | 'upload', params: any }\n  activeQueries, // Array of { queryKey: string, operation: string, params: any }\n) => {\n  const invalidatedKeys: string[] = [];\n\n  // Invalidate all 'list' queries for posts on any post mutation\n  if (mutation.operation === \"create\" || mutation.operation === \"delete\") {\n    activeQueries\n      .filter((q) => q.operation === \"list\")\n      .forEach((q) => invalidatedKeys.push(q.queryKey));\n  }\n\n  // If a post is updated, invalidate its specific 'read' query\n  if (mutation.operation === \"update\" && mutation.params.id) {\n    activeQueries\n      .filter(\n        (q) => q.operation === \"read\" && q.params.id === mutation.params.id,\n      )\n      .forEach((q) => invalidatedKeys.push(q.queryKey));\n  }\n\n  // Example: Invalidate 'find' queries based on tags if a post's tags change\n  if (\n    mutation.operation === \"update\" &&\n    mutation.params.id &&\n    mutation.params.data?.tags\n  ) {\n    activeQueries\n      .filter(\n        (q) =>\n          q.operation === \"find\" &&\n          q.params.tags &&\n          (mutation.params.data.tags as string[]).some((tag) =>\n            q.params.tags.includes(tag),\n          ),\n      )\n      .forEach((q) => invalidatedKeys.push(q.queryKey));\n  }\n\n  return invalidatedKeys;\n};\n\n// Correlator for external StoreEvents (e.g., from SSE)\nconst postEventCorrelator: StoreEventCorrelator = (\n  event, // { scope: string, payload?: any }\n  activeQueries, // Array of { queryKey: string, operation: string, params: any }\n) => {\n  const invalidatedKeys: string[] = [];\n\n  // If an external event indicates a specific post was updated, invalidate its 'read' query\n  if (event.scope === \"post:external:updated\" && event.payload?.id) {\n    activeQueries\n      .filter((q) => q.operation === \"read\" && q.params.id === event.payload.id)\n      .forEach((q) => invalidatedKeys.push(q.queryKey));\n  }\n\n  // If an external event indicates a new post was created, invalidate all 'list' queries\n  if (event.scope === \"post:external:created\") {\n    activeQueries\n      .filter((q) => q.operation === \"list\")\n      .forEach((q) => invalidatedKeys.push(q.queryKey));\n  }\n\n  return invalidatedKeys;\n};\n\nconst cache = new QueryCache();\nconst postBaseStore = new PostBaseStore();\n\nconst postStore = new ReactiveRemoteStore<Post>(\n  cache,\n  postBaseStore,\n  postMutationCorrelator, // Pass your custom mutation correlator\n  postEventCorrelator, // Pass your custom store event correlator\n);\n\nconsole.log(\"ReactiveRemoteStore with custom correlators initialized.\");\n```\n\n### Common Use Cases\n\n#### Reactive UI Updates with `read` and `list`\n\nAutomatically update your UI components when data changes, without manual re-fetching.\n\n```typescript\nimport { ReactiveRemoteStore } from \"@asaidimu/erp-utils-remote-store\";\nimport { QueryCache } from \"@core/cache\";\nimport {\n  BaseStore,\n  Record,\n  Page,\n  StoreEvent,\n} from \"@asaidimu/erp-utils-remote-store/types\";\n\ninterface Item extends Record {\n  name: string;\n  status: \"active\" | \"inactive\";\n}\n\nclass ItemBaseStore implements BaseStore<Item> {\n  /* ... mock implementation ... */\n  private items: Item[] = [];\n  private nextId = 1;\n\n  async create(props: {\n    data: Omit<Item, \"id\">;\n    options?: any;\n  }): Promise<Item | undefined> {\n    const newItem = { id: String(this.nextId++), ...props.data };\n    this.items.push(newItem);\n    return newItem;\n  }\n  async read(options: { id: string }): Promise<Item | undefined> {\n    return this.items.find((i) => i.id === options.id);\n  }\n  async list(options: any): Promise<Page<Item>> {\n    return {\n      data: this.items,\n      page: {\n        number: 1,\n        size: this.items.length,\n        count: this.items.length,\n        pages: 1,\n      },\n    };\n  }\n  async update(props: {\n    id: string;\n    data: Partial<Omit<Item, \"id\">>;\n    options?: any;\n  }): Promise<Item | undefined> {\n    const item = this.items.find((i) => i.id === props.id);\n    if (item) {\n      Object.assign(item, props.data);\n      return item;\n    }\n    return undefined;\n  }\n  async delete(options: { id: string }): Promise<void> {\n    this.items = this.items.filter((i) => i.id !== options.id);\n  }\n  async upload(): Promise<Item | undefined> {\n    return undefined;\n  }\n  async subscribe(): Promise<() => void> {\n    return () => {};\n  }\n  async notify(): Promise<void> {}\n  stream(): {\n    stream: () => AsyncIterable<Item>;\n    cancel: () => void;\n    status: () => \"active\" | \"cancelled\" | \"completed\";\n  } {\n    return {\n      stream: async function* () {},\n      cancel: () => {},\n      status: () => \"completed\",\n    };\n  }\n}\n\nconst cache = new QueryCache();\nconst itemBaseStore = new ItemBaseStore();\nconst itemStore = new ReactiveRemoteStore<Item>(cache, itemBaseStore);\n\nasync function runReactiveUIExample() {\n  console.log(\"\\n--- Reactive UI Updates Example ---\");\n\n  // Create some initial items\n  const item1 = await itemStore.create({\n    data: { name: \"Item A\", status: \"active\" },\n  });\n  const item2 = await itemStore.create({\n    data: { name: \"Item B\", status: \"inactive\" },\n  });\n\n  // Subscribe to a list of all items\n  const [subscribeAllItems, selectAllItems] = itemStore.list({});\n  const unsubscribeAllItems = subscribeAllItems(() => {\n    console.log(\n      \"All Items (UI Update):\",\n      selectAllItems().page?.data.map((i) => `${i.name} (${i.status})`),\n    );\n  });\n\n  // Subscribe to a single item\n  if (item1) {\n    const [subscribeItem1, selectItem1] = itemStore.read({ id: item1.id });\n    const unsubscribeItem1 = subscribeItem1(() => {\n      console.log(\n        \"Item A (UI Update):\",\n        selectItem1().data\n          ? `${selectItem1().data?.name} (${selectItem1().data?.status})`\n          : \"Deleted\",\n      );\n    });\n\n    // Simulate an update to Item A\n    await new Promise((r) => setTimeout(r, 1000));\n    await itemStore.update({ id: item1.id, data: { status: \"inactive\" } });\n    console.log(\"Simulated update to Item A.\");\n\n    // Simulate deleting Item B\n    await new Promise((r) => setTimeout(r, 1000));\n    if (item2) {\n      await itemStore.delete({ id: item2.id });\n      console.log(\"Simulated deletion of Item B.\");\n    }\n\n    unsubscribeItem1();\n  }\n\n  unsubscribeAllItems();\n  itemStore.destroy();\n}\n\n// runReactiveUIExample();\n```\n\n#### Handling Real-time Data Streams\n\nConsume continuous data flows from your backend for live dashboards, chat applications, or sensor data.\n\n```typescript\nimport { ReactiveRemoteStore } from \"@asaidimu/erp-utils-remote-store\";\nimport { QueryCache } from \"@core/cache\";\nimport {\n  BaseStore,\n  Record,\n  Page,\n  StoreEvent,\n} from \"@asaidimu/erp-utils-remote-store/types\";\n\ninterface SensorReading extends Record {\n  temperature: number;\n  humidity: number;\n  timestamp: number;\n}\n\nclass SensorBaseStore implements BaseStore<SensorReading> {\n  /* ... mock implementation ... */\n  async find(): Promise<Page<SensorReading>> {\n    return { data: [], page: { number: 1, size: 0, count: 0, pages: 0 } };\n  }\n  async read(): Promise<SensorReading | undefined> {\n    return undefined;\n  }\n  async list(): Promise<Page<SensorReading>> {\n    return { data: [], page: { number: 1, size: 0, count: 0, pages: 0 } };\n  }\n  async create(props: any): Promise<SensorReading | undefined> {\n    return undefined;\n  }\n  async update(props: any): Promise<SensorReading | undefined> {\n    return undefined;\n  }\n  async delete(): Promise<void> {}\n  async upload(): Promise<SensorReading | undefined> {\n    return undefined;\n  }\n  async subscribe(): Promise<() => void> {\n    return () => {};\n  }\n  async notify(): Promise<void> {}\n  stream(options: any): {\n    stream: () => AsyncIterable<SensorReading>;\n    cancel: () => void;\n    status: () => \"active\" | \"cancelled\" | \"completed\";\n  } {\n    let counter = 0;\n    const intervalId = setInterval(() => {\n      // Simulate new readings every second\n      const newReading = {\n        id: `s${counter++}`,\n        temperature: Math.random() * 20 + 20,\n        humidity: Math.random() * 30 + 50,\n        timestamp: Date.now(),\n      };\n      // In a real scenario, this would push to an internal buffer consumed by the async generator\n      // For this example, we'll just yield directly.\n      // This mock doesn't perfectly simulate a real async generator being pushed to.\n      // A real implementation would involve a queue and a way to push items into it.\n      // For now, assume the BaseStore's stream method correctly provides the AsyncIterable.\n    }, 1000);\n\n    const mockAsyncIterable = (async function* () {\n      for (let i = 0; i < 5; i++) {\n        // Yield 5 readings for example\n        await new Promise((r) => setTimeout(r, 1000));\n        yield {\n          id: `mock-${i}`,\n          temperature: Math.random() * 10 + 20,\n          humidity: Math.random() * 10 + 50,\n          timestamp: Date.now(),\n        };\n      }\n    })();\n\n    return {\n      stream: () => mockAsyncIterable,\n      cancel: () => clearInterval(intervalId),\n      status: () => \"completed\", // Simplified status for mock\n    };\n  }\n}\n\nconst cache = new QueryCache();\nconst sensorBaseStore = new SensorBaseStore();\nconst sensorStore = new ReactiveRemoteStore<SensorReading>(\n  cache,\n  sensorBaseStore,\n);\n\nasync function runStreamExample() {\n  console.log(\"\\n--- Real-time Data Stream Example ---\");\n\n  const { stream, cancel, status } = sensorStore.stream({});\n\n  const statusInterval = setInterval(() => {\n    console.log(\"Stream Status:\", status());\n  }, 500);\n\n  try {\n    for await (const reading of stream()) {\n      console.log(\n        `Sensor Reading: Temp=${reading.temperature.toFixed(2)}°C, Humidity=${reading.humidity.toFixed(2)}%`,\n      );\n    }\n    console.log(\"Sensor stream completed.\");\n  } catch (error) {\n    console.error(\"Sensor stream error:\", error);\n  } finally {\n    clearInterval(statusInterval);\n    cancel(); // Ensure stream is cancelled\n    console.log(\"Stream cleanup.\");\n  }\n}\n\n// runStreamExample();\n```\n\n---\n\n## 🏗️ Project Architecture\n\n`ReactiveRemoteStore` is designed with modularity and extensibility in mind, separating concerns to allow for flexible integration with various caching strategies and backend communication methods.\n\n### Directory Structure\n\n```\nsrc/remote-store/\n├── error.ts            # Custom error classes for store operations.\n├── hash.ts             # Utility for hashing query parameters to create unique cache keys.\n├── store.ts            # The core ReactiveRemoteStore class implementation.\n├── types.ts            # TypeScript interfaces and types for the store, events, and options.\n├── test-server.ts      # A mock backend implementation used for e2e testing and examples.\n├── package.json        # Package metadata and dependencies for this specific module.\n├── README.md           # This documentation file.\n└── ...                 # Other related files (e.g., test files, build configs)\n```\n\n### Core Components\n\n- **`ReactiveRemoteStore` (`store.ts`)**: The main class providing the reactive data access layer. It orchestrates data flow between the UI, the `QueryCache`, and the `BaseStore`. It manages query subscriptions, triggers fetches, handles invalidation, and processes real-time events.\n- **`BaseStore<T>` (`types.ts`)**: An interface that defines the fundamental CRUD (Create, Read, Update, Delete), Upload, Subscribe, Notify, and Stream operations that your remote data source must implement. This makes `ReactiveRemoteStore` backend-agnostic.\n- **`QueryCache` (from `@core/cache`)**: An external dependency responsible for the actual in-memory caching logic. `ReactiveRemoteStore` interacts with it to store, retrieve, and invalidate data. It handles cache policies like staleness, eviction, and background re-fetching.\n- **`StoreEvent` (`types.ts`)**: Represents a data change event, typically originating from the `BaseStore` (e.g., via SSE) or triggered by local mutations. It has a `scope` (e.g., `product:created:success`) and an optional `payload`.\n- **`Correlator` (`types.ts`)**: A function type that allows you to define custom logic for how local mutations (create, update, delete, upload) should affect the invalidation of active queries in the `QueryCache`.\n- **`StoreEventCorrelator` (`types.ts`)**: A function type that allows you to define custom logic for how incoming `StoreEvent`s (e.g., from SSE) should affect the invalidation of active queries in the `QueryCache`.\n\n### Data Flow\n\n1.  **Query Initiation (e.g., `store.read()`, `store.list()`)**:\n    - A component requests data via `ReactiveRemoteStore`'s reactive methods (`read`, `list`, `find`).\n    - `ReactiveRemoteStore` generates a unique `queryKey` for the request.\n    - It checks the `QueryCache` for existing data. If data is fresh, it's returned immediately.\n    - If data is stale or not present, `ReactiveRemoteStore` registers a `fetchFunction` with the `QueryCache` (which then calls the appropriate `BaseStore` method) to fetch the data.\n    - The `QueryCache` manages the actual fetching, retries, and updates its internal state.\n    - `ReactiveRemoteStore` provides a `selector` function that components use to get the current state of the data (including `loading`, `stale`, `error`).\n    - A `subscribe` function is also provided, allowing components to register callbacks that are notified whenever the query result changes in the cache.\n\n2.  **Mutations (e.g., `store.create()`, `store.update()`)**:\n    - When a mutation operation is performed, `ReactiveRemoteStore` first calls the corresponding method on the `BaseStore` to update the remote data.\n    - Upon successful completion, it uses the configured `Correlator` (or a default strategy) to identify which active queries in the `QueryCache` should be invalidated.\n    - Invalidated queries are marked stale, ensuring that subsequent accesses will trigger a re-fetch (or background re-fetch if SWR is enabled by the `QueryCache`).\n\n3.  **Real-time Events (BaseStore-managed Connection)**:\n    - `ReactiveRemoteStore` subscribes to a wildcard scope (`*`) on the `BaseStore`'s `subscribe` method, listening for all incoming `StoreEvent`s.\n    - **Your `BaseStore` implementation is responsible for establishing and managing the actual real-time connection** (e.g., via Server-Sent Events, WebSockets, or other protocols) and pushing `StoreEvent`s to the `ReactiveRemoteStore` via the `callback` provided to `subscribe`.\n    - When a `StoreEvent` is received, `ReactiveRemoteStore` uses the configured `StoreEventCorrelator` to determine which active queries should be invalidated based on the event's `scope` and `payload`.\n    - This ensures that client-side data is automatically synchronized with server-side changes.\n\n4.  **Data Streaming (`store.stream()`)**:\n    - When `store.stream()` is called, `ReactiveRemoteStore` delegates the request to the `BaseStore`'s `stream` method.\n    - The `BaseStore` is responsible for establishing and managing the actual stream (e.g., HTTP streaming, WebSockets) and returning an `AsyncIterable`.\n    - `ReactiveRemoteStore` provides this `AsyncIterable` directly to the consumer, along with `cancel` and `status` controls.\n\n### Extension Points\n\n`ReactiveRemoteStore` is designed to be highly extensible, allowing you to tailor its behavior to your specific application and backend needs:\n\n- **Custom `BaseStore` Implementation**: The most significant extension point. By implementing the `BaseStore` interface, you can integrate `ReactiveRemoteStore` with any type of backend API (REST, GraphQL, custom RPC) and any communication library (Fetch API, Axios, gRPC clients).\n  - Crucially, your `BaseStore` implementation also dictates the real-time communication method for `subscribe` and `notify` (e.g., Server-Sent Events, WebSockets, long polling, etc.), allowing you to choose the best fit for your backend and application needs.\n- **Custom `QueryCache`**: While `@core/cache` is assumed, you can swap it out for any caching library that adheres to the expected `QueryCache` interface, allowing you to control caching policies, persistence, and memory management.\n- **Custom `Correlator` and `StoreEventCorrelator`**: These functions provide powerful control over cache invalidation. You can implement complex logic to precisely invalidate only the necessary queries based on the specifics of your data model and backend events, optimizing performance and consistency.\n- **Custom `TFindOptions`, `TReadOptions`, etc.**: The generic type parameters for options (`TFindOptions`, `TReadOptions`, etc.) allow you to define strongly-typed options objects that are specific to your API's query capabilities, enhancing type safety throughout your data layer.\n\n---\n\n## 🤝 Development & Contributing\n\nWe welcome contributions to `ReactiveRemoteStore`! Whether it's a bug fix, a new feature, or an improvement to the documentation, your help is appreciated.\n\n### Development Setup\n\nTo set up the development environment for `ReactiveRemoteStore`:\n\n1.  **Clone the monorepo** (assuming this is part of a larger `erp-utils` monorepo):\n    ```bash\n    git clone https://github.com/your-org/erp-utils.git # Replace with actual repo URL\n    cd erp-utils\n    ```\n2.  **Navigate to the `remote-store` package**:\n    ```bash\n    cd src/remote-store\n    ```\n3.  **Install dependencies**:\n    ```bash\n    bun install\n    # or\n    npm install\n    # or\n    yarn install\n    ```\n4.  **Build the project**:\n    ```bash\n    bun run build\n    # or\n    npm run build\n    # or\n    yarn build\n    ```\n\n### Scripts\n\nThe following `bun`/`npm` scripts are available in this project:\n\n- `bun run build`: Compiles TypeScript source files from `src/` to JavaScript output.\n- `bun run test`: Runs the test suite using `Vitest`.\n- `bun run test:watch`: Runs tests in watch mode for continuous feedback during development.\n- `bun run test-server`: Starts a mock backend server used for e2e tests and examples.\n- `bun run lint`: Runs ESLint to check for code style and potential errors.\n- `bun run format`: Formats code using Prettier according to the project's style guidelines.\n\n### Testing\n\nThis project includes comprehensive unit, integration, and end-to-end tests to ensure reliability and correctness.\n\n- **Unit Tests**: Test individual functions and classes in isolation (e.g., `store.test.ts`).\n- **Integration Tests**: Verify the interaction between `ReactiveRemoteStore` and a mock `BaseStore` (e.g., `store.integration.test.ts`).\n- **End-to-End (e2e) Tests**: Test the entire system, including `ReactiveRemoteStore`, `QueryCache`, and the `test-server` mock backend, simulating real-world scenarios (e.g., `store.e2e.test.ts`","readmeFilename":"README.md"}