diff options
Diffstat (limited to 'packages/webapi/src/lib/Storage.ts')
-rw-r--r-- | packages/webapi/src/lib/Storage.ts | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/packages/webapi/src/lib/Storage.ts b/packages/webapi/src/lib/Storage.ts new file mode 100644 index 000000000..672c537c8 --- /dev/null +++ b/packages/webapi/src/lib/Storage.ts @@ -0,0 +1,51 @@ +import * as _ from './utils' + +export class Storage { + clear(): void { + _.internalsOf<StorageInternals>(this, 'Storage', 'clear').storage.clear() + } + + getItem(key: string): string | null { + return getStringOrNull( + _.internalsOf<StorageInternals>(this, 'Storage', 'getItem').storage.get(String(key)) + ) + } + + key(index: number): string | null { + return getStringOrNull([ ..._.internalsOf<StorageInternals>(this, 'Storage', 'key').storage.keys() ][Number(index) || 0]) + } + + removeItem(key: string): void { + _.internalsOf<StorageInternals>(this, 'Storage', 'getItem').storage.delete(String(key)) + } + + setItem(key: string, value: any): void { + _.internalsOf<StorageInternals>(this, 'Storage', 'getItem').storage.set(String(key), String(value)) + } + + get length() { + return _.internalsOf<StorageInternals>(this, 'Storage', 'size').storage.size + } +} + +const getStringOrNull = (value: string | void) => typeof value === 'string' ? value : null + +export const initStorage = (target: Target, exclude: Set<string>) => { + if (exclude.has('Storage') || exclude.has('localStorage')) return + + target.localStorage = Object.create(Storage.prototype) + + const storageInternals = new Map<string, string>() + + _.INTERNALS.set(target.localStorage, { + storage: storageInternals + } as StorageInternals) +} + +interface StorageInternals { + storage: Map<string, string> +} + +interface Target { + localStorage: Storage +} |