@sentry/browser
Version:
Official Sentry SDK for browsers
106 lines (103 loc) • 3.23 kB
JavaScript
import { makeOfflineTransport, parseEnvelope, serializeEnvelope } from '@sentry/core/browser';
import { WINDOW } from '../helpers.js';
import { makeFetchTransport } from './fetch.js';
function promisifyRequest(request) {
return new Promise((resolve, reject) => {
request.oncomplete = request.onsuccess = () => resolve(request.result);
request.onabort = request.onerror = () => reject(request.error);
});
}
function createStore(dbName, storeName) {
const request = indexedDB.open(dbName);
request.onupgradeneeded = () => request.result.createObjectStore(storeName);
const dbp = promisifyRequest(request);
return (callback) => dbp.then((db) => callback(db.transaction(storeName, "readwrite").objectStore(storeName)));
}
function keys(store) {
return promisifyRequest(store.getAllKeys());
}
function push(store, value, maxQueueSize) {
return store((store2) => {
return keys(store2).then((keys2) => {
if (keys2.length >= maxQueueSize) {
return;
}
store2.put(value, Math.max(...keys2, 0) + 1);
return promisifyRequest(store2.transaction);
});
});
}
function unshift(store, value, maxQueueSize) {
return store((store2) => {
return keys(store2).then((keys2) => {
if (keys2.length >= maxQueueSize) {
return;
}
store2.put(value, Math.min(...keys2, 0) - 1);
return promisifyRequest(store2.transaction);
});
});
}
function shift(store) {
return store((store2) => {
return keys(store2).then((keys2) => {
const firstKey = keys2[0];
if (firstKey == null) {
return void 0;
}
return promisifyRequest(store2.get(firstKey)).then((value) => {
store2.delete(firstKey);
return promisifyRequest(store2.transaction).then(() => value);
});
});
});
}
function createIndexedDbStore(options) {
let store;
function getStore() {
if (store == void 0) {
store = createStore(options.dbName || "sentry-offline", options.storeName || "queue");
}
return store;
}
return {
push: async (env) => {
try {
const serialized = serializeEnvelope(env);
await push(getStore(), serialized, options.maxQueueSize || 30);
} catch {
}
},
unshift: async (env) => {
try {
const serialized = serializeEnvelope(env);
await unshift(getStore(), serialized, options.maxQueueSize || 30);
} catch {
}
},
shift: async () => {
try {
const deserialized = await shift(getStore());
if (deserialized) {
return parseEnvelope(deserialized);
}
} catch {
}
return void 0;
}
};
}
function makeIndexedDbOfflineTransport(createTransport) {
return (options) => {
const transport = createTransport({ ...options, createStore: createIndexedDbStore });
WINDOW.addEventListener("online", async (_) => {
await transport.flush();
});
return transport;
};
}
function makeBrowserOfflineTransport(createTransport = makeFetchTransport) {
return makeIndexedDbOfflineTransport(makeOfflineTransport(createTransport));
}
export { createStore, makeBrowserOfflineTransport, push, shift, unshift };
//# sourceMappingURL=offline.js.map