Skip to content

createHandoff

مقداری (یک File، یک Blob، هر چیزی که رونوشت ساختاری‌پذیر باشد) را از یک صفحه به صفحهٔ بعدی در همان مبدأ می‌سپارد.

Fileای که کاربر در صفحهٔ A برگزیده، به صفحهٔ B نمی‌رسد. نه در نشانی جا می‌شود و نه سریال‌پذیر است؛ sessionStorage هم تنها رشته می‌گیرد. IndexedDB مقدارهای رونوشت‌ساختاری‌پذیر را همان‌گونه که هستند نگه می‌دارد، پس صفحهٔ A مقدار را می‌گذارد و می‌رود و صفحهٔ B آن را برمی‌دارد.

API

createHandoff(options)

پارامترتوضیحنوعپیش‌فرض
dbNameنام پایگاه داده؛ هر دو سو باید بر سرش هم‌داستان باشندstringالزامی
storeNameنام انبارهٔ شیء، که در نخستین گشودن ساخته می‌شودstring'files'
keyکلیدی که آن یک مقدارِ در انتظار زیر آن نگه داشته می‌شودstring'pending'

بازگشت

متدتوضیح
put(value)مقداری را برای صفحهٔ بعد می‌گذارد. اگر نتواند، false
take()مقدار در انتظار را برمی‌دارد و پاکش می‌کند. اگر چیزی نباشد، null

نمونه

صفحهٔ ورودی فایلی را به برنامه می‌سپارد

js
import { createHandoff } from 'ranuts';

const handoff = createHandoff({ dbName: 'document-handoff' });

input.addEventListener('change', async () => {
  await handoff.put(input.files[0]);
  location.href = '/app?open=local';
});

برنامه آن را برمی‌دارد

js
import { createHandoff, queryFlag } from 'ranuts';

const handoff = createHandoff({ dbName: 'document-handoff' });

if (queryFlag('open')) {
  const file = await handoff.take();
  if (file) openDocument(file); // با بارگذاری دوباره null است — مقدار مصرف شده
}

یادداشت‌ها

  1. خواندن، ویرانگر است. take() مقدار را در همان تراکنشی که می‌خواندش پاک می‌کند. همین است که نمی‌گذارد بارگذاری دوبارهٔ صفحه همان فایل را از نو باز کند، و همین است که نشانی کهنهٔ ?open=local چیزی نمی‌یابد.

  2. دو زبانه نمی‌توانند هر دو ببرند. چون خواندن و پاک کردن در یک تراکنش‌اند، در رقابت میان زبانه‌ها مقدار دقیقاً به یکی از آن‌ها می‌رسد.

  3. put هنگام تثبیت برآورده می‌شود، نه هنگام درخواست نوشتن. مقدار تنها پس از تثبیت تراکنش ماندگار است، و صفحه معمولاً بلافاصله پس از آن جابه‌جا می‌شود.

  4. شکست‌ها بی‌صدایند. نبودن یا بسته بودن IndexedDB (رندر سمت سرور، حالت ناشناس، قابی از دامنهٔ دیگر) باعث می‌شود put با false و take با null برآورده شوند. صفحه‌ای که تنها کوشیده چیزی را بسپارد، نباید به سبب نبودن انباره بشکند.

  5. انباره در نسخهٔ ۱ ساخته می‌شود، به دست هر سویی که زودتر پایگاه داده را بگشاید؛ دیگری آن را از پیش آماده می‌یابد.

  6. هر بار یک مقدار. این سپردن است، نه صف: put دوم مقدار در انتظار را رونویسی می‌کند. اگر انبارهٔ راستین می‌خواهید، از WebDB استفاده کنید.

منتشرشده تحت مجوز MIT.