{"_id":"@boxfoxs/comp-logger","_rev":"11-51c5afd9051c6fcf62e9cf9ab1666c4f","name":"@boxfoxs/comp-logger","dist-tags":{"latest":"1.8.0"},"versions":{"1.0.0":{"name":"@boxfoxs/comp-logger","version":"1.0.0","license":"UNLICENSED","_id":"@boxfoxs/comp-logger@1.0.0","maintainers":[{"name":"boxfoxsg619","email":"rlatjdfo112@naver.com"}],"dist":{"shasum":"4b18bab79136dc82f20467a94d2834ca138e5218","tarball":"https://registry.npmjs.org/@boxfoxs/comp-logger/-/comp-logger-1.0.0.tgz","fileCount":8,"integrity":"sha512-VOrOy8zJ0LupilU64cLTA798rn40sKhbJxztQ9zez/GxYFkxRDkKdAWeud3WM+6KhQwPX1TP417at4+H3tH+gw==","signatures":[{"sig":"MEYCIQDgmjHLFy79Ym0hZKW44oLxZaaQ6C3gmqDsmatP9Cx7jgIhAPdLSqW2zBvFGm+1nE80aCJipMtOrIf4NeF2P5s6aFLC","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":86307},"main":"dist/index.cjs","types":"dist/index.d.ts","module":"dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"7e077f20e2a686e3a1100aadfb18767c157336db","scripts":{"test":"vitest run","build":"tsup","test:watch":"vitest"},"_npmUser":{"name":"boxfoxsg619","email":"rlatjdfo112@naver.com"},"_npmVersion":"10.8.2","description":"Shared CompLogger implementation (session/client id lifecycle, persistent retry queue, device-agnostic transport) for React Native and Web bake projects.","directories":{},"_nodeVersion":"20.20.2","dependencies":{"axios":"^1.7.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","vitest":"^2.0.0","typescript":"^5.4.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/comp-logger_1.0.0_1784889955822_0.9014829369920943","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@boxfoxs/comp-logger","version":"1.2.0","license":"UNLICENSED","_id":"@boxfoxs/comp-logger@1.2.0","maintainers":[{"name":"boxfoxsg619","email":"rlatjdfo112@naver.com"}],"dist":{"shasum":"e1cd27e432d96e505edd09b5b4f6b4578dc3f66a","tarball":"https://registry.npmjs.org/@boxfoxs/comp-logger/-/comp-logger-1.2.0.tgz","fileCount":8,"integrity":"sha512-YWtpDt3farSl8Ut9kGBsF5NLhPseVeenjMt9pmhertfzfJle57QYGHbSiE4jnADPa85ukFiOqrBjG42UpnZcXQ==","signatures":[{"sig":"MEQCIDl2tv1z+gLIboZze0zn2Zu7197zYP0946F6U21Ijtn7AiA/qKzKczw/zWAaEo1si6PqHM47I//YyMBnOu0EVQFD9Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":90275},"main":"dist/index.cjs","types":"dist/index.d.ts","module":"dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"1d4eb083c51d3f972e648029b6a2505900a2c0e8","scripts":{"test":"vitest run","build":"tsup","test:watch":"vitest"},"_npmUser":{"name":"boxfoxsg619","email":"rlatjdfo112@naver.com"},"_npmVersion":"10.8.2","description":"Shared CompLogger implementation (session/client id lifecycle, persistent retry queue, device-agnostic transport) for React Native and Web bake projects.","directories":{},"_nodeVersion":"20.20.2","dependencies":{"axios":"^1.7.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","vitest":"^2.0.0","typescript":"^5.4.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/comp-logger_1.2.0_1784891369674_0.27596427865979267","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@boxfoxs/comp-logger","version":"1.1.0","license":"UNLICENSED","_id":"@boxfoxs/comp-logger@1.1.0","maintainers":[{"name":"boxfoxsg619","email":"rlatjdfo112@naver.com"}],"dist":{"shasum":"5edc0111ee18c69d058886e0e468019ec9165243","tarball":"https://registry.npmjs.org/@boxfoxs/comp-logger/-/comp-logger-1.1.0.tgz","fileCount":8,"integrity":"sha512-E8QM1Qo/f5WIUGyWAJWpZiCBH/k9FGv4YECWpEREoFMp5C8rnopEhSo+6I0kOd5wuzo8m+qHs3AvM1fBi0RfaA==","signatures":[{"sig":"MEUCIQCPvzA60xlLPAqPfrp69ET6UKXacynZ8kyn2iX4wkQw7QIgXhx/a8B0yk1A4hvmMYChDXSq6k+wY64xOUCGnEFSaPg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":89313},"main":"dist/index.cjs","types":"dist/index.d.ts","module":"dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"e8b04d3bf06bc96bc2e2516658cce782f54ab5ff","scripts":{"test":"vitest run","build":"tsup","test:watch":"vitest"},"_npmUser":{"name":"boxfoxsg619","email":"rlatjdfo112@naver.com"},"_npmVersion":"10.8.2","description":"Shared CompLogger implementation (session/client id lifecycle, persistent retry queue, device-agnostic transport) for React Native and Web bake projects.","directories":{},"_nodeVersion":"20.20.2","dependencies":{"axios":"^1.7.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","vitest":"^2.0.0","typescript":"^5.4.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/comp-logger_1.1.0_1784891394394_0.4497287036919111","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"@boxfoxs/comp-logger","version":"1.3.0","license":"UNLICENSED","_id":"@boxfoxs/comp-logger@1.3.0","maintainers":[{"name":"boxfoxsg619","email":"rlatjdfo112@naver.com"}],"dist":{"shasum":"80e18e1e71d9e6e4286f7eddad9460993231d0fa","tarball":"https://registry.npmjs.org/@boxfoxs/comp-logger/-/comp-logger-1.3.0.tgz","fileCount":8,"integrity":"sha512-Eu0B6pkUujn+y3ydRh3RIF/cmgvdqyaEncT+K8zDdJMgDoDWKpxRxNB3LbGNV8sLnxRD5o41l6ncWZItIPAS+Q==","signatures":[{"sig":"MEYCIQDXcdqEJoig6Vdz0BPpn4GWRwYb6rDaZica8uZ6aEcwJwIhAMeNtuj4AW2br13tA+kCMUSPa8Pe57ZkQa1eu4FYSLCt","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":93313},"main":"dist/index.cjs","types":"dist/index.d.ts","module":"dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"a7743afd0e6c2413ea8ed9caad4758d7caadd10e","scripts":{"test":"vitest run","build":"tsup","test:watch":"vitest"},"_npmUser":{"name":"boxfoxsg619","email":"rlatjdfo112@naver.com"},"_npmVersion":"10.8.2","description":"Shared CompLogger implementation (session/client id lifecycle, persistent retry queue, device-agnostic transport) for React Native and Web bake projects.","directories":{},"_nodeVersion":"20.20.2","dependencies":{"axios":"^1.7.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","vitest":"^2.0.0","typescript":"^5.4.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/comp-logger_1.3.0_1784892980966_0.22955283393592896","host":"s3://npm-registry-packages-npm-production"}},"1.4.0":{"name":"@boxfoxs/comp-logger","version":"1.4.0","license":"UNLICENSED","_id":"@boxfoxs/comp-logger@1.4.0","maintainers":[{"name":"boxfoxsg619","email":"rlatjdfo112@naver.com"}],"dist":{"shasum":"87c6953180a62ed854496e5941b852ec78862e46","tarball":"https://registry.npmjs.org/@boxfoxs/comp-logger/-/comp-logger-1.4.0.tgz","fileCount":8,"integrity":"sha512-dLIbDypjape/pkkvJZXKyzudrmVc/P8Dcz/rL2ViOdwW5xUQ8AFPsI0PPNusTbyrUE2fD4+DmZ79JX6yp8h4PA==","signatures":[{"sig":"MEUCIQDGy29lX8DG7hX53/I24ncfr4kqZDbjeTzxHmy5VG0TmAIgAM4xZXv2ahc5Y8hyVIHQJmtWzBuzySkWhaPsX1k1M60=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":116247},"main":"dist/index.cjs","types":"dist/index.d.ts","module":"dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"ff62dc4c44f3a4059c382f6c4741c3e4c8ac3721","scripts":{"test":"vitest run","build":"tsup","test:watch":"vitest"},"_npmUser":{"name":"boxfoxsg619","email":"rlatjdfo112@naver.com"},"_npmVersion":"10.8.2","description":"Shared CompLogger implementation (session/client id lifecycle, persistent retry queue, device-agnostic transport) for React Native and Web bake projects.","directories":{},"_nodeVersion":"20.20.2","dependencies":{"axios":"^1.7.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","vitest":"^2.0.0","typescript":"^5.4.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/comp-logger_1.4.0_1785416684983_0.8319064902197761","host":"s3://npm-registry-packages-npm-production"}},"1.4.1":{"name":"@boxfoxs/comp-logger","version":"1.4.1","license":"UNLICENSED","_id":"@boxfoxs/comp-logger@1.4.1","maintainers":[{"name":"boxfoxsg619","email":"rlatjdfo112@naver.com"}],"dist":{"shasum":"c7466b3578fba8520cebbfb43e6a492ec563a3cb","tarball":"https://registry.npmjs.org/@boxfoxs/comp-logger/-/comp-logger-1.4.1.tgz","fileCount":8,"integrity":"sha512-pGDMFVQ/PbUM0A+TXAoPwTLOXzv2LcfHI+aSFk/zhRzfYeDxFQSCb/k3UNJxf0ERIz0iCLywjzX6X7gbR5MFLg==","signatures":[{"sig":"MEUCIBPpL52zGeSgbrluiX3jJy8GCvt+YYnjhRZK8NMg/GrhAiEAwnvoMEeH7ziYPTPFUB8AC0Fwpb1k31AN5sMsdAcJ2C0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":120837},"main":"dist/index.cjs","types":"dist/index.d.ts","module":"dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"bdc6b6b328e91c5bc4e5e3292e29ea7b80a9178b","scripts":{"test":"vitest run","build":"tsup","test:watch":"vitest"},"_npmUser":{"name":"boxfoxsg619","email":"rlatjdfo112@naver.com"},"_npmVersion":"10.8.2","description":"Shared CompLogger implementation (session/client id lifecycle, persistent retry queue, device-agnostic transport) for React Native and Web bake projects.","directories":{},"_nodeVersion":"20.20.2","dependencies":{"axios":"^1.7.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","vitest":"^2.0.0","typescript":"^5.4.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/comp-logger_1.4.1_1787201464028_0.6116014485560484","host":"s3://npm-registry-packages-npm-production"}},"1.5.0":{"name":"@boxfoxs/comp-logger","version":"1.5.0","license":"UNLICENSED","_id":"@boxfoxs/comp-logger@1.5.0","maintainers":[{"name":"boxfoxsg619","email":"rlatjdfo112@naver.com"}],"dist":{"shasum":"6f2e6bec8d11513545bb9a8b474bd12855cbbeed","tarball":"https://registry.npmjs.org/@boxfoxs/comp-logger/-/comp-logger-1.5.0.tgz","fileCount":8,"integrity":"sha512-P6VL0WaKS1GiW/1eYUazeqvGEEoF91daXTF7j1UuQiwagd1KOSdldxah6lzFo05vc4t9XKpLFnO9sFDkErk0Ig==","signatures":[{"sig":"MEUCIQClkUks1h1pvzhXJ08uqQsDuq4VH8+EeBylqf3B/9/WBgIgMu0J5RLzMIyMyQ1EeN174v2tF3qQjmoWS1K9RPzyK4s=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":125357},"main":"dist/index.cjs","types":"dist/index.d.ts","module":"dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"2b9aedc146490634d48a36926688e581aa3e943b","scripts":{"test":"vitest run","build":"tsup","test:watch":"vitest"},"_npmUser":{"name":"boxfoxsg619","email":"rlatjdfo112@naver.com"},"_npmVersion":"10.8.2","description":"Shared CompLogger implementation (session/client id lifecycle, persistent retry queue, device-agnostic transport) for React Native and Web bake projects.","directories":{},"_nodeVersion":"20.20.2","dependencies":{"axios":"^1.7.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","vitest":"^2.0.0","typescript":"^5.4.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/comp-logger_1.5.0_1787204502303_0.7872354740707102","host":"s3://npm-registry-packages-npm-production"}},"1.6.0":{"name":"@boxfoxs/comp-logger","version":"1.6.0","license":"UNLICENSED","_id":"@boxfoxs/comp-logger@1.6.0","maintainers":[{"name":"boxfoxsg619","email":"rlatjdfo112@naver.com"}],"dist":{"shasum":"6e586943b903059687ec24b1355990dc376c4fe0","tarball":"https://registry.npmjs.org/@boxfoxs/comp-logger/-/comp-logger-1.6.0.tgz","fileCount":8,"integrity":"sha512-AROiBWTAWjdWa3Ddqu4LiF0f1o+O30QBEUpRo4bAe2JVxYwX4ICn7Beg6hxUpZlLnleebfowvzw45RLQ/HdzMA==","signatures":[{"sig":"MEUCIQCDwUas7tvHoE7YN7MdQtFOpAKx/sSFiulAGkQ3adev5QIgA+oGcdk5UoOZZXP4/K6NQzcaJu/wCSxZ7GZFz8NJaQI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":127933},"main":"dist/index.cjs","types":"dist/index.d.ts","module":"dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"cebbed4c374fa9de1ec261ae3341dd293eadfaa0","scripts":{"test":"vitest run","build":"tsup","test:watch":"vitest"},"_npmUser":{"name":"boxfoxsg619","email":"rlatjdfo112@naver.com"},"_npmVersion":"10.8.2","description":"Shared CompLogger implementation (session/client id lifecycle, persistent retry queue, device-agnostic transport) for React Native and Web bake projects.","directories":{},"_nodeVersion":"20.20.2","dependencies":{"axios":"^1.7.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","vitest":"^2.0.0","typescript":"^5.4.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/comp-logger_1.6.0_1787228064424_0.05243212710131906","host":"s3://npm-registry-packages-npm-production"}},"1.6.1":{"name":"@boxfoxs/comp-logger","version":"1.6.1","keywords":["analytics","logging","event-tracking","telemetry","react-native","session","retry-queue","bot-detection"],"license":"UNLICENSED","_id":"@boxfoxs/comp-logger@1.6.1","maintainers":[{"name":"boxfoxsg619","email":"rlatjdfo112@naver.com"}],"dist":{"shasum":"24b13892c9c86cce0f5ae0ffb1b50ef82efd9c12","tarball":"https://registry.npmjs.org/@boxfoxs/comp-logger/-/comp-logger-1.6.1.tgz","fileCount":8,"integrity":"sha512-SL/ZyL7s+i4I6DaYXVN4eTc7Njv4xlgSJ0FXMorZh/ciqmtmk+3gSAxaQ3RFls0H2UEB2KlIzQ9u47IzP1L2hw==","signatures":[{"sig":"MEUCIBz7M59AO9TSP99HUcw65ZBTE0vz+6xJ+qs120vQCZnNAiEA4i4LUzrHKZ4t7x4KRPN+3WRds9D7IfEj8GpkywFcMzw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":132130},"main":"dist/index.cjs","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"22a3d69ed0f2f3170abca1ee7c5ed1b27338cbc8","scripts":{"test":"vitest run","build":"tsup","test:watch":"vitest"},"_npmUser":{"name":"boxfoxsg619","email":"rlatjdfo112@naver.com"},"_npmVersion":"10.8.2","description":"Event logging SDK for React Native and web: session/client id lifecycle, a persistent retry queue that survives restarts, and bot filtering on by default.","directories":{},"_nodeVersion":"20.20.2","dependencies":{"axios":"^1.7.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","vitest":"^2.0.0","typescript":"^5.4.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/comp-logger_1.6.1_1787229721073_0.9569338973262269","host":"s3://npm-registry-packages-npm-production"}},"1.7.0":{"name":"@boxfoxs/comp-logger","version":"1.7.0","keywords":["analytics","logging","event-tracking","telemetry","react-native","session","retry-queue","bot-detection"],"license":"UNLICENSED","_id":"@boxfoxs/comp-logger@1.7.0","maintainers":[{"name":"boxfoxsg619","email":"rlatjdfo112@naver.com"}],"dist":{"shasum":"e9a1c01cec9ad3701ab364d9ec05f4e7717cf763","tarball":"https://registry.npmjs.org/@boxfoxs/comp-logger/-/comp-logger-1.7.0.tgz","fileCount":8,"integrity":"sha512-yfWcoPpJkwdOarb3Z4De8ndHg/wofpLR8rhrgEcFWf1BELgtkaQuuEwwjh7cOAoX2wEpXSUifrrwiEAzGJwOIA==","signatures":[{"sig":"MEQCIGCniNYP2qi1wKRmCoXvymhHGxl7jrq+BJbNGjo0FcZ/AiBhx/0ywJhP46p5RscZmI48hRfrNAdb824OozRT4yotVw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":149920},"main":"dist/index.cjs","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"scripts":{"test":"vitest run","build":"tsup","test:watch":"vitest"},"_npmUser":{"name":"boxfoxsg619","email":"rlatjdfo112@naver.com"},"_npmVersion":"10.9.7","description":"Event logging SDK for React Native and web: session/client id lifecycle, a persistent retry queue that survives restarts, and bot filtering on by default.","directories":{},"_nodeVersion":"22.22.2","dependencies":{"axios":"^1.7.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","vitest":"^2.0.0","typescript":"^5.4.0","@types/node":"^20.0.0"},"_npmOperationalInternal":{"tmp":"tmp/comp-logger_1.7.0_1788238410388_0.5140188548947375","host":"s3://npm-registry-packages-npm-production"}},"1.8.0":{"name":"@boxfoxs/comp-logger","version":"1.8.0","description":"Event logging SDK for React Native and web: session/client id lifecycle, a persistent retry queue that survives restarts, and bot filtering on by default.","keywords":["analytics","logging","event-tracking","telemetry","react-native","session","retry-queue","bot-detection"],"license":"UNLICENSED","engines":{"node":">=18"},"main":"dist/index.cjs","module":"dist/index.js","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"scripts":{"build":"tsup","test":"vitest run","test:watch":"vitest"},"dependencies":{"axios":"^1.7.0"},"devDependencies":{"@types/node":"^20.0.0","tsup":"^8.5.1","typescript":"^5.4.0","vitest":"^2.0.0"},"publishConfig":{"access":"public"},"_id":"@boxfoxs/comp-logger@1.8.0","_nodeVersion":"22.22.2","_npmVersion":"10.9.7","dist":{"integrity":"sha512-SAzHbRcUB0wSo2EdRoCD4tSm8dXIrZQwghHAR3iN9oqfVJ7zBlmqlZy8OGZjc8ovicJRYyl8jWhGUUB1MXZgWA==","shasum":"06990acae04c4c2423be2d96df46a5a48e5e22b8","tarball":"https://registry.npmjs.org/@boxfoxs/comp-logger/-/comp-logger-1.8.0.tgz","fileCount":8,"unpackedSize":166832,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIHLjs8K78eNg+WbKZNyzhO/8oLZJQbb/0Y1lupolHdpAAiEApHOkZt48JP+qiW0o48w8tOfr45zhZR3vUd8ZkVwg2p8="}]},"_npmUser":{"name":"boxfoxsg619","email":"rlatjdfo112@naver.com"},"directories":{},"maintainers":[{"name":"boxfoxsg619","email":"rlatjdfo112@naver.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/comp-logger_1.8.0_1788242372161_0.7088675581071735"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-24T10:45:55.590Z","modified":"2026-09-01T05:59:32.508Z","1.0.0":"2026-07-24T10:45:55.949Z","1.2.0":"2026-07-24T11:09:29.826Z","1.1.0":"2026-07-24T11:09:54.535Z","1.3.0":"2026-07-24T11:36:21.102Z","1.4.0":"2026-07-30T13:04:45.151Z","1.4.1":"2026-08-20T04:51:04.166Z","1.5.0":"2026-08-20T05:41:42.454Z","1.6.0":"2026-08-20T12:14:24.553Z","1.6.1":"2026-08-20T12:42:01.312Z","1.7.0":"2026-09-01T04:53:30.537Z","1.8.0":"2026-09-01T05:59:32.306Z"},"license":"UNLICENSED","keywords":["analytics","logging","event-tracking","telemetry","react-native","session","retry-queue","bot-detection"],"description":"Event logging SDK for React Native and web: session/client id lifecycle, a persistent retry queue that survives restarts, and bot filtering on by default.","maintainers":[{"name":"boxfoxsg619","email":"rlatjdfo112@naver.com"}],"readme":"# @compounding/logger\n\nEvent logging SDK for React Native and web apps. One implementation covers both:\nstorage and platform metadata are injected, so no platform-specific code lives in\nthis package.\n\n- **Session / client id lifecycle** — 30-minute inactivity timeout, evaluated on\n  every call rather than by a background timer.\n- **Persistent retry queue** — events are stored before they are sent and only\n  dropped once the server acknowledges them, so they survive offline periods and\n  app restarts.\n- **Bot filtering** — crawler and automation traffic is discarded before it is\n  queued. On by default.\n\n```bash\nnpm install @compounding/logger\n```\n\n## What you need\n\nA **project id** (a number), issued by whoever administers your analytics\ndashboard. There is no API key or token — ask for the id and you are done.\n\n> **Use the id you were given.** The ingestion endpoint is unauthenticated, so a\n> wrong project id does not fail — it silently writes your events into someone\n> else's project. Nothing surfaces until someone opens the dashboard.\n\nThe default endpoint is `https://api2.bake-now.com`. Override it with the\n`endpoint` option if you were pointed at a different environment.\n\n## Quick start — React Native\n\n`AsyncStorage` can back both the persistent and the session storage.\n\n```ts\nimport AsyncStorage from '@react-native-async-storage/async-storage';\nimport { AppState, Platform } from 'react-native';\nimport DeviceInfo from 'react-native-device-info';\nimport { createCompLogger, StorageAdapter } from '@compounding/logger';\n\nconst asyncAdapter: StorageAdapter = {\n  get: key => AsyncStorage.getItem(key).then(v => v ?? undefined),\n  set: (key, value) => AsyncStorage.setItem(key, value),\n  remove: key => AsyncStorage.removeItem(key),\n};\n\nexport const CompLogger = createCompLogger({\n  projectId: YOUR_PROJECT_ID,\n  platform: Platform.OS,\n  persistentStorage: asyncAdapter,\n  sessionStorage: asyncAdapter,\n  collectMetadata: async () => ({\n    deviceInfo: await DeviceInfo.getDeviceName(),\n    appVersion: await DeviceInfo.getVersion(),\n  }),\n  // Flush whatever is queued as soon as the app comes back to the foreground.\n  onResume: flush => {\n    const sub = AppState.addEventListener('change', s => {\n      if (s === 'active') flush();\n    });\n    return () => sub.remove();\n  },\n});\n```\n\nReact Native has no `navigator.userAgent`, so bot filtering never matches there\nand is a no-op. Nothing to turn off.\n\n## Quick start — Web\n\nUse `localStorage` for persistent storage and `sessionStorage` for session\nstorage. Getting these two the wrong way round is the most common setup mistake —\nsee [Pitfalls](#pitfalls).\n\n```ts\nimport { createCompLogger, StorageAdapter } from '@compounding/logger';\n\nconst localAdapter: StorageAdapter = {\n  get: async key => localStorage.getItem(key) ?? undefined,\n  set: async (key, value) => localStorage.setItem(key, value),\n  remove: async key => localStorage.removeItem(key),\n};\nconst sessionAdapter: StorageAdapter = {\n  get: async key => sessionStorage.getItem(key) ?? undefined,\n  set: async (key, value) => sessionStorage.setItem(key, value),\n  remove: async key => sessionStorage.removeItem(key),\n};\n\nexport const CompLogger = createCompLogger({\n  projectId: YOUR_PROJECT_ID,\n  platform: 'web',\n  persistentStorage: localAdapter,\n  sessionStorage: sessionAdapter,\n  collectMetadata: async () => ({ userAgent: navigator.userAgent }),\n  // Called once, only the first time this install needs a new client id.\n  collectClientIdSeed: async () =>\n    `${navigator.userAgent}_${screen.width}x${screen.height}`,\n  onResume: flush => {\n    const onOnline = () => flush();\n    const onVisible = () => {\n      if (document.visibilityState === 'visible') flush();\n    };\n    window.addEventListener('online', onOnline);\n    document.addEventListener('visibilitychange', onVisible);\n    return () => {\n      window.removeEventListener('online', onOnline);\n      document.removeEventListener('visibilitychange', onVisible);\n    };\n  },\n  // Without this, an event logged immediately before the page goes away dies\n  // inside the 100ms debounce, before it ever reaches the persistent queue.\n  onSuspend: flush => {\n    const onHide = () => flush();\n    const onHidden = () => {\n      if (document.visibilityState === 'hidden') flush();\n    };\n    window.addEventListener('pagehide', onHide);\n    document.addEventListener('visibilitychange', onHidden);\n    return () => {\n      window.removeEventListener('pagehide', onHide);\n      document.removeEventListener('visibilitychange', onHidden);\n    };\n  },\n  // Last chance for a visitor who leaves and never comes back (app store,\n  // external link). fetch+keepalive rather than sendBeacon: the endpoint is\n  // cross-origin JSON, so the request needs a normal CORS preflight.\n  beaconSend: (url, payload) => {\n    void fetch(url, {\n      method: 'POST',\n      keepalive: true,\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify(payload),\n    }).catch(() => {});\n    return true;\n  },\n});\n```\n\nCall `createCompLogger()` once in a module you can import from anywhere, and\nreuse that instance.\n\n## API\n\n```ts\nCompLogger.log(name: string, params?: Record<string, unknown>, options?: LogOptions): Promise<void>;\nCompLogger.logPageView(page: string, params?: Record<string, unknown>): Promise<void>;\nCompLogger.logClick(name: string, params?: Record<string, unknown>): Promise<void>;\nCompLogger.setLoginUser(userId: string): void;\nCompLogger.unsetLoginUser(): void;\nCompLogger.setUserProperties(properties: Record<string, unknown>): Promise<void>;\n```\n\nCall `setLoginUser` right after sign-in to attribute subsequent events to that\nuser, and `unsetLoginUser` on sign-out. `setUserProperties` is only meaningful\nonce a login user is set.\n\nAlso exported: `isBotClient()`, `isBotUserAgent(ua)`, `getSessionId()`,\n`getClientId()`.\n\n### `log()` is fire-and-forget by default\n\n`log()` resolves once its 100 ms debounce timer is scheduled — **awaiting it does\nnot mean the event was stored.** If the calling context may not outlive that\nwindow (a headless background task handling a push open, a flush on unload), set\n`immediate` so you can hold the context open until the event is recoverable:\n\n```ts\nawait CompLogger.log('push_opened', { id }, { immediate: true });\n```\n\n`immediate` skips debouncing, so repeated identical events are no longer\ncollapsed.\n\n### Attributing a single event to a specific user\n\nThe global login user is read **at send time**. If `setLoginUser` /\n`unsetLoginUser` runs between your `log()` call and the actual send, that event's\nattribution changes with it. Usually harmless — but for events where the user at\n*call* time is the fact you want recorded (a push open that arrives while the app\nis still resolving its login state), pass `userId` to pin it:\n\n```ts\n// Applies to this event only; the global login user is left untouched.\nawait CompLogger.log('push_opened', { id }, { userId, immediate: true });\n```\n\nAn empty string means \"this event is anonymous\" and clears the attribution even\nwhen a global user is set. Omit the option entirely to keep the default global\nbehaviour.\n\n## Configuration\n\n| Option | | Description |\n| --- | --- | --- |\n| `projectId` | required | The project number you were issued. |\n| `platform` | required | Metadata tag: `'ios'` / `'android'` / `'web'`. |\n| `persistentStorage` | required | Holds the client id and the retry queue. Must survive restarts. |\n| `sessionStorage` | required | Holds the session id and its last-active-at marker. |\n| `endpoint` | optional | Default `https://api2.bake-now.com`. |\n| `collectMetadata` | optional | Device/browser metadata attached to every log. |\n| `collectClientIdSeed` | optional | Fingerprint entropy, used once when a client id is first created. Defaults to `platform` alone. |\n| `onResume` | optional | Subscribe to \"app/tab became active\"; call `flush`, return an unsubscribe function. |\n| `onSuspend` | optional | Subscribe to \"app/tab is going away\" (web `pagehide`, RN AppState background). Drains pending debounced events into the queue. Web hosts should always set this. |\n| `beaconSend` | optional | Send during unload, returning whether the browser accepted it. Only reachable path for a visitor who never returns. Web only — React Native has no equivalent. |\n| `sessionTimeoutMs` | optional | Inactivity window before a new session id. Default 30 minutes. |\n| `skipBots` | optional | Default `true`. Set `false` only if crawler traffic is what you are measuring. |\n| `injectedSessionId` | optional | Use an externally supplied session id verbatim. See below. |\n| `injectedClientId` | optional | Same, for the client id. |\n\n### Sharing ids with a wrapping native app\n\nWhen a native app embeds a webview, the web side generates its own session and\nthe same user's activity splits across two sessions. Pass the native ids as\n`injectedSessionId` / `injectedClientId` to line them up. How the values reach\nthe config — `postMessage`, an injected global, a URL parameter — is entirely up\nto the host app.\n\n```ts\nconst injected = typeof window !== 'undefined' ? window.__NATIVE_APP_IDS__ : undefined;\n\nexport const CompLogger = createCompLogger({\n  projectId: YOUR_PROJECT_ID,\n  platform: 'web',\n  persistentStorage,\n  sessionStorage,\n  injectedSessionId: injected?.sessionId,\n  injectedClientId: injected?.clientId,\n});\n```\n\nAn injected id is used verbatim and bypasses the storage-backed lifecycle\nentirely — nothing is read from or written to storage for it. This is\none-directional (native → web): web activity does not extend the native app's\nsession timeout.\n\n## How it behaves\n\n### Sessions\n\nA new `session_id` is issued when more than `sessionTimeoutMs` (default 30\nminutes, matching the Amplitude/GA convention) has passed since the last log\ncall. The check runs on every call rather than relying on a background timer, so\nan app that was closed for days is correctly treated as a new session.\n\n### Bot filtering\n\nEvents from bots, crawlers and automation tools are dropped **before they are\nqueued**. Detection looks at `navigator.userAgent`, the `navigator.webdriver`\nflag (so UA-spoofing automation is still caught), and the `userAgent` returned by\n`collectMetadata()`.\n\nThis lives in the package because crawler noise is not one app's problem. When\neach app wrapped its own filter the rules diverged, and new apps started with no\nfilter at all — inflating page-view denominators while click events stayed real,\nso every conversion rate read far below its true value.\n\nFalse positives are treated as worse than false negatives: a real user's events\ndisappearing is invisible, while some extra bot noise is not. The UA pattern\ndeliberately avoids tokens that can appear in real browsers, and in-app webviews\n(KakaoTalk, Naver, Instagram) are pinned as non-matching in the test suite\nagainst user agents taken from production logs.\n\nTo skip work of your own for a crawler whose events would be discarded anyway:\n\n```ts\nimport { isBotClient } from '@compounding/logger';\n\nuseEffect(() => {\n  if (isBotClient()) return; // no observers, no listeners, no beacons\n  // ...attach analytics listeners\n}, []);\n```\n\n### Retry queue\n\nRequests are persisted before they are attempted and removed only once the\nserver acknowledges them (or the response makes retrying pointless). Anything\nleft over resumes on the next launch or visit. Writes always merge against the\ncurrent storage contents, so multiple browser tabs sharing an origin never\nclobber each other's in-flight entries.\n\n| | |\n| --- | --- |\n| Max retries | 8 |\n| Queue cap | 500 events (oldest dropped, with a console warning) |\n| Backoff | 1 s, doubling, capped at 30 s |\n\n| Response | Handling |\n| --- | --- |\n| Network failure | Retried — the request may never have reached the server. |\n| `429` / `5xx` | Retried as transient. |\n| `400` | Dropped, with the reason logged. The payload is wrong; retrying changes nothing. |\n| `403` | Dropped, and **all sending pauses for 5 minutes**. Resending would only re-trigger the block. |\n\n## Pitfalls\n\n- **Leaving a placeholder project id in place.** Ingestion is unauthenticated, so\n  a wrong id writes silently into another project. Verify it before your first\n  commit.\n- **Treating `await log()` as a durability guarantee.** It is not; use\n  `{ immediate: true }` where the context may disappear.\n- **Logging right before navigating away, on web, without `onSuspend`.** An\n  `<a href>` click, a `location.href` assignment, or a tab close destroys the\n  100ms debounce timer before the event reaches the queue, so it is not merely\n  delayed — it never existed. Wire `onSuspend` (and `beaconSend` if visitors may\n  not return), or pass `{ immediate: true }` and await it before navigating.\n- **Swapping the two storages on web.** `localStorage` in the `sessionStorage`\n  slot means sessions never end; `sessionStorage` in the `persistentStorage` slot\n  loses the client id and the pending queue every time the tab closes. On React\n  Native both being `AsyncStorage` is correct.\n- **Long offline periods.** Past 500 queued events the oldest are dropped. Check\n  for `[CompLogger]` console warnings if that is plausible for your app.\n\n## License\n\nUNLICENSED — proprietary. Published to npm for distribution convenience only;\nthis is not a grant of permission to use, copy, or redistribute. Contact the\npackage owner for usage terms.\n","readmeFilename":"README.md"}