UNPKG

@jsxc/jsxc

Version:

Real-time XMPP chat application with video calls, file transfer and encrypted communication

107 lines (81 loc) 3.36 kB
import ISignalStore, { IIdentityKeyPair, IPreKeyPair, ISignedPreKeyPair } from '../vendor/SignalStore.interface'; import ArrayBufferUtils from '../util/ArrayBuffer'; import Store from '../lib/Store'; import Address from './Address'; import IdentityKey from '../model/IdentityKey'; import Log from '@util/Log'; export const DIRECTION = { SENDING: 1, RECEIVING: 2, }; export default class implements ISignalStore { public Direction = DIRECTION; constructor(private store: Store) {} public getIdentityKeyPair(): Promise<IIdentityKeyPair> { let identityKey = this.store.getLocalIdentityKey(); return Promise.resolve({ pubKey: identityKey.getPublic(), privKey: identityKey.getPrivate(), }); } public getLocalRegistrationId(): Promise<number> { return Promise.resolve(this.store.getLocalRegistrationId()); } public isTrustedIdentity(identifier: string, publicIdentityKey: ArrayBuffer, direction: number): Promise<boolean> { if (typeof identifier === 'undefined' || identifier === null) { throw new Error('Undefined or null is no valid identifier'); } if (!(publicIdentityKey instanceof ArrayBuffer)) { throw new Error('Expected identityKey to be an ArrayBuffer'); } let address = Address.fromString(identifier); let identityKey = new IdentityKey({ publicKey: publicIdentityKey }); return this.store.isTrustedIdentity(address, identityKey, direction); } public saveIdentity(identifier: string, publicIdentityKey: string | ArrayBuffer): Promise<boolean> { if (identifier === null || identifier === undefined) { throw new Error('Tried to put identity key for undefined/null key'); } let address = Address.fromString(identifier); if (typeof publicIdentityKey === 'string') { publicIdentityKey = ArrayBufferUtils.fromString(publicIdentityKey); } if (publicIdentityKey.byteLength !== 33) { Log.warn(`Identity key is ${publicIdentityKey.byteLength} byte long.`); } let identityKey = new IdentityKey({ publicKey: publicIdentityKey }); return this.store.saveIdentity(address, identityKey); } public loadPreKey(keyId: number): Promise<undefined | IPreKeyPair> { let preKey = this.store.getPreKey(keyId); let preKeyPair; if (preKey) { preKeyPair = { pubKey: preKey.getPublic(), privKey: preKey.getPrivate(), }; } return Promise.resolve(preKeyPair); } public removePreKey(keyId: number): Promise<void> { return this.store.removePreKey(keyId); } public loadSignedPreKey(keyId: number): Promise<undefined | ISignedPreKeyPair> { let signedPreKey = this.store.getSignedPreKey(keyId); let signedPreKeyPair; if (signedPreKey) { signedPreKeyPair = { pubKey: signedPreKey.getPublic(), privKey: signedPreKey.getPrivate(), signature: signedPreKey.getSignature(), }; } return signedPreKeyPair; } public loadSession(identifier: string): Promise<string | undefined> { return this.store.loadSession(identifier); } public storeSession(identifier: string, session: string): Promise<void> { return this.store.storeSession(identifier, session); } }