diff --git a/README.md b/README.md index 6a190df69..cdeb26d2f 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ To securely use the latest distribution of blockstack.js from a CDN, use the fol ```html - + ``` diff --git a/src/auth/sessionData.ts b/src/auth/sessionData.ts index 998a38f3d..3cd58bfdd 100644 --- a/src/auth/sessionData.ts +++ b/src/auth/sessionData.ts @@ -5,10 +5,13 @@ import { UserData } from './authApp' const SESSION_VERSION = '1.0.0' +type EtagMap = { [key: string]: string; }; + export interface SessionOptions { coreNode?: string, userData?: UserData, transitKey?: string, + etags?: EtagMap, localStorageKey?: string, storeOptions?: { localStorageKey?: string @@ -27,10 +30,13 @@ export class SessionData { // window.localStorage.setItem(BLOCKSTACK_STORAGE_LABEL, JSON.stringify(userData)) userData?: UserData + etags?: EtagMap + constructor(options: SessionOptions) { this.version = SESSION_VERSION this.userData = options.userData this.transitKey = options.transitKey + this.etags = options.etags ? options.etags : {} } getGaiaHubConfig(): GaiaHubConfig { @@ -48,7 +54,8 @@ export class SessionData { const options: SessionOptions = { coreNode: json.coreNode, userData: json.userData, - transitKey: json.transitKey + transitKey: json.transitKey, + etags: json.etags } return new SessionData(options) } diff --git a/src/storage/index.ts b/src/storage/index.ts index 49869bad4..d0c8b7f39 100644 --- a/src/storage/index.ts +++ b/src/storage/index.ts @@ -27,9 +27,6 @@ import { NAME_LOOKUP_PATH } from '../auth/authConstants' import { getGlobalObject, getBlockstackErrorFromResponse, megabytesToBytes } from '../utils' import { fetchPrivate } from '../fetchUtil' -const etags: { [key: string]: string; } = {} - - export interface EncryptionOptions { /** * If set to `true` the data is signed using ECDSA on SHA256 hashes with the user's @@ -311,7 +308,9 @@ async function getFileContents(caller: UserSession, path: string, app: string, const etag = response.headers.get('ETag') if (etag) { - etags[path] = etag + const sessionData = caller.store.getSessionData() + sessionData.etags[path] = etag + caller.store.setSessionData(sessionData) } if (forceText || contentType === null || contentType.startsWith('text') @@ -755,9 +754,10 @@ export async function putFile( let etag: string let newFile = true - if (etags[path]) { + const sessionData = caller.store.getSessionData(); + if (sessionData.etags[path]) { newFile = false - etag = etags[path] + etag = sessionData.etags[path] } let uploadFn: (hubConfig: GaiaHubConfig) => Promise @@ -781,7 +781,8 @@ export async function putFile( signatureContent, hubConfig, 'application/json') ]))[0] if (writeResponse.etag) { - etags[path] = writeResponse.etag + sessionData.etags[path] = writeResponse.etag; + caller.store.setSessionData(sessionData); } return writeResponse.publicURL } @@ -818,7 +819,8 @@ export async function putFile( path, contentForUpload, hubConfig, contentType, newFile, etag ) if (writeResponse.etag) { - etags[path] = writeResponse.etag + sessionData.etags[path] = writeResponse.etag; + caller.store.setSessionData(sessionData); } return writeResponse.publicURL } @@ -857,26 +859,31 @@ export async function deleteFile( ) { const gaiaHubConfig = await caller.getOrSetLocalGaiaHubConnection() const opts = Object.assign({}, options) + const sessionData = caller.store.getSessionData(); if (opts.wasSigned) { // If signed, delete both the content file and the .sig file try { await deleteFromGaiaHub(path, gaiaHubConfig) await deleteFromGaiaHub(`${path}${SIGNATURE_FILE_SUFFIX}`, gaiaHubConfig) - delete etags[path]; + delete sessionData.etags[path]; + caller.store.setSessionData(sessionData); } catch (error) { const freshHubConfig = await caller.setLocalGaiaHubConnection() await deleteFromGaiaHub(path, freshHubConfig) await deleteFromGaiaHub(`${path}${SIGNATURE_FILE_SUFFIX}`, gaiaHubConfig) - delete etags[path]; + delete sessionData.etags[path]; + caller.store.setSessionData(sessionData); } } else { try { await deleteFromGaiaHub(path, gaiaHubConfig) - delete etags[path]; + delete sessionData.etags[path]; + caller.store.setSessionData(sessionData); } catch (error) { const freshHubConfig = await caller.setLocalGaiaHubConnection() await deleteFromGaiaHub(path, freshHubConfig) - delete etags[path]; + delete sessionData.etags[path]; + caller.store.setSessionData(sessionData); } } }