126 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
			
		
		
	
	
			126 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
/*
 | 
						|
Copyright 2018 New Vector Ltd
 | 
						|
 | 
						|
Licensed under the Apache License, Version 2.0 (the "License");
 | 
						|
you may not use this file except in compliance with the License.
 | 
						|
You may obtain a copy of the License at
 | 
						|
 | 
						|
    http://www.apache.org/licenses/LICENSE-2.0
 | 
						|
 | 
						|
Unless required by applicable law or agreed to in writing, software
 | 
						|
distributed under the License is distributed on an "AS IS" BASIS,
 | 
						|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
						|
See the License for the specific language governing permissions and
 | 
						|
limitations under the License.
 | 
						|
*/
 | 
						|
 | 
						|
const SOURCE_ORIGIN = 'file://';
 | 
						|
 | 
						|
const IndexedDBCryptoStore = window.matrixcs.IndexedDBCryptoStore;
 | 
						|
const cryptoStore = new IndexedDBCryptoStore(window.indexedDB, 'matrix-js-sdk:crypto');
 | 
						|
 | 
						|
let accountStored = 0;
 | 
						|
let sessionsStored = 0;
 | 
						|
let inboundGroupSessionsStored = 0;
 | 
						|
let deviceDataStored = 0;
 | 
						|
let roomsStored = 0;
 | 
						|
let localStorageKeysStored = 0;
 | 
						|
 | 
						|
const promises = [];
 | 
						|
 | 
						|
async function onMessage(e) {
 | 
						|
    if (e.origin !== SOURCE_ORIGIN) return;
 | 
						|
 | 
						|
    const data = e.data.data; // bleh, naming clash
 | 
						|
    switch (e.data.cmd) {
 | 
						|
        case 'init':
 | 
						|
            // start with clean stores before we migrate data in
 | 
						|
            window.localStorage.clear();
 | 
						|
            await cryptoStore.deleteAllData();
 | 
						|
 | 
						|
            e.source.postMessage({
 | 
						|
                cmd: 'initOK',
 | 
						|
            }, SOURCE_ORIGIN);
 | 
						|
            break;
 | 
						|
        case 'storeAccount':
 | 
						|
            promises.push(cryptoStore.doTxn(
 | 
						|
                'readwrite', [IndexedDBCryptoStore.STORE_ACCOUNT],
 | 
						|
                (txn) => {
 | 
						|
                    cryptoStore.storeAccount(txn, data);
 | 
						|
                },
 | 
						|
            ).then(() => {
 | 
						|
                ++accountStored;
 | 
						|
            }));
 | 
						|
            break;
 | 
						|
        case 'storeSessions':
 | 
						|
            promises.push(cryptoStore.doTxn(
 | 
						|
                'readwrite', [IndexedDBCryptoStore.STORE_SESSIONS],
 | 
						|
                (txn) => {
 | 
						|
                    for (const sess of data) {
 | 
						|
                        cryptoStore.storeEndToEndSession(sess.deviceKey, sess.sessionId, sess, txn);
 | 
						|
                    }
 | 
						|
                },
 | 
						|
            ).then(() => {
 | 
						|
                sessionsStored += data.length;
 | 
						|
            }));
 | 
						|
            break;
 | 
						|
        case 'storeInboundGroupSessions':
 | 
						|
            promises.push(cryptoStore.doTxn(
 | 
						|
                'readwrite', [IndexedDBCryptoStore.STORE_INBOUND_GROUP_SESSIONS],
 | 
						|
                (txn) => {
 | 
						|
                    for (const sess of data) {
 | 
						|
                        cryptoStore.addEndToEndInboundGroupSession(
 | 
						|
                            sess.senderKey, sess.sessionId, sess.sessionData, txn,
 | 
						|
                        );
 | 
						|
                    }
 | 
						|
                },
 | 
						|
            ).then(() => {
 | 
						|
                inboundGroupSessionsStored += data.length;
 | 
						|
            }));
 | 
						|
            break;
 | 
						|
        case 'storeDeviceData':
 | 
						|
            promises.push(cryptoStore.doTxn(
 | 
						|
                'readwrite', [IndexedDBCryptoStore.STORE_DEVICE_DATA],
 | 
						|
                (txn) => {
 | 
						|
                    cryptoStore.storeEndToEndDeviceData(data, txn);
 | 
						|
                },
 | 
						|
            ).then(() => {
 | 
						|
                ++deviceDataStored;
 | 
						|
            }));
 | 
						|
            break;
 | 
						|
        case 'storeRooms':
 | 
						|
            promises.push(cryptoStore.doTxn(
 | 
						|
                'readwrite', [IndexedDBCryptoStore.STORE_ROOMS],
 | 
						|
                (txn) => {
 | 
						|
                    for (const [roomId, roomInfo] of Object.entries(data)) {
 | 
						|
                        cryptoStore.storeEndToEndRoom(roomId, roomInfo, txn);
 | 
						|
                    }
 | 
						|
                },
 | 
						|
            ).then(() => {
 | 
						|
                ++roomsStored;
 | 
						|
            }));
 | 
						|
            break;
 | 
						|
        case 'storeLocalStorage':
 | 
						|
            window.localStorage.setItem(data.key, data.val);
 | 
						|
            ++localStorageKeysStored;
 | 
						|
            break;
 | 
						|
        case 'getSummary':
 | 
						|
            await Promise.all(promises);
 | 
						|
            e.source.postMessage({
 | 
						|
                cmd: 'summary',
 | 
						|
                data: {
 | 
						|
                    accountStored,
 | 
						|
                    sessionsStored,
 | 
						|
                    inboundGroupSessionsStored,
 | 
						|
                    deviceDataStored,
 | 
						|
                    roomsStored,
 | 
						|
                    localStorageKeysStored,
 | 
						|
                },
 | 
						|
            }, SOURCE_ORIGIN);
 | 
						|
            break;
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
window.addEventListener('message', onMessage);
 | 
						|
 |