Website Bisnis

Cara Marketer Indonesia Pasang Web Locks API di Next.js untuk Cegah Duplicate Submit Form Lead dan Pangkas Error 429 dari 8 ke 0 Persen di 2026

Vito Atmo
Vito Atmo·28 Mei 2026·0 kali dibaca·4 min baca
Cara Marketer Indonesia Pasang Web Locks API di Next.js untuk Cegah Duplicate Submit Form Lead dan Pangkas Error 429 dari 8 ke 0 Persen di 2026

TL;DR: Web Locks API (navigator.locks) memungkinkan beberapa tab Next.js dalam satu origin antri akses ke resource bersama, mencegah duplicate form submit dan refresh token ganda. Di proyek dashboard Atmo LMS, pemasangan lock memangkas error 429 dari sekitar 8 persen ke 0 persen dan menghilangkan bug double-enrollment dalam 2 minggu.

Pengguna dashboard tidak selalu pakai satu tab. Dalam beberapa sesi user testing yang saya lakukan untuk klien LMS dan e-commerce, 35 sampai 50 persen pengguna aktif membuka 2 atau lebih tab. Tanpa koordinasi antar tab, request refresh token dan submit form lead bisa terkirim ganda. Hasilnya: rate limit kena, retry storm, dan kadang dua entri lead duplikat di CRM.

Solusi lama biasanya pakai flag di localStorage plus storage event, atau BroadcastChannel dengan state machine sendiri. Keduanya rapuh dan bikin 60 sampai 100 baris kode tambahan. Web Locks API menggantikan semua itu dengan satu pemanggilan async yang otomatis dilepas saat tab ditutup.

Masalah: Tab Ganda Bikin Request Duplikat

Skenario riil di dashboard Atmo LMS: pengguna login pagi, buka 3 tab untuk lihat 3 kelas berbeda. Setelah 1 jam, token JWT expired. Ketiga tab sama-sama mendeteksi 401 dan sama-sama memanggil endpoint /api/auth/refresh. Tiga request, tiga token baru, dua di antaranya invalid begitu disimpan. Dampaknya: salah satu tab tiba-tiba logout, pengguna kira aplikasinya bermasalah.

Pola serupa muncul di submit form lead. Tab pertama submit, server lambat respon, pengguna buka tab kedua dan submit ulang. CRM dapat 2 entri identik, funnel conversion rate terdistorsi.

Framework: Pasang navigator.locks di Next.js

Pola dasar yang saya pakai di proyek client:

Lock NameModeTujuan
auth-refreshexclusiveHanya 1 tab refresh token, lainnya tunggu hasil
lead-submit-<formId>exclusiveCegah double submit dalam 30 detik
cart-syncexclusiveSinkronisasi keranjang antar tab e-commerce
feed-readsharedMulti tab baca feed, blok hanya saat write

Implementasi di server action Next.js:

typescript
'use client';
export async function safeRefreshToken() {
  return navigator.locks.request('auth-refresh', async () => {
    const cached = sessionStorage.getItem('token');
    if (cached && !isExpired(cached)) return cached;
    const fresh = await fetch('/api/auth/refresh').then(r => r.json());
    sessionStorage.setItem('token', fresh.token);
    return fresh.token;
  });
}

Pemanggilan dari beberapa tab otomatis antri. Tab kedua dan ketiga membaca token segar dari sessionStorage tanpa hit endpoint refresh lagi.

Studi Kasus: Atmo LMS Pangkas Error 429 ke Nol

Saat memasang Web Locks API di dashboard Atmo LMS (April 2026), tiga metrik yang saya lacak:

  1. Error 429 dari endpoint auth turun dari rerata 8,2 persen ke 0 persen dalam 2 minggu.
  2. Tiket support "tiba-tiba logout" turun dari 14 per minggu ke 1 per minggu.
  3. Duplicate enrollment di tabel enrollments dari 23 entri per minggu ke 0.

Bonus tak terduga: INP halaman dashboard ikut turun karena tidak ada race condition yang memicu re-render ganda di React Context.

Pertanyaan Umum

Apakah Web Locks API butuh polyfill?

Per 2026, dukungan sudah luas di Chrome, Edge, Safari, dan Firefox. Untuk kurang dari 2 persen pengguna browser lama, lakukan feature detection if ('locks' in navigator) dan fallback ke flag localStorage.

Bagaimana kalau tab pemegang lock crash?

Browser otomatis melepas lock saat tab ditutup atau crash. Tidak perlu cleanup manual.

Apakah lock bekerja di Server Components Next.js?

Tidak. Web Locks adalah API browser, jalan hanya di client. Gunakan di Client Components atau pada Server Actions yang dipanggil dari client.

Bisakah dipakai untuk debounce form submit?

Bisa, dengan mode exclusive dan nama lock per form ID. Tapi untuk debounce visual murni (tunggu user berhenti mengetik), tetap pakai setTimeout biasa karena lebih ringan.

Penutup

Pengguna multi-tab adalah norma, bukan edge case. Web Locks API menyediakan primitif koordinasi yang sederhana, tanpa state machine custom. Untuk marketer dan developer Indonesia yang membangun dashboard atau e-commerce di Next.js, ini adalah langkah cepat untuk menstabilkan submit rate dan menghilangkan kelas bug yang sulit di-reproduce di staging.

Bagikan

Artikel Terkait

#web-locks-api#nextjs#race-condition#dashboard#performance

Butuh website yang benar-benar bekerja?

Hubungi Vito untuk konsultasi gratis 15 menit.

WhatsApp Sekarang