{"_id":"@craftthingy-digital-innovation/cty-offline-outbox-sync-web","_rev":"2-6a279e2861a6763c0dae2e6c44b0244e","name":"@craftthingy-digital-innovation/cty-offline-outbox-sync-web","dist-tags":{"latest":"1.0.1"},"versions":{"1.0.0":{"name":"@craftthingy-digital-innovation/cty-offline-outbox-sync-web","version":"1.0.0","_id":"@craftthingy-digital-innovation/cty-offline-outbox-sync-web@1.0.0","maintainers":[{"name":"killerking69","email":"alifnurhidayatwork@gmail.com"}],"homepage":"https://github.com/CraftThingy-Digital-Innovation/cty-offline-outbox-sync-web#readme","bugs":{"url":"https://github.com/CraftThingy-Digital-Innovation/cty-offline-outbox-sync-web/issues"},"dist":{"shasum":"9171b569af3da22eb56dd198665599505f7903fa","tarball":"https://registry.npmjs.org/@craftthingy-digital-innovation/cty-offline-outbox-sync-web/-/cty-offline-outbox-sync-web-1.0.0.tgz","fileCount":6,"integrity":"sha512-hHPMmCQWr8KwRWXLUS7aG5iTm+mYW7HR65O+xx8P4Ej9mQKkWKM3A+bUSLO82cM0fRt9kKehSD3PLJaF3PGHxA==","signatures":[{"sig":"MEUCIFkJhfFhLjTOh16+yX548VJi2A28Yb4YJNXs/9CJNSnGAiEA48p2KWVPywCAbTyAOapXu8y3LLj2pC25+v73AsSUcTg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":15868},"main":"./dist/cty-offline-outbox-sync.umd.js","type":"module","module":"./dist/cty-offline-outbox-sync.es.js","exports":{".":{"import":"./dist/cty-offline-outbox-sync.es.js","require":"./dist/cty-offline-outbox-sync.umd.js"}},"gitHead":"6a86ae77ce19cd1461b4d1ce6e8aa6b2ea1859bb","scripts":{"build":"vite build"},"_npmUser":{"name":"killerking69","email":"alifnurhidayatwork@gmail.com"},"repository":{"url":"git+https://github.com/CraftThingy-Digital-Innovation/cty-offline-outbox-sync-web.git","type":"git"},"_npmVersion":"10.8.2","description":"Bilingual documentation: [Bahasa Indonesia](#bahasa-indonesia) | [English](#english)","directories":{},"_nodeVersion":"20.20.2","dependencies":{},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^5.2.0"},"_npmOperationalInternal":{"tmp":"tmp/cty-offline-outbox-sync-web_1.0.0_1783079444255_0.29955856072463205","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@craftthingy-digital-innovation/cty-offline-outbox-sync-web","version":"1.0.1","license":"SEE LICENSE IN LICENSE","type":"module","repository":{"type":"git","url":"git+https://github.com/CraftThingy-Digital-Innovation/cty-offline-outbox-sync-web.git"},"bugs":{"url":"https://github.com/CraftThingy-Digital-Innovation/cty-offline-outbox-sync-web/issues"},"homepage":"https://github.com/CraftThingy-Digital-Innovation/cty-offline-outbox-sync-web#readme","main":"./dist/cty-offline-outbox-sync.umd.js","module":"./dist/cty-offline-outbox-sync.es.js","exports":{".":{"import":"./dist/cty-offline-outbox-sync.es.js","require":"./dist/cty-offline-outbox-sync.umd.js"}},"scripts":{"build":"vite build"},"publishConfig":{"access":"public"},"dependencies":{},"devDependencies":{"vite":"^5.2.0"},"_id":"@craftthingy-digital-innovation/cty-offline-outbox-sync-web@1.0.1","gitHead":"b83b85ee56ee464cc0f9a305c6a255d85fbc6080","description":"Bilingual documentation: [Bahasa Indonesia](#bahasa-indonesia) | [English](#english)","_nodeVersion":"20.20.2","_npmVersion":"10.8.2","dist":{"integrity":"sha512-V/jv3nJEjSjD+LmikJduy+dF4De74iDIrIZPGgJHuNorB0UvOa28aG1fi2Vb6zWfIUESjY0C0I3bUL+/l7kkUA==","shasum":"1c6749f7089f35daeb00a24fd87ba44e5d2b949e","tarball":"https://registry.npmjs.org/@craftthingy-digital-innovation/cty-offline-outbox-sync-web/-/cty-offline-outbox-sync-web-1.0.1.tgz","fileCount":6,"unpackedSize":15907,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDiqgYQCb+Z8mrSESBfYgE+Ms2pj2Y5/1WWGipznidhmwIhAMLolBJPnUxKznoLAYTdeEGPniRMfFTgkWEhKdaDNFPW"}]},"_npmUser":{"name":"killerking69","email":"alifnurhidayatwork@gmail.com"},"directories":{},"maintainers":[{"name":"killerking69","email":"alifnurhidayatwork@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/cty-offline-outbox-sync-web_1.0.1_1783146507190_0.7298235136214271"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-03T11:50:44.052Z","modified":"2026-07-04T06:28:27.451Z","1.0.0":"2026-07-03T11:50:44.388Z","1.0.1":"2026-07-04T06:28:27.335Z"},"bugs":{"url":"https://github.com/CraftThingy-Digital-Innovation/cty-offline-outbox-sync-web/issues"},"homepage":"https://github.com/CraftThingy-Digital-Innovation/cty-offline-outbox-sync-web#readme","repository":{"type":"git","url":"git+https://github.com/CraftThingy-Digital-Innovation/cty-offline-outbox-sync-web.git"},"description":"Bilingual documentation: [Bahasa Indonesia](#bahasa-indonesia) | [English](#english)","maintainers":[{"name":"killerking69","email":"alifnurhidayatwork@gmail.com"}],"readme":"# @craftthingy-digital-innovation/cty-offline-outbox-sync-web\n\nBilingual documentation: [Bahasa Indonesia](#bahasa-indonesia) | [English](#english)\n\n---\n\n## Bahasa Indonesia\n\nLibrary client-side Javascript untuk menangani pengiriman data otomatis (auto-save) dengan kemampuan penyimpanan lokal sementara (`localStorage` outbox) dan pencobaan ulang otomatis (`auto-retry`) berkala jika koneksi terputus.\n\nSangat berguna untuk aplikasi web yang membutuhkan persistensi tinggi (seperti spreadsheet, form panjang, CRM) agar terhindar dari kehilangan data saat jaringan buruk.\n\n### Instalasi\n```bash\nnpm install @craftthingy-digital-innovation/cty-offline-outbox-sync-web\n```\n\n### Cara Penggunaan\n```javascript\nimport { OfflineOutbox } from '@craftthingy-digital-innovation/cty-offline-outbox-sync-web';\n\nconst outbox = new OfflineOutbox({\n  storageKey: 'paspor_offline_queue', // Kunci localStorage\n  retryInterval: 6000, // Waktu tunggu coba kembali (6 detik)\n  onSync: async (item) => {\n    // Jalankan pengiriman data asinkron Anda ke server\n    const response = await fetch('/api/save', {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify(item.postData)\n    });\n    return await response.json();\n  }\n});\n\n// Masukkan perubahan data ke outbox (akan di-merge otomatis jika UUID sama)\noutbox.enqueue('row-uuid-123', { nama_pemohon: 'Alif Nurhidayat' });\n\n// Dengarkan perubahan status sinkronisasi untuk update UI badge\noutbox.on('status-change', ({ pendingCount, online }) => {\n  if (!online) {\n    updateStatusUI(`Koneksi terputus. Menyimpan lokal... (${pendingCount} tertunda)`);\n  } else if (pendingCount > 0) {\n    updateStatusUI(`Menyinkronkan... (${pendingCount} perubahan)`);\n  } else {\n    updateStatusUI('Semua data tersimpan otomatis');\n  }\n});\n```\n\n---\n\n## English\n\nA client-side JavaScript library to handle automatic form submissions (auto-save) with local cache fallback (`localStorage` outbox) and periodic auto-retry capabilities when connections are disrupted.\n\nExtremely useful for sheets, databases, long forms, or CRMs to prevent data loss on unstable networks.\n\n### Installation\n```bash\nnpm install @craftthingy-digital-innovation/cty-offline-outbox-sync-web\n```\n\n### Usage\n```javascript\nimport { OfflineOutbox } from '@craftthingy-digital-innovation/cty-offline-outbox-sync-web';\n\nconst outbox = new OfflineOutbox({\n  storageKey: 'paspor_offline_queue', // Key in localStorage\n  retryInterval: 6000, // Retry interval (6 seconds)\n  onSync: async (item) => {\n    // Execute your async API save request\n    const response = await fetch('/api/save', {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify(item.postData)\n    });\n    return await response.json();\n  }\n});\n\n// Enqueue changes (automatically merged if same UUID is modified)\noutbox.enqueue('row-uuid-123', { nama_pemohon: 'Alif Nurhidayat' });\n\n// Listen for status changes to update your UI indicators\noutbox.on('status-change', ({ pendingCount, online }) => {\n  if (!online) {\n    updateStatusUI(`Connection offline. Saved locally (${pendingCount} pending)`);\n  } else if (pendingCount > 0) {\n    updateStatusUI(`Syncing... (${pendingCount} changes)`);\n  } else {\n    updateStatusUI('All data saved automatically');\n  }\n});\n```\n","readmeFilename":"README.md","license":"SEE LICENSE IN LICENSE"}