packages/cache-canvas/src/storage.tsx (74 lines of code) (raw):
const cache = {};
export const Storage = {
setItem: (key, value, { bizID = '' }) => {
try {
if (
typeof window !== 'undefined' &&
window.__megability_bridge__ &&
window.__megability_bridge__.syncCall
) {
const canIUse = window.__megability_bridge__.syncCall('ability', 'available', {
ability: 'userKVStorage',
api: 'setItem',
});
if (canIUse) {
return new Promise((resolve, reject) => {
// The base64 of canvans may be too large, and the syncCall will block the thread.
window.__megability_bridge__.asyncCall('userKVStorage', 'setItem', {
key,
value,
bizID,
}, (res) => {
if (res && res.statusCode <= 100) {
resolve(res);
} else {
reject();
}
});
});
}
}
return new Promise((resolve, reject) => {
if (typeof window !== 'undefined' && typeof localStorage !== 'undefined') {
resolve(localStorage.setItem(key, value));
} else {
reject(new Error('localStorage is undefined.'));
}
});
} catch (e) {
console.error('Storage setItem error:', e);
return Promise.reject(e);
}
},
getItem: (key, { bizID = '' }) => {
try {
if (
typeof window !== 'undefined' &&
window.__megability_bridge__ &&
window.__megability_bridge__.syncCall
) {
const canIUse = window.__megability_bridge__.syncCall('ability', 'available', {
ability: 'userKVStorage',
api: 'getItem',
});
if (canIUse) {
const res = window.__megability_bridge__.syncCall(
'userKVStorage',
'getItem',
{
key,
bizID,
});
if (res && res.statusCode === 0 && res.data && res.data.result) {
return res.data.result;
}
}
}
if (typeof window !== 'undefined' && window.localStorage) {
return window.localStorage.getItem(key);
}
return cache[key] || '';
} catch (e) {
console.error('Storage getItem error:', e);
}
},
};