Skip to content

Commit

Permalink
feat: implement sessionStorage
Browse files Browse the repository at this point in the history
  • Loading branch information
songkeys authored and cncolder committed Jun 28, 2020
1 parent 289733b commit ee16a58
Show file tree
Hide file tree
Showing 2 changed files with 64 additions and 2 deletions.
64 changes: 62 additions & 2 deletions src/bom/storage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ export class TaroStorage implements Storage {
*
* Throws a "QuotaExceededError" DOMException exception if the new value couldn't be set. (Setting could fail if, e.g., the user has disabled storage for the site, or if the quota has been exceeded.)
*/
setItem(keyName: string, keyValue: any): void {
setItem(keyName: string, keyValue: string): void {
try {
const value = String(keyValue)
Taro.setStorageSync(keyName, value)
Expand All @@ -60,4 +60,64 @@ export class TaroStorage implements Storage {
}
}

export const localStorage = new Storage()
class SessionStorage implements Storage {
private storage: Map<string, string>

constructor() {
this.storage = new Map<string, string>()
}

/**
* Returns the number of key/value pairs currently present in the list associated with the object.
*/
get length(): number {
return this.storage.size
}

/**
* Empties the list associated with the object of all key/value pairs, if there are any.
*/
clear(): void {
this.storage.clear()
}

/**
* Returns the current value associated with the given key, or null if the given key does not exist in the list associated with the object.
*/
getItem(keyName: string): string | null {
const value = this.storage.get(keyName)
if (!value) return null

if (typeof value === 'string') return value
return JSON.stringify(value)
}

/**
* Returns the name of the nth key in the list, or null if n is greater than or equal to the number of key/value pairs in the object.
*/
key(index: number): string | null {
const keys = [...this.storage.keys()]
if (index >= keys.length || index < 0) return null
return keys[index]
}

/**
* Removes the key/value pair with the given key from the list associated with the object, if a key/value pair with the given key exists.
*/
removeItem(keyName: string): void {
this.storage.delete(keyName)
}

/**
* Sets the value of the pair identified by key to value, creating a new key/value pair if none existed for key previously.
*
* Throws a "QuotaExceededError" DOMException exception if the new value couldn't be set. (Setting could fail if, e.g., the user has disabled storage for the site, or if the quota has been exceeded.)
*/
setItem(keyName: string, keyValue: string): void {
const value = String(keyValue)
this.storage.set(keyName, value)
}
}

export const localStorage = new TaroStorage()
export const sessionStorage = new SessionStorage()
2 changes: 2 additions & 0 deletions src/plugins/TaroProvidePlugin.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ const Intl = ['intl']

const Storage = [`${prefix}/bom/storage`, 'TaroStorage']
const localStorage = [`${prefix}/bom/storage`, 'localStorage']
const sessionStorage = [`${prefix}/bom/storage`, 'sessionStorage']

let taroRuntimeVersion = '0.0.0'
try {
Expand Down Expand Up @@ -114,6 +115,7 @@ export class TaroProvidePlugin extends ProvidePlugin {
localStorage,
['window.Storage']: Storage,
['window.localStorage']: localStorage,
['window.sessionStorage']: sessionStorage,
}
},
}
Expand Down

0 comments on commit ee16a58

Please sign in to comment.