diff --git a/README.md b/README.md index 8a8e10c..d6673df 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,25 @@ Iris is a fully decentralized p2p database that you can use to build all kinds o Used by [iris-messenger](https://iris.to) ([source](https://github.com/irislib/iris-messenger)), a decentralized social networking application. + +# TODO +put somewhere + + config.module.rules.push({ + test: /\.worker\.js$/, + loader: 'worker-loader', + options: { + worker: "Worker", + } + }); + config.module.rules.push({ + test: /\.sharedworker\.js$/, + loader: 'worker-loader', + options: { + worker: "SharedWorker", + } + }); + ## Installation ```sh diff --git a/dist/Channel.d.ts b/dist/Channel.d.ts index 13b7a55..41380c1 100644 --- a/dist/Channel.d.ts +++ b/dist/Channel.d.ts @@ -1,4 +1,3 @@ -import 'gun/sea'; /** * Private communication channel between two or more participants ([Gun](https://github.com/amark/gun) public keys). Can be used independently of other Iris stuff. * @@ -39,12 +38,12 @@ import 'gun/sea'; * * var gun1 = new Gun('https://gun-us.herokuapp.com/gun'); * var gun2 = new Gun('https://gun-us.herokuapp.com/gun'); -* var myKey = await iris.Key.getDefault(); +* var myKey = await Key.getDefault(); * var someoneElse = localStorage.getItem('someoneElsesKey'); * if (someoneElse) { * someoneElse = JSON.parse(someoneElse); * } else { -* someoneElse = await iris.Key.generate(); +* someoneElse = await Key.generate(); * localStorage.setItem('someoneElsesKey', JSON.stringify(someoneElse)); * } * @@ -133,14 +132,14 @@ declare class Channel { /** * */ - static getOurSecretChannelId(pub: any, pair: any): Promise; + static getOurSecretChannelId(pub: any, pair: any): Promise; /** * */ - static getTheirSecretChannelId(pub: any, pair: any): Promise; + static getTheirSecretChannelId(pub: any, pair: any): Promise; /** * Calls back with Channels that you have initiated or written to. - * @param {Object} keypair Gun.SEA keypair that the gun instance is authenticated with + * @param {Object} keypair Key keypair that the gun instance is authenticated with * @param callback callback function that is called for each public key you have a channel with */ static getChannels(callback: any, listenToChatLinks?: boolean): Promise; @@ -219,11 +218,6 @@ declare class Channel { */ getTyping(callback: any, timeout?: number): void; /** - * Add a chat button to page - * @param options {label, channelOptions} - */ - static addChatButton(options?: {}): void; - /** * Get a simple link that points to the channel. * * Direct channel: both users need to give their simple links. Use createChatLink() to get a two-way link that needs to be given by one user only. @@ -237,10 +231,6 @@ declare class Channel { getChatLinks(opts?: any): Promise; createChatLink(urlRoot?: string): Promise; /** - * Get a channel box element that you can add to your page - */ - getChatBox(): HTMLElement; - /** * Set the user's online/active status * @param {string} activity string: set the activity status every 3 seconds, null/false: stop updating */ diff --git a/dist/Key.d.ts b/dist/Key.d.ts index 22148d8..74094db 100644 --- a/dist/Key.d.ts +++ b/dist/Key.d.ts @@ -1,14 +1,25 @@ -import 'gun/sea'; -declare class Key { - static getActiveKey(datadir?: string, keyfile?: string, fs?: any): Promise; - static getDefault(datadir?: string, keyfile?: string): Promise; - static getActivePub(datadir?: string, keyfile?: string): Promise; - static setActiveKey(key: any, save: boolean | undefined, datadir: string | undefined, keyfile: string | undefined, fs: any): void; - static toString(key: any): string; - static getId(key: any): any; - static fromString(str: string): any; - static generate(): Promise; - static sign(msg: any, pair: any): Promise; - static verify(msg: any, pubKey: any): Promise; -} -export default Key; +/// +declare const _default: { + getActiveKey(datadir?: string, keyfile?: string, fs?: any): Promise; + getDefault(datadir?: string, keyfile?: string): Promise; + getActivePub(datadir?: string, keyfile?: string): Promise; + setActiveKey(key: any, save: boolean | undefined, datadir: string | undefined, keyfile: string | undefined, fs: any): void; + toString(key: any): string; + getId(key: any): any; + fromString(str: string): any; + generate(): Promise<{ + pub: any; + priv: any; + epub: any; + epriv: any; + } | undefined>; + keyToJwk(key: any): JsonWebKey; + sign(data: any, pair: any, cb?: Function | undefined, opt?: any): Promise; + verify(data: any, pair: any, cb?: Function | undefined, opt?: any): Promise; + secret(key: any, pair: any): Promise; + aeskey(key: any, salt?: Buffer | undefined): Promise; + random(len: number): Buffer; + encrypt(data: any, pair: any, cb?: Function | undefined, opt?: any): Promise; + decrypt(data: any, pair: any, cb?: Function | undefined, opt?: any): Promise; +}; +export default _default; diff --git a/dist/Node.d.ts b/dist/Node.d.ts deleted file mode 100644 index 73a17a1..0000000 --- a/dist/Node.d.ts +++ /dev/null @@ -1,54 +0,0 @@ -declare type MyEventListener = { - off: Function; -}; -/** - Our very own implementation of the Gun API - */ -export default class Node { - id: string; - parent: Node | null; - children: Map; - on_subscriptions: Map; - map_subscriptions: Map; - value: any; - counter: number; - loaded: boolean; - /** */ - constructor(id?: string, parent?: Node | null); - saveLocalForage: () => void; - loadLocalForage: () => void; - doCallbacks: () => void; - /** - * - * @param key - * @returns {Node} - * @example node.get('users').get('alice').put({name: 'Alice'}) - */ - get(key: any): Node; - /** - * Set a value to the node. If the value is an object, it will be converted to child nodes. - * @param value - * @example node.get('users').get('alice').put({name: 'Alice'}) - */ - put(value: any): void; - /** - * Return a value without subscribing to it - * @param callback - * @param event - * @param returnIfUndefined - * @returns {Promise<*>} - */ - once(callback?: Function, event?: MyEventListener, returnIfUndefined?: boolean): Promise; - /** - * Subscribe to a value - * @param callback - */ - on(callback: Function): void; - /** - * Subscribe to the children of a node. Callback is called separately for each child. - * @param callback - * @returns {Promise} - */ - map(callback: Function): Promise; -} -export {}; diff --git a/dist/SignedMessage.d.ts b/dist/SignedMessage.d.ts index aa64f5b..be5f807 100644 --- a/dist/SignedMessage.d.ts +++ b/dist/SignedMessage.d.ts @@ -1,4 +1,3 @@ -import Attribute from './Attribute'; /** * Signed message object. Your friends can index and relay your messages, while others can still verify that they were signed by you. * @@ -15,48 +14,16 @@ import Attribute from './Attribute'; * Constructor: creates a message from the param obj.signedData that must contain at least the mandatory fields: author, type and time. * @param obj * -* @example -* https://github.com/irislib/iris-lib/blob/master/__tests__/SignedMessage.js -* -* Verification message: -* { -* signedData: { -* author: {name:'Alice', key:'ABCD1234'}, -* recipient: { -* name: 'Bob', -* email: ['bob@example.com', 'bob.saget@example.com'], -* bitcoin: '1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa' -* }, -* type: 'verification' -* }, -* signer: 'ABCD1234', -* signature: '1234ABCD' -* } */ declare class SignedMessage { signedData: any; pubKey: any; sig: any; constructor(obj: any); - static _getArray(authorOrRecipient: any): Attribute[]; - static _getIterable(authorOrRecipient: any): { - [Symbol.iterator](): Generator; - }; - getAuthorIterable(): { - [Symbol.iterator](): Generator; - }; - getRecipientIterable(): { - [Symbol.iterator](): Generator; - }; - getAuthorArray(): Attribute[]; - getRecipientArray(): Attribute[]; getSignerKeyID(): any; _validate(): boolean; - isPositive(): boolean; - isNegative(): boolean; - isNeutral(): boolean; /** - * @param {Object} key Gun.SEA keypair to sign the message with + * @param {Object} key keypair to sign the message with */ sign(key: any): Promise; /** @@ -66,8 +33,6 @@ declare class SignedMessage { * @returns {Promise} message */ static create(signedData: any, signingKey: any): Promise; - static createVerification(signedData: any, signingKey: any): Promise; - static createRating(signedData: any, signingKey: any): Promise; getAuthor(index: any): any; getRecipient(index: any): any; /** @@ -93,6 +58,5 @@ declare class SignedMessage { */ static deserialize(s: any): Promise; static fromString(s: any): Promise; - static setReaction(gun: any, msg: any, reaction: any): Promise; } export default SignedMessage; diff --git a/dist/db/Actor.d.ts b/dist/db/Actor.d.ts new file mode 100644 index 0000000..8090bc9 --- /dev/null +++ b/dist/db/Actor.d.ts @@ -0,0 +1,8 @@ +import { Message } from './Message'; +export declare function generateUuid(): string; +export declare class Actor { + id: string; + handle(_message: Message): void; + postMessage(message: Message): void; + constructor(id?: string); +} diff --git a/dist/db/Message.d.ts b/dist/db/Message.d.ts new file mode 100644 index 0000000..3fb4e16 --- /dev/null +++ b/dist/db/Message.d.ts @@ -0,0 +1,50 @@ +import { Actor } from './Actor'; +import { Children } from "./Node"; +export declare class Message { + static fromObject(obj: any): Message; + static deserialize(str: string, from: Actor): Promise; + serialize(): string; +} +export declare class Get implements Message { + type: string; + id: string; + nodeId: string; + from: Actor; + recipients?: string[]; + childKey?: string; + jsonStr?: string; + checksum?: string; + serialize(): string; + static deserialize(obj: any, jsonStr: string, from: Actor): Promise; + static fromObject(obj: any): Get; + static new(nodeId: string, from: Actor, recipients?: string[], childKey?: string, jsonStr?: string, checksum?: string): Get; + constructor(id: string, nodeId: string, from: Actor, recipients?: string[], childKey?: string, jsonStr?: string, checksum?: string); +} +export declare type UpdatedNodes = { + [key: string]: Children; +}; +export declare class Put implements Message { + type: string; + id: string; + from: Actor; + updatedNodes: UpdatedNodes; + inResponseTo?: string; + recipients?: string[]; + jsonStr?: string; + checksum?: string; + serialize(): string; + static deserialize(obj: any, jsonStr: string, from: Actor): Promise; + static fromObject(obj: any): Put; + static new(updatedNodes: UpdatedNodes, from: Actor, inResponseTo?: string, recipients?: string[], jsonStr?: string, checksum?: string): Put; + static newFromKv(key: string, children: Children, from: Actor): Put; + constructor(id: string, updatedNodes: UpdatedNodes, from: Actor, inResponseTo?: string, recipients?: string[], jsonStr?: string, checksum?: string); +} +export declare class Hi implements Message { + type: string; + peerId: string; + jsonStr?: string; + serialize(): string; + static deserialize(obj: any): Hi; + constructor(peerId: string, jsonStr?: string); +} +export declare function messageFromJsonString(jsonStr: string, from: Actor): Message; diff --git a/dist/db/Node.d.ts b/dist/db/Node.d.ts new file mode 100644 index 0000000..d9eb4a7 --- /dev/null +++ b/dist/db/Node.d.ts @@ -0,0 +1,47 @@ +import { Actor } from './Actor'; +import { Message } from './Message'; +import Router from './Router'; +export declare type NodeData = { + value: any; + updatedAt: number; +}; +export declare type Children = { + [key: string]: NodeData; +}; +export declare type Config = { + peerId?: string; + allowPublicSpace: boolean; + myPublicKey?: string; + enableStats: boolean; + webSocketPeers?: string[]; + localOnly: boolean; +}; +export declare const DEFAULT_CONFIG: Config; +export default class Node extends Actor { + root: Node; + parent?: Node; + children: Map; + once_subscriptions: Map; + on_subscriptions: Map; + map_subscriptions: Map; + counter: number; + config: Config; + currentUser: any; + router: Router; + constructor(id?: string, config?: Config, parent?: Node); + getCurrentUser(): any; + setCurrentUser(key: any): void; + handle(message: Message): void; + get(key: string): Node; + user(pub: string | undefined): Node; + auth(key: any): void; + doCallbacks: (data: NodeData, key: string) => void; + put(value: any): Promise; + private signIfNeeded; + private addParentNodes; + private request; + once(callback?: Function | null): Promise; + on(callback: Function): void; + map(callback: Function): void; + opt(opts: any): void; +} diff --git a/dist/db/Router.d.ts b/dist/db/Router.d.ts new file mode 100644 index 0000000..f4d0aea --- /dev/null +++ b/dist/db/Router.d.ts @@ -0,0 +1,17 @@ +import { Actor } from "./Actor"; +import { Put, Get, Message } from "./Message"; +export default class Router extends Actor { + storageAdapters: Set; + networkAdapters: Set; + serverPeers: Set; + seenMessages: Set; + seenGetMessages: Map; + subscribersByTopic: Map>; + msgCounter: number; + peerId: string; + constructor(config?: any); + handle(message: Message): void; + handlePut(put: Put): void; + opt(opts: any): void; + handleGet(get: Get): void; +} diff --git a/dist/db/adapters/IndexedDB.d.ts b/dist/db/adapters/IndexedDB.d.ts new file mode 100644 index 0000000..ecb4c38 --- /dev/null +++ b/dist/db/adapters/IndexedDB.d.ts @@ -0,0 +1,28 @@ +import { Put, Get, Message } from '../Message'; +import { Actor } from '../Actor'; +import Dexie from 'dexie'; +import { Children, NodeData } from "../Node"; +declare class MyDexie extends Dexie { + nodes: Dexie.Table; + constructor(dbName: string); +} +export default class IndexedDB extends Actor { + config: {}; + notStored: Set; + putQueue: any; + getQueue: any; + i: number; + queue: number; + db: MyDexie; + constructor(config?: any); + put(nodeId: string, value: any): void; + throttledPut: () => void; + get(path: string, callback: Function): void; + throttledGet: () => void; + handle(message: Message): void; + handleGet(message: Get): void; + mergeAndSave(path: string, children: Children): void; + savePath(path: string, value: any): void; + handlePut(put: Put): Promise; +} +export {}; diff --git a/dist/db/adapters/Memory.d.ts b/dist/db/adapters/Memory.d.ts new file mode 100644 index 0000000..0f087ff --- /dev/null +++ b/dist/db/adapters/Memory.d.ts @@ -0,0 +1,13 @@ +import { Put, Get, Message } from '../Message'; +import { Actor } from '../Actor'; +import QuickLRU from 'quick-lru'; +import { Children } from "../Node"; +export default class Memory extends Actor { + config: {}; + store: QuickLRU; + constructor(config?: any); + handle(message: Message): void; + handleGet(message: Get): void; + mergeAndSave(nodeName: string, children: Children): void; + handlePut(put: Put): Promise; +} diff --git a/dist/db/adapters/Websocket.d.ts b/dist/db/adapters/Websocket.d.ts new file mode 100644 index 0000000..d346adb --- /dev/null +++ b/dist/db/adapters/Websocket.d.ts @@ -0,0 +1,9 @@ +import { Message } from "../Message"; +import { Actor } from "../Actor"; +export default class Websocket extends Actor { + ws: WebSocket; + router: Actor; + sendQueue: string[]; + constructor(url: string, router: Actor); + handle(message: Message): void; +} diff --git a/dist/electron.d.ts b/dist/electron.d.ts index faad0f5..bab19fa 100644 --- a/dist/electron.d.ts +++ b/dist/electron.d.ts @@ -1,2 +1,3 @@ -declare const electron: import("gun").IGunChain, import("gun").IGunInstance, "state"> | null; +import Node from "./db/Node"; +declare const electron: Node | null; export default electron; diff --git a/dist/global.d.ts b/dist/global.d.ts index 03a5782..f0e7518 100644 --- a/dist/global.d.ts +++ b/dist/global.d.ts @@ -1,7 +1 @@ -import 'gun/sea'; -import 'gun/lib/yson'; -import 'gun/lib/radix'; -import 'gun/lib/radisk'; -import 'gun/lib/store'; -import 'gun/lib/rindexed'; export default function (opts?: any): any; diff --git a/dist/index.d.ts b/dist/index.d.ts index 67cc091..830e428 100644 --- a/dist/index.d.ts +++ b/dist/index.d.ts @@ -1,4 +1,3 @@ -import 'gun/sea'; import local from './local'; import global from './global'; import publicState from './public'; @@ -6,7 +5,8 @@ import group from './group'; import privateState from './private'; import SignedMessage from './SignedMessage'; import Channel from './Channel'; -import Node from './Node'; +import Node from './db/Node'; +import Key from './Key'; declare const _default: { local: typeof local; global: typeof global; @@ -17,7 +17,7 @@ declare const _default: { get(hash: string, callback: Function): Promise; put(value: any): Promise; }; - electron: import("gun").IGunChain, import("gun").IGunInstance, "state"> | null; + electron: Node | null; peers: { known: { [key: string]: { @@ -89,13 +89,12 @@ declare const _default: { }; util: { gunOnceDefined: (node: any) => Promise; - gunAsAnotherUser: (gun: any, key: any, f: Function) => any; getHash(str: string, format?: string): Promise; capitalize(s: string): string; generateName(): string; base64ToHex(str: string): string; + arrayBufferToBase64(buffer: any): string; getCaret(el: HTMLInputElement): any; - injectCss(): void; getUrlParameter(sParam: string, sParams: string): string | true | undefined; formatTime(date: Date): any; formatDate(date: Date): string; @@ -128,10 +127,9 @@ declare const _default: { getWebPushSubscriptions: () => Promise; removeSubscription: (hash: any) => void; }; - SEA: import("gun").ISEA; - Gun: import("gun").IGun; SignedMessage: typeof SignedMessage; Channel: typeof Channel; Node: typeof Node; + Key: typeof Key; }; export default _default; diff --git a/dist/iris.cjs.development.js b/dist/iris.cjs.development.js index 9b13b2e..f11ed08 100644 --- a/dist/iris.cjs.development.js +++ b/dist/iris.cjs.development.js @@ -4,14 +4,8 @@ Object.defineProperty(exports, '__esModule', { value: true }); function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; } -var Gun = _interopDefault(require('gun')); -require('gun/sea'); -require('gun/lib/yson'); -require('gun/lib/radix'); -require('gun/lib/radisk'); -require('gun/lib/store'); -require('gun/lib/rindexed'); -var localForage = _interopDefault(require('localforage')); +var QuickLRU = _interopDefault(require('quick-lru')); +var Dexie = _interopDefault(require('dexie')); var Fuse = _interopDefault(require('fuse.js')); function _regeneratorRuntime() { @@ -408,6 +402,12 @@ function _wrapNativeSuper(Class) { }; return _wrapNativeSuper(Class); } +function _assertThisInitialized(self) { + if (self === void 0) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + return self; +} function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); @@ -522,6 +522,31 @@ var _ = { } }); return newObj; + }, + isEqual: function isEqual(a, b) { + if (a === b) { + return true; + } + if (a instanceof Date && b instanceof Date) { + return a.getTime() === b.getTime(); + } + if (!a || !b || typeof a !== 'object' && typeof b !== 'object') { + return a !== a && b !== b; + } + if (a.prototype !== b.prototype) { + return false; + } + var keys = Object.keys(a); + if (keys.length !== Object.keys(b).length) { + return false; + } + return keys.every(function (k) { + return _.isEqual(a[k], b[k]); + }); + }, + uniq: function uniq(arr) { + var set = new Set(arr); + return Array.from(set); } }; @@ -543,23 +568,6 @@ var isMobile = !isNode && /*#__PURE__*/function () { })(navigator.userAgent || navigator.vendor || ''); return check; }(); -function gunAsAnotherUser(gun, key, f) { - var gun2 = new Gun({ - radisk: false, - peers: Object.keys(gun._.opt.peers) - }); // TODO: copy other options too - var user = gun2.user(); - user.auth(key); - setTimeout(function () { - // @ts-ignore - var peers = Object.values(gun2.back('opt.peers')); - peers.forEach(function (peer) { - // @ts-ignore - gun2.on('bye', peer); - }); - }, 20000); - return f(user); -} function gunOnceDefined(node) { return new Promise(function (resolve) { node.on(function (val, _k, _a, eve) { @@ -574,11 +582,10 @@ var animals = ['canidae', 'felidae', 'cat', 'cattle', 'dog', 'donkey', 'goat', ' var adjectives = ['average', 'big', 'colossal', 'fat', 'giant', 'gigantic', 'great', 'huge', 'immense', 'large', 'little', 'long', 'mammoth', 'massive', 'miniature', 'petite', 'puny', 'short', 'small', 'tall', 'tiny', 'boiling', 'breezy', 'broken', 'bumpy', 'chilly', 'cold', 'cool', 'creepy', 'crooked', 'cuddly', 'curly', 'damaged', 'damp', 'dirty', 'dry', 'dusty', 'filthy', 'flaky', 'fluffy', 'wet', 'broad', 'chubby', 'crooked', 'curved', 'deep', 'flat', 'high', 'hollow', 'low', 'narrow', 'round', 'shallow', 'skinny', 'square', 'steep', 'straight', 'wide', 'ancient', 'brief', 'early', 'fast', 'late', 'long', 'modern', 'old', 'quick', 'rapid', 'short', 'slow', 'swift', 'young', 'abundant', 'empty', 'few', 'heavy', 'light', 'many', 'numerous', 'Sound', 'cooing', 'deafening', 'faint', 'harsh', 'hissing', 'hushed', 'husky', 'loud', 'melodic', 'moaning', 'mute', 'noisy', 'purring', 'quiet', 'raspy', 'resonant', 'screeching', 'shrill', 'silent', 'soft', 'squealing', 'thundering', 'voiceless', 'whispering', 'bitter', 'delicious', 'fresh', 'juicy', 'ripe', 'rotten', 'salty', 'sour', 'spicy', 'stale', 'sticky', 'strong', 'sweet', 'tasteless', 'tasty', 'thirsty', 'fluttering', 'fuzzy', 'greasy', 'grubby', 'hard', 'hot', 'icy', 'loose', 'melted', 'plastic', 'prickly', 'rainy', 'rough', 'scattered', 'shaggy', 'shaky', 'sharp', 'shivering', 'silky', 'slimy', 'slippery', 'smooth', 'soft', 'solid', 'steady', 'sticky', 'tender', 'tight', 'uneven', 'weak', 'wet', 'wooden', 'afraid', 'angry', 'annoyed', 'anxious', 'arrogant', 'ashamed', 'awful', 'bad', 'bewildered', 'bored', 'combative', 'condemned', 'confused', 'creepy', 'cruel', 'dangerous', 'defeated', 'defiant', 'depressed', 'disgusted', 'disturbed', 'eerie', 'embarrassed', 'envious', 'evil', 'fierce', 'foolish', 'frantic', 'frightened', 'grieving', 'helpless', 'homeless', 'hungry', 'hurt', 'ill', 'jealous', 'lonely', 'mysterious', 'naughty', 'nervous', 'obnoxious', 'outrageous', 'panicky', 'repulsive', 'scary', 'scornful', 'selfish', 'sore', 'tense', 'terrible', 'thoughtless', 'tired', 'troubled', 'upset', 'uptight', 'weary', 'wicked', 'worried', 'agreeable', 'amused', 'brave', 'calm', 'charming', 'cheerful', 'comfortable', 'cooperative', 'courageous', 'delightful', 'determined', 'eager', 'elated', 'enchanting', 'encouraging', 'energetic', 'enthusiastic', 'excited', 'exuberant', 'fair', 'faithful', 'fantastic', 'fine', 'friendly', 'funny', 'gentle', 'glorious', 'good', 'happy', 'healthy', 'helpful', 'hilarious', 'jolly', 'joyous', 'kind', 'lively', 'lovely', 'lucky', 'obedient', 'perfect', 'pleasant', 'proud', 'relieved', 'silly', 'smiling', 'splendid', 'successful', 'thoughtful', 'victorious', 'vivacious', 'witty', 'wonderful', 'zealous', 'zany', 'other', 'good', 'new', 'old', 'great', 'high', 'small', 'different', 'large', 'local', 'social', 'important', 'long', 'young', 'national', 'british', 'right', 'early', 'possible', 'big', 'little', 'political', 'able', 'late', 'general', 'full', 'far', 'low', 'public', 'available', 'bad', 'main', 'sure', 'clear', 'major', 'economic', 'only', 'likely', 'real', 'black', 'particular', 'international', 'special', 'difficult', 'certain', 'open', 'whole', 'white', 'free', 'short', 'easy', 'strong', 'european', 'central', 'similar', 'human', 'common', 'necessary', 'single', 'personal', 'hard', 'private', 'poor', 'financial', 'wide', 'foreign', 'simple', 'recent', 'concerned', 'american', 'various', 'close', 'fine', 'english', 'wrong', 'present', 'royal', 'natural', 'individual', 'nice', 'french', 'nihilist', 'solipsist', 'materialist', 'surrealist', 'heroic', 'awesome', 'hedonist', 'absurd', 'current', 'modern', 'labour', 'legal', 'happy', 'final', 'red', 'normal', 'serious', 'previous', 'total', 'prime', 'significant', 'industrial', 'sorry', 'dead', 'specific', 'appropriate', 'top', 'soviet', 'basic', 'military', 'original', 'successful', 'aware', 'hon', 'popular', 'heavy', 'professional', 'direct', 'dark', 'cold', 'ready', 'green', 'useful', 'effective', 'western', 'traditional', 'scottish', 'german', 'independent', 'deep', 'interesting', 'considerable', 'involved', 'physical', 'hot', 'existing', 'responsible', 'complete', 'medical', 'blue', 'extra', 'past', 'male', 'interested', 'fair', 'essential', 'beautiful', 'civil', 'primary', 'obvious', 'future', 'environmental', 'positive', 'senior', 'nuclear', 'annual', 'relevant', 'huge', 'rich', 'commercial', 'safe', 'regional', 'practical', 'official', 'separate', 'key', 'chief', 'regular', 'due', 'additional', 'active', 'powerful', 'complex', 'standard', 'impossible', 'light', 'warm', 'middle', 'fresh', 'sexual', 'front', 'domestic', 'actual', 'united', 'technical', 'ordinary', 'cheap', 'strange', 'internal', 'excellent', 'quiet', 'soft', 'potential', 'northern', 'religious', 'quick', 'very', 'famous', 'cultural', 'proper', 'broad', 'joint', 'formal', 'limited', 'conservative', 'lovely', 'usual', 'ltd', 'unable', 'rural', 'initial', 'substantial', 'bright', 'average', 'leading', 'reasonable', 'immediate', 'suitable', 'equal', 'detailed', 'working', 'overall', 'female', 'afraid', 'democratic', 'growing', 'sufficient', 'scientific', 'eastern', 'correct', 'inc', 'irish', 'expensive', 'educational', 'mental', 'dangerous', 'critical', 'increased', 'familiar', 'unlikely', 'double', 'perfect', 'slow', 'tiny', 'dry', 'historical', 'thin', 'daily', 'southern', 'increasing', 'wild', 'alone', 'urban', 'empty', 'married', 'narrow', 'liberal', 'supposed', 'upper', 'apparent', 'tall', 'busy', 'bloody', 'prepared', 'russian', 'moral', 'careful', 'clean', 'attractive', 'japanese', 'vital', 'thick', 'alternative', 'fast', 'ancient', 'elderly', 'rare', 'external', 'capable', 'brief', 'wonderful', 'grand', 'typical', 'entire', 'grey', 'constant', 'vast', 'surprised', 'ideal', 'terrible', 'academic', 'funny', 'minor', 'pleased', 'severe', 'ill', 'corporate', 'negative', 'permanent', 'weak', 'brown', 'fundamental', 'odd', 'crucial', 'inner', 'used', 'criminal', 'contemporary', 'sharp', 'sick', 'near', 'roman', 'massive', 'unique', 'secondary', 'parliamentary', 'african', 'unknown', 'subsequent', 'angry', 'alive', 'guilty', 'lucky', 'enormous', 'well', 'yellow', 'unusual', 'net', 'tough', 'dear', 'extensive', 'glad', 'remaining', 'agricultural', 'alright', 'healthy', 'italian', 'principal', 'tired', 'efficient', 'comfortable', 'chinese', 'relative', 'friendly', 'conventional', 'willing', 'sudden', 'proposed', 'voluntary', 'slight', 'valuable', 'dramatic', 'golden', 'temporary', 'federal', 'keen', 'flat', 'silent', 'indian', 'worried', 'pale', 'statutory', 'welsh', 'dependent', 'firm', 'wet', 'competitive', 'armed', 'radical', 'outside', 'acceptable', 'sensitive', 'living', 'pure', 'global', 'emotional', 'sad', 'secret', 'rapid', 'adequate', 'fixed', 'sweet', 'administrative', 'wooden', 'remarkable', 'comprehensive', 'surprising', 'solid', 'rough', 'mere', 'mass', 'brilliant', 'maximum', 'absolute', 'electronic', 'visual', 'electric', 'cool', 'spanish', 'literary', 'continuing', 'supreme', 'chemical', 'genuine', 'exciting', 'written', 'advanced', 'extreme', 'classical', 'fit', 'favourite', 'widespread', 'confident', 'straight', 'proud', 'numerous', 'opposite', 'distinct', 'mad', 'helpful', 'given', 'disabled', 'consistent', 'anxious', 'nervous', 'awful', 'stable', 'constitutional', 'satisfied', 'conscious', 'developing', 'strategic', 'holy', 'smooth', 'dominant', 'remote', 'theoretical', 'outstanding', 'pink', 'pretty', 'clinical', 'minimum', 'honest', 'impressive', 'related', 'residential', 'extraordinary', 'plain', 'visible', 'accurate', 'distant', 'still', 'greek', 'complicated', 'musical', 'precise', 'gentle', 'broken', 'live', 'silly', 'fat', 'tight', 'monetary', 'round', 'psychological', 'violent', 'unemployed', 'inevitable', 'junior', 'sensible', 'grateful', 'pleasant', 'dirty', 'structural', 'welcome', 'deaf', 'above', 'continuous', 'blind', 'overseas', 'mean', 'entitled', 'delighted', 'loose', 'occasional', 'evident', 'desperate', 'fellow', 'universal', 'square', 'steady', 'classic', 'equivalent', 'intellectual', 'victorian', 'level', 'ultimate', 'creative', 'lost', 'medieval', 'clever', 'linguistic', 'convinced', 'judicial', 'raw', 'sophisticated', 'asleep', 'vulnerable', 'illegal', 'outer', 'revolutionary', 'bitter', 'changing', 'australian', 'native', 'imperial', 'strict', 'wise', 'informal', 'flexible', 'collective', 'frequent', 'experimental', 'spiritual', 'intense', 'rational', 'generous', 'inadequate', 'prominent', 'logical', 'bare', 'historic', 'modest', 'dutch', 'acute', 'electrical', 'valid', 'weekly', 'gross', 'automatic', 'loud', 'reliable', 'mutual', 'liable', 'multiple', 'ruling', 'curious', 'sole', 'managing', 'pregnant', 'latin', 'nearby', 'exact', 'underlying', 'identical', 'satisfactory', 'marginal', 'distinctive', 'electoral', 'urgent', 'presidential', 'controversial', 'everyday', 'encouraging', 'organic', 'continued', 'expected', 'statistical', 'desirable', 'innocent', 'improved', 'exclusive', 'marked', 'experienced', 'unexpected', 'superb', 'sheer', 'disappointed', 'frightened', 'gastric', 'romantic', 'naked', 'reluctant', 'magnificent', 'convenient', 'established', 'closed', 'uncertain', 'artificial', 'diplomatic', 'tremendous', 'marine', 'mechanical', 'retail', 'institutional', 'mixed', 'required', 'biological', 'known', 'functional', 'straightforward', 'superior', 'digital', 'spectacular', 'unhappy', 'confused', 'unfair', 'aggressive', 'spare', 'painful', 'abstract', 'asian', 'associated', 'legislative', 'monthly', 'intelligent', 'hungry', 'explicit', 'nasty', 'just', 'faint', 'coloured', 'ridiculous', 'amazing', 'comparable', 'successive', 'realistic', 'back', 'decent', 'decentralized', 'bitcoin', 'cypherpunk', 'unnecessary', 'flying', 'random', 'influential', 'dull', 'genetic', 'neat', 'marvellous', 'crazy', 'damp', 'giant', 'secure', 'bottom', 'skilled', 'subtle', 'elegant', 'brave', 'lesser', 'parallel', 'steep', 'intensive', 'casual', 'tropical', 'lonely', 'partial', 'preliminary', 'concrete', 'alleged', 'assistant', 'vertical', 'upset', 'delicate', 'mild', 'occupational', 'excessive', 'progressive', 'exceptional', 'integrated', 'striking', 'continental', 'okay', 'harsh', 'combined', 'fierce', 'handsome', 'characteristic', 'chronic', 'compulsory', 'interim', 'objective', 'splendid', 'magic', 'systematic', 'obliged', 'payable', 'fun', 'horrible', 'primitive', 'fascinating', 'ideological', 'metropolitan', 'surrounding', 'estimated', 'peaceful', 'premier', 'operational', 'technological', 'kind', 'advisory', 'hostile', 'precious', 'accessible', 'determined', 'excited', 'impressed', 'provincial', 'smart', 'endless', 'isolated', 'drunk', 'geographical', 'like', 'dynamic', 'boring', 'forthcoming', 'unfortunate', 'definite', 'super', 'notable', 'indirect', 'stiff', 'wealthy', 'awkward', 'lively', 'neutral', 'artistic', 'content', 'mature', 'colonial', 'ambitious', 'evil', 'magnetic', 'verbal', 'legitimate', 'sympathetic', 'empirical', 'head', 'shallow', 'vague', 'naval', 'depressed', 'shared', 'added', 'shocked', 'mid', 'worthwhile', 'qualified', 'missing', 'blank', 'absent', 'favourable', 'polish', 'israeli', 'developed', 'profound', 'representative', 'enthusiastic', 'dreadful', 'rigid', 'reduced', 'cruel', 'coastal', 'peculiar', 'swiss', 'crude', 'extended', 'selected', 'eager', 'canadian', 'bold', 'relaxed', 'corresponding', 'running', 'planned', 'applicable', 'immense', 'allied', 'comparative', 'uncomfortable', 'conservation', 'productive', 'beneficial', 'bored', 'charming', 'minimal', 'mobile', 'turkish', 'orange', 'rear', 'passive', 'suspicious', 'overwhelming', 'fatal', 'resulting', 'symbolic', 'registered', 'neighbouring', 'calm', 'irrelevant', 'patient', 'compact', 'profitable', 'rival', 'loyal', 'moderate', 'distinguished', 'interior', 'noble', 'insufficient', 'eligible', 'mysterious', 'varying', 'managerial', 'molecular', 'olympic', 'linear', 'prospective', 'printed', 'parental', 'diverse', 'elaborate', 'furious', 'fiscal', 'burning', 'useless', 'semantic', 'embarrassed', 'inherent', 'philosophical', 'deliberate', 'awake', 'variable', 'promising', 'unpleasant', 'varied', 'sacred', 'selective', 'inclined', 'tender', 'hidden', 'worthy', 'intermediate', 'sound', 'protective', 'fortunate', 'slim', 'defensive', 'divine', 'stuck', 'driving', 'invisible', 'misleading', 'circular', 'mathematical', 'inappropriate', 'liquid', 'persistent', 'solar', 'doubtful', 'manual', 'architectural', 'intact', 'incredible', 'devoted', 'prior', 'tragic', 'respectable', 'optimistic', 'convincing', 'unacceptable', 'decisive', 'competent', 'spatial', 'respective', 'binding', 'relieved', 'nursing', 'toxic', 'select', 'redundant', 'integral', 'then', 'probable', 'amateur', 'fond', 'passing', 'specified', 'territorial', 'horizontal', 'inland', 'cognitive', 'regulatory', 'miserable', 'resident', 'polite', 'scared', 'gothic', 'civilian', 'instant', 'lengthy', 'adverse', 'korean', 'unconscious', 'anonymous', 'aesthetic', 'orthodox', 'static', 'unaware', 'costly', 'fantastic', 'foolish', 'fashionable', 'causal', 'compatible', 'wee', 'implicit', 'dual', 'ok', 'cheerful', 'subjective', 'forward', 'surviving', 'exotic', 'purple', 'cautious', 'visiting', 'aggregate', 'ethical', 'teenage', 'dying', 'disastrous', 'delicious', 'confidential', 'underground', 'thorough', 'grim', 'autonomous', 'atomic', 'frozen', 'colourful', 'injured', 'uniform', 'ashamed', 'glorious', 'wicked', 'coherent', 'rising', 'shy', 'novel', 'balanced', 'delightful', 'arbitrary', 'adjacent', 'worrying', 'weird', 'unchanged', 'rolling', 'evolutionary', 'intimate', 'sporting', 'disciplinary', 'formidable', 'lexical', 'noisy', 'gradual', 'accused', 'homeless', 'supporting', 'coming', 'renewed', 'excess', 'retired', 'rubber', 'chosen', 'outdoor', 'embarrassing', 'preferred', 'bizarre', 'appalling', 'agreed', 'imaginative', 'governing', 'accepted', 'vocational', 'mighty', 'puzzled', 'worldwide', 'organisational', 'sunny', 'eldest', 'eventual', 'spontaneous', 'vivid', 'rude', 'faithful', 'ministerial', 'innovative', 'controlled', 'conceptual', 'unwilling', 'civic', 'meaningful', 'alive', 'brainy', 'breakable', 'busy', 'careful', 'cautious', 'clever', 'concerned', 'crazy', 'curious', 'dead', 'different', 'difficult', 'doubtful', 'easy', 'famous', 'fragile', 'helpful', 'helpless', 'important', 'impossible', 'innocent', 'inquisitive', 'modern', 'open', 'outstanding', 'poor', 'powerful', 'puzzled', 'real', 'rich', 'shy', 'sleepy', 'super', 'tame', 'uninterested', 'wandering', 'wild', 'wrong', 'adorable', 'alert', 'average', 'beautiful', 'blonde', 'bloody', 'blushing', 'bright', 'clean', 'clear', 'cloudy', 'colorful', 'crowded', 'cute', 'dark', 'drab', 'distinct', 'dull', 'elegant', 'fancy', 'filthy', 'glamorous', 'gleaming', 'graceful', 'grotesque', 'homely', 'light', 'misty', 'motionless', 'muddy', 'plain', 'poised', 'quaint', 'shiny', 'smoggy', 'sparkling', 'spotless', 'stormy', 'strange', 'ugly', 'unsightly', 'unusual', 'bad', 'better', 'beautiful', 'big', 'black', 'blue', 'bright', 'clumsy', 'crazy', 'dizzy', 'dull', 'fat', 'frail', 'friendly', 'funny', 'great', 'green', 'gigantic', 'gorgeous', 'grumpy', 'handsome', 'happy', 'horrible', 'itchy', 'jittery', 'jolly', 'kind', 'long', 'lazy', 'magnificent', 'magenta', 'many', 'mighty', 'mushy', 'nasty', 'new', 'nice', 'nosy', 'nutty', 'nutritious', 'odd', 'orange', 'ordinary', 'pretty', 'precious', 'prickly', 'purple', 'quaint', 'quiet', 'quick', 'quickest', 'rainy', 'rare', 'ratty', 'red', 'roasted', 'robust', 'round', 'sad', 'scary', 'scrawny', 'short', 'silly', 'stingy', 'strange', 'striped', 'spotty', 'tart', 'tall', 'tame', 'tan', 'tender', 'testy', 'tricky', 'tough', 'ugly', 'ugliest', 'vast', 'watery', 'wasteful', 'wonderful', 'yellow', 'yummy', 'zany']; var util = { gunOnceDefined: gunOnceDefined, - gunAsAnotherUser: gunAsAnotherUser, - getHash: function getHash(str, format) { + getHash: function getHash(data, format) { var _this = this; return _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() { - var hash; + var encoder, buffer, hash; return _regeneratorRuntime().wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { @@ -586,38 +593,36 @@ var util = { if (format === void 0) { format = "base64"; } - if (str) { + if (!(data === undefined)) { _context.next = 3; break; } - return _context.abrupt("return", undefined); + throw new Error('getHash data was undefined'); case 3: - _context.next = 5; - return Gun.SEA.work(str, undefined, undefined, { - name: "SHA-256" - }); - case 5: - hash = _context.sent; - if (hash) { - _context.next = 8; - break; + if (typeof data !== 'string') { + data = JSON.stringify(data); } - throw new Error("Gun.SEA.work failed for " + str); + encoder = new TextEncoder(); + data = encoder.encode(data); + _context.next = 8; + return crypto.subtle.digest('SHA-256', data); case 8: - if (!(hash.length > 44)) { - _context.next = 10; + buffer = _context.sent; + if (!(format === 'buffer')) { + _context.next = 11; break; } - throw new Error("Gun.SEA.work returned an invalid SHA-256 hash longer than 44 chars: " + hash + ". This is probably due to a sea.js bug on Safari."); - case 10: + return _context.abrupt("return", buffer); + case 11: + hash = _this.arrayBufferToBase64(buffer); if (!(format === "hex")) { - _context.next = 12; + _context.next = 14; break; } return _context.abrupt("return", _this.base64ToHex(hash)); - case 12: + case 14: return _context.abrupt("return", hash); - case 13: + case 15: case "end": return _context.stop(); } @@ -640,6 +645,15 @@ var util = { } return result; }, + arrayBufferToBase64: function arrayBufferToBase64(buffer) { + var binary = ''; + var bytes = new Uint8Array(buffer); + var len = bytes.byteLength; + for (var i = 0; i < len; i++) { + binary += String.fromCharCode(bytes[i]); + } + return window.btoa(binary); + }, getCaret: function getCaret(el) { if (el.selectionStart) { return el.selectionStart; @@ -662,16 +676,6 @@ var util = { } return 0; }, - injectCss: function injectCss() { - var elementId = "irisStyle"; - if (document.getElementById(elementId)) { - return; - } - var sheet = document.createElement("style"); - sheet.id = elementId; - sheet.innerHTML = "\n .iris-follow-button .hover {\n display: none;\n }\n\n .iris-follow-button.following:hover .hover {\n display: inline;\n }\n\n .iris-follow-button.following:hover .nonhover {\n display: none;\n }\n\n .iris-identicon * {\n box-sizing: border-box;\n }\n\n .iris-identicon {\n vertical-align: middle;\n border-radius: 50%;\n text-align: center;\n display: inline-block;\n position: relative;\n max-width: 100%;\n }\n\n .iris-distance {\n z-index: 2;\n position: absolute;\n left:0%;\n top:2px;\n width: 100%;\n text-align: right;\n color: #fff;\n text-shadow: 0 0 1px #000;\n font-size: 75%;\n line-height: 75%;\n font-weight: bold;\n }\n\n .iris-pie {\n border-radius: 50%;\n position: absolute;\n top: 0;\n left: 0;\n box-shadow: 0px 0px 0px 0px #82FF84;\n padding-bottom: 100%;\n max-width: 100%;\n -webkit-transition: all 0.2s ease-in-out;\n -moz-transition: all 0.2s ease-in-out;\n transition: all 0.2s ease-in-out;\n }\n\n .iris-card {\n padding: 10px;\n background-color: #f7f7f7;\n color: #777;\n border: 1px solid #ddd;\n display: flex;\n flex-direction: row;\n overflow: hidden;\n }\n\n .iris-card a {\n -webkit-transition: color 150ms;\n transition: color 150ms;\n text-decoration: none;\n color: #337ab7;\n }\n\n .iris-card a:hover, .iris-card a:active {\n text-decoration: underline;\n color: #23527c;\n }\n\n .iris-pos {\n color: #3c763d;\n }\n\n .iris-neg {\n color: #a94442;\n }\n\n .iris-identicon img {\n position: absolute;\n top: 0;\n left: 0;\n max-width: 100%;\n border-radius: 50%;\n border-color: transparent;\n border-style: solid;\n }\n\n .iris-chat-open-button {\n background-color: #1e1e1e;\n color: #fff;\n padding: 15px;\n cursor: pointer;\n user-select: none;\n }\n\n .iris-chat-open-button svg {\n width: 1em;\n }\n\n .iris-chat-open-button, .iris-chat-box {\n position: fixed;\n bottom: 0.5rem;\n right: 0.5rem;\n border-radius: 8px;\n font-family: system-ui;\n font-size: 15px;\n }\n\n .iris-chat-box {\n background-color: #fff;\n max-height: 25rem;\n box-shadow: 2px 2px 20px rgba(0, 0, 0, 0.2);\n height: calc(100% - 44px);\n display: flex;\n flex-direction: column;\n width: 320px;\n color: rgb(38, 38, 38);\n }\n\n .iris-chat-box.minimized {\n height: auto;\n }\n\n .iris-chat-box.minimized .iris-chat-header {\n border-radius: 8px;\n cursor: pointer;\n }\n\n .iris-chat-box.minimized .iris-chat-messages, .iris-chat-box.minimized .iris-typing-indicator, .iris-chat-box.minimized .iris-chat-input-wrapper, .iris-chat-box.minimized .iris-chat-minimize, .iris-chat-box.minimized .iris-chat-close {\n display: none;\n }\n\n .iris-chat-header {\n background-color: #1e1e1e;\n height: 44px;\n color: #fff;\n border-radius: 8px 8px 0 0;\n text-align: center;\n display: flex;\n flex-direction: row;\n justify-content: center;\n align-items: center;\n flex: none;\n white-space: nowrap;\n text-overflow: ellipsis;\n overflow: hidden;\n }\n\n .iris-chat-header-text {\n flex: 1;\n }\n\n .iris-online-indicator {\n color: #bfbfbf;\n margin-right: 5px;\n font-size: 12px;\n user-select: none;\n flex: none;\n }\n\n .iris-online-indicator.yes {\n color: #80bf5f;\n }\n\n .iris-typing-indicator {\n display: none;\n background-color: rgba(255, 255, 255, 0.5);\n font-size: 12px;\n padding: 2px;\n color: #777;\n }\n\n .iris-typing-indicator.yes {\n display: block;\n }\n\n .iris-chat-messages {\n flex: 1;\n padding: 15px;\n overflow-y: scroll;\n }\n\n .iris-chat-input-wrapper {\n flex: none;\n padding: 15px;\n background-color: #efefef;\n display: flex;\n flex-direction: row;\n border-radius: 0 0 8px 8px;\n }\n\n .iris-chat-input-wrapper textarea {\n padding: 15px 8px;\n border-radius: 4px;\n border: 1px solid rgba(0,0,0,0);\n width: auto;\n font-size: 15px;\n resize: none;\n flex: 1;\n }\n\n .iris-chat-input-wrapper textarea:focus {\n outline: none;\n border: 1px solid #6dd0ed;\n }\n\n .iris-chat-input-wrapper button svg {\n display: inline-block;\n font-size: inherit;\n height: 1em;\n width: 1em;\n overflow: visible;\n vertical-align: -0.125em;\n }\n\n .iris-chat-input-wrapper button, .iris-chat-input-wrapper button:hover, .iris-chat-input-wrapper button:active, .iris-chat-input-wrapper button:focus {\n flex: none;\n color: #999;\n background-color: transparent;\n font-size: 30px;\n padding: 5px;\n border: 1px solid rgba(0,0,0,0);\n border-radius: 4px;\n margin-left: 5px;\n }\n\n .iris-chat-input-wrapper button:active, .iris-chat-input-wrapper button:focus {\n outline: none;\n border: 1px solid #6dd0ed;\n }\n\n .iris-chat-message {\n display: flex;\n flex-direction: column;\n margin-bottom: 2px;\n overflow-wrap: break-word;\n }\n\n .iris-msg-content {\n background-color: #efefef;\n padding: 6px 10px;\n border-radius: 8px;\n box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.1);\n flex: none;\n max-width: 75%;\n }\n\n .emoji {\n font-size: 1.3em;\n line-height: 1em;\n }\n\n .iris-chat-message .emoji-only {\n font-size: 3em;\n text-align: center;\n }\n\n .iris-seen {\n color: rgba(0, 0, 0, 0.45);\n user-select: none;\n }\n\n .iris-seen.yes {\n color: #4fc3f7;\n }\n\n .iris-seen svg {\n width: 18px;\n }\n\n .iris-delivered-checkmark {\n display: none;\n }\n\n .delivered .iris-delivered-checkmark {\n display: initial;\n }\n\n .iris-chat-minimize, .iris-chat-close {\n user-select: none;\n cursor: pointer;\n width: 45px;\n line-height: 44px;\n }\n\n .iris-chat-message.their {\n align-items: flex-start;\n }\n\n .iris-chat-message.their + .iris-chat-message.our .iris-msg-content, .day-separator + .iris-chat-message.our .iris-msg-content {\n margin-top: 15px;\n border-radius: 8px 0px 8px 8px;\n }\n\n .iris-chat-message.their:first-of-type .iris-msg-content {\n border-radius: 0px 8px 8px 8px;\n }\n\n .iris-chat-message.our:first-of-type .iris-msg-content {\n border-radius: 8px 0px 8px 8px;\n }\n\n .iris-chat-message.our + .iris-chat-message.their .iris-msg-content, .day-separator + .iris-chat-message.their .iris-msg-content {\n margin-top: 15px;\n border-radius: 0px 8px 8px 8px;\n }\n\n .iris-chat-message.our {\n align-items: flex-end;\n }\n\n .iris-chat-message.our .iris-msg-content {\n background-color: #c5ecf7;\n }\n\n .iris-chat-message .time {\n text-align: right;\n font-size: 12px;\n color: rgba(0, 0, 0, 0.45);\n }\n\n .iris-non-string {\n color: blue;\n }\n\n .day-separator {\n display: inline-block;\n border-radius: 8px;\n background-color: rgba(227, 249, 255, 0.91);\n padding: 6px 10px;\n margin-top: 15px;\n margin-left: auto;\n margin-right: auto;\n text-transform: uppercase;\n font-size: 13px;\n color: rgba(74, 74, 74, 0.88);\n box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.1);\n user-select: none;\n }\n\n .day-separator:first-of-type {\n margin-top: 0;\n }\n\n *[contenteditable=\"true\"]:not(:focus) {\n cursor: pointer;\n }\n\n *[contenteditable=\"true\"] {\n outline: none;\n }\n\n [placeholder]:empty:before {\n content: attr(placeholder);\n color: #999;\n }\n\n [placeholder]:empty:focus {\n cursor: text;\n }\n "; - document.head.prepend(sheet); - }, getUrlParameter: function getUrlParameter(sParam, sParams) { var sPageURL = sParams || window.location.search.substring(1); var sURLVariables = sPageURL.split('&'); @@ -821,89 +825,84 @@ var util = { } }; -var ELECTRON_GUN_URL = 'http://localhost:8767/gun'; -var maxConnectedPeers = 2; -var DEFAULT_PEERS = { - 'https://gun-rs.iris.to/gun': {}, - 'https://gun-us.herokuapp.com/gun': {} -}; -var loc = window.location; -var host = loc.host; -var is_localhost_but_not_dev = /*#__PURE__*/host.startsWith('localhost') && host !== 'localhost:8080'; -if (loc.hostname.endsWith('herokuapp.com') || is_localhost_but_not_dev) { - Object.keys(DEFAULT_PEERS).forEach(function (url) { - return DEFAULT_PEERS[url].enabled = false; - }); - DEFAULT_PEERS[loc.origin + "/gun"] = { - enabled: true - }; -} -var urlRegex = /^(https?:\/\/)?([\da-z.-]+)\.([a-z.]{2,6})([\/\w .-]*)*\/?$/; -/** - * Networking and peer management utilities - */ -var peers = { - known: {}, - /** */add: function add(peer) { +// eslint-disable-line no-unused-vars +var myKey; +var Key = { + getActiveKey: function getActiveKey(datadir, keyfile, fs) { var _this = this; return _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() { - var url, secret, encryptedUrl, encryptedUrlHash; + var privKeyFile, f, newKey, str, _newKey; return _regeneratorRuntime().wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: - if (!(peer.url && !urlRegex.test(peer.url))) { - _context.next = 2; - break; + if (datadir === void 0) { + datadir = "."; } - throw new Error("Invalid url " + peer.url); - case 2: - if (peer.from) { - Object.keys(_this.known).forEach(function (k) { - if (_this.known[k].from === peer.from) { - // remove previous peer url from the same user - delete _this.known[k]; - } - }); + if (keyfile === void 0) { + keyfile = "iris.key"; } - url = peer.url || ''; - _this.known[url] = _this.known[url] || _.omit(peer, ['url']); - if (!(peer.visibility === 'public')) { - _context.next = 19; + if (!myKey) { + _context.next = 4; break; } - _context.next = 8; - return Gun.SEA.secret(session.getKey().epub, session.getKey()); - case 8: - _context.t0 = _context.sent; - if (_context.t0) { + return _context.abrupt("return", myKey); + case 4: + if (!fs) { + _context.next = 21; + break; + } + privKeyFile = datadir + "/" + keyfile; + if (!fs.existsSync(privKeyFile)) { _context.next = 11; break; } - _context.t0 = ''; - case 11: - secret = _context.t0; - _context.next = 14; - return Gun.SEA.encrypt(peer.url, secret); - case 14: - encryptedUrl = _context.sent; + f = fs.readFileSync(privKeyFile, "utf8"); + myKey = _this.fromString(f); _context.next = 17; - return Gun.SEA.work(encryptedUrl, null, null, { - name: 'SHA-256' - }); + break; + case 11: + _context.next = 13; + return _this.generate(); + case 13: + newKey = _context.sent; + myKey = myKey || newKey; // eslint-disable-line require-atomic-updates + fs.writeFileSync(privKeyFile, _this.toString(myKey)); + fs.chmodSync(privKeyFile, 400); case 17: - encryptedUrlHash = _context.sent; - global$2().user().get('peers').get(encryptedUrlHash).put({ - url: peer.url, - lastSeen: new Date().toISOString() - }); + if (myKey) { + _context.next = 19; + break; + } + throw new Error("loading default key failed - check " + datadir + "/" + keyfile); case 19: - if (peer.enabled !== false) { - peer.url && _this.connect(peer.url); // this calls savePeers() - } else { - _this.save(); + _context.next = 33; + break; + case 21: + str = window.localStorage.getItem("iris.myKey"); + if (!str) { + _context.next = 26; + break; } - case 20: + myKey = _this.fromString(str); + _context.next = 31; + break; + case 26: + _context.next = 28; + return _this.generate(); + case 28: + _newKey = _context.sent; + myKey = myKey || _newKey; // eslint-disable-line require-atomic-updates + window.localStorage.setItem("iris.myKey", _this.toString(myKey)); + case 31: + if (myKey) { + _context.next = 33; + break; + } + throw new Error("loading default key failed - check localStorage iris.myKey"); + case 33: + return _context.abrupt("return", myKey); + case 34: case "end": return _context.stop(); } @@ -911,139 +910,1923 @@ var peers = { }, _callee); }))(); }, - /** */remove: function remove(url) { - delete this.known[url]; - this.save(); - }, - /** */disconnect: function disconnect(peerFromGun) { - global$2().on('bye', peerFromGun); - peerFromGun.url = ''; - }, - save: function save() { - localStorage.setItem('gunPeers', JSON.stringify(this.known)); - }, - getSaved: function getSaved() { - var p = localStorage.getItem('gunPeers'); - if (p && p !== 'undefined') { - p = JSON.parse(p); - } else { - p = DEFAULT_PEERS; + getDefault: function getDefault(datadir, keyfile) { + if (datadir === void 0) { + datadir = "."; } - if (util.isElectron) { - p[ELECTRON_GUN_URL] = {}; + if (keyfile === void 0) { + keyfile = "iris.key"; } - Object.keys(p).forEach(function (k) { - return _.defaults(p[k], { - enabled: true - }); - }); - return p; + return this.getActiveKey(datadir, keyfile); }, - /** */reset: function reset() { - localStorage.setItem('gunPeers', ''); - this.known = this.getSaved(); + getActivePub: function getActivePub(datadir, keyfile) { + var _this2 = this; + return _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2() { + var key; + return _regeneratorRuntime().wrap(function _callee2$(_context2) { + while (1) { + switch (_context2.prev = _context2.next) { + case 0: + if (datadir === void 0) { + datadir = "."; + } + if (keyfile === void 0) { + keyfile = "iris.key"; + } + _context2.next = 4; + return _this2.getActiveKey(datadir, keyfile); + case 4: + key = _context2.sent; + return _context2.abrupt("return", key.pub); + case 6: + case "end": + return _context2.stop(); + } + } + }, _callee2); + }))(); }, - /** */connect: function connect(url) { - if (this.isMixedContent(url)) { - return; + setActiveKey: function setActiveKey(key, save, datadir, keyfile, fs) { + if (save === void 0) { + save = true; } - if (this.known[url]) { - this.known[url].enabled = true; - global$2().opt({ - peers: [url] - }); - this.save(); - } else { - this.add({ - url: url - }); + if (datadir === void 0) { + datadir = "."; } - }, - /** */disable: function disable(url, peerFromGun) { - this.known[url].enabled = false; - if (peerFromGun) { - this.disconnect(peerFromGun); + if (keyfile === void 0) { + keyfile = "iris.key"; + } + myKey = key; + if (!save) return; + if (util.isNode) { + var privKeyFile = datadir + "/" + keyfile; + fs.writeFileSync(privKeyFile, this.toString(myKey)); + fs.chmodSync(privKeyFile, 400); + } else { + window.localStorage.setItem("iris.myKey", this.toString(myKey)); } - this.save(); }, - isMixedContent: function isMixedContent(url) { - return window.location.protocol === 'https:' && url.indexOf('http:') === 0; + toString: function toString(key) { + return JSON.stringify(key); }, - random: function random() { - var _this2 = this; - var connectToLocalElectron = util.isElectron && this.known[ELECTRON_GUN_URL] && this.known[ELECTRON_GUN_URL].enabled !== false; - var sampleSize = connectToLocalElectron ? Math.max(maxConnectedPeers - 1, 1) : maxConnectedPeers; - var sample = _.sampleSize(Object.keys(_.pickBy(this.known, function (peer, url) { - return !_this2.isMixedContent(url) && peer.enabled && !(util.isElectron && url === ELECTRON_GUN_URL); - })), sampleSize); - if (sample && connectToLocalElectron) { - sample.push(ELECTRON_GUN_URL); + getId: function getId(key) { + if (!(key && key.pub)) { + throw new Error("missing param"); } - return sample; + return key.pub; // hack until GUN supports lookups by keyID + //return util.getHash(key.pub); }, - checkGunPeerCount: function checkGunPeerCount() { - var _this3 = this; - var peersFromGun = global$2().back('opt.peers'); - var connectedPeers = Object.values(peersFromGun).filter(function (peer) { - if (peer && peer.wire && peer.wire.constructor.name !== 'WebSocket') { - console.log('WebRTC peer', peer); - } - return peer && peer.wire && peer.wire.readyState === 1 && peer.wire.bufferedAmount === 0 && peer.wire.constructor.name === 'WebSocket'; - }); - if (connectedPeers.length < maxConnectedPeers) { - var unconnectedPeers = Object.keys(this.known).filter(function (url) { - var addedToGun = Object.values(peersFromGun).map(function (peer) { - return peer.url; - }).indexOf(url) > -1; - var enabled = _this3.known[url].enabled; - var mixedContent = window.location.protocol === 'https:' && url.indexOf('http:') === 0; - return !mixedContent && enabled && !addedToGun; - }); - if (unconnectedPeers.length) { - var sample = String(_.sample(unconnectedPeers)); - this.connect(sample); - } - } - if (connectedPeers.length > maxConnectedPeers) { - this.disconnect(_.sample(connectedPeers)); - } + fromString: function fromString(str) { + return JSON.parse(str); }, - init: function init() { - var _this4 = this; - this.known = this.getSaved(); - /* use the default value of 1 for now because of memory issue - local().get('settings').get('maxConnectedPeers').on(n => { - if (n !== undefined) maxConnectedPeers = n; - }); - */ - setInterval(function () { - return _this4.checkGunPeerCount(); + // copied from Gun.SEA + generate: function generate() { + return _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee5() { + var ecdhSubtle, sa, dh, r; + return _regeneratorRuntime().wrap(function _callee5$(_context5) { + while (1) { + switch (_context5.prev = _context5.next) { + case 0: + _context5.prev = 0; + ecdhSubtle = window.crypto.subtle; // First: ECDSA keys for signing/verifying... + _context5.next = 4; + return ecdhSubtle.generateKey({ + name: 'ECDSA', + namedCurve: 'P-256' + }, true, ['sign', 'verify']).then( /*#__PURE__*/function () { + var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3(keys) { + var key, pub; + return _regeneratorRuntime().wrap(function _callee3$(_context3) { + while (1) { + switch (_context3.prev = _context3.next) { + case 0: + // privateKey scope doesn't leak out from here! + //const { d: priv } = await shim.subtle.exportKey('jwk', keys.privateKey) + key = {}; + _context3.next = 3; + return ecdhSubtle.exportKey('jwk', keys.privateKey); + case 3: + key.priv = _context3.sent.d; + _context3.next = 6; + return ecdhSubtle.exportKey('jwk', keys.publicKey); + case 6: + pub = _context3.sent; + //const pub = Buff.from([ x, y ].join(':')).toString('base64') // old + key.pub = pub.x + '.' + pub.y; // new + // x and y are already base64 + // pub is UTF8 but filename/URL safe (https://www.ietf.org/rfc/rfc3986.txt) + // but split on a non-base64 letter. + return _context3.abrupt("return", key); + case 9: + case "end": + return _context3.stop(); + } + } + }, _callee3); + })); + return function (_x) { + return _ref.apply(this, arguments); + }; + }()); + case 4: + sa = _context5.sent; + _context5.prev = 5; + _context5.next = 8; + return ecdhSubtle.generateKey({ + name: 'ECDH', + namedCurve: 'P-256' + }, true, ['deriveKey']).then( /*#__PURE__*/function () { + var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee4(keys) { + var key, pub; + return _regeneratorRuntime().wrap(function _callee4$(_context4) { + while (1) { + switch (_context4.prev = _context4.next) { + case 0: + // privateKey scope doesn't leak out from here! + key = {}; + _context4.next = 3; + return ecdhSubtle.exportKey('jwk', keys.privateKey); + case 3: + key.epriv = _context4.sent.d; + _context4.next = 6; + return ecdhSubtle.exportKey('jwk', keys.publicKey); + case 6: + pub = _context4.sent; + //const epub = Buff.from([ ex, ey ].join(':')).toString('base64') // old + key.epub = pub.x + '.' + pub.y; // new + // ex and ey are already base64 + // epub is UTF8 but filename/URL safe (https://www.ietf.org/rfc/rfc3986.txt) + // but split on a non-base64 letter. + return _context4.abrupt("return", key); + case 9: + case "end": + return _context4.stop(); + } + } + }, _callee4); + })); + return function (_x2) { + return _ref2.apply(this, arguments); + }; + }()); + case 8: + dh = _context5.sent; + _context5.next = 18; + break; + case 11: + _context5.prev = 11; + _context5.t0 = _context5["catch"](5); + if (!(_context5.t0 == 'Error: ECDH is not a supported algorithm')) { + _context5.next = 17; + break; + } + console.log('Ignoring ECDH...'); + _context5.next = 18; + break; + case 17: + throw _context5.t0; + case 18: + dh = dh || {}; + r = { + pub: sa.pub, + priv: sa.priv, + /* pubId, */epub: dh.epub, + epriv: dh.epriv + }; + return _context5.abrupt("return", r); + case 23: + _context5.prev = 23; + _context5.t1 = _context5["catch"](0); + console.log(_context5.t1); + throw _context5.t1; + case 28: + case "end": + return _context5.stop(); + } + } + }, _callee5, null, [[0, 23], [5, 11]]); + }))(); + }, + keyToJwk: function keyToJwk(key) { + if (typeof key === 'string') { + key = { + pub: key + }; + } + var jwk = { + kty: 'EC', + crv: 'P-256', + x: key.pub.split('.')[0], + y: key.pub.split('.')[1], + ext: true + }; + jwk.key_ops = key.priv ? ['sign'] : ['verify']; + if (key.priv) { + jwk.d = key.priv; + } + return jwk; + }, + sign: function sign(data, pair, cb, opt) { + var _this3 = this; + return _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee6() { + var text, jwk, hash, sig, r; + return _regeneratorRuntime().wrap(function _callee6$(_context6) { + while (1) { + switch (_context6.prev = _context6.next) { + case 0: + if (opt === void 0) { + opt = {}; + } + if (!(undefined === data)) { + _context6.next = 3; + break; + } + throw '`undefined` not allowed.'; + case 3: + text = typeof data === 'string' ? data : JSON.stringify(data); // Gun.SEA doesn't preserve data type: "0" -> 0. Should we change this? + jwk = _this3.keyToJwk(pair); + _context6.next = 7; + return util.getHash(text, 'buffer'); + case 7: + hash = _context6.sent; + _context6.next = 10; + return window.crypto.subtle.importKey('jwk', jwk, { + name: 'ECDSA', + namedCurve: 'P-256' + }, false, ['sign']).then(function (key) { + return window.crypto.subtle.sign({ + name: 'ECDSA', + hash: { + name: 'SHA-256' + } + }, key, hash); + }); + case 10: + sig = _context6.sent; + // privateKey scope doesn't leak out from here! + r = { + m: text, + s: Buffer.from(sig).toString(opt.encode || 'base64') + }; + if (!opt.raw) { + r = 'aSEA' + JSON.stringify(r); + } // "aSEA" was a dumb fix for an earlier bug in Gun.SEA + if (cb) { + try { + cb(r); + } catch (e) { + console.log(e); + } + } + return _context6.abrupt("return", r); + case 15: + case "end": + return _context6.stop(); + } + } + }, _callee6); + }))(); + }, + verify: function verify(data, pair, cb, opt) { + var _this4 = this; + return _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee7() { + var pub, jwk, key, text, hash, buf, sig, isValid, r; + return _regeneratorRuntime().wrap(function _callee7$(_context7) { + while (1) { + switch (_context7.prev = _context7.next) { + case 0: + if (opt === void 0) { + opt = {}; + } + _context7.prev = 1; + if (typeof data === 'string') { + if (data.slice(0, 4) === 'aSEA') { + data = data.slice(4); + } + try { + data = JSON.parse(data); + } catch (e) { + // not JSON + } + } + pub = pair.pub || pair; + jwk = _this4.keyToJwk(pub); + _context7.next = 7; + return crypto.subtle.importKey('jwk', jwk, { + name: 'ECDSA', + namedCurve: 'P-256' + }, false, ['verify']); + case 7: + key = _context7.sent; + text = data.m; + try { + text = JSON.parse(text); + } catch (e) { + // ignore + } + _context7.next = 12; + return util.getHash(text, 'buffer'); + case 12: + hash = _context7.sent; + buf = Buffer.from(data.s, opt.encode || 'base64'); + sig = new Uint8Array(buf); + _context7.next = 17; + return crypto.subtle.verify({ + name: 'ECDSA', + hash: { + name: 'SHA-256' + } + }, key, sig, hash); + case 17: + isValid = _context7.sent; + r = isValid ? JSON.parse(text) : undefined; + if (cb) { + try { + cb(r); + } catch (e) { + console.log(e); + } + } + return _context7.abrupt("return", r); + case 24: + _context7.prev = 24; + _context7.t0 = _context7["catch"](1); + console.log(_context7.t0); + return _context7.abrupt("return", undefined); + case 28: + case "end": + return _context7.stop(); + } + } + }, _callee7, null, [[1, 24]]); + }))(); + }, + secret: function secret(key, pair) { + return _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee9() { + var keysToEcdhJwk, pub, epub, epriv, pubJwk, props, privJwk; + return _regeneratorRuntime().wrap(function _callee9$(_context9) { + while (1) { + switch (_context9.prev = _context9.next) { + case 0: + keysToEcdhJwk = function keysToEcdhJwk(pub, d) { + //var [ x, y ] = shim.Buffer.from(pub, 'base64').toString('utf8').split(':') // old + var _pub$split = pub.split('.'), + x = _pub$split[0], + y = _pub$split[1]; // new + var jwk = Object.assign(d ? { + d: d + } : {}, { + x: x, + y: y, + kty: 'EC', + crv: 'P-256', + ext: true + }); + return jwk; + }; + pub = key.epub || key; + epub = pair.epub; + epriv = pair.epriv; + pubJwk = keysToEcdhJwk(pub); + _context9.t0 = Object; + _context9.next = 8; + return crypto.subtle.importKey('jwk', pubJwk, { + name: 'ECDH', + namedCurve: 'P-256' + }, true, []); + case 8: + _context9.t1 = _context9.sent; + _context9.t2 = { + "public": _context9.t1 + }; + _context9.t3 = { + name: 'ECDH', + namedCurve: 'P-256' + }; + props = _context9.t0.assign.call(_context9.t0, _context9.t2, _context9.t3); + privJwk = keysToEcdhJwk(epub, epriv); + return _context9.abrupt("return", crypto.subtle.importKey('jwk', privJwk, { + name: 'ECDH', + namedCurve: 'P-256' + }, false, ['deriveBits']).then( /*#__PURE__*/function () { + var _ref3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee8(privKey) { + var derivedBits, rawBits, derivedKey; + return _regeneratorRuntime().wrap(function _callee8$(_context8) { + while (1) { + switch (_context8.prev = _context8.next) { + case 0: + _context8.next = 2; + return crypto.subtle.deriveBits(props, privKey, 256); + case 2: + derivedBits = _context8.sent; + rawBits = new Uint8Array(derivedBits); + _context8.next = 6; + return crypto.subtle.importKey('raw', rawBits, { + name: 'AES-GCM', + length: 256 + }, true, ['encrypt', 'decrypt']); + case 6: + derivedKey = _context8.sent; + return _context8.abrupt("return", crypto.subtle.exportKey('jwk', derivedKey).then(function (_ref4) { + var k = _ref4.k; + return k; + })); + case 8: + case "end": + return _context8.stop(); + } + } + }, _callee8); + })); + return function (_x3) { + return _ref3.apply(this, arguments); + }; + }())); + case 14: + case "end": + return _context9.stop(); + } + } + }, _callee9); + }))(); + }, + aeskey: function aeskey(key, salt) { + var _this5 = this; + return _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee10() { + var combo, hash, keyB64, k, jwkKey; + return _regeneratorRuntime().wrap(function _callee10$(_context10) { + while (1) { + switch (_context10.prev = _context10.next) { + case 0: + combo = key + (salt || _this5.random(8)).toString('utf8'); // new + _context10.next = 3; + return crypto.subtle.digest({ + name: 'SHA-256' + }, new TextEncoder().encode(combo)); + case 3: + hash = _context10.sent; + hash = Buffer.from(hash, 'binary'); + keyB64 = hash.toString('base64'); + k = keyB64.replace(/\+/g, '-').replace(/\//g, '_').replace(/\=/g, ''); + jwkKey = { + kty: 'oct', + k: k, + ext: false, + alg: 'A256GCM' + }; + _context10.next = 10; + return crypto.subtle.importKey('jwk', jwkKey, { + name: 'AES-GCM' + }, false, ['encrypt', 'decrypt']); + case 10: + return _context10.abrupt("return", _context10.sent); + case 11: + case "end": + return _context10.stop(); + } + } + }, _callee10); + }))(); + }, + random: function random(len) { + return Buffer.from(crypto.getRandomValues(new Uint8Array(len))); + }, + encrypt: function encrypt(data, pair, cb, opt) { + var _this6 = this; + return _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee11() { + var key, msg, rand, ct, r; + return _regeneratorRuntime().wrap(function _callee11$(_context11) { + while (1) { + switch (_context11.prev = _context11.next) { + case 0: + if (opt === void 0) { + opt = {}; + } + key = pair.epriv || pair; + if (!(undefined === data)) { + _context11.next = 4; + break; + } + throw '`undefined` not allowed.'; + case 4: + msg = typeof data == 'string' ? data : JSON.stringify(data); // Gun.SEA doesn't preserve data type: "0" -> 0. Should we change this? + rand = { + s: _this6.random(9), + iv: _this6.random(15) + }; // consider making this 9 and 15 or 18 or 12 to reduce == padding. + _context11.next = 8; + return _this6.aeskey(key, rand.s).then(function (aes) { + return crypto.subtle.encrypt({ + name: opt.name || 'AES-GCM', + iv: new Uint8Array(rand.iv) + }, aes, new TextEncoder().encode(msg)); + }); + case 8: + ct = _context11.sent; + r = { + // @ts-ignore + ct: Buffer.from(ct, 'binary').toString(opt.encode || 'base64'), + iv: rand.iv.toString(opt.encode || 'base64'), + s: rand.s.toString(opt.encode || 'base64') + }; + if (!opt.raw) { + r = 'SEA' + JSON.stringify(r); + } + if (cb) { + try { + cb(r); + } catch (e) { + console.log(e); + } + } + return _context11.abrupt("return", r); + case 13: + case "end": + return _context11.stop(); + } + } + }, _callee11); + }))(); + }, + decrypt: function decrypt(data, pair, cb, opt) { + var _this7 = this; + return _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee12() { + var key, json, buf, bufiv, bufct, ct, text, r; + return _regeneratorRuntime().wrap(function _callee12$(_context12) { + while (1) { + switch (_context12.prev = _context12.next) { + case 0: + if (opt === void 0) { + opt = {}; + } + key = pair.epriv || pair; + try { + data = JSON.parse(data); + } catch (e) {} + if (data.indexOf('SEA{') === 0) { + json = JSON.parse(data.slice(3)); + } else { + json = JSON.parse(data); + } + if (!(!json.ct || !json.iv || !json.s)) { + _context12.next = 6; + break; + } + throw 'Invalid ciphertext ' + json; + case 6: + buf = Buffer.from(json.s, opt.encode || 'base64'); + bufiv = Buffer.from(json.iv, opt.encode || 'base64'); + bufct = Buffer.from(json.ct, opt.encode || 'base64'); + _context12.next = 11; + return _this7.aeskey(key, buf).then(function (aes) { + return crypto.subtle.decrypt({ + name: opt.name || 'AES-GCM', + iv: new Uint8Array(bufiv), + tagLength: 128 + }, aes, new Uint8Array(bufct)); + }); + case 11: + ct = _context12.sent; + text = new TextDecoder('utf8').decode(ct); + r = text; + try { + r = JSON.parse(text); + } catch (_e) {} + if (cb) { + try { + cb(r); + } catch (e) { + console.log(e); + } + } + return _context12.abrupt("return", r); + case 17: + case "end": + return _context12.stop(); + } + } + }, _callee12); + }))(); + } +}; + +var ELECTRON_GUN_URL = 'http://localhost:8767/gun'; +var maxConnectedPeers = 1; +var DEFAULT_PEERS = { + 'wss://gun-rs.iris.to/gun': {} +}; +if (self.window) { + var loc = window.location; + var host = loc.host; + var is_localhost_but_not_dev = /*#__PURE__*/host.startsWith('localhost') && host !== 'localhost:8080'; + if (loc.hostname.endsWith('herokuapp.com') || is_localhost_but_not_dev) { + Object.keys(DEFAULT_PEERS).forEach(function (url) { + return DEFAULT_PEERS[url].enabled = false; + }); + DEFAULT_PEERS[loc.origin + "/gun"] = { + enabled: true + }; + } +} +/** + * Networking and peer management utilities + */ +var peers = { + known: {}, + /** */add: function add(peer) { + var _this = this; + return _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() { + var url, secret, encryptedUrl, encryptedUrlHash; + return _regeneratorRuntime().wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + if (peer.from) { + Object.keys(_this.known).forEach(function (k) { + if (_this.known[k].from === peer.from) { + // remove previous peer url from the same user + delete _this.known[k]; + } + }); + } + url = peer.url || ''; + _this.known[url] = _this.known[url] || _.omit(peer, ['url']); + if (!(peer.visibility === 'public')) { + _context.next = 17; + break; + } + _context.next = 6; + return Key.secret(session.getKey().epub, session.getKey()); + case 6: + _context.t0 = _context.sent; + if (_context.t0) { + _context.next = 9; + break; + } + _context.t0 = ''; + case 9: + secret = _context.t0; + _context.next = 12; + return Key.encrypt(peer.url, secret); + case 12: + encryptedUrl = _context.sent; + _context.next = 15; + return util.getHash(encryptedUrl); + case 15: + encryptedUrlHash = _context.sent; + global$1().user().get('peers').get(encryptedUrlHash).put({ + url: peer.url, + lastSeen: new Date().toISOString() + }); + case 17: + if (peer.enabled !== false) { + peer.url && _this.connect(peer.url); // this calls savePeers() + } else { + _this.save(); + } + case 18: + case "end": + return _context.stop(); + } + } + }, _callee); + }))(); + }, + /** */remove: function remove(url) { + delete this.known[url]; + this.save(); + }, + /** */disconnect: function disconnect(peerFromGun) { + global$1().on('bye', peerFromGun); + peerFromGun.url = ''; + }, + save: function save() { + // TODO store them in iris.local() instead of localStorage + localStorage.setItem('gunPeers', JSON.stringify(this.known)); + }, + getSaved: function getSaved() { + var p = localStorage.getItem('gunPeers'); + if (p && p !== 'undefined') { + p = JSON.parse(p); + } else { + p = DEFAULT_PEERS; + } + if (util.isElectron) { + p[ELECTRON_GUN_URL] = {}; + } + Object.keys(p).forEach(function (k) { + return _.defaults(p[k], { + enabled: true + }); + }); + return p; + }, + /** */reset: function reset() { + localStorage.setItem('gunPeers', ''); + this.known = this.getSaved(); + }, + /** */connect: function connect(url) { + if (!url) { + return; + } + if (this.isMixedContent(url)) { + return; + } + if (this.known[url]) { + this.known[url].enabled = true; + global$1().opt({ + peers: [url] + }); + this.save(); + } else { + this.add({ + url: url + }); + } + }, + /** */disable: function disable(url, peerFromGun) { + this.known[url].enabled = false; + if (peerFromGun) { + this.disconnect(peerFromGun); + } + this.save(); + }, + isMixedContent: function isMixedContent(url) { + if (!url) { + return false; + } + return window.location.protocol === 'https:' && url.indexOf('http:') === 0; + }, + random: function random() { + var _this2 = this; + var connectToLocalElectron = util.isElectron && this.known[ELECTRON_GUN_URL] && this.known[ELECTRON_GUN_URL].enabled !== false; + var sampleSize = connectToLocalElectron ? Math.max(maxConnectedPeers - 1, 1) : maxConnectedPeers; + var sample = _.sampleSize(Object.keys(_.pickBy(this.known, function (peer, url) { + return !_this2.isMixedContent(url) && peer.enabled && !(util.isElectron && url === ELECTRON_GUN_URL); + })), sampleSize); + if (sample && connectToLocalElectron) { + sample.push(ELECTRON_GUN_URL); + } + console.log('sample', sample, JSON.stringify(this.known)); + return sample; + }, + checkGunPeerCount: function checkGunPeerCount() { + return; + }, + init: function init() { + var _this4 = this; + this.known = this.getSaved(); + /* use the default value of 1 for now because of memory issue + local().get('settings').get('maxConnectedPeers').on(n => { + if (n !== undefined) maxConnectedPeers = n; + }); + */ + setInterval(function () { + return _this4.checkGunPeerCount(); }, 1000); } }; -var global$1; -function global$2 (opts) { +function generateUuid() { + return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { + var r = Math.random() * 16 | 0, + v = c == 'x' ? r : r & 0x3 | 0x8; + return v.toString(16); + }); +} +var Actor = /*#__PURE__*/function () { + function Actor(id) { + if (id === void 0) { + id = generateUuid(); + } + this.id = id; + } + var _proto = Actor.prototype; + _proto.handle = function handle(_message) { + throw new Error('not implemented'); + } + // so we can support a similar api as Channels + ; + _proto.postMessage = function postMessage(message) { + this.handle(message); + }; + return Actor; +}(); + +var Message = /*#__PURE__*/function () { + function Message() {} + // When Messages are sent over BroadcastChannel, class name is lost. + Message.fromObject = function fromObject(obj) { + if (obj.type === 'get') { + return Get.fromObject(obj); + } else if (obj.type === 'put') { + return Put.fromObject(obj); + } else { + throw new Error('not implemented'); + } + }; + Message.deserialize = /*#__PURE__*/function () { + var _deserialize = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(str, from) { + var obj; + return _regeneratorRuntime().wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + obj = JSON.parse(str); + if (!obj.get) { + _context.next = 5; + break; + } + return _context.abrupt("return", Get.deserialize(obj, str, from)); + case 5: + if (!obj.put) { + _context.next = 9; + break; + } + return _context.abrupt("return", Put.deserialize(obj, str, from)); + case 9: + if (!(obj.dam && obj.dam === "hi")) { + _context.next = 13; + break; + } + return _context.abrupt("return", Hi.deserialize(obj)); + case 13: + throw new Error('unknown message type'); + case 14: + case "end": + return _context.stop(); + } + } + }, _callee); + })); + function deserialize(_x, _x2) { + return _deserialize.apply(this, arguments); + } + return deserialize; + }(); + var _proto = Message.prototype; + _proto.serialize = function serialize() { + throw new Error('not implemented'); + }; + return Message; +}(); +function generateMsgId() { + return Math.random().toString(36).slice(2, 10); +} +var Get = /*#__PURE__*/function () { + function Get(id, nodeId, from, recipients, childKey, jsonStr, checksum) { + this.type = 'get'; + this.id = id; + this.from = from; + this.nodeId = nodeId; + this.recipients = recipients; + this.childKey = childKey; + this.jsonStr = jsonStr; + this.checksum = checksum; + } + var _proto2 = Get.prototype; + _proto2.serialize = function serialize() { + if (this.jsonStr) { + return this.jsonStr; + } + // TODO remove "global/", replace /^user\// with ~ + var nodeId = this.nodeId.replace(/^global\//, '').replace(/^user\//, '~'); + var obj = { + "#": this.id, + get: { + "#": nodeId, + ".": this.childKey + } + }; + if (this.childKey) { + obj.get['.'] = this.childKey; + } + this.jsonStr = JSON.stringify(obj); + return this.jsonStr; + }; + Get.deserialize = /*#__PURE__*/function () { + var _deserialize2 = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(obj, jsonStr, from) { + var id, nodeId, childKey; + return _regeneratorRuntime().wrap(function _callee2$(_context2) { + while (1) { + switch (_context2.prev = _context2.next) { + case 0: + id = obj['#']; + nodeId = obj.get['#']; // TODO add "global/" prefix, replace /^~/ with "user/" + if (nodeId.startsWith('~')) { + nodeId = 'user/' + nodeId.slice(1); + } + nodeId = 'global/' + nodeId; + childKey = obj.get['.']; + return _context2.abrupt("return", new Get(id, nodeId, from, undefined, childKey, jsonStr)); + case 6: + case "end": + return _context2.stop(); + } + } + }, _callee2); + })); + function deserialize(_x3, _x4, _x5) { + return _deserialize2.apply(this, arguments); + } + return deserialize; + }(); + Get.fromObject = function fromObject(obj) { + return new Get(obj.id, obj.nodeId, obj.from, obj.recipients, obj.childKey, obj.jsonStr, obj.checksum); + }; + Get["new"] = function _new(nodeId, from, recipients, childKey, jsonStr, checksum) { + var id = generateMsgId(); + return new Get(id, nodeId, from, recipients, childKey, jsonStr, checksum); + }; + return Get; +}(); +var Put = /*#__PURE__*/function () { + function Put(id, updatedNodes, from, inResponseTo, recipients, jsonStr, checksum) { + this.type = 'put'; + this.id = id; + this.from = from; + this.updatedNodes = updatedNodes; + this.inResponseTo = inResponseTo; + this.recipients = recipients; + this.jsonStr = jsonStr; + this.checksum = checksum; + } + var _proto3 = Put.prototype; + _proto3.serialize = function serialize() { + var obj = { + "#": this.id, + "put": {} + }; + // iterate over this.updatedNodes + for (var _i = 0, _Object$entries = Object.entries(this.updatedNodes); _i < _Object$entries.length; _i++) { + var _Object$entries$_i = _Object$entries[_i], + nodeId = _Object$entries$_i[0], + children = _Object$entries$_i[1]; + var myNodeId = nodeId.replace(/^global\//, '').replace(/^user\//, '~'); + var node = obj.put[myNodeId] = {}; + for (var _i2 = 0, _Object$entries2 = Object.entries(children); _i2 < _Object$entries2.length; _i2++) { + var _Object$entries2$_i = _Object$entries2[_i2], + childKey = _Object$entries2$_i[0], + childValue = _Object$entries2$_i[1]; + if (!childValue) { + continue; + } + var data = childValue; + node[childKey] = data.value; + node["_"] = node["_"] || {}; + node["_"][">"] = node["_"][">"] || {}; + node["_"][">"][childKey] = data.updatedAt; + } + } + return JSON.stringify(obj); + }; + Put.deserialize = /*#__PURE__*/function () { + var _deserialize3 = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3(obj, jsonStr, from) { + var id, updatedNodes, _i3, _Object$entries3, _Object$entries3$_i, nodeId, c, children, node, isUserSpace, _i4, _Object$entries4, _Object$entries4$_i, childKey, childValue, user, signatureObj, timestamp, value, signedObj, signature, signedStr, updatedAt, myNodeId; + return _regeneratorRuntime().wrap(function _callee3$(_context3) { + while (1) { + switch (_context3.prev = _context3.next) { + case 0: + id = obj['#']; + updatedNodes = {}; + _i3 = 0, _Object$entries3 = Object.entries(obj.put); + case 3: + if (!(_i3 < _Object$entries3.length)) { + _context3.next = 37; + break; + } + _Object$entries3$_i = _Object$entries3[_i3], nodeId = _Object$entries3$_i[0], c = _Object$entries3$_i[1]; + children = c; + node = {}; + isUserSpace = nodeId.startsWith('~'); + _i4 = 0, _Object$entries4 = Object.entries(children); + case 9: + if (!(_i4 < _Object$entries4.length)) { + _context3.next = 32; + break; + } + _Object$entries4$_i = _Object$entries4[_i4], childKey = _Object$entries4$_i[0], childValue = _Object$entries4$_i[1]; + if (!(childKey === '_')) { + _context3.next = 13; + break; + } + return _context3.abrupt("continue", 29); + case 13: + if (!isUserSpace) { + _context3.next = 27; + break; + } + user = nodeId.split('/')[0].slice(1); + signatureObj = JSON.parse(childValue); + timestamp = children['_']['>'][childKey]; + value = signatureObj[':']; + signedObj = { + "#": nodeId, + ".": childKey, + ":": value, + ">": timestamp + }; + signature = signatureObj['~']; + signedStr = JSON.stringify(signedObj); + _context3.next = 23; + return Key.verify({ + s: signature, + m: signedStr + }, user); + case 23: + _context3.t0 = _context3.sent; + _context3.t1 = undefined; + if (!(_context3.t0 === _context3.t1)) { + _context3.next = 27; + break; + } + throw new Error("invalid signature in " + nodeId + " of " + signedStr); + case 27: + // TODO test hash space validity + updatedAt = children['_']['>'][childKey]; + node[childKey] = { + value: childValue, + updatedAt: updatedAt + }; + case 29: + _i4++; + _context3.next = 9; + break; + case 32: + myNodeId = 'global/' + nodeId.replace(/^~/, 'user/'); + updatedNodes[myNodeId] = node; + case 34: + _i3++; + _context3.next = 3; + break; + case 37: + return _context3.abrupt("return", new Put(id, updatedNodes, from, undefined, undefined, jsonStr)); + case 38: + case "end": + return _context3.stop(); + } + } + }, _callee3); + })); + function deserialize(_x6, _x7, _x8) { + return _deserialize3.apply(this, arguments); + } + return deserialize; + }(); + Put.fromObject = function fromObject(obj) { + return new Put(obj.id, obj.updatedNodes, obj.from, obj.inResponseTo, obj.recipients, obj.jsonStr, obj.checksum); + }; + Put["new"] = function _new(updatedNodes, from, inResponseTo, recipients, jsonStr, checksum) { + var id = generateMsgId(); + return new Put(id, updatedNodes, from, inResponseTo, recipients, jsonStr, checksum); + }; + Put.newFromKv = function newFromKv(key, children, from) { + var updatedNodes = {}; + updatedNodes[key] = children; + return Put["new"](updatedNodes, from); + }; + return Put; +}(); +var Hi = /*#__PURE__*/function () { + function Hi(peerId, jsonStr) { + this.type = 'hi'; + this.peerId = peerId; + this.jsonStr = jsonStr; + } + //{"#":"aHHO9Srurq9nh6Q9","dam":"hi"} + var _proto4 = Hi.prototype; + _proto4.serialize = function serialize() { + if (this.jsonStr) { + return this.jsonStr; + } + var obj = { + dam: "hi", + "#": this.peerId + }; + this.jsonStr = JSON.stringify(obj); + return this.jsonStr; + }; + Hi.deserialize = function deserialize(obj) { + var peerId = obj['#']; + return new Hi(peerId); + }; + return Hi; +}(); + +var Memory = /*#__PURE__*/function (_Actor) { + _inheritsLoose(Memory, _Actor); + function Memory(config) { + var _this; + if (config === void 0) { + config = {}; + } + _this = _Actor.call(this) || this; + _this.config = {}; + _this.store = new QuickLRU({ + maxSize: 10000 + }); + _this.config = config; + return _this; + } + var _proto = Memory.prototype; + _proto.handle = function handle(message) { + if (message instanceof Put) { + this.handlePut(message); + } else if (message instanceof Get) { + this.handleGet(message); + } else { + console.log('Memory got unknown message', message); + } + }; + _proto.handleGet = function handleGet(message) { + if (!message.from) { + console.log('no from in get message'); + return; + } + var children = this.store.get(message.nodeId); + if (children) { + //console.log('have', message.nodeId, children); + var putMessage = Put.newFromKv(message.nodeId, children, this); + putMessage.inResponseTo = message.id; + message.from && message.from.postMessage(putMessage); + } + }; + _proto.mergeAndSave = function mergeAndSave(nodeName, children) { + var existing = this.store.get(nodeName); + // TODO check updatedAt timestamp + if (existing === undefined) { + this.store.set(nodeName, children); + } else { + for (var _i = 0, _Object$entries = Object.entries(children); _i < _Object$entries.length; _i++) { + var _Object$entries$_i = _Object$entries[_i], + key = _Object$entries$_i[0], + value = _Object$entries$_i[1]; + if (existing[key] && existing[key].updatedAt >= value.updatedAt) { + continue; + } + existing[key] = value; + } + this.store.set(nodeName, existing); + } + }; + _proto.handlePut = /*#__PURE__*/function () { + var _handlePut = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(put) { + var _i2, _Object$entries2, _Object$entries2$_i, nodeName, children; + return _regeneratorRuntime().wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + _i2 = 0, _Object$entries2 = Object.entries(put.updatedNodes); + case 1: + if (!(_i2 < _Object$entries2.length)) { + _context.next = 11; + break; + } + _Object$entries2$_i = _Object$entries2[_i2], nodeName = _Object$entries2$_i[0], children = _Object$entries2$_i[1]; + if (children) { + _context.next = 7; + break; + } + console.log('deleting', nodeName); + this.store["delete"](nodeName); + return _context.abrupt("continue", 8); + case 7: + this.mergeAndSave(nodeName, children); + case 8: + _i2++; + _context.next = 1; + break; + case 11: + case "end": + return _context.stop(); + } + } + }, _callee, this); + })); + function handlePut(_x) { + return _handlePut.apply(this, arguments); + } + return handlePut; + }(); + return Memory; +}(Actor); + +// import * as Comlink from "comlink"; +// TODO: add LRU or other eviction policy, clean up least important data when db gets too big +var MyDexie = /*#__PURE__*/function (_Dexie) { + _inheritsLoose(MyDexie, _Dexie); + function MyDexie(dbName) { + var _this; + _this = _Dexie.call(this, dbName) || this; + _this.version(1).stores({ + nodes: ", value, updatedAt" + }); + _this.nodes = _this.table("nodes"); + return _this; + } + return MyDexie; +}(Dexie); +var IndexedDB = /*#__PURE__*/function (_Actor) { + _inheritsLoose(IndexedDB, _Actor); + function IndexedDB(config) { + var _this2; + if (config === void 0) { + config = {}; + } + _this2 = _Actor.call(this) || this; + _this2.config = {}; + _this2.notStored = new Set(); + _this2.putQueue = {}; + _this2.getQueue = {}; + _this2.i = 0; + _this2.queue = 0; + _this2.throttledPut = _.throttle(function () { + var keys = Object.keys(_this2.putQueue); + var values = keys.map(function (key) { + _this2.notStored["delete"](key); + return _this2.putQueue[key]; + }); + _this2.db.nodes.bulkPut(values, keys)["catch"](function (err) { + console.error(err); + }); + _this2.putQueue = {}; + }, 500); + _this2.throttledGet = _.throttle(function () { + // clone this.getQueue and clear it + var queue = _this2.getQueue; + var keys = Object.keys(queue); + _this2.db.nodes.bulkGet(keys).then(function (values) { + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + var value = values[i]; + var callbacks = queue[key]; + // console.log('have', key, value); + for (var _iterator = _createForOfIteratorHelperLoose(callbacks), _step; !(_step = _iterator()).done;) { + var callback = _step.value; + callback(value); + } + } + }); + _this2.getQueue = {}; + }, 100); + _this2.config = config; + var dbName = config.dbName || 'iris'; + _this2.db = new MyDexie(dbName); + _this2.db.open()["catch"](function (err) { + console.error(err.stack || err); + }); + return _this2; + } + var _proto = IndexedDB.prototype; + _proto.put = function put(nodeId, value) { + // add puts to a queue and dexie bulk write them once per 500ms + this.putQueue[nodeId] = value; + this.throttledPut(); + }; + _proto.get = function get(path, callback) { + this.getQueue[path] = this.getQueue[path] || []; + this.getQueue[path].push(callback); + this.throttledGet(); + }; + _proto.handle = function handle(message) { + if (message instanceof Put) { + this.handlePut(message); + } else if (message instanceof Get) { + this.handleGet(message); + } else { + console.log('worker got unknown message', message); + } + }; + _proto.handleGet = function handleGet(message) { + var _this3 = this; + if (this.notStored.has(message.nodeId)) { + // TODO message implying that the key is not stored + return; + } + this.get(message.nodeId, function (children) { + // TODO: this takes a long time to return + if (children === undefined) { + _this3.notStored.add(message.nodeId); + // TODO message implying that the key is not stored + } else { + var putMessage = Put.newFromKv(message.nodeId, children, _this3); + putMessage.inResponseTo = message.id; + message.from && message.from.postMessage(putMessage); + } + }); + }; + _proto.mergeAndSave = function mergeAndSave(path, children) { + var _this4 = this; + this.get(path, function (existing) { + // TODO check updatedAt timestamp + if (existing === undefined) { + _this4.put(path, children); + } else { + for (var _i = 0, _Object$entries = Object.entries(children); _i < _Object$entries.length; _i++) { + var _Object$entries$_i = _Object$entries[_i], + key = _Object$entries$_i[0], + value = _Object$entries$_i[1]; + if (existing[key] && existing[key].updatedAt >= value.updatedAt) { + continue; + } + existing[key] = value; + } + _this4.put(path, existing); + } + }); + }; + _proto.savePath = function savePath(path, value) { + if (value === undefined) { + this.db.nodes["delete"](path); + this.notStored.add(path); + } else { + this.notStored["delete"](path); + this.mergeAndSave(path, value); + } + }; + _proto.handlePut = /*#__PURE__*/function () { + var _handlePut = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(put) { + var _i2, _Object$entries2, _Object$entries2$_i, nodeName, children; + return _regeneratorRuntime().wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + _i2 = 0, _Object$entries2 = Object.entries(put.updatedNodes); + case 1: + if (!(_i2 < _Object$entries2.length)) { + _context.next = 10; + break; + } + _Object$entries2$_i = _Object$entries2[_i2], nodeName = _Object$entries2$_i[0], children = _Object$entries2$_i[1]; + if (children) { + _context.next = 6; + break; + } + console.log('deleting', nodeName); + return _context.abrupt("continue", 7); + case 6: + this.mergeAndSave(nodeName, children); + case 7: + _i2++; + _context.next = 1; + break; + case 10: + case "end": + return _context.stop(); + } + } + }, _callee, this); + })); + function handlePut(_x) { + return _handlePut.apply(this, arguments); + } + return handlePut; + }(); + return IndexedDB; +}(Actor); + +//@ts-ignore +var Websocket = /*#__PURE__*/function (_Actor) { + _inheritsLoose(Websocket, _Actor); + function Websocket(url, router) { + var _this; + _this = _Actor.call(this, 'websocket:' + url) || this; + _this.sendQueue = []; + console.log('Websocket', url); + _this.router = router; + _this.ws = new WebSocket(url.replace('http', 'ws')); + _this.ws.onopen = function () { + //this.ws.send(new Hi(this.router.peerId).serialize()); + console.log("Connected to " + url); + _this.sendQueue.forEach(function (message) { + return _this.ws.send(message); + }); + _this.sendQueue = []; + }; + _this.ws.onmessage = /*#__PURE__*/function () { + var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(event) { + var message; + return _regeneratorRuntime().wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + _context.prev = 0; + _context.next = 3; + return Message.deserialize(event.data, _assertThisInitialized(_this)); + case 3: + message = _context.sent; + _this.router.postMessage(message); + _context.next = 9; + break; + case 7: + _context.prev = 7; + _context.t0 = _context["catch"](0); + case 9: + case "end": + return _context.stop(); + } + } + }, _callee, null, [[0, 7]]); + })); + return function (_x) { + return _ref.apply(this, arguments); + }; + }(); + _this.ws.onclose = function () { + console.log("Disconnected from " + url); + }; + _this.ws.onerror = function () { + console.log("Error on " + url); + }; + return _this; + } + var _proto = Websocket.prototype; + _proto.handle = function handle(message) { + if (message instanceof Get || message instanceof Put) { + if (message.from === this) { + return; + } + if (this.ws.readyState === WebSocket.OPEN) { + this.ws.send(message.serialize()); + } else if (this.ws.readyState === WebSocket.CONNECTING) { + this.sendQueue.push(message.serialize()); + } + } + }; + return Websocket; +}(Actor); + +// import * as Comlink from "comlink"; +/* +class SeenGetMessage { + constructor(id, from, lastReplyChecksum) { + this.id = id; + this.from = from; + this.lastReplyChecksum = lastReplyChecksum; + } +} +*/ +var Router = /*#__PURE__*/function (_Actor) { + _inheritsLoose(Router, _Actor); + function Router(config) { + var _this; + if (config === void 0) { + config = {}; + } + _this = _Actor.call(this, 'router') || this; + _this.storageAdapters = new Set(); + _this.networkAdapters = new Set(); + _this.serverPeers = new Set(); + _this.seenMessages = new Set(); + _this.seenGetMessages = new Map(); + _this.subscribersByTopic = new Map(); + _this.msgCounter = 0; + // default random id + _this.peerId = config.peerId || Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15); + _this.storageAdapters.add(new Memory(config)); + _this.storageAdapters.add(new IndexedDB(config)); + console.log('config', config); + if (config.peers) { + for (var _iterator = _createForOfIteratorHelperLoose(config.peers), _step; !(_step = _iterator()).done;) { + var peer = _step.value; + if (peer) { + _this.serverPeers.add(new Websocket(peer, _assertThisInitialized(_this))); + } + } + } + return _this; + } + var _proto = Router.prototype; + _proto.handle = function handle(message) { + //console.log('router received', message); + if (message instanceof Put || message instanceof Get) { + if (this.seenMessages.has(message.id)) { + return; + } + this.seenMessages.add(message.id); + if (message instanceof Put) { + this.handlePut(message); + } else if (message instanceof Get) { + this.handleGet(message); + } + } + }; + _proto.handlePut = function handlePut(put) { + var _this2 = this; + var sendTo = new Set(); + Object.keys(put.updatedNodes).forEach(function (path) { + // topic is first 3 nodes of path + var topic = path.split('/').slice(0, 3).join('/'); + var subscribers = _this2.subscribersByTopic.get(topic); + // send to storage adapters + //console.log('put subscribers', subscribers); + for (var _iterator2 = _createForOfIteratorHelperLoose(_this2.storageAdapters), _step2; !(_step2 = _iterator2()).done;) { + var storageAdapter = _step2.value; + if (put.from !== storageAdapter) { + sendTo.add(storageAdapter); + } + } + for (var _iterator3 = _createForOfIteratorHelperLoose(_this2.serverPeers), _step3; !(_step3 = _iterator3()).done;) { + var peer = _step3.value; + if (put.from !== peer) { + sendTo.add(peer); + } + } + if (subscribers) { + for (var _iterator4 = _createForOfIteratorHelperLoose(subscribers), _step4; !(_step4 = _iterator4()).done;) { + var subscriber = _step4.value; + if (subscriber !== put.from) { + sendTo.add(subscriber); + } + } + } + }); + for (var _iterator5 = _createForOfIteratorHelperLoose(sendTo), _step5; !(_step5 = _iterator5()).done;) { + var actor = _step5.value; + actor.postMessage(put); + } + }; + _proto.opt = function opt(opts) { + if (opts.peers) { + for (var _iterator6 = _createForOfIteratorHelperLoose(opts.peers), _step6; !(_step6 = _iterator6()).done;) { + var peer = _step6.value; + if (peer) { + this.serverPeers.add(new Websocket(peer, this)); + } + } + } + }; + _proto.handleGet = function handleGet(get) { + var topic = get.nodeId.split('/')[1]; + var sendTo = new Set(); + for (var _iterator7 = _createForOfIteratorHelperLoose(this.storageAdapters), _step7; !(_step7 = _iterator7()).done;) { + var storageAdapter = _step7.value; + if (get.from !== storageAdapter) { + sendTo.add(storageAdapter); + } + } + for (var _iterator8 = _createForOfIteratorHelperLoose(this.serverPeers), _step8; !(_step8 = _iterator8()).done;) { + var peer = _step8.value; + if (get.from !== peer) { + sendTo.add(peer); + } + } + if (!this.subscribersByTopic.has(topic)) { + this.subscribersByTopic.set(topic, new Set()); + } + var subscribers = this.subscribersByTopic.get(topic); + if (subscribers) { + if (!subscribers.has(get.from)) { + subscribers.add(get.from); + } + } + for (var _iterator9 = _createForOfIteratorHelperLoose(sendTo), _step9; !(_step9 = _iterator9()).done;) { + var actor = _step9.value; + actor.postMessage(get); + } + }; + return Router; +}(Actor); + +var DEFAULT_CONFIG = { + allowPublicSpace: false, + enableStats: true, + localOnly: true +}; +// TODO move memory storage to its own adapter? it would make things simpler here +var Node = /*#__PURE__*/function (_Actor) { + _inheritsLoose(Node, _Actor); + function Node(id, config, parent) { + var _this; + if (id === void 0) { + id = ''; + } + _this = _Actor.call(this, id) || this; + _this.children = new Map(); + _this.once_subscriptions = new Map(); + _this.on_subscriptions = new Map(); + _this.map_subscriptions = new Map(); + _this.counter = 0; + _this.doCallbacks = function (data, key) { + if (typeof data.value === 'string' && data.value.startsWith('{":":')) { + data.value = JSON.parse(data.value)[':']; + } + var _loop2 = function _loop2() { + var _step$value = _step.value, + id = _step$value[0], + callback = _step$value[1]; + var event = { + off: function off() { + return _this.on_subscriptions["delete"](id); + } + }; + callback(data.value, key, null, event); + }; + for (var _iterator = _createForOfIteratorHelperLoose(_this.on_subscriptions), _step; !(_step = _iterator()).done;) { + _loop2(); + } + for (var _iterator2 = _createForOfIteratorHelperLoose(_this.once_subscriptions), _step2; !(_step2 = _iterator2()).done;) { + var _step2$value = _step2.value, + _id = _step2$value[0], + callback = _step2$value[1]; + callback(data.value, key, null, {}); + _this.once_subscriptions["delete"](_id); + } + if (_this.parent) { + (function () { + var parent = _this.parent; + var _loop = function _loop() { + var _step3$value = _step3.value, + id = _step3$value[0], + callback = _step3$value[1]; + var event = { + off: function off() { + return parent.map_subscriptions["delete"](id); + } + }; + callback(data.value, key, null, event); + }; + for (var _iterator3 = _createForOfIteratorHelperLoose(parent.map_subscriptions), _step3; !(_step3 = _iterator3()).done;) { + _loop(); + } + })(); + } + }; + _this.parent = parent; + _this.config = config || parent && parent.config || DEFAULT_CONFIG; + if (parent) { + _this.root = parent.root; + _this.router = parent.router; + } else { + _this.root = _assertThisInitialized(_this); + //@ts-ignore + _this.router = new Router({ + dbName: _this.id + '-idb', + peers: _this.config.webSocketPeers + }); + //console.log('idbWorker', idbWorker); + //const router = Comlink.wrap(routerWorker); + } + return _this; + } + var _proto = Node.prototype; + _proto.getCurrentUser = function getCurrentUser() { + return this.root.currentUser; + }; + _proto.setCurrentUser = function setCurrentUser(key) { + this.root.currentUser = key; + }; + _proto.handle = function handle(message) { + if (message instanceof Put) { + for (var _i = 0, _Object$entries = Object.entries(message.updatedNodes); _i < _Object$entries.length; _i++) { + var _Object$entries$_i = _Object$entries[_i], + key = _Object$entries$_i[0], + children = _Object$entries$_i[1]; + if (!children || typeof children !== 'object') { + continue; + } + if (key === this.id) { + for (var _i2 = 0, _Object$entries2 = Object.entries(children); _i2 < _Object$entries2.length; _i2++) { + var _Object$entries2$_i = _Object$entries2[_i2], + childKey = _Object$entries2$_i[0], + childData = _Object$entries2$_i[1]; + this.get(childKey).doCallbacks(childData, childKey); // TODO children should have proper NodeData + } + } + } + + this.parent && this.parent.handle(message); + } + }; + _proto.get = function get(key) { + var existing = this.children.get(key); + if (existing) { + return existing; + } + var newNode = new Node(this.id + "/" + key, this.config, this); + this.children.set(key, newNode); + return newNode; + }; + _proto.user = function user(pub) { + pub = pub || this.root.currentUser && this.root.currentUser.pub; + if (!pub) { + throw new Error("no public key!"); + } + return this.get('user').get(pub); + }; + _proto.auth = function auth(key) { + // TODO get public key from key + this.root.setCurrentUser(key); + return; + }; + _proto.put = /*#__PURE__*/function () { + var _put = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(value) { + var updatedAt, key, updatedNodes, put; + return _regeneratorRuntime().wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + updatedAt = Date.now(); + if (!Array.isArray(value)) { + _context.next = 3; + break; + } + throw new Error('put() does not support arrays'); + case 3: + if (!(typeof value === 'function')) { + _context.next = 5; + break; + } + throw new Error('put() does not support functions'); + case 5: + if (!(typeof value === 'object' && value !== null)) { + _context.next = 8; + break; + } + // TODO: update the whole path of parent nodes + for (key in value) { + this.get(key).put(value[key]); + } + return _context.abrupt("return"); + case 8: + _context.next = 10; + return this.signIfNeeded(value); + case 10: + value = _context.sent; + this.children = new Map(); + updatedNodes = {}; + _context.next = 15; + return this.addParentNodes(updatedNodes, value, updatedAt); + case 15: + put = Put["new"](updatedNodes, this); + this.handle(put); + this.router.postMessage(put); + case 18: + case "end": + return _context.stop(); + } + } + }, _callee, this); + })); + function put(_x) { + return _put.apply(this, arguments); + } + return put; + }(); + _proto.signIfNeeded = /*#__PURE__*/function () { + var _signIfNeeded = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(value) { + var signed; + return _regeneratorRuntime().wrap(function _callee2$(_context2) { + while (1) { + switch (_context2.prev = _context2.next) { + case 0: + if (!(this.id.indexOf('global/user/') === 0)) { + _context2.next = 10; + break; + } + if (this.getCurrentUser()) { + _context2.next = 3; + break; + } + throw new Error('not authenticated'); + case 3: + if (!(this.id.indexOf('global/user/' + this.getCurrentUser().pub) !== 0)) { + _context2.next = 5; + break; + } + throw new Error('not allowed ' + this.id); + case 5: + _context2.next = 7; + return Key.sign(value, this.getCurrentUser(), undefined, { + raw: true + }); + case 7: + signed = _context2.sent; + value = JSON.stringify({ + ':': signed.m, + '~': signed.s + }); + console.log('saving signed value', value); + case 10: + return _context2.abrupt("return", value); + case 11: + case "end": + return _context2.stop(); + } + } + }, _callee2, this); + })); + function signIfNeeded(_x2) { + return _signIfNeeded.apply(this, arguments); + } + return signIfNeeded; + }(); + _proto.addParentNodes = /*#__PURE__*/function () { + var _addParentNodes = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3(updatedNodes, value, updatedAt) { + var childName, parentId; + return _regeneratorRuntime().wrap(function _callee3$(_context3) { + while (1) { + switch (_context3.prev = _context3.next) { + case 0: + if (!this.parent) { + _context3.next = 7; + break; + } + childName = this.id.split('/').pop(); + parentId = this.parent.id; + updatedNodes[parentId] = updatedNodes[parentId] || {}; + updatedNodes[parentId][childName] = { + value: value, + updatedAt: updatedAt + }; + _context3.next = 7; + return this.parent.addParentNodes(updatedNodes, { + '#': this.parent.id + }, updatedAt); + case 7: + case "end": + return _context3.stop(); + } + } + }, _callee3, this); + })); + function addParentNodes(_x3, _x4, _x5) { + return _addParentNodes.apply(this, arguments); + } + return addParentNodes; + }(); + _proto.request = function request() { + if (this.parent) { + // TODO router should decide whether to re-request from peers + var childKey = this.id.split('/').pop(); + this.router.postMessage(Get["new"](this.parent.id, this, undefined, childKey)); + } + }; + _proto.once = /*#__PURE__*/function () { + var _once = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee4(callback) { + var id; + return _regeneratorRuntime().wrap(function _callee4$(_context4) { + while (1) { + switch (_context4.prev = _context4.next) { + case 0: + id = this.counter++; + callback && this.once_subscriptions.set(id, callback); + this.request(); + case 3: + case "end": + return _context4.stop(); + } + } + }, _callee4, this); + })); + function once(_x6) { + return _once.apply(this, arguments); + } + return once; + }(); + _proto.on = function on(callback) { + var id = this.counter++; + this.on_subscriptions.set(id, callback); + //const event = { off: () => this.on_subscriptions.delete(id) }; + this.request(); + }; + _proto.map = function map(callback) { + var id = this.counter++; + this.map_subscriptions.set(id, callback); + // TODO: child key should probably still be included. But how to handle link responses? + this.router.postMessage(Get["new"](this.id, this, undefined)); + }; + _proto.opt = function opt(opts) { + this.router.opt(opts); + }; + return Node; +}(Actor); + +var globalState; +function global$1 (opts) { if (opts === void 0) { opts = {}; } - if (!global$1) { + if (!globalState) { + peers.init(); + var webSocketPeers = opts.peers || peers.random(); + console.log('webSocketPeers', webSocketPeers); var myOpts = Object.assign({ - peers: opts.peers || peers.random(), + webSocketPeers: webSocketPeers, localStorage: false, retry: Infinity }, opts); if (opts.peers) { + console.log('adding peers', opts.peers); opts.peers.forEach(function (url) { return peers.add({ url: url }); }); } - peers.init(); - global$1 = new Gun(myOpts); + globalState = new Node('global', myOpts); } - return global$1; + return globalState; } // @ts-nocheck @@ -1137,18 +2920,22 @@ var Attribute = /*#__PURE__*/function () { return Attribute; }(); -var currentUser; /** * Get a public space where only the specified user (public key) can write. Others can read. - * @param pub The public key of the user. Defaults to the current user from session. + * @param pub The public key string or keypair object of the user. Defaults to the current user from session. * @returns {Node} The user space. */ function publicState (pub) { - if (!currentUser) { - currentUser = global$2().user(); - currentUser.auth(session.getKey()); + if (pub === void 0) { + pub = session.getKey(); + } + if (typeof pub === 'string') { + return global$1().user(pub); + } else if (typeof pub === 'object') { + var userSpace = global$1().user(pub.pub); + userSpace.auth(pub); + return userSpace; } - return pub ? global$2().user(pub) : currentUser; } // TODO: extract Group channels into their own class @@ -1197,12 +2984,12 @@ var DEFAULT_PERMISSIONS = { * * var gun1 = new Gun('https://gun-us.herokuapp.com/gun'); * var gun2 = new Gun('https://gun-us.herokuapp.com/gun'); -* var myKey = await iris.Key.getDefault(); +* var myKey = await Key.getDefault(); * var someoneElse = localStorage.getItem('someoneElsesKey'); * if (someoneElse) { * someoneElse = JSON.parse(someoneElse); * } else { -* someoneElse = await iris.Key.generate(); +* someoneElse = await Key.generate(); * localStorage.setItem('someoneElsesKey', JSON.stringify(someoneElse)); * } * @@ -1362,7 +3149,7 @@ var Channel = /*#__PURE__*/function () { if (sharedSecret && linkId) { this.save(); // save the channel first so it's there before inviter subscribes to it options.saved = true; - global$2().user(pub).get('chatLinks').get(linkId).get('encryptedSharedKey').on( /*#__PURE__*/function () { + global$1().user(pub).get('chatLinks').get(linkId).get('encryptedSharedKey').on( /*#__PURE__*/function () { var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(encrypted) { var sharedKey, encryptedChatRequest, channelRequestId; return _regeneratorRuntime().wrap(function _callee$(_context) { @@ -1370,20 +3157,18 @@ var Channel = /*#__PURE__*/function () { switch (_context.prev = _context.next) { case 0: _context.next = 2; - return Gun.SEA.decrypt(encrypted, sharedSecret); + return Key.decrypt(encrypted, sharedSecret); case 2: sharedKey = _context.sent; _context.next = 5; - return Gun.SEA.encrypt(session.getKey().pub, sharedSecret); + return Key.encrypt(session.getKey().pub, sharedSecret); case 5: encryptedChatRequest = _context.sent; _context.next = 8; return util.getHash(encryptedChatRequest); case 8: channelRequestId = _context.sent; - util.gunAsAnotherUser(global$2(), sharedKey, function (user) { - user.get('chatRequests').get(channelRequestId.slice(0, 12)).put(encryptedChatRequest); - }); + global$1(sharedKey).get('chatRequests').get(channelRequestId.slice(0, 12)).put(encryptedChatRequest); case 10: case "end": return _context.stop(); @@ -1429,7 +3214,7 @@ var Channel = /*#__PURE__*/function () { }); }; _proto.changeMyGroupSecret = function changeMyGroupSecret() { - this.myGroupSecret = Gun.SEA.random(32).toString('base64'); + this.myGroupSecret = Key.random(32).toString('base64'); // TODO: secret should be archived and probably messages should include the encryption key id so past messages don't become unreadable this.putDirect("S" + this.uuid, this.myGroupSecret); } @@ -1446,7 +3231,7 @@ var Channel = /*#__PURE__*/function () { while (1) { switch (_context2.prev = _context2.next) { case 0: - global$2().user(participant).get(this.theirSecretUuids[participant]).off(); + global$1().user(participant).get(this.theirSecretUuids[participant]).off(); // TODO: persist case 1: case "end": @@ -1503,7 +3288,7 @@ var Channel = /*#__PURE__*/function () { break; } _context4.next = 3; - return Gun.SEA.secret(session.getKey().epub, session.getKey()); + return Key.secret(session.getKey().epub, session.getKey()); case 3: mySecret = _context4.sent; _context4.next = 6; @@ -1571,11 +3356,11 @@ var Channel = /*#__PURE__*/function () { break; } _context5.next = 3; - return util.gunOnceDefined(global$2().user(pub).get("epub")); + return util.gunOnceDefined(global$1().user(pub).get("epub")); case 3: epub = _context5.sent; _context5.next = 6; - return Gun.SEA.secret(epub, session.getKey()); + return Key.secret(epub, session.getKey()); case 6: this.secrets[pub] = _context5.sent; case 7: @@ -1604,11 +3389,11 @@ var Channel = /*#__PURE__*/function () { switch (_context6.prev = _context6.next) { case 0: _context6.next = 2; - return util.gunOnceDefined(global$2().user(pub).get("epub")); + return util.gunOnceDefined(global$1().user(pub).get("epub")); case 2: epub = _context6.sent; _context6.next = 5; - return Gun.SEA.secret(epub, pair); + return Key.secret(epub, pair); case 5: secret = _context6.sent; return _context6.abrupt("return", util.getHash(secret + pub)); @@ -1636,11 +3421,11 @@ var Channel = /*#__PURE__*/function () { switch (_context7.prev = _context7.next) { case 0: _context7.next = 2; - return util.gunOnceDefined(global$2().user(pub).get("epub")); + return util.gunOnceDefined(global$1().user(pub).get("epub")); case 2: epub = _context7.sent; _context7.next = 5; - return Gun.SEA.secret(epub, pair); + return Key.secret(epub, pair); case 5: secret = _context7.sent; return _context7.abrupt("return", util.getHash(secret + pair.pub)); @@ -1657,7 +3442,7 @@ var Channel = /*#__PURE__*/function () { return getTheirSecretChannelId; }() /** * Calls back with Channels that you have initiated or written to. - * @param {Object} keypair Gun.SEA keypair that the gun instance is authenticated with + * @param {Object} keypair Key keypair that the gun instance is authenticated with * @param callback callback function that is called for each public key you have a channel with */; Channel.getChannels = @@ -1674,7 +3459,7 @@ var Channel = /*#__PURE__*/function () { } keypair = session.getKey(); _context9.next = 4; - return Gun.SEA.secret(keypair.epub, keypair); + return Key.secret(keypair.epub, keypair); case 4: mySecret = _context9.sent; if (listenToChatLinks) { @@ -1697,15 +3482,15 @@ var Channel = /*#__PURE__*/function () { _context8.next = 5; break; } - global$2().user().get("chats").get(ourSecretChannelId).put(null); + global$1().user().get("chats").get(ourSecretChannelId).put(null); return _context8.abrupt("return"); case 5: _context8.next = 7; - return util.gunOnceDefined(global$2().user().get("chats").get(ourSecretChannelId).get("pub")); + return util.gunOnceDefined(global$1().user().get("chats").get(ourSecretChannelId).get("pub")); case 7: encryptedChatId = _context8.sent; _context8.next = 10; - return Gun.SEA.decrypt(encryptedChatId, mySecret); + return Key.decrypt(encryptedChatId, mySecret); case 10: chatId = _context8.sent; if (chatId) { @@ -1740,7 +3525,7 @@ var Channel = /*#__PURE__*/function () { return _ref2.apply(this, arguments); }; }(); - global$2().user().get("chats").map().on(handleChannel); + global$1().user().get("chats").map(handleChannel); case 9: case "end": return _context9.stop(); @@ -1864,7 +3649,8 @@ var Channel = /*#__PURE__*/function () { case 9: theirSecretChannelId = _context12.sent; case 10: - global$2().user(pub).get("chats").get(theirSecretChannelId).get("msgs").map().once(function (data, key) { + // TODO map().once + global$1().user(pub).get("chats").get(theirSecretChannelId).get("msgs").map(function (data, key) { _this5.messageReceived(callback, data, _this5.uuid || pub, false, key, pub); }); case 11: @@ -1876,7 +3662,8 @@ var Channel = /*#__PURE__*/function () { return _this5.getOurSecretChannelId(pub); case 14: ourSecretChannelId = _context12.sent; - publicState().get("chats").get(ourSecretChannelId).get("msgs").map().once(function (data, key) { + // TODO map().once + publicState().get("chats").get(ourSecretChannelId).get("msgs").map(function (data, key) { _this5.messageReceived(callback, data, pub, true, key, session.getKey().pub); }); case 16: @@ -1898,7 +3685,8 @@ var Channel = /*#__PURE__*/function () { return this.getMySecretUuid(); case 4: mySecretUuid = _context13.sent; - publicState().get("chats").get(mySecretUuid).get("msgs").map().once(function (data, key) { + // TODO map().once + publicState().get("chats").get(mySecretUuid).get("msgs").map(function (data, key) { _this5.messageReceived(callback, data, _this5.uuid, true, key, session.getKey().pub); }); case 6: @@ -1944,7 +3732,7 @@ var Channel = /*#__PURE__*/function () { case 11: secret = _context14.t0; _context14.next = 14; - return Gun.SEA.decrypt(data, secret); + return Key.decrypt(data, secret); case 14: decrypted = _context14.sent; if (!(typeof decrypted !== "object")) { @@ -2183,12 +3971,12 @@ var Channel = /*#__PURE__*/function () { break; } _context21.next = 14; - return Gun.SEA.secret(session.getKey().epub, session.getKey()); + return Key.secret(session.getKey().epub, session.getKey()); case 14: mySecret = _context21.sent; - _context21.t0 = global$2().user().get("chats").get(ourSecretChannelId).get("pub"); + _context21.t0 = global$1().user().get("chats").get(ourSecretChannelId).get("pub"); _context21.next = 18; - return Gun.SEA.encrypt({ + return Key.encrypt({ pub: pub }, mySecret); case 18: @@ -2291,7 +4079,7 @@ var Channel = /*#__PURE__*/function () { break; } _context22.next = 15; - return Gun.SEA.encrypt(JSON.stringify(msg), this.getMyGroupSecret()); + return Key.encrypt(JSON.stringify(msg), this.getMyGroupSecret()); case 15: encrypted = _context22.sent; _context22.next = 18; @@ -2310,7 +4098,7 @@ var Channel = /*#__PURE__*/function () { _context22.next = 42; break; } - _context22.t0 = Gun.SEA; + _context22.t0 = Key; _context22.t1 = JSON.stringify(msg); _context22.next = 30; return this.getSecret(keys[i]); @@ -2364,12 +4152,12 @@ var Channel = /*#__PURE__*/function () { publicState().get("chats").get(mySecretUuid).get('msgs').get('a').put(null); this.put("participants", this.participants); // public participants list _context23.next = 8; - return Gun.SEA.secret(session.getKey().epub, session.getKey()); + return Key.secret(session.getKey().epub, session.getKey()); case 8: mySecret = _context23.sent; _context23.t0 = publicState().get("chats").get(mySecretUuid).get("pub"); _context23.next = 12; - return Gun.SEA.encrypt({ + return Key.encrypt({ uuid: this.uuid, myGroupSecret: this.getMyGroupSecret(), participants: this.participants // private participants list @@ -2448,7 +4236,7 @@ var Channel = /*#__PURE__*/function () { throw new Error("Sorry, you can't overwrite the msgs field which is used for .send()"); case 2: _context25.next = 4; - return Gun.SEA.encrypt(JSON.stringify(value), this.getMyGroupSecret()); + return Key.encrypt(JSON.stringify(value), this.getMyGroupSecret()); case 4: encrypted = _context25.sent; _context25.next = 7; @@ -2488,7 +4276,7 @@ var Channel = /*#__PURE__*/function () { _context26.next = 20; break; } - _context26.t0 = Gun.SEA; + _context26.t0 = Key; _context26.t1 = JSON.stringify(value); _context26.next = 9; return this.getSecret(keys[i]); @@ -2645,14 +4433,14 @@ var Channel = /*#__PURE__*/function () { return _this10.getOurSecretChannelId(keys[i]); case 2: ourSecretChannelId = _context32.sent; - global$2().user().get("chats").get(ourSecretChannelId).get(key).on( /*#__PURE__*/function () { + global$1().user().get("chats").get(ourSecretChannelId).get(key).on( /*#__PURE__*/function () { var _ref5 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee31(data) { var decrypted; return _regeneratorRuntime().wrap(function _callee31$(_context31) { while (1) { switch (_context31.prev = _context31.next) { case 0: - _context31.t0 = Gun.SEA; + _context31.t0 = Key; _context31.t1 = data; _context31.next = 4; return _this10.getSecret(keys[i]); @@ -2735,7 +4523,7 @@ var Channel = /*#__PURE__*/function () { return this.getMyGroupSecret(); case 7: mySecret = _context35.sent; - global$2().user().get("chats").get(mySecretUuid).get(key).on( /*#__PURE__*/function () { + global$1().user().get("chats").get(mySecretUuid).get(key).on( /*#__PURE__*/function () { var _ref6 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee33(data) { var decrypted; return _regeneratorRuntime().wrap(function _callee33$(_context34) { @@ -2743,7 +4531,7 @@ var Channel = /*#__PURE__*/function () { switch (_context34.prev = _context34.next) { case 0: _context34.next = 2; - return Gun.SEA.decrypt(data, mySecret); + return Key.decrypt(data, mySecret); case 2: decrypted = _context34.sent; if (decrypted) { @@ -2809,7 +4597,7 @@ var Channel = /*#__PURE__*/function () { return this.getTheirSecretChannelId(pub); case 4: theirSecretChannelId = _context38.sent; - global$2().user(pub).get("chats").get(theirSecretChannelId).get(key).on( /*#__PURE__*/function () { + global$1().user(pub).get("chats").get(theirSecretChannelId).get(key).on( /*#__PURE__*/function () { var _ref7 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee36(data) { var decrypted; return _regeneratorRuntime().wrap(function _callee36$(_context37) { @@ -2822,7 +4610,7 @@ var Channel = /*#__PURE__*/function () { } return _context37.abrupt("return"); case 2: - _context37.t0 = Gun.SEA; + _context37.t0 = Key; _context37.t1 = data; _context37.next = 6; return _this11.getSecret(pub); @@ -2938,7 +4726,7 @@ var Channel = /*#__PURE__*/function () { return this.getTheirSecretUuid(pub); case 4: theirSecretUuid = _context42.sent; - global$2().user(pub).get("chats").get(theirSecretUuid).get(key).on( /*#__PURE__*/function () { + global$1().user(pub).get("chats").get(theirSecretUuid).get(key).on( /*#__PURE__*/function () { var _ref9 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee40(data, _a, _b, e) { var decrypted; return _regeneratorRuntime().wrap(function _callee40$(_context41) { @@ -2954,7 +4742,7 @@ var Channel = /*#__PURE__*/function () { } return _context41.abrupt("return"); case 3: - _context41.t0 = Gun.SEA; + _context41.t0 = Key; _context41.t1 = data; _context41.next = 7; return _this13.getTheirGroupSecret(pub); @@ -3096,36 +4884,6 @@ var Channel = /*#__PURE__*/function () { }); } /** - * Add a chat button to page - * @param options {label, channelOptions} - */; - Channel.addChatButton = function addChatButton(options) { - if (options === void 0) { - options = {}; - } - options = Object.assign({ - label: 'Chat' - }, options); - if (!options.channelOptions) { - throw new Error('addChatButton missing options.channelOptions param'); - } - util.injectCss(); - var channel, box; - var btn = util.createElement('div', 'iris-chat-open-button', document.body); - btn.setAttribute('id', 'iris-chat-open-button'); - btn.innerHTML = " " + options.label; - btn.addEventListener('click', function () { - btn.setAttribute('style', 'display: none'); - if (!channel) { - channel = new Channel(options.channelOptions); - box = channel.getChatBox(); - document.body.appendChild(box); - } else { - box.setAttribute('style', ''); // show - } - }); - } - /** * Get a simple link that points to the channel. * * Direct channel: both users need to give their simple links. Use createChatLink() to get a two-way link that needs to be given by one user only. @@ -3200,7 +4958,7 @@ var Channel = /*#__PURE__*/function () { id: linkId }); if (subscribe) { - global$2().user(link.sharedKey.pub).get('chatRequests').map().on( /*#__PURE__*/function () { + global$1().user(link.sharedKey.pub).get('chatRequests').map( /*#__PURE__*/function () { var _ref11 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee44(encPub, requestId, a, e) { var s, pub; return _regeneratorRuntime().wrap(function _callee44$(_context45) { @@ -3221,7 +4979,7 @@ var Channel = /*#__PURE__*/function () { } channels.push(s); _context45.next = 8; - return Gun.SEA.decrypt(encPub, link.sharedSecret); + return Key.decrypt(encPub, link.sharedSecret); case 8: pub = _context45.sent; _this17.addParticipant(pub, undefined, undefined, true); @@ -3262,24 +5020,24 @@ var Channel = /*#__PURE__*/function () { urlRoot = 'https://iris.to/'; } _context47.next = 3; - return Gun.SEA.pair(); + return Key.generate(); case 3: sharedKey = _context47.sent; sharedKeyString = JSON.stringify(sharedKey); _context47.next = 7; - return Gun.SEA.secret(sharedKey.epub, sharedKey); + return Key.secret(sharedKey.epub, sharedKey); case 7: sharedSecret = _context47.sent; _context47.next = 10; - return Gun.SEA.encrypt(sharedKeyString, sharedSecret); + return Key.encrypt(sharedKeyString, sharedSecret); case 10: encryptedSharedKey = _context47.sent; _context47.next = 13; - return Gun.SEA.secret(session.getKey().epub, session.getKey()); + return Key.secret(session.getKey().epub, session.getKey()); case 13: ownerSecret = _context47.sent; _context47.next = 16; - return Gun.SEA.encrypt(sharedKeyString, ownerSecret); + return Key.encrypt(sharedKeyString, ownerSecret); case 16: ownerEncryptedSharedKey = _context47.sent; _context47.next = 19; @@ -3288,13 +5046,9 @@ var Channel = /*#__PURE__*/function () { linkId = _context47.sent; linkId = linkId.slice(0, 12); // User has to exist, in order for .get(chatRequests).on() to be ever triggered - _context47.next = 23; - return util.gunAsAnotherUser(global$2(), sharedKey, function (user) { - return user.get('chatRequests').put({ - a: 1 - }).then(); + global$1(sharedKey).get('chatRequests').put({ + a: 1 }); - case 23: this.chatLinks[linkId] = { sharedKey: sharedKey, sharedSecret: sharedSecret @@ -3307,175 +5061,41 @@ var Channel = /*#__PURE__*/function () { return _context47.abrupt("return", Channel.formatChatLink({ urlRoot: urlRoot, channelId: this.uuid, - inviter: session.getKey().pub, - sharedSecret: sharedSecret, - linkId: linkId - })); - case 27: - case "end": - return _context47.stop(); - } - } - }, _callee46, this); - })); - function createChatLink(_x86) { - return _createChatLink.apply(this, arguments); - } - return createChatLink; - }() /** - * Get a channel box element that you can add to your page - */; - _proto.getChatBox = function getChatBox() { - var _this18 = this; - util.injectCss(); - var minimized = false; - var chatBox = util.createElement('div', 'iris-chat-box'); - var header = util.createElement('div', 'iris-chat-header', chatBox); - var minimize = util.createElement('span', 'iris-chat-minimize', header); - minimize.innerText = '—'; - minimize.addEventListener('click', function (e) { - e.stopPropagation(); - chatBox.setAttribute('class', 'iris-chat-box minimized'); - minimized = true; - }); - var headerText = util.createElement('div', 'iris-chat-header-text', header); - var onlineIndicator = util.createElement('span', 'iris-online-indicator', headerText); - onlineIndicator.innerHTML = '●'; - var nameEl = util.createElement('span', undefined, headerText); - var close = util.createElement('span', 'iris-chat-close', header); - close.innerHTML = '×'; - close.addEventListener('click', function () { - chatBox.setAttribute('style', 'display: none'); - var openChatBtn = document.getElementById('iris-chat-open-button'); - if (openChatBtn) { - openChatBtn.setAttribute('style', ''); // show - } - }); - - header.addEventListener('click', function () { - if (minimized) { - chatBox.setAttribute('class', 'iris-chat-box'); - minimized = false; - } - }); - var messages = util.createElement('div', 'iris-chat-messages', chatBox); - var typingIndicator = util.createElement('div', 'iris-typing-indicator', chatBox); - typingIndicator.innerText = 'typing...'; - this.getTyping(function (isTyping) { - typingIndicator.setAttribute('class', "iris-typing-indicator" + (isTyping ? ' yes' : '')); - }); - var inputWrapper = util.createElement('div', 'iris-chat-input-wrapper', chatBox); - var textArea = util.createElement('textarea', undefined, inputWrapper); - textArea.setAttribute('rows', '1'); - textArea.setAttribute('placeholder', 'Type a message'); - if (util.isMobile) { - var sendBtn = util.createElement('button', undefined, inputWrapper); - sendBtn.innerHTML = "\n \n "; - sendBtn.addEventListener('click', function () { - _this18.send(textArea.value); - textArea.value = ''; - _this18.setTyping(false); - }); - } - var participants = this.getCurrentParticipants(); - if (participants.length) { - var pub = participants[0]; - global$2().user(pub).get('profile').get('name').on(function (name) { - return nameEl.innerText = name; - }); - Channel.getActivity(global$2(), pub, function (status) { - var cls = "iris-online-indicator" + (status.isActive ? ' yes' : ''); - onlineIndicator.setAttribute('class', cls); - var undelivered = messages.querySelectorAll('.iris-chat-message:not(.delivered)'); - undelivered.forEach(function (msg) { - if (msg.getAttribute('data-time') <= status.lastActive) { - var c = msg.getAttribute('class'); - msg.setAttribute('class', c + " delivered"); - } - }); - }); - } - this.getTheirMsgsLastSeenTime(function (time) { - var unseen = messages.querySelectorAll('.iris-seen:not(.yes)'); - unseen.forEach(function (indicator) { - var msgEl = indicator.parentElement.parentElement.parentElement; - if (msgEl.getAttribute('data-time') <= time) { - var msgClass = msgEl.getAttribute('class'); - if (msgClass.indexOf('delivered') === -1) { - msgEl.setAttribute('class', msgClass + " delivered"); - } - indicator.setAttribute('class', 'iris-seen yes'); - } - }); - }); - this.getMessages(function (msg, info) { - var msgContent = util.createElement('div', 'iris-msg-content'); - msgContent.innerText = msg.text; - var time = util.createElement('div', 'time', msgContent); - time.innerText = util.formatTime(new Date(msg.time)); - if (info.selfAuthored) { - var cls = _this18.theirMsgsLastSeenTime >= msg.time ? 'iris-seen yes' : 'iris-seen'; - var seenIndicator = util.createElement('span', cls, time); - seenIndicator.innerHTML = ' '; - } - msgContent.innerHTML = msgContent.innerHTML.replace(/\n/g, '
\n'); - var msgEl = util.createElement('div', (info.selfAuthored ? 'our' : 'their') + " iris-chat-message"); - msgEl.appendChild(msgContent); - msgEl.setAttribute('data-time', msg.time); - for (var i = messages.children.length; i >= 0; i--) { - if (i === 0) { - messages.insertBefore(msgEl, messages.firstChild); - } else { - var t = messages.children[i - 1].getAttribute('data-time'); - if (t && t < msg.time) { - messages.children[i - 1].insertAdjacentElement('afterend', msgEl); - break; + inviter: session.getKey().pub, + sharedSecret: sharedSecret, + linkId: linkId + })); + case 26: + case "end": + return _context47.stop(); } } - } - messages.scrollTop = messages.scrollHeight; - }); - textArea.addEventListener('keyup', function (event) { - Channel.setActivity(global$2(), true); // TODO - _this18.setMyMsgsLastSeenTime(); // TODO - if (event.keyCode === 13) { - event.preventDefault(); - var content = textArea.value; - var caret = util.getCaret(textArea); - if (event.shiftKey) { - textArea.value = content.substring(0, caret - 1) + "\n" + content.substring(caret, content.length); - } else { - textArea.value = content.substring(0, caret - 1) + content.substring(caret, content.length); - _this18.send(textArea.value); - textArea.value = ''; - _this18.setTyping(false); - } - } else { - _this18.setTyping(!!textArea.value.length); - } - }); - return chatBox; - } - /** - * Set the user's online/active status - * @param {string} activity string: set the activity status every 3 seconds, null/false: stop updating - */; + }, _callee46, this); + })); + function createChatLink(_x86) { + return _createChatLink.apply(this, arguments); + } + return createChatLink; + }() /** + * Set the user's online/active status + * @param {string} activity string: set the activity status every 3 seconds, null/false: stop updating + */; Channel.setActivity = function setActivity(activity) { - if (global$2().irisActivityStatus === activity) { + if (global$1().irisActivityStatus === activity) { return; } - global$2().irisActivityStatus = activity; - clearTimeout(global$2().setActivityTimeout); + global$1().irisActivityStatus = activity; + clearTimeout(global$1().setActivityTimeout); var update = function update() { - global$2().user().get("activity").put({ + global$1().user().get("activity").put({ status: activity, - time: new Date(Gun.state()).toISOString() + time: new Date().toISOString() }); }; update(); function timerUpdate() { update(); - global$2().setActivityTimeout = setTimeout(timerUpdate, 3000); + global$1().setActivityTimeout = setTimeout(timerUpdate, 3000); } if (activity) { timerUpdate(); @@ -3489,12 +5109,12 @@ var Channel = /*#__PURE__*/function () { */; Channel.getActivity = function getActivity(pubKey, callback) { var timeout; - global$2().user(pubKey).get("activity").on(function (activity) { + global$1().user(pubKey).get("activity").on(function (activity) { if (!activity || !(activity.time && activity.status)) { return; } clearTimeout(timeout); - var now = new Date(Gun.state()); + var now = new Date(); var activityDate = new Date(activity.time); var isActive = activityDate > new Date(now.getTime() - 10 * 1000) && activityDate < new Date(now.getTime() + 30 * 1000); callback({ @@ -3540,28 +5160,28 @@ var Channel = /*#__PURE__*/function () { if (urlRoot === void 0) { urlRoot = 'https://iris.to/'; } - user = global$2().user(); + user = global$1().user(); key = session.getKey(); // We create a new Gun user whose private key is shared with the chat link recipients. // Chat link recipients can contact you by writing their public key to the shared key's user space. _context48.next = 5; - return Gun.SEA.pair(); + return Key.generate(); case 5: sharedKey = _context48.sent; sharedKeyString = JSON.stringify(sharedKey); _context48.next = 9; - return Gun.SEA.secret(sharedKey.epub, sharedKey); + return Key.secret(sharedKey.epub, sharedKey); case 9: sharedSecret = _context48.sent; _context48.next = 12; - return Gun.SEA.encrypt(sharedKeyString, sharedSecret); + return Key.encrypt(sharedKeyString, sharedSecret); case 12: encryptedSharedKey = _context48.sent; _context48.next = 15; - return Gun.SEA.secret(key.epub, key); + return Key.secret(key.epub, key); case 15: ownerSecret = _context48.sent; _context48.next = 18; - return Gun.SEA.encrypt(sharedKeyString, ownerSecret); + return Key.encrypt(sharedKeyString, ownerSecret); case 18: ownerEncryptedSharedKey = _context48.sent; _context48.next = 21; @@ -3570,10 +5190,10 @@ var Channel = /*#__PURE__*/function () { linkId = _context48.sent; linkId = linkId.slice(0, 12); // User has to exist, in order for .get(chatRequests).on() to be ever triggered - util.gunAsAnotherUser(global$2(), sharedKey, function (user) { - user.get('chatRequests').put({ - a: 1 - }); + global$1(sharedKey).get('chatRequests').put({ + a: 1 + }).get('chatRequests').put({ + a: 1 }); user.get('chatLinks').get(linkId).put({ encryptedSharedKey: encryptedSharedKey, @@ -3615,13 +5235,13 @@ var Channel = /*#__PURE__*/function () { subscribe = false; } key = session.getKey(); - user = global$2().user(); + user = global$1().user(); _context51.next = 6; - return Gun.SEA.secret(key.epub, key); + return Key.secret(key.epub, key); case 6: mySecret = _context51.sent; chatLinks = []; - user.get('chatLinks').map().on(function (data, linkId) { + user.get('chatLinks').map(function (data, linkId) { if (!data || chatLinks.indexOf(linkId) !== -1) { return; } @@ -3641,11 +5261,11 @@ var Channel = /*#__PURE__*/function () { case 2: chatLinks.push(linkId); _context50.next = 5; - return Gun.SEA.decrypt(enc, mySecret); + return Key.decrypt(enc, mySecret); case 5: sharedKey = _context50.sent; _context50.next = 8; - return Gun.SEA.secret(sharedKey.epub, sharedKey); + return Key.secret(sharedKey.epub, sharedKey); case 8: sharedSecret = _context50.sent; url = Channel.formatChatLink({ @@ -3661,7 +5281,7 @@ var Channel = /*#__PURE__*/function () { }); } if (subscribe) { - global$2().user(sharedKey.pub).get('chatRequests').map().on( /*#__PURE__*/function () { + global$1().user(sharedKey.pub).get('chatRequests').map( /*#__PURE__*/function () { var _ref14 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee48(encPub, requestId) { var s, pub, channel; return _regeneratorRuntime().wrap(function _callee48$(_context49) { @@ -3681,7 +5301,7 @@ var Channel = /*#__PURE__*/function () { } channels.push(s); _context49.next = 7; - return Gun.SEA.decrypt(encPub, sharedSecret); + return Key.decrypt(encPub, sharedSecret); case 7: pub = _context49.sent; channel = new Channel({ @@ -3690,9 +5310,7 @@ var Channel = /*#__PURE__*/function () { }); channel.save(); case 10: - util.gunAsAnotherUser(global$2(), sharedKey, function (user) { - user.get('chatRequests').get(requestId).put(null); - }); + global$1(sharedKey).get('chatRequests').get(requestId).put(null); case 11: case "end": return _context49.stop(); @@ -3734,14 +5352,14 @@ var Channel = /*#__PURE__*/function () { _proto.removeGroupChatLink = function removeGroupChatLink(linkId) { this.chatLinks[linkId] = null; this.put('chatLinks', this.chatLinks); - global$2().user().get('chatLinks').get(linkId).put(null); + global$1().user().get('chatLinks').get(linkId).put(null); } /** * */; Channel.removePrivateChatLink = function removePrivateChatLink(key, linkId) { - global$2().user().auth(key); - global$2().user().get('chatLinks').get(linkId).put(null); + global$1().user().auth(key); + global$1().user().get('chatLinks').get(linkId).put(null); } /** * @@ -3755,13 +5373,13 @@ var Channel = /*#__PURE__*/function () { while (1) { switch (_context52.prev = _context52.next) { case 0: - global$2().user().auth(key); + global$1().user().auth(key); _context52.next = 3; return Channel.getOurSecretChannelId(pub, key); case 3: channelId = _context52.sent; - global$2().user().get('channels').get(channelId).put(null); - global$2().user().get('channels').get(channelId).off(); + global$1().user().get('channels').get(channelId).put(null); + global$1().user().get('channels').get(channelId).off(); case 6: case "end": return _context52.stop(); @@ -3785,426 +5403,57 @@ var Channel = /*#__PURE__*/function () { while (1) { switch (_context53.prev = _context53.next) { case 0: - _context53.next = 2; - return Gun.SEA.secret(key.epub, key); - case 2: - mySecret = _context53.sent; - _context53.next = 5; - return util.getHash(mySecret); - case 5: - mySecretHash = _context53.sent; - _context53.next = 8; - return util.getHash(mySecretHash + uuid); - case 8: - mySecretUuid = _context53.sent; - global$2().user().auth(key); - global$2().user().get('channels').get(mySecretUuid).put(null); - global$2().user().get('channels').get(mySecretUuid).off(); - case 12: - case "end": - return _context53.stop(); - } - } - }, _callee52); - })); - function deleteGroup(_x96, _x97) { - return _deleteGroup.apply(this, arguments); - } - return deleteGroup; - }(); - return Channel; -}(); - -var channels = /*#__PURE__*/new Map(); -/** - * Private channel that only you and publicKey can read/write. - * @param publicKey - * @returns {Channel} - */ -function privateState (publicKey, chatLink) { - if (publicKey === void 0) { - publicKey = session.getKey(); - } - var channel = channels.get(publicKey); - if (!channel) { - channel = new Channel({ - participants: publicKey, - chatLink: chatLink - }); - channels.set(publicKey, channel); - } - return channel; -} - -// Localforage returns null if an item is not found, so we represent null with this uuid instead. -// not foolproof, but good enough for now. -var LOCALFORAGE_NULL = "c2fc1ad0-f76f-11ec-b939-0242ac120002"; -var notInLocalForage = /*#__PURE__*/new Set(); -localForage.config({ - driver: [localForage.LOCALSTORAGE, localForage.INDEXEDDB, localForage.WEBSQL] -}); -/** - Our very own implementation of the Gun API - */ -var Node = /*#__PURE__*/function () { - /** */ - function Node(id, parent) { - var _this = this; - if (id === void 0) { - id = ''; - } - if (parent === void 0) { - parent = null; - } - this.children = new Map(); - this.on_subscriptions = new Map(); - this.map_subscriptions = new Map(); - this.value = undefined; - this.counter = 0; - this.loaded = false; - this.saveLocalForage = _.throttle( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() { - var children; - return _regeneratorRuntime().wrap(function _callee$(_context) { - while (1) { - switch (_context.prev = _context.next) { - case 0: - if (_this.loaded) { - _context.next = 3; - break; - } - _context.next = 3; - return _this.loadLocalForage(); - case 3: - if (_this.children.size) { - children = Array.from(_this.children.keys()); - localForage.setItem(_this.id, children); - } else if (_this.value === undefined) { - localForage.removeItem(_this.id); - } else { - localForage.setItem(_this.id, _this.value === null ? LOCALFORAGE_NULL : _this.value); - } - case 4: - case "end": - return _context.stop(); - } - } - }, _callee); - })), 500); - this.loadLocalForage = _.throttle( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3() { - var result, newResult; - return _regeneratorRuntime().wrap(function _callee3$(_context3) { - while (1) { - switch (_context3.prev = _context3.next) { - case 0: - if (!notInLocalForage.has(_this.id)) { - _context3.next = 2; - break; - } - return _context3.abrupt("return", undefined); - case 2: - _context3.next = 4; - return localForage.getItem(_this.id); - case 4: - result = _context3.sent; - if (!(result === null)) { - _context3.next = 10; - break; - } - result = undefined; - notInLocalForage.add(_this.id); - _context3.next = 22; - break; - case 10: - if (!(result === LOCALFORAGE_NULL)) { - _context3.next = 14; - break; - } - result = null; - _context3.next = 22; - break; - case 14: - if (!Array.isArray(result)) { - _context3.next = 21; - break; - } - // result is a list of children - newResult = {}; - _context3.next = 18; - return Promise.all(result.map( /*#__PURE__*/function () { - var _ref3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(key) { - return _regeneratorRuntime().wrap(function _callee2$(_context2) { - while (1) { - switch (_context2.prev = _context2.next) { - case 0: - _context2.next = 2; - return _this.get(key).once(); - case 2: - newResult[key] = _context2.sent; - case 3: - case "end": - return _context2.stop(); - } - } - }, _callee2); - })); - return function (_x) { - return _ref3.apply(this, arguments); - }; - }())); - case 18: - result = newResult; - _context3.next = 22; - break; - case 21: - // result is a value - _this.value = result; - case 22: - _this.loaded = true; - return _context3.abrupt("return", result); - case 24: - case "end": - return _context3.stop(); - } - } - }, _callee3); - })), 500); - this.doCallbacks = _.throttle(function () { - var _loop3 = function _loop3() { - var _step$value = _step.value, - id = _step$value[0], - callback = _step$value[1]; - var event = { - off: function off() { - return _this.on_subscriptions["delete"](id); - } - }; - _this.once(callback, event, false); - }; - for (var _iterator = _createForOfIteratorHelperLoose(_this.on_subscriptions), _step; !(_step = _iterator()).done;) { - _loop3(); - } - if (_this.parent) { - var _loop = function _loop() { - var _step2$value = _step2.value, - id = _step2$value[0], - callback = _step2$value[1]; - var event = { - off: function off() { - return _this.parent.on_subscriptions["delete"](id); - } - }; - _this.parent.once(callback, event, false); - }; - for (var _iterator2 = _createForOfIteratorHelperLoose(_this.parent.on_subscriptions), _step2; !(_step2 = _iterator2()).done;) { - _loop(); - } - var _loop2 = function _loop2() { - var _step3$value = _step3.value, - id = _step3$value[0], - callback = _step3$value[1]; - var event = { - off: function off() { - return _this.parent.map_subscriptions["delete"](id); - } - }; - _this.once(callback, event, false); - }; - for (var _iterator3 = _createForOfIteratorHelperLoose(_this.parent.map_subscriptions), _step3; !(_step3 = _iterator3()).done;) { - _loop2(); - } - } - }, 40); - this.id = id; - this.parent = parent; - } - /** - * - * @param key - * @returns {Node} - * @example node.get('users').get('alice').put({name: 'Alice'}) - */ - var _proto = Node.prototype; - _proto.get = function get(key) { - var existing = this.children.get(key); - if (existing) { - return existing; - } - var new_node = new Node(this.id + "/" + key, this); - this.children.set(key, new_node); - this.saveLocalForage(); - return new_node; - } - /** - * Set a value to the node. If the value is an object, it will be converted to child nodes. - * @param value - * @example node.get('users').get('alice').put({name: 'Alice'}) - */; - _proto.put = function put(value) { - var _this2 = this; - if (Array.isArray(value)) { - throw new Error('Sorry, we don\'t deal with arrays'); - } - if (typeof value === 'object' && value !== null) { - this.value = undefined; - for (var key in value) { - this.get(key).put(value[key]); - } - _.defer(function () { - return _this2.doCallbacks(); - }, 100); - return; - } - this.children = new Map(); - this.value = value; - this.doCallbacks(); - this.saveLocalForage(); - } - // protip: the code would be a lot cleaner if you separated the Node API from storage adapters. - /** - * Return a value without subscribing to it - * @param callback - * @param event - * @param returnIfUndefined - * @returns {Promise<*>} - */; - _proto.once = - /*#__PURE__*/ - function () { - var _once = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee5(callback, event, returnIfUndefined) { - var _this3 = this; - var result; - return _regeneratorRuntime().wrap(function _callee5$(_context5) { - while (1) { - switch (_context5.prev = _context5.next) { - case 0: - if (returnIfUndefined === void 0) { - returnIfUndefined = true; - } - if (!this.children.size) { - _context5.next = 7; - break; - } - // return an object containing all children - result = {}; - _context5.next = 5; - return Promise.all(Array.from(this.children.keys()).map( /*#__PURE__*/function () { - var _ref4 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee4(key) { - return _regeneratorRuntime().wrap(function _callee4$(_context4) { - while (1) { - switch (_context4.prev = _context4.next) { - case 0: - _context4.next = 2; - return _this3.get(key).once(undefined, event); - case 2: - result[key] = _context4.sent; - case 3: - case "end": - return _context4.stop(); - } - } - }, _callee4); - })); - return function (_x5) { - return _ref4.apply(this, arguments); - }; - }())); - case 5: - _context5.next = 14; - break; - case 7: - if (!(this.value !== undefined)) { - _context5.next = 11; - break; - } - result = this.value; - _context5.next = 14; - break; - case 11: - _context5.next = 13; - return this.loadLocalForage(); - case 13: - result = _context5.sent; - case 14: - if (!(result !== undefined || returnIfUndefined)) { - _context5.next = 17; - break; - } - callback && callback(result, this.id.slice(this.id.lastIndexOf('/') + 1), null, event); - return _context5.abrupt("return", result); - case 17: - case "end": - return _context5.stop(); - } - } - }, _callee5, this); - })); - function once(_x2, _x3, _x4) { - return _once.apply(this, arguments); - } - return once; - }() /** - * Subscribe to a value - * @param callback - */; - _proto.on = function on(callback) { - var _this4 = this; - var id = this.counter++; - this.on_subscriptions.set(id, callback); - var event = { - off: function off() { - return _this4.on_subscriptions["delete"](id); - } - }; - this.once(callback, event, false); - } - /** - * Subscribe to the children of a node. Callback is called separately for each child. - * @param callback - * @returns {Promise} - */; - _proto.map = - /*#__PURE__*/ - function () { - var _map = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee6(callback) { - var _this5 = this; - var id, event, _iterator4, _step4, child; - return _regeneratorRuntime().wrap(function _callee6$(_context6) { - while (1) { - switch (_context6.prev = _context6.next) { - case 0: - id = this.counter++; - this.map_subscriptions.set(id, callback); - event = { - off: function off() { - return _this5.map_subscriptions["delete"](id); - } - }; - if (this.loaded) { - _context6.next = 6; - break; - } - _context6.next = 6; - return this.loadLocalForage(); - case 6: - for (_iterator4 = _createForOfIteratorHelperLoose(this.children.values()); !(_step4 = _iterator4()).done;) { - child = _step4.value; - child.once(callback, event, false); - } - case 7: + _context53.next = 2; + return Key.secret(key.epub, key); + case 2: + mySecret = _context53.sent; + _context53.next = 5; + return util.getHash(mySecret); + case 5: + mySecretHash = _context53.sent; + _context53.next = 8; + return util.getHash(mySecretHash + uuid); + case 8: + mySecretUuid = _context53.sent; + global$1().user().auth(key); + global$1().user().get('channels').get(mySecretUuid).put(null); + global$1().user().get('channels').get(mySecretUuid).off(); + case 12: case "end": - return _context6.stop(); + return _context53.stop(); } } - }, _callee6, this); + }, _callee52); })); - function map(_x6) { - return _map.apply(this, arguments); + function deleteGroup(_x96, _x97) { + return _deleteGroup.apply(this, arguments); } - return map; + return deleteGroup; }(); - return Node; + return Channel; }(); +var channels = /*#__PURE__*/new Map(); +/** + * Private channel that only you and publicKey can read/write. + * @param publicKey + * @returns {Channel} + */ +function privateState (publicKey, chatLink) { + if (publicKey === void 0) { + publicKey = session.getKey(); + } + var channel = channels.get(publicKey); + if (!channel) { + channel = new Channel({ + participants: publicKey, + chatLink: chatLink + }); + channels.set(publicKey, channel); + } + return channel; +} + var local; /** * Get a state that is only synced in memory and local storage. @@ -4214,7 +5463,7 @@ var local; */ function local$1 () { if (!local) { - local = new Node(); + local = new Node('local'); } return local; } @@ -4560,7 +5809,7 @@ var addWebPushSubscriptionsToChats = /*#__PURE__*/_.debounce(function () { }, 5000); function removeSubscription(hash) { delete webPushSubscriptions[hash]; - global$2().user().get('webPushSubscriptions').get(hash).put(null); + global$1().user().get('webPushSubscriptions').get(hash).put(null); addWebPushSubscriptionsToChats(); } function addWebPushSubscription(_x2, _x3) { @@ -4578,11 +5827,11 @@ function _addWebPushSubscription() { } myKey = session.getKey(); _context5.next = 4; - return Gun.SEA.secret(myKey.epub, myKey); + return Key.secret(myKey.epub, myKey); case 4: mySecret = _context5.sent; _context5.next = 7; - return Gun.SEA.encrypt(s, mySecret); + return Key.encrypt(s, mySecret); case 7: enc = _context5.sent; _context5.next = 10; @@ -4590,7 +5839,7 @@ function _addWebPushSubscription() { case 10: hash = _context5.sent; if (saveToGun) { - global$2().user().get('webPushSubscriptions').get(hash).put(enc); + global$1().user().get('webPushSubscriptions').get(hash).put(enc); } webPushSubscriptions[hash] = s; addWebPushSubscriptionsToChats(); @@ -4615,10 +5864,10 @@ function _getWebPushSubscriptions() { case 0: myKey = session.getKey(); _context7.next = 3; - return Gun.SEA.secret(myKey.epub, myKey); + return Key.secret(myKey.epub, myKey); case 3: mySecret = _context7.sent; - global$2().user().get('webPushSubscriptions').map().on( /*#__PURE__*/function () { + global$1().user().get('webPushSubscriptions').map( /*#__PURE__*/function () { var _ref3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee6(enc) { var s; return _regeneratorRuntime().wrap(function _callee6$(_context6) { @@ -4632,7 +5881,7 @@ function _getWebPushSubscriptions() { return _context6.abrupt("return"); case 2: _context6.next = 4; - return Gun.SEA.decrypt(enc, mySecret); + return Key.decrypt(enc, mySecret); case 4: s = _context6.sent; addWebPushSubscription(s, false); @@ -4658,7 +5907,7 @@ function _getWebPushSubscriptions() { } function getEpub(user) { return new Promise(function (resolve) { - global$2().user(user).get('epub').on( /*#__PURE__*/function () { + global$1().user(user).get('epub').on( /*#__PURE__*/function () { var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(epub, k, x, e) { return _regeneratorRuntime().wrap(function _callee$(_context) { while (1) { @@ -4692,7 +5941,7 @@ function _getNotificationText() { switch (_context8.prev = _context8.next) { case 0: _context8.next = 2; - return global$2().user(notification.from).get('profile').once(); + return global$1().user(notification.from).get('profile').once(); case 2: profile = _context8.sent; name = profile && profile.name || 'someone'; @@ -4711,15 +5960,15 @@ function _getNotificationText() { function subscribeToIrisNotifications(onClick) { var notificationsSeenTime; var notificationsShownTime; - global$2().user().get('notificationsSeenTime').on(function (v) { + global$1().user().get('notificationsSeenTime').on(function (v) { notificationsSeenTime = v; console.log(v); }); - global$2().user().get('notificationsShownTime').on(function (v) { + global$1().user().get('notificationsShownTime').on(function (v) { return notificationsShownTime = v; }); var setNotificationsShownTime = _.debounce(function () { - global$2().user().get('notificationsShownTime').put(new Date().toISOString()); + global$1().user().get('notificationsShownTime').put(new Date().toISOString()); }, 1000); var alreadyHave = new Set(); group().on("notifications/" + session.getPubKey(), /*#__PURE__*/function () { @@ -4742,11 +5991,11 @@ function subscribeToIrisNotifications(onClick) { case 6: epub = _context2.sent; _context2.next = 9; - return Gun.SEA.secret(epub, session.getKey()); + return Key.secret(epub, session.getKey()); case 9: secret = _context2.sent; _context2.next = 12; - return Gun.SEA.decrypt(encryptedNotification, secret); + return Key.decrypt(encryptedNotification, secret); case 12: notification = _context2.sent; if (!(!notification || typeof notification !== 'object')) { @@ -4796,7 +6045,7 @@ function subscribeToIrisNotifications(onClick) { function changeUnseenNotificationCount(change) { if (!change) { unseenNotificationCount = 0; - global$2().user().get('notificationsSeenTime').put(new Date().toISOString()); + global$1().user().get('notificationsSeenTime').put(new Date().toISOString()); } else { unseenNotificationCount += change; unseenNotificationCount = Math.max(unseenNotificationCount, 0); @@ -4828,14 +6077,14 @@ function _sendIrisNotification() { case 5: epub = _context9.sent; _context9.next = 8; - return Gun.SEA.secret(epub, session.getKey()); + return Key.secret(epub, session.getKey()); case 8: secret = _context9.sent; _context9.next = 11; - return Gun.SEA.encrypt(notification, secret); + return Key.encrypt(notification, secret); case 11: enc = _context9.sent; - global$2().user().get('notifications').get(recipient).put(enc); + global$1().user().get('notifications').get(recipient).put(enc); case 13: case "end": return _context9.stop(); @@ -4883,11 +6132,11 @@ function _sendWebPushNotification() { case 3: secret = _context10.sent; _context10.next = 6; - return Gun.SEA.encrypt(notification.title, secret); + return Key.encrypt(notification.title, secret); case 6: _context10.t0 = _context10.sent; _context10.next = 9; - return Gun.SEA.encrypt(notification.body, secret); + return Key.encrypt(notification.body, secret); case 9: _context10.t1 = _context10.sent; _context10.t2 = { @@ -4985,12 +6234,8 @@ var notifications = { removeSubscription: removeSubscription }; -var electron = util.isElectron ? /*#__PURE__*/new Gun({ - peers: ['http://localhost:8768/gun'], - file: 'State.electron', - multicast: false, - localStorage: false -}).get('state') : null; +// TODO config {peers: ['http://localhost:8768/gun'], file: 'State.electron', multicast:false, localStorage: false} +var electron = util.isElectron ? /*#__PURE__*/new Node('electron').get('state') : null; var key; var myName; @@ -5037,6 +6282,7 @@ var session = { } initCalled = true; var localStorageKey = localStorage.getItem('chatKeyPair'); + console.log('localStorageKey', localStorageKey); if (localStorageKey) { this.login(JSON.parse(localStorageKey)); } else if (options.autologin !== false) { @@ -5118,7 +6364,6 @@ var session = { this.updateNoFollowers(); } } - console.log('removeFollow', k, followDistance, follower); if (searchableItems[k] && searchableItems[k].followers.size === 0) { delete searchableItems[k]; local$1().get('contacts').get(k).put(false); @@ -5142,7 +6387,7 @@ var session = { } getExtendedFollowsCalled.set(k, currentDepth); this.addFollow(callback, k, currentDepth - 1); - publicState(k).get('follow').map().on(function (isFollowing, followedKey) { + publicState(k).get('follow').map(function (isFollowing, followedKey) { if (isFollowing) { _this2.addFollow(callback, followedKey, currentDepth, k); if (currentDepth < maxDepth) { @@ -5230,25 +6475,18 @@ var session = { * @param key */login: function login(k) { var _this4 = this; + console.log('login', k); var shouldRefresh = !!key; + console.log('shouldRefresh', shouldRefresh, 'key', key); key = k; localStorage.setItem('chatKeyPair', JSON.stringify(k)); publicState().auth(key); publicState().put({ epub: key.epub }); - publicState().get('likes').put({ - a: null - }); // gun bug? - publicState().get('msgs').put({ - a: null - }); // gun bug? - publicState().get('replies').put({ - a: null - }); // gun bug? notifications.subscribeToWebPush(); notifications.getWebPushSubscriptions(); - notifications.subscribeToIrisNotifications(); + //notifications.subscribeToIrisNotifications(); Channel.getMyChatLinks(undefined, function (chatLink) { local$1().get('chatLinks').get(chatLink.id).put(chatLink.url); latestChatLink = chatLink.url; @@ -5262,8 +6500,10 @@ var session = { myName = name; } }); + // a lot of this is iris-messenger stuff notifications.init(); local$1().get('loggedIn').put(true); + console.log('local().get(\'loggedIn\').put(true);', local$1()); local$1().get('settings').once().then(function (settings) { if (!settings) { local$1().get('settings').put(DEFAULT_SETTINGS.local); @@ -5272,7 +6512,7 @@ var session = { local$1().get('settings').get('autoplayWebtorrent').put(DEFAULT_SETTINGS.local.autoplayWebtorrent); } }); - publicState().get('block').map().on(function (isBlocked, user) { + publicState().get('block').map(function (isBlocked, user) { local$1().get('block').get(user).put(isBlocked); if (isBlocked) { delete searchableItems[user]; @@ -5305,7 +6545,7 @@ var session = { } var name = options.name || util.generateName(); console.log('loginAsNewUser name', name); - return Gun.SEA.pair().then(function (k) { + return Key.generate().then(function (k) { _this5.login(k); publicState().get('profile').put({ a: null @@ -5373,12 +6613,10 @@ var session = { case 16: _this6.clearIndexedDB(); localStorage.clear(); // TODO clear only iris data - localForage.clear().then(function () { - window.location.hash = ''; - window.location.href = '/'; - location.reload(); - }); - case 19: + window.location.hash = ''; + window.location.href = '/'; + location.reload(); + case 21: case "end": return _context.stop(); } @@ -5614,304 +6852,110 @@ var session = { if (chat.messageIds[msg.time + info.from]) return; chat.messageIds[msg.time + info.from] = true; if (info) { - msg = Object.assign(msg, info); - } - if (msg.invite) { - var chatLink = "https://iris.to/?channelId=" + msg.invite.group + "&inviter=" + chatId; - this.newChannel(msg.invite.group, chatLink); - return; - } - msg.selfAuthored = info.selfAuthored; - local$1().get('channels').get(chatId).get('msgs').get(msg.time + (msg.from && msg.from.slice(0, 10))).put(JSON.stringify(msg)); - msg.timeObj = new Date(msg.time); - if (!info.selfAuthored && msg.timeObj > chat.myLastSeenTime) { - if (window.location.hash !== "#/chat/" + chatId || document.visibilityState !== 'visible') { - notifications.changeChatUnseenCount(chatId, 1); - } else if (ourActivity === 'active') { - chat.setMyMsgsLastSeenTime(); - } - } - if (!info.selfAuthored && msg.time > chat.theirMsgsLastSeenTime) { - local$1().get('channels').get(chatId).get('theirMsgsLastSeenTime').put(msg.time); - } - if (!chat.latestTime || msg.time > chat.latestTime) { - local$1().get('channels').get(chatId).put({ - latestTime: msg.time, - latest: { - time: msg.time, - text: msg.text, - selfAuthored: info.selfAuthored - } - }); - } - // TODO: onclickNotification should do route(`/chat/${ pub}`); - notifications.notifyMsg(msg, info, chatId, onClickNotification); - }, - subscribeToMsgs: function subscribeToMsgs(pub) { - var _this9 = this; - var c = privateState(pub); - if (c.subscribed) { - return; - } - c.subscribed = true; - c.getMessages(function (msg, info) { - _this9.processMessage(pub, msg, info); - }); - }, - /** - * Known private channels with other users - */ - channelIds: /*#__PURE__*/new Set() -}; - -/** - * Content-addressed storage - */ -var staticState = { - /** - * Get a file identified by its hash - * @param hash - * @param callback - * @returns {Promise} - */get: function get(hash, callback) { - return new Promise(function (resolve, reject) { - if (!hash) { - reject('No hash provided'); - } - if (typeof hash !== 'string') { - reject('Hash must be a string'); - } - global$2().get('#').get(hash).on(function (v, _k, _x, e) { - if (v) { - e.off(); - callback && callback(v); - resolve(v); - } - }); - }); - }, - /** - * Store a file and return its hash - * @param value - * @returns {Promise} - */put: function put(value) { - return _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() { - var hash; - return _regeneratorRuntime().wrap(function _callee$(_context) { - while (1) { - switch (_context.prev = _context.next) { - case 0: - _context.next = 2; - return util.getHash(value); - case 2: - hash = _context.sent; - global$2().get('#').get(hash).put(value); - return _context.abrupt("return", hash); - case 5: - case "end": - return _context.stop(); - } - } - }, _callee); - }))(); - } -}; - -// eslint-disable-line no-unused-vars -var myKey; -var Key = /*#__PURE__*/function () { - function Key() {} - Key.getActiveKey = /*#__PURE__*/function () { - var _getActiveKey = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(datadir, keyfile, fs) { - var privKeyFile, f, newKey, str, _newKey; - return _regeneratorRuntime().wrap(function _callee$(_context) { - while (1) { - switch (_context.prev = _context.next) { - case 0: - if (datadir === void 0) { - datadir = "."; - } - if (keyfile === void 0) { - keyfile = "iris.key"; - } - if (!myKey) { - _context.next = 4; - break; - } - return _context.abrupt("return", myKey); - case 4: - if (!fs) { - _context.next = 21; - break; - } - privKeyFile = datadir + "/" + keyfile; - if (!fs.existsSync(privKeyFile)) { - _context.next = 11; - break; - } - f = fs.readFileSync(privKeyFile, "utf8"); - myKey = Key.fromString(f); - _context.next = 17; - break; - case 11: - _context.next = 13; - return Key.generate(); - case 13: - newKey = _context.sent; - myKey = myKey || newKey; // eslint-disable-line require-atomic-updates - fs.writeFileSync(privKeyFile, Key.toString(myKey)); - fs.chmodSync(privKeyFile, 400); - case 17: - if (myKey) { - _context.next = 19; - break; - } - throw new Error("loading default key failed - check " + datadir + "/" + keyfile); - case 19: - _context.next = 33; - break; - case 21: - str = window.localStorage.getItem("iris.myKey"); - if (!str) { - _context.next = 26; - break; - } - myKey = Key.fromString(str); - _context.next = 31; - break; - case 26: - _context.next = 28; - return Key.generate(); - case 28: - _newKey = _context.sent; - myKey = myKey || _newKey; // eslint-disable-line require-atomic-updates - window.localStorage.setItem("iris.myKey", Key.toString(myKey)); - case 31: - if (myKey) { - _context.next = 33; - break; - } - throw new Error("loading default key failed - check localStorage iris.myKey"); - case 33: - return _context.abrupt("return", myKey); - case 34: - case "end": - return _context.stop(); - } - } - }, _callee); - })); - function getActiveKey(_x, _x2, _x3) { - return _getActiveKey.apply(this, arguments); - } - return getActiveKey; - }(); - Key.getDefault = function getDefault(datadir, keyfile) { - if (datadir === void 0) { - datadir = "."; - } - if (keyfile === void 0) { - keyfile = "iris.key"; - } - return Key.getActiveKey(datadir, keyfile); - }; - Key.getActivePub = /*#__PURE__*/function () { - var _getActivePub = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(datadir, keyfile) { - var key; - return _regeneratorRuntime().wrap(function _callee2$(_context2) { - while (1) { - switch (_context2.prev = _context2.next) { - case 0: - if (datadir === void 0) { - datadir = "."; - } - if (keyfile === void 0) { - keyfile = "iris.key"; - } - _context2.next = 4; - return Key.getActiveKey(datadir, keyfile); - case 4: - key = _context2.sent; - return _context2.abrupt("return", key.pub); - case 6: - case "end": - return _context2.stop(); - } - } - }, _callee2); - })); - function getActivePub(_x4, _x5) { - return _getActivePub.apply(this, arguments); - } - return getActivePub; - }(); - Key.setActiveKey = function setActiveKey(key, save, datadir, keyfile, fs) { - if (save === void 0) { - save = true; + msg = Object.assign(msg, info); } - if (datadir === void 0) { - datadir = "."; + if (msg.invite) { + var chatLink = "https://iris.to/?channelId=" + msg.invite.group + "&inviter=" + chatId; + this.newChannel(msg.invite.group, chatLink); + return; } - if (keyfile === void 0) { - keyfile = "iris.key"; + msg.selfAuthored = info.selfAuthored; + local$1().get('channels').get(chatId).get('msgs').get(msg.time + (msg.from && msg.from.slice(0, 10))).put(JSON.stringify(msg)); + msg.timeObj = new Date(msg.time); + if (!info.selfAuthored && msg.timeObj > chat.myLastSeenTime) { + if (window.location.hash !== "#/chat/" + chatId || document.visibilityState !== 'visible') { + notifications.changeChatUnseenCount(chatId, 1); + } else if (ourActivity === 'active') { + chat.setMyMsgsLastSeenTime(); + } } - myKey = key; - if (!save) return; - if (util.isNode) { - var privKeyFile = datadir + "/" + keyfile; - fs.writeFileSync(privKeyFile, Key.toString(myKey)); - fs.chmodSync(privKeyFile, 400); - } else { - window.localStorage.setItem("iris.myKey", Key.toString(myKey)); + if (!info.selfAuthored && msg.time > chat.theirMsgsLastSeenTime) { + local$1().get('channels').get(chatId).get('theirMsgsLastSeenTime').put(msg.time); } - }; - Key.toString = function toString(key) { - return JSON.stringify(key); - }; - Key.getId = function getId(key) { - if (!(key && key.pub)) { - throw new Error("missing param"); + if (!chat.latestTime || msg.time > chat.latestTime) { + local$1().get('channels').get(chatId).put({ + latestTime: msg.time, + latest: { + time: msg.time, + text: msg.text, + selfAuthored: info.selfAuthored + } + }); } - return key.pub; // hack until GUN supports lookups by keyID - //return util.getHash(key.pub); - }; - Key.fromString = function fromString(str) { - return JSON.parse(str); - }; - Key.generate = function generate() { - return Gun.SEA.pair(); - }; - Key.sign = /*#__PURE__*/function () { - var _sign = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3(msg, pair) { - var sig; - return _regeneratorRuntime().wrap(function _callee3$(_context3) { + // TODO: onclickNotification should do route(`/chat/${ pub}`); + notifications.notifyMsg(msg, info, chatId, onClickNotification); + }, + subscribeToMsgs: function subscribeToMsgs(pub) { + var _this9 = this; + var c = privateState(pub); + if (c.subscribed) { + return; + } + c.subscribed = true; + c.getMessages(function (msg, info) { + _this9.processMessage(pub, msg, info); + }); + }, + /** + * Known private channels with other users + */ + channelIds: /*#__PURE__*/new Set() +}; + +/** + * Content-addressed storage + */ +var staticState = { + /** + * Get a file identified by its hash + * @param hash + * @param callback + * @returns {Promise} + */get: function get(hash, callback) { + return new Promise(function (resolve, reject) { + if (!hash) { + reject('No hash provided'); + } + if (typeof hash !== 'string') { + reject('Hash must be a string'); + } + global$1().get('#').get(hash).on(function (v, _k, _x, e) { + if (v) { + e.off(); + callback && callback(v); + resolve(v); + } + }); + }); + }, + /** + * Store a file and return its hash + * @param value + * @returns {Promise} + */put: function put(value) { + return _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() { + var hash; + return _regeneratorRuntime().wrap(function _callee$(_context) { while (1) { - switch (_context3.prev = _context3.next) { + switch (_context.prev = _context.next) { case 0: - _context3.next = 2; - return Gun.SEA.sign(msg, pair); + _context.next = 2; + return util.getHash(value); case 2: - sig = _context3.sent; - return _context3.abrupt("return", "a" + sig); - case 4: + hash = _context.sent; + global$1().get('#').get(hash).put(value); + return _context.abrupt("return", hash); + case 5: case "end": - return _context3.stop(); + return _context.stop(); } } - }, _callee3); - })); - function sign(_x6, _x7) { - return _sign.apply(this, arguments); - } - return sign; - }(); - Key.verify = function verify(msg, pubKey) { - return Gun.SEA.verify(msg.slice(1), pubKey); - }; - return Key; -}(); + }, _callee); + }))(); + } +}; -var errorMsg = "Invalid message:"; +var errorMsg = "Invalid message:"; var ValidationError = /*#__PURE__*/function (_Error) { _inheritsLoose(ValidationError, _Error); function ValidationError() { @@ -5934,23 +6978,6 @@ var ValidationError = /*#__PURE__*/function (_Error) { * Constructor: creates a message from the param obj.signedData that must contain at least the mandatory fields: author, type and time. * @param obj * - * @example - * https://github.com/irislib/iris-lib/blob/master/__tests__/SignedMessage.js - * - * Verification message: - * { - * signedData: { - * author: {name:'Alice', key:'ABCD1234'}, - * recipient: { - * name: 'Bob', - * email: ['bob@example.com', 'bob.saget@example.com'], - * bitcoin: '1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa' - * }, - * type: 'verification' - * }, - * signer: 'ABCD1234', - * signature: '1234ABCD' - * } */ var SignedMessage = /*#__PURE__*/function () { function SignedMessage(obj) { @@ -5965,89 +6992,7 @@ var SignedMessage = /*#__PURE__*/function () { } this._validate(); } - SignedMessage._getArray = function _getArray(authorOrRecipient) { - var arr = []; - var keys = Object.keys(authorOrRecipient); - for (var i = 0; i < keys.length; i++) { - var type = keys[i]; - var value = authorOrRecipient[keys[i]]; - if (typeof value === "string") { - arr.push(new Attribute(type, value)); - } else { - // array - for (var j = 0; j < value.length; j++) { - var elementValue = value[j]; - arr.push(new Attribute(type, elementValue)); - } - } - } - return arr; - }; - SignedMessage._getIterable = function _getIterable(authorOrRecipient) { - var _ref; - return _ref = {}, _ref[Symbol.iterator] = /*#__PURE__*/_regeneratorRuntime().mark(function _callee() { - var keys, i, type, value, j, elementValue; - return _regeneratorRuntime().wrap(function _callee$(_context) { - while (1) { - switch (_context.prev = _context.next) { - case 0: - keys = Object.keys(authorOrRecipient); - i = 0; - case 2: - if (!(i < keys.length)) { - _context.next = 21; - break; - } - type = keys[i]; - value = authorOrRecipient[keys[i]]; - if (!(typeof value === "string")) { - _context.next = 10; - break; - } - _context.next = 8; - return new Attribute(type, value); - case 8: - _context.next = 18; - break; - case 10: - j = 0; - case 11: - if (!(j < value.length)) { - _context.next = 18; - break; - } - elementValue = value[j]; - _context.next = 15; - return new Attribute(type, elementValue); - case 15: - j++; - _context.next = 11; - break; - case 18: - i++; - _context.next = 2; - break; - case 21: - case "end": - return _context.stop(); - } - } - }, _callee); - }), _ref; - }; var _proto = SignedMessage.prototype; - _proto.getAuthorIterable = function getAuthorIterable() { - return SignedMessage._getIterable(this.signedData.author); - }; - _proto.getRecipientIterable = function getRecipientIterable() { - return SignedMessage._getIterable(this.signedData.recipient); - }; - _proto.getAuthorArray = function getAuthorArray() { - return SignedMessage._getArray(this.signedData.author); - }; - _proto.getRecipientArray = function getRecipientArray() { - return this.signedData.recipient ? SignedMessage._getArray(this.signedData.recipient) : []; - }; _proto.getSignerKeyID = function getSignerKeyID() { return this.pubKey; // hack until gun supports keyID lookups //return util.getHash(this.pubKey); @@ -6137,68 +7082,34 @@ var SignedMessage = /*#__PURE__*/function () { if (!Date.parse(d.time || d.timestamp)) { throw new ValidationError(errorMsg + " Invalid time field"); } - if (d.type === "rating") { - if (isNaN(d.rating)) { - throw new ValidationError(errorMsg + " Invalid rating"); - } - if (isNaN(d.maxRating)) { - throw new ValidationError(errorMsg + " Invalid maxRating"); - } - if (isNaN(d.minRating)) { - throw new ValidationError(errorMsg + " Invalid minRating"); - } - if (d.rating > d.maxRating) { - throw new ValidationError(errorMsg + " Rating is above maxRating"); - } - if (d.rating < d.minRating) { - throw new ValidationError(errorMsg + " Rating is below minRating"); - } - if (typeof d.context !== "string" || !d.context.length) { - throw new ValidationError(errorMsg + " Rating messages must have a context field"); - } - } - if (d.type === "verification" || d.type === "unverification") { - if (d.recipient.length < 2) { - throw new ValidationError(errorMsg + " At least 2 recipient attributes are needed for a connection / disconnection. Got: " + d.recipient); - } - } return true; - }; - _proto.isPositive = function isPositive() { - return this.signedData.type === "rating" && this.signedData.rating > (this.signedData.maxRating + this.signedData.minRating) / 2; - }; - _proto.isNegative = function isNegative() { - return this.signedData.type === "rating" && this.signedData.rating < (this.signedData.maxRating + this.signedData.minRating) / 2; - }; - _proto.isNeutral = function isNeutral() { - return this.signedData.type === "rating" && this.signedData.rating === (this.signedData.maxRating + this.signedData.minRating) / 2; } /** - * @param {Object} key Gun.SEA keypair to sign the message with + * @param {Object} key keypair to sign the message with */; _proto.sign = /*#__PURE__*/ function () { - var _sign = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(key) { - return _regeneratorRuntime().wrap(function _callee2$(_context2) { + var _sign = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(key) { + return _regeneratorRuntime().wrap(function _callee$(_context) { while (1) { - switch (_context2.prev = _context2.next) { + switch (_context.prev = _context.next) { case 0: - _context2.next = 2; + _context.next = 2; return Key.sign(this.signedData, key); case 2: - this.sig = _context2.sent; + this.sig = _context.sent; this.pubKey = key.pub; - _context2.next = 6; + _context.next = 6; return this.getHash(); case 6: - return _context2.abrupt("return", true); + return _context.abrupt("return", true); case 7: case "end": - return _context2.stop(); + return _context.stop(); } } - }, _callee2, this); + }, _callee, this); })); function sign(_x) { return _sign.apply(this, arguments); @@ -6213,11 +7124,11 @@ var SignedMessage = /*#__PURE__*/function () { SignedMessage.create = /*#__PURE__*/ function () { - var _create = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3(signedData, signingKey) { + var _create = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(signedData, signingKey) { var m; - return _regeneratorRuntime().wrap(function _callee3$(_context3) { + return _regeneratorRuntime().wrap(function _callee2$(_context2) { while (1) { - switch (_context3.prev = _context3.next) { + switch (_context2.prev = _context2.next) { case 0: if (!signedData.author && signingKey) { signedData.author = { @@ -6229,36 +7140,25 @@ var SignedMessage = /*#__PURE__*/function () { signedData: signedData }); if (!signingKey) { - _context3.next = 6; + _context2.next = 6; break; } - _context3.next = 6; + _context2.next = 6; return m.sign(signingKey); case 6: - return _context3.abrupt("return", m); + return _context2.abrupt("return", m); case 7: case "end": - return _context3.stop(); + return _context2.stop(); } } - }, _callee3); + }, _callee2); })); function create(_x2, _x3) { return _create.apply(this, arguments); } return create; }(); - SignedMessage.createVerification = function createVerification(signedData, signingKey) { - signedData.type = "verification"; - return SignedMessage.create(signedData, signingKey); - }; - SignedMessage.createRating = function createRating(signedData, signingKey) { - signedData.type = "rating"; - signedData.context = signedData.context || "iris"; - signedData.maxRating = signedData.maxRating || 10; - signedData.minRating = signedData.minRating || -10; - return SignedMessage.create(signedData, signingKey); - }; _proto.getAuthor = function getAuthor(index) { for (var _iterator = _createForOfIteratorHelperLoose(this.getAuthorIterable()), _step; !(_step = _iterator()).done;) { var a = _step.value; @@ -6284,27 +7184,27 @@ var SignedMessage = /*#__PURE__*/function () { _proto.getHash = /*#__PURE__*/ function () { - var _getHash = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee4() { - return _regeneratorRuntime().wrap(function _callee4$(_context4) { + var _getHash = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3() { + return _regeneratorRuntime().wrap(function _callee3$(_context3) { while (1) { - switch (_context4.prev = _context4.next) { + switch (_context3.prev = _context3.next) { case 0: if (!(this.sig && !this.hash)) { - _context4.next = 4; + _context3.next = 4; break; } - _context4.next = 3; + _context3.next = 3; return util.getHash(this.sig); case 3: - this.hash = _context4.sent; + this.hash = _context3.sent; case 4: - return _context4.abrupt("return", this.hash); + return _context3.abrupt("return", this.hash); case 5: case "end": - return _context4.stop(); + return _context3.stop(); } } - }, _callee4, this); + }, _callee3, this); })); function getHash() { return _getHash.apply(this, arguments); @@ -6315,20 +7215,20 @@ var SignedMessage = /*#__PURE__*/function () { return this.getHash(); }; SignedMessage.fromSig = /*#__PURE__*/function () { - var _fromSig = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee5(obj) { + var _fromSig = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee4(obj) { var signedData, o; - return _regeneratorRuntime().wrap(function _callee5$(_context5) { + return _regeneratorRuntime().wrap(function _callee4$(_context4) { while (1) { - switch (_context5.prev = _context5.next) { + switch (_context4.prev = _context4.next) { case 0: if (obj.sig) { - _context5.next = 2; + _context4.next = 2; break; } throw new Error("Missing signature in object:", obj); case 2: if (obj.pubKey) { - _context5.next = 4; + _context4.next = 4; break; } throw new Error("Missing pubKey in object:"); @@ -6340,13 +7240,13 @@ var SignedMessage = /*#__PURE__*/function () { sig: obj.sig, pubKey: obj.pubKey }; - return _context5.abrupt("return", new SignedMessage(o)); + return _context4.abrupt("return", new SignedMessage(o)); case 7: case "end": - return _context5.stop(); + return _context4.stop(); } } - }, _callee5); + }, _callee4); })); function fromSig(_x4) { return _fromSig.apply(this, arguments); @@ -6358,60 +7258,60 @@ var SignedMessage = /*#__PURE__*/function () { _proto.verify = /*#__PURE__*/ function () { - var _verify = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee6() { - return _regeneratorRuntime().wrap(function _callee6$(_context6) { + var _verify = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee5() { + return _regeneratorRuntime().wrap(function _callee5$(_context5) { while (1) { - switch (_context6.prev = _context6.next) { + switch (_context5.prev = _context5.next) { case 0: if (this.pubKey) { - _context6.next = 2; + _context5.next = 2; break; } throw new ValidationError(errorMsg + " SignedMessage has no .pubKey"); case 2: if (this.sig) { - _context6.next = 4; + _context5.next = 4; break; } throw new ValidationError(errorMsg + " SignedMessage has no .sig"); case 4: - _context6.next = 6; + _context5.next = 6; return Key.verify(this.sig, this.pubKey); case 6: - this.signedData = _context6.sent; + this.signedData = _context5.sent; if (this.signedData) { - _context6.next = 9; + _context5.next = 9; break; } throw new ValidationError(errorMsg + " Invalid signature"); case 9: if (!this.hash) { - _context6.next = 18; + _context5.next = 18; break; } - _context6.t0 = this.hash; - _context6.next = 13; + _context5.t0 = this.hash; + _context5.next = 13; return util.getHash(this.sig); case 13: - _context6.t1 = _context6.sent; - if (!(_context6.t0 !== _context6.t1)) { - _context6.next = 16; + _context5.t1 = _context5.sent; + if (!(_context5.t0 !== _context5.t1)) { + _context5.next = 16; break; } throw new ValidationError(errorMsg + " Invalid message hash"); case 16: - _context6.next = 19; + _context5.next = 19; break; case 18: this.getHash(); case 19: - return _context6.abrupt("return", true); + return _context5.abrupt("return", true); case 20: case "end": - return _context6.stop(); + return _context5.stop(); } } - }, _callee6, this); + }, _callee5, this); })); function verify() { return _verify.apply(this, arguments); @@ -6435,18 +7335,18 @@ var SignedMessage = /*#__PURE__*/function () { SignedMessage.deserialize = /*#__PURE__*/ function () { - var _deserialize = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee7(s) { - return _regeneratorRuntime().wrap(function _callee7$(_context7) { + var _deserialize = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee6(s) { + return _regeneratorRuntime().wrap(function _callee6$(_context6) { while (1) { - switch (_context7.prev = _context7.next) { + switch (_context6.prev = _context6.next) { case 0: - return _context7.abrupt("return", SignedMessage.fromSig(s)); + return _context6.abrupt("return", SignedMessage.fromSig(s)); case 1: case "end": - return _context7.stop(); + return _context6.stop(); } } - }, _callee7); + }, _callee6); })); function deserialize(_x5) { return _deserialize.apply(this, arguments); @@ -6454,58 +7354,31 @@ var SignedMessage = /*#__PURE__*/function () { return deserialize; }(); SignedMessage.fromString = /*#__PURE__*/function () { - var _fromString = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee8(s) { - return _regeneratorRuntime().wrap(function _callee8$(_context8) { + var _fromString = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee7(s) { + return _regeneratorRuntime().wrap(function _callee7$(_context7) { while (1) { - switch (_context8.prev = _context8.next) { + switch (_context7.prev = _context7.next) { case 0: - return _context8.abrupt("return", SignedMessage.fromSig(JSON.parse(s))); + return _context7.abrupt("return", SignedMessage.fromSig(JSON.parse(s))); case 1: case "end": - return _context8.stop(); + return _context7.stop(); } } - }, _callee8); + }, _callee7); })); function fromString(_x6) { return _fromString.apply(this, arguments); } return fromString; }(); - SignedMessage.setReaction = /*#__PURE__*/function () { - var _setReaction = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee9(gun, msg, reaction) { - var hash; - return _regeneratorRuntime().wrap(function _callee9$(_context9) { - while (1) { - switch (_context9.prev = _context9.next) { - case 0: - _context9.next = 2; - return msg.getHash(); - case 2: - hash = _context9.sent; - gun.get("reactions").get(hash).put(reaction); - gun.get("reactions").get(hash).put(reaction); - gun.get("messagesByHash").get(hash).get("reactions").get(this.rootContact.value).put(reaction); - gun.get("messagesByHash").get(hash).get("reactions").get(this.rootContact.value).put(reaction); - case 7: - case "end": - return _context9.stop(); - } - } - }, _callee9, this); - })); - function setReaction(_x7, _x8, _x9) { - return _setReaction.apply(this, arguments); - } - return setReaction; - }(); return SignedMessage; }(); /*eslint no-useless-escape: "off", camelcase: "off" */ var index = { local: local$1, - global: global$2, + global: global$1, group: group, "public": publicState, "private": privateState, @@ -6515,11 +7388,10 @@ var index = { session: session, util: util, notifications: notifications, - SEA: Gun.SEA, - Gun: Gun, SignedMessage: SignedMessage, Channel: Channel, - Node: Node + Node: Node, + Key: Key }; exports.default = index; diff --git a/dist/iris.cjs.development.js.map b/dist/iris.cjs.development.js.map index a9bd91a..7631ab1 100644 --- a/dist/iris.cjs.development.js.map +++ b/dist/iris.cjs.development.js.map @@ -1 +1 @@ -{"version":3,"file":"iris.cjs.development.js","sources":["../src/lodash.ts","../src/util.ts","../src/peers.ts","../src/global.ts","../src/Attribute.ts","../src/public.ts","../src/Channel.ts","../src/private.ts","../src/Node.ts","../src/local.ts","../src/blockedUsers.ts","../src/group.ts","../src/notifications.ts","../src/electron.ts","../src/session.ts","../src/static.ts","../src/Key.ts","../src/SignedMessage.ts","../src/index.ts"],"sourcesContent":["// @ts-nocheck\nexport default {\n throttle: (func: Function, limit: number) => {\n let inThrottle: boolean;\n return function() {\n const args = arguments;\n const context = this;\n if (!inThrottle) {\n func.apply(context, args);\n inThrottle = true;\n setTimeout(() => inThrottle = false, limit);\n }\n };\n },\n debounce: (func: Function, limit: number) => {\n let inDebounce: boolean;\n return function() {\n const args = arguments;\n const context = this;\n clearTimeout(inDebounce);\n inDebounce = setTimeout(() => func.apply(context, args), limit);\n };\n },\n sample: (arr: any[]) => arr[Math.floor(Math.random() * arr.length)],\n sampleSize: (arr: any[], size: number) => {\n const shuffled = arr.slice(0);\n let i = arr.length;\n let min = i - size;\n let temp;\n let index;\n while (i-- > min) {\n index = Math.floor((i + 1) * Math.random());\n temp = shuffled[index];\n shuffled[index] = shuffled[i];\n shuffled[i] = temp;\n }\n return shuffled.slice(min);\n },\n defer: (func: Function) => setTimeout(func, 0),\n once: (func: Function) => {\n let called = false;\n return function() {\n if (called) {\n return;\n }\n called = true;\n func.apply(this, arguments);\n };\n },\n omit: (obj: any, keys: string[]) => {\n const newObj = {};\n Object.keys(obj).forEach(key => {\n if (!keys.includes(key)) {\n newObj[key] = obj[key];\n }\n });\n return newObj;\n },\n defaults: (obj: any, defaults: any) => {\n Object.keys(defaults).forEach(key => {\n if (obj[key] === undefined) {\n obj[key] = defaults[key];\n }\n });\n return obj;\n },\n pickBy: (obj: any, predicate: Function) => {\n const newObj = {};\n Object.keys(obj).forEach(key => {\n if (predicate(obj[key])) {\n newObj[key] = obj[key];\n }\n });\n return newObj;\n }\n}","// @ts-nocheck\n/* eslint no-useless-escape: \"off\", camelcase: \"off\" */\n\nimport Gun from 'gun'; // eslint-disable-line no-unused-vars\nimport 'gun/sea';\nimport _ from './lodash';\n\n// eslint-disable-line no-unused-vars\n\nlet isNode = false;\ntry {\n isNode = Object.prototype.toString.call(global.process) === `[object process]`;\n} catch (e) { null; }\n\nconst userAgent = !isNode && navigator && navigator.userAgent && navigator.userAgent.toLowerCase();\nconst isElectron = (userAgent && userAgent.indexOf(' electron/') > -1);\n\nconst isMobile = !isNode && (function() {\n if (isElectron) { return false; }\n let check = false;\n (function(a) {if (/(android|bb\\d+|meego).+mobile|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\\-(n|u)|c55\\/|capi|ccwa|cdm\\-|cell|chtm|cldc|cmd\\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\\-s|devi|dica|dmob|do(c|p)o|ds(12|\\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\\-|_)|g1 u|g560|gene|gf\\-5|g\\-mo|go(\\.w|od)|gr(ad|un)|haie|hcit|hd\\-(m|p|t)|hei\\-|hi(pt|ta)|hp( i|ip)|hs\\-c|ht(c(\\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\\-(20|go|ma)|i230|iac( |\\-|\\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\\/)|klon|kpt |kwc\\-|kyo(c|k)|le(no|xi)|lg( g|\\/(k|l|u)|50|54|\\-[a-w])|libw|lynx|m1\\-w|m3ga|m50\\/|ma(te|ui|xo)|mc(01|21|ca)|m\\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\\-2|po(ck|rt|se)|prox|psio|pt\\-g|qa\\-a|qc(07|12|21|32|60|\\-[2-7]|i\\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\\-|oo|p\\-)|sdk\\/|se(c(\\-|0|1)|47|mc|nd|ri)|sgh\\-|shar|sie(\\-|m)|sk\\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\\-|v\\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\\-|tdg\\-|tel(i|m)|tim\\-|t\\-mo|to(pl|sh)|ts(70|m\\-|m3|m5)|tx\\-9|up(\\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\\-|your|zeto|zte\\-/i.test(a.substr(0, 4))) check = true;})(navigator.userAgent || navigator.vendor || '');\n return check;\n})();\n\nfunction gunAsAnotherUser(gun: any, key: any, f: Function) { // Hacky way to use multiple users with gun\n const gun2 = new Gun({radisk: false, peers: Object.keys(gun._.opt.peers)}); // TODO: copy other options too\n const user = gun2.user();\n user.auth(key);\n setTimeout(() => {\n // @ts-ignore\n const peers = Object.values(gun2.back('opt.peers'));\n peers.forEach(peer => {\n // @ts-ignore\n gun2.on('bye', peer);\n });\n }, 20000);\n return f(user);\n}\n\nfunction gunOnceDefined(node: any) {\n return new Promise(resolve => {\n node.on((val: any, _k: any, _a: any, eve: any) => {\n if (val !== undefined) {\n eve.off();\n resolve(val);\n }\n });\n });\n}\n\nconst animals = [\n 'canidae',\n 'felidae',\n 'cat',\n 'cattle',\n 'dog',\n 'donkey',\n 'goat',\n 'horse',\n 'pig',\n 'rabbit',\n 'aardvark',\n 'aardwolf',\n 'albatross',\n 'alligator',\n 'alpaca',\n 'amphibian',\n 'anaconda',\n 'angelfish',\n 'anglerfish',\n 'ant',\n 'anteater',\n 'antelope',\n 'antlion',\n 'ape',\n 'aphid',\n 'armadillo',\n 'asp',\n 'baboon',\n 'badger',\n 'bandicoot',\n 'barnacle',\n 'barracuda',\n 'basilisk',\n 'bass',\n 'bat',\n 'bear',\n 'beaver',\n 'bedbug',\n 'bee',\n 'beetle',\n 'bird',\n 'bison',\n 'blackbird',\n 'boa',\n 'boar',\n 'bobcat',\n 'bobolink',\n 'bonobo',\n 'booby',\n 'bovid',\n 'bug',\n 'butterfly',\n 'buzzard',\n 'camel',\n 'canid',\n 'capybara',\n 'cardinal',\n 'caribou',\n 'carp',\n 'cat',\n 'catshark',\n 'caterpillar',\n 'catfish',\n 'cattle',\n 'centipede',\n 'cephalopod',\n 'chameleon',\n 'cheetah',\n 'chickadee',\n 'chicken',\n 'chimpanzee',\n 'chinchilla',\n 'chipmunk',\n 'clam',\n 'clownfish',\n 'cobra',\n 'cockroach',\n 'cod',\n 'condor',\n 'constrictor',\n 'coral',\n 'cougar',\n 'cow',\n 'coyote',\n 'crab',\n 'crane',\n 'crawdad',\n 'crayfish',\n 'cricket',\n 'crocodile',\n 'crow',\n 'cuckoo',\n 'cicada',\n 'damselfly',\n 'deer',\n 'dingo',\n 'dinosaur',\n 'dog',\n 'dolphin',\n 'donkey',\n 'dormouse',\n 'dove',\n 'dragonfly',\n 'dragon',\n 'duck',\n 'eagle',\n 'earthworm',\n 'earwig',\n 'echidna',\n 'eel',\n 'egret',\n 'elephant',\n 'elk',\n 'emu',\n 'ermine',\n 'falcon',\n 'ferret',\n 'finch',\n 'firefly',\n 'fish',\n 'flamingo',\n 'flea',\n 'fly',\n 'flyingfish',\n 'fowl',\n 'fox',\n 'frog',\n 'gamefowl',\n 'galliform',\n 'gazelle',\n 'gecko',\n 'gerbil',\n 'gibbon',\n 'giraffe',\n 'goat',\n 'goldfish',\n 'goose',\n 'gopher',\n 'gorilla',\n 'grasshopper',\n 'grouse',\n 'guan',\n 'guanaco',\n 'guineafowl',\n 'gull',\n 'guppy',\n 'haddock',\n 'halibut',\n 'hamster',\n 'hare',\n 'harrier',\n 'hawk',\n 'hedgehog',\n 'heron',\n 'herring',\n 'hippopotamus',\n 'hookworm',\n 'hornet',\n 'horse',\n 'hoverfly',\n 'hummingbird',\n 'hyena',\n 'iguana',\n 'impala',\n 'jackal',\n 'jaguar',\n 'jay',\n 'jellyfish',\n 'junglefowl',\n 'kangaroo',\n 'kingfisher',\n 'kite',\n 'kiwi',\n 'koala',\n 'koi',\n 'krill',\n 'ladybug',\n 'lamprey',\n 'landfowl',\n 'lark',\n 'leech',\n 'lemming',\n 'lemur',\n 'leopard',\n 'leopon',\n 'limpet',\n 'lion',\n 'lizard',\n 'llama',\n 'lobster',\n 'locust',\n 'loon',\n 'louse',\n 'lungfish',\n 'lynx',\n 'macaw',\n 'mackerel',\n 'magpie',\n 'mammal',\n 'manatee',\n 'mandrill',\n 'marlin',\n 'marmoset',\n 'marmot',\n 'marsupial',\n 'marten',\n 'mastodon',\n 'meadowlark',\n 'meerkat',\n 'mink',\n 'minnow',\n 'mite',\n 'mockingbird',\n 'mole',\n 'mollusk',\n 'mongoose',\n 'monkey',\n 'moose',\n 'mosquito',\n 'moth',\n 'mouse',\n 'mule',\n 'muskox',\n 'narwhal',\n 'newt',\n 'nightingale',\n 'ocelot',\n 'octopus',\n 'opossum',\n 'orangutan',\n 'orca',\n 'ostrich',\n 'otter',\n 'owl',\n 'ox',\n 'panda',\n 'panther',\n 'parakeet',\n 'parrot',\n 'parrotfish',\n 'partridge',\n 'peacock',\n 'peafowl',\n 'pelican',\n 'penguin',\n 'perch',\n 'pheasant',\n 'pig',\n 'pigeon',\n 'pike',\n 'pinniped',\n 'piranha',\n 'planarian',\n 'platypus',\n 'pony',\n 'porcupine',\n 'porpoise',\n 'possum',\n 'prawn',\n 'primate',\n 'ptarmigan',\n 'puffin',\n 'puma',\n 'python',\n 'quail',\n 'quelea',\n 'quokka',\n 'rabbit',\n 'raccoon',\n 'rat',\n 'rattlesnake',\n 'raven',\n 'reindeer',\n 'reptile',\n 'rhinoceros',\n 'roadrunner',\n 'rodent',\n 'rook',\n 'rooster',\n 'roundworm',\n 'sailfish',\n 'salamander',\n 'salmon',\n 'sawfish',\n 'scallop',\n 'scorpion',\n 'seahorse',\n 'shark',\n 'sheep',\n 'shrew',\n 'shrimp',\n 'silkworm',\n 'silverfish',\n 'skink',\n 'skunk',\n 'sloth',\n 'slug',\n 'smelt',\n 'snail',\n 'snake',\n 'snipe',\n 'sole',\n 'sparrow',\n 'spider',\n 'spoonbill',\n 'squid',\n 'squirrel',\n 'starfish',\n 'stingray',\n 'stoat',\n 'stork',\n 'sturgeon',\n 'swallow',\n 'swan',\n 'swift',\n 'swordfish',\n 'swordtail',\n 'tahr',\n 'takin',\n 'tapir',\n 'tarantula',\n 'tarsier',\n 'termite',\n 'tern',\n 'thrush',\n 'tick',\n 'tiger',\n 'tiglon',\n 'toad',\n 'tortoise',\n 'toucan',\n 'trout',\n 'tuna',\n 'turkey',\n 'turtle',\n 'tyrannosaurus',\n 'urial',\n 'vicuna',\n 'viper',\n 'vole',\n 'vulture',\n 'wallaby',\n 'walrus',\n 'wasp',\n 'warbler',\n 'weasel',\n 'whale',\n 'whippet',\n 'whitefish',\n 'wildcat',\n 'wildebeest',\n 'wildfowl',\n 'wolf',\n 'wolverine',\n 'wombat',\n 'woodpecker',\n 'worm',\n 'wren',\n 'xerinae',\n 'yak',\n 'zebra',\n 'alpaca',\n 'cat',\n 'cattle',\n 'chicken',\n 'dog',\n 'donkey',\n 'ferret',\n 'gayal',\n 'goldfish',\n 'guppy',\n 'horse',\n 'koi',\n 'llama',\n 'sheep',\n 'yak',\n 'unicorn',\n];\n\nconst adjectives = [\n 'average',\n 'big',\n 'colossal',\n 'fat',\n 'giant',\n 'gigantic',\n 'great',\n 'huge',\n 'immense',\n 'large',\n 'little',\n 'long',\n 'mammoth',\n 'massive',\n 'miniature',\n 'petite',\n 'puny',\n 'short',\n 'small',\n 'tall',\n 'tiny',\n 'boiling',\n 'breezy',\n 'broken',\n 'bumpy',\n 'chilly',\n 'cold',\n 'cool',\n 'creepy',\n 'crooked',\n 'cuddly',\n 'curly',\n 'damaged',\n 'damp',\n 'dirty',\n 'dry',\n 'dusty',\n 'filthy',\n 'flaky',\n 'fluffy',\n 'wet',\n 'broad',\n 'chubby',\n 'crooked',\n 'curved',\n 'deep',\n 'flat',\n 'high',\n 'hollow',\n 'low',\n 'narrow',\n 'round',\n 'shallow',\n 'skinny',\n 'square',\n 'steep',\n 'straight',\n 'wide',\n 'ancient',\n 'brief',\n 'early',\n 'fast',\n 'late',\n 'long',\n 'modern',\n 'old',\n 'quick',\n 'rapid',\n 'short',\n 'slow',\n 'swift',\n 'young',\n 'abundant',\n 'empty',\n 'few',\n 'heavy',\n 'light',\n 'many',\n 'numerous',\n 'Sound',\n 'cooing',\n 'deafening',\n 'faint',\n 'harsh',\n 'hissing',\n 'hushed',\n 'husky',\n 'loud',\n 'melodic',\n 'moaning',\n 'mute',\n 'noisy',\n 'purring',\n 'quiet',\n 'raspy',\n 'resonant',\n 'screeching',\n 'shrill',\n 'silent',\n 'soft',\n 'squealing',\n 'thundering',\n 'voiceless',\n 'whispering',\n 'bitter',\n 'delicious',\n 'fresh',\n 'juicy',\n 'ripe',\n 'rotten',\n 'salty',\n 'sour',\n 'spicy',\n 'stale',\n 'sticky',\n 'strong',\n 'sweet',\n 'tasteless',\n 'tasty',\n 'thirsty',\n 'fluttering',\n 'fuzzy',\n 'greasy',\n 'grubby',\n 'hard',\n 'hot',\n 'icy',\n 'loose',\n 'melted',\n 'plastic',\n 'prickly',\n 'rainy',\n 'rough',\n 'scattered',\n 'shaggy',\n 'shaky',\n 'sharp',\n 'shivering',\n 'silky',\n 'slimy',\n 'slippery',\n 'smooth',\n 'soft',\n 'solid',\n 'steady',\n 'sticky',\n 'tender',\n 'tight',\n 'uneven',\n 'weak',\n 'wet',\n 'wooden',\n 'afraid',\n 'angry',\n 'annoyed',\n 'anxious',\n 'arrogant',\n 'ashamed',\n 'awful',\n 'bad',\n 'bewildered',\n 'bored',\n 'combative',\n 'condemned',\n 'confused',\n 'creepy',\n 'cruel',\n 'dangerous',\n 'defeated',\n 'defiant',\n 'depressed',\n 'disgusted',\n 'disturbed',\n 'eerie',\n 'embarrassed',\n 'envious',\n 'evil',\n 'fierce',\n 'foolish',\n 'frantic',\n 'frightened',\n 'grieving',\n 'helpless',\n 'homeless',\n 'hungry',\n 'hurt',\n 'ill',\n 'jealous',\n 'lonely',\n 'mysterious',\n 'naughty',\n 'nervous',\n 'obnoxious',\n 'outrageous',\n 'panicky',\n 'repulsive',\n 'scary',\n 'scornful',\n 'selfish',\n 'sore',\n 'tense',\n 'terrible',\n 'thoughtless',\n 'tired',\n 'troubled',\n 'upset',\n 'uptight',\n 'weary',\n 'wicked',\n 'worried',\n 'agreeable',\n 'amused',\n 'brave',\n 'calm',\n 'charming',\n 'cheerful',\n 'comfortable',\n 'cooperative',\n 'courageous',\n 'delightful',\n 'determined',\n 'eager',\n 'elated',\n 'enchanting',\n 'encouraging',\n 'energetic',\n 'enthusiastic',\n 'excited',\n 'exuberant',\n 'fair',\n 'faithful',\n 'fantastic',\n 'fine',\n 'friendly',\n 'funny',\n 'gentle',\n 'glorious',\n 'good',\n 'happy',\n 'healthy',\n 'helpful',\n 'hilarious',\n 'jolly',\n 'joyous',\n 'kind',\n 'lively',\n 'lovely',\n 'lucky',\n 'obedient',\n 'perfect',\n 'pleasant',\n 'proud',\n 'relieved',\n 'silly',\n 'smiling',\n 'splendid',\n 'successful',\n 'thoughtful',\n 'victorious',\n 'vivacious',\n 'witty',\n 'wonderful',\n 'zealous',\n 'zany',\n 'other',\n 'good',\n 'new',\n 'old',\n 'great',\n 'high',\n 'small',\n 'different',\n 'large',\n 'local',\n 'social',\n 'important',\n 'long',\n 'young',\n 'national',\n 'british',\n 'right',\n 'early',\n 'possible',\n 'big',\n 'little',\n 'political',\n 'able',\n 'late',\n 'general',\n 'full',\n 'far',\n 'low',\n 'public',\n 'available',\n 'bad',\n 'main',\n 'sure',\n 'clear',\n 'major',\n 'economic',\n 'only',\n 'likely',\n 'real',\n 'black',\n 'particular',\n 'international',\n 'special',\n 'difficult',\n 'certain',\n 'open',\n 'whole',\n 'white',\n 'free',\n 'short',\n 'easy',\n 'strong',\n 'european',\n 'central',\n 'similar',\n 'human',\n 'common',\n 'necessary',\n 'single',\n 'personal',\n 'hard',\n 'private',\n 'poor',\n 'financial',\n 'wide',\n 'foreign',\n 'simple',\n 'recent',\n 'concerned',\n 'american',\n 'various',\n 'close',\n 'fine',\n 'english',\n 'wrong',\n 'present',\n 'royal',\n 'natural',\n 'individual',\n 'nice',\n 'french',\n 'nihilist',\n 'solipsist',\n 'materialist',\n 'surrealist',\n 'heroic',\n 'awesome',\n 'hedonist',\n 'absurd',\n 'current',\n 'modern',\n 'labour',\n 'legal',\n 'happy',\n 'final',\n 'red',\n 'normal',\n 'serious',\n 'previous',\n 'total',\n 'prime',\n 'significant',\n 'industrial',\n 'sorry',\n 'dead',\n 'specific',\n 'appropriate',\n 'top',\n 'soviet',\n 'basic',\n 'military',\n 'original',\n 'successful',\n 'aware',\n 'hon',\n 'popular',\n 'heavy',\n 'professional',\n 'direct',\n 'dark',\n 'cold',\n 'ready',\n 'green',\n 'useful',\n 'effective',\n 'western',\n 'traditional',\n 'scottish',\n 'german',\n 'independent',\n 'deep',\n 'interesting',\n 'considerable',\n 'involved',\n 'physical',\n 'hot',\n 'existing',\n 'responsible',\n 'complete',\n 'medical',\n 'blue',\n 'extra',\n 'past',\n 'male',\n 'interested',\n 'fair',\n 'essential',\n 'beautiful',\n 'civil',\n 'primary',\n 'obvious',\n 'future',\n 'environmental',\n 'positive',\n 'senior',\n 'nuclear',\n 'annual',\n 'relevant',\n 'huge',\n 'rich',\n 'commercial',\n 'safe',\n 'regional',\n 'practical',\n 'official',\n 'separate',\n 'key',\n 'chief',\n 'regular',\n 'due',\n 'additional',\n 'active',\n 'powerful',\n 'complex',\n 'standard',\n 'impossible',\n 'light',\n 'warm',\n 'middle',\n 'fresh',\n 'sexual',\n 'front',\n 'domestic',\n 'actual',\n 'united',\n 'technical',\n 'ordinary',\n 'cheap',\n 'strange',\n 'internal',\n 'excellent',\n 'quiet',\n 'soft',\n 'potential',\n 'northern',\n 'religious',\n 'quick',\n 'very',\n 'famous',\n 'cultural',\n 'proper',\n 'broad',\n 'joint',\n 'formal',\n 'limited',\n 'conservative',\n 'lovely',\n 'usual',\n 'ltd',\n 'unable',\n 'rural',\n 'initial',\n 'substantial',\n 'bright',\n 'average',\n 'leading',\n 'reasonable',\n 'immediate',\n 'suitable',\n 'equal',\n 'detailed',\n 'working',\n 'overall',\n 'female',\n 'afraid',\n 'democratic',\n 'growing',\n 'sufficient',\n 'scientific',\n 'eastern',\n 'correct',\n 'inc',\n 'irish',\n 'expensive',\n 'educational',\n 'mental',\n 'dangerous',\n 'critical',\n 'increased',\n 'familiar',\n 'unlikely',\n 'double',\n 'perfect',\n 'slow',\n 'tiny',\n 'dry',\n 'historical',\n 'thin',\n 'daily',\n 'southern',\n 'increasing',\n 'wild',\n 'alone',\n 'urban',\n 'empty',\n 'married',\n 'narrow',\n 'liberal',\n 'supposed',\n 'upper',\n 'apparent',\n 'tall',\n 'busy',\n 'bloody',\n 'prepared',\n 'russian',\n 'moral',\n 'careful',\n 'clean',\n 'attractive',\n 'japanese',\n 'vital',\n 'thick',\n 'alternative',\n 'fast',\n 'ancient',\n 'elderly',\n 'rare',\n 'external',\n 'capable',\n 'brief',\n 'wonderful',\n 'grand',\n 'typical',\n 'entire',\n 'grey',\n 'constant',\n 'vast',\n 'surprised',\n 'ideal',\n 'terrible',\n 'academic',\n 'funny',\n 'minor',\n 'pleased',\n 'severe',\n 'ill',\n 'corporate',\n 'negative',\n 'permanent',\n 'weak',\n 'brown',\n 'fundamental',\n 'odd',\n 'crucial',\n 'inner',\n 'used',\n 'criminal',\n 'contemporary',\n 'sharp',\n 'sick',\n 'near',\n 'roman',\n 'massive',\n 'unique',\n 'secondary',\n 'parliamentary',\n 'african',\n 'unknown',\n 'subsequent',\n 'angry',\n 'alive',\n 'guilty',\n 'lucky',\n 'enormous',\n 'well',\n 'yellow',\n 'unusual',\n 'net',\n 'tough',\n 'dear',\n 'extensive',\n 'glad',\n 'remaining',\n 'agricultural',\n 'alright',\n 'healthy',\n 'italian',\n 'principal',\n 'tired',\n 'efficient',\n 'comfortable',\n 'chinese',\n 'relative',\n 'friendly',\n 'conventional',\n 'willing',\n 'sudden',\n 'proposed',\n 'voluntary',\n 'slight',\n 'valuable',\n 'dramatic',\n 'golden',\n 'temporary',\n 'federal',\n 'keen',\n 'flat',\n 'silent',\n 'indian',\n 'worried',\n 'pale',\n 'statutory',\n 'welsh',\n 'dependent',\n 'firm',\n 'wet',\n 'competitive',\n 'armed',\n 'radical',\n 'outside',\n 'acceptable',\n 'sensitive',\n 'living',\n 'pure',\n 'global',\n 'emotional',\n 'sad',\n 'secret',\n 'rapid',\n 'adequate',\n 'fixed',\n 'sweet',\n 'administrative',\n 'wooden',\n 'remarkable',\n 'comprehensive',\n 'surprising',\n 'solid',\n 'rough',\n 'mere',\n 'mass',\n 'brilliant',\n 'maximum',\n 'absolute',\n 'electronic',\n 'visual',\n 'electric',\n 'cool',\n 'spanish',\n 'literary',\n 'continuing',\n 'supreme',\n 'chemical',\n 'genuine',\n 'exciting',\n 'written',\n 'advanced',\n 'extreme',\n 'classical',\n 'fit',\n 'favourite',\n 'widespread',\n 'confident',\n 'straight',\n 'proud',\n 'numerous',\n 'opposite',\n 'distinct',\n 'mad',\n 'helpful',\n 'given',\n 'disabled',\n 'consistent',\n 'anxious',\n 'nervous',\n 'awful',\n 'stable',\n 'constitutional',\n 'satisfied',\n 'conscious',\n 'developing',\n 'strategic',\n 'holy',\n 'smooth',\n 'dominant',\n 'remote',\n 'theoretical',\n 'outstanding',\n 'pink',\n 'pretty',\n 'clinical',\n 'minimum',\n 'honest',\n 'impressive',\n 'related',\n 'residential',\n 'extraordinary',\n 'plain',\n 'visible',\n 'accurate',\n 'distant',\n 'still',\n 'greek',\n 'complicated',\n 'musical',\n 'precise',\n 'gentle',\n 'broken',\n 'live',\n 'silly',\n 'fat',\n 'tight',\n 'monetary',\n 'round',\n 'psychological',\n 'violent',\n 'unemployed',\n 'inevitable',\n 'junior',\n 'sensible',\n 'grateful',\n 'pleasant',\n 'dirty',\n 'structural',\n 'welcome',\n 'deaf',\n 'above',\n 'continuous',\n 'blind',\n 'overseas',\n 'mean',\n 'entitled',\n 'delighted',\n 'loose',\n 'occasional',\n 'evident',\n 'desperate',\n 'fellow',\n 'universal',\n 'square',\n 'steady',\n 'classic',\n 'equivalent',\n 'intellectual',\n 'victorian',\n 'level',\n 'ultimate',\n 'creative',\n 'lost',\n 'medieval',\n 'clever',\n 'linguistic',\n 'convinced',\n 'judicial',\n 'raw',\n 'sophisticated',\n 'asleep',\n 'vulnerable',\n 'illegal',\n 'outer',\n 'revolutionary',\n 'bitter',\n 'changing',\n 'australian',\n 'native',\n 'imperial',\n 'strict',\n 'wise',\n 'informal',\n 'flexible',\n 'collective',\n 'frequent',\n 'experimental',\n 'spiritual',\n 'intense',\n 'rational',\n 'generous',\n 'inadequate',\n 'prominent',\n 'logical',\n 'bare',\n 'historic',\n 'modest',\n 'dutch',\n 'acute',\n 'electrical',\n 'valid',\n 'weekly',\n 'gross',\n 'automatic',\n 'loud',\n 'reliable',\n 'mutual',\n 'liable',\n 'multiple',\n 'ruling',\n 'curious',\n 'sole',\n 'managing',\n 'pregnant',\n 'latin',\n 'nearby',\n 'exact',\n 'underlying',\n 'identical',\n 'satisfactory',\n 'marginal',\n 'distinctive',\n 'electoral',\n 'urgent',\n 'presidential',\n 'controversial',\n 'everyday',\n 'encouraging',\n 'organic',\n 'continued',\n 'expected',\n 'statistical',\n 'desirable',\n 'innocent',\n 'improved',\n 'exclusive',\n 'marked',\n 'experienced',\n 'unexpected',\n 'superb',\n 'sheer',\n 'disappointed',\n 'frightened',\n 'gastric',\n 'romantic',\n 'naked',\n 'reluctant',\n 'magnificent',\n 'convenient',\n 'established',\n 'closed',\n 'uncertain',\n 'artificial',\n 'diplomatic',\n 'tremendous',\n 'marine',\n 'mechanical',\n 'retail',\n 'institutional',\n 'mixed',\n 'required',\n 'biological',\n 'known',\n 'functional',\n 'straightforward',\n 'superior',\n 'digital',\n 'spectacular',\n 'unhappy',\n 'confused',\n 'unfair',\n 'aggressive',\n 'spare',\n 'painful',\n 'abstract',\n 'asian',\n 'associated',\n 'legislative',\n 'monthly',\n 'intelligent',\n 'hungry',\n 'explicit',\n 'nasty',\n 'just',\n 'faint',\n 'coloured',\n 'ridiculous',\n 'amazing',\n 'comparable',\n 'successive',\n 'realistic',\n 'back',\n 'decent',\n 'decentralized',\n 'bitcoin',\n 'cypherpunk',\n 'unnecessary',\n 'flying',\n 'random',\n 'influential',\n 'dull',\n 'genetic',\n 'neat',\n 'marvellous',\n 'crazy',\n 'damp',\n 'giant',\n 'secure',\n 'bottom',\n 'skilled',\n 'subtle',\n 'elegant',\n 'brave',\n 'lesser',\n 'parallel',\n 'steep',\n 'intensive',\n 'casual',\n 'tropical',\n 'lonely',\n 'partial',\n 'preliminary',\n 'concrete',\n 'alleged',\n 'assistant',\n 'vertical',\n 'upset',\n 'delicate',\n 'mild',\n 'occupational',\n 'excessive',\n 'progressive',\n 'exceptional',\n 'integrated',\n 'striking',\n 'continental',\n 'okay',\n 'harsh',\n 'combined',\n 'fierce',\n 'handsome',\n 'characteristic',\n 'chronic',\n 'compulsory',\n 'interim',\n 'objective',\n 'splendid',\n 'magic',\n 'systematic',\n 'obliged',\n 'payable',\n 'fun',\n 'horrible',\n 'primitive',\n 'fascinating',\n 'ideological',\n 'metropolitan',\n 'surrounding',\n 'estimated',\n 'peaceful',\n 'premier',\n 'operational',\n 'technological',\n 'kind',\n 'advisory',\n 'hostile',\n 'precious',\n 'accessible',\n 'determined',\n 'excited',\n 'impressed',\n 'provincial',\n 'smart',\n 'endless',\n 'isolated',\n 'drunk',\n 'geographical',\n 'like',\n 'dynamic',\n 'boring',\n 'forthcoming',\n 'unfortunate',\n 'definite',\n 'super',\n 'notable',\n 'indirect',\n 'stiff',\n 'wealthy',\n 'awkward',\n 'lively',\n 'neutral',\n 'artistic',\n 'content',\n 'mature',\n 'colonial',\n 'ambitious',\n 'evil',\n 'magnetic',\n 'verbal',\n 'legitimate',\n 'sympathetic',\n 'empirical',\n 'head',\n 'shallow',\n 'vague',\n 'naval',\n 'depressed',\n 'shared',\n 'added',\n 'shocked',\n 'mid',\n 'worthwhile',\n 'qualified',\n 'missing',\n 'blank',\n 'absent',\n 'favourable',\n 'polish',\n 'israeli',\n 'developed',\n 'profound',\n 'representative',\n 'enthusiastic',\n 'dreadful',\n 'rigid',\n 'reduced',\n 'cruel',\n 'coastal',\n 'peculiar',\n 'swiss',\n 'crude',\n 'extended',\n 'selected',\n 'eager',\n 'canadian',\n 'bold',\n 'relaxed',\n 'corresponding',\n 'running',\n 'planned',\n 'applicable',\n 'immense',\n 'allied',\n 'comparative',\n 'uncomfortable',\n 'conservation',\n 'productive',\n 'beneficial',\n 'bored',\n 'charming',\n 'minimal',\n 'mobile',\n 'turkish',\n 'orange',\n 'rear',\n 'passive',\n 'suspicious',\n 'overwhelming',\n 'fatal',\n 'resulting',\n 'symbolic',\n 'registered',\n 'neighbouring',\n 'calm',\n 'irrelevant',\n 'patient',\n 'compact',\n 'profitable',\n 'rival',\n 'loyal',\n 'moderate',\n 'distinguished',\n 'interior',\n 'noble',\n 'insufficient',\n 'eligible',\n 'mysterious',\n 'varying',\n 'managerial',\n 'molecular',\n 'olympic',\n 'linear',\n 'prospective',\n 'printed',\n 'parental',\n 'diverse',\n 'elaborate',\n 'furious',\n 'fiscal',\n 'burning',\n 'useless',\n 'semantic',\n 'embarrassed',\n 'inherent',\n 'philosophical',\n 'deliberate',\n 'awake',\n 'variable',\n 'promising',\n 'unpleasant',\n 'varied',\n 'sacred',\n 'selective',\n 'inclined',\n 'tender',\n 'hidden',\n 'worthy',\n 'intermediate',\n 'sound',\n 'protective',\n 'fortunate',\n 'slim',\n 'defensive',\n 'divine',\n 'stuck',\n 'driving',\n 'invisible',\n 'misleading',\n 'circular',\n 'mathematical',\n 'inappropriate',\n 'liquid',\n 'persistent',\n 'solar',\n 'doubtful',\n 'manual',\n 'architectural',\n 'intact',\n 'incredible',\n 'devoted',\n 'prior',\n 'tragic',\n 'respectable',\n 'optimistic',\n 'convincing',\n 'unacceptable',\n 'decisive',\n 'competent',\n 'spatial',\n 'respective',\n 'binding',\n 'relieved',\n 'nursing',\n 'toxic',\n 'select',\n 'redundant',\n 'integral',\n 'then',\n 'probable',\n 'amateur',\n 'fond',\n 'passing',\n 'specified',\n 'territorial',\n 'horizontal',\n 'inland',\n 'cognitive',\n 'regulatory',\n 'miserable',\n 'resident',\n 'polite',\n 'scared',\n 'gothic',\n 'civilian',\n 'instant',\n 'lengthy',\n 'adverse',\n 'korean',\n 'unconscious',\n 'anonymous',\n 'aesthetic',\n 'orthodox',\n 'static',\n 'unaware',\n 'costly',\n 'fantastic',\n 'foolish',\n 'fashionable',\n 'causal',\n 'compatible',\n 'wee',\n 'implicit',\n 'dual',\n 'ok',\n 'cheerful',\n 'subjective',\n 'forward',\n 'surviving',\n 'exotic',\n 'purple',\n 'cautious',\n 'visiting',\n 'aggregate',\n 'ethical',\n 'teenage',\n 'dying',\n 'disastrous',\n 'delicious',\n 'confidential',\n 'underground',\n 'thorough',\n 'grim',\n 'autonomous',\n 'atomic',\n 'frozen',\n 'colourful',\n 'injured',\n 'uniform',\n 'ashamed',\n 'glorious',\n 'wicked',\n 'coherent',\n 'rising',\n 'shy',\n 'novel',\n 'balanced',\n 'delightful',\n 'arbitrary',\n 'adjacent',\n 'worrying',\n 'weird',\n 'unchanged',\n 'rolling',\n 'evolutionary',\n 'intimate',\n 'sporting',\n 'disciplinary',\n 'formidable',\n 'lexical',\n 'noisy',\n 'gradual',\n 'accused',\n 'homeless',\n 'supporting',\n 'coming',\n 'renewed',\n 'excess',\n 'retired',\n 'rubber',\n 'chosen',\n 'outdoor',\n 'embarrassing',\n 'preferred',\n 'bizarre',\n 'appalling',\n 'agreed',\n 'imaginative',\n 'governing',\n 'accepted',\n 'vocational',\n 'mighty',\n 'puzzled',\n 'worldwide',\n 'organisational',\n 'sunny',\n 'eldest',\n 'eventual',\n 'spontaneous',\n 'vivid',\n 'rude',\n 'faithful',\n 'ministerial',\n 'innovative',\n 'controlled',\n 'conceptual',\n 'unwilling',\n 'civic',\n 'meaningful',\n 'alive',\n 'brainy',\n 'breakable',\n 'busy',\n 'careful',\n 'cautious',\n 'clever',\n 'concerned',\n 'crazy',\n 'curious',\n 'dead',\n 'different',\n 'difficult',\n 'doubtful',\n 'easy',\n 'famous',\n 'fragile',\n 'helpful',\n 'helpless',\n 'important',\n 'impossible',\n 'innocent',\n 'inquisitive',\n 'modern',\n 'open',\n 'outstanding',\n 'poor',\n 'powerful',\n 'puzzled',\n 'real',\n 'rich',\n 'shy',\n 'sleepy',\n 'super',\n 'tame',\n 'uninterested',\n 'wandering',\n 'wild',\n 'wrong',\n 'adorable',\n 'alert',\n 'average',\n 'beautiful',\n 'blonde',\n 'bloody',\n 'blushing',\n 'bright',\n 'clean',\n 'clear',\n 'cloudy',\n 'colorful',\n 'crowded',\n 'cute',\n 'dark',\n 'drab',\n 'distinct',\n 'dull',\n 'elegant',\n 'fancy',\n 'filthy',\n 'glamorous',\n 'gleaming',\n 'graceful',\n 'grotesque',\n 'homely',\n 'light',\n 'misty',\n 'motionless',\n 'muddy',\n 'plain',\n 'poised',\n 'quaint',\n 'shiny',\n 'smoggy',\n 'sparkling',\n 'spotless',\n 'stormy',\n 'strange',\n 'ugly',\n 'unsightly',\n 'unusual',\n 'bad',\n 'better',\n 'beautiful',\n 'big',\n 'black',\n 'blue',\n 'bright',\n 'clumsy',\n 'crazy',\n 'dizzy',\n 'dull',\n 'fat',\n 'frail',\n 'friendly',\n 'funny',\n 'great',\n 'green',\n 'gigantic',\n 'gorgeous',\n 'grumpy',\n 'handsome',\n 'happy',\n 'horrible',\n 'itchy',\n 'jittery',\n 'jolly',\n 'kind',\n 'long',\n 'lazy',\n 'magnificent',\n 'magenta',\n 'many',\n 'mighty',\n 'mushy',\n 'nasty',\n 'new',\n 'nice',\n 'nosy',\n 'nutty',\n 'nutritious',\n 'odd',\n 'orange',\n 'ordinary',\n 'pretty',\n 'precious',\n 'prickly',\n 'purple',\n 'quaint',\n 'quiet',\n 'quick',\n 'quickest',\n 'rainy',\n 'rare',\n 'ratty',\n 'red',\n 'roasted',\n 'robust',\n 'round',\n 'sad',\n 'scary',\n 'scrawny',\n 'short',\n 'silly',\n 'stingy',\n 'strange',\n 'striped',\n 'spotty',\n 'tart',\n 'tall',\n 'tame',\n 'tan',\n 'tender',\n 'testy',\n 'tricky',\n 'tough',\n 'ugly',\n 'ugliest',\n 'vast',\n 'watery',\n 'wasteful',\n 'wonderful',\n 'yellow',\n 'yummy',\n 'zany',\n];\n\nexport default {\n gunOnceDefined,\n gunAsAnotherUser,\n async getHash (str: string, format = `base64`) {\n if (!str) {\n return undefined;\n }\n const hash = await Gun.SEA.work(str, undefined, undefined, {name: `SHA-256`});\n if (!hash) {\n throw new Error(`Gun.SEA.work failed for ${str}`);\n }\n if (hash.length > 44) {\n throw new Error(`Gun.SEA.work returned an invalid SHA-256 hash longer than 44 chars: ${hash}. This is probably due to a sea.js bug on Safari.`);\n }\n if (format === `hex`) {\n return this.base64ToHex(hash);\n }\n return hash;\n },\n\n capitalize(s: string) {\n return s.charAt(0).toUpperCase() + s.slice(1)\n },\n\n generateName() {\n return `${this.capitalize(_.sample(adjectives)!)} ${this.capitalize(_.sample(animals)!)}`;\n },\n\n base64ToHex(str: string) {\n const raw = atob(str);\n let result = '';\n for (let i = 0; i < raw.length; i++) {\n const hex = raw.charCodeAt(i).toString(16);\n result += (hex.length === 2 ? hex : `0${ hex}`);\n }\n return result;\n },\n\n getCaret(el: HTMLInputElement) {\n if (el.selectionStart) {\n return el.selectionStart;\n } else { // @ts-ignore\n if (document.selection) {\n el.focus();\n // @ts-ignore\n const r = document.selection.createRange();\n if (r === null) {\n return 0;\n }\n // @ts-ignore\n const re = el.createTextRange(), rc = re.duplicate();\n re.moveToBookmark(r.getBookmark());\n rc.setEndPoint('EndToStart', re);\n return rc.text.length;\n }\n }\n return 0;\n },\n\n injectCss() {\n const elementId = `irisStyle`;\n if (document.getElementById(elementId)) {\n return;\n }\n const sheet = document.createElement(`style`);\n sheet.id = elementId;\n sheet.innerHTML = `\n .iris-follow-button .hover {\n display: none;\n }\n\n .iris-follow-button.following:hover .hover {\n display: inline;\n }\n\n .iris-follow-button.following:hover .nonhover {\n display: none;\n }\n\n .iris-identicon * {\n box-sizing: border-box;\n }\n\n .iris-identicon {\n vertical-align: middle;\n border-radius: 50%;\n text-align: center;\n display: inline-block;\n position: relative;\n max-width: 100%;\n }\n\n .iris-distance {\n z-index: 2;\n position: absolute;\n left:0%;\n top:2px;\n width: 100%;\n text-align: right;\n color: #fff;\n text-shadow: 0 0 1px #000;\n font-size: 75%;\n line-height: 75%;\n font-weight: bold;\n }\n\n .iris-pie {\n border-radius: 50%;\n position: absolute;\n top: 0;\n left: 0;\n box-shadow: 0px 0px 0px 0px #82FF84;\n padding-bottom: 100%;\n max-width: 100%;\n -webkit-transition: all 0.2s ease-in-out;\n -moz-transition: all 0.2s ease-in-out;\n transition: all 0.2s ease-in-out;\n }\n\n .iris-card {\n padding: 10px;\n background-color: #f7f7f7;\n color: #777;\n border: 1px solid #ddd;\n display: flex;\n flex-direction: row;\n overflow: hidden;\n }\n\n .iris-card a {\n -webkit-transition: color 150ms;\n transition: color 150ms;\n text-decoration: none;\n color: #337ab7;\n }\n\n .iris-card a:hover, .iris-card a:active {\n text-decoration: underline;\n color: #23527c;\n }\n\n .iris-pos {\n color: #3c763d;\n }\n\n .iris-neg {\n color: #a94442;\n }\n\n .iris-identicon img {\n position: absolute;\n top: 0;\n left: 0;\n max-width: 100%;\n border-radius: 50%;\n border-color: transparent;\n border-style: solid;\n }\n\n .iris-chat-open-button {\n background-color: #1e1e1e;\n color: #fff;\n padding: 15px;\n cursor: pointer;\n user-select: none;\n }\n\n .iris-chat-open-button svg {\n width: 1em;\n }\n\n .iris-chat-open-button, .iris-chat-box {\n position: fixed;\n bottom: 0.5rem;\n right: 0.5rem;\n border-radius: 8px;\n font-family: system-ui;\n font-size: 15px;\n }\n\n .iris-chat-box {\n background-color: #fff;\n max-height: 25rem;\n box-shadow: 2px 2px 20px rgba(0, 0, 0, 0.2);\n height: calc(100% - 44px);\n display: flex;\n flex-direction: column;\n width: 320px;\n color: rgb(38, 38, 38);\n }\n\n .iris-chat-box.minimized {\n height: auto;\n }\n\n .iris-chat-box.minimized .iris-chat-header {\n border-radius: 8px;\n cursor: pointer;\n }\n\n .iris-chat-box.minimized .iris-chat-messages, .iris-chat-box.minimized .iris-typing-indicator, .iris-chat-box.minimized .iris-chat-input-wrapper, .iris-chat-box.minimized .iris-chat-minimize, .iris-chat-box.minimized .iris-chat-close {\n display: none;\n }\n\n .iris-chat-header {\n background-color: #1e1e1e;\n height: 44px;\n color: #fff;\n border-radius: 8px 8px 0 0;\n text-align: center;\n display: flex;\n flex-direction: row;\n justify-content: center;\n align-items: center;\n flex: none;\n white-space: nowrap;\n text-overflow: ellipsis;\n overflow: hidden;\n }\n\n .iris-chat-header-text {\n flex: 1;\n }\n\n .iris-online-indicator {\n color: #bfbfbf;\n margin-right: 5px;\n font-size: 12px;\n user-select: none;\n flex: none;\n }\n\n .iris-online-indicator.yes {\n color: #80bf5f;\n }\n\n .iris-typing-indicator {\n display: none;\n background-color: rgba(255, 255, 255, 0.5);\n font-size: 12px;\n padding: 2px;\n color: #777;\n }\n\n .iris-typing-indicator.yes {\n display: block;\n }\n\n .iris-chat-messages {\n flex: 1;\n padding: 15px;\n overflow-y: scroll;\n }\n\n .iris-chat-input-wrapper {\n flex: none;\n padding: 15px;\n background-color: #efefef;\n display: flex;\n flex-direction: row;\n border-radius: 0 0 8px 8px;\n }\n\n .iris-chat-input-wrapper textarea {\n padding: 15px 8px;\n border-radius: 4px;\n border: 1px solid rgba(0,0,0,0);\n width: auto;\n font-size: 15px;\n resize: none;\n flex: 1;\n }\n\n .iris-chat-input-wrapper textarea:focus {\n outline: none;\n border: 1px solid #6dd0ed;\n }\n\n .iris-chat-input-wrapper button svg {\n display: inline-block;\n font-size: inherit;\n height: 1em;\n width: 1em;\n overflow: visible;\n vertical-align: -0.125em;\n }\n\n .iris-chat-input-wrapper button, .iris-chat-input-wrapper button:hover, .iris-chat-input-wrapper button:active, .iris-chat-input-wrapper button:focus {\n flex: none;\n color: #999;\n background-color: transparent;\n font-size: 30px;\n padding: 5px;\n border: 1px solid rgba(0,0,0,0);\n border-radius: 4px;\n margin-left: 5px;\n }\n\n .iris-chat-input-wrapper button:active, .iris-chat-input-wrapper button:focus {\n outline: none;\n border: 1px solid #6dd0ed;\n }\n\n .iris-chat-message {\n display: flex;\n flex-direction: column;\n margin-bottom: 2px;\n overflow-wrap: break-word;\n }\n\n .iris-msg-content {\n background-color: #efefef;\n padding: 6px 10px;\n border-radius: 8px;\n box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.1);\n flex: none;\n max-width: 75%;\n }\n\n .emoji {\n font-size: 1.3em;\n line-height: 1em;\n }\n\n .iris-chat-message .emoji-only {\n font-size: 3em;\n text-align: center;\n }\n\n .iris-seen {\n color: rgba(0, 0, 0, 0.45);\n user-select: none;\n }\n\n .iris-seen.yes {\n color: #4fc3f7;\n }\n\n .iris-seen svg {\n width: 18px;\n }\n\n .iris-delivered-checkmark {\n display: none;\n }\n\n .delivered .iris-delivered-checkmark {\n display: initial;\n }\n\n .iris-chat-minimize, .iris-chat-close {\n user-select: none;\n cursor: pointer;\n width: 45px;\n line-height: 44px;\n }\n\n .iris-chat-message.their {\n align-items: flex-start;\n }\n\n .iris-chat-message.their + .iris-chat-message.our .iris-msg-content, .day-separator + .iris-chat-message.our .iris-msg-content {\n margin-top: 15px;\n border-radius: 8px 0px 8px 8px;\n }\n\n .iris-chat-message.their:first-of-type .iris-msg-content {\n border-radius: 0px 8px 8px 8px;\n }\n\n .iris-chat-message.our:first-of-type .iris-msg-content {\n border-radius: 8px 0px 8px 8px;\n }\n\n .iris-chat-message.our + .iris-chat-message.their .iris-msg-content, .day-separator + .iris-chat-message.their .iris-msg-content {\n margin-top: 15px;\n border-radius: 0px 8px 8px 8px;\n }\n\n .iris-chat-message.our {\n align-items: flex-end;\n }\n\n .iris-chat-message.our .iris-msg-content {\n background-color: #c5ecf7;\n }\n\n .iris-chat-message .time {\n text-align: right;\n font-size: 12px;\n color: rgba(0, 0, 0, 0.45);\n }\n\n .iris-non-string {\n color: blue;\n }\n\n .day-separator {\n display: inline-block;\n border-radius: 8px;\n background-color: rgba(227, 249, 255, 0.91);\n padding: 6px 10px;\n margin-top: 15px;\n margin-left: auto;\n margin-right: auto;\n text-transform: uppercase;\n font-size: 13px;\n color: rgba(74, 74, 74, 0.88);\n box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.1);\n user-select: none;\n }\n\n .day-separator:first-of-type {\n margin-top: 0;\n }\n\n *[contenteditable=\"true\"]:not(:focus) {\n cursor: pointer;\n }\n\n *[contenteditable=\"true\"] {\n outline: none;\n }\n\n [placeholder]:empty:before {\n content: attr(placeholder);\n color: #999;\n }\n\n [placeholder]:empty:focus {\n cursor: text;\n }\n `;\n document.head.prepend(sheet);\n },\n\n getUrlParameter(sParam: string, sParams: string) {\n const sPageURL = sParams || window.location.search.substring(1);\n const sURLVariables = sPageURL.split('&');\n let sParameterName, i;\n\n for (i = 0; i < sURLVariables.length; i++) {\n sParameterName = sURLVariables[i].split('=');\n if (sParameterName[0] === sParam) {\n return sParameterName[1] === undefined ? true : decodeURIComponent(sParameterName[1]);\n }\n }\n return;\n },\n\n formatTime(date: Date) {\n // @ts-ignore\n const t: any = date.toLocaleTimeString(undefined, {timeStyle: 'short'});\n const s = t.split(':');\n if (s.length === 3) { // safari tries to display seconds\n return `${s[0] }:${ s[1] }${s[2].slice(2)}`;\n }\n return t;\n },\n\n formatDate(date: Date) {\n const t = date.toLocaleString(undefined, {dateStyle: 'short', timeStyle: 'short'});\n const s = t.split(':');\n if (s.length === 3) { // safari tries to display seconds\n return `${s[0] }:${ s[1] }${s[2].slice(2)}`;\n }\n return t;\n },\n\n getDaySeparatorText(date: Date, dateStr: string, now?: Date, nowStr?: string) {\n if (!now) {\n now = new Date();\n // @ts-ignore\n nowStr = now.toLocaleDateString({dateStyle: 'short'});\n }\n if (dateStr === nowStr) {\n return 'today';\n }\n const dayDifference = Math.round((now - date) / (1000 * 60 * 60 * 24));\n if (dayDifference === 0) {\n return 'today';\n }\n if (dayDifference === 1) {\n return 'yesterday';\n }\n if (dayDifference <= 5) {\n return date.toLocaleDateString(undefined, {weekday: 'long'});\n }\n return dateStr;\n },\n\n getProfileLink(pub: string) {\n return `${window.location.origin}/#/profile/${encodeURIComponent(pub)}`;\n },\n\n truncateString(s: string, length = 30) {\n return s.length > length ? `${s.slice(0, length)}...` : s;\n },\n\n createElement(type: string, cls?: string, parent?: HTMLElement) {\n const el = document.createElement(type);\n if (cls) {\n el.setAttribute('class', cls);\n }\n if (parent) {\n parent.appendChild(el);\n }\n return el;\n },\n\n isNode,\n isElectron,\n isMobile,\n\n throttle: (func: Function, limit: number) => {\n let inThrottle: boolean;\n return function() {\n const args = arguments;\n const context = this;\n if (!inThrottle) {\n func.apply(context, args);\n inThrottle = true;\n setTimeout(() => inThrottle = false, limit);\n }\n };\n },\n debounce: (func: Function, delay: number) => {\n let inDebounce: boolean;\n return function() {\n const context = this;\n const args = arguments;\n clearTimeout(inDebounce);\n inDebounce = setTimeout(() => func.apply(context, args), delay);\n };\n },\n sample: (arr: any[]) => arr[Math.floor(Math.random() * arr.length)],\n sampleSize: (arr: any[], size: number) => {\n const shuffled = arr.slice(0);\n let i = arr.length;\n let min = i - size;\n let temp;\n let index;\n while (i-- > min) {\n index = Math.floor((i + 1) * Math.random());\n temp = shuffled[index];\n shuffled[index] = shuffled[i];\n shuffled[i] = temp;\n }\n return shuffled.slice(min);\n },\n defer: (func: Function) => setTimeout(func, 0),\n once: (func: Function) => {\n let called = false;\n return function() {\n if (called) {\n return;\n }\n called = true;\n func.apply(this, arguments);\n };\n },\n omit: (obj: any, keys: string[]) => {\n const newObj = {};\n Object.keys(obj).forEach(key => {\n if (!keys.includes(key)) {\n newObj[key] = obj[key];\n }\n });\n return newObj;\n }\n};\n","import session from './session';\nimport _ from './lodash';\nimport Gun from 'gun';\nimport util from './util';\nimport publicState from './global';\n\nconst ELECTRON_GUN_URL = 'http://localhost:8767/gun';\nlet maxConnectedPeers = 2;\n\ntype Peer = {\n url?: string;\n enabled?: boolean;\n from?: string;\n visibility?: string;\n}\n\ntype Peers = {\n [key: string]: Peer\n}\n\nconst DEFAULT_PEERS: Peers = {\n 'https://gun-rs.iris.to/gun': {},\n 'https://gun-us.herokuapp.com/gun': {},\n};\n\nconst loc = window.location;\nconst host = loc.host;\nconst is_localhost_but_not_dev = host.startsWith('localhost') && host !== 'localhost:8080';\nif (loc.hostname.endsWith('herokuapp.com') || is_localhost_but_not_dev) {\n Object.keys(DEFAULT_PEERS).forEach(url => DEFAULT_PEERS[url].enabled = false);\n DEFAULT_PEERS[`${loc.origin}/gun`] = {enabled: true};\n}\n\nconst urlRegex = /^(https?:\\/\\/)?([\\da-z.-]+)\\.([a-z.]{2,6})([\\/\\w .-]*)*\\/?$/;\n\n/**\n * Networking and peer management utilities\n */\nexport default {\n known: {} as Peers,\n\n /** */\n async add(peer: Peer) {\n if (peer.url && !urlRegex.test(peer.url)) {\n throw new Error(`Invalid url ${peer.url}`);\n }\n\n if (peer.from) {\n Object.keys(this.known).forEach(k => {\n if (this.known[k].from === peer.from) { // remove previous peer url from the same user\n delete this.known[k];\n }\n });\n }\n const url = peer.url || '';\n this.known[url] = this.known[url] || _.omit(peer, ['url']);\n if (peer.visibility === 'public') {\n // rolling some crypto operations to obfuscate actual url in case we want to remove it\n let secret = await Gun.SEA.secret(session.getKey().epub, session.getKey()) || '';\n let encryptedUrl = await Gun.SEA.encrypt(peer.url, secret);\n let encryptedUrlHash = await Gun.SEA.work(encryptedUrl, null, null, {name: 'SHA-256'});\n publicState().user().get('peers').get(encryptedUrlHash).put({url: peer.url, lastSeen: new Date().toISOString()});\n }\n if (peer.enabled !== false) {\n peer.url && this.connect(peer.url); // this calls savePeers()\n } else {\n this.save();\n }\n },\n\n /** */\n remove(url: string) {\n delete this.known[url];\n this.save();\n },\n\n /** */\n disconnect(peerFromGun: any) {\n publicState().on('bye', peerFromGun);\n peerFromGun.url = '';\n },\n\n save() {\n localStorage.setItem('gunPeers', JSON.stringify(this.known));\n },\n\n getSaved() {\n let p: any = localStorage.getItem('gunPeers');\n if (p && p !== 'undefined') {\n p = JSON.parse(p);\n } else {\n p = DEFAULT_PEERS;\n }\n if (util.isElectron) {\n p[ELECTRON_GUN_URL] = {};\n }\n Object.keys(p).forEach(k => _.defaults(p[k], {enabled: true}));\n return p;\n },\n\n /** */\n reset() {\n localStorage.setItem('gunPeers', '');\n this.known = this.getSaved();\n },\n\n /** */\n connect(url: string) {\n if (this.isMixedContent(url)) { return; }\n if (this.known[url]) {\n this.known[url].enabled = true;\n publicState().opt({peers: [url]});\n this.save();\n } else {\n this.add({url});\n }\n },\n\n /** */\n disable(url: string, peerFromGun: any) {\n this.known[url].enabled = false;\n if (peerFromGun) {\n this.disconnect(peerFromGun);\n }\n this.save();\n },\n\n isMixedContent(url: string) {\n return window.location.protocol === 'https:' && (url.indexOf('http:') === 0);\n },\n\n random() {\n const connectToLocalElectron = util.isElectron && this.known[ELECTRON_GUN_URL] && this.known[ELECTRON_GUN_URL].enabled !== false;\n const sampleSize = connectToLocalElectron ? Math.max(maxConnectedPeers - 1, 1) : maxConnectedPeers;\n const sample = _.sampleSize(\n Object.keys(\n _.pickBy(this.known, (peer: any, url: string) => {\n return !this.isMixedContent(url) && peer.enabled && !(util.isElectron && url === ELECTRON_GUN_URL);\n })\n ), sampleSize\n );\n if (sample && connectToLocalElectron) {\n sample.push(ELECTRON_GUN_URL);\n }\n return sample;\n },\n\n checkGunPeerCount() {\n let peersFromGun = publicState().back('opt.peers');\n let connectedPeers = Object.values(peersFromGun).filter((peer: any) => {\n if (peer && peer.wire && peer.wire.constructor.name !== 'WebSocket') {\n console.log('WebRTC peer', peer);\n }\n return peer && peer.wire && peer.wire.readyState === 1 && peer.wire.bufferedAmount === 0 && peer.wire.constructor.name === 'WebSocket';\n });\n if (connectedPeers.length < maxConnectedPeers) {\n let unconnectedPeers = Object.keys(this.known).filter(url => {\n let addedToGun = Object.values(peersFromGun).map((peer:any) => peer.url).indexOf(url) > -1;\n let enabled = this.known[url].enabled;\n const mixedContent = (window.location.protocol === 'https:' && (url.indexOf('http:') === 0));\n return !mixedContent && enabled && !addedToGun;\n });\n if (unconnectedPeers.length) {\n const sample = String(_.sample(unconnectedPeers));\n this.connect(sample);\n }\n }\n if (connectedPeers.length > maxConnectedPeers) {\n this.disconnect(_.sample(connectedPeers));\n }\n },\n\n init() {\n this.known = this.getSaved();\n /* use the default value of 1 for now because of memory issue\n local().get('settings').get('maxConnectedPeers').on(n => {\n if (n !== undefined) maxConnectedPeers = n;\n });\n */\n setInterval(() => this.checkGunPeerCount(), 1000);\n }\n};\n","import Gun from 'gun';\nimport 'gun/sea';\nimport 'gun/lib/yson';\nimport 'gun/lib/radix';\nimport 'gun/lib/radisk';\nimport 'gun/lib/store';\nimport 'gun/lib/rindexed';\nimport peers from \"./peers\";\n\nlet global: any;\n\nexport default function(opts: any = {}) {\n if (!global) {\n const myOpts = Object.assign({ peers: (opts.peers || peers.random()), localStorage: false, retry:Infinity }, opts);\n if (opts.peers) {\n opts.peers.forEach((url: string) => peers.add({url}));\n }\n peers.init();\n global = new Gun(myOpts);\n }\n return global;\n}","// @ts-nocheck\n\n/*eslint no-useless-escape: \"off\", camelcase: \"off\" */\n\nconst UNIQUE_ID_VALIDATORS = {\n email: /^([\\w-]+(?:\\.[\\w-]+)*)@((?:[\\w-]+\\.)*\\w[\\w-]{0,66})\\.([a-z]{2,6}(?:\\.[a-z]{2})?)$/i,\n bitcoin: /^[13][a-km-zA-HJ-NP-Z0-9]{26,33}$/,\n bitcoin_address: /^[13][a-km-zA-HJ-NP-Z0-9]{26,33}$/,\n ip: /^(([1-9]?\\d|1\\d\\d|2[0-5][0-5]|2[0-4]\\d)\\.){3}([1-9]?\\d|1\\d\\d|2[0-5][0-5]|2[0-4]\\d)$/,\n ipv6: /^(?:[A-F0-9]{1,4}:){7}[A-F0-9]{1,4}$/,\n gpg_fingerprint: null,\n gpg_keyid: null,\n google_oauth2: null,\n tel: /^\\d{7,}$/,\n phone: /^\\d{7,}$/,\n keyID: null,\n url: /[-a-zA-Z0-9@:%_\\+.~#?&//=]{2,256}\\.[a-z]{2,4}\\b(\\/[-a-zA-Z0-9@:%_\\+.~#?&//=]*)?/gi,\n account: /^([\\w-]+(?:\\.[\\w-]+)*)@((?:[\\w-]+\\.)*\\w[\\w-]{0,66})\\.([a-z]{2,6}(?:\\.[a-z]{2})?)$/i,\n uuid: /[0-9a-f]{8}\\-[0-9a-f]{4}\\-[0-9a-f]{4}\\-[0-9a-f]{4}\\-[0-9a-f]{12}/\n};\n\n// TODO this class could perhaps be removed\n\nclass Attribute {\n constructor(a, b) {\n if (typeof a === `object`) {\n if (typeof a.value !== `string`) { throw new Error(`param1.value must be a string, got ${typeof a.value}: ${JSON.stringify(a.value)}`); }\n if (typeof a.type !== `string`) { throw new Error(`param1.type must be a string, got ${typeof a.type}: ${JSON.stringify(a.type)}`); }\n b = a.value;\n a = a.type;\n }\n if (typeof a !== `string`) { throw new Error(`First param must be a string, got ${typeof a}: ${JSON.stringify(a)}`); }\n if (!a.length) { throw new Error(`First param string is empty`); }\n if (b) {\n if (typeof b !== `string`) { throw new Error(`Second parameter must be a string, got ${typeof b}: ${JSON.stringify(b)}`); }\n if (!b.length) { throw new Error(`Second param string is empty`); }\n this.type = a;\n this.value = b;\n } else {\n this.value = a;\n const t = Attribute.guessTypeOf(this.value);\n if (t) {\n this.type = t;\n } else {\n throw new Error(`Type of attribute was omitted and could not be guessed`);\n }\n }\n }\n\n static getUuid() {\n const b = a => a ? (a ^ Math.random() * 16 >> a / 4).toString(16) : ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, b);\n return new Attribute(`uuid`, b());\n }\n\n static getUniqueIdValidators() {\n return UNIQUE_ID_VALIDATORS;\n }\n\n static isUniqueType(type) {\n return Object.keys(UNIQUE_ID_VALIDATORS).indexOf(type) > -1;\n }\n\n isUniqueType() {\n return Attribute.isUniqueType(this.type);\n }\n\n static guessTypeOf(value) {\n for (const key in UNIQUE_ID_VALIDATORS) {\n if (value.match(UNIQUE_ID_VALIDATORS[key])) {\n return key;\n }\n }\n }\n\n static equals(a, b) {\n return a.equals(b);\n }\n\n equals(a) {\n return a && this.type === a.type && this.value === a.value;\n }\n\n uri() {\n return `${encodeURIComponent(this.value)}:${encodeURIComponent(this.type)}`;\n }\n}\n\nexport default Attribute;\n","import publicState from './global';\nimport session from './session';\n\nlet currentUser: any;\n\n/**\n * Get a public space where only the specified user (public key) can write. Others can read.\n * @param pub The public key of the user. Defaults to the current user from session.\n * @returns {Node} The user space.\n */\nexport default function(pub?: string) {\n if (!currentUser) {\n currentUser = publicState().user();\n currentUser.auth(session.getKey());\n }\n return pub ? publicState().user(pub) : currentUser;\n}\n","// @ts-nocheck\n\nimport Gun from 'gun';\nimport 'gun/sea';\nimport util from './util';\nimport Attribute from './Attribute';\nimport session from './session';\nimport publicState from './global';\nimport userState from './public';\n\n// TODO: extract Group channels into their own class\n\nconst DEFAULT_PERMISSIONS = {read: true, write: true, admin: false};\n\n/**\n* Private communication channel between two or more participants ([Gun](https://github.com/amark/gun) public keys). Can be used independently of other Iris stuff.\n*\n* Used as a core element of [iris-messenger](https://github.com/irislib/iris-messenger).\n*\n* You can use iris.private(pub) to always use the same Channel object for a given pub.\n*\n* ---\n*\n* #### Key-value API\n* `channel.put(key, value)` and `channel.on(key, callback)`.\n*\n* Note that each participant has their own versions of each key-value — they don't overwrite each other. `channel.on()` callback returns them all by default and has a parameter that indicates whose value you got.\n*\n* While values are encrypted, encryption of keys is not implemented yet.\n*\n* #### Message API\n* `channel.send()` and `channel.getMessages()` for timestamp-indexed chat-style messaging.\n*\n* Message data is encrypted, but timestamps are public so that peers can return your messages in a sequential order.\n*\n* ---\n*\n* You can open a channel with yourself for a private key-value space or a \"note to self\" type chat with yourself.\n*\n* **Privacy disclaimer:** Channel ids, data values and messages are encrypted, but message timestamps are unencrypted so that peers can return them to you in a sequential order. By looking at the unencrypted timestamps (or Gun subscriptions), it is possible to guess who are communicating with each other. This could be improved by indexing messages by *day* only, so making the guess would be more difficult, while you could still return them in a semi-sequential order.\n*\n* @param {Object} options\n* @param {string} options.key your keypair\n* @param {Object} options.gun [gun](https://github.com/amark/gun) instance\n* @param options.participants (optional) string or string array or permissions object ({'pub1':{read:true,write:true,admin:false},'pub2'...}) of participant public keys (your own key is included by default)\n* @param {string} options.chatLink (optional) chat link instead of participants list\n* @param {string} options.uuid (group channels only) unique channel identifier. Leave out for new channel.\n* @param {string} options.name (group channels only) channel name\n* @example\n* // Copy & paste this to console at https://iris.to or other page that has gun, sea and iris-lib\n* // Due to an unsolved bug, someoneElse's messages only start showing up after a reload\n*\n* var gun1 = new Gun('https://gun-us.herokuapp.com/gun');\n* var gun2 = new Gun('https://gun-us.herokuapp.com/gun');\n* var myKey = await iris.Key.getDefault();\n* var someoneElse = localStorage.getItem('someoneElsesKey');\n* if (someoneElse) {\n* someoneElse = JSON.parse(someoneElse);\n* } else {\n* someoneElse = await iris.Key.generate();\n* localStorage.setItem('someoneElsesKey', JSON.stringify(someoneElse));\n* }\n*\n* iris.Channel.initUser(gun1, myKey); // saves myKey.epub to gun.user().get('epub')\n* iris.Channel.initUser(gun2, someoneElse);\n*\n* var ourChannel = new iris.Channel({key: myKey, gun: gun1, participants: someoneElse.pub});\n* var theirChannel = new iris.Channel({key: someoneElse, gun: gun2, participants: myKey.pub});\n*\n* var myChannels = {}; // you can list them in a user interface\n* function printMessage(msg, info) {\n* console.log(`[${new Date(msg.time).toLocaleString()}] ${info.from.slice(0,8)}: ${msg.text}`)\n* }\n* iris.Channel.getChannels(gun1, myKey, channel => {\n* var pub = channel.getCurrentParticipants()[0];\n* gun1.user(pub).get('profile').get('name').on(name => channel.name = name);\n* myChannels[pub] = channel;\n* channel.getMessages(printMessage);\n* channel.on('mood', (mood, from) => console.log(from.slice(0,8) + ' is feeling ' + mood));\n* });\n*\n* // you can play with these in the console:\n* ourChannel.send('message from myKey');\n* theirChannel.send('message from someoneElse');\n*\n* ourChannel.put('mood', 'blessed');\n* theirChannel.put('mood', 'happy');\n*\n* @example https://github.com/irislib/iris-lib/blob/master/__tests__/Channel.js\n*/\nclass Channel {\n // TODO: these should be done in a cleaner way\n latestTime: any;\n theirMsgsLastSeenDate: any;\n myLastSeenTime: any;\n theirMsgsLastSeenTime: any;\n notificationSetting: any;\n messageIds: any; // this is used from session.processMessage\n latest: any;\n uuid: any;\n name: any;\n attachments: any;\n\n theirSecretUuids = {};\n theirGroupSecrets = {};\n secrets = {};\n ourSecretChannelIds = {};\n theirSecretChannelIds = {};\n messages = {};\n chatLinks = {};\n groupSubscriptions = {};\n directSubscriptions = {};\n getParticipantsCallbacks = {};\n myGroupSecret: any;\n participants: any;\n\n constructor(options: any) {\n this.myGroupSecret = options.myGroupSecret;\n\n if (options.chatLink) {\n this.useChatLink(options);\n }\n\n if (typeof options.participants === `string`) {\n this.addParticipant(options.participants, options.save);\n } else if (Array.isArray(options.participants)) {\n const o = {};\n options.participants.forEach(p => o[p] = Object.assign({}, DEFAULT_PERMISSIONS));\n options.participants = o;\n }\n if (typeof options.participants === `object`) { // it's a group channel\n const keys = Object.keys(options.participants);\n keys.forEach(k => {\n if (k !== session.getKey().pub) {\n this.addParticipant(k, options.save, Object.assign({}, DEFAULT_PERMISSIONS, options.participants[k]));\n }\n });\n options.participants[session.getKey().pub] = options.participants[session.getKey().pub] || Object.assign({}, DEFAULT_PERMISSIONS);\n if (options.uuid) {\n this.uuid = options.uuid;\n this.name = options.name;\n } else {\n options.uuid = Attribute.getUuid().value;\n this.uuid = options.uuid;\n options.participants[session.getKey().pub].admin = true;\n options.participants[session.getKey().pub].founder = true;\n }\n this.getChatLinks({subscribe: true});\n }\n this.participants = options.participants;\n if (options.uuid) { // It's a group channel\n // share secret uuid with other participants. since secret is already non-deterministic, maybe uuid could also be?\n // generate channel-specific secret and share it with other participants\n // put() keys should be encrypted first? so you could do put(uuid, secret)\n // what if you join the channel with 2 unconnected devices? on reconnect, the older secret would be overwritten and messages unreadable. maybe participants should store each others' old keys? or maybe you should store them and re-encrypt old stuff when key changes? return them with map() instead?\n this.putDirect(`S${this.uuid}`, this.getMyGroupSecret());\n this.getMySecretUuid().then(s => {\n this.putDirect(this.uuid, s); // TODO: encrypt keys in put()\n });\n this.onTheirDirect(this.uuid, (s, k, from) => {\n this.theirSecretUuids[from] = s;\n });\n this.onTheirDirect(`S${this.uuid}`, (s, k, from) => {\n this.theirGroupSecrets[from] = s;\n });\n // need to make put(), on(), send() and getMessages() behave differently when it's a group and retain the old versions for mutual signaling\n }\n this.onTheir(`participants`, (participants, k, from) => {\n let hasAdmin = false;\n const keys = Object.keys(this.participants);\n for (let i = 0; i < keys.length; i++) {\n if (this.participants[keys[i]].admin || this.participants[keys[i]].inviter) {\n hasAdmin = true;\n break;\n }\n }\n if (!hasAdmin) {\n keys.forEach(k => this.participants[k].admin = true); // if no admins, make everyone admin\n }\n if (this.participants[from] && (this.participants[from].admin || this.participants[from].inviter)) {\n if (typeof participants === `object`) {\n if (JSON.stringify(this.participants) === JSON.stringify(participants)) { return; }\n this.participants = participants;\n delete this.participants[from].inviter;\n Object.keys(participants).forEach(k => {\n if (k !== session.getKey().pub) {\n this.addParticipant(k, true, Object.assign({}, DEFAULT_PERMISSIONS, participants[k]), true);\n }\n });\n this.participantsChanged();\n options.saved = true;\n }\n }\n });\n if (!options.saved && (options.save === undefined || options.save === true)) {\n this.save();\n }\n }\n\n useChatLink(options) {\n const s = options.chatLink.split('?');\n if (s.length === 2) {\n const chatWith = util.getUrlParameter('chatWith', s[1]);\n const channelId = util.getUrlParameter('channelId', s[1]);\n const inviter = util.getUrlParameter('inviter', s[1]);\n const pub = inviter || chatWith;\n if (chatWith) {\n options.participants = pub;\n } else if (channelId && inviter && inviter !== session.getKey().pub) { // TODO! initializing it twice breaks things - new secret is generated\n options.uuid = channelId;\n options.participants = {};\n options.participants[inviter] = Object.assign({inviter: true}, DEFAULT_PERMISSIONS);\n }\n if (pub !== session.getKey().pub) {\n const sharedSecret = util.getUrlParameter('s', s[1]);\n const linkId = util.getUrlParameter('k', s[1]);\n if (sharedSecret && linkId) {\n this.save(); // save the channel first so it's there before inviter subscribes to it\n options.saved = true;\n publicState().user(pub).get('chatLinks').get(linkId).get('encryptedSharedKey').on(async encrypted => {\n const sharedKey = await Gun.SEA.decrypt(encrypted, sharedSecret);\n const encryptedChatRequest = await Gun.SEA.encrypt(session.getKey().pub, sharedSecret); // TODO encrypt is not deterministic, it uses salt\n const channelRequestId = await util.getHash(encryptedChatRequest);\n util.gunAsAnotherUser(publicState(), sharedKey, user => {\n user.get('chatRequests').get(channelRequestId.slice(0, 12)).put(encryptedChatRequest);\n });\n });\n }\n }\n }\n }\n\n getTheirSecretUuid(pub) {\n return new Promise(resolve => {\n if (!this.theirSecretUuids[pub]) {\n this.onTheirDirect(this.uuid, s => {\n this.theirSecretUuids[pub] = s;\n resolve(this.theirSecretUuids[pub]);\n }, pub);\n } else {\n resolve(this.theirSecretUuids[pub]);\n }\n });\n }\n\n getTheirGroupSecret(pub) {\n if (pub === session.getKey().pub) { return this.getMyGroupSecret(); }\n return new Promise(resolve => {\n if (!this.theirGroupSecrets[pub]) {\n this.onTheirDirect(`S${this.uuid}`, s => {\n this.theirGroupSecrets[pub] = s;\n resolve(this.theirGroupSecrets[pub]);\n }, pub);\n } else {\n resolve(this.theirGroupSecrets[pub]);\n }\n });\n }\n\n changeMyGroupSecret() {\n this.myGroupSecret = Gun.SEA.random(32).toString('base64');\n // TODO: secret should be archived and probably messages should include the encryption key id so past messages don't become unreadable\n this.putDirect(`S${this.uuid}`, this.myGroupSecret);\n }\n\n /**\n * Unsubscribe messages from a channel participants\n *\n * @param {string} participant public key\n */\n async mute(participant) {\n publicState().user(participant).get(this.theirSecretUuids[participant]).off();\n // TODO: persist\n }\n\n /**\n * Mute user and prevent them from seeing your further (and maybe past) messages\n *\n * @param {string} participant public key\n */\n async block(participant) {\n this.mute(participant);\n this.putDirect(this.uuid, null);\n this.putDirect(`S${this.uuid}`, null);\n delete this.secrets[participant];\n delete this.ourSecretChannelIds[participant];\n delete this.theirSecretChannelIds[participant];\n this.changeMyGroupSecret();\n }\n\n async getMySecretUuid() {\n if (!this.mySecretUuid) {\n const mySecret = await Gun.SEA.secret(session.getKey().epub, session.getKey());\n const mySecretHash = await util.getHash(mySecret);\n this.mySecretUuid = await util.getHash(mySecretHash + this.uuid);\n }\n return this.mySecretUuid;\n }\n\n /**\n * List participants of the channel (other than you)\n */\n getCurrentParticipants() {\n return Object.keys(this.secrets);\n }\n\n /**\n * Subscribe to the changing list of participants by channel admins\n */\n getParticipants(callback) {\n if (this.getParticipantsCallbackId) {\n this.getParticipantsCallbackId++;\n } else {\n this.getParticipantsCallbackId = 1;\n }\n this.getParticipantsCallbacks[this.getParticipantsCallbackId] = callback;\n if (this.participants) {\n callback(this.participants);\n }\n }\n\n participantsChanged() {\n Object.keys(this.getParticipantsCallbacks).forEach(id => {\n this.getParticipantsCallbacks[id](this.participants);\n });\n }\n\n /**\n * Returns either the uuid of a group channel or the public key of a direct channel.\n */\n getId() {\n return this.uuid || this.getCurrentParticipants()[0];\n }\n\n async getSecret(pub) {\n if (!this.secrets[pub]) {\n const epub = await util.gunOnceDefined(publicState().user(pub).get(`epub`));\n this.secrets[pub] = await Gun.SEA.secret(epub, session.getKey());\n }\n return this.secrets[pub];\n }\n\n /**\n *\n */\n static async getOurSecretChannelId(pub, pair) {\n const epub = await util.gunOnceDefined(publicState().user(pub).get(`epub`));\n const secret = await Gun.SEA.secret(epub, pair);\n return util.getHash(secret + pub);\n }\n\n /**\n *\n */\n static async getTheirSecretChannelId(pub, pair) {\n const epub = await util.gunOnceDefined(publicState().user(pub).get(`epub`));\n const secret = await Gun.SEA.secret(epub, pair);\n return util.getHash(secret + pair.pub);\n }\n\n /**\n * Calls back with Channels that you have initiated or written to.\n * @param {Object} keypair Gun.SEA keypair that the gun instance is authenticated with\n * @param callback callback function that is called for each public key you have a channel with\n */\n static async getChannels(callback, listenToChatLinks = true) {\n const keypair = session.getKey();\n const mySecret = await Gun.SEA.secret(keypair.epub, keypair);\n if (listenToChatLinks) {\n Channel.getMyChatLinks( undefined, undefined, true);\n }\n const seen = {};\n\n const handleChannel = async (value, ourSecretChannelId) => {\n if (value && !seen[ourSecretChannelId]) {\n seen[ourSecretChannelId] = true;\n if (ourSecretChannelId.length > 44) {\n publicState().user().get(`chats`).get(ourSecretChannelId).put(null);\n return;\n }\n const encryptedChatId = await util.gunOnceDefined(publicState().user().get(`chats`).get(ourSecretChannelId).get(`pub`));\n const chatId = await Gun.SEA.decrypt(encryptedChatId, mySecret);\n if (!chatId) {\n return;\n }\n if (chatId.pub || typeof chatId === `string`) {\n callback(new Channel({\n key: keypair,\n participants: chatId.pub || chatId,\n save: false\n }));\n } else if (chatId.uuid && chatId.participants && chatId.myGroupSecret) {\n callback(new Channel({\n key: keypair,\n participants: chatId.participants,\n uuid: chatId.uuid,\n myGroupSecret: chatId.myGroupSecret,\n save: false\n }));\n }\n }\n };\n\n publicState().user().get(`chats`).map().on(handleChannel);\n }\n\n getMyGroupSecret() { // group secret could be deterministic: hash(encryptToSelf(uuid + iterator))\n if (!this.myGroupSecret) {\n this.changeMyGroupSecret();\n }\n return this.myGroupSecret;\n }\n\n async getOurSecretChannelId(pub) {\n if (!this.ourSecretChannelIds[pub]) {\n const secret = await this.getSecret(pub);\n this.ourSecretChannelIds[pub] = await util.getHash(secret + pub);\n }\n return this.ourSecretChannelIds[pub];\n }\n\n async getTheirSecretChannelId(pub) {\n if (!this.theirSecretChannelIds[pub]) {\n const secret = await this.getSecret(pub);\n this.theirSecretChannelIds[pub] = await util.getHash(secret + session.getKey().pub);\n }\n return this.theirSecretChannelIds[pub];\n }\n\n /**\n * Get messages from the channel\n */\n async getMessages(callback) { // TODO: save callback and apply it when new participants are added to channel\n this.getCurrentParticipants().forEach(async pub => {\n if (pub !== session.getKey().pub) {\n // Subscribe to their messages\n let theirSecretChannelId;\n if (this.uuid) {\n theirSecretChannelId = await this.getTheirSecretUuid(pub);\n } else {\n theirSecretChannelId = await this.getTheirSecretChannelId(pub);\n }\n publicState().user(pub).get(`chats`).get(theirSecretChannelId).get(`msgs`).map().once((data, key) => {this.messageReceived(callback, data, this.uuid || pub, false, key, pub);});\n }\n if (!this.uuid) {\n // Subscribe to our messages\n const ourSecretChannelId = await this.getOurSecretChannelId(pub);\n userState().get(`chats`).get(ourSecretChannelId).get(`msgs`).map().once((data, key) => {this.messageReceived(callback, data, pub, true, key, session.getKey().pub);});\n }\n });\n if (this.uuid) {\n // Subscribe to our messages\n const mySecretUuid = await this.getMySecretUuid();\n userState().get(`chats`).get(mySecretUuid).get(`msgs`).map().once((data, key) => {this.messageReceived(callback, data, this.uuid, true, key, session.getKey().pub);});\n }\n }\n\n async messageReceived(callback, data, channelId, selfAuthored, key, from) {\n if (this.messages[key] || !data) {\n return;\n }\n const secret = this.uuid ? (await this.getTheirGroupSecret(from)) : (await this.getSecret(channelId));\n const decrypted = await Gun.SEA.decrypt(data, secret);\n if (typeof decrypted !== `object`) {\n return;\n }\n const info = {selfAuthored, channelId, from};\n this.messages[key] = decrypted;\n callback(decrypted, info);\n }\n\n /**\n * Get latest message in this channel. Useful for channel listing.\n */\n async getLatestMsg(callback) {\n const callbackIfLatest = async (msg, info) => {\n if (!this.latest) {\n this.latest = msg;\n callback(msg, info);\n } else {\n const t = (typeof this.latest.time === `string` ? this.latest.time : this.latest.time.toISOString());\n if (t < msg.time) {\n this.latest = msg;\n callback(msg, info);\n }\n }\n };\n this.onMy('latestMsg', msg => callbackIfLatest(msg, {selfAuthored: true, from: session.getKey().pub}));\n this.onTheir('latestMsg', (msg, k, from) => callbackIfLatest(msg, {selfAuthored: false, from}));\n }\n\n /**\n * Useful for notifications\n * @param {integer} time last seen msg time (default: now)\n */\n async setMyMsgsLastSeenTime(time?: string) {\n time = time || new Date().toISOString();\n return this.put(`msgsLastSeenTime`, time);\n }\n\n /**\n * Useful for notifications\n */\n async getMyMsgsLastSeenTime(callback) {\n this.onMy(`msgsLastSeenTime`, time => {\n this.myMsgsLastSeenTime = time;\n if (callback) {\n callback(this.myMsgsLastSeenTime);\n }\n });\n }\n\n /**\n * For \"seen\" status indicator\n */\n async getTheirMsgsLastSeenTime(callback) {\n this.onTheir(`msgsLastSeenTime`, time => {\n this.theirMsgsLastSeenTime = time;\n if (callback) {\n callback(this.theirMsgsLastSeenTime);\n }\n });\n }\n\n async removeParticipant(pub) {\n this.addParticipant(pub, true, {read: false, write: false});\n }\n\n /**\n * Add a public key to the channel or update its permissions\n * @param {string} pub\n */\n async addParticipant(pub: string, save = true, permissions?: any, subscribe?: boolean) {\n if (this.uuid) {\n return;\n }\n if (permissions === undefined) {\n permissions = DEFAULT_PERMISSIONS;\n }\n if (this.secrets[pub] && JSON.stringify(this.secrets[pub]) === JSON.stringify(permissions)) { // TODO: should be this.participants[pub]\n return;\n }\n this.secrets[pub] = null;\n this.getSecret(pub);\n const ourSecretChannelId = await this.getOurSecretChannelId(pub);\n if (save) {\n // Save their public key in encrypted format, so in channel listing we know who we are channeling with\n const mySecret = await Gun.SEA.secret(session.getKey().epub, session.getKey());\n publicState().user().get(`chats`).get(ourSecretChannelId).get(`pub`).put(await Gun.SEA.encrypt({pub}, mySecret));\n }\n if (this.uuid) {\n this.participants[pub] = permissions;\n if (save) {\n this.putDirect(`S${this.uuid}`, this.getMyGroupSecret());\n this.getMySecretUuid().then(s => {\n this.putDirect(this.uuid, s); // TODO: encrypt keys in put()\n });\n this.onTheirDirect(this.uuid, (s, k, from) => {\n this.theirSecretUuids[from] = s;\n });\n this.onTheirDirect(`S${this.uuid}`, (s, k, from) => {\n this.theirGroupSecrets[from] = s;\n });\n this.save();\n }\n }\n if (subscribe) {\n Object.values(this.directSubscriptions).forEach(arr => {\n arr.forEach(o => {\n if (!o.from || o.from === pub) {\n this._onTheirDirectFromUser(pub, o.key, o.callback);\n }\n });\n });\n Object.values(this.groupSubscriptions).forEach(arr => {\n arr.forEach(o => {\n if (o.from && o.from !== pub) { return; }\n if (permissions.write) {\n this._onTheirGroupFromUser(pub, o.key, o.callback);\n } else { // unsubscribe\n o.event && o.event.off();\n }\n });\n });\n }\n }\n\n /**\n * Send a message to the channel\n * @param msg string or {time, text, ...} object\n */\n async send(msg) {\n if (typeof msg === `string`) {\n msg = msg.trim();\n if (msg.length === 0) {\n return;\n }\n msg = {\n time: (new Date()).toISOString(),\n text: msg\n };\n } else if (typeof msg === `object`) {\n msg.time = msg.time || (new Date()).toISOString();\n } else {\n throw new Error(`msg param must be a string or an object`);\n }\n //publicState().user().get('message').set(temp);\n if (this.uuid) {\n const encrypted = await Gun.SEA.encrypt(JSON.stringify(msg), this.getMyGroupSecret());\n const mySecretUuid = await this.getMySecretUuid();\n userState().get(`chats`).get(mySecretUuid).get(`msgs`).get(`${msg.time}`).put(encrypted);\n userState().get(`chats`).get(mySecretUuid).get(`latestMsg`).put(encrypted);\n } else {\n const keys = this.getCurrentParticipants();\n for (let i = 0;i < keys.length;i++) {\n const encrypted = await Gun.SEA.encrypt(JSON.stringify(msg), (await this.getSecret(keys[i])));\n const ourSecretChannelId = await this.getOurSecretChannelId(keys[i]);\n userState().get(`chats`).get(ourSecretChannelId).get(`msgs`).get(`${msg.time}`).put(encrypted);\n userState().get(`chats`).get(ourSecretChannelId).get(`latestMsg`).put(encrypted);\n }\n }\n }\n\n /**\n * Save the channel to our channels list without sending a message\n */\n async save() {\n if (this.uuid) {\n const mySecretUuid = await this.getMySecretUuid();\n userState().get(`chats`).get(mySecretUuid).get('msgs').get('a').put(null);\n this.put(`participants`, this.participants); // public participants list\n const mySecret = await Gun.SEA.secret(session.getKey().epub, session.getKey());\n userState().get(`chats`).get(mySecretUuid).get(`pub`).put(await Gun.SEA.encrypt({\n uuid: this.uuid,\n myGroupSecret: this.getMyGroupSecret(),\n participants: this.participants // private participants list\n }, mySecret));\n this.participantsChanged();\n } else {\n const keys = this.getCurrentParticipants();\n for (let i = 0;i < keys.length;i++) {\n const ourSecretChannelId = await this.getOurSecretChannelId(keys[i]);\n userState().get(`chats`).get(ourSecretChannelId).get('msgs').get('a').put(null);\n }\n }\n }\n\n /**\n * Save a key-value pair, encrypt value. Each participant in the Channel writes to their own version of the key-value pair — they don't overwrite the same one.\n * @param {string} key\n * @param value\n */\n async put(key, value) {\n return (this.uuid ? this.putGroup : this.putDirect).call(this, key, value);\n }\n\n async putGroup(key, value) {\n if (key === `msgs`) { throw new Error(`Sorry, you can't overwrite the msgs field which is used for .send()`); }\n const encrypted = await Gun.SEA.encrypt(JSON.stringify(value), this.getMyGroupSecret());\n const mySecretUuid = await this.getMySecretUuid();\n userState().get(`chats`).get(mySecretUuid).get(key).put(encrypted);\n }\n\n async putDirect(key, value) {\n if (key === `msgs`) { throw new Error(`Sorry, you can't overwrite the msgs field which is used for .send()`); }\n const keys = this.getCurrentParticipants();\n for (let i = 0;i < keys.length;i++) {\n const encrypted = await Gun.SEA.encrypt(JSON.stringify(value), (await this.getSecret(keys[i])));\n const ourSecretChannelId = await this.getOurSecretChannelId(keys[i]);\n userState().get(`chats`).get(ourSecretChannelId).get(key).put(encrypted);\n }\n }\n\n /**\n * Subscribe to a key-value pair. Callback returns every participant's value unless you limit it with *from* param.\n * @param {string} key\n * @param {function} callback\n * @param {string} from public key whose value you want, or *\"me\"* for your value only, or *\"them\"* for the value of others only\n */\n async on(key: string, callback: Function, from?: string) {\n return (this.uuid ? this.onGroup : this.onDirect).call(this, key, callback, from);\n }\n\n async onDirect(key: string, callback: Function, from?: string) {\n if (!from || from === `me` || from === session.getKey().pub) {\n this.onMy(key, (val: any) => callback(val, session.getKey().pub));\n }\n if (!from || (from !== `me` && from !== session.getKey().pub)) {\n this.onTheir(key, (val: any, k: string, pub: string) => callback(val, pub));\n }\n }\n\n async onGroup(key: string, callback: Function, from?: string) {\n if (!from || from === `me` || from === session.getKey().pub) {\n this.onMyGroup(key, val => callback(val, session.getKey().pub));\n }\n if (!from || (from !== `me` && from !== session.getKey().pub)) {\n this.onTheirGroup(key, (val, k, pub) => callback(val, pub));\n }\n }\n\n async onMy(key: string, callback: Function) {\n return (this.uuid ? this.onMyGroup : this.onMyDirect).call(this, key, callback);\n }\n\n async onMyDirect(key: string, callback: Function) {\n if (typeof callback !== 'function') {\n throw new Error(`onMy callback must be a function, got ${typeof callback}`);\n }\n const keys = this.getCurrentParticipants();\n for (let i = 0;i < keys.length;i++) {\n const ourSecretChannelId = await this.getOurSecretChannelId(keys[i]);\n publicState().user().get(`chats`).get(ourSecretChannelId).get(key).on(async (data: any) => {\n const decrypted = await Gun.SEA.decrypt(data, (await this.getSecret(keys[i])));\n if (decrypted) {\n callback(typeof decrypted.v !== `undefined` ? decrypted.v : decrypted, key);\n }\n });\n break;\n }\n }\n\n async onMyGroup(key, callback) {\n if (typeof callback !== 'function') {\n throw new Error(`onMy callback must be a function, got ${typeof callback}`);\n }\n const mySecretUuid = await this.getMySecretUuid();\n const mySecret = await this.getMyGroupSecret();\n publicState().user().get(`chats`).get(mySecretUuid).get(key).on(async data => {\n const decrypted = await Gun.SEA.decrypt(data, mySecret);\n if (decrypted) {\n callback(typeof decrypted.v !== `undefined` ? decrypted.v : decrypted, key, session.getKey().pub);\n }\n });\n }\n\n async onTheir(key: string, callback: Function, from: string) {\n return (this.uuid ? this.onTheirGroup : this.onTheirDirect).call(this, key, callback, from);\n }\n\n async _onTheirDirectFromUser(key: string, callback: Function, pub: string) {\n if (!this.hasWritePermission(pub)) { return; }\n const theirSecretChannelId = await this.getTheirSecretChannelId(pub);\n publicState().user(pub).get(`chats`).get(theirSecretChannelId).get(key).on(async (data: any) => {\n if (!this.hasWritePermission(pub)) { return; }\n const decrypted = await Gun.SEA.decrypt(data, (await this.getSecret(pub)));\n if (decrypted) {\n callback(typeof decrypted.v !== `undefined` ? decrypted.v : decrypted, key, pub);\n }\n });\n }\n\n async onTheirDirect(key: string, callback: Function, from: string) { // TODO: subscribe to new channel participants\n if (typeof callback !== 'function') {\n throw new Error(`onTheir callback must be a function, got ${typeof callback}`);\n }\n if (!Object.prototype.hasOwnProperty.call(this.directSubscriptions, key)) {\n this.directSubscriptions[key] = [];\n }\n this.directSubscriptions[key].push({key, callback, from});\n const participants = this.getCurrentParticipants();\n participants.forEach(async pub => {\n if (from && pub !== from) { return; }\n this._onTheirDirectFromUser(pub, key, callback);\n });\n }\n\n hasWritePermission(pub) {\n return !this.uuid || (this.participants && this.participants[pub] && this.participants[pub].write);\n }\n\n async _onTheirGroupFromUser(pub: string, key: string, callback: Function, subscription: any) {\n if (!this.hasWritePermission(pub)) { return; }\n const theirSecretUuid = await this.getTheirSecretUuid(pub);\n publicState().user(pub).get(`chats`).get(theirSecretUuid).get(key).on(async (data: any, _a: any, _b: any, e: Event) => {\n if (subscription) { subscription.event = e; }\n if (!this.hasWritePermission(pub)) { return; }\n const decrypted = await Gun.SEA.decrypt(data, (await this.getTheirGroupSecret(pub)));\n if (decrypted) {\n callback(typeof decrypted.v !== `undefined` ? decrypted.v : decrypted, key, pub);\n }\n });\n }\n\n async onTheirGroup(key, callback, from) {\n if (typeof callback !== 'function') {\n throw new Error(`onTheir callback must be a function, got ${typeof callback}`);\n }\n if (!Object.prototype.hasOwnProperty.call(this.groupSubscriptions, key)) {\n this.groupSubscriptions[key] = [];\n }\n const subscription = {key, callback, from};\n this.groupSubscriptions[key].push(subscription);\n\n this.getParticipants(participants => {\n Object.keys(participants).forEach(async pub => {\n if (from && pub !== from) { return; }\n if (!(participants[pub] && participants[pub].write)) { return; }\n this._onTheirGroupFromUser(pub, key, callback, subscription);\n });\n });\n }\n\n /**\n * Set typing status\n */\n setTyping(isTyping, timeout = 5) {\n isTyping = typeof isTyping === `undefined` ? true : isTyping;\n timeout = timeout * 1000;\n this.put(`typing`, isTyping ? new Date().toISOString() : new Date(0).toISOString());\n clearTimeout(this.setTypingTimeout);\n this.setTypingTimeout = setTimeout(() => this.put(`typing`, false), timeout);\n }\n\n /**\n * Get typing status\n */\n getTyping(callback, timeout = 5) { // TODO callback not called on setTyping(false), at least for self chat\n timeout = timeout * 1000;\n this.onTheir(`typing`, (typing, key, pub) => {\n if (callback) {\n const isTyping = typing && new Date() - new Date(typing) <= timeout;\n callback(isTyping, pub);\n this.getTypingTimeouts = this.getTypingTimeouts || {};\n clearTimeout(this.getTypingTimeouts[pub]);\n if (isTyping) {\n this.getTypingTimeouts[pub] = setTimeout(() => callback(false, pub), timeout);\n }\n }\n });\n }\n\n /**\n * Add a chat button to page\n * @param options {label, channelOptions}\n */\n static addChatButton(options = {}) {\n options = Object.assign({label: 'Chat'}, options);\n if (!options.channelOptions) {\n throw new Error('addChatButton missing options.channelOptions param');\n }\n util.injectCss();\n let channel, box;\n const btn = util.createElement('div', 'iris-chat-open-button', document.body);\n btn.setAttribute('id', 'iris-chat-open-button');\n btn.innerHTML = ` ${options.label}`;\n btn.addEventListener('click', () => {\n btn.setAttribute('style', 'display: none');\n if (!channel) {\n channel = new Channel(options.channelOptions);\n box = channel.getChatBox();\n document.body.appendChild(box);\n } else {\n box.setAttribute('style', ''); // show\n }\n });\n }\n\n /**\n * Get a simple link that points to the channel.\n *\n * Direct channel: both users need to give their simple links. Use createChatLink() to get a two-way link that needs to be given by one user only.\n *\n * Group channel: Works only if the link recipient has been already added onto the channel participants list.\n */\n getSimpleLink(urlRoot = 'https://iris.to/') {\n if (this.uuid) {\n return `${urlRoot}?channelId=${this.uuid}&inviter=${session.getKey().pub}`;\n }\n return `${urlRoot}?chatWith=${this.getCurrentParticipants()[0]}`;\n }\n\n /**\n *\n */\n async getChatLinks(opts: any = {}) {\n let {callback, urlRoot, subscribe} = opts;\n urlRoot = urlRoot || 'https://iris.to/';\n if (!this.uuid) { throw new Error('Only group channels may have chat links'); }\n const chatLinks: any[] = [];\n const chatLinkSubscriptions = {};\n this.on('chatLinks', (links: any, from: string) => {\n // TODO: check admin permissions\n if (!links || typeof links !== 'object') { return; }\n Object.keys(links).forEach(linkId => {\n const link = links[linkId];\n if (link === null) {\n chatLinkSubscriptions[linkId] && chatLinkSubscriptions[linkId].off(); // unsubscribe removed chat link\n delete chatLinkSubscriptions[linkId];\n callback && callback({id: linkId, url: null});\n return;\n }\n if (chatLinks.indexOf(linkId) !== -1) { return; }\n const channels = [];\n chatLinks.push(linkId);\n const url = Channel.formatChatLink({urlRoot, inviter: from, channelId: this.uuid, sharedSecret: link.sharedSecret, linkId});\n callback && callback({url, id: linkId});\n if (subscribe) {\n publicState().user(link.sharedKey.pub).get('chatRequests').map().on(async (encPub, requestId, a, e) => {\n if (!encPub || typeof encPub !== 'string' || encPub.length < 10) { return; }\n chatLinkSubscriptions[linkId] = e;\n const s = JSON.stringify(encPub);\n if (channels.indexOf(s) === -1) {\n channels.push(s);\n const pub = await Gun.SEA.decrypt(encPub, link.sharedSecret);\n this.addParticipant(pub, undefined, undefined, true);\n }\n });\n }\n });\n });\n }\n\n async createChatLink(urlRoot = 'https://iris.to/') {\n const sharedKey = await Gun.SEA.pair();\n const sharedKeyString = JSON.stringify(sharedKey);\n const sharedSecret = await Gun.SEA.secret(sharedKey.epub, sharedKey);\n const encryptedSharedKey = await Gun.SEA.encrypt(sharedKeyString, sharedSecret);\n const ownerSecret = await Gun.SEA.secret(session.getKey().epub, session.getKey());\n const ownerEncryptedSharedKey = await Gun.SEA.encrypt(sharedKeyString, ownerSecret);\n let linkId = await util.getHash(encryptedSharedKey);\n linkId = linkId.slice(0, 12);\n\n // User has to exist, in order for .get(chatRequests).on() to be ever triggered\n await util.gunAsAnotherUser(publicState(), sharedKey, user => {\n return user.get('chatRequests').put({a: 1}).then();\n });\n\n this.chatLinks[linkId] = {sharedKey, sharedSecret};\n this.put('chatLinks', this.chatLinks);\n userState().get('chatLinks').get(linkId).put({encryptedSharedKey, ownerEncryptedSharedKey});\n\n return Channel.formatChatLink({urlRoot, channelId: this.uuid, inviter: session.getKey().pub, sharedSecret, linkId});\n }\n\n /**\n * Get a channel box element that you can add to your page\n */\n getChatBox() {\n util.injectCss();\n let minimized = false;\n\n const chatBox = util.createElement('div', 'iris-chat-box');\n const header = util.createElement('div', 'iris-chat-header', chatBox);\n const minimize = util.createElement('span', 'iris-chat-minimize', header);\n minimize.innerText = '—';\n minimize.addEventListener('click', e => {\n e.stopPropagation();\n chatBox.setAttribute('class', 'iris-chat-box minimized');\n minimized = true;\n });\n const headerText = util.createElement('div', 'iris-chat-header-text', header);\n const onlineIndicator = util.createElement('span', 'iris-online-indicator', headerText);\n onlineIndicator.innerHTML = '●';\n const nameEl = util.createElement('span', undefined, headerText);\n const close = util.createElement('span', 'iris-chat-close', header);\n close.innerHTML = '×';\n close.addEventListener('click', () => {\n chatBox.setAttribute('style', 'display: none');\n const openChatBtn = document.getElementById('iris-chat-open-button');\n if (openChatBtn) {\n openChatBtn.setAttribute('style', ''); // show\n }\n });\n header.addEventListener('click', () => {\n if (minimized) {\n chatBox.setAttribute('class', 'iris-chat-box');\n minimized = false;\n }\n });\n\n const messages = util.createElement('div', 'iris-chat-messages', chatBox);\n\n const typingIndicator = util.createElement('div', 'iris-typing-indicator', chatBox);\n typingIndicator.innerText = 'typing...';\n this.getTyping(isTyping => {\n typingIndicator.setAttribute('class', `iris-typing-indicator${ isTyping ? ' yes' : ''}`);\n });\n\n const inputWrapper = util.createElement('div', 'iris-chat-input-wrapper', chatBox);\n const textArea = util.createElement('textarea', undefined, inputWrapper);\n textArea.setAttribute('rows', '1');\n textArea.setAttribute('placeholder', 'Type a message');\n if (util.isMobile) {\n const sendBtn = util.createElement('button', undefined, inputWrapper);\n sendBtn.innerHTML = `\n \n `;\n sendBtn.addEventListener('click', () => {\n this.send(textArea.value);\n textArea.value = '';\n this.setTyping(false);\n });\n }\n\n const participants = this.getCurrentParticipants();\n if (participants.length) {\n const pub = participants[0];\n publicState().user(pub).get('profile').get('name').on(name => nameEl.innerText = name);\n Channel.getActivity(publicState(), pub, status => {\n const cls = `iris-online-indicator${ status.isActive ? ' yes' : ''}`;\n onlineIndicator.setAttribute('class', cls);\n const undelivered = messages.querySelectorAll('.iris-chat-message:not(.delivered)');\n undelivered.forEach(msg => {\n if (msg.getAttribute('data-time') <= status.lastActive) {\n const c = msg.getAttribute('class');\n msg.setAttribute('class', `${c } delivered`);\n }\n });\n });\n }\n\n this.getTheirMsgsLastSeenTime(time => {\n const unseen = messages.querySelectorAll('.iris-seen:not(.yes)');\n unseen.forEach(indicator => {\n const msgEl = indicator.parentElement.parentElement.parentElement;\n if (msgEl.getAttribute('data-time') <= time) {\n const msgClass = msgEl.getAttribute('class');\n if (msgClass.indexOf('delivered') === -1) {\n msgEl.setAttribute('class', `${msgClass } delivered`);\n }\n indicator.setAttribute('class', 'iris-seen yes');\n }\n });\n });\n\n this.getMessages((msg, info) => {\n const msgContent = util.createElement('div', 'iris-msg-content');\n msgContent.innerText = msg.text;\n const time = util.createElement('div', 'time', msgContent);\n time.innerText = util.formatTime(new Date(msg.time));\n if (info.selfAuthored) {\n const cls = this.theirMsgsLastSeenTime >= msg.time ? 'iris-seen yes' : 'iris-seen';\n const seenIndicator = util.createElement('span', cls, time);\n seenIndicator.innerHTML = ' ';\n }\n msgContent.innerHTML = msgContent.innerHTML.replace(/\\n/g, '
\\n');\n\n const msgEl = util.createElement('div', `${info.selfAuthored ? 'our' : 'their'} iris-chat-message`);\n msgEl.appendChild(msgContent);\n msgEl.setAttribute('data-time', msg.time);\n for (let i = messages.children.length; i >= 0; i--) {\n if (i === 0) {\n messages.insertBefore(msgEl, messages.firstChild);\n } else {\n const t = messages.children[i - 1].getAttribute('data-time');\n if (t && t < msg.time) {\n messages.children[i - 1].insertAdjacentElement('afterend', msgEl);\n break;\n }\n }\n }\n messages.scrollTop = messages.scrollHeight;\n });\n\n textArea.addEventListener('keyup', event => {\n Channel.setActivity(publicState(), true); // TODO\n this.setMyMsgsLastSeenTime(); // TODO\n if (event.keyCode === 13) {\n event.preventDefault();\n const content = textArea.value;\n const caret = util.getCaret(textArea);\n if (event.shiftKey) {\n textArea.value = `${content.substring(0, caret - 1) }\\n${ content.substring(caret, content.length)}`;\n } else {\n textArea.value = content.substring(0, caret - 1) + content.substring(caret, content.length);\n this.send(textArea.value);\n textArea.value = '';\n this.setTyping(false);\n }\n } else {\n this.setTyping(!!textArea.value.length);\n }\n });\n\n return chatBox;\n }\n\n /**\n * Set the user's online/active status\n * @param {string} activity string: set the activity status every 3 seconds, null/false: stop updating\n */\n static setActivity(activity) {\n if (publicState().irisActivityStatus === activity) { return; }\n publicState().irisActivityStatus = activity;\n clearTimeout(publicState().setActivityTimeout);\n const update = () => {\n publicState().user().get(`activity`).put({status: activity, time: new Date(Gun.state()).toISOString()});\n };\n update();\n function timerUpdate() {\n update();\n publicState().setActivityTimeout = setTimeout(timerUpdate, 3000);\n }\n if (activity) {\n timerUpdate();\n }\n }\n\n /**\n * Get the online status of a user.\n *\n * @param {string} pubKey public key of the user\n * @param {boolean} callback receives a boolean each time the user's online status changes\n */\n static getActivity(pubKey, callback) {\n let timeout;\n publicState().user(pubKey).get(`activity`).on(activity => {\n if (!activity || !(activity.time && activity.status)) { return; }\n clearTimeout(timeout);\n const now = new Date(Gun.state());\n const activityDate = new Date(activity.time);\n const isActive = activityDate > new Date(now.getTime() - 10 * 1000) && activityDate < new Date(now.getTime() + 30 * 1000);\n callback({isActive, lastActive: activity.time, status: activity.status});\n if (isActive) {\n timeout = setTimeout(() => callback({isOnline: false, lastActive: activity.time}), 10000);\n }\n });\n }\n\n static formatChatLink({urlRoot, chatWith, channelId, inviter, sharedSecret, linkId}) {\n const enc = encodeURIComponent;\n if (channelId && inviter) {\n return `${urlRoot}?channelId=${enc(channelId)}&inviter=${enc(inviter)}&s=${enc(sharedSecret)}&k=${enc(linkId)}`;\n }\n return `${urlRoot}?chatWith=${enc(chatWith)}&s=${enc(sharedSecret)}&k=${enc(linkId)}`;\n }\n\n /**\n * Creates a channel link that can be used for two-way communication, i.e. only one link needs to be exchanged.\n */\n static async createChatLink(urlRoot = 'https://iris.to/') {\n const user = publicState().user();\n const key = session.getKey();\n\n // We create a new Gun user whose private key is shared with the chat link recipients.\n // Chat link recipients can contact you by writing their public key to the shared key's user space.\n const sharedKey = await Gun.SEA.pair();\n const sharedKeyString = JSON.stringify(sharedKey);\n const sharedSecret = await Gun.SEA.secret(sharedKey.epub, sharedKey);\n const encryptedSharedKey = await Gun.SEA.encrypt(sharedKeyString, sharedSecret);\n const ownerSecret = await Gun.SEA.secret(key.epub, key);\n const ownerEncryptedSharedKey = await Gun.SEA.encrypt(sharedKeyString, ownerSecret);\n let linkId = await util.getHash(encryptedSharedKey);\n linkId = linkId.slice(0, 12);\n\n // User has to exist, in order for .get(chatRequests).on() to be ever triggered\n util.gunAsAnotherUser(publicState(), sharedKey, user => {\n user.get('chatRequests').put({a: 1});\n });\n\n user.get('chatLinks').get(linkId).put({encryptedSharedKey, ownerEncryptedSharedKey});\n\n return Channel.formatChatLink({urlRoot, chatWith: key.pub, sharedSecret, linkId});\n }\n\n /**\n *\n */\n static async getMyChatLinks(urlRoot = 'https://iris.to/', callback: Function, subscribe = false) {\n const key = session.getKey();\n const user = publicState().user();\n const mySecret = await Gun.SEA.secret(key.epub, key);\n const chatLinks = [];\n user.get('chatLinks').map().on((data, linkId) => {\n if (!data || chatLinks.indexOf(linkId) !== -1) { return; }\n const channels = [];\n user.get('chatLinks').get(linkId).get('ownerEncryptedSharedKey').on(async enc => {\n if (!enc || chatLinks.indexOf(linkId) !== -1) { return; }\n chatLinks.push(linkId);\n const sharedKey = await Gun.SEA.decrypt(enc, mySecret);\n const sharedSecret = await Gun.SEA.secret(sharedKey.epub, sharedKey);\n const url = Channel.formatChatLink({urlRoot, chatWith: key.pub, sharedSecret, linkId});\n if (callback) {\n callback({url, id: linkId});\n }\n if (subscribe) {\n publicState().user(sharedKey.pub).get('chatRequests').map().on(async (encPub, requestId) => {\n if (!encPub) { return; }\n const s = JSON.stringify(encPub);\n if (channels.indexOf(s) === -1) {\n channels.push(s);\n const pub = await Gun.SEA.decrypt(encPub, sharedSecret);\n const channel = new Channel({key, participants: pub});\n channel.save();\n }\n util.gunAsAnotherUser(publicState(), sharedKey, user => { // remove the channel request after reading\n user.get('chatRequests').get(requestId).put(null);\n });\n });\n }\n });\n });\n }\n\n /**\n *\n */\n removeGroupChatLink(linkId) {\n this.chatLinks[linkId] = null;\n this.put('chatLinks', this.chatLinks);\n publicState().user().get('chatLinks').get(linkId).put(null);\n }\n\n /**\n *\n */\n static removePrivateChatLink(key, linkId) {\n publicState().user().auth(key);\n publicState().user().get('chatLinks').get(linkId).put(null);\n }\n\n /**\n *\n */\n static async deleteChannel(key, pub) {\n publicState().user().auth(key);\n const channelId = await Channel.getOurSecretChannelId(pub, key);\n publicState().user().get('channels').get(channelId).put(null);\n publicState().user().get('channels').get(channelId).off();\n }\n\n /**\n *\n */\n static async deleteGroup(key, uuid) {\n const mySecret = await Gun.SEA.secret(key.epub, key);\n const mySecretHash = await util.getHash(mySecret);\n const mySecretUuid = await util.getHash(mySecretHash + uuid);\n publicState().user().auth(key);\n publicState().user().get('channels').get(mySecretUuid).put(null);\n publicState().user().get('channels').get(mySecretUuid).off();\n }\n}\n\nexport default Channel;\n","import Channel from './Channel';\nimport session from './session';\n\nconst channels = new Map();\n\n/**\n * Private channel that only you and publicKey can read/write.\n * @param publicKey\n * @returns {Channel}\n */\nexport default function(publicKey = session.getKey(), chatLink?: string): Channel {\n let channel = channels.get(publicKey);\n if (!channel) {\n channel = new Channel({participants: publicKey, chatLink})\n channels.set(publicKey, channel);\n }\n return channel;\n}","// @ts-nocheck\n\nimport localForage from 'localforage';\nimport _ from './lodash';\n\ntype MyEventListener = {\n off: Function\n};\n\n// Localforage returns null if an item is not found, so we represent null with this uuid instead.\n// not foolproof, but good enough for now.\nconst LOCALFORAGE_NULL = \"c2fc1ad0-f76f-11ec-b939-0242ac120002\";\nconst notInLocalForage = new Set();\n\nlocalForage.config({\n driver: [localForage.LOCALSTORAGE, localForage.INDEXEDDB, localForage.WEBSQL]\n})\n\n/**\n Our very own implementation of the Gun API\n */\nexport default class Node {\n id: string;\n parent: Node | null;\n children = new Map();\n on_subscriptions = new Map();\n map_subscriptions = new Map();\n value: any = undefined;\n counter = 0;\n loaded = false;\n\n /** */\n constructor(id: string = '', parent: Node|null = null) {\n this.id = id;\n this.parent = parent;\n }\n\n saveLocalForage = _.throttle(async () => {\n if (!this.loaded) {\n await this.loadLocalForage();\n }\n if (this.children.size) {\n const children = Array.from(this.children.keys());\n localForage.setItem(this.id, children);\n } else if (this.value === undefined) {\n localForage.removeItem(this.id);\n } else {\n localForage.setItem(this.id, this.value === null ? LOCALFORAGE_NULL : this.value);\n }\n }, 500);\n\n loadLocalForage = _.throttle(async () => {\n if (notInLocalForage.has(this.id)) {\n return undefined;\n }\n // try to get the value from localforage\n let result = await localForage.getItem(this.id);\n // getItem returns null if not found\n if (result === null) {\n result = undefined;\n notInLocalForage.add(this.id);\n } else if (result === LOCALFORAGE_NULL) {\n result = null;\n } else if (Array.isArray(result)) {\n // result is a list of children\n const newResult = {};\n await Promise.all(result.map(async key => {\n newResult[key] = await this.get(key).once();\n }));\n result = newResult;\n } else {\n // result is a value\n this.value = result;\n }\n this.loaded = true;\n return result;\n }, 500);\n\n doCallbacks = _.throttle(() => {\n for (const [id, callback] of this.on_subscriptions) {\n const event = { off: () => this.on_subscriptions.delete(id) };\n this.once(callback, event, false);\n }\n if (this.parent) {\n for (const [id, callback] of this.parent.on_subscriptions) {\n const event = { off: () => this.parent.on_subscriptions.delete(id) };\n this.parent.once(callback, event, false);\n }\n for (const [id, callback] of this.parent.map_subscriptions) {\n const event = { off: () => this.parent.map_subscriptions.delete(id) };\n this.once(callback, event, false);\n }\n }\n }, 40);\n\n /**\n *\n * @param key\n * @returns {Node}\n * @example node.get('users').get('alice').put({name: 'Alice'})\n */\n get(key) {\n const existing = this.children.get(key);\n if (existing) {\n return existing;\n }\n const new_node = new Node(`${this.id}/${key}`, this);\n this.children.set(key, new_node);\n this.saveLocalForage();\n return new_node;\n }\n\n /**\n * Set a value to the node. If the value is an object, it will be converted to child nodes.\n * @param value\n * @example node.get('users').get('alice').put({name: 'Alice'})\n */\n put(value) {\n if (Array.isArray(value)) {\n throw new Error('Sorry, we don\\'t deal with arrays');\n }\n if (typeof value === 'object' && value !== null) {\n this.value = undefined;\n for (const key in value) {\n this.get(key).put(value[key]);\n }\n _.defer(() => this.doCallbacks(), 100);\n return;\n }\n this.children = new Map();\n this.value = value;\n this.doCallbacks();\n this.saveLocalForage();\n }\n\n // protip: the code would be a lot cleaner if you separated the Node API from storage adapters.\n /**\n * Return a value without subscribing to it\n * @param callback\n * @param event\n * @param returnIfUndefined\n * @returns {Promise<*>}\n */\n async once(callback?: Function, event?: MyEventListener, returnIfUndefined = true): Promise {\n let result: any;\n if (this.children.size) {\n // return an object containing all children\n result = {};\n await Promise.all(Array.from(this.children.keys()).map(async key => {\n result[key] = await this.get(key).once(undefined, event);\n }));\n } else if (this.value !== undefined) {\n result = this.value;\n } else {\n result = await this.loadLocalForage();\n }\n if (result !== undefined || returnIfUndefined) {\n callback && callback(result, this.id.slice(this.id.lastIndexOf('/') + 1), null, event);\n return result;\n }\n }\n\n /**\n * Subscribe to a value\n * @param callback\n */\n on(callback: Function): void {\n const id = this.counter++;\n this.on_subscriptions.set(id, callback);\n const event = { off: () => this.on_subscriptions.delete(id) };\n this.once(callback, event, false);\n }\n\n /**\n * Subscribe to the children of a node. Callback is called separately for each child.\n * @param callback\n * @returns {Promise}\n */\n async map(callback: Function) {\n const id = this.counter++;\n this.map_subscriptions.set(id, callback);\n const event = { off: () => this.map_subscriptions.delete(id) };\n if (!this.loaded) {\n // ensure that the list of children is loaded\n await this.loadLocalForage();\n }\n for (const child of this.children.values()) {\n child.once(callback, event, false);\n }\n }\n}","import Node from './Node';\n\nlet local: Node;\n\n/**\n * Get a state that is only synced in memory and local storage.\n *\n * Useful for storing things like UI state, local indexes or logged in user.\n * @returns {Node}\n */\nexport default function() {\n if (!local) {\n local = new Node();\n }\n return local;\n}","import local from './local';\n\nlet blockedUsers: { [key: string]: boolean } = {};\n\nexport default function() {\n if (!blockedUsers) {\n blockedUsers = {};\n local().get('block').map((isBlocked: boolean, user: string) => {\n if (isBlocked === blockedUsers[user]) { return; }\n if (isBlocked) {\n blockedUsers[user] = isBlocked;\n local().get('groups').map((_v: any, k: string) => {\n local().get('groups').get(k).get(user).put(false);\n });\n } else {\n delete blockedUsers[user];\n }\n });\n }\n return blockedUsers;\n}","import local from \"./local\";\nimport userSpace from './public';\nimport blockedUsers from './blockedUsers';\n\nlet counter = 0;\nconst cache = new Map>();\nconst callbacks = new Map();\n\ntype Event = {\n off: () => void;\n}\n\n/**\n * Aggregates public data from all users in the group.\n *\n * For example, the public message feed, message replies and likes are aggregated using this.\n * @param groupName\n * @returns object\n */\nexport default function(groupName = 'everyone') {\n return {\n get(path: string, callback: any) {\n const groupNode = local().get('groups').get(groupName);\n const follows: { [key: string]: boolean; } = {};\n requestAnimationFrame(() => {\n groupNode.map((isFollowing: any, user: string) => {\n if (blockedUsers()[user]) { return; } // TODO: allow to specifically query blocked users?\n if (follows[user] && follows[user] === isFollowing) { return; }\n follows[user] = isFollowing;\n if (isFollowing) { // TODO: callback on unfollow, for unsubscribe\n let node = userSpace(user);\n if (path && path !== '/') {\n node = path.split('/').reduce((sum:any, s:string) => sum.get(decodeURIComponent(s)), node);\n }\n callback(node, user);\n }\n });\n });\n },\n\n _cached_map(cached: Map | undefined, cacheKey: string, path: string, myEvent: Event, callback: Function) {\n if (!cached) {\n const cached = new Map();\n cache.set(cacheKey, cached);\n this.get(path, (node: any, from: string) => node.map((value: any, key: string, x: any) => {\n const item = {value, key, from};\n cached.set(key, item);\n for (let cb of callbacks.get(cacheKey).values()) {\n cb(value, key, x, myEvent, from);\n }\n }));\n } else {\n for (let item of cached.values()) {\n callback(item.value, item.key, 0, myEvent, item.from);\n }\n }\n },\n\n // TODO: this should probably store just the most recent value, not everyone's value\n // TODO: for counting of likes etc, use this.count() instead\n _cached_on(cached: Map | undefined, cacheKey: string, path: string, myEvent: Event, callback: Function) {\n if (!cached) {\n const cached = new Map();\n cache.set(cacheKey, cached);\n this.get(path, (node: any, from: string) => node.on((value: any, key: string, x: any) => {\n const item = {value, key, from};\n cached.set(from, item);\n for (let cb of callbacks.get(cacheKey).values()) {\n cb(value, key, x, myEvent, from);\n }\n }));\n } else {\n for (let item of cached.values()) {\n callback(item.value, item.key, 0, myEvent, item.from);\n }\n }\n },\n\n _cached_count(cached: Map | undefined, cacheKey: string, path: string, myEvent: Event, callback: Function) {\n if (!cached) {\n const cached = new Map();\n cache.set(cacheKey, cached);\n this.get(path, (node: any, from: string) => node.on((value: any, key: string) => {\n value ? cached.set(from, true) : cached.delete(from);\n const count = cached.size;\n for (let cb of callbacks.get(cacheKey).values()) {\n cb(count, key, null, myEvent, from);\n }\n }));\n } else {\n callback(cached.size, path.split('/').pop(), null, myEvent);\n }\n },\n\n _cached_fn(fn: string, path: string, callback: Function) {\n const cacheKey = `${fn}:${groupName}:${path}`;\n\n let callbackId = counter++;\n if (callbacks.has(cacheKey)) {\n callbacks.get(cacheKey).set(callbackId, callback);\n } else {\n callbacks.set(cacheKey, new Map([[callbackId, callback]]));\n }\n\n const myEvent = {off: () => {\n let myCallbacks = callbacks.get(cacheKey);\n myCallbacks && myCallbacks.delete(callbackId);\n }};\n\n const cached = cache.get(cacheKey);\n\n switch (fn) {\n case 'map':\n this._cached_map(cached, cacheKey, path, myEvent, callback);\n break;\n case 'on':\n this._cached_on(cached, cacheKey, path, myEvent, callback);\n break;\n case 'count':\n this._cached_count(cached, cacheKey, path, myEvent, callback);\n break;\n }\n },\n\n map(path: string, callback: Function) { // group queries are slow, so we cache them\n this._cached_fn('map', path, callback);\n },\n\n on(path: string, callback: Function) {\n this._cached_fn('on', path, callback);\n },\n\n count(path: string, callback: Function) {\n this._cached_fn('count', path, callback);\n }\n }\n}","// @ts-nocheck\n\nimport _ from './lodash';\nimport Gun from 'gun';\n\nimport session from './session';\nimport util from './util';\nimport publicState from './global';\nimport privateState from './private';\nimport local from './local';\nimport group from './group';\n\nconst NOTIFICATION_SERVICE_URL = 'https://iris-notifications.herokuapp.com/notify';\n// const notificationSound = new Audio('../../assets/audio/notification.mp3'); // TODO\nlet loginTime;\nlet unseenMsgsTotal = 0;\nlet unseenNotificationCount = 0;\nconst webPushSubscriptions = {};\n\nfunction desktopNotificationsEnabled() {\n return window.Notification && Notification.permission === 'granted';\n}\n\nfunction notifyMsg(msg, info, channelId, onClick) {\n function shouldNotify() {\n if (msg.timeObj < loginTime) { return false; }\n if (info.selfAuthored) { return false; }\n if (document.visibilityState === 'visible') { return false; }\n const channel = privateState(channelId);\n if (channel.notificationSetting === 'nothing') { return false; }\n if (channel.notificationSetting === 'mentions' && !msg.text.includes(session.getMyName())) { return false; }\n return true;\n }\n function shouldDesktopNotify() {\n if (!desktopNotificationsEnabled()) { return false; }\n return shouldNotify();\n }\n function shouldAudioNotify() {\n return shouldNotify();\n }\n if (shouldAudioNotify()) {\n //notificationSound.play(); // TODO\n }\n if (shouldDesktopNotify()) {\n let body, title;\n const channel = privateState(channelId);\n if (channel.uuid) {\n title = channel.participantProfiles[info.from].name;\n body = `${name}: ${msg.text}`;\n } else {\n title = 'Message'\n body = msg.text;\n }\n body = util.truncateString(body, 50);\n let desktopNotification = new Notification(title, { // TODO: replace with actual name\n icon: '/assets/img/icon128.png',\n body,\n silent: true\n });\n desktopNotification.onclick = function() {\n changeUnseenNotificationCount(-1);\n onClick && onClick();\n window.focus();\n };\n }\n}\n\nfunction changeChatUnseenMsgsCount(chatId, change) {\n const chat = privateState(chatId);\n if (!chat) return;\n const chatNode = local().get('channels').get(chatId);\n if (change) {\n unseenMsgsTotal += change;\n chat.unseen += change;\n } else {\n unseenMsgsTotal = unseenMsgsTotal - (chat.unseen || 0);\n chat.unseen = 0;\n }\n chatNode.get('unseen').put(chat.unseen);\n unseenMsgsTotal = unseenMsgsTotal >= 0 ? unseenMsgsTotal : 0;\n local().get('unseenMsgsTotal').put(unseenMsgsTotal);\n}\n\nconst publicVapidKey = 'BMqSvZArOIdn7vGkYplSpkZ70-Qt8nhYbey26WVa3LF3SwzblSzm3n3HHycpNkAKVq7MCkrzFuTFs_en7Y_J2MI';\n\nfunction urlBase64ToUint8Array(base64String) {\n const padding = '='.repeat((4 - base64String.length % 4) % 4);\n const base64 = (base64String + padding)\n .replace(/-/g, '+')\n .replace(/_/g, '/');\n\n const rawData = window.atob(base64);\n const outputArray = new Uint8Array(rawData.length);\n\n for (let i = 0; i < rawData.length; ++i) {\n outputArray[i] = rawData.charCodeAt(i);\n }\n return outputArray;\n}\n\nasync function subscribe(reg) {\n try {\n const subscription = await reg.pushManager.subscribe({\n userVisibleOnly: true,\n applicationServerKey: urlBase64ToUint8Array(publicVapidKey)\n });\n addWebPushSubscription(subscription);\n } catch (e) {\n console.error('web push subscription error', e);\n }\n}\n\nasync function subscribeToWebPush() {\n console.log('subscribing to web push', navigator.serviceWorker);\n if (!desktopNotificationsEnabled() || !navigator.serviceWorker) { return false; }\n await navigator.serviceWorker.ready;\n const reg = await navigator.serviceWorker.getRegistration();\n reg.active.postMessage({key: session.getKey()});\n const sub = await reg.pushManager.getSubscription();\n sub ? addWebPushSubscription(sub) : subscribe(reg);\n}\n\nconst addWebPushSubscriptionsToChats = _.debounce(() => {\n const arr = Object.values(webPushSubscriptions);\n session.channelIds.forEach(channelId => {\n privateState(channelId).put('webPushSubscriptions', arr);\n });\n}, 5000);\n\nfunction removeSubscription(hash) {\n delete webPushSubscriptions[hash];\n publicState().user().get('webPushSubscriptions').get(hash).put(null);\n addWebPushSubscriptionsToChats();\n}\n\nasync function addWebPushSubscription(s, saveToGun = true) {\n const myKey = session.getKey();\n const mySecret = await Gun.SEA.secret(myKey.epub, myKey);\n const enc = await Gun.SEA.encrypt(s, mySecret);\n const hash = await util.getHash(JSON.stringify(s));\n if (saveToGun) {\n publicState().user().get('webPushSubscriptions').get(hash).put(enc);\n }\n webPushSubscriptions[hash] = s;\n addWebPushSubscriptionsToChats();\n}\n\nasync function getWebPushSubscriptions() {\n const myKey = session.getKey();\n const mySecret = await Gun.SEA.secret(myKey.epub, myKey);\n publicState().user().get('webPushSubscriptions').map().on(async enc => {\n if (!enc) { return; }\n const s = await Gun.SEA.decrypt(enc, mySecret);\n addWebPushSubscription(s, false);\n });\n}\n\nfunction getEpub(user) {\n return new Promise(resolve => {\n publicState().user(user).get('epub').on(async (epub,k,x,e) => {\n if (epub) {\n e.off();\n resolve(epub);\n }\n });\n });\n}\n\nasync function getNotificationText(notification) {\n const profile = await publicState().user(notification.from).get('profile').once();\n const name = (profile && profile.name) || 'someone';\n const event = notification.event || notification.action;\n let eventText;\n if (event === 'like') eventText = `${name} liked your post`;\n else if (event === 'reply') eventText = `${name} replied to your post`;\n else if (event === 'mention') eventText = `${name} mentioned you in their post`;\n else if (event === 'follow') eventText = `${name} started following you`;\n else eventText = `${name} sent you a notification: ${event}`;\n return eventText;\n}\n\nfunction subscribeToIrisNotifications(onClick?: Function) {\n let notificationsSeenTime: any;\n let notificationsShownTime: any;\n publicState().user().get('notificationsSeenTime').on(v => {\n notificationsSeenTime = v;\n console.log(v);\n });\n publicState().user().get('notificationsShownTime').on(v => notificationsShownTime = v);\n const setNotificationsShownTime = _.debounce(() => {\n publicState().user().get('notificationsShownTime').put(new Date().toISOString());\n }, 1000);\n const alreadyHave = new Set();\n group().on(`notifications/${session.getPubKey()}`, async (encryptedNotification, k, x, e, from) => {\n const id = from.slice(0,30) + encryptedNotification.slice(0,30);\n if (alreadyHave.has(id)) { return; }\n alreadyHave.add(id);\n const epub = await getEpub(from);\n const secret = await Gun.SEA.secret(epub, session.getKey());\n const notification = await Gun.SEA.decrypt(encryptedNotification, secret);\n if (!notification || typeof notification !== 'object') { return; }\n setNotificationsShownTime();\n notification.from = from;\n local().get('notifications').get(notification.time).put(notification);\n if (!notificationsSeenTime || (notificationsSeenTime < notification.time)) {\n changeUnseenNotificationCount(1);\n }\n if (!notificationsShownTime || notificationsShownTime < notification.time) {\n console.log('was new!');\n const text = await getNotificationText(notification);\n let desktopNotification = new Notification(text, {\n icon: '/assets/img/icon128.png',\n body: text,\n silent: true\n });\n desktopNotification.onclick = function() {\n const link = notification.target ? `/post/${notification.target}` : `/profile/${notification.from}`;\n onClick && onClick(link);\n changeUnseenNotificationCount(-1);\n window.focus();\n };\n }\n });\n}\n\nfunction changeUnseenNotificationCount(change) {\n if (!change) {\n unseenNotificationCount = 0;\n publicState().user().get('notificationsSeenTime').put(new Date().toISOString());\n } else {\n unseenNotificationCount += change;\n unseenNotificationCount = Math.max(unseenNotificationCount, 0);\n }\n local().get('unseenNotificationCount').put(unseenNotificationCount);\n}\n\nasync function sendIrisNotification(recipient, notification) {\n if (!(recipient && notification)) { return; } // TODO: use typescript or sth :D\n if (typeof notification === 'object') { notification.time = new Date().toISOString() }\n const epub = await getEpub(recipient);\n const secret = await Gun.SEA.secret(epub, session.getKey());\n const enc = await Gun.SEA.encrypt(notification, secret);\n publicState().user().get('notifications').get(recipient).put(enc);\n}\n\nasync function sendWebPushNotification(recipient, notification) {\n console.log('sending web push notification to', recipient, notification);\n const channel = privateState(recipient);\n const myKey = session.getKey();\n const shouldWebPush = (recipient === myKey.pub) || !(channel.activity && channel.activity.isActive);\n if (shouldWebPush && channel.webPushSubscriptions) {\n const subscriptions = [];\n const participants = Object.keys(channel.webPushSubscriptions);\n for (let i = 0; i < participants.length; i++) {\n const participant = participants[i];\n const secret = await channel.getSecret(participant);\n const payload = {\n title: await Gun.SEA.encrypt(notification.title, secret),\n body: await Gun.SEA.encrypt(notification.body, secret),\n from:{pub: myKey.pub, epub: myKey.epub}\n };\n channel.webPushSubscriptions[participant].forEach(s => {\n if (s && s.endpoint) {\n subscriptions.push({subscription: s, payload});\n }\n });\n }\n if (subscriptions.length === 0) {return;}\n fetch(NOTIFICATION_SERVICE_URL, {\n method: 'POST',\n body: JSON.stringify({subscriptions}),\n headers: {\n 'content-type': 'application/json'\n }\n }).catch(() => {});\n }\n}\n\nfunction init() {\n loginTime = new Date();\n unseenMsgsTotal = 0;\n}\n\nexport default {init, notifyMsg, getNotificationText, sendWebPushNotification, changeUnseenNotificationCount, subscribeToIrisNotifications, sendIrisNotification, changeChatUnseenCount: changeChatUnseenMsgsCount, webPushSubscriptions, subscribeToWebPush, getWebPushSubscriptions, removeSubscription};\n","import util from \"./util\";\nimport Gun from \"gun\";\n\nconst electron = util.isElectron ? new Gun({peers: ['http://localhost:8768/gun'], file: 'State.electron', multicast:false, localStorage: false}).get('state') : null;\n\nexport default electron;","// @ts-nocheck\nimport Gun from 'gun';\nimport notifications from './notifications';\nimport Channel from './Channel';\nimport util from './util';\nimport _ from './lodash';\nimport Fuse from \"fuse.js\";\nimport localforage from 'localforage';\nimport local from './local';\nimport electron from './electron';\nimport user from './public';\nimport privateState from './private';\nimport blockedUsers from './blockedUsers';\n\nlet key: any;\nlet myName: string;\nlet latestChatLink: string;\nlet onlineTimeout: any;\nlet ourActivity: any;\nlet noFollows: boolean;\nlet noFollowers: boolean;\nlet searchIndex: any;\nlet initCalled: boolean;\nconst searchableItems: any = {};\nconst getExtendedFollowsCalled = new Map();\n\nconst DEFAULT_FOLLOW = 'hyECQHwSo7fgr2MVfPyakvayPeixxsaAWVtZ-vbaiSc.TXIp8MnCtrnW6n2MrYquWPcc-DTmZzMBmc2yaGv9gIU';\n\nconst DEFAULT_SETTINGS = {\n electron: {\n openAtLogin: true,\n minimizeOnClose: true\n },\n local: {\n enableWebtorrent: !util.isMobile,\n enablePublicPeerDiscovery: true,\n autoplayWebtorrent: true,\n maxConnectedPeers: util.isElectron ? 2 : 1\n }\n}\n\n/**\n * User session management utilities.\n */\nexport default {\n /**\n * Log in with a key from localStorage.\n *\n * If no key is found and options.autologin is not false, a new user will be created.\n *\n * If options.autofollow is not false, the default follow will be added.\n * @param options\n */\n init(options: any = {}) {\n if (initCalled) { return; }\n initCalled = true;\n let localStorageKey = localStorage.getItem('chatKeyPair');\n if (localStorageKey) {\n this.login(JSON.parse(localStorageKey));\n } else if (options.autologin !== false) {\n this.loginAsNewUser(options);\n } else {\n this.clearIndexedDB();\n }\n setTimeout(() => {\n local().get('block').map(() => {\n this.updateSearchIndex();\n });\n this.updateSearchIndex();\n });\n setInterval(() => {\n if (this.taskQueue.length) {\n //console.log('this.taskQueue', this.taskQueue.length);\n const t = this.taskQueue.shift();\n t && t();\n }\n }, 10);\n },\n\n DEFAULT_SETTINGS,\n DEFAULT_FOLLOW,\n\n taskQueue: [] as any[],\n\n updateSearchIndex: _.throttle(() => {\n const options = {keys: ['name'], includeScore: true, includeMatches: true, threshold: 0.3};\n const values = Object.values(_.omit(searchableItems, Object.keys(blockedUsers())));\n searchIndex = new Fuse(values, options);\n local().get('searchIndexUpdated').put(true);\n }, 2000, {leading:true}),\n\n saveSearchResult: _.throttle(k => {\n local().get('contacts').get(k).put({followDistance: searchableItems[k].followDistance,followerCount: searchableItems[k].followers.size});\n }, 1000, {leading:true}),\n\n addFollow(callback: Function, k: string, followDistance: number, follower?: string) {\n if (searchableItems[k]) {\n if (searchableItems[k].followDistance > followDistance) {\n searchableItems[k].followDistance = followDistance;\n }\n follower && searchableItems[k].followers.add(follower);\n } else {\n searchableItems[k] = {key: k, followDistance, followers: new Set(follower && [follower])};\n this.taskQueue.push(() => {\n user(k).get('profile').get('name').on((name: string) => {\n searchableItems[k].name = name;\n local().get('contacts').get(k).get('name').put(name);\n callback && callback(k, searchableItems[k]);\n });\n });\n }\n this.saveSearchResult(k);\n callback && callback(k, searchableItems[k]);\n this.updateSearchIndex();\n this.updateNoFollows();\n this.updateNoFollowers();\n },\n\n removeFollow(k: string, followDistance: number, follower: string) {\n if (followDistance === 1) {\n local().get('contacts').get(k).put(false);\n local().get('groups').get('follows').get(k).put(false);\n if (searchableItems[k]) {\n searchableItems[k].followers.delete(follower);\n this.updateNoFollows();\n this.updateNoFollowers();\n }\n }\n console.log('removeFollow', k, followDistance, follower);\n if (searchableItems[k] && searchableItems[k].followers.size === 0) {\n delete searchableItems[k];\n local().get('contacts').get(k).put(false);\n local().get('groups').get('everyone').get(k).put(false);\n }\n },\n\n getExtendedFollows(callback: Function, k = key.pub, maxDepth = 3, currentDepth = 1) {\n const called = getExtendedFollowsCalled.get(k);\n if (called && called <= currentDepth) {\n return;\n }\n getExtendedFollowsCalled.set(k, currentDepth);\n\n this.addFollow(callback, k, currentDepth - 1);\n\n user(k).get('follow').map().on((isFollowing: boolean, followedKey: string) => { // TODO: unfollow\n if (isFollowing) {\n this.addFollow(callback, followedKey, currentDepth, k);\n if (currentDepth < maxDepth) {\n this.taskQueue.push(() => this.getExtendedFollows(callback, followedKey, maxDepth, currentDepth + 1));\n }\n } else {\n this.removeFollow(followedKey, currentDepth, k);\n }\n });\n\n return searchableItems;\n },\n\n updateNoFollows: _.throttle(() => {\n const v = Object.keys(searchableItems).length <= 1;\n if (v !== noFollows) {\n noFollows = v;\n local().get('noFollows').put(noFollows);\n }\n }, 1000, {leading:true}),\n\n updateNoFollowers: _.throttle(() => {\n const v = !(searchableItems[key.pub] && (searchableItems[key.pub].followers.size > 0));\n if (v !== noFollowers) {\n noFollowers = v;\n local().get('noFollowers').put(noFollowers);\n }\n }, 1000, {leading:true}),\n\n getSearchIndex() {\n return searchIndex;\n },\n\n setOurOnlineStatus() {\n const activeRoute = window.location.hash;\n Channel.setActivity(ourActivity = 'active');\n const setActive = _.debounce(() => {\n const chatId = activeRoute && activeRoute.replace('#/profile/','').replace('#/chat/','');\n const chat = privateState(chatId);\n if (chat && !ourActivity) {\n chat.setMyMsgsLastSeenTime();\n }\n Channel.setActivity(ourActivity = 'active');\n clearTimeout(onlineTimeout);\n onlineTimeout = setTimeout(() => Channel.setActivity(ourActivity = 'online'), 30000);\n }, 1000);\n document.addEventListener(\"touchmove\", setActive);\n document.addEventListener(\"mousemove\", setActive);\n document.addEventListener(\"keypress\", setActive);\n document.addEventListener(\"visibilitychange\", () => {\n if (document.visibilityState === 'visible') {\n Channel.setActivity(ourActivity = 'active');\n const chatId = location.pathname.slice(1).replace('chat/','');\n const chat = activeRoute && privateState(chatId);\n if (chat) {\n chat.setMyMsgsLastSeenTime();\n notifications.changeChatUnseenCount(chatId, 0);\n }\n } else {\n Channel.setActivity(ourActivity = 'online');\n }\n });\n setActive();\n window.addEventListener(\"beforeunload\", () => {\n Channel.setActivity(ourActivity = null);\n });\n },\n\n updateGroups() {\n this.getExtendedFollows((k: string, info: any) => {\n if (info.followDistance <= 1) {\n local().get('groups').get('follows').get(k).put(true);\n }\n local().get('groups').get('everyone').get(k).put(true);\n if (k === this.getPubKey()) {\n this.updateNoFollowers();\n }\n });\n },\n\n /**\n * Log in with a private key.\n * @param key\n */\n login(k: any) {\n const shouldRefresh = !!key;\n key = k;\n localStorage.setItem('chatKeyPair', JSON.stringify(k));\n user().auth(key);\n user().put({epub: key.epub});\n user().get('likes').put({a:null}); // gun bug?\n user().get('msgs').put({a:null}); // gun bug?\n user().get('replies').put({a:null}); // gun bug?\n notifications.subscribeToWebPush();\n notifications.getWebPushSubscriptions();\n notifications.subscribeToIrisNotifications();\n Channel.getMyChatLinks( undefined, (chatLink: any) => {\n local().get('chatLinks').get(chatLink.id).put(chatLink.url);\n latestChatLink = chatLink.url;\n });\n this.setOurOnlineStatus();\n Channel.getChannels( (c: Channel) => this.addChannel(c));\n user().get('profile').get('name').on((name: any) => {\n if (name && typeof name === 'string') {\n myName = name;\n }\n });\n notifications.init();\n local().get('loggedIn').put(true);\n local().get('settings').once().then(settings => {\n if (!settings) {\n local().get('settings').put(DEFAULT_SETTINGS.local);\n } else if (settings.enableWebtorrent === undefined || settings.autoplayWebtorrent === undefined) {\n local().get('settings').get('enableWebtorrent').put(DEFAULT_SETTINGS.local.enableWebtorrent);\n local().get('settings').get('autoplayWebtorrent').put(DEFAULT_SETTINGS.local.autoplayWebtorrent);\n }\n });\n user().get('block').map().on((isBlocked: boolean, user: string) => {\n local().get('block').get(user).put(isBlocked);\n if (isBlocked) {\n delete searchableItems[user];\n }\n });\n this.updateGroups();\n if (shouldRefresh) {\n location.reload();\n }\n if (electron) {\n electron.get('settings').on(electron => {\n local().get('settings').get('electron').put(electron);\n });\n electron.get('user').put(key.pub);\n }\n local().get('filters').get('group').once().then(v => {\n if (!v) {\n local().get('filters').get('group').put('follows');\n }\n });\n },\n\n /**\n * Create a new user account and log in.\n * @param options {Object} - Options for the new account.\n * @returns {Promise<*>}\n */\n loginAsNewUser(options: any = {}) {\n const name = options.name || util.generateName();\n console.log('loginAsNewUser name', name);\n return Gun.SEA.pair().then(k => {\n this.login(k);\n user().get('profile').put({a:null});\n user().get('profile').get('name').put(name);\n local().get('filters').put({a:null});\n local().get('filters').get('group').put('follows');\n Channel.createChatLink().then(l => latestChatLink = l);\n setTimeout(() => {\n if (options.autofollow !== false) {\n console.log('autofollowing', DEFAULT_FOLLOW);\n user().get('follow').get(DEFAULT_FOLLOW).put(true);\n }\n }, 1000); // maybe wait for login return instead\n });\n },\n\n /**\n * Log out the current user.\n * @returns {Promise}\n */\n async logOut() {\n if (electron) {\n electron.get('user').put(null);\n }\n // TODO: remove subscription from your channels\n if (navigator.serviceWorker) {\n const reg = await navigator.serviceWorker.getRegistration();\n if (reg && reg.pushManager) {\n reg.active?.postMessage({key: null});\n const sub = await reg.pushManager.getSubscription();\n if (sub) {\n const hash = await util.getHash(JSON.stringify(sub));\n notifications.removeSubscription(hash);\n sub.unsubscribe && sub.unsubscribe();\n }\n }\n }\n this.clearIndexedDB();\n localStorage.clear(); // TODO clear only iris data\n localforage.clear().then(() => {\n window.location.hash = '';\n window.location.href = '/';\n location.reload();\n });\n },\n\n clearIndexedDB() {\n return new Promise(resolve => {\n const r1 = window.indexedDB.deleteDatabase('local()');\n const r2 = window.indexedDB.deleteDatabase('radata');\n let r1done = false;\n let r2done = false;\n const check = () => {\n r1done && r2done && resolve(undefined);\n }\n r1.onerror = r2.onerror = e => console.error(e);\n //r1.onblocked = r2.onblocked = e => console.error('blocked', e);\n r1.onsuccess = () => {\n r1done = true;\n check();\n }\n r2.onsuccess = () => {\n r2done = true;\n check();\n }\n });\n },\n\n getMyChatLink() {\n return latestChatLink || util.getProfileLink(key.pub);\n },\n\n /**\n * Get the keypair of the logged in user.\n * @returns {*}\n */\n getKey() { return key; },\n\n /**\n * Get the public key of the logged in user.\n * @returns {*}\n */\n getPubKey() {\n return key && key.pub;\n },\n\n /**\n * Get the name of the logged in user.\n * @returns {*}\n */\n getMyName() { return myName; }, // TODO maybe remove and use iris.user().get('profile').get('name') instead?\n\n myPeerUrl: (ip: string) => `http://${ip}:8767/gun`,\n\n async shareMyPeerUrl(channel: Channel) {\n const myIp = await local().get('settings').get('electron').get('publicIp').once();\n myIp && channel.put && channel.put('my_peer', this.myPeerUrl(myIp));\n },\n\n newChannel(pub: string, chatLink?: string) {\n if (!pub || this.channelIds.has(pub)) {\n return;\n }\n const chat = privateState(pub, chatLink);\n this.addChannel(chat);\n return chat;\n },\n\n addChannel(chat: Channel) {\n this.taskQueue.push(() => {\n let pub = chat.getId();\n if (this.channelIds.has(pub)) { return; }\n this.channelIds.add(pub);\n const chatNode = local().get('channels').get(pub);\n chatNode.get('latestTime').on((t: string) => {\n if (t && (!chat.latestTime || t > chat.latestTime)) {\n chat.latestTime = t;\n } else {\n // chatNode.get('latestTime').put(chat.latestTime); // omg recursion\n }\n });\n chatNode.get('theirMsgsLastSeenTime').on((t: string) => {\n if (!t) { return; }\n const d = new Date(t);\n if (!chat.theirMsgsLastSeenDate || chat.theirMsgsLastSeenDate < d) {\n chat.theirMsgsLastSeenDate = d;\n }\n });\n chat.getLatestMsg && chat.getLatestMsg((latest: any, info: any) => {\n this.processMessage(pub, latest, info);\n });\n notifications.changeChatUnseenCount(pub, 0);\n chat.notificationSetting = 'all';\n chat.onMy('notificationSetting', (val: any) => {\n chat.notificationSetting = val;\n });\n //$(\".chat-list\").append(el);\n chat.theirMsgsLastSeenTime = '';\n chat.getTheirMsgsLastSeenTime((time: any) => {\n if (chat && time && time >= chat.theirMsgsLastSeenTime) {\n chat.theirMsgsLastSeenTime = time;\n chatNode.get('theirMsgsLastSeenTime').put(time);\n }\n });\n chat.getMyMsgsLastSeenTime((time: any) => {\n chat.myLastSeenTime = new Date(time);\n if (chat.latest && chat.myLastSeenTime >= chat.latest.time) {\n notifications.changeChatUnseenCount(pub, 0);\n }\n });\n chat.isTyping = false;\n chat.getTyping(isTyping => {\n chat.isTyping = isTyping;\n local().get('channels').get(pub).get('isTyping').put(isTyping);\n });\n chat.online = {};\n Channel.getActivity(pub, (activity) => {\n if (chat) {\n chatNode.put({theirLastActiveTime: activity && activity.lastActive, activity: activity && activity.isActive && activity.status});\n chat.activity = activity;\n }\n });\n if (chat.uuid) {\n let isDarkMode = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches;\n chat.participantProfiles = {};\n chat.on('name', v => {\n chat.name = v;\n searchableItems[chat.uuid] = {name: v, uuid: chat.uuid};\n local().get('channels').get(chat.uuid).get('name').put(v);\n });\n chat.on('photo', v => {\n searchableItems[chat.uuid] = searchableItems[chat.uuid] || {};\n searchableItems[chat.uuid].photo = v;\n local().get('channels').get(chat.uuid).get('photo').put(v)\n });\n chat.on('about', v => local().get('channels').get(chat.uuid).get('about').put(v));\n chat.getParticipants(participants => {\n delete participants.undefined; // TODO fix where it comes from\n if (typeof participants === 'object') {\n let keys = Object.keys(participants);\n keys.forEach((k, i) => {\n let hue = 360 / Math.max(keys.length, 2) * i; // TODO use css filter brightness\n chat.participantProfiles[k] = {permissions: participants[k], color: `hsl(${hue}, 98%, ${isDarkMode ? 80 : 33}%)`};\n user(k).get('profile').get('name').on(name => {\n chat.participantProfiles[k].name = name;\n });\n });\n }\n local().get('channels').get(chat.uuid).get('participants').put(participants);\n });\n chat.inviteLinks = {};\n chat.getChatLinks({callback: ({url, id}) => {\n console.log('got chat link', id, url);\n chat.inviteLinks[id] = url; // TODO use State\n local().get('inviteLinksChanged').put(true);\n }});\n } else {\n // TODO do we want this?\n user(pub).get('profile').get('name').on(v => local().get('channels').get(pub).get('name').put(v))\n }\n if (chat.put) {\n chat.onTheir('webPushSubscriptions', (s, k, from) => {\n if (!Array.isArray(s)) { return; }\n chat.webPushSubscriptions = chat.webPushSubscriptions || {};\n chat.webPushSubscriptions[from || pub] = s;\n });\n const arr = Object.values(notifications.webPushSubscriptions);\n setTimeout(() => chat.put('webPushSubscriptions', arr), 5000);\n this.shareMyPeerUrl(chat);\n }\n chat.onTheir('call', call => {\n local().get('call').put({pub, call});\n });\n local().get('channels').get(pub).put({enabled:true});\n /* Disable private peer discovery, since they're not connecting anyway\n if (chat.onTheir) {\n chat.onTheir('my_peer', (url, k, from) => {\n console.log('Got private peer url', url, 'from', from);\n peers.addPeer({url, from})\n });\n }\n */\n\n });\n },\n\n // TODO: should perhaps be in Channel\n processMessage(chatId: string, msg: any, info: any, onClickNotification?: Function) {\n const chat = privateState(chatId);\n chat.messageIds = chat.messageIds || {};\n if (chat.messageIds[msg.time + info.from]) return;\n chat.messageIds[msg.time + info.from] = true;\n if (info) {\n msg = Object.assign(msg, info);\n }\n if (msg.invite) {\n const chatLink = `https://iris.to/?channelId=${msg.invite.group}&inviter=${chatId}`;\n this.newChannel(msg.invite.group, chatLink);\n return;\n }\n msg.selfAuthored = info.selfAuthored;\n local().get('channels').get(chatId).get('msgs').get(msg.time + (msg.from && msg.from.slice(0, 10))).put(JSON.stringify(msg));\n msg.timeObj = new Date(msg.time);\n if (!info.selfAuthored && msg.timeObj > chat.myLastSeenTime) {\n if (window.location.hash !== `#/chat/${ chatId}` || document.visibilityState !== 'visible') {\n notifications.changeChatUnseenCount(chatId, 1);\n } else if (ourActivity === 'active') {\n chat.setMyMsgsLastSeenTime();\n }\n }\n if (!info.selfAuthored && msg.time > chat.theirMsgsLastSeenTime) {\n local().get('channels').get(chatId).get('theirMsgsLastSeenTime').put(msg.time);\n }\n if (!chat.latestTime || (msg.time > chat.latestTime)) {\n local().get('channels').get(chatId).put({\n latestTime: msg.time,\n latest: {time: msg.time, text: msg.text, selfAuthored: info.selfAuthored}\n });\n }\n // TODO: onclickNotification should do route(`/chat/${ pub}`);\n notifications.notifyMsg(msg, info, chatId, onClickNotification);\n },\n\n subscribeToMsgs(pub) {\n const c = privateState(pub);\n if (c.subscribed) { return; }\n c.subscribed = true;\n c.getMessages((msg, info) => {\n this.processMessage(pub, msg, info);\n });\n },\n\n /**\n * Known private channels with other users\n */\n channelIds: new Set(),\n};\n","import publicSpace from './global';\nimport util from './util';\n\n/**\n * Content-addressed storage\n */\nexport default {\n /**\n * Get a file identified by its hash\n * @param hash\n * @param callback\n * @returns {Promise}\n */\n get(hash: string, callback: Function) {\n return new Promise((resolve, reject) => {\n if (!hash) {\n reject('No hash provided');\n }\n if (typeof hash !== 'string') {\n reject('Hash must be a string');\n }\n publicSpace().get('#').get(hash).on((v: any, _k: string, _x: any, e: any) => {\n if (v) {\n e.off();\n callback && callback(v);\n resolve(v);\n }\n });\n });\n },\n\n /**\n * Store a file and return its hash\n * @param value\n * @returns {Promise}\n */\n async put(value: any) {\n const hash = await util.getHash(value);\n publicSpace().get('#').get(hash).put(value);\n return hash;\n }\n}","/*eslint no-useless-escape: \"off\", camelcase: \"off\" */\n\nimport util from './util';\nimport Gun from 'gun'; // eslint-disable-line no-unused-vars\nimport 'gun/sea';\n// eslint-disable-line no-unused-vars\n\nlet myKey: any;\n\nclass Key {\n static async getActiveKey(datadir = `.`, keyfile = `iris.key`, fs?: any) {\n if (myKey) {\n return myKey;\n }\n if (fs) {\n const privKeyFile = `${datadir}/${keyfile}`;\n if (fs.existsSync(privKeyFile)) {\n const f = fs.readFileSync(privKeyFile, `utf8`);\n myKey = Key.fromString(f);\n } else {\n const newKey = await Key.generate();\n myKey = myKey || newKey; // eslint-disable-line require-atomic-updates\n fs.writeFileSync(privKeyFile, Key.toString(myKey));\n fs.chmodSync(privKeyFile, 400);\n }\n if (!myKey) {\n throw new Error(`loading default key failed - check ${datadir}/${keyfile}`);\n }\n } else {\n const str = window.localStorage.getItem(`iris.myKey`);\n if (str) {\n myKey = Key.fromString(str);\n } else {\n const newKey = await Key.generate();\n myKey = myKey || newKey; // eslint-disable-line require-atomic-updates\n window.localStorage.setItem(`iris.myKey`, Key.toString(myKey));\n }\n if (!myKey) {\n throw new Error(`loading default key failed - check localStorage iris.myKey`);\n }\n }\n return myKey;\n }\n\n static getDefault(datadir = `.`, keyfile = `iris.key`) {\n return Key.getActiveKey(datadir, keyfile);\n }\n\n static async getActivePub(datadir = `.`, keyfile = `iris.key`) {\n const key = await Key.getActiveKey(datadir, keyfile);\n return key.pub;\n }\n\n static setActiveKey(key: any, save = true, datadir = `.`, keyfile = `iris.key`, fs: any) {\n myKey = key;\n if (!save) return;\n if (util.isNode) {\n const privKeyFile = `${datadir}/${keyfile}`;\n fs.writeFileSync(privKeyFile, Key.toString(myKey));\n fs.chmodSync(privKeyFile, 400);\n } else {\n window.localStorage.setItem(`iris.myKey`, Key.toString(myKey));\n }\n }\n\n static toString(key: any) {\n return JSON.stringify(key);\n }\n\n static getId(key: any) {\n if (!(key && key.pub)) {\n throw new Error(`missing param`);\n }\n return key.pub; // hack until GUN supports lookups by keyID\n //return util.getHash(key.pub);\n }\n\n static fromString(str: string) {\n return JSON.parse(str);\n }\n\n static generate() {\n return Gun.SEA.pair();\n }\n\n static async sign(msg: any, pair: any) {\n const sig = await Gun.SEA.sign(msg, pair);\n return `a${sig}`;\n }\n\n static verify(msg: any, pubKey: any) {\n return Gun.SEA.verify(msg.slice(1), pubKey);\n }\n}\n\nexport default Key;\n","// @ts-nocheck\n\n/*jshint unused: false */\n`use strict`;\nimport util from './util';\nimport Attribute from './Attribute';\nimport Key from './Key';\n\nconst errorMsg = `Invalid message:`;\n\nclass ValidationError extends Error {}\n\n/**\n* Signed message object. Your friends can index and relay your messages, while others can still verify that they were signed by you.\n*\n* Fields: signedData, signer (public key) and signature.\n*\n* signedData has an author, signer, type, time and optionally other fields.\n*\n* signature covers the utf8 string representation of signedData. Since messages are digitally signed, users only need to care about the message signer and not who relayed it or whose index it was found from.\n*\n* signer is the entity that verified its origin. In other words: message author and signer can be different entities, and only the signer needs to use Iris.\n*\n* For example, a crawler can import and sign other people's messages from Twitter. Only the users who trust the crawler will see the messages.\n*\n* Constructor: creates a message from the param obj.signedData that must contain at least the mandatory fields: author, type and time.\n* @param obj\n*\n* @example\n* https://github.com/irislib/iris-lib/blob/master/__tests__/SignedMessage.js\n*\n* Verification message:\n* {\n* signedData: {\n* author: {name:'Alice', key:'ABCD1234'},\n* recipient: {\n* name: 'Bob',\n* email: ['bob@example.com', 'bob.saget@example.com'],\n* bitcoin: '1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa'\n* },\n* type: 'verification'\n* },\n* signer: 'ABCD1234',\n* signature: '1234ABCD'\n* }\n*/\nclass SignedMessage {\n signedData: any;\n pubKey: any;\n sig: any;\n\n constructor(obj: any) {\n this.signedData = obj.signedData;\n this.pubKey = obj.pubKey;\n if (obj.sig) {\n if (typeof obj.sig !== `string`) {\n throw new ValidationError(`SignedMessage signature must be a string`);\n }\n this.sig = obj.sig;\n this.getHash();\n }\n this._validate();\n }\n\n static _getArray(authorOrRecipient) {\n const arr = [];\n const keys = Object.keys(authorOrRecipient);\n for (let i = 0;i < keys.length;i++) {\n const type = keys[i];\n const value = authorOrRecipient[keys[i]];\n if (typeof value === `string`) {\n arr.push(new Attribute(type, value));\n } else { // array\n for (let j = 0;j < value.length;j++) {\n const elementValue = value[j];\n arr.push(new Attribute(type, elementValue));\n }\n }\n }\n return arr;\n }\n\n static _getIterable(authorOrRecipient) {\n return {\n *[Symbol.iterator]() {\n const keys = Object.keys(authorOrRecipient);\n for (let i = 0;i < keys.length;i++) {\n const type = keys[i];\n const value = authorOrRecipient[keys[i]];\n if (typeof value === `string`) {\n yield new Attribute(type, value);\n } else { // array\n for (let j = 0;j < value.length;j++) {\n const elementValue = value[j];\n yield new Attribute(type, elementValue);\n }\n }\n }\n }\n };\n }\n\n getAuthorIterable() {\n return SignedMessage._getIterable(this.signedData.author);\n }\n\n getRecipientIterable() {\n return SignedMessage._getIterable(this.signedData.recipient);\n }\n\n getAuthorArray() {\n return SignedMessage._getArray(this.signedData.author);\n }\n\n getRecipientArray() {\n return this.signedData.recipient ? SignedMessage._getArray(this.signedData.recipient) : [];\n }\n\n getSignerKeyID() {\n return this.pubKey; // hack until gun supports keyID lookups\n //return util.getHash(this.pubKey);\n }\n\n _validate() {\n if (!this.signedData) {throw new ValidationError(`${errorMsg} Missing signedData`);}\n if (typeof this.signedData !== `object`) {throw new ValidationError(`${errorMsg} signedData must be an object`);}\n const d = this.signedData;\n\n if (!d.type) {throw new ValidationError(`${errorMsg} Missing type definition`);}\n if (!d.author) {throw new ValidationError(`${errorMsg} Missing author`);}\n if (typeof d.author !== `object`) {throw new ValidationError(`${errorMsg} Author must be object`);}\n if (Array.isArray(d.author)) {throw new ValidationError(`${errorMsg} Author must not be an array`);}\n if (Object.keys(d.author).length === 0) {throw new ValidationError(`${errorMsg} Author empty`);}\n if (this.pubKey) {\n this.signerKeyHash = this.getSignerKeyID();\n }\n for (const attr in d.author) {\n const t = typeof d.author[attr];\n if (t !== `string`) {\n if (Array.isArray(d.author[attr])) {\n for (let i = 0;i < d.author[attr].length;i++) {\n if (typeof d.author[attr][i] !== `string`) {throw new ValidationError(`${errorMsg} Author attribute must be string, got ${attr}: [${d.author[attr][i]}]`);}\n if (d.author[attr][i].length === 0) {\n throw new ValidationError(`${errorMsg} author ${attr} in array[${i}] is empty`);\n }\n }\n } else {\n throw new ValidationError(`${errorMsg} Author attribute must be string or array, got ${attr}: ${d.author[attr]}`);\n }\n }\n if (attr === `keyID`) {\n if (t !== `string`) {throw new ValidationError(`${errorMsg} Author keyID must be string, got ${t}`);}\n if (this.signerKeyHash && d.author[attr] !== this.signerKeyHash) {throw new ValidationError(`${errorMsg} If message has a keyID author, it must be signed by the same key`);}\n }\n }\n if (d.recipient) {\n if (typeof d.recipient !== `object`) {throw new ValidationError(`${errorMsg} Recipient must be object`);}\n if (Array.isArray(d.recipient)) {throw new ValidationError(`${errorMsg} Recipient must not be an array`);}\n if (Object.keys(d.recipient).length === 0) {throw new ValidationError(`${errorMsg} Recipient empty`);}\n for (const attr in d.recipient) {\n const t = typeof d.recipient[attr];\n if (t !== `string`) {\n if (Array.isArray(d.recipient[attr])) {\n for (let i = 0;i < d.recipient[attr].length;i++) {\n if (typeof d.recipient[attr][i] !== `string`) {throw new ValidationError(`${errorMsg} Recipient attribute must be string, got ${attr}: [${d.recipient[attr][i]}]`);}\n if (d.recipient[attr][i].length === 0) {\n throw new ValidationError(`${errorMsg} recipient ${attr} in array[${i}] is empty`);\n }\n }\n } else {\n throw new ValidationError(`${errorMsg} Recipient attribute must be string or array, got ${attr}: ${d.recipient[attr]}`);\n }\n }\n }\n }\n if (!(d.time || d.timestamp)) {throw new ValidationError(`${errorMsg} Missing time field`);}\n\n if (!Date.parse(d.time || d.timestamp)) {throw new ValidationError(`${errorMsg} Invalid time field`);}\n\n if (d.type === `rating`) {\n if (isNaN(d.rating)) {throw new ValidationError(`${errorMsg} Invalid rating`);}\n if (isNaN(d.maxRating)) {throw new ValidationError(`${errorMsg} Invalid maxRating`);}\n if (isNaN(d.minRating)) {throw new ValidationError(`${errorMsg} Invalid minRating`);}\n if (d.rating > d.maxRating) {throw new ValidationError(`${errorMsg} Rating is above maxRating`);}\n if (d.rating < d.minRating) {throw new ValidationError(`${errorMsg} Rating is below minRating`);}\n if (typeof d.context !== `string` || !d.context.length) {throw new ValidationError(`${errorMsg} Rating messages must have a context field`);}\n }\n\n if (d.type === `verification` || d.type === `unverification`) {\n if (d.recipient.length < 2) {throw new ValidationError(`${errorMsg} At least 2 recipient attributes are needed for a connection / disconnection. Got: ${d.recipient}`);}\n }\n\n return true;\n }\n\n isPositive() {\n return this.signedData.type === `rating` && this.signedData.rating > (this.signedData.maxRating + this.signedData.minRating) / 2;\n }\n\n isNegative() {\n return this.signedData.type === `rating` && this.signedData.rating < (this.signedData.maxRating + this.signedData.minRating) / 2;\n }\n\n isNeutral() {\n return this.signedData.type === `rating` && this.signedData.rating === (this.signedData.maxRating + this.signedData.minRating) / 2;\n }\n\n /**\n * @param {Object} key Gun.SEA keypair to sign the message with\n */\n async sign(key) {\n this.sig = await Key.sign(this.signedData, key);\n this.pubKey = key.pub;\n await this.getHash();\n return true;\n }\n\n /**\n * Create an iris message. SignedMessage time is automatically set. If signingKey is specified and author omitted, signingKey will be used as author.\n * @param {Object} signedData message data object including author, recipient and other possible attributes\n * @param {Object} signingKey optionally, you can set the key to sign the message with\n * @returns {Promise} message\n */\n static async create(signedData, signingKey) {\n if (!signedData.author && signingKey) {\n signedData.author = {keyID: Key.getId(signingKey)};\n }\n signedData.time = signedData.time || (new Date()).toISOString();\n const m = new SignedMessage({signedData});\n if (signingKey) {\n await m.sign(signingKey);\n }\n return m;\n }\n\n static createVerification(signedData, signingKey) {\n signedData.type = `verification`;\n return SignedMessage.create(signedData, signingKey);\n }\n\n static createRating(signedData, signingKey) {\n signedData.type = `rating`;\n signedData.context = signedData.context || `iris`;\n signedData.maxRating = signedData.maxRating || 10;\n signedData.minRating = signedData.minRating || -10;\n return SignedMessage.create(signedData, signingKey);\n }\n\n getAuthor(index) {\n for (const a of this.getAuthorIterable()) {\n if (a.isUniqueType()) {\n return index.getContacts(a);\n }\n }\n }\n\n getRecipient(index) {\n if (!this.signedData.recipient) {\n return undefined;\n }\n for (const a of this.getRecipientIterable()) {\n if (a.isUniqueType()) {\n return index.getContacts(a);\n }\n }\n }\n\n /**\n * @returns {string} base64 sha256 hash of message\n */\n async getHash() {\n if (this.sig && !this.hash) {\n this.hash = await util.getHash(this.sig);\n }\n return this.hash;\n }\n\n getId() {\n return this.getHash();\n }\n\n static async fromSig(obj) {\n if (!obj.sig) {\n throw new Error(`Missing signature in object:`, obj);\n }\n if (!obj.pubKey) {\n throw new Error(`Missing pubKey in object:`);\n }\n //const signedData = await Key.verify(obj.sig, obj.pubKey); // disable sig verification while migrating to new gun :(\n const signedData = JSON.parse(obj.sig.slice(4)).m;\n const o = {signedData, sig: obj.sig, pubKey: obj.pubKey};\n return new SignedMessage(o);\n }\n\n /**\n * @return {boolean} true if message signature is valid. Otherwise throws ValidationError.\n */\n async verify() {\n if (!this.pubKey) {\n throw new ValidationError(`${errorMsg} SignedMessage has no .pubKey`);\n }\n if (!this.sig) {\n throw new ValidationError(`${errorMsg} SignedMessage has no .sig`);\n }\n this.signedData = await Key.verify(this.sig, this.pubKey);\n if (!this.signedData) {\n throw new ValidationError(`${errorMsg} Invalid signature`);\n }\n if (this.hash) {\n if (this.hash !== (await util.getHash(this.sig))) {\n throw new ValidationError(`${errorMsg} Invalid message hash`);\n }\n } else {\n this.getHash();\n }\n return true;\n }\n\n /**\n * @returns {string}\n */\n serialize() {\n return {sig: this.sig, pubKey: this.pubKey};\n }\n\n toString() {\n return JSON.stringify(this.serialize());\n }\n\n /**\n * @returns {Promise}\n */\n static async deserialize(s) {\n return SignedMessage.fromSig(s);\n }\n\n static async fromString(s) {\n return SignedMessage.fromSig(JSON.parse(s));\n }\n\n static async setReaction(gun, msg, reaction) {\n const hash = await msg.getHash();\n gun.get(`reactions`).get(hash).put(reaction);\n gun.get(`reactions`).get(hash).put(reaction);\n gun.get(`messagesByHash`).get(hash).get(`reactions`).get(this.rootContact.value).put(reaction);\n gun.get(`messagesByHash`).get(hash).get(`reactions`).get(this.rootContact.value).put(reaction);\n }\n}\n\nexport default SignedMessage;\n","/*eslint no-useless-escape: \"off\", camelcase: \"off\" */\n\nimport Gun from 'gun';\nimport 'gun/sea';\n\nimport session from './session';\nimport peers from './peers';\nimport util from './util';\nimport local from './local';\nimport global from './global';\nimport publicState from './public';\nimport group from './group';\nimport electron from './electron';\nimport privateState from './private';\nimport staticState from './static';\nimport notifications from './notifications';\n\nimport SignedMessage from './SignedMessage';\nimport Channel from './Channel';\nimport Node from './Node';\n\nexport default {\n local,\n global,\n\n group,\n public: publicState,\n private: privateState,\n static: staticState,\n electron,\n peers,\n session,\n util,\n notifications,\n\n SEA: Gun.SEA,\n Gun,\n SignedMessage,\n Channel,\n Node,\n};"],"names":["throttle","func","limit","inThrottle","args","arguments","context","apply","setTimeout","debounce","inDebounce","clearTimeout","sample","arr","Math","floor","random","length","sampleSize","size","shuffled","slice","i","min","temp","index","defer","once","called","omit","obj","keys","newObj","Object","forEach","key","includes","defaults","undefined","pickBy","predicate","isNode","prototype","toString","call","global","process","e","userAgent","navigator","toLowerCase","isElectron","indexOf","isMobile","check","a","test","substr","vendor","gunAsAnotherUser","gun","f","gun2","Gun","radisk","peers","_","opt","user","auth","values","back","peer","on","gunOnceDefined","node","Promise","resolve","val","_k","_a","eve","off","animals","adjectives","getHash","str","format","SEA","work","name","hash","Error","base64ToHex","capitalize","s","charAt","toUpperCase","generateName","raw","atob","result","hex","charCodeAt","getCaret","el","selectionStart","document","selection","focus","r","createRange","re","createTextRange","rc","duplicate","moveToBookmark","getBookmark","setEndPoint","text","injectCss","elementId","getElementById","sheet","createElement","id","innerHTML","head","prepend","getUrlParameter","sParam","sParams","sPageURL","window","location","search","substring","sURLVariables","split","sParameterName","decodeURIComponent","formatTime","date","t","toLocaleTimeString","timeStyle","formatDate","toLocaleString","dateStyle","getDaySeparatorText","dateStr","now","nowStr","Date","toLocaleDateString","dayDifference","round","weekday","getProfileLink","pub","origin","encodeURIComponent","truncateString","type","cls","parent","setAttribute","appendChild","delay","ELECTRON_GUN_URL","maxConnectedPeers","DEFAULT_PEERS","loc","host","is_localhost_but_not_dev","startsWith","hostname","endsWith","url","enabled","urlRegex","known","add","from","k","visibility","secret","session","getKey","epub","encrypt","encryptedUrl","encryptedUrlHash","publicState","get","put","lastSeen","toISOString","connect","save","remove","disconnect","peerFromGun","localStorage","setItem","JSON","stringify","getSaved","p","getItem","parse","util","reset","isMixedContent","disable","protocol","connectToLocalElectron","max","push","checkGunPeerCount","peersFromGun","connectedPeers","filter","wire","constructor","console","log","readyState","bufferedAmount","unconnectedPeers","addedToGun","map","mixedContent","String","init","setInterval","opts","myOpts","assign","retry","Infinity","UNIQUE_ID_VALIDATORS","email","bitcoin","bitcoin_address","ip","ipv6","gpg_fingerprint","gpg_keyid","google_oauth2","tel","phone","keyID","account","uuid","Attribute","b","value","guessTypeOf","getUuid","replace","getUniqueIdValidators","isUniqueType","match","equals","uri","currentUser","DEFAULT_PERMISSIONS","read","write","admin","Channel","options","myGroupSecret","chatLink","useChatLink","participants","addParticipant","Array","isArray","o","founder","getChatLinks","subscribe","putDirect","getMyGroupSecret","getMySecretUuid","then","onTheirDirect","theirSecretUuids","theirGroupSecrets","onTheir","hasAdmin","inviter","participantsChanged","saved","chatWith","channelId","sharedSecret","linkId","encrypted","decrypt","sharedKey","encryptedChatRequest","channelRequestId","getTheirSecretUuid","getTheirGroupSecret","changeMyGroupSecret","mute","participant","block","secrets","ourSecretChannelIds","theirSecretChannelIds","mySecretUuid","mySecret","mySecretHash","getCurrentParticipants","getParticipants","callback","getParticipantsCallbackId","getParticipantsCallbacks","getId","getSecret","getOurSecretChannelId","pair","getTheirSecretChannelId","getChannels","listenToChatLinks","keypair","getMyChatLinks","seen","handleChannel","ourSecretChannelId","encryptedChatId","chatId","getMessages","theirSecretChannelId","data","messageReceived","userState","selfAuthored","messages","decrypted","info","getLatestMsg","callbackIfLatest","msg","latest","time","onMy","setMyMsgsLastSeenTime","getMyMsgsLastSeenTime","myMsgsLastSeenTime","getTheirMsgsLastSeenTime","theirMsgsLastSeenTime","removeParticipant","permissions","directSubscriptions","_onTheirDirectFromUser","groupSubscriptions","_onTheirGroupFromUser","event","send","trim","putGroup","onGroup","onDirect","onMyGroup","onTheirGroup","onMyDirect","v","hasWritePermission","hasOwnProperty","subscription","theirSecretUuid","_b","setTyping","isTyping","timeout","setTypingTimeout","getTyping","typing","getTypingTimeouts","addChatButton","label","channelOptions","channel","box","btn","body","addEventListener","getChatBox","getSimpleLink","urlRoot","chatLinks","chatLinkSubscriptions","links","link","channels","formatChatLink","encPub","requestId","createChatLink","sharedKeyString","encryptedSharedKey","ownerSecret","ownerEncryptedSharedKey","minimized","chatBox","header","minimize","innerText","stopPropagation","headerText","onlineIndicator","nameEl","close","openChatBtn","typingIndicator","inputWrapper","textArea","sendBtn","getActivity","status","isActive","undelivered","querySelectorAll","getAttribute","lastActive","c","unseen","indicator","msgEl","parentElement","msgClass","msgContent","seenIndicator","children","insertBefore","firstChild","insertAdjacentElement","scrollTop","scrollHeight","setActivity","keyCode","preventDefault","content","caret","shiftKey","activity","irisActivityStatus","setActivityTimeout","update","state","timerUpdate","pubKey","activityDate","getTime","isOnline","enc","removeGroupChatLink","removePrivateChatLink","deleteChannel","deleteGroup","Map","publicKey","set","LOCALFORAGE_NULL","notInLocalForage","Set","localForage","config","driver","LOCALSTORAGE","INDEXEDDB","WEBSQL","Node","loaded","loadLocalForage","removeItem","has","newResult","all","on_subscriptions","map_subscriptions","existing","new_node","saveLocalForage","doCallbacks","returnIfUndefined","lastIndexOf","counter","child","local","blockedUsers","isBlocked","_v","cache","callbacks","groupName","path","groupNode","follows","requestAnimationFrame","isFollowing","userSpace","reduce","sum","_cached_map","cached","cacheKey","myEvent","x","item","cb","_cached_on","_cached_count","count","pop","_cached_fn","fn","callbackId","myCallbacks","NOTIFICATION_SERVICE_URL","loginTime","unseenMsgsTotal","unseenNotificationCount","webPushSubscriptions","desktopNotificationsEnabled","Notification","permission","notifyMsg","onClick","shouldNotify","timeObj","visibilityState","privateState","notificationSetting","getMyName","shouldDesktopNotify","shouldAudioNotify","title","participantProfiles","desktopNotification","icon","silent","onclick","changeUnseenNotificationCount","changeChatUnseenMsgsCount","change","chat","chatNode","publicVapidKey","urlBase64ToUint8Array","base64String","padding","repeat","base64","rawData","outputArray","Uint8Array","reg","pushManager","userVisibleOnly","applicationServerKey","addWebPushSubscription","error","subscribeToWebPush","serviceWorker","ready","getRegistration","active","postMessage","getSubscription","sub","addWebPushSubscriptionsToChats","channelIds","removeSubscription","saveToGun","myKey","getWebPushSubscriptions","getEpub","getNotificationText","notification","profile","action","eventText","subscribeToIrisNotifications","notificationsSeenTime","notificationsShownTime","setNotificationsShownTime","alreadyHave","group","getPubKey","encryptedNotification","target","sendIrisNotification","recipient","sendWebPushNotification","shouldWebPush","subscriptions","payload","endpoint","fetch","method","headers","changeChatUnseenCount","electron","file","multicast","myName","latestChatLink","onlineTimeout","ourActivity","noFollows","noFollowers","searchIndex","initCalled","searchableItems","getExtendedFollowsCalled","DEFAULT_FOLLOW","DEFAULT_SETTINGS","openAtLogin","minimizeOnClose","enableWebtorrent","enablePublicPeerDiscovery","autoplayWebtorrent","localStorageKey","login","autologin","loginAsNewUser","clearIndexedDB","updateSearchIndex","taskQueue","shift","includeScore","includeMatches","threshold","Fuse","leading","saveSearchResult","followDistance","followerCount","followers","addFollow","follower","updateNoFollows","updateNoFollowers","removeFollow","getExtendedFollows","maxDepth","currentDepth","followedKey","getSearchIndex","setOurOnlineStatus","activeRoute","setActive","pathname","notifications","updateGroups","shouldRefresh","addChannel","settings","reload","l","autofollow","logOut","unsubscribe","clear","localforage","href","r1","indexedDB","deleteDatabase","r2","r1done","r2done","onerror","onsuccess","getMyChatLink","myPeerUrl","shareMyPeerUrl","myIp","newChannel","latestTime","d","theirMsgsLastSeenDate","processMessage","myLastSeenTime","online","theirLastActiveTime","isDarkMode","matchMedia","matches","photo","hue","color","inviteLinks","onClickNotification","messageIds","invite","subscribeToMsgs","subscribed","reject","publicSpace","_x","Key","getActiveKey","datadir","keyfile","fs","privKeyFile","existsSync","readFileSync","fromString","generate","newKey","writeFileSync","chmodSync","getDefault","getActivePub","setActiveKey","sign","sig","verify","errorMsg","ValidationError","SignedMessage","signedData","_validate","_getArray","authorOrRecipient","j","elementValue","_getIterable","Symbol","iterator","getAuthorIterable","author","getRecipientIterable","getAuthorArray","getRecipientArray","getSignerKeyID","signerKeyHash","attr","timestamp","isNaN","rating","maxRating","minRating","isPositive","isNegative","isNeutral","create","signingKey","m","createVerification","createRating","getAuthor","getContacts","getRecipient","fromSig","serialize","deserialize","setReaction","reaction","rootContact","staticState"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"iris.cjs.development.js","sources":["../src/lodash.ts","../src/util.ts","../src/Key.ts","../src/peers.ts","../src/db/Actor.ts","../src/db/Message.ts","../src/db/adapters/Memory.ts","../src/db/adapters/IndexedDB.ts","../src/db/adapters/Websocket.ts","../src/db/Router.ts","../src/db/Node.ts","../src/global.ts","../src/Attribute.ts","../src/public.ts","../src/Channel.ts","../src/private.ts","../src/local.ts","../src/blockedUsers.ts","../src/group.ts","../src/notifications.ts","../src/electron.ts","../src/session.ts","../src/static.ts","../src/SignedMessage.ts","../src/index.ts"],"sourcesContent":["// @ts-nocheck\nconst _ = {\n throttle: (func: Function, limit: number) => {\n let inThrottle: boolean;\n return function() {\n const args = arguments;\n const context = this;\n if (!inThrottle) {\n func.apply(context, args);\n inThrottle = true;\n setTimeout(() => inThrottle = false, limit);\n }\n };\n },\n debounce: (func: Function, limit: number) => {\n let inDebounce: boolean;\n return function() {\n const args = arguments;\n const context = this;\n clearTimeout(inDebounce);\n inDebounce = setTimeout(() => func.apply(context, args), limit);\n };\n },\n sample: (arr: any[]) => arr[Math.floor(Math.random() * arr.length)],\n sampleSize: (arr: any[], size: number) => {\n const shuffled = arr.slice(0);\n let i = arr.length;\n let min = i - size;\n let temp;\n let index;\n while (i-- > min) {\n index = Math.floor((i + 1) * Math.random());\n temp = shuffled[index];\n shuffled[index] = shuffled[i];\n shuffled[i] = temp;\n }\n return shuffled.slice(min);\n },\n defer: (func: Function) => setTimeout(func, 0),\n once: (func: Function) => {\n let called = false;\n return function() {\n if (called) {\n return;\n }\n called = true;\n func.apply(this, arguments);\n };\n },\n omit: (obj: any, keys: string[]) => {\n const newObj = {};\n Object.keys(obj).forEach(key => {\n if (!keys.includes(key)) {\n newObj[key] = obj[key];\n }\n });\n return newObj;\n },\n defaults: (obj: any, defaults: any) => {\n Object.keys(defaults).forEach(key => {\n if (obj[key] === undefined) {\n obj[key] = defaults[key];\n }\n });\n return obj;\n },\n pickBy: (obj: any, predicate: Function) => {\n const newObj = {};\n Object.keys(obj).forEach(key => {\n if (predicate(obj[key])) {\n newObj[key] = obj[key];\n }\n });\n return newObj;\n },\n isEqual: (a: any, b: any) => {\n if (a === b) {\n return true;\n }\n if (a instanceof Date && b instanceof Date) {\n return a.getTime() === b.getTime();\n }\n if (!a || !b || (typeof a !== 'object' && typeof b !== 'object')) {\n return a !== a && b !== b;\n }\n if (a.prototype !== b.prototype) {\n return false;\n }\n const keys = Object.keys(a);\n if (keys.length !== Object.keys(b).length) {\n return false;\n }\n return keys.every(k => _.isEqual(a[k], b[k]));\n },\n uniq: (arr: any[]) => {\n const set = new Set(arr);\n return Array.from(set);\n }\n};\n\nexport default _;","// @ts-nocheck\n/* eslint no-useless-escape: \"off\", camelcase: \"off\" */\n\nimport _ from './lodash';\n\n// eslint-disable-line no-unused-vars\n\nlet isNode = false;\ntry {\n isNode = Object.prototype.toString.call(global.process) === `[object process]`;\n} catch (e) { null; }\n\nconst userAgent = !isNode && navigator && navigator.userAgent && navigator.userAgent.toLowerCase();\nconst isElectron = (userAgent && userAgent.indexOf(' electron/') > -1);\n\nconst isMobile = !isNode && (function() {\n if (isElectron) { return false; }\n let check = false;\n (function(a) {if (/(android|bb\\d+|meego).+mobile|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\\-(n|u)|c55\\/|capi|ccwa|cdm\\-|cell|chtm|cldc|cmd\\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\\-s|devi|dica|dmob|do(c|p)o|ds(12|\\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\\-|_)|g1 u|g560|gene|gf\\-5|g\\-mo|go(\\.w|od)|gr(ad|un)|haie|hcit|hd\\-(m|p|t)|hei\\-|hi(pt|ta)|hp( i|ip)|hs\\-c|ht(c(\\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\\-(20|go|ma)|i230|iac( |\\-|\\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\\/)|klon|kpt |kwc\\-|kyo(c|k)|le(no|xi)|lg( g|\\/(k|l|u)|50|54|\\-[a-w])|libw|lynx|m1\\-w|m3ga|m50\\/|ma(te|ui|xo)|mc(01|21|ca)|m\\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\\-2|po(ck|rt|se)|prox|psio|pt\\-g|qa\\-a|qc(07|12|21|32|60|\\-[2-7]|i\\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\\-|oo|p\\-)|sdk\\/|se(c(\\-|0|1)|47|mc|nd|ri)|sgh\\-|shar|sie(\\-|m)|sk\\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\\-|v\\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\\-|tdg\\-|tel(i|m)|tim\\-|t\\-mo|to(pl|sh)|ts(70|m\\-|m3|m5)|tx\\-9|up(\\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\\-|your|zeto|zte\\-/i.test(a.substr(0, 4))) check = true;})(navigator.userAgent || navigator.vendor || '');\n return check;\n})();\n\nfunction gunOnceDefined(node: any) {\n return new Promise(resolve => {\n node.on((val: any, _k: any, _a: any, eve: any) => {\n if (val !== undefined) {\n eve.off();\n resolve(val);\n }\n });\n });\n}\n\nconst animals = [\n 'canidae',\n 'felidae',\n 'cat',\n 'cattle',\n 'dog',\n 'donkey',\n 'goat',\n 'horse',\n 'pig',\n 'rabbit',\n 'aardvark',\n 'aardwolf',\n 'albatross',\n 'alligator',\n 'alpaca',\n 'amphibian',\n 'anaconda',\n 'angelfish',\n 'anglerfish',\n 'ant',\n 'anteater',\n 'antelope',\n 'antlion',\n 'ape',\n 'aphid',\n 'armadillo',\n 'asp',\n 'baboon',\n 'badger',\n 'bandicoot',\n 'barnacle',\n 'barracuda',\n 'basilisk',\n 'bass',\n 'bat',\n 'bear',\n 'beaver',\n 'bedbug',\n 'bee',\n 'beetle',\n 'bird',\n 'bison',\n 'blackbird',\n 'boa',\n 'boar',\n 'bobcat',\n 'bobolink',\n 'bonobo',\n 'booby',\n 'bovid',\n 'bug',\n 'butterfly',\n 'buzzard',\n 'camel',\n 'canid',\n 'capybara',\n 'cardinal',\n 'caribou',\n 'carp',\n 'cat',\n 'catshark',\n 'caterpillar',\n 'catfish',\n 'cattle',\n 'centipede',\n 'cephalopod',\n 'chameleon',\n 'cheetah',\n 'chickadee',\n 'chicken',\n 'chimpanzee',\n 'chinchilla',\n 'chipmunk',\n 'clam',\n 'clownfish',\n 'cobra',\n 'cockroach',\n 'cod',\n 'condor',\n 'constrictor',\n 'coral',\n 'cougar',\n 'cow',\n 'coyote',\n 'crab',\n 'crane',\n 'crawdad',\n 'crayfish',\n 'cricket',\n 'crocodile',\n 'crow',\n 'cuckoo',\n 'cicada',\n 'damselfly',\n 'deer',\n 'dingo',\n 'dinosaur',\n 'dog',\n 'dolphin',\n 'donkey',\n 'dormouse',\n 'dove',\n 'dragonfly',\n 'dragon',\n 'duck',\n 'eagle',\n 'earthworm',\n 'earwig',\n 'echidna',\n 'eel',\n 'egret',\n 'elephant',\n 'elk',\n 'emu',\n 'ermine',\n 'falcon',\n 'ferret',\n 'finch',\n 'firefly',\n 'fish',\n 'flamingo',\n 'flea',\n 'fly',\n 'flyingfish',\n 'fowl',\n 'fox',\n 'frog',\n 'gamefowl',\n 'galliform',\n 'gazelle',\n 'gecko',\n 'gerbil',\n 'gibbon',\n 'giraffe',\n 'goat',\n 'goldfish',\n 'goose',\n 'gopher',\n 'gorilla',\n 'grasshopper',\n 'grouse',\n 'guan',\n 'guanaco',\n 'guineafowl',\n 'gull',\n 'guppy',\n 'haddock',\n 'halibut',\n 'hamster',\n 'hare',\n 'harrier',\n 'hawk',\n 'hedgehog',\n 'heron',\n 'herring',\n 'hippopotamus',\n 'hookworm',\n 'hornet',\n 'horse',\n 'hoverfly',\n 'hummingbird',\n 'hyena',\n 'iguana',\n 'impala',\n 'jackal',\n 'jaguar',\n 'jay',\n 'jellyfish',\n 'junglefowl',\n 'kangaroo',\n 'kingfisher',\n 'kite',\n 'kiwi',\n 'koala',\n 'koi',\n 'krill',\n 'ladybug',\n 'lamprey',\n 'landfowl',\n 'lark',\n 'leech',\n 'lemming',\n 'lemur',\n 'leopard',\n 'leopon',\n 'limpet',\n 'lion',\n 'lizard',\n 'llama',\n 'lobster',\n 'locust',\n 'loon',\n 'louse',\n 'lungfish',\n 'lynx',\n 'macaw',\n 'mackerel',\n 'magpie',\n 'mammal',\n 'manatee',\n 'mandrill',\n 'marlin',\n 'marmoset',\n 'marmot',\n 'marsupial',\n 'marten',\n 'mastodon',\n 'meadowlark',\n 'meerkat',\n 'mink',\n 'minnow',\n 'mite',\n 'mockingbird',\n 'mole',\n 'mollusk',\n 'mongoose',\n 'monkey',\n 'moose',\n 'mosquito',\n 'moth',\n 'mouse',\n 'mule',\n 'muskox',\n 'narwhal',\n 'newt',\n 'nightingale',\n 'ocelot',\n 'octopus',\n 'opossum',\n 'orangutan',\n 'orca',\n 'ostrich',\n 'otter',\n 'owl',\n 'ox',\n 'panda',\n 'panther',\n 'parakeet',\n 'parrot',\n 'parrotfish',\n 'partridge',\n 'peacock',\n 'peafowl',\n 'pelican',\n 'penguin',\n 'perch',\n 'pheasant',\n 'pig',\n 'pigeon',\n 'pike',\n 'pinniped',\n 'piranha',\n 'planarian',\n 'platypus',\n 'pony',\n 'porcupine',\n 'porpoise',\n 'possum',\n 'prawn',\n 'primate',\n 'ptarmigan',\n 'puffin',\n 'puma',\n 'python',\n 'quail',\n 'quelea',\n 'quokka',\n 'rabbit',\n 'raccoon',\n 'rat',\n 'rattlesnake',\n 'raven',\n 'reindeer',\n 'reptile',\n 'rhinoceros',\n 'roadrunner',\n 'rodent',\n 'rook',\n 'rooster',\n 'roundworm',\n 'sailfish',\n 'salamander',\n 'salmon',\n 'sawfish',\n 'scallop',\n 'scorpion',\n 'seahorse',\n 'shark',\n 'sheep',\n 'shrew',\n 'shrimp',\n 'silkworm',\n 'silverfish',\n 'skink',\n 'skunk',\n 'sloth',\n 'slug',\n 'smelt',\n 'snail',\n 'snake',\n 'snipe',\n 'sole',\n 'sparrow',\n 'spider',\n 'spoonbill',\n 'squid',\n 'squirrel',\n 'starfish',\n 'stingray',\n 'stoat',\n 'stork',\n 'sturgeon',\n 'swallow',\n 'swan',\n 'swift',\n 'swordfish',\n 'swordtail',\n 'tahr',\n 'takin',\n 'tapir',\n 'tarantula',\n 'tarsier',\n 'termite',\n 'tern',\n 'thrush',\n 'tick',\n 'tiger',\n 'tiglon',\n 'toad',\n 'tortoise',\n 'toucan',\n 'trout',\n 'tuna',\n 'turkey',\n 'turtle',\n 'tyrannosaurus',\n 'urial',\n 'vicuna',\n 'viper',\n 'vole',\n 'vulture',\n 'wallaby',\n 'walrus',\n 'wasp',\n 'warbler',\n 'weasel',\n 'whale',\n 'whippet',\n 'whitefish',\n 'wildcat',\n 'wildebeest',\n 'wildfowl',\n 'wolf',\n 'wolverine',\n 'wombat',\n 'woodpecker',\n 'worm',\n 'wren',\n 'xerinae',\n 'yak',\n 'zebra',\n 'alpaca',\n 'cat',\n 'cattle',\n 'chicken',\n 'dog',\n 'donkey',\n 'ferret',\n 'gayal',\n 'goldfish',\n 'guppy',\n 'horse',\n 'koi',\n 'llama',\n 'sheep',\n 'yak',\n 'unicorn',\n];\n\nconst adjectives = [\n 'average',\n 'big',\n 'colossal',\n 'fat',\n 'giant',\n 'gigantic',\n 'great',\n 'huge',\n 'immense',\n 'large',\n 'little',\n 'long',\n 'mammoth',\n 'massive',\n 'miniature',\n 'petite',\n 'puny',\n 'short',\n 'small',\n 'tall',\n 'tiny',\n 'boiling',\n 'breezy',\n 'broken',\n 'bumpy',\n 'chilly',\n 'cold',\n 'cool',\n 'creepy',\n 'crooked',\n 'cuddly',\n 'curly',\n 'damaged',\n 'damp',\n 'dirty',\n 'dry',\n 'dusty',\n 'filthy',\n 'flaky',\n 'fluffy',\n 'wet',\n 'broad',\n 'chubby',\n 'crooked',\n 'curved',\n 'deep',\n 'flat',\n 'high',\n 'hollow',\n 'low',\n 'narrow',\n 'round',\n 'shallow',\n 'skinny',\n 'square',\n 'steep',\n 'straight',\n 'wide',\n 'ancient',\n 'brief',\n 'early',\n 'fast',\n 'late',\n 'long',\n 'modern',\n 'old',\n 'quick',\n 'rapid',\n 'short',\n 'slow',\n 'swift',\n 'young',\n 'abundant',\n 'empty',\n 'few',\n 'heavy',\n 'light',\n 'many',\n 'numerous',\n 'Sound',\n 'cooing',\n 'deafening',\n 'faint',\n 'harsh',\n 'hissing',\n 'hushed',\n 'husky',\n 'loud',\n 'melodic',\n 'moaning',\n 'mute',\n 'noisy',\n 'purring',\n 'quiet',\n 'raspy',\n 'resonant',\n 'screeching',\n 'shrill',\n 'silent',\n 'soft',\n 'squealing',\n 'thundering',\n 'voiceless',\n 'whispering',\n 'bitter',\n 'delicious',\n 'fresh',\n 'juicy',\n 'ripe',\n 'rotten',\n 'salty',\n 'sour',\n 'spicy',\n 'stale',\n 'sticky',\n 'strong',\n 'sweet',\n 'tasteless',\n 'tasty',\n 'thirsty',\n 'fluttering',\n 'fuzzy',\n 'greasy',\n 'grubby',\n 'hard',\n 'hot',\n 'icy',\n 'loose',\n 'melted',\n 'plastic',\n 'prickly',\n 'rainy',\n 'rough',\n 'scattered',\n 'shaggy',\n 'shaky',\n 'sharp',\n 'shivering',\n 'silky',\n 'slimy',\n 'slippery',\n 'smooth',\n 'soft',\n 'solid',\n 'steady',\n 'sticky',\n 'tender',\n 'tight',\n 'uneven',\n 'weak',\n 'wet',\n 'wooden',\n 'afraid',\n 'angry',\n 'annoyed',\n 'anxious',\n 'arrogant',\n 'ashamed',\n 'awful',\n 'bad',\n 'bewildered',\n 'bored',\n 'combative',\n 'condemned',\n 'confused',\n 'creepy',\n 'cruel',\n 'dangerous',\n 'defeated',\n 'defiant',\n 'depressed',\n 'disgusted',\n 'disturbed',\n 'eerie',\n 'embarrassed',\n 'envious',\n 'evil',\n 'fierce',\n 'foolish',\n 'frantic',\n 'frightened',\n 'grieving',\n 'helpless',\n 'homeless',\n 'hungry',\n 'hurt',\n 'ill',\n 'jealous',\n 'lonely',\n 'mysterious',\n 'naughty',\n 'nervous',\n 'obnoxious',\n 'outrageous',\n 'panicky',\n 'repulsive',\n 'scary',\n 'scornful',\n 'selfish',\n 'sore',\n 'tense',\n 'terrible',\n 'thoughtless',\n 'tired',\n 'troubled',\n 'upset',\n 'uptight',\n 'weary',\n 'wicked',\n 'worried',\n 'agreeable',\n 'amused',\n 'brave',\n 'calm',\n 'charming',\n 'cheerful',\n 'comfortable',\n 'cooperative',\n 'courageous',\n 'delightful',\n 'determined',\n 'eager',\n 'elated',\n 'enchanting',\n 'encouraging',\n 'energetic',\n 'enthusiastic',\n 'excited',\n 'exuberant',\n 'fair',\n 'faithful',\n 'fantastic',\n 'fine',\n 'friendly',\n 'funny',\n 'gentle',\n 'glorious',\n 'good',\n 'happy',\n 'healthy',\n 'helpful',\n 'hilarious',\n 'jolly',\n 'joyous',\n 'kind',\n 'lively',\n 'lovely',\n 'lucky',\n 'obedient',\n 'perfect',\n 'pleasant',\n 'proud',\n 'relieved',\n 'silly',\n 'smiling',\n 'splendid',\n 'successful',\n 'thoughtful',\n 'victorious',\n 'vivacious',\n 'witty',\n 'wonderful',\n 'zealous',\n 'zany',\n 'other',\n 'good',\n 'new',\n 'old',\n 'great',\n 'high',\n 'small',\n 'different',\n 'large',\n 'local',\n 'social',\n 'important',\n 'long',\n 'young',\n 'national',\n 'british',\n 'right',\n 'early',\n 'possible',\n 'big',\n 'little',\n 'political',\n 'able',\n 'late',\n 'general',\n 'full',\n 'far',\n 'low',\n 'public',\n 'available',\n 'bad',\n 'main',\n 'sure',\n 'clear',\n 'major',\n 'economic',\n 'only',\n 'likely',\n 'real',\n 'black',\n 'particular',\n 'international',\n 'special',\n 'difficult',\n 'certain',\n 'open',\n 'whole',\n 'white',\n 'free',\n 'short',\n 'easy',\n 'strong',\n 'european',\n 'central',\n 'similar',\n 'human',\n 'common',\n 'necessary',\n 'single',\n 'personal',\n 'hard',\n 'private',\n 'poor',\n 'financial',\n 'wide',\n 'foreign',\n 'simple',\n 'recent',\n 'concerned',\n 'american',\n 'various',\n 'close',\n 'fine',\n 'english',\n 'wrong',\n 'present',\n 'royal',\n 'natural',\n 'individual',\n 'nice',\n 'french',\n 'nihilist',\n 'solipsist',\n 'materialist',\n 'surrealist',\n 'heroic',\n 'awesome',\n 'hedonist',\n 'absurd',\n 'current',\n 'modern',\n 'labour',\n 'legal',\n 'happy',\n 'final',\n 'red',\n 'normal',\n 'serious',\n 'previous',\n 'total',\n 'prime',\n 'significant',\n 'industrial',\n 'sorry',\n 'dead',\n 'specific',\n 'appropriate',\n 'top',\n 'soviet',\n 'basic',\n 'military',\n 'original',\n 'successful',\n 'aware',\n 'hon',\n 'popular',\n 'heavy',\n 'professional',\n 'direct',\n 'dark',\n 'cold',\n 'ready',\n 'green',\n 'useful',\n 'effective',\n 'western',\n 'traditional',\n 'scottish',\n 'german',\n 'independent',\n 'deep',\n 'interesting',\n 'considerable',\n 'involved',\n 'physical',\n 'hot',\n 'existing',\n 'responsible',\n 'complete',\n 'medical',\n 'blue',\n 'extra',\n 'past',\n 'male',\n 'interested',\n 'fair',\n 'essential',\n 'beautiful',\n 'civil',\n 'primary',\n 'obvious',\n 'future',\n 'environmental',\n 'positive',\n 'senior',\n 'nuclear',\n 'annual',\n 'relevant',\n 'huge',\n 'rich',\n 'commercial',\n 'safe',\n 'regional',\n 'practical',\n 'official',\n 'separate',\n 'key',\n 'chief',\n 'regular',\n 'due',\n 'additional',\n 'active',\n 'powerful',\n 'complex',\n 'standard',\n 'impossible',\n 'light',\n 'warm',\n 'middle',\n 'fresh',\n 'sexual',\n 'front',\n 'domestic',\n 'actual',\n 'united',\n 'technical',\n 'ordinary',\n 'cheap',\n 'strange',\n 'internal',\n 'excellent',\n 'quiet',\n 'soft',\n 'potential',\n 'northern',\n 'religious',\n 'quick',\n 'very',\n 'famous',\n 'cultural',\n 'proper',\n 'broad',\n 'joint',\n 'formal',\n 'limited',\n 'conservative',\n 'lovely',\n 'usual',\n 'ltd',\n 'unable',\n 'rural',\n 'initial',\n 'substantial',\n 'bright',\n 'average',\n 'leading',\n 'reasonable',\n 'immediate',\n 'suitable',\n 'equal',\n 'detailed',\n 'working',\n 'overall',\n 'female',\n 'afraid',\n 'democratic',\n 'growing',\n 'sufficient',\n 'scientific',\n 'eastern',\n 'correct',\n 'inc',\n 'irish',\n 'expensive',\n 'educational',\n 'mental',\n 'dangerous',\n 'critical',\n 'increased',\n 'familiar',\n 'unlikely',\n 'double',\n 'perfect',\n 'slow',\n 'tiny',\n 'dry',\n 'historical',\n 'thin',\n 'daily',\n 'southern',\n 'increasing',\n 'wild',\n 'alone',\n 'urban',\n 'empty',\n 'married',\n 'narrow',\n 'liberal',\n 'supposed',\n 'upper',\n 'apparent',\n 'tall',\n 'busy',\n 'bloody',\n 'prepared',\n 'russian',\n 'moral',\n 'careful',\n 'clean',\n 'attractive',\n 'japanese',\n 'vital',\n 'thick',\n 'alternative',\n 'fast',\n 'ancient',\n 'elderly',\n 'rare',\n 'external',\n 'capable',\n 'brief',\n 'wonderful',\n 'grand',\n 'typical',\n 'entire',\n 'grey',\n 'constant',\n 'vast',\n 'surprised',\n 'ideal',\n 'terrible',\n 'academic',\n 'funny',\n 'minor',\n 'pleased',\n 'severe',\n 'ill',\n 'corporate',\n 'negative',\n 'permanent',\n 'weak',\n 'brown',\n 'fundamental',\n 'odd',\n 'crucial',\n 'inner',\n 'used',\n 'criminal',\n 'contemporary',\n 'sharp',\n 'sick',\n 'near',\n 'roman',\n 'massive',\n 'unique',\n 'secondary',\n 'parliamentary',\n 'african',\n 'unknown',\n 'subsequent',\n 'angry',\n 'alive',\n 'guilty',\n 'lucky',\n 'enormous',\n 'well',\n 'yellow',\n 'unusual',\n 'net',\n 'tough',\n 'dear',\n 'extensive',\n 'glad',\n 'remaining',\n 'agricultural',\n 'alright',\n 'healthy',\n 'italian',\n 'principal',\n 'tired',\n 'efficient',\n 'comfortable',\n 'chinese',\n 'relative',\n 'friendly',\n 'conventional',\n 'willing',\n 'sudden',\n 'proposed',\n 'voluntary',\n 'slight',\n 'valuable',\n 'dramatic',\n 'golden',\n 'temporary',\n 'federal',\n 'keen',\n 'flat',\n 'silent',\n 'indian',\n 'worried',\n 'pale',\n 'statutory',\n 'welsh',\n 'dependent',\n 'firm',\n 'wet',\n 'competitive',\n 'armed',\n 'radical',\n 'outside',\n 'acceptable',\n 'sensitive',\n 'living',\n 'pure',\n 'global',\n 'emotional',\n 'sad',\n 'secret',\n 'rapid',\n 'adequate',\n 'fixed',\n 'sweet',\n 'administrative',\n 'wooden',\n 'remarkable',\n 'comprehensive',\n 'surprising',\n 'solid',\n 'rough',\n 'mere',\n 'mass',\n 'brilliant',\n 'maximum',\n 'absolute',\n 'electronic',\n 'visual',\n 'electric',\n 'cool',\n 'spanish',\n 'literary',\n 'continuing',\n 'supreme',\n 'chemical',\n 'genuine',\n 'exciting',\n 'written',\n 'advanced',\n 'extreme',\n 'classical',\n 'fit',\n 'favourite',\n 'widespread',\n 'confident',\n 'straight',\n 'proud',\n 'numerous',\n 'opposite',\n 'distinct',\n 'mad',\n 'helpful',\n 'given',\n 'disabled',\n 'consistent',\n 'anxious',\n 'nervous',\n 'awful',\n 'stable',\n 'constitutional',\n 'satisfied',\n 'conscious',\n 'developing',\n 'strategic',\n 'holy',\n 'smooth',\n 'dominant',\n 'remote',\n 'theoretical',\n 'outstanding',\n 'pink',\n 'pretty',\n 'clinical',\n 'minimum',\n 'honest',\n 'impressive',\n 'related',\n 'residential',\n 'extraordinary',\n 'plain',\n 'visible',\n 'accurate',\n 'distant',\n 'still',\n 'greek',\n 'complicated',\n 'musical',\n 'precise',\n 'gentle',\n 'broken',\n 'live',\n 'silly',\n 'fat',\n 'tight',\n 'monetary',\n 'round',\n 'psychological',\n 'violent',\n 'unemployed',\n 'inevitable',\n 'junior',\n 'sensible',\n 'grateful',\n 'pleasant',\n 'dirty',\n 'structural',\n 'welcome',\n 'deaf',\n 'above',\n 'continuous',\n 'blind',\n 'overseas',\n 'mean',\n 'entitled',\n 'delighted',\n 'loose',\n 'occasional',\n 'evident',\n 'desperate',\n 'fellow',\n 'universal',\n 'square',\n 'steady',\n 'classic',\n 'equivalent',\n 'intellectual',\n 'victorian',\n 'level',\n 'ultimate',\n 'creative',\n 'lost',\n 'medieval',\n 'clever',\n 'linguistic',\n 'convinced',\n 'judicial',\n 'raw',\n 'sophisticated',\n 'asleep',\n 'vulnerable',\n 'illegal',\n 'outer',\n 'revolutionary',\n 'bitter',\n 'changing',\n 'australian',\n 'native',\n 'imperial',\n 'strict',\n 'wise',\n 'informal',\n 'flexible',\n 'collective',\n 'frequent',\n 'experimental',\n 'spiritual',\n 'intense',\n 'rational',\n 'generous',\n 'inadequate',\n 'prominent',\n 'logical',\n 'bare',\n 'historic',\n 'modest',\n 'dutch',\n 'acute',\n 'electrical',\n 'valid',\n 'weekly',\n 'gross',\n 'automatic',\n 'loud',\n 'reliable',\n 'mutual',\n 'liable',\n 'multiple',\n 'ruling',\n 'curious',\n 'sole',\n 'managing',\n 'pregnant',\n 'latin',\n 'nearby',\n 'exact',\n 'underlying',\n 'identical',\n 'satisfactory',\n 'marginal',\n 'distinctive',\n 'electoral',\n 'urgent',\n 'presidential',\n 'controversial',\n 'everyday',\n 'encouraging',\n 'organic',\n 'continued',\n 'expected',\n 'statistical',\n 'desirable',\n 'innocent',\n 'improved',\n 'exclusive',\n 'marked',\n 'experienced',\n 'unexpected',\n 'superb',\n 'sheer',\n 'disappointed',\n 'frightened',\n 'gastric',\n 'romantic',\n 'naked',\n 'reluctant',\n 'magnificent',\n 'convenient',\n 'established',\n 'closed',\n 'uncertain',\n 'artificial',\n 'diplomatic',\n 'tremendous',\n 'marine',\n 'mechanical',\n 'retail',\n 'institutional',\n 'mixed',\n 'required',\n 'biological',\n 'known',\n 'functional',\n 'straightforward',\n 'superior',\n 'digital',\n 'spectacular',\n 'unhappy',\n 'confused',\n 'unfair',\n 'aggressive',\n 'spare',\n 'painful',\n 'abstract',\n 'asian',\n 'associated',\n 'legislative',\n 'monthly',\n 'intelligent',\n 'hungry',\n 'explicit',\n 'nasty',\n 'just',\n 'faint',\n 'coloured',\n 'ridiculous',\n 'amazing',\n 'comparable',\n 'successive',\n 'realistic',\n 'back',\n 'decent',\n 'decentralized',\n 'bitcoin',\n 'cypherpunk',\n 'unnecessary',\n 'flying',\n 'random',\n 'influential',\n 'dull',\n 'genetic',\n 'neat',\n 'marvellous',\n 'crazy',\n 'damp',\n 'giant',\n 'secure',\n 'bottom',\n 'skilled',\n 'subtle',\n 'elegant',\n 'brave',\n 'lesser',\n 'parallel',\n 'steep',\n 'intensive',\n 'casual',\n 'tropical',\n 'lonely',\n 'partial',\n 'preliminary',\n 'concrete',\n 'alleged',\n 'assistant',\n 'vertical',\n 'upset',\n 'delicate',\n 'mild',\n 'occupational',\n 'excessive',\n 'progressive',\n 'exceptional',\n 'integrated',\n 'striking',\n 'continental',\n 'okay',\n 'harsh',\n 'combined',\n 'fierce',\n 'handsome',\n 'characteristic',\n 'chronic',\n 'compulsory',\n 'interim',\n 'objective',\n 'splendid',\n 'magic',\n 'systematic',\n 'obliged',\n 'payable',\n 'fun',\n 'horrible',\n 'primitive',\n 'fascinating',\n 'ideological',\n 'metropolitan',\n 'surrounding',\n 'estimated',\n 'peaceful',\n 'premier',\n 'operational',\n 'technological',\n 'kind',\n 'advisory',\n 'hostile',\n 'precious',\n 'accessible',\n 'determined',\n 'excited',\n 'impressed',\n 'provincial',\n 'smart',\n 'endless',\n 'isolated',\n 'drunk',\n 'geographical',\n 'like',\n 'dynamic',\n 'boring',\n 'forthcoming',\n 'unfortunate',\n 'definite',\n 'super',\n 'notable',\n 'indirect',\n 'stiff',\n 'wealthy',\n 'awkward',\n 'lively',\n 'neutral',\n 'artistic',\n 'content',\n 'mature',\n 'colonial',\n 'ambitious',\n 'evil',\n 'magnetic',\n 'verbal',\n 'legitimate',\n 'sympathetic',\n 'empirical',\n 'head',\n 'shallow',\n 'vague',\n 'naval',\n 'depressed',\n 'shared',\n 'added',\n 'shocked',\n 'mid',\n 'worthwhile',\n 'qualified',\n 'missing',\n 'blank',\n 'absent',\n 'favourable',\n 'polish',\n 'israeli',\n 'developed',\n 'profound',\n 'representative',\n 'enthusiastic',\n 'dreadful',\n 'rigid',\n 'reduced',\n 'cruel',\n 'coastal',\n 'peculiar',\n 'swiss',\n 'crude',\n 'extended',\n 'selected',\n 'eager',\n 'canadian',\n 'bold',\n 'relaxed',\n 'corresponding',\n 'running',\n 'planned',\n 'applicable',\n 'immense',\n 'allied',\n 'comparative',\n 'uncomfortable',\n 'conservation',\n 'productive',\n 'beneficial',\n 'bored',\n 'charming',\n 'minimal',\n 'mobile',\n 'turkish',\n 'orange',\n 'rear',\n 'passive',\n 'suspicious',\n 'overwhelming',\n 'fatal',\n 'resulting',\n 'symbolic',\n 'registered',\n 'neighbouring',\n 'calm',\n 'irrelevant',\n 'patient',\n 'compact',\n 'profitable',\n 'rival',\n 'loyal',\n 'moderate',\n 'distinguished',\n 'interior',\n 'noble',\n 'insufficient',\n 'eligible',\n 'mysterious',\n 'varying',\n 'managerial',\n 'molecular',\n 'olympic',\n 'linear',\n 'prospective',\n 'printed',\n 'parental',\n 'diverse',\n 'elaborate',\n 'furious',\n 'fiscal',\n 'burning',\n 'useless',\n 'semantic',\n 'embarrassed',\n 'inherent',\n 'philosophical',\n 'deliberate',\n 'awake',\n 'variable',\n 'promising',\n 'unpleasant',\n 'varied',\n 'sacred',\n 'selective',\n 'inclined',\n 'tender',\n 'hidden',\n 'worthy',\n 'intermediate',\n 'sound',\n 'protective',\n 'fortunate',\n 'slim',\n 'defensive',\n 'divine',\n 'stuck',\n 'driving',\n 'invisible',\n 'misleading',\n 'circular',\n 'mathematical',\n 'inappropriate',\n 'liquid',\n 'persistent',\n 'solar',\n 'doubtful',\n 'manual',\n 'architectural',\n 'intact',\n 'incredible',\n 'devoted',\n 'prior',\n 'tragic',\n 'respectable',\n 'optimistic',\n 'convincing',\n 'unacceptable',\n 'decisive',\n 'competent',\n 'spatial',\n 'respective',\n 'binding',\n 'relieved',\n 'nursing',\n 'toxic',\n 'select',\n 'redundant',\n 'integral',\n 'then',\n 'probable',\n 'amateur',\n 'fond',\n 'passing',\n 'specified',\n 'territorial',\n 'horizontal',\n 'inland',\n 'cognitive',\n 'regulatory',\n 'miserable',\n 'resident',\n 'polite',\n 'scared',\n 'gothic',\n 'civilian',\n 'instant',\n 'lengthy',\n 'adverse',\n 'korean',\n 'unconscious',\n 'anonymous',\n 'aesthetic',\n 'orthodox',\n 'static',\n 'unaware',\n 'costly',\n 'fantastic',\n 'foolish',\n 'fashionable',\n 'causal',\n 'compatible',\n 'wee',\n 'implicit',\n 'dual',\n 'ok',\n 'cheerful',\n 'subjective',\n 'forward',\n 'surviving',\n 'exotic',\n 'purple',\n 'cautious',\n 'visiting',\n 'aggregate',\n 'ethical',\n 'teenage',\n 'dying',\n 'disastrous',\n 'delicious',\n 'confidential',\n 'underground',\n 'thorough',\n 'grim',\n 'autonomous',\n 'atomic',\n 'frozen',\n 'colourful',\n 'injured',\n 'uniform',\n 'ashamed',\n 'glorious',\n 'wicked',\n 'coherent',\n 'rising',\n 'shy',\n 'novel',\n 'balanced',\n 'delightful',\n 'arbitrary',\n 'adjacent',\n 'worrying',\n 'weird',\n 'unchanged',\n 'rolling',\n 'evolutionary',\n 'intimate',\n 'sporting',\n 'disciplinary',\n 'formidable',\n 'lexical',\n 'noisy',\n 'gradual',\n 'accused',\n 'homeless',\n 'supporting',\n 'coming',\n 'renewed',\n 'excess',\n 'retired',\n 'rubber',\n 'chosen',\n 'outdoor',\n 'embarrassing',\n 'preferred',\n 'bizarre',\n 'appalling',\n 'agreed',\n 'imaginative',\n 'governing',\n 'accepted',\n 'vocational',\n 'mighty',\n 'puzzled',\n 'worldwide',\n 'organisational',\n 'sunny',\n 'eldest',\n 'eventual',\n 'spontaneous',\n 'vivid',\n 'rude',\n 'faithful',\n 'ministerial',\n 'innovative',\n 'controlled',\n 'conceptual',\n 'unwilling',\n 'civic',\n 'meaningful',\n 'alive',\n 'brainy',\n 'breakable',\n 'busy',\n 'careful',\n 'cautious',\n 'clever',\n 'concerned',\n 'crazy',\n 'curious',\n 'dead',\n 'different',\n 'difficult',\n 'doubtful',\n 'easy',\n 'famous',\n 'fragile',\n 'helpful',\n 'helpless',\n 'important',\n 'impossible',\n 'innocent',\n 'inquisitive',\n 'modern',\n 'open',\n 'outstanding',\n 'poor',\n 'powerful',\n 'puzzled',\n 'real',\n 'rich',\n 'shy',\n 'sleepy',\n 'super',\n 'tame',\n 'uninterested',\n 'wandering',\n 'wild',\n 'wrong',\n 'adorable',\n 'alert',\n 'average',\n 'beautiful',\n 'blonde',\n 'bloody',\n 'blushing',\n 'bright',\n 'clean',\n 'clear',\n 'cloudy',\n 'colorful',\n 'crowded',\n 'cute',\n 'dark',\n 'drab',\n 'distinct',\n 'dull',\n 'elegant',\n 'fancy',\n 'filthy',\n 'glamorous',\n 'gleaming',\n 'graceful',\n 'grotesque',\n 'homely',\n 'light',\n 'misty',\n 'motionless',\n 'muddy',\n 'plain',\n 'poised',\n 'quaint',\n 'shiny',\n 'smoggy',\n 'sparkling',\n 'spotless',\n 'stormy',\n 'strange',\n 'ugly',\n 'unsightly',\n 'unusual',\n 'bad',\n 'better',\n 'beautiful',\n 'big',\n 'black',\n 'blue',\n 'bright',\n 'clumsy',\n 'crazy',\n 'dizzy',\n 'dull',\n 'fat',\n 'frail',\n 'friendly',\n 'funny',\n 'great',\n 'green',\n 'gigantic',\n 'gorgeous',\n 'grumpy',\n 'handsome',\n 'happy',\n 'horrible',\n 'itchy',\n 'jittery',\n 'jolly',\n 'kind',\n 'long',\n 'lazy',\n 'magnificent',\n 'magenta',\n 'many',\n 'mighty',\n 'mushy',\n 'nasty',\n 'new',\n 'nice',\n 'nosy',\n 'nutty',\n 'nutritious',\n 'odd',\n 'orange',\n 'ordinary',\n 'pretty',\n 'precious',\n 'prickly',\n 'purple',\n 'quaint',\n 'quiet',\n 'quick',\n 'quickest',\n 'rainy',\n 'rare',\n 'ratty',\n 'red',\n 'roasted',\n 'robust',\n 'round',\n 'sad',\n 'scary',\n 'scrawny',\n 'short',\n 'silly',\n 'stingy',\n 'strange',\n 'striped',\n 'spotty',\n 'tart',\n 'tall',\n 'tame',\n 'tan',\n 'tender',\n 'testy',\n 'tricky',\n 'tough',\n 'ugly',\n 'ugliest',\n 'vast',\n 'watery',\n 'wasteful',\n 'wonderful',\n 'yellow',\n 'yummy',\n 'zany',\n];\n\nexport default {\n gunOnceDefined,\n async getHash (data: any, format = `base64`) {\n if (data === undefined) {\n throw new Error('getHash data was undefined');\n }\n if (typeof data !== 'string') {\n data = JSON.stringify(data);\n }\n\n const encoder = new TextEncoder();\n data = encoder.encode(data);\n const buffer = await crypto.subtle.digest('SHA-256', data);\n\n if (format === 'buffer') {\n return buffer;\n }\n\n const hash = this.arrayBufferToBase64(buffer);\n if (format === `hex`) {\n return this.base64ToHex(hash);\n }\n return hash;\n },\n\n capitalize(s: string) {\n return s.charAt(0).toUpperCase() + s.slice(1)\n },\n\n generateName() {\n return `${this.capitalize(_.sample(adjectives)!)} ${this.capitalize(_.sample(animals)!)}`;\n },\n\n base64ToHex(str: string) {\n const raw = atob(str);\n let result = '';\n for (let i = 0; i < raw.length; i++) {\n const hex = raw.charCodeAt(i).toString(16);\n result += (hex.length === 2 ? hex : `0${ hex}`);\n }\n return result;\n },\n\n arrayBufferToBase64( buffer ) {\n var binary = '';\n var bytes = new Uint8Array( buffer );\n var len = bytes.byteLength;\n for (var i = 0; i < len; i++) {\n binary += String.fromCharCode( bytes[ i ] );\n }\n return window.btoa( binary );\n },\n\n getCaret(el: HTMLInputElement) {\n if (el.selectionStart) {\n return el.selectionStart;\n } else { // @ts-ignore\n if (document.selection) {\n el.focus();\n // @ts-ignore\n const r = document.selection.createRange();\n if (r === null) {\n return 0;\n }\n // @ts-ignore\n const re = el.createTextRange(), rc = re.duplicate();\n re.moveToBookmark(r.getBookmark());\n rc.setEndPoint('EndToStart', re);\n return rc.text.length;\n }\n }\n return 0;\n },\n\n getUrlParameter(sParam: string, sParams: string) {\n const sPageURL = sParams || window.location.search.substring(1);\n const sURLVariables = sPageURL.split('&');\n let sParameterName, i;\n\n for (i = 0; i < sURLVariables.length; i++) {\n sParameterName = sURLVariables[i].split('=');\n if (sParameterName[0] === sParam) {\n return sParameterName[1] === undefined ? true : decodeURIComponent(sParameterName[1]);\n }\n }\n return;\n },\n\n formatTime(date: Date) {\n // @ts-ignore\n const t: any = date.toLocaleTimeString(undefined, {timeStyle: 'short'});\n const s = t.split(':');\n if (s.length === 3) { // safari tries to display seconds\n return `${s[0] }:${ s[1] }${s[2].slice(2)}`;\n }\n return t;\n },\n\n formatDate(date: Date) {\n const t = date.toLocaleString(undefined, {dateStyle: 'short', timeStyle: 'short'});\n const s = t.split(':');\n if (s.length === 3) { // safari tries to display seconds\n return `${s[0] }:${ s[1] }${s[2].slice(2)}`;\n }\n return t;\n },\n\n getDaySeparatorText(date: Date, dateStr: string, now?: Date, nowStr?: string) {\n if (!now) {\n now = new Date();\n // @ts-ignore\n nowStr = now.toLocaleDateString({dateStyle: 'short'});\n }\n if (dateStr === nowStr) {\n return 'today';\n }\n const dayDifference = Math.round((now - date) / (1000 * 60 * 60 * 24));\n if (dayDifference === 0) {\n return 'today';\n }\n if (dayDifference === 1) {\n return 'yesterday';\n }\n if (dayDifference <= 5) {\n return date.toLocaleDateString(undefined, {weekday: 'long'});\n }\n return dateStr;\n },\n\n getProfileLink(pub: string) {\n return `${window.location.origin}/#/profile/${encodeURIComponent(pub)}`;\n },\n\n truncateString(s: string, length = 30) {\n return s.length > length ? `${s.slice(0, length)}...` : s;\n },\n\n createElement(type: string, cls?: string, parent?: HTMLElement) {\n const el = document.createElement(type);\n if (cls) {\n el.setAttribute('class', cls);\n }\n if (parent) {\n parent.appendChild(el);\n }\n return el;\n },\n\n isNode,\n isElectron,\n isMobile,\n\n throttle: (func: Function, limit: number) => {\n let inThrottle: boolean;\n return function() {\n const args = arguments;\n const context = this;\n if (!inThrottle) {\n func.apply(context, args);\n inThrottle = true;\n setTimeout(() => inThrottle = false, limit);\n }\n };\n },\n debounce: (func: Function, delay: number) => {\n let inDebounce: boolean;\n return function() {\n const context = this;\n const args = arguments;\n clearTimeout(inDebounce);\n inDebounce = setTimeout(() => func.apply(context, args), delay);\n };\n },\n sample: (arr: any[]) => arr[Math.floor(Math.random() * arr.length)],\n sampleSize: (arr: any[], size: number) => {\n const shuffled = arr.slice(0);\n let i = arr.length;\n let min = i - size;\n let temp;\n let index;\n while (i-- > min) {\n index = Math.floor((i + 1) * Math.random());\n temp = shuffled[index];\n shuffled[index] = shuffled[i];\n shuffled[i] = temp;\n }\n return shuffled.slice(min);\n },\n defer: (func: Function) => setTimeout(func, 0),\n once: (func: Function) => {\n let called = false;\n return function() {\n if (called) {\n return;\n }\n called = true;\n func.apply(this, arguments);\n };\n },\n omit: (obj: any, keys: string[]) => {\n const newObj = {};\n Object.keys(obj).forEach(key => {\n if (!keys.includes(key)) {\n newObj[key] = obj[key];\n }\n });\n return newObj;\n }\n};\n","/*eslint no-useless-escape: \"off\", camelcase: \"off\" */\n\nimport util from './util';\n// eslint-disable-line no-unused-vars\n\nlet myKey: any;\n\nexport default {\n async getActiveKey(datadir = `.`, keyfile = `iris.key`, fs?: any) {\n if (myKey) {\n return myKey;\n }\n if (fs) {\n const privKeyFile = `${datadir}/${keyfile}`;\n if (fs.existsSync(privKeyFile)) {\n const f = fs.readFileSync(privKeyFile, `utf8`);\n myKey = this.fromString(f);\n } else {\n const newKey = await this.generate();\n myKey = myKey || newKey; // eslint-disable-line require-atomic-updates\n fs.writeFileSync(privKeyFile, this.toString(myKey));\n fs.chmodSync(privKeyFile, 400);\n }\n if (!myKey) {\n throw new Error(`loading default key failed - check ${datadir}/${keyfile}`);\n }\n } else {\n const str = window.localStorage.getItem(`iris.myKey`);\n if (str) {\n myKey = this.fromString(str);\n } else {\n const newKey = await this.generate();\n myKey = myKey || newKey; // eslint-disable-line require-atomic-updates\n window.localStorage.setItem(`iris.myKey`, this.toString(myKey));\n }\n if (!myKey) {\n throw new Error(`loading default key failed - check localStorage iris.myKey`);\n }\n }\n return myKey;\n },\n\n getDefault(datadir = `.`, keyfile = `iris.key`) {\n return this.getActiveKey(datadir, keyfile);\n },\n\n async getActivePub(datadir = `.`, keyfile = `iris.key`) {\n const key = await this.getActiveKey(datadir, keyfile);\n return key.pub;\n },\n\n setActiveKey(key: any, save = true, datadir = `.`, keyfile = `iris.key`, fs: any) {\n myKey = key;\n if (!save) return;\n if (util.isNode) {\n const privKeyFile = `${datadir}/${keyfile}`;\n fs.writeFileSync(privKeyFile, this.toString(myKey));\n fs.chmodSync(privKeyFile, 400);\n } else {\n window.localStorage.setItem(`iris.myKey`, this.toString(myKey));\n }\n },\n\n toString(key: any) {\n return JSON.stringify(key);\n },\n\n getId(key: any) {\n if (!(key && key.pub)) {\n throw new Error(`missing param`);\n }\n return key.pub; // hack until GUN supports lookups by keyID\n //return util.getHash(key.pub);\n },\n\n fromString(str: string) {\n return JSON.parse(str);\n },\n\n // copied from Gun.SEA\n async generate() {\n try {\n var ecdhSubtle = window.crypto.subtle;\n // First: ECDSA keys for signing/verifying...\n var sa = await ecdhSubtle.generateKey({name: 'ECDSA', namedCurve: 'P-256'}, true, ['sign', 'verify'])\n .then(async (keys) => {\n // privateKey scope doesn't leak out from here!\n //const { d: priv } = await shim.subtle.exportKey('jwk', keys.privateKey)\n var key: any = {};\n key.priv = (await ecdhSubtle.exportKey('jwk', keys.privateKey)).d;\n var pub = await ecdhSubtle.exportKey('jwk', keys.publicKey);\n //const pub = Buff.from([ x, y ].join(':')).toString('base64') // old\n key.pub = pub.x + '.' + pub.y; // new\n // x and y are already base64\n // pub is UTF8 but filename/URL safe (https://www.ietf.org/rfc/rfc3986.txt)\n // but split on a non-base64 letter.\n return key;\n })\n\n // To include PGPv4 kind of keyId:\n // const pubId = await SEA.keyid(keys.pub)\n // Next: ECDH keys for encryption/decryption...\n\n try {\n var dh = await ecdhSubtle.generateKey({name: 'ECDH', namedCurve: 'P-256'}, true, ['deriveKey'])\n .then(async (keys) => {\n // privateKey scope doesn't leak out from here!\n var key: any = {};\n key.epriv = (await ecdhSubtle.exportKey('jwk', keys.privateKey)).d;\n var pub = await ecdhSubtle.exportKey('jwk', keys.publicKey);\n //const epub = Buff.from([ ex, ey ].join(':')).toString('base64') // old\n key.epub = pub.x + '.' + pub.y; // new\n // ex and ey are already base64\n // epub is UTF8 but filename/URL safe (https://www.ietf.org/rfc/rfc3986.txt)\n // but split on a non-base64 letter.\n return key;\n })\n } catch (e) {\n if (e == 'Error: ECDH is not a supported algorithm') {\n console.log('Ignoring ECDH...')\n } else {\n throw e\n }\n }\n dh = dh || {};\n\n var r = {pub: sa.pub, priv: sa.priv, /* pubId, */ epub: dh.epub, epriv: dh.epriv}\n return r;\n } catch (e) {\n console.log(e);\n throw e;\n return;\n }\n },\n\n keyToJwk(key: any): JsonWebKey {\n if (typeof key === 'string') {\n key = { pub: key };\n }\n const jwk: JsonWebKey = {\n kty: 'EC',\n crv: 'P-256',\n x: key.pub.split('.')[0],\n y: key.pub.split('.')[1],\n ext: true,\n };\n jwk.key_ops = key.priv ? ['sign'] : ['verify'];\n if (key.priv) {\n jwk.d = key.priv\n }\n return jwk;\n },\n\n async sign(data: any, pair: any, cb?: Function, opt: any = {}) {\n if(undefined === data){ throw '`undefined` not allowed.' }\n const text = typeof data === 'string' ? data : JSON.stringify(data); // Gun.SEA doesn't preserve data type: \"0\" -> 0. Should we change this?\n var jwk = this.keyToJwk(pair);\n var hash = await util.getHash(text, 'buffer') as Buffer;\n var sig = await window.crypto.subtle.importKey('jwk', jwk, {name: 'ECDSA', namedCurve: 'P-256'}, false, ['sign'])\n .then((key) =>\n window.crypto.subtle.sign({name: 'ECDSA', hash: {name: 'SHA-256'}}, key, hash)\n ) // privateKey scope doesn't leak out from here!\n var r: any = {m: text, s: Buffer.from(sig).toString(opt.encode || 'base64')}\n if(!opt.raw){ r = 'aSEA' + JSON.stringify(r) } // \"aSEA\" was a dumb fix for an earlier bug in Gun.SEA\n\n if(cb){ try{ cb(r) }catch(e){console.log(e)} }\n return r;\n },\n\n async verify(data: any, pair: any, cb?: Function, opt: any = {}) {\n try {\n if (typeof data === 'string') {\n if (data.slice(0, 4) === 'aSEA') {\n data = data.slice(4)\n }\n try {\n data = JSON.parse(data);\n } catch (e) {\n // not JSON\n }\n }\n var pub = pair.pub || pair;\n var jwk = this.keyToJwk(pub);\n var key = await crypto.subtle.importKey('jwk', jwk, {name: 'ECDSA', namedCurve: 'P-256'}, false, ['verify']);\n\n let text = data.m;\n try {\n text = JSON.parse(text);\n } catch (e) {\n // ignore\n }\n\n let hash = await util.getHash(text, 'buffer') as Buffer;\n var buf, sig, isValid;\n buf = Buffer.from(data.s, opt.encode || 'base64');\n sig = new Uint8Array(buf);\n isValid = await crypto.subtle.verify({name: 'ECDSA', hash: {name: 'SHA-256'}}, key, sig, hash);\n var r = isValid? JSON.parse(text) : undefined;\n if (r === undefined) {\n //console.log('invalid', data, pair, hash);\n }\n\n if(cb){ try{ cb(r) }catch(e){console.log(e)} }\n return r;\n } catch (e) {\n console.log(e);\n return undefined;\n }\n },\n\n async secret(key: any, pair: any) {\n var keysToEcdhJwk = (pub: any, d?: any): any => { // d === priv\n //var [ x, y ] = shim.Buffer.from(pub, 'base64').toString('utf8').split(':') // old\n var [ x, y ] = pub.split('.') // new\n const jwk: JsonWebKey = Object.assign(\n d ? { d } : {},\n { x: x, y: y, kty: 'EC', crv: 'P-256', ext: true }\n );\n return jwk;\n }\n\n var pub = key.epub || key;\n var epub = pair.epub;\n var epriv = pair.epriv;\n var pubJwk = keysToEcdhJwk(pub);\n var props = Object.assign({\n public: await crypto.subtle.importKey('jwk', pubJwk, {name: 'ECDH', namedCurve: 'P-256'}, true, [])\n },{name: 'ECDH', namedCurve: 'P-256'});\n var privJwk = keysToEcdhJwk(epub, epriv);\n return crypto.subtle.importKey('jwk', privJwk, {name: 'ECDH', namedCurve: 'P-256'}, false, ['deriveBits'])\n .then(async (privKey) => {\n var derivedBits = await crypto.subtle.deriveBits(props, privKey, 256);\n var rawBits = new Uint8Array(derivedBits);\n var derivedKey = await crypto.subtle.importKey('raw', rawBits,{ name: 'AES-GCM', length: 256 }, true, [ 'encrypt', 'decrypt' ]);\n return crypto.subtle.exportKey('jwk', derivedKey).then(({ k }) => k);\n });\n },\n\n async aeskey(key: any, salt?: Buffer) {\n const combo = key + (salt || this.random(8)).toString('utf8'); // new\n let hash: any = await crypto.subtle.digest({name: 'SHA-256'}, new TextEncoder().encode(combo));\n hash = Buffer.from(hash, 'binary');\n\n const keyB64 = hash.toString('base64');\n const k = keyB64.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/\\=/g, '');\n\n const jwkKey = { kty: 'oct', k: k, ext: false, alg: 'A256GCM' };\n return await crypto.subtle.importKey('jwk', jwkKey, {name:'AES-GCM'}, false, ['encrypt', 'decrypt'])\n },\n\n random(len: number) {\n return Buffer.from(crypto.getRandomValues(new Uint8Array(len)));\n },\n\n async encrypt(data: any, pair: any, cb?: Function, opt: any = {}) {\n var key = pair.epriv || pair;\n if(undefined === data){ throw '`undefined` not allowed.' }\n var msg = (typeof data == 'string')? data : JSON.stringify(data); // Gun.SEA doesn't preserve data type: \"0\" -> 0. Should we change this?\n var rand = {s: this.random(9), iv: this.random(15)}; // consider making this 9 and 15 or 18 or 12 to reduce == padding.\n var ct = await this.aeskey(key, rand.s).then((aes) => crypto.subtle.encrypt({ // Keeping the AES key scope as private as possible...\n name: opt.name || 'AES-GCM', iv: new Uint8Array(rand.iv)\n }, aes, new TextEncoder().encode(msg)));\n var r: any = {\n // @ts-ignore\n ct: Buffer.from(ct, 'binary').toString(opt.encode || 'base64'),\n iv: rand.iv.toString(opt.encode || 'base64'),\n s: rand.s.toString(opt.encode || 'base64')\n }\n if(!opt.raw){ r = 'SEA' + JSON.stringify(r) }\n\n if(cb){ try{ cb(r) }catch(e){console.log(e)} }\n return r;\n },\n\n async decrypt(data: any, pair: any, cb?: Function, opt: any = {}) {\n var key = pair.epriv || pair;\n let json;\n try { data = JSON.parse(data); } catch (e) {}\n if (data.indexOf('SEA{') === 0) {\n json = JSON.parse(data.slice(3));\n } else {\n json = JSON.parse(data);\n }\n if (!json.ct || !json.iv || !json.s) {\n throw 'Invalid ciphertext ' + json;\n }\n var buf: Buffer, bufiv: Buffer, bufct: Buffer;\n buf = Buffer.from(json.s, opt.encode || 'base64');\n bufiv = Buffer.from(json.iv, opt.encode || 'base64');\n bufct = Buffer.from(json.ct, opt.encode || 'base64');\n var ct = await this.aeskey(key, buf).then((aes) => crypto.subtle.decrypt({ // Keeping aesKey scope as private as possible...\n name: opt.name || 'AES-GCM', iv: new Uint8Array(bufiv), tagLength: 128\n }, aes, new Uint8Array(bufct)));\n const text = new TextDecoder('utf8').decode(ct);\n var r = text;\n try { r = JSON.parse(text); } catch (_e) {}\n if(cb){ try{ cb(r) }catch(e){console.log(e)} }\n return r;\n }\n}","import session from './session';\nimport _ from './lodash';\nimport util from './util';\nimport publicState from './global';\nimport Key from './Key';\n\nconst ELECTRON_GUN_URL = 'http://localhost:8767/gun';\nlet maxConnectedPeers = 1;\n\ntype Peer = {\n url?: string;\n enabled?: boolean;\n from?: string;\n visibility?: string;\n}\n\ntype Peers = {\n [key: string]: Peer\n}\n\nconst DEFAULT_PEERS: Peers = {\n 'wss://gun-rs.iris.to/gun': {},\n// 'wss://gun-us.herokuapp.com/gun': {},\n};\n\nif (self.window) {\n const loc = window.location;\n const host = loc.host;\n const is_localhost_but_not_dev = host.startsWith('localhost') && host !== 'localhost:8080';\n if (loc.hostname.endsWith('herokuapp.com') || is_localhost_but_not_dev) {\n Object.keys(DEFAULT_PEERS).forEach(url => DEFAULT_PEERS[url].enabled = false);\n DEFAULT_PEERS[`${loc.origin}/gun`] = {enabled: true};\n }\n}\n\n/**\n * Networking and peer management utilities\n */\nexport default {\n known: {} as Peers,\n\n /** */\n async add(peer: Peer) {\n if (peer.from) {\n Object.keys(this.known).forEach(k => {\n if (this.known[k].from === peer.from) { // remove previous peer url from the same user\n delete this.known[k];\n }\n });\n }\n const url = peer.url || '';\n this.known[url] = this.known[url] || _.omit(peer, ['url']);\n if (peer.visibility === 'public') {\n // rolling some crypto operations to obfuscate actual url in case we want to remove it\n let secret = await Key.secret(session.getKey().epub, session.getKey()) || '';\n let encryptedUrl = await Key.encrypt(peer.url, secret);\n let encryptedUrlHash = await util.getHash(encryptedUrl);\n publicState().user().get('peers').get(encryptedUrlHash).put({url: peer.url, lastSeen: new Date().toISOString()});\n }\n if (peer.enabled !== false) {\n peer.url && this.connect(peer.url); // this calls savePeers()\n } else {\n this.save();\n }\n },\n\n /** */\n remove(url: string) {\n delete this.known[url];\n this.save();\n },\n\n /** */\n disconnect(peerFromGun: any) {\n publicState().on('bye', peerFromGun);\n peerFromGun.url = '';\n },\n\n save() {\n // TODO store them in iris.local() instead of localStorage\n localStorage.setItem('gunPeers', JSON.stringify(this.known));\n },\n\n getSaved() {\n let p: any = localStorage.getItem('gunPeers');\n if (p && p !== 'undefined') {\n p = JSON.parse(p);\n } else {\n p = DEFAULT_PEERS;\n }\n if (util.isElectron) {\n p[ELECTRON_GUN_URL] = {};\n }\n Object.keys(p).forEach(k => _.defaults(p[k], {enabled: true}));\n return p;\n },\n\n /** */\n reset() {\n localStorage.setItem('gunPeers', '');\n this.known = this.getSaved();\n },\n\n /** */\n connect(url: string) {\n if (!url) {\n return;\n }\n if (this.isMixedContent(url)) { return; }\n if (this.known[url]) {\n this.known[url].enabled = true;\n publicState().opt({peers: [url]});\n this.save();\n } else {\n this.add({url});\n }\n },\n\n /** */\n disable(url: string, peerFromGun: any) {\n this.known[url].enabled = false;\n if (peerFromGun) {\n this.disconnect(peerFromGun);\n }\n this.save();\n },\n\n isMixedContent(url: string) {\n if (!url) { return false; }\n return window.location.protocol === 'https:' && (url.indexOf('http:') === 0);\n },\n\n random() {\n const connectToLocalElectron = util.isElectron && this.known[ELECTRON_GUN_URL] && this.known[ELECTRON_GUN_URL].enabled !== false;\n const sampleSize = connectToLocalElectron ? Math.max(maxConnectedPeers - 1, 1) : maxConnectedPeers;\n const sample = _.sampleSize(\n Object.keys(\n _.pickBy(this.known, (peer: any, url: string) => {\n return !this.isMixedContent(url) && peer.enabled && !(util.isElectron && url === ELECTRON_GUN_URL);\n })\n ), sampleSize\n );\n if (sample && connectToLocalElectron) {\n sample.push(ELECTRON_GUN_URL);\n }\n console.log('sample', sample, JSON.stringify(this.known));\n return sample;\n },\n\n checkGunPeerCount() {\n return;\n let peersFromGun = publicState().back('opt.peers');\n let connectedPeers = Object.values(peersFromGun).filter((peer: any) => {\n if (peer && peer.wire && peer.wire.constructor.name !== 'WebSocket') {\n console.log('WebRTC peer', peer);\n }\n return peer && peer.wire && peer.wire.readyState === 1 && peer.wire.bufferedAmount === 0 && peer.wire.constructor.name === 'WebSocket';\n });\n if (connectedPeers.length < maxConnectedPeers) {\n let unconnectedPeers = Object.keys(this.known).filter(url => {\n let addedToGun = Object.values(peersFromGun).map((peer:any) => peer.url).indexOf(url) > -1;\n let enabled = this.known[url].enabled;\n const mixedContent = (window.location.protocol === 'https:' && (url.indexOf('http:') === 0));\n return !mixedContent && enabled && !addedToGun;\n });\n if (unconnectedPeers.length) {\n const sample = String(_.sample(unconnectedPeers));\n this.connect(sample);\n }\n }\n if (connectedPeers.length > maxConnectedPeers) {\n this.disconnect(_.sample(connectedPeers));\n }\n },\n\n init() {\n this.known = this.getSaved();\n /* use the default value of 1 for now because of memory issue\n local().get('settings').get('maxConnectedPeers').on(n => {\n if (n !== undefined) maxConnectedPeers = n;\n });\n */\n setInterval(() => this.checkGunPeerCount(), 1000);\n }\n};\n","import {Message} from './Message';\n\nexport function generateUuid() {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\n const r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8);\n return v.toString(16);\n });\n}\n\nexport class Actor {\n id: string;\n\n handle(_message: Message) {\n throw new Error('not implemented');\n }\n\n // so we can support a similar api as Channels\n postMessage(message: Message) {\n this.handle(message);\n }\n\n constructor(id = generateUuid()) {\n this.id = id;\n }\n}","import {Actor} from './Actor';\nimport {Children} from \"./Node\";\nimport Key from \"../Key\";\n\nexport class Message {\n // When Messages are sent over BroadcastChannel, class name is lost.\n static fromObject(obj: any): Message {\n if (obj.type === 'get') {\n return Get.fromObject(obj);\n } else if (obj.type === 'put') {\n return Put.fromObject(obj);\n } else {\n throw new Error('not implemented');\n }\n }\n\n static async deserialize(str: string, from: Actor): Promise {\n const obj = JSON.parse(str);\n if (obj.get) {\n return Get.deserialize(obj, str, from);\n } else if (obj.put) {\n return Put.deserialize(obj, str, from);\n } else if (obj.dam && obj.dam === \"hi\") {\n return Hi.deserialize(obj);\n } else {\n throw new Error('unknown message type');\n }\n }\n\n serialize(): string {\n throw new Error('not implemented');\n }\n}\n\nfunction generateMsgId(): string {\n return Math.random().toString(36).slice(2, 10);\n}\n\nexport class Get implements Message {\n type: string = 'get';\n id: string;\n nodeId: string;\n from: Actor;\n recipients?: string[];\n childKey?: string;\n jsonStr?: string;\n checksum?: string;\n\n serialize(): string {\n if (this.jsonStr) {\n return this.jsonStr;\n }\n\n // TODO remove \"global/\", replace /^user\\// with ~\n let nodeId = this.nodeId.replace(/^global\\//, '').replace(/^user\\//, '~');\n const obj: any = {\n \"#\": this.id,\n get: {\n \"#\": nodeId,\n \".\": this.childKey\n },\n };\n\n if (this.childKey) {\n obj.get['.'] = this.childKey;\n }\n this.jsonStr = JSON.stringify(obj);\n return this.jsonStr;\n }\n\n static async deserialize(obj: any, jsonStr: string, from: Actor): Promise {\n const id = obj['#'];\n let nodeId = obj.get['#']; // TODO add \"global/\" prefix, replace /^~/ with \"user/\"\n if (nodeId.startsWith('~')) {\n nodeId = 'user/' + nodeId.slice(1);\n }\n nodeId = 'global/' + nodeId;\n const childKey = obj.get['.'];\n return new Get(id, nodeId, from, undefined, childKey, jsonStr);\n }\n\n static fromObject(obj: any): Get {\n return new Get(obj.id, obj.nodeId, obj.from, obj.recipients, obj.childKey, obj.jsonStr, obj.checksum);\n }\n\n static new(nodeId: string, from: Actor, recipients?: string[], childKey?: string, jsonStr?: string, checksum?: string): Get {\n const id = generateMsgId();\n return new Get(id, nodeId, from, recipients, childKey, jsonStr, checksum);\n }\n\n constructor(id: string, nodeId: string, from: Actor, recipients?: string[], childKey?: string, jsonStr?: string, checksum?: string) {\n this.id = id;\n this.from = from;\n this.nodeId = nodeId;\n this.recipients = recipients;\n this.childKey = childKey;\n this.jsonStr = jsonStr;\n this.checksum = checksum;\n }\n}\n\nexport type UpdatedNodes = {\n [key: string]: Children;\n};\n\nexport class Put implements Message {\n type: string = 'put';\n id: string;\n from: Actor;\n updatedNodes: UpdatedNodes;\n inResponseTo?: string;\n recipients?: string[];\n jsonStr?: string;\n checksum?: string;\n\n serialize(): string {\n const obj = {\n \"#\" : this.id,\n \"put\": {} as any\n };\n\n // iterate over this.updatedNodes\n for (const [nodeId, children] of Object.entries(this.updatedNodes)) {\n let myNodeId = nodeId.replace(/^global\\//, '').replace(/^user\\//, '~');\n const node: any = obj.put[myNodeId] = {};\n for (const [childKey, childValue] of Object.entries(children)) {\n if (!childValue) {\n continue;\n }\n const data = childValue;\n node[childKey] = data.value;\n node[\"_\"] = node[\"_\"] || {};\n node[\"_\"][\">\"] = node[\"_\"][\">\"] || {};\n node[\"_\"][\">\"][childKey] = data.updatedAt;\n }\n }\n return JSON.stringify(obj);\n }\n\n static async deserialize(obj: any, jsonStr: string, from: Actor): Promise {\n const id = obj['#'];\n const updatedNodes: UpdatedNodes = {};\n type SerializedChildren = {\n [key: string]: any;\n }\n for (const [nodeId, c] of Object.entries(obj.put)) {\n const children = c as SerializedChildren;\n const node: any = {};\n const isUserSpace = nodeId.startsWith('~');\n for (const [childKey, childValue] of Object.entries(children)) {\n if (childKey === '_') {\n continue;\n }\n if (isUserSpace) {\n const user = nodeId.split('/')[0].slice(1);\n const signatureObj = JSON.parse(childValue);\n const timestamp = children['_']['>'][childKey];\n const value = signatureObj[':'];\n const signedObj = {\n \"#\": nodeId,\n \".\": childKey,\n \":\": value,\n \">\": timestamp\n };\n const signature = signatureObj['~'];\n const signedStr = JSON.stringify(signedObj);\n if (await Key.verify({s: signature, m: signedStr}, user) === undefined) {\n throw new Error(`invalid signature in ${nodeId} of ${signedStr}`);\n }\n }\n // TODO test hash space validity\n const updatedAt = children['_']['>'][childKey];\n node[childKey] = {\n value: childValue,\n updatedAt,\n };\n }\n const myNodeId = 'global/' + nodeId.replace(/^~/, 'user/');\n updatedNodes[myNodeId] = node;\n }\n return new Put(id, updatedNodes, from, undefined, undefined, jsonStr);\n }\n\n static fromObject(obj: any): Put {\n return new Put(obj.id, obj.updatedNodes, obj.from, obj.inResponseTo, obj.recipients, obj.jsonStr, obj.checksum);\n }\n\n static new(updatedNodes: UpdatedNodes, from: Actor, inResponseTo?: string, recipients?: string[], jsonStr?: string, checksum?: string): Put {\n const id = generateMsgId();\n return new Put(id, updatedNodes, from, inResponseTo, recipients, jsonStr, checksum);\n }\n\n static newFromKv(key: string, children: Children, from:Actor) {\n const updatedNodes: UpdatedNodes = {};\n updatedNodes[key] = children;\n return Put.new(updatedNodes, from);\n }\n\n constructor(id: string, updatedNodes: UpdatedNodes, from: Actor, inResponseTo?: string, recipients?: string[], jsonStr?: string, checksum?: string) {\n this.id = id;\n this.from = from;\n this.updatedNodes = updatedNodes;\n this.inResponseTo = inResponseTo;\n this.recipients = recipients;\n this.jsonStr = jsonStr;\n this.checksum = checksum;\n }\n}\n\nexport class Hi implements Message {\n type: string = 'hi';\n peerId: string;\n jsonStr?: string;\n\n //{\"#\":\"aHHO9Srurq9nh6Q9\",\"dam\":\"hi\"}\n\n\n serialize(): string {\n if (this.jsonStr) {\n return this.jsonStr;\n }\n\n const obj: any = {\n dam: \"hi\",\n \"#\": this.peerId,\n };\n\n this.jsonStr = JSON.stringify(obj);\n return this.jsonStr;\n }\n\n static deserialize(obj: any): Hi {\n const peerId = obj['#'];\n return new Hi(peerId);\n }\n\n constructor(peerId: string, jsonStr?: string) {\n this.peerId = peerId;\n this.jsonStr = jsonStr;\n }\n}\n\nconst parseGet = (get: any, from: Actor): Get => {\n return new Get(get.id, get.nodeId, from, get.recipients, get.childKey, get.jsonStr, get.checksum);\n}\n\nconst parsePut = (put: any, from: Actor): Put => {\n return new Put(put.id, put.updatedNodes, from, put.inResponseTo, put.recipients, put.jsonStr, put.checksum);\n}\n\nexport function messageFromJsonString(jsonStr: string, from: Actor): Message {\n const obj = JSON.parse(jsonStr);\n if (obj.get) {\n return parseGet(obj.get, from);\n } else if (obj.put) {\n return parsePut(obj.put, from);\n } else {\n throw new Error('Unknown message type');\n }\n}","import {Put, Get, Message} from '../Message'\nimport { Actor } from '../Actor';\nimport QuickLRU from 'quick-lru';\nimport {Children} from \"../Node\";\n//import {NodeData} from \"../Node\";\n// import * as Comlink from \"comlink\";\nimport _ from '../../lodash';\n\nexport default class Memory extends Actor {\n config = {};\n store: QuickLRU = new QuickLRU({ maxSize: 10000 });\n\n constructor(config: any = {}) {\n super();\n this.config = config;\n }\n\n handle(message: Message) {\n if (message instanceof Put) {\n this.handlePut(message);\n } else if (message instanceof Get) {\n this.handleGet(message);\n } else {\n console.log('Memory got unknown message', message);\n }\n }\n\n handleGet(message: Get) {\n if (!message.from) {\n console.log('no from in get message');\n return;\n }\n let children = this.store.get(message.nodeId);\n if (children) {\n //console.log('have', message.nodeId, children);\n const putMessage = Put.newFromKv(message.nodeId, children, this);\n putMessage.inResponseTo = message.id;\n message.from && message.from.postMessage(putMessage);\n } else {\n //console.log('dont have', message.nodeId);\n }\n }\n\n mergeAndSave(nodeName: string, children: Children) {\n const existing = this.store.get(nodeName);\n\n // TODO check updatedAt timestamp\n if (existing === undefined) {\n this.store.set(nodeName, children);\n } else {\n for (const [key, value] of Object.entries(children)) {\n if (existing[key] && existing[key].updatedAt >= value.updatedAt) {\n continue;\n }\n existing[key] = value;\n }\n this.store.set(nodeName, existing);\n }\n }\n\n async handlePut(put: Put) {\n for (const [nodeName, children] of Object.entries(put.updatedNodes)) {\n if (!children) {\n console.log('deleting', nodeName);\n this.store.delete(nodeName);\n continue;\n }\n this.mergeAndSave(nodeName, children);\n }\n }\n}\n\n/*\nlet actor;\nglobal.onconnect = () => {\n if (actor) {\n console.log ('worker already exists');\n } else {\n console.log('starting worker');\n actor = actor || new IndexedDB();\n }\n}\n */\n\n// self.onconnect = (e) => Comlink.expose(actor, e.ports[0]);","import {Put, Get, Message} from '../Message'\nimport { Actor } from '../Actor';\nimport _ from \"../../lodash\";\nimport Dexie from 'dexie';\nimport {Children, NodeData} from \"../Node\";\n// import * as Comlink from \"comlink\";\n\n// TODO: add LRU or other eviction policy, clean up least important data when db gets too big\nclass MyDexie extends Dexie {\n nodes: Dexie.Table;\n constructor(dbName: string) {\n super(dbName);\n this.version(1).stores({\n nodes: \", value, updatedAt\"\n });\n this.nodes = this.table(\"nodes\");\n }\n}\n\nexport default class IndexedDB extends Actor {\n config = {};\n notStored = new Set();\n putQueue: any = {};\n getQueue: any = {};\n i = 0;\n queue = 0;\n db: MyDexie;\n\n constructor(config: any = {}) {\n super();\n this.config = config;\n const dbName = (config.dbName || 'iris');\n this.db = new MyDexie(dbName);\n this.db.open().catch((err) => {\n console.error(err.stack || err);\n });\n }\n\n put(nodeId: string, value: any) {\n // add puts to a queue and dexie bulk write them once per 500ms\n this.putQueue[nodeId] = value;\n this.throttledPut();\n }\n\n throttledPut = _.throttle(() => {\n const keys = Object.keys(this.putQueue);\n const values = keys.map(key => {\n this.notStored.delete(key);\n return this.putQueue[key];\n });\n this.db.nodes.bulkPut(values, keys).catch((err) => {\n console.error(err);\n });\n this.putQueue = {};\n }, 500);\n\n get(path: string, callback: Function) {\n this.getQueue[path] = this.getQueue[path] || [];\n this.getQueue[path].push(callback);\n this.throttledGet();\n }\n\n throttledGet = _.throttle(() => {\n // clone this.getQueue and clear it\n const queue = this.getQueue;\n const keys = Object.keys(queue);\n this.db.nodes.bulkGet(keys).then((values: (any | undefined)[]) => {\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n const value = values[i];\n const callbacks = queue[key];\n // console.log('have', key, value);\n for (const callback of callbacks) {\n callback(value);\n }\n }\n });\n this.getQueue = {};\n }, 100);\n\n handle(message: Message) {\n if (message instanceof Put) {\n this.handlePut(message);\n } else if (message instanceof Get) {\n this.handleGet(message);\n } else {\n console.log('worker got unknown message', message);\n }\n }\n\n handleGet(message: Get) {\n if (this.notStored.has(message.nodeId)) {\n // TODO message implying that the key is not stored\n return;\n }\n this.get(message.nodeId, (children: any) => {\n // TODO: this takes a long time to return\n if (children === undefined) {\n this.notStored.add(message.nodeId);\n // TODO message implying that the key is not stored\n } else {\n const putMessage = Put.newFromKv(message.nodeId, children, this);\n putMessage.inResponseTo = message.id;\n message.from && message.from.postMessage(putMessage);\n }\n });\n }\n\n mergeAndSave(path: string, children: Children) {\n this.get(path, (existing: any) => {\n // TODO check updatedAt timestamp\n if (existing === undefined) {\n this.put(path, children);\n } else {\n for (const [key, value] of Object.entries(children)) {\n if (existing[key] && existing[key].updatedAt >= value.updatedAt) {\n continue;\n }\n existing[key] = value;\n }\n this.put(path, existing);\n }\n });\n }\n\n savePath(path: string, value: any) {\n if (value === undefined) {\n this.db.nodes.delete(path);\n this.notStored.add(path);\n } else {\n this.notStored.delete(path);\n this.mergeAndSave(path, value);\n }\n }\n\n async handlePut(put: Put) {\n for (const [nodeName, children] of Object.entries(put.updatedNodes)) {\n if (!children) {\n console.log('deleting', nodeName);\n continue;\n }\n this.mergeAndSave(nodeName, children);\n }\n }\n}\n\n/*\nlet actor;\nglobal.onconnect = () => {\n if (actor) {\n console.log ('worker already exists');\n } else {\n console.log('starting worker');\n actor = actor || new IndexedDB();\n }\n}\n */\n\n// self.onconnect = (e) => Comlink.expose(actor, e.ports[0]);","import {Get, Message, Put} from \"../Message\";\nimport {Actor} from \"../Actor\";\n//@ts-ignore\n\nexport default class Websocket extends Actor {\n ws: WebSocket;\n router: Actor;\n sendQueue: string[] = [];\n\n constructor(url: string, router: Actor) {\n super('websocket:' + url);\n console.log('Websocket', url);\n this.router = router;\n this.ws = new WebSocket(url.replace('http', 'ws'));\n this.ws.onopen = () => {\n //this.ws.send(new Hi(this.router.peerId).serialize());\n console.log(`Connected to ${url}`);\n this.sendQueue.forEach((message) => this.ws.send(message));\n this.sendQueue = [];\n }\n this.ws.onmessage = async (event) => {\n try {\n const message = await Message.deserialize(event.data, this);\n this.router.postMessage(message);\n } catch (e) {\n //console.log('Failed to deserialize message', event.data, e);\n }\n }\n this.ws.onclose = () => {\n console.log(`Disconnected from ${url}`);\n }\n this.ws.onerror = () => {\n console.log(`Error on ${url}`);\n }\n }\n\n handle(message: Message): void {\n if (message instanceof Get || message instanceof Put) {\n if (message.from === this) {\n return;\n }\n if (this.ws.readyState === WebSocket.OPEN) {\n this.ws.send(message.serialize());\n } else if (this.ws.readyState === WebSocket.CONNECTING) {\n this.sendQueue.push(message.serialize());\n }\n }\n }\n}\n\n\n","import {Actor} from \"./Actor\";\nimport Memory from \"./adapters/Memory\";\nimport IndexedDB from \"./adapters/IndexedDB\";\nimport Websocket from \"./adapters/Websocket\";\nimport {Put, Get, Message} from \"./Message\";\n// import * as Comlink from \"comlink\";\n\n/*\nclass SeenGetMessage {\n constructor(id, from, lastReplyChecksum) {\n this.id = id;\n this.from = from;\n this.lastReplyChecksum = lastReplyChecksum;\n }\n}\n*/\n\nexport default class Router extends Actor {\n storageAdapters: Set = new Set();\n networkAdapters: Set = new Set();\n serverPeers: Set = new Set();\n seenMessages: Set = new Set();\n seenGetMessages: Map = new Map();\n subscribersByTopic: Map> = new Map();\n msgCounter = 0;\n peerId: string;\n\n constructor(config: any = {}) {\n super('router');\n // default random id\n this.peerId = config.peerId || Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15);\n this.storageAdapters.add(new Memory(config));\n this.storageAdapters.add(new IndexedDB(config));\n console.log('config', config);\n if (config.peers) {\n for (const peer of config.peers) {\n if (peer) {\n this.serverPeers.add(new Websocket(peer, this));\n }\n }\n }\n }\n\n handle(message: Message) {\n //console.log('router received', message);\n if (message instanceof Put || message instanceof Get) {\n if (this.seenMessages.has(message.id)) {\n return;\n }\n this.seenMessages.add(message.id);\n if (message instanceof Put) {\n this.handlePut(message);\n } else if (message instanceof Get) {\n this.handleGet(message);\n }\n }\n }\n\n handlePut(put: Put) {\n const sendTo: Set = new Set();\n Object.keys(put.updatedNodes).forEach(path => {\n // topic is first 3 nodes of path\n const topic = path.split('/').slice(0, 3).join('/');\n const subscribers = this.subscribersByTopic.get(topic);\n // send to storage adapters\n //console.log('put subscribers', subscribers);\n for (const storageAdapter of this.storageAdapters) {\n if (put.from !== storageAdapter) {\n sendTo.add(storageAdapter);\n }\n }\n\n for (const peer of this.serverPeers) {\n if (put.from !== peer) {\n sendTo.add(peer);\n }\n }\n\n if (subscribers) {\n for (const subscriber of subscribers) {\n if (subscriber !== put.from) {\n sendTo.add(subscriber);\n }\n }\n }\n });\n for (const actor of sendTo) {\n actor.postMessage(put);\n }\n }\n\n opt(opts: any) {\n if (opts.peers) {\n for (const peer of opts.peers) {\n if (peer) {\n this.serverPeers.add(new Websocket(peer, this));\n }\n }\n }\n }\n\n handleGet(get: Get) {\n const topic = get.nodeId.split('/')[1];\n const sendTo: Set = new Set();\n for (const storageAdapter of this.storageAdapters) {\n if (get.from !== storageAdapter) {\n sendTo.add(storageAdapter);\n }\n }\n for (const peer of this.serverPeers) {\n if (get.from !== peer) {\n sendTo.add(peer);\n }\n }\n if (!this.subscribersByTopic.has(topic)) {\n this.subscribersByTopic.set(topic, new Set());\n }\n const subscribers = this.subscribersByTopic.get(topic);\n if (subscribers) {\n if (!subscribers.has(get.from)) {\n subscribers.add(get.from);\n }\n }\n for (const actor of sendTo) {\n actor.postMessage(get);\n }\n }\n}\n\n/*\nlet actor: Actor;\nself.onconnect = () => {\n console.log('router shared worker connected');\n actor = actor || new Router();\n}\n*/\n\n// self.onconnect = (e) => Comlink.expose(actor, e.ports[0]);","import _ from '../lodash';\nimport {Actor} from './Actor';\nimport {Message, Put, Get, UpdatedNodes} from './Message';\n\n// @ts-ignore\nimport Router from './Router';\nimport Key from \"../Key\";\n//import * as Comlink from \"comlink\";\n\nexport type NodeData = {\n value: any;\n updatedAt: number;\n};\n\nexport type Children = {\n [key: string]: NodeData;\n}\n\nexport type Config = {\n peerId?: string;\n allowPublicSpace: boolean;\n myPublicKey?: string;\n enableStats: boolean;\n webSocketPeers?: string[];\n localOnly: boolean;\n}\n\nexport const DEFAULT_CONFIG: Config = {\n allowPublicSpace: false,\n enableStats: true,\n localOnly: true\n}\n\n// TODO move memory storage to its own adapter? it would make things simpler here\nexport default class Node extends Actor {\n root: Node;\n parent?: Node;\n children = new Map();\n once_subscriptions = new Map();\n on_subscriptions = new Map();\n map_subscriptions = new Map();\n counter = 0;\n config: Config;\n currentUser: any;\n router: Router;\n\n constructor(id = '', config?: Config, parent?: Node) {\n super(id);\n this.parent = parent;\n this.config = config || (parent && parent.config) || DEFAULT_CONFIG;\n if (parent) {\n this.root = parent.root;\n this.router = parent.router;\n } else {\n this.root = this;\n //@ts-ignore\n this.router = new Router({dbName: this.id + '-idb', peers: this.config.webSocketPeers});\n //console.log('idbWorker', idbWorker);\n //const router = Comlink.wrap(routerWorker);\n }\n }\n\n getCurrentUser(): any {\n return this.root.currentUser;\n }\n\n setCurrentUser(key: any) {\n this.root.currentUser = key;\n }\n\n handle(message: Message): void {\n if (message instanceof Put) {\n for (const [key, children] of Object.entries(message.updatedNodes)) {\n if (!children || typeof children !== 'object') {\n continue;\n }\n if (key === this.id) {\n for (const [childKey, childData] of Object.entries(children)) {\n this.get(childKey).doCallbacks(childData, childKey); // TODO children should have proper NodeData\n }\n }\n }\n this.parent && this.parent.handle(message);\n }\n };\n\n get(key: string): Node {\n const existing = this.children.get(key);\n if (existing) {\n return existing;\n }\n const newNode = new Node(`${this.id}/${key}`, this.config, this);\n this.children.set(key, newNode);\n return newNode;\n }\n\n user(pub: string | undefined): Node {\n pub = pub || (this.root.currentUser && this.root.currentUser.pub);\n if (!pub) {\n throw new Error(\"no public key!\");\n }\n return this.get('user').get(pub as string);\n }\n\n auth(key: any) {\n // TODO get public key from key\n this.root.setCurrentUser(key);\n return;\n }\n\n doCallbacks = (data: NodeData, key: string) => {\n if (typeof data.value === 'string' && data.value.startsWith('{\":\":')) {\n data.value = JSON.parse(data.value)[':'];\n }\n for (const [id, callback] of this.on_subscriptions) {\n const event = { off: () => this.on_subscriptions.delete(id) };\n callback(data.value, key, null, event);\n }\n for (const [id, callback] of this.once_subscriptions) {\n callback(data.value, key, null, {});\n this.once_subscriptions.delete(id);\n }\n if (this.parent) {\n const parent = this.parent;\n for (const [id, callback] of parent.map_subscriptions) {\n const event = { off: () => parent.map_subscriptions.delete(id) };\n callback(data.value, key, null, event);\n }\n }\n };\n\n async put(value: any): Promise {\n const updatedAt = Date.now();\n if (Array.isArray(value)) {\n throw new Error('put() does not support arrays');\n }\n if (typeof value === 'function') {\n throw new Error('put() does not support functions');\n }\n if (typeof value === 'object' && value !== null) {\n // TODO: update the whole path of parent nodes\n for (const key in value) {\n this.get(key).put(value[key]);\n }\n return;\n }\n value = await this.signIfNeeded(value);\n this.children = new Map();\n const updatedNodes: UpdatedNodes = {};\n await this.addParentNodes(updatedNodes, value, updatedAt);\n const put = Put.new(updatedNodes, this);\n this.handle(put);\n this.router.postMessage(put);\n }\n\n private async signIfNeeded(value: any) {\n if (this.id.indexOf('global/user/') === 0) {\n if (!this.getCurrentUser()) {\n throw new Error('not authenticated');\n }\n if (this.id.indexOf('global/user/' + this.getCurrentUser().pub) !== 0) {\n throw new Error('not allowed ' + this.id);\n }\n const signed = await Key.sign(value, this.getCurrentUser(), undefined, {raw: true});\n value = JSON.stringify({':': signed.m, '~': signed.s});\n console.log('saving signed value', value);\n }\n return value;\n }\n\n private async addParentNodes(updatedNodes: UpdatedNodes, value: any, updatedAt: number) {\n // TODO sign\n if (this.parent) {\n const childName = this.id.split('/').pop() as string;\n const parentId = this.parent.id;\n updatedNodes[parentId] = updatedNodes[parentId] || {};\n updatedNodes[parentId][childName] = {value, updatedAt};\n await this.parent.addParentNodes(updatedNodes, {'#': this.parent.id }, updatedAt);\n }\n }\n\n private request() {\n if (this.parent) { // TODO router should decide whether to re-request from peers\n const childKey = this.id.split('/').pop();\n this.router.postMessage(Get.new(this.parent.id, this, undefined, childKey));\n }\n }\n\n async once(callback?: Function | null): Promise {\n const id = this.counter++;\n callback && this.once_subscriptions.set(id, callback);\n this.request();\n }\n\n on(callback: Function): void {\n const id = this.counter++;\n this.on_subscriptions.set(id, callback);\n //const event = { off: () => this.on_subscriptions.delete(id) };\n this.request();\n }\n\n map(callback: Function): void {\n const id = this.counter++;\n this.map_subscriptions.set(id, callback);\n // TODO: child key should probably still be included. But how to handle link responses?\n this.router.postMessage(Get.new(this.id, this, undefined));\n }\n\n opt(opts: any) {\n this.router.opt(opts);\n }\n}","import peers from \"./peers\";\nimport Node from \"./db/Node\";\n\nlet globalState: any;\n\nexport default function(opts: any = {}) {\n if (!globalState) {\n peers.init();\n const webSocketPeers = (opts.peers || peers.random());\n console.log('webSocketPeers', webSocketPeers);\n const myOpts = Object.assign({ webSocketPeers, localStorage: false, retry:Infinity }, opts);\n if (opts.peers) {\n console.log('adding peers', opts.peers);\n opts.peers.forEach((url: string) => peers.add({url}));\n }\n globalState = new Node('global', myOpts);\n }\n return globalState;\n}","// @ts-nocheck\n\n/*eslint no-useless-escape: \"off\", camelcase: \"off\" */\n\nconst UNIQUE_ID_VALIDATORS = {\n email: /^([\\w-]+(?:\\.[\\w-]+)*)@((?:[\\w-]+\\.)*\\w[\\w-]{0,66})\\.([a-z]{2,6}(?:\\.[a-z]{2})?)$/i,\n bitcoin: /^[13][a-km-zA-HJ-NP-Z0-9]{26,33}$/,\n bitcoin_address: /^[13][a-km-zA-HJ-NP-Z0-9]{26,33}$/,\n ip: /^(([1-9]?\\d|1\\d\\d|2[0-5][0-5]|2[0-4]\\d)\\.){3}([1-9]?\\d|1\\d\\d|2[0-5][0-5]|2[0-4]\\d)$/,\n ipv6: /^(?:[A-F0-9]{1,4}:){7}[A-F0-9]{1,4}$/,\n gpg_fingerprint: null,\n gpg_keyid: null,\n google_oauth2: null,\n tel: /^\\d{7,}$/,\n phone: /^\\d{7,}$/,\n keyID: null,\n url: /[-a-zA-Z0-9@:%_\\+.~#?&//=]{2,256}\\.[a-z]{2,4}\\b(\\/[-a-zA-Z0-9@:%_\\+.~#?&//=]*)?/gi,\n account: /^([\\w-]+(?:\\.[\\w-]+)*)@((?:[\\w-]+\\.)*\\w[\\w-]{0,66})\\.([a-z]{2,6}(?:\\.[a-z]{2})?)$/i,\n uuid: /[0-9a-f]{8}\\-[0-9a-f]{4}\\-[0-9a-f]{4}\\-[0-9a-f]{4}\\-[0-9a-f]{12}/\n};\n\n// TODO this class could perhaps be removed\n\nclass Attribute {\n constructor(a, b) {\n if (typeof a === `object`) {\n if (typeof a.value !== `string`) { throw new Error(`param1.value must be a string, got ${typeof a.value}: ${JSON.stringify(a.value)}`); }\n if (typeof a.type !== `string`) { throw new Error(`param1.type must be a string, got ${typeof a.type}: ${JSON.stringify(a.type)}`); }\n b = a.value;\n a = a.type;\n }\n if (typeof a !== `string`) { throw new Error(`First param must be a string, got ${typeof a}: ${JSON.stringify(a)}`); }\n if (!a.length) { throw new Error(`First param string is empty`); }\n if (b) {\n if (typeof b !== `string`) { throw new Error(`Second parameter must be a string, got ${typeof b}: ${JSON.stringify(b)}`); }\n if (!b.length) { throw new Error(`Second param string is empty`); }\n this.type = a;\n this.value = b;\n } else {\n this.value = a;\n const t = Attribute.guessTypeOf(this.value);\n if (t) {\n this.type = t;\n } else {\n throw new Error(`Type of attribute was omitted and could not be guessed`);\n }\n }\n }\n\n static getUuid() {\n const b = a => a ? (a ^ Math.random() * 16 >> a / 4).toString(16) : ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, b);\n return new Attribute(`uuid`, b());\n }\n\n static getUniqueIdValidators() {\n return UNIQUE_ID_VALIDATORS;\n }\n\n static isUniqueType(type) {\n return Object.keys(UNIQUE_ID_VALIDATORS).indexOf(type) > -1;\n }\n\n isUniqueType() {\n return Attribute.isUniqueType(this.type);\n }\n\n static guessTypeOf(value) {\n for (const key in UNIQUE_ID_VALIDATORS) {\n if (value.match(UNIQUE_ID_VALIDATORS[key])) {\n return key;\n }\n }\n }\n\n static equals(a, b) {\n return a.equals(b);\n }\n\n equals(a) {\n return a && this.type === a.type && this.value === a.value;\n }\n\n uri() {\n return `${encodeURIComponent(this.value)}:${encodeURIComponent(this.type)}`;\n }\n}\n\nexport default Attribute;\n","import globalState from './global';\nimport session from './session';\n\n/**\n * Get a public space where only the specified user (public key) can write. Others can read.\n * @param pub The public key string or keypair object of the user. Defaults to the current user from session.\n * @returns {Node} The user space.\n */\nexport default function(pub: any = session.getKey()) {\n if (typeof pub === 'string') {\n return globalState().user(pub);\n } else if (typeof pub === 'object') {\n const userSpace = globalState().user(pub.pub);\n userSpace.auth(pub);\n return userSpace;\n }\n}\n","// @ts-nocheck\n\nimport util from './util';\nimport Attribute from './Attribute';\nimport session from './session';\nimport publicState from './global';\nimport userState from './public';\nimport Key from './Key';\n\n// TODO: extract Group channels into their own class\n\nconst DEFAULT_PERMISSIONS = {read: true, write: true, admin: false};\n\n/**\n* Private communication channel between two or more participants ([Gun](https://github.com/amark/gun) public keys). Can be used independently of other Iris stuff.\n*\n* Used as a core element of [iris-messenger](https://github.com/irislib/iris-messenger).\n*\n* You can use iris.private(pub) to always use the same Channel object for a given pub.\n*\n* ---\n*\n* #### Key-value API\n* `channel.put(key, value)` and `channel.on(key, callback)`.\n*\n* Note that each participant has their own versions of each key-value — they don't overwrite each other. `channel.on()` callback returns them all by default and has a parameter that indicates whose value you got.\n*\n* While values are encrypted, encryption of keys is not implemented yet.\n*\n* #### Message API\n* `channel.send()` and `channel.getMessages()` for timestamp-indexed chat-style messaging.\n*\n* Message data is encrypted, but timestamps are public so that peers can return your messages in a sequential order.\n*\n* ---\n*\n* You can open a channel with yourself for a private key-value space or a \"note to self\" type chat with yourself.\n*\n* **Privacy disclaimer:** Channel ids, data values and messages are encrypted, but message timestamps are unencrypted so that peers can return them to you in a sequential order. By looking at the unencrypted timestamps (or Gun subscriptions), it is possible to guess who are communicating with each other. This could be improved by indexing messages by *day* only, so making the guess would be more difficult, while you could still return them in a semi-sequential order.\n*\n* @param {Object} options\n* @param {string} options.key your keypair\n* @param {Object} options.gun [gun](https://github.com/amark/gun) instance\n* @param options.participants (optional) string or string array or permissions object ({'pub1':{read:true,write:true,admin:false},'pub2'...}) of participant public keys (your own key is included by default)\n* @param {string} options.chatLink (optional) chat link instead of participants list\n* @param {string} options.uuid (group channels only) unique channel identifier. Leave out for new channel.\n* @param {string} options.name (group channels only) channel name\n* @example\n* // Copy & paste this to console at https://iris.to or other page that has gun, sea and iris-lib\n* // Due to an unsolved bug, someoneElse's messages only start showing up after a reload\n*\n* var gun1 = new Gun('https://gun-us.herokuapp.com/gun');\n* var gun2 = new Gun('https://gun-us.herokuapp.com/gun');\n* var myKey = await Key.getDefault();\n* var someoneElse = localStorage.getItem('someoneElsesKey');\n* if (someoneElse) {\n* someoneElse = JSON.parse(someoneElse);\n* } else {\n* someoneElse = await Key.generate();\n* localStorage.setItem('someoneElsesKey', JSON.stringify(someoneElse));\n* }\n*\n* iris.Channel.initUser(gun1, myKey); // saves myKey.epub to gun.user().get('epub')\n* iris.Channel.initUser(gun2, someoneElse);\n*\n* var ourChannel = new iris.Channel({key: myKey, gun: gun1, participants: someoneElse.pub});\n* var theirChannel = new iris.Channel({key: someoneElse, gun: gun2, participants: myKey.pub});\n*\n* var myChannels = {}; // you can list them in a user interface\n* function printMessage(msg, info) {\n* console.log(`[${new Date(msg.time).toLocaleString()}] ${info.from.slice(0,8)}: ${msg.text}`)\n* }\n* iris.Channel.getChannels(gun1, myKey, channel => {\n* var pub = channel.getCurrentParticipants()[0];\n* gun1.user(pub).get('profile').get('name').on(name => channel.name = name);\n* myChannels[pub] = channel;\n* channel.getMessages(printMessage);\n* channel.on('mood', (mood, from) => console.log(from.slice(0,8) + ' is feeling ' + mood));\n* });\n*\n* // you can play with these in the console:\n* ourChannel.send('message from myKey');\n* theirChannel.send('message from someoneElse');\n*\n* ourChannel.put('mood', 'blessed');\n* theirChannel.put('mood', 'happy');\n*\n* @example https://github.com/irislib/iris-lib/blob/master/__tests__/Channel.js\n*/\nclass Channel {\n // TODO: these should be done in a cleaner way\n latestTime: any;\n theirMsgsLastSeenDate: any;\n myLastSeenTime: any;\n theirMsgsLastSeenTime: any;\n notificationSetting: any;\n messageIds: any; // this is used from session.processMessage\n latest: any;\n uuid: any;\n name: any;\n attachments: any;\n\n theirSecretUuids = {};\n theirGroupSecrets = {};\n secrets = {};\n ourSecretChannelIds = {};\n theirSecretChannelIds = {};\n messages = {};\n chatLinks = {};\n groupSubscriptions = {};\n directSubscriptions = {};\n getParticipantsCallbacks = {};\n myGroupSecret: any;\n participants: any;\n\n constructor(options: any) {\n this.myGroupSecret = options.myGroupSecret;\n\n if (options.chatLink) {\n this.useChatLink(options);\n }\n\n if (typeof options.participants === `string`) {\n this.addParticipant(options.participants, options.save);\n } else if (Array.isArray(options.participants)) {\n const o = {};\n options.participants.forEach(p => o[p] = Object.assign({}, DEFAULT_PERMISSIONS));\n options.participants = o;\n }\n if (typeof options.participants === `object`) { // it's a group channel\n const keys = Object.keys(options.participants);\n keys.forEach(k => {\n if (k !== session.getKey().pub) {\n this.addParticipant(k, options.save, Object.assign({}, DEFAULT_PERMISSIONS, options.participants[k]));\n }\n });\n options.participants[session.getKey().pub] = options.participants[session.getKey().pub] || Object.assign({}, DEFAULT_PERMISSIONS);\n if (options.uuid) {\n this.uuid = options.uuid;\n this.name = options.name;\n } else {\n options.uuid = Attribute.getUuid().value;\n this.uuid = options.uuid;\n options.participants[session.getKey().pub].admin = true;\n options.participants[session.getKey().pub].founder = true;\n }\n this.getChatLinks({subscribe: true});\n }\n this.participants = options.participants;\n if (options.uuid) { // It's a group channel\n // share secret uuid with other participants. since secret is already non-deterministic, maybe uuid could also be?\n // generate channel-specific secret and share it with other participants\n // put() keys should be encrypted first? so you could do put(uuid, secret)\n // what if you join the channel with 2 unconnected devices? on reconnect, the older secret would be overwritten and messages unreadable. maybe participants should store each others' old keys? or maybe you should store them and re-encrypt old stuff when key changes? return them with map() instead?\n this.putDirect(`S${this.uuid}`, this.getMyGroupSecret());\n this.getMySecretUuid().then(s => {\n this.putDirect(this.uuid, s); // TODO: encrypt keys in put()\n });\n this.onTheirDirect(this.uuid, (s, k, from) => {\n this.theirSecretUuids[from] = s;\n });\n this.onTheirDirect(`S${this.uuid}`, (s, k, from) => {\n this.theirGroupSecrets[from] = s;\n });\n // need to make put(), on(), send() and getMessages() behave differently when it's a group and retain the old versions for mutual signaling\n }\n this.onTheir(`participants`, (participants, k, from) => {\n let hasAdmin = false;\n const keys = Object.keys(this.participants);\n for (let i = 0; i < keys.length; i++) {\n if (this.participants[keys[i]].admin || this.participants[keys[i]].inviter) {\n hasAdmin = true;\n break;\n }\n }\n if (!hasAdmin) {\n keys.forEach(k => this.participants[k].admin = true); // if no admins, make everyone admin\n }\n if (this.participants[from] && (this.participants[from].admin || this.participants[from].inviter)) {\n if (typeof participants === `object`) {\n if (JSON.stringify(this.participants) === JSON.stringify(participants)) { return; }\n this.participants = participants;\n delete this.participants[from].inviter;\n Object.keys(participants).forEach(k => {\n if (k !== session.getKey().pub) {\n this.addParticipant(k, true, Object.assign({}, DEFAULT_PERMISSIONS, participants[k]), true);\n }\n });\n this.participantsChanged();\n options.saved = true;\n }\n }\n });\n if (!options.saved && (options.save === undefined || options.save === true)) {\n this.save();\n }\n }\n\n useChatLink(options) {\n const s = options.chatLink.split('?');\n if (s.length === 2) {\n const chatWith = util.getUrlParameter('chatWith', s[1]);\n const channelId = util.getUrlParameter('channelId', s[1]);\n const inviter = util.getUrlParameter('inviter', s[1]);\n const pub = inviter || chatWith;\n if (chatWith) {\n options.participants = pub;\n } else if (channelId && inviter && inviter !== session.getKey().pub) { // TODO! initializing it twice breaks things - new secret is generated\n options.uuid = channelId;\n options.participants = {};\n options.participants[inviter] = Object.assign({inviter: true}, DEFAULT_PERMISSIONS);\n }\n if (pub !== session.getKey().pub) {\n const sharedSecret = util.getUrlParameter('s', s[1]);\n const linkId = util.getUrlParameter('k', s[1]);\n if (sharedSecret && linkId) {\n this.save(); // save the channel first so it's there before inviter subscribes to it\n options.saved = true;\n publicState().user(pub).get('chatLinks').get(linkId).get('encryptedSharedKey').on(async encrypted => {\n const sharedKey = await Key.decrypt(encrypted, sharedSecret);\n const encryptedChatRequest = await Key.encrypt(session.getKey().pub, sharedSecret); // TODO encrypt is not deterministic, it uses salt\n const channelRequestId = await util.getHash(encryptedChatRequest);\n publicState(sharedKey).get('chatRequests').get(channelRequestId.slice(0, 12)).put(encryptedChatRequest);\n });\n }\n }\n }\n }\n\n getTheirSecretUuid(pub) {\n return new Promise(resolve => {\n if (!this.theirSecretUuids[pub]) {\n this.onTheirDirect(this.uuid, s => {\n this.theirSecretUuids[pub] = s;\n resolve(this.theirSecretUuids[pub]);\n }, pub);\n } else {\n resolve(this.theirSecretUuids[pub]);\n }\n });\n }\n\n getTheirGroupSecret(pub) {\n if (pub === session.getKey().pub) { return this.getMyGroupSecret(); }\n return new Promise(resolve => {\n if (!this.theirGroupSecrets[pub]) {\n this.onTheirDirect(`S${this.uuid}`, s => {\n this.theirGroupSecrets[pub] = s;\n resolve(this.theirGroupSecrets[pub]);\n }, pub);\n } else {\n resolve(this.theirGroupSecrets[pub]);\n }\n });\n }\n\n changeMyGroupSecret() {\n this.myGroupSecret = Key.random(32).toString('base64');\n // TODO: secret should be archived and probably messages should include the encryption key id so past messages don't become unreadable\n this.putDirect(`S${this.uuid}`, this.myGroupSecret);\n }\n\n /**\n * Unsubscribe messages from a channel participants\n *\n * @param {string} participant public key\n */\n async mute(participant) {\n publicState().user(participant).get(this.theirSecretUuids[participant]).off();\n // TODO: persist\n }\n\n /**\n * Mute user and prevent them from seeing your further (and maybe past) messages\n *\n * @param {string} participant public key\n */\n async block(participant) {\n this.mute(participant);\n this.putDirect(this.uuid, null);\n this.putDirect(`S${this.uuid}`, null);\n delete this.secrets[participant];\n delete this.ourSecretChannelIds[participant];\n delete this.theirSecretChannelIds[participant];\n this.changeMyGroupSecret();\n }\n\n async getMySecretUuid() {\n if (!this.mySecretUuid) {\n const mySecret = await Key.secret(session.getKey().epub, session.getKey());\n const mySecretHash = await util.getHash(mySecret);\n this.mySecretUuid = await util.getHash(mySecretHash + this.uuid);\n }\n return this.mySecretUuid;\n }\n\n /**\n * List participants of the channel (other than you)\n */\n getCurrentParticipants() {\n return Object.keys(this.secrets);\n }\n\n /**\n * Subscribe to the changing list of participants by channel admins\n */\n getParticipants(callback) {\n if (this.getParticipantsCallbackId) {\n this.getParticipantsCallbackId++;\n } else {\n this.getParticipantsCallbackId = 1;\n }\n this.getParticipantsCallbacks[this.getParticipantsCallbackId] = callback;\n if (this.participants) {\n callback(this.participants);\n }\n }\n\n participantsChanged() {\n Object.keys(this.getParticipantsCallbacks).forEach(id => {\n this.getParticipantsCallbacks[id](this.participants);\n });\n }\n\n /**\n * Returns either the uuid of a group channel or the public key of a direct channel.\n */\n getId() {\n return this.uuid || this.getCurrentParticipants()[0];\n }\n\n async getSecret(pub) {\n if (!this.secrets[pub]) {\n const epub = await util.gunOnceDefined(publicState().user(pub).get(`epub`));\n this.secrets[pub] = await Key.secret(epub, session.getKey());\n }\n return this.secrets[pub];\n }\n\n /**\n *\n */\n static async getOurSecretChannelId(pub, pair) {\n const epub = await util.gunOnceDefined(publicState().user(pub).get(`epub`));\n const secret = await Key.secret(epub, pair);\n return util.getHash(secret + pub);\n }\n\n /**\n *\n */\n static async getTheirSecretChannelId(pub, pair) {\n const epub = await util.gunOnceDefined(publicState().user(pub).get(`epub`));\n const secret = await Key.secret(epub, pair);\n return util.getHash(secret + pair.pub);\n }\n\n /**\n * Calls back with Channels that you have initiated or written to.\n * @param {Object} keypair Key keypair that the gun instance is authenticated with\n * @param callback callback function that is called for each public key you have a channel with\n */\n static async getChannels(callback, listenToChatLinks = true) {\n const keypair = session.getKey();\n const mySecret = await Key.secret(keypair.epub, keypair);\n if (listenToChatLinks) {\n Channel.getMyChatLinks( undefined, undefined, true);\n }\n const seen = {};\n\n const handleChannel = async (value, ourSecretChannelId) => {\n if (value && !seen[ourSecretChannelId]) {\n seen[ourSecretChannelId] = true;\n if (ourSecretChannelId.length > 44) {\n publicState().user().get(`chats`).get(ourSecretChannelId).put(null);\n return;\n }\n const encryptedChatId = await util.gunOnceDefined(publicState().user().get(`chats`).get(ourSecretChannelId).get(`pub`));\n const chatId = await Key.decrypt(encryptedChatId, mySecret);\n if (!chatId) {\n return;\n }\n if (chatId.pub || typeof chatId === `string`) {\n callback(new Channel({\n key: keypair,\n participants: chatId.pub || chatId,\n save: false\n }));\n } else if (chatId.uuid && chatId.participants && chatId.myGroupSecret) {\n callback(new Channel({\n key: keypair,\n participants: chatId.participants,\n uuid: chatId.uuid,\n myGroupSecret: chatId.myGroupSecret,\n save: false\n }));\n }\n }\n };\n\n publicState().user().get(`chats`).map(handleChannel);\n }\n\n getMyGroupSecret() { // group secret could be deterministic: hash(encryptToSelf(uuid + iterator))\n if (!this.myGroupSecret) {\n this.changeMyGroupSecret();\n }\n return this.myGroupSecret;\n }\n\n async getOurSecretChannelId(pub) {\n if (!this.ourSecretChannelIds[pub]) {\n const secret = await this.getSecret(pub);\n this.ourSecretChannelIds[pub] = await util.getHash(secret + pub);\n }\n return this.ourSecretChannelIds[pub];\n }\n\n async getTheirSecretChannelId(pub) {\n if (!this.theirSecretChannelIds[pub]) {\n const secret = await this.getSecret(pub);\n this.theirSecretChannelIds[pub] = await util.getHash(secret + session.getKey().pub);\n }\n return this.theirSecretChannelIds[pub];\n }\n\n /**\n * Get messages from the channel\n */\n async getMessages(callback) { // TODO: save callback and apply it when new participants are added to channel\n this.getCurrentParticipants().forEach(async pub => {\n if (pub !== session.getKey().pub) {\n // Subscribe to their messages\n let theirSecretChannelId;\n if (this.uuid) {\n theirSecretChannelId = await this.getTheirSecretUuid(pub);\n } else {\n theirSecretChannelId = await this.getTheirSecretChannelId(pub);\n }\n // TODO map().once\n publicState().user(pub).get(`chats`).get(theirSecretChannelId).get(`msgs`).map((data, key) => {this.messageReceived(callback, data, this.uuid || pub, false, key, pub);});\n }\n if (!this.uuid) {\n // Subscribe to our messages\n const ourSecretChannelId = await this.getOurSecretChannelId(pub);\n // TODO map().once\n userState().get(`chats`).get(ourSecretChannelId).get(`msgs`).map((data, key) => {this.messageReceived(callback, data, pub, true, key, session.getKey().pub);});\n }\n });\n if (this.uuid) {\n // Subscribe to our messages\n const mySecretUuid = await this.getMySecretUuid();\n // TODO map().once\n userState().get(`chats`).get(mySecretUuid).get(`msgs`).map((data, key) => {this.messageReceived(callback, data, this.uuid, true, key, session.getKey().pub);});\n }\n }\n\n async messageReceived(callback, data, channelId, selfAuthored, key, from) {\n if (this.messages[key] || !data) {\n return;\n }\n const secret = this.uuid ? (await this.getTheirGroupSecret(from)) : (await this.getSecret(channelId));\n const decrypted = await Key.decrypt(data, secret);\n if (typeof decrypted !== `object`) {\n return;\n }\n const info = {selfAuthored, channelId, from};\n this.messages[key] = decrypted;\n callback(decrypted, info);\n }\n\n /**\n * Get latest message in this channel. Useful for channel listing.\n */\n async getLatestMsg(callback) {\n const callbackIfLatest = async (msg, info) => {\n if (!this.latest) {\n this.latest = msg;\n callback(msg, info);\n } else {\n const t = (typeof this.latest.time === `string` ? this.latest.time : this.latest.time.toISOString());\n if (t < msg.time) {\n this.latest = msg;\n callback(msg, info);\n }\n }\n };\n this.onMy('latestMsg', msg => callbackIfLatest(msg, {selfAuthored: true, from: session.getKey().pub}));\n this.onTheir('latestMsg', (msg, k, from) => callbackIfLatest(msg, {selfAuthored: false, from}));\n }\n\n /**\n * Useful for notifications\n * @param {integer} time last seen msg time (default: now)\n */\n async setMyMsgsLastSeenTime(time?: string) {\n time = time || new Date().toISOString();\n return this.put(`msgsLastSeenTime`, time);\n }\n\n /**\n * Useful for notifications\n */\n async getMyMsgsLastSeenTime(callback) {\n this.onMy(`msgsLastSeenTime`, time => {\n this.myMsgsLastSeenTime = time;\n if (callback) {\n callback(this.myMsgsLastSeenTime);\n }\n });\n }\n\n /**\n * For \"seen\" status indicator\n */\n async getTheirMsgsLastSeenTime(callback) {\n this.onTheir(`msgsLastSeenTime`, time => {\n this.theirMsgsLastSeenTime = time;\n if (callback) {\n callback(this.theirMsgsLastSeenTime);\n }\n });\n }\n\n async removeParticipant(pub) {\n this.addParticipant(pub, true, {read: false, write: false});\n }\n\n /**\n * Add a public key to the channel or update its permissions\n * @param {string} pub\n */\n async addParticipant(pub: string, save = true, permissions?: any, subscribe?: boolean) {\n if (this.uuid) {\n return;\n }\n if (permissions === undefined) {\n permissions = DEFAULT_PERMISSIONS;\n }\n if (this.secrets[pub] && JSON.stringify(this.secrets[pub]) === JSON.stringify(permissions)) { // TODO: should be this.participants[pub]\n return;\n }\n this.secrets[pub] = null;\n this.getSecret(pub);\n const ourSecretChannelId = await this.getOurSecretChannelId(pub);\n if (save) {\n // Save their public key in encrypted format, so in channel listing we know who we are channeling with\n const mySecret = await Key.secret(session.getKey().epub, session.getKey());\n publicState().user().get(`chats`).get(ourSecretChannelId).get(`pub`).put(await Key.encrypt({pub}, mySecret));\n }\n if (this.uuid) {\n this.participants[pub] = permissions;\n if (save) {\n this.putDirect(`S${this.uuid}`, this.getMyGroupSecret());\n this.getMySecretUuid().then(s => {\n this.putDirect(this.uuid, s); // TODO: encrypt keys in put()\n });\n this.onTheirDirect(this.uuid, (s, k, from) => {\n this.theirSecretUuids[from] = s;\n });\n this.onTheirDirect(`S${this.uuid}`, (s, k, from) => {\n this.theirGroupSecrets[from] = s;\n });\n this.save();\n }\n }\n if (subscribe) {\n Object.values(this.directSubscriptions).forEach(arr => {\n arr.forEach(o => {\n if (!o.from || o.from === pub) {\n this._onTheirDirectFromUser(pub, o.key, o.callback);\n }\n });\n });\n Object.values(this.groupSubscriptions).forEach(arr => {\n arr.forEach(o => {\n if (o.from && o.from !== pub) { return; }\n if (permissions.write) {\n this._onTheirGroupFromUser(pub, o.key, o.callback);\n } else { // unsubscribe\n o.event && o.event.off();\n }\n });\n });\n }\n }\n\n /**\n * Send a message to the channel\n * @param msg string or {time, text, ...} object\n */\n async send(msg) {\n if (typeof msg === `string`) {\n msg = msg.trim();\n if (msg.length === 0) {\n return;\n }\n msg = {\n time: (new Date()).toISOString(),\n text: msg\n };\n } else if (typeof msg === `object`) {\n msg.time = msg.time || (new Date()).toISOString();\n } else {\n throw new Error(`msg param must be a string or an object`);\n }\n //publicState().user().get('message').set(temp);\n if (this.uuid) {\n const encrypted = await Key.encrypt(JSON.stringify(msg), this.getMyGroupSecret());\n const mySecretUuid = await this.getMySecretUuid();\n userState().get(`chats`).get(mySecretUuid).get(`msgs`).get(`${msg.time}`).put(encrypted);\n userState().get(`chats`).get(mySecretUuid).get(`latestMsg`).put(encrypted);\n } else {\n const keys = this.getCurrentParticipants();\n for (let i = 0;i < keys.length;i++) {\n const encrypted = await Key.encrypt(JSON.stringify(msg), (await this.getSecret(keys[i])));\n const ourSecretChannelId = await this.getOurSecretChannelId(keys[i]);\n userState().get(`chats`).get(ourSecretChannelId).get(`msgs`).get(`${msg.time}`).put(encrypted);\n userState().get(`chats`).get(ourSecretChannelId).get(`latestMsg`).put(encrypted);\n }\n }\n }\n\n /**\n * Save the channel to our channels list without sending a message\n */\n async save() {\n if (this.uuid) {\n const mySecretUuid = await this.getMySecretUuid();\n userState().get(`chats`).get(mySecretUuid).get('msgs').get('a').put(null);\n this.put(`participants`, this.participants); // public participants list\n const mySecret = await Key.secret(session.getKey().epub, session.getKey());\n userState().get(`chats`).get(mySecretUuid).get(`pub`).put(await Key.encrypt({\n uuid: this.uuid,\n myGroupSecret: this.getMyGroupSecret(),\n participants: this.participants // private participants list\n }, mySecret));\n this.participantsChanged();\n } else {\n const keys = this.getCurrentParticipants();\n for (let i = 0;i < keys.length;i++) {\n const ourSecretChannelId = await this.getOurSecretChannelId(keys[i]);\n userState().get(`chats`).get(ourSecretChannelId).get('msgs').get('a').put(null);\n }\n }\n }\n\n /**\n * Save a key-value pair, encrypt value. Each participant in the Channel writes to their own version of the key-value pair — they don't overwrite the same one.\n * @param {string} key\n * @param value\n */\n async put(key, value) {\n return (this.uuid ? this.putGroup : this.putDirect).call(this, key, value);\n }\n\n async putGroup(key, value) {\n if (key === `msgs`) { throw new Error(`Sorry, you can't overwrite the msgs field which is used for .send()`); }\n const encrypted = await Key.encrypt(JSON.stringify(value), this.getMyGroupSecret());\n const mySecretUuid = await this.getMySecretUuid();\n userState().get(`chats`).get(mySecretUuid).get(key).put(encrypted);\n }\n\n async putDirect(key, value) {\n if (key === `msgs`) { throw new Error(`Sorry, you can't overwrite the msgs field which is used for .send()`); }\n const keys = this.getCurrentParticipants();\n for (let i = 0;i < keys.length;i++) {\n const encrypted = await Key.encrypt(JSON.stringify(value), (await this.getSecret(keys[i])));\n const ourSecretChannelId = await this.getOurSecretChannelId(keys[i]);\n userState().get(`chats`).get(ourSecretChannelId).get(key).put(encrypted);\n }\n }\n\n /**\n * Subscribe to a key-value pair. Callback returns every participant's value unless you limit it with *from* param.\n * @param {string} key\n * @param {function} callback\n * @param {string} from public key whose value you want, or *\"me\"* for your value only, or *\"them\"* for the value of others only\n */\n async on(key: string, callback: Function, from?: string) {\n return (this.uuid ? this.onGroup : this.onDirect).call(this, key, callback, from);\n }\n\n async onDirect(key: string, callback: Function, from?: string) {\n if (!from || from === `me` || from === session.getKey().pub) {\n this.onMy(key, (val: any) => callback(val, session.getKey().pub));\n }\n if (!from || (from !== `me` && from !== session.getKey().pub)) {\n this.onTheir(key, (val: any, k: string, pub: string) => callback(val, pub));\n }\n }\n\n async onGroup(key: string, callback: Function, from?: string) {\n if (!from || from === `me` || from === session.getKey().pub) {\n this.onMyGroup(key, val => callback(val, session.getKey().pub));\n }\n if (!from || (from !== `me` && from !== session.getKey().pub)) {\n this.onTheirGroup(key, (val, k, pub) => callback(val, pub));\n }\n }\n\n async onMy(key: string, callback: Function) {\n return (this.uuid ? this.onMyGroup : this.onMyDirect).call(this, key, callback);\n }\n\n async onMyDirect(key: string, callback: Function) {\n if (typeof callback !== 'function') {\n throw new Error(`onMy callback must be a function, got ${typeof callback}`);\n }\n const keys = this.getCurrentParticipants();\n for (let i = 0;i < keys.length;i++) {\n const ourSecretChannelId = await this.getOurSecretChannelId(keys[i]);\n publicState().user().get(`chats`).get(ourSecretChannelId).get(key).on(async (data: any) => {\n const decrypted = await Key.decrypt(data, (await this.getSecret(keys[i])));\n if (decrypted) {\n callback(typeof decrypted.v !== `undefined` ? decrypted.v : decrypted, key);\n }\n });\n break;\n }\n }\n\n async onMyGroup(key, callback) {\n if (typeof callback !== 'function') {\n throw new Error(`onMy callback must be a function, got ${typeof callback}`);\n }\n const mySecretUuid = await this.getMySecretUuid();\n const mySecret = await this.getMyGroupSecret();\n publicState().user().get(`chats`).get(mySecretUuid).get(key).on(async data => {\n const decrypted = await Key.decrypt(data, mySecret);\n if (decrypted) {\n callback(typeof decrypted.v !== `undefined` ? decrypted.v : decrypted, key, session.getKey().pub);\n }\n });\n }\n\n async onTheir(key: string, callback: Function, from: string) {\n return (this.uuid ? this.onTheirGroup : this.onTheirDirect).call(this, key, callback, from);\n }\n\n async _onTheirDirectFromUser(key: string, callback: Function, pub: string) {\n if (!this.hasWritePermission(pub)) { return; }\n const theirSecretChannelId = await this.getTheirSecretChannelId(pub);\n publicState().user(pub).get(`chats`).get(theirSecretChannelId).get(key).on(async (data: any) => {\n if (!this.hasWritePermission(pub)) { return; }\n const decrypted = await Key.decrypt(data, (await this.getSecret(pub)));\n if (decrypted) {\n callback(typeof decrypted.v !== `undefined` ? decrypted.v : decrypted, key, pub);\n }\n });\n }\n\n async onTheirDirect(key: string, callback: Function, from: string) { // TODO: subscribe to new channel participants\n if (typeof callback !== 'function') {\n throw new Error(`onTheir callback must be a function, got ${typeof callback}`);\n }\n if (!Object.prototype.hasOwnProperty.call(this.directSubscriptions, key)) {\n this.directSubscriptions[key] = [];\n }\n this.directSubscriptions[key].push({key, callback, from});\n const participants = this.getCurrentParticipants();\n participants.forEach(async pub => {\n if (from && pub !== from) { return; }\n this._onTheirDirectFromUser(pub, key, callback);\n });\n }\n\n hasWritePermission(pub) {\n return !this.uuid || (this.participants && this.participants[pub] && this.participants[pub].write);\n }\n\n async _onTheirGroupFromUser(pub: string, key: string, callback: Function, subscription: any) {\n if (!this.hasWritePermission(pub)) { return; }\n const theirSecretUuid = await this.getTheirSecretUuid(pub);\n publicState().user(pub).get(`chats`).get(theirSecretUuid).get(key).on(async (data: any, _a: any, _b: any, e: Event) => {\n if (subscription) { subscription.event = e; }\n if (!this.hasWritePermission(pub)) { return; }\n const decrypted = await Key.decrypt(data, (await this.getTheirGroupSecret(pub)));\n if (decrypted) {\n callback(typeof decrypted.v !== `undefined` ? decrypted.v : decrypted, key, pub);\n }\n });\n }\n\n async onTheirGroup(key, callback, from) {\n if (typeof callback !== 'function') {\n throw new Error(`onTheir callback must be a function, got ${typeof callback}`);\n }\n if (!Object.prototype.hasOwnProperty.call(this.groupSubscriptions, key)) {\n this.groupSubscriptions[key] = [];\n }\n const subscription = {key, callback, from};\n this.groupSubscriptions[key].push(subscription);\n\n this.getParticipants(participants => {\n Object.keys(participants).forEach(async pub => {\n if (from && pub !== from) { return; }\n if (!(participants[pub] && participants[pub].write)) { return; }\n this._onTheirGroupFromUser(pub, key, callback, subscription);\n });\n });\n }\n\n /**\n * Set typing status\n */\n setTyping(isTyping, timeout = 5) {\n isTyping = typeof isTyping === `undefined` ? true : isTyping;\n timeout = timeout * 1000;\n this.put(`typing`, isTyping ? new Date().toISOString() : new Date(0).toISOString());\n clearTimeout(this.setTypingTimeout);\n this.setTypingTimeout = setTimeout(() => this.put(`typing`, false), timeout);\n }\n\n /**\n * Get typing status\n */\n getTyping(callback, timeout = 5) { // TODO callback not called on setTyping(false), at least for self chat\n timeout = timeout * 1000;\n this.onTheir(`typing`, (typing, key, pub) => {\n if (callback) {\n const isTyping = typing && new Date() - new Date(typing) <= timeout;\n callback(isTyping, pub);\n this.getTypingTimeouts = this.getTypingTimeouts || {};\n clearTimeout(this.getTypingTimeouts[pub]);\n if (isTyping) {\n this.getTypingTimeouts[pub] = setTimeout(() => callback(false, pub), timeout);\n }\n }\n });\n }\n\n /**\n * Get a simple link that points to the channel.\n *\n * Direct channel: both users need to give their simple links. Use createChatLink() to get a two-way link that needs to be given by one user only.\n *\n * Group channel: Works only if the link recipient has been already added onto the channel participants list.\n */\n getSimpleLink(urlRoot = 'https://iris.to/') {\n if (this.uuid) {\n return `${urlRoot}?channelId=${this.uuid}&inviter=${session.getKey().pub}`;\n }\n return `${urlRoot}?chatWith=${this.getCurrentParticipants()[0]}`;\n }\n\n /**\n *\n */\n async getChatLinks(opts: any = {}) {\n let {callback, urlRoot, subscribe} = opts;\n urlRoot = urlRoot || 'https://iris.to/';\n if (!this.uuid) { throw new Error('Only group channels may have chat links'); }\n const chatLinks: any[] = [];\n const chatLinkSubscriptions = {};\n this.on('chatLinks', (links: any, from: string) => {\n // TODO: check admin permissions\n if (!links || typeof links !== 'object') { return; }\n Object.keys(links).forEach(linkId => {\n const link = links[linkId];\n if (link === null) {\n chatLinkSubscriptions[linkId] && chatLinkSubscriptions[linkId].off(); // unsubscribe removed chat link\n delete chatLinkSubscriptions[linkId];\n callback && callback({id: linkId, url: null});\n return;\n }\n if (chatLinks.indexOf(linkId) !== -1) { return; }\n const channels = [];\n chatLinks.push(linkId);\n const url = Channel.formatChatLink({urlRoot, inviter: from, channelId: this.uuid, sharedSecret: link.sharedSecret, linkId});\n callback && callback({url, id: linkId});\n if (subscribe) {\n publicState().user(link.sharedKey.pub).get('chatRequests').map(async (encPub, requestId, a, e) => {\n if (!encPub || typeof encPub !== 'string' || encPub.length < 10) { return; }\n chatLinkSubscriptions[linkId] = e;\n const s = JSON.stringify(encPub);\n if (channels.indexOf(s) === -1) {\n channels.push(s);\n const pub = await Key.decrypt(encPub, link.sharedSecret);\n this.addParticipant(pub, undefined, undefined, true);\n }\n });\n }\n });\n });\n }\n\n async createChatLink(urlRoot = 'https://iris.to/') {\n const sharedKey = await Key.generate();\n const sharedKeyString = JSON.stringify(sharedKey);\n const sharedSecret = await Key.secret(sharedKey.epub, sharedKey);\n const encryptedSharedKey = await Key.encrypt(sharedKeyString, sharedSecret);\n const ownerSecret = await Key.secret(session.getKey().epub, session.getKey());\n const ownerEncryptedSharedKey = await Key.encrypt(sharedKeyString, ownerSecret);\n let linkId = await util.getHash(encryptedSharedKey);\n linkId = linkId.slice(0, 12);\n\n // User has to exist, in order for .get(chatRequests).on() to be ever triggered\n publicState(sharedKey).get('chatRequests').put({a: 1});\n\n this.chatLinks[linkId] = {sharedKey, sharedSecret};\n this.put('chatLinks', this.chatLinks);\n userState().get('chatLinks').get(linkId).put({encryptedSharedKey, ownerEncryptedSharedKey});\n\n return Channel.formatChatLink({urlRoot, channelId: this.uuid, inviter: session.getKey().pub, sharedSecret, linkId});\n }\n\n /**\n * Set the user's online/active status\n * @param {string} activity string: set the activity status every 3 seconds, null/false: stop updating\n */\n static setActivity(activity) {\n if (publicState().irisActivityStatus === activity) { return; }\n publicState().irisActivityStatus = activity;\n clearTimeout(publicState().setActivityTimeout);\n const update = () => {\n publicState().user().get(`activity`).put({status: activity, time: new Date().toISOString()});\n };\n update();\n function timerUpdate() {\n update();\n publicState().setActivityTimeout = setTimeout(timerUpdate, 3000);\n }\n if (activity) {\n timerUpdate();\n }\n }\n\n /**\n * Get the online status of a user.\n *\n * @param {string} pubKey public key of the user\n * @param {boolean} callback receives a boolean each time the user's online status changes\n */\n static getActivity(pubKey, callback) {\n let timeout;\n publicState().user(pubKey).get(`activity`).on(activity => {\n if (!activity || !(activity.time && activity.status)) { return; }\n clearTimeout(timeout);\n const now = new Date();\n const activityDate = new Date(activity.time);\n const isActive = activityDate > new Date(now.getTime() - 10 * 1000) && activityDate < new Date(now.getTime() + 30 * 1000);\n callback({isActive, lastActive: activity.time, status: activity.status});\n if (isActive) {\n timeout = setTimeout(() => callback({isOnline: false, lastActive: activity.time}), 10000);\n }\n });\n }\n\n static formatChatLink({urlRoot, chatWith, channelId, inviter, sharedSecret, linkId}) {\n const enc = encodeURIComponent;\n if (channelId && inviter) {\n return `${urlRoot}?channelId=${enc(channelId)}&inviter=${enc(inviter)}&s=${enc(sharedSecret)}&k=${enc(linkId)}`;\n }\n return `${urlRoot}?chatWith=${enc(chatWith)}&s=${enc(sharedSecret)}&k=${enc(linkId)}`;\n }\n\n /**\n * Creates a channel link that can be used for two-way communication, i.e. only one link needs to be exchanged.\n */\n static async createChatLink(urlRoot = 'https://iris.to/') {\n const user = publicState().user();\n const key = session.getKey();\n\n // We create a new Gun user whose private key is shared with the chat link recipients.\n // Chat link recipients can contact you by writing their public key to the shared key's user space.\n const sharedKey = await Key.generate();\n const sharedKeyString = JSON.stringify(sharedKey);\n const sharedSecret = await Key.secret(sharedKey.epub, sharedKey);\n const encryptedSharedKey = await Key.encrypt(sharedKeyString, sharedSecret);\n const ownerSecret = await Key.secret(key.epub, key);\n const ownerEncryptedSharedKey = await Key.encrypt(sharedKeyString, ownerSecret);\n let linkId = await util.getHash(encryptedSharedKey);\n linkId = linkId.slice(0, 12);\n\n // User has to exist, in order for .get(chatRequests).on() to be ever triggered\n publicState(sharedKey).get('chatRequests').put({a: 1}).get('chatRequests').put({a: 1});\n\n user.get('chatLinks').get(linkId).put({encryptedSharedKey, ownerEncryptedSharedKey});\n\n return Channel.formatChatLink({urlRoot, chatWith: key.pub, sharedSecret, linkId});\n }\n\n /**\n *\n */\n static async getMyChatLinks(urlRoot = 'https://iris.to/', callback: Function, subscribe = false) {\n const key = session.getKey();\n const user = publicState().user();\n const mySecret = await Key.secret(key.epub, key);\n const chatLinks = [];\n user.get('chatLinks').map((data, linkId) => {\n if (!data || chatLinks.indexOf(linkId) !== -1) { return; }\n const channels = [];\n user.get('chatLinks').get(linkId).get('ownerEncryptedSharedKey').on(async enc => {\n if (!enc || chatLinks.indexOf(linkId) !== -1) { return; }\n chatLinks.push(linkId);\n const sharedKey = await Key.decrypt(enc, mySecret);\n const sharedSecret = await Key.secret(sharedKey.epub, sharedKey);\n const url = Channel.formatChatLink({urlRoot, chatWith: key.pub, sharedSecret, linkId});\n if (callback) {\n callback({url, id: linkId});\n }\n if (subscribe) {\n publicState().user(sharedKey.pub).get('chatRequests').map(async (encPub, requestId) => {\n if (!encPub) { return; }\n const s = JSON.stringify(encPub);\n if (channels.indexOf(s) === -1) {\n channels.push(s);\n const pub = await Key.decrypt(encPub, sharedSecret);\n const channel = new Channel({key, participants: pub});\n channel.save();\n }\n publicState(sharedKey).get('chatRequests').get(requestId).put(null);\n });\n }\n });\n });\n }\n\n /**\n *\n */\n removeGroupChatLink(linkId) {\n this.chatLinks[linkId] = null;\n this.put('chatLinks', this.chatLinks);\n publicState().user().get('chatLinks').get(linkId).put(null);\n }\n\n /**\n *\n */\n static removePrivateChatLink(key, linkId) {\n publicState().user().auth(key);\n publicState().user().get('chatLinks').get(linkId).put(null);\n }\n\n /**\n *\n */\n static async deleteChannel(key, pub) {\n publicState().user().auth(key);\n const channelId = await Channel.getOurSecretChannelId(pub, key);\n publicState().user().get('channels').get(channelId).put(null);\n publicState().user().get('channels').get(channelId).off();\n }\n\n /**\n *\n */\n static async deleteGroup(key, uuid) {\n const mySecret = await Key.secret(key.epub, key);\n const mySecretHash = await util.getHash(mySecret);\n const mySecretUuid = await util.getHash(mySecretHash + uuid);\n publicState().user().auth(key);\n publicState().user().get('channels').get(mySecretUuid).put(null);\n publicState().user().get('channels').get(mySecretUuid).off();\n }\n}\n\nexport default Channel;\n","import Channel from './Channel';\nimport session from './session';\n\nconst channels = new Map();\n\n/**\n * Private channel that only you and publicKey can read/write.\n * @param publicKey\n * @returns {Channel}\n */\nexport default function(publicKey = session.getKey(), chatLink?: string): Channel {\n let channel = channels.get(publicKey);\n if (!channel) {\n channel = new Channel({participants: publicKey, chatLink})\n channels.set(publicKey, channel);\n }\n return channel;\n}","import Node from './db/Node';\n\nlet local: Node;\n\n/**\n * Get a state that is only synced in memory and local storage.\n *\n * Useful for storing things like UI state, local indexes or logged in user.\n * @returns {Node}\n */\nexport default function() {\n if (!local) {\n local = new Node('local');\n }\n return local;\n}","import local from './local';\n\nlet blockedUsers: { [key: string]: boolean } = {};\n\nexport default function() {\n if (!blockedUsers) {\n blockedUsers = {};\n local().get('block').map((isBlocked: boolean, user: string) => {\n if (isBlocked === blockedUsers[user]) { return; }\n if (isBlocked) {\n blockedUsers[user] = isBlocked;\n local().get('groups').map((_v: any, k: string) => {\n local().get('groups').get(k).get(user).put(false);\n });\n } else {\n delete blockedUsers[user];\n }\n });\n }\n return blockedUsers;\n}","import local from \"./local\";\nimport userSpace from './public';\nimport blockedUsers from './blockedUsers';\n\nlet counter = 0;\nconst cache = new Map>();\nconst callbacks = new Map();\n\ntype Event = {\n off: () => void;\n}\n\n/**\n * Aggregates public data from all users in the group.\n *\n * For example, the public message feed, message replies and likes are aggregated using this.\n * @param groupName\n * @returns object\n */\nexport default function(groupName = 'everyone') {\n return {\n get(path: string, callback: any) {\n const groupNode = local().get('groups').get(groupName);\n const follows: { [key: string]: boolean; } = {};\n requestAnimationFrame(() => {\n groupNode.map((isFollowing: any, user: string) => {\n if (blockedUsers()[user]) { return; } // TODO: allow to specifically query blocked users?\n if (follows[user] && follows[user] === isFollowing) { return; }\n follows[user] = isFollowing;\n if (isFollowing) { // TODO: callback on unfollow, for unsubscribe\n let node = userSpace(user);\n if (path && path !== '/') {\n node = path.split('/').reduce((sum:any, s:string) => sum.get(decodeURIComponent(s)), node);\n }\n callback(node, user);\n }\n });\n });\n },\n\n _cached_map(cached: Map | undefined, cacheKey: string, path: string, myEvent: Event, callback: Function) {\n if (!cached) {\n const cached = new Map();\n cache.set(cacheKey, cached);\n this.get(path, (node: any, from: string) => node.map((value: any, key: string, x: any) => {\n const item = {value, key, from};\n cached.set(key, item);\n for (let cb of callbacks.get(cacheKey).values()) {\n cb(value, key, x, myEvent, from);\n }\n }));\n } else {\n for (let item of cached.values()) {\n callback(item.value, item.key, 0, myEvent, item.from);\n }\n }\n },\n\n // TODO: this should probably store just the most recent value, not everyone's value\n // TODO: for counting of likes etc, use this.count() instead\n _cached_on(cached: Map | undefined, cacheKey: string, path: string, myEvent: Event, callback: Function) {\n if (!cached) {\n const cached = new Map();\n cache.set(cacheKey, cached);\n this.get(path, (node: any, from: string) => node.on((value: any, key: string, x: any) => {\n const item = {value, key, from};\n cached.set(from, item);\n for (let cb of callbacks.get(cacheKey).values()) {\n cb(value, key, x, myEvent, from);\n }\n }));\n } else {\n for (let item of cached.values()) {\n callback(item.value, item.key, 0, myEvent, item.from);\n }\n }\n },\n\n _cached_count(cached: Map | undefined, cacheKey: string, path: string, myEvent: Event, callback: Function) {\n if (!cached) {\n const cached = new Map();\n cache.set(cacheKey, cached);\n this.get(path, (node: any, from: string) => node.on((value: any, key: string) => {\n value ? cached.set(from, true) : cached.delete(from);\n const count = cached.size;\n for (let cb of callbacks.get(cacheKey).values()) {\n cb(count, key, null, myEvent, from);\n }\n }));\n } else {\n callback(cached.size, path.split('/').pop(), null, myEvent);\n }\n },\n\n _cached_fn(fn: string, path: string, callback: Function) {\n const cacheKey = `${fn}:${groupName}:${path}`;\n\n let callbackId = counter++;\n if (callbacks.has(cacheKey)) {\n callbacks.get(cacheKey).set(callbackId, callback);\n } else {\n callbacks.set(cacheKey, new Map([[callbackId, callback]]));\n }\n\n const myEvent = {off: () => {\n let myCallbacks = callbacks.get(cacheKey);\n myCallbacks && myCallbacks.delete(callbackId);\n }};\n\n const cached = cache.get(cacheKey);\n\n switch (fn) {\n case 'map':\n this._cached_map(cached, cacheKey, path, myEvent, callback);\n break;\n case 'on':\n this._cached_on(cached, cacheKey, path, myEvent, callback);\n break;\n case 'count':\n this._cached_count(cached, cacheKey, path, myEvent, callback);\n break;\n }\n },\n\n map(path: string, callback: Function) { // group queries are slow, so we cache them\n this._cached_fn('map', path, callback);\n },\n\n on(path: string, callback: Function) {\n this._cached_fn('on', path, callback);\n },\n\n count(path: string, callback: Function) {\n this._cached_fn('count', path, callback);\n }\n }\n}","// @ts-nocheck\n\nimport _ from './lodash';\nimport session from './session';\nimport util from './util';\nimport publicState from './global';\nimport privateState from './private';\nimport local from './local';\nimport group from './group';\nimport Key from './Key';\n\nconst NOTIFICATION_SERVICE_URL = 'https://iris-notifications.herokuapp.com/notify';\n// const notificationSound = new Audio('../../assets/audio/notification.mp3'); // TODO\nlet loginTime;\nlet unseenMsgsTotal = 0;\nlet unseenNotificationCount = 0;\nconst webPushSubscriptions = {};\n\nfunction desktopNotificationsEnabled() {\n return window.Notification && Notification.permission === 'granted';\n}\n\nfunction notifyMsg(msg, info, channelId, onClick) {\n function shouldNotify() {\n if (msg.timeObj < loginTime) { return false; }\n if (info.selfAuthored) { return false; }\n if (document.visibilityState === 'visible') { return false; }\n const channel = privateState(channelId);\n if (channel.notificationSetting === 'nothing') { return false; }\n if (channel.notificationSetting === 'mentions' && !msg.text.includes(session.getMyName())) { return false; }\n return true;\n }\n function shouldDesktopNotify() {\n if (!desktopNotificationsEnabled()) { return false; }\n return shouldNotify();\n }\n function shouldAudioNotify() {\n return shouldNotify();\n }\n if (shouldAudioNotify()) {\n //notificationSound.play(); // TODO\n }\n if (shouldDesktopNotify()) {\n let body, title;\n const channel = privateState(channelId);\n if (channel.uuid) {\n title = channel.participantProfiles[info.from].name;\n body = `${name}: ${msg.text}`;\n } else {\n title = 'Message'\n body = msg.text;\n }\n body = util.truncateString(body, 50);\n let desktopNotification = new Notification(title, { // TODO: replace with actual name\n icon: '/assets/img/icon128.png',\n body,\n silent: true\n });\n desktopNotification.onclick = function() {\n changeUnseenNotificationCount(-1);\n onClick && onClick();\n window.focus();\n };\n }\n}\n\nfunction changeChatUnseenMsgsCount(chatId, change) {\n const chat = privateState(chatId);\n if (!chat) return;\n const chatNode = local().get('channels').get(chatId);\n if (change) {\n unseenMsgsTotal += change;\n chat.unseen += change;\n } else {\n unseenMsgsTotal = unseenMsgsTotal - (chat.unseen || 0);\n chat.unseen = 0;\n }\n chatNode.get('unseen').put(chat.unseen);\n unseenMsgsTotal = unseenMsgsTotal >= 0 ? unseenMsgsTotal : 0;\n local().get('unseenMsgsTotal').put(unseenMsgsTotal);\n}\n\nconst publicVapidKey = 'BMqSvZArOIdn7vGkYplSpkZ70-Qt8nhYbey26WVa3LF3SwzblSzm3n3HHycpNkAKVq7MCkrzFuTFs_en7Y_J2MI';\n\nfunction urlBase64ToUint8Array(base64String) {\n const padding = '='.repeat((4 - base64String.length % 4) % 4);\n const base64 = (base64String + padding)\n .replace(/-/g, '+')\n .replace(/_/g, '/');\n\n const rawData = window.atob(base64);\n const outputArray = new Uint8Array(rawData.length);\n\n for (let i = 0; i < rawData.length; ++i) {\n outputArray[i] = rawData.charCodeAt(i);\n }\n return outputArray;\n}\n\nasync function subscribe(reg) {\n try {\n const subscription = await reg.pushManager.subscribe({\n userVisibleOnly: true,\n applicationServerKey: urlBase64ToUint8Array(publicVapidKey)\n });\n addWebPushSubscription(subscription);\n } catch (e) {\n console.error('web push subscription error', e);\n }\n}\n\nasync function subscribeToWebPush() {\n console.log('subscribing to web push', navigator.serviceWorker);\n if (!desktopNotificationsEnabled() || !navigator.serviceWorker) { return false; }\n await navigator.serviceWorker.ready;\n const reg = await navigator.serviceWorker.getRegistration();\n reg.active.postMessage({key: session.getKey()});\n const sub = await reg.pushManager.getSubscription();\n sub ? addWebPushSubscription(sub) : subscribe(reg);\n}\n\nconst addWebPushSubscriptionsToChats = _.debounce(() => {\n const arr = Object.values(webPushSubscriptions);\n session.channelIds.forEach(channelId => {\n privateState(channelId).put('webPushSubscriptions', arr);\n });\n}, 5000);\n\nfunction removeSubscription(hash) {\n delete webPushSubscriptions[hash];\n publicState().user().get('webPushSubscriptions').get(hash).put(null);\n addWebPushSubscriptionsToChats();\n}\n\nasync function addWebPushSubscription(s, saveToGun = true) {\n const myKey = session.getKey();\n const mySecret = await Key.secret(myKey.epub, myKey);\n const enc = await Key.encrypt(s, mySecret);\n const hash = await util.getHash(JSON.stringify(s));\n if (saveToGun) {\n publicState().user().get('webPushSubscriptions').get(hash).put(enc);\n }\n webPushSubscriptions[hash] = s;\n addWebPushSubscriptionsToChats();\n}\n\nasync function getWebPushSubscriptions() {\n const myKey = session.getKey();\n const mySecret = await Key.secret(myKey.epub, myKey);\n publicState().user().get('webPushSubscriptions').map(async enc => {\n if (!enc) { return; }\n const s = await Key.decrypt(enc, mySecret);\n addWebPushSubscription(s, false);\n });\n}\n\nfunction getEpub(user) {\n return new Promise(resolve => {\n publicState().user(user).get('epub').on(async (epub,k,x,e) => {\n if (epub) {\n e.off();\n resolve(epub);\n }\n });\n });\n}\n\nasync function getNotificationText(notification) {\n const profile = await publicState().user(notification.from).get('profile').once();\n const name = (profile && profile.name) || 'someone';\n const event = notification.event || notification.action;\n let eventText;\n if (event === 'like') eventText = `${name} liked your post`;\n else if (event === 'reply') eventText = `${name} replied to your post`;\n else if (event === 'mention') eventText = `${name} mentioned you in their post`;\n else if (event === 'follow') eventText = `${name} started following you`;\n else eventText = `${name} sent you a notification: ${event}`;\n return eventText;\n}\n\nfunction subscribeToIrisNotifications(onClick?: Function) {\n let notificationsSeenTime: any;\n let notificationsShownTime: any;\n publicState().user().get('notificationsSeenTime').on(v => {\n notificationsSeenTime = v;\n console.log(v);\n });\n publicState().user().get('notificationsShownTime').on(v => notificationsShownTime = v);\n const setNotificationsShownTime = _.debounce(() => {\n publicState().user().get('notificationsShownTime').put(new Date().toISOString());\n }, 1000);\n const alreadyHave = new Set();\n group().on(`notifications/${session.getPubKey()}`, async (encryptedNotification, k, x, e, from) => {\n const id = from.slice(0,30) + encryptedNotification.slice(0,30);\n if (alreadyHave.has(id)) { return; }\n alreadyHave.add(id);\n const epub = await getEpub(from);\n const secret = await Key.secret(epub, session.getKey());\n const notification = await Key.decrypt(encryptedNotification, secret);\n if (!notification || typeof notification !== 'object') { return; }\n setNotificationsShownTime();\n notification.from = from;\n local().get('notifications').get(notification.time).put(notification);\n if (!notificationsSeenTime || (notificationsSeenTime < notification.time)) {\n changeUnseenNotificationCount(1);\n }\n if (!notificationsShownTime || notificationsShownTime < notification.time) {\n console.log('was new!');\n const text = await getNotificationText(notification);\n let desktopNotification = new Notification(text, {\n icon: '/assets/img/icon128.png',\n body: text,\n silent: true\n });\n desktopNotification.onclick = function() {\n const link = notification.target ? `/post/${notification.target}` : `/profile/${notification.from}`;\n onClick && onClick(link);\n changeUnseenNotificationCount(-1);\n window.focus();\n };\n }\n });\n}\n\nfunction changeUnseenNotificationCount(change) {\n if (!change) {\n unseenNotificationCount = 0;\n publicState().user().get('notificationsSeenTime').put(new Date().toISOString());\n } else {\n unseenNotificationCount += change;\n unseenNotificationCount = Math.max(unseenNotificationCount, 0);\n }\n local().get('unseenNotificationCount').put(unseenNotificationCount);\n}\n\nasync function sendIrisNotification(recipient, notification) {\n if (!(recipient && notification)) { return; } // TODO: use typescript or sth :D\n if (typeof notification === 'object') { notification.time = new Date().toISOString() }\n const epub = await getEpub(recipient);\n const secret = await Key.secret(epub, session.getKey());\n const enc = await Key.encrypt(notification, secret);\n publicState().user().get('notifications').get(recipient).put(enc);\n}\n\nasync function sendWebPushNotification(recipient, notification) {\n console.log('sending web push notification to', recipient, notification);\n const channel = privateState(recipient);\n const myKey = session.getKey();\n const shouldWebPush = (recipient === myKey.pub) || !(channel.activity && channel.activity.isActive);\n if (shouldWebPush && channel.webPushSubscriptions) {\n const subscriptions = [];\n const participants = Object.keys(channel.webPushSubscriptions);\n for (let i = 0; i < participants.length; i++) {\n const participant = participants[i];\n const secret = await channel.getSecret(participant);\n const payload = {\n title: await Key.encrypt(notification.title, secret),\n body: await Key.encrypt(notification.body, secret),\n from:{pub: myKey.pub, epub: myKey.epub}\n };\n channel.webPushSubscriptions[participant].forEach(s => {\n if (s && s.endpoint) {\n subscriptions.push({subscription: s, payload});\n }\n });\n }\n if (subscriptions.length === 0) {return;}\n fetch(NOTIFICATION_SERVICE_URL, {\n method: 'POST',\n body: JSON.stringify({subscriptions}),\n headers: {\n 'content-type': 'application/json'\n }\n }).catch(() => {});\n }\n}\n\nfunction init() {\n loginTime = new Date();\n unseenMsgsTotal = 0;\n}\n\nexport default {init, notifyMsg, getNotificationText, sendWebPushNotification, changeUnseenNotificationCount, subscribeToIrisNotifications, sendIrisNotification, changeChatUnseenCount: changeChatUnseenMsgsCount, webPushSubscriptions, subscribeToWebPush, getWebPushSubscriptions, removeSubscription};\n","import util from \"./util\";\nimport Node from \"./db/Node\";\n\n// TODO config {peers: ['http://localhost:8768/gun'], file: 'State.electron', multicast:false, localStorage: false}\nconst electron = util.isElectron ? new Node('electron').get('state') : null;\n\nexport default electron;","// @ts-nocheck\nimport Key from './Key';\nimport notifications from './notifications';\nimport Channel from './Channel';\nimport util from './util';\nimport _ from './lodash';\nimport Fuse from \"fuse.js\";\nimport local from './local';\nimport electron from './electron';\nimport user from './public';\nimport privateState from './private';\nimport blockedUsers from './blockedUsers';\n\nlet key: any;\nlet myName: string;\nlet latestChatLink: string;\nlet onlineTimeout: any;\nlet ourActivity: any;\nlet noFollows: boolean;\nlet noFollowers: boolean;\nlet searchIndex: any;\nlet initCalled: boolean;\nconst searchableItems: any = {};\nconst getExtendedFollowsCalled = new Map();\n\nconst DEFAULT_FOLLOW = 'hyECQHwSo7fgr2MVfPyakvayPeixxsaAWVtZ-vbaiSc.TXIp8MnCtrnW6n2MrYquWPcc-DTmZzMBmc2yaGv9gIU';\n\nconst DEFAULT_SETTINGS = {\n electron: {\n openAtLogin: true,\n minimizeOnClose: true\n },\n local: {\n enableWebtorrent: !util.isMobile,\n enablePublicPeerDiscovery: true,\n autoplayWebtorrent: true,\n maxConnectedPeers: util.isElectron ? 2 : 1\n }\n};\n\n/**\n * User session management utilities.\n */\nexport default {\n /**\n * Log in with a key from localStorage.\n *\n * If no key is found and options.autologin is not false, a new user will be created.\n *\n * If options.autofollow is not false, the default follow will be added.\n * @param options\n */\n init(options: any = {}) {\n if (initCalled) { return; }\n initCalled = true;\n let localStorageKey = localStorage.getItem('chatKeyPair');\n console.log('localStorageKey', localStorageKey);\n if (localStorageKey) {\n this.login(JSON.parse(localStorageKey));\n } else if (options.autologin !== false) {\n this.loginAsNewUser(options);\n } else {\n this.clearIndexedDB();\n }\n setTimeout(() => {\n local().get('block').map(() => {\n this.updateSearchIndex();\n });\n this.updateSearchIndex();\n });\n setInterval(() => {\n if (this.taskQueue.length) {\n //console.log('this.taskQueue', this.taskQueue.length);\n const t = this.taskQueue.shift();\n t && t();\n }\n }, 10);\n },\n\n DEFAULT_SETTINGS,\n DEFAULT_FOLLOW,\n\n taskQueue: [] as any[],\n\n updateSearchIndex: _.throttle(() => {\n const options = {keys: ['name'], includeScore: true, includeMatches: true, threshold: 0.3};\n const values = Object.values(_.omit(searchableItems, Object.keys(blockedUsers())));\n searchIndex = new Fuse(values, options);\n local().get('searchIndexUpdated').put(true);\n }, 2000, {leading:true}),\n\n saveSearchResult: _.throttle(k => {\n local().get('contacts').get(k).put({followDistance: searchableItems[k].followDistance,followerCount: searchableItems[k].followers.size});\n }, 1000, {leading:true}),\n\n addFollow(callback: Function, k: string, followDistance: number, follower?: string) {\n if (searchableItems[k]) {\n if (searchableItems[k].followDistance > followDistance) {\n searchableItems[k].followDistance = followDistance;\n }\n follower && searchableItems[k].followers.add(follower);\n } else {\n searchableItems[k] = {key: k, followDistance, followers: new Set(follower && [follower])};\n this.taskQueue.push(() => {\n user(k).get('profile').get('name').on((name: string) => {\n searchableItems[k].name = name;\n local().get('contacts').get(k).get('name').put(name);\n callback && callback(k, searchableItems[k]);\n });\n });\n }\n this.saveSearchResult(k);\n callback && callback(k, searchableItems[k]);\n this.updateSearchIndex();\n this.updateNoFollows();\n this.updateNoFollowers();\n },\n\n removeFollow(k: string, followDistance: number, follower: string) {\n if (followDistance === 1) {\n local().get('contacts').get(k).put(false);\n local().get('groups').get('follows').get(k).put(false);\n if (searchableItems[k]) {\n searchableItems[k].followers.delete(follower);\n this.updateNoFollows();\n this.updateNoFollowers();\n }\n }\n if (searchableItems[k] && searchableItems[k].followers.size === 0) {\n delete searchableItems[k];\n local().get('contacts').get(k).put(false);\n local().get('groups').get('everyone').get(k).put(false);\n }\n },\n\n getExtendedFollows(callback: Function, k = key.pub, maxDepth = 3, currentDepth = 1) {\n const called = getExtendedFollowsCalled.get(k);\n if (called && called <= currentDepth) {\n return;\n }\n getExtendedFollowsCalled.set(k, currentDepth);\n\n this.addFollow(callback, k, currentDepth - 1);\n\n user(k).get('follow').map((isFollowing: boolean, followedKey: string) => { // TODO: unfollow\n if (isFollowing) {\n this.addFollow(callback, followedKey, currentDepth, k);\n if (currentDepth < maxDepth) {\n this.taskQueue.push(() => this.getExtendedFollows(callback, followedKey, maxDepth, currentDepth + 1));\n }\n } else {\n this.removeFollow(followedKey, currentDepth, k);\n }\n });\n\n return searchableItems;\n },\n\n updateNoFollows: _.throttle(() => {\n const v = Object.keys(searchableItems).length <= 1;\n if (v !== noFollows) {\n noFollows = v;\n local().get('noFollows').put(noFollows);\n }\n }, 1000, {leading:true}),\n\n updateNoFollowers: _.throttle(() => {\n const v = !(searchableItems[key.pub] && (searchableItems[key.pub].followers.size > 0));\n if (v !== noFollowers) {\n noFollowers = v;\n local().get('noFollowers').put(noFollowers);\n }\n }, 1000, {leading:true}),\n\n getSearchIndex() {\n return searchIndex;\n },\n\n setOurOnlineStatus() {\n const activeRoute = window.location.hash;\n Channel.setActivity(ourActivity = 'active');\n const setActive = _.debounce(() => {\n const chatId = activeRoute && activeRoute.replace('#/profile/','').replace('#/chat/','');\n const chat = privateState(chatId);\n if (chat && !ourActivity) {\n chat.setMyMsgsLastSeenTime();\n }\n Channel.setActivity(ourActivity = 'active');\n clearTimeout(onlineTimeout);\n onlineTimeout = setTimeout(() => Channel.setActivity(ourActivity = 'online'), 30000);\n }, 1000);\n document.addEventListener(\"touchmove\", setActive);\n document.addEventListener(\"mousemove\", setActive);\n document.addEventListener(\"keypress\", setActive);\n document.addEventListener(\"visibilitychange\", () => {\n if (document.visibilityState === 'visible') {\n Channel.setActivity(ourActivity = 'active');\n const chatId = location.pathname.slice(1).replace('chat/','');\n const chat = activeRoute && privateState(chatId);\n if (chat) {\n chat.setMyMsgsLastSeenTime();\n notifications.changeChatUnseenCount(chatId, 0);\n }\n } else {\n Channel.setActivity(ourActivity = 'online');\n }\n });\n setActive();\n window.addEventListener(\"beforeunload\", () => {\n Channel.setActivity(ourActivity = null);\n });\n },\n\n updateGroups() {\n this.getExtendedFollows((k: string, info: any) => {\n if (info.followDistance <= 1) {\n local().get('groups').get('follows').get(k).put(true);\n }\n local().get('groups').get('everyone').get(k).put(true);\n if (k === this.getPubKey()) {\n this.updateNoFollowers();\n }\n });\n },\n\n /**\n * Log in with a private key.\n * @param key\n */\n login(k: any) {\n console.log('login', k);\n const shouldRefresh = !!key;\n console.log('shouldRefresh', shouldRefresh, 'key', key);\n key = k;\n localStorage.setItem('chatKeyPair', JSON.stringify(k));\n user().auth(key);\n user().put({epub: key.epub});\n notifications.subscribeToWebPush();\n notifications.getWebPushSubscriptions();\n //notifications.subscribeToIrisNotifications();\n Channel.getMyChatLinks( undefined, (chatLink: any) => {\n local().get('chatLinks').get(chatLink.id).put(chatLink.url);\n latestChatLink = chatLink.url;\n });\n this.setOurOnlineStatus();\n Channel.getChannels( (c: Channel) => this.addChannel(c));\n user().get('profile').get('name').on((name: any) => {\n if (name && typeof name === 'string') {\n myName = name;\n }\n });\n // a lot of this is iris-messenger stuff\n notifications.init();\n local().get('loggedIn').put(true);\n console.log('local().get(\\'loggedIn\\').put(true);', local());\n local().get('settings').once().then(settings => {\n if (!settings) {\n local().get('settings').put(DEFAULT_SETTINGS.local);\n } else if (settings.enableWebtorrent === undefined || settings.autoplayWebtorrent === undefined) {\n local().get('settings').get('enableWebtorrent').put(DEFAULT_SETTINGS.local.enableWebtorrent);\n local().get('settings').get('autoplayWebtorrent').put(DEFAULT_SETTINGS.local.autoplayWebtorrent);\n }\n });\n user().get('block').map((isBlocked: boolean, user: string) => {\n local().get('block').get(user).put(isBlocked);\n if (isBlocked) {\n delete searchableItems[user];\n }\n });\n this.updateGroups();\n if (shouldRefresh) {\n location.reload();\n }\n if (electron) {\n electron.get('settings').on(electron => {\n local().get('settings').get('electron').put(electron);\n });\n electron.get('user').put(key.pub);\n }\n local().get('filters').get('group').once().then(v => {\n if (!v) {\n local().get('filters').get('group').put('follows');\n }\n });\n },\n\n\n\n /**\n * Create a new user account and log in.\n * @param options {Object} - Options for the new account.\n * @returns {Promise<*>}\n */\n loginAsNewUser(options: any = {}) {\n const name = options.name || util.generateName();\n console.log('loginAsNewUser name', name);\n return Key.generate().then(k => {\n this.login(k);\n user().get('profile').put({a:null});\n user().get('profile').get('name').put(name);\n local().get('filters').put({a:null});\n local().get('filters').get('group').put('follows');\n Channel.createChatLink().then(l => latestChatLink = l);\n setTimeout(() => {\n if (options.autofollow !== false) {\n console.log('autofollowing', DEFAULT_FOLLOW);\n user().get('follow').get(DEFAULT_FOLLOW).put(true);\n }\n }, 1000); // maybe wait for login return instead\n });\n },\n\n /**\n * Log out the current user.\n * @returns {Promise}\n */\n async logOut() {\n if (electron) {\n electron.get('user').put(null);\n }\n // TODO: remove subscription from your channels\n if (navigator.serviceWorker) {\n const reg = await navigator.serviceWorker.getRegistration();\n if (reg && reg.pushManager) {\n reg.active?.postMessage({key: null});\n const sub = await reg.pushManager.getSubscription();\n if (sub) {\n const hash = await util.getHash(JSON.stringify(sub));\n notifications.removeSubscription(hash);\n sub.unsubscribe && sub.unsubscribe();\n }\n }\n }\n this.clearIndexedDB();\n localStorage.clear(); // TODO clear only iris data\n window.location.hash = '';\n window.location.href = '/';\n location.reload();\n },\n\n clearIndexedDB() {\n return new Promise(resolve => {\n const r1 = window.indexedDB.deleteDatabase('local()');\n const r2 = window.indexedDB.deleteDatabase('radata');\n let r1done = false;\n let r2done = false;\n const check = () => {\n r1done && r2done && resolve(undefined);\n }\n r1.onerror = r2.onerror = e => console.error(e);\n //r1.onblocked = r2.onblocked = e => console.error('blocked', e);\n r1.onsuccess = () => {\n r1done = true;\n check();\n }\n r2.onsuccess = () => {\n r2done = true;\n check();\n }\n });\n },\n\n getMyChatLink() {\n return latestChatLink || util.getProfileLink(key.pub);\n },\n\n /**\n * Get the keypair of the logged in user.\n * @returns {*}\n */\n getKey() { return key; },\n\n /**\n * Get the public key of the logged in user.\n * @returns {*}\n */\n getPubKey() {\n return key && key.pub;\n },\n\n /**\n * Get the name of the logged in user.\n * @returns {*}\n */\n getMyName() { return myName; }, // TODO maybe remove and use iris.user().get('profile').get('name') instead?\n\n myPeerUrl: (ip: string) => `http://${ip}:8767/gun`,\n\n async shareMyPeerUrl(channel: Channel) {\n const myIp = await local().get('settings').get('electron').get('publicIp').once();\n myIp && channel.put && channel.put('my_peer', this.myPeerUrl(myIp));\n },\n\n newChannel(pub: string, chatLink?: string) {\n if (!pub || this.channelIds.has(pub)) {\n return;\n }\n const chat = privateState(pub, chatLink);\n this.addChannel(chat);\n return chat;\n },\n\n addChannel(chat: Channel) {\n this.taskQueue.push(() => {\n let pub = chat.getId();\n if (this.channelIds.has(pub)) { return; }\n this.channelIds.add(pub);\n const chatNode = local().get('channels').get(pub);\n chatNode.get('latestTime').on((t: string) => {\n if (t && (!chat.latestTime || t > chat.latestTime)) {\n chat.latestTime = t;\n } else {\n // chatNode.get('latestTime').put(chat.latestTime); // omg recursion\n }\n });\n chatNode.get('theirMsgsLastSeenTime').on((t: string) => {\n if (!t) { return; }\n const d = new Date(t);\n if (!chat.theirMsgsLastSeenDate || chat.theirMsgsLastSeenDate < d) {\n chat.theirMsgsLastSeenDate = d;\n }\n });\n chat.getLatestMsg && chat.getLatestMsg((latest: any, info: any) => {\n this.processMessage(pub, latest, info);\n });\n notifications.changeChatUnseenCount(pub, 0);\n chat.notificationSetting = 'all';\n chat.onMy('notificationSetting', (val: any) => {\n chat.notificationSetting = val;\n });\n //$(\".chat-list\").append(el);\n chat.theirMsgsLastSeenTime = '';\n chat.getTheirMsgsLastSeenTime((time: any) => {\n if (chat && time && time >= chat.theirMsgsLastSeenTime) {\n chat.theirMsgsLastSeenTime = time;\n chatNode.get('theirMsgsLastSeenTime').put(time);\n }\n });\n chat.getMyMsgsLastSeenTime((time: any) => {\n chat.myLastSeenTime = new Date(time);\n if (chat.latest && chat.myLastSeenTime >= chat.latest.time) {\n notifications.changeChatUnseenCount(pub, 0);\n }\n });\n chat.isTyping = false;\n chat.getTyping(isTyping => {\n chat.isTyping = isTyping;\n local().get('channels').get(pub).get('isTyping').put(isTyping);\n });\n chat.online = {};\n Channel.getActivity(pub, (activity) => {\n if (chat) {\n chatNode.put({theirLastActiveTime: activity && activity.lastActive, activity: activity && activity.isActive && activity.status});\n chat.activity = activity;\n }\n });\n if (chat.uuid) {\n let isDarkMode = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches;\n chat.participantProfiles = {};\n chat.on('name', v => {\n chat.name = v;\n searchableItems[chat.uuid] = {name: v, uuid: chat.uuid};\n local().get('channels').get(chat.uuid).get('name').put(v);\n });\n chat.on('photo', v => {\n searchableItems[chat.uuid] = searchableItems[chat.uuid] || {};\n searchableItems[chat.uuid].photo = v;\n local().get('channels').get(chat.uuid).get('photo').put(v)\n });\n chat.on('about', v => local().get('channels').get(chat.uuid).get('about').put(v));\n chat.getParticipants(participants => {\n delete participants.undefined; // TODO fix where it comes from\n if (typeof participants === 'object') {\n let keys = Object.keys(participants);\n keys.forEach((k, i) => {\n let hue = 360 / Math.max(keys.length, 2) * i; // TODO use css filter brightness\n chat.participantProfiles[k] = {permissions: participants[k], color: `hsl(${hue}, 98%, ${isDarkMode ? 80 : 33}%)`};\n user(k).get('profile').get('name').on(name => {\n chat.participantProfiles[k].name = name;\n });\n });\n }\n local().get('channels').get(chat.uuid).get('participants').put(participants);\n });\n chat.inviteLinks = {};\n chat.getChatLinks({callback: ({url, id}) => {\n console.log('got chat link', id, url);\n chat.inviteLinks[id] = url; // TODO use State\n local().get('inviteLinksChanged').put(true);\n }});\n } else {\n // TODO do we want this?\n user(pub).get('profile').get('name').on(v => local().get('channels').get(pub).get('name').put(v))\n }\n if (chat.put) {\n chat.onTheir('webPushSubscriptions', (s, k, from) => {\n if (!Array.isArray(s)) { return; }\n chat.webPushSubscriptions = chat.webPushSubscriptions || {};\n chat.webPushSubscriptions[from || pub] = s;\n });\n const arr = Object.values(notifications.webPushSubscriptions);\n setTimeout(() => chat.put('webPushSubscriptions', arr), 5000);\n this.shareMyPeerUrl(chat);\n }\n chat.onTheir('call', call => {\n local().get('call').put({pub, call});\n });\n local().get('channels').get(pub).put({enabled:true});\n /* Disable private peer discovery, since they're not connecting anyway\n if (chat.onTheir) {\n chat.onTheir('my_peer', (url, k, from) => {\n console.log('Got private peer url', url, 'from', from);\n peers.addPeer({url, from})\n });\n }\n */\n\n });\n },\n\n // TODO: should perhaps be in Channel\n processMessage(chatId: string, msg: any, info: any, onClickNotification?: Function) {\n const chat = privateState(chatId);\n chat.messageIds = chat.messageIds || {};\n if (chat.messageIds[msg.time + info.from]) return;\n chat.messageIds[msg.time + info.from] = true;\n if (info) {\n msg = Object.assign(msg, info);\n }\n if (msg.invite) {\n const chatLink = `https://iris.to/?channelId=${msg.invite.group}&inviter=${chatId}`;\n this.newChannel(msg.invite.group, chatLink);\n return;\n }\n msg.selfAuthored = info.selfAuthored;\n local().get('channels').get(chatId).get('msgs').get(msg.time + (msg.from && msg.from.slice(0, 10))).put(JSON.stringify(msg));\n msg.timeObj = new Date(msg.time);\n if (!info.selfAuthored && msg.timeObj > chat.myLastSeenTime) {\n if (window.location.hash !== `#/chat/${ chatId}` || document.visibilityState !== 'visible') {\n notifications.changeChatUnseenCount(chatId, 1);\n } else if (ourActivity === 'active') {\n chat.setMyMsgsLastSeenTime();\n }\n }\n if (!info.selfAuthored && msg.time > chat.theirMsgsLastSeenTime) {\n local().get('channels').get(chatId).get('theirMsgsLastSeenTime').put(msg.time);\n }\n if (!chat.latestTime || (msg.time > chat.latestTime)) {\n local().get('channels').get(chatId).put({\n latestTime: msg.time,\n latest: {time: msg.time, text: msg.text, selfAuthored: info.selfAuthored}\n });\n }\n // TODO: onclickNotification should do route(`/chat/${ pub}`);\n notifications.notifyMsg(msg, info, chatId, onClickNotification);\n },\n\n subscribeToMsgs(pub) {\n const c = privateState(pub);\n if (c.subscribed) { return; }\n c.subscribed = true;\n c.getMessages((msg, info) => {\n this.processMessage(pub, msg, info);\n });\n },\n\n /**\n * Known private channels with other users\n */\n channelIds: new Set(),\n};\n","import publicSpace from './global';\nimport util from './util';\n\n/**\n * Content-addressed storage\n */\nexport default {\n /**\n * Get a file identified by its hash\n * @param hash\n * @param callback\n * @returns {Promise}\n */\n get(hash: string, callback: Function) {\n return new Promise((resolve, reject) => {\n if (!hash) {\n reject('No hash provided');\n }\n if (typeof hash !== 'string') {\n reject('Hash must be a string');\n }\n publicSpace().get('#').get(hash).on((v: any, _k: string, _x: any, e: any) => {\n if (v) {\n e.off();\n callback && callback(v);\n resolve(v);\n }\n });\n });\n },\n\n /**\n * Store a file and return its hash\n * @param value\n * @returns {Promise}\n */\n async put(value: any) {\n const hash = await util.getHash(value);\n publicSpace().get('#').get(hash).put(value);\n return hash;\n }\n}","// @ts-nocheck\n\n/*jshint unused: false */\n`use strict`;\nimport util from './util';\nimport Attribute from './Attribute';\nimport Key from './Key';\n\nconst errorMsg = `Invalid message:`;\n\nclass ValidationError extends Error {}\n\n/**\n* Signed message object. Your friends can index and relay your messages, while others can still verify that they were signed by you.\n*\n* Fields: signedData, signer (public key) and signature.\n*\n* signedData has an author, signer, type, time and optionally other fields.\n*\n* signature covers the utf8 string representation of signedData. Since messages are digitally signed, users only need to care about the message signer and not who relayed it or whose index it was found from.\n*\n* signer is the entity that verified its origin. In other words: message author and signer can be different entities, and only the signer needs to use Iris.\n*\n* For example, a crawler can import and sign other people's messages from Twitter. Only the users who trust the crawler will see the messages.\n*\n* Constructor: creates a message from the param obj.signedData that must contain at least the mandatory fields: author, type and time.\n* @param obj\n*\n*/\nclass SignedMessage {\n signedData: any;\n pubKey: any;\n sig: any;\n\n constructor(obj: any) {\n this.signedData = obj.signedData;\n this.pubKey = obj.pubKey;\n if (obj.sig) {\n if (typeof obj.sig !== `string`) {\n throw new ValidationError(`SignedMessage signature must be a string`);\n }\n this.sig = obj.sig;\n this.getHash();\n }\n this._validate();\n }\n\n getSignerKeyID() {\n return this.pubKey; // hack until gun supports keyID lookups\n //return util.getHash(this.pubKey);\n }\n\n _validate() {\n if (!this.signedData) {throw new ValidationError(`${errorMsg} Missing signedData`);}\n if (typeof this.signedData !== `object`) {throw new ValidationError(`${errorMsg} signedData must be an object`);}\n const d = this.signedData;\n\n if (!d.type) {throw new ValidationError(`${errorMsg} Missing type definition`);}\n if (!d.author) {throw new ValidationError(`${errorMsg} Missing author`);}\n if (typeof d.author !== `object`) {throw new ValidationError(`${errorMsg} Author must be object`);}\n if (Array.isArray(d.author)) {throw new ValidationError(`${errorMsg} Author must not be an array`);}\n if (Object.keys(d.author).length === 0) {throw new ValidationError(`${errorMsg} Author empty`);}\n if (this.pubKey) {\n this.signerKeyHash = this.getSignerKeyID();\n }\n for (const attr in d.author) {\n const t = typeof d.author[attr];\n if (t !== `string`) {\n if (Array.isArray(d.author[attr])) {\n for (let i = 0;i < d.author[attr].length;i++) {\n if (typeof d.author[attr][i] !== `string`) {throw new ValidationError(`${errorMsg} Author attribute must be string, got ${attr}: [${d.author[attr][i]}]`);}\n if (d.author[attr][i].length === 0) {\n throw new ValidationError(`${errorMsg} author ${attr} in array[${i}] is empty`);\n }\n }\n } else {\n throw new ValidationError(`${errorMsg} Author attribute must be string or array, got ${attr}: ${d.author[attr]}`);\n }\n }\n if (attr === `keyID`) {\n if (t !== `string`) {throw new ValidationError(`${errorMsg} Author keyID must be string, got ${t}`);}\n if (this.signerKeyHash && d.author[attr] !== this.signerKeyHash) {throw new ValidationError(`${errorMsg} If message has a keyID author, it must be signed by the same key`);}\n }\n }\n if (d.recipient) {\n if (typeof d.recipient !== `object`) {throw new ValidationError(`${errorMsg} Recipient must be object`);}\n if (Array.isArray(d.recipient)) {throw new ValidationError(`${errorMsg} Recipient must not be an array`);}\n if (Object.keys(d.recipient).length === 0) {throw new ValidationError(`${errorMsg} Recipient empty`);}\n for (const attr in d.recipient) {\n const t = typeof d.recipient[attr];\n if (t !== `string`) {\n if (Array.isArray(d.recipient[attr])) {\n for (let i = 0;i < d.recipient[attr].length;i++) {\n if (typeof d.recipient[attr][i] !== `string`) {throw new ValidationError(`${errorMsg} Recipient attribute must be string, got ${attr}: [${d.recipient[attr][i]}]`);}\n if (d.recipient[attr][i].length === 0) {\n throw new ValidationError(`${errorMsg} recipient ${attr} in array[${i}] is empty`);\n }\n }\n } else {\n throw new ValidationError(`${errorMsg} Recipient attribute must be string or array, got ${attr}: ${d.recipient[attr]}`);\n }\n }\n }\n }\n if (!(d.time || d.timestamp)) {throw new ValidationError(`${errorMsg} Missing time field`);}\n\n if (!Date.parse(d.time || d.timestamp)) {throw new ValidationError(`${errorMsg} Invalid time field`);}\n\n return true;\n }\n\n /**\n * @param {Object} key keypair to sign the message with\n */\n async sign(key) {\n this.sig = await Key.sign(this.signedData, key);\n this.pubKey = key.pub;\n await this.getHash();\n return true;\n }\n\n /**\n * Create an iris message. SignedMessage time is automatically set. If signingKey is specified and author omitted, signingKey will be used as author.\n * @param {Object} signedData message data object including author, recipient and other possible attributes\n * @param {Object} signingKey optionally, you can set the key to sign the message with\n * @returns {Promise} message\n */\n static async create(signedData, signingKey) {\n if (!signedData.author && signingKey) {\n signedData.author = {keyID: Key.getId(signingKey)};\n }\n signedData.time = signedData.time || (new Date()).toISOString();\n const m = new SignedMessage({signedData});\n if (signingKey) {\n await m.sign(signingKey);\n }\n return m;\n }\n\n getAuthor(index) {\n for (const a of this.getAuthorIterable()) {\n if (a.isUniqueType()) {\n return index.getContacts(a);\n }\n }\n }\n\n getRecipient(index) {\n if (!this.signedData.recipient) {\n return undefined;\n }\n for (const a of this.getRecipientIterable()) {\n if (a.isUniqueType()) {\n return index.getContacts(a);\n }\n }\n }\n\n /**\n * @returns {string} base64 sha256 hash of message\n */\n async getHash() {\n if (this.sig && !this.hash) {\n this.hash = await util.getHash(this.sig);\n }\n return this.hash;\n }\n\n getId() {\n return this.getHash();\n }\n\n static async fromSig(obj) {\n if (!obj.sig) {\n throw new Error(`Missing signature in object:`, obj);\n }\n if (!obj.pubKey) {\n throw new Error(`Missing pubKey in object:`);\n }\n //const signedData = await Key.verify(obj.sig, obj.pubKey); // disable sig verification while migrating to new gun :(\n const signedData = JSON.parse(obj.sig.slice(4)).m;\n const o = {signedData, sig: obj.sig, pubKey: obj.pubKey};\n return new SignedMessage(o);\n }\n\n /**\n * @return {boolean} true if message signature is valid. Otherwise throws ValidationError.\n */\n async verify() {\n if (!this.pubKey) {\n throw new ValidationError(`${errorMsg} SignedMessage has no .pubKey`);\n }\n if (!this.sig) {\n throw new ValidationError(`${errorMsg} SignedMessage has no .sig`);\n }\n this.signedData = await Key.verify(this.sig, this.pubKey);\n if (!this.signedData) {\n throw new ValidationError(`${errorMsg} Invalid signature`);\n }\n if (this.hash) {\n if (this.hash !== (await util.getHash(this.sig))) {\n throw new ValidationError(`${errorMsg} Invalid message hash`);\n }\n } else {\n this.getHash();\n }\n return true;\n }\n\n /**\n * @returns {string}\n */\n serialize() {\n return {sig: this.sig, pubKey: this.pubKey};\n }\n\n toString() {\n return JSON.stringify(this.serialize());\n }\n\n /**\n * @returns {Promise}\n */\n static async deserialize(s) {\n return SignedMessage.fromSig(s);\n }\n\n static async fromString(s) {\n return SignedMessage.fromSig(JSON.parse(s));\n }\n}\n\nexport default SignedMessage;\n","/*eslint no-useless-escape: \"off\", camelcase: \"off\" */\n\nimport session from './session';\nimport peers from './peers';\nimport util from './util';\nimport local from './local';\nimport global from './global';\nimport publicState from './public';\nimport group from './group';\nimport electron from './electron';\nimport privateState from './private';\nimport staticState from './static';\nimport notifications from './notifications';\n\nimport SignedMessage from './SignedMessage';\nimport Channel from './Channel';\nimport Node from './db/Node';\nimport Key from './Key';\n\nexport default {\n local,\n global,\n group,\n public: publicState,\n private: privateState,\n static: staticState,\n electron,\n peers,\n session,\n util,\n notifications,\n SignedMessage,\n Channel,\n Node,\n Key\n};"],"names":["_","throttle","func","limit","inThrottle","args","arguments","context","apply","setTimeout","debounce","inDebounce","clearTimeout","sample","arr","Math","floor","random","length","sampleSize","size","shuffled","slice","i","min","temp","index","defer","once","called","omit","obj","keys","newObj","Object","forEach","key","includes","defaults","undefined","pickBy","predicate","isEqual","a","b","Date","getTime","prototype","every","k","uniq","set","Set","Array","from","isNode","toString","call","global","process","e","userAgent","navigator","toLowerCase","isElectron","indexOf","isMobile","check","test","substr","vendor","gunOnceDefined","node","Promise","resolve","on","val","_k","_a","eve","off","animals","adjectives","getHash","data","format","Error","JSON","stringify","encoder","TextEncoder","encode","crypto","subtle","digest","buffer","hash","arrayBufferToBase64","base64ToHex","capitalize","s","charAt","toUpperCase","generateName","str","raw","atob","result","hex","charCodeAt","binary","bytes","Uint8Array","len","byteLength","String","fromCharCode","window","btoa","getCaret","el","selectionStart","document","selection","focus","r","createRange","re","createTextRange","rc","duplicate","moveToBookmark","getBookmark","setEndPoint","text","getUrlParameter","sParam","sParams","sPageURL","location","search","substring","sURLVariables","split","sParameterName","decodeURIComponent","formatTime","date","t","toLocaleTimeString","timeStyle","formatDate","toLocaleString","dateStyle","getDaySeparatorText","dateStr","now","nowStr","toLocaleDateString","dayDifference","round","weekday","getProfileLink","pub","origin","encodeURIComponent","truncateString","createElement","type","cls","parent","setAttribute","appendChild","delay","myKey","getActiveKey","datadir","keyfile","fs","privKeyFile","existsSync","f","readFileSync","fromString","generate","newKey","writeFileSync","chmodSync","localStorage","getItem","setItem","getDefault","getActivePub","setActiveKey","save","util","getId","parse","ecdhSubtle","generateKey","name","namedCurve","then","exportKey","privateKey","priv","d","publicKey","x","y","sa","epriv","epub","dh","console","log","keyToJwk","jwk","kty","crv","ext","key_ops","sign","pair","cb","opt","importKey","sig","m","Buffer","verify","buf","isValid","secret","keysToEcdhJwk","assign","pubJwk","props","privJwk","privKey","deriveBits","derivedBits","rawBits","derivedKey","aeskey","salt","combo","keyB64","replace","jwkKey","alg","getRandomValues","encrypt","msg","rand","iv","aes","ct","decrypt","json","bufiv","bufct","tagLength","TextDecoder","decode","_e","ELECTRON_GUN_URL","maxConnectedPeers","DEFAULT_PEERS","self","loc","host","is_localhost_but_not_dev","startsWith","hostname","endsWith","url","enabled","known","add","peer","visibility","Key","session","getKey","encryptedUrl","encryptedUrlHash","publicState","user","get","put","lastSeen","toISOString","connect","remove","disconnect","peerFromGun","getSaved","p","reset","isMixedContent","peers","disable","protocol","connectToLocalElectron","max","push","checkGunPeerCount","init","setInterval","generateUuid","c","v","Actor","id","handle","_message","postMessage","message","Message","fromObject","Get","Put","deserialize","dam","Hi","serialize","generateMsgId","nodeId","recipients","childKey","jsonStr","checksum","updatedNodes","inResponseTo","entries","children","myNodeId","childValue","value","updatedAt","isUserSpace","signatureObj","timestamp","signedObj","signature","signedStr","newFromKv","peerId","Memory","config","QuickLRU","maxSize","handlePut","handleGet","store","putMessage","mergeAndSave","nodeName","existing","MyDexie","dbName","version","stores","nodes","table","Dexie","IndexedDB","putQueue","values","map","notStored","db","bulkPut","err","error","queue","getQueue","bulkGet","callbacks","callback","open","stack","throttledPut","path","throttledGet","has","savePath","Websocket","router","ws","WebSocket","onopen","sendQueue","send","onmessage","event","onclose","onerror","readyState","OPEN","CONNECTING","Router","Map","storageAdapters","serverPeers","seenMessages","sendTo","topic","join","subscribers","subscribersByTopic","storageAdapter","subscriber","actor","opts","DEFAULT_CONFIG","allowPublicSpace","enableStats","localOnly","Node","on_subscriptions","once_subscriptions","map_subscriptions","root","webSocketPeers","getCurrentUser","currentUser","setCurrentUser","childData","doCallbacks","newNode","auth","isArray","signIfNeeded","addParentNodes","signed","childName","pop","parentId","request","counter","globalState","myOpts","retry","Infinity","UNIQUE_ID_VALIDATORS","email","bitcoin","bitcoin_address","ip","ipv6","gpg_fingerprint","gpg_keyid","google_oauth2","tel","phone","keyID","account","uuid","Attribute","guessTypeOf","getUuid","getUniqueIdValidators","isUniqueType","match","equals","uri","userSpace","DEFAULT_PERMISSIONS","read","write","admin","Channel","options","myGroupSecret","chatLink","useChatLink","participants","addParticipant","o","founder","getChatLinks","subscribe","putDirect","getMyGroupSecret","getMySecretUuid","onTheirDirect","theirSecretUuids","theirGroupSecrets","onTheir","hasAdmin","inviter","participantsChanged","saved","chatWith","channelId","sharedSecret","linkId","encrypted","sharedKey","encryptedChatRequest","channelRequestId","getTheirSecretUuid","getTheirGroupSecret","changeMyGroupSecret","mute","participant","block","secrets","ourSecretChannelIds","theirSecretChannelIds","mySecretUuid","mySecret","mySecretHash","getCurrentParticipants","getParticipants","getParticipantsCallbackId","getParticipantsCallbacks","getSecret","getOurSecretChannelId","getTheirSecretChannelId","getChannels","listenToChatLinks","keypair","getMyChatLinks","seen","handleChannel","ourSecretChannelId","encryptedChatId","chatId","getMessages","theirSecretChannelId","messageReceived","userState","selfAuthored","messages","decrypted","info","getLatestMsg","callbackIfLatest","latest","time","onMy","setMyMsgsLastSeenTime","getMyMsgsLastSeenTime","myMsgsLastSeenTime","getTheirMsgsLastSeenTime","theirMsgsLastSeenTime","removeParticipant","permissions","directSubscriptions","_onTheirDirectFromUser","groupSubscriptions","_onTheirGroupFromUser","trim","putGroup","onGroup","onDirect","onMyGroup","onTheirGroup","onMyDirect","hasWritePermission","hasOwnProperty","subscription","theirSecretUuid","_b","setTyping","isTyping","timeout","setTypingTimeout","getTyping","typing","getTypingTimeouts","getSimpleLink","urlRoot","chatLinks","chatLinkSubscriptions","links","link","channels","formatChatLink","encPub","requestId","createChatLink","sharedKeyString","encryptedSharedKey","ownerSecret","ownerEncryptedSharedKey","setActivity","activity","irisActivityStatus","setActivityTimeout","update","status","timerUpdate","getActivity","pubKey","activityDate","isActive","lastActive","isOnline","enc","channel","removeGroupChatLink","removePrivateChatLink","deleteChannel","deleteGroup","local","blockedUsers","isBlocked","_v","cache","groupName","groupNode","follows","requestAnimationFrame","isFollowing","reduce","sum","_cached_map","cached","cacheKey","myEvent","item","_cached_on","_cached_count","count","_cached_fn","fn","callbackId","myCallbacks","NOTIFICATION_SERVICE_URL","loginTime","unseenMsgsTotal","unseenNotificationCount","webPushSubscriptions","desktopNotificationsEnabled","Notification","permission","notifyMsg","onClick","shouldNotify","timeObj","visibilityState","privateState","notificationSetting","getMyName","shouldDesktopNotify","shouldAudioNotify","body","title","participantProfiles","desktopNotification","icon","silent","onclick","changeUnseenNotificationCount","changeChatUnseenMsgsCount","change","chat","chatNode","unseen","publicVapidKey","urlBase64ToUint8Array","base64String","padding","repeat","base64","rawData","outputArray","reg","pushManager","userVisibleOnly","applicationServerKey","addWebPushSubscription","subscribeToWebPush","serviceWorker","ready","getRegistration","active","getSubscription","sub","addWebPushSubscriptionsToChats","channelIds","removeSubscription","saveToGun","getWebPushSubscriptions","getEpub","getNotificationText","notification","profile","action","eventText","subscribeToIrisNotifications","notificationsSeenTime","notificationsShownTime","setNotificationsShownTime","alreadyHave","group","getPubKey","encryptedNotification","target","sendIrisNotification","recipient","sendWebPushNotification","shouldWebPush","subscriptions","payload","endpoint","fetch","method","headers","changeChatUnseenCount","electron","myName","latestChatLink","onlineTimeout","ourActivity","noFollows","noFollowers","searchIndex","initCalled","searchableItems","getExtendedFollowsCalled","DEFAULT_FOLLOW","DEFAULT_SETTINGS","openAtLogin","minimizeOnClose","enableWebtorrent","enablePublicPeerDiscovery","autoplayWebtorrent","localStorageKey","login","autologin","loginAsNewUser","clearIndexedDB","updateSearchIndex","taskQueue","shift","includeScore","includeMatches","threshold","Fuse","leading","saveSearchResult","followDistance","followerCount","followers","addFollow","follower","updateNoFollows","updateNoFollowers","removeFollow","getExtendedFollows","maxDepth","currentDepth","followedKey","getSearchIndex","setOurOnlineStatus","activeRoute","setActive","addEventListener","pathname","notifications","updateGroups","shouldRefresh","addChannel","settings","reload","l","autofollow","logOut","unsubscribe","clear","href","r1","indexedDB","deleteDatabase","r2","r1done","r2done","onsuccess","getMyChatLink","myPeerUrl","shareMyPeerUrl","myIp","newChannel","latestTime","theirMsgsLastSeenDate","processMessage","myLastSeenTime","online","theirLastActiveTime","isDarkMode","matchMedia","matches","photo","hue","color","inviteLinks","onClickNotification","messageIds","invite","subscribeToMsgs","subscribed","reject","publicSpace","_x","errorMsg","ValidationError","SignedMessage","signedData","_validate","getSignerKeyID","author","signerKeyHash","attr","create","signingKey","getAuthor","getAuthorIterable","getContacts","getRecipient","getRecipientIterable","fromSig","staticState"],"mappings":"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"} \ No newline at end of file diff --git a/dist/iris.cjs.production.min.js b/dist/iris.cjs.production.min.js index 8747dd7..fdf745c 100644 --- a/dist/iris.cjs.production.min.js +++ b/dist/iris.cjs.production.min.js @@ -1,2 +1,2 @@ -"use strict";function e(e){return e&&"object"==typeof e&&"default"in e?e.default:e}Object.defineProperty(exports,"__esModule",{value:!0});var t=e(require("gun"));require("gun/sea"),require("gun/lib/yson"),require("gun/lib/radix"),require("gun/lib/radisk"),require("gun/lib/store"),require("gun/lib/rindexed");var n=e(require("localforage")),r=e(require("fuse.js"));function i(){i=function(){return e};var e={},t=Object.prototype,n=t.hasOwnProperty,r="function"==typeof Symbol?Symbol:{},a=r.iterator||"@@iterator",s=r.asyncIterator||"@@asyncIterator",o=r.toStringTag||"@@toStringTag";function c(e,t,n){return Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}),e[t]}try{c({},"")}catch(e){c=function(e,t,n){return e[t]=n}}function u(e,t,n,r){var i=Object.create((t&&t.prototype instanceof h?t:h).prototype),a=new A(r||[]);return i._invoke=function(e,t,n){var r="suspendedStart";return function(i,a){if("executing"===r)throw new Error("Generator is already running");if("completed"===r){if("throw"===i)throw a;return{value:void 0,done:!0}}for(n.method=i,n.arg=a;;){var s=n.delegate;if(s){var o=x(s,n);if(o){if(o===p)continue;return o}}if("next"===n.method)n.sent=n._sent=n.arg;else if("throw"===n.method){if("suspendedStart"===r)throw r="completed",n.arg;n.dispatchException(n.arg)}else"return"===n.method&&n.abrupt("return",n.arg);r="executing";var c=l(e,t,n);if("normal"===c.type){if(r=n.done?"completed":"suspendedYield",c.arg===p)continue;return{value:c.arg,done:n.done}}"throw"===c.type&&(r="completed",n.method="throw",n.arg=c.arg)}}}(e,n,a),i}function l(e,t,n){try{return{type:"normal",arg:e.call(t,n)}}catch(e){return{type:"throw",arg:e}}}e.wrap=u;var p={};function h(){}function f(){}function d(){}var g={};c(g,a,(function(){return this}));var m=Object.getPrototypeOf,v=m&&m(m(E([])));v&&v!==t&&n.call(v,a)&&(g=v);var y=d.prototype=h.prototype=Object.create(g);function b(e){["next","throw","return"].forEach((function(t){c(e,t,(function(e){return this._invoke(t,e)}))}))}function w(e,t){var r;this._invoke=function(i,a){function s(){return new t((function(r,s){!function r(i,a,s,o){var c=l(e[i],e,a);if("throw"!==c.type){var u=c.arg,p=u.value;return p&&"object"==typeof p&&n.call(p,"__await")?t.resolve(p.__await).then((function(e){r("next",e,s,o)}),(function(e){r("throw",e,s,o)})):t.resolve(p).then((function(e){u.value=e,s(u)}),(function(e){return r("throw",e,s,o)}))}o(c.arg)}(i,a,r,s)}))}return r=r?r.then(s,s):s()}}function x(e,t){var n=e.iterator[t.method];if(void 0===n){if(t.delegate=null,"throw"===t.method){if(e.iterator.return&&(t.method="return",t.arg=void 0,x(e,t),"throw"===t.method))return p;t.method="throw",t.arg=new TypeError("The iterator does not provide a 'throw' method")}return p}var r=l(n,e.iterator,t.arg);if("throw"===r.type)return t.method="throw",t.arg=r.arg,t.delegate=null,p;var i=r.arg;return i?i.done?(t[e.resultName]=i.value,t.next=e.nextLoc,"return"!==t.method&&(t.method="next",t.arg=void 0),t.delegate=null,p):i:(t.method="throw",t.arg=new TypeError("iterator result is not an object"),t.delegate=null,p)}function k(e){var t={tryLoc:e[0]};1 in e&&(t.catchLoc=e[1]),2 in e&&(t.finallyLoc=e[2],t.afterLoc=e[3]),this.tryEntries.push(t)}function S(e){var t=e.completion||{};t.type="normal",delete t.arg,e.completion=t}function A(e){this.tryEntries=[{tryLoc:"root"}],e.forEach(k,this),this.reset(!0)}function E(e){if(e){var t=e[a];if(t)return t.call(e);if("function"==typeof e.next)return e;if(!isNaN(e.length)){var r=-1,i=function t(){for(;++r=0;--i){var a=this.tryEntries[i],s=a.completion;if("root"===a.tryLoc)return r("end");if(a.tryLoc<=this.prev){var o=n.call(a,"catchLoc"),c=n.call(a,"finallyLoc");if(o&&c){if(this.prev=0;--r){var i=this.tryEntries[r];if(i.tryLoc<=this.prev&&n.call(i,"finallyLoc")&&this.prev=0;--t){var n=this.tryEntries[t];if(n.finallyLoc===e)return this.complete(n.completion,n.afterLoc),S(n),p}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.tryLoc===e){var r=n.completion;if("throw"===r.type){var i=r.arg;S(n)}return i}}throw new Error("illegal catch attempt")},delegateYield:function(e,t,n){return this.delegate={iterator:E(e),resultName:t,nextLoc:n},"next"===this.method&&(this.arg=void 0),p}},e}function a(e,t,n,r,i,a,s){try{var o=e[a](s),c=o.value}catch(e){return void n(e)}o.done?t(c):Promise.resolve(c).then(r,i)}function s(e){return function(){var t=this,n=arguments;return new Promise((function(r,i){var s=e.apply(t,n);function o(e){a(s,r,i,o,c,"next",e)}function c(e){a(s,r,i,o,c,"throw",e)}o(void 0)}))}}function o(e){return(o=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function c(e,t){return(c=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function u(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}function l(e,t,n){return(l=u()?Reflect.construct.bind():function(e,t,n){var r=[null];r.push.apply(r,t);var i=new(Function.bind.apply(e,r));return n&&c(i,n.prototype),i}).apply(null,arguments)}function p(e){var t="function"==typeof Map?new Map:void 0;return(p=function(e){if(null===e||-1===Function.toString.call(e).indexOf("[native code]"))return e;if("function"!=typeof e)throw new TypeError("Super expression must either be null or a function");if(void 0!==t){if(t.has(e))return t.get(e);t.set(e,n)}function n(){return l(e,arguments,o(this).constructor)}return n.prototype=Object.create(e.prototype,{constructor:{value:n,enumerable:!1,writable:!0,configurable:!0}}),c(n,e)})(e)}function h(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n=e.length?{done:!0}:{done:!1,value:e[r++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var d=function(e,t){var n;return function(){var r=arguments,i=this;n||(e.apply(i,r),n=!0,setTimeout((function(){return n=!1}),t))}},g=function(e,t){var n;return function(){var r=arguments,i=this;clearTimeout(n),n=setTimeout((function(){return e.apply(i,r)}),t)}},m=function(e){return e[Math.floor(Math.random()*e.length)]},v=function(e,t){var n={};return Object.keys(e).forEach((function(r){t.includes(r)||(n[r]=e[r])})),n},y=!1;try{y="[object process]"===Object.prototype.toString.call(global.process)}catch(e){}var b=!y&&navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase(),w=b&&b.indexOf(" electron/")>-1,x=["canidae","felidae","cat","cattle","dog","donkey","goat","horse","pig","rabbit","aardvark","aardwolf","albatross","alligator","alpaca","amphibian","anaconda","angelfish","anglerfish","ant","anteater","antelope","antlion","ape","aphid","armadillo","asp","baboon","badger","bandicoot","barnacle","barracuda","basilisk","bass","bat","bear","beaver","bedbug","bee","beetle","bird","bison","blackbird","boa","boar","bobcat","bobolink","bonobo","booby","bovid","bug","butterfly","buzzard","camel","canid","capybara","cardinal","caribou","carp","cat","catshark","caterpillar","catfish","cattle","centipede","cephalopod","chameleon","cheetah","chickadee","chicken","chimpanzee","chinchilla","chipmunk","clam","clownfish","cobra","cockroach","cod","condor","constrictor","coral","cougar","cow","coyote","crab","crane","crawdad","crayfish","cricket","crocodile","crow","cuckoo","cicada","damselfly","deer","dingo","dinosaur","dog","dolphin","donkey","dormouse","dove","dragonfly","dragon","duck","eagle","earthworm","earwig","echidna","eel","egret","elephant","elk","emu","ermine","falcon","ferret","finch","firefly","fish","flamingo","flea","fly","flyingfish","fowl","fox","frog","gamefowl","galliform","gazelle","gecko","gerbil","gibbon","giraffe","goat","goldfish","goose","gopher","gorilla","grasshopper","grouse","guan","guanaco","guineafowl","gull","guppy","haddock","halibut","hamster","hare","harrier","hawk","hedgehog","heron","herring","hippopotamus","hookworm","hornet","horse","hoverfly","hummingbird","hyena","iguana","impala","jackal","jaguar","jay","jellyfish","junglefowl","kangaroo","kingfisher","kite","kiwi","koala","koi","krill","ladybug","lamprey","landfowl","lark","leech","lemming","lemur","leopard","leopon","limpet","lion","lizard","llama","lobster","locust","loon","louse","lungfish","lynx","macaw","mackerel","magpie","mammal","manatee","mandrill","marlin","marmoset","marmot","marsupial","marten","mastodon","meadowlark","meerkat","mink","minnow","mite","mockingbird","mole","mollusk","mongoose","monkey","moose","mosquito","moth","mouse","mule","muskox","narwhal","newt","nightingale","ocelot","octopus","opossum","orangutan","orca","ostrich","otter","owl","ox","panda","panther","parakeet","parrot","parrotfish","partridge","peacock","peafowl","pelican","penguin","perch","pheasant","pig","pigeon","pike","pinniped","piranha","planarian","platypus","pony","porcupine","porpoise","possum","prawn","primate","ptarmigan","puffin","puma","python","quail","quelea","quokka","rabbit","raccoon","rat","rattlesnake","raven","reindeer","reptile","rhinoceros","roadrunner","rodent","rook","rooster","roundworm","sailfish","salamander","salmon","sawfish","scallop","scorpion","seahorse","shark","sheep","shrew","shrimp","silkworm","silverfish","skink","skunk","sloth","slug","smelt","snail","snake","snipe","sole","sparrow","spider","spoonbill","squid","squirrel","starfish","stingray","stoat","stork","sturgeon","swallow","swan","swift","swordfish","swordtail","tahr","takin","tapir","tarantula","tarsier","termite","tern","thrush","tick","tiger","tiglon","toad","tortoise","toucan","trout","tuna","turkey","turtle","tyrannosaurus","urial","vicuna","viper","vole","vulture","wallaby","walrus","wasp","warbler","weasel","whale","whippet","whitefish","wildcat","wildebeest","wildfowl","wolf","wolverine","wombat","woodpecker","worm","wren","xerinae","yak","zebra","alpaca","cat","cattle","chicken","dog","donkey","ferret","gayal","goldfish","guppy","horse","koi","llama","sheep","yak","unicorn"],k=["average","big","colossal","fat","giant","gigantic","great","huge","immense","large","little","long","mammoth","massive","miniature","petite","puny","short","small","tall","tiny","boiling","breezy","broken","bumpy","chilly","cold","cool","creepy","crooked","cuddly","curly","damaged","damp","dirty","dry","dusty","filthy","flaky","fluffy","wet","broad","chubby","crooked","curved","deep","flat","high","hollow","low","narrow","round","shallow","skinny","square","steep","straight","wide","ancient","brief","early","fast","late","long","modern","old","quick","rapid","short","slow","swift","young","abundant","empty","few","heavy","light","many","numerous","Sound","cooing","deafening","faint","harsh","hissing","hushed","husky","loud","melodic","moaning","mute","noisy","purring","quiet","raspy","resonant","screeching","shrill","silent","soft","squealing","thundering","voiceless","whispering","bitter","delicious","fresh","juicy","ripe","rotten","salty","sour","spicy","stale","sticky","strong","sweet","tasteless","tasty","thirsty","fluttering","fuzzy","greasy","grubby","hard","hot","icy","loose","melted","plastic","prickly","rainy","rough","scattered","shaggy","shaky","sharp","shivering","silky","slimy","slippery","smooth","soft","solid","steady","sticky","tender","tight","uneven","weak","wet","wooden","afraid","angry","annoyed","anxious","arrogant","ashamed","awful","bad","bewildered","bored","combative","condemned","confused","creepy","cruel","dangerous","defeated","defiant","depressed","disgusted","disturbed","eerie","embarrassed","envious","evil","fierce","foolish","frantic","frightened","grieving","helpless","homeless","hungry","hurt","ill","jealous","lonely","mysterious","naughty","nervous","obnoxious","outrageous","panicky","repulsive","scary","scornful","selfish","sore","tense","terrible","thoughtless","tired","troubled","upset","uptight","weary","wicked","worried","agreeable","amused","brave","calm","charming","cheerful","comfortable","cooperative","courageous","delightful","determined","eager","elated","enchanting","encouraging","energetic","enthusiastic","excited","exuberant","fair","faithful","fantastic","fine","friendly","funny","gentle","glorious","good","happy","healthy","helpful","hilarious","jolly","joyous","kind","lively","lovely","lucky","obedient","perfect","pleasant","proud","relieved","silly","smiling","splendid","successful","thoughtful","victorious","vivacious","witty","wonderful","zealous","zany","other","good","new","old","great","high","small","different","large","local","social","important","long","young","national","british","right","early","possible","big","little","political","able","late","general","full","far","low","public","available","bad","main","sure","clear","major","economic","only","likely","real","black","particular","international","special","difficult","certain","open","whole","white","free","short","easy","strong","european","central","similar","human","common","necessary","single","personal","hard","private","poor","financial","wide","foreign","simple","recent","concerned","american","various","close","fine","english","wrong","present","royal","natural","individual","nice","french","nihilist","solipsist","materialist","surrealist","heroic","awesome","hedonist","absurd","current","modern","labour","legal","happy","final","red","normal","serious","previous","total","prime","significant","industrial","sorry","dead","specific","appropriate","top","soviet","basic","military","original","successful","aware","hon","popular","heavy","professional","direct","dark","cold","ready","green","useful","effective","western","traditional","scottish","german","independent","deep","interesting","considerable","involved","physical","hot","existing","responsible","complete","medical","blue","extra","past","male","interested","fair","essential","beautiful","civil","primary","obvious","future","environmental","positive","senior","nuclear","annual","relevant","huge","rich","commercial","safe","regional","practical","official","separate","key","chief","regular","due","additional","active","powerful","complex","standard","impossible","light","warm","middle","fresh","sexual","front","domestic","actual","united","technical","ordinary","cheap","strange","internal","excellent","quiet","soft","potential","northern","religious","quick","very","famous","cultural","proper","broad","joint","formal","limited","conservative","lovely","usual","ltd","unable","rural","initial","substantial","bright","average","leading","reasonable","immediate","suitable","equal","detailed","working","overall","female","afraid","democratic","growing","sufficient","scientific","eastern","correct","inc","irish","expensive","educational","mental","dangerous","critical","increased","familiar","unlikely","double","perfect","slow","tiny","dry","historical","thin","daily","southern","increasing","wild","alone","urban","empty","married","narrow","liberal","supposed","upper","apparent","tall","busy","bloody","prepared","russian","moral","careful","clean","attractive","japanese","vital","thick","alternative","fast","ancient","elderly","rare","external","capable","brief","wonderful","grand","typical","entire","grey","constant","vast","surprised","ideal","terrible","academic","funny","minor","pleased","severe","ill","corporate","negative","permanent","weak","brown","fundamental","odd","crucial","inner","used","criminal","contemporary","sharp","sick","near","roman","massive","unique","secondary","parliamentary","african","unknown","subsequent","angry","alive","guilty","lucky","enormous","well","yellow","unusual","net","tough","dear","extensive","glad","remaining","agricultural","alright","healthy","italian","principal","tired","efficient","comfortable","chinese","relative","friendly","conventional","willing","sudden","proposed","voluntary","slight","valuable","dramatic","golden","temporary","federal","keen","flat","silent","indian","worried","pale","statutory","welsh","dependent","firm","wet","competitive","armed","radical","outside","acceptable","sensitive","living","pure","global","emotional","sad","secret","rapid","adequate","fixed","sweet","administrative","wooden","remarkable","comprehensive","surprising","solid","rough","mere","mass","brilliant","maximum","absolute","electronic","visual","electric","cool","spanish","literary","continuing","supreme","chemical","genuine","exciting","written","advanced","extreme","classical","fit","favourite","widespread","confident","straight","proud","numerous","opposite","distinct","mad","helpful","given","disabled","consistent","anxious","nervous","awful","stable","constitutional","satisfied","conscious","developing","strategic","holy","smooth","dominant","remote","theoretical","outstanding","pink","pretty","clinical","minimum","honest","impressive","related","residential","extraordinary","plain","visible","accurate","distant","still","greek","complicated","musical","precise","gentle","broken","live","silly","fat","tight","monetary","round","psychological","violent","unemployed","inevitable","junior","sensible","grateful","pleasant","dirty","structural","welcome","deaf","above","continuous","blind","overseas","mean","entitled","delighted","loose","occasional","evident","desperate","fellow","universal","square","steady","classic","equivalent","intellectual","victorian","level","ultimate","creative","lost","medieval","clever","linguistic","convinced","judicial","raw","sophisticated","asleep","vulnerable","illegal","outer","revolutionary","bitter","changing","australian","native","imperial","strict","wise","informal","flexible","collective","frequent","experimental","spiritual","intense","rational","generous","inadequate","prominent","logical","bare","historic","modest","dutch","acute","electrical","valid","weekly","gross","automatic","loud","reliable","mutual","liable","multiple","ruling","curious","sole","managing","pregnant","latin","nearby","exact","underlying","identical","satisfactory","marginal","distinctive","electoral","urgent","presidential","controversial","everyday","encouraging","organic","continued","expected","statistical","desirable","innocent","improved","exclusive","marked","experienced","unexpected","superb","sheer","disappointed","frightened","gastric","romantic","naked","reluctant","magnificent","convenient","established","closed","uncertain","artificial","diplomatic","tremendous","marine","mechanical","retail","institutional","mixed","required","biological","known","functional","straightforward","superior","digital","spectacular","unhappy","confused","unfair","aggressive","spare","painful","abstract","asian","associated","legislative","monthly","intelligent","hungry","explicit","nasty","just","faint","coloured","ridiculous","amazing","comparable","successive","realistic","back","decent","decentralized","bitcoin","cypherpunk","unnecessary","flying","random","influential","dull","genetic","neat","marvellous","crazy","damp","giant","secure","bottom","skilled","subtle","elegant","brave","lesser","parallel","steep","intensive","casual","tropical","lonely","partial","preliminary","concrete","alleged","assistant","vertical","upset","delicate","mild","occupational","excessive","progressive","exceptional","integrated","striking","continental","okay","harsh","combined","fierce","handsome","characteristic","chronic","compulsory","interim","objective","splendid","magic","systematic","obliged","payable","fun","horrible","primitive","fascinating","ideological","metropolitan","surrounding","estimated","peaceful","premier","operational","technological","kind","advisory","hostile","precious","accessible","determined","excited","impressed","provincial","smart","endless","isolated","drunk","geographical","like","dynamic","boring","forthcoming","unfortunate","definite","super","notable","indirect","stiff","wealthy","awkward","lively","neutral","artistic","content","mature","colonial","ambitious","evil","magnetic","verbal","legitimate","sympathetic","empirical","head","shallow","vague","naval","depressed","shared","added","shocked","mid","worthwhile","qualified","missing","blank","absent","favourable","polish","israeli","developed","profound","representative","enthusiastic","dreadful","rigid","reduced","cruel","coastal","peculiar","swiss","crude","extended","selected","eager","canadian","bold","relaxed","corresponding","running","planned","applicable","immense","allied","comparative","uncomfortable","conservation","productive","beneficial","bored","charming","minimal","mobile","turkish","orange","rear","passive","suspicious","overwhelming","fatal","resulting","symbolic","registered","neighbouring","calm","irrelevant","patient","compact","profitable","rival","loyal","moderate","distinguished","interior","noble","insufficient","eligible","mysterious","varying","managerial","molecular","olympic","linear","prospective","printed","parental","diverse","elaborate","furious","fiscal","burning","useless","semantic","embarrassed","inherent","philosophical","deliberate","awake","variable","promising","unpleasant","varied","sacred","selective","inclined","tender","hidden","worthy","intermediate","sound","protective","fortunate","slim","defensive","divine","stuck","driving","invisible","misleading","circular","mathematical","inappropriate","liquid","persistent","solar","doubtful","manual","architectural","intact","incredible","devoted","prior","tragic","respectable","optimistic","convincing","unacceptable","decisive","competent","spatial","respective","binding","relieved","nursing","toxic","select","redundant","integral","then","probable","amateur","fond","passing","specified","territorial","horizontal","inland","cognitive","regulatory","miserable","resident","polite","scared","gothic","civilian","instant","lengthy","adverse","korean","unconscious","anonymous","aesthetic","orthodox","static","unaware","costly","fantastic","foolish","fashionable","causal","compatible","wee","implicit","dual","ok","cheerful","subjective","forward","surviving","exotic","purple","cautious","visiting","aggregate","ethical","teenage","dying","disastrous","delicious","confidential","underground","thorough","grim","autonomous","atomic","frozen","colourful","injured","uniform","ashamed","glorious","wicked","coherent","rising","shy","novel","balanced","delightful","arbitrary","adjacent","worrying","weird","unchanged","rolling","evolutionary","intimate","sporting","disciplinary","formidable","lexical","noisy","gradual","accused","homeless","supporting","coming","renewed","excess","retired","rubber","chosen","outdoor","embarrassing","preferred","bizarre","appalling","agreed","imaginative","governing","accepted","vocational","mighty","puzzled","worldwide","organisational","sunny","eldest","eventual","spontaneous","vivid","rude","faithful","ministerial","innovative","controlled","conceptual","unwilling","civic","meaningful","alive","brainy","breakable","busy","careful","cautious","clever","concerned","crazy","curious","dead","different","difficult","doubtful","easy","famous","fragile","helpful","helpless","important","impossible","innocent","inquisitive","modern","open","outstanding","poor","powerful","puzzled","real","rich","shy","sleepy","super","tame","uninterested","wandering","wild","wrong","adorable","alert","average","beautiful","blonde","bloody","blushing","bright","clean","clear","cloudy","colorful","crowded","cute","dark","drab","distinct","dull","elegant","fancy","filthy","glamorous","gleaming","graceful","grotesque","homely","light","misty","motionless","muddy","plain","poised","quaint","shiny","smoggy","sparkling","spotless","stormy","strange","ugly","unsightly","unusual","bad","better","beautiful","big","black","blue","bright","clumsy","crazy","dizzy","dull","fat","frail","friendly","funny","great","green","gigantic","gorgeous","grumpy","handsome","happy","horrible","itchy","jittery","jolly","kind","long","lazy","magnificent","magenta","many","mighty","mushy","nasty","new","nice","nosy","nutty","nutritious","odd","orange","ordinary","pretty","precious","prickly","purple","quaint","quiet","quick","quickest","rainy","rare","ratty","red","roasted","robust","round","sad","scary","scrawny","short","silly","stingy","strange","striped","spotty","tart","tall","tame","tan","tender","testy","tricky","tough","ugly","ugliest","vast","watery","wasteful","wonderful","yellow","yummy","zany"],S={gunOnceDefined:function(e){return new Promise((function(t){e.on((function(e,n,r,i){void 0!==e&&(i.off(),t(e))}))}))},gunAsAnotherUser:function(e,n,r){var i=new t({radisk:!1,peers:Object.keys(e._.opt.peers)}),a=i.user();return a.auth(n),setTimeout((function(){Object.values(i.back("opt.peers")).forEach((function(e){i.on("bye",e)}))}),2e4),r(a)},getHash:function(e,n){var r=this;return s(i().mark((function a(){var s;return i().wrap((function(i){for(;;)switch(i.prev=i.next){case 0:if(void 0===n&&(n="base64"),e){i.next=3;break}return i.abrupt("return",void 0);case 3:return i.next=5,t.SEA.work(e,void 0,void 0,{name:"SHA-256"});case 5:if(s=i.sent){i.next=8;break}throw new Error("Gun.SEA.work failed for "+e);case 8:if(!(s.length>44)){i.next=10;break}throw new Error("Gun.SEA.work returned an invalid SHA-256 hash longer than 44 chars: "+s+". This is probably due to a sea.js bug on Safari.");case 10:if("hex"!==n){i.next=12;break}return i.abrupt("return",r.base64ToHex(s));case 12:return i.abrupt("return",s);case 13:case"end":return i.stop()}}),a)})))()},capitalize:function(e){return e.charAt(0).toUpperCase()+e.slice(1)},generateName:function(){return this.capitalize(m(k))+" "+this.capitalize(m(x))},base64ToHex:function(e){for(var t=atob(e),n="",r=0;rt?e.slice(0,t)+"...":e},createElement:function(e,t,n){var r=document.createElement(e);return t&&r.setAttribute("class",t),n&&n.appendChild(r),r},isNode:y,isElectron:w,isMobile:!y&&function(){if(w)return!1;var e,t=!1;return e=navigator.userAgent||navigator.vendor||"",(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(e)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(e.substr(0,4)))&&(t=!0),t}(),throttle:function(e,t){var n;return function(){var r=arguments,i=this;n||(e.apply(i,r),n=!0,setTimeout((function(){return n=!1}),t))}},debounce:function(e,t){var n;return function(){var r=this,i=arguments;clearTimeout(n),n=setTimeout((function(){return e.apply(r,i)}),t)}},sample:function(e){return e[Math.floor(Math.random()*e.length)]},sampleSize:function(e,t){for(var n,r,i=e.slice(0),a=e.length,s=a-t;a-- >s;)n=i[r=Math.floor((a+1)*Math.random())],i[r]=i[a],i[a]=n;return i.slice(s)},defer:function(e){return setTimeout(e,0)},once:function(e){var t=!1;return function(){t||(t=!0,e.apply(this,arguments))}},omit:function(e,t){var n={};return Object.keys(e).forEach((function(r){t.includes(r)||(n[r]=e[r])})),n}},A="http://localhost:8767/gun",E={"https://gun-rs.iris.to/gun":{},"https://gun-us.herokuapp.com/gun":{}},T=window.location,O=T.host,M=O.startsWith("localhost")&&"localhost:8080"!==O;(T.hostname.endsWith("herokuapp.com")||M)&&(Object.keys(E).forEach((function(e){return E[e].enabled=!1})),E[T.origin+"/gun"]={enabled:!0});var L,I=/^(https?:\/\/)?([\da-z.-]+)\.([a-z.]{2,6})([\/\w .-]*)*\/?$/,C={known:{},add:function(e){var n=this;return s(i().mark((function r(){var a,s,o,c;return i().wrap((function(r){for(;;)switch(r.prev=r.next){case 0:if(!e.url||I.test(e.url)){r.next=2;break}throw new Error("Invalid url "+e.url);case 2:if(e.from&&Object.keys(n.known).forEach((function(t){n.known[t].from===e.from&&delete n.known[t]})),n.known[a=e.url||""]=n.known[a]||v(e,["url"]),"public"!==e.visibility){r.next=19;break}return r.next=8,t.SEA.secret(De.getKey().epub,De.getKey());case 8:if(r.t0=r.sent,r.t0){r.next=11;break}r.t0="";case 11:return s=r.t0,r.next=14,t.SEA.encrypt(e.url,s);case 14:return o=r.sent,r.next=17,t.SEA.work(o,null,null,{name:"SHA-256"});case 17:c=r.sent,j().user().get("peers").get(c).put({url:e.url,lastSeen:(new Date).toISOString()});case 19:!1!==e.enabled?e.url&&n.connect(e.url):n.save();case 20:case"end":return r.stop()}}),r)})))()},remove:function(e){delete this.known[e],this.save()},disconnect:function(e){j().on("bye",e),e.url=""},save:function(){localStorage.setItem("gunPeers",JSON.stringify(this.known))},getSaved:function(){var e=localStorage.getItem("gunPeers");return e=e&&"undefined"!==e?JSON.parse(e):E,S.isElectron&&(e[A]={}),Object.keys(e).forEach((function(t){return n=e[t],r={enabled:!0},Object.keys(r).forEach((function(e){void 0===n[e]&&(n[e]=r[e])})),n;var n,r})),e},reset:function(){localStorage.setItem("gunPeers",""),this.known=this.getSaved()},connect:function(e){this.isMixedContent(e)||(this.known[e]?(this.known[e].enabled=!0,j().opt({peers:[e]}),this.save()):this.add({url:e}))},disable:function(e,t){this.known[e].enabled=!1,t&&this.disconnect(t),this.save()},isMixedContent:function(e){return"https:"===window.location.protocol&&0===e.indexOf("http:")},random:function(){var e,t,n,r=this,i=S.isElectron&&this.known[A]&&!1!==this.known[A].enabled,a=i?Math.max(1,1):2,s=function(e,t){for(var n,r,i=e.slice(0),a=e.length,s=a-t;a-- >s;)n=i[r=Math.floor((a+1)*Math.random())],i[r]=i[a],i[a]=n;return i.slice(s)}(Object.keys((e=this.known,t=function(e,t){return!r.isMixedContent(t)&&e.enabled&&!(S.isElectron&&t===A)},n={},Object.keys(e).forEach((function(r){t(e[r])&&(n[r]=e[r])})),n)),a);return s&&i&&s.push(A),s},checkGunPeerCount:function(){var e=this,t=j().back("opt.peers"),n=Object.values(t).filter((function(e){return e&&e.wire&&"WebSocket"!==e.wire.constructor.name&&console.log("WebRTC peer",e),e&&e.wire&&1===e.wire.readyState&&0===e.wire.bufferedAmount&&"WebSocket"===e.wire.constructor.name}));if(n.length<2){var r=Object.keys(this.known).filter((function(n){var r=Object.values(t).map((function(e){return e.url})).indexOf(n)>-1,i=e.known[n].enabled;return!("https:"===window.location.protocol&&0===n.indexOf("http:"))&&i&&!r}));if(r.length){var i=String(m(r));this.connect(i)}}n.length>2&&this.disconnect(m(n))},init:function(){var e=this;this.known=this.getSaved(),setInterval((function(){return e.checkGunPeerCount()}),1e3)}};function j(e){if(void 0===e&&(e={}),!L){var n=Object.assign({peers:e.peers||C.random(),localStorage:!1,retry:Infinity},e);e.peers&&e.peers.forEach((function(e){return C.add({url:e})})),C.init(),L=new t(n)}return L}var D,P={email:/^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i,bitcoin:/^[13][a-km-zA-HJ-NP-Z0-9]{26,33}$/,bitcoin_address:/^[13][a-km-zA-HJ-NP-Z0-9]{26,33}$/,ip:/^(([1-9]?\d|1\d\d|2[0-5][0-5]|2[0-4]\d)\.){3}([1-9]?\d|1\d\d|2[0-5][0-5]|2[0-4]\d)$/,ipv6:/^(?:[A-F0-9]{1,4}:){7}[A-F0-9]{1,4}$/,gpg_fingerprint:null,gpg_keyid:null,google_oauth2:null,tel:/^\d{7,}$/,phone:/^\d{7,}$/,keyID:null,url:/[-a-zA-Z0-9@:%_\+.~#?&//=]{2,256}\.[a-z]{2,4}\b(\/[-a-zA-Z0-9@:%_\+.~#?&//=]*)?/gi,account:/^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i,uuid:/[0-9a-f]{8}\-[0-9a-f]{4}\-[0-9a-f]{4}\-[0-9a-f]{4}\-[0-9a-f]{12}/},z=function(){function e(t,n){if("object"==typeof t){if("string"!=typeof t.value)throw new Error("param1.value must be a string, got "+typeof t.value+": "+JSON.stringify(t.value));if("string"!=typeof t.type)throw new Error("param1.type must be a string, got "+typeof t.type+": "+JSON.stringify(t.type));n=t.value,t=t.type}if("string"!=typeof t)throw new Error("First param must be a string, got "+typeof t+": "+JSON.stringify(t));if(!t.length)throw new Error("First param string is empty");if(n){if("string"!=typeof n)throw new Error("Second parameter must be a string, got "+typeof n+": "+JSON.stringify(n));if(!n.length)throw new Error("Second param string is empty");this.type=t,this.value=n}else{this.value=t;var r=e.guessTypeOf(this.value);if(!r)throw new Error("Type of attribute was omitted and could not be guessed");this.type=r}}e.getUuid=function(){return new e("uuid",function e(t){return t?(t^16*Math.random()>>t/4).toString(16):([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g,e)}())},e.getUniqueIdValidators=function(){return P},e.isUniqueType=function(e){return Object.keys(P).indexOf(e)>-1};var t=e.prototype;return t.isUniqueType=function(){return e.isUniqueType(this.type)},e.guessTypeOf=function(e){for(var t in P)if(e.match(P[t]))return t},e.equals=function(e,t){return e.equals(t)},t.equals=function(e){return e&&this.type===e.type&&this.value===e.value},t.uri=function(){return encodeURIComponent(this.value)+":"+encodeURIComponent(this.type)},e}();function K(e){return D||(D=j().user()).auth(De.getKey()),e?j().user(e):D}var _={read:!0,write:!0,admin:!1},N=function(){function e(e){var t=this;if(this.theirSecretUuids={},this.theirGroupSecrets={},this.secrets={},this.ourSecretChannelIds={},this.theirSecretChannelIds={},this.messages={},this.chatLinks={},this.groupSubscriptions={},this.directSubscriptions={},this.getParticipantsCallbacks={},this.myGroupSecret=e.myGroupSecret,e.chatLink&&this.useChatLink(e),"string"==typeof e.participants)this.addParticipant(e.participants,e.save);else if(Array.isArray(e.participants)){var n={};e.participants.forEach((function(e){return n[e]=Object.assign({},_)})),e.participants=n}"object"==typeof e.participants&&(Object.keys(e.participants).forEach((function(n){n!==De.getKey().pub&&t.addParticipant(n,e.save,Object.assign({},_,e.participants[n]))})),e.participants[De.getKey().pub]=e.participants[De.getKey().pub]||Object.assign({},_),e.uuid?(this.uuid=e.uuid,this.name=e.name):(e.uuid=z.getUuid().value,this.uuid=e.uuid,e.participants[De.getKey().pub].admin=!0,e.participants[De.getKey().pub].founder=!0),this.getChatLinks({subscribe:!0})),this.participants=e.participants,e.uuid&&(this.putDirect("S"+this.uuid,this.getMyGroupSecret()),this.getMySecretUuid().then((function(e){t.putDirect(t.uuid,e)})),this.onTheirDirect(this.uuid,(function(e,n,r){t.theirSecretUuids[r]=e})),this.onTheirDirect("S"+this.uuid,(function(e,n,r){t.theirGroupSecrets[r]=e}))),this.onTheir("participants",(function(n,r,i){for(var a=!1,s=Object.keys(t.participants),o=0;o44)){n.next=5;break}return j().user().get("chats").get(s).put(null),n.abrupt("return");case 5:return n.next=7,S.gunOnceDefined(j().user().get("chats").get(s).get("pub"));case 7:return l=n.sent,n.next=10,t.SEA.decrypt(l,c);case 10:if(p=n.sent){n.next=13;break}return n.abrupt("return");case 13:p.pub||"string"==typeof p?r(new e({key:o,participants:p.pub||p,save:!1})):p.uuid&&p.participants&&p.myGroupSecret&&r(new e({key:o,participants:p.participants,uuid:p.uuid,myGroupSecret:p.myGroupSecret,save:!1}));case 14:case"end":return n.stop()}}),n)})));return function(e,t){return n.apply(this,arguments)}}(),j().user().get("chats").map().on(l);case 9:case"end":return n.stop()}}),n)})));return function(e,t){return n.apply(this,arguments)}}(),n.getMyGroupSecret=function(){return this.myGroupSecret||this.changeMyGroupSecret(),this.myGroupSecret},n.getOurSecretChannelId=function(){var e=s(i().mark((function e(t){var n;return i().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(this.ourSecretChannelIds[t]){e.next=7;break}return e.next=3,this.getSecret(t);case 3:return n=e.sent,e.next=6,S.getHash(n+t);case 6:this.ourSecretChannelIds[t]=e.sent;case 7:return e.abrupt("return",this.ourSecretChannelIds[t]);case 8:case"end":return e.stop()}}),e,this)})));return function(t){return e.apply(this,arguments)}}(),n.getTheirSecretChannelId=function(){var e=s(i().mark((function e(t){var n;return i().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(this.theirSecretChannelIds[t]){e.next=7;break}return e.next=3,this.getSecret(t);case 3:return n=e.sent,e.next=6,S.getHash(n+De.getKey().pub);case 6:this.theirSecretChannelIds[t]=e.sent;case 7:return e.abrupt("return",this.theirSecretChannelIds[t]);case 8:case"end":return e.stop()}}),e,this)})));return function(t){return e.apply(this,arguments)}}(),n.getMessages=function(){var e=s(i().mark((function e(t){var n,r=this;return i().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(this.getCurrentParticipants().forEach(function(){var e=s(i().mark((function e(n){var a,s;return i().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n===De.getKey().pub){e.next=11;break}if(!r.uuid){e.next=7;break}return e.next=4,r.getTheirSecretUuid(n);case 4:a=e.sent,e.next=10;break;case 7:return e.next=9,r.getTheirSecretChannelId(n);case 9:a=e.sent;case 10:j().user(n).get("chats").get(a).get("msgs").map().once((function(e,i){r.messageReceived(t,e,r.uuid||n,!1,i,n)}));case 11:if(r.uuid){e.next=16;break}return e.next=14,r.getOurSecretChannelId(n);case 14:s=e.sent,K().get("chats").get(s).get("msgs").map().once((function(e,i){r.messageReceived(t,e,n,!0,i,De.getKey().pub)}));case 16:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}()),!this.uuid){e.next=6;break}return e.next=4,this.getMySecretUuid();case 4:n=e.sent,K().get("chats").get(n).get("msgs").map().once((function(e,n){r.messageReceived(t,e,r.uuid,!0,n,De.getKey().pub)}));case 6:case"end":return e.stop()}}),e,this)})));return function(t){return e.apply(this,arguments)}}(),n.messageReceived=function(){var e=s(i().mark((function e(n,r,a,s,o,c){var u,l,p;return i().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!this.messages[o]&&r){e.next=2;break}return e.abrupt("return");case 2:if(!this.uuid){e.next=8;break}return e.next=5,this.getTheirGroupSecret(c);case 5:e.t0=e.sent,e.next=11;break;case 8:return e.next=10,this.getSecret(a);case 10:e.t0=e.sent;case 11:return u=e.t0,e.next=14,t.SEA.decrypt(r,u);case 14:if("object"==typeof(l=e.sent)){e.next=17;break}return e.abrupt("return");case 17:p={selfAuthored:s,channelId:a,from:c},this.messages[o]=l,n(l,p);case 20:case"end":return e.stop()}}),e,this)})));return function(t,n,r,i,a,s){return e.apply(this,arguments)}}(),n.getLatestMsg=function(){var e=s(i().mark((function e(t){var n,r=this;return i().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:n=function(){var e=s(i().mark((function e(n,a){return i().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:r.latest?("string"==typeof r.latest.time?r.latest.time:r.latest.time.toISOString()) '+t.label,i.addEventListener("click",(function(){i.setAttribute("style","display: none"),n?r.setAttribute("style",""):(n=new e(t.channelOptions),r=n.getChatBox(),document.body.appendChild(r))}))},n.getSimpleLink=function(e){return void 0===e&&(e="https://iris.to/"),this.uuid?e+"?channelId="+this.uuid+"&inviter="+De.getKey().pub:e+"?chatWith="+this.getCurrentParticipants()[0]},n.getChatLinks=function(){var n=s(i().mark((function n(r){var a,o,c,u,l,p,h=this;return i().wrap((function(n){for(;;)switch(n.prev=n.next){case 0:if(void 0===r&&(r={}),o=(a=r).callback,u=a.subscribe,c=(c=a.urlRoot)||"https://iris.to/",this.uuid){n.next=5;break}throw new Error("Only group channels may have chat links");case 5:l=[],p={},this.on("chatLinks",(function(n,r){n&&"object"==typeof n&&Object.keys(n).forEach((function(a){var f=n[a];if(null===f)return p[a]&&p[a].off(),delete p[a],void(o&&o({id:a,url:null}));if(-1===l.indexOf(a)){var d=[];l.push(a);var g=e.formatChatLink({urlRoot:c,inviter:r,channelId:h.uuid,sharedSecret:f.sharedSecret,linkId:a});o&&o({url:g,id:a}),u&&j().user(f.sharedKey.pub).get("chatRequests").map().on(function(){var e=s(i().mark((function e(n,r,s,o){var c;return i().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n&&"string"==typeof n&&!(n.length<10)){e.next=2;break}return e.abrupt("return");case 2:if(p[a]=o,c=JSON.stringify(n),-1!==d.indexOf(c)){e.next=10;break}return d.push(c),e.next=8,t.SEA.decrypt(n,f.sharedSecret);case 8:h.addParticipant(e.sent,void 0,void 0,!0);case 10:case"end":return e.stop()}}),e)})));return function(t,n,r,i){return e.apply(this,arguments)}}())}}))}));case 8:case"end":return n.stop()}}),n,this)})));return function(e){return n.apply(this,arguments)}}(),n.createChatLink=function(){var n=s(i().mark((function n(r){var a,s,o,c,u,l,p;return i().wrap((function(n){for(;;)switch(n.prev=n.next){case 0:return void 0===r&&(r="https://iris.to/"),n.next=3,t.SEA.pair();case 3:return a=n.sent,s=JSON.stringify(a),n.next=7,t.SEA.secret(a.epub,a);case 7:return o=n.sent,n.next=10,t.SEA.encrypt(s,o);case 10:return c=n.sent,n.next=13,t.SEA.secret(De.getKey().epub,De.getKey());case 13:return u=n.sent,n.next=16,t.SEA.encrypt(s,u);case 16:return l=n.sent,n.next=19,S.getHash(c);case 19:return p=(p=n.sent).slice(0,12),n.next=23,S.gunAsAnotherUser(j(),a,(function(e){return e.get("chatRequests").put({a:1}).then()}));case 23:return this.chatLinks[p]={sharedKey:a,sharedSecret:o},this.put("chatLinks",this.chatLinks),K().get("chatLinks").get(p).put({encryptedSharedKey:c,ownerEncryptedSharedKey:l}),n.abrupt("return",e.formatChatLink({urlRoot:r,channelId:this.uuid,inviter:De.getKey().pub,sharedSecret:o,linkId:p}));case 27:case"end":return n.stop()}}),n,this)})));return function(e){return n.apply(this,arguments)}}(),n.getChatBox=function(){var t=this;S.injectCss();var n=!1,r=S.createElement("div","iris-chat-box"),i=S.createElement("div","iris-chat-header",r),a=S.createElement("span","iris-chat-minimize",i);a.innerText="—",a.addEventListener("click",(function(e){e.stopPropagation(),r.setAttribute("class","iris-chat-box minimized"),n=!0}));var s=S.createElement("div","iris-chat-header-text",i),o=S.createElement("span","iris-online-indicator",s);o.innerHTML="●";var c=S.createElement("span",void 0,s),u=S.createElement("span","iris-chat-close",i);u.innerHTML="×",u.addEventListener("click",(function(){r.setAttribute("style","display: none");var e=document.getElementById("iris-chat-open-button");e&&e.setAttribute("style","")})),i.addEventListener("click",(function(){n&&(r.setAttribute("class","iris-chat-box"),n=!1)}));var l=S.createElement("div","iris-chat-messages",r),p=S.createElement("div","iris-typing-indicator",r);p.innerText="typing...",this.getTyping((function(e){p.setAttribute("class","iris-typing-indicator"+(e?" yes":""))}));var h=S.createElement("div","iris-chat-input-wrapper",r),f=S.createElement("textarea",void 0,h);if(f.setAttribute("rows","1"),f.setAttribute("placeholder","Type a message"),S.isMobile){var d=S.createElement("button",void 0,h);d.innerHTML='\n \n ',d.addEventListener("click",(function(){t.send(f.value),f.value="",t.setTyping(!1)}))}var g=this.getCurrentParticipants();if(g.length){var m=g[0];j().user(m).get("profile").get("name").on((function(e){return c.innerText=e})),e.getActivity(j(),m,(function(e){o.setAttribute("class","iris-online-indicator"+(e.isActive?" yes":"")),l.querySelectorAll(".iris-chat-message:not(.delivered)").forEach((function(t){if(t.getAttribute("data-time")<=e.lastActive){var n=t.getAttribute("class");t.setAttribute("class",n+" delivered")}}))}))}return this.getTheirMsgsLastSeenTime((function(e){l.querySelectorAll(".iris-seen:not(.yes)").forEach((function(t){var n=t.parentElement.parentElement.parentElement;if(n.getAttribute("data-time")<=e){var r=n.getAttribute("class");-1===r.indexOf("delivered")&&n.setAttribute("class",r+" delivered"),t.setAttribute("class","iris-seen yes")}}))})),this.getMessages((function(e,n){var r=S.createElement("div","iris-msg-content");r.innerText=e.text;var i=S.createElement("div","time",r);i.innerText=S.formatTime(new Date(e.time)),n.selfAuthored&&(S.createElement("span",t.theirMsgsLastSeenTime>=e.time?"iris-seen yes":"iris-seen",i).innerHTML=' '),r.innerHTML=r.innerHTML.replace(/\n/g,"
\n");var a=S.createElement("div",(n.selfAuthored?"our":"their")+" iris-chat-message");a.appendChild(r),a.setAttribute("data-time",e.time);for(var s=l.children.length;s>=0;s--)if(0===s)l.insertBefore(a,l.firstChild);else{var o=l.children[s-1].getAttribute("data-time");if(o&&onew Date(i.getTime()-1e4)&&a=0?Z:0,H().get("unseenMsgsTotal").put(Z)}},webPushSubscriptions:ee,subscribeToWebPush:function(){return se.apply(this,arguments)},getWebPushSubscriptions:function(){return le.apply(this,arguments)},removeSubscription:function(e){delete ee[e],j().user().get("webPushSubscriptions").get(e).put(null),oe()}},Me=S.isElectron?new t({peers:["http://localhost:8768/gun"],file:"State.electron",multicast:!1,localStorage:!1}).get("state"):null,Le={},Ie=new Map,Ce="hyECQHwSo7fgr2MVfPyakvayPeixxsaAWVtZ-vbaiSc.TXIp8MnCtrnW6n2MrYquWPcc-DTmZzMBmc2yaGv9gIU",je={electron:{openAtLogin:!0,minimizeOnClose:!0},local:{enableWebtorrent:!S.isMobile,enablePublicPeerDiscovery:!0,autoplayWebtorrent:!0,maxConnectedPeers:S.isElectron?2:1}},De={init:function(e){var t=this;if(void 0===e&&(e={}),!Ee){Ee=!0;var n=localStorage.getItem("chatKeyPair");n?this.login(JSON.parse(n)):!1!==e.autologin?this.loginAsNewUser(e):this.clearIndexedDB(),setTimeout((function(){H().get("block").map((function(){t.updateSearchIndex()})),t.updateSearchIndex()})),setInterval((function(){if(t.taskQueue.length){var e=t.taskQueue.shift();e&&e()}}),10)}},DEFAULT_SETTINGS:je,DEFAULT_FOLLOW:Ce,taskQueue:[],updateSearchIndex:d((function(){var e=Object.values(v(Le,Object.keys(J())));Ae=new r(e,{keys:["name"],includeScore:!0,includeMatches:!0,threshold:.3}),H().get("searchIndexUpdated").put(!0)}),2e3),saveSearchResult:d((function(e){H().get("contacts").get(e).put({followDistance:Le[e].followDistance,followerCount:Le[e].followers.size})}),1e3),addFollow:function(e,t,n,r){Le[t]?(Le[t].followDistance>n&&(Le[t].followDistance=n),r&&Le[t].followers.add(r)):(Le[t]={key:t,followDistance:n,followers:new Set(r&&[r])},this.taskQueue.push((function(){K(t).get("profile").get("name").on((function(n){Le[t].name=n,H().get("contacts").get(t).get("name").put(n),e&&e(t,Le[t])}))}))),this.saveSearchResult(t),e&&e(t,Le[t]),this.updateSearchIndex(),this.updateNoFollows(),this.updateNoFollowers()},removeFollow:function(e,t,n){1===t&&(H().get("contacts").get(e).put(!1),H().get("groups").get("follows").get(e).put(!1),Le[e]&&(Le[e].followers.delete(n),this.updateNoFollows(),this.updateNoFollowers())),console.log("removeFollow",e,t,n),Le[e]&&0===Le[e].followers.size&&(delete Le[e],H().get("contacts").get(e).put(!1),H().get("groups").get("everyone").get(e).put(!1))},getExtendedFollows:function(e,t,n,r){var i=this;void 0===t&&(t=ve.pub),void 0===n&&(n=3),void 0===r&&(r=1);var a=Ie.get(t);if(!(a&&a<=r))return Ie.set(t,r),this.addFollow(e,t,r-1),K(t).get("follow").map().on((function(a,s){a?(i.addFollow(e,s,r,t),r0);e!==Se&&(Se=e,H().get("noFollowers").put(Se))}),1e3),getSearchIndex:function(){return Ae},setOurOnlineStatus:function(){var e=window.location.hash;N.setActivity(xe="active");var t=g((function(){var t=R(e&&e.replace("#/profile/","").replace("#/chat/",""));t&&!xe&&t.setMyMsgsLastSeenTime(),N.setActivity(xe="active"),clearTimeout(we),we=setTimeout((function(){return N.setActivity(xe="online")}),3e4)}),1e3);document.addEventListener("touchmove",t),document.addEventListener("mousemove",t),document.addEventListener("keypress",t),document.addEventListener("visibilitychange",(function(){if("visible"===document.visibilityState){N.setActivity(xe="active");var t=location.pathname.slice(1).replace("chat/",""),n=e&&R(t);n&&(n.setMyMsgsLastSeenTime(),Oe.changeChatUnseenCount(t,0))}else N.setActivity(xe="online")})),t(),window.addEventListener("beforeunload",(function(){N.setActivity(xe=null)}))},updateGroups:function(){var e=this;this.getExtendedFollows((function(t,n){n.followDistance<=1&&H().get("groups").get("follows").get(t).put(!0),H().get("groups").get("everyone").get(t).put(!0),t===e.getPubKey()&&e.updateNoFollowers()}))},login:function(e){var t=this,n=!!ve;ve=e,localStorage.setItem("chatKeyPair",JSON.stringify(e)),K().auth(ve),K().put({epub:ve.epub}),K().get("likes").put({a:null}),K().get("msgs").put({a:null}),K().get("replies").put({a:null}),Oe.subscribeToWebPush(),Oe.getWebPushSubscriptions(),Oe.subscribeToIrisNotifications(),N.getMyChatLinks(void 0,(function(e){H().get("chatLinks").get(e.id).put(e.url),be=e.url})),this.setOurOnlineStatus(),N.getChannels((function(e){return t.addChannel(e)})),K().get("profile").get("name").on((function(e){e&&"string"==typeof e&&(ye=e)})),Oe.init(),H().get("loggedIn").put(!0),H().get("settings").once().then((function(e){e?void 0!==e.enableWebtorrent&&void 0!==e.autoplayWebtorrent||(H().get("settings").get("enableWebtorrent").put(je.local.enableWebtorrent),H().get("settings").get("autoplayWebtorrent").put(je.local.autoplayWebtorrent)):H().get("settings").put(je.local)})),K().get("block").map().on((function(e,t){H().get("block").get(t).put(e),e&&delete Le[t]})),this.updateGroups(),n&&location.reload(),Me&&(Me.get("settings").on((function(e){H().get("settings").get("electron").put(e)})),Me.get("user").put(ve.pub)),H().get("filters").get("group").once().then((function(e){e||H().get("filters").get("group").put("follows")}))},loginAsNewUser:function(e){var n=this;void 0===e&&(e={});var r=e.name||S.generateName();return console.log("loginAsNewUser name",r),t.SEA.pair().then((function(t){n.login(t),K().get("profile").put({a:null}),K().get("profile").get("name").put(r),H().get("filters").put({a:null}),H().get("filters").get("group").put("follows"),N.createChatLink().then((function(e){return be=e})),setTimeout((function(){!1!==e.autofollow&&(console.log("autofollowing",Ce),K().get("follow").get(Ce).put(!0))}),1e3)}))},logOut:function(){var e=this;return s(i().mark((function t(){var r,a,s;return i().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(Me&&Me.get("user").put(null),!navigator.serviceWorker){t.next=16;break}return t.next=4,navigator.serviceWorker.getRegistration();case 4:if(!(r=t.sent)||!r.pushManager){t.next=16;break}return null==(a=r.active)||a.postMessage({key:null}),t.next=9,r.pushManager.getSubscription();case 9:if(!(s=t.sent)){t.next=16;break}return t.next=13,S.getHash(JSON.stringify(s));case 13:Oe.removeSubscription(t.sent),s.unsubscribe&&s.unsubscribe();case 16:e.clearIndexedDB(),localStorage.clear(),n.clear().then((function(){window.location.hash="",window.location.href="/",location.reload()}));case 19:case"end":return t.stop()}}),t)})))()},clearIndexedDB:function(){return new Promise((function(e){var t=window.indexedDB.deleteDatabase("local()"),n=window.indexedDB.deleteDatabase("radata"),r=!1,i=!1,a=function(){r&&i&&e(void 0)};t.onerror=n.onerror=function(e){return console.error(e)},t.onsuccess=function(){r=!0,a()},n.onsuccess=function(){i=!0,a()}}))},getMyChatLink:function(){return be||S.getProfileLink(ve.pub)},getKey:function(){return ve},getPubKey:function(){return ve&&ve.pub},getMyName:function(){return ye},myPeerUrl:function(e){return"http://"+e+":8767/gun"},shareMyPeerUrl:function(e){var t=this;return s(i().mark((function n(){var r;return i().wrap((function(n){for(;;)switch(n.prev=n.next){case 0:return n.next=2,H().get("settings").get("electron").get("publicIp").once();case 2:(r=n.sent)&&e.put&&e.put("my_peer",t.myPeerUrl(r));case 4:case"end":return n.stop()}}),n)})))()},newChannel:function(e,t){if(e&&!this.channelIds.has(e)){var n=R(e,t);return this.addChannel(n),n}},addChannel:function(e){var t=this;this.taskQueue.push((function(){var n=e.getId();if(!t.channelIds.has(n)){t.channelIds.add(n);var r=H().get("channels").get(n);if(r.get("latestTime").on((function(t){t&&(!e.latestTime||t>e.latestTime)&&(e.latestTime=t)})),r.get("theirMsgsLastSeenTime").on((function(t){if(t){var n=new Date(t);(!e.theirMsgsLastSeenDate||e.theirMsgsLastSeenDate=e.theirMsgsLastSeenTime&&(e.theirMsgsLastSeenTime=t,r.get("theirMsgsLastSeenTime").put(t))})),e.getMyMsgsLastSeenTime((function(t){e.myLastSeenTime=new Date(t),e.latest&&e.myLastSeenTime>=e.latest.time&&Oe.changeChatUnseenCount(n,0)})),e.isTyping=!1,e.getTyping((function(t){e.isTyping=t,H().get("channels").get(n).get("isTyping").put(t)})),e.online={},N.getActivity(n,(function(t){e&&(r.put({theirLastActiveTime:t&&t.lastActive,activity:t&&t.isActive&&t.status}),e.activity=t)})),e.uuid){var i=window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches;e.participantProfiles={},e.on("name",(function(t){e.name=t,Le[e.uuid]={name:t,uuid:e.uuid},H().get("channels").get(e.uuid).get("name").put(t)})),e.on("photo",(function(t){Le[e.uuid]=Le[e.uuid]||{},Le[e.uuid].photo=t,H().get("channels").get(e.uuid).get("photo").put(t)})),e.on("about",(function(t){return H().get("channels").get(e.uuid).get("about").put(t)})),e.getParticipants((function(t){if(delete t.undefined,"object"==typeof t){var n=Object.keys(t);n.forEach((function(r,a){var s=360/Math.max(n.length,2)*a;e.participantProfiles[r]={permissions:t[r],color:"hsl("+s+", 98%, "+(i?80:33)+"%)"},K(r).get("profile").get("name").on((function(t){e.participantProfiles[r].name=t}))}))}H().get("channels").get(e.uuid).get("participants").put(t)})),e.inviteLinks={},e.getChatLinks({callback:function(t){var n=t.url,r=t.id;console.log("got chat link",r,n),e.inviteLinks[r]=n,H().get("inviteLinksChanged").put(!0)}})}else K(n).get("profile").get("name").on((function(e){return H().get("channels").get(n).get("name").put(e)}));if(e.put){e.onTheir("webPushSubscriptions",(function(t,r,i){Array.isArray(t)&&(e.webPushSubscriptions=e.webPushSubscriptions||{},e.webPushSubscriptions[i||n]=t)}));var a=Object.values(Oe.webPushSubscriptions);setTimeout((function(){return e.put("webPushSubscriptions",a)}),5e3),t.shareMyPeerUrl(e)}e.onTheir("call",(function(e){H().get("call").put({pub:n,call:e})})),H().get("channels").get(n).put({enabled:!0})}}))},processMessage:function(e,t,n,r){var i=R(e);i.messageIds=i.messageIds||{},i.messageIds[t.time+n.from]||(i.messageIds[t.time+n.from]=!0,n&&(t=Object.assign(t,n)),t.invite?this.newChannel(t.invite.group,"https://iris.to/?channelId="+t.invite.group+"&inviter="+e):(t.selfAuthored=n.selfAuthored,H().get("channels").get(e).get("msgs").get(t.time+(t.from&&t.from.slice(0,10))).put(JSON.stringify(t)),t.timeObj=new Date(t.time),!n.selfAuthored&&t.timeObj>i.myLastSeenTime&&(window.location.hash!=="#/chat/"+e||"visible"!==document.visibilityState?Oe.changeChatUnseenCount(e,1):"active"===xe&&i.setMyMsgsLastSeenTime()),!n.selfAuthored&&t.time>i.theirMsgsLastSeenTime&&H().get("channels").get(e).get("theirMsgsLastSeenTime").put(t.time),(!i.latestTime||t.time>i.latestTime)&&H().get("channels").get(e).put({latestTime:t.time,latest:{time:t.time,text:t.text,selfAuthored:n.selfAuthored}}),Oe.notifyMsg(t,n,e,r)))},subscribeToMsgs:function(e){var t=this,n=R(e);n.subscribed||(n.subscribed=!0,n.getMessages((function(n,r){t.processMessage(e,n,r)})))},channelIds:new Set},Pe={get:function(e,t){return new Promise((function(n,r){e||r("No hash provided"),"string"!=typeof e&&r("Hash must be a string"),j().get("#").get(e).on((function(e,r,i,a){e&&(a.off(),t&&t(e),n(e))}))}))},put:function(e){return s(i().mark((function t(){var n;return i().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,S.getHash(e);case 2:return n=t.sent,j().get("#").get(n).put(e),t.abrupt("return",n);case 5:case"end":return t.stop()}}),t)})))()}},ze=function(){function e(){}return e.getActiveKey=function(){var t=s(i().mark((function t(n,r,a){var s,o,c,u,l;return i().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(void 0===n&&(n="."),void 0===r&&(r="iris.key"),!Te){t.next=4;break}return t.abrupt("return",Te);case 4:if(!a){t.next=21;break}if(!a.existsSync(s=n+"/"+r)){t.next=11;break}o=a.readFileSync(s,"utf8"),Te=e.fromString(o),t.next=17;break;case 11:return t.next=13,e.generate();case 13:c=t.sent,a.writeFileSync(s,e.toString(Te=Te||c)),a.chmodSync(s,400);case 17:if(Te){t.next=19;break}throw new Error("loading default key failed - check "+n+"/"+r);case 19:t.next=33;break;case 21:if(!(u=window.localStorage.getItem("iris.myKey"))){t.next=26;break}Te=e.fromString(u),t.next=31;break;case 26:return t.next=28,e.generate();case 28:l=t.sent,Te=Te||l,window.localStorage.setItem("iris.myKey",e.toString(Te));case 31:if(Te){t.next=33;break}throw new Error("loading default key failed - check localStorage iris.myKey");case 33:return t.abrupt("return",Te);case 34:case"end":return t.stop()}}),t)})));return function(e,n,r){return t.apply(this,arguments)}}(),e.getDefault=function(t,n){return void 0===t&&(t="."),void 0===n&&(n="iris.key"),e.getActiveKey(t,n)},e.getActivePub=function(){var t=s(i().mark((function t(n,r){return i().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return void 0===n&&(n="."),void 0===r&&(r="iris.key"),t.next=4,e.getActiveKey(n,r);case 4:return t.abrupt("return",t.sent.pub);case 6:case"end":return t.stop()}}),t)})));return function(e,n){return t.apply(this,arguments)}}(),e.setActiveKey=function(t,n,r,i,a){if(void 0===n&&(n=!0),void 0===r&&(r="."),void 0===i&&(i="iris.key"),Te=t,n)if(S.isNode){var s=r+"/"+i;a.writeFileSync(s,e.toString(Te)),a.chmodSync(s,400)}else window.localStorage.setItem("iris.myKey",e.toString(Te))},e.toString=function(e){return JSON.stringify(e)},e.getId=function(e){if(!e||!e.pub)throw new Error("missing param");return e.pub},e.fromString=function(e){return JSON.parse(e)},e.generate=function(){return t.SEA.pair()},e.sign=function(){var e=s(i().mark((function e(n,r){return i().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,t.SEA.sign(n,r);case 2:return e.abrupt("return","a"+e.sent);case 4:case"end":return e.stop()}}),e)})));return function(t,n){return e.apply(this,arguments)}}(),e.verify=function(e,n){return t.SEA.verify(e.slice(1),n)},e}(),Ke="Invalid message:",_e=function(e){var t,n;function r(){return e.apply(this,arguments)||this}return n=e,(t=r).prototype=Object.create(n.prototype),t.prototype.constructor=t,c(t,n),r}(p(Error)),Ne=function(){function e(e){if(this.signedData=e.signedData,this.pubKey=e.pubKey,e.sig){if("string"!=typeof e.sig)throw new _e("SignedMessage signature must be a string");this.sig=e.sig,this.getHash()}this._validate()}e._getArray=function(e){for(var t=[],n=Object.keys(e),r=0;re.maxRating)throw new _e(Ke+" Rating is above maxRating");if(e.rating(this.signedData.maxRating+this.signedData.minRating)/2},t.isNegative=function(){return"rating"===this.signedData.type&&this.signedData.rating<(this.signedData.maxRating+this.signedData.minRating)/2},t.isNeutral=function(){return"rating"===this.signedData.type&&this.signedData.rating===(this.signedData.maxRating+this.signedData.minRating)/2},t.sign=function(){var e=s(i().mark((function e(t){return i().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,ze.sign(this.signedData,t);case 2:return this.sig=e.sent,this.pubKey=t.pub,e.next=6,this.getHash();case 6:return e.abrupt("return",!0);case 7:case"end":return e.stop()}}),e,this)})));return function(t){return e.apply(this,arguments)}}(),e.create=function(){var t=s(i().mark((function t(n,r){var a;return i().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(!n.author&&r&&(n.author={keyID:ze.getId(r)}),n.time=n.time||(new Date).toISOString(),a=new e({signedData:n}),!r){t.next=6;break}return t.next=6,a.sign(r);case 6:return t.abrupt("return",a);case 7:case"end":return t.stop()}}),t)})));return function(e,n){return t.apply(this,arguments)}}(),e.createVerification=function(t,n){return t.type="verification",e.create(t,n)},e.createRating=function(t,n){return t.type="rating",t.context=t.context||"iris",t.maxRating=t.maxRating||10,t.minRating=t.minRating||-10,e.create(t,n)},t.getAuthor=function(e){for(var t,n=f(this.getAuthorIterable());!(t=n()).done;){var r=t.value;if(r.isUniqueType())return e.getContacts(r)}},t.getRecipient=function(e){if(this.signedData.recipient)for(var t,n=f(this.getRecipientIterable());!(t=n()).done;){var r=t.value;if(r.isUniqueType())return e.getContacts(r)}},t.getHash=function(){var e=s(i().mark((function e(){return i().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!this.sig||this.hash){e.next=4;break}return e.next=3,S.getHash(this.sig);case 3:this.hash=e.sent;case 4:return e.abrupt("return",this.hash);case 5:case"end":return e.stop()}}),e,this)})));return function(){return e.apply(this,arguments)}}(),t.getId=function(){return this.getHash()},e.fromSig=function(){var t=s(i().mark((function t(n){var r;return i().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(n.sig){t.next=2;break}throw new Error("Missing signature in object:",n);case 2:if(n.pubKey){t.next=4;break}throw new Error("Missing pubKey in object:");case 4:return r=JSON.parse(n.sig.slice(4)).m,t.abrupt("return",new e({signedData:r,sig:n.sig,pubKey:n.pubKey}));case 7:case"end":return t.stop()}}),t)})));return function(e){return t.apply(this,arguments)}}(),t.verify=function(){var e=s(i().mark((function e(){return i().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(this.pubKey){e.next=2;break}throw new _e(Ke+" SignedMessage has no .pubKey");case 2:if(this.sig){e.next=4;break}throw new _e(Ke+" SignedMessage has no .sig");case 4:return e.next=6,ze.verify(this.sig,this.pubKey);case 6:if(this.signedData=e.sent,this.signedData){e.next=9;break}throw new _e(Ke+" Invalid signature");case 9:if(!this.hash){e.next=18;break}return e.t0=this.hash,e.next=13,S.getHash(this.sig);case 13:if(e.t1=e.sent,e.t0===e.t1){e.next=16;break}throw new _e(Ke+" Invalid message hash");case 16:e.next=19;break;case 18:this.getHash();case 19:return e.abrupt("return",!0);case 20:case"end":return e.stop()}}),e,this)})));return function(){return e.apply(this,arguments)}}(),t.serialize=function(){return{sig:this.sig,pubKey:this.pubKey}},t.toString=function(){return JSON.stringify(this.serialize())},e.deserialize=function(){var t=s(i().mark((function t(n){return i().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.abrupt("return",e.fromSig(n));case 1:case"end":return t.stop()}}),t)})));return function(e){return t.apply(this,arguments)}}(),e.fromString=function(){var t=s(i().mark((function t(n){return i().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.abrupt("return",e.fromSig(JSON.parse(n)));case 1:case"end":return t.stop()}}),t)})));return function(e){return t.apply(this,arguments)}}(),e.setReaction=function(){var e=s(i().mark((function e(t,n,r){var a;return i().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,n.getHash();case 2:a=e.sent,t.get("reactions").get(a).put(r),t.get("reactions").get(a).put(r),t.get("messagesByHash").get(a).get("reactions").get(this.rootContact.value).put(r),t.get("messagesByHash").get(a).get("reactions").get(this.rootContact.value).put(r);case 7:case"end":return e.stop()}}),e,this)})));return function(t,n,r){return e.apply(this,arguments)}}(),e}();exports.default={local:H,global:j,group:Q,public:K,private:R,static:Pe,electron:Me,peers:C,session:De,util:S,notifications:Oe,SEA:t.SEA,Gun:t,SignedMessage:Ne,Channel:N,Node:F}; +"use strict";function e(e){return e&&"object"==typeof e&&"default"in e?e.default:e}Object.defineProperty(exports,"__esModule",{value:!0});var t=e(require("quick-lru")),n=e(require("dexie")),r=e(require("fuse.js"));function i(){i=function(){return e};var e={},t=Object.prototype,n=t.hasOwnProperty,r="function"==typeof Symbol?Symbol:{},a=r.iterator||"@@iterator",s=r.asyncIterator||"@@asyncIterator",o=r.toStringTag||"@@toStringTag";function u(e,t,n){return Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}),e[t]}try{u({},"")}catch(e){u=function(e,t,n){return e[t]=n}}function c(e,t,n,r){var i=Object.create((t&&t.prototype instanceof f?t:f).prototype),a=new O(r||[]);return i._invoke=function(e,t,n){var r="suspendedStart";return function(i,a){if("executing"===r)throw new Error("Generator is already running");if("completed"===r){if("throw"===i)throw a;return{value:void 0,done:!0}}for(n.method=i,n.arg=a;;){var s=n.delegate;if(s){var o=k(s,n);if(o){if(o===p)continue;return o}}if("next"===n.method)n.sent=n._sent=n.arg;else if("throw"===n.method){if("suspendedStart"===r)throw r="completed",n.arg;n.dispatchException(n.arg)}else"return"===n.method&&n.abrupt("return",n.arg);r="executing";var u=l(e,t,n);if("normal"===u.type){if(r=n.done?"completed":"suspendedYield",u.arg===p)continue;return{value:u.arg,done:n.done}}"throw"===u.type&&(r="completed",n.method="throw",n.arg=u.arg)}}}(e,n,a),i}function l(e,t,n){try{return{type:"normal",arg:e.call(t,n)}}catch(e){return{type:"throw",arg:e}}}e.wrap=c;var p={};function f(){}function h(){}function d(){}var g={};u(g,a,(function(){return this}));var v=Object.getPrototypeOf,y=v&&v(v(T([])));y&&y!==t&&n.call(y,a)&&(g=y);var m=d.prototype=f.prototype=Object.create(g);function b(e){["next","throw","return"].forEach((function(t){u(e,t,(function(e){return this._invoke(t,e)}))}))}function w(e,t){var r;this._invoke=function(i,a){function s(){return new t((function(r,s){!function r(i,a,s,o){var u=l(e[i],e,a);if("throw"!==u.type){var c=u.arg,p=c.value;return p&&"object"==typeof p&&n.call(p,"__await")?t.resolve(p.__await).then((function(e){r("next",e,s,o)}),(function(e){r("throw",e,s,o)})):t.resolve(p).then((function(e){c.value=e,s(c)}),(function(e){return r("throw",e,s,o)}))}o(u.arg)}(i,a,r,s)}))}return r=r?r.then(s,s):s()}}function k(e,t){var n=e.iterator[t.method];if(void 0===n){if(t.delegate=null,"throw"===t.method){if(e.iterator.return&&(t.method="return",t.arg=void 0,k(e,t),"throw"===t.method))return p;t.method="throw",t.arg=new TypeError("The iterator does not provide a 'throw' method")}return p}var r=l(n,e.iterator,t.arg);if("throw"===r.type)return t.method="throw",t.arg=r.arg,t.delegate=null,p;var i=r.arg;return i?i.done?(t[e.resultName]=i.value,t.next=e.nextLoc,"return"!==t.method&&(t.method="next",t.arg=void 0),t.delegate=null,p):i:(t.method="throw",t.arg=new TypeError("iterator result is not an object"),t.delegate=null,p)}function x(e){var t={tryLoc:e[0]};1 in e&&(t.catchLoc=e[1]),2 in e&&(t.finallyLoc=e[2],t.afterLoc=e[3]),this.tryEntries.push(t)}function S(e){var t=e.completion||{};t.type="normal",delete t.arg,e.completion=t}function O(e){this.tryEntries=[{tryLoc:"root"}],e.forEach(x,this),this.reset(!0)}function T(e){if(e){var t=e[a];if(t)return t.call(e);if("function"==typeof e.next)return e;if(!isNaN(e.length)){var r=-1,i=function t(){for(;++r=0;--i){var a=this.tryEntries[i],s=a.completion;if("root"===a.tryLoc)return r("end");if(a.tryLoc<=this.prev){var o=n.call(a,"catchLoc"),u=n.call(a,"finallyLoc");if(o&&u){if(this.prev=0;--r){var i=this.tryEntries[r];if(i.tryLoc<=this.prev&&n.call(i,"finallyLoc")&&this.prev=0;--t){var n=this.tryEntries[t];if(n.finallyLoc===e)return this.complete(n.completion,n.afterLoc),S(n),p}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.tryLoc===e){var r=n.completion;if("throw"===r.type){var i=r.arg;S(n)}return i}}throw new Error("illegal catch attempt")},delegateYield:function(e,t,n){return this.delegate={iterator:T(e),resultName:t,nextLoc:n},"next"===this.method&&(this.arg=void 0),p}},e}function a(e,t,n,r,i,a,s){try{var o=e[a](s),u=o.value}catch(e){return void n(e)}o.done?t(u):Promise.resolve(u).then(r,i)}function s(e){return function(){var t=this,n=arguments;return new Promise((function(r,i){var s=e.apply(t,n);function o(e){a(s,r,i,o,u,"next",e)}function u(e){a(s,r,i,o,u,"throw",e)}o(void 0)}))}}function o(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,c(e,t)}function u(e){return(u=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function c(e,t){return(c=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function l(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}function p(e,t,n){return(p=l()?Reflect.construct.bind():function(e,t,n){var r=[null];r.push.apply(r,t);var i=new(Function.bind.apply(e,r));return n&&c(i,n.prototype),i}).apply(null,arguments)}function f(e){var t="function"==typeof Map?new Map:void 0;return(f=function(e){if(null===e||-1===Function.toString.call(e).indexOf("[native code]"))return e;if("function"!=typeof e)throw new TypeError("Super expression must either be null or a function");if(void 0!==t){if(t.has(e))return t.get(e);t.set(e,n)}function n(){return p(e,arguments,u(this).constructor)}return n.prototype=Object.create(e.prototype,{constructor:{value:n,enumerable:!1,writable:!0,configurable:!0}}),c(n,e)})(e)}function h(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function d(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n=e.length?{done:!0}:{done:!1,value:e[r++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var v={throttle:function(e,t){var n;return function(){var r=arguments,i=this;n||(e.apply(i,r),n=!0,setTimeout((function(){return n=!1}),t))}},debounce:function(e,t){var n;return function(){var r=arguments,i=this;clearTimeout(n),n=setTimeout((function(){return e.apply(i,r)}),t)}},sample:function(e){return e[Math.floor(Math.random()*e.length)]},sampleSize:function(e,t){for(var n,r,i=e.slice(0),a=e.length,s=a-t;a-- >s;)n=i[r=Math.floor((a+1)*Math.random())],i[r]=i[a],i[a]=n;return i.slice(s)},defer:function(e){return setTimeout(e,0)},once:function(e){var t=!1;return function(){t||(t=!0,e.apply(this,arguments))}},omit:function(e,t){var n={};return Object.keys(e).forEach((function(r){t.includes(r)||(n[r]=e[r])})),n},defaults:function(e,t){return Object.keys(t).forEach((function(n){void 0===e[n]&&(e[n]=t[n])})),e},pickBy:function(e,t){var n={};return Object.keys(e).forEach((function(r){t(e[r])&&(n[r]=e[r])})),n},isEqual:function(e,t){if(e===t)return!0;if(e instanceof Date&&t instanceof Date)return e.getTime()===t.getTime();if(!e||!t||"object"!=typeof e&&"object"!=typeof t)return e!=e&&t!=t;if(e.prototype!==t.prototype)return!1;var n=Object.keys(e);return n.length===Object.keys(t).length&&n.every((function(n){return v.isEqual(e[n],t[n])}))},uniq:function(e){var t=new Set(e);return Array.from(t)}},y=!1;try{y="[object process]"===Object.prototype.toString.call(global.process)}catch(e){}var m,b=!y&&navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase(),w=b&&b.indexOf(" electron/")>-1,k=["canidae","felidae","cat","cattle","dog","donkey","goat","horse","pig","rabbit","aardvark","aardwolf","albatross","alligator","alpaca","amphibian","anaconda","angelfish","anglerfish","ant","anteater","antelope","antlion","ape","aphid","armadillo","asp","baboon","badger","bandicoot","barnacle","barracuda","basilisk","bass","bat","bear","beaver","bedbug","bee","beetle","bird","bison","blackbird","boa","boar","bobcat","bobolink","bonobo","booby","bovid","bug","butterfly","buzzard","camel","canid","capybara","cardinal","caribou","carp","cat","catshark","caterpillar","catfish","cattle","centipede","cephalopod","chameleon","cheetah","chickadee","chicken","chimpanzee","chinchilla","chipmunk","clam","clownfish","cobra","cockroach","cod","condor","constrictor","coral","cougar","cow","coyote","crab","crane","crawdad","crayfish","cricket","crocodile","crow","cuckoo","cicada","damselfly","deer","dingo","dinosaur","dog","dolphin","donkey","dormouse","dove","dragonfly","dragon","duck","eagle","earthworm","earwig","echidna","eel","egret","elephant","elk","emu","ermine","falcon","ferret","finch","firefly","fish","flamingo","flea","fly","flyingfish","fowl","fox","frog","gamefowl","galliform","gazelle","gecko","gerbil","gibbon","giraffe","goat","goldfish","goose","gopher","gorilla","grasshopper","grouse","guan","guanaco","guineafowl","gull","guppy","haddock","halibut","hamster","hare","harrier","hawk","hedgehog","heron","herring","hippopotamus","hookworm","hornet","horse","hoverfly","hummingbird","hyena","iguana","impala","jackal","jaguar","jay","jellyfish","junglefowl","kangaroo","kingfisher","kite","kiwi","koala","koi","krill","ladybug","lamprey","landfowl","lark","leech","lemming","lemur","leopard","leopon","limpet","lion","lizard","llama","lobster","locust","loon","louse","lungfish","lynx","macaw","mackerel","magpie","mammal","manatee","mandrill","marlin","marmoset","marmot","marsupial","marten","mastodon","meadowlark","meerkat","mink","minnow","mite","mockingbird","mole","mollusk","mongoose","monkey","moose","mosquito","moth","mouse","mule","muskox","narwhal","newt","nightingale","ocelot","octopus","opossum","orangutan","orca","ostrich","otter","owl","ox","panda","panther","parakeet","parrot","parrotfish","partridge","peacock","peafowl","pelican","penguin","perch","pheasant","pig","pigeon","pike","pinniped","piranha","planarian","platypus","pony","porcupine","porpoise","possum","prawn","primate","ptarmigan","puffin","puma","python","quail","quelea","quokka","rabbit","raccoon","rat","rattlesnake","raven","reindeer","reptile","rhinoceros","roadrunner","rodent","rook","rooster","roundworm","sailfish","salamander","salmon","sawfish","scallop","scorpion","seahorse","shark","sheep","shrew","shrimp","silkworm","silverfish","skink","skunk","sloth","slug","smelt","snail","snake","snipe","sole","sparrow","spider","spoonbill","squid","squirrel","starfish","stingray","stoat","stork","sturgeon","swallow","swan","swift","swordfish","swordtail","tahr","takin","tapir","tarantula","tarsier","termite","tern","thrush","tick","tiger","tiglon","toad","tortoise","toucan","trout","tuna","turkey","turtle","tyrannosaurus","urial","vicuna","viper","vole","vulture","wallaby","walrus","wasp","warbler","weasel","whale","whippet","whitefish","wildcat","wildebeest","wildfowl","wolf","wolverine","wombat","woodpecker","worm","wren","xerinae","yak","zebra","alpaca","cat","cattle","chicken","dog","donkey","ferret","gayal","goldfish","guppy","horse","koi","llama","sheep","yak","unicorn"],x=["average","big","colossal","fat","giant","gigantic","great","huge","immense","large","little","long","mammoth","massive","miniature","petite","puny","short","small","tall","tiny","boiling","breezy","broken","bumpy","chilly","cold","cool","creepy","crooked","cuddly","curly","damaged","damp","dirty","dry","dusty","filthy","flaky","fluffy","wet","broad","chubby","crooked","curved","deep","flat","high","hollow","low","narrow","round","shallow","skinny","square","steep","straight","wide","ancient","brief","early","fast","late","long","modern","old","quick","rapid","short","slow","swift","young","abundant","empty","few","heavy","light","many","numerous","Sound","cooing","deafening","faint","harsh","hissing","hushed","husky","loud","melodic","moaning","mute","noisy","purring","quiet","raspy","resonant","screeching","shrill","silent","soft","squealing","thundering","voiceless","whispering","bitter","delicious","fresh","juicy","ripe","rotten","salty","sour","spicy","stale","sticky","strong","sweet","tasteless","tasty","thirsty","fluttering","fuzzy","greasy","grubby","hard","hot","icy","loose","melted","plastic","prickly","rainy","rough","scattered","shaggy","shaky","sharp","shivering","silky","slimy","slippery","smooth","soft","solid","steady","sticky","tender","tight","uneven","weak","wet","wooden","afraid","angry","annoyed","anxious","arrogant","ashamed","awful","bad","bewildered","bored","combative","condemned","confused","creepy","cruel","dangerous","defeated","defiant","depressed","disgusted","disturbed","eerie","embarrassed","envious","evil","fierce","foolish","frantic","frightened","grieving","helpless","homeless","hungry","hurt","ill","jealous","lonely","mysterious","naughty","nervous","obnoxious","outrageous","panicky","repulsive","scary","scornful","selfish","sore","tense","terrible","thoughtless","tired","troubled","upset","uptight","weary","wicked","worried","agreeable","amused","brave","calm","charming","cheerful","comfortable","cooperative","courageous","delightful","determined","eager","elated","enchanting","encouraging","energetic","enthusiastic","excited","exuberant","fair","faithful","fantastic","fine","friendly","funny","gentle","glorious","good","happy","healthy","helpful","hilarious","jolly","joyous","kind","lively","lovely","lucky","obedient","perfect","pleasant","proud","relieved","silly","smiling","splendid","successful","thoughtful","victorious","vivacious","witty","wonderful","zealous","zany","other","good","new","old","great","high","small","different","large","local","social","important","long","young","national","british","right","early","possible","big","little","political","able","late","general","full","far","low","public","available","bad","main","sure","clear","major","economic","only","likely","real","black","particular","international","special","difficult","certain","open","whole","white","free","short","easy","strong","european","central","similar","human","common","necessary","single","personal","hard","private","poor","financial","wide","foreign","simple","recent","concerned","american","various","close","fine","english","wrong","present","royal","natural","individual","nice","french","nihilist","solipsist","materialist","surrealist","heroic","awesome","hedonist","absurd","current","modern","labour","legal","happy","final","red","normal","serious","previous","total","prime","significant","industrial","sorry","dead","specific","appropriate","top","soviet","basic","military","original","successful","aware","hon","popular","heavy","professional","direct","dark","cold","ready","green","useful","effective","western","traditional","scottish","german","independent","deep","interesting","considerable","involved","physical","hot","existing","responsible","complete","medical","blue","extra","past","male","interested","fair","essential","beautiful","civil","primary","obvious","future","environmental","positive","senior","nuclear","annual","relevant","huge","rich","commercial","safe","regional","practical","official","separate","key","chief","regular","due","additional","active","powerful","complex","standard","impossible","light","warm","middle","fresh","sexual","front","domestic","actual","united","technical","ordinary","cheap","strange","internal","excellent","quiet","soft","potential","northern","religious","quick","very","famous","cultural","proper","broad","joint","formal","limited","conservative","lovely","usual","ltd","unable","rural","initial","substantial","bright","average","leading","reasonable","immediate","suitable","equal","detailed","working","overall","female","afraid","democratic","growing","sufficient","scientific","eastern","correct","inc","irish","expensive","educational","mental","dangerous","critical","increased","familiar","unlikely","double","perfect","slow","tiny","dry","historical","thin","daily","southern","increasing","wild","alone","urban","empty","married","narrow","liberal","supposed","upper","apparent","tall","busy","bloody","prepared","russian","moral","careful","clean","attractive","japanese","vital","thick","alternative","fast","ancient","elderly","rare","external","capable","brief","wonderful","grand","typical","entire","grey","constant","vast","surprised","ideal","terrible","academic","funny","minor","pleased","severe","ill","corporate","negative","permanent","weak","brown","fundamental","odd","crucial","inner","used","criminal","contemporary","sharp","sick","near","roman","massive","unique","secondary","parliamentary","african","unknown","subsequent","angry","alive","guilty","lucky","enormous","well","yellow","unusual","net","tough","dear","extensive","glad","remaining","agricultural","alright","healthy","italian","principal","tired","efficient","comfortable","chinese","relative","friendly","conventional","willing","sudden","proposed","voluntary","slight","valuable","dramatic","golden","temporary","federal","keen","flat","silent","indian","worried","pale","statutory","welsh","dependent","firm","wet","competitive","armed","radical","outside","acceptable","sensitive","living","pure","global","emotional","sad","secret","rapid","adequate","fixed","sweet","administrative","wooden","remarkable","comprehensive","surprising","solid","rough","mere","mass","brilliant","maximum","absolute","electronic","visual","electric","cool","spanish","literary","continuing","supreme","chemical","genuine","exciting","written","advanced","extreme","classical","fit","favourite","widespread","confident","straight","proud","numerous","opposite","distinct","mad","helpful","given","disabled","consistent","anxious","nervous","awful","stable","constitutional","satisfied","conscious","developing","strategic","holy","smooth","dominant","remote","theoretical","outstanding","pink","pretty","clinical","minimum","honest","impressive","related","residential","extraordinary","plain","visible","accurate","distant","still","greek","complicated","musical","precise","gentle","broken","live","silly","fat","tight","monetary","round","psychological","violent","unemployed","inevitable","junior","sensible","grateful","pleasant","dirty","structural","welcome","deaf","above","continuous","blind","overseas","mean","entitled","delighted","loose","occasional","evident","desperate","fellow","universal","square","steady","classic","equivalent","intellectual","victorian","level","ultimate","creative","lost","medieval","clever","linguistic","convinced","judicial","raw","sophisticated","asleep","vulnerable","illegal","outer","revolutionary","bitter","changing","australian","native","imperial","strict","wise","informal","flexible","collective","frequent","experimental","spiritual","intense","rational","generous","inadequate","prominent","logical","bare","historic","modest","dutch","acute","electrical","valid","weekly","gross","automatic","loud","reliable","mutual","liable","multiple","ruling","curious","sole","managing","pregnant","latin","nearby","exact","underlying","identical","satisfactory","marginal","distinctive","electoral","urgent","presidential","controversial","everyday","encouraging","organic","continued","expected","statistical","desirable","innocent","improved","exclusive","marked","experienced","unexpected","superb","sheer","disappointed","frightened","gastric","romantic","naked","reluctant","magnificent","convenient","established","closed","uncertain","artificial","diplomatic","tremendous","marine","mechanical","retail","institutional","mixed","required","biological","known","functional","straightforward","superior","digital","spectacular","unhappy","confused","unfair","aggressive","spare","painful","abstract","asian","associated","legislative","monthly","intelligent","hungry","explicit","nasty","just","faint","coloured","ridiculous","amazing","comparable","successive","realistic","back","decent","decentralized","bitcoin","cypherpunk","unnecessary","flying","random","influential","dull","genetic","neat","marvellous","crazy","damp","giant","secure","bottom","skilled","subtle","elegant","brave","lesser","parallel","steep","intensive","casual","tropical","lonely","partial","preliminary","concrete","alleged","assistant","vertical","upset","delicate","mild","occupational","excessive","progressive","exceptional","integrated","striking","continental","okay","harsh","combined","fierce","handsome","characteristic","chronic","compulsory","interim","objective","splendid","magic","systematic","obliged","payable","fun","horrible","primitive","fascinating","ideological","metropolitan","surrounding","estimated","peaceful","premier","operational","technological","kind","advisory","hostile","precious","accessible","determined","excited","impressed","provincial","smart","endless","isolated","drunk","geographical","like","dynamic","boring","forthcoming","unfortunate","definite","super","notable","indirect","stiff","wealthy","awkward","lively","neutral","artistic","content","mature","colonial","ambitious","evil","magnetic","verbal","legitimate","sympathetic","empirical","head","shallow","vague","naval","depressed","shared","added","shocked","mid","worthwhile","qualified","missing","blank","absent","favourable","polish","israeli","developed","profound","representative","enthusiastic","dreadful","rigid","reduced","cruel","coastal","peculiar","swiss","crude","extended","selected","eager","canadian","bold","relaxed","corresponding","running","planned","applicable","immense","allied","comparative","uncomfortable","conservation","productive","beneficial","bored","charming","minimal","mobile","turkish","orange","rear","passive","suspicious","overwhelming","fatal","resulting","symbolic","registered","neighbouring","calm","irrelevant","patient","compact","profitable","rival","loyal","moderate","distinguished","interior","noble","insufficient","eligible","mysterious","varying","managerial","molecular","olympic","linear","prospective","printed","parental","diverse","elaborate","furious","fiscal","burning","useless","semantic","embarrassed","inherent","philosophical","deliberate","awake","variable","promising","unpleasant","varied","sacred","selective","inclined","tender","hidden","worthy","intermediate","sound","protective","fortunate","slim","defensive","divine","stuck","driving","invisible","misleading","circular","mathematical","inappropriate","liquid","persistent","solar","doubtful","manual","architectural","intact","incredible","devoted","prior","tragic","respectable","optimistic","convincing","unacceptable","decisive","competent","spatial","respective","binding","relieved","nursing","toxic","select","redundant","integral","then","probable","amateur","fond","passing","specified","territorial","horizontal","inland","cognitive","regulatory","miserable","resident","polite","scared","gothic","civilian","instant","lengthy","adverse","korean","unconscious","anonymous","aesthetic","orthodox","static","unaware","costly","fantastic","foolish","fashionable","causal","compatible","wee","implicit","dual","ok","cheerful","subjective","forward","surviving","exotic","purple","cautious","visiting","aggregate","ethical","teenage","dying","disastrous","delicious","confidential","underground","thorough","grim","autonomous","atomic","frozen","colourful","injured","uniform","ashamed","glorious","wicked","coherent","rising","shy","novel","balanced","delightful","arbitrary","adjacent","worrying","weird","unchanged","rolling","evolutionary","intimate","sporting","disciplinary","formidable","lexical","noisy","gradual","accused","homeless","supporting","coming","renewed","excess","retired","rubber","chosen","outdoor","embarrassing","preferred","bizarre","appalling","agreed","imaginative","governing","accepted","vocational","mighty","puzzled","worldwide","organisational","sunny","eldest","eventual","spontaneous","vivid","rude","faithful","ministerial","innovative","controlled","conceptual","unwilling","civic","meaningful","alive","brainy","breakable","busy","careful","cautious","clever","concerned","crazy","curious","dead","different","difficult","doubtful","easy","famous","fragile","helpful","helpless","important","impossible","innocent","inquisitive","modern","open","outstanding","poor","powerful","puzzled","real","rich","shy","sleepy","super","tame","uninterested","wandering","wild","wrong","adorable","alert","average","beautiful","blonde","bloody","blushing","bright","clean","clear","cloudy","colorful","crowded","cute","dark","drab","distinct","dull","elegant","fancy","filthy","glamorous","gleaming","graceful","grotesque","homely","light","misty","motionless","muddy","plain","poised","quaint","shiny","smoggy","sparkling","spotless","stormy","strange","ugly","unsightly","unusual","bad","better","beautiful","big","black","blue","bright","clumsy","crazy","dizzy","dull","fat","frail","friendly","funny","great","green","gigantic","gorgeous","grumpy","handsome","happy","horrible","itchy","jittery","jolly","kind","long","lazy","magnificent","magenta","many","mighty","mushy","nasty","new","nice","nosy","nutty","nutritious","odd","orange","ordinary","pretty","precious","prickly","purple","quaint","quiet","quick","quickest","rainy","rare","ratty","red","roasted","robust","round","sad","scary","scrawny","short","silly","stingy","strange","striped","spotty","tart","tall","tame","tan","tender","testy","tricky","tough","ugly","ugliest","vast","watery","wasteful","wonderful","yellow","yummy","zany"],S={gunOnceDefined:function(e){return new Promise((function(t){e.on((function(e,n,r,i){void 0!==e&&(i.off(),t(e))}))}))},getHash:function(e,t){var n=this;return s(i().mark((function r(){var a,s,o;return i().wrap((function(r){for(;;)switch(r.prev=r.next){case 0:if(void 0===t&&(t="base64"),void 0!==e){r.next=3;break}throw new Error("getHash data was undefined");case 3:return"string"!=typeof e&&(e=JSON.stringify(e)),a=new TextEncoder,e=a.encode(e),r.next=8,crypto.subtle.digest("SHA-256",e);case 8:if(s=r.sent,"buffer"!==t){r.next=11;break}return r.abrupt("return",s);case 11:if(o=n.arrayBufferToBase64(s),"hex"!==t){r.next=14;break}return r.abrupt("return",n.base64ToHex(o));case 14:return r.abrupt("return",o);case 15:case"end":return r.stop()}}),r)})))()},capitalize:function(e){return e.charAt(0).toUpperCase()+e.slice(1)},generateName:function(){return this.capitalize(v.sample(x))+" "+this.capitalize(v.sample(k))},base64ToHex:function(e){for(var t=atob(e),n="",r=0;rt?e.slice(0,t)+"...":e},createElement:function(e,t,n){var r=document.createElement(e);return t&&r.setAttribute("class",t),n&&n.appendChild(r),r},isNode:y,isElectron:w,isMobile:!y&&function(){if(w)return!1;var e,t=!1;return e=navigator.userAgent||navigator.vendor||"",(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(e)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(e.substr(0,4)))&&(t=!0),t}(),throttle:function(e,t){var n;return function(){var r=arguments,i=this;n||(e.apply(i,r),n=!0,setTimeout((function(){return n=!1}),t))}},debounce:function(e,t){var n;return function(){var r=this,i=arguments;clearTimeout(n),n=setTimeout((function(){return e.apply(r,i)}),t)}},sample:function(e){return e[Math.floor(Math.random()*e.length)]},sampleSize:function(e,t){for(var n,r,i=e.slice(0),a=e.length,s=a-t;a-- >s;)n=i[r=Math.floor((a+1)*Math.random())],i[r]=i[a],i[a]=n;return i.slice(s)},defer:function(e){return setTimeout(e,0)},once:function(e){var t=!1;return function(){t||(t=!0,e.apply(this,arguments))}},omit:function(e,t){var n={};return Object.keys(e).forEach((function(r){t.includes(r)||(n[r]=e[r])})),n}},O={getActiveKey:function(e,t,n){var r=this;return s(i().mark((function a(){var s,o,u,c,l;return i().wrap((function(i){for(;;)switch(i.prev=i.next){case 0:if(void 0===e&&(e="."),void 0===t&&(t="iris.key"),!m){i.next=4;break}return i.abrupt("return",m);case 4:if(!n){i.next=21;break}if(!n.existsSync(s=e+"/"+t)){i.next=11;break}o=n.readFileSync(s,"utf8"),m=r.fromString(o),i.next=17;break;case 11:return i.next=13,r.generate();case 13:u=i.sent,n.writeFileSync(s,r.toString(m=m||u)),n.chmodSync(s,400);case 17:if(m){i.next=19;break}throw new Error("loading default key failed - check "+e+"/"+t);case 19:i.next=33;break;case 21:if(!(c=window.localStorage.getItem("iris.myKey"))){i.next=26;break}m=r.fromString(c),i.next=31;break;case 26:return i.next=28,r.generate();case 28:l=i.sent,m=m||l,window.localStorage.setItem("iris.myKey",r.toString(m));case 31:if(m){i.next=33;break}throw new Error("loading default key failed - check localStorage iris.myKey");case 33:return i.abrupt("return",m);case 34:case"end":return i.stop()}}),a)})))()},getDefault:function(e,t){return void 0===e&&(e="."),void 0===t&&(t="iris.key"),this.getActiveKey(e,t)},getActivePub:function(e,t){var n=this;return s(i().mark((function r(){return i().wrap((function(r){for(;;)switch(r.prev=r.next){case 0:return void 0===e&&(e="."),void 0===t&&(t="iris.key"),r.next=4,n.getActiveKey(e,t);case 4:return r.abrupt("return",r.sent.pub);case 6:case"end":return r.stop()}}),r)})))()},setActiveKey:function(e,t,n,r,i){if(void 0===t&&(t=!0),void 0===n&&(n="."),void 0===r&&(r="iris.key"),m=e,t)if(S.isNode){var a=n+"/"+r;i.writeFileSync(a,this.toString(m)),i.chmodSync(a,400)}else window.localStorage.setItem("iris.myKey",this.toString(m))},toString:function(e){return JSON.stringify(e)},getId:function(e){if(!e||!e.pub)throw new Error("missing param");return e.pub},fromString:function(e){return JSON.parse(e)},generate:function(){return s(i().mark((function e(){var t,n,r;return i().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,t=window.crypto.subtle,e.next=4,t.generateKey({name:"ECDSA",namedCurve:"P-256"},!0,["sign","verify"]).then(function(){var e=s(i().mark((function e(n){var r,a;return i().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r={},e.next=3,t.exportKey("jwk",n.privateKey);case 3:return r.priv=e.sent.d,e.next=6,t.exportKey("jwk",n.publicKey);case 6:return r.pub=(a=e.sent).x+"."+a.y,e.abrupt("return",r);case 9:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}());case 4:return n=e.sent,e.prev=5,e.next=8,t.generateKey({name:"ECDH",namedCurve:"P-256"},!0,["deriveKey"]).then(function(){var e=s(i().mark((function e(n){var r,a;return i().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r={},e.next=3,t.exportKey("jwk",n.privateKey);case 3:return r.epriv=e.sent.d,e.next=6,t.exportKey("jwk",n.publicKey);case 6:return r.epub=(a=e.sent).x+"."+a.y,e.abrupt("return",r);case 9:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}());case 8:r=e.sent,e.next=18;break;case 11:if(e.prev=11,e.t0=e.catch(5),"Error: ECDH is not a supported algorithm"!=e.t0){e.next=17;break}console.log("Ignoring ECDH..."),e.next=18;break;case 17:throw e.t0;case 18:return e.abrupt("return",{pub:n.pub,priv:n.priv,epub:(r=r||{}).epub,epriv:r.epriv});case 23:throw e.prev=23,e.t1=e.catch(0),console.log(e.t1),e.t1;case 28:case"end":return e.stop()}}),e,null,[[0,23],[5,11]])})))()},keyToJwk:function(e){"string"==typeof e&&(e={pub:e});var t={kty:"EC",crv:"P-256",x:e.pub.split(".")[0],y:e.pub.split(".")[1],ext:!0};return t.key_ops=e.priv?["sign"]:["verify"],e.priv&&(t.d=e.priv),t},sign:function(e,t,n,r){var a=this;return s(i().mark((function s(){var o,u,c,l;return i().wrap((function(i){for(;;)switch(i.prev=i.next){case 0:if(void 0===r&&(r={}),void 0!==e){i.next=3;break}throw"`undefined` not allowed.";case 3:return o="string"==typeof e?e:JSON.stringify(e),u=a.keyToJwk(t),i.next=7,S.getHash(o,"buffer");case 7:return c=i.sent,i.next=10,window.crypto.subtle.importKey("jwk",u,{name:"ECDSA",namedCurve:"P-256"},!1,["sign"]).then((function(e){return window.crypto.subtle.sign({name:"ECDSA",hash:{name:"SHA-256"}},e,c)}));case 10:if(l={m:o,s:Buffer.from(i.sent).toString(r.encode||"base64")},r.raw||(l="aSEA"+JSON.stringify(l)),n)try{n(l)}catch(e){console.log(e)}return i.abrupt("return",l);case 15:case"end":return i.stop()}}),s)})))()},verify:function(e,t,n,r){var a=this;return s(i().mark((function s(){var o,u,c,l,p,f,h;return i().wrap((function(i){for(;;)switch(i.prev=i.next){case 0:if(void 0===r&&(r={}),i.prev=1,"string"==typeof e){"aSEA"===e.slice(0,4)&&(e=e.slice(4));try{e=JSON.parse(e)}catch(e){}}return o=a.keyToJwk(t.pub||t),i.next=7,crypto.subtle.importKey("jwk",o,{name:"ECDSA",namedCurve:"P-256"},!1,["verify"]);case 7:u=i.sent,c=e.m;try{c=JSON.parse(c)}catch(e){}return i.next=12,S.getHash(c,"buffer");case 12:return l=i.sent,p=Buffer.from(e.s,r.encode||"base64"),f=new Uint8Array(p),i.next=17,crypto.subtle.verify({name:"ECDSA",hash:{name:"SHA-256"}},u,f,l);case 17:if(h=i.sent?JSON.parse(c):void 0,n)try{n(h)}catch(e){console.log(e)}return i.abrupt("return",h);case 24:return i.prev=24,i.t0=i.catch(1),console.log(i.t0),i.abrupt("return",void 0);case 28:case"end":return i.stop()}}),s,null,[[1,24]])})))()},secret:function(e,t){return s(i().mark((function n(){var r,a,o,u,c,l;return i().wrap((function(n){for(;;)switch(n.prev=n.next){case 0:return a=t.epub,o=t.epriv,u=(r=function(e,t){var n=e.split(".");return Object.assign(t?{d:t}:{},{x:n[0],y:n[1],kty:"EC",crv:"P-256",ext:!0})})(e.epub||e),n.t0=Object,n.next=8,crypto.subtle.importKey("jwk",u,{name:"ECDH",namedCurve:"P-256"},!0,[]);case 8:return n.t1=n.sent,n.t2={public:n.t1},n.t3={name:"ECDH",namedCurve:"P-256"},c=n.t0.assign.call(n.t0,n.t2,n.t3),l=r(a,o),n.abrupt("return",crypto.subtle.importKey("jwk",l,{name:"ECDH",namedCurve:"P-256"},!1,["deriveBits"]).then(function(){var e=s(i().mark((function e(t){var n;return i().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,crypto.subtle.deriveBits(c,t,256);case 2:return n=new Uint8Array(e.sent),e.next=6,crypto.subtle.importKey("raw",n,{name:"AES-GCM",length:256},!0,["encrypt","decrypt"]);case 6:return e.abrupt("return",crypto.subtle.exportKey("jwk",e.sent).then((function(e){return e.k})));case 8:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}()));case 14:case"end":return n.stop()}}),n)})))()},aeskey:function(e,t){var n=this;return s(i().mark((function r(){var a,s,o,u,c;return i().wrap((function(r){for(;;)switch(r.prev=r.next){case 0:return a=e+(t||n.random(8)).toString("utf8"),r.next=3,crypto.subtle.digest({name:"SHA-256"},(new TextEncoder).encode(a));case 3:return s=r.sent,s=Buffer.from(s,"binary"),o=s.toString("base64"),u=o.replace(/\+/g,"-").replace(/\//g,"_").replace(/\=/g,""),c={kty:"oct",k:u,ext:!1,alg:"A256GCM"},r.next=10,crypto.subtle.importKey("jwk",c,{name:"AES-GCM"},!1,["encrypt","decrypt"]);case 10:return r.abrupt("return",r.sent);case 11:case"end":return r.stop()}}),r)})))()},random:function(e){return Buffer.from(crypto.getRandomValues(new Uint8Array(e)))},encrypt:function(e,t,n,r){var a=this;return s(i().mark((function s(){var o,u,c,l;return i().wrap((function(i){for(;;)switch(i.prev=i.next){case 0:if(void 0===r&&(r={}),o=t.epriv||t,void 0!==e){i.next=4;break}throw"`undefined` not allowed.";case 4:return u="string"==typeof e?e:JSON.stringify(e),c={s:a.random(9),iv:a.random(15)},i.next=8,a.aeskey(o,c.s).then((function(e){return crypto.subtle.encrypt({name:r.name||"AES-GCM",iv:new Uint8Array(c.iv)},e,(new TextEncoder).encode(u))}));case 8:if(l={ct:Buffer.from(i.sent,"binary").toString(r.encode||"base64"),iv:c.iv.toString(r.encode||"base64"),s:c.s.toString(r.encode||"base64")},r.raw||(l="SEA"+JSON.stringify(l)),n)try{n(l)}catch(e){console.log(e)}return i.abrupt("return",l);case 13:case"end":return i.stop()}}),s)})))()},decrypt:function(e,t,n,r){var a=this;return s(i().mark((function s(){var o,u,c,l,p,f,h,d;return i().wrap((function(i){for(;;)switch(i.prev=i.next){case 0:void 0===r&&(r={}),o=t.epriv||t;try{e=JSON.parse(e)}catch(e){}if((u=0===e.indexOf("SEA{")?JSON.parse(e.slice(3)):JSON.parse(e)).ct&&u.iv&&u.s){i.next=6;break}throw"Invalid ciphertext "+u;case 6:return c=Buffer.from(u.s,r.encode||"base64"),l=Buffer.from(u.iv,r.encode||"base64"),p=Buffer.from(u.ct,r.encode||"base64"),i.next=11,a.aeskey(o,c).then((function(e){return crypto.subtle.decrypt({name:r.name||"AES-GCM",iv:new Uint8Array(l),tagLength:128},e,new Uint8Array(p))}));case 11:f=i.sent,h=new TextDecoder("utf8").decode(f),d=h;try{d=JSON.parse(h)}catch(e){}if(n)try{n(d)}catch(e){console.log(e)}return i.abrupt("return",d);case 17:case"end":return i.stop()}}),s)})))()}},T="http://localhost:8767/gun",M={"wss://gun-rs.iris.to/gun":{}};if(self.window){var j=window.location,C=j.host,P=C.startsWith("localhost")&&"localhost:8080"!==C;(j.hostname.endsWith("herokuapp.com")||P)&&(Object.keys(M).forEach((function(e){return M[e].enabled=!1})),M[j.origin+"/gun"]={enabled:!0})}var I={known:{},add:function(e){var t=this;return s(i().mark((function n(){var r,a,s,o;return i().wrap((function(n){for(;;)switch(n.prev=n.next){case 0:if(e.from&&Object.keys(t.known).forEach((function(n){t.known[n].from===e.from&&delete t.known[n]})),t.known[r=e.url||""]=t.known[r]||v.omit(e,["url"]),"public"!==e.visibility){n.next=17;break}return n.next=6,O.secret(Je.getKey().epub,Je.getKey());case 6:if(n.t0=n.sent,n.t0){n.next=9;break}n.t0="";case 9:return a=n.t0,n.next=12,O.encrypt(e.url,a);case 12:return s=n.sent,n.next=15,S.getHash(s);case 15:o=n.sent,H().user().get("peers").get(o).put({url:e.url,lastSeen:(new Date).toISOString()});case 17:!1!==e.enabled?e.url&&t.connect(e.url):t.save();case 18:case"end":return n.stop()}}),n)})))()},remove:function(e){delete this.known[e],this.save()},disconnect:function(e){H().on("bye",e),e.url=""},save:function(){localStorage.setItem("gunPeers",JSON.stringify(this.known))},getSaved:function(){var e=localStorage.getItem("gunPeers");return e=e&&"undefined"!==e?JSON.parse(e):M,S.isElectron&&(e[T]={}),Object.keys(e).forEach((function(t){return v.defaults(e[t],{enabled:!0})})),e},reset:function(){localStorage.setItem("gunPeers",""),this.known=this.getSaved()},connect:function(e){e&&(this.isMixedContent(e)||(this.known[e]?(this.known[e].enabled=!0,H().opt({peers:[e]}),this.save()):this.add({url:e})))},disable:function(e,t){this.known[e].enabled=!1,t&&this.disconnect(t),this.save()},isMixedContent:function(e){return!!e&&"https:"===window.location.protocol&&0===e.indexOf("http:")},random:function(){var e=this,t=S.isElectron&&this.known[T]&&!1!==this.known[T].enabled,n=t?Math.max(0,1):1,r=v.sampleSize(Object.keys(v.pickBy(this.known,(function(t,n){return!e.isMixedContent(n)&&t.enabled&&!(S.isElectron&&n===T)}))),n);return r&&t&&r.push(T),console.log("sample",r,JSON.stringify(this.known)),r},checkGunPeerCount:function(){},init:function(){var e=this;this.known=this.getSaved(),setInterval((function(){return e.checkGunPeerCount()}),1e3)}},E=function(){function e(e){void 0===e&&(e="xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,(function(e){var t=16*Math.random()|0;return("x"==e?t:3&t|8).toString(16)}))),this.id=e}var t=e.prototype;return t.handle=function(e){throw new Error("not implemented")},t.postMessage=function(e){this.handle(e)},e}(),A=function(){function e(){}return e.fromObject=function(e){if("get"===e.type)return D.fromObject(e);if("put"===e.type)return N.fromObject(e);throw new Error("not implemented")},e.deserialize=function(){var e=s(i().mark((function e(t,n){var r;return i().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!(r=JSON.parse(t)).get){e.next=5;break}return e.abrupt("return",D.deserialize(r,t,n));case 5:if(!r.put){e.next=9;break}return e.abrupt("return",N.deserialize(r,t,n));case 9:if(!r.dam||"hi"!==r.dam){e.next=13;break}return e.abrupt("return",_.deserialize(r));case 13:throw new Error("unknown message type");case 14:case"end":return e.stop()}}),e)})));return function(t,n){return e.apply(this,arguments)}}(),e.prototype.serialize=function(){throw new Error("not implemented")},e}();function L(){return Math.random().toString(36).slice(2,10)}var K,D=function(){function e(e,t,n,r,i,a,s){this.type="get",this.id=e,this.from=n,this.nodeId=t,this.recipients=r,this.childKey=i,this.jsonStr=a,this.checksum=s}return e.prototype.serialize=function(){if(this.jsonStr)return this.jsonStr;var e=this.nodeId.replace(/^global\//,"").replace(/^user\//,"~"),t={"#":this.id,get:{"#":e,".":this.childKey}};return this.childKey&&(t.get["."]=this.childKey),this.jsonStr=JSON.stringify(t),this.jsonStr},e.deserialize=function(){var t=s(i().mark((function t(n,r,a){var s,o;return i().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return s=n["#"],(o=n.get["#"]).startsWith("~")&&(o="user/"+o.slice(1)),t.abrupt("return",new e(s,o="global/"+o,a,void 0,n.get["."],r));case 6:case"end":return t.stop()}}),t)})));return function(e,n,r){return t.apply(this,arguments)}}(),e.fromObject=function(t){return new e(t.id,t.nodeId,t.from,t.recipients,t.childKey,t.jsonStr,t.checksum)},e.new=function(t,n,r,i,a,s){return new e(L(),t,n,r,i,a,s)},e}(),N=function(){function e(e,t,n,r,i,a,s){this.type="put",this.id=e,this.from=n,this.updatedNodes=t,this.inResponseTo=r,this.recipients=i,this.jsonStr=a,this.checksum=s}return e.prototype.serialize=function(){for(var e={"#":this.id,put:{}},t=0,n=Object.entries(this.updatedNodes);t"]=s._[">"]||{},s._[">"][l]=f.updatedAt}}return JSON.stringify(e)},e.deserialize=function(){var t=s(i().mark((function t(n,r,a){var s,o,u,c,l,p,f,h,d,g,v,y,m,b,w,k,x,S,T;return i().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:s=n["#"],o={},u=0,c=Object.entries(n.put);case 3:if(!(u":f._[">"][m]}),t.next=23,O.verify({s:x,m:S},w);case 23:if(t.t0=t.sent,t.t1=void 0,t.t0!==t.t1){t.next=27;break}throw new Error("invalid signature in "+p+" of "+S);case 27:h[m]={value:b,updatedAt:f._[">"][m]};case 29:g++,t.next=9;break;case 32:T="global/"+p.replace(/^~/,"user/"),o[T]=h;case 34:u++,t.next=3;break;case 37:return t.abrupt("return",new e(s,o,a,void 0,void 0,r));case 38:case"end":return t.stop()}}),t)})));return function(e,n,r){return t.apply(this,arguments)}}(),e.fromObject=function(t){return new e(t.id,t.updatedNodes,t.from,t.inResponseTo,t.recipients,t.jsonStr,t.checksum)},e.new=function(t,n,r,i,a,s){return new e(L(),t,n,r,i,a,s)},e.newFromKv=function(t,n,r){var i={};return i[t]=n,e.new(i,r)},e}(),_=function(){function e(e,t){this.type="hi",this.peerId=e,this.jsonStr=t}return e.prototype.serialize=function(){return this.jsonStr||(this.jsonStr=JSON.stringify({dam:"hi","#":this.peerId})),this.jsonStr},e.deserialize=function(t){return new e(t["#"])},e}(),U=function(e){function n(n){var r;return void 0===n&&(n={}),(r=e.call(this)||this).config={},r.store=new t({maxSize:1e4}),r.config=n,r}o(n,e);var r=n.prototype;return r.handle=function(e){e instanceof N?this.handlePut(e):e instanceof D?this.handleGet(e):console.log("Memory got unknown message",e)},r.handleGet=function(e){if(e.from){var t=this.store.get(e.nodeId);if(t){var n=N.newFromKv(e.nodeId,t,this);n.inResponseTo=e.id,e.from&&e.from.postMessage(n)}}else console.log("no from in get message")},r.mergeAndSave=function(e,t){var n=this.store.get(e);if(void 0===n)this.store.set(e,t);else{for(var r=0,i=Object.entries(t);r=o.updatedAt||(n[s]=o)}this.store.set(e,n)}},r.handlePut=function(){var e=s(i().mark((function e(t){var n,r,a,s,o;return i().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:n=0,r=Object.entries(t.updatedNodes);case 1:if(!(n=u.updatedAt||(r[o]=u)}n.put(e,r)}}))},n.savePath=function(e,t){void 0===t?(this.db.nodes.delete(e),this.notStored.add(e)):(this.notStored.delete(e),this.mergeAndSave(e,t))},n.handlePut=function(){var e=s(i().mark((function e(t){var n,r,a,s,o;return i().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:n=0,r=Object.entries(t.updatedNodes);case 1:if(!(n>t/4).toString(16):([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g,e)}())},e.getUniqueIdValidators=function(){return W},e.isUniqueType=function(e){return Object.keys(W).indexOf(e)>-1};var t=e.prototype;return t.isUniqueType=function(){return e.isUniqueType(this.type)},e.guessTypeOf=function(e){for(var t in W)if(e.match(W[t]))return t},e.equals=function(e,t){return e.equals(t)},t.equals=function(e){return e&&this.type===e.type&&this.value===e.value},t.uri=function(){return encodeURIComponent(this.value)+":"+encodeURIComponent(this.type)},e}();function Q(e){if(void 0===e&&(e=Je.getKey()),"string"==typeof e)return H().user(e);if("object"==typeof e){var t=H().user(e.pub);return t.auth(e),t}}var Y,$={read:!0,write:!0,admin:!1},Z=function(){function e(e){var t=this;if(this.theirSecretUuids={},this.theirGroupSecrets={},this.secrets={},this.ourSecretChannelIds={},this.theirSecretChannelIds={},this.messages={},this.chatLinks={},this.groupSubscriptions={},this.directSubscriptions={},this.getParticipantsCallbacks={},this.myGroupSecret=e.myGroupSecret,e.chatLink&&this.useChatLink(e),"string"==typeof e.participants)this.addParticipant(e.participants,e.save);else if(Array.isArray(e.participants)){var n={};e.participants.forEach((function(e){return n[e]=Object.assign({},$)})),e.participants=n}"object"==typeof e.participants&&(Object.keys(e.participants).forEach((function(n){n!==Je.getKey().pub&&t.addParticipant(n,e.save,Object.assign({},$,e.participants[n]))})),e.participants[Je.getKey().pub]=e.participants[Je.getKey().pub]||Object.assign({},$),e.uuid?(this.uuid=e.uuid,this.name=e.name):(e.uuid=B.getUuid().value,this.uuid=e.uuid,e.participants[Je.getKey().pub].admin=!0,e.participants[Je.getKey().pub].founder=!0),this.getChatLinks({subscribe:!0})),this.participants=e.participants,e.uuid&&(this.putDirect("S"+this.uuid,this.getMyGroupSecret()),this.getMySecretUuid().then((function(e){t.putDirect(t.uuid,e)})),this.onTheirDirect(this.uuid,(function(e,n,r){t.theirSecretUuids[r]=e})),this.onTheirDirect("S"+this.uuid,(function(e,n,r){t.theirGroupSecrets[r]=e}))),this.onTheir("participants",(function(n,r,i){for(var a=!1,s=Object.keys(t.participants),o=0;o44)){t.next=5;break}return H().user().get("chats").get(s).put(null),t.abrupt("return");case 5:return t.next=7,S.gunOnceDefined(H().user().get("chats").get(s).get("pub"));case 7:return c=t.sent,t.next=10,O.decrypt(c,o);case 10:if(l=t.sent){t.next=13;break}return t.abrupt("return");case 13:l.pub||"string"==typeof l?n(new e({key:a,participants:l.pub||l,save:!1})):l.uuid&&l.participants&&l.myGroupSecret&&n(new e({key:a,participants:l.participants,uuid:l.uuid,myGroupSecret:l.myGroupSecret,save:!1}));case 14:case"end":return t.stop()}}),t)})));return function(e,n){return t.apply(this,arguments)}}(),H().user().get("chats").map(c);case 9:case"end":return t.stop()}}),t)})));return function(e,n){return t.apply(this,arguments)}}(),t.getMyGroupSecret=function(){return this.myGroupSecret||this.changeMyGroupSecret(),this.myGroupSecret},t.getOurSecretChannelId=function(){var e=s(i().mark((function e(t){var n;return i().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(this.ourSecretChannelIds[t]){e.next=7;break}return e.next=3,this.getSecret(t);case 3:return n=e.sent,e.next=6,S.getHash(n+t);case 6:this.ourSecretChannelIds[t]=e.sent;case 7:return e.abrupt("return",this.ourSecretChannelIds[t]);case 8:case"end":return e.stop()}}),e,this)})));return function(t){return e.apply(this,arguments)}}(),t.getTheirSecretChannelId=function(){var e=s(i().mark((function e(t){var n;return i().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(this.theirSecretChannelIds[t]){e.next=7;break}return e.next=3,this.getSecret(t);case 3:return n=e.sent,e.next=6,S.getHash(n+Je.getKey().pub);case 6:this.theirSecretChannelIds[t]=e.sent;case 7:return e.abrupt("return",this.theirSecretChannelIds[t]);case 8:case"end":return e.stop()}}),e,this)})));return function(t){return e.apply(this,arguments)}}(),t.getMessages=function(){var e=s(i().mark((function e(t){var n,r=this;return i().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(this.getCurrentParticipants().forEach(function(){var e=s(i().mark((function e(n){var a,s;return i().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n===Je.getKey().pub){e.next=11;break}if(!r.uuid){e.next=7;break}return e.next=4,r.getTheirSecretUuid(n);case 4:a=e.sent,e.next=10;break;case 7:return e.next=9,r.getTheirSecretChannelId(n);case 9:a=e.sent;case 10:H().user(n).get("chats").get(a).get("msgs").map((function(e,i){r.messageReceived(t,e,r.uuid||n,!1,i,n)}));case 11:if(r.uuid){e.next=16;break}return e.next=14,r.getOurSecretChannelId(n);case 14:s=e.sent,Q().get("chats").get(s).get("msgs").map((function(e,i){r.messageReceived(t,e,n,!0,i,Je.getKey().pub)}));case 16:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}()),!this.uuid){e.next=6;break}return e.next=4,this.getMySecretUuid();case 4:n=e.sent,Q().get("chats").get(n).get("msgs").map((function(e,n){r.messageReceived(t,e,r.uuid,!0,n,Je.getKey().pub)}));case 6:case"end":return e.stop()}}),e,this)})));return function(t){return e.apply(this,arguments)}}(),t.messageReceived=function(){var e=s(i().mark((function e(t,n,r,a,s,o){var u,c,l;return i().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!this.messages[s]&&n){e.next=2;break}return e.abrupt("return");case 2:if(!this.uuid){e.next=8;break}return e.next=5,this.getTheirGroupSecret(o);case 5:e.t0=e.sent,e.next=11;break;case 8:return e.next=10,this.getSecret(r);case 10:e.t0=e.sent;case 11:return u=e.t0,e.next=14,O.decrypt(n,u);case 14:if("object"==typeof(c=e.sent)){e.next=17;break}return e.abrupt("return");case 17:l={selfAuthored:a,channelId:r,from:o},this.messages[s]=c,t(c,l);case 20:case"end":return e.stop()}}),e,this)})));return function(t,n,r,i,a,s){return e.apply(this,arguments)}}(),t.getLatestMsg=function(){var e=s(i().mark((function e(t){var n,r=this;return i().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:n=function(){var e=s(i().mark((function e(n,a){return i().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:r.latest?("string"==typeof r.latest.time?r.latest.time:r.latest.time.toISOString())new Date(r.getTime()-1e4)&&i=0?ue:0,ee().get("unseenMsgsTotal").put(ue)}},webPushSubscriptions:le,subscribeToWebPush:function(){return ve.apply(this,arguments)},getWebPushSubscriptions:function(){return we.apply(this,arguments)},removeSubscription:function(e){delete le[e],H().user().get("webPushSubscriptions").get(e).put(null),ye()}},_e=S.isElectron?new F("electron").get("state"):null,Ue={},ze=new Map,Ge="hyECQHwSo7fgr2MVfPyakvayPeixxsaAWVtZ-vbaiSc.TXIp8MnCtrnW6n2MrYquWPcc-DTmZzMBmc2yaGv9gIU",qe={electron:{openAtLogin:!0,minimizeOnClose:!0},local:{enableWebtorrent:!S.isMobile,enablePublicPeerDiscovery:!0,autoplayWebtorrent:!0,maxConnectedPeers:S.isElectron?2:1}},Je={init:function(e){var t=this;if(void 0===e&&(e={}),!De){De=!0;var n=localStorage.getItem("chatKeyPair");console.log("localStorageKey",n),n?this.login(JSON.parse(n)):!1!==e.autologin?this.loginAsNewUser(e):this.clearIndexedDB(),setTimeout((function(){ee().get("block").map((function(){t.updateSearchIndex()})),t.updateSearchIndex()})),setInterval((function(){if(t.taskQueue.length){var e=t.taskQueue.shift();e&&e()}}),10)}},DEFAULT_SETTINGS:qe,DEFAULT_FOLLOW:Ge,taskQueue:[],updateSearchIndex:v.throttle((function(){var e=Object.values(v.omit(Ue,Object.keys(ne())));Ke=new r(e,{keys:["name"],includeScore:!0,includeMatches:!0,threshold:.3}),ee().get("searchIndexUpdated").put(!0)}),2e3,{leading:!0}),saveSearchResult:v.throttle((function(e){ee().get("contacts").get(e).put({followDistance:Ue[e].followDistance,followerCount:Ue[e].followers.size})}),1e3,{leading:!0}),addFollow:function(e,t,n,r){Ue[t]?(Ue[t].followDistance>n&&(Ue[t].followDistance=n),r&&Ue[t].followers.add(r)):(Ue[t]={key:t,followDistance:n,followers:new Set(r&&[r])},this.taskQueue.push((function(){Q(t).get("profile").get("name").on((function(n){Ue[t].name=n,ee().get("contacts").get(t).get("name").put(n),e&&e(t,Ue[t])}))}))),this.saveSearchResult(t),e&&e(t,Ue[t]),this.updateSearchIndex(),this.updateNoFollows(),this.updateNoFollowers()},removeFollow:function(e,t,n){1===t&&(ee().get("contacts").get(e).put(!1),ee().get("groups").get("follows").get(e).put(!1),Ue[e]&&(Ue[e].followers.delete(n),this.updateNoFollows(),this.updateNoFollowers())),Ue[e]&&0===Ue[e].followers.size&&(delete Ue[e],ee().get("contacts").get(e).put(!1),ee().get("groups").get("everyone").get(e).put(!1))},getExtendedFollows:function(e,t,n,r){var i=this;void 0===t&&(t=je.pub),void 0===n&&(n=3),void 0===r&&(r=1);var a=ze.get(t);if(!(a&&a<=r))return ze.set(t,r),this.addFollow(e,t,r-1),Q(t).get("follow").map((function(a,s){a?(i.addFollow(e,s,r,t),r0);e!==Le&&(Le=e,ee().get("noFollowers").put(Le))}),1e3,{leading:!0}),getSearchIndex:function(){return Ke},setOurOnlineStatus:function(){var e=window.location.hash;Z.setActivity(Ee="active");var t=v.debounce((function(){var t=X(e&&e.replace("#/profile/","").replace("#/chat/",""));t&&!Ee&&t.setMyMsgsLastSeenTime(),Z.setActivity(Ee="active"),clearTimeout(Ie),Ie=setTimeout((function(){return Z.setActivity(Ee="online")}),3e4)}),1e3);document.addEventListener("touchmove",t),document.addEventListener("mousemove",t),document.addEventListener("keypress",t),document.addEventListener("visibilitychange",(function(){if("visible"===document.visibilityState){Z.setActivity(Ee="active");var t=location.pathname.slice(1).replace("chat/",""),n=e&&X(t);n&&(n.setMyMsgsLastSeenTime(),Ne.changeChatUnseenCount(t,0))}else Z.setActivity(Ee="online")})),t(),window.addEventListener("beforeunload",(function(){Z.setActivity(Ee=null)}))},updateGroups:function(){var e=this;this.getExtendedFollows((function(t,n){n.followDistance<=1&&ee().get("groups").get("follows").get(t).put(!0),ee().get("groups").get("everyone").get(t).put(!0),t===e.getPubKey()&&e.updateNoFollowers()}))},login:function(e){var t=this;console.log("login",e);var n=!!je;console.log("shouldRefresh",n,"key",je),je=e,localStorage.setItem("chatKeyPair",JSON.stringify(e)),Q().auth(je),Q().put({epub:je.epub}),Ne.subscribeToWebPush(),Ne.getWebPushSubscriptions(),Z.getMyChatLinks(void 0,(function(e){ee().get("chatLinks").get(e.id).put(e.url),Pe=e.url})),this.setOurOnlineStatus(),Z.getChannels((function(e){return t.addChannel(e)})),Q().get("profile").get("name").on((function(e){e&&"string"==typeof e&&(Ce=e)})),Ne.init(),ee().get("loggedIn").put(!0),console.log("local().get('loggedIn').put(true);",ee()),ee().get("settings").once().then((function(e){e?void 0!==e.enableWebtorrent&&void 0!==e.autoplayWebtorrent||(ee().get("settings").get("enableWebtorrent").put(qe.local.enableWebtorrent),ee().get("settings").get("autoplayWebtorrent").put(qe.local.autoplayWebtorrent)):ee().get("settings").put(qe.local)})),Q().get("block").map((function(e,t){ee().get("block").get(t).put(e),e&&delete Ue[t]})),this.updateGroups(),n&&location.reload(),_e&&(_e.get("settings").on((function(e){ee().get("settings").get("electron").put(e)})),_e.get("user").put(je.pub)),ee().get("filters").get("group").once().then((function(e){e||ee().get("filters").get("group").put("follows")}))},loginAsNewUser:function(e){var t=this;void 0===e&&(e={});var n=e.name||S.generateName();return console.log("loginAsNewUser name",n),O.generate().then((function(r){t.login(r),Q().get("profile").put({a:null}),Q().get("profile").get("name").put(n),ee().get("filters").put({a:null}),ee().get("filters").get("group").put("follows"),Z.createChatLink().then((function(e){return Pe=e})),setTimeout((function(){!1!==e.autofollow&&(console.log("autofollowing",Ge),Q().get("follow").get(Ge).put(!0))}),1e3)}))},logOut:function(){var e=this;return s(i().mark((function t(){var n,r,a;return i().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(_e&&_e.get("user").put(null),!navigator.serviceWorker){t.next=16;break}return t.next=4,navigator.serviceWorker.getRegistration();case 4:if(!(n=t.sent)||!n.pushManager){t.next=16;break}return null==(r=n.active)||r.postMessage({key:null}),t.next=9,n.pushManager.getSubscription();case 9:if(!(a=t.sent)){t.next=16;break}return t.next=13,S.getHash(JSON.stringify(a));case 13:Ne.removeSubscription(t.sent),a.unsubscribe&&a.unsubscribe();case 16:e.clearIndexedDB(),localStorage.clear(),window.location.hash="",window.location.href="/",location.reload();case 21:case"end":return t.stop()}}),t)})))()},clearIndexedDB:function(){return new Promise((function(e){var t=window.indexedDB.deleteDatabase("local()"),n=window.indexedDB.deleteDatabase("radata"),r=!1,i=!1,a=function(){r&&i&&e(void 0)};t.onerror=n.onerror=function(e){return console.error(e)},t.onsuccess=function(){r=!0,a()},n.onsuccess=function(){i=!0,a()}}))},getMyChatLink:function(){return Pe||S.getProfileLink(je.pub)},getKey:function(){return je},getPubKey:function(){return je&&je.pub},getMyName:function(){return Ce},myPeerUrl:function(e){return"http://"+e+":8767/gun"},shareMyPeerUrl:function(e){var t=this;return s(i().mark((function n(){var r;return i().wrap((function(n){for(;;)switch(n.prev=n.next){case 0:return n.next=2,ee().get("settings").get("electron").get("publicIp").once();case 2:(r=n.sent)&&e.put&&e.put("my_peer",t.myPeerUrl(r));case 4:case"end":return n.stop()}}),n)})))()},newChannel:function(e,t){if(e&&!this.channelIds.has(e)){var n=X(e,t);return this.addChannel(n),n}},addChannel:function(e){var t=this;this.taskQueue.push((function(){var n=e.getId();if(!t.channelIds.has(n)){t.channelIds.add(n);var r=ee().get("channels").get(n);if(r.get("latestTime").on((function(t){t&&(!e.latestTime||t>e.latestTime)&&(e.latestTime=t)})),r.get("theirMsgsLastSeenTime").on((function(t){if(t){var n=new Date(t);(!e.theirMsgsLastSeenDate||e.theirMsgsLastSeenDate=e.theirMsgsLastSeenTime&&(e.theirMsgsLastSeenTime=t,r.get("theirMsgsLastSeenTime").put(t))})),e.getMyMsgsLastSeenTime((function(t){e.myLastSeenTime=new Date(t),e.latest&&e.myLastSeenTime>=e.latest.time&&Ne.changeChatUnseenCount(n,0)})),e.isTyping=!1,e.getTyping((function(t){e.isTyping=t,ee().get("channels").get(n).get("isTyping").put(t)})),e.online={},Z.getActivity(n,(function(t){e&&(r.put({theirLastActiveTime:t&&t.lastActive,activity:t&&t.isActive&&t.status}),e.activity=t)})),e.uuid){var i=window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches;e.participantProfiles={},e.on("name",(function(t){e.name=t,Ue[e.uuid]={name:t,uuid:e.uuid},ee().get("channels").get(e.uuid).get("name").put(t)})),e.on("photo",(function(t){Ue[e.uuid]=Ue[e.uuid]||{},Ue[e.uuid].photo=t,ee().get("channels").get(e.uuid).get("photo").put(t)})),e.on("about",(function(t){return ee().get("channels").get(e.uuid).get("about").put(t)})),e.getParticipants((function(t){if(delete t.undefined,"object"==typeof t){var n=Object.keys(t);n.forEach((function(r,a){var s=360/Math.max(n.length,2)*a;e.participantProfiles[r]={permissions:t[r],color:"hsl("+s+", 98%, "+(i?80:33)+"%)"},Q(r).get("profile").get("name").on((function(t){e.participantProfiles[r].name=t}))}))}ee().get("channels").get(e.uuid).get("participants").put(t)})),e.inviteLinks={},e.getChatLinks({callback:function(t){var n=t.url,r=t.id;console.log("got chat link",r,n),e.inviteLinks[r]=n,ee().get("inviteLinksChanged").put(!0)}})}else Q(n).get("profile").get("name").on((function(e){return ee().get("channels").get(n).get("name").put(e)}));if(e.put){e.onTheir("webPushSubscriptions",(function(t,r,i){Array.isArray(t)&&(e.webPushSubscriptions=e.webPushSubscriptions||{},e.webPushSubscriptions[i||n]=t)}));var a=Object.values(Ne.webPushSubscriptions);setTimeout((function(){return e.put("webPushSubscriptions",a)}),5e3),t.shareMyPeerUrl(e)}e.onTheir("call",(function(e){ee().get("call").put({pub:n,call:e})})),ee().get("channels").get(n).put({enabled:!0})}}))},processMessage:function(e,t,n,r){var i=X(e);i.messageIds=i.messageIds||{},i.messageIds[t.time+n.from]||(i.messageIds[t.time+n.from]=!0,n&&(t=Object.assign(t,n)),t.invite?this.newChannel(t.invite.group,"https://iris.to/?channelId="+t.invite.group+"&inviter="+e):(t.selfAuthored=n.selfAuthored,ee().get("channels").get(e).get("msgs").get(t.time+(t.from&&t.from.slice(0,10))).put(JSON.stringify(t)),t.timeObj=new Date(t.time),!n.selfAuthored&&t.timeObj>i.myLastSeenTime&&(window.location.hash!=="#/chat/"+e||"visible"!==document.visibilityState?Ne.changeChatUnseenCount(e,1):"active"===Ee&&i.setMyMsgsLastSeenTime()),!n.selfAuthored&&t.time>i.theirMsgsLastSeenTime&&ee().get("channels").get(e).get("theirMsgsLastSeenTime").put(t.time),(!i.latestTime||t.time>i.latestTime)&&ee().get("channels").get(e).put({latestTime:t.time,latest:{time:t.time,text:t.text,selfAuthored:n.selfAuthored}}),Ne.notifyMsg(t,n,e,r)))},subscribeToMsgs:function(e){var t=this,n=X(e);n.subscribed||(n.subscribed=!0,n.getMessages((function(n,r){t.processMessage(e,n,r)})))},channelIds:new Set},Re={get:function(e,t){return new Promise((function(n,r){e||r("No hash provided"),"string"!=typeof e&&r("Hash must be a string"),H().get("#").get(e).on((function(e,r,i,a){e&&(a.off(),t&&t(e),n(e))}))}))},put:function(e){return s(i().mark((function t(){var n;return i().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,S.getHash(e);case 2:return n=t.sent,H().get("#").get(n).put(e),t.abrupt("return",n);case 5:case"end":return t.stop()}}),t)})))()}},Fe="Invalid message:",He=function(e){function t(){return e.apply(this,arguments)||this}return o(t,e),t}(f(Error)),We=function(){function e(e){if(this.signedData=e.signedData,this.pubKey=e.pubKey,e.sig){if("string"!=typeof e.sig)throw new He("SignedMessage signature must be a string");this.sig=e.sig,this.getHash()}this._validate()}var t=e.prototype;return t.getSignerKeyID=function(){return this.pubKey},t._validate=function(){if(!this.signedData)throw new He(Fe+" Missing signedData");if("object"!=typeof this.signedData)throw new He(Fe+" signedData must be an object");var e=this.signedData;if(!e.type)throw new He(Fe+" Missing type definition");if(!e.author)throw new He(Fe+" Missing author");if("object"!=typeof e.author)throw new He(Fe+" Author must be object");if(Array.isArray(e.author))throw new He(Fe+" Author must not be an array");if(0===Object.keys(e.author).length)throw new He(Fe+" Author empty");for(var t in this.pubKey&&(this.signerKeyHash=this.getSignerKeyID()),e.author){var n=typeof e.author[t];if("string"!==n){if(!Array.isArray(e.author[t]))throw new He(Fe+" Author attribute must be string or array, got "+t+": "+e.author[t]);for(var r=0;r {\n let inThrottle: boolean;\n return function() {\n const args = arguments;\n const context = this;\n if (!inThrottle) {\n func.apply(context, args);\n inThrottle = true;\n setTimeout(() => inThrottle = false, limit);\n }\n };\n },\n debounce: (func: Function, limit: number) => {\n let inDebounce: boolean;\n return function() {\n const args = arguments;\n const context = this;\n clearTimeout(inDebounce);\n inDebounce = setTimeout(() => func.apply(context, args), limit);\n };\n },\n sample: (arr: any[]) => arr[Math.floor(Math.random() * arr.length)],\n sampleSize: (arr: any[], size: number) => {\n const shuffled = arr.slice(0);\n let i = arr.length;\n let min = i - size;\n let temp;\n let index;\n while (i-- > min) {\n index = Math.floor((i + 1) * Math.random());\n temp = shuffled[index];\n shuffled[index] = shuffled[i];\n shuffled[i] = temp;\n }\n return shuffled.slice(min);\n },\n defer: (func: Function) => setTimeout(func, 0),\n once: (func: Function) => {\n let called = false;\n return function() {\n if (called) {\n return;\n }\n called = true;\n func.apply(this, arguments);\n };\n },\n omit: (obj: any, keys: string[]) => {\n const newObj = {};\n Object.keys(obj).forEach(key => {\n if (!keys.includes(key)) {\n newObj[key] = obj[key];\n }\n });\n return newObj;\n },\n defaults: (obj: any, defaults: any) => {\n Object.keys(defaults).forEach(key => {\n if (obj[key] === undefined) {\n obj[key] = defaults[key];\n }\n });\n return obj;\n },\n pickBy: (obj: any, predicate: Function) => {\n const newObj = {};\n Object.keys(obj).forEach(key => {\n if (predicate(obj[key])) {\n newObj[key] = obj[key];\n }\n });\n return newObj;\n }\n}","// @ts-nocheck\n/* eslint no-useless-escape: \"off\", camelcase: \"off\" */\n\nimport Gun from 'gun'; // eslint-disable-line no-unused-vars\nimport 'gun/sea';\nimport _ from './lodash';\n\n// eslint-disable-line no-unused-vars\n\nlet isNode = false;\ntry {\n isNode = Object.prototype.toString.call(global.process) === `[object process]`;\n} catch (e) { null; }\n\nconst userAgent = !isNode && navigator && navigator.userAgent && navigator.userAgent.toLowerCase();\nconst isElectron = (userAgent && userAgent.indexOf(' electron/') > -1);\n\nconst isMobile = !isNode && (function() {\n if (isElectron) { return false; }\n let check = false;\n (function(a) {if (/(android|bb\\d+|meego).+mobile|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\\-(n|u)|c55\\/|capi|ccwa|cdm\\-|cell|chtm|cldc|cmd\\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\\-s|devi|dica|dmob|do(c|p)o|ds(12|\\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\\-|_)|g1 u|g560|gene|gf\\-5|g\\-mo|go(\\.w|od)|gr(ad|un)|haie|hcit|hd\\-(m|p|t)|hei\\-|hi(pt|ta)|hp( i|ip)|hs\\-c|ht(c(\\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\\-(20|go|ma)|i230|iac( |\\-|\\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\\/)|klon|kpt |kwc\\-|kyo(c|k)|le(no|xi)|lg( g|\\/(k|l|u)|50|54|\\-[a-w])|libw|lynx|m1\\-w|m3ga|m50\\/|ma(te|ui|xo)|mc(01|21|ca)|m\\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\\-2|po(ck|rt|se)|prox|psio|pt\\-g|qa\\-a|qc(07|12|21|32|60|\\-[2-7]|i\\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\\-|oo|p\\-)|sdk\\/|se(c(\\-|0|1)|47|mc|nd|ri)|sgh\\-|shar|sie(\\-|m)|sk\\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\\-|v\\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\\-|tdg\\-|tel(i|m)|tim\\-|t\\-mo|to(pl|sh)|ts(70|m\\-|m3|m5)|tx\\-9|up(\\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\\-|your|zeto|zte\\-/i.test(a.substr(0, 4))) check = true;})(navigator.userAgent || navigator.vendor || '');\n return check;\n})();\n\nfunction gunAsAnotherUser(gun: any, key: any, f: Function) { // Hacky way to use multiple users with gun\n const gun2 = new Gun({radisk: false, peers: Object.keys(gun._.opt.peers)}); // TODO: copy other options too\n const user = gun2.user();\n user.auth(key);\n setTimeout(() => {\n // @ts-ignore\n const peers = Object.values(gun2.back('opt.peers'));\n peers.forEach(peer => {\n // @ts-ignore\n gun2.on('bye', peer);\n });\n }, 20000);\n return f(user);\n}\n\nfunction gunOnceDefined(node: any) {\n return new Promise(resolve => {\n node.on((val: any, _k: any, _a: any, eve: any) => {\n if (val !== undefined) {\n eve.off();\n resolve(val);\n }\n });\n });\n}\n\nconst animals = [\n 'canidae',\n 'felidae',\n 'cat',\n 'cattle',\n 'dog',\n 'donkey',\n 'goat',\n 'horse',\n 'pig',\n 'rabbit',\n 'aardvark',\n 'aardwolf',\n 'albatross',\n 'alligator',\n 'alpaca',\n 'amphibian',\n 'anaconda',\n 'angelfish',\n 'anglerfish',\n 'ant',\n 'anteater',\n 'antelope',\n 'antlion',\n 'ape',\n 'aphid',\n 'armadillo',\n 'asp',\n 'baboon',\n 'badger',\n 'bandicoot',\n 'barnacle',\n 'barracuda',\n 'basilisk',\n 'bass',\n 'bat',\n 'bear',\n 'beaver',\n 'bedbug',\n 'bee',\n 'beetle',\n 'bird',\n 'bison',\n 'blackbird',\n 'boa',\n 'boar',\n 'bobcat',\n 'bobolink',\n 'bonobo',\n 'booby',\n 'bovid',\n 'bug',\n 'butterfly',\n 'buzzard',\n 'camel',\n 'canid',\n 'capybara',\n 'cardinal',\n 'caribou',\n 'carp',\n 'cat',\n 'catshark',\n 'caterpillar',\n 'catfish',\n 'cattle',\n 'centipede',\n 'cephalopod',\n 'chameleon',\n 'cheetah',\n 'chickadee',\n 'chicken',\n 'chimpanzee',\n 'chinchilla',\n 'chipmunk',\n 'clam',\n 'clownfish',\n 'cobra',\n 'cockroach',\n 'cod',\n 'condor',\n 'constrictor',\n 'coral',\n 'cougar',\n 'cow',\n 'coyote',\n 'crab',\n 'crane',\n 'crawdad',\n 'crayfish',\n 'cricket',\n 'crocodile',\n 'crow',\n 'cuckoo',\n 'cicada',\n 'damselfly',\n 'deer',\n 'dingo',\n 'dinosaur',\n 'dog',\n 'dolphin',\n 'donkey',\n 'dormouse',\n 'dove',\n 'dragonfly',\n 'dragon',\n 'duck',\n 'eagle',\n 'earthworm',\n 'earwig',\n 'echidna',\n 'eel',\n 'egret',\n 'elephant',\n 'elk',\n 'emu',\n 'ermine',\n 'falcon',\n 'ferret',\n 'finch',\n 'firefly',\n 'fish',\n 'flamingo',\n 'flea',\n 'fly',\n 'flyingfish',\n 'fowl',\n 'fox',\n 'frog',\n 'gamefowl',\n 'galliform',\n 'gazelle',\n 'gecko',\n 'gerbil',\n 'gibbon',\n 'giraffe',\n 'goat',\n 'goldfish',\n 'goose',\n 'gopher',\n 'gorilla',\n 'grasshopper',\n 'grouse',\n 'guan',\n 'guanaco',\n 'guineafowl',\n 'gull',\n 'guppy',\n 'haddock',\n 'halibut',\n 'hamster',\n 'hare',\n 'harrier',\n 'hawk',\n 'hedgehog',\n 'heron',\n 'herring',\n 'hippopotamus',\n 'hookworm',\n 'hornet',\n 'horse',\n 'hoverfly',\n 'hummingbird',\n 'hyena',\n 'iguana',\n 'impala',\n 'jackal',\n 'jaguar',\n 'jay',\n 'jellyfish',\n 'junglefowl',\n 'kangaroo',\n 'kingfisher',\n 'kite',\n 'kiwi',\n 'koala',\n 'koi',\n 'krill',\n 'ladybug',\n 'lamprey',\n 'landfowl',\n 'lark',\n 'leech',\n 'lemming',\n 'lemur',\n 'leopard',\n 'leopon',\n 'limpet',\n 'lion',\n 'lizard',\n 'llama',\n 'lobster',\n 'locust',\n 'loon',\n 'louse',\n 'lungfish',\n 'lynx',\n 'macaw',\n 'mackerel',\n 'magpie',\n 'mammal',\n 'manatee',\n 'mandrill',\n 'marlin',\n 'marmoset',\n 'marmot',\n 'marsupial',\n 'marten',\n 'mastodon',\n 'meadowlark',\n 'meerkat',\n 'mink',\n 'minnow',\n 'mite',\n 'mockingbird',\n 'mole',\n 'mollusk',\n 'mongoose',\n 'monkey',\n 'moose',\n 'mosquito',\n 'moth',\n 'mouse',\n 'mule',\n 'muskox',\n 'narwhal',\n 'newt',\n 'nightingale',\n 'ocelot',\n 'octopus',\n 'opossum',\n 'orangutan',\n 'orca',\n 'ostrich',\n 'otter',\n 'owl',\n 'ox',\n 'panda',\n 'panther',\n 'parakeet',\n 'parrot',\n 'parrotfish',\n 'partridge',\n 'peacock',\n 'peafowl',\n 'pelican',\n 'penguin',\n 'perch',\n 'pheasant',\n 'pig',\n 'pigeon',\n 'pike',\n 'pinniped',\n 'piranha',\n 'planarian',\n 'platypus',\n 'pony',\n 'porcupine',\n 'porpoise',\n 'possum',\n 'prawn',\n 'primate',\n 'ptarmigan',\n 'puffin',\n 'puma',\n 'python',\n 'quail',\n 'quelea',\n 'quokka',\n 'rabbit',\n 'raccoon',\n 'rat',\n 'rattlesnake',\n 'raven',\n 'reindeer',\n 'reptile',\n 'rhinoceros',\n 'roadrunner',\n 'rodent',\n 'rook',\n 'rooster',\n 'roundworm',\n 'sailfish',\n 'salamander',\n 'salmon',\n 'sawfish',\n 'scallop',\n 'scorpion',\n 'seahorse',\n 'shark',\n 'sheep',\n 'shrew',\n 'shrimp',\n 'silkworm',\n 'silverfish',\n 'skink',\n 'skunk',\n 'sloth',\n 'slug',\n 'smelt',\n 'snail',\n 'snake',\n 'snipe',\n 'sole',\n 'sparrow',\n 'spider',\n 'spoonbill',\n 'squid',\n 'squirrel',\n 'starfish',\n 'stingray',\n 'stoat',\n 'stork',\n 'sturgeon',\n 'swallow',\n 'swan',\n 'swift',\n 'swordfish',\n 'swordtail',\n 'tahr',\n 'takin',\n 'tapir',\n 'tarantula',\n 'tarsier',\n 'termite',\n 'tern',\n 'thrush',\n 'tick',\n 'tiger',\n 'tiglon',\n 'toad',\n 'tortoise',\n 'toucan',\n 'trout',\n 'tuna',\n 'turkey',\n 'turtle',\n 'tyrannosaurus',\n 'urial',\n 'vicuna',\n 'viper',\n 'vole',\n 'vulture',\n 'wallaby',\n 'walrus',\n 'wasp',\n 'warbler',\n 'weasel',\n 'whale',\n 'whippet',\n 'whitefish',\n 'wildcat',\n 'wildebeest',\n 'wildfowl',\n 'wolf',\n 'wolverine',\n 'wombat',\n 'woodpecker',\n 'worm',\n 'wren',\n 'xerinae',\n 'yak',\n 'zebra',\n 'alpaca',\n 'cat',\n 'cattle',\n 'chicken',\n 'dog',\n 'donkey',\n 'ferret',\n 'gayal',\n 'goldfish',\n 'guppy',\n 'horse',\n 'koi',\n 'llama',\n 'sheep',\n 'yak',\n 'unicorn',\n];\n\nconst adjectives = [\n 'average',\n 'big',\n 'colossal',\n 'fat',\n 'giant',\n 'gigantic',\n 'great',\n 'huge',\n 'immense',\n 'large',\n 'little',\n 'long',\n 'mammoth',\n 'massive',\n 'miniature',\n 'petite',\n 'puny',\n 'short',\n 'small',\n 'tall',\n 'tiny',\n 'boiling',\n 'breezy',\n 'broken',\n 'bumpy',\n 'chilly',\n 'cold',\n 'cool',\n 'creepy',\n 'crooked',\n 'cuddly',\n 'curly',\n 'damaged',\n 'damp',\n 'dirty',\n 'dry',\n 'dusty',\n 'filthy',\n 'flaky',\n 'fluffy',\n 'wet',\n 'broad',\n 'chubby',\n 'crooked',\n 'curved',\n 'deep',\n 'flat',\n 'high',\n 'hollow',\n 'low',\n 'narrow',\n 'round',\n 'shallow',\n 'skinny',\n 'square',\n 'steep',\n 'straight',\n 'wide',\n 'ancient',\n 'brief',\n 'early',\n 'fast',\n 'late',\n 'long',\n 'modern',\n 'old',\n 'quick',\n 'rapid',\n 'short',\n 'slow',\n 'swift',\n 'young',\n 'abundant',\n 'empty',\n 'few',\n 'heavy',\n 'light',\n 'many',\n 'numerous',\n 'Sound',\n 'cooing',\n 'deafening',\n 'faint',\n 'harsh',\n 'hissing',\n 'hushed',\n 'husky',\n 'loud',\n 'melodic',\n 'moaning',\n 'mute',\n 'noisy',\n 'purring',\n 'quiet',\n 'raspy',\n 'resonant',\n 'screeching',\n 'shrill',\n 'silent',\n 'soft',\n 'squealing',\n 'thundering',\n 'voiceless',\n 'whispering',\n 'bitter',\n 'delicious',\n 'fresh',\n 'juicy',\n 'ripe',\n 'rotten',\n 'salty',\n 'sour',\n 'spicy',\n 'stale',\n 'sticky',\n 'strong',\n 'sweet',\n 'tasteless',\n 'tasty',\n 'thirsty',\n 'fluttering',\n 'fuzzy',\n 'greasy',\n 'grubby',\n 'hard',\n 'hot',\n 'icy',\n 'loose',\n 'melted',\n 'plastic',\n 'prickly',\n 'rainy',\n 'rough',\n 'scattered',\n 'shaggy',\n 'shaky',\n 'sharp',\n 'shivering',\n 'silky',\n 'slimy',\n 'slippery',\n 'smooth',\n 'soft',\n 'solid',\n 'steady',\n 'sticky',\n 'tender',\n 'tight',\n 'uneven',\n 'weak',\n 'wet',\n 'wooden',\n 'afraid',\n 'angry',\n 'annoyed',\n 'anxious',\n 'arrogant',\n 'ashamed',\n 'awful',\n 'bad',\n 'bewildered',\n 'bored',\n 'combative',\n 'condemned',\n 'confused',\n 'creepy',\n 'cruel',\n 'dangerous',\n 'defeated',\n 'defiant',\n 'depressed',\n 'disgusted',\n 'disturbed',\n 'eerie',\n 'embarrassed',\n 'envious',\n 'evil',\n 'fierce',\n 'foolish',\n 'frantic',\n 'frightened',\n 'grieving',\n 'helpless',\n 'homeless',\n 'hungry',\n 'hurt',\n 'ill',\n 'jealous',\n 'lonely',\n 'mysterious',\n 'naughty',\n 'nervous',\n 'obnoxious',\n 'outrageous',\n 'panicky',\n 'repulsive',\n 'scary',\n 'scornful',\n 'selfish',\n 'sore',\n 'tense',\n 'terrible',\n 'thoughtless',\n 'tired',\n 'troubled',\n 'upset',\n 'uptight',\n 'weary',\n 'wicked',\n 'worried',\n 'agreeable',\n 'amused',\n 'brave',\n 'calm',\n 'charming',\n 'cheerful',\n 'comfortable',\n 'cooperative',\n 'courageous',\n 'delightful',\n 'determined',\n 'eager',\n 'elated',\n 'enchanting',\n 'encouraging',\n 'energetic',\n 'enthusiastic',\n 'excited',\n 'exuberant',\n 'fair',\n 'faithful',\n 'fantastic',\n 'fine',\n 'friendly',\n 'funny',\n 'gentle',\n 'glorious',\n 'good',\n 'happy',\n 'healthy',\n 'helpful',\n 'hilarious',\n 'jolly',\n 'joyous',\n 'kind',\n 'lively',\n 'lovely',\n 'lucky',\n 'obedient',\n 'perfect',\n 'pleasant',\n 'proud',\n 'relieved',\n 'silly',\n 'smiling',\n 'splendid',\n 'successful',\n 'thoughtful',\n 'victorious',\n 'vivacious',\n 'witty',\n 'wonderful',\n 'zealous',\n 'zany',\n 'other',\n 'good',\n 'new',\n 'old',\n 'great',\n 'high',\n 'small',\n 'different',\n 'large',\n 'local',\n 'social',\n 'important',\n 'long',\n 'young',\n 'national',\n 'british',\n 'right',\n 'early',\n 'possible',\n 'big',\n 'little',\n 'political',\n 'able',\n 'late',\n 'general',\n 'full',\n 'far',\n 'low',\n 'public',\n 'available',\n 'bad',\n 'main',\n 'sure',\n 'clear',\n 'major',\n 'economic',\n 'only',\n 'likely',\n 'real',\n 'black',\n 'particular',\n 'international',\n 'special',\n 'difficult',\n 'certain',\n 'open',\n 'whole',\n 'white',\n 'free',\n 'short',\n 'easy',\n 'strong',\n 'european',\n 'central',\n 'similar',\n 'human',\n 'common',\n 'necessary',\n 'single',\n 'personal',\n 'hard',\n 'private',\n 'poor',\n 'financial',\n 'wide',\n 'foreign',\n 'simple',\n 'recent',\n 'concerned',\n 'american',\n 'various',\n 'close',\n 'fine',\n 'english',\n 'wrong',\n 'present',\n 'royal',\n 'natural',\n 'individual',\n 'nice',\n 'french',\n 'nihilist',\n 'solipsist',\n 'materialist',\n 'surrealist',\n 'heroic',\n 'awesome',\n 'hedonist',\n 'absurd',\n 'current',\n 'modern',\n 'labour',\n 'legal',\n 'happy',\n 'final',\n 'red',\n 'normal',\n 'serious',\n 'previous',\n 'total',\n 'prime',\n 'significant',\n 'industrial',\n 'sorry',\n 'dead',\n 'specific',\n 'appropriate',\n 'top',\n 'soviet',\n 'basic',\n 'military',\n 'original',\n 'successful',\n 'aware',\n 'hon',\n 'popular',\n 'heavy',\n 'professional',\n 'direct',\n 'dark',\n 'cold',\n 'ready',\n 'green',\n 'useful',\n 'effective',\n 'western',\n 'traditional',\n 'scottish',\n 'german',\n 'independent',\n 'deep',\n 'interesting',\n 'considerable',\n 'involved',\n 'physical',\n 'hot',\n 'existing',\n 'responsible',\n 'complete',\n 'medical',\n 'blue',\n 'extra',\n 'past',\n 'male',\n 'interested',\n 'fair',\n 'essential',\n 'beautiful',\n 'civil',\n 'primary',\n 'obvious',\n 'future',\n 'environmental',\n 'positive',\n 'senior',\n 'nuclear',\n 'annual',\n 'relevant',\n 'huge',\n 'rich',\n 'commercial',\n 'safe',\n 'regional',\n 'practical',\n 'official',\n 'separate',\n 'key',\n 'chief',\n 'regular',\n 'due',\n 'additional',\n 'active',\n 'powerful',\n 'complex',\n 'standard',\n 'impossible',\n 'light',\n 'warm',\n 'middle',\n 'fresh',\n 'sexual',\n 'front',\n 'domestic',\n 'actual',\n 'united',\n 'technical',\n 'ordinary',\n 'cheap',\n 'strange',\n 'internal',\n 'excellent',\n 'quiet',\n 'soft',\n 'potential',\n 'northern',\n 'religious',\n 'quick',\n 'very',\n 'famous',\n 'cultural',\n 'proper',\n 'broad',\n 'joint',\n 'formal',\n 'limited',\n 'conservative',\n 'lovely',\n 'usual',\n 'ltd',\n 'unable',\n 'rural',\n 'initial',\n 'substantial',\n 'bright',\n 'average',\n 'leading',\n 'reasonable',\n 'immediate',\n 'suitable',\n 'equal',\n 'detailed',\n 'working',\n 'overall',\n 'female',\n 'afraid',\n 'democratic',\n 'growing',\n 'sufficient',\n 'scientific',\n 'eastern',\n 'correct',\n 'inc',\n 'irish',\n 'expensive',\n 'educational',\n 'mental',\n 'dangerous',\n 'critical',\n 'increased',\n 'familiar',\n 'unlikely',\n 'double',\n 'perfect',\n 'slow',\n 'tiny',\n 'dry',\n 'historical',\n 'thin',\n 'daily',\n 'southern',\n 'increasing',\n 'wild',\n 'alone',\n 'urban',\n 'empty',\n 'married',\n 'narrow',\n 'liberal',\n 'supposed',\n 'upper',\n 'apparent',\n 'tall',\n 'busy',\n 'bloody',\n 'prepared',\n 'russian',\n 'moral',\n 'careful',\n 'clean',\n 'attractive',\n 'japanese',\n 'vital',\n 'thick',\n 'alternative',\n 'fast',\n 'ancient',\n 'elderly',\n 'rare',\n 'external',\n 'capable',\n 'brief',\n 'wonderful',\n 'grand',\n 'typical',\n 'entire',\n 'grey',\n 'constant',\n 'vast',\n 'surprised',\n 'ideal',\n 'terrible',\n 'academic',\n 'funny',\n 'minor',\n 'pleased',\n 'severe',\n 'ill',\n 'corporate',\n 'negative',\n 'permanent',\n 'weak',\n 'brown',\n 'fundamental',\n 'odd',\n 'crucial',\n 'inner',\n 'used',\n 'criminal',\n 'contemporary',\n 'sharp',\n 'sick',\n 'near',\n 'roman',\n 'massive',\n 'unique',\n 'secondary',\n 'parliamentary',\n 'african',\n 'unknown',\n 'subsequent',\n 'angry',\n 'alive',\n 'guilty',\n 'lucky',\n 'enormous',\n 'well',\n 'yellow',\n 'unusual',\n 'net',\n 'tough',\n 'dear',\n 'extensive',\n 'glad',\n 'remaining',\n 'agricultural',\n 'alright',\n 'healthy',\n 'italian',\n 'principal',\n 'tired',\n 'efficient',\n 'comfortable',\n 'chinese',\n 'relative',\n 'friendly',\n 'conventional',\n 'willing',\n 'sudden',\n 'proposed',\n 'voluntary',\n 'slight',\n 'valuable',\n 'dramatic',\n 'golden',\n 'temporary',\n 'federal',\n 'keen',\n 'flat',\n 'silent',\n 'indian',\n 'worried',\n 'pale',\n 'statutory',\n 'welsh',\n 'dependent',\n 'firm',\n 'wet',\n 'competitive',\n 'armed',\n 'radical',\n 'outside',\n 'acceptable',\n 'sensitive',\n 'living',\n 'pure',\n 'global',\n 'emotional',\n 'sad',\n 'secret',\n 'rapid',\n 'adequate',\n 'fixed',\n 'sweet',\n 'administrative',\n 'wooden',\n 'remarkable',\n 'comprehensive',\n 'surprising',\n 'solid',\n 'rough',\n 'mere',\n 'mass',\n 'brilliant',\n 'maximum',\n 'absolute',\n 'electronic',\n 'visual',\n 'electric',\n 'cool',\n 'spanish',\n 'literary',\n 'continuing',\n 'supreme',\n 'chemical',\n 'genuine',\n 'exciting',\n 'written',\n 'advanced',\n 'extreme',\n 'classical',\n 'fit',\n 'favourite',\n 'widespread',\n 'confident',\n 'straight',\n 'proud',\n 'numerous',\n 'opposite',\n 'distinct',\n 'mad',\n 'helpful',\n 'given',\n 'disabled',\n 'consistent',\n 'anxious',\n 'nervous',\n 'awful',\n 'stable',\n 'constitutional',\n 'satisfied',\n 'conscious',\n 'developing',\n 'strategic',\n 'holy',\n 'smooth',\n 'dominant',\n 'remote',\n 'theoretical',\n 'outstanding',\n 'pink',\n 'pretty',\n 'clinical',\n 'minimum',\n 'honest',\n 'impressive',\n 'related',\n 'residential',\n 'extraordinary',\n 'plain',\n 'visible',\n 'accurate',\n 'distant',\n 'still',\n 'greek',\n 'complicated',\n 'musical',\n 'precise',\n 'gentle',\n 'broken',\n 'live',\n 'silly',\n 'fat',\n 'tight',\n 'monetary',\n 'round',\n 'psychological',\n 'violent',\n 'unemployed',\n 'inevitable',\n 'junior',\n 'sensible',\n 'grateful',\n 'pleasant',\n 'dirty',\n 'structural',\n 'welcome',\n 'deaf',\n 'above',\n 'continuous',\n 'blind',\n 'overseas',\n 'mean',\n 'entitled',\n 'delighted',\n 'loose',\n 'occasional',\n 'evident',\n 'desperate',\n 'fellow',\n 'universal',\n 'square',\n 'steady',\n 'classic',\n 'equivalent',\n 'intellectual',\n 'victorian',\n 'level',\n 'ultimate',\n 'creative',\n 'lost',\n 'medieval',\n 'clever',\n 'linguistic',\n 'convinced',\n 'judicial',\n 'raw',\n 'sophisticated',\n 'asleep',\n 'vulnerable',\n 'illegal',\n 'outer',\n 'revolutionary',\n 'bitter',\n 'changing',\n 'australian',\n 'native',\n 'imperial',\n 'strict',\n 'wise',\n 'informal',\n 'flexible',\n 'collective',\n 'frequent',\n 'experimental',\n 'spiritual',\n 'intense',\n 'rational',\n 'generous',\n 'inadequate',\n 'prominent',\n 'logical',\n 'bare',\n 'historic',\n 'modest',\n 'dutch',\n 'acute',\n 'electrical',\n 'valid',\n 'weekly',\n 'gross',\n 'automatic',\n 'loud',\n 'reliable',\n 'mutual',\n 'liable',\n 'multiple',\n 'ruling',\n 'curious',\n 'sole',\n 'managing',\n 'pregnant',\n 'latin',\n 'nearby',\n 'exact',\n 'underlying',\n 'identical',\n 'satisfactory',\n 'marginal',\n 'distinctive',\n 'electoral',\n 'urgent',\n 'presidential',\n 'controversial',\n 'everyday',\n 'encouraging',\n 'organic',\n 'continued',\n 'expected',\n 'statistical',\n 'desirable',\n 'innocent',\n 'improved',\n 'exclusive',\n 'marked',\n 'experienced',\n 'unexpected',\n 'superb',\n 'sheer',\n 'disappointed',\n 'frightened',\n 'gastric',\n 'romantic',\n 'naked',\n 'reluctant',\n 'magnificent',\n 'convenient',\n 'established',\n 'closed',\n 'uncertain',\n 'artificial',\n 'diplomatic',\n 'tremendous',\n 'marine',\n 'mechanical',\n 'retail',\n 'institutional',\n 'mixed',\n 'required',\n 'biological',\n 'known',\n 'functional',\n 'straightforward',\n 'superior',\n 'digital',\n 'spectacular',\n 'unhappy',\n 'confused',\n 'unfair',\n 'aggressive',\n 'spare',\n 'painful',\n 'abstract',\n 'asian',\n 'associated',\n 'legislative',\n 'monthly',\n 'intelligent',\n 'hungry',\n 'explicit',\n 'nasty',\n 'just',\n 'faint',\n 'coloured',\n 'ridiculous',\n 'amazing',\n 'comparable',\n 'successive',\n 'realistic',\n 'back',\n 'decent',\n 'decentralized',\n 'bitcoin',\n 'cypherpunk',\n 'unnecessary',\n 'flying',\n 'random',\n 'influential',\n 'dull',\n 'genetic',\n 'neat',\n 'marvellous',\n 'crazy',\n 'damp',\n 'giant',\n 'secure',\n 'bottom',\n 'skilled',\n 'subtle',\n 'elegant',\n 'brave',\n 'lesser',\n 'parallel',\n 'steep',\n 'intensive',\n 'casual',\n 'tropical',\n 'lonely',\n 'partial',\n 'preliminary',\n 'concrete',\n 'alleged',\n 'assistant',\n 'vertical',\n 'upset',\n 'delicate',\n 'mild',\n 'occupational',\n 'excessive',\n 'progressive',\n 'exceptional',\n 'integrated',\n 'striking',\n 'continental',\n 'okay',\n 'harsh',\n 'combined',\n 'fierce',\n 'handsome',\n 'characteristic',\n 'chronic',\n 'compulsory',\n 'interim',\n 'objective',\n 'splendid',\n 'magic',\n 'systematic',\n 'obliged',\n 'payable',\n 'fun',\n 'horrible',\n 'primitive',\n 'fascinating',\n 'ideological',\n 'metropolitan',\n 'surrounding',\n 'estimated',\n 'peaceful',\n 'premier',\n 'operational',\n 'technological',\n 'kind',\n 'advisory',\n 'hostile',\n 'precious',\n 'accessible',\n 'determined',\n 'excited',\n 'impressed',\n 'provincial',\n 'smart',\n 'endless',\n 'isolated',\n 'drunk',\n 'geographical',\n 'like',\n 'dynamic',\n 'boring',\n 'forthcoming',\n 'unfortunate',\n 'definite',\n 'super',\n 'notable',\n 'indirect',\n 'stiff',\n 'wealthy',\n 'awkward',\n 'lively',\n 'neutral',\n 'artistic',\n 'content',\n 'mature',\n 'colonial',\n 'ambitious',\n 'evil',\n 'magnetic',\n 'verbal',\n 'legitimate',\n 'sympathetic',\n 'empirical',\n 'head',\n 'shallow',\n 'vague',\n 'naval',\n 'depressed',\n 'shared',\n 'added',\n 'shocked',\n 'mid',\n 'worthwhile',\n 'qualified',\n 'missing',\n 'blank',\n 'absent',\n 'favourable',\n 'polish',\n 'israeli',\n 'developed',\n 'profound',\n 'representative',\n 'enthusiastic',\n 'dreadful',\n 'rigid',\n 'reduced',\n 'cruel',\n 'coastal',\n 'peculiar',\n 'swiss',\n 'crude',\n 'extended',\n 'selected',\n 'eager',\n 'canadian',\n 'bold',\n 'relaxed',\n 'corresponding',\n 'running',\n 'planned',\n 'applicable',\n 'immense',\n 'allied',\n 'comparative',\n 'uncomfortable',\n 'conservation',\n 'productive',\n 'beneficial',\n 'bored',\n 'charming',\n 'minimal',\n 'mobile',\n 'turkish',\n 'orange',\n 'rear',\n 'passive',\n 'suspicious',\n 'overwhelming',\n 'fatal',\n 'resulting',\n 'symbolic',\n 'registered',\n 'neighbouring',\n 'calm',\n 'irrelevant',\n 'patient',\n 'compact',\n 'profitable',\n 'rival',\n 'loyal',\n 'moderate',\n 'distinguished',\n 'interior',\n 'noble',\n 'insufficient',\n 'eligible',\n 'mysterious',\n 'varying',\n 'managerial',\n 'molecular',\n 'olympic',\n 'linear',\n 'prospective',\n 'printed',\n 'parental',\n 'diverse',\n 'elaborate',\n 'furious',\n 'fiscal',\n 'burning',\n 'useless',\n 'semantic',\n 'embarrassed',\n 'inherent',\n 'philosophical',\n 'deliberate',\n 'awake',\n 'variable',\n 'promising',\n 'unpleasant',\n 'varied',\n 'sacred',\n 'selective',\n 'inclined',\n 'tender',\n 'hidden',\n 'worthy',\n 'intermediate',\n 'sound',\n 'protective',\n 'fortunate',\n 'slim',\n 'defensive',\n 'divine',\n 'stuck',\n 'driving',\n 'invisible',\n 'misleading',\n 'circular',\n 'mathematical',\n 'inappropriate',\n 'liquid',\n 'persistent',\n 'solar',\n 'doubtful',\n 'manual',\n 'architectural',\n 'intact',\n 'incredible',\n 'devoted',\n 'prior',\n 'tragic',\n 'respectable',\n 'optimistic',\n 'convincing',\n 'unacceptable',\n 'decisive',\n 'competent',\n 'spatial',\n 'respective',\n 'binding',\n 'relieved',\n 'nursing',\n 'toxic',\n 'select',\n 'redundant',\n 'integral',\n 'then',\n 'probable',\n 'amateur',\n 'fond',\n 'passing',\n 'specified',\n 'territorial',\n 'horizontal',\n 'inland',\n 'cognitive',\n 'regulatory',\n 'miserable',\n 'resident',\n 'polite',\n 'scared',\n 'gothic',\n 'civilian',\n 'instant',\n 'lengthy',\n 'adverse',\n 'korean',\n 'unconscious',\n 'anonymous',\n 'aesthetic',\n 'orthodox',\n 'static',\n 'unaware',\n 'costly',\n 'fantastic',\n 'foolish',\n 'fashionable',\n 'causal',\n 'compatible',\n 'wee',\n 'implicit',\n 'dual',\n 'ok',\n 'cheerful',\n 'subjective',\n 'forward',\n 'surviving',\n 'exotic',\n 'purple',\n 'cautious',\n 'visiting',\n 'aggregate',\n 'ethical',\n 'teenage',\n 'dying',\n 'disastrous',\n 'delicious',\n 'confidential',\n 'underground',\n 'thorough',\n 'grim',\n 'autonomous',\n 'atomic',\n 'frozen',\n 'colourful',\n 'injured',\n 'uniform',\n 'ashamed',\n 'glorious',\n 'wicked',\n 'coherent',\n 'rising',\n 'shy',\n 'novel',\n 'balanced',\n 'delightful',\n 'arbitrary',\n 'adjacent',\n 'worrying',\n 'weird',\n 'unchanged',\n 'rolling',\n 'evolutionary',\n 'intimate',\n 'sporting',\n 'disciplinary',\n 'formidable',\n 'lexical',\n 'noisy',\n 'gradual',\n 'accused',\n 'homeless',\n 'supporting',\n 'coming',\n 'renewed',\n 'excess',\n 'retired',\n 'rubber',\n 'chosen',\n 'outdoor',\n 'embarrassing',\n 'preferred',\n 'bizarre',\n 'appalling',\n 'agreed',\n 'imaginative',\n 'governing',\n 'accepted',\n 'vocational',\n 'mighty',\n 'puzzled',\n 'worldwide',\n 'organisational',\n 'sunny',\n 'eldest',\n 'eventual',\n 'spontaneous',\n 'vivid',\n 'rude',\n 'faithful',\n 'ministerial',\n 'innovative',\n 'controlled',\n 'conceptual',\n 'unwilling',\n 'civic',\n 'meaningful',\n 'alive',\n 'brainy',\n 'breakable',\n 'busy',\n 'careful',\n 'cautious',\n 'clever',\n 'concerned',\n 'crazy',\n 'curious',\n 'dead',\n 'different',\n 'difficult',\n 'doubtful',\n 'easy',\n 'famous',\n 'fragile',\n 'helpful',\n 'helpless',\n 'important',\n 'impossible',\n 'innocent',\n 'inquisitive',\n 'modern',\n 'open',\n 'outstanding',\n 'poor',\n 'powerful',\n 'puzzled',\n 'real',\n 'rich',\n 'shy',\n 'sleepy',\n 'super',\n 'tame',\n 'uninterested',\n 'wandering',\n 'wild',\n 'wrong',\n 'adorable',\n 'alert',\n 'average',\n 'beautiful',\n 'blonde',\n 'bloody',\n 'blushing',\n 'bright',\n 'clean',\n 'clear',\n 'cloudy',\n 'colorful',\n 'crowded',\n 'cute',\n 'dark',\n 'drab',\n 'distinct',\n 'dull',\n 'elegant',\n 'fancy',\n 'filthy',\n 'glamorous',\n 'gleaming',\n 'graceful',\n 'grotesque',\n 'homely',\n 'light',\n 'misty',\n 'motionless',\n 'muddy',\n 'plain',\n 'poised',\n 'quaint',\n 'shiny',\n 'smoggy',\n 'sparkling',\n 'spotless',\n 'stormy',\n 'strange',\n 'ugly',\n 'unsightly',\n 'unusual',\n 'bad',\n 'better',\n 'beautiful',\n 'big',\n 'black',\n 'blue',\n 'bright',\n 'clumsy',\n 'crazy',\n 'dizzy',\n 'dull',\n 'fat',\n 'frail',\n 'friendly',\n 'funny',\n 'great',\n 'green',\n 'gigantic',\n 'gorgeous',\n 'grumpy',\n 'handsome',\n 'happy',\n 'horrible',\n 'itchy',\n 'jittery',\n 'jolly',\n 'kind',\n 'long',\n 'lazy',\n 'magnificent',\n 'magenta',\n 'many',\n 'mighty',\n 'mushy',\n 'nasty',\n 'new',\n 'nice',\n 'nosy',\n 'nutty',\n 'nutritious',\n 'odd',\n 'orange',\n 'ordinary',\n 'pretty',\n 'precious',\n 'prickly',\n 'purple',\n 'quaint',\n 'quiet',\n 'quick',\n 'quickest',\n 'rainy',\n 'rare',\n 'ratty',\n 'red',\n 'roasted',\n 'robust',\n 'round',\n 'sad',\n 'scary',\n 'scrawny',\n 'short',\n 'silly',\n 'stingy',\n 'strange',\n 'striped',\n 'spotty',\n 'tart',\n 'tall',\n 'tame',\n 'tan',\n 'tender',\n 'testy',\n 'tricky',\n 'tough',\n 'ugly',\n 'ugliest',\n 'vast',\n 'watery',\n 'wasteful',\n 'wonderful',\n 'yellow',\n 'yummy',\n 'zany',\n];\n\nexport default {\n gunOnceDefined,\n gunAsAnotherUser,\n async getHash (str: string, format = `base64`) {\n if (!str) {\n return undefined;\n }\n const hash = await Gun.SEA.work(str, undefined, undefined, {name: `SHA-256`});\n if (!hash) {\n throw new Error(`Gun.SEA.work failed for ${str}`);\n }\n if (hash.length > 44) {\n throw new Error(`Gun.SEA.work returned an invalid SHA-256 hash longer than 44 chars: ${hash}. This is probably due to a sea.js bug on Safari.`);\n }\n if (format === `hex`) {\n return this.base64ToHex(hash);\n }\n return hash;\n },\n\n capitalize(s: string) {\n return s.charAt(0).toUpperCase() + s.slice(1)\n },\n\n generateName() {\n return `${this.capitalize(_.sample(adjectives)!)} ${this.capitalize(_.sample(animals)!)}`;\n },\n\n base64ToHex(str: string) {\n const raw = atob(str);\n let result = '';\n for (let i = 0; i < raw.length; i++) {\n const hex = raw.charCodeAt(i).toString(16);\n result += (hex.length === 2 ? hex : `0${ hex}`);\n }\n return result;\n },\n\n getCaret(el: HTMLInputElement) {\n if (el.selectionStart) {\n return el.selectionStart;\n } else { // @ts-ignore\n if (document.selection) {\n el.focus();\n // @ts-ignore\n const r = document.selection.createRange();\n if (r === null) {\n return 0;\n }\n // @ts-ignore\n const re = el.createTextRange(), rc = re.duplicate();\n re.moveToBookmark(r.getBookmark());\n rc.setEndPoint('EndToStart', re);\n return rc.text.length;\n }\n }\n return 0;\n },\n\n injectCss() {\n const elementId = `irisStyle`;\n if (document.getElementById(elementId)) {\n return;\n }\n const sheet = document.createElement(`style`);\n sheet.id = elementId;\n sheet.innerHTML = `\n .iris-follow-button .hover {\n display: none;\n }\n\n .iris-follow-button.following:hover .hover {\n display: inline;\n }\n\n .iris-follow-button.following:hover .nonhover {\n display: none;\n }\n\n .iris-identicon * {\n box-sizing: border-box;\n }\n\n .iris-identicon {\n vertical-align: middle;\n border-radius: 50%;\n text-align: center;\n display: inline-block;\n position: relative;\n max-width: 100%;\n }\n\n .iris-distance {\n z-index: 2;\n position: absolute;\n left:0%;\n top:2px;\n width: 100%;\n text-align: right;\n color: #fff;\n text-shadow: 0 0 1px #000;\n font-size: 75%;\n line-height: 75%;\n font-weight: bold;\n }\n\n .iris-pie {\n border-radius: 50%;\n position: absolute;\n top: 0;\n left: 0;\n box-shadow: 0px 0px 0px 0px #82FF84;\n padding-bottom: 100%;\n max-width: 100%;\n -webkit-transition: all 0.2s ease-in-out;\n -moz-transition: all 0.2s ease-in-out;\n transition: all 0.2s ease-in-out;\n }\n\n .iris-card {\n padding: 10px;\n background-color: #f7f7f7;\n color: #777;\n border: 1px solid #ddd;\n display: flex;\n flex-direction: row;\n overflow: hidden;\n }\n\n .iris-card a {\n -webkit-transition: color 150ms;\n transition: color 150ms;\n text-decoration: none;\n color: #337ab7;\n }\n\n .iris-card a:hover, .iris-card a:active {\n text-decoration: underline;\n color: #23527c;\n }\n\n .iris-pos {\n color: #3c763d;\n }\n\n .iris-neg {\n color: #a94442;\n }\n\n .iris-identicon img {\n position: absolute;\n top: 0;\n left: 0;\n max-width: 100%;\n border-radius: 50%;\n border-color: transparent;\n border-style: solid;\n }\n\n .iris-chat-open-button {\n background-color: #1e1e1e;\n color: #fff;\n padding: 15px;\n cursor: pointer;\n user-select: none;\n }\n\n .iris-chat-open-button svg {\n width: 1em;\n }\n\n .iris-chat-open-button, .iris-chat-box {\n position: fixed;\n bottom: 0.5rem;\n right: 0.5rem;\n border-radius: 8px;\n font-family: system-ui;\n font-size: 15px;\n }\n\n .iris-chat-box {\n background-color: #fff;\n max-height: 25rem;\n box-shadow: 2px 2px 20px rgba(0, 0, 0, 0.2);\n height: calc(100% - 44px);\n display: flex;\n flex-direction: column;\n width: 320px;\n color: rgb(38, 38, 38);\n }\n\n .iris-chat-box.minimized {\n height: auto;\n }\n\n .iris-chat-box.minimized .iris-chat-header {\n border-radius: 8px;\n cursor: pointer;\n }\n\n .iris-chat-box.minimized .iris-chat-messages, .iris-chat-box.minimized .iris-typing-indicator, .iris-chat-box.minimized .iris-chat-input-wrapper, .iris-chat-box.minimized .iris-chat-minimize, .iris-chat-box.minimized .iris-chat-close {\n display: none;\n }\n\n .iris-chat-header {\n background-color: #1e1e1e;\n height: 44px;\n color: #fff;\n border-radius: 8px 8px 0 0;\n text-align: center;\n display: flex;\n flex-direction: row;\n justify-content: center;\n align-items: center;\n flex: none;\n white-space: nowrap;\n text-overflow: ellipsis;\n overflow: hidden;\n }\n\n .iris-chat-header-text {\n flex: 1;\n }\n\n .iris-online-indicator {\n color: #bfbfbf;\n margin-right: 5px;\n font-size: 12px;\n user-select: none;\n flex: none;\n }\n\n .iris-online-indicator.yes {\n color: #80bf5f;\n }\n\n .iris-typing-indicator {\n display: none;\n background-color: rgba(255, 255, 255, 0.5);\n font-size: 12px;\n padding: 2px;\n color: #777;\n }\n\n .iris-typing-indicator.yes {\n display: block;\n }\n\n .iris-chat-messages {\n flex: 1;\n padding: 15px;\n overflow-y: scroll;\n }\n\n .iris-chat-input-wrapper {\n flex: none;\n padding: 15px;\n background-color: #efefef;\n display: flex;\n flex-direction: row;\n border-radius: 0 0 8px 8px;\n }\n\n .iris-chat-input-wrapper textarea {\n padding: 15px 8px;\n border-radius: 4px;\n border: 1px solid rgba(0,0,0,0);\n width: auto;\n font-size: 15px;\n resize: none;\n flex: 1;\n }\n\n .iris-chat-input-wrapper textarea:focus {\n outline: none;\n border: 1px solid #6dd0ed;\n }\n\n .iris-chat-input-wrapper button svg {\n display: inline-block;\n font-size: inherit;\n height: 1em;\n width: 1em;\n overflow: visible;\n vertical-align: -0.125em;\n }\n\n .iris-chat-input-wrapper button, .iris-chat-input-wrapper button:hover, .iris-chat-input-wrapper button:active, .iris-chat-input-wrapper button:focus {\n flex: none;\n color: #999;\n background-color: transparent;\n font-size: 30px;\n padding: 5px;\n border: 1px solid rgba(0,0,0,0);\n border-radius: 4px;\n margin-left: 5px;\n }\n\n .iris-chat-input-wrapper button:active, .iris-chat-input-wrapper button:focus {\n outline: none;\n border: 1px solid #6dd0ed;\n }\n\n .iris-chat-message {\n display: flex;\n flex-direction: column;\n margin-bottom: 2px;\n overflow-wrap: break-word;\n }\n\n .iris-msg-content {\n background-color: #efefef;\n padding: 6px 10px;\n border-radius: 8px;\n box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.1);\n flex: none;\n max-width: 75%;\n }\n\n .emoji {\n font-size: 1.3em;\n line-height: 1em;\n }\n\n .iris-chat-message .emoji-only {\n font-size: 3em;\n text-align: center;\n }\n\n .iris-seen {\n color: rgba(0, 0, 0, 0.45);\n user-select: none;\n }\n\n .iris-seen.yes {\n color: #4fc3f7;\n }\n\n .iris-seen svg {\n width: 18px;\n }\n\n .iris-delivered-checkmark {\n display: none;\n }\n\n .delivered .iris-delivered-checkmark {\n display: initial;\n }\n\n .iris-chat-minimize, .iris-chat-close {\n user-select: none;\n cursor: pointer;\n width: 45px;\n line-height: 44px;\n }\n\n .iris-chat-message.their {\n align-items: flex-start;\n }\n\n .iris-chat-message.their + .iris-chat-message.our .iris-msg-content, .day-separator + .iris-chat-message.our .iris-msg-content {\n margin-top: 15px;\n border-radius: 8px 0px 8px 8px;\n }\n\n .iris-chat-message.their:first-of-type .iris-msg-content {\n border-radius: 0px 8px 8px 8px;\n }\n\n .iris-chat-message.our:first-of-type .iris-msg-content {\n border-radius: 8px 0px 8px 8px;\n }\n\n .iris-chat-message.our + .iris-chat-message.their .iris-msg-content, .day-separator + .iris-chat-message.their .iris-msg-content {\n margin-top: 15px;\n border-radius: 0px 8px 8px 8px;\n }\n\n .iris-chat-message.our {\n align-items: flex-end;\n }\n\n .iris-chat-message.our .iris-msg-content {\n background-color: #c5ecf7;\n }\n\n .iris-chat-message .time {\n text-align: right;\n font-size: 12px;\n color: rgba(0, 0, 0, 0.45);\n }\n\n .iris-non-string {\n color: blue;\n }\n\n .day-separator {\n display: inline-block;\n border-radius: 8px;\n background-color: rgba(227, 249, 255, 0.91);\n padding: 6px 10px;\n margin-top: 15px;\n margin-left: auto;\n margin-right: auto;\n text-transform: uppercase;\n font-size: 13px;\n color: rgba(74, 74, 74, 0.88);\n box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.1);\n user-select: none;\n }\n\n .day-separator:first-of-type {\n margin-top: 0;\n }\n\n *[contenteditable=\"true\"]:not(:focus) {\n cursor: pointer;\n }\n\n *[contenteditable=\"true\"] {\n outline: none;\n }\n\n [placeholder]:empty:before {\n content: attr(placeholder);\n color: #999;\n }\n\n [placeholder]:empty:focus {\n cursor: text;\n }\n `;\n document.head.prepend(sheet);\n },\n\n getUrlParameter(sParam: string, sParams: string) {\n const sPageURL = sParams || window.location.search.substring(1);\n const sURLVariables = sPageURL.split('&');\n let sParameterName, i;\n\n for (i = 0; i < sURLVariables.length; i++) {\n sParameterName = sURLVariables[i].split('=');\n if (sParameterName[0] === sParam) {\n return sParameterName[1] === undefined ? true : decodeURIComponent(sParameterName[1]);\n }\n }\n return;\n },\n\n formatTime(date: Date) {\n // @ts-ignore\n const t: any = date.toLocaleTimeString(undefined, {timeStyle: 'short'});\n const s = t.split(':');\n if (s.length === 3) { // safari tries to display seconds\n return `${s[0] }:${ s[1] }${s[2].slice(2)}`;\n }\n return t;\n },\n\n formatDate(date: Date) {\n const t = date.toLocaleString(undefined, {dateStyle: 'short', timeStyle: 'short'});\n const s = t.split(':');\n if (s.length === 3) { // safari tries to display seconds\n return `${s[0] }:${ s[1] }${s[2].slice(2)}`;\n }\n return t;\n },\n\n getDaySeparatorText(date: Date, dateStr: string, now?: Date, nowStr?: string) {\n if (!now) {\n now = new Date();\n // @ts-ignore\n nowStr = now.toLocaleDateString({dateStyle: 'short'});\n }\n if (dateStr === nowStr) {\n return 'today';\n }\n const dayDifference = Math.round((now - date) / (1000 * 60 * 60 * 24));\n if (dayDifference === 0) {\n return 'today';\n }\n if (dayDifference === 1) {\n return 'yesterday';\n }\n if (dayDifference <= 5) {\n return date.toLocaleDateString(undefined, {weekday: 'long'});\n }\n return dateStr;\n },\n\n getProfileLink(pub: string) {\n return `${window.location.origin}/#/profile/${encodeURIComponent(pub)}`;\n },\n\n truncateString(s: string, length = 30) {\n return s.length > length ? `${s.slice(0, length)}...` : s;\n },\n\n createElement(type: string, cls?: string, parent?: HTMLElement) {\n const el = document.createElement(type);\n if (cls) {\n el.setAttribute('class', cls);\n }\n if (parent) {\n parent.appendChild(el);\n }\n return el;\n },\n\n isNode,\n isElectron,\n isMobile,\n\n throttle: (func: Function, limit: number) => {\n let inThrottle: boolean;\n return function() {\n const args = arguments;\n const context = this;\n if (!inThrottle) {\n func.apply(context, args);\n inThrottle = true;\n setTimeout(() => inThrottle = false, limit);\n }\n };\n },\n debounce: (func: Function, delay: number) => {\n let inDebounce: boolean;\n return function() {\n const context = this;\n const args = arguments;\n clearTimeout(inDebounce);\n inDebounce = setTimeout(() => func.apply(context, args), delay);\n };\n },\n sample: (arr: any[]) => arr[Math.floor(Math.random() * arr.length)],\n sampleSize: (arr: any[], size: number) => {\n const shuffled = arr.slice(0);\n let i = arr.length;\n let min = i - size;\n let temp;\n let index;\n while (i-- > min) {\n index = Math.floor((i + 1) * Math.random());\n temp = shuffled[index];\n shuffled[index] = shuffled[i];\n shuffled[i] = temp;\n }\n return shuffled.slice(min);\n },\n defer: (func: Function) => setTimeout(func, 0),\n once: (func: Function) => {\n let called = false;\n return function() {\n if (called) {\n return;\n }\n called = true;\n func.apply(this, arguments);\n };\n },\n omit: (obj: any, keys: string[]) => {\n const newObj = {};\n Object.keys(obj).forEach(key => {\n if (!keys.includes(key)) {\n newObj[key] = obj[key];\n }\n });\n return newObj;\n }\n};\n","import session from './session';\nimport _ from './lodash';\nimport Gun from 'gun';\nimport util from './util';\nimport publicState from './global';\n\nconst ELECTRON_GUN_URL = 'http://localhost:8767/gun';\nlet maxConnectedPeers = 2;\n\ntype Peer = {\n url?: string;\n enabled?: boolean;\n from?: string;\n visibility?: string;\n}\n\ntype Peers = {\n [key: string]: Peer\n}\n\nconst DEFAULT_PEERS: Peers = {\n 'https://gun-rs.iris.to/gun': {},\n 'https://gun-us.herokuapp.com/gun': {},\n};\n\nconst loc = window.location;\nconst host = loc.host;\nconst is_localhost_but_not_dev = host.startsWith('localhost') && host !== 'localhost:8080';\nif (loc.hostname.endsWith('herokuapp.com') || is_localhost_but_not_dev) {\n Object.keys(DEFAULT_PEERS).forEach(url => DEFAULT_PEERS[url].enabled = false);\n DEFAULT_PEERS[`${loc.origin}/gun`] = {enabled: true};\n}\n\nconst urlRegex = /^(https?:\\/\\/)?([\\da-z.-]+)\\.([a-z.]{2,6})([\\/\\w .-]*)*\\/?$/;\n\n/**\n * Networking and peer management utilities\n */\nexport default {\n known: {} as Peers,\n\n /** */\n async add(peer: Peer) {\n if (peer.url && !urlRegex.test(peer.url)) {\n throw new Error(`Invalid url ${peer.url}`);\n }\n\n if (peer.from) {\n Object.keys(this.known).forEach(k => {\n if (this.known[k].from === peer.from) { // remove previous peer url from the same user\n delete this.known[k];\n }\n });\n }\n const url = peer.url || '';\n this.known[url] = this.known[url] || _.omit(peer, ['url']);\n if (peer.visibility === 'public') {\n // rolling some crypto operations to obfuscate actual url in case we want to remove it\n let secret = await Gun.SEA.secret(session.getKey().epub, session.getKey()) || '';\n let encryptedUrl = await Gun.SEA.encrypt(peer.url, secret);\n let encryptedUrlHash = await Gun.SEA.work(encryptedUrl, null, null, {name: 'SHA-256'});\n publicState().user().get('peers').get(encryptedUrlHash).put({url: peer.url, lastSeen: new Date().toISOString()});\n }\n if (peer.enabled !== false) {\n peer.url && this.connect(peer.url); // this calls savePeers()\n } else {\n this.save();\n }\n },\n\n /** */\n remove(url: string) {\n delete this.known[url];\n this.save();\n },\n\n /** */\n disconnect(peerFromGun: any) {\n publicState().on('bye', peerFromGun);\n peerFromGun.url = '';\n },\n\n save() {\n localStorage.setItem('gunPeers', JSON.stringify(this.known));\n },\n\n getSaved() {\n let p: any = localStorage.getItem('gunPeers');\n if (p && p !== 'undefined') {\n p = JSON.parse(p);\n } else {\n p = DEFAULT_PEERS;\n }\n if (util.isElectron) {\n p[ELECTRON_GUN_URL] = {};\n }\n Object.keys(p).forEach(k => _.defaults(p[k], {enabled: true}));\n return p;\n },\n\n /** */\n reset() {\n localStorage.setItem('gunPeers', '');\n this.known = this.getSaved();\n },\n\n /** */\n connect(url: string) {\n if (this.isMixedContent(url)) { return; }\n if (this.known[url]) {\n this.known[url].enabled = true;\n publicState().opt({peers: [url]});\n this.save();\n } else {\n this.add({url});\n }\n },\n\n /** */\n disable(url: string, peerFromGun: any) {\n this.known[url].enabled = false;\n if (peerFromGun) {\n this.disconnect(peerFromGun);\n }\n this.save();\n },\n\n isMixedContent(url: string) {\n return window.location.protocol === 'https:' && (url.indexOf('http:') === 0);\n },\n\n random() {\n const connectToLocalElectron = util.isElectron && this.known[ELECTRON_GUN_URL] && this.known[ELECTRON_GUN_URL].enabled !== false;\n const sampleSize = connectToLocalElectron ? Math.max(maxConnectedPeers - 1, 1) : maxConnectedPeers;\n const sample = _.sampleSize(\n Object.keys(\n _.pickBy(this.known, (peer: any, url: string) => {\n return !this.isMixedContent(url) && peer.enabled && !(util.isElectron && url === ELECTRON_GUN_URL);\n })\n ), sampleSize\n );\n if (sample && connectToLocalElectron) {\n sample.push(ELECTRON_GUN_URL);\n }\n return sample;\n },\n\n checkGunPeerCount() {\n let peersFromGun = publicState().back('opt.peers');\n let connectedPeers = Object.values(peersFromGun).filter((peer: any) => {\n if (peer && peer.wire && peer.wire.constructor.name !== 'WebSocket') {\n console.log('WebRTC peer', peer);\n }\n return peer && peer.wire && peer.wire.readyState === 1 && peer.wire.bufferedAmount === 0 && peer.wire.constructor.name === 'WebSocket';\n });\n if (connectedPeers.length < maxConnectedPeers) {\n let unconnectedPeers = Object.keys(this.known).filter(url => {\n let addedToGun = Object.values(peersFromGun).map((peer:any) => peer.url).indexOf(url) > -1;\n let enabled = this.known[url].enabled;\n const mixedContent = (window.location.protocol === 'https:' && (url.indexOf('http:') === 0));\n return !mixedContent && enabled && !addedToGun;\n });\n if (unconnectedPeers.length) {\n const sample = String(_.sample(unconnectedPeers));\n this.connect(sample);\n }\n }\n if (connectedPeers.length > maxConnectedPeers) {\n this.disconnect(_.sample(connectedPeers));\n }\n },\n\n init() {\n this.known = this.getSaved();\n /* use the default value of 1 for now because of memory issue\n local().get('settings').get('maxConnectedPeers').on(n => {\n if (n !== undefined) maxConnectedPeers = n;\n });\n */\n setInterval(() => this.checkGunPeerCount(), 1000);\n }\n};\n","import Gun from 'gun';\nimport 'gun/sea';\nimport 'gun/lib/yson';\nimport 'gun/lib/radix';\nimport 'gun/lib/radisk';\nimport 'gun/lib/store';\nimport 'gun/lib/rindexed';\nimport peers from \"./peers\";\n\nlet global: any;\n\nexport default function(opts: any = {}) {\n if (!global) {\n const myOpts = Object.assign({ peers: (opts.peers || peers.random()), localStorage: false, retry:Infinity }, opts);\n if (opts.peers) {\n opts.peers.forEach((url: string) => peers.add({url}));\n }\n peers.init();\n global = new Gun(myOpts);\n }\n return global;\n}","// @ts-nocheck\n\n/*eslint no-useless-escape: \"off\", camelcase: \"off\" */\n\nconst UNIQUE_ID_VALIDATORS = {\n email: /^([\\w-]+(?:\\.[\\w-]+)*)@((?:[\\w-]+\\.)*\\w[\\w-]{0,66})\\.([a-z]{2,6}(?:\\.[a-z]{2})?)$/i,\n bitcoin: /^[13][a-km-zA-HJ-NP-Z0-9]{26,33}$/,\n bitcoin_address: /^[13][a-km-zA-HJ-NP-Z0-9]{26,33}$/,\n ip: /^(([1-9]?\\d|1\\d\\d|2[0-5][0-5]|2[0-4]\\d)\\.){3}([1-9]?\\d|1\\d\\d|2[0-5][0-5]|2[0-4]\\d)$/,\n ipv6: /^(?:[A-F0-9]{1,4}:){7}[A-F0-9]{1,4}$/,\n gpg_fingerprint: null,\n gpg_keyid: null,\n google_oauth2: null,\n tel: /^\\d{7,}$/,\n phone: /^\\d{7,}$/,\n keyID: null,\n url: /[-a-zA-Z0-9@:%_\\+.~#?&//=]{2,256}\\.[a-z]{2,4}\\b(\\/[-a-zA-Z0-9@:%_\\+.~#?&//=]*)?/gi,\n account: /^([\\w-]+(?:\\.[\\w-]+)*)@((?:[\\w-]+\\.)*\\w[\\w-]{0,66})\\.([a-z]{2,6}(?:\\.[a-z]{2})?)$/i,\n uuid: /[0-9a-f]{8}\\-[0-9a-f]{4}\\-[0-9a-f]{4}\\-[0-9a-f]{4}\\-[0-9a-f]{12}/\n};\n\n// TODO this class could perhaps be removed\n\nclass Attribute {\n constructor(a, b) {\n if (typeof a === `object`) {\n if (typeof a.value !== `string`) { throw new Error(`param1.value must be a string, got ${typeof a.value}: ${JSON.stringify(a.value)}`); }\n if (typeof a.type !== `string`) { throw new Error(`param1.type must be a string, got ${typeof a.type}: ${JSON.stringify(a.type)}`); }\n b = a.value;\n a = a.type;\n }\n if (typeof a !== `string`) { throw new Error(`First param must be a string, got ${typeof a}: ${JSON.stringify(a)}`); }\n if (!a.length) { throw new Error(`First param string is empty`); }\n if (b) {\n if (typeof b !== `string`) { throw new Error(`Second parameter must be a string, got ${typeof b}: ${JSON.stringify(b)}`); }\n if (!b.length) { throw new Error(`Second param string is empty`); }\n this.type = a;\n this.value = b;\n } else {\n this.value = a;\n const t = Attribute.guessTypeOf(this.value);\n if (t) {\n this.type = t;\n } else {\n throw new Error(`Type of attribute was omitted and could not be guessed`);\n }\n }\n }\n\n static getUuid() {\n const b = a => a ? (a ^ Math.random() * 16 >> a / 4).toString(16) : ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, b);\n return new Attribute(`uuid`, b());\n }\n\n static getUniqueIdValidators() {\n return UNIQUE_ID_VALIDATORS;\n }\n\n static isUniqueType(type) {\n return Object.keys(UNIQUE_ID_VALIDATORS).indexOf(type) > -1;\n }\n\n isUniqueType() {\n return Attribute.isUniqueType(this.type);\n }\n\n static guessTypeOf(value) {\n for (const key in UNIQUE_ID_VALIDATORS) {\n if (value.match(UNIQUE_ID_VALIDATORS[key])) {\n return key;\n }\n }\n }\n\n static equals(a, b) {\n return a.equals(b);\n }\n\n equals(a) {\n return a && this.type === a.type && this.value === a.value;\n }\n\n uri() {\n return `${encodeURIComponent(this.value)}:${encodeURIComponent(this.type)}`;\n }\n}\n\nexport default Attribute;\n","import publicState from './global';\nimport session from './session';\n\nlet currentUser: any;\n\n/**\n * Get a public space where only the specified user (public key) can write. Others can read.\n * @param pub The public key of the user. Defaults to the current user from session.\n * @returns {Node} The user space.\n */\nexport default function(pub?: string) {\n if (!currentUser) {\n currentUser = publicState().user();\n currentUser.auth(session.getKey());\n }\n return pub ? publicState().user(pub) : currentUser;\n}\n","// @ts-nocheck\n\nimport Gun from 'gun';\nimport 'gun/sea';\nimport util from './util';\nimport Attribute from './Attribute';\nimport session from './session';\nimport publicState from './global';\nimport userState from './public';\n\n// TODO: extract Group channels into their own class\n\nconst DEFAULT_PERMISSIONS = {read: true, write: true, admin: false};\n\n/**\n* Private communication channel between two or more participants ([Gun](https://github.com/amark/gun) public keys). Can be used independently of other Iris stuff.\n*\n* Used as a core element of [iris-messenger](https://github.com/irislib/iris-messenger).\n*\n* You can use iris.private(pub) to always use the same Channel object for a given pub.\n*\n* ---\n*\n* #### Key-value API\n* `channel.put(key, value)` and `channel.on(key, callback)`.\n*\n* Note that each participant has their own versions of each key-value — they don't overwrite each other. `channel.on()` callback returns them all by default and has a parameter that indicates whose value you got.\n*\n* While values are encrypted, encryption of keys is not implemented yet.\n*\n* #### Message API\n* `channel.send()` and `channel.getMessages()` for timestamp-indexed chat-style messaging.\n*\n* Message data is encrypted, but timestamps are public so that peers can return your messages in a sequential order.\n*\n* ---\n*\n* You can open a channel with yourself for a private key-value space or a \"note to self\" type chat with yourself.\n*\n* **Privacy disclaimer:** Channel ids, data values and messages are encrypted, but message timestamps are unencrypted so that peers can return them to you in a sequential order. By looking at the unencrypted timestamps (or Gun subscriptions), it is possible to guess who are communicating with each other. This could be improved by indexing messages by *day* only, so making the guess would be more difficult, while you could still return them in a semi-sequential order.\n*\n* @param {Object} options\n* @param {string} options.key your keypair\n* @param {Object} options.gun [gun](https://github.com/amark/gun) instance\n* @param options.participants (optional) string or string array or permissions object ({'pub1':{read:true,write:true,admin:false},'pub2'...}) of participant public keys (your own key is included by default)\n* @param {string} options.chatLink (optional) chat link instead of participants list\n* @param {string} options.uuid (group channels only) unique channel identifier. Leave out for new channel.\n* @param {string} options.name (group channels only) channel name\n* @example\n* // Copy & paste this to console at https://iris.to or other page that has gun, sea and iris-lib\n* // Due to an unsolved bug, someoneElse's messages only start showing up after a reload\n*\n* var gun1 = new Gun('https://gun-us.herokuapp.com/gun');\n* var gun2 = new Gun('https://gun-us.herokuapp.com/gun');\n* var myKey = await iris.Key.getDefault();\n* var someoneElse = localStorage.getItem('someoneElsesKey');\n* if (someoneElse) {\n* someoneElse = JSON.parse(someoneElse);\n* } else {\n* someoneElse = await iris.Key.generate();\n* localStorage.setItem('someoneElsesKey', JSON.stringify(someoneElse));\n* }\n*\n* iris.Channel.initUser(gun1, myKey); // saves myKey.epub to gun.user().get('epub')\n* iris.Channel.initUser(gun2, someoneElse);\n*\n* var ourChannel = new iris.Channel({key: myKey, gun: gun1, participants: someoneElse.pub});\n* var theirChannel = new iris.Channel({key: someoneElse, gun: gun2, participants: myKey.pub});\n*\n* var myChannels = {}; // you can list them in a user interface\n* function printMessage(msg, info) {\n* console.log(`[${new Date(msg.time).toLocaleString()}] ${info.from.slice(0,8)}: ${msg.text}`)\n* }\n* iris.Channel.getChannels(gun1, myKey, channel => {\n* var pub = channel.getCurrentParticipants()[0];\n* gun1.user(pub).get('profile').get('name').on(name => channel.name = name);\n* myChannels[pub] = channel;\n* channel.getMessages(printMessage);\n* channel.on('mood', (mood, from) => console.log(from.slice(0,8) + ' is feeling ' + mood));\n* });\n*\n* // you can play with these in the console:\n* ourChannel.send('message from myKey');\n* theirChannel.send('message from someoneElse');\n*\n* ourChannel.put('mood', 'blessed');\n* theirChannel.put('mood', 'happy');\n*\n* @example https://github.com/irislib/iris-lib/blob/master/__tests__/Channel.js\n*/\nclass Channel {\n // TODO: these should be done in a cleaner way\n latestTime: any;\n theirMsgsLastSeenDate: any;\n myLastSeenTime: any;\n theirMsgsLastSeenTime: any;\n notificationSetting: any;\n messageIds: any; // this is used from session.processMessage\n latest: any;\n uuid: any;\n name: any;\n attachments: any;\n\n theirSecretUuids = {};\n theirGroupSecrets = {};\n secrets = {};\n ourSecretChannelIds = {};\n theirSecretChannelIds = {};\n messages = {};\n chatLinks = {};\n groupSubscriptions = {};\n directSubscriptions = {};\n getParticipantsCallbacks = {};\n myGroupSecret: any;\n participants: any;\n\n constructor(options: any) {\n this.myGroupSecret = options.myGroupSecret;\n\n if (options.chatLink) {\n this.useChatLink(options);\n }\n\n if (typeof options.participants === `string`) {\n this.addParticipant(options.participants, options.save);\n } else if (Array.isArray(options.participants)) {\n const o = {};\n options.participants.forEach(p => o[p] = Object.assign({}, DEFAULT_PERMISSIONS));\n options.participants = o;\n }\n if (typeof options.participants === `object`) { // it's a group channel\n const keys = Object.keys(options.participants);\n keys.forEach(k => {\n if (k !== session.getKey().pub) {\n this.addParticipant(k, options.save, Object.assign({}, DEFAULT_PERMISSIONS, options.participants[k]));\n }\n });\n options.participants[session.getKey().pub] = options.participants[session.getKey().pub] || Object.assign({}, DEFAULT_PERMISSIONS);\n if (options.uuid) {\n this.uuid = options.uuid;\n this.name = options.name;\n } else {\n options.uuid = Attribute.getUuid().value;\n this.uuid = options.uuid;\n options.participants[session.getKey().pub].admin = true;\n options.participants[session.getKey().pub].founder = true;\n }\n this.getChatLinks({subscribe: true});\n }\n this.participants = options.participants;\n if (options.uuid) { // It's a group channel\n // share secret uuid with other participants. since secret is already non-deterministic, maybe uuid could also be?\n // generate channel-specific secret and share it with other participants\n // put() keys should be encrypted first? so you could do put(uuid, secret)\n // what if you join the channel with 2 unconnected devices? on reconnect, the older secret would be overwritten and messages unreadable. maybe participants should store each others' old keys? or maybe you should store them and re-encrypt old stuff when key changes? return them with map() instead?\n this.putDirect(`S${this.uuid}`, this.getMyGroupSecret());\n this.getMySecretUuid().then(s => {\n this.putDirect(this.uuid, s); // TODO: encrypt keys in put()\n });\n this.onTheirDirect(this.uuid, (s, k, from) => {\n this.theirSecretUuids[from] = s;\n });\n this.onTheirDirect(`S${this.uuid}`, (s, k, from) => {\n this.theirGroupSecrets[from] = s;\n });\n // need to make put(), on(), send() and getMessages() behave differently when it's a group and retain the old versions for mutual signaling\n }\n this.onTheir(`participants`, (participants, k, from) => {\n let hasAdmin = false;\n const keys = Object.keys(this.participants);\n for (let i = 0; i < keys.length; i++) {\n if (this.participants[keys[i]].admin || this.participants[keys[i]].inviter) {\n hasAdmin = true;\n break;\n }\n }\n if (!hasAdmin) {\n keys.forEach(k => this.participants[k].admin = true); // if no admins, make everyone admin\n }\n if (this.participants[from] && (this.participants[from].admin || this.participants[from].inviter)) {\n if (typeof participants === `object`) {\n if (JSON.stringify(this.participants) === JSON.stringify(participants)) { return; }\n this.participants = participants;\n delete this.participants[from].inviter;\n Object.keys(participants).forEach(k => {\n if (k !== session.getKey().pub) {\n this.addParticipant(k, true, Object.assign({}, DEFAULT_PERMISSIONS, participants[k]), true);\n }\n });\n this.participantsChanged();\n options.saved = true;\n }\n }\n });\n if (!options.saved && (options.save === undefined || options.save === true)) {\n this.save();\n }\n }\n\n useChatLink(options) {\n const s = options.chatLink.split('?');\n if (s.length === 2) {\n const chatWith = util.getUrlParameter('chatWith', s[1]);\n const channelId = util.getUrlParameter('channelId', s[1]);\n const inviter = util.getUrlParameter('inviter', s[1]);\n const pub = inviter || chatWith;\n if (chatWith) {\n options.participants = pub;\n } else if (channelId && inviter && inviter !== session.getKey().pub) { // TODO! initializing it twice breaks things - new secret is generated\n options.uuid = channelId;\n options.participants = {};\n options.participants[inviter] = Object.assign({inviter: true}, DEFAULT_PERMISSIONS);\n }\n if (pub !== session.getKey().pub) {\n const sharedSecret = util.getUrlParameter('s', s[1]);\n const linkId = util.getUrlParameter('k', s[1]);\n if (sharedSecret && linkId) {\n this.save(); // save the channel first so it's there before inviter subscribes to it\n options.saved = true;\n publicState().user(pub).get('chatLinks').get(linkId).get('encryptedSharedKey').on(async encrypted => {\n const sharedKey = await Gun.SEA.decrypt(encrypted, sharedSecret);\n const encryptedChatRequest = await Gun.SEA.encrypt(session.getKey().pub, sharedSecret); // TODO encrypt is not deterministic, it uses salt\n const channelRequestId = await util.getHash(encryptedChatRequest);\n util.gunAsAnotherUser(publicState(), sharedKey, user => {\n user.get('chatRequests').get(channelRequestId.slice(0, 12)).put(encryptedChatRequest);\n });\n });\n }\n }\n }\n }\n\n getTheirSecretUuid(pub) {\n return new Promise(resolve => {\n if (!this.theirSecretUuids[pub]) {\n this.onTheirDirect(this.uuid, s => {\n this.theirSecretUuids[pub] = s;\n resolve(this.theirSecretUuids[pub]);\n }, pub);\n } else {\n resolve(this.theirSecretUuids[pub]);\n }\n });\n }\n\n getTheirGroupSecret(pub) {\n if (pub === session.getKey().pub) { return this.getMyGroupSecret(); }\n return new Promise(resolve => {\n if (!this.theirGroupSecrets[pub]) {\n this.onTheirDirect(`S${this.uuid}`, s => {\n this.theirGroupSecrets[pub] = s;\n resolve(this.theirGroupSecrets[pub]);\n }, pub);\n } else {\n resolve(this.theirGroupSecrets[pub]);\n }\n });\n }\n\n changeMyGroupSecret() {\n this.myGroupSecret = Gun.SEA.random(32).toString('base64');\n // TODO: secret should be archived and probably messages should include the encryption key id so past messages don't become unreadable\n this.putDirect(`S${this.uuid}`, this.myGroupSecret);\n }\n\n /**\n * Unsubscribe messages from a channel participants\n *\n * @param {string} participant public key\n */\n async mute(participant) {\n publicState().user(participant).get(this.theirSecretUuids[participant]).off();\n // TODO: persist\n }\n\n /**\n * Mute user and prevent them from seeing your further (and maybe past) messages\n *\n * @param {string} participant public key\n */\n async block(participant) {\n this.mute(participant);\n this.putDirect(this.uuid, null);\n this.putDirect(`S${this.uuid}`, null);\n delete this.secrets[participant];\n delete this.ourSecretChannelIds[participant];\n delete this.theirSecretChannelIds[participant];\n this.changeMyGroupSecret();\n }\n\n async getMySecretUuid() {\n if (!this.mySecretUuid) {\n const mySecret = await Gun.SEA.secret(session.getKey().epub, session.getKey());\n const mySecretHash = await util.getHash(mySecret);\n this.mySecretUuid = await util.getHash(mySecretHash + this.uuid);\n }\n return this.mySecretUuid;\n }\n\n /**\n * List participants of the channel (other than you)\n */\n getCurrentParticipants() {\n return Object.keys(this.secrets);\n }\n\n /**\n * Subscribe to the changing list of participants by channel admins\n */\n getParticipants(callback) {\n if (this.getParticipantsCallbackId) {\n this.getParticipantsCallbackId++;\n } else {\n this.getParticipantsCallbackId = 1;\n }\n this.getParticipantsCallbacks[this.getParticipantsCallbackId] = callback;\n if (this.participants) {\n callback(this.participants);\n }\n }\n\n participantsChanged() {\n Object.keys(this.getParticipantsCallbacks).forEach(id => {\n this.getParticipantsCallbacks[id](this.participants);\n });\n }\n\n /**\n * Returns either the uuid of a group channel or the public key of a direct channel.\n */\n getId() {\n return this.uuid || this.getCurrentParticipants()[0];\n }\n\n async getSecret(pub) {\n if (!this.secrets[pub]) {\n const epub = await util.gunOnceDefined(publicState().user(pub).get(`epub`));\n this.secrets[pub] = await Gun.SEA.secret(epub, session.getKey());\n }\n return this.secrets[pub];\n }\n\n /**\n *\n */\n static async getOurSecretChannelId(pub, pair) {\n const epub = await util.gunOnceDefined(publicState().user(pub).get(`epub`));\n const secret = await Gun.SEA.secret(epub, pair);\n return util.getHash(secret + pub);\n }\n\n /**\n *\n */\n static async getTheirSecretChannelId(pub, pair) {\n const epub = await util.gunOnceDefined(publicState().user(pub).get(`epub`));\n const secret = await Gun.SEA.secret(epub, pair);\n return util.getHash(secret + pair.pub);\n }\n\n /**\n * Calls back with Channels that you have initiated or written to.\n * @param {Object} keypair Gun.SEA keypair that the gun instance is authenticated with\n * @param callback callback function that is called for each public key you have a channel with\n */\n static async getChannels(callback, listenToChatLinks = true) {\n const keypair = session.getKey();\n const mySecret = await Gun.SEA.secret(keypair.epub, keypair);\n if (listenToChatLinks) {\n Channel.getMyChatLinks( undefined, undefined, true);\n }\n const seen = {};\n\n const handleChannel = async (value, ourSecretChannelId) => {\n if (value && !seen[ourSecretChannelId]) {\n seen[ourSecretChannelId] = true;\n if (ourSecretChannelId.length > 44) {\n publicState().user().get(`chats`).get(ourSecretChannelId).put(null);\n return;\n }\n const encryptedChatId = await util.gunOnceDefined(publicState().user().get(`chats`).get(ourSecretChannelId).get(`pub`));\n const chatId = await Gun.SEA.decrypt(encryptedChatId, mySecret);\n if (!chatId) {\n return;\n }\n if (chatId.pub || typeof chatId === `string`) {\n callback(new Channel({\n key: keypair,\n participants: chatId.pub || chatId,\n save: false\n }));\n } else if (chatId.uuid && chatId.participants && chatId.myGroupSecret) {\n callback(new Channel({\n key: keypair,\n participants: chatId.participants,\n uuid: chatId.uuid,\n myGroupSecret: chatId.myGroupSecret,\n save: false\n }));\n }\n }\n };\n\n publicState().user().get(`chats`).map().on(handleChannel);\n }\n\n getMyGroupSecret() { // group secret could be deterministic: hash(encryptToSelf(uuid + iterator))\n if (!this.myGroupSecret) {\n this.changeMyGroupSecret();\n }\n return this.myGroupSecret;\n }\n\n async getOurSecretChannelId(pub) {\n if (!this.ourSecretChannelIds[pub]) {\n const secret = await this.getSecret(pub);\n this.ourSecretChannelIds[pub] = await util.getHash(secret + pub);\n }\n return this.ourSecretChannelIds[pub];\n }\n\n async getTheirSecretChannelId(pub) {\n if (!this.theirSecretChannelIds[pub]) {\n const secret = await this.getSecret(pub);\n this.theirSecretChannelIds[pub] = await util.getHash(secret + session.getKey().pub);\n }\n return this.theirSecretChannelIds[pub];\n }\n\n /**\n * Get messages from the channel\n */\n async getMessages(callback) { // TODO: save callback and apply it when new participants are added to channel\n this.getCurrentParticipants().forEach(async pub => {\n if (pub !== session.getKey().pub) {\n // Subscribe to their messages\n let theirSecretChannelId;\n if (this.uuid) {\n theirSecretChannelId = await this.getTheirSecretUuid(pub);\n } else {\n theirSecretChannelId = await this.getTheirSecretChannelId(pub);\n }\n publicState().user(pub).get(`chats`).get(theirSecretChannelId).get(`msgs`).map().once((data, key) => {this.messageReceived(callback, data, this.uuid || pub, false, key, pub);});\n }\n if (!this.uuid) {\n // Subscribe to our messages\n const ourSecretChannelId = await this.getOurSecretChannelId(pub);\n userState().get(`chats`).get(ourSecretChannelId).get(`msgs`).map().once((data, key) => {this.messageReceived(callback, data, pub, true, key, session.getKey().pub);});\n }\n });\n if (this.uuid) {\n // Subscribe to our messages\n const mySecretUuid = await this.getMySecretUuid();\n userState().get(`chats`).get(mySecretUuid).get(`msgs`).map().once((data, key) => {this.messageReceived(callback, data, this.uuid, true, key, session.getKey().pub);});\n }\n }\n\n async messageReceived(callback, data, channelId, selfAuthored, key, from) {\n if (this.messages[key] || !data) {\n return;\n }\n const secret = this.uuid ? (await this.getTheirGroupSecret(from)) : (await this.getSecret(channelId));\n const decrypted = await Gun.SEA.decrypt(data, secret);\n if (typeof decrypted !== `object`) {\n return;\n }\n const info = {selfAuthored, channelId, from};\n this.messages[key] = decrypted;\n callback(decrypted, info);\n }\n\n /**\n * Get latest message in this channel. Useful for channel listing.\n */\n async getLatestMsg(callback) {\n const callbackIfLatest = async (msg, info) => {\n if (!this.latest) {\n this.latest = msg;\n callback(msg, info);\n } else {\n const t = (typeof this.latest.time === `string` ? this.latest.time : this.latest.time.toISOString());\n if (t < msg.time) {\n this.latest = msg;\n callback(msg, info);\n }\n }\n };\n this.onMy('latestMsg', msg => callbackIfLatest(msg, {selfAuthored: true, from: session.getKey().pub}));\n this.onTheir('latestMsg', (msg, k, from) => callbackIfLatest(msg, {selfAuthored: false, from}));\n }\n\n /**\n * Useful for notifications\n * @param {integer} time last seen msg time (default: now)\n */\n async setMyMsgsLastSeenTime(time?: string) {\n time = time || new Date().toISOString();\n return this.put(`msgsLastSeenTime`, time);\n }\n\n /**\n * Useful for notifications\n */\n async getMyMsgsLastSeenTime(callback) {\n this.onMy(`msgsLastSeenTime`, time => {\n this.myMsgsLastSeenTime = time;\n if (callback) {\n callback(this.myMsgsLastSeenTime);\n }\n });\n }\n\n /**\n * For \"seen\" status indicator\n */\n async getTheirMsgsLastSeenTime(callback) {\n this.onTheir(`msgsLastSeenTime`, time => {\n this.theirMsgsLastSeenTime = time;\n if (callback) {\n callback(this.theirMsgsLastSeenTime);\n }\n });\n }\n\n async removeParticipant(pub) {\n this.addParticipant(pub, true, {read: false, write: false});\n }\n\n /**\n * Add a public key to the channel or update its permissions\n * @param {string} pub\n */\n async addParticipant(pub: string, save = true, permissions?: any, subscribe?: boolean) {\n if (this.uuid) {\n return;\n }\n if (permissions === undefined) {\n permissions = DEFAULT_PERMISSIONS;\n }\n if (this.secrets[pub] && JSON.stringify(this.secrets[pub]) === JSON.stringify(permissions)) { // TODO: should be this.participants[pub]\n return;\n }\n this.secrets[pub] = null;\n this.getSecret(pub);\n const ourSecretChannelId = await this.getOurSecretChannelId(pub);\n if (save) {\n // Save their public key in encrypted format, so in channel listing we know who we are channeling with\n const mySecret = await Gun.SEA.secret(session.getKey().epub, session.getKey());\n publicState().user().get(`chats`).get(ourSecretChannelId).get(`pub`).put(await Gun.SEA.encrypt({pub}, mySecret));\n }\n if (this.uuid) {\n this.participants[pub] = permissions;\n if (save) {\n this.putDirect(`S${this.uuid}`, this.getMyGroupSecret());\n this.getMySecretUuid().then(s => {\n this.putDirect(this.uuid, s); // TODO: encrypt keys in put()\n });\n this.onTheirDirect(this.uuid, (s, k, from) => {\n this.theirSecretUuids[from] = s;\n });\n this.onTheirDirect(`S${this.uuid}`, (s, k, from) => {\n this.theirGroupSecrets[from] = s;\n });\n this.save();\n }\n }\n if (subscribe) {\n Object.values(this.directSubscriptions).forEach(arr => {\n arr.forEach(o => {\n if (!o.from || o.from === pub) {\n this._onTheirDirectFromUser(pub, o.key, o.callback);\n }\n });\n });\n Object.values(this.groupSubscriptions).forEach(arr => {\n arr.forEach(o => {\n if (o.from && o.from !== pub) { return; }\n if (permissions.write) {\n this._onTheirGroupFromUser(pub, o.key, o.callback);\n } else { // unsubscribe\n o.event && o.event.off();\n }\n });\n });\n }\n }\n\n /**\n * Send a message to the channel\n * @param msg string or {time, text, ...} object\n */\n async send(msg) {\n if (typeof msg === `string`) {\n msg = msg.trim();\n if (msg.length === 0) {\n return;\n }\n msg = {\n time: (new Date()).toISOString(),\n text: msg\n };\n } else if (typeof msg === `object`) {\n msg.time = msg.time || (new Date()).toISOString();\n } else {\n throw new Error(`msg param must be a string or an object`);\n }\n //publicState().user().get('message').set(temp);\n if (this.uuid) {\n const encrypted = await Gun.SEA.encrypt(JSON.stringify(msg), this.getMyGroupSecret());\n const mySecretUuid = await this.getMySecretUuid();\n userState().get(`chats`).get(mySecretUuid).get(`msgs`).get(`${msg.time}`).put(encrypted);\n userState().get(`chats`).get(mySecretUuid).get(`latestMsg`).put(encrypted);\n } else {\n const keys = this.getCurrentParticipants();\n for (let i = 0;i < keys.length;i++) {\n const encrypted = await Gun.SEA.encrypt(JSON.stringify(msg), (await this.getSecret(keys[i])));\n const ourSecretChannelId = await this.getOurSecretChannelId(keys[i]);\n userState().get(`chats`).get(ourSecretChannelId).get(`msgs`).get(`${msg.time}`).put(encrypted);\n userState().get(`chats`).get(ourSecretChannelId).get(`latestMsg`).put(encrypted);\n }\n }\n }\n\n /**\n * Save the channel to our channels list without sending a message\n */\n async save() {\n if (this.uuid) {\n const mySecretUuid = await this.getMySecretUuid();\n userState().get(`chats`).get(mySecretUuid).get('msgs').get('a').put(null);\n this.put(`participants`, this.participants); // public participants list\n const mySecret = await Gun.SEA.secret(session.getKey().epub, session.getKey());\n userState().get(`chats`).get(mySecretUuid).get(`pub`).put(await Gun.SEA.encrypt({\n uuid: this.uuid,\n myGroupSecret: this.getMyGroupSecret(),\n participants: this.participants // private participants list\n }, mySecret));\n this.participantsChanged();\n } else {\n const keys = this.getCurrentParticipants();\n for (let i = 0;i < keys.length;i++) {\n const ourSecretChannelId = await this.getOurSecretChannelId(keys[i]);\n userState().get(`chats`).get(ourSecretChannelId).get('msgs').get('a').put(null);\n }\n }\n }\n\n /**\n * Save a key-value pair, encrypt value. Each participant in the Channel writes to their own version of the key-value pair — they don't overwrite the same one.\n * @param {string} key\n * @param value\n */\n async put(key, value) {\n return (this.uuid ? this.putGroup : this.putDirect).call(this, key, value);\n }\n\n async putGroup(key, value) {\n if (key === `msgs`) { throw new Error(`Sorry, you can't overwrite the msgs field which is used for .send()`); }\n const encrypted = await Gun.SEA.encrypt(JSON.stringify(value), this.getMyGroupSecret());\n const mySecretUuid = await this.getMySecretUuid();\n userState().get(`chats`).get(mySecretUuid).get(key).put(encrypted);\n }\n\n async putDirect(key, value) {\n if (key === `msgs`) { throw new Error(`Sorry, you can't overwrite the msgs field which is used for .send()`); }\n const keys = this.getCurrentParticipants();\n for (let i = 0;i < keys.length;i++) {\n const encrypted = await Gun.SEA.encrypt(JSON.stringify(value), (await this.getSecret(keys[i])));\n const ourSecretChannelId = await this.getOurSecretChannelId(keys[i]);\n userState().get(`chats`).get(ourSecretChannelId).get(key).put(encrypted);\n }\n }\n\n /**\n * Subscribe to a key-value pair. Callback returns every participant's value unless you limit it with *from* param.\n * @param {string} key\n * @param {function} callback\n * @param {string} from public key whose value you want, or *\"me\"* for your value only, or *\"them\"* for the value of others only\n */\n async on(key: string, callback: Function, from?: string) {\n return (this.uuid ? this.onGroup : this.onDirect).call(this, key, callback, from);\n }\n\n async onDirect(key: string, callback: Function, from?: string) {\n if (!from || from === `me` || from === session.getKey().pub) {\n this.onMy(key, (val: any) => callback(val, session.getKey().pub));\n }\n if (!from || (from !== `me` && from !== session.getKey().pub)) {\n this.onTheir(key, (val: any, k: string, pub: string) => callback(val, pub));\n }\n }\n\n async onGroup(key: string, callback: Function, from?: string) {\n if (!from || from === `me` || from === session.getKey().pub) {\n this.onMyGroup(key, val => callback(val, session.getKey().pub));\n }\n if (!from || (from !== `me` && from !== session.getKey().pub)) {\n this.onTheirGroup(key, (val, k, pub) => callback(val, pub));\n }\n }\n\n async onMy(key: string, callback: Function) {\n return (this.uuid ? this.onMyGroup : this.onMyDirect).call(this, key, callback);\n }\n\n async onMyDirect(key: string, callback: Function) {\n if (typeof callback !== 'function') {\n throw new Error(`onMy callback must be a function, got ${typeof callback}`);\n }\n const keys = this.getCurrentParticipants();\n for (let i = 0;i < keys.length;i++) {\n const ourSecretChannelId = await this.getOurSecretChannelId(keys[i]);\n publicState().user().get(`chats`).get(ourSecretChannelId).get(key).on(async (data: any) => {\n const decrypted = await Gun.SEA.decrypt(data, (await this.getSecret(keys[i])));\n if (decrypted) {\n callback(typeof decrypted.v !== `undefined` ? decrypted.v : decrypted, key);\n }\n });\n break;\n }\n }\n\n async onMyGroup(key, callback) {\n if (typeof callback !== 'function') {\n throw new Error(`onMy callback must be a function, got ${typeof callback}`);\n }\n const mySecretUuid = await this.getMySecretUuid();\n const mySecret = await this.getMyGroupSecret();\n publicState().user().get(`chats`).get(mySecretUuid).get(key).on(async data => {\n const decrypted = await Gun.SEA.decrypt(data, mySecret);\n if (decrypted) {\n callback(typeof decrypted.v !== `undefined` ? decrypted.v : decrypted, key, session.getKey().pub);\n }\n });\n }\n\n async onTheir(key: string, callback: Function, from: string) {\n return (this.uuid ? this.onTheirGroup : this.onTheirDirect).call(this, key, callback, from);\n }\n\n async _onTheirDirectFromUser(key: string, callback: Function, pub: string) {\n if (!this.hasWritePermission(pub)) { return; }\n const theirSecretChannelId = await this.getTheirSecretChannelId(pub);\n publicState().user(pub).get(`chats`).get(theirSecretChannelId).get(key).on(async (data: any) => {\n if (!this.hasWritePermission(pub)) { return; }\n const decrypted = await Gun.SEA.decrypt(data, (await this.getSecret(pub)));\n if (decrypted) {\n callback(typeof decrypted.v !== `undefined` ? decrypted.v : decrypted, key, pub);\n }\n });\n }\n\n async onTheirDirect(key: string, callback: Function, from: string) { // TODO: subscribe to new channel participants\n if (typeof callback !== 'function') {\n throw new Error(`onTheir callback must be a function, got ${typeof callback}`);\n }\n if (!Object.prototype.hasOwnProperty.call(this.directSubscriptions, key)) {\n this.directSubscriptions[key] = [];\n }\n this.directSubscriptions[key].push({key, callback, from});\n const participants = this.getCurrentParticipants();\n participants.forEach(async pub => {\n if (from && pub !== from) { return; }\n this._onTheirDirectFromUser(pub, key, callback);\n });\n }\n\n hasWritePermission(pub) {\n return !this.uuid || (this.participants && this.participants[pub] && this.participants[pub].write);\n }\n\n async _onTheirGroupFromUser(pub: string, key: string, callback: Function, subscription: any) {\n if (!this.hasWritePermission(pub)) { return; }\n const theirSecretUuid = await this.getTheirSecretUuid(pub);\n publicState().user(pub).get(`chats`).get(theirSecretUuid).get(key).on(async (data: any, _a: any, _b: any, e: Event) => {\n if (subscription) { subscription.event = e; }\n if (!this.hasWritePermission(pub)) { return; }\n const decrypted = await Gun.SEA.decrypt(data, (await this.getTheirGroupSecret(pub)));\n if (decrypted) {\n callback(typeof decrypted.v !== `undefined` ? decrypted.v : decrypted, key, pub);\n }\n });\n }\n\n async onTheirGroup(key, callback, from) {\n if (typeof callback !== 'function') {\n throw new Error(`onTheir callback must be a function, got ${typeof callback}`);\n }\n if (!Object.prototype.hasOwnProperty.call(this.groupSubscriptions, key)) {\n this.groupSubscriptions[key] = [];\n }\n const subscription = {key, callback, from};\n this.groupSubscriptions[key].push(subscription);\n\n this.getParticipants(participants => {\n Object.keys(participants).forEach(async pub => {\n if (from && pub !== from) { return; }\n if (!(participants[pub] && participants[pub].write)) { return; }\n this._onTheirGroupFromUser(pub, key, callback, subscription);\n });\n });\n }\n\n /**\n * Set typing status\n */\n setTyping(isTyping, timeout = 5) {\n isTyping = typeof isTyping === `undefined` ? true : isTyping;\n timeout = timeout * 1000;\n this.put(`typing`, isTyping ? new Date().toISOString() : new Date(0).toISOString());\n clearTimeout(this.setTypingTimeout);\n this.setTypingTimeout = setTimeout(() => this.put(`typing`, false), timeout);\n }\n\n /**\n * Get typing status\n */\n getTyping(callback, timeout = 5) { // TODO callback not called on setTyping(false), at least for self chat\n timeout = timeout * 1000;\n this.onTheir(`typing`, (typing, key, pub) => {\n if (callback) {\n const isTyping = typing && new Date() - new Date(typing) <= timeout;\n callback(isTyping, pub);\n this.getTypingTimeouts = this.getTypingTimeouts || {};\n clearTimeout(this.getTypingTimeouts[pub]);\n if (isTyping) {\n this.getTypingTimeouts[pub] = setTimeout(() => callback(false, pub), timeout);\n }\n }\n });\n }\n\n /**\n * Add a chat button to page\n * @param options {label, channelOptions}\n */\n static addChatButton(options = {}) {\n options = Object.assign({label: 'Chat'}, options);\n if (!options.channelOptions) {\n throw new Error('addChatButton missing options.channelOptions param');\n }\n util.injectCss();\n let channel, box;\n const btn = util.createElement('div', 'iris-chat-open-button', document.body);\n btn.setAttribute('id', 'iris-chat-open-button');\n btn.innerHTML = ` ${options.label}`;\n btn.addEventListener('click', () => {\n btn.setAttribute('style', 'display: none');\n if (!channel) {\n channel = new Channel(options.channelOptions);\n box = channel.getChatBox();\n document.body.appendChild(box);\n } else {\n box.setAttribute('style', ''); // show\n }\n });\n }\n\n /**\n * Get a simple link that points to the channel.\n *\n * Direct channel: both users need to give their simple links. Use createChatLink() to get a two-way link that needs to be given by one user only.\n *\n * Group channel: Works only if the link recipient has been already added onto the channel participants list.\n */\n getSimpleLink(urlRoot = 'https://iris.to/') {\n if (this.uuid) {\n return `${urlRoot}?channelId=${this.uuid}&inviter=${session.getKey().pub}`;\n }\n return `${urlRoot}?chatWith=${this.getCurrentParticipants()[0]}`;\n }\n\n /**\n *\n */\n async getChatLinks(opts: any = {}) {\n let {callback, urlRoot, subscribe} = opts;\n urlRoot = urlRoot || 'https://iris.to/';\n if (!this.uuid) { throw new Error('Only group channels may have chat links'); }\n const chatLinks: any[] = [];\n const chatLinkSubscriptions = {};\n this.on('chatLinks', (links: any, from: string) => {\n // TODO: check admin permissions\n if (!links || typeof links !== 'object') { return; }\n Object.keys(links).forEach(linkId => {\n const link = links[linkId];\n if (link === null) {\n chatLinkSubscriptions[linkId] && chatLinkSubscriptions[linkId].off(); // unsubscribe removed chat link\n delete chatLinkSubscriptions[linkId];\n callback && callback({id: linkId, url: null});\n return;\n }\n if (chatLinks.indexOf(linkId) !== -1) { return; }\n const channels = [];\n chatLinks.push(linkId);\n const url = Channel.formatChatLink({urlRoot, inviter: from, channelId: this.uuid, sharedSecret: link.sharedSecret, linkId});\n callback && callback({url, id: linkId});\n if (subscribe) {\n publicState().user(link.sharedKey.pub).get('chatRequests').map().on(async (encPub, requestId, a, e) => {\n if (!encPub || typeof encPub !== 'string' || encPub.length < 10) { return; }\n chatLinkSubscriptions[linkId] = e;\n const s = JSON.stringify(encPub);\n if (channels.indexOf(s) === -1) {\n channels.push(s);\n const pub = await Gun.SEA.decrypt(encPub, link.sharedSecret);\n this.addParticipant(pub, undefined, undefined, true);\n }\n });\n }\n });\n });\n }\n\n async createChatLink(urlRoot = 'https://iris.to/') {\n const sharedKey = await Gun.SEA.pair();\n const sharedKeyString = JSON.stringify(sharedKey);\n const sharedSecret = await Gun.SEA.secret(sharedKey.epub, sharedKey);\n const encryptedSharedKey = await Gun.SEA.encrypt(sharedKeyString, sharedSecret);\n const ownerSecret = await Gun.SEA.secret(session.getKey().epub, session.getKey());\n const ownerEncryptedSharedKey = await Gun.SEA.encrypt(sharedKeyString, ownerSecret);\n let linkId = await util.getHash(encryptedSharedKey);\n linkId = linkId.slice(0, 12);\n\n // User has to exist, in order for .get(chatRequests).on() to be ever triggered\n await util.gunAsAnotherUser(publicState(), sharedKey, user => {\n return user.get('chatRequests').put({a: 1}).then();\n });\n\n this.chatLinks[linkId] = {sharedKey, sharedSecret};\n this.put('chatLinks', this.chatLinks);\n userState().get('chatLinks').get(linkId).put({encryptedSharedKey, ownerEncryptedSharedKey});\n\n return Channel.formatChatLink({urlRoot, channelId: this.uuid, inviter: session.getKey().pub, sharedSecret, linkId});\n }\n\n /**\n * Get a channel box element that you can add to your page\n */\n getChatBox() {\n util.injectCss();\n let minimized = false;\n\n const chatBox = util.createElement('div', 'iris-chat-box');\n const header = util.createElement('div', 'iris-chat-header', chatBox);\n const minimize = util.createElement('span', 'iris-chat-minimize', header);\n minimize.innerText = '—';\n minimize.addEventListener('click', e => {\n e.stopPropagation();\n chatBox.setAttribute('class', 'iris-chat-box minimized');\n minimized = true;\n });\n const headerText = util.createElement('div', 'iris-chat-header-text', header);\n const onlineIndicator = util.createElement('span', 'iris-online-indicator', headerText);\n onlineIndicator.innerHTML = '●';\n const nameEl = util.createElement('span', undefined, headerText);\n const close = util.createElement('span', 'iris-chat-close', header);\n close.innerHTML = '×';\n close.addEventListener('click', () => {\n chatBox.setAttribute('style', 'display: none');\n const openChatBtn = document.getElementById('iris-chat-open-button');\n if (openChatBtn) {\n openChatBtn.setAttribute('style', ''); // show\n }\n });\n header.addEventListener('click', () => {\n if (minimized) {\n chatBox.setAttribute('class', 'iris-chat-box');\n minimized = false;\n }\n });\n\n const messages = util.createElement('div', 'iris-chat-messages', chatBox);\n\n const typingIndicator = util.createElement('div', 'iris-typing-indicator', chatBox);\n typingIndicator.innerText = 'typing...';\n this.getTyping(isTyping => {\n typingIndicator.setAttribute('class', `iris-typing-indicator${ isTyping ? ' yes' : ''}`);\n });\n\n const inputWrapper = util.createElement('div', 'iris-chat-input-wrapper', chatBox);\n const textArea = util.createElement('textarea', undefined, inputWrapper);\n textArea.setAttribute('rows', '1');\n textArea.setAttribute('placeholder', 'Type a message');\n if (util.isMobile) {\n const sendBtn = util.createElement('button', undefined, inputWrapper);\n sendBtn.innerHTML = `\n \n `;\n sendBtn.addEventListener('click', () => {\n this.send(textArea.value);\n textArea.value = '';\n this.setTyping(false);\n });\n }\n\n const participants = this.getCurrentParticipants();\n if (participants.length) {\n const pub = participants[0];\n publicState().user(pub).get('profile').get('name').on(name => nameEl.innerText = name);\n Channel.getActivity(publicState(), pub, status => {\n const cls = `iris-online-indicator${ status.isActive ? ' yes' : ''}`;\n onlineIndicator.setAttribute('class', cls);\n const undelivered = messages.querySelectorAll('.iris-chat-message:not(.delivered)');\n undelivered.forEach(msg => {\n if (msg.getAttribute('data-time') <= status.lastActive) {\n const c = msg.getAttribute('class');\n msg.setAttribute('class', `${c } delivered`);\n }\n });\n });\n }\n\n this.getTheirMsgsLastSeenTime(time => {\n const unseen = messages.querySelectorAll('.iris-seen:not(.yes)');\n unseen.forEach(indicator => {\n const msgEl = indicator.parentElement.parentElement.parentElement;\n if (msgEl.getAttribute('data-time') <= time) {\n const msgClass = msgEl.getAttribute('class');\n if (msgClass.indexOf('delivered') === -1) {\n msgEl.setAttribute('class', `${msgClass } delivered`);\n }\n indicator.setAttribute('class', 'iris-seen yes');\n }\n });\n });\n\n this.getMessages((msg, info) => {\n const msgContent = util.createElement('div', 'iris-msg-content');\n msgContent.innerText = msg.text;\n const time = util.createElement('div', 'time', msgContent);\n time.innerText = util.formatTime(new Date(msg.time));\n if (info.selfAuthored) {\n const cls = this.theirMsgsLastSeenTime >= msg.time ? 'iris-seen yes' : 'iris-seen';\n const seenIndicator = util.createElement('span', cls, time);\n seenIndicator.innerHTML = ' ';\n }\n msgContent.innerHTML = msgContent.innerHTML.replace(/\\n/g, '
\\n');\n\n const msgEl = util.createElement('div', `${info.selfAuthored ? 'our' : 'their'} iris-chat-message`);\n msgEl.appendChild(msgContent);\n msgEl.setAttribute('data-time', msg.time);\n for (let i = messages.children.length; i >= 0; i--) {\n if (i === 0) {\n messages.insertBefore(msgEl, messages.firstChild);\n } else {\n const t = messages.children[i - 1].getAttribute('data-time');\n if (t && t < msg.time) {\n messages.children[i - 1].insertAdjacentElement('afterend', msgEl);\n break;\n }\n }\n }\n messages.scrollTop = messages.scrollHeight;\n });\n\n textArea.addEventListener('keyup', event => {\n Channel.setActivity(publicState(), true); // TODO\n this.setMyMsgsLastSeenTime(); // TODO\n if (event.keyCode === 13) {\n event.preventDefault();\n const content = textArea.value;\n const caret = util.getCaret(textArea);\n if (event.shiftKey) {\n textArea.value = `${content.substring(0, caret - 1) }\\n${ content.substring(caret, content.length)}`;\n } else {\n textArea.value = content.substring(0, caret - 1) + content.substring(caret, content.length);\n this.send(textArea.value);\n textArea.value = '';\n this.setTyping(false);\n }\n } else {\n this.setTyping(!!textArea.value.length);\n }\n });\n\n return chatBox;\n }\n\n /**\n * Set the user's online/active status\n * @param {string} activity string: set the activity status every 3 seconds, null/false: stop updating\n */\n static setActivity(activity) {\n if (publicState().irisActivityStatus === activity) { return; }\n publicState().irisActivityStatus = activity;\n clearTimeout(publicState().setActivityTimeout);\n const update = () => {\n publicState().user().get(`activity`).put({status: activity, time: new Date(Gun.state()).toISOString()});\n };\n update();\n function timerUpdate() {\n update();\n publicState().setActivityTimeout = setTimeout(timerUpdate, 3000);\n }\n if (activity) {\n timerUpdate();\n }\n }\n\n /**\n * Get the online status of a user.\n *\n * @param {string} pubKey public key of the user\n * @param {boolean} callback receives a boolean each time the user's online status changes\n */\n static getActivity(pubKey, callback) {\n let timeout;\n publicState().user(pubKey).get(`activity`).on(activity => {\n if (!activity || !(activity.time && activity.status)) { return; }\n clearTimeout(timeout);\n const now = new Date(Gun.state());\n const activityDate = new Date(activity.time);\n const isActive = activityDate > new Date(now.getTime() - 10 * 1000) && activityDate < new Date(now.getTime() + 30 * 1000);\n callback({isActive, lastActive: activity.time, status: activity.status});\n if (isActive) {\n timeout = setTimeout(() => callback({isOnline: false, lastActive: activity.time}), 10000);\n }\n });\n }\n\n static formatChatLink({urlRoot, chatWith, channelId, inviter, sharedSecret, linkId}) {\n const enc = encodeURIComponent;\n if (channelId && inviter) {\n return `${urlRoot}?channelId=${enc(channelId)}&inviter=${enc(inviter)}&s=${enc(sharedSecret)}&k=${enc(linkId)}`;\n }\n return `${urlRoot}?chatWith=${enc(chatWith)}&s=${enc(sharedSecret)}&k=${enc(linkId)}`;\n }\n\n /**\n * Creates a channel link that can be used for two-way communication, i.e. only one link needs to be exchanged.\n */\n static async createChatLink(urlRoot = 'https://iris.to/') {\n const user = publicState().user();\n const key = session.getKey();\n\n // We create a new Gun user whose private key is shared with the chat link recipients.\n // Chat link recipients can contact you by writing their public key to the shared key's user space.\n const sharedKey = await Gun.SEA.pair();\n const sharedKeyString = JSON.stringify(sharedKey);\n const sharedSecret = await Gun.SEA.secret(sharedKey.epub, sharedKey);\n const encryptedSharedKey = await Gun.SEA.encrypt(sharedKeyString, sharedSecret);\n const ownerSecret = await Gun.SEA.secret(key.epub, key);\n const ownerEncryptedSharedKey = await Gun.SEA.encrypt(sharedKeyString, ownerSecret);\n let linkId = await util.getHash(encryptedSharedKey);\n linkId = linkId.slice(0, 12);\n\n // User has to exist, in order for .get(chatRequests).on() to be ever triggered\n util.gunAsAnotherUser(publicState(), sharedKey, user => {\n user.get('chatRequests').put({a: 1});\n });\n\n user.get('chatLinks').get(linkId).put({encryptedSharedKey, ownerEncryptedSharedKey});\n\n return Channel.formatChatLink({urlRoot, chatWith: key.pub, sharedSecret, linkId});\n }\n\n /**\n *\n */\n static async getMyChatLinks(urlRoot = 'https://iris.to/', callback: Function, subscribe = false) {\n const key = session.getKey();\n const user = publicState().user();\n const mySecret = await Gun.SEA.secret(key.epub, key);\n const chatLinks = [];\n user.get('chatLinks').map().on((data, linkId) => {\n if (!data || chatLinks.indexOf(linkId) !== -1) { return; }\n const channels = [];\n user.get('chatLinks').get(linkId).get('ownerEncryptedSharedKey').on(async enc => {\n if (!enc || chatLinks.indexOf(linkId) !== -1) { return; }\n chatLinks.push(linkId);\n const sharedKey = await Gun.SEA.decrypt(enc, mySecret);\n const sharedSecret = await Gun.SEA.secret(sharedKey.epub, sharedKey);\n const url = Channel.formatChatLink({urlRoot, chatWith: key.pub, sharedSecret, linkId});\n if (callback) {\n callback({url, id: linkId});\n }\n if (subscribe) {\n publicState().user(sharedKey.pub).get('chatRequests').map().on(async (encPub, requestId) => {\n if (!encPub) { return; }\n const s = JSON.stringify(encPub);\n if (channels.indexOf(s) === -1) {\n channels.push(s);\n const pub = await Gun.SEA.decrypt(encPub, sharedSecret);\n const channel = new Channel({key, participants: pub});\n channel.save();\n }\n util.gunAsAnotherUser(publicState(), sharedKey, user => { // remove the channel request after reading\n user.get('chatRequests').get(requestId).put(null);\n });\n });\n }\n });\n });\n }\n\n /**\n *\n */\n removeGroupChatLink(linkId) {\n this.chatLinks[linkId] = null;\n this.put('chatLinks', this.chatLinks);\n publicState().user().get('chatLinks').get(linkId).put(null);\n }\n\n /**\n *\n */\n static removePrivateChatLink(key, linkId) {\n publicState().user().auth(key);\n publicState().user().get('chatLinks').get(linkId).put(null);\n }\n\n /**\n *\n */\n static async deleteChannel(key, pub) {\n publicState().user().auth(key);\n const channelId = await Channel.getOurSecretChannelId(pub, key);\n publicState().user().get('channels').get(channelId).put(null);\n publicState().user().get('channels').get(channelId).off();\n }\n\n /**\n *\n */\n static async deleteGroup(key, uuid) {\n const mySecret = await Gun.SEA.secret(key.epub, key);\n const mySecretHash = await util.getHash(mySecret);\n const mySecretUuid = await util.getHash(mySecretHash + uuid);\n publicState().user().auth(key);\n publicState().user().get('channels').get(mySecretUuid).put(null);\n publicState().user().get('channels').get(mySecretUuid).off();\n }\n}\n\nexport default Channel;\n","import Channel from './Channel';\nimport session from './session';\n\nconst channels = new Map();\n\n/**\n * Private channel that only you and publicKey can read/write.\n * @param publicKey\n * @returns {Channel}\n */\nexport default function(publicKey = session.getKey(), chatLink?: string): Channel {\n let channel = channels.get(publicKey);\n if (!channel) {\n channel = new Channel({participants: publicKey, chatLink})\n channels.set(publicKey, channel);\n }\n return channel;\n}","// @ts-nocheck\n\nimport localForage from 'localforage';\nimport _ from './lodash';\n\ntype MyEventListener = {\n off: Function\n};\n\n// Localforage returns null if an item is not found, so we represent null with this uuid instead.\n// not foolproof, but good enough for now.\nconst LOCALFORAGE_NULL = \"c2fc1ad0-f76f-11ec-b939-0242ac120002\";\nconst notInLocalForage = new Set();\n\nlocalForage.config({\n driver: [localForage.LOCALSTORAGE, localForage.INDEXEDDB, localForage.WEBSQL]\n})\n\n/**\n Our very own implementation of the Gun API\n */\nexport default class Node {\n id: string;\n parent: Node | null;\n children = new Map();\n on_subscriptions = new Map();\n map_subscriptions = new Map();\n value: any = undefined;\n counter = 0;\n loaded = false;\n\n /** */\n constructor(id: string = '', parent: Node|null = null) {\n this.id = id;\n this.parent = parent;\n }\n\n saveLocalForage = _.throttle(async () => {\n if (!this.loaded) {\n await this.loadLocalForage();\n }\n if (this.children.size) {\n const children = Array.from(this.children.keys());\n localForage.setItem(this.id, children);\n } else if (this.value === undefined) {\n localForage.removeItem(this.id);\n } else {\n localForage.setItem(this.id, this.value === null ? LOCALFORAGE_NULL : this.value);\n }\n }, 500);\n\n loadLocalForage = _.throttle(async () => {\n if (notInLocalForage.has(this.id)) {\n return undefined;\n }\n // try to get the value from localforage\n let result = await localForage.getItem(this.id);\n // getItem returns null if not found\n if (result === null) {\n result = undefined;\n notInLocalForage.add(this.id);\n } else if (result === LOCALFORAGE_NULL) {\n result = null;\n } else if (Array.isArray(result)) {\n // result is a list of children\n const newResult = {};\n await Promise.all(result.map(async key => {\n newResult[key] = await this.get(key).once();\n }));\n result = newResult;\n } else {\n // result is a value\n this.value = result;\n }\n this.loaded = true;\n return result;\n }, 500);\n\n doCallbacks = _.throttle(() => {\n for (const [id, callback] of this.on_subscriptions) {\n const event = { off: () => this.on_subscriptions.delete(id) };\n this.once(callback, event, false);\n }\n if (this.parent) {\n for (const [id, callback] of this.parent.on_subscriptions) {\n const event = { off: () => this.parent.on_subscriptions.delete(id) };\n this.parent.once(callback, event, false);\n }\n for (const [id, callback] of this.parent.map_subscriptions) {\n const event = { off: () => this.parent.map_subscriptions.delete(id) };\n this.once(callback, event, false);\n }\n }\n }, 40);\n\n /**\n *\n * @param key\n * @returns {Node}\n * @example node.get('users').get('alice').put({name: 'Alice'})\n */\n get(key) {\n const existing = this.children.get(key);\n if (existing) {\n return existing;\n }\n const new_node = new Node(`${this.id}/${key}`, this);\n this.children.set(key, new_node);\n this.saveLocalForage();\n return new_node;\n }\n\n /**\n * Set a value to the node. If the value is an object, it will be converted to child nodes.\n * @param value\n * @example node.get('users').get('alice').put({name: 'Alice'})\n */\n put(value) {\n if (Array.isArray(value)) {\n throw new Error('Sorry, we don\\'t deal with arrays');\n }\n if (typeof value === 'object' && value !== null) {\n this.value = undefined;\n for (const key in value) {\n this.get(key).put(value[key]);\n }\n _.defer(() => this.doCallbacks(), 100);\n return;\n }\n this.children = new Map();\n this.value = value;\n this.doCallbacks();\n this.saveLocalForage();\n }\n\n // protip: the code would be a lot cleaner if you separated the Node API from storage adapters.\n /**\n * Return a value without subscribing to it\n * @param callback\n * @param event\n * @param returnIfUndefined\n * @returns {Promise<*>}\n */\n async once(callback?: Function, event?: MyEventListener, returnIfUndefined = true): Promise {\n let result: any;\n if (this.children.size) {\n // return an object containing all children\n result = {};\n await Promise.all(Array.from(this.children.keys()).map(async key => {\n result[key] = await this.get(key).once(undefined, event);\n }));\n } else if (this.value !== undefined) {\n result = this.value;\n } else {\n result = await this.loadLocalForage();\n }\n if (result !== undefined || returnIfUndefined) {\n callback && callback(result, this.id.slice(this.id.lastIndexOf('/') + 1), null, event);\n return result;\n }\n }\n\n /**\n * Subscribe to a value\n * @param callback\n */\n on(callback: Function): void {\n const id = this.counter++;\n this.on_subscriptions.set(id, callback);\n const event = { off: () => this.on_subscriptions.delete(id) };\n this.once(callback, event, false);\n }\n\n /**\n * Subscribe to the children of a node. Callback is called separately for each child.\n * @param callback\n * @returns {Promise}\n */\n async map(callback: Function) {\n const id = this.counter++;\n this.map_subscriptions.set(id, callback);\n const event = { off: () => this.map_subscriptions.delete(id) };\n if (!this.loaded) {\n // ensure that the list of children is loaded\n await this.loadLocalForage();\n }\n for (const child of this.children.values()) {\n child.once(callback, event, false);\n }\n }\n}","import Node from './Node';\n\nlet local: Node;\n\n/**\n * Get a state that is only synced in memory and local storage.\n *\n * Useful for storing things like UI state, local indexes or logged in user.\n * @returns {Node}\n */\nexport default function() {\n if (!local) {\n local = new Node();\n }\n return local;\n}","import local from './local';\n\nlet blockedUsers: { [key: string]: boolean } = {};\n\nexport default function() {\n if (!blockedUsers) {\n blockedUsers = {};\n local().get('block').map((isBlocked: boolean, user: string) => {\n if (isBlocked === blockedUsers[user]) { return; }\n if (isBlocked) {\n blockedUsers[user] = isBlocked;\n local().get('groups').map((_v: any, k: string) => {\n local().get('groups').get(k).get(user).put(false);\n });\n } else {\n delete blockedUsers[user];\n }\n });\n }\n return blockedUsers;\n}","import local from \"./local\";\nimport userSpace from './public';\nimport blockedUsers from './blockedUsers';\n\nlet counter = 0;\nconst cache = new Map>();\nconst callbacks = new Map();\n\ntype Event = {\n off: () => void;\n}\n\n/**\n * Aggregates public data from all users in the group.\n *\n * For example, the public message feed, message replies and likes are aggregated using this.\n * @param groupName\n * @returns object\n */\nexport default function(groupName = 'everyone') {\n return {\n get(path: string, callback: any) {\n const groupNode = local().get('groups').get(groupName);\n const follows: { [key: string]: boolean; } = {};\n requestAnimationFrame(() => {\n groupNode.map((isFollowing: any, user: string) => {\n if (blockedUsers()[user]) { return; } // TODO: allow to specifically query blocked users?\n if (follows[user] && follows[user] === isFollowing) { return; }\n follows[user] = isFollowing;\n if (isFollowing) { // TODO: callback on unfollow, for unsubscribe\n let node = userSpace(user);\n if (path && path !== '/') {\n node = path.split('/').reduce((sum:any, s:string) => sum.get(decodeURIComponent(s)), node);\n }\n callback(node, user);\n }\n });\n });\n },\n\n _cached_map(cached: Map | undefined, cacheKey: string, path: string, myEvent: Event, callback: Function) {\n if (!cached) {\n const cached = new Map();\n cache.set(cacheKey, cached);\n this.get(path, (node: any, from: string) => node.map((value: any, key: string, x: any) => {\n const item = {value, key, from};\n cached.set(key, item);\n for (let cb of callbacks.get(cacheKey).values()) {\n cb(value, key, x, myEvent, from);\n }\n }));\n } else {\n for (let item of cached.values()) {\n callback(item.value, item.key, 0, myEvent, item.from);\n }\n }\n },\n\n // TODO: this should probably store just the most recent value, not everyone's value\n // TODO: for counting of likes etc, use this.count() instead\n _cached_on(cached: Map | undefined, cacheKey: string, path: string, myEvent: Event, callback: Function) {\n if (!cached) {\n const cached = new Map();\n cache.set(cacheKey, cached);\n this.get(path, (node: any, from: string) => node.on((value: any, key: string, x: any) => {\n const item = {value, key, from};\n cached.set(from, item);\n for (let cb of callbacks.get(cacheKey).values()) {\n cb(value, key, x, myEvent, from);\n }\n }));\n } else {\n for (let item of cached.values()) {\n callback(item.value, item.key, 0, myEvent, item.from);\n }\n }\n },\n\n _cached_count(cached: Map | undefined, cacheKey: string, path: string, myEvent: Event, callback: Function) {\n if (!cached) {\n const cached = new Map();\n cache.set(cacheKey, cached);\n this.get(path, (node: any, from: string) => node.on((value: any, key: string) => {\n value ? cached.set(from, true) : cached.delete(from);\n const count = cached.size;\n for (let cb of callbacks.get(cacheKey).values()) {\n cb(count, key, null, myEvent, from);\n }\n }));\n } else {\n callback(cached.size, path.split('/').pop(), null, myEvent);\n }\n },\n\n _cached_fn(fn: string, path: string, callback: Function) {\n const cacheKey = `${fn}:${groupName}:${path}`;\n\n let callbackId = counter++;\n if (callbacks.has(cacheKey)) {\n callbacks.get(cacheKey).set(callbackId, callback);\n } else {\n callbacks.set(cacheKey, new Map([[callbackId, callback]]));\n }\n\n const myEvent = {off: () => {\n let myCallbacks = callbacks.get(cacheKey);\n myCallbacks && myCallbacks.delete(callbackId);\n }};\n\n const cached = cache.get(cacheKey);\n\n switch (fn) {\n case 'map':\n this._cached_map(cached, cacheKey, path, myEvent, callback);\n break;\n case 'on':\n this._cached_on(cached, cacheKey, path, myEvent, callback);\n break;\n case 'count':\n this._cached_count(cached, cacheKey, path, myEvent, callback);\n break;\n }\n },\n\n map(path: string, callback: Function) { // group queries are slow, so we cache them\n this._cached_fn('map', path, callback);\n },\n\n on(path: string, callback: Function) {\n this._cached_fn('on', path, callback);\n },\n\n count(path: string, callback: Function) {\n this._cached_fn('count', path, callback);\n }\n }\n}","// @ts-nocheck\n\nimport _ from './lodash';\nimport Gun from 'gun';\n\nimport session from './session';\nimport util from './util';\nimport publicState from './global';\nimport privateState from './private';\nimport local from './local';\nimport group from './group';\n\nconst NOTIFICATION_SERVICE_URL = 'https://iris-notifications.herokuapp.com/notify';\n// const notificationSound = new Audio('../../assets/audio/notification.mp3'); // TODO\nlet loginTime;\nlet unseenMsgsTotal = 0;\nlet unseenNotificationCount = 0;\nconst webPushSubscriptions = {};\n\nfunction desktopNotificationsEnabled() {\n return window.Notification && Notification.permission === 'granted';\n}\n\nfunction notifyMsg(msg, info, channelId, onClick) {\n function shouldNotify() {\n if (msg.timeObj < loginTime) { return false; }\n if (info.selfAuthored) { return false; }\n if (document.visibilityState === 'visible') { return false; }\n const channel = privateState(channelId);\n if (channel.notificationSetting === 'nothing') { return false; }\n if (channel.notificationSetting === 'mentions' && !msg.text.includes(session.getMyName())) { return false; }\n return true;\n }\n function shouldDesktopNotify() {\n if (!desktopNotificationsEnabled()) { return false; }\n return shouldNotify();\n }\n function shouldAudioNotify() {\n return shouldNotify();\n }\n if (shouldAudioNotify()) {\n //notificationSound.play(); // TODO\n }\n if (shouldDesktopNotify()) {\n let body, title;\n const channel = privateState(channelId);\n if (channel.uuid) {\n title = channel.participantProfiles[info.from].name;\n body = `${name}: ${msg.text}`;\n } else {\n title = 'Message'\n body = msg.text;\n }\n body = util.truncateString(body, 50);\n let desktopNotification = new Notification(title, { // TODO: replace with actual name\n icon: '/assets/img/icon128.png',\n body,\n silent: true\n });\n desktopNotification.onclick = function() {\n changeUnseenNotificationCount(-1);\n onClick && onClick();\n window.focus();\n };\n }\n}\n\nfunction changeChatUnseenMsgsCount(chatId, change) {\n const chat = privateState(chatId);\n if (!chat) return;\n const chatNode = local().get('channels').get(chatId);\n if (change) {\n unseenMsgsTotal += change;\n chat.unseen += change;\n } else {\n unseenMsgsTotal = unseenMsgsTotal - (chat.unseen || 0);\n chat.unseen = 0;\n }\n chatNode.get('unseen').put(chat.unseen);\n unseenMsgsTotal = unseenMsgsTotal >= 0 ? unseenMsgsTotal : 0;\n local().get('unseenMsgsTotal').put(unseenMsgsTotal);\n}\n\nconst publicVapidKey = 'BMqSvZArOIdn7vGkYplSpkZ70-Qt8nhYbey26WVa3LF3SwzblSzm3n3HHycpNkAKVq7MCkrzFuTFs_en7Y_J2MI';\n\nfunction urlBase64ToUint8Array(base64String) {\n const padding = '='.repeat((4 - base64String.length % 4) % 4);\n const base64 = (base64String + padding)\n .replace(/-/g, '+')\n .replace(/_/g, '/');\n\n const rawData = window.atob(base64);\n const outputArray = new Uint8Array(rawData.length);\n\n for (let i = 0; i < rawData.length; ++i) {\n outputArray[i] = rawData.charCodeAt(i);\n }\n return outputArray;\n}\n\nasync function subscribe(reg) {\n try {\n const subscription = await reg.pushManager.subscribe({\n userVisibleOnly: true,\n applicationServerKey: urlBase64ToUint8Array(publicVapidKey)\n });\n addWebPushSubscription(subscription);\n } catch (e) {\n console.error('web push subscription error', e);\n }\n}\n\nasync function subscribeToWebPush() {\n console.log('subscribing to web push', navigator.serviceWorker);\n if (!desktopNotificationsEnabled() || !navigator.serviceWorker) { return false; }\n await navigator.serviceWorker.ready;\n const reg = await navigator.serviceWorker.getRegistration();\n reg.active.postMessage({key: session.getKey()});\n const sub = await reg.pushManager.getSubscription();\n sub ? addWebPushSubscription(sub) : subscribe(reg);\n}\n\nconst addWebPushSubscriptionsToChats = _.debounce(() => {\n const arr = Object.values(webPushSubscriptions);\n session.channelIds.forEach(channelId => {\n privateState(channelId).put('webPushSubscriptions', arr);\n });\n}, 5000);\n\nfunction removeSubscription(hash) {\n delete webPushSubscriptions[hash];\n publicState().user().get('webPushSubscriptions').get(hash).put(null);\n addWebPushSubscriptionsToChats();\n}\n\nasync function addWebPushSubscription(s, saveToGun = true) {\n const myKey = session.getKey();\n const mySecret = await Gun.SEA.secret(myKey.epub, myKey);\n const enc = await Gun.SEA.encrypt(s, mySecret);\n const hash = await util.getHash(JSON.stringify(s));\n if (saveToGun) {\n publicState().user().get('webPushSubscriptions').get(hash).put(enc);\n }\n webPushSubscriptions[hash] = s;\n addWebPushSubscriptionsToChats();\n}\n\nasync function getWebPushSubscriptions() {\n const myKey = session.getKey();\n const mySecret = await Gun.SEA.secret(myKey.epub, myKey);\n publicState().user().get('webPushSubscriptions').map().on(async enc => {\n if (!enc) { return; }\n const s = await Gun.SEA.decrypt(enc, mySecret);\n addWebPushSubscription(s, false);\n });\n}\n\nfunction getEpub(user) {\n return new Promise(resolve => {\n publicState().user(user).get('epub').on(async (epub,k,x,e) => {\n if (epub) {\n e.off();\n resolve(epub);\n }\n });\n });\n}\n\nasync function getNotificationText(notification) {\n const profile = await publicState().user(notification.from).get('profile').once();\n const name = (profile && profile.name) || 'someone';\n const event = notification.event || notification.action;\n let eventText;\n if (event === 'like') eventText = `${name} liked your post`;\n else if (event === 'reply') eventText = `${name} replied to your post`;\n else if (event === 'mention') eventText = `${name} mentioned you in their post`;\n else if (event === 'follow') eventText = `${name} started following you`;\n else eventText = `${name} sent you a notification: ${event}`;\n return eventText;\n}\n\nfunction subscribeToIrisNotifications(onClick?: Function) {\n let notificationsSeenTime: any;\n let notificationsShownTime: any;\n publicState().user().get('notificationsSeenTime').on(v => {\n notificationsSeenTime = v;\n console.log(v);\n });\n publicState().user().get('notificationsShownTime').on(v => notificationsShownTime = v);\n const setNotificationsShownTime = _.debounce(() => {\n publicState().user().get('notificationsShownTime').put(new Date().toISOString());\n }, 1000);\n const alreadyHave = new Set();\n group().on(`notifications/${session.getPubKey()}`, async (encryptedNotification, k, x, e, from) => {\n const id = from.slice(0,30) + encryptedNotification.slice(0,30);\n if (alreadyHave.has(id)) { return; }\n alreadyHave.add(id);\n const epub = await getEpub(from);\n const secret = await Gun.SEA.secret(epub, session.getKey());\n const notification = await Gun.SEA.decrypt(encryptedNotification, secret);\n if (!notification || typeof notification !== 'object') { return; }\n setNotificationsShownTime();\n notification.from = from;\n local().get('notifications').get(notification.time).put(notification);\n if (!notificationsSeenTime || (notificationsSeenTime < notification.time)) {\n changeUnseenNotificationCount(1);\n }\n if (!notificationsShownTime || notificationsShownTime < notification.time) {\n console.log('was new!');\n const text = await getNotificationText(notification);\n let desktopNotification = new Notification(text, {\n icon: '/assets/img/icon128.png',\n body: text,\n silent: true\n });\n desktopNotification.onclick = function() {\n const link = notification.target ? `/post/${notification.target}` : `/profile/${notification.from}`;\n onClick && onClick(link);\n changeUnseenNotificationCount(-1);\n window.focus();\n };\n }\n });\n}\n\nfunction changeUnseenNotificationCount(change) {\n if (!change) {\n unseenNotificationCount = 0;\n publicState().user().get('notificationsSeenTime').put(new Date().toISOString());\n } else {\n unseenNotificationCount += change;\n unseenNotificationCount = Math.max(unseenNotificationCount, 0);\n }\n local().get('unseenNotificationCount').put(unseenNotificationCount);\n}\n\nasync function sendIrisNotification(recipient, notification) {\n if (!(recipient && notification)) { return; } // TODO: use typescript or sth :D\n if (typeof notification === 'object') { notification.time = new Date().toISOString() }\n const epub = await getEpub(recipient);\n const secret = await Gun.SEA.secret(epub, session.getKey());\n const enc = await Gun.SEA.encrypt(notification, secret);\n publicState().user().get('notifications').get(recipient).put(enc);\n}\n\nasync function sendWebPushNotification(recipient, notification) {\n console.log('sending web push notification to', recipient, notification);\n const channel = privateState(recipient);\n const myKey = session.getKey();\n const shouldWebPush = (recipient === myKey.pub) || !(channel.activity && channel.activity.isActive);\n if (shouldWebPush && channel.webPushSubscriptions) {\n const subscriptions = [];\n const participants = Object.keys(channel.webPushSubscriptions);\n for (let i = 0; i < participants.length; i++) {\n const participant = participants[i];\n const secret = await channel.getSecret(participant);\n const payload = {\n title: await Gun.SEA.encrypt(notification.title, secret),\n body: await Gun.SEA.encrypt(notification.body, secret),\n from:{pub: myKey.pub, epub: myKey.epub}\n };\n channel.webPushSubscriptions[participant].forEach(s => {\n if (s && s.endpoint) {\n subscriptions.push({subscription: s, payload});\n }\n });\n }\n if (subscriptions.length === 0) {return;}\n fetch(NOTIFICATION_SERVICE_URL, {\n method: 'POST',\n body: JSON.stringify({subscriptions}),\n headers: {\n 'content-type': 'application/json'\n }\n }).catch(() => {});\n }\n}\n\nfunction init() {\n loginTime = new Date();\n unseenMsgsTotal = 0;\n}\n\nexport default {init, notifyMsg, getNotificationText, sendWebPushNotification, changeUnseenNotificationCount, subscribeToIrisNotifications, sendIrisNotification, changeChatUnseenCount: changeChatUnseenMsgsCount, webPushSubscriptions, subscribeToWebPush, getWebPushSubscriptions, removeSubscription};\n","// @ts-nocheck\nimport Gun from 'gun';\nimport notifications from './notifications';\nimport Channel from './Channel';\nimport util from './util';\nimport _ from './lodash';\nimport Fuse from \"fuse.js\";\nimport localforage from 'localforage';\nimport local from './local';\nimport electron from './electron';\nimport user from './public';\nimport privateState from './private';\nimport blockedUsers from './blockedUsers';\n\nlet key: any;\nlet myName: string;\nlet latestChatLink: string;\nlet onlineTimeout: any;\nlet ourActivity: any;\nlet noFollows: boolean;\nlet noFollowers: boolean;\nlet searchIndex: any;\nlet initCalled: boolean;\nconst searchableItems: any = {};\nconst getExtendedFollowsCalled = new Map();\n\nconst DEFAULT_FOLLOW = 'hyECQHwSo7fgr2MVfPyakvayPeixxsaAWVtZ-vbaiSc.TXIp8MnCtrnW6n2MrYquWPcc-DTmZzMBmc2yaGv9gIU';\n\nconst DEFAULT_SETTINGS = {\n electron: {\n openAtLogin: true,\n minimizeOnClose: true\n },\n local: {\n enableWebtorrent: !util.isMobile,\n enablePublicPeerDiscovery: true,\n autoplayWebtorrent: true,\n maxConnectedPeers: util.isElectron ? 2 : 1\n }\n}\n\n/**\n * User session management utilities.\n */\nexport default {\n /**\n * Log in with a key from localStorage.\n *\n * If no key is found and options.autologin is not false, a new user will be created.\n *\n * If options.autofollow is not false, the default follow will be added.\n * @param options\n */\n init(options: any = {}) {\n if (initCalled) { return; }\n initCalled = true;\n let localStorageKey = localStorage.getItem('chatKeyPair');\n if (localStorageKey) {\n this.login(JSON.parse(localStorageKey));\n } else if (options.autologin !== false) {\n this.loginAsNewUser(options);\n } else {\n this.clearIndexedDB();\n }\n setTimeout(() => {\n local().get('block').map(() => {\n this.updateSearchIndex();\n });\n this.updateSearchIndex();\n });\n setInterval(() => {\n if (this.taskQueue.length) {\n //console.log('this.taskQueue', this.taskQueue.length);\n const t = this.taskQueue.shift();\n t && t();\n }\n }, 10);\n },\n\n DEFAULT_SETTINGS,\n DEFAULT_FOLLOW,\n\n taskQueue: [] as any[],\n\n updateSearchIndex: _.throttle(() => {\n const options = {keys: ['name'], includeScore: true, includeMatches: true, threshold: 0.3};\n const values = Object.values(_.omit(searchableItems, Object.keys(blockedUsers())));\n searchIndex = new Fuse(values, options);\n local().get('searchIndexUpdated').put(true);\n }, 2000, {leading:true}),\n\n saveSearchResult: _.throttle(k => {\n local().get('contacts').get(k).put({followDistance: searchableItems[k].followDistance,followerCount: searchableItems[k].followers.size});\n }, 1000, {leading:true}),\n\n addFollow(callback: Function, k: string, followDistance: number, follower?: string) {\n if (searchableItems[k]) {\n if (searchableItems[k].followDistance > followDistance) {\n searchableItems[k].followDistance = followDistance;\n }\n follower && searchableItems[k].followers.add(follower);\n } else {\n searchableItems[k] = {key: k, followDistance, followers: new Set(follower && [follower])};\n this.taskQueue.push(() => {\n user(k).get('profile').get('name').on((name: string) => {\n searchableItems[k].name = name;\n local().get('contacts').get(k).get('name').put(name);\n callback && callback(k, searchableItems[k]);\n });\n });\n }\n this.saveSearchResult(k);\n callback && callback(k, searchableItems[k]);\n this.updateSearchIndex();\n this.updateNoFollows();\n this.updateNoFollowers();\n },\n\n removeFollow(k: string, followDistance: number, follower: string) {\n if (followDistance === 1) {\n local().get('contacts').get(k).put(false);\n local().get('groups').get('follows').get(k).put(false);\n if (searchableItems[k]) {\n searchableItems[k].followers.delete(follower);\n this.updateNoFollows();\n this.updateNoFollowers();\n }\n }\n console.log('removeFollow', k, followDistance, follower);\n if (searchableItems[k] && searchableItems[k].followers.size === 0) {\n delete searchableItems[k];\n local().get('contacts').get(k).put(false);\n local().get('groups').get('everyone').get(k).put(false);\n }\n },\n\n getExtendedFollows(callback: Function, k = key.pub, maxDepth = 3, currentDepth = 1) {\n const called = getExtendedFollowsCalled.get(k);\n if (called && called <= currentDepth) {\n return;\n }\n getExtendedFollowsCalled.set(k, currentDepth);\n\n this.addFollow(callback, k, currentDepth - 1);\n\n user(k).get('follow').map().on((isFollowing: boolean, followedKey: string) => { // TODO: unfollow\n if (isFollowing) {\n this.addFollow(callback, followedKey, currentDepth, k);\n if (currentDepth < maxDepth) {\n this.taskQueue.push(() => this.getExtendedFollows(callback, followedKey, maxDepth, currentDepth + 1));\n }\n } else {\n this.removeFollow(followedKey, currentDepth, k);\n }\n });\n\n return searchableItems;\n },\n\n updateNoFollows: _.throttle(() => {\n const v = Object.keys(searchableItems).length <= 1;\n if (v !== noFollows) {\n noFollows = v;\n local().get('noFollows').put(noFollows);\n }\n }, 1000, {leading:true}),\n\n updateNoFollowers: _.throttle(() => {\n const v = !(searchableItems[key.pub] && (searchableItems[key.pub].followers.size > 0));\n if (v !== noFollowers) {\n noFollowers = v;\n local().get('noFollowers').put(noFollowers);\n }\n }, 1000, {leading:true}),\n\n getSearchIndex() {\n return searchIndex;\n },\n\n setOurOnlineStatus() {\n const activeRoute = window.location.hash;\n Channel.setActivity(ourActivity = 'active');\n const setActive = _.debounce(() => {\n const chatId = activeRoute && activeRoute.replace('#/profile/','').replace('#/chat/','');\n const chat = privateState(chatId);\n if (chat && !ourActivity) {\n chat.setMyMsgsLastSeenTime();\n }\n Channel.setActivity(ourActivity = 'active');\n clearTimeout(onlineTimeout);\n onlineTimeout = setTimeout(() => Channel.setActivity(ourActivity = 'online'), 30000);\n }, 1000);\n document.addEventListener(\"touchmove\", setActive);\n document.addEventListener(\"mousemove\", setActive);\n document.addEventListener(\"keypress\", setActive);\n document.addEventListener(\"visibilitychange\", () => {\n if (document.visibilityState === 'visible') {\n Channel.setActivity(ourActivity = 'active');\n const chatId = location.pathname.slice(1).replace('chat/','');\n const chat = activeRoute && privateState(chatId);\n if (chat) {\n chat.setMyMsgsLastSeenTime();\n notifications.changeChatUnseenCount(chatId, 0);\n }\n } else {\n Channel.setActivity(ourActivity = 'online');\n }\n });\n setActive();\n window.addEventListener(\"beforeunload\", () => {\n Channel.setActivity(ourActivity = null);\n });\n },\n\n updateGroups() {\n this.getExtendedFollows((k: string, info: any) => {\n if (info.followDistance <= 1) {\n local().get('groups').get('follows').get(k).put(true);\n }\n local().get('groups').get('everyone').get(k).put(true);\n if (k === this.getPubKey()) {\n this.updateNoFollowers();\n }\n });\n },\n\n /**\n * Log in with a private key.\n * @param key\n */\n login(k: any) {\n const shouldRefresh = !!key;\n key = k;\n localStorage.setItem('chatKeyPair', JSON.stringify(k));\n user().auth(key);\n user().put({epub: key.epub});\n user().get('likes').put({a:null}); // gun bug?\n user().get('msgs').put({a:null}); // gun bug?\n user().get('replies').put({a:null}); // gun bug?\n notifications.subscribeToWebPush();\n notifications.getWebPushSubscriptions();\n notifications.subscribeToIrisNotifications();\n Channel.getMyChatLinks( undefined, (chatLink: any) => {\n local().get('chatLinks').get(chatLink.id).put(chatLink.url);\n latestChatLink = chatLink.url;\n });\n this.setOurOnlineStatus();\n Channel.getChannels( (c: Channel) => this.addChannel(c));\n user().get('profile').get('name').on((name: any) => {\n if (name && typeof name === 'string') {\n myName = name;\n }\n });\n notifications.init();\n local().get('loggedIn').put(true);\n local().get('settings').once().then(settings => {\n if (!settings) {\n local().get('settings').put(DEFAULT_SETTINGS.local);\n } else if (settings.enableWebtorrent === undefined || settings.autoplayWebtorrent === undefined) {\n local().get('settings').get('enableWebtorrent').put(DEFAULT_SETTINGS.local.enableWebtorrent);\n local().get('settings').get('autoplayWebtorrent').put(DEFAULT_SETTINGS.local.autoplayWebtorrent);\n }\n });\n user().get('block').map().on((isBlocked: boolean, user: string) => {\n local().get('block').get(user).put(isBlocked);\n if (isBlocked) {\n delete searchableItems[user];\n }\n });\n this.updateGroups();\n if (shouldRefresh) {\n location.reload();\n }\n if (electron) {\n electron.get('settings').on(electron => {\n local().get('settings').get('electron').put(electron);\n });\n electron.get('user').put(key.pub);\n }\n local().get('filters').get('group').once().then(v => {\n if (!v) {\n local().get('filters').get('group').put('follows');\n }\n });\n },\n\n /**\n * Create a new user account and log in.\n * @param options {Object} - Options for the new account.\n * @returns {Promise<*>}\n */\n loginAsNewUser(options: any = {}) {\n const name = options.name || util.generateName();\n console.log('loginAsNewUser name', name);\n return Gun.SEA.pair().then(k => {\n this.login(k);\n user().get('profile').put({a:null});\n user().get('profile').get('name').put(name);\n local().get('filters').put({a:null});\n local().get('filters').get('group').put('follows');\n Channel.createChatLink().then(l => latestChatLink = l);\n setTimeout(() => {\n if (options.autofollow !== false) {\n console.log('autofollowing', DEFAULT_FOLLOW);\n user().get('follow').get(DEFAULT_FOLLOW).put(true);\n }\n }, 1000); // maybe wait for login return instead\n });\n },\n\n /**\n * Log out the current user.\n * @returns {Promise}\n */\n async logOut() {\n if (electron) {\n electron.get('user').put(null);\n }\n // TODO: remove subscription from your channels\n if (navigator.serviceWorker) {\n const reg = await navigator.serviceWorker.getRegistration();\n if (reg && reg.pushManager) {\n reg.active?.postMessage({key: null});\n const sub = await reg.pushManager.getSubscription();\n if (sub) {\n const hash = await util.getHash(JSON.stringify(sub));\n notifications.removeSubscription(hash);\n sub.unsubscribe && sub.unsubscribe();\n }\n }\n }\n this.clearIndexedDB();\n localStorage.clear(); // TODO clear only iris data\n localforage.clear().then(() => {\n window.location.hash = '';\n window.location.href = '/';\n location.reload();\n });\n },\n\n clearIndexedDB() {\n return new Promise(resolve => {\n const r1 = window.indexedDB.deleteDatabase('local()');\n const r2 = window.indexedDB.deleteDatabase('radata');\n let r1done = false;\n let r2done = false;\n const check = () => {\n r1done && r2done && resolve(undefined);\n }\n r1.onerror = r2.onerror = e => console.error(e);\n //r1.onblocked = r2.onblocked = e => console.error('blocked', e);\n r1.onsuccess = () => {\n r1done = true;\n check();\n }\n r2.onsuccess = () => {\n r2done = true;\n check();\n }\n });\n },\n\n getMyChatLink() {\n return latestChatLink || util.getProfileLink(key.pub);\n },\n\n /**\n * Get the keypair of the logged in user.\n * @returns {*}\n */\n getKey() { return key; },\n\n /**\n * Get the public key of the logged in user.\n * @returns {*}\n */\n getPubKey() {\n return key && key.pub;\n },\n\n /**\n * Get the name of the logged in user.\n * @returns {*}\n */\n getMyName() { return myName; }, // TODO maybe remove and use iris.user().get('profile').get('name') instead?\n\n myPeerUrl: (ip: string) => `http://${ip}:8767/gun`,\n\n async shareMyPeerUrl(channel: Channel) {\n const myIp = await local().get('settings').get('electron').get('publicIp').once();\n myIp && channel.put && channel.put('my_peer', this.myPeerUrl(myIp));\n },\n\n newChannel(pub: string, chatLink?: string) {\n if (!pub || this.channelIds.has(pub)) {\n return;\n }\n const chat = privateState(pub, chatLink);\n this.addChannel(chat);\n return chat;\n },\n\n addChannel(chat: Channel) {\n this.taskQueue.push(() => {\n let pub = chat.getId();\n if (this.channelIds.has(pub)) { return; }\n this.channelIds.add(pub);\n const chatNode = local().get('channels').get(pub);\n chatNode.get('latestTime').on((t: string) => {\n if (t && (!chat.latestTime || t > chat.latestTime)) {\n chat.latestTime = t;\n } else {\n // chatNode.get('latestTime').put(chat.latestTime); // omg recursion\n }\n });\n chatNode.get('theirMsgsLastSeenTime').on((t: string) => {\n if (!t) { return; }\n const d = new Date(t);\n if (!chat.theirMsgsLastSeenDate || chat.theirMsgsLastSeenDate < d) {\n chat.theirMsgsLastSeenDate = d;\n }\n });\n chat.getLatestMsg && chat.getLatestMsg((latest: any, info: any) => {\n this.processMessage(pub, latest, info);\n });\n notifications.changeChatUnseenCount(pub, 0);\n chat.notificationSetting = 'all';\n chat.onMy('notificationSetting', (val: any) => {\n chat.notificationSetting = val;\n });\n //$(\".chat-list\").append(el);\n chat.theirMsgsLastSeenTime = '';\n chat.getTheirMsgsLastSeenTime((time: any) => {\n if (chat && time && time >= chat.theirMsgsLastSeenTime) {\n chat.theirMsgsLastSeenTime = time;\n chatNode.get('theirMsgsLastSeenTime').put(time);\n }\n });\n chat.getMyMsgsLastSeenTime((time: any) => {\n chat.myLastSeenTime = new Date(time);\n if (chat.latest && chat.myLastSeenTime >= chat.latest.time) {\n notifications.changeChatUnseenCount(pub, 0);\n }\n });\n chat.isTyping = false;\n chat.getTyping(isTyping => {\n chat.isTyping = isTyping;\n local().get('channels').get(pub).get('isTyping').put(isTyping);\n });\n chat.online = {};\n Channel.getActivity(pub, (activity) => {\n if (chat) {\n chatNode.put({theirLastActiveTime: activity && activity.lastActive, activity: activity && activity.isActive && activity.status});\n chat.activity = activity;\n }\n });\n if (chat.uuid) {\n let isDarkMode = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches;\n chat.participantProfiles = {};\n chat.on('name', v => {\n chat.name = v;\n searchableItems[chat.uuid] = {name: v, uuid: chat.uuid};\n local().get('channels').get(chat.uuid).get('name').put(v);\n });\n chat.on('photo', v => {\n searchableItems[chat.uuid] = searchableItems[chat.uuid] || {};\n searchableItems[chat.uuid].photo = v;\n local().get('channels').get(chat.uuid).get('photo').put(v)\n });\n chat.on('about', v => local().get('channels').get(chat.uuid).get('about').put(v));\n chat.getParticipants(participants => {\n delete participants.undefined; // TODO fix where it comes from\n if (typeof participants === 'object') {\n let keys = Object.keys(participants);\n keys.forEach((k, i) => {\n let hue = 360 / Math.max(keys.length, 2) * i; // TODO use css filter brightness\n chat.participantProfiles[k] = {permissions: participants[k], color: `hsl(${hue}, 98%, ${isDarkMode ? 80 : 33}%)`};\n user(k).get('profile').get('name').on(name => {\n chat.participantProfiles[k].name = name;\n });\n });\n }\n local().get('channels').get(chat.uuid).get('participants').put(participants);\n });\n chat.inviteLinks = {};\n chat.getChatLinks({callback: ({url, id}) => {\n console.log('got chat link', id, url);\n chat.inviteLinks[id] = url; // TODO use State\n local().get('inviteLinksChanged').put(true);\n }});\n } else {\n // TODO do we want this?\n user(pub).get('profile').get('name').on(v => local().get('channels').get(pub).get('name').put(v))\n }\n if (chat.put) {\n chat.onTheir('webPushSubscriptions', (s, k, from) => {\n if (!Array.isArray(s)) { return; }\n chat.webPushSubscriptions = chat.webPushSubscriptions || {};\n chat.webPushSubscriptions[from || pub] = s;\n });\n const arr = Object.values(notifications.webPushSubscriptions);\n setTimeout(() => chat.put('webPushSubscriptions', arr), 5000);\n this.shareMyPeerUrl(chat);\n }\n chat.onTheir('call', call => {\n local().get('call').put({pub, call});\n });\n local().get('channels').get(pub).put({enabled:true});\n /* Disable private peer discovery, since they're not connecting anyway\n if (chat.onTheir) {\n chat.onTheir('my_peer', (url, k, from) => {\n console.log('Got private peer url', url, 'from', from);\n peers.addPeer({url, from})\n });\n }\n */\n\n });\n },\n\n // TODO: should perhaps be in Channel\n processMessage(chatId: string, msg: any, info: any, onClickNotification?: Function) {\n const chat = privateState(chatId);\n chat.messageIds = chat.messageIds || {};\n if (chat.messageIds[msg.time + info.from]) return;\n chat.messageIds[msg.time + info.from] = true;\n if (info) {\n msg = Object.assign(msg, info);\n }\n if (msg.invite) {\n const chatLink = `https://iris.to/?channelId=${msg.invite.group}&inviter=${chatId}`;\n this.newChannel(msg.invite.group, chatLink);\n return;\n }\n msg.selfAuthored = info.selfAuthored;\n local().get('channels').get(chatId).get('msgs').get(msg.time + (msg.from && msg.from.slice(0, 10))).put(JSON.stringify(msg));\n msg.timeObj = new Date(msg.time);\n if (!info.selfAuthored && msg.timeObj > chat.myLastSeenTime) {\n if (window.location.hash !== `#/chat/${ chatId}` || document.visibilityState !== 'visible') {\n notifications.changeChatUnseenCount(chatId, 1);\n } else if (ourActivity === 'active') {\n chat.setMyMsgsLastSeenTime();\n }\n }\n if (!info.selfAuthored && msg.time > chat.theirMsgsLastSeenTime) {\n local().get('channels').get(chatId).get('theirMsgsLastSeenTime').put(msg.time);\n }\n if (!chat.latestTime || (msg.time > chat.latestTime)) {\n local().get('channels').get(chatId).put({\n latestTime: msg.time,\n latest: {time: msg.time, text: msg.text, selfAuthored: info.selfAuthored}\n });\n }\n // TODO: onclickNotification should do route(`/chat/${ pub}`);\n notifications.notifyMsg(msg, info, chatId, onClickNotification);\n },\n\n subscribeToMsgs(pub) {\n const c = privateState(pub);\n if (c.subscribed) { return; }\n c.subscribed = true;\n c.getMessages((msg, info) => {\n this.processMessage(pub, msg, info);\n });\n },\n\n /**\n * Known private channels with other users\n */\n channelIds: new Set(),\n};\n","/*eslint no-useless-escape: \"off\", camelcase: \"off\" */\n\nimport util from './util';\nimport Gun from 'gun'; // eslint-disable-line no-unused-vars\nimport 'gun/sea';\n// eslint-disable-line no-unused-vars\n\nlet myKey: any;\n\nclass Key {\n static async getActiveKey(datadir = `.`, keyfile = `iris.key`, fs?: any) {\n if (myKey) {\n return myKey;\n }\n if (fs) {\n const privKeyFile = `${datadir}/${keyfile}`;\n if (fs.existsSync(privKeyFile)) {\n const f = fs.readFileSync(privKeyFile, `utf8`);\n myKey = Key.fromString(f);\n } else {\n const newKey = await Key.generate();\n myKey = myKey || newKey; // eslint-disable-line require-atomic-updates\n fs.writeFileSync(privKeyFile, Key.toString(myKey));\n fs.chmodSync(privKeyFile, 400);\n }\n if (!myKey) {\n throw new Error(`loading default key failed - check ${datadir}/${keyfile}`);\n }\n } else {\n const str = window.localStorage.getItem(`iris.myKey`);\n if (str) {\n myKey = Key.fromString(str);\n } else {\n const newKey = await Key.generate();\n myKey = myKey || newKey; // eslint-disable-line require-atomic-updates\n window.localStorage.setItem(`iris.myKey`, Key.toString(myKey));\n }\n if (!myKey) {\n throw new Error(`loading default key failed - check localStorage iris.myKey`);\n }\n }\n return myKey;\n }\n\n static getDefault(datadir = `.`, keyfile = `iris.key`) {\n return Key.getActiveKey(datadir, keyfile);\n }\n\n static async getActivePub(datadir = `.`, keyfile = `iris.key`) {\n const key = await Key.getActiveKey(datadir, keyfile);\n return key.pub;\n }\n\n static setActiveKey(key: any, save = true, datadir = `.`, keyfile = `iris.key`, fs: any) {\n myKey = key;\n if (!save) return;\n if (util.isNode) {\n const privKeyFile = `${datadir}/${keyfile}`;\n fs.writeFileSync(privKeyFile, Key.toString(myKey));\n fs.chmodSync(privKeyFile, 400);\n } else {\n window.localStorage.setItem(`iris.myKey`, Key.toString(myKey));\n }\n }\n\n static toString(key: any) {\n return JSON.stringify(key);\n }\n\n static getId(key: any) {\n if (!(key && key.pub)) {\n throw new Error(`missing param`);\n }\n return key.pub; // hack until GUN supports lookups by keyID\n //return util.getHash(key.pub);\n }\n\n static fromString(str: string) {\n return JSON.parse(str);\n }\n\n static generate() {\n return Gun.SEA.pair();\n }\n\n static async sign(msg: any, pair: any) {\n const sig = await Gun.SEA.sign(msg, pair);\n return `a${sig}`;\n }\n\n static verify(msg: any, pubKey: any) {\n return Gun.SEA.verify(msg.slice(1), pubKey);\n }\n}\n\nexport default Key;\n","import util from \"./util\";\nimport Gun from \"gun\";\n\nconst electron = util.isElectron ? new Gun({peers: ['http://localhost:8768/gun'], file: 'State.electron', multicast:false, localStorage: false}).get('state') : null;\n\nexport default electron;","import publicSpace from './global';\nimport util from './util';\n\n/**\n * Content-addressed storage\n */\nexport default {\n /**\n * Get a file identified by its hash\n * @param hash\n * @param callback\n * @returns {Promise}\n */\n get(hash: string, callback: Function) {\n return new Promise((resolve, reject) => {\n if (!hash) {\n reject('No hash provided');\n }\n if (typeof hash !== 'string') {\n reject('Hash must be a string');\n }\n publicSpace().get('#').get(hash).on((v: any, _k: string, _x: any, e: any) => {\n if (v) {\n e.off();\n callback && callback(v);\n resolve(v);\n }\n });\n });\n },\n\n /**\n * Store a file and return its hash\n * @param value\n * @returns {Promise}\n */\n async put(value: any) {\n const hash = await util.getHash(value);\n publicSpace().get('#').get(hash).put(value);\n return hash;\n }\n}","// @ts-nocheck\n\n/*jshint unused: false */\n`use strict`;\nimport util from './util';\nimport Attribute from './Attribute';\nimport Key from './Key';\n\nconst errorMsg = `Invalid message:`;\n\nclass ValidationError extends Error {}\n\n/**\n* Signed message object. Your friends can index and relay your messages, while others can still verify that they were signed by you.\n*\n* Fields: signedData, signer (public key) and signature.\n*\n* signedData has an author, signer, type, time and optionally other fields.\n*\n* signature covers the utf8 string representation of signedData. Since messages are digitally signed, users only need to care about the message signer and not who relayed it or whose index it was found from.\n*\n* signer is the entity that verified its origin. In other words: message author and signer can be different entities, and only the signer needs to use Iris.\n*\n* For example, a crawler can import and sign other people's messages from Twitter. Only the users who trust the crawler will see the messages.\n*\n* Constructor: creates a message from the param obj.signedData that must contain at least the mandatory fields: author, type and time.\n* @param obj\n*\n* @example\n* https://github.com/irislib/iris-lib/blob/master/__tests__/SignedMessage.js\n*\n* Verification message:\n* {\n* signedData: {\n* author: {name:'Alice', key:'ABCD1234'},\n* recipient: {\n* name: 'Bob',\n* email: ['bob@example.com', 'bob.saget@example.com'],\n* bitcoin: '1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa'\n* },\n* type: 'verification'\n* },\n* signer: 'ABCD1234',\n* signature: '1234ABCD'\n* }\n*/\nclass SignedMessage {\n signedData: any;\n pubKey: any;\n sig: any;\n\n constructor(obj: any) {\n this.signedData = obj.signedData;\n this.pubKey = obj.pubKey;\n if (obj.sig) {\n if (typeof obj.sig !== `string`) {\n throw new ValidationError(`SignedMessage signature must be a string`);\n }\n this.sig = obj.sig;\n this.getHash();\n }\n this._validate();\n }\n\n static _getArray(authorOrRecipient) {\n const arr = [];\n const keys = Object.keys(authorOrRecipient);\n for (let i = 0;i < keys.length;i++) {\n const type = keys[i];\n const value = authorOrRecipient[keys[i]];\n if (typeof value === `string`) {\n arr.push(new Attribute(type, value));\n } else { // array\n for (let j = 0;j < value.length;j++) {\n const elementValue = value[j];\n arr.push(new Attribute(type, elementValue));\n }\n }\n }\n return arr;\n }\n\n static _getIterable(authorOrRecipient) {\n return {\n *[Symbol.iterator]() {\n const keys = Object.keys(authorOrRecipient);\n for (let i = 0;i < keys.length;i++) {\n const type = keys[i];\n const value = authorOrRecipient[keys[i]];\n if (typeof value === `string`) {\n yield new Attribute(type, value);\n } else { // array\n for (let j = 0;j < value.length;j++) {\n const elementValue = value[j];\n yield new Attribute(type, elementValue);\n }\n }\n }\n }\n };\n }\n\n getAuthorIterable() {\n return SignedMessage._getIterable(this.signedData.author);\n }\n\n getRecipientIterable() {\n return SignedMessage._getIterable(this.signedData.recipient);\n }\n\n getAuthorArray() {\n return SignedMessage._getArray(this.signedData.author);\n }\n\n getRecipientArray() {\n return this.signedData.recipient ? SignedMessage._getArray(this.signedData.recipient) : [];\n }\n\n getSignerKeyID() {\n return this.pubKey; // hack until gun supports keyID lookups\n //return util.getHash(this.pubKey);\n }\n\n _validate() {\n if (!this.signedData) {throw new ValidationError(`${errorMsg} Missing signedData`);}\n if (typeof this.signedData !== `object`) {throw new ValidationError(`${errorMsg} signedData must be an object`);}\n const d = this.signedData;\n\n if (!d.type) {throw new ValidationError(`${errorMsg} Missing type definition`);}\n if (!d.author) {throw new ValidationError(`${errorMsg} Missing author`);}\n if (typeof d.author !== `object`) {throw new ValidationError(`${errorMsg} Author must be object`);}\n if (Array.isArray(d.author)) {throw new ValidationError(`${errorMsg} Author must not be an array`);}\n if (Object.keys(d.author).length === 0) {throw new ValidationError(`${errorMsg} Author empty`);}\n if (this.pubKey) {\n this.signerKeyHash = this.getSignerKeyID();\n }\n for (const attr in d.author) {\n const t = typeof d.author[attr];\n if (t !== `string`) {\n if (Array.isArray(d.author[attr])) {\n for (let i = 0;i < d.author[attr].length;i++) {\n if (typeof d.author[attr][i] !== `string`) {throw new ValidationError(`${errorMsg} Author attribute must be string, got ${attr}: [${d.author[attr][i]}]`);}\n if (d.author[attr][i].length === 0) {\n throw new ValidationError(`${errorMsg} author ${attr} in array[${i}] is empty`);\n }\n }\n } else {\n throw new ValidationError(`${errorMsg} Author attribute must be string or array, got ${attr}: ${d.author[attr]}`);\n }\n }\n if (attr === `keyID`) {\n if (t !== `string`) {throw new ValidationError(`${errorMsg} Author keyID must be string, got ${t}`);}\n if (this.signerKeyHash && d.author[attr] !== this.signerKeyHash) {throw new ValidationError(`${errorMsg} If message has a keyID author, it must be signed by the same key`);}\n }\n }\n if (d.recipient) {\n if (typeof d.recipient !== `object`) {throw new ValidationError(`${errorMsg} Recipient must be object`);}\n if (Array.isArray(d.recipient)) {throw new ValidationError(`${errorMsg} Recipient must not be an array`);}\n if (Object.keys(d.recipient).length === 0) {throw new ValidationError(`${errorMsg} Recipient empty`);}\n for (const attr in d.recipient) {\n const t = typeof d.recipient[attr];\n if (t !== `string`) {\n if (Array.isArray(d.recipient[attr])) {\n for (let i = 0;i < d.recipient[attr].length;i++) {\n if (typeof d.recipient[attr][i] !== `string`) {throw new ValidationError(`${errorMsg} Recipient attribute must be string, got ${attr}: [${d.recipient[attr][i]}]`);}\n if (d.recipient[attr][i].length === 0) {\n throw new ValidationError(`${errorMsg} recipient ${attr} in array[${i}] is empty`);\n }\n }\n } else {\n throw new ValidationError(`${errorMsg} Recipient attribute must be string or array, got ${attr}: ${d.recipient[attr]}`);\n }\n }\n }\n }\n if (!(d.time || d.timestamp)) {throw new ValidationError(`${errorMsg} Missing time field`);}\n\n if (!Date.parse(d.time || d.timestamp)) {throw new ValidationError(`${errorMsg} Invalid time field`);}\n\n if (d.type === `rating`) {\n if (isNaN(d.rating)) {throw new ValidationError(`${errorMsg} Invalid rating`);}\n if (isNaN(d.maxRating)) {throw new ValidationError(`${errorMsg} Invalid maxRating`);}\n if (isNaN(d.minRating)) {throw new ValidationError(`${errorMsg} Invalid minRating`);}\n if (d.rating > d.maxRating) {throw new ValidationError(`${errorMsg} Rating is above maxRating`);}\n if (d.rating < d.minRating) {throw new ValidationError(`${errorMsg} Rating is below minRating`);}\n if (typeof d.context !== `string` || !d.context.length) {throw new ValidationError(`${errorMsg} Rating messages must have a context field`);}\n }\n\n if (d.type === `verification` || d.type === `unverification`) {\n if (d.recipient.length < 2) {throw new ValidationError(`${errorMsg} At least 2 recipient attributes are needed for a connection / disconnection. Got: ${d.recipient}`);}\n }\n\n return true;\n }\n\n isPositive() {\n return this.signedData.type === `rating` && this.signedData.rating > (this.signedData.maxRating + this.signedData.minRating) / 2;\n }\n\n isNegative() {\n return this.signedData.type === `rating` && this.signedData.rating < (this.signedData.maxRating + this.signedData.minRating) / 2;\n }\n\n isNeutral() {\n return this.signedData.type === `rating` && this.signedData.rating === (this.signedData.maxRating + this.signedData.minRating) / 2;\n }\n\n /**\n * @param {Object} key Gun.SEA keypair to sign the message with\n */\n async sign(key) {\n this.sig = await Key.sign(this.signedData, key);\n this.pubKey = key.pub;\n await this.getHash();\n return true;\n }\n\n /**\n * Create an iris message. SignedMessage time is automatically set. If signingKey is specified and author omitted, signingKey will be used as author.\n * @param {Object} signedData message data object including author, recipient and other possible attributes\n * @param {Object} signingKey optionally, you can set the key to sign the message with\n * @returns {Promise} message\n */\n static async create(signedData, signingKey) {\n if (!signedData.author && signingKey) {\n signedData.author = {keyID: Key.getId(signingKey)};\n }\n signedData.time = signedData.time || (new Date()).toISOString();\n const m = new SignedMessage({signedData});\n if (signingKey) {\n await m.sign(signingKey);\n }\n return m;\n }\n\n static createVerification(signedData, signingKey) {\n signedData.type = `verification`;\n return SignedMessage.create(signedData, signingKey);\n }\n\n static createRating(signedData, signingKey) {\n signedData.type = `rating`;\n signedData.context = signedData.context || `iris`;\n signedData.maxRating = signedData.maxRating || 10;\n signedData.minRating = signedData.minRating || -10;\n return SignedMessage.create(signedData, signingKey);\n }\n\n getAuthor(index) {\n for (const a of this.getAuthorIterable()) {\n if (a.isUniqueType()) {\n return index.getContacts(a);\n }\n }\n }\n\n getRecipient(index) {\n if (!this.signedData.recipient) {\n return undefined;\n }\n for (const a of this.getRecipientIterable()) {\n if (a.isUniqueType()) {\n return index.getContacts(a);\n }\n }\n }\n\n /**\n * @returns {string} base64 sha256 hash of message\n */\n async getHash() {\n if (this.sig && !this.hash) {\n this.hash = await util.getHash(this.sig);\n }\n return this.hash;\n }\n\n getId() {\n return this.getHash();\n }\n\n static async fromSig(obj) {\n if (!obj.sig) {\n throw new Error(`Missing signature in object:`, obj);\n }\n if (!obj.pubKey) {\n throw new Error(`Missing pubKey in object:`);\n }\n //const signedData = await Key.verify(obj.sig, obj.pubKey); // disable sig verification while migrating to new gun :(\n const signedData = JSON.parse(obj.sig.slice(4)).m;\n const o = {signedData, sig: obj.sig, pubKey: obj.pubKey};\n return new SignedMessage(o);\n }\n\n /**\n * @return {boolean} true if message signature is valid. Otherwise throws ValidationError.\n */\n async verify() {\n if (!this.pubKey) {\n throw new ValidationError(`${errorMsg} SignedMessage has no .pubKey`);\n }\n if (!this.sig) {\n throw new ValidationError(`${errorMsg} SignedMessage has no .sig`);\n }\n this.signedData = await Key.verify(this.sig, this.pubKey);\n if (!this.signedData) {\n throw new ValidationError(`${errorMsg} Invalid signature`);\n }\n if (this.hash) {\n if (this.hash !== (await util.getHash(this.sig))) {\n throw new ValidationError(`${errorMsg} Invalid message hash`);\n }\n } else {\n this.getHash();\n }\n return true;\n }\n\n /**\n * @returns {string}\n */\n serialize() {\n return {sig: this.sig, pubKey: this.pubKey};\n }\n\n toString() {\n return JSON.stringify(this.serialize());\n }\n\n /**\n * @returns {Promise}\n */\n static async deserialize(s) {\n return SignedMessage.fromSig(s);\n }\n\n static async fromString(s) {\n return SignedMessage.fromSig(JSON.parse(s));\n }\n\n static async setReaction(gun, msg, reaction) {\n const hash = await msg.getHash();\n gun.get(`reactions`).get(hash).put(reaction);\n gun.get(`reactions`).get(hash).put(reaction);\n gun.get(`messagesByHash`).get(hash).get(`reactions`).get(this.rootContact.value).put(reaction);\n gun.get(`messagesByHash`).get(hash).get(`reactions`).get(this.rootContact.value).put(reaction);\n }\n}\n\nexport default SignedMessage;\n","/*eslint no-useless-escape: \"off\", camelcase: \"off\" */\n\nimport Gun from 'gun';\nimport 'gun/sea';\n\nimport session from './session';\nimport peers from './peers';\nimport util from './util';\nimport local from './local';\nimport global from './global';\nimport publicState from './public';\nimport group from './group';\nimport electron from './electron';\nimport privateState from './private';\nimport staticState from './static';\nimport notifications from './notifications';\n\nimport SignedMessage from './SignedMessage';\nimport Channel from './Channel';\nimport Node from './Node';\n\nexport default {\n local,\n global,\n\n group,\n public: publicState,\n private: privateState,\n static: staticState,\n electron,\n peers,\n session,\n util,\n notifications,\n\n SEA: Gun.SEA,\n Gun,\n SignedMessage,\n Channel,\n Node,\n};"],"names":["func","limit","inThrottle","args","arguments","context","this","apply","setTimeout","inDebounce","clearTimeout","arr","Math","floor","random","length","obj","keys","newObj","Object","forEach","key","includes","isNode","prototype","toString","call","global","process","e","userAgent","navigator","toLowerCase","isElectron","indexOf","animals","adjectives","gunOnceDefined","node","Promise","resolve","on","val","_k","_a","eve","undefined","off","gunAsAnotherUser","gun","f","gun2","Gun","radisk","peers","_","opt","user","auth","values","back","peer","getHash","str","format","_context","SEA","work","name","hash","Error","_this","base64ToHex","capitalize","s","charAt","toUpperCase","slice","generateName","raw","atob","result","i","hex","charCodeAt","getCaret","el","selectionStart","document","selection","focus","r","createRange","re","createTextRange","rc","duplicate","moveToBookmark","getBookmark","setEndPoint","text","injectCss","getElementById","sheet","createElement","id","innerHTML","head","prepend","getUrlParameter","sParam","sParams","sParameterName","sURLVariables","window","location","search","substring","split","decodeURIComponent","formatTime","date","t","toLocaleTimeString","timeStyle","formatDate","toLocaleString","dateStyle","getDaySeparatorText","dateStr","now","nowStr","Date","toLocaleDateString","dayDifference","round","weekday","getProfileLink","pub","origin","encodeURIComponent","truncateString","type","cls","parent","setAttribute","appendChild","isMobile","a","check","vendor","test","substr","throttle","debounce","delay","sample","sampleSize","size","temp","index","shuffled","min","defer","once","called","omit","ELECTRON_GUN_URL","DEFAULT_PEERS","https://gun-rs.iris.to/gun","https://gun-us.herokuapp.com/gun","loc","host","is_localhost_but_not_dev","startsWith","hostname","endsWith","url","enabled","urlRegex","known","add","from","k","visibility","secret","session","getKey","epub","encrypt","encryptedUrl","encryptedUrlHash","publicState","get","put","lastSeen","toISOString","connect","save","remove","disconnect","peerFromGun","localStorage","setItem","JSON","stringify","getSaved","p","getItem","parse","util","defaults","reset","isMixedContent","disable","protocol","predicate","connectToLocalElectron","max","maxConnectedPeers","_this2","push","checkGunPeerCount","peersFromGun","connectedPeers","filter","wire","constructor","console","log","readyState","bufferedAmount","unconnectedPeers","addedToGun","map","_this3","String","init","setInterval","_this4","opts","myOpts","assign","retry","Infinity","currentUser","UNIQUE_ID_VALIDATORS","email","bitcoin","bitcoin_address","ip","ipv6","gpg_fingerprint","gpg_keyid","google_oauth2","tel","phone","keyID","account","uuid","Attribute","b","value","guessTypeOf","getUuid","replace","getUniqueIdValidators","isUniqueType","_proto","match","equals","uri","DEFAULT_PERMISSIONS","read","write","admin","Channel","options","myGroupSecret","chatLink","useChatLink","participants","addParticipant","Array","isArray","o","founder","getChatLinks","subscribe","putDirect","getMyGroupSecret","getMySecretUuid","then","onTheirDirect","theirSecretUuids","theirGroupSecrets","onTheir","hasAdmin","inviter","participantsChanged","saved","chatWith","channelId","sharedSecret","linkId","encrypted","decrypt","sharedKey","encryptedChatRequest","channelRequestId","getTheirSecretUuid","getTheirGroupSecret","changeMyGroupSecret","mute","participant","block","secrets","ourSecretChannelIds","theirSecretChannelIds","mySecretUuid","_context4","mySecret","mySecretHash","getCurrentParticipants","getParticipants","callback","getParticipantsCallbackId","getParticipantsCallbacks","getId","getSecret","_context5","getOurSecretChannelId","pair","_context6","getTheirSecretChannelId","_context7","getChannels","listenToChatLinks","keypair","_context9","getMyChatLinks","seen","handleChannel","ourSecretChannelId","_context8","encryptedChatId","chatId","_context10","_context11","getMessages","_context12","_this5","theirSecretChannelId","data","messageReceived","userState","_context13","selfAuthored","messages","_context14","decrypted","info","getLatestMsg","callbackIfLatest","msg","_this6","latest","time","onMy","setMyMsgsLastSeenTime","getMyMsgsLastSeenTime","_this7","myMsgsLastSeenTime","getTheirMsgsLastSeenTime","_this8","theirMsgsLastSeenTime","removeParticipant","permissions","_context21","_this9","directSubscriptions","_onTheirDirectFromUser","groupSubscriptions","_onTheirGroupFromUser","event","send","_context22","trim","_context23","putGroup","_context25","_context26","onGroup","onDirect","onMyGroup","onTheirGroup","onMyDirect","_context33","_loop","_context32","_this10","_context31","v","_context35","_context34","hasWritePermission","_context38","_this11","_context37","_context40","hasOwnProperty","_context39","_this12","subscription","_context42","theirSecretUuid","_b","_this13","_context41","_context44","_context43","_this14","setTyping","isTyping","timeout","setTypingTimeout","_this15","getTyping","typing","_this16","getTypingTimeouts","addChatButton","label","channelOptions","channel","box","btn","body","addEventListener","getChatBox","getSimpleLink","urlRoot","_opts","_context46","chatLinks","chatLinkSubscriptions","links","link","channels","formatChatLink","_this17","encPub","requestId","_context45","createChatLink","_context47","sharedKeyString","encryptedSharedKey","ownerSecret","ownerEncryptedSharedKey","minimized","chatBox","header","minimize","innerText","stopPropagation","headerText","onlineIndicator","nameEl","close","openChatBtn","typingIndicator","inputWrapper","textArea","sendBtn","_this18","getActivity","status","isActive","querySelectorAll","getAttribute","lastActive","c","indicator","msgEl","parentElement","msgClass","msgContent","children","insertBefore","firstChild","insertAdjacentElement","scrollTop","scrollHeight","setActivity","keyCode","preventDefault","content","caret","shiftKey","activity","irisActivityStatus","setActivityTimeout","update","state","timerUpdate","pubKey","activityDate","getTime","isOnline","enc","_context48","_context51","_context50","_context49","removeGroupChatLink","removePrivateChatLink","deleteChannel","_context52","deleteGroup","_context53","Map","publicKey","set","notInLocalForage","Set","localForage","config","driver","LOCALSTORAGE","INDEXEDDB","WEBSQL","local","Node","loaded","loadLocalForage","removeItem","has","_context3","newResult","all","_context2","on_subscriptions","_loop3","map_subscriptions","_loop2","existing","new_node","saveLocalForage","doCallbacks","returnIfUndefined","lastIndexOf","counter","blockedUsers","isBlocked","_v","cache","callbacks","groupName","path","groupNode","follows","requestAnimationFrame","isFollowing","userSpace","reduce","sum","_cached_map","cached","cacheKey","myEvent","item","x","cb","_cached_on","_cached_count","pop","count","_cached_fn","fn","callbackId","myCallbacks","loginTime","unseenMsgsTotal","unseenNotificationCount","webPushSubscriptions","desktopNotificationsEnabled","Notification","permission","publicVapidKey","urlBase64ToUint8Array","base64String","base64","repeat","rawData","outputArray","Uint8Array","_subscribe","reg","pushManager","userVisibleOnly","applicationServerKey","addWebPushSubscription","error","_subscribeToWebPush","serviceWorker","ready","getRegistration","active","postMessage","getSubscription","sub","addWebPushSubscriptionsToChats","channelIds","privateState","_addWebPushSubscription","saveToGun","myKey","_getWebPushSubscriptions","getEpub","getNotificationText","_getNotificationText","notification","profile","action","changeUnseenNotificationCount","change","_sendIrisNotification","recipient","_sendWebPushNotification","subscriptions","title","payload","endpoint","fetch","method","headers","content-type","_ret","myName","latestChatLink","onlineTimeout","ourActivity","noFollows","noFollowers","searchIndex","initCalled","notifyMsg","onClick","shouldNotify","timeObj","visibilityState","notificationSetting","getMyName","participantProfiles","icon","silent","onclick","sendWebPushNotification","subscribeToIrisNotifications","notificationsSeenTime","notificationsShownTime","setNotificationsShownTime","alreadyHave","group","getPubKey","encryptedNotification","target","sendIrisNotification","changeChatUnseenCount","chat","chatNode","unseen","subscribeToWebPush","getWebPushSubscriptions","removeSubscription","electron","file","multicast","searchableItems","getExtendedFollowsCalled","DEFAULT_FOLLOW","DEFAULT_SETTINGS","openAtLogin","minimizeOnClose","enableWebtorrent","enablePublicPeerDiscovery","autoplayWebtorrent","localStorageKey","login","autologin","loginAsNewUser","clearIndexedDB","updateSearchIndex","taskQueue","shift","Fuse","includeScore","includeMatches","threshold","saveSearchResult","followDistance","followerCount","followers","addFollow","follower","updateNoFollows","updateNoFollowers","removeFollow","getExtendedFollows","maxDepth","currentDepth","followedKey","getSearchIndex","setOurOnlineStatus","activeRoute","setActive","pathname","notifications","updateGroups","shouldRefresh","addChannel","settings","reload","l","autofollow","logOut","_reg$active","unsubscribe","clear","localforage","href","r1","indexedDB","deleteDatabase","r2","r1done","r2done","onerror","onsuccess","getMyChatLink","myPeerUrl","shareMyPeerUrl","myIp","newChannel","latestTime","d","theirMsgsLastSeenDate","processMessage","myLastSeenTime","online","theirLastActiveTime","isDarkMode","matchMedia","matches","photo","hue","color","inviteLinks","onClickNotification","messageIds","invite","subscribeToMsgs","subscribed","reject","publicSpace","_x","Key","getActiveKey","datadir","keyfile","fs","existsSync","privKeyFile","readFileSync","fromString","generate","newKey","writeFileSync","chmodSync","getDefault","getActivePub","setActiveKey","sign","verify","errorMsg","ValidationError","SignedMessage","signedData","sig","_validate","_getArray","authorOrRecipient","j","_getIterable","Symbol","iterator","elementValue","getAuthorIterable","author","getRecipientIterable","getAuthorArray","getRecipientArray","getSignerKeyID","attr","signerKeyHash","timestamp","isNaN","rating","maxRating","minRating","isPositive","isNegative","isNeutral","create","signingKey","m","createVerification","createRating","getAuthor","getContacts","getRecipient","fromSig","serialize","deserialize","setReaction","reaction","rootContact","public","private","static","staticState"],"mappings":"y8RACA,MACY,SAACA,EAAgBC,GACzB,IAAIC,EACJ,OAAO,WACL,IAAMC,EAAOC,UACPC,EAAUC,KACXJ,IACHF,EAAKO,MAAMF,EAASF,GACpBD,GAAa,EACbM,YAAW,WAAA,OAAMN,GAAa,IAAOD,QAIjC,SAACD,EAAgBC,GACzB,IAAIQ,EACJ,OAAO,WACL,IAAMN,EAAOC,UACPC,EAAUC,KAChBI,aAAaD,GACbA,EAAaD,YAAW,WAAA,OAAMR,EAAKO,MAAMF,EAASF,KAAOF,OAGrD,SAACU,GAAU,OAAKA,EAAIC,KAAKC,MAAMD,KAAKE,SAAWH,EAAII,YA0BrD,SAACC,EAAUC,GACf,IAAMC,EAAS,GAMf,OALAC,OAAOF,KAAKD,GAAKI,SAAQ,SAAAC,GAClBJ,EAAKK,SAASD,KACjBH,EAAOG,GAAOL,EAAIK,OAGfH,GC/CPK,GAAS,EACb,IACEA,uBAASJ,OAAOK,UAAUC,SAASC,KAAKC,OAAOC,SAC/C,MAAOC,IAET,IAAMC,GAAaP,GAAUQ,WAAaA,UAAUD,WAAaC,UAAUD,UAAUE,cAC/EC,EAAcH,GAAaA,EAAUI,QAAQ,eAAiB,EAmC9DC,EAAU,CACd,UACA,UACA,MACA,SACA,MACA,SACA,OACA,QACA,MACA,SACA,WACA,WACA,YACA,YACA,SACA,YACA,WACA,YACA,aACA,MACA,WACA,WACA,UACA,MACA,QACA,YACA,MACA,SACA,SACA,YACA,WACA,YACA,WACA,OACA,MACA,OACA,SACA,SACA,MACA,SACA,OACA,QACA,YACA,MACA,OACA,SACA,WACA,SACA,QACA,QACA,MACA,YACA,UACA,QACA,QACA,WACA,WACA,UACA,OACA,MACA,WACA,cACA,UACA,SACA,YACA,aACA,YACA,UACA,YACA,UACA,aACA,aACA,WACA,OACA,YACA,QACA,YACA,MACA,SACA,cACA,QACA,SACA,MACA,SACA,OACA,QACA,UACA,WACA,UACA,YACA,OACA,SACA,SACA,YACA,OACA,QACA,WACA,MACA,UACA,SACA,WACA,OACA,YACA,SACA,OACA,QACA,YACA,SACA,UACA,MACA,QACA,WACA,MACA,MACA,SACA,SACA,SACA,QACA,UACA,OACA,WACA,OACA,MACA,aACA,OACA,MACA,OACA,WACA,YACA,UACA,QACA,SACA,SACA,UACA,OACA,WACA,QACA,SACA,UACA,cACA,SACA,OACA,UACA,aACA,OACA,QACA,UACA,UACA,UACA,OACA,UACA,OACA,WACA,QACA,UACA,eACA,WACA,SACA,QACA,WACA,cACA,QACA,SACA,SACA,SACA,SACA,MACA,YACA,aACA,WACA,aACA,OACA,OACA,QACA,MACA,QACA,UACA,UACA,WACA,OACA,QACA,UACA,QACA,UACA,SACA,SACA,OACA,SACA,QACA,UACA,SACA,OACA,QACA,WACA,OACA,QACA,WACA,SACA,SACA,UACA,WACA,SACA,WACA,SACA,YACA,SACA,WACA,aACA,UACA,OACA,SACA,OACA,cACA,OACA,UACA,WACA,SACA,QACA,WACA,OACA,QACA,OACA,SACA,UACA,OACA,cACA,SACA,UACA,UACA,YACA,OACA,UACA,QACA,MACA,KACA,QACA,UACA,WACA,SACA,aACA,YACA,UACA,UACA,UACA,UACA,QACA,WACA,MACA,SACA,OACA,WACA,UACA,YACA,WACA,OACA,YACA,WACA,SACA,QACA,UACA,YACA,SACA,OACA,SACA,QACA,SACA,SACA,SACA,UACA,MACA,cACA,QACA,WACA,UACA,aACA,aACA,SACA,OACA,UACA,YACA,WACA,aACA,SACA,UACA,UACA,WACA,WACA,QACA,QACA,QACA,SACA,WACA,aACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,OACA,UACA,SACA,YACA,QACA,WACA,WACA,WACA,QACA,QACA,WACA,UACA,OACA,QACA,YACA,YACA,OACA,QACA,QACA,YACA,UACA,UACA,OACA,SACA,OACA,QACA,SACA,OACA,WACA,SACA,QACA,OACA,SACA,SACA,gBACA,QACA,SACA,QACA,OACA,UACA,UACA,SACA,OACA,UACA,SACA,QACA,UACA,YACA,UACA,aACA,WACA,OACA,YACA,SACA,aACA,OACA,OACA,UACA,MACA,QACA,SACA,MACA,SACA,UACA,MACA,SACA,SACA,QACA,WACA,QACA,QACA,MACA,QACA,QACA,MACA,WAGIC,EAAa,CACjB,UACA,MACA,WACA,MACA,QACA,WACA,QACA,OACA,UACA,QACA,SACA,OACA,UACA,UACA,YACA,SACA,OACA,QACA,QACA,OACA,OACA,UACA,SACA,SACA,QACA,SACA,OACA,OACA,SACA,UACA,SACA,QACA,UACA,OACA,QACA,MACA,QACA,SACA,QACA,SACA,MACA,QACA,SACA,UACA,SACA,OACA,OACA,OACA,SACA,MACA,SACA,QACA,UACA,SACA,SACA,QACA,WACA,OACA,UACA,QACA,QACA,OACA,OACA,OACA,SACA,MACA,QACA,QACA,QACA,OACA,QACA,QACA,WACA,QACA,MACA,QACA,QACA,OACA,WACA,QACA,SACA,YACA,QACA,QACA,UACA,SACA,QACA,OACA,UACA,UACA,OACA,QACA,UACA,QACA,QACA,WACA,aACA,SACA,SACA,OACA,YACA,aACA,YACA,aACA,SACA,YACA,QACA,QACA,OACA,SACA,QACA,OACA,QACA,QACA,SACA,SACA,QACA,YACA,QACA,UACA,aACA,QACA,SACA,SACA,OACA,MACA,MACA,QACA,SACA,UACA,UACA,QACA,QACA,YACA,SACA,QACA,QACA,YACA,QACA,QACA,WACA,SACA,OACA,QACA,SACA,SACA,SACA,QACA,SACA,OACA,MACA,SACA,SACA,QACA,UACA,UACA,WACA,UACA,QACA,MACA,aACA,QACA,YACA,YACA,WACA,SACA,QACA,YACA,WACA,UACA,YACA,YACA,YACA,QACA,cACA,UACA,OACA,SACA,UACA,UACA,aACA,WACA,WACA,WACA,SACA,OACA,MACA,UACA,SACA,aACA,UACA,UACA,YACA,aACA,UACA,YACA,QACA,WACA,UACA,OACA,QACA,WACA,cACA,QACA,WACA,QACA,UACA,QACA,SACA,UACA,YACA,SACA,QACA,OACA,WACA,WACA,cACA,cACA,aACA,aACA,aACA,QACA,SACA,aACA,cACA,YACA,eACA,UACA,YACA,OACA,WACA,YACA,OACA,WACA,QACA,SACA,WACA,OACA,QACA,UACA,UACA,YACA,QACA,SACA,OACA,SACA,SACA,QACA,WACA,UACA,WACA,QACA,WACA,QACA,UACA,WACA,aACA,aACA,aACA,YACA,QACA,YACA,UACA,OACA,QACA,OACA,MACA,MACA,QACA,OACA,QACA,YACA,QACA,QACA,SACA,YACA,OACA,QACA,WACA,UACA,QACA,QACA,WACA,MACA,SACA,YACA,OACA,OACA,UACA,OACA,MACA,MACA,SACA,YACA,MACA,OACA,OACA,QACA,QACA,WACA,OACA,SACA,OACA,QACA,aACA,gBACA,UACA,YACA,UACA,OACA,QACA,QACA,OACA,QACA,OACA,SACA,WACA,UACA,UACA,QACA,SACA,YACA,SACA,WACA,OACA,UACA,OACA,YACA,OACA,UACA,SACA,SACA,YACA,WACA,UACA,QACA,OACA,UACA,QACA,UACA,QACA,UACA,aACA,OACA,SACA,WACA,YACA,cACA,aACA,SACA,UACA,WACA,SACA,UACA,SACA,SACA,QACA,QACA,QACA,MACA,SACA,UACA,WACA,QACA,QACA,cACA,aACA,QACA,OACA,WACA,cACA,MACA,SACA,QACA,WACA,WACA,aACA,QACA,MACA,UACA,QACA,eACA,SACA,OACA,OACA,QACA,QACA,SACA,YACA,UACA,cACA,WACA,SACA,cACA,OACA,cACA,eACA,WACA,WACA,MACA,WACA,cACA,WACA,UACA,OACA,QACA,OACA,OACA,aACA,OACA,YACA,YACA,QACA,UACA,UACA,SACA,gBACA,WACA,SACA,UACA,SACA,WACA,OACA,OACA,aACA,OACA,WACA,YACA,WACA,WACA,MACA,QACA,UACA,MACA,aACA,SACA,WACA,UACA,WACA,aACA,QACA,OACA,SACA,QACA,SACA,QACA,WACA,SACA,SACA,YACA,WACA,QACA,UACA,WACA,YACA,QACA,OACA,YACA,WACA,YACA,QACA,OACA,SACA,WACA,SACA,QACA,QACA,SACA,UACA,eACA,SACA,QACA,MACA,SACA,QACA,UACA,cACA,SACA,UACA,UACA,aACA,YACA,WACA,QACA,WACA,UACA,UACA,SACA,SACA,aACA,UACA,aACA,aACA,UACA,UACA,MACA,QACA,YACA,cACA,SACA,YACA,WACA,YACA,WACA,WACA,SACA,UACA,OACA,OACA,MACA,aACA,OACA,QACA,WACA,aACA,OACA,QACA,QACA,QACA,UACA,SACA,UACA,WACA,QACA,WACA,OACA,OACA,SACA,WACA,UACA,QACA,UACA,QACA,aACA,WACA,QACA,QACA,cACA,OACA,UACA,UACA,OACA,WACA,UACA,QACA,YACA,QACA,UACA,SACA,OACA,WACA,OACA,YACA,QACA,WACA,WACA,QACA,QACA,UACA,SACA,MACA,YACA,WACA,YACA,OACA,QACA,cACA,MACA,UACA,QACA,OACA,WACA,eACA,QACA,OACA,OACA,QACA,UACA,SACA,YACA,gBACA,UACA,UACA,aACA,QACA,QACA,SACA,QACA,WACA,OACA,SACA,UACA,MACA,QACA,OACA,YACA,OACA,YACA,eACA,UACA,UACA,UACA,YACA,QACA,YACA,cACA,UACA,WACA,WACA,eACA,UACA,SACA,WACA,YACA,SACA,WACA,WACA,SACA,YACA,UACA,OACA,OACA,SACA,SACA,UACA,OACA,YACA,QACA,YACA,OACA,MACA,cACA,QACA,UACA,UACA,aACA,YACA,SACA,OACA,SACA,YACA,MACA,SACA,QACA,WACA,QACA,QACA,iBACA,SACA,aACA,gBACA,aACA,QACA,QACA,OACA,OACA,YACA,UACA,WACA,aACA,SACA,WACA,OACA,UACA,WACA,aACA,UACA,WACA,UACA,WACA,UACA,WACA,UACA,YACA,MACA,YACA,aACA,YACA,WACA,QACA,WACA,WACA,WACA,MACA,UACA,QACA,WACA,aACA,UACA,UACA,QACA,SACA,iBACA,YACA,YACA,aACA,YACA,OACA,SACA,WACA,SACA,cACA,cACA,OACA,SACA,WACA,UACA,SACA,aACA,UACA,cACA,gBACA,QACA,UACA,WACA,UACA,QACA,QACA,cACA,UACA,UACA,SACA,SACA,OACA,QACA,MACA,QACA,WACA,QACA,gBACA,UACA,aACA,aACA,SACA,WACA,WACA,WACA,QACA,aACA,UACA,OACA,QACA,aACA,QACA,WACA,OACA,WACA,YACA,QACA,aACA,UACA,YACA,SACA,YACA,SACA,SACA,UACA,aACA,eACA,YACA,QACA,WACA,WACA,OACA,WACA,SACA,aACA,YACA,WACA,MACA,gBACA,SACA,aACA,UACA,QACA,gBACA,SACA,WACA,aACA,SACA,WACA,SACA,OACA,WACA,WACA,aACA,WACA,eACA,YACA,UACA,WACA,WACA,aACA,YACA,UACA,OACA,WACA,SACA,QACA,QACA,aACA,QACA,SACA,QACA,YACA,OACA,WACA,SACA,SACA,WACA,SACA,UACA,OACA,WACA,WACA,QACA,SACA,QACA,aACA,YACA,eACA,WACA,cACA,YACA,SACA,eACA,gBACA,WACA,cACA,UACA,YACA,WACA,cACA,YACA,WACA,WACA,YACA,SACA,cACA,aACA,SACA,QACA,eACA,aACA,UACA,WACA,QACA,YACA,cACA,aACA,cACA,SACA,YACA,aACA,aACA,aACA,SACA,aACA,SACA,gBACA,QACA,WACA,aACA,QACA,aACA,kBACA,WACA,UACA,cACA,UACA,WACA,SACA,aACA,QACA,UACA,WACA,QACA,aACA,cACA,UACA,cACA,SACA,WACA,QACA,OACA,QACA,WACA,aACA,UACA,aACA,aACA,YACA,OACA,SACA,gBACA,UACA,aACA,cACA,SACA,SACA,cACA,OACA,UACA,OACA,aACA,QACA,OACA,QACA,SACA,SACA,UACA,SACA,UACA,QACA,SACA,WACA,QACA,YACA,SACA,WACA,SACA,UACA,cACA,WACA,UACA,YACA,WACA,QACA,WACA,OACA,eACA,YACA,cACA,cACA,aACA,WACA,cACA,OACA,QACA,WACA,SACA,WACA,iBACA,UACA,aACA,UACA,YACA,WACA,QACA,aACA,UACA,UACA,MACA,WACA,YACA,cACA,cACA,eACA,cACA,YACA,WACA,UACA,cACA,gBACA,OACA,WACA,UACA,WACA,aACA,aACA,UACA,YACA,aACA,QACA,UACA,WACA,QACA,eACA,OACA,UACA,SACA,cACA,cACA,WACA,QACA,UACA,WACA,QACA,UACA,UACA,SACA,UACA,WACA,UACA,SACA,WACA,YACA,OACA,WACA,SACA,aACA,cACA,YACA,OACA,UACA,QACA,QACA,YACA,SACA,QACA,UACA,MACA,aACA,YACA,UACA,QACA,SACA,aACA,SACA,UACA,YACA,WACA,iBACA,eACA,WACA,QACA,UACA,QACA,UACA,WACA,QACA,QACA,WACA,WACA,QACA,WACA,OACA,UACA,gBACA,UACA,UACA,aACA,UACA,SACA,cACA,gBACA,eACA,aACA,aACA,QACA,WACA,UACA,SACA,UACA,SACA,OACA,UACA,aACA,eACA,QACA,YACA,WACA,aACA,eACA,OACA,aACA,UACA,UACA,aACA,QACA,QACA,WACA,gBACA,WACA,QACA,eACA,WACA,aACA,UACA,aACA,YACA,UACA,SACA,cACA,UACA,WACA,UACA,YACA,UACA,SACA,UACA,UACA,WACA,cACA,WACA,gBACA,aACA,QACA,WACA,YACA,aACA,SACA,SACA,YACA,WACA,SACA,SACA,SACA,eACA,QACA,aACA,YACA,OACA,YACA,SACA,QACA,UACA,YACA,aACA,WACA,eACA,gBACA,SACA,aACA,QACA,WACA,SACA,gBACA,SACA,aACA,UACA,QACA,SACA,cACA,aACA,aACA,eACA,WACA,YACA,UACA,aACA,UACA,WACA,UACA,QACA,SACA,YACA,WACA,OACA,WACA,UACA,OACA,UACA,YACA,cACA,aACA,SACA,YACA,aACA,YACA,WACA,SACA,SACA,SACA,WACA,UACA,UACA,UACA,SACA,cACA,YACA,YACA,WACA,SACA,UACA,SACA,YACA,UACA,cACA,SACA,aACA,MACA,WACA,OACA,KACA,WACA,aACA,UACA,YACA,SACA,SACA,WACA,WACA,YACA,UACA,UACA,QACA,aACA,YACA,eACA,cACA,WACA,OACA,aACA,SACA,SACA,YACA,UACA,UACA,UACA,WACA,SACA,WACA,SACA,MACA,QACA,WACA,aACA,YACA,WACA,WACA,QACA,YACA,UACA,eACA,WACA,WACA,eACA,aACA,UACA,QACA,UACA,UACA,WACA,aACA,SACA,UACA,SACA,UACA,SACA,SACA,UACA,eACA,YACA,UACA,YACA,SACA,cACA,YACA,WACA,aACA,SACA,UACA,YACA,iBACA,QACA,SACA,WACA,cACA,QACA,OACA,WACA,cACA,aACA,aACA,aACA,YACA,QACA,aACA,QACA,SACA,YACA,OACA,UACA,WACA,SACA,YACA,QACA,UACA,OACA,YACA,YACA,WACA,OACA,SACA,UACA,UACA,WACA,YACA,aACA,WACA,cACA,SACA,OACA,cACA,OACA,WACA,UACA,OACA,OACA,MACA,SACA,QACA,OACA,eACA,YACA,OACA,QACA,WACA,QACA,UACA,YACA,SACA,SACA,WACA,SACA,QACA,QACA,SACA,WACA,UACA,OACA,OACA,OACA,WACA,OACA,UACA,QACA,SACA,YACA,WACA,WACA,YACA,SACA,QACA,QACA,aACA,QACA,QACA,SACA,SACA,QACA,SACA,YACA,WACA,SACA,UACA,OACA,YACA,UACA,MACA,SACA,YACA,MACA,QACA,OACA,SACA,SACA,QACA,QACA,OACA,MACA,QACA,WACA,QACA,QACA,QACA,WACA,WACA,SACA,WACA,QACA,WACA,QACA,UACA,QACA,OACA,OACA,OACA,cACA,UACA,OACA,SACA,QACA,QACA,MACA,OACA,OACA,QACA,aACA,MACA,SACA,WACA,SACA,WACA,UACA,SACA,SACA,QACA,QACA,WACA,QACA,OACA,QACA,MACA,UACA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"} \ No newline at end of file +{"version":3,"file":"iris.cjs.production.min.js","sources":["../src/lodash.ts","../src/util.ts","../src/Key.ts","../src/peers.ts","../src/db/Actor.ts","../src/db/Message.ts","../src/global.ts","../src/db/adapters/Memory.ts","../src/db/adapters/IndexedDB.ts","../src/db/adapters/Websocket.ts","../src/db/Router.ts","../src/db/Node.ts","../src/Attribute.ts","../src/public.ts","../src/Channel.ts","../src/local.ts","../src/private.ts","../src/blockedUsers.ts","../src/group.ts","../src/notifications.ts","../src/session.ts","../src/electron.ts","../src/static.ts","../src/SignedMessage.ts","../src/index.ts"],"sourcesContent":["// @ts-nocheck\nconst _ = {\n throttle: (func: Function, limit: number) => {\n let inThrottle: boolean;\n return function() {\n const args = arguments;\n const context = this;\n if (!inThrottle) {\n func.apply(context, args);\n inThrottle = true;\n setTimeout(() => inThrottle = false, limit);\n }\n };\n },\n debounce: (func: Function, limit: number) => {\n let inDebounce: boolean;\n return function() {\n const args = arguments;\n const context = this;\n clearTimeout(inDebounce);\n inDebounce = setTimeout(() => func.apply(context, args), limit);\n };\n },\n sample: (arr: any[]) => arr[Math.floor(Math.random() * arr.length)],\n sampleSize: (arr: any[], size: number) => {\n const shuffled = arr.slice(0);\n let i = arr.length;\n let min = i - size;\n let temp;\n let index;\n while (i-- > min) {\n index = Math.floor((i + 1) * Math.random());\n temp = shuffled[index];\n shuffled[index] = shuffled[i];\n shuffled[i] = temp;\n }\n return shuffled.slice(min);\n },\n defer: (func: Function) => setTimeout(func, 0),\n once: (func: Function) => {\n let called = false;\n return function() {\n if (called) {\n return;\n }\n called = true;\n func.apply(this, arguments);\n };\n },\n omit: (obj: any, keys: string[]) => {\n const newObj = {};\n Object.keys(obj).forEach(key => {\n if (!keys.includes(key)) {\n newObj[key] = obj[key];\n }\n });\n return newObj;\n },\n defaults: (obj: any, defaults: any) => {\n Object.keys(defaults).forEach(key => {\n if (obj[key] === undefined) {\n obj[key] = defaults[key];\n }\n });\n return obj;\n },\n pickBy: (obj: any, predicate: Function) => {\n const newObj = {};\n Object.keys(obj).forEach(key => {\n if (predicate(obj[key])) {\n newObj[key] = obj[key];\n }\n });\n return newObj;\n },\n isEqual: (a: any, b: any) => {\n if (a === b) {\n return true;\n }\n if (a instanceof Date && b instanceof Date) {\n return a.getTime() === b.getTime();\n }\n if (!a || !b || (typeof a !== 'object' && typeof b !== 'object')) {\n return a !== a && b !== b;\n }\n if (a.prototype !== b.prototype) {\n return false;\n }\n const keys = Object.keys(a);\n if (keys.length !== Object.keys(b).length) {\n return false;\n }\n return keys.every(k => _.isEqual(a[k], b[k]));\n },\n uniq: (arr: any[]) => {\n const set = new Set(arr);\n return Array.from(set);\n }\n};\n\nexport default _;","// @ts-nocheck\n/* eslint no-useless-escape: \"off\", camelcase: \"off\" */\n\nimport _ from './lodash';\n\n// eslint-disable-line no-unused-vars\n\nlet isNode = false;\ntry {\n isNode = Object.prototype.toString.call(global.process) === `[object process]`;\n} catch (e) { null; }\n\nconst userAgent = !isNode && navigator && navigator.userAgent && navigator.userAgent.toLowerCase();\nconst isElectron = (userAgent && userAgent.indexOf(' electron/') > -1);\n\nconst isMobile = !isNode && (function() {\n if (isElectron) { return false; }\n let check = false;\n (function(a) {if (/(android|bb\\d+|meego).+mobile|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\\-(n|u)|c55\\/|capi|ccwa|cdm\\-|cell|chtm|cldc|cmd\\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\\-s|devi|dica|dmob|do(c|p)o|ds(12|\\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\\-|_)|g1 u|g560|gene|gf\\-5|g\\-mo|go(\\.w|od)|gr(ad|un)|haie|hcit|hd\\-(m|p|t)|hei\\-|hi(pt|ta)|hp( i|ip)|hs\\-c|ht(c(\\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\\-(20|go|ma)|i230|iac( |\\-|\\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\\/)|klon|kpt |kwc\\-|kyo(c|k)|le(no|xi)|lg( g|\\/(k|l|u)|50|54|\\-[a-w])|libw|lynx|m1\\-w|m3ga|m50\\/|ma(te|ui|xo)|mc(01|21|ca)|m\\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\\-2|po(ck|rt|se)|prox|psio|pt\\-g|qa\\-a|qc(07|12|21|32|60|\\-[2-7]|i\\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\\-|oo|p\\-)|sdk\\/|se(c(\\-|0|1)|47|mc|nd|ri)|sgh\\-|shar|sie(\\-|m)|sk\\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\\-|v\\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\\-|tdg\\-|tel(i|m)|tim\\-|t\\-mo|to(pl|sh)|ts(70|m\\-|m3|m5)|tx\\-9|up(\\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\\-|your|zeto|zte\\-/i.test(a.substr(0, 4))) check = true;})(navigator.userAgent || navigator.vendor || '');\n return check;\n})();\n\nfunction gunOnceDefined(node: any) {\n return new Promise(resolve => {\n node.on((val: any, _k: any, _a: any, eve: any) => {\n if (val !== undefined) {\n eve.off();\n resolve(val);\n }\n });\n });\n}\n\nconst animals = [\n 'canidae',\n 'felidae',\n 'cat',\n 'cattle',\n 'dog',\n 'donkey',\n 'goat',\n 'horse',\n 'pig',\n 'rabbit',\n 'aardvark',\n 'aardwolf',\n 'albatross',\n 'alligator',\n 'alpaca',\n 'amphibian',\n 'anaconda',\n 'angelfish',\n 'anglerfish',\n 'ant',\n 'anteater',\n 'antelope',\n 'antlion',\n 'ape',\n 'aphid',\n 'armadillo',\n 'asp',\n 'baboon',\n 'badger',\n 'bandicoot',\n 'barnacle',\n 'barracuda',\n 'basilisk',\n 'bass',\n 'bat',\n 'bear',\n 'beaver',\n 'bedbug',\n 'bee',\n 'beetle',\n 'bird',\n 'bison',\n 'blackbird',\n 'boa',\n 'boar',\n 'bobcat',\n 'bobolink',\n 'bonobo',\n 'booby',\n 'bovid',\n 'bug',\n 'butterfly',\n 'buzzard',\n 'camel',\n 'canid',\n 'capybara',\n 'cardinal',\n 'caribou',\n 'carp',\n 'cat',\n 'catshark',\n 'caterpillar',\n 'catfish',\n 'cattle',\n 'centipede',\n 'cephalopod',\n 'chameleon',\n 'cheetah',\n 'chickadee',\n 'chicken',\n 'chimpanzee',\n 'chinchilla',\n 'chipmunk',\n 'clam',\n 'clownfish',\n 'cobra',\n 'cockroach',\n 'cod',\n 'condor',\n 'constrictor',\n 'coral',\n 'cougar',\n 'cow',\n 'coyote',\n 'crab',\n 'crane',\n 'crawdad',\n 'crayfish',\n 'cricket',\n 'crocodile',\n 'crow',\n 'cuckoo',\n 'cicada',\n 'damselfly',\n 'deer',\n 'dingo',\n 'dinosaur',\n 'dog',\n 'dolphin',\n 'donkey',\n 'dormouse',\n 'dove',\n 'dragonfly',\n 'dragon',\n 'duck',\n 'eagle',\n 'earthworm',\n 'earwig',\n 'echidna',\n 'eel',\n 'egret',\n 'elephant',\n 'elk',\n 'emu',\n 'ermine',\n 'falcon',\n 'ferret',\n 'finch',\n 'firefly',\n 'fish',\n 'flamingo',\n 'flea',\n 'fly',\n 'flyingfish',\n 'fowl',\n 'fox',\n 'frog',\n 'gamefowl',\n 'galliform',\n 'gazelle',\n 'gecko',\n 'gerbil',\n 'gibbon',\n 'giraffe',\n 'goat',\n 'goldfish',\n 'goose',\n 'gopher',\n 'gorilla',\n 'grasshopper',\n 'grouse',\n 'guan',\n 'guanaco',\n 'guineafowl',\n 'gull',\n 'guppy',\n 'haddock',\n 'halibut',\n 'hamster',\n 'hare',\n 'harrier',\n 'hawk',\n 'hedgehog',\n 'heron',\n 'herring',\n 'hippopotamus',\n 'hookworm',\n 'hornet',\n 'horse',\n 'hoverfly',\n 'hummingbird',\n 'hyena',\n 'iguana',\n 'impala',\n 'jackal',\n 'jaguar',\n 'jay',\n 'jellyfish',\n 'junglefowl',\n 'kangaroo',\n 'kingfisher',\n 'kite',\n 'kiwi',\n 'koala',\n 'koi',\n 'krill',\n 'ladybug',\n 'lamprey',\n 'landfowl',\n 'lark',\n 'leech',\n 'lemming',\n 'lemur',\n 'leopard',\n 'leopon',\n 'limpet',\n 'lion',\n 'lizard',\n 'llama',\n 'lobster',\n 'locust',\n 'loon',\n 'louse',\n 'lungfish',\n 'lynx',\n 'macaw',\n 'mackerel',\n 'magpie',\n 'mammal',\n 'manatee',\n 'mandrill',\n 'marlin',\n 'marmoset',\n 'marmot',\n 'marsupial',\n 'marten',\n 'mastodon',\n 'meadowlark',\n 'meerkat',\n 'mink',\n 'minnow',\n 'mite',\n 'mockingbird',\n 'mole',\n 'mollusk',\n 'mongoose',\n 'monkey',\n 'moose',\n 'mosquito',\n 'moth',\n 'mouse',\n 'mule',\n 'muskox',\n 'narwhal',\n 'newt',\n 'nightingale',\n 'ocelot',\n 'octopus',\n 'opossum',\n 'orangutan',\n 'orca',\n 'ostrich',\n 'otter',\n 'owl',\n 'ox',\n 'panda',\n 'panther',\n 'parakeet',\n 'parrot',\n 'parrotfish',\n 'partridge',\n 'peacock',\n 'peafowl',\n 'pelican',\n 'penguin',\n 'perch',\n 'pheasant',\n 'pig',\n 'pigeon',\n 'pike',\n 'pinniped',\n 'piranha',\n 'planarian',\n 'platypus',\n 'pony',\n 'porcupine',\n 'porpoise',\n 'possum',\n 'prawn',\n 'primate',\n 'ptarmigan',\n 'puffin',\n 'puma',\n 'python',\n 'quail',\n 'quelea',\n 'quokka',\n 'rabbit',\n 'raccoon',\n 'rat',\n 'rattlesnake',\n 'raven',\n 'reindeer',\n 'reptile',\n 'rhinoceros',\n 'roadrunner',\n 'rodent',\n 'rook',\n 'rooster',\n 'roundworm',\n 'sailfish',\n 'salamander',\n 'salmon',\n 'sawfish',\n 'scallop',\n 'scorpion',\n 'seahorse',\n 'shark',\n 'sheep',\n 'shrew',\n 'shrimp',\n 'silkworm',\n 'silverfish',\n 'skink',\n 'skunk',\n 'sloth',\n 'slug',\n 'smelt',\n 'snail',\n 'snake',\n 'snipe',\n 'sole',\n 'sparrow',\n 'spider',\n 'spoonbill',\n 'squid',\n 'squirrel',\n 'starfish',\n 'stingray',\n 'stoat',\n 'stork',\n 'sturgeon',\n 'swallow',\n 'swan',\n 'swift',\n 'swordfish',\n 'swordtail',\n 'tahr',\n 'takin',\n 'tapir',\n 'tarantula',\n 'tarsier',\n 'termite',\n 'tern',\n 'thrush',\n 'tick',\n 'tiger',\n 'tiglon',\n 'toad',\n 'tortoise',\n 'toucan',\n 'trout',\n 'tuna',\n 'turkey',\n 'turtle',\n 'tyrannosaurus',\n 'urial',\n 'vicuna',\n 'viper',\n 'vole',\n 'vulture',\n 'wallaby',\n 'walrus',\n 'wasp',\n 'warbler',\n 'weasel',\n 'whale',\n 'whippet',\n 'whitefish',\n 'wildcat',\n 'wildebeest',\n 'wildfowl',\n 'wolf',\n 'wolverine',\n 'wombat',\n 'woodpecker',\n 'worm',\n 'wren',\n 'xerinae',\n 'yak',\n 'zebra',\n 'alpaca',\n 'cat',\n 'cattle',\n 'chicken',\n 'dog',\n 'donkey',\n 'ferret',\n 'gayal',\n 'goldfish',\n 'guppy',\n 'horse',\n 'koi',\n 'llama',\n 'sheep',\n 'yak',\n 'unicorn',\n];\n\nconst adjectives = [\n 'average',\n 'big',\n 'colossal',\n 'fat',\n 'giant',\n 'gigantic',\n 'great',\n 'huge',\n 'immense',\n 'large',\n 'little',\n 'long',\n 'mammoth',\n 'massive',\n 'miniature',\n 'petite',\n 'puny',\n 'short',\n 'small',\n 'tall',\n 'tiny',\n 'boiling',\n 'breezy',\n 'broken',\n 'bumpy',\n 'chilly',\n 'cold',\n 'cool',\n 'creepy',\n 'crooked',\n 'cuddly',\n 'curly',\n 'damaged',\n 'damp',\n 'dirty',\n 'dry',\n 'dusty',\n 'filthy',\n 'flaky',\n 'fluffy',\n 'wet',\n 'broad',\n 'chubby',\n 'crooked',\n 'curved',\n 'deep',\n 'flat',\n 'high',\n 'hollow',\n 'low',\n 'narrow',\n 'round',\n 'shallow',\n 'skinny',\n 'square',\n 'steep',\n 'straight',\n 'wide',\n 'ancient',\n 'brief',\n 'early',\n 'fast',\n 'late',\n 'long',\n 'modern',\n 'old',\n 'quick',\n 'rapid',\n 'short',\n 'slow',\n 'swift',\n 'young',\n 'abundant',\n 'empty',\n 'few',\n 'heavy',\n 'light',\n 'many',\n 'numerous',\n 'Sound',\n 'cooing',\n 'deafening',\n 'faint',\n 'harsh',\n 'hissing',\n 'hushed',\n 'husky',\n 'loud',\n 'melodic',\n 'moaning',\n 'mute',\n 'noisy',\n 'purring',\n 'quiet',\n 'raspy',\n 'resonant',\n 'screeching',\n 'shrill',\n 'silent',\n 'soft',\n 'squealing',\n 'thundering',\n 'voiceless',\n 'whispering',\n 'bitter',\n 'delicious',\n 'fresh',\n 'juicy',\n 'ripe',\n 'rotten',\n 'salty',\n 'sour',\n 'spicy',\n 'stale',\n 'sticky',\n 'strong',\n 'sweet',\n 'tasteless',\n 'tasty',\n 'thirsty',\n 'fluttering',\n 'fuzzy',\n 'greasy',\n 'grubby',\n 'hard',\n 'hot',\n 'icy',\n 'loose',\n 'melted',\n 'plastic',\n 'prickly',\n 'rainy',\n 'rough',\n 'scattered',\n 'shaggy',\n 'shaky',\n 'sharp',\n 'shivering',\n 'silky',\n 'slimy',\n 'slippery',\n 'smooth',\n 'soft',\n 'solid',\n 'steady',\n 'sticky',\n 'tender',\n 'tight',\n 'uneven',\n 'weak',\n 'wet',\n 'wooden',\n 'afraid',\n 'angry',\n 'annoyed',\n 'anxious',\n 'arrogant',\n 'ashamed',\n 'awful',\n 'bad',\n 'bewildered',\n 'bored',\n 'combative',\n 'condemned',\n 'confused',\n 'creepy',\n 'cruel',\n 'dangerous',\n 'defeated',\n 'defiant',\n 'depressed',\n 'disgusted',\n 'disturbed',\n 'eerie',\n 'embarrassed',\n 'envious',\n 'evil',\n 'fierce',\n 'foolish',\n 'frantic',\n 'frightened',\n 'grieving',\n 'helpless',\n 'homeless',\n 'hungry',\n 'hurt',\n 'ill',\n 'jealous',\n 'lonely',\n 'mysterious',\n 'naughty',\n 'nervous',\n 'obnoxious',\n 'outrageous',\n 'panicky',\n 'repulsive',\n 'scary',\n 'scornful',\n 'selfish',\n 'sore',\n 'tense',\n 'terrible',\n 'thoughtless',\n 'tired',\n 'troubled',\n 'upset',\n 'uptight',\n 'weary',\n 'wicked',\n 'worried',\n 'agreeable',\n 'amused',\n 'brave',\n 'calm',\n 'charming',\n 'cheerful',\n 'comfortable',\n 'cooperative',\n 'courageous',\n 'delightful',\n 'determined',\n 'eager',\n 'elated',\n 'enchanting',\n 'encouraging',\n 'energetic',\n 'enthusiastic',\n 'excited',\n 'exuberant',\n 'fair',\n 'faithful',\n 'fantastic',\n 'fine',\n 'friendly',\n 'funny',\n 'gentle',\n 'glorious',\n 'good',\n 'happy',\n 'healthy',\n 'helpful',\n 'hilarious',\n 'jolly',\n 'joyous',\n 'kind',\n 'lively',\n 'lovely',\n 'lucky',\n 'obedient',\n 'perfect',\n 'pleasant',\n 'proud',\n 'relieved',\n 'silly',\n 'smiling',\n 'splendid',\n 'successful',\n 'thoughtful',\n 'victorious',\n 'vivacious',\n 'witty',\n 'wonderful',\n 'zealous',\n 'zany',\n 'other',\n 'good',\n 'new',\n 'old',\n 'great',\n 'high',\n 'small',\n 'different',\n 'large',\n 'local',\n 'social',\n 'important',\n 'long',\n 'young',\n 'national',\n 'british',\n 'right',\n 'early',\n 'possible',\n 'big',\n 'little',\n 'political',\n 'able',\n 'late',\n 'general',\n 'full',\n 'far',\n 'low',\n 'public',\n 'available',\n 'bad',\n 'main',\n 'sure',\n 'clear',\n 'major',\n 'economic',\n 'only',\n 'likely',\n 'real',\n 'black',\n 'particular',\n 'international',\n 'special',\n 'difficult',\n 'certain',\n 'open',\n 'whole',\n 'white',\n 'free',\n 'short',\n 'easy',\n 'strong',\n 'european',\n 'central',\n 'similar',\n 'human',\n 'common',\n 'necessary',\n 'single',\n 'personal',\n 'hard',\n 'private',\n 'poor',\n 'financial',\n 'wide',\n 'foreign',\n 'simple',\n 'recent',\n 'concerned',\n 'american',\n 'various',\n 'close',\n 'fine',\n 'english',\n 'wrong',\n 'present',\n 'royal',\n 'natural',\n 'individual',\n 'nice',\n 'french',\n 'nihilist',\n 'solipsist',\n 'materialist',\n 'surrealist',\n 'heroic',\n 'awesome',\n 'hedonist',\n 'absurd',\n 'current',\n 'modern',\n 'labour',\n 'legal',\n 'happy',\n 'final',\n 'red',\n 'normal',\n 'serious',\n 'previous',\n 'total',\n 'prime',\n 'significant',\n 'industrial',\n 'sorry',\n 'dead',\n 'specific',\n 'appropriate',\n 'top',\n 'soviet',\n 'basic',\n 'military',\n 'original',\n 'successful',\n 'aware',\n 'hon',\n 'popular',\n 'heavy',\n 'professional',\n 'direct',\n 'dark',\n 'cold',\n 'ready',\n 'green',\n 'useful',\n 'effective',\n 'western',\n 'traditional',\n 'scottish',\n 'german',\n 'independent',\n 'deep',\n 'interesting',\n 'considerable',\n 'involved',\n 'physical',\n 'hot',\n 'existing',\n 'responsible',\n 'complete',\n 'medical',\n 'blue',\n 'extra',\n 'past',\n 'male',\n 'interested',\n 'fair',\n 'essential',\n 'beautiful',\n 'civil',\n 'primary',\n 'obvious',\n 'future',\n 'environmental',\n 'positive',\n 'senior',\n 'nuclear',\n 'annual',\n 'relevant',\n 'huge',\n 'rich',\n 'commercial',\n 'safe',\n 'regional',\n 'practical',\n 'official',\n 'separate',\n 'key',\n 'chief',\n 'regular',\n 'due',\n 'additional',\n 'active',\n 'powerful',\n 'complex',\n 'standard',\n 'impossible',\n 'light',\n 'warm',\n 'middle',\n 'fresh',\n 'sexual',\n 'front',\n 'domestic',\n 'actual',\n 'united',\n 'technical',\n 'ordinary',\n 'cheap',\n 'strange',\n 'internal',\n 'excellent',\n 'quiet',\n 'soft',\n 'potential',\n 'northern',\n 'religious',\n 'quick',\n 'very',\n 'famous',\n 'cultural',\n 'proper',\n 'broad',\n 'joint',\n 'formal',\n 'limited',\n 'conservative',\n 'lovely',\n 'usual',\n 'ltd',\n 'unable',\n 'rural',\n 'initial',\n 'substantial',\n 'bright',\n 'average',\n 'leading',\n 'reasonable',\n 'immediate',\n 'suitable',\n 'equal',\n 'detailed',\n 'working',\n 'overall',\n 'female',\n 'afraid',\n 'democratic',\n 'growing',\n 'sufficient',\n 'scientific',\n 'eastern',\n 'correct',\n 'inc',\n 'irish',\n 'expensive',\n 'educational',\n 'mental',\n 'dangerous',\n 'critical',\n 'increased',\n 'familiar',\n 'unlikely',\n 'double',\n 'perfect',\n 'slow',\n 'tiny',\n 'dry',\n 'historical',\n 'thin',\n 'daily',\n 'southern',\n 'increasing',\n 'wild',\n 'alone',\n 'urban',\n 'empty',\n 'married',\n 'narrow',\n 'liberal',\n 'supposed',\n 'upper',\n 'apparent',\n 'tall',\n 'busy',\n 'bloody',\n 'prepared',\n 'russian',\n 'moral',\n 'careful',\n 'clean',\n 'attractive',\n 'japanese',\n 'vital',\n 'thick',\n 'alternative',\n 'fast',\n 'ancient',\n 'elderly',\n 'rare',\n 'external',\n 'capable',\n 'brief',\n 'wonderful',\n 'grand',\n 'typical',\n 'entire',\n 'grey',\n 'constant',\n 'vast',\n 'surprised',\n 'ideal',\n 'terrible',\n 'academic',\n 'funny',\n 'minor',\n 'pleased',\n 'severe',\n 'ill',\n 'corporate',\n 'negative',\n 'permanent',\n 'weak',\n 'brown',\n 'fundamental',\n 'odd',\n 'crucial',\n 'inner',\n 'used',\n 'criminal',\n 'contemporary',\n 'sharp',\n 'sick',\n 'near',\n 'roman',\n 'massive',\n 'unique',\n 'secondary',\n 'parliamentary',\n 'african',\n 'unknown',\n 'subsequent',\n 'angry',\n 'alive',\n 'guilty',\n 'lucky',\n 'enormous',\n 'well',\n 'yellow',\n 'unusual',\n 'net',\n 'tough',\n 'dear',\n 'extensive',\n 'glad',\n 'remaining',\n 'agricultural',\n 'alright',\n 'healthy',\n 'italian',\n 'principal',\n 'tired',\n 'efficient',\n 'comfortable',\n 'chinese',\n 'relative',\n 'friendly',\n 'conventional',\n 'willing',\n 'sudden',\n 'proposed',\n 'voluntary',\n 'slight',\n 'valuable',\n 'dramatic',\n 'golden',\n 'temporary',\n 'federal',\n 'keen',\n 'flat',\n 'silent',\n 'indian',\n 'worried',\n 'pale',\n 'statutory',\n 'welsh',\n 'dependent',\n 'firm',\n 'wet',\n 'competitive',\n 'armed',\n 'radical',\n 'outside',\n 'acceptable',\n 'sensitive',\n 'living',\n 'pure',\n 'global',\n 'emotional',\n 'sad',\n 'secret',\n 'rapid',\n 'adequate',\n 'fixed',\n 'sweet',\n 'administrative',\n 'wooden',\n 'remarkable',\n 'comprehensive',\n 'surprising',\n 'solid',\n 'rough',\n 'mere',\n 'mass',\n 'brilliant',\n 'maximum',\n 'absolute',\n 'electronic',\n 'visual',\n 'electric',\n 'cool',\n 'spanish',\n 'literary',\n 'continuing',\n 'supreme',\n 'chemical',\n 'genuine',\n 'exciting',\n 'written',\n 'advanced',\n 'extreme',\n 'classical',\n 'fit',\n 'favourite',\n 'widespread',\n 'confident',\n 'straight',\n 'proud',\n 'numerous',\n 'opposite',\n 'distinct',\n 'mad',\n 'helpful',\n 'given',\n 'disabled',\n 'consistent',\n 'anxious',\n 'nervous',\n 'awful',\n 'stable',\n 'constitutional',\n 'satisfied',\n 'conscious',\n 'developing',\n 'strategic',\n 'holy',\n 'smooth',\n 'dominant',\n 'remote',\n 'theoretical',\n 'outstanding',\n 'pink',\n 'pretty',\n 'clinical',\n 'minimum',\n 'honest',\n 'impressive',\n 'related',\n 'residential',\n 'extraordinary',\n 'plain',\n 'visible',\n 'accurate',\n 'distant',\n 'still',\n 'greek',\n 'complicated',\n 'musical',\n 'precise',\n 'gentle',\n 'broken',\n 'live',\n 'silly',\n 'fat',\n 'tight',\n 'monetary',\n 'round',\n 'psychological',\n 'violent',\n 'unemployed',\n 'inevitable',\n 'junior',\n 'sensible',\n 'grateful',\n 'pleasant',\n 'dirty',\n 'structural',\n 'welcome',\n 'deaf',\n 'above',\n 'continuous',\n 'blind',\n 'overseas',\n 'mean',\n 'entitled',\n 'delighted',\n 'loose',\n 'occasional',\n 'evident',\n 'desperate',\n 'fellow',\n 'universal',\n 'square',\n 'steady',\n 'classic',\n 'equivalent',\n 'intellectual',\n 'victorian',\n 'level',\n 'ultimate',\n 'creative',\n 'lost',\n 'medieval',\n 'clever',\n 'linguistic',\n 'convinced',\n 'judicial',\n 'raw',\n 'sophisticated',\n 'asleep',\n 'vulnerable',\n 'illegal',\n 'outer',\n 'revolutionary',\n 'bitter',\n 'changing',\n 'australian',\n 'native',\n 'imperial',\n 'strict',\n 'wise',\n 'informal',\n 'flexible',\n 'collective',\n 'frequent',\n 'experimental',\n 'spiritual',\n 'intense',\n 'rational',\n 'generous',\n 'inadequate',\n 'prominent',\n 'logical',\n 'bare',\n 'historic',\n 'modest',\n 'dutch',\n 'acute',\n 'electrical',\n 'valid',\n 'weekly',\n 'gross',\n 'automatic',\n 'loud',\n 'reliable',\n 'mutual',\n 'liable',\n 'multiple',\n 'ruling',\n 'curious',\n 'sole',\n 'managing',\n 'pregnant',\n 'latin',\n 'nearby',\n 'exact',\n 'underlying',\n 'identical',\n 'satisfactory',\n 'marginal',\n 'distinctive',\n 'electoral',\n 'urgent',\n 'presidential',\n 'controversial',\n 'everyday',\n 'encouraging',\n 'organic',\n 'continued',\n 'expected',\n 'statistical',\n 'desirable',\n 'innocent',\n 'improved',\n 'exclusive',\n 'marked',\n 'experienced',\n 'unexpected',\n 'superb',\n 'sheer',\n 'disappointed',\n 'frightened',\n 'gastric',\n 'romantic',\n 'naked',\n 'reluctant',\n 'magnificent',\n 'convenient',\n 'established',\n 'closed',\n 'uncertain',\n 'artificial',\n 'diplomatic',\n 'tremendous',\n 'marine',\n 'mechanical',\n 'retail',\n 'institutional',\n 'mixed',\n 'required',\n 'biological',\n 'known',\n 'functional',\n 'straightforward',\n 'superior',\n 'digital',\n 'spectacular',\n 'unhappy',\n 'confused',\n 'unfair',\n 'aggressive',\n 'spare',\n 'painful',\n 'abstract',\n 'asian',\n 'associated',\n 'legislative',\n 'monthly',\n 'intelligent',\n 'hungry',\n 'explicit',\n 'nasty',\n 'just',\n 'faint',\n 'coloured',\n 'ridiculous',\n 'amazing',\n 'comparable',\n 'successive',\n 'realistic',\n 'back',\n 'decent',\n 'decentralized',\n 'bitcoin',\n 'cypherpunk',\n 'unnecessary',\n 'flying',\n 'random',\n 'influential',\n 'dull',\n 'genetic',\n 'neat',\n 'marvellous',\n 'crazy',\n 'damp',\n 'giant',\n 'secure',\n 'bottom',\n 'skilled',\n 'subtle',\n 'elegant',\n 'brave',\n 'lesser',\n 'parallel',\n 'steep',\n 'intensive',\n 'casual',\n 'tropical',\n 'lonely',\n 'partial',\n 'preliminary',\n 'concrete',\n 'alleged',\n 'assistant',\n 'vertical',\n 'upset',\n 'delicate',\n 'mild',\n 'occupational',\n 'excessive',\n 'progressive',\n 'exceptional',\n 'integrated',\n 'striking',\n 'continental',\n 'okay',\n 'harsh',\n 'combined',\n 'fierce',\n 'handsome',\n 'characteristic',\n 'chronic',\n 'compulsory',\n 'interim',\n 'objective',\n 'splendid',\n 'magic',\n 'systematic',\n 'obliged',\n 'payable',\n 'fun',\n 'horrible',\n 'primitive',\n 'fascinating',\n 'ideological',\n 'metropolitan',\n 'surrounding',\n 'estimated',\n 'peaceful',\n 'premier',\n 'operational',\n 'technological',\n 'kind',\n 'advisory',\n 'hostile',\n 'precious',\n 'accessible',\n 'determined',\n 'excited',\n 'impressed',\n 'provincial',\n 'smart',\n 'endless',\n 'isolated',\n 'drunk',\n 'geographical',\n 'like',\n 'dynamic',\n 'boring',\n 'forthcoming',\n 'unfortunate',\n 'definite',\n 'super',\n 'notable',\n 'indirect',\n 'stiff',\n 'wealthy',\n 'awkward',\n 'lively',\n 'neutral',\n 'artistic',\n 'content',\n 'mature',\n 'colonial',\n 'ambitious',\n 'evil',\n 'magnetic',\n 'verbal',\n 'legitimate',\n 'sympathetic',\n 'empirical',\n 'head',\n 'shallow',\n 'vague',\n 'naval',\n 'depressed',\n 'shared',\n 'added',\n 'shocked',\n 'mid',\n 'worthwhile',\n 'qualified',\n 'missing',\n 'blank',\n 'absent',\n 'favourable',\n 'polish',\n 'israeli',\n 'developed',\n 'profound',\n 'representative',\n 'enthusiastic',\n 'dreadful',\n 'rigid',\n 'reduced',\n 'cruel',\n 'coastal',\n 'peculiar',\n 'swiss',\n 'crude',\n 'extended',\n 'selected',\n 'eager',\n 'canadian',\n 'bold',\n 'relaxed',\n 'corresponding',\n 'running',\n 'planned',\n 'applicable',\n 'immense',\n 'allied',\n 'comparative',\n 'uncomfortable',\n 'conservation',\n 'productive',\n 'beneficial',\n 'bored',\n 'charming',\n 'minimal',\n 'mobile',\n 'turkish',\n 'orange',\n 'rear',\n 'passive',\n 'suspicious',\n 'overwhelming',\n 'fatal',\n 'resulting',\n 'symbolic',\n 'registered',\n 'neighbouring',\n 'calm',\n 'irrelevant',\n 'patient',\n 'compact',\n 'profitable',\n 'rival',\n 'loyal',\n 'moderate',\n 'distinguished',\n 'interior',\n 'noble',\n 'insufficient',\n 'eligible',\n 'mysterious',\n 'varying',\n 'managerial',\n 'molecular',\n 'olympic',\n 'linear',\n 'prospective',\n 'printed',\n 'parental',\n 'diverse',\n 'elaborate',\n 'furious',\n 'fiscal',\n 'burning',\n 'useless',\n 'semantic',\n 'embarrassed',\n 'inherent',\n 'philosophical',\n 'deliberate',\n 'awake',\n 'variable',\n 'promising',\n 'unpleasant',\n 'varied',\n 'sacred',\n 'selective',\n 'inclined',\n 'tender',\n 'hidden',\n 'worthy',\n 'intermediate',\n 'sound',\n 'protective',\n 'fortunate',\n 'slim',\n 'defensive',\n 'divine',\n 'stuck',\n 'driving',\n 'invisible',\n 'misleading',\n 'circular',\n 'mathematical',\n 'inappropriate',\n 'liquid',\n 'persistent',\n 'solar',\n 'doubtful',\n 'manual',\n 'architectural',\n 'intact',\n 'incredible',\n 'devoted',\n 'prior',\n 'tragic',\n 'respectable',\n 'optimistic',\n 'convincing',\n 'unacceptable',\n 'decisive',\n 'competent',\n 'spatial',\n 'respective',\n 'binding',\n 'relieved',\n 'nursing',\n 'toxic',\n 'select',\n 'redundant',\n 'integral',\n 'then',\n 'probable',\n 'amateur',\n 'fond',\n 'passing',\n 'specified',\n 'territorial',\n 'horizontal',\n 'inland',\n 'cognitive',\n 'regulatory',\n 'miserable',\n 'resident',\n 'polite',\n 'scared',\n 'gothic',\n 'civilian',\n 'instant',\n 'lengthy',\n 'adverse',\n 'korean',\n 'unconscious',\n 'anonymous',\n 'aesthetic',\n 'orthodox',\n 'static',\n 'unaware',\n 'costly',\n 'fantastic',\n 'foolish',\n 'fashionable',\n 'causal',\n 'compatible',\n 'wee',\n 'implicit',\n 'dual',\n 'ok',\n 'cheerful',\n 'subjective',\n 'forward',\n 'surviving',\n 'exotic',\n 'purple',\n 'cautious',\n 'visiting',\n 'aggregate',\n 'ethical',\n 'teenage',\n 'dying',\n 'disastrous',\n 'delicious',\n 'confidential',\n 'underground',\n 'thorough',\n 'grim',\n 'autonomous',\n 'atomic',\n 'frozen',\n 'colourful',\n 'injured',\n 'uniform',\n 'ashamed',\n 'glorious',\n 'wicked',\n 'coherent',\n 'rising',\n 'shy',\n 'novel',\n 'balanced',\n 'delightful',\n 'arbitrary',\n 'adjacent',\n 'worrying',\n 'weird',\n 'unchanged',\n 'rolling',\n 'evolutionary',\n 'intimate',\n 'sporting',\n 'disciplinary',\n 'formidable',\n 'lexical',\n 'noisy',\n 'gradual',\n 'accused',\n 'homeless',\n 'supporting',\n 'coming',\n 'renewed',\n 'excess',\n 'retired',\n 'rubber',\n 'chosen',\n 'outdoor',\n 'embarrassing',\n 'preferred',\n 'bizarre',\n 'appalling',\n 'agreed',\n 'imaginative',\n 'governing',\n 'accepted',\n 'vocational',\n 'mighty',\n 'puzzled',\n 'worldwide',\n 'organisational',\n 'sunny',\n 'eldest',\n 'eventual',\n 'spontaneous',\n 'vivid',\n 'rude',\n 'faithful',\n 'ministerial',\n 'innovative',\n 'controlled',\n 'conceptual',\n 'unwilling',\n 'civic',\n 'meaningful',\n 'alive',\n 'brainy',\n 'breakable',\n 'busy',\n 'careful',\n 'cautious',\n 'clever',\n 'concerned',\n 'crazy',\n 'curious',\n 'dead',\n 'different',\n 'difficult',\n 'doubtful',\n 'easy',\n 'famous',\n 'fragile',\n 'helpful',\n 'helpless',\n 'important',\n 'impossible',\n 'innocent',\n 'inquisitive',\n 'modern',\n 'open',\n 'outstanding',\n 'poor',\n 'powerful',\n 'puzzled',\n 'real',\n 'rich',\n 'shy',\n 'sleepy',\n 'super',\n 'tame',\n 'uninterested',\n 'wandering',\n 'wild',\n 'wrong',\n 'adorable',\n 'alert',\n 'average',\n 'beautiful',\n 'blonde',\n 'bloody',\n 'blushing',\n 'bright',\n 'clean',\n 'clear',\n 'cloudy',\n 'colorful',\n 'crowded',\n 'cute',\n 'dark',\n 'drab',\n 'distinct',\n 'dull',\n 'elegant',\n 'fancy',\n 'filthy',\n 'glamorous',\n 'gleaming',\n 'graceful',\n 'grotesque',\n 'homely',\n 'light',\n 'misty',\n 'motionless',\n 'muddy',\n 'plain',\n 'poised',\n 'quaint',\n 'shiny',\n 'smoggy',\n 'sparkling',\n 'spotless',\n 'stormy',\n 'strange',\n 'ugly',\n 'unsightly',\n 'unusual',\n 'bad',\n 'better',\n 'beautiful',\n 'big',\n 'black',\n 'blue',\n 'bright',\n 'clumsy',\n 'crazy',\n 'dizzy',\n 'dull',\n 'fat',\n 'frail',\n 'friendly',\n 'funny',\n 'great',\n 'green',\n 'gigantic',\n 'gorgeous',\n 'grumpy',\n 'handsome',\n 'happy',\n 'horrible',\n 'itchy',\n 'jittery',\n 'jolly',\n 'kind',\n 'long',\n 'lazy',\n 'magnificent',\n 'magenta',\n 'many',\n 'mighty',\n 'mushy',\n 'nasty',\n 'new',\n 'nice',\n 'nosy',\n 'nutty',\n 'nutritious',\n 'odd',\n 'orange',\n 'ordinary',\n 'pretty',\n 'precious',\n 'prickly',\n 'purple',\n 'quaint',\n 'quiet',\n 'quick',\n 'quickest',\n 'rainy',\n 'rare',\n 'ratty',\n 'red',\n 'roasted',\n 'robust',\n 'round',\n 'sad',\n 'scary',\n 'scrawny',\n 'short',\n 'silly',\n 'stingy',\n 'strange',\n 'striped',\n 'spotty',\n 'tart',\n 'tall',\n 'tame',\n 'tan',\n 'tender',\n 'testy',\n 'tricky',\n 'tough',\n 'ugly',\n 'ugliest',\n 'vast',\n 'watery',\n 'wasteful',\n 'wonderful',\n 'yellow',\n 'yummy',\n 'zany',\n];\n\nexport default {\n gunOnceDefined,\n async getHash (data: any, format = `base64`) {\n if (data === undefined) {\n throw new Error('getHash data was undefined');\n }\n if (typeof data !== 'string') {\n data = JSON.stringify(data);\n }\n\n const encoder = new TextEncoder();\n data = encoder.encode(data);\n const buffer = await crypto.subtle.digest('SHA-256', data);\n\n if (format === 'buffer') {\n return buffer;\n }\n\n const hash = this.arrayBufferToBase64(buffer);\n if (format === `hex`) {\n return this.base64ToHex(hash);\n }\n return hash;\n },\n\n capitalize(s: string) {\n return s.charAt(0).toUpperCase() + s.slice(1)\n },\n\n generateName() {\n return `${this.capitalize(_.sample(adjectives)!)} ${this.capitalize(_.sample(animals)!)}`;\n },\n\n base64ToHex(str: string) {\n const raw = atob(str);\n let result = '';\n for (let i = 0; i < raw.length; i++) {\n const hex = raw.charCodeAt(i).toString(16);\n result += (hex.length === 2 ? hex : `0${ hex}`);\n }\n return result;\n },\n\n arrayBufferToBase64( buffer ) {\n var binary = '';\n var bytes = new Uint8Array( buffer );\n var len = bytes.byteLength;\n for (var i = 0; i < len; i++) {\n binary += String.fromCharCode( bytes[ i ] );\n }\n return window.btoa( binary );\n },\n\n getCaret(el: HTMLInputElement) {\n if (el.selectionStart) {\n return el.selectionStart;\n } else { // @ts-ignore\n if (document.selection) {\n el.focus();\n // @ts-ignore\n const r = document.selection.createRange();\n if (r === null) {\n return 0;\n }\n // @ts-ignore\n const re = el.createTextRange(), rc = re.duplicate();\n re.moveToBookmark(r.getBookmark());\n rc.setEndPoint('EndToStart', re);\n return rc.text.length;\n }\n }\n return 0;\n },\n\n getUrlParameter(sParam: string, sParams: string) {\n const sPageURL = sParams || window.location.search.substring(1);\n const sURLVariables = sPageURL.split('&');\n let sParameterName, i;\n\n for (i = 0; i < sURLVariables.length; i++) {\n sParameterName = sURLVariables[i].split('=');\n if (sParameterName[0] === sParam) {\n return sParameterName[1] === undefined ? true : decodeURIComponent(sParameterName[1]);\n }\n }\n return;\n },\n\n formatTime(date: Date) {\n // @ts-ignore\n const t: any = date.toLocaleTimeString(undefined, {timeStyle: 'short'});\n const s = t.split(':');\n if (s.length === 3) { // safari tries to display seconds\n return `${s[0] }:${ s[1] }${s[2].slice(2)}`;\n }\n return t;\n },\n\n formatDate(date: Date) {\n const t = date.toLocaleString(undefined, {dateStyle: 'short', timeStyle: 'short'});\n const s = t.split(':');\n if (s.length === 3) { // safari tries to display seconds\n return `${s[0] }:${ s[1] }${s[2].slice(2)}`;\n }\n return t;\n },\n\n getDaySeparatorText(date: Date, dateStr: string, now?: Date, nowStr?: string) {\n if (!now) {\n now = new Date();\n // @ts-ignore\n nowStr = now.toLocaleDateString({dateStyle: 'short'});\n }\n if (dateStr === nowStr) {\n return 'today';\n }\n const dayDifference = Math.round((now - date) / (1000 * 60 * 60 * 24));\n if (dayDifference === 0) {\n return 'today';\n }\n if (dayDifference === 1) {\n return 'yesterday';\n }\n if (dayDifference <= 5) {\n return date.toLocaleDateString(undefined, {weekday: 'long'});\n }\n return dateStr;\n },\n\n getProfileLink(pub: string) {\n return `${window.location.origin}/#/profile/${encodeURIComponent(pub)}`;\n },\n\n truncateString(s: string, length = 30) {\n return s.length > length ? `${s.slice(0, length)}...` : s;\n },\n\n createElement(type: string, cls?: string, parent?: HTMLElement) {\n const el = document.createElement(type);\n if (cls) {\n el.setAttribute('class', cls);\n }\n if (parent) {\n parent.appendChild(el);\n }\n return el;\n },\n\n isNode,\n isElectron,\n isMobile,\n\n throttle: (func: Function, limit: number) => {\n let inThrottle: boolean;\n return function() {\n const args = arguments;\n const context = this;\n if (!inThrottle) {\n func.apply(context, args);\n inThrottle = true;\n setTimeout(() => inThrottle = false, limit);\n }\n };\n },\n debounce: (func: Function, delay: number) => {\n let inDebounce: boolean;\n return function() {\n const context = this;\n const args = arguments;\n clearTimeout(inDebounce);\n inDebounce = setTimeout(() => func.apply(context, args), delay);\n };\n },\n sample: (arr: any[]) => arr[Math.floor(Math.random() * arr.length)],\n sampleSize: (arr: any[], size: number) => {\n const shuffled = arr.slice(0);\n let i = arr.length;\n let min = i - size;\n let temp;\n let index;\n while (i-- > min) {\n index = Math.floor((i + 1) * Math.random());\n temp = shuffled[index];\n shuffled[index] = shuffled[i];\n shuffled[i] = temp;\n }\n return shuffled.slice(min);\n },\n defer: (func: Function) => setTimeout(func, 0),\n once: (func: Function) => {\n let called = false;\n return function() {\n if (called) {\n return;\n }\n called = true;\n func.apply(this, arguments);\n };\n },\n omit: (obj: any, keys: string[]) => {\n const newObj = {};\n Object.keys(obj).forEach(key => {\n if (!keys.includes(key)) {\n newObj[key] = obj[key];\n }\n });\n return newObj;\n }\n};\n","/*eslint no-useless-escape: \"off\", camelcase: \"off\" */\n\nimport util from './util';\n// eslint-disable-line no-unused-vars\n\nlet myKey: any;\n\nexport default {\n async getActiveKey(datadir = `.`, keyfile = `iris.key`, fs?: any) {\n if (myKey) {\n return myKey;\n }\n if (fs) {\n const privKeyFile = `${datadir}/${keyfile}`;\n if (fs.existsSync(privKeyFile)) {\n const f = fs.readFileSync(privKeyFile, `utf8`);\n myKey = this.fromString(f);\n } else {\n const newKey = await this.generate();\n myKey = myKey || newKey; // eslint-disable-line require-atomic-updates\n fs.writeFileSync(privKeyFile, this.toString(myKey));\n fs.chmodSync(privKeyFile, 400);\n }\n if (!myKey) {\n throw new Error(`loading default key failed - check ${datadir}/${keyfile}`);\n }\n } else {\n const str = window.localStorage.getItem(`iris.myKey`);\n if (str) {\n myKey = this.fromString(str);\n } else {\n const newKey = await this.generate();\n myKey = myKey || newKey; // eslint-disable-line require-atomic-updates\n window.localStorage.setItem(`iris.myKey`, this.toString(myKey));\n }\n if (!myKey) {\n throw new Error(`loading default key failed - check localStorage iris.myKey`);\n }\n }\n return myKey;\n },\n\n getDefault(datadir = `.`, keyfile = `iris.key`) {\n return this.getActiveKey(datadir, keyfile);\n },\n\n async getActivePub(datadir = `.`, keyfile = `iris.key`) {\n const key = await this.getActiveKey(datadir, keyfile);\n return key.pub;\n },\n\n setActiveKey(key: any, save = true, datadir = `.`, keyfile = `iris.key`, fs: any) {\n myKey = key;\n if (!save) return;\n if (util.isNode) {\n const privKeyFile = `${datadir}/${keyfile}`;\n fs.writeFileSync(privKeyFile, this.toString(myKey));\n fs.chmodSync(privKeyFile, 400);\n } else {\n window.localStorage.setItem(`iris.myKey`, this.toString(myKey));\n }\n },\n\n toString(key: any) {\n return JSON.stringify(key);\n },\n\n getId(key: any) {\n if (!(key && key.pub)) {\n throw new Error(`missing param`);\n }\n return key.pub; // hack until GUN supports lookups by keyID\n //return util.getHash(key.pub);\n },\n\n fromString(str: string) {\n return JSON.parse(str);\n },\n\n // copied from Gun.SEA\n async generate() {\n try {\n var ecdhSubtle = window.crypto.subtle;\n // First: ECDSA keys for signing/verifying...\n var sa = await ecdhSubtle.generateKey({name: 'ECDSA', namedCurve: 'P-256'}, true, ['sign', 'verify'])\n .then(async (keys) => {\n // privateKey scope doesn't leak out from here!\n //const { d: priv } = await shim.subtle.exportKey('jwk', keys.privateKey)\n var key: any = {};\n key.priv = (await ecdhSubtle.exportKey('jwk', keys.privateKey)).d;\n var pub = await ecdhSubtle.exportKey('jwk', keys.publicKey);\n //const pub = Buff.from([ x, y ].join(':')).toString('base64') // old\n key.pub = pub.x + '.' + pub.y; // new\n // x and y are already base64\n // pub is UTF8 but filename/URL safe (https://www.ietf.org/rfc/rfc3986.txt)\n // but split on a non-base64 letter.\n return key;\n })\n\n // To include PGPv4 kind of keyId:\n // const pubId = await SEA.keyid(keys.pub)\n // Next: ECDH keys for encryption/decryption...\n\n try {\n var dh = await ecdhSubtle.generateKey({name: 'ECDH', namedCurve: 'P-256'}, true, ['deriveKey'])\n .then(async (keys) => {\n // privateKey scope doesn't leak out from here!\n var key: any = {};\n key.epriv = (await ecdhSubtle.exportKey('jwk', keys.privateKey)).d;\n var pub = await ecdhSubtle.exportKey('jwk', keys.publicKey);\n //const epub = Buff.from([ ex, ey ].join(':')).toString('base64') // old\n key.epub = pub.x + '.' + pub.y; // new\n // ex and ey are already base64\n // epub is UTF8 but filename/URL safe (https://www.ietf.org/rfc/rfc3986.txt)\n // but split on a non-base64 letter.\n return key;\n })\n } catch (e) {\n if (e == 'Error: ECDH is not a supported algorithm') {\n console.log('Ignoring ECDH...')\n } else {\n throw e\n }\n }\n dh = dh || {};\n\n var r = {pub: sa.pub, priv: sa.priv, /* pubId, */ epub: dh.epub, epriv: dh.epriv}\n return r;\n } catch (e) {\n console.log(e);\n throw e;\n return;\n }\n },\n\n keyToJwk(key: any): JsonWebKey {\n if (typeof key === 'string') {\n key = { pub: key };\n }\n const jwk: JsonWebKey = {\n kty: 'EC',\n crv: 'P-256',\n x: key.pub.split('.')[0],\n y: key.pub.split('.')[1],\n ext: true,\n };\n jwk.key_ops = key.priv ? ['sign'] : ['verify'];\n if (key.priv) {\n jwk.d = key.priv\n }\n return jwk;\n },\n\n async sign(data: any, pair: any, cb?: Function, opt: any = {}) {\n if(undefined === data){ throw '`undefined` not allowed.' }\n const text = typeof data === 'string' ? data : JSON.stringify(data); // Gun.SEA doesn't preserve data type: \"0\" -> 0. Should we change this?\n var jwk = this.keyToJwk(pair);\n var hash = await util.getHash(text, 'buffer') as Buffer;\n var sig = await window.crypto.subtle.importKey('jwk', jwk, {name: 'ECDSA', namedCurve: 'P-256'}, false, ['sign'])\n .then((key) =>\n window.crypto.subtle.sign({name: 'ECDSA', hash: {name: 'SHA-256'}}, key, hash)\n ) // privateKey scope doesn't leak out from here!\n var r: any = {m: text, s: Buffer.from(sig).toString(opt.encode || 'base64')}\n if(!opt.raw){ r = 'aSEA' + JSON.stringify(r) } // \"aSEA\" was a dumb fix for an earlier bug in Gun.SEA\n\n if(cb){ try{ cb(r) }catch(e){console.log(e)} }\n return r;\n },\n\n async verify(data: any, pair: any, cb?: Function, opt: any = {}) {\n try {\n if (typeof data === 'string') {\n if (data.slice(0, 4) === 'aSEA') {\n data = data.slice(4)\n }\n try {\n data = JSON.parse(data);\n } catch (e) {\n // not JSON\n }\n }\n var pub = pair.pub || pair;\n var jwk = this.keyToJwk(pub);\n var key = await crypto.subtle.importKey('jwk', jwk, {name: 'ECDSA', namedCurve: 'P-256'}, false, ['verify']);\n\n let text = data.m;\n try {\n text = JSON.parse(text);\n } catch (e) {\n // ignore\n }\n\n let hash = await util.getHash(text, 'buffer') as Buffer;\n var buf, sig, isValid;\n buf = Buffer.from(data.s, opt.encode || 'base64');\n sig = new Uint8Array(buf);\n isValid = await crypto.subtle.verify({name: 'ECDSA', hash: {name: 'SHA-256'}}, key, sig, hash);\n var r = isValid? JSON.parse(text) : undefined;\n if (r === undefined) {\n //console.log('invalid', data, pair, hash);\n }\n\n if(cb){ try{ cb(r) }catch(e){console.log(e)} }\n return r;\n } catch (e) {\n console.log(e);\n return undefined;\n }\n },\n\n async secret(key: any, pair: any) {\n var keysToEcdhJwk = (pub: any, d?: any): any => { // d === priv\n //var [ x, y ] = shim.Buffer.from(pub, 'base64').toString('utf8').split(':') // old\n var [ x, y ] = pub.split('.') // new\n const jwk: JsonWebKey = Object.assign(\n d ? { d } : {},\n { x: x, y: y, kty: 'EC', crv: 'P-256', ext: true }\n );\n return jwk;\n }\n\n var pub = key.epub || key;\n var epub = pair.epub;\n var epriv = pair.epriv;\n var pubJwk = keysToEcdhJwk(pub);\n var props = Object.assign({\n public: await crypto.subtle.importKey('jwk', pubJwk, {name: 'ECDH', namedCurve: 'P-256'}, true, [])\n },{name: 'ECDH', namedCurve: 'P-256'});\n var privJwk = keysToEcdhJwk(epub, epriv);\n return crypto.subtle.importKey('jwk', privJwk, {name: 'ECDH', namedCurve: 'P-256'}, false, ['deriveBits'])\n .then(async (privKey) => {\n var derivedBits = await crypto.subtle.deriveBits(props, privKey, 256);\n var rawBits = new Uint8Array(derivedBits);\n var derivedKey = await crypto.subtle.importKey('raw', rawBits,{ name: 'AES-GCM', length: 256 }, true, [ 'encrypt', 'decrypt' ]);\n return crypto.subtle.exportKey('jwk', derivedKey).then(({ k }) => k);\n });\n },\n\n async aeskey(key: any, salt?: Buffer) {\n const combo = key + (salt || this.random(8)).toString('utf8'); // new\n let hash: any = await crypto.subtle.digest({name: 'SHA-256'}, new TextEncoder().encode(combo));\n hash = Buffer.from(hash, 'binary');\n\n const keyB64 = hash.toString('base64');\n const k = keyB64.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/\\=/g, '');\n\n const jwkKey = { kty: 'oct', k: k, ext: false, alg: 'A256GCM' };\n return await crypto.subtle.importKey('jwk', jwkKey, {name:'AES-GCM'}, false, ['encrypt', 'decrypt'])\n },\n\n random(len: number) {\n return Buffer.from(crypto.getRandomValues(new Uint8Array(len)));\n },\n\n async encrypt(data: any, pair: any, cb?: Function, opt: any = {}) {\n var key = pair.epriv || pair;\n if(undefined === data){ throw '`undefined` not allowed.' }\n var msg = (typeof data == 'string')? data : JSON.stringify(data); // Gun.SEA doesn't preserve data type: \"0\" -> 0. Should we change this?\n var rand = {s: this.random(9), iv: this.random(15)}; // consider making this 9 and 15 or 18 or 12 to reduce == padding.\n var ct = await this.aeskey(key, rand.s).then((aes) => crypto.subtle.encrypt({ // Keeping the AES key scope as private as possible...\n name: opt.name || 'AES-GCM', iv: new Uint8Array(rand.iv)\n }, aes, new TextEncoder().encode(msg)));\n var r: any = {\n // @ts-ignore\n ct: Buffer.from(ct, 'binary').toString(opt.encode || 'base64'),\n iv: rand.iv.toString(opt.encode || 'base64'),\n s: rand.s.toString(opt.encode || 'base64')\n }\n if(!opt.raw){ r = 'SEA' + JSON.stringify(r) }\n\n if(cb){ try{ cb(r) }catch(e){console.log(e)} }\n return r;\n },\n\n async decrypt(data: any, pair: any, cb?: Function, opt: any = {}) {\n var key = pair.epriv || pair;\n let json;\n try { data = JSON.parse(data); } catch (e) {}\n if (data.indexOf('SEA{') === 0) {\n json = JSON.parse(data.slice(3));\n } else {\n json = JSON.parse(data);\n }\n if (!json.ct || !json.iv || !json.s) {\n throw 'Invalid ciphertext ' + json;\n }\n var buf: Buffer, bufiv: Buffer, bufct: Buffer;\n buf = Buffer.from(json.s, opt.encode || 'base64');\n bufiv = Buffer.from(json.iv, opt.encode || 'base64');\n bufct = Buffer.from(json.ct, opt.encode || 'base64');\n var ct = await this.aeskey(key, buf).then((aes) => crypto.subtle.decrypt({ // Keeping aesKey scope as private as possible...\n name: opt.name || 'AES-GCM', iv: new Uint8Array(bufiv), tagLength: 128\n }, aes, new Uint8Array(bufct)));\n const text = new TextDecoder('utf8').decode(ct);\n var r = text;\n try { r = JSON.parse(text); } catch (_e) {}\n if(cb){ try{ cb(r) }catch(e){console.log(e)} }\n return r;\n }\n}","import session from './session';\nimport _ from './lodash';\nimport util from './util';\nimport publicState from './global';\nimport Key from './Key';\n\nconst ELECTRON_GUN_URL = 'http://localhost:8767/gun';\nlet maxConnectedPeers = 1;\n\ntype Peer = {\n url?: string;\n enabled?: boolean;\n from?: string;\n visibility?: string;\n}\n\ntype Peers = {\n [key: string]: Peer\n}\n\nconst DEFAULT_PEERS: Peers = {\n 'wss://gun-rs.iris.to/gun': {},\n// 'wss://gun-us.herokuapp.com/gun': {},\n};\n\nif (self.window) {\n const loc = window.location;\n const host = loc.host;\n const is_localhost_but_not_dev = host.startsWith('localhost') && host !== 'localhost:8080';\n if (loc.hostname.endsWith('herokuapp.com') || is_localhost_but_not_dev) {\n Object.keys(DEFAULT_PEERS).forEach(url => DEFAULT_PEERS[url].enabled = false);\n DEFAULT_PEERS[`${loc.origin}/gun`] = {enabled: true};\n }\n}\n\n/**\n * Networking and peer management utilities\n */\nexport default {\n known: {} as Peers,\n\n /** */\n async add(peer: Peer) {\n if (peer.from) {\n Object.keys(this.known).forEach(k => {\n if (this.known[k].from === peer.from) { // remove previous peer url from the same user\n delete this.known[k];\n }\n });\n }\n const url = peer.url || '';\n this.known[url] = this.known[url] || _.omit(peer, ['url']);\n if (peer.visibility === 'public') {\n // rolling some crypto operations to obfuscate actual url in case we want to remove it\n let secret = await Key.secret(session.getKey().epub, session.getKey()) || '';\n let encryptedUrl = await Key.encrypt(peer.url, secret);\n let encryptedUrlHash = await util.getHash(encryptedUrl);\n publicState().user().get('peers').get(encryptedUrlHash).put({url: peer.url, lastSeen: new Date().toISOString()});\n }\n if (peer.enabled !== false) {\n peer.url && this.connect(peer.url); // this calls savePeers()\n } else {\n this.save();\n }\n },\n\n /** */\n remove(url: string) {\n delete this.known[url];\n this.save();\n },\n\n /** */\n disconnect(peerFromGun: any) {\n publicState().on('bye', peerFromGun);\n peerFromGun.url = '';\n },\n\n save() {\n // TODO store them in iris.local() instead of localStorage\n localStorage.setItem('gunPeers', JSON.stringify(this.known));\n },\n\n getSaved() {\n let p: any = localStorage.getItem('gunPeers');\n if (p && p !== 'undefined') {\n p = JSON.parse(p);\n } else {\n p = DEFAULT_PEERS;\n }\n if (util.isElectron) {\n p[ELECTRON_GUN_URL] = {};\n }\n Object.keys(p).forEach(k => _.defaults(p[k], {enabled: true}));\n return p;\n },\n\n /** */\n reset() {\n localStorage.setItem('gunPeers', '');\n this.known = this.getSaved();\n },\n\n /** */\n connect(url: string) {\n if (!url) {\n return;\n }\n if (this.isMixedContent(url)) { return; }\n if (this.known[url]) {\n this.known[url].enabled = true;\n publicState().opt({peers: [url]});\n this.save();\n } else {\n this.add({url});\n }\n },\n\n /** */\n disable(url: string, peerFromGun: any) {\n this.known[url].enabled = false;\n if (peerFromGun) {\n this.disconnect(peerFromGun);\n }\n this.save();\n },\n\n isMixedContent(url: string) {\n if (!url) { return false; }\n return window.location.protocol === 'https:' && (url.indexOf('http:') === 0);\n },\n\n random() {\n const connectToLocalElectron = util.isElectron && this.known[ELECTRON_GUN_URL] && this.known[ELECTRON_GUN_URL].enabled !== false;\n const sampleSize = connectToLocalElectron ? Math.max(maxConnectedPeers - 1, 1) : maxConnectedPeers;\n const sample = _.sampleSize(\n Object.keys(\n _.pickBy(this.known, (peer: any, url: string) => {\n return !this.isMixedContent(url) && peer.enabled && !(util.isElectron && url === ELECTRON_GUN_URL);\n })\n ), sampleSize\n );\n if (sample && connectToLocalElectron) {\n sample.push(ELECTRON_GUN_URL);\n }\n console.log('sample', sample, JSON.stringify(this.known));\n return sample;\n },\n\n checkGunPeerCount() {\n return;\n let peersFromGun = publicState().back('opt.peers');\n let connectedPeers = Object.values(peersFromGun).filter((peer: any) => {\n if (peer && peer.wire && peer.wire.constructor.name !== 'WebSocket') {\n console.log('WebRTC peer', peer);\n }\n return peer && peer.wire && peer.wire.readyState === 1 && peer.wire.bufferedAmount === 0 && peer.wire.constructor.name === 'WebSocket';\n });\n if (connectedPeers.length < maxConnectedPeers) {\n let unconnectedPeers = Object.keys(this.known).filter(url => {\n let addedToGun = Object.values(peersFromGun).map((peer:any) => peer.url).indexOf(url) > -1;\n let enabled = this.known[url].enabled;\n const mixedContent = (window.location.protocol === 'https:' && (url.indexOf('http:') === 0));\n return !mixedContent && enabled && !addedToGun;\n });\n if (unconnectedPeers.length) {\n const sample = String(_.sample(unconnectedPeers));\n this.connect(sample);\n }\n }\n if (connectedPeers.length > maxConnectedPeers) {\n this.disconnect(_.sample(connectedPeers));\n }\n },\n\n init() {\n this.known = this.getSaved();\n /* use the default value of 1 for now because of memory issue\n local().get('settings').get('maxConnectedPeers').on(n => {\n if (n !== undefined) maxConnectedPeers = n;\n });\n */\n setInterval(() => this.checkGunPeerCount(), 1000);\n }\n};\n","import {Message} from './Message';\n\nexport function generateUuid() {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\n const r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8);\n return v.toString(16);\n });\n}\n\nexport class Actor {\n id: string;\n\n handle(_message: Message) {\n throw new Error('not implemented');\n }\n\n // so we can support a similar api as Channels\n postMessage(message: Message) {\n this.handle(message);\n }\n\n constructor(id = generateUuid()) {\n this.id = id;\n }\n}","import {Actor} from './Actor';\nimport {Children} from \"./Node\";\nimport Key from \"../Key\";\n\nexport class Message {\n // When Messages are sent over BroadcastChannel, class name is lost.\n static fromObject(obj: any): Message {\n if (obj.type === 'get') {\n return Get.fromObject(obj);\n } else if (obj.type === 'put') {\n return Put.fromObject(obj);\n } else {\n throw new Error('not implemented');\n }\n }\n\n static async deserialize(str: string, from: Actor): Promise {\n const obj = JSON.parse(str);\n if (obj.get) {\n return Get.deserialize(obj, str, from);\n } else if (obj.put) {\n return Put.deserialize(obj, str, from);\n } else if (obj.dam && obj.dam === \"hi\") {\n return Hi.deserialize(obj);\n } else {\n throw new Error('unknown message type');\n }\n }\n\n serialize(): string {\n throw new Error('not implemented');\n }\n}\n\nfunction generateMsgId(): string {\n return Math.random().toString(36).slice(2, 10);\n}\n\nexport class Get implements Message {\n type: string = 'get';\n id: string;\n nodeId: string;\n from: Actor;\n recipients?: string[];\n childKey?: string;\n jsonStr?: string;\n checksum?: string;\n\n serialize(): string {\n if (this.jsonStr) {\n return this.jsonStr;\n }\n\n // TODO remove \"global/\", replace /^user\\// with ~\n let nodeId = this.nodeId.replace(/^global\\//, '').replace(/^user\\//, '~');\n const obj: any = {\n \"#\": this.id,\n get: {\n \"#\": nodeId,\n \".\": this.childKey\n },\n };\n\n if (this.childKey) {\n obj.get['.'] = this.childKey;\n }\n this.jsonStr = JSON.stringify(obj);\n return this.jsonStr;\n }\n\n static async deserialize(obj: any, jsonStr: string, from: Actor): Promise {\n const id = obj['#'];\n let nodeId = obj.get['#']; // TODO add \"global/\" prefix, replace /^~/ with \"user/\"\n if (nodeId.startsWith('~')) {\n nodeId = 'user/' + nodeId.slice(1);\n }\n nodeId = 'global/' + nodeId;\n const childKey = obj.get['.'];\n return new Get(id, nodeId, from, undefined, childKey, jsonStr);\n }\n\n static fromObject(obj: any): Get {\n return new Get(obj.id, obj.nodeId, obj.from, obj.recipients, obj.childKey, obj.jsonStr, obj.checksum);\n }\n\n static new(nodeId: string, from: Actor, recipients?: string[], childKey?: string, jsonStr?: string, checksum?: string): Get {\n const id = generateMsgId();\n return new Get(id, nodeId, from, recipients, childKey, jsonStr, checksum);\n }\n\n constructor(id: string, nodeId: string, from: Actor, recipients?: string[], childKey?: string, jsonStr?: string, checksum?: string) {\n this.id = id;\n this.from = from;\n this.nodeId = nodeId;\n this.recipients = recipients;\n this.childKey = childKey;\n this.jsonStr = jsonStr;\n this.checksum = checksum;\n }\n}\n\nexport type UpdatedNodes = {\n [key: string]: Children;\n};\n\nexport class Put implements Message {\n type: string = 'put';\n id: string;\n from: Actor;\n updatedNodes: UpdatedNodes;\n inResponseTo?: string;\n recipients?: string[];\n jsonStr?: string;\n checksum?: string;\n\n serialize(): string {\n const obj = {\n \"#\" : this.id,\n \"put\": {} as any\n };\n\n // iterate over this.updatedNodes\n for (const [nodeId, children] of Object.entries(this.updatedNodes)) {\n let myNodeId = nodeId.replace(/^global\\//, '').replace(/^user\\//, '~');\n const node: any = obj.put[myNodeId] = {};\n for (const [childKey, childValue] of Object.entries(children)) {\n if (!childValue) {\n continue;\n }\n const data = childValue;\n node[childKey] = data.value;\n node[\"_\"] = node[\"_\"] || {};\n node[\"_\"][\">\"] = node[\"_\"][\">\"] || {};\n node[\"_\"][\">\"][childKey] = data.updatedAt;\n }\n }\n return JSON.stringify(obj);\n }\n\n static async deserialize(obj: any, jsonStr: string, from: Actor): Promise {\n const id = obj['#'];\n const updatedNodes: UpdatedNodes = {};\n type SerializedChildren = {\n [key: string]: any;\n }\n for (const [nodeId, c] of Object.entries(obj.put)) {\n const children = c as SerializedChildren;\n const node: any = {};\n const isUserSpace = nodeId.startsWith('~');\n for (const [childKey, childValue] of Object.entries(children)) {\n if (childKey === '_') {\n continue;\n }\n if (isUserSpace) {\n const user = nodeId.split('/')[0].slice(1);\n const signatureObj = JSON.parse(childValue);\n const timestamp = children['_']['>'][childKey];\n const value = signatureObj[':'];\n const signedObj = {\n \"#\": nodeId,\n \".\": childKey,\n \":\": value,\n \">\": timestamp\n };\n const signature = signatureObj['~'];\n const signedStr = JSON.stringify(signedObj);\n if (await Key.verify({s: signature, m: signedStr}, user) === undefined) {\n throw new Error(`invalid signature in ${nodeId} of ${signedStr}`);\n }\n }\n // TODO test hash space validity\n const updatedAt = children['_']['>'][childKey];\n node[childKey] = {\n value: childValue,\n updatedAt,\n };\n }\n const myNodeId = 'global/' + nodeId.replace(/^~/, 'user/');\n updatedNodes[myNodeId] = node;\n }\n return new Put(id, updatedNodes, from, undefined, undefined, jsonStr);\n }\n\n static fromObject(obj: any): Put {\n return new Put(obj.id, obj.updatedNodes, obj.from, obj.inResponseTo, obj.recipients, obj.jsonStr, obj.checksum);\n }\n\n static new(updatedNodes: UpdatedNodes, from: Actor, inResponseTo?: string, recipients?: string[], jsonStr?: string, checksum?: string): Put {\n const id = generateMsgId();\n return new Put(id, updatedNodes, from, inResponseTo, recipients, jsonStr, checksum);\n }\n\n static newFromKv(key: string, children: Children, from:Actor) {\n const updatedNodes: UpdatedNodes = {};\n updatedNodes[key] = children;\n return Put.new(updatedNodes, from);\n }\n\n constructor(id: string, updatedNodes: UpdatedNodes, from: Actor, inResponseTo?: string, recipients?: string[], jsonStr?: string, checksum?: string) {\n this.id = id;\n this.from = from;\n this.updatedNodes = updatedNodes;\n this.inResponseTo = inResponseTo;\n this.recipients = recipients;\n this.jsonStr = jsonStr;\n this.checksum = checksum;\n }\n}\n\nexport class Hi implements Message {\n type: string = 'hi';\n peerId: string;\n jsonStr?: string;\n\n //{\"#\":\"aHHO9Srurq9nh6Q9\",\"dam\":\"hi\"}\n\n\n serialize(): string {\n if (this.jsonStr) {\n return this.jsonStr;\n }\n\n const obj: any = {\n dam: \"hi\",\n \"#\": this.peerId,\n };\n\n this.jsonStr = JSON.stringify(obj);\n return this.jsonStr;\n }\n\n static deserialize(obj: any): Hi {\n const peerId = obj['#'];\n return new Hi(peerId);\n }\n\n constructor(peerId: string, jsonStr?: string) {\n this.peerId = peerId;\n this.jsonStr = jsonStr;\n }\n}\n\nconst parseGet = (get: any, from: Actor): Get => {\n return new Get(get.id, get.nodeId, from, get.recipients, get.childKey, get.jsonStr, get.checksum);\n}\n\nconst parsePut = (put: any, from: Actor): Put => {\n return new Put(put.id, put.updatedNodes, from, put.inResponseTo, put.recipients, put.jsonStr, put.checksum);\n}\n\nexport function messageFromJsonString(jsonStr: string, from: Actor): Message {\n const obj = JSON.parse(jsonStr);\n if (obj.get) {\n return parseGet(obj.get, from);\n } else if (obj.put) {\n return parsePut(obj.put, from);\n } else {\n throw new Error('Unknown message type');\n }\n}","import peers from \"./peers\";\nimport Node from \"./db/Node\";\n\nlet globalState: any;\n\nexport default function(opts: any = {}) {\n if (!globalState) {\n peers.init();\n const webSocketPeers = (opts.peers || peers.random());\n console.log('webSocketPeers', webSocketPeers);\n const myOpts = Object.assign({ webSocketPeers, localStorage: false, retry:Infinity }, opts);\n if (opts.peers) {\n console.log('adding peers', opts.peers);\n opts.peers.forEach((url: string) => peers.add({url}));\n }\n globalState = new Node('global', myOpts);\n }\n return globalState;\n}","import {Put, Get, Message} from '../Message'\nimport { Actor } from '../Actor';\nimport QuickLRU from 'quick-lru';\nimport {Children} from \"../Node\";\n//import {NodeData} from \"../Node\";\n// import * as Comlink from \"comlink\";\nimport _ from '../../lodash';\n\nexport default class Memory extends Actor {\n config = {};\n store: QuickLRU = new QuickLRU({ maxSize: 10000 });\n\n constructor(config: any = {}) {\n super();\n this.config = config;\n }\n\n handle(message: Message) {\n if (message instanceof Put) {\n this.handlePut(message);\n } else if (message instanceof Get) {\n this.handleGet(message);\n } else {\n console.log('Memory got unknown message', message);\n }\n }\n\n handleGet(message: Get) {\n if (!message.from) {\n console.log('no from in get message');\n return;\n }\n let children = this.store.get(message.nodeId);\n if (children) {\n //console.log('have', message.nodeId, children);\n const putMessage = Put.newFromKv(message.nodeId, children, this);\n putMessage.inResponseTo = message.id;\n message.from && message.from.postMessage(putMessage);\n } else {\n //console.log('dont have', message.nodeId);\n }\n }\n\n mergeAndSave(nodeName: string, children: Children) {\n const existing = this.store.get(nodeName);\n\n // TODO check updatedAt timestamp\n if (existing === undefined) {\n this.store.set(nodeName, children);\n } else {\n for (const [key, value] of Object.entries(children)) {\n if (existing[key] && existing[key].updatedAt >= value.updatedAt) {\n continue;\n }\n existing[key] = value;\n }\n this.store.set(nodeName, existing);\n }\n }\n\n async handlePut(put: Put) {\n for (const [nodeName, children] of Object.entries(put.updatedNodes)) {\n if (!children) {\n console.log('deleting', nodeName);\n this.store.delete(nodeName);\n continue;\n }\n this.mergeAndSave(nodeName, children);\n }\n }\n}\n\n/*\nlet actor;\nglobal.onconnect = () => {\n if (actor) {\n console.log ('worker already exists');\n } else {\n console.log('starting worker');\n actor = actor || new IndexedDB();\n }\n}\n */\n\n// self.onconnect = (e) => Comlink.expose(actor, e.ports[0]);","import {Put, Get, Message} from '../Message'\nimport { Actor } from '../Actor';\nimport _ from \"../../lodash\";\nimport Dexie from 'dexie';\nimport {Children, NodeData} from \"../Node\";\n// import * as Comlink from \"comlink\";\n\n// TODO: add LRU or other eviction policy, clean up least important data when db gets too big\nclass MyDexie extends Dexie {\n nodes: Dexie.Table;\n constructor(dbName: string) {\n super(dbName);\n this.version(1).stores({\n nodes: \", value, updatedAt\"\n });\n this.nodes = this.table(\"nodes\");\n }\n}\n\nexport default class IndexedDB extends Actor {\n config = {};\n notStored = new Set();\n putQueue: any = {};\n getQueue: any = {};\n i = 0;\n queue = 0;\n db: MyDexie;\n\n constructor(config: any = {}) {\n super();\n this.config = config;\n const dbName = (config.dbName || 'iris');\n this.db = new MyDexie(dbName);\n this.db.open().catch((err) => {\n console.error(err.stack || err);\n });\n }\n\n put(nodeId: string, value: any) {\n // add puts to a queue and dexie bulk write them once per 500ms\n this.putQueue[nodeId] = value;\n this.throttledPut();\n }\n\n throttledPut = _.throttle(() => {\n const keys = Object.keys(this.putQueue);\n const values = keys.map(key => {\n this.notStored.delete(key);\n return this.putQueue[key];\n });\n this.db.nodes.bulkPut(values, keys).catch((err) => {\n console.error(err);\n });\n this.putQueue = {};\n }, 500);\n\n get(path: string, callback: Function) {\n this.getQueue[path] = this.getQueue[path] || [];\n this.getQueue[path].push(callback);\n this.throttledGet();\n }\n\n throttledGet = _.throttle(() => {\n // clone this.getQueue and clear it\n const queue = this.getQueue;\n const keys = Object.keys(queue);\n this.db.nodes.bulkGet(keys).then((values: (any | undefined)[]) => {\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n const value = values[i];\n const callbacks = queue[key];\n // console.log('have', key, value);\n for (const callback of callbacks) {\n callback(value);\n }\n }\n });\n this.getQueue = {};\n }, 100);\n\n handle(message: Message) {\n if (message instanceof Put) {\n this.handlePut(message);\n } else if (message instanceof Get) {\n this.handleGet(message);\n } else {\n console.log('worker got unknown message', message);\n }\n }\n\n handleGet(message: Get) {\n if (this.notStored.has(message.nodeId)) {\n // TODO message implying that the key is not stored\n return;\n }\n this.get(message.nodeId, (children: any) => {\n // TODO: this takes a long time to return\n if (children === undefined) {\n this.notStored.add(message.nodeId);\n // TODO message implying that the key is not stored\n } else {\n const putMessage = Put.newFromKv(message.nodeId, children, this);\n putMessage.inResponseTo = message.id;\n message.from && message.from.postMessage(putMessage);\n }\n });\n }\n\n mergeAndSave(path: string, children: Children) {\n this.get(path, (existing: any) => {\n // TODO check updatedAt timestamp\n if (existing === undefined) {\n this.put(path, children);\n } else {\n for (const [key, value] of Object.entries(children)) {\n if (existing[key] && existing[key].updatedAt >= value.updatedAt) {\n continue;\n }\n existing[key] = value;\n }\n this.put(path, existing);\n }\n });\n }\n\n savePath(path: string, value: any) {\n if (value === undefined) {\n this.db.nodes.delete(path);\n this.notStored.add(path);\n } else {\n this.notStored.delete(path);\n this.mergeAndSave(path, value);\n }\n }\n\n async handlePut(put: Put) {\n for (const [nodeName, children] of Object.entries(put.updatedNodes)) {\n if (!children) {\n console.log('deleting', nodeName);\n continue;\n }\n this.mergeAndSave(nodeName, children);\n }\n }\n}\n\n/*\nlet actor;\nglobal.onconnect = () => {\n if (actor) {\n console.log ('worker already exists');\n } else {\n console.log('starting worker');\n actor = actor || new IndexedDB();\n }\n}\n */\n\n// self.onconnect = (e) => Comlink.expose(actor, e.ports[0]);","import {Get, Message, Put} from \"../Message\";\nimport {Actor} from \"../Actor\";\n//@ts-ignore\n\nexport default class Websocket extends Actor {\n ws: WebSocket;\n router: Actor;\n sendQueue: string[] = [];\n\n constructor(url: string, router: Actor) {\n super('websocket:' + url);\n console.log('Websocket', url);\n this.router = router;\n this.ws = new WebSocket(url.replace('http', 'ws'));\n this.ws.onopen = () => {\n //this.ws.send(new Hi(this.router.peerId).serialize());\n console.log(`Connected to ${url}`);\n this.sendQueue.forEach((message) => this.ws.send(message));\n this.sendQueue = [];\n }\n this.ws.onmessage = async (event) => {\n try {\n const message = await Message.deserialize(event.data, this);\n this.router.postMessage(message);\n } catch (e) {\n //console.log('Failed to deserialize message', event.data, e);\n }\n }\n this.ws.onclose = () => {\n console.log(`Disconnected from ${url}`);\n }\n this.ws.onerror = () => {\n console.log(`Error on ${url}`);\n }\n }\n\n handle(message: Message): void {\n if (message instanceof Get || message instanceof Put) {\n if (message.from === this) {\n return;\n }\n if (this.ws.readyState === WebSocket.OPEN) {\n this.ws.send(message.serialize());\n } else if (this.ws.readyState === WebSocket.CONNECTING) {\n this.sendQueue.push(message.serialize());\n }\n }\n }\n}\n\n\n","import {Actor} from \"./Actor\";\nimport Memory from \"./adapters/Memory\";\nimport IndexedDB from \"./adapters/IndexedDB\";\nimport Websocket from \"./adapters/Websocket\";\nimport {Put, Get, Message} from \"./Message\";\n// import * as Comlink from \"comlink\";\n\n/*\nclass SeenGetMessage {\n constructor(id, from, lastReplyChecksum) {\n this.id = id;\n this.from = from;\n this.lastReplyChecksum = lastReplyChecksum;\n }\n}\n*/\n\nexport default class Router extends Actor {\n storageAdapters: Set = new Set();\n networkAdapters: Set = new Set();\n serverPeers: Set = new Set();\n seenMessages: Set = new Set();\n seenGetMessages: Map = new Map();\n subscribersByTopic: Map> = new Map();\n msgCounter = 0;\n peerId: string;\n\n constructor(config: any = {}) {\n super('router');\n // default random id\n this.peerId = config.peerId || Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15);\n this.storageAdapters.add(new Memory(config));\n this.storageAdapters.add(new IndexedDB(config));\n console.log('config', config);\n if (config.peers) {\n for (const peer of config.peers) {\n if (peer) {\n this.serverPeers.add(new Websocket(peer, this));\n }\n }\n }\n }\n\n handle(message: Message) {\n //console.log('router received', message);\n if (message instanceof Put || message instanceof Get) {\n if (this.seenMessages.has(message.id)) {\n return;\n }\n this.seenMessages.add(message.id);\n if (message instanceof Put) {\n this.handlePut(message);\n } else if (message instanceof Get) {\n this.handleGet(message);\n }\n }\n }\n\n handlePut(put: Put) {\n const sendTo: Set = new Set();\n Object.keys(put.updatedNodes).forEach(path => {\n // topic is first 3 nodes of path\n const topic = path.split('/').slice(0, 3).join('/');\n const subscribers = this.subscribersByTopic.get(topic);\n // send to storage adapters\n //console.log('put subscribers', subscribers);\n for (const storageAdapter of this.storageAdapters) {\n if (put.from !== storageAdapter) {\n sendTo.add(storageAdapter);\n }\n }\n\n for (const peer of this.serverPeers) {\n if (put.from !== peer) {\n sendTo.add(peer);\n }\n }\n\n if (subscribers) {\n for (const subscriber of subscribers) {\n if (subscriber !== put.from) {\n sendTo.add(subscriber);\n }\n }\n }\n });\n for (const actor of sendTo) {\n actor.postMessage(put);\n }\n }\n\n opt(opts: any) {\n if (opts.peers) {\n for (const peer of opts.peers) {\n if (peer) {\n this.serverPeers.add(new Websocket(peer, this));\n }\n }\n }\n }\n\n handleGet(get: Get) {\n const topic = get.nodeId.split('/')[1];\n const sendTo: Set = new Set();\n for (const storageAdapter of this.storageAdapters) {\n if (get.from !== storageAdapter) {\n sendTo.add(storageAdapter);\n }\n }\n for (const peer of this.serverPeers) {\n if (get.from !== peer) {\n sendTo.add(peer);\n }\n }\n if (!this.subscribersByTopic.has(topic)) {\n this.subscribersByTopic.set(topic, new Set());\n }\n const subscribers = this.subscribersByTopic.get(topic);\n if (subscribers) {\n if (!subscribers.has(get.from)) {\n subscribers.add(get.from);\n }\n }\n for (const actor of sendTo) {\n actor.postMessage(get);\n }\n }\n}\n\n/*\nlet actor: Actor;\nself.onconnect = () => {\n console.log('router shared worker connected');\n actor = actor || new Router();\n}\n*/\n\n// self.onconnect = (e) => Comlink.expose(actor, e.ports[0]);","import _ from '../lodash';\nimport {Actor} from './Actor';\nimport {Message, Put, Get, UpdatedNodes} from './Message';\n\n// @ts-ignore\nimport Router from './Router';\nimport Key from \"../Key\";\n//import * as Comlink from \"comlink\";\n\nexport type NodeData = {\n value: any;\n updatedAt: number;\n};\n\nexport type Children = {\n [key: string]: NodeData;\n}\n\nexport type Config = {\n peerId?: string;\n allowPublicSpace: boolean;\n myPublicKey?: string;\n enableStats: boolean;\n webSocketPeers?: string[];\n localOnly: boolean;\n}\n\nexport const DEFAULT_CONFIG: Config = {\n allowPublicSpace: false,\n enableStats: true,\n localOnly: true\n}\n\n// TODO move memory storage to its own adapter? it would make things simpler here\nexport default class Node extends Actor {\n root: Node;\n parent?: Node;\n children = new Map();\n once_subscriptions = new Map();\n on_subscriptions = new Map();\n map_subscriptions = new Map();\n counter = 0;\n config: Config;\n currentUser: any;\n router: Router;\n\n constructor(id = '', config?: Config, parent?: Node) {\n super(id);\n this.parent = parent;\n this.config = config || (parent && parent.config) || DEFAULT_CONFIG;\n if (parent) {\n this.root = parent.root;\n this.router = parent.router;\n } else {\n this.root = this;\n //@ts-ignore\n this.router = new Router({dbName: this.id + '-idb', peers: this.config.webSocketPeers});\n //console.log('idbWorker', idbWorker);\n //const router = Comlink.wrap(routerWorker);\n }\n }\n\n getCurrentUser(): any {\n return this.root.currentUser;\n }\n\n setCurrentUser(key: any) {\n this.root.currentUser = key;\n }\n\n handle(message: Message): void {\n if (message instanceof Put) {\n for (const [key, children] of Object.entries(message.updatedNodes)) {\n if (!children || typeof children !== 'object') {\n continue;\n }\n if (key === this.id) {\n for (const [childKey, childData] of Object.entries(children)) {\n this.get(childKey).doCallbacks(childData, childKey); // TODO children should have proper NodeData\n }\n }\n }\n this.parent && this.parent.handle(message);\n }\n };\n\n get(key: string): Node {\n const existing = this.children.get(key);\n if (existing) {\n return existing;\n }\n const newNode = new Node(`${this.id}/${key}`, this.config, this);\n this.children.set(key, newNode);\n return newNode;\n }\n\n user(pub: string | undefined): Node {\n pub = pub || (this.root.currentUser && this.root.currentUser.pub);\n if (!pub) {\n throw new Error(\"no public key!\");\n }\n return this.get('user').get(pub as string);\n }\n\n auth(key: any) {\n // TODO get public key from key\n this.root.setCurrentUser(key);\n return;\n }\n\n doCallbacks = (data: NodeData, key: string) => {\n if (typeof data.value === 'string' && data.value.startsWith('{\":\":')) {\n data.value = JSON.parse(data.value)[':'];\n }\n for (const [id, callback] of this.on_subscriptions) {\n const event = { off: () => this.on_subscriptions.delete(id) };\n callback(data.value, key, null, event);\n }\n for (const [id, callback] of this.once_subscriptions) {\n callback(data.value, key, null, {});\n this.once_subscriptions.delete(id);\n }\n if (this.parent) {\n const parent = this.parent;\n for (const [id, callback] of parent.map_subscriptions) {\n const event = { off: () => parent.map_subscriptions.delete(id) };\n callback(data.value, key, null, event);\n }\n }\n };\n\n async put(value: any): Promise {\n const updatedAt = Date.now();\n if (Array.isArray(value)) {\n throw new Error('put() does not support arrays');\n }\n if (typeof value === 'function') {\n throw new Error('put() does not support functions');\n }\n if (typeof value === 'object' && value !== null) {\n // TODO: update the whole path of parent nodes\n for (const key in value) {\n this.get(key).put(value[key]);\n }\n return;\n }\n value = await this.signIfNeeded(value);\n this.children = new Map();\n const updatedNodes: UpdatedNodes = {};\n await this.addParentNodes(updatedNodes, value, updatedAt);\n const put = Put.new(updatedNodes, this);\n this.handle(put);\n this.router.postMessage(put);\n }\n\n private async signIfNeeded(value: any) {\n if (this.id.indexOf('global/user/') === 0) {\n if (!this.getCurrentUser()) {\n throw new Error('not authenticated');\n }\n if (this.id.indexOf('global/user/' + this.getCurrentUser().pub) !== 0) {\n throw new Error('not allowed ' + this.id);\n }\n const signed = await Key.sign(value, this.getCurrentUser(), undefined, {raw: true});\n value = JSON.stringify({':': signed.m, '~': signed.s});\n console.log('saving signed value', value);\n }\n return value;\n }\n\n private async addParentNodes(updatedNodes: UpdatedNodes, value: any, updatedAt: number) {\n // TODO sign\n if (this.parent) {\n const childName = this.id.split('/').pop() as string;\n const parentId = this.parent.id;\n updatedNodes[parentId] = updatedNodes[parentId] || {};\n updatedNodes[parentId][childName] = {value, updatedAt};\n await this.parent.addParentNodes(updatedNodes, {'#': this.parent.id }, updatedAt);\n }\n }\n\n private request() {\n if (this.parent) { // TODO router should decide whether to re-request from peers\n const childKey = this.id.split('/').pop();\n this.router.postMessage(Get.new(this.parent.id, this, undefined, childKey));\n }\n }\n\n async once(callback?: Function | null): Promise {\n const id = this.counter++;\n callback && this.once_subscriptions.set(id, callback);\n this.request();\n }\n\n on(callback: Function): void {\n const id = this.counter++;\n this.on_subscriptions.set(id, callback);\n //const event = { off: () => this.on_subscriptions.delete(id) };\n this.request();\n }\n\n map(callback: Function): void {\n const id = this.counter++;\n this.map_subscriptions.set(id, callback);\n // TODO: child key should probably still be included. But how to handle link responses?\n this.router.postMessage(Get.new(this.id, this, undefined));\n }\n\n opt(opts: any) {\n this.router.opt(opts);\n }\n}","// @ts-nocheck\n\n/*eslint no-useless-escape: \"off\", camelcase: \"off\" */\n\nconst UNIQUE_ID_VALIDATORS = {\n email: /^([\\w-]+(?:\\.[\\w-]+)*)@((?:[\\w-]+\\.)*\\w[\\w-]{0,66})\\.([a-z]{2,6}(?:\\.[a-z]{2})?)$/i,\n bitcoin: /^[13][a-km-zA-HJ-NP-Z0-9]{26,33}$/,\n bitcoin_address: /^[13][a-km-zA-HJ-NP-Z0-9]{26,33}$/,\n ip: /^(([1-9]?\\d|1\\d\\d|2[0-5][0-5]|2[0-4]\\d)\\.){3}([1-9]?\\d|1\\d\\d|2[0-5][0-5]|2[0-4]\\d)$/,\n ipv6: /^(?:[A-F0-9]{1,4}:){7}[A-F0-9]{1,4}$/,\n gpg_fingerprint: null,\n gpg_keyid: null,\n google_oauth2: null,\n tel: /^\\d{7,}$/,\n phone: /^\\d{7,}$/,\n keyID: null,\n url: /[-a-zA-Z0-9@:%_\\+.~#?&//=]{2,256}\\.[a-z]{2,4}\\b(\\/[-a-zA-Z0-9@:%_\\+.~#?&//=]*)?/gi,\n account: /^([\\w-]+(?:\\.[\\w-]+)*)@((?:[\\w-]+\\.)*\\w[\\w-]{0,66})\\.([a-z]{2,6}(?:\\.[a-z]{2})?)$/i,\n uuid: /[0-9a-f]{8}\\-[0-9a-f]{4}\\-[0-9a-f]{4}\\-[0-9a-f]{4}\\-[0-9a-f]{12}/\n};\n\n// TODO this class could perhaps be removed\n\nclass Attribute {\n constructor(a, b) {\n if (typeof a === `object`) {\n if (typeof a.value !== `string`) { throw new Error(`param1.value must be a string, got ${typeof a.value}: ${JSON.stringify(a.value)}`); }\n if (typeof a.type !== `string`) { throw new Error(`param1.type must be a string, got ${typeof a.type}: ${JSON.stringify(a.type)}`); }\n b = a.value;\n a = a.type;\n }\n if (typeof a !== `string`) { throw new Error(`First param must be a string, got ${typeof a}: ${JSON.stringify(a)}`); }\n if (!a.length) { throw new Error(`First param string is empty`); }\n if (b) {\n if (typeof b !== `string`) { throw new Error(`Second parameter must be a string, got ${typeof b}: ${JSON.stringify(b)}`); }\n if (!b.length) { throw new Error(`Second param string is empty`); }\n this.type = a;\n this.value = b;\n } else {\n this.value = a;\n const t = Attribute.guessTypeOf(this.value);\n if (t) {\n this.type = t;\n } else {\n throw new Error(`Type of attribute was omitted and could not be guessed`);\n }\n }\n }\n\n static getUuid() {\n const b = a => a ? (a ^ Math.random() * 16 >> a / 4).toString(16) : ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, b);\n return new Attribute(`uuid`, b());\n }\n\n static getUniqueIdValidators() {\n return UNIQUE_ID_VALIDATORS;\n }\n\n static isUniqueType(type) {\n return Object.keys(UNIQUE_ID_VALIDATORS).indexOf(type) > -1;\n }\n\n isUniqueType() {\n return Attribute.isUniqueType(this.type);\n }\n\n static guessTypeOf(value) {\n for (const key in UNIQUE_ID_VALIDATORS) {\n if (value.match(UNIQUE_ID_VALIDATORS[key])) {\n return key;\n }\n }\n }\n\n static equals(a, b) {\n return a.equals(b);\n }\n\n equals(a) {\n return a && this.type === a.type && this.value === a.value;\n }\n\n uri() {\n return `${encodeURIComponent(this.value)}:${encodeURIComponent(this.type)}`;\n }\n}\n\nexport default Attribute;\n","import globalState from './global';\nimport session from './session';\n\n/**\n * Get a public space where only the specified user (public key) can write. Others can read.\n * @param pub The public key string or keypair object of the user. Defaults to the current user from session.\n * @returns {Node} The user space.\n */\nexport default function(pub: any = session.getKey()) {\n if (typeof pub === 'string') {\n return globalState().user(pub);\n } else if (typeof pub === 'object') {\n const userSpace = globalState().user(pub.pub);\n userSpace.auth(pub);\n return userSpace;\n }\n}\n","// @ts-nocheck\n\nimport util from './util';\nimport Attribute from './Attribute';\nimport session from './session';\nimport publicState from './global';\nimport userState from './public';\nimport Key from './Key';\n\n// TODO: extract Group channels into their own class\n\nconst DEFAULT_PERMISSIONS = {read: true, write: true, admin: false};\n\n/**\n* Private communication channel between two or more participants ([Gun](https://github.com/amark/gun) public keys). Can be used independently of other Iris stuff.\n*\n* Used as a core element of [iris-messenger](https://github.com/irislib/iris-messenger).\n*\n* You can use iris.private(pub) to always use the same Channel object for a given pub.\n*\n* ---\n*\n* #### Key-value API\n* `channel.put(key, value)` and `channel.on(key, callback)`.\n*\n* Note that each participant has their own versions of each key-value — they don't overwrite each other. `channel.on()` callback returns them all by default and has a parameter that indicates whose value you got.\n*\n* While values are encrypted, encryption of keys is not implemented yet.\n*\n* #### Message API\n* `channel.send()` and `channel.getMessages()` for timestamp-indexed chat-style messaging.\n*\n* Message data is encrypted, but timestamps are public so that peers can return your messages in a sequential order.\n*\n* ---\n*\n* You can open a channel with yourself for a private key-value space or a \"note to self\" type chat with yourself.\n*\n* **Privacy disclaimer:** Channel ids, data values and messages are encrypted, but message timestamps are unencrypted so that peers can return them to you in a sequential order. By looking at the unencrypted timestamps (or Gun subscriptions), it is possible to guess who are communicating with each other. This could be improved by indexing messages by *day* only, so making the guess would be more difficult, while you could still return them in a semi-sequential order.\n*\n* @param {Object} options\n* @param {string} options.key your keypair\n* @param {Object} options.gun [gun](https://github.com/amark/gun) instance\n* @param options.participants (optional) string or string array or permissions object ({'pub1':{read:true,write:true,admin:false},'pub2'...}) of participant public keys (your own key is included by default)\n* @param {string} options.chatLink (optional) chat link instead of participants list\n* @param {string} options.uuid (group channels only) unique channel identifier. Leave out for new channel.\n* @param {string} options.name (group channels only) channel name\n* @example\n* // Copy & paste this to console at https://iris.to or other page that has gun, sea and iris-lib\n* // Due to an unsolved bug, someoneElse's messages only start showing up after a reload\n*\n* var gun1 = new Gun('https://gun-us.herokuapp.com/gun');\n* var gun2 = new Gun('https://gun-us.herokuapp.com/gun');\n* var myKey = await Key.getDefault();\n* var someoneElse = localStorage.getItem('someoneElsesKey');\n* if (someoneElse) {\n* someoneElse = JSON.parse(someoneElse);\n* } else {\n* someoneElse = await Key.generate();\n* localStorage.setItem('someoneElsesKey', JSON.stringify(someoneElse));\n* }\n*\n* iris.Channel.initUser(gun1, myKey); // saves myKey.epub to gun.user().get('epub')\n* iris.Channel.initUser(gun2, someoneElse);\n*\n* var ourChannel = new iris.Channel({key: myKey, gun: gun1, participants: someoneElse.pub});\n* var theirChannel = new iris.Channel({key: someoneElse, gun: gun2, participants: myKey.pub});\n*\n* var myChannels = {}; // you can list them in a user interface\n* function printMessage(msg, info) {\n* console.log(`[${new Date(msg.time).toLocaleString()}] ${info.from.slice(0,8)}: ${msg.text}`)\n* }\n* iris.Channel.getChannels(gun1, myKey, channel => {\n* var pub = channel.getCurrentParticipants()[0];\n* gun1.user(pub).get('profile').get('name').on(name => channel.name = name);\n* myChannels[pub] = channel;\n* channel.getMessages(printMessage);\n* channel.on('mood', (mood, from) => console.log(from.slice(0,8) + ' is feeling ' + mood));\n* });\n*\n* // you can play with these in the console:\n* ourChannel.send('message from myKey');\n* theirChannel.send('message from someoneElse');\n*\n* ourChannel.put('mood', 'blessed');\n* theirChannel.put('mood', 'happy');\n*\n* @example https://github.com/irislib/iris-lib/blob/master/__tests__/Channel.js\n*/\nclass Channel {\n // TODO: these should be done in a cleaner way\n latestTime: any;\n theirMsgsLastSeenDate: any;\n myLastSeenTime: any;\n theirMsgsLastSeenTime: any;\n notificationSetting: any;\n messageIds: any; // this is used from session.processMessage\n latest: any;\n uuid: any;\n name: any;\n attachments: any;\n\n theirSecretUuids = {};\n theirGroupSecrets = {};\n secrets = {};\n ourSecretChannelIds = {};\n theirSecretChannelIds = {};\n messages = {};\n chatLinks = {};\n groupSubscriptions = {};\n directSubscriptions = {};\n getParticipantsCallbacks = {};\n myGroupSecret: any;\n participants: any;\n\n constructor(options: any) {\n this.myGroupSecret = options.myGroupSecret;\n\n if (options.chatLink) {\n this.useChatLink(options);\n }\n\n if (typeof options.participants === `string`) {\n this.addParticipant(options.participants, options.save);\n } else if (Array.isArray(options.participants)) {\n const o = {};\n options.participants.forEach(p => o[p] = Object.assign({}, DEFAULT_PERMISSIONS));\n options.participants = o;\n }\n if (typeof options.participants === `object`) { // it's a group channel\n const keys = Object.keys(options.participants);\n keys.forEach(k => {\n if (k !== session.getKey().pub) {\n this.addParticipant(k, options.save, Object.assign({}, DEFAULT_PERMISSIONS, options.participants[k]));\n }\n });\n options.participants[session.getKey().pub] = options.participants[session.getKey().pub] || Object.assign({}, DEFAULT_PERMISSIONS);\n if (options.uuid) {\n this.uuid = options.uuid;\n this.name = options.name;\n } else {\n options.uuid = Attribute.getUuid().value;\n this.uuid = options.uuid;\n options.participants[session.getKey().pub].admin = true;\n options.participants[session.getKey().pub].founder = true;\n }\n this.getChatLinks({subscribe: true});\n }\n this.participants = options.participants;\n if (options.uuid) { // It's a group channel\n // share secret uuid with other participants. since secret is already non-deterministic, maybe uuid could also be?\n // generate channel-specific secret and share it with other participants\n // put() keys should be encrypted first? so you could do put(uuid, secret)\n // what if you join the channel with 2 unconnected devices? on reconnect, the older secret would be overwritten and messages unreadable. maybe participants should store each others' old keys? or maybe you should store them and re-encrypt old stuff when key changes? return them with map() instead?\n this.putDirect(`S${this.uuid}`, this.getMyGroupSecret());\n this.getMySecretUuid().then(s => {\n this.putDirect(this.uuid, s); // TODO: encrypt keys in put()\n });\n this.onTheirDirect(this.uuid, (s, k, from) => {\n this.theirSecretUuids[from] = s;\n });\n this.onTheirDirect(`S${this.uuid}`, (s, k, from) => {\n this.theirGroupSecrets[from] = s;\n });\n // need to make put(), on(), send() and getMessages() behave differently when it's a group and retain the old versions for mutual signaling\n }\n this.onTheir(`participants`, (participants, k, from) => {\n let hasAdmin = false;\n const keys = Object.keys(this.participants);\n for (let i = 0; i < keys.length; i++) {\n if (this.participants[keys[i]].admin || this.participants[keys[i]].inviter) {\n hasAdmin = true;\n break;\n }\n }\n if (!hasAdmin) {\n keys.forEach(k => this.participants[k].admin = true); // if no admins, make everyone admin\n }\n if (this.participants[from] && (this.participants[from].admin || this.participants[from].inviter)) {\n if (typeof participants === `object`) {\n if (JSON.stringify(this.participants) === JSON.stringify(participants)) { return; }\n this.participants = participants;\n delete this.participants[from].inviter;\n Object.keys(participants).forEach(k => {\n if (k !== session.getKey().pub) {\n this.addParticipant(k, true, Object.assign({}, DEFAULT_PERMISSIONS, participants[k]), true);\n }\n });\n this.participantsChanged();\n options.saved = true;\n }\n }\n });\n if (!options.saved && (options.save === undefined || options.save === true)) {\n this.save();\n }\n }\n\n useChatLink(options) {\n const s = options.chatLink.split('?');\n if (s.length === 2) {\n const chatWith = util.getUrlParameter('chatWith', s[1]);\n const channelId = util.getUrlParameter('channelId', s[1]);\n const inviter = util.getUrlParameter('inviter', s[1]);\n const pub = inviter || chatWith;\n if (chatWith) {\n options.participants = pub;\n } else if (channelId && inviter && inviter !== session.getKey().pub) { // TODO! initializing it twice breaks things - new secret is generated\n options.uuid = channelId;\n options.participants = {};\n options.participants[inviter] = Object.assign({inviter: true}, DEFAULT_PERMISSIONS);\n }\n if (pub !== session.getKey().pub) {\n const sharedSecret = util.getUrlParameter('s', s[1]);\n const linkId = util.getUrlParameter('k', s[1]);\n if (sharedSecret && linkId) {\n this.save(); // save the channel first so it's there before inviter subscribes to it\n options.saved = true;\n publicState().user(pub).get('chatLinks').get(linkId).get('encryptedSharedKey').on(async encrypted => {\n const sharedKey = await Key.decrypt(encrypted, sharedSecret);\n const encryptedChatRequest = await Key.encrypt(session.getKey().pub, sharedSecret); // TODO encrypt is not deterministic, it uses salt\n const channelRequestId = await util.getHash(encryptedChatRequest);\n publicState(sharedKey).get('chatRequests').get(channelRequestId.slice(0, 12)).put(encryptedChatRequest);\n });\n }\n }\n }\n }\n\n getTheirSecretUuid(pub) {\n return new Promise(resolve => {\n if (!this.theirSecretUuids[pub]) {\n this.onTheirDirect(this.uuid, s => {\n this.theirSecretUuids[pub] = s;\n resolve(this.theirSecretUuids[pub]);\n }, pub);\n } else {\n resolve(this.theirSecretUuids[pub]);\n }\n });\n }\n\n getTheirGroupSecret(pub) {\n if (pub === session.getKey().pub) { return this.getMyGroupSecret(); }\n return new Promise(resolve => {\n if (!this.theirGroupSecrets[pub]) {\n this.onTheirDirect(`S${this.uuid}`, s => {\n this.theirGroupSecrets[pub] = s;\n resolve(this.theirGroupSecrets[pub]);\n }, pub);\n } else {\n resolve(this.theirGroupSecrets[pub]);\n }\n });\n }\n\n changeMyGroupSecret() {\n this.myGroupSecret = Key.random(32).toString('base64');\n // TODO: secret should be archived and probably messages should include the encryption key id so past messages don't become unreadable\n this.putDirect(`S${this.uuid}`, this.myGroupSecret);\n }\n\n /**\n * Unsubscribe messages from a channel participants\n *\n * @param {string} participant public key\n */\n async mute(participant) {\n publicState().user(participant).get(this.theirSecretUuids[participant]).off();\n // TODO: persist\n }\n\n /**\n * Mute user and prevent them from seeing your further (and maybe past) messages\n *\n * @param {string} participant public key\n */\n async block(participant) {\n this.mute(participant);\n this.putDirect(this.uuid, null);\n this.putDirect(`S${this.uuid}`, null);\n delete this.secrets[participant];\n delete this.ourSecretChannelIds[participant];\n delete this.theirSecretChannelIds[participant];\n this.changeMyGroupSecret();\n }\n\n async getMySecretUuid() {\n if (!this.mySecretUuid) {\n const mySecret = await Key.secret(session.getKey().epub, session.getKey());\n const mySecretHash = await util.getHash(mySecret);\n this.mySecretUuid = await util.getHash(mySecretHash + this.uuid);\n }\n return this.mySecretUuid;\n }\n\n /**\n * List participants of the channel (other than you)\n */\n getCurrentParticipants() {\n return Object.keys(this.secrets);\n }\n\n /**\n * Subscribe to the changing list of participants by channel admins\n */\n getParticipants(callback) {\n if (this.getParticipantsCallbackId) {\n this.getParticipantsCallbackId++;\n } else {\n this.getParticipantsCallbackId = 1;\n }\n this.getParticipantsCallbacks[this.getParticipantsCallbackId] = callback;\n if (this.participants) {\n callback(this.participants);\n }\n }\n\n participantsChanged() {\n Object.keys(this.getParticipantsCallbacks).forEach(id => {\n this.getParticipantsCallbacks[id](this.participants);\n });\n }\n\n /**\n * Returns either the uuid of a group channel or the public key of a direct channel.\n */\n getId() {\n return this.uuid || this.getCurrentParticipants()[0];\n }\n\n async getSecret(pub) {\n if (!this.secrets[pub]) {\n const epub = await util.gunOnceDefined(publicState().user(pub).get(`epub`));\n this.secrets[pub] = await Key.secret(epub, session.getKey());\n }\n return this.secrets[pub];\n }\n\n /**\n *\n */\n static async getOurSecretChannelId(pub, pair) {\n const epub = await util.gunOnceDefined(publicState().user(pub).get(`epub`));\n const secret = await Key.secret(epub, pair);\n return util.getHash(secret + pub);\n }\n\n /**\n *\n */\n static async getTheirSecretChannelId(pub, pair) {\n const epub = await util.gunOnceDefined(publicState().user(pub).get(`epub`));\n const secret = await Key.secret(epub, pair);\n return util.getHash(secret + pair.pub);\n }\n\n /**\n * Calls back with Channels that you have initiated or written to.\n * @param {Object} keypair Key keypair that the gun instance is authenticated with\n * @param callback callback function that is called for each public key you have a channel with\n */\n static async getChannels(callback, listenToChatLinks = true) {\n const keypair = session.getKey();\n const mySecret = await Key.secret(keypair.epub, keypair);\n if (listenToChatLinks) {\n Channel.getMyChatLinks( undefined, undefined, true);\n }\n const seen = {};\n\n const handleChannel = async (value, ourSecretChannelId) => {\n if (value && !seen[ourSecretChannelId]) {\n seen[ourSecretChannelId] = true;\n if (ourSecretChannelId.length > 44) {\n publicState().user().get(`chats`).get(ourSecretChannelId).put(null);\n return;\n }\n const encryptedChatId = await util.gunOnceDefined(publicState().user().get(`chats`).get(ourSecretChannelId).get(`pub`));\n const chatId = await Key.decrypt(encryptedChatId, mySecret);\n if (!chatId) {\n return;\n }\n if (chatId.pub || typeof chatId === `string`) {\n callback(new Channel({\n key: keypair,\n participants: chatId.pub || chatId,\n save: false\n }));\n } else if (chatId.uuid && chatId.participants && chatId.myGroupSecret) {\n callback(new Channel({\n key: keypair,\n participants: chatId.participants,\n uuid: chatId.uuid,\n myGroupSecret: chatId.myGroupSecret,\n save: false\n }));\n }\n }\n };\n\n publicState().user().get(`chats`).map(handleChannel);\n }\n\n getMyGroupSecret() { // group secret could be deterministic: hash(encryptToSelf(uuid + iterator))\n if (!this.myGroupSecret) {\n this.changeMyGroupSecret();\n }\n return this.myGroupSecret;\n }\n\n async getOurSecretChannelId(pub) {\n if (!this.ourSecretChannelIds[pub]) {\n const secret = await this.getSecret(pub);\n this.ourSecretChannelIds[pub] = await util.getHash(secret + pub);\n }\n return this.ourSecretChannelIds[pub];\n }\n\n async getTheirSecretChannelId(pub) {\n if (!this.theirSecretChannelIds[pub]) {\n const secret = await this.getSecret(pub);\n this.theirSecretChannelIds[pub] = await util.getHash(secret + session.getKey().pub);\n }\n return this.theirSecretChannelIds[pub];\n }\n\n /**\n * Get messages from the channel\n */\n async getMessages(callback) { // TODO: save callback and apply it when new participants are added to channel\n this.getCurrentParticipants().forEach(async pub => {\n if (pub !== session.getKey().pub) {\n // Subscribe to their messages\n let theirSecretChannelId;\n if (this.uuid) {\n theirSecretChannelId = await this.getTheirSecretUuid(pub);\n } else {\n theirSecretChannelId = await this.getTheirSecretChannelId(pub);\n }\n // TODO map().once\n publicState().user(pub).get(`chats`).get(theirSecretChannelId).get(`msgs`).map((data, key) => {this.messageReceived(callback, data, this.uuid || pub, false, key, pub);});\n }\n if (!this.uuid) {\n // Subscribe to our messages\n const ourSecretChannelId = await this.getOurSecretChannelId(pub);\n // TODO map().once\n userState().get(`chats`).get(ourSecretChannelId).get(`msgs`).map((data, key) => {this.messageReceived(callback, data, pub, true, key, session.getKey().pub);});\n }\n });\n if (this.uuid) {\n // Subscribe to our messages\n const mySecretUuid = await this.getMySecretUuid();\n // TODO map().once\n userState().get(`chats`).get(mySecretUuid).get(`msgs`).map((data, key) => {this.messageReceived(callback, data, this.uuid, true, key, session.getKey().pub);});\n }\n }\n\n async messageReceived(callback, data, channelId, selfAuthored, key, from) {\n if (this.messages[key] || !data) {\n return;\n }\n const secret = this.uuid ? (await this.getTheirGroupSecret(from)) : (await this.getSecret(channelId));\n const decrypted = await Key.decrypt(data, secret);\n if (typeof decrypted !== `object`) {\n return;\n }\n const info = {selfAuthored, channelId, from};\n this.messages[key] = decrypted;\n callback(decrypted, info);\n }\n\n /**\n * Get latest message in this channel. Useful for channel listing.\n */\n async getLatestMsg(callback) {\n const callbackIfLatest = async (msg, info) => {\n if (!this.latest) {\n this.latest = msg;\n callback(msg, info);\n } else {\n const t = (typeof this.latest.time === `string` ? this.latest.time : this.latest.time.toISOString());\n if (t < msg.time) {\n this.latest = msg;\n callback(msg, info);\n }\n }\n };\n this.onMy('latestMsg', msg => callbackIfLatest(msg, {selfAuthored: true, from: session.getKey().pub}));\n this.onTheir('latestMsg', (msg, k, from) => callbackIfLatest(msg, {selfAuthored: false, from}));\n }\n\n /**\n * Useful for notifications\n * @param {integer} time last seen msg time (default: now)\n */\n async setMyMsgsLastSeenTime(time?: string) {\n time = time || new Date().toISOString();\n return this.put(`msgsLastSeenTime`, time);\n }\n\n /**\n * Useful for notifications\n */\n async getMyMsgsLastSeenTime(callback) {\n this.onMy(`msgsLastSeenTime`, time => {\n this.myMsgsLastSeenTime = time;\n if (callback) {\n callback(this.myMsgsLastSeenTime);\n }\n });\n }\n\n /**\n * For \"seen\" status indicator\n */\n async getTheirMsgsLastSeenTime(callback) {\n this.onTheir(`msgsLastSeenTime`, time => {\n this.theirMsgsLastSeenTime = time;\n if (callback) {\n callback(this.theirMsgsLastSeenTime);\n }\n });\n }\n\n async removeParticipant(pub) {\n this.addParticipant(pub, true, {read: false, write: false});\n }\n\n /**\n * Add a public key to the channel or update its permissions\n * @param {string} pub\n */\n async addParticipant(pub: string, save = true, permissions?: any, subscribe?: boolean) {\n if (this.uuid) {\n return;\n }\n if (permissions === undefined) {\n permissions = DEFAULT_PERMISSIONS;\n }\n if (this.secrets[pub] && JSON.stringify(this.secrets[pub]) === JSON.stringify(permissions)) { // TODO: should be this.participants[pub]\n return;\n }\n this.secrets[pub] = null;\n this.getSecret(pub);\n const ourSecretChannelId = await this.getOurSecretChannelId(pub);\n if (save) {\n // Save their public key in encrypted format, so in channel listing we know who we are channeling with\n const mySecret = await Key.secret(session.getKey().epub, session.getKey());\n publicState().user().get(`chats`).get(ourSecretChannelId).get(`pub`).put(await Key.encrypt({pub}, mySecret));\n }\n if (this.uuid) {\n this.participants[pub] = permissions;\n if (save) {\n this.putDirect(`S${this.uuid}`, this.getMyGroupSecret());\n this.getMySecretUuid().then(s => {\n this.putDirect(this.uuid, s); // TODO: encrypt keys in put()\n });\n this.onTheirDirect(this.uuid, (s, k, from) => {\n this.theirSecretUuids[from] = s;\n });\n this.onTheirDirect(`S${this.uuid}`, (s, k, from) => {\n this.theirGroupSecrets[from] = s;\n });\n this.save();\n }\n }\n if (subscribe) {\n Object.values(this.directSubscriptions).forEach(arr => {\n arr.forEach(o => {\n if (!o.from || o.from === pub) {\n this._onTheirDirectFromUser(pub, o.key, o.callback);\n }\n });\n });\n Object.values(this.groupSubscriptions).forEach(arr => {\n arr.forEach(o => {\n if (o.from && o.from !== pub) { return; }\n if (permissions.write) {\n this._onTheirGroupFromUser(pub, o.key, o.callback);\n } else { // unsubscribe\n o.event && o.event.off();\n }\n });\n });\n }\n }\n\n /**\n * Send a message to the channel\n * @param msg string or {time, text, ...} object\n */\n async send(msg) {\n if (typeof msg === `string`) {\n msg = msg.trim();\n if (msg.length === 0) {\n return;\n }\n msg = {\n time: (new Date()).toISOString(),\n text: msg\n };\n } else if (typeof msg === `object`) {\n msg.time = msg.time || (new Date()).toISOString();\n } else {\n throw new Error(`msg param must be a string or an object`);\n }\n //publicState().user().get('message').set(temp);\n if (this.uuid) {\n const encrypted = await Key.encrypt(JSON.stringify(msg), this.getMyGroupSecret());\n const mySecretUuid = await this.getMySecretUuid();\n userState().get(`chats`).get(mySecretUuid).get(`msgs`).get(`${msg.time}`).put(encrypted);\n userState().get(`chats`).get(mySecretUuid).get(`latestMsg`).put(encrypted);\n } else {\n const keys = this.getCurrentParticipants();\n for (let i = 0;i < keys.length;i++) {\n const encrypted = await Key.encrypt(JSON.stringify(msg), (await this.getSecret(keys[i])));\n const ourSecretChannelId = await this.getOurSecretChannelId(keys[i]);\n userState().get(`chats`).get(ourSecretChannelId).get(`msgs`).get(`${msg.time}`).put(encrypted);\n userState().get(`chats`).get(ourSecretChannelId).get(`latestMsg`).put(encrypted);\n }\n }\n }\n\n /**\n * Save the channel to our channels list without sending a message\n */\n async save() {\n if (this.uuid) {\n const mySecretUuid = await this.getMySecretUuid();\n userState().get(`chats`).get(mySecretUuid).get('msgs').get('a').put(null);\n this.put(`participants`, this.participants); // public participants list\n const mySecret = await Key.secret(session.getKey().epub, session.getKey());\n userState().get(`chats`).get(mySecretUuid).get(`pub`).put(await Key.encrypt({\n uuid: this.uuid,\n myGroupSecret: this.getMyGroupSecret(),\n participants: this.participants // private participants list\n }, mySecret));\n this.participantsChanged();\n } else {\n const keys = this.getCurrentParticipants();\n for (let i = 0;i < keys.length;i++) {\n const ourSecretChannelId = await this.getOurSecretChannelId(keys[i]);\n userState().get(`chats`).get(ourSecretChannelId).get('msgs').get('a').put(null);\n }\n }\n }\n\n /**\n * Save a key-value pair, encrypt value. Each participant in the Channel writes to their own version of the key-value pair — they don't overwrite the same one.\n * @param {string} key\n * @param value\n */\n async put(key, value) {\n return (this.uuid ? this.putGroup : this.putDirect).call(this, key, value);\n }\n\n async putGroup(key, value) {\n if (key === `msgs`) { throw new Error(`Sorry, you can't overwrite the msgs field which is used for .send()`); }\n const encrypted = await Key.encrypt(JSON.stringify(value), this.getMyGroupSecret());\n const mySecretUuid = await this.getMySecretUuid();\n userState().get(`chats`).get(mySecretUuid).get(key).put(encrypted);\n }\n\n async putDirect(key, value) {\n if (key === `msgs`) { throw new Error(`Sorry, you can't overwrite the msgs field which is used for .send()`); }\n const keys = this.getCurrentParticipants();\n for (let i = 0;i < keys.length;i++) {\n const encrypted = await Key.encrypt(JSON.stringify(value), (await this.getSecret(keys[i])));\n const ourSecretChannelId = await this.getOurSecretChannelId(keys[i]);\n userState().get(`chats`).get(ourSecretChannelId).get(key).put(encrypted);\n }\n }\n\n /**\n * Subscribe to a key-value pair. Callback returns every participant's value unless you limit it with *from* param.\n * @param {string} key\n * @param {function} callback\n * @param {string} from public key whose value you want, or *\"me\"* for your value only, or *\"them\"* for the value of others only\n */\n async on(key: string, callback: Function, from?: string) {\n return (this.uuid ? this.onGroup : this.onDirect).call(this, key, callback, from);\n }\n\n async onDirect(key: string, callback: Function, from?: string) {\n if (!from || from === `me` || from === session.getKey().pub) {\n this.onMy(key, (val: any) => callback(val, session.getKey().pub));\n }\n if (!from || (from !== `me` && from !== session.getKey().pub)) {\n this.onTheir(key, (val: any, k: string, pub: string) => callback(val, pub));\n }\n }\n\n async onGroup(key: string, callback: Function, from?: string) {\n if (!from || from === `me` || from === session.getKey().pub) {\n this.onMyGroup(key, val => callback(val, session.getKey().pub));\n }\n if (!from || (from !== `me` && from !== session.getKey().pub)) {\n this.onTheirGroup(key, (val, k, pub) => callback(val, pub));\n }\n }\n\n async onMy(key: string, callback: Function) {\n return (this.uuid ? this.onMyGroup : this.onMyDirect).call(this, key, callback);\n }\n\n async onMyDirect(key: string, callback: Function) {\n if (typeof callback !== 'function') {\n throw new Error(`onMy callback must be a function, got ${typeof callback}`);\n }\n const keys = this.getCurrentParticipants();\n for (let i = 0;i < keys.length;i++) {\n const ourSecretChannelId = await this.getOurSecretChannelId(keys[i]);\n publicState().user().get(`chats`).get(ourSecretChannelId).get(key).on(async (data: any) => {\n const decrypted = await Key.decrypt(data, (await this.getSecret(keys[i])));\n if (decrypted) {\n callback(typeof decrypted.v !== `undefined` ? decrypted.v : decrypted, key);\n }\n });\n break;\n }\n }\n\n async onMyGroup(key, callback) {\n if (typeof callback !== 'function') {\n throw new Error(`onMy callback must be a function, got ${typeof callback}`);\n }\n const mySecretUuid = await this.getMySecretUuid();\n const mySecret = await this.getMyGroupSecret();\n publicState().user().get(`chats`).get(mySecretUuid).get(key).on(async data => {\n const decrypted = await Key.decrypt(data, mySecret);\n if (decrypted) {\n callback(typeof decrypted.v !== `undefined` ? decrypted.v : decrypted, key, session.getKey().pub);\n }\n });\n }\n\n async onTheir(key: string, callback: Function, from: string) {\n return (this.uuid ? this.onTheirGroup : this.onTheirDirect).call(this, key, callback, from);\n }\n\n async _onTheirDirectFromUser(key: string, callback: Function, pub: string) {\n if (!this.hasWritePermission(pub)) { return; }\n const theirSecretChannelId = await this.getTheirSecretChannelId(pub);\n publicState().user(pub).get(`chats`).get(theirSecretChannelId).get(key).on(async (data: any) => {\n if (!this.hasWritePermission(pub)) { return; }\n const decrypted = await Key.decrypt(data, (await this.getSecret(pub)));\n if (decrypted) {\n callback(typeof decrypted.v !== `undefined` ? decrypted.v : decrypted, key, pub);\n }\n });\n }\n\n async onTheirDirect(key: string, callback: Function, from: string) { // TODO: subscribe to new channel participants\n if (typeof callback !== 'function') {\n throw new Error(`onTheir callback must be a function, got ${typeof callback}`);\n }\n if (!Object.prototype.hasOwnProperty.call(this.directSubscriptions, key)) {\n this.directSubscriptions[key] = [];\n }\n this.directSubscriptions[key].push({key, callback, from});\n const participants = this.getCurrentParticipants();\n participants.forEach(async pub => {\n if (from && pub !== from) { return; }\n this._onTheirDirectFromUser(pub, key, callback);\n });\n }\n\n hasWritePermission(pub) {\n return !this.uuid || (this.participants && this.participants[pub] && this.participants[pub].write);\n }\n\n async _onTheirGroupFromUser(pub: string, key: string, callback: Function, subscription: any) {\n if (!this.hasWritePermission(pub)) { return; }\n const theirSecretUuid = await this.getTheirSecretUuid(pub);\n publicState().user(pub).get(`chats`).get(theirSecretUuid).get(key).on(async (data: any, _a: any, _b: any, e: Event) => {\n if (subscription) { subscription.event = e; }\n if (!this.hasWritePermission(pub)) { return; }\n const decrypted = await Key.decrypt(data, (await this.getTheirGroupSecret(pub)));\n if (decrypted) {\n callback(typeof decrypted.v !== `undefined` ? decrypted.v : decrypted, key, pub);\n }\n });\n }\n\n async onTheirGroup(key, callback, from) {\n if (typeof callback !== 'function') {\n throw new Error(`onTheir callback must be a function, got ${typeof callback}`);\n }\n if (!Object.prototype.hasOwnProperty.call(this.groupSubscriptions, key)) {\n this.groupSubscriptions[key] = [];\n }\n const subscription = {key, callback, from};\n this.groupSubscriptions[key].push(subscription);\n\n this.getParticipants(participants => {\n Object.keys(participants).forEach(async pub => {\n if (from && pub !== from) { return; }\n if (!(participants[pub] && participants[pub].write)) { return; }\n this._onTheirGroupFromUser(pub, key, callback, subscription);\n });\n });\n }\n\n /**\n * Set typing status\n */\n setTyping(isTyping, timeout = 5) {\n isTyping = typeof isTyping === `undefined` ? true : isTyping;\n timeout = timeout * 1000;\n this.put(`typing`, isTyping ? new Date().toISOString() : new Date(0).toISOString());\n clearTimeout(this.setTypingTimeout);\n this.setTypingTimeout = setTimeout(() => this.put(`typing`, false), timeout);\n }\n\n /**\n * Get typing status\n */\n getTyping(callback, timeout = 5) { // TODO callback not called on setTyping(false), at least for self chat\n timeout = timeout * 1000;\n this.onTheir(`typing`, (typing, key, pub) => {\n if (callback) {\n const isTyping = typing && new Date() - new Date(typing) <= timeout;\n callback(isTyping, pub);\n this.getTypingTimeouts = this.getTypingTimeouts || {};\n clearTimeout(this.getTypingTimeouts[pub]);\n if (isTyping) {\n this.getTypingTimeouts[pub] = setTimeout(() => callback(false, pub), timeout);\n }\n }\n });\n }\n\n /**\n * Get a simple link that points to the channel.\n *\n * Direct channel: both users need to give their simple links. Use createChatLink() to get a two-way link that needs to be given by one user only.\n *\n * Group channel: Works only if the link recipient has been already added onto the channel participants list.\n */\n getSimpleLink(urlRoot = 'https://iris.to/') {\n if (this.uuid) {\n return `${urlRoot}?channelId=${this.uuid}&inviter=${session.getKey().pub}`;\n }\n return `${urlRoot}?chatWith=${this.getCurrentParticipants()[0]}`;\n }\n\n /**\n *\n */\n async getChatLinks(opts: any = {}) {\n let {callback, urlRoot, subscribe} = opts;\n urlRoot = urlRoot || 'https://iris.to/';\n if (!this.uuid) { throw new Error('Only group channels may have chat links'); }\n const chatLinks: any[] = [];\n const chatLinkSubscriptions = {};\n this.on('chatLinks', (links: any, from: string) => {\n // TODO: check admin permissions\n if (!links || typeof links !== 'object') { return; }\n Object.keys(links).forEach(linkId => {\n const link = links[linkId];\n if (link === null) {\n chatLinkSubscriptions[linkId] && chatLinkSubscriptions[linkId].off(); // unsubscribe removed chat link\n delete chatLinkSubscriptions[linkId];\n callback && callback({id: linkId, url: null});\n return;\n }\n if (chatLinks.indexOf(linkId) !== -1) { return; }\n const channels = [];\n chatLinks.push(linkId);\n const url = Channel.formatChatLink({urlRoot, inviter: from, channelId: this.uuid, sharedSecret: link.sharedSecret, linkId});\n callback && callback({url, id: linkId});\n if (subscribe) {\n publicState().user(link.sharedKey.pub).get('chatRequests').map(async (encPub, requestId, a, e) => {\n if (!encPub || typeof encPub !== 'string' || encPub.length < 10) { return; }\n chatLinkSubscriptions[linkId] = e;\n const s = JSON.stringify(encPub);\n if (channels.indexOf(s) === -1) {\n channels.push(s);\n const pub = await Key.decrypt(encPub, link.sharedSecret);\n this.addParticipant(pub, undefined, undefined, true);\n }\n });\n }\n });\n });\n }\n\n async createChatLink(urlRoot = 'https://iris.to/') {\n const sharedKey = await Key.generate();\n const sharedKeyString = JSON.stringify(sharedKey);\n const sharedSecret = await Key.secret(sharedKey.epub, sharedKey);\n const encryptedSharedKey = await Key.encrypt(sharedKeyString, sharedSecret);\n const ownerSecret = await Key.secret(session.getKey().epub, session.getKey());\n const ownerEncryptedSharedKey = await Key.encrypt(sharedKeyString, ownerSecret);\n let linkId = await util.getHash(encryptedSharedKey);\n linkId = linkId.slice(0, 12);\n\n // User has to exist, in order for .get(chatRequests).on() to be ever triggered\n publicState(sharedKey).get('chatRequests').put({a: 1});\n\n this.chatLinks[linkId] = {sharedKey, sharedSecret};\n this.put('chatLinks', this.chatLinks);\n userState().get('chatLinks').get(linkId).put({encryptedSharedKey, ownerEncryptedSharedKey});\n\n return Channel.formatChatLink({urlRoot, channelId: this.uuid, inviter: session.getKey().pub, sharedSecret, linkId});\n }\n\n /**\n * Set the user's online/active status\n * @param {string} activity string: set the activity status every 3 seconds, null/false: stop updating\n */\n static setActivity(activity) {\n if (publicState().irisActivityStatus === activity) { return; }\n publicState().irisActivityStatus = activity;\n clearTimeout(publicState().setActivityTimeout);\n const update = () => {\n publicState().user().get(`activity`).put({status: activity, time: new Date().toISOString()});\n };\n update();\n function timerUpdate() {\n update();\n publicState().setActivityTimeout = setTimeout(timerUpdate, 3000);\n }\n if (activity) {\n timerUpdate();\n }\n }\n\n /**\n * Get the online status of a user.\n *\n * @param {string} pubKey public key of the user\n * @param {boolean} callback receives a boolean each time the user's online status changes\n */\n static getActivity(pubKey, callback) {\n let timeout;\n publicState().user(pubKey).get(`activity`).on(activity => {\n if (!activity || !(activity.time && activity.status)) { return; }\n clearTimeout(timeout);\n const now = new Date();\n const activityDate = new Date(activity.time);\n const isActive = activityDate > new Date(now.getTime() - 10 * 1000) && activityDate < new Date(now.getTime() + 30 * 1000);\n callback({isActive, lastActive: activity.time, status: activity.status});\n if (isActive) {\n timeout = setTimeout(() => callback({isOnline: false, lastActive: activity.time}), 10000);\n }\n });\n }\n\n static formatChatLink({urlRoot, chatWith, channelId, inviter, sharedSecret, linkId}) {\n const enc = encodeURIComponent;\n if (channelId && inviter) {\n return `${urlRoot}?channelId=${enc(channelId)}&inviter=${enc(inviter)}&s=${enc(sharedSecret)}&k=${enc(linkId)}`;\n }\n return `${urlRoot}?chatWith=${enc(chatWith)}&s=${enc(sharedSecret)}&k=${enc(linkId)}`;\n }\n\n /**\n * Creates a channel link that can be used for two-way communication, i.e. only one link needs to be exchanged.\n */\n static async createChatLink(urlRoot = 'https://iris.to/') {\n const user = publicState().user();\n const key = session.getKey();\n\n // We create a new Gun user whose private key is shared with the chat link recipients.\n // Chat link recipients can contact you by writing their public key to the shared key's user space.\n const sharedKey = await Key.generate();\n const sharedKeyString = JSON.stringify(sharedKey);\n const sharedSecret = await Key.secret(sharedKey.epub, sharedKey);\n const encryptedSharedKey = await Key.encrypt(sharedKeyString, sharedSecret);\n const ownerSecret = await Key.secret(key.epub, key);\n const ownerEncryptedSharedKey = await Key.encrypt(sharedKeyString, ownerSecret);\n let linkId = await util.getHash(encryptedSharedKey);\n linkId = linkId.slice(0, 12);\n\n // User has to exist, in order for .get(chatRequests).on() to be ever triggered\n publicState(sharedKey).get('chatRequests').put({a: 1}).get('chatRequests').put({a: 1});\n\n user.get('chatLinks').get(linkId).put({encryptedSharedKey, ownerEncryptedSharedKey});\n\n return Channel.formatChatLink({urlRoot, chatWith: key.pub, sharedSecret, linkId});\n }\n\n /**\n *\n */\n static async getMyChatLinks(urlRoot = 'https://iris.to/', callback: Function, subscribe = false) {\n const key = session.getKey();\n const user = publicState().user();\n const mySecret = await Key.secret(key.epub, key);\n const chatLinks = [];\n user.get('chatLinks').map((data, linkId) => {\n if (!data || chatLinks.indexOf(linkId) !== -1) { return; }\n const channels = [];\n user.get('chatLinks').get(linkId).get('ownerEncryptedSharedKey').on(async enc => {\n if (!enc || chatLinks.indexOf(linkId) !== -1) { return; }\n chatLinks.push(linkId);\n const sharedKey = await Key.decrypt(enc, mySecret);\n const sharedSecret = await Key.secret(sharedKey.epub, sharedKey);\n const url = Channel.formatChatLink({urlRoot, chatWith: key.pub, sharedSecret, linkId});\n if (callback) {\n callback({url, id: linkId});\n }\n if (subscribe) {\n publicState().user(sharedKey.pub).get('chatRequests').map(async (encPub, requestId) => {\n if (!encPub) { return; }\n const s = JSON.stringify(encPub);\n if (channels.indexOf(s) === -1) {\n channels.push(s);\n const pub = await Key.decrypt(encPub, sharedSecret);\n const channel = new Channel({key, participants: pub});\n channel.save();\n }\n publicState(sharedKey).get('chatRequests').get(requestId).put(null);\n });\n }\n });\n });\n }\n\n /**\n *\n */\n removeGroupChatLink(linkId) {\n this.chatLinks[linkId] = null;\n this.put('chatLinks', this.chatLinks);\n publicState().user().get('chatLinks').get(linkId).put(null);\n }\n\n /**\n *\n */\n static removePrivateChatLink(key, linkId) {\n publicState().user().auth(key);\n publicState().user().get('chatLinks').get(linkId).put(null);\n }\n\n /**\n *\n */\n static async deleteChannel(key, pub) {\n publicState().user().auth(key);\n const channelId = await Channel.getOurSecretChannelId(pub, key);\n publicState().user().get('channels').get(channelId).put(null);\n publicState().user().get('channels').get(channelId).off();\n }\n\n /**\n *\n */\n static async deleteGroup(key, uuid) {\n const mySecret = await Key.secret(key.epub, key);\n const mySecretHash = await util.getHash(mySecret);\n const mySecretUuid = await util.getHash(mySecretHash + uuid);\n publicState().user().auth(key);\n publicState().user().get('channels').get(mySecretUuid).put(null);\n publicState().user().get('channels').get(mySecretUuid).off();\n }\n}\n\nexport default Channel;\n","import Node from './db/Node';\n\nlet local: Node;\n\n/**\n * Get a state that is only synced in memory and local storage.\n *\n * Useful for storing things like UI state, local indexes or logged in user.\n * @returns {Node}\n */\nexport default function() {\n if (!local) {\n local = new Node('local');\n }\n return local;\n}","import Channel from './Channel';\nimport session from './session';\n\nconst channels = new Map();\n\n/**\n * Private channel that only you and publicKey can read/write.\n * @param publicKey\n * @returns {Channel}\n */\nexport default function(publicKey = session.getKey(), chatLink?: string): Channel {\n let channel = channels.get(publicKey);\n if (!channel) {\n channel = new Channel({participants: publicKey, chatLink})\n channels.set(publicKey, channel);\n }\n return channel;\n}","import local from './local';\n\nlet blockedUsers: { [key: string]: boolean } = {};\n\nexport default function() {\n if (!blockedUsers) {\n blockedUsers = {};\n local().get('block').map((isBlocked: boolean, user: string) => {\n if (isBlocked === blockedUsers[user]) { return; }\n if (isBlocked) {\n blockedUsers[user] = isBlocked;\n local().get('groups').map((_v: any, k: string) => {\n local().get('groups').get(k).get(user).put(false);\n });\n } else {\n delete blockedUsers[user];\n }\n });\n }\n return blockedUsers;\n}","import local from \"./local\";\nimport userSpace from './public';\nimport blockedUsers from './blockedUsers';\n\nlet counter = 0;\nconst cache = new Map>();\nconst callbacks = new Map();\n\ntype Event = {\n off: () => void;\n}\n\n/**\n * Aggregates public data from all users in the group.\n *\n * For example, the public message feed, message replies and likes are aggregated using this.\n * @param groupName\n * @returns object\n */\nexport default function(groupName = 'everyone') {\n return {\n get(path: string, callback: any) {\n const groupNode = local().get('groups').get(groupName);\n const follows: { [key: string]: boolean; } = {};\n requestAnimationFrame(() => {\n groupNode.map((isFollowing: any, user: string) => {\n if (blockedUsers()[user]) { return; } // TODO: allow to specifically query blocked users?\n if (follows[user] && follows[user] === isFollowing) { return; }\n follows[user] = isFollowing;\n if (isFollowing) { // TODO: callback on unfollow, for unsubscribe\n let node = userSpace(user);\n if (path && path !== '/') {\n node = path.split('/').reduce((sum:any, s:string) => sum.get(decodeURIComponent(s)), node);\n }\n callback(node, user);\n }\n });\n });\n },\n\n _cached_map(cached: Map | undefined, cacheKey: string, path: string, myEvent: Event, callback: Function) {\n if (!cached) {\n const cached = new Map();\n cache.set(cacheKey, cached);\n this.get(path, (node: any, from: string) => node.map((value: any, key: string, x: any) => {\n const item = {value, key, from};\n cached.set(key, item);\n for (let cb of callbacks.get(cacheKey).values()) {\n cb(value, key, x, myEvent, from);\n }\n }));\n } else {\n for (let item of cached.values()) {\n callback(item.value, item.key, 0, myEvent, item.from);\n }\n }\n },\n\n // TODO: this should probably store just the most recent value, not everyone's value\n // TODO: for counting of likes etc, use this.count() instead\n _cached_on(cached: Map | undefined, cacheKey: string, path: string, myEvent: Event, callback: Function) {\n if (!cached) {\n const cached = new Map();\n cache.set(cacheKey, cached);\n this.get(path, (node: any, from: string) => node.on((value: any, key: string, x: any) => {\n const item = {value, key, from};\n cached.set(from, item);\n for (let cb of callbacks.get(cacheKey).values()) {\n cb(value, key, x, myEvent, from);\n }\n }));\n } else {\n for (let item of cached.values()) {\n callback(item.value, item.key, 0, myEvent, item.from);\n }\n }\n },\n\n _cached_count(cached: Map | undefined, cacheKey: string, path: string, myEvent: Event, callback: Function) {\n if (!cached) {\n const cached = new Map();\n cache.set(cacheKey, cached);\n this.get(path, (node: any, from: string) => node.on((value: any, key: string) => {\n value ? cached.set(from, true) : cached.delete(from);\n const count = cached.size;\n for (let cb of callbacks.get(cacheKey).values()) {\n cb(count, key, null, myEvent, from);\n }\n }));\n } else {\n callback(cached.size, path.split('/').pop(), null, myEvent);\n }\n },\n\n _cached_fn(fn: string, path: string, callback: Function) {\n const cacheKey = `${fn}:${groupName}:${path}`;\n\n let callbackId = counter++;\n if (callbacks.has(cacheKey)) {\n callbacks.get(cacheKey).set(callbackId, callback);\n } else {\n callbacks.set(cacheKey, new Map([[callbackId, callback]]));\n }\n\n const myEvent = {off: () => {\n let myCallbacks = callbacks.get(cacheKey);\n myCallbacks && myCallbacks.delete(callbackId);\n }};\n\n const cached = cache.get(cacheKey);\n\n switch (fn) {\n case 'map':\n this._cached_map(cached, cacheKey, path, myEvent, callback);\n break;\n case 'on':\n this._cached_on(cached, cacheKey, path, myEvent, callback);\n break;\n case 'count':\n this._cached_count(cached, cacheKey, path, myEvent, callback);\n break;\n }\n },\n\n map(path: string, callback: Function) { // group queries are slow, so we cache them\n this._cached_fn('map', path, callback);\n },\n\n on(path: string, callback: Function) {\n this._cached_fn('on', path, callback);\n },\n\n count(path: string, callback: Function) {\n this._cached_fn('count', path, callback);\n }\n }\n}","// @ts-nocheck\n\nimport _ from './lodash';\nimport session from './session';\nimport util from './util';\nimport publicState from './global';\nimport privateState from './private';\nimport local from './local';\nimport group from './group';\nimport Key from './Key';\n\nconst NOTIFICATION_SERVICE_URL = 'https://iris-notifications.herokuapp.com/notify';\n// const notificationSound = new Audio('../../assets/audio/notification.mp3'); // TODO\nlet loginTime;\nlet unseenMsgsTotal = 0;\nlet unseenNotificationCount = 0;\nconst webPushSubscriptions = {};\n\nfunction desktopNotificationsEnabled() {\n return window.Notification && Notification.permission === 'granted';\n}\n\nfunction notifyMsg(msg, info, channelId, onClick) {\n function shouldNotify() {\n if (msg.timeObj < loginTime) { return false; }\n if (info.selfAuthored) { return false; }\n if (document.visibilityState === 'visible') { return false; }\n const channel = privateState(channelId);\n if (channel.notificationSetting === 'nothing') { return false; }\n if (channel.notificationSetting === 'mentions' && !msg.text.includes(session.getMyName())) { return false; }\n return true;\n }\n function shouldDesktopNotify() {\n if (!desktopNotificationsEnabled()) { return false; }\n return shouldNotify();\n }\n function shouldAudioNotify() {\n return shouldNotify();\n }\n if (shouldAudioNotify()) {\n //notificationSound.play(); // TODO\n }\n if (shouldDesktopNotify()) {\n let body, title;\n const channel = privateState(channelId);\n if (channel.uuid) {\n title = channel.participantProfiles[info.from].name;\n body = `${name}: ${msg.text}`;\n } else {\n title = 'Message'\n body = msg.text;\n }\n body = util.truncateString(body, 50);\n let desktopNotification = new Notification(title, { // TODO: replace with actual name\n icon: '/assets/img/icon128.png',\n body,\n silent: true\n });\n desktopNotification.onclick = function() {\n changeUnseenNotificationCount(-1);\n onClick && onClick();\n window.focus();\n };\n }\n}\n\nfunction changeChatUnseenMsgsCount(chatId, change) {\n const chat = privateState(chatId);\n if (!chat) return;\n const chatNode = local().get('channels').get(chatId);\n if (change) {\n unseenMsgsTotal += change;\n chat.unseen += change;\n } else {\n unseenMsgsTotal = unseenMsgsTotal - (chat.unseen || 0);\n chat.unseen = 0;\n }\n chatNode.get('unseen').put(chat.unseen);\n unseenMsgsTotal = unseenMsgsTotal >= 0 ? unseenMsgsTotal : 0;\n local().get('unseenMsgsTotal').put(unseenMsgsTotal);\n}\n\nconst publicVapidKey = 'BMqSvZArOIdn7vGkYplSpkZ70-Qt8nhYbey26WVa3LF3SwzblSzm3n3HHycpNkAKVq7MCkrzFuTFs_en7Y_J2MI';\n\nfunction urlBase64ToUint8Array(base64String) {\n const padding = '='.repeat((4 - base64String.length % 4) % 4);\n const base64 = (base64String + padding)\n .replace(/-/g, '+')\n .replace(/_/g, '/');\n\n const rawData = window.atob(base64);\n const outputArray = new Uint8Array(rawData.length);\n\n for (let i = 0; i < rawData.length; ++i) {\n outputArray[i] = rawData.charCodeAt(i);\n }\n return outputArray;\n}\n\nasync function subscribe(reg) {\n try {\n const subscription = await reg.pushManager.subscribe({\n userVisibleOnly: true,\n applicationServerKey: urlBase64ToUint8Array(publicVapidKey)\n });\n addWebPushSubscription(subscription);\n } catch (e) {\n console.error('web push subscription error', e);\n }\n}\n\nasync function subscribeToWebPush() {\n console.log('subscribing to web push', navigator.serviceWorker);\n if (!desktopNotificationsEnabled() || !navigator.serviceWorker) { return false; }\n await navigator.serviceWorker.ready;\n const reg = await navigator.serviceWorker.getRegistration();\n reg.active.postMessage({key: session.getKey()});\n const sub = await reg.pushManager.getSubscription();\n sub ? addWebPushSubscription(sub) : subscribe(reg);\n}\n\nconst addWebPushSubscriptionsToChats = _.debounce(() => {\n const arr = Object.values(webPushSubscriptions);\n session.channelIds.forEach(channelId => {\n privateState(channelId).put('webPushSubscriptions', arr);\n });\n}, 5000);\n\nfunction removeSubscription(hash) {\n delete webPushSubscriptions[hash];\n publicState().user().get('webPushSubscriptions').get(hash).put(null);\n addWebPushSubscriptionsToChats();\n}\n\nasync function addWebPushSubscription(s, saveToGun = true) {\n const myKey = session.getKey();\n const mySecret = await Key.secret(myKey.epub, myKey);\n const enc = await Key.encrypt(s, mySecret);\n const hash = await util.getHash(JSON.stringify(s));\n if (saveToGun) {\n publicState().user().get('webPushSubscriptions').get(hash).put(enc);\n }\n webPushSubscriptions[hash] = s;\n addWebPushSubscriptionsToChats();\n}\n\nasync function getWebPushSubscriptions() {\n const myKey = session.getKey();\n const mySecret = await Key.secret(myKey.epub, myKey);\n publicState().user().get('webPushSubscriptions').map(async enc => {\n if (!enc) { return; }\n const s = await Key.decrypt(enc, mySecret);\n addWebPushSubscription(s, false);\n });\n}\n\nfunction getEpub(user) {\n return new Promise(resolve => {\n publicState().user(user).get('epub').on(async (epub,k,x,e) => {\n if (epub) {\n e.off();\n resolve(epub);\n }\n });\n });\n}\n\nasync function getNotificationText(notification) {\n const profile = await publicState().user(notification.from).get('profile').once();\n const name = (profile && profile.name) || 'someone';\n const event = notification.event || notification.action;\n let eventText;\n if (event === 'like') eventText = `${name} liked your post`;\n else if (event === 'reply') eventText = `${name} replied to your post`;\n else if (event === 'mention') eventText = `${name} mentioned you in their post`;\n else if (event === 'follow') eventText = `${name} started following you`;\n else eventText = `${name} sent you a notification: ${event}`;\n return eventText;\n}\n\nfunction subscribeToIrisNotifications(onClick?: Function) {\n let notificationsSeenTime: any;\n let notificationsShownTime: any;\n publicState().user().get('notificationsSeenTime').on(v => {\n notificationsSeenTime = v;\n console.log(v);\n });\n publicState().user().get('notificationsShownTime').on(v => notificationsShownTime = v);\n const setNotificationsShownTime = _.debounce(() => {\n publicState().user().get('notificationsShownTime').put(new Date().toISOString());\n }, 1000);\n const alreadyHave = new Set();\n group().on(`notifications/${session.getPubKey()}`, async (encryptedNotification, k, x, e, from) => {\n const id = from.slice(0,30) + encryptedNotification.slice(0,30);\n if (alreadyHave.has(id)) { return; }\n alreadyHave.add(id);\n const epub = await getEpub(from);\n const secret = await Key.secret(epub, session.getKey());\n const notification = await Key.decrypt(encryptedNotification, secret);\n if (!notification || typeof notification !== 'object') { return; }\n setNotificationsShownTime();\n notification.from = from;\n local().get('notifications').get(notification.time).put(notification);\n if (!notificationsSeenTime || (notificationsSeenTime < notification.time)) {\n changeUnseenNotificationCount(1);\n }\n if (!notificationsShownTime || notificationsShownTime < notification.time) {\n console.log('was new!');\n const text = await getNotificationText(notification);\n let desktopNotification = new Notification(text, {\n icon: '/assets/img/icon128.png',\n body: text,\n silent: true\n });\n desktopNotification.onclick = function() {\n const link = notification.target ? `/post/${notification.target}` : `/profile/${notification.from}`;\n onClick && onClick(link);\n changeUnseenNotificationCount(-1);\n window.focus();\n };\n }\n });\n}\n\nfunction changeUnseenNotificationCount(change) {\n if (!change) {\n unseenNotificationCount = 0;\n publicState().user().get('notificationsSeenTime').put(new Date().toISOString());\n } else {\n unseenNotificationCount += change;\n unseenNotificationCount = Math.max(unseenNotificationCount, 0);\n }\n local().get('unseenNotificationCount').put(unseenNotificationCount);\n}\n\nasync function sendIrisNotification(recipient, notification) {\n if (!(recipient && notification)) { return; } // TODO: use typescript or sth :D\n if (typeof notification === 'object') { notification.time = new Date().toISOString() }\n const epub = await getEpub(recipient);\n const secret = await Key.secret(epub, session.getKey());\n const enc = await Key.encrypt(notification, secret);\n publicState().user().get('notifications').get(recipient).put(enc);\n}\n\nasync function sendWebPushNotification(recipient, notification) {\n console.log('sending web push notification to', recipient, notification);\n const channel = privateState(recipient);\n const myKey = session.getKey();\n const shouldWebPush = (recipient === myKey.pub) || !(channel.activity && channel.activity.isActive);\n if (shouldWebPush && channel.webPushSubscriptions) {\n const subscriptions = [];\n const participants = Object.keys(channel.webPushSubscriptions);\n for (let i = 0; i < participants.length; i++) {\n const participant = participants[i];\n const secret = await channel.getSecret(participant);\n const payload = {\n title: await Key.encrypt(notification.title, secret),\n body: await Key.encrypt(notification.body, secret),\n from:{pub: myKey.pub, epub: myKey.epub}\n };\n channel.webPushSubscriptions[participant].forEach(s => {\n if (s && s.endpoint) {\n subscriptions.push({subscription: s, payload});\n }\n });\n }\n if (subscriptions.length === 0) {return;}\n fetch(NOTIFICATION_SERVICE_URL, {\n method: 'POST',\n body: JSON.stringify({subscriptions}),\n headers: {\n 'content-type': 'application/json'\n }\n }).catch(() => {});\n }\n}\n\nfunction init() {\n loginTime = new Date();\n unseenMsgsTotal = 0;\n}\n\nexport default {init, notifyMsg, getNotificationText, sendWebPushNotification, changeUnseenNotificationCount, subscribeToIrisNotifications, sendIrisNotification, changeChatUnseenCount: changeChatUnseenMsgsCount, webPushSubscriptions, subscribeToWebPush, getWebPushSubscriptions, removeSubscription};\n","// @ts-nocheck\nimport Key from './Key';\nimport notifications from './notifications';\nimport Channel from './Channel';\nimport util from './util';\nimport _ from './lodash';\nimport Fuse from \"fuse.js\";\nimport local from './local';\nimport electron from './electron';\nimport user from './public';\nimport privateState from './private';\nimport blockedUsers from './blockedUsers';\n\nlet key: any;\nlet myName: string;\nlet latestChatLink: string;\nlet onlineTimeout: any;\nlet ourActivity: any;\nlet noFollows: boolean;\nlet noFollowers: boolean;\nlet searchIndex: any;\nlet initCalled: boolean;\nconst searchableItems: any = {};\nconst getExtendedFollowsCalled = new Map();\n\nconst DEFAULT_FOLLOW = 'hyECQHwSo7fgr2MVfPyakvayPeixxsaAWVtZ-vbaiSc.TXIp8MnCtrnW6n2MrYquWPcc-DTmZzMBmc2yaGv9gIU';\n\nconst DEFAULT_SETTINGS = {\n electron: {\n openAtLogin: true,\n minimizeOnClose: true\n },\n local: {\n enableWebtorrent: !util.isMobile,\n enablePublicPeerDiscovery: true,\n autoplayWebtorrent: true,\n maxConnectedPeers: util.isElectron ? 2 : 1\n }\n};\n\n/**\n * User session management utilities.\n */\nexport default {\n /**\n * Log in with a key from localStorage.\n *\n * If no key is found and options.autologin is not false, a new user will be created.\n *\n * If options.autofollow is not false, the default follow will be added.\n * @param options\n */\n init(options: any = {}) {\n if (initCalled) { return; }\n initCalled = true;\n let localStorageKey = localStorage.getItem('chatKeyPair');\n console.log('localStorageKey', localStorageKey);\n if (localStorageKey) {\n this.login(JSON.parse(localStorageKey));\n } else if (options.autologin !== false) {\n this.loginAsNewUser(options);\n } else {\n this.clearIndexedDB();\n }\n setTimeout(() => {\n local().get('block').map(() => {\n this.updateSearchIndex();\n });\n this.updateSearchIndex();\n });\n setInterval(() => {\n if (this.taskQueue.length) {\n //console.log('this.taskQueue', this.taskQueue.length);\n const t = this.taskQueue.shift();\n t && t();\n }\n }, 10);\n },\n\n DEFAULT_SETTINGS,\n DEFAULT_FOLLOW,\n\n taskQueue: [] as any[],\n\n updateSearchIndex: _.throttle(() => {\n const options = {keys: ['name'], includeScore: true, includeMatches: true, threshold: 0.3};\n const values = Object.values(_.omit(searchableItems, Object.keys(blockedUsers())));\n searchIndex = new Fuse(values, options);\n local().get('searchIndexUpdated').put(true);\n }, 2000, {leading:true}),\n\n saveSearchResult: _.throttle(k => {\n local().get('contacts').get(k).put({followDistance: searchableItems[k].followDistance,followerCount: searchableItems[k].followers.size});\n }, 1000, {leading:true}),\n\n addFollow(callback: Function, k: string, followDistance: number, follower?: string) {\n if (searchableItems[k]) {\n if (searchableItems[k].followDistance > followDistance) {\n searchableItems[k].followDistance = followDistance;\n }\n follower && searchableItems[k].followers.add(follower);\n } else {\n searchableItems[k] = {key: k, followDistance, followers: new Set(follower && [follower])};\n this.taskQueue.push(() => {\n user(k).get('profile').get('name').on((name: string) => {\n searchableItems[k].name = name;\n local().get('contacts').get(k).get('name').put(name);\n callback && callback(k, searchableItems[k]);\n });\n });\n }\n this.saveSearchResult(k);\n callback && callback(k, searchableItems[k]);\n this.updateSearchIndex();\n this.updateNoFollows();\n this.updateNoFollowers();\n },\n\n removeFollow(k: string, followDistance: number, follower: string) {\n if (followDistance === 1) {\n local().get('contacts').get(k).put(false);\n local().get('groups').get('follows').get(k).put(false);\n if (searchableItems[k]) {\n searchableItems[k].followers.delete(follower);\n this.updateNoFollows();\n this.updateNoFollowers();\n }\n }\n if (searchableItems[k] && searchableItems[k].followers.size === 0) {\n delete searchableItems[k];\n local().get('contacts').get(k).put(false);\n local().get('groups').get('everyone').get(k).put(false);\n }\n },\n\n getExtendedFollows(callback: Function, k = key.pub, maxDepth = 3, currentDepth = 1) {\n const called = getExtendedFollowsCalled.get(k);\n if (called && called <= currentDepth) {\n return;\n }\n getExtendedFollowsCalled.set(k, currentDepth);\n\n this.addFollow(callback, k, currentDepth - 1);\n\n user(k).get('follow').map((isFollowing: boolean, followedKey: string) => { // TODO: unfollow\n if (isFollowing) {\n this.addFollow(callback, followedKey, currentDepth, k);\n if (currentDepth < maxDepth) {\n this.taskQueue.push(() => this.getExtendedFollows(callback, followedKey, maxDepth, currentDepth + 1));\n }\n } else {\n this.removeFollow(followedKey, currentDepth, k);\n }\n });\n\n return searchableItems;\n },\n\n updateNoFollows: _.throttle(() => {\n const v = Object.keys(searchableItems).length <= 1;\n if (v !== noFollows) {\n noFollows = v;\n local().get('noFollows').put(noFollows);\n }\n }, 1000, {leading:true}),\n\n updateNoFollowers: _.throttle(() => {\n const v = !(searchableItems[key.pub] && (searchableItems[key.pub].followers.size > 0));\n if (v !== noFollowers) {\n noFollowers = v;\n local().get('noFollowers').put(noFollowers);\n }\n }, 1000, {leading:true}),\n\n getSearchIndex() {\n return searchIndex;\n },\n\n setOurOnlineStatus() {\n const activeRoute = window.location.hash;\n Channel.setActivity(ourActivity = 'active');\n const setActive = _.debounce(() => {\n const chatId = activeRoute && activeRoute.replace('#/profile/','').replace('#/chat/','');\n const chat = privateState(chatId);\n if (chat && !ourActivity) {\n chat.setMyMsgsLastSeenTime();\n }\n Channel.setActivity(ourActivity = 'active');\n clearTimeout(onlineTimeout);\n onlineTimeout = setTimeout(() => Channel.setActivity(ourActivity = 'online'), 30000);\n }, 1000);\n document.addEventListener(\"touchmove\", setActive);\n document.addEventListener(\"mousemove\", setActive);\n document.addEventListener(\"keypress\", setActive);\n document.addEventListener(\"visibilitychange\", () => {\n if (document.visibilityState === 'visible') {\n Channel.setActivity(ourActivity = 'active');\n const chatId = location.pathname.slice(1).replace('chat/','');\n const chat = activeRoute && privateState(chatId);\n if (chat) {\n chat.setMyMsgsLastSeenTime();\n notifications.changeChatUnseenCount(chatId, 0);\n }\n } else {\n Channel.setActivity(ourActivity = 'online');\n }\n });\n setActive();\n window.addEventListener(\"beforeunload\", () => {\n Channel.setActivity(ourActivity = null);\n });\n },\n\n updateGroups() {\n this.getExtendedFollows((k: string, info: any) => {\n if (info.followDistance <= 1) {\n local().get('groups').get('follows').get(k).put(true);\n }\n local().get('groups').get('everyone').get(k).put(true);\n if (k === this.getPubKey()) {\n this.updateNoFollowers();\n }\n });\n },\n\n /**\n * Log in with a private key.\n * @param key\n */\n login(k: any) {\n console.log('login', k);\n const shouldRefresh = !!key;\n console.log('shouldRefresh', shouldRefresh, 'key', key);\n key = k;\n localStorage.setItem('chatKeyPair', JSON.stringify(k));\n user().auth(key);\n user().put({epub: key.epub});\n notifications.subscribeToWebPush();\n notifications.getWebPushSubscriptions();\n //notifications.subscribeToIrisNotifications();\n Channel.getMyChatLinks( undefined, (chatLink: any) => {\n local().get('chatLinks').get(chatLink.id).put(chatLink.url);\n latestChatLink = chatLink.url;\n });\n this.setOurOnlineStatus();\n Channel.getChannels( (c: Channel) => this.addChannel(c));\n user().get('profile').get('name').on((name: any) => {\n if (name && typeof name === 'string') {\n myName = name;\n }\n });\n // a lot of this is iris-messenger stuff\n notifications.init();\n local().get('loggedIn').put(true);\n console.log('local().get(\\'loggedIn\\').put(true);', local());\n local().get('settings').once().then(settings => {\n if (!settings) {\n local().get('settings').put(DEFAULT_SETTINGS.local);\n } else if (settings.enableWebtorrent === undefined || settings.autoplayWebtorrent === undefined) {\n local().get('settings').get('enableWebtorrent').put(DEFAULT_SETTINGS.local.enableWebtorrent);\n local().get('settings').get('autoplayWebtorrent').put(DEFAULT_SETTINGS.local.autoplayWebtorrent);\n }\n });\n user().get('block').map((isBlocked: boolean, user: string) => {\n local().get('block').get(user).put(isBlocked);\n if (isBlocked) {\n delete searchableItems[user];\n }\n });\n this.updateGroups();\n if (shouldRefresh) {\n location.reload();\n }\n if (electron) {\n electron.get('settings').on(electron => {\n local().get('settings').get('electron').put(electron);\n });\n electron.get('user').put(key.pub);\n }\n local().get('filters').get('group').once().then(v => {\n if (!v) {\n local().get('filters').get('group').put('follows');\n }\n });\n },\n\n\n\n /**\n * Create a new user account and log in.\n * @param options {Object} - Options for the new account.\n * @returns {Promise<*>}\n */\n loginAsNewUser(options: any = {}) {\n const name = options.name || util.generateName();\n console.log('loginAsNewUser name', name);\n return Key.generate().then(k => {\n this.login(k);\n user().get('profile').put({a:null});\n user().get('profile').get('name').put(name);\n local().get('filters').put({a:null});\n local().get('filters').get('group').put('follows');\n Channel.createChatLink().then(l => latestChatLink = l);\n setTimeout(() => {\n if (options.autofollow !== false) {\n console.log('autofollowing', DEFAULT_FOLLOW);\n user().get('follow').get(DEFAULT_FOLLOW).put(true);\n }\n }, 1000); // maybe wait for login return instead\n });\n },\n\n /**\n * Log out the current user.\n * @returns {Promise}\n */\n async logOut() {\n if (electron) {\n electron.get('user').put(null);\n }\n // TODO: remove subscription from your channels\n if (navigator.serviceWorker) {\n const reg = await navigator.serviceWorker.getRegistration();\n if (reg && reg.pushManager) {\n reg.active?.postMessage({key: null});\n const sub = await reg.pushManager.getSubscription();\n if (sub) {\n const hash = await util.getHash(JSON.stringify(sub));\n notifications.removeSubscription(hash);\n sub.unsubscribe && sub.unsubscribe();\n }\n }\n }\n this.clearIndexedDB();\n localStorage.clear(); // TODO clear only iris data\n window.location.hash = '';\n window.location.href = '/';\n location.reload();\n },\n\n clearIndexedDB() {\n return new Promise(resolve => {\n const r1 = window.indexedDB.deleteDatabase('local()');\n const r2 = window.indexedDB.deleteDatabase('radata');\n let r1done = false;\n let r2done = false;\n const check = () => {\n r1done && r2done && resolve(undefined);\n }\n r1.onerror = r2.onerror = e => console.error(e);\n //r1.onblocked = r2.onblocked = e => console.error('blocked', e);\n r1.onsuccess = () => {\n r1done = true;\n check();\n }\n r2.onsuccess = () => {\n r2done = true;\n check();\n }\n });\n },\n\n getMyChatLink() {\n return latestChatLink || util.getProfileLink(key.pub);\n },\n\n /**\n * Get the keypair of the logged in user.\n * @returns {*}\n */\n getKey() { return key; },\n\n /**\n * Get the public key of the logged in user.\n * @returns {*}\n */\n getPubKey() {\n return key && key.pub;\n },\n\n /**\n * Get the name of the logged in user.\n * @returns {*}\n */\n getMyName() { return myName; }, // TODO maybe remove and use iris.user().get('profile').get('name') instead?\n\n myPeerUrl: (ip: string) => `http://${ip}:8767/gun`,\n\n async shareMyPeerUrl(channel: Channel) {\n const myIp = await local().get('settings').get('electron').get('publicIp').once();\n myIp && channel.put && channel.put('my_peer', this.myPeerUrl(myIp));\n },\n\n newChannel(pub: string, chatLink?: string) {\n if (!pub || this.channelIds.has(pub)) {\n return;\n }\n const chat = privateState(pub, chatLink);\n this.addChannel(chat);\n return chat;\n },\n\n addChannel(chat: Channel) {\n this.taskQueue.push(() => {\n let pub = chat.getId();\n if (this.channelIds.has(pub)) { return; }\n this.channelIds.add(pub);\n const chatNode = local().get('channels').get(pub);\n chatNode.get('latestTime').on((t: string) => {\n if (t && (!chat.latestTime || t > chat.latestTime)) {\n chat.latestTime = t;\n } else {\n // chatNode.get('latestTime').put(chat.latestTime); // omg recursion\n }\n });\n chatNode.get('theirMsgsLastSeenTime').on((t: string) => {\n if (!t) { return; }\n const d = new Date(t);\n if (!chat.theirMsgsLastSeenDate || chat.theirMsgsLastSeenDate < d) {\n chat.theirMsgsLastSeenDate = d;\n }\n });\n chat.getLatestMsg && chat.getLatestMsg((latest: any, info: any) => {\n this.processMessage(pub, latest, info);\n });\n notifications.changeChatUnseenCount(pub, 0);\n chat.notificationSetting = 'all';\n chat.onMy('notificationSetting', (val: any) => {\n chat.notificationSetting = val;\n });\n //$(\".chat-list\").append(el);\n chat.theirMsgsLastSeenTime = '';\n chat.getTheirMsgsLastSeenTime((time: any) => {\n if (chat && time && time >= chat.theirMsgsLastSeenTime) {\n chat.theirMsgsLastSeenTime = time;\n chatNode.get('theirMsgsLastSeenTime').put(time);\n }\n });\n chat.getMyMsgsLastSeenTime((time: any) => {\n chat.myLastSeenTime = new Date(time);\n if (chat.latest && chat.myLastSeenTime >= chat.latest.time) {\n notifications.changeChatUnseenCount(pub, 0);\n }\n });\n chat.isTyping = false;\n chat.getTyping(isTyping => {\n chat.isTyping = isTyping;\n local().get('channels').get(pub).get('isTyping').put(isTyping);\n });\n chat.online = {};\n Channel.getActivity(pub, (activity) => {\n if (chat) {\n chatNode.put({theirLastActiveTime: activity && activity.lastActive, activity: activity && activity.isActive && activity.status});\n chat.activity = activity;\n }\n });\n if (chat.uuid) {\n let isDarkMode = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches;\n chat.participantProfiles = {};\n chat.on('name', v => {\n chat.name = v;\n searchableItems[chat.uuid] = {name: v, uuid: chat.uuid};\n local().get('channels').get(chat.uuid).get('name').put(v);\n });\n chat.on('photo', v => {\n searchableItems[chat.uuid] = searchableItems[chat.uuid] || {};\n searchableItems[chat.uuid].photo = v;\n local().get('channels').get(chat.uuid).get('photo').put(v)\n });\n chat.on('about', v => local().get('channels').get(chat.uuid).get('about').put(v));\n chat.getParticipants(participants => {\n delete participants.undefined; // TODO fix where it comes from\n if (typeof participants === 'object') {\n let keys = Object.keys(participants);\n keys.forEach((k, i) => {\n let hue = 360 / Math.max(keys.length, 2) * i; // TODO use css filter brightness\n chat.participantProfiles[k] = {permissions: participants[k], color: `hsl(${hue}, 98%, ${isDarkMode ? 80 : 33}%)`};\n user(k).get('profile').get('name').on(name => {\n chat.participantProfiles[k].name = name;\n });\n });\n }\n local().get('channels').get(chat.uuid).get('participants').put(participants);\n });\n chat.inviteLinks = {};\n chat.getChatLinks({callback: ({url, id}) => {\n console.log('got chat link', id, url);\n chat.inviteLinks[id] = url; // TODO use State\n local().get('inviteLinksChanged').put(true);\n }});\n } else {\n // TODO do we want this?\n user(pub).get('profile').get('name').on(v => local().get('channels').get(pub).get('name').put(v))\n }\n if (chat.put) {\n chat.onTheir('webPushSubscriptions', (s, k, from) => {\n if (!Array.isArray(s)) { return; }\n chat.webPushSubscriptions = chat.webPushSubscriptions || {};\n chat.webPushSubscriptions[from || pub] = s;\n });\n const arr = Object.values(notifications.webPushSubscriptions);\n setTimeout(() => chat.put('webPushSubscriptions', arr), 5000);\n this.shareMyPeerUrl(chat);\n }\n chat.onTheir('call', call => {\n local().get('call').put({pub, call});\n });\n local().get('channels').get(pub).put({enabled:true});\n /* Disable private peer discovery, since they're not connecting anyway\n if (chat.onTheir) {\n chat.onTheir('my_peer', (url, k, from) => {\n console.log('Got private peer url', url, 'from', from);\n peers.addPeer({url, from})\n });\n }\n */\n\n });\n },\n\n // TODO: should perhaps be in Channel\n processMessage(chatId: string, msg: any, info: any, onClickNotification?: Function) {\n const chat = privateState(chatId);\n chat.messageIds = chat.messageIds || {};\n if (chat.messageIds[msg.time + info.from]) return;\n chat.messageIds[msg.time + info.from] = true;\n if (info) {\n msg = Object.assign(msg, info);\n }\n if (msg.invite) {\n const chatLink = `https://iris.to/?channelId=${msg.invite.group}&inviter=${chatId}`;\n this.newChannel(msg.invite.group, chatLink);\n return;\n }\n msg.selfAuthored = info.selfAuthored;\n local().get('channels').get(chatId).get('msgs').get(msg.time + (msg.from && msg.from.slice(0, 10))).put(JSON.stringify(msg));\n msg.timeObj = new Date(msg.time);\n if (!info.selfAuthored && msg.timeObj > chat.myLastSeenTime) {\n if (window.location.hash !== `#/chat/${ chatId}` || document.visibilityState !== 'visible') {\n notifications.changeChatUnseenCount(chatId, 1);\n } else if (ourActivity === 'active') {\n chat.setMyMsgsLastSeenTime();\n }\n }\n if (!info.selfAuthored && msg.time > chat.theirMsgsLastSeenTime) {\n local().get('channels').get(chatId).get('theirMsgsLastSeenTime').put(msg.time);\n }\n if (!chat.latestTime || (msg.time > chat.latestTime)) {\n local().get('channels').get(chatId).put({\n latestTime: msg.time,\n latest: {time: msg.time, text: msg.text, selfAuthored: info.selfAuthored}\n });\n }\n // TODO: onclickNotification should do route(`/chat/${ pub}`);\n notifications.notifyMsg(msg, info, chatId, onClickNotification);\n },\n\n subscribeToMsgs(pub) {\n const c = privateState(pub);\n if (c.subscribed) { return; }\n c.subscribed = true;\n c.getMessages((msg, info) => {\n this.processMessage(pub, msg, info);\n });\n },\n\n /**\n * Known private channels with other users\n */\n channelIds: new Set(),\n};\n","import util from \"./util\";\nimport Node from \"./db/Node\";\n\n// TODO config {peers: ['http://localhost:8768/gun'], file: 'State.electron', multicast:false, localStorage: false}\nconst electron = util.isElectron ? new Node('electron').get('state') : null;\n\nexport default electron;","import publicSpace from './global';\nimport util from './util';\n\n/**\n * Content-addressed storage\n */\nexport default {\n /**\n * Get a file identified by its hash\n * @param hash\n * @param callback\n * @returns {Promise}\n */\n get(hash: string, callback: Function) {\n return new Promise((resolve, reject) => {\n if (!hash) {\n reject('No hash provided');\n }\n if (typeof hash !== 'string') {\n reject('Hash must be a string');\n }\n publicSpace().get('#').get(hash).on((v: any, _k: string, _x: any, e: any) => {\n if (v) {\n e.off();\n callback && callback(v);\n resolve(v);\n }\n });\n });\n },\n\n /**\n * Store a file and return its hash\n * @param value\n * @returns {Promise}\n */\n async put(value: any) {\n const hash = await util.getHash(value);\n publicSpace().get('#').get(hash).put(value);\n return hash;\n }\n}","// @ts-nocheck\n\n/*jshint unused: false */\n`use strict`;\nimport util from './util';\nimport Attribute from './Attribute';\nimport Key from './Key';\n\nconst errorMsg = `Invalid message:`;\n\nclass ValidationError extends Error {}\n\n/**\n* Signed message object. Your friends can index and relay your messages, while others can still verify that they were signed by you.\n*\n* Fields: signedData, signer (public key) and signature.\n*\n* signedData has an author, signer, type, time and optionally other fields.\n*\n* signature covers the utf8 string representation of signedData. Since messages are digitally signed, users only need to care about the message signer and not who relayed it or whose index it was found from.\n*\n* signer is the entity that verified its origin. In other words: message author and signer can be different entities, and only the signer needs to use Iris.\n*\n* For example, a crawler can import and sign other people's messages from Twitter. Only the users who trust the crawler will see the messages.\n*\n* Constructor: creates a message from the param obj.signedData that must contain at least the mandatory fields: author, type and time.\n* @param obj\n*\n*/\nclass SignedMessage {\n signedData: any;\n pubKey: any;\n sig: any;\n\n constructor(obj: any) {\n this.signedData = obj.signedData;\n this.pubKey = obj.pubKey;\n if (obj.sig) {\n if (typeof obj.sig !== `string`) {\n throw new ValidationError(`SignedMessage signature must be a string`);\n }\n this.sig = obj.sig;\n this.getHash();\n }\n this._validate();\n }\n\n getSignerKeyID() {\n return this.pubKey; // hack until gun supports keyID lookups\n //return util.getHash(this.pubKey);\n }\n\n _validate() {\n if (!this.signedData) {throw new ValidationError(`${errorMsg} Missing signedData`);}\n if (typeof this.signedData !== `object`) {throw new ValidationError(`${errorMsg} signedData must be an object`);}\n const d = this.signedData;\n\n if (!d.type) {throw new ValidationError(`${errorMsg} Missing type definition`);}\n if (!d.author) {throw new ValidationError(`${errorMsg} Missing author`);}\n if (typeof d.author !== `object`) {throw new ValidationError(`${errorMsg} Author must be object`);}\n if (Array.isArray(d.author)) {throw new ValidationError(`${errorMsg} Author must not be an array`);}\n if (Object.keys(d.author).length === 0) {throw new ValidationError(`${errorMsg} Author empty`);}\n if (this.pubKey) {\n this.signerKeyHash = this.getSignerKeyID();\n }\n for (const attr in d.author) {\n const t = typeof d.author[attr];\n if (t !== `string`) {\n if (Array.isArray(d.author[attr])) {\n for (let i = 0;i < d.author[attr].length;i++) {\n if (typeof d.author[attr][i] !== `string`) {throw new ValidationError(`${errorMsg} Author attribute must be string, got ${attr}: [${d.author[attr][i]}]`);}\n if (d.author[attr][i].length === 0) {\n throw new ValidationError(`${errorMsg} author ${attr} in array[${i}] is empty`);\n }\n }\n } else {\n throw new ValidationError(`${errorMsg} Author attribute must be string or array, got ${attr}: ${d.author[attr]}`);\n }\n }\n if (attr === `keyID`) {\n if (t !== `string`) {throw new ValidationError(`${errorMsg} Author keyID must be string, got ${t}`);}\n if (this.signerKeyHash && d.author[attr] !== this.signerKeyHash) {throw new ValidationError(`${errorMsg} If message has a keyID author, it must be signed by the same key`);}\n }\n }\n if (d.recipient) {\n if (typeof d.recipient !== `object`) {throw new ValidationError(`${errorMsg} Recipient must be object`);}\n if (Array.isArray(d.recipient)) {throw new ValidationError(`${errorMsg} Recipient must not be an array`);}\n if (Object.keys(d.recipient).length === 0) {throw new ValidationError(`${errorMsg} Recipient empty`);}\n for (const attr in d.recipient) {\n const t = typeof d.recipient[attr];\n if (t !== `string`) {\n if (Array.isArray(d.recipient[attr])) {\n for (let i = 0;i < d.recipient[attr].length;i++) {\n if (typeof d.recipient[attr][i] !== `string`) {throw new ValidationError(`${errorMsg} Recipient attribute must be string, got ${attr}: [${d.recipient[attr][i]}]`);}\n if (d.recipient[attr][i].length === 0) {\n throw new ValidationError(`${errorMsg} recipient ${attr} in array[${i}] is empty`);\n }\n }\n } else {\n throw new ValidationError(`${errorMsg} Recipient attribute must be string or array, got ${attr}: ${d.recipient[attr]}`);\n }\n }\n }\n }\n if (!(d.time || d.timestamp)) {throw new ValidationError(`${errorMsg} Missing time field`);}\n\n if (!Date.parse(d.time || d.timestamp)) {throw new ValidationError(`${errorMsg} Invalid time field`);}\n\n return true;\n }\n\n /**\n * @param {Object} key keypair to sign the message with\n */\n async sign(key) {\n this.sig = await Key.sign(this.signedData, key);\n this.pubKey = key.pub;\n await this.getHash();\n return true;\n }\n\n /**\n * Create an iris message. SignedMessage time is automatically set. If signingKey is specified and author omitted, signingKey will be used as author.\n * @param {Object} signedData message data object including author, recipient and other possible attributes\n * @param {Object} signingKey optionally, you can set the key to sign the message with\n * @returns {Promise} message\n */\n static async create(signedData, signingKey) {\n if (!signedData.author && signingKey) {\n signedData.author = {keyID: Key.getId(signingKey)};\n }\n signedData.time = signedData.time || (new Date()).toISOString();\n const m = new SignedMessage({signedData});\n if (signingKey) {\n await m.sign(signingKey);\n }\n return m;\n }\n\n getAuthor(index) {\n for (const a of this.getAuthorIterable()) {\n if (a.isUniqueType()) {\n return index.getContacts(a);\n }\n }\n }\n\n getRecipient(index) {\n if (!this.signedData.recipient) {\n return undefined;\n }\n for (const a of this.getRecipientIterable()) {\n if (a.isUniqueType()) {\n return index.getContacts(a);\n }\n }\n }\n\n /**\n * @returns {string} base64 sha256 hash of message\n */\n async getHash() {\n if (this.sig && !this.hash) {\n this.hash = await util.getHash(this.sig);\n }\n return this.hash;\n }\n\n getId() {\n return this.getHash();\n }\n\n static async fromSig(obj) {\n if (!obj.sig) {\n throw new Error(`Missing signature in object:`, obj);\n }\n if (!obj.pubKey) {\n throw new Error(`Missing pubKey in object:`);\n }\n //const signedData = await Key.verify(obj.sig, obj.pubKey); // disable sig verification while migrating to new gun :(\n const signedData = JSON.parse(obj.sig.slice(4)).m;\n const o = {signedData, sig: obj.sig, pubKey: obj.pubKey};\n return new SignedMessage(o);\n }\n\n /**\n * @return {boolean} true if message signature is valid. Otherwise throws ValidationError.\n */\n async verify() {\n if (!this.pubKey) {\n throw new ValidationError(`${errorMsg} SignedMessage has no .pubKey`);\n }\n if (!this.sig) {\n throw new ValidationError(`${errorMsg} SignedMessage has no .sig`);\n }\n this.signedData = await Key.verify(this.sig, this.pubKey);\n if (!this.signedData) {\n throw new ValidationError(`${errorMsg} Invalid signature`);\n }\n if (this.hash) {\n if (this.hash !== (await util.getHash(this.sig))) {\n throw new ValidationError(`${errorMsg} Invalid message hash`);\n }\n } else {\n this.getHash();\n }\n return true;\n }\n\n /**\n * @returns {string}\n */\n serialize() {\n return {sig: this.sig, pubKey: this.pubKey};\n }\n\n toString() {\n return JSON.stringify(this.serialize());\n }\n\n /**\n * @returns {Promise}\n */\n static async deserialize(s) {\n return SignedMessage.fromSig(s);\n }\n\n static async fromString(s) {\n return SignedMessage.fromSig(JSON.parse(s));\n }\n}\n\nexport default SignedMessage;\n","/*eslint no-useless-escape: \"off\", camelcase: \"off\" */\n\nimport session from './session';\nimport peers from './peers';\nimport util from './util';\nimport local from './local';\nimport global from './global';\nimport publicState from './public';\nimport group from './group';\nimport electron from './electron';\nimport privateState from './private';\nimport staticState from './static';\nimport notifications from './notifications';\n\nimport SignedMessage from './SignedMessage';\nimport Channel from './Channel';\nimport Node from './db/Node';\nimport Key from './Key';\n\nexport default {\n local,\n global,\n group,\n public: publicState,\n private: privateState,\n static: staticState,\n electron,\n peers,\n session,\n util,\n notifications,\n SignedMessage,\n Channel,\n Node,\n Key\n};"],"names":["_","throttle","func","limit","inThrottle","args","arguments","context","this","apply","setTimeout","debounce","inDebounce","clearTimeout","sample","arr","Math","floor","random","length","sampleSize","size","temp","index","shuffled","slice","i","min","defer","once","called","omit","obj","keys","newObj","Object","forEach","key","includes","defaults","undefined","pickBy","predicate","isEqual","a","b","Date","getTime","prototype","every","k","uniq","set","Set","Array","from","isNode","toString","call","global","process","e","myKey","userAgent","navigator","toLowerCase","isElectron","indexOf","animals","adjectives","gunOnceDefined","node","Promise","resolve","on","val","_k","_a","eve","off","getHash","data","format","_context","Error","JSON","stringify","encoder","TextEncoder","encode","crypto","subtle","digest","buffer","hash","_this","arrayBufferToBase64","base64ToHex","capitalize","s","charAt","toUpperCase","generateName","str","raw","atob","result","hex","charCodeAt","binary","bytes","Uint8Array","len","byteLength","String","fromCharCode","window","btoa","getCaret","el","selectionStart","document","selection","focus","r","createRange","re","createTextRange","rc","duplicate","moveToBookmark","getBookmark","setEndPoint","text","getUrlParameter","sParam","sParams","sParameterName","sURLVariables","location","search","substring","split","decodeURIComponent","formatTime","date","t","toLocaleTimeString","timeStyle","formatDate","toLocaleString","dateStyle","getDaySeparatorText","dateStr","now","nowStr","toLocaleDateString","dayDifference","round","weekday","getProfileLink","pub","origin","encodeURIComponent","truncateString","createElement","type","cls","parent","setAttribute","appendChild","isMobile","check","vendor","test","substr","delay","getActiveKey","datadir","keyfile","fs","existsSync","privKeyFile","f","readFileSync","fromString","generate","newKey","writeFileSync","chmodSync","localStorage","getItem","setItem","getDefault","getActivePub","_context2","_this2","setActiveKey","save","util","getId","parse","ecdhSubtle","_context5","generateKey","name","namedCurve","then","_context3","exportKey","privateKey","priv","d","publicKey","x","y","sa","_context4","epriv","epub","dh","console","log","keyToJwk","jwk","kty","crv","ext","key_ops","sign","pair","cb","opt","_context6","_this3","importKey","m","Buffer","verify","_context7","_this4","buf","sig","secret","pubJwk","keysToEcdhJwk","assign","_context9","public","props","privJwk","privKey","_context8","deriveBits","rawBits","aeskey","salt","combo","_this5","_context10","keyB64","replace","jwkKey","alg","getRandomValues","encrypt","_context11","msg","rand","_this6","iv","aes","ct","decrypt","json","_context12","bufiv","bufct","_this7","tagLength","TextDecoder","decode","_e","ELECTRON_GUN_URL","DEFAULT_PEERS","wss://gun-rs.iris.to/gun","self","loc","host","is_localhost_but_not_dev","startsWith","hostname","endsWith","url","enabled","known","add","peer","visibility","Key","session","getKey","encryptedUrl","encryptedUrlHash","publicState","user","get","put","lastSeen","toISOString","connect","remove","disconnect","peerFromGun","getSaved","p","reset","isMixedContent","peers","disable","protocol","connectToLocalElectron","max","maxConnectedPeers","push","checkGunPeerCount","init","setInterval","Actor","id","c","_proto","handle","_message","postMessage","message","Message","fromObject","Get","Put","deserialize","dam","Hi","serialize","generateMsgId","globalState","nodeId","recipients","childKey","jsonStr","checksum","#",".","updatedNodes","inResponseTo","entries","children","myNodeId","childValue","value","updatedAt","_i3","_Object$entries3$_i","isUserSpace","_i4","_Object$entries4$_i","signatureObj","signature","signedStr",":",">","newFromKv","peerId","Memory","config","QuickLRU","maxSize","_inheritsLoose","handlePut","handleGet","store","putMessage","mergeAndSave","nodeName","existing","_i2","_Object$entries2$_i","MyDexie","dbName","version","stores","nodes","table","Dexie","IndexedDB","putQueue","values","map","notStored","db","bulkPut","err","error","queue","getQueue","bulkGet","callback","open","stack","throttledPut","path","throttledGet","has","savePath","Websocket","router","ws","WebSocket","onopen","sendQueue","send","onmessage","event","onclose","onerror","readyState","OPEN","CONNECTING","Router","Map","storageAdapters","serverPeers","seenMessages","sendTo","topic","join","subscribers","subscribersByTopic","storageAdapter","subscriber","opts","DEFAULT_CONFIG","allowPublicSpace","enableStats","localOnly","Node","on_subscriptions","_loop2","once_subscriptions","map_subscriptions","_loop","root","webSocketPeers","getCurrentUser","currentUser","setCurrentUser","childData","doCallbacks","newNode","auth","isArray","signIfNeeded","addParentNodes","signed","~","childName","pop","parentId","request","counter","myOpts","retry","Infinity","UNIQUE_ID_VALIDATORS","email","bitcoin","bitcoin_address","ip","ipv6","gpg_fingerprint","gpg_keyid","google_oauth2","tel","phone","keyID","account","uuid","Attribute","guessTypeOf","getUuid","getUniqueIdValidators","isUniqueType","match","equals","uri","userSpace","local","DEFAULT_PERMISSIONS","read","write","admin","Channel","options","myGroupSecret","chatLink","useChatLink","participants","addParticipant","o","founder","getChatLinks","subscribe","putDirect","getMyGroupSecret","getMySecretUuid","onTheirDirect","theirSecretUuids","theirGroupSecrets","onTheir","hasAdmin","inviter","participantsChanged","saved","chatWith","channelId","sharedSecret","linkId","encrypted","sharedKey","encryptedChatRequest","channelRequestId","getTheirSecretUuid","getTheirGroupSecret","changeMyGroupSecret","mute","participant","block","secrets","ourSecretChannelIds","theirSecretChannelIds","mySecretUuid","mySecret","mySecretHash","getCurrentParticipants","getParticipants","getParticipantsCallbackId","getParticipantsCallbacks","getSecret","getOurSecretChannelId","getTheirSecretChannelId","getChannels","listenToChatLinks","keypair","getMyChatLinks","seen","handleChannel","ourSecretChannelId","encryptedChatId","chatId","getMessages","theirSecretChannelId","messageReceived","userState","_context13","selfAuthored","messages","_context14","decrypted","info","getLatestMsg","callbackIfLatest","latest","time","onMy","setMyMsgsLastSeenTime","getMyMsgsLastSeenTime","myMsgsLastSeenTime","getTheirMsgsLastSeenTime","_this8","theirMsgsLastSeenTime","removeParticipant","permissions","_context21","_this9","directSubscriptions","_onTheirDirectFromUser","groupSubscriptions","_onTheirGroupFromUser","_context22","trim","_context23","putGroup","_context25","_context26","onGroup","onDirect","onMyGroup","onTheirGroup","onMyDirect","_context33","_context32","_this10","_context31","v","_context35","_context34","hasWritePermission","_context38","_this11","_context37","_context40","hasOwnProperty","_context39","_this12","subscription","_context42","theirSecretUuid","_b","_this13","_context41","_context44","_context43","_this14","setTyping","isTyping","timeout","setTypingTimeout","_this15","getTyping","typing","_this16","getTypingTimeouts","getSimpleLink","urlRoot","_opts","_context46","chatLinks","chatLinkSubscriptions","links","link","channels","formatChatLink","_this17","encPub","requestId","_context45","createChatLink","_context47","sharedKeyString","encryptedSharedKey","ownerSecret","ownerEncryptedSharedKey","setActivity","activity","irisActivityStatus","setActivityTimeout","update","status","timerUpdate","getActivity","pubKey","activityDate","isActive","lastActive","isOnline","enc","_context48","_context51","_context50","_context49","removeGroupChatLink","removePrivateChatLink","deleteChannel","_context52","deleteGroup","_context53","channel","blockedUsers","isBlocked","_v","cache","callbacks","groupName","groupNode","follows","requestAnimationFrame","isFollowing","reduce","sum","_cached_map","cached","cacheKey","myEvent","item","_cached_on","_cached_count","count","_cached_fn","fn","callbackId","myCallbacks","loginTime","unseenMsgsTotal","unseenNotificationCount","webPushSubscriptions","desktopNotificationsEnabled","Notification","permission","publicVapidKey","urlBase64ToUint8Array","base64String","base64","repeat","rawData","outputArray","_subscribe","reg","pushManager","userVisibleOnly","applicationServerKey","addWebPushSubscription","_subscribeToWebPush","serviceWorker","ready","getRegistration","active","getSubscription","sub","addWebPushSubscriptionsToChats","channelIds","privateState","_addWebPushSubscription","saveToGun","_getWebPushSubscriptions","getEpub","getNotificationText","_getNotificationText","notification","profile","action","changeUnseenNotificationCount","change","_sendIrisNotification","recipient","_sendWebPushNotification","subscriptions","title","body","payload","endpoint","fetch","method","headers","content-type","_ret","myName","latestChatLink","onlineTimeout","ourActivity","noFollows","noFollowers","searchIndex","initCalled","notifyMsg","onClick","shouldNotify","timeObj","visibilityState","notificationSetting","getMyName","participantProfiles","icon","silent","onclick","sendWebPushNotification","subscribeToIrisNotifications","notificationsSeenTime","notificationsShownTime","setNotificationsShownTime","alreadyHave","group","getPubKey","encryptedNotification","target","sendIrisNotification","changeChatUnseenCount","chat","chatNode","unseen","subscribeToWebPush","getWebPushSubscriptions","removeSubscription","electron","searchableItems","getExtendedFollowsCalled","DEFAULT_FOLLOW","DEFAULT_SETTINGS","openAtLogin","minimizeOnClose","enableWebtorrent","enablePublicPeerDiscovery","autoplayWebtorrent","localStorageKey","login","autologin","loginAsNewUser","clearIndexedDB","updateSearchIndex","taskQueue","shift","Fuse","includeScore","includeMatches","threshold","leading","saveSearchResult","followDistance","followerCount","followers","addFollow","follower","updateNoFollows","updateNoFollowers","removeFollow","getExtendedFollows","maxDepth","currentDepth","followedKey","getSearchIndex","setOurOnlineStatus","activeRoute","setActive","addEventListener","pathname","notifications","updateGroups","shouldRefresh","addChannel","settings","reload","l","autofollow","logOut","_reg$active","unsubscribe","clear","href","r1","indexedDB","deleteDatabase","r2","r1done","r2done","onsuccess","getMyChatLink","myPeerUrl","shareMyPeerUrl","myIp","newChannel","latestTime","theirMsgsLastSeenDate","processMessage","myLastSeenTime","online","theirLastActiveTime","isDarkMode","matchMedia","matches","photo","hue","color","inviteLinks","onClickNotification","messageIds","invite","subscribeToMsgs","subscribed","reject","publicSpace","_x","errorMsg","ValidationError","SignedMessage","signedData","_validate","getSignerKeyID","author","attr","signerKeyHash","timestamp","create","signingKey","getAuthor","getAuthorIterable","getContacts","getRecipient","getRecipientIterable","fromSig","private","static","staticState"],"mappings":"qgSACA,IAAMA,EAAI,CACRC,SAAU,SAACC,EAAgBC,GACzB,IAAIC,EACJ,OAAO,WACL,IAAMC,EAAOC,UACPC,EAAUC,KACXJ,IACHF,EAAKO,MAAMF,EAASF,GACpBD,GAAa,EACbM,YAAW,WAAA,OAAMN,GAAa,IAAOD,MAI3CQ,SAAU,SAACT,EAAgBC,GACzB,IAAIS,EACJ,OAAO,WACL,IAAMP,EAAOC,UACPC,EAAUC,KAChBK,aAAaD,GACbA,EAAaF,YAAW,WAAA,OAAMR,EAAKO,MAAMF,EAASF,KAAOF,KAG7DW,OAAQ,SAACC,GAAU,OAAKA,EAAIC,KAAKC,MAAMD,KAAKE,SAAWH,EAAII,UAC3DC,WAAY,SAACL,EAAYM,GAMvB,IALA,IAGIC,EACAC,EAJEC,EAAWT,EAAIU,MAAM,GACvBC,EAAIX,EAAII,OACRQ,EAAMD,EAAIL,EAGPK,KAAMC,GAEXL,EAAOE,EADPD,EAAQP,KAAKC,OAAOS,EAAI,GAAKV,KAAKE,WAElCM,EAASD,GAASC,EAASE,GAC3BF,EAASE,GAAKJ,EAEhB,OAAOE,EAASC,MAAME,IAExBC,MAAO,SAAC1B,GAAc,OAAKQ,WAAWR,EAAM,IAC5C2B,KAAM,SAAC3B,GACL,IAAI4B,GAAS,EACb,OAAO,WACDA,IAGJA,GAAS,EACT5B,EAAKO,MAAMD,KAAMF,cAGrByB,KAAM,SAACC,EAAUC,GACf,IAAMC,EAAS,GAMf,OALAC,OAAOF,KAAKD,GAAKI,SAAQ,SAAAC,GAClBJ,EAAKK,SAASD,KACjBH,EAAOG,GAAOL,EAAIK,OAGfH,GAETK,SAAU,SAACP,EAAUO,GAMnB,OALAJ,OAAOF,KAAKM,GAAUH,SAAQ,SAAAC,QACXG,IAAbR,EAAIK,KACNL,EAAIK,GAAOE,EAASF,OAGjBL,GAETS,OAAQ,SAACT,EAAUU,GACjB,IAAMR,EAAS,GAMf,OALAC,OAAOF,KAAKD,GAAKI,SAAQ,SAAAC,GACnBK,EAAUV,EAAIK,MAChBH,EAAOG,GAAOL,EAAIK,OAGfH,GAETS,QAAS,SAACC,EAAQC,GAChB,GAAID,IAAMC,EACR,OAAO,EAET,GAAID,aAAaE,MAAQD,aAAaC,KACpC,OAAOF,EAAEG,YAAcF,EAAEE,UAE3B,IAAKH,IAAMC,GAAmB,iBAAND,GAA+B,iBAANC,EAC/C,OAAOD,GAAMA,GAAKC,GAAMA,EAE1B,GAAID,EAAEI,YAAcH,EAAEG,UACpB,OAAO,EAET,IAAMf,EAAOE,OAAOF,KAAKW,GACzB,OAAIX,EAAKd,SAAWgB,OAAOF,KAAKY,GAAG1B,QAG5Bc,EAAKgB,OAAM,SAAAC,GAAC,OAAIlD,EAAE2C,QAAQC,EAAEM,GAAIL,EAAEK,QAE3CC,KAAM,SAACpC,GACL,IAAMqC,EAAM,IAAIC,IAAItC,GACpB,OAAOuC,MAAMC,KAAKH,KCzFlBI,GAAS,EACb,IACEA,uBAASrB,OAAOa,UAAUS,SAASC,KAAKC,OAAOC,SAC/C,MAAOC,IAET,ICPIC,EDOEC,GAAaP,GAAUQ,WAAaA,UAAUD,WAAaC,UAAUD,UAAUE,cAC/EC,EAAcH,GAAaA,EAAUI,QAAQ,eAAiB,EAoB9DC,EAAU,CACd,UACA,UACA,MACA,SACA,MACA,SACA,OACA,QACA,MACA,SACA,WACA,WACA,YACA,YACA,SACA,YACA,WACA,YACA,aACA,MACA,WACA,WACA,UACA,MACA,QACA,YACA,MACA,SACA,SACA,YACA,WACA,YACA,WACA,OACA,MACA,OACA,SACA,SACA,MACA,SACA,OACA,QACA,YACA,MACA,OACA,SACA,WACA,SACA,QACA,QACA,MACA,YACA,UACA,QACA,QACA,WACA,WACA,UACA,OACA,MACA,WACA,cACA,UACA,SACA,YACA,aACA,YACA,UACA,YACA,UACA,aACA,aACA,WACA,OACA,YACA,QACA,YACA,MACA,SACA,cACA,QACA,SACA,MACA,SACA,OACA,QACA,UACA,WACA,UACA,YACA,OACA,SACA,SACA,YACA,OACA,QACA,WACA,MACA,UACA,SACA,WACA,OACA,YACA,SACA,OACA,QACA,YACA,SACA,UACA,MACA,QACA,WACA,MACA,MACA,SACA,SACA,SACA,QACA,UACA,OACA,WACA,OACA,MACA,aACA,OACA,MACA,OACA,WACA,YACA,UACA,QACA,SACA,SACA,UACA,OACA,WACA,QACA,SACA,UACA,cACA,SACA,OACA,UACA,aACA,OACA,QACA,UACA,UACA,UACA,OACA,UACA,OACA,WACA,QACA,UACA,eACA,WACA,SACA,QACA,WACA,cACA,QACA,SACA,SACA,SACA,SACA,MACA,YACA,aACA,WACA,aACA,OACA,OACA,QACA,MACA,QACA,UACA,UACA,WACA,OACA,QACA,UACA,QACA,UACA,SACA,SACA,OACA,SACA,QACA,UACA,SACA,OACA,QACA,WACA,OACA,QACA,WACA,SACA,SACA,UACA,WACA,SACA,WACA,SACA,YACA,SACA,WACA,aACA,UACA,OACA,SACA,OACA,cACA,OACA,UACA,WACA,SACA,QACA,WACA,OACA,QACA,OACA,SACA,UACA,OACA,cACA,SACA,UACA,UACA,YACA,OACA,UACA,QACA,MACA,KACA,QACA,UACA,WACA,SACA,aACA,YACA,UACA,UACA,UACA,UACA,QACA,WACA,MACA,SACA,OACA,WACA,UACA,YACA,WACA,OACA,YACA,WACA,SACA,QACA,UACA,YACA,SACA,OACA,SACA,QACA,SACA,SACA,SACA,UACA,MACA,cACA,QACA,WACA,UACA,aACA,aACA,SACA,OACA,UACA,YACA,WACA,aACA,SACA,UACA,UACA,WACA,WACA,QACA,QACA,QACA,SACA,WACA,aACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,OACA,UACA,SACA,YACA,QACA,WACA,WACA,WACA,QACA,QACA,WACA,UACA,OACA,QACA,YACA,YACA,OACA,QACA,QACA,YACA,UACA,UACA,OACA,SACA,OACA,QACA,SACA,OACA,WACA,SACA,QACA,OACA,SACA,SACA,gBACA,QACA,SACA,QACA,OACA,UACA,UACA,SACA,OACA,UACA,SACA,QACA,UACA,YACA,UACA,aACA,WACA,OACA,YACA,SACA,aACA,OACA,OACA,UACA,MACA,QACA,SACA,MACA,SACA,UACA,MACA,SACA,SACA,QACA,WACA,QACA,QACA,MACA,QACA,QACA,MACA,WAGIC,EAAa,CACjB,UACA,MACA,WACA,MACA,QACA,WACA,QACA,OACA,UACA,QACA,SACA,OACA,UACA,UACA,YACA,SACA,OACA,QACA,QACA,OACA,OACA,UACA,SACA,SACA,QACA,SACA,OACA,OACA,SACA,UACA,SACA,QACA,UACA,OACA,QACA,MACA,QACA,SACA,QACA,SACA,MACA,QACA,SACA,UACA,SACA,OACA,OACA,OACA,SACA,MACA,SACA,QACA,UACA,SACA,SACA,QACA,WACA,OACA,UACA,QACA,QACA,OACA,OACA,OACA,SACA,MACA,QACA,QACA,QACA,OACA,QACA,QACA,WACA,QACA,MACA,QACA,QACA,OACA,WACA,QACA,SACA,YACA,QACA,QACA,UACA,SACA,QACA,OACA,UACA,UACA,OACA,QACA,UACA,QACA,QACA,WACA,aACA,SACA,SACA,OACA,YACA,aACA,YACA,aACA,SACA,YACA,QACA,QACA,OACA,SACA,QACA,OACA,QACA,QACA,SACA,SACA,QACA,YACA,QACA,UACA,aACA,QACA,SACA,SACA,OACA,MACA,MACA,QACA,SACA,UACA,UACA,QACA,QACA,YACA,SACA,QACA,QACA,YACA,QACA,QACA,WACA,SACA,OACA,QACA,SACA,SACA,SACA,QACA,SACA,OACA,MACA,SACA,SACA,QACA,UACA,UACA,WACA,UACA,QACA,MACA,aACA,QACA,YACA,YACA,WACA,SACA,QACA,YACA,WACA,UACA,YACA,YACA,YACA,QACA,cACA,UACA,OACA,SACA,UACA,UACA,aACA,WACA,WACA,WACA,SACA,OACA,MACA,UACA,SACA,aACA,UACA,UACA,YACA,aACA,UACA,YACA,QACA,WACA,UACA,OACA,QACA,WACA,cACA,QACA,WACA,QACA,UACA,QACA,SACA,UACA,YACA,SACA,QACA,OACA,WACA,WACA,cACA,cACA,aACA,aACA,aACA,QACA,SACA,aACA,cACA,YACA,eACA,UACA,YACA,OACA,WACA,YACA,OACA,WACA,QACA,SACA,WACA,OACA,QACA,UACA,UACA,YACA,QACA,SACA,OACA,SACA,SACA,QACA,WACA,UACA,WACA,QACA,WACA,QACA,UACA,WACA,aACA,aACA,aACA,YACA,QACA,YACA,UACA,OACA,QACA,OACA,MACA,MACA,QACA,OACA,QACA,YACA,QACA,QACA,SACA,YACA,OACA,QACA,WACA,UACA,QACA,QACA,WACA,MACA,SACA,YACA,OACA,OACA,UACA,OACA,MACA,MACA,SACA,YACA,MACA,OACA,OACA,QACA,QACA,WACA,OACA,SACA,OACA,QACA,aACA,gBACA,UACA,YACA,UACA,OACA,QACA,QACA,OACA,QACA,OACA,SACA,WACA,UACA,UACA,QACA,SACA,YACA,SACA,WACA,OACA,UACA,OACA,YACA,OACA,UACA,SACA,SACA,YACA,WACA,UACA,QACA,OACA,UACA,QACA,UACA,QACA,UACA,aACA,OACA,SACA,WACA,YACA,cACA,aACA,SACA,UACA,WACA,SACA,UACA,SACA,SACA,QACA,QACA,QACA,MACA,SACA,UACA,WACA,QACA,QACA,cACA,aACA,QACA,OACA,WACA,cACA,MACA,SACA,QACA,WACA,WACA,aACA,QACA,MACA,UACA,QACA,eACA,SACA,OACA,OACA,QACA,QACA,SACA,YACA,UACA,cACA,WACA,SACA,cACA,OACA,cACA,eACA,WACA,WACA,MACA,WACA,cACA,WACA,UACA,OACA,QACA,OACA,OACA,aACA,OACA,YACA,YACA,QACA,UACA,UACA,SACA,gBACA,WACA,SACA,UACA,SACA,WACA,OACA,OACA,aACA,OACA,WACA,YACA,WACA,WACA,MACA,QACA,UACA,MACA,aACA,SACA,WACA,UACA,WACA,aACA,QACA,OACA,SACA,QACA,SACA,QACA,WACA,SACA,SACA,YACA,WACA,QACA,UACA,WACA,YACA,QACA,OACA,YACA,WACA,YACA,QACA,OACA,SACA,WACA,SACA,QACA,QACA,SACA,UACA,eACA,SACA,QACA,MACA,SACA,QACA,UACA,cACA,SACA,UACA,UACA,aACA,YACA,WACA,QACA,WACA,UACA,UACA,SACA,SACA,aACA,UACA,aACA,aACA,UACA,UACA,MACA,QACA,YACA,cACA,SACA,YACA,WACA,YACA,WACA,WACA,SACA,UACA,OACA,OACA,MACA,aACA,OACA,QACA,WACA,aACA,OACA,QACA,QACA,QACA,UACA,SACA,UACA,WACA,QACA,WACA,OACA,OACA,SACA,WACA,UACA,QACA,UACA,QACA,aACA,WACA,QACA,QACA,cACA,OACA,UACA,UACA,OACA,WACA,UACA,QACA,YACA,QACA,UACA,SACA,OACA,WACA,OACA,YACA,QACA,WACA,WACA,QACA,QACA,UACA,SACA,MACA,YACA,WACA,YACA,OACA,QACA,cACA,MACA,UACA,QACA,OACA,WACA,eACA,QACA,OACA,OACA,QACA,UACA,SACA,YACA,gBACA,UACA,UACA,aACA,QACA,QACA,SACA,QACA,WACA,OACA,SACA,UACA,MACA,QACA,OACA,YACA,OACA,YACA,eACA,UACA,UACA,UACA,YACA,QACA,YACA,cACA,UACA,WACA,WACA,eACA,UACA,SACA,WACA,YACA,SACA,WACA,WACA,SACA,YACA,UACA,OACA,OACA,SACA,SACA,UACA,OACA,YACA,QACA,YACA,OACA,MACA,cACA,QACA,UACA,UACA,aACA,YACA,SACA,OACA,SACA,YACA,MACA,SACA,QACA,WACA,QACA,QACA,iBACA,SACA,aACA,gBACA,aACA,QACA,QACA,OACA,OACA,YACA,UACA,WACA,aACA,SACA,WACA,OACA,UACA,WACA,aACA,UACA,WACA,UACA,WACA,UACA,WACA,UACA,YACA,MACA,YACA,aACA,YACA,WACA,QACA,WACA,WACA,WACA,MACA,UACA,QACA,WACA,aACA,UACA,UACA,QACA,SACA,iBACA,YACA,YACA,aACA,YACA,OACA,SACA,WACA,SACA,cACA,cACA,OACA,SACA,WACA,UACA,SACA,aACA,UACA,cACA,gBACA,QACA,UACA,WACA,UACA,QACA,QACA,cACA,UACA,UACA,SACA,SACA,OACA,QACA,MACA,QACA,WACA,QACA,gBACA,UACA,aACA,aACA,SACA,WACA,WACA,WACA,QACA,aACA,UACA,OACA,QACA,aACA,QACA,WACA,OACA,WACA,YACA,QACA,aACA,UACA,YACA,SACA,YACA,SACA,SACA,UACA,aACA,eACA,YACA,QACA,WACA,WACA,OACA,WACA,SACA,aACA,YACA,WACA,MACA,gBACA,SACA,aACA,UACA,QACA,gBACA,SACA,WACA,aACA,SACA,WACA,SACA,OACA,WACA,WACA,aACA,WACA,eACA,YACA,UACA,WACA,WACA,aACA,YACA,UACA,OACA,WACA,SACA,QACA,QACA,aACA,QACA,SACA,QACA,YACA,OACA,WACA,SACA,SACA,WACA,SACA,UACA,OACA,WACA,WACA,QACA,SACA,QACA,aACA,YACA,eACA,WACA,cACA,YACA,SACA,eACA,gBACA,WACA,cACA,UACA,YACA,WACA,cACA,YACA,WACA,WACA,YACA,SACA,cACA,aACA,SACA,QACA,eACA,aACA,UACA,WACA,QACA,YACA,cACA,aACA,cACA,SACA,YACA,aACA,aACA,aACA,SACA,aACA,SACA,gBACA,QACA,WACA,aACA,QACA,aACA,kBACA,WACA,UACA,cACA,UACA,WACA,SACA,aACA,QACA,UACA,WACA,QACA,aACA,cACA,UACA,cACA,SACA,WACA,QACA,OACA,QACA,WACA,aACA,UACA,aACA,aACA,YACA,OACA,SACA,gBACA,UACA,aACA,cACA,SACA,SACA,cACA,OACA,UACA,OACA,aACA,QACA,OACA,QACA,SACA,SACA,UACA,SACA,UACA,QACA,SACA,WACA,QACA,YACA,SACA,WACA,SACA,UACA,cACA,WACA,UACA,YACA,WACA,QACA,WACA,OACA,eACA,YACA,cACA,cACA,aACA,WACA,cACA,OACA,QACA,WACA,SACA,WACA,iBACA,UACA,aACA,UACA,YACA,WACA,QACA,aACA,UACA,UACA,MACA,WACA,YACA,cACA,cACA,eACA,cACA,YACA,WACA,UACA,cACA,gBACA,OACA,WACA,UACA,WACA,aACA,aACA,UACA,YACA,aACA,QACA,UACA,WACA,QACA,eACA,OACA,UACA,SACA,cACA,cACA,WACA,QACA,UACA,WACA,QACA,UACA,UACA,SACA,UACA,WACA,UACA,SACA,WACA,YACA,OACA,WACA,SACA,aACA,cACA,YACA,OACA,UACA,QACA,QACA,YACA,SACA,QACA,UACA,MACA,aACA,YACA,UACA,QACA,SACA,aACA,SACA,UACA,YACA,WACA,iBACA,eACA,WACA,QACA,UACA,QACA,UACA,WACA,QACA,QACA,WACA,WACA,QACA,WACA,OACA,UACA,gBACA,UACA,UACA,aACA,UACA,SACA,cACA,gBACA,eACA,aACA,aACA,QACA,WACA,UACA,SACA,UACA,SACA,OACA,UACA,aACA,eACA,QACA,YACA,WACA,aACA,eACA,OACA,aACA,UACA,UACA,aACA,QACA,QACA,WACA,gBACA,WACA,QACA,eACA,WACA,aACA,UACA,aACA,YACA,UACA,SACA,cACA,UACA,WACA,UACA,YACA,UACA,SACA,UACA,UACA,WACA,cACA,WACA,gBACA,aACA,QACA,WACA,YACA,aACA,SACA,SACA,YACA,WACA,SACA,SACA,SACA,eACA,QACA,aACA,YACA,OACA,YACA,SACA,QACA,UACA,YACA,aACA,WACA,eACA,gBACA,SACA,aACA,QACA,WACA,SACA,gBACA,SACA,aACA,UACA,QACA,SACA,cACA,aACA,aACA,eACA,WACA,YACA,UACA,aACA,UACA,WACA,UACA,QACA,SACA,YACA,WACA,OACA,WACA,UACA,OACA,UACA,YACA,cACA,aACA,SACA,YACA,aACA,YACA,WACA,SACA,SACA,SACA,WACA,UACA,UACA,UACA,SACA,cACA,YACA,YACA,WACA,SACA,UACA,SACA,YACA,UACA,cACA,SACA,aACA,MACA,WACA,OACA,KACA,WACA,aACA,UACA,YACA,SACA,SACA,WACA,WACA,YACA,UACA,UACA,QACA,aACA,YACA,eACA,cACA,WACA,OACA,aACA,SACA,SACA,YACA,UACA,UACA,UACA,WACA,SACA,WACA,SACA,MACA,QACA,WACA,aACA,YACA,WACA,WACA,QACA,YACA,UACA,eACA,WACA,WACA,eACA,aACA,UACA,QACA,UACA,UACA,WACA,aACA,SACA,UACA,SACA,UACA,SACA,SACA,UACA,eACA,YACA,UACA,YACA,SACA,cACA,YACA,WACA,aACA,SACA,UACA,YACA,iBACA,QACA,SACA,WACA,cACA,QACA,OACA,WACA,cACA,aACA,aACA,aACA,YACA,QACA,aACA,QACA,SACA,YACA,OACA,UACA,WACA,SACA,YACA,QACA,UACA,OACA,YACA,YACA,WACA,OACA,SACA,UACA,UACA,WACA,YACA,aACA,WACA,cACA,SACA,OACA,cACA,OACA,WACA,UACA,OACA,OACA,MACA,SACA,QACA,OACA,eACA,YACA,OACA,QACA,WACA,QACA,UACA,YACA,SACA,SACA,WACA,SACA,QACA,QACA,SACA,WACA,UACA,OACA,OACA,OACA,WACA,OACA,UACA,QACA,SACA,YACA,WACA,WACA,YACA,SACA,QACA,QACA,aACA,QACA,QACA,SACA,SACA,QACA,SACA,YACA,WACA,SACA,UACA,OACA,YACA,UACA,MACA,SACA,YACA,MACA,QACA,OACA,SACA,SACA,QACA,QACA,OACA,MACA,QACA,WACA,QACA,QACA,QACA,WACA,WACA,SACA,WACA,QACA,WACA,QACA,UACA,QACA,OACA,OACA,OACA,cACA,UACA,OACA,SACA,QACA,QACA,MACA,OACA,OACA,QACA,aACA,MACA,SACA,WACA,SACA,WACA,UACA,SACA,SACA,QACA,QACA,WACA,QACA,OACA,QACA,MACA,UACA,SACA,QACA,MACA,QACA,UACA,QACA,QACA,SACA,UACA,UACA,SACA,OACA,OACA,OACA,MACA,SACA,QACA,SACA,QACA,OACA,UAC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"} \ No newline at end of file diff --git a/dist/iris.esm.js b/dist/iris.esm.js index 510d5e5..1a7d430 100644 --- a/dist/iris.esm.js +++ b/dist/iris.esm.js @@ -1,11 +1,5 @@ -import Gun from 'gun'; -import 'gun/sea'; -import 'gun/lib/yson'; -import 'gun/lib/radix'; -import 'gun/lib/radisk'; -import 'gun/lib/store'; -import 'gun/lib/rindexed'; -import localForage from 'localforage'; +import QuickLRU from 'quick-lru'; +import Dexie from 'dexie'; import Fuse from 'fuse.js'; function _regeneratorRuntime() { @@ -402,6 +396,12 @@ function _wrapNativeSuper(Class) { }; return _wrapNativeSuper(Class); } +function _assertThisInitialized(self) { + if (self === void 0) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + return self; +} function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); @@ -516,6 +516,31 @@ var _ = { } }); return newObj; + }, + isEqual: function isEqual(a, b) { + if (a === b) { + return true; + } + if (a instanceof Date && b instanceof Date) { + return a.getTime() === b.getTime(); + } + if (!a || !b || typeof a !== 'object' && typeof b !== 'object') { + return a !== a && b !== b; + } + if (a.prototype !== b.prototype) { + return false; + } + var keys = Object.keys(a); + if (keys.length !== Object.keys(b).length) { + return false; + } + return keys.every(function (k) { + return _.isEqual(a[k], b[k]); + }); + }, + uniq: function uniq(arr) { + var set = new Set(arr); + return Array.from(set); } }; @@ -537,23 +562,6 @@ var isMobile = !isNode && /*#__PURE__*/function () { })(navigator.userAgent || navigator.vendor || ''); return check; }(); -function gunAsAnotherUser(gun, key, f) { - var gun2 = new Gun({ - radisk: false, - peers: Object.keys(gun._.opt.peers) - }); // TODO: copy other options too - var user = gun2.user(); - user.auth(key); - setTimeout(function () { - // @ts-ignore - var peers = Object.values(gun2.back('opt.peers')); - peers.forEach(function (peer) { - // @ts-ignore - gun2.on('bye', peer); - }); - }, 20000); - return f(user); -} function gunOnceDefined(node) { return new Promise(function (resolve) { node.on(function (val, _k, _a, eve) { @@ -568,11 +576,10 @@ var animals = ['canidae', 'felidae', 'cat', 'cattle', 'dog', 'donkey', 'goat', ' var adjectives = ['average', 'big', 'colossal', 'fat', 'giant', 'gigantic', 'great', 'huge', 'immense', 'large', 'little', 'long', 'mammoth', 'massive', 'miniature', 'petite', 'puny', 'short', 'small', 'tall', 'tiny', 'boiling', 'breezy', 'broken', 'bumpy', 'chilly', 'cold', 'cool', 'creepy', 'crooked', 'cuddly', 'curly', 'damaged', 'damp', 'dirty', 'dry', 'dusty', 'filthy', 'flaky', 'fluffy', 'wet', 'broad', 'chubby', 'crooked', 'curved', 'deep', 'flat', 'high', 'hollow', 'low', 'narrow', 'round', 'shallow', 'skinny', 'square', 'steep', 'straight', 'wide', 'ancient', 'brief', 'early', 'fast', 'late', 'long', 'modern', 'old', 'quick', 'rapid', 'short', 'slow', 'swift', 'young', 'abundant', 'empty', 'few', 'heavy', 'light', 'many', 'numerous', 'Sound', 'cooing', 'deafening', 'faint', 'harsh', 'hissing', 'hushed', 'husky', 'loud', 'melodic', 'moaning', 'mute', 'noisy', 'purring', 'quiet', 'raspy', 'resonant', 'screeching', 'shrill', 'silent', 'soft', 'squealing', 'thundering', 'voiceless', 'whispering', 'bitter', 'delicious', 'fresh', 'juicy', 'ripe', 'rotten', 'salty', 'sour', 'spicy', 'stale', 'sticky', 'strong', 'sweet', 'tasteless', 'tasty', 'thirsty', 'fluttering', 'fuzzy', 'greasy', 'grubby', 'hard', 'hot', 'icy', 'loose', 'melted', 'plastic', 'prickly', 'rainy', 'rough', 'scattered', 'shaggy', 'shaky', 'sharp', 'shivering', 'silky', 'slimy', 'slippery', 'smooth', 'soft', 'solid', 'steady', 'sticky', 'tender', 'tight', 'uneven', 'weak', 'wet', 'wooden', 'afraid', 'angry', 'annoyed', 'anxious', 'arrogant', 'ashamed', 'awful', 'bad', 'bewildered', 'bored', 'combative', 'condemned', 'confused', 'creepy', 'cruel', 'dangerous', 'defeated', 'defiant', 'depressed', 'disgusted', 'disturbed', 'eerie', 'embarrassed', 'envious', 'evil', 'fierce', 'foolish', 'frantic', 'frightened', 'grieving', 'helpless', 'homeless', 'hungry', 'hurt', 'ill', 'jealous', 'lonely', 'mysterious', 'naughty', 'nervous', 'obnoxious', 'outrageous', 'panicky', 'repulsive', 'scary', 'scornful', 'selfish', 'sore', 'tense', 'terrible', 'thoughtless', 'tired', 'troubled', 'upset', 'uptight', 'weary', 'wicked', 'worried', 'agreeable', 'amused', 'brave', 'calm', 'charming', 'cheerful', 'comfortable', 'cooperative', 'courageous', 'delightful', 'determined', 'eager', 'elated', 'enchanting', 'encouraging', 'energetic', 'enthusiastic', 'excited', 'exuberant', 'fair', 'faithful', 'fantastic', 'fine', 'friendly', 'funny', 'gentle', 'glorious', 'good', 'happy', 'healthy', 'helpful', 'hilarious', 'jolly', 'joyous', 'kind', 'lively', 'lovely', 'lucky', 'obedient', 'perfect', 'pleasant', 'proud', 'relieved', 'silly', 'smiling', 'splendid', 'successful', 'thoughtful', 'victorious', 'vivacious', 'witty', 'wonderful', 'zealous', 'zany', 'other', 'good', 'new', 'old', 'great', 'high', 'small', 'different', 'large', 'local', 'social', 'important', 'long', 'young', 'national', 'british', 'right', 'early', 'possible', 'big', 'little', 'political', 'able', 'late', 'general', 'full', 'far', 'low', 'public', 'available', 'bad', 'main', 'sure', 'clear', 'major', 'economic', 'only', 'likely', 'real', 'black', 'particular', 'international', 'special', 'difficult', 'certain', 'open', 'whole', 'white', 'free', 'short', 'easy', 'strong', 'european', 'central', 'similar', 'human', 'common', 'necessary', 'single', 'personal', 'hard', 'private', 'poor', 'financial', 'wide', 'foreign', 'simple', 'recent', 'concerned', 'american', 'various', 'close', 'fine', 'english', 'wrong', 'present', 'royal', 'natural', 'individual', 'nice', 'french', 'nihilist', 'solipsist', 'materialist', 'surrealist', 'heroic', 'awesome', 'hedonist', 'absurd', 'current', 'modern', 'labour', 'legal', 'happy', 'final', 'red', 'normal', 'serious', 'previous', 'total', 'prime', 'significant', 'industrial', 'sorry', 'dead', 'specific', 'appropriate', 'top', 'soviet', 'basic', 'military', 'original', 'successful', 'aware', 'hon', 'popular', 'heavy', 'professional', 'direct', 'dark', 'cold', 'ready', 'green', 'useful', 'effective', 'western', 'traditional', 'scottish', 'german', 'independent', 'deep', 'interesting', 'considerable', 'involved', 'physical', 'hot', 'existing', 'responsible', 'complete', 'medical', 'blue', 'extra', 'past', 'male', 'interested', 'fair', 'essential', 'beautiful', 'civil', 'primary', 'obvious', 'future', 'environmental', 'positive', 'senior', 'nuclear', 'annual', 'relevant', 'huge', 'rich', 'commercial', 'safe', 'regional', 'practical', 'official', 'separate', 'key', 'chief', 'regular', 'due', 'additional', 'active', 'powerful', 'complex', 'standard', 'impossible', 'light', 'warm', 'middle', 'fresh', 'sexual', 'front', 'domestic', 'actual', 'united', 'technical', 'ordinary', 'cheap', 'strange', 'internal', 'excellent', 'quiet', 'soft', 'potential', 'northern', 'religious', 'quick', 'very', 'famous', 'cultural', 'proper', 'broad', 'joint', 'formal', 'limited', 'conservative', 'lovely', 'usual', 'ltd', 'unable', 'rural', 'initial', 'substantial', 'bright', 'average', 'leading', 'reasonable', 'immediate', 'suitable', 'equal', 'detailed', 'working', 'overall', 'female', 'afraid', 'democratic', 'growing', 'sufficient', 'scientific', 'eastern', 'correct', 'inc', 'irish', 'expensive', 'educational', 'mental', 'dangerous', 'critical', 'increased', 'familiar', 'unlikely', 'double', 'perfect', 'slow', 'tiny', 'dry', 'historical', 'thin', 'daily', 'southern', 'increasing', 'wild', 'alone', 'urban', 'empty', 'married', 'narrow', 'liberal', 'supposed', 'upper', 'apparent', 'tall', 'busy', 'bloody', 'prepared', 'russian', 'moral', 'careful', 'clean', 'attractive', 'japanese', 'vital', 'thick', 'alternative', 'fast', 'ancient', 'elderly', 'rare', 'external', 'capable', 'brief', 'wonderful', 'grand', 'typical', 'entire', 'grey', 'constant', 'vast', 'surprised', 'ideal', 'terrible', 'academic', 'funny', 'minor', 'pleased', 'severe', 'ill', 'corporate', 'negative', 'permanent', 'weak', 'brown', 'fundamental', 'odd', 'crucial', 'inner', 'used', 'criminal', 'contemporary', 'sharp', 'sick', 'near', 'roman', 'massive', 'unique', 'secondary', 'parliamentary', 'african', 'unknown', 'subsequent', 'angry', 'alive', 'guilty', 'lucky', 'enormous', 'well', 'yellow', 'unusual', 'net', 'tough', 'dear', 'extensive', 'glad', 'remaining', 'agricultural', 'alright', 'healthy', 'italian', 'principal', 'tired', 'efficient', 'comfortable', 'chinese', 'relative', 'friendly', 'conventional', 'willing', 'sudden', 'proposed', 'voluntary', 'slight', 'valuable', 'dramatic', 'golden', 'temporary', 'federal', 'keen', 'flat', 'silent', 'indian', 'worried', 'pale', 'statutory', 'welsh', 'dependent', 'firm', 'wet', 'competitive', 'armed', 'radical', 'outside', 'acceptable', 'sensitive', 'living', 'pure', 'global', 'emotional', 'sad', 'secret', 'rapid', 'adequate', 'fixed', 'sweet', 'administrative', 'wooden', 'remarkable', 'comprehensive', 'surprising', 'solid', 'rough', 'mere', 'mass', 'brilliant', 'maximum', 'absolute', 'electronic', 'visual', 'electric', 'cool', 'spanish', 'literary', 'continuing', 'supreme', 'chemical', 'genuine', 'exciting', 'written', 'advanced', 'extreme', 'classical', 'fit', 'favourite', 'widespread', 'confident', 'straight', 'proud', 'numerous', 'opposite', 'distinct', 'mad', 'helpful', 'given', 'disabled', 'consistent', 'anxious', 'nervous', 'awful', 'stable', 'constitutional', 'satisfied', 'conscious', 'developing', 'strategic', 'holy', 'smooth', 'dominant', 'remote', 'theoretical', 'outstanding', 'pink', 'pretty', 'clinical', 'minimum', 'honest', 'impressive', 'related', 'residential', 'extraordinary', 'plain', 'visible', 'accurate', 'distant', 'still', 'greek', 'complicated', 'musical', 'precise', 'gentle', 'broken', 'live', 'silly', 'fat', 'tight', 'monetary', 'round', 'psychological', 'violent', 'unemployed', 'inevitable', 'junior', 'sensible', 'grateful', 'pleasant', 'dirty', 'structural', 'welcome', 'deaf', 'above', 'continuous', 'blind', 'overseas', 'mean', 'entitled', 'delighted', 'loose', 'occasional', 'evident', 'desperate', 'fellow', 'universal', 'square', 'steady', 'classic', 'equivalent', 'intellectual', 'victorian', 'level', 'ultimate', 'creative', 'lost', 'medieval', 'clever', 'linguistic', 'convinced', 'judicial', 'raw', 'sophisticated', 'asleep', 'vulnerable', 'illegal', 'outer', 'revolutionary', 'bitter', 'changing', 'australian', 'native', 'imperial', 'strict', 'wise', 'informal', 'flexible', 'collective', 'frequent', 'experimental', 'spiritual', 'intense', 'rational', 'generous', 'inadequate', 'prominent', 'logical', 'bare', 'historic', 'modest', 'dutch', 'acute', 'electrical', 'valid', 'weekly', 'gross', 'automatic', 'loud', 'reliable', 'mutual', 'liable', 'multiple', 'ruling', 'curious', 'sole', 'managing', 'pregnant', 'latin', 'nearby', 'exact', 'underlying', 'identical', 'satisfactory', 'marginal', 'distinctive', 'electoral', 'urgent', 'presidential', 'controversial', 'everyday', 'encouraging', 'organic', 'continued', 'expected', 'statistical', 'desirable', 'innocent', 'improved', 'exclusive', 'marked', 'experienced', 'unexpected', 'superb', 'sheer', 'disappointed', 'frightened', 'gastric', 'romantic', 'naked', 'reluctant', 'magnificent', 'convenient', 'established', 'closed', 'uncertain', 'artificial', 'diplomatic', 'tremendous', 'marine', 'mechanical', 'retail', 'institutional', 'mixed', 'required', 'biological', 'known', 'functional', 'straightforward', 'superior', 'digital', 'spectacular', 'unhappy', 'confused', 'unfair', 'aggressive', 'spare', 'painful', 'abstract', 'asian', 'associated', 'legislative', 'monthly', 'intelligent', 'hungry', 'explicit', 'nasty', 'just', 'faint', 'coloured', 'ridiculous', 'amazing', 'comparable', 'successive', 'realistic', 'back', 'decent', 'decentralized', 'bitcoin', 'cypherpunk', 'unnecessary', 'flying', 'random', 'influential', 'dull', 'genetic', 'neat', 'marvellous', 'crazy', 'damp', 'giant', 'secure', 'bottom', 'skilled', 'subtle', 'elegant', 'brave', 'lesser', 'parallel', 'steep', 'intensive', 'casual', 'tropical', 'lonely', 'partial', 'preliminary', 'concrete', 'alleged', 'assistant', 'vertical', 'upset', 'delicate', 'mild', 'occupational', 'excessive', 'progressive', 'exceptional', 'integrated', 'striking', 'continental', 'okay', 'harsh', 'combined', 'fierce', 'handsome', 'characteristic', 'chronic', 'compulsory', 'interim', 'objective', 'splendid', 'magic', 'systematic', 'obliged', 'payable', 'fun', 'horrible', 'primitive', 'fascinating', 'ideological', 'metropolitan', 'surrounding', 'estimated', 'peaceful', 'premier', 'operational', 'technological', 'kind', 'advisory', 'hostile', 'precious', 'accessible', 'determined', 'excited', 'impressed', 'provincial', 'smart', 'endless', 'isolated', 'drunk', 'geographical', 'like', 'dynamic', 'boring', 'forthcoming', 'unfortunate', 'definite', 'super', 'notable', 'indirect', 'stiff', 'wealthy', 'awkward', 'lively', 'neutral', 'artistic', 'content', 'mature', 'colonial', 'ambitious', 'evil', 'magnetic', 'verbal', 'legitimate', 'sympathetic', 'empirical', 'head', 'shallow', 'vague', 'naval', 'depressed', 'shared', 'added', 'shocked', 'mid', 'worthwhile', 'qualified', 'missing', 'blank', 'absent', 'favourable', 'polish', 'israeli', 'developed', 'profound', 'representative', 'enthusiastic', 'dreadful', 'rigid', 'reduced', 'cruel', 'coastal', 'peculiar', 'swiss', 'crude', 'extended', 'selected', 'eager', 'canadian', 'bold', 'relaxed', 'corresponding', 'running', 'planned', 'applicable', 'immense', 'allied', 'comparative', 'uncomfortable', 'conservation', 'productive', 'beneficial', 'bored', 'charming', 'minimal', 'mobile', 'turkish', 'orange', 'rear', 'passive', 'suspicious', 'overwhelming', 'fatal', 'resulting', 'symbolic', 'registered', 'neighbouring', 'calm', 'irrelevant', 'patient', 'compact', 'profitable', 'rival', 'loyal', 'moderate', 'distinguished', 'interior', 'noble', 'insufficient', 'eligible', 'mysterious', 'varying', 'managerial', 'molecular', 'olympic', 'linear', 'prospective', 'printed', 'parental', 'diverse', 'elaborate', 'furious', 'fiscal', 'burning', 'useless', 'semantic', 'embarrassed', 'inherent', 'philosophical', 'deliberate', 'awake', 'variable', 'promising', 'unpleasant', 'varied', 'sacred', 'selective', 'inclined', 'tender', 'hidden', 'worthy', 'intermediate', 'sound', 'protective', 'fortunate', 'slim', 'defensive', 'divine', 'stuck', 'driving', 'invisible', 'misleading', 'circular', 'mathematical', 'inappropriate', 'liquid', 'persistent', 'solar', 'doubtful', 'manual', 'architectural', 'intact', 'incredible', 'devoted', 'prior', 'tragic', 'respectable', 'optimistic', 'convincing', 'unacceptable', 'decisive', 'competent', 'spatial', 'respective', 'binding', 'relieved', 'nursing', 'toxic', 'select', 'redundant', 'integral', 'then', 'probable', 'amateur', 'fond', 'passing', 'specified', 'territorial', 'horizontal', 'inland', 'cognitive', 'regulatory', 'miserable', 'resident', 'polite', 'scared', 'gothic', 'civilian', 'instant', 'lengthy', 'adverse', 'korean', 'unconscious', 'anonymous', 'aesthetic', 'orthodox', 'static', 'unaware', 'costly', 'fantastic', 'foolish', 'fashionable', 'causal', 'compatible', 'wee', 'implicit', 'dual', 'ok', 'cheerful', 'subjective', 'forward', 'surviving', 'exotic', 'purple', 'cautious', 'visiting', 'aggregate', 'ethical', 'teenage', 'dying', 'disastrous', 'delicious', 'confidential', 'underground', 'thorough', 'grim', 'autonomous', 'atomic', 'frozen', 'colourful', 'injured', 'uniform', 'ashamed', 'glorious', 'wicked', 'coherent', 'rising', 'shy', 'novel', 'balanced', 'delightful', 'arbitrary', 'adjacent', 'worrying', 'weird', 'unchanged', 'rolling', 'evolutionary', 'intimate', 'sporting', 'disciplinary', 'formidable', 'lexical', 'noisy', 'gradual', 'accused', 'homeless', 'supporting', 'coming', 'renewed', 'excess', 'retired', 'rubber', 'chosen', 'outdoor', 'embarrassing', 'preferred', 'bizarre', 'appalling', 'agreed', 'imaginative', 'governing', 'accepted', 'vocational', 'mighty', 'puzzled', 'worldwide', 'organisational', 'sunny', 'eldest', 'eventual', 'spontaneous', 'vivid', 'rude', 'faithful', 'ministerial', 'innovative', 'controlled', 'conceptual', 'unwilling', 'civic', 'meaningful', 'alive', 'brainy', 'breakable', 'busy', 'careful', 'cautious', 'clever', 'concerned', 'crazy', 'curious', 'dead', 'different', 'difficult', 'doubtful', 'easy', 'famous', 'fragile', 'helpful', 'helpless', 'important', 'impossible', 'innocent', 'inquisitive', 'modern', 'open', 'outstanding', 'poor', 'powerful', 'puzzled', 'real', 'rich', 'shy', 'sleepy', 'super', 'tame', 'uninterested', 'wandering', 'wild', 'wrong', 'adorable', 'alert', 'average', 'beautiful', 'blonde', 'bloody', 'blushing', 'bright', 'clean', 'clear', 'cloudy', 'colorful', 'crowded', 'cute', 'dark', 'drab', 'distinct', 'dull', 'elegant', 'fancy', 'filthy', 'glamorous', 'gleaming', 'graceful', 'grotesque', 'homely', 'light', 'misty', 'motionless', 'muddy', 'plain', 'poised', 'quaint', 'shiny', 'smoggy', 'sparkling', 'spotless', 'stormy', 'strange', 'ugly', 'unsightly', 'unusual', 'bad', 'better', 'beautiful', 'big', 'black', 'blue', 'bright', 'clumsy', 'crazy', 'dizzy', 'dull', 'fat', 'frail', 'friendly', 'funny', 'great', 'green', 'gigantic', 'gorgeous', 'grumpy', 'handsome', 'happy', 'horrible', 'itchy', 'jittery', 'jolly', 'kind', 'long', 'lazy', 'magnificent', 'magenta', 'many', 'mighty', 'mushy', 'nasty', 'new', 'nice', 'nosy', 'nutty', 'nutritious', 'odd', 'orange', 'ordinary', 'pretty', 'precious', 'prickly', 'purple', 'quaint', 'quiet', 'quick', 'quickest', 'rainy', 'rare', 'ratty', 'red', 'roasted', 'robust', 'round', 'sad', 'scary', 'scrawny', 'short', 'silly', 'stingy', 'strange', 'striped', 'spotty', 'tart', 'tall', 'tame', 'tan', 'tender', 'testy', 'tricky', 'tough', 'ugly', 'ugliest', 'vast', 'watery', 'wasteful', 'wonderful', 'yellow', 'yummy', 'zany']; var util = { gunOnceDefined: gunOnceDefined, - gunAsAnotherUser: gunAsAnotherUser, - getHash: function getHash(str, format) { + getHash: function getHash(data, format) { var _this = this; return _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() { - var hash; + var encoder, buffer, hash; return _regeneratorRuntime().wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { @@ -580,38 +587,36 @@ var util = { if (format === void 0) { format = "base64"; } - if (str) { + if (!(data === undefined)) { _context.next = 3; break; } - return _context.abrupt("return", undefined); + throw new Error('getHash data was undefined'); case 3: - _context.next = 5; - return Gun.SEA.work(str, undefined, undefined, { - name: "SHA-256" - }); - case 5: - hash = _context.sent; - if (hash) { - _context.next = 8; - break; + if (typeof data !== 'string') { + data = JSON.stringify(data); } - throw new Error("Gun.SEA.work failed for " + str); + encoder = new TextEncoder(); + data = encoder.encode(data); + _context.next = 8; + return crypto.subtle.digest('SHA-256', data); case 8: - if (!(hash.length > 44)) { - _context.next = 10; + buffer = _context.sent; + if (!(format === 'buffer')) { + _context.next = 11; break; } - throw new Error("Gun.SEA.work returned an invalid SHA-256 hash longer than 44 chars: " + hash + ". This is probably due to a sea.js bug on Safari."); - case 10: + return _context.abrupt("return", buffer); + case 11: + hash = _this.arrayBufferToBase64(buffer); if (!(format === "hex")) { - _context.next = 12; + _context.next = 14; break; } return _context.abrupt("return", _this.base64ToHex(hash)); - case 12: + case 14: return _context.abrupt("return", hash); - case 13: + case 15: case "end": return _context.stop(); } @@ -634,6 +639,15 @@ var util = { } return result; }, + arrayBufferToBase64: function arrayBufferToBase64(buffer) { + var binary = ''; + var bytes = new Uint8Array(buffer); + var len = bytes.byteLength; + for (var i = 0; i < len; i++) { + binary += String.fromCharCode(bytes[i]); + } + return window.btoa(binary); + }, getCaret: function getCaret(el) { if (el.selectionStart) { return el.selectionStart; @@ -656,16 +670,6 @@ var util = { } return 0; }, - injectCss: function injectCss() { - var elementId = "irisStyle"; - if (document.getElementById(elementId)) { - return; - } - var sheet = document.createElement("style"); - sheet.id = elementId; - sheet.innerHTML = "\n .iris-follow-button .hover {\n display: none;\n }\n\n .iris-follow-button.following:hover .hover {\n display: inline;\n }\n\n .iris-follow-button.following:hover .nonhover {\n display: none;\n }\n\n .iris-identicon * {\n box-sizing: border-box;\n }\n\n .iris-identicon {\n vertical-align: middle;\n border-radius: 50%;\n text-align: center;\n display: inline-block;\n position: relative;\n max-width: 100%;\n }\n\n .iris-distance {\n z-index: 2;\n position: absolute;\n left:0%;\n top:2px;\n width: 100%;\n text-align: right;\n color: #fff;\n text-shadow: 0 0 1px #000;\n font-size: 75%;\n line-height: 75%;\n font-weight: bold;\n }\n\n .iris-pie {\n border-radius: 50%;\n position: absolute;\n top: 0;\n left: 0;\n box-shadow: 0px 0px 0px 0px #82FF84;\n padding-bottom: 100%;\n max-width: 100%;\n -webkit-transition: all 0.2s ease-in-out;\n -moz-transition: all 0.2s ease-in-out;\n transition: all 0.2s ease-in-out;\n }\n\n .iris-card {\n padding: 10px;\n background-color: #f7f7f7;\n color: #777;\n border: 1px solid #ddd;\n display: flex;\n flex-direction: row;\n overflow: hidden;\n }\n\n .iris-card a {\n -webkit-transition: color 150ms;\n transition: color 150ms;\n text-decoration: none;\n color: #337ab7;\n }\n\n .iris-card a:hover, .iris-card a:active {\n text-decoration: underline;\n color: #23527c;\n }\n\n .iris-pos {\n color: #3c763d;\n }\n\n .iris-neg {\n color: #a94442;\n }\n\n .iris-identicon img {\n position: absolute;\n top: 0;\n left: 0;\n max-width: 100%;\n border-radius: 50%;\n border-color: transparent;\n border-style: solid;\n }\n\n .iris-chat-open-button {\n background-color: #1e1e1e;\n color: #fff;\n padding: 15px;\n cursor: pointer;\n user-select: none;\n }\n\n .iris-chat-open-button svg {\n width: 1em;\n }\n\n .iris-chat-open-button, .iris-chat-box {\n position: fixed;\n bottom: 0.5rem;\n right: 0.5rem;\n border-radius: 8px;\n font-family: system-ui;\n font-size: 15px;\n }\n\n .iris-chat-box {\n background-color: #fff;\n max-height: 25rem;\n box-shadow: 2px 2px 20px rgba(0, 0, 0, 0.2);\n height: calc(100% - 44px);\n display: flex;\n flex-direction: column;\n width: 320px;\n color: rgb(38, 38, 38);\n }\n\n .iris-chat-box.minimized {\n height: auto;\n }\n\n .iris-chat-box.minimized .iris-chat-header {\n border-radius: 8px;\n cursor: pointer;\n }\n\n .iris-chat-box.minimized .iris-chat-messages, .iris-chat-box.minimized .iris-typing-indicator, .iris-chat-box.minimized .iris-chat-input-wrapper, .iris-chat-box.minimized .iris-chat-minimize, .iris-chat-box.minimized .iris-chat-close {\n display: none;\n }\n\n .iris-chat-header {\n background-color: #1e1e1e;\n height: 44px;\n color: #fff;\n border-radius: 8px 8px 0 0;\n text-align: center;\n display: flex;\n flex-direction: row;\n justify-content: center;\n align-items: center;\n flex: none;\n white-space: nowrap;\n text-overflow: ellipsis;\n overflow: hidden;\n }\n\n .iris-chat-header-text {\n flex: 1;\n }\n\n .iris-online-indicator {\n color: #bfbfbf;\n margin-right: 5px;\n font-size: 12px;\n user-select: none;\n flex: none;\n }\n\n .iris-online-indicator.yes {\n color: #80bf5f;\n }\n\n .iris-typing-indicator {\n display: none;\n background-color: rgba(255, 255, 255, 0.5);\n font-size: 12px;\n padding: 2px;\n color: #777;\n }\n\n .iris-typing-indicator.yes {\n display: block;\n }\n\n .iris-chat-messages {\n flex: 1;\n padding: 15px;\n overflow-y: scroll;\n }\n\n .iris-chat-input-wrapper {\n flex: none;\n padding: 15px;\n background-color: #efefef;\n display: flex;\n flex-direction: row;\n border-radius: 0 0 8px 8px;\n }\n\n .iris-chat-input-wrapper textarea {\n padding: 15px 8px;\n border-radius: 4px;\n border: 1px solid rgba(0,0,0,0);\n width: auto;\n font-size: 15px;\n resize: none;\n flex: 1;\n }\n\n .iris-chat-input-wrapper textarea:focus {\n outline: none;\n border: 1px solid #6dd0ed;\n }\n\n .iris-chat-input-wrapper button svg {\n display: inline-block;\n font-size: inherit;\n height: 1em;\n width: 1em;\n overflow: visible;\n vertical-align: -0.125em;\n }\n\n .iris-chat-input-wrapper button, .iris-chat-input-wrapper button:hover, .iris-chat-input-wrapper button:active, .iris-chat-input-wrapper button:focus {\n flex: none;\n color: #999;\n background-color: transparent;\n font-size: 30px;\n padding: 5px;\n border: 1px solid rgba(0,0,0,0);\n border-radius: 4px;\n margin-left: 5px;\n }\n\n .iris-chat-input-wrapper button:active, .iris-chat-input-wrapper button:focus {\n outline: none;\n border: 1px solid #6dd0ed;\n }\n\n .iris-chat-message {\n display: flex;\n flex-direction: column;\n margin-bottom: 2px;\n overflow-wrap: break-word;\n }\n\n .iris-msg-content {\n background-color: #efefef;\n padding: 6px 10px;\n border-radius: 8px;\n box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.1);\n flex: none;\n max-width: 75%;\n }\n\n .emoji {\n font-size: 1.3em;\n line-height: 1em;\n }\n\n .iris-chat-message .emoji-only {\n font-size: 3em;\n text-align: center;\n }\n\n .iris-seen {\n color: rgba(0, 0, 0, 0.45);\n user-select: none;\n }\n\n .iris-seen.yes {\n color: #4fc3f7;\n }\n\n .iris-seen svg {\n width: 18px;\n }\n\n .iris-delivered-checkmark {\n display: none;\n }\n\n .delivered .iris-delivered-checkmark {\n display: initial;\n }\n\n .iris-chat-minimize, .iris-chat-close {\n user-select: none;\n cursor: pointer;\n width: 45px;\n line-height: 44px;\n }\n\n .iris-chat-message.their {\n align-items: flex-start;\n }\n\n .iris-chat-message.their + .iris-chat-message.our .iris-msg-content, .day-separator + .iris-chat-message.our .iris-msg-content {\n margin-top: 15px;\n border-radius: 8px 0px 8px 8px;\n }\n\n .iris-chat-message.their:first-of-type .iris-msg-content {\n border-radius: 0px 8px 8px 8px;\n }\n\n .iris-chat-message.our:first-of-type .iris-msg-content {\n border-radius: 8px 0px 8px 8px;\n }\n\n .iris-chat-message.our + .iris-chat-message.their .iris-msg-content, .day-separator + .iris-chat-message.their .iris-msg-content {\n margin-top: 15px;\n border-radius: 0px 8px 8px 8px;\n }\n\n .iris-chat-message.our {\n align-items: flex-end;\n }\n\n .iris-chat-message.our .iris-msg-content {\n background-color: #c5ecf7;\n }\n\n .iris-chat-message .time {\n text-align: right;\n font-size: 12px;\n color: rgba(0, 0, 0, 0.45);\n }\n\n .iris-non-string {\n color: blue;\n }\n\n .day-separator {\n display: inline-block;\n border-radius: 8px;\n background-color: rgba(227, 249, 255, 0.91);\n padding: 6px 10px;\n margin-top: 15px;\n margin-left: auto;\n margin-right: auto;\n text-transform: uppercase;\n font-size: 13px;\n color: rgba(74, 74, 74, 0.88);\n box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.1);\n user-select: none;\n }\n\n .day-separator:first-of-type {\n margin-top: 0;\n }\n\n *[contenteditable=\"true\"]:not(:focus) {\n cursor: pointer;\n }\n\n *[contenteditable=\"true\"] {\n outline: none;\n }\n\n [placeholder]:empty:before {\n content: attr(placeholder);\n color: #999;\n }\n\n [placeholder]:empty:focus {\n cursor: text;\n }\n "; - document.head.prepend(sheet); - }, getUrlParameter: function getUrlParameter(sParam, sParams) { var sPageURL = sParams || window.location.search.substring(1); var sURLVariables = sPageURL.split('&'); @@ -815,89 +819,84 @@ var util = { } }; -var ELECTRON_GUN_URL = 'http://localhost:8767/gun'; -var maxConnectedPeers = 2; -var DEFAULT_PEERS = { - 'https://gun-rs.iris.to/gun': {}, - 'https://gun-us.herokuapp.com/gun': {} -}; -var loc = window.location; -var host = loc.host; -var is_localhost_but_not_dev = /*#__PURE__*/host.startsWith('localhost') && host !== 'localhost:8080'; -if (loc.hostname.endsWith('herokuapp.com') || is_localhost_but_not_dev) { - Object.keys(DEFAULT_PEERS).forEach(function (url) { - return DEFAULT_PEERS[url].enabled = false; - }); - DEFAULT_PEERS[loc.origin + "/gun"] = { - enabled: true - }; -} -var urlRegex = /^(https?:\/\/)?([\da-z.-]+)\.([a-z.]{2,6})([\/\w .-]*)*\/?$/; -/** - * Networking and peer management utilities - */ -var peers = { - known: {}, - /** */add: function add(peer) { +// eslint-disable-line no-unused-vars +var myKey; +var Key = { + getActiveKey: function getActiveKey(datadir, keyfile, fs) { var _this = this; return _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() { - var url, secret, encryptedUrl, encryptedUrlHash; + var privKeyFile, f, newKey, str, _newKey; return _regeneratorRuntime().wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: - if (!(peer.url && !urlRegex.test(peer.url))) { - _context.next = 2; - break; + if (datadir === void 0) { + datadir = "."; } - throw new Error("Invalid url " + peer.url); - case 2: - if (peer.from) { - Object.keys(_this.known).forEach(function (k) { - if (_this.known[k].from === peer.from) { - // remove previous peer url from the same user - delete _this.known[k]; - } - }); + if (keyfile === void 0) { + keyfile = "iris.key"; } - url = peer.url || ''; - _this.known[url] = _this.known[url] || _.omit(peer, ['url']); - if (!(peer.visibility === 'public')) { - _context.next = 19; + if (!myKey) { + _context.next = 4; break; } - _context.next = 8; - return Gun.SEA.secret(session.getKey().epub, session.getKey()); - case 8: - _context.t0 = _context.sent; - if (_context.t0) { + return _context.abrupt("return", myKey); + case 4: + if (!fs) { + _context.next = 21; + break; + } + privKeyFile = datadir + "/" + keyfile; + if (!fs.existsSync(privKeyFile)) { _context.next = 11; break; } - _context.t0 = ''; - case 11: - secret = _context.t0; - _context.next = 14; - return Gun.SEA.encrypt(peer.url, secret); - case 14: - encryptedUrl = _context.sent; + f = fs.readFileSync(privKeyFile, "utf8"); + myKey = _this.fromString(f); _context.next = 17; - return Gun.SEA.work(encryptedUrl, null, null, { - name: 'SHA-256' - }); + break; + case 11: + _context.next = 13; + return _this.generate(); + case 13: + newKey = _context.sent; + myKey = myKey || newKey; // eslint-disable-line require-atomic-updates + fs.writeFileSync(privKeyFile, _this.toString(myKey)); + fs.chmodSync(privKeyFile, 400); case 17: - encryptedUrlHash = _context.sent; - global$2().user().get('peers').get(encryptedUrlHash).put({ - url: peer.url, - lastSeen: new Date().toISOString() - }); + if (myKey) { + _context.next = 19; + break; + } + throw new Error("loading default key failed - check " + datadir + "/" + keyfile); case 19: - if (peer.enabled !== false) { - peer.url && _this.connect(peer.url); // this calls savePeers() - } else { - _this.save(); + _context.next = 33; + break; + case 21: + str = window.localStorage.getItem("iris.myKey"); + if (!str) { + _context.next = 26; + break; } - case 20: + myKey = _this.fromString(str); + _context.next = 31; + break; + case 26: + _context.next = 28; + return _this.generate(); + case 28: + _newKey = _context.sent; + myKey = myKey || _newKey; // eslint-disable-line require-atomic-updates + window.localStorage.setItem("iris.myKey", _this.toString(myKey)); + case 31: + if (myKey) { + _context.next = 33; + break; + } + throw new Error("loading default key failed - check localStorage iris.myKey"); + case 33: + return _context.abrupt("return", myKey); + case 34: case "end": return _context.stop(); } @@ -905,139 +904,1923 @@ var peers = { }, _callee); }))(); }, - /** */remove: function remove(url) { - delete this.known[url]; - this.save(); - }, - /** */disconnect: function disconnect(peerFromGun) { - global$2().on('bye', peerFromGun); - peerFromGun.url = ''; - }, - save: function save() { - localStorage.setItem('gunPeers', JSON.stringify(this.known)); - }, - getSaved: function getSaved() { - var p = localStorage.getItem('gunPeers'); - if (p && p !== 'undefined') { - p = JSON.parse(p); - } else { - p = DEFAULT_PEERS; + getDefault: function getDefault(datadir, keyfile) { + if (datadir === void 0) { + datadir = "."; } - if (util.isElectron) { - p[ELECTRON_GUN_URL] = {}; + if (keyfile === void 0) { + keyfile = "iris.key"; } - Object.keys(p).forEach(function (k) { - return _.defaults(p[k], { - enabled: true - }); - }); - return p; + return this.getActiveKey(datadir, keyfile); }, - /** */reset: function reset() { - localStorage.setItem('gunPeers', ''); - this.known = this.getSaved(); + getActivePub: function getActivePub(datadir, keyfile) { + var _this2 = this; + return _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2() { + var key; + return _regeneratorRuntime().wrap(function _callee2$(_context2) { + while (1) { + switch (_context2.prev = _context2.next) { + case 0: + if (datadir === void 0) { + datadir = "."; + } + if (keyfile === void 0) { + keyfile = "iris.key"; + } + _context2.next = 4; + return _this2.getActiveKey(datadir, keyfile); + case 4: + key = _context2.sent; + return _context2.abrupt("return", key.pub); + case 6: + case "end": + return _context2.stop(); + } + } + }, _callee2); + }))(); }, - /** */connect: function connect(url) { - if (this.isMixedContent(url)) { - return; + setActiveKey: function setActiveKey(key, save, datadir, keyfile, fs) { + if (save === void 0) { + save = true; } - if (this.known[url]) { - this.known[url].enabled = true; - global$2().opt({ - peers: [url] - }); - this.save(); - } else { - this.add({ - url: url - }); + if (datadir === void 0) { + datadir = "."; } - }, - /** */disable: function disable(url, peerFromGun) { - this.known[url].enabled = false; - if (peerFromGun) { - this.disconnect(peerFromGun); + if (keyfile === void 0) { + keyfile = "iris.key"; + } + myKey = key; + if (!save) return; + if (util.isNode) { + var privKeyFile = datadir + "/" + keyfile; + fs.writeFileSync(privKeyFile, this.toString(myKey)); + fs.chmodSync(privKeyFile, 400); + } else { + window.localStorage.setItem("iris.myKey", this.toString(myKey)); } - this.save(); }, - isMixedContent: function isMixedContent(url) { - return window.location.protocol === 'https:' && url.indexOf('http:') === 0; + toString: function toString(key) { + return JSON.stringify(key); }, - random: function random() { - var _this2 = this; - var connectToLocalElectron = util.isElectron && this.known[ELECTRON_GUN_URL] && this.known[ELECTRON_GUN_URL].enabled !== false; - var sampleSize = connectToLocalElectron ? Math.max(maxConnectedPeers - 1, 1) : maxConnectedPeers; - var sample = _.sampleSize(Object.keys(_.pickBy(this.known, function (peer, url) { - return !_this2.isMixedContent(url) && peer.enabled && !(util.isElectron && url === ELECTRON_GUN_URL); - })), sampleSize); - if (sample && connectToLocalElectron) { - sample.push(ELECTRON_GUN_URL); + getId: function getId(key) { + if (!(key && key.pub)) { + throw new Error("missing param"); } - return sample; + return key.pub; // hack until GUN supports lookups by keyID + //return util.getHash(key.pub); }, - checkGunPeerCount: function checkGunPeerCount() { - var _this3 = this; - var peersFromGun = global$2().back('opt.peers'); - var connectedPeers = Object.values(peersFromGun).filter(function (peer) { - if (peer && peer.wire && peer.wire.constructor.name !== 'WebSocket') { - console.log('WebRTC peer', peer); - } - return peer && peer.wire && peer.wire.readyState === 1 && peer.wire.bufferedAmount === 0 && peer.wire.constructor.name === 'WebSocket'; - }); - if (connectedPeers.length < maxConnectedPeers) { - var unconnectedPeers = Object.keys(this.known).filter(function (url) { - var addedToGun = Object.values(peersFromGun).map(function (peer) { - return peer.url; - }).indexOf(url) > -1; - var enabled = _this3.known[url].enabled; - var mixedContent = window.location.protocol === 'https:' && url.indexOf('http:') === 0; - return !mixedContent && enabled && !addedToGun; - }); - if (unconnectedPeers.length) { - var sample = String(_.sample(unconnectedPeers)); - this.connect(sample); - } - } - if (connectedPeers.length > maxConnectedPeers) { - this.disconnect(_.sample(connectedPeers)); - } + fromString: function fromString(str) { + return JSON.parse(str); }, - init: function init() { - var _this4 = this; - this.known = this.getSaved(); - /* use the default value of 1 for now because of memory issue - local().get('settings').get('maxConnectedPeers').on(n => { - if (n !== undefined) maxConnectedPeers = n; - }); - */ - setInterval(function () { - return _this4.checkGunPeerCount(); + // copied from Gun.SEA + generate: function generate() { + return _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee5() { + var ecdhSubtle, sa, dh, r; + return _regeneratorRuntime().wrap(function _callee5$(_context5) { + while (1) { + switch (_context5.prev = _context5.next) { + case 0: + _context5.prev = 0; + ecdhSubtle = window.crypto.subtle; // First: ECDSA keys for signing/verifying... + _context5.next = 4; + return ecdhSubtle.generateKey({ + name: 'ECDSA', + namedCurve: 'P-256' + }, true, ['sign', 'verify']).then( /*#__PURE__*/function () { + var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3(keys) { + var key, pub; + return _regeneratorRuntime().wrap(function _callee3$(_context3) { + while (1) { + switch (_context3.prev = _context3.next) { + case 0: + // privateKey scope doesn't leak out from here! + //const { d: priv } = await shim.subtle.exportKey('jwk', keys.privateKey) + key = {}; + _context3.next = 3; + return ecdhSubtle.exportKey('jwk', keys.privateKey); + case 3: + key.priv = _context3.sent.d; + _context3.next = 6; + return ecdhSubtle.exportKey('jwk', keys.publicKey); + case 6: + pub = _context3.sent; + //const pub = Buff.from([ x, y ].join(':')).toString('base64') // old + key.pub = pub.x + '.' + pub.y; // new + // x and y are already base64 + // pub is UTF8 but filename/URL safe (https://www.ietf.org/rfc/rfc3986.txt) + // but split on a non-base64 letter. + return _context3.abrupt("return", key); + case 9: + case "end": + return _context3.stop(); + } + } + }, _callee3); + })); + return function (_x) { + return _ref.apply(this, arguments); + }; + }()); + case 4: + sa = _context5.sent; + _context5.prev = 5; + _context5.next = 8; + return ecdhSubtle.generateKey({ + name: 'ECDH', + namedCurve: 'P-256' + }, true, ['deriveKey']).then( /*#__PURE__*/function () { + var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee4(keys) { + var key, pub; + return _regeneratorRuntime().wrap(function _callee4$(_context4) { + while (1) { + switch (_context4.prev = _context4.next) { + case 0: + // privateKey scope doesn't leak out from here! + key = {}; + _context4.next = 3; + return ecdhSubtle.exportKey('jwk', keys.privateKey); + case 3: + key.epriv = _context4.sent.d; + _context4.next = 6; + return ecdhSubtle.exportKey('jwk', keys.publicKey); + case 6: + pub = _context4.sent; + //const epub = Buff.from([ ex, ey ].join(':')).toString('base64') // old + key.epub = pub.x + '.' + pub.y; // new + // ex and ey are already base64 + // epub is UTF8 but filename/URL safe (https://www.ietf.org/rfc/rfc3986.txt) + // but split on a non-base64 letter. + return _context4.abrupt("return", key); + case 9: + case "end": + return _context4.stop(); + } + } + }, _callee4); + })); + return function (_x2) { + return _ref2.apply(this, arguments); + }; + }()); + case 8: + dh = _context5.sent; + _context5.next = 18; + break; + case 11: + _context5.prev = 11; + _context5.t0 = _context5["catch"](5); + if (!(_context5.t0 == 'Error: ECDH is not a supported algorithm')) { + _context5.next = 17; + break; + } + console.log('Ignoring ECDH...'); + _context5.next = 18; + break; + case 17: + throw _context5.t0; + case 18: + dh = dh || {}; + r = { + pub: sa.pub, + priv: sa.priv, + /* pubId, */epub: dh.epub, + epriv: dh.epriv + }; + return _context5.abrupt("return", r); + case 23: + _context5.prev = 23; + _context5.t1 = _context5["catch"](0); + console.log(_context5.t1); + throw _context5.t1; + case 28: + case "end": + return _context5.stop(); + } + } + }, _callee5, null, [[0, 23], [5, 11]]); + }))(); + }, + keyToJwk: function keyToJwk(key) { + if (typeof key === 'string') { + key = { + pub: key + }; + } + var jwk = { + kty: 'EC', + crv: 'P-256', + x: key.pub.split('.')[0], + y: key.pub.split('.')[1], + ext: true + }; + jwk.key_ops = key.priv ? ['sign'] : ['verify']; + if (key.priv) { + jwk.d = key.priv; + } + return jwk; + }, + sign: function sign(data, pair, cb, opt) { + var _this3 = this; + return _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee6() { + var text, jwk, hash, sig, r; + return _regeneratorRuntime().wrap(function _callee6$(_context6) { + while (1) { + switch (_context6.prev = _context6.next) { + case 0: + if (opt === void 0) { + opt = {}; + } + if (!(undefined === data)) { + _context6.next = 3; + break; + } + throw '`undefined` not allowed.'; + case 3: + text = typeof data === 'string' ? data : JSON.stringify(data); // Gun.SEA doesn't preserve data type: "0" -> 0. Should we change this? + jwk = _this3.keyToJwk(pair); + _context6.next = 7; + return util.getHash(text, 'buffer'); + case 7: + hash = _context6.sent; + _context6.next = 10; + return window.crypto.subtle.importKey('jwk', jwk, { + name: 'ECDSA', + namedCurve: 'P-256' + }, false, ['sign']).then(function (key) { + return window.crypto.subtle.sign({ + name: 'ECDSA', + hash: { + name: 'SHA-256' + } + }, key, hash); + }); + case 10: + sig = _context6.sent; + // privateKey scope doesn't leak out from here! + r = { + m: text, + s: Buffer.from(sig).toString(opt.encode || 'base64') + }; + if (!opt.raw) { + r = 'aSEA' + JSON.stringify(r); + } // "aSEA" was a dumb fix for an earlier bug in Gun.SEA + if (cb) { + try { + cb(r); + } catch (e) { + console.log(e); + } + } + return _context6.abrupt("return", r); + case 15: + case "end": + return _context6.stop(); + } + } + }, _callee6); + }))(); + }, + verify: function verify(data, pair, cb, opt) { + var _this4 = this; + return _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee7() { + var pub, jwk, key, text, hash, buf, sig, isValid, r; + return _regeneratorRuntime().wrap(function _callee7$(_context7) { + while (1) { + switch (_context7.prev = _context7.next) { + case 0: + if (opt === void 0) { + opt = {}; + } + _context7.prev = 1; + if (typeof data === 'string') { + if (data.slice(0, 4) === 'aSEA') { + data = data.slice(4); + } + try { + data = JSON.parse(data); + } catch (e) { + // not JSON + } + } + pub = pair.pub || pair; + jwk = _this4.keyToJwk(pub); + _context7.next = 7; + return crypto.subtle.importKey('jwk', jwk, { + name: 'ECDSA', + namedCurve: 'P-256' + }, false, ['verify']); + case 7: + key = _context7.sent; + text = data.m; + try { + text = JSON.parse(text); + } catch (e) { + // ignore + } + _context7.next = 12; + return util.getHash(text, 'buffer'); + case 12: + hash = _context7.sent; + buf = Buffer.from(data.s, opt.encode || 'base64'); + sig = new Uint8Array(buf); + _context7.next = 17; + return crypto.subtle.verify({ + name: 'ECDSA', + hash: { + name: 'SHA-256' + } + }, key, sig, hash); + case 17: + isValid = _context7.sent; + r = isValid ? JSON.parse(text) : undefined; + if (cb) { + try { + cb(r); + } catch (e) { + console.log(e); + } + } + return _context7.abrupt("return", r); + case 24: + _context7.prev = 24; + _context7.t0 = _context7["catch"](1); + console.log(_context7.t0); + return _context7.abrupt("return", undefined); + case 28: + case "end": + return _context7.stop(); + } + } + }, _callee7, null, [[1, 24]]); + }))(); + }, + secret: function secret(key, pair) { + return _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee9() { + var keysToEcdhJwk, pub, epub, epriv, pubJwk, props, privJwk; + return _regeneratorRuntime().wrap(function _callee9$(_context9) { + while (1) { + switch (_context9.prev = _context9.next) { + case 0: + keysToEcdhJwk = function keysToEcdhJwk(pub, d) { + //var [ x, y ] = shim.Buffer.from(pub, 'base64').toString('utf8').split(':') // old + var _pub$split = pub.split('.'), + x = _pub$split[0], + y = _pub$split[1]; // new + var jwk = Object.assign(d ? { + d: d + } : {}, { + x: x, + y: y, + kty: 'EC', + crv: 'P-256', + ext: true + }); + return jwk; + }; + pub = key.epub || key; + epub = pair.epub; + epriv = pair.epriv; + pubJwk = keysToEcdhJwk(pub); + _context9.t0 = Object; + _context9.next = 8; + return crypto.subtle.importKey('jwk', pubJwk, { + name: 'ECDH', + namedCurve: 'P-256' + }, true, []); + case 8: + _context9.t1 = _context9.sent; + _context9.t2 = { + "public": _context9.t1 + }; + _context9.t3 = { + name: 'ECDH', + namedCurve: 'P-256' + }; + props = _context9.t0.assign.call(_context9.t0, _context9.t2, _context9.t3); + privJwk = keysToEcdhJwk(epub, epriv); + return _context9.abrupt("return", crypto.subtle.importKey('jwk', privJwk, { + name: 'ECDH', + namedCurve: 'P-256' + }, false, ['deriveBits']).then( /*#__PURE__*/function () { + var _ref3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee8(privKey) { + var derivedBits, rawBits, derivedKey; + return _regeneratorRuntime().wrap(function _callee8$(_context8) { + while (1) { + switch (_context8.prev = _context8.next) { + case 0: + _context8.next = 2; + return crypto.subtle.deriveBits(props, privKey, 256); + case 2: + derivedBits = _context8.sent; + rawBits = new Uint8Array(derivedBits); + _context8.next = 6; + return crypto.subtle.importKey('raw', rawBits, { + name: 'AES-GCM', + length: 256 + }, true, ['encrypt', 'decrypt']); + case 6: + derivedKey = _context8.sent; + return _context8.abrupt("return", crypto.subtle.exportKey('jwk', derivedKey).then(function (_ref4) { + var k = _ref4.k; + return k; + })); + case 8: + case "end": + return _context8.stop(); + } + } + }, _callee8); + })); + return function (_x3) { + return _ref3.apply(this, arguments); + }; + }())); + case 14: + case "end": + return _context9.stop(); + } + } + }, _callee9); + }))(); + }, + aeskey: function aeskey(key, salt) { + var _this5 = this; + return _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee10() { + var combo, hash, keyB64, k, jwkKey; + return _regeneratorRuntime().wrap(function _callee10$(_context10) { + while (1) { + switch (_context10.prev = _context10.next) { + case 0: + combo = key + (salt || _this5.random(8)).toString('utf8'); // new + _context10.next = 3; + return crypto.subtle.digest({ + name: 'SHA-256' + }, new TextEncoder().encode(combo)); + case 3: + hash = _context10.sent; + hash = Buffer.from(hash, 'binary'); + keyB64 = hash.toString('base64'); + k = keyB64.replace(/\+/g, '-').replace(/\//g, '_').replace(/\=/g, ''); + jwkKey = { + kty: 'oct', + k: k, + ext: false, + alg: 'A256GCM' + }; + _context10.next = 10; + return crypto.subtle.importKey('jwk', jwkKey, { + name: 'AES-GCM' + }, false, ['encrypt', 'decrypt']); + case 10: + return _context10.abrupt("return", _context10.sent); + case 11: + case "end": + return _context10.stop(); + } + } + }, _callee10); + }))(); + }, + random: function random(len) { + return Buffer.from(crypto.getRandomValues(new Uint8Array(len))); + }, + encrypt: function encrypt(data, pair, cb, opt) { + var _this6 = this; + return _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee11() { + var key, msg, rand, ct, r; + return _regeneratorRuntime().wrap(function _callee11$(_context11) { + while (1) { + switch (_context11.prev = _context11.next) { + case 0: + if (opt === void 0) { + opt = {}; + } + key = pair.epriv || pair; + if (!(undefined === data)) { + _context11.next = 4; + break; + } + throw '`undefined` not allowed.'; + case 4: + msg = typeof data == 'string' ? data : JSON.stringify(data); // Gun.SEA doesn't preserve data type: "0" -> 0. Should we change this? + rand = { + s: _this6.random(9), + iv: _this6.random(15) + }; // consider making this 9 and 15 or 18 or 12 to reduce == padding. + _context11.next = 8; + return _this6.aeskey(key, rand.s).then(function (aes) { + return crypto.subtle.encrypt({ + name: opt.name || 'AES-GCM', + iv: new Uint8Array(rand.iv) + }, aes, new TextEncoder().encode(msg)); + }); + case 8: + ct = _context11.sent; + r = { + // @ts-ignore + ct: Buffer.from(ct, 'binary').toString(opt.encode || 'base64'), + iv: rand.iv.toString(opt.encode || 'base64'), + s: rand.s.toString(opt.encode || 'base64') + }; + if (!opt.raw) { + r = 'SEA' + JSON.stringify(r); + } + if (cb) { + try { + cb(r); + } catch (e) { + console.log(e); + } + } + return _context11.abrupt("return", r); + case 13: + case "end": + return _context11.stop(); + } + } + }, _callee11); + }))(); + }, + decrypt: function decrypt(data, pair, cb, opt) { + var _this7 = this; + return _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee12() { + var key, json, buf, bufiv, bufct, ct, text, r; + return _regeneratorRuntime().wrap(function _callee12$(_context12) { + while (1) { + switch (_context12.prev = _context12.next) { + case 0: + if (opt === void 0) { + opt = {}; + } + key = pair.epriv || pair; + try { + data = JSON.parse(data); + } catch (e) {} + if (data.indexOf('SEA{') === 0) { + json = JSON.parse(data.slice(3)); + } else { + json = JSON.parse(data); + } + if (!(!json.ct || !json.iv || !json.s)) { + _context12.next = 6; + break; + } + throw 'Invalid ciphertext ' + json; + case 6: + buf = Buffer.from(json.s, opt.encode || 'base64'); + bufiv = Buffer.from(json.iv, opt.encode || 'base64'); + bufct = Buffer.from(json.ct, opt.encode || 'base64'); + _context12.next = 11; + return _this7.aeskey(key, buf).then(function (aes) { + return crypto.subtle.decrypt({ + name: opt.name || 'AES-GCM', + iv: new Uint8Array(bufiv), + tagLength: 128 + }, aes, new Uint8Array(bufct)); + }); + case 11: + ct = _context12.sent; + text = new TextDecoder('utf8').decode(ct); + r = text; + try { + r = JSON.parse(text); + } catch (_e) {} + if (cb) { + try { + cb(r); + } catch (e) { + console.log(e); + } + } + return _context12.abrupt("return", r); + case 17: + case "end": + return _context12.stop(); + } + } + }, _callee12); + }))(); + } +}; + +var ELECTRON_GUN_URL = 'http://localhost:8767/gun'; +var maxConnectedPeers = 1; +var DEFAULT_PEERS = { + 'wss://gun-rs.iris.to/gun': {} +}; +if (self.window) { + var loc = window.location; + var host = loc.host; + var is_localhost_but_not_dev = /*#__PURE__*/host.startsWith('localhost') && host !== 'localhost:8080'; + if (loc.hostname.endsWith('herokuapp.com') || is_localhost_but_not_dev) { + Object.keys(DEFAULT_PEERS).forEach(function (url) { + return DEFAULT_PEERS[url].enabled = false; + }); + DEFAULT_PEERS[loc.origin + "/gun"] = { + enabled: true + }; + } +} +/** + * Networking and peer management utilities + */ +var peers = { + known: {}, + /** */add: function add(peer) { + var _this = this; + return _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() { + var url, secret, encryptedUrl, encryptedUrlHash; + return _regeneratorRuntime().wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + if (peer.from) { + Object.keys(_this.known).forEach(function (k) { + if (_this.known[k].from === peer.from) { + // remove previous peer url from the same user + delete _this.known[k]; + } + }); + } + url = peer.url || ''; + _this.known[url] = _this.known[url] || _.omit(peer, ['url']); + if (!(peer.visibility === 'public')) { + _context.next = 17; + break; + } + _context.next = 6; + return Key.secret(session.getKey().epub, session.getKey()); + case 6: + _context.t0 = _context.sent; + if (_context.t0) { + _context.next = 9; + break; + } + _context.t0 = ''; + case 9: + secret = _context.t0; + _context.next = 12; + return Key.encrypt(peer.url, secret); + case 12: + encryptedUrl = _context.sent; + _context.next = 15; + return util.getHash(encryptedUrl); + case 15: + encryptedUrlHash = _context.sent; + global$1().user().get('peers').get(encryptedUrlHash).put({ + url: peer.url, + lastSeen: new Date().toISOString() + }); + case 17: + if (peer.enabled !== false) { + peer.url && _this.connect(peer.url); // this calls savePeers() + } else { + _this.save(); + } + case 18: + case "end": + return _context.stop(); + } + } + }, _callee); + }))(); + }, + /** */remove: function remove(url) { + delete this.known[url]; + this.save(); + }, + /** */disconnect: function disconnect(peerFromGun) { + global$1().on('bye', peerFromGun); + peerFromGun.url = ''; + }, + save: function save() { + // TODO store them in iris.local() instead of localStorage + localStorage.setItem('gunPeers', JSON.stringify(this.known)); + }, + getSaved: function getSaved() { + var p = localStorage.getItem('gunPeers'); + if (p && p !== 'undefined') { + p = JSON.parse(p); + } else { + p = DEFAULT_PEERS; + } + if (util.isElectron) { + p[ELECTRON_GUN_URL] = {}; + } + Object.keys(p).forEach(function (k) { + return _.defaults(p[k], { + enabled: true + }); + }); + return p; + }, + /** */reset: function reset() { + localStorage.setItem('gunPeers', ''); + this.known = this.getSaved(); + }, + /** */connect: function connect(url) { + if (!url) { + return; + } + if (this.isMixedContent(url)) { + return; + } + if (this.known[url]) { + this.known[url].enabled = true; + global$1().opt({ + peers: [url] + }); + this.save(); + } else { + this.add({ + url: url + }); + } + }, + /** */disable: function disable(url, peerFromGun) { + this.known[url].enabled = false; + if (peerFromGun) { + this.disconnect(peerFromGun); + } + this.save(); + }, + isMixedContent: function isMixedContent(url) { + if (!url) { + return false; + } + return window.location.protocol === 'https:' && url.indexOf('http:') === 0; + }, + random: function random() { + var _this2 = this; + var connectToLocalElectron = util.isElectron && this.known[ELECTRON_GUN_URL] && this.known[ELECTRON_GUN_URL].enabled !== false; + var sampleSize = connectToLocalElectron ? Math.max(maxConnectedPeers - 1, 1) : maxConnectedPeers; + var sample = _.sampleSize(Object.keys(_.pickBy(this.known, function (peer, url) { + return !_this2.isMixedContent(url) && peer.enabled && !(util.isElectron && url === ELECTRON_GUN_URL); + })), sampleSize); + if (sample && connectToLocalElectron) { + sample.push(ELECTRON_GUN_URL); + } + console.log('sample', sample, JSON.stringify(this.known)); + return sample; + }, + checkGunPeerCount: function checkGunPeerCount() { + return; + }, + init: function init() { + var _this4 = this; + this.known = this.getSaved(); + /* use the default value of 1 for now because of memory issue + local().get('settings').get('maxConnectedPeers').on(n => { + if (n !== undefined) maxConnectedPeers = n; + }); + */ + setInterval(function () { + return _this4.checkGunPeerCount(); }, 1000); } }; -var global$1; -function global$2 (opts) { +function generateUuid() { + return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { + var r = Math.random() * 16 | 0, + v = c == 'x' ? r : r & 0x3 | 0x8; + return v.toString(16); + }); +} +var Actor = /*#__PURE__*/function () { + function Actor(id) { + if (id === void 0) { + id = generateUuid(); + } + this.id = id; + } + var _proto = Actor.prototype; + _proto.handle = function handle(_message) { + throw new Error('not implemented'); + } + // so we can support a similar api as Channels + ; + _proto.postMessage = function postMessage(message) { + this.handle(message); + }; + return Actor; +}(); + +var Message = /*#__PURE__*/function () { + function Message() {} + // When Messages are sent over BroadcastChannel, class name is lost. + Message.fromObject = function fromObject(obj) { + if (obj.type === 'get') { + return Get.fromObject(obj); + } else if (obj.type === 'put') { + return Put.fromObject(obj); + } else { + throw new Error('not implemented'); + } + }; + Message.deserialize = /*#__PURE__*/function () { + var _deserialize = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(str, from) { + var obj; + return _regeneratorRuntime().wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + obj = JSON.parse(str); + if (!obj.get) { + _context.next = 5; + break; + } + return _context.abrupt("return", Get.deserialize(obj, str, from)); + case 5: + if (!obj.put) { + _context.next = 9; + break; + } + return _context.abrupt("return", Put.deserialize(obj, str, from)); + case 9: + if (!(obj.dam && obj.dam === "hi")) { + _context.next = 13; + break; + } + return _context.abrupt("return", Hi.deserialize(obj)); + case 13: + throw new Error('unknown message type'); + case 14: + case "end": + return _context.stop(); + } + } + }, _callee); + })); + function deserialize(_x, _x2) { + return _deserialize.apply(this, arguments); + } + return deserialize; + }(); + var _proto = Message.prototype; + _proto.serialize = function serialize() { + throw new Error('not implemented'); + }; + return Message; +}(); +function generateMsgId() { + return Math.random().toString(36).slice(2, 10); +} +var Get = /*#__PURE__*/function () { + function Get(id, nodeId, from, recipients, childKey, jsonStr, checksum) { + this.type = 'get'; + this.id = id; + this.from = from; + this.nodeId = nodeId; + this.recipients = recipients; + this.childKey = childKey; + this.jsonStr = jsonStr; + this.checksum = checksum; + } + var _proto2 = Get.prototype; + _proto2.serialize = function serialize() { + if (this.jsonStr) { + return this.jsonStr; + } + // TODO remove "global/", replace /^user\// with ~ + var nodeId = this.nodeId.replace(/^global\//, '').replace(/^user\//, '~'); + var obj = { + "#": this.id, + get: { + "#": nodeId, + ".": this.childKey + } + }; + if (this.childKey) { + obj.get['.'] = this.childKey; + } + this.jsonStr = JSON.stringify(obj); + return this.jsonStr; + }; + Get.deserialize = /*#__PURE__*/function () { + var _deserialize2 = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(obj, jsonStr, from) { + var id, nodeId, childKey; + return _regeneratorRuntime().wrap(function _callee2$(_context2) { + while (1) { + switch (_context2.prev = _context2.next) { + case 0: + id = obj['#']; + nodeId = obj.get['#']; // TODO add "global/" prefix, replace /^~/ with "user/" + if (nodeId.startsWith('~')) { + nodeId = 'user/' + nodeId.slice(1); + } + nodeId = 'global/' + nodeId; + childKey = obj.get['.']; + return _context2.abrupt("return", new Get(id, nodeId, from, undefined, childKey, jsonStr)); + case 6: + case "end": + return _context2.stop(); + } + } + }, _callee2); + })); + function deserialize(_x3, _x4, _x5) { + return _deserialize2.apply(this, arguments); + } + return deserialize; + }(); + Get.fromObject = function fromObject(obj) { + return new Get(obj.id, obj.nodeId, obj.from, obj.recipients, obj.childKey, obj.jsonStr, obj.checksum); + }; + Get["new"] = function _new(nodeId, from, recipients, childKey, jsonStr, checksum) { + var id = generateMsgId(); + return new Get(id, nodeId, from, recipients, childKey, jsonStr, checksum); + }; + return Get; +}(); +var Put = /*#__PURE__*/function () { + function Put(id, updatedNodes, from, inResponseTo, recipients, jsonStr, checksum) { + this.type = 'put'; + this.id = id; + this.from = from; + this.updatedNodes = updatedNodes; + this.inResponseTo = inResponseTo; + this.recipients = recipients; + this.jsonStr = jsonStr; + this.checksum = checksum; + } + var _proto3 = Put.prototype; + _proto3.serialize = function serialize() { + var obj = { + "#": this.id, + "put": {} + }; + // iterate over this.updatedNodes + for (var _i = 0, _Object$entries = Object.entries(this.updatedNodes); _i < _Object$entries.length; _i++) { + var _Object$entries$_i = _Object$entries[_i], + nodeId = _Object$entries$_i[0], + children = _Object$entries$_i[1]; + var myNodeId = nodeId.replace(/^global\//, '').replace(/^user\//, '~'); + var node = obj.put[myNodeId] = {}; + for (var _i2 = 0, _Object$entries2 = Object.entries(children); _i2 < _Object$entries2.length; _i2++) { + var _Object$entries2$_i = _Object$entries2[_i2], + childKey = _Object$entries2$_i[0], + childValue = _Object$entries2$_i[1]; + if (!childValue) { + continue; + } + var data = childValue; + node[childKey] = data.value; + node["_"] = node["_"] || {}; + node["_"][">"] = node["_"][">"] || {}; + node["_"][">"][childKey] = data.updatedAt; + } + } + return JSON.stringify(obj); + }; + Put.deserialize = /*#__PURE__*/function () { + var _deserialize3 = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3(obj, jsonStr, from) { + var id, updatedNodes, _i3, _Object$entries3, _Object$entries3$_i, nodeId, c, children, node, isUserSpace, _i4, _Object$entries4, _Object$entries4$_i, childKey, childValue, user, signatureObj, timestamp, value, signedObj, signature, signedStr, updatedAt, myNodeId; + return _regeneratorRuntime().wrap(function _callee3$(_context3) { + while (1) { + switch (_context3.prev = _context3.next) { + case 0: + id = obj['#']; + updatedNodes = {}; + _i3 = 0, _Object$entries3 = Object.entries(obj.put); + case 3: + if (!(_i3 < _Object$entries3.length)) { + _context3.next = 37; + break; + } + _Object$entries3$_i = _Object$entries3[_i3], nodeId = _Object$entries3$_i[0], c = _Object$entries3$_i[1]; + children = c; + node = {}; + isUserSpace = nodeId.startsWith('~'); + _i4 = 0, _Object$entries4 = Object.entries(children); + case 9: + if (!(_i4 < _Object$entries4.length)) { + _context3.next = 32; + break; + } + _Object$entries4$_i = _Object$entries4[_i4], childKey = _Object$entries4$_i[0], childValue = _Object$entries4$_i[1]; + if (!(childKey === '_')) { + _context3.next = 13; + break; + } + return _context3.abrupt("continue", 29); + case 13: + if (!isUserSpace) { + _context3.next = 27; + break; + } + user = nodeId.split('/')[0].slice(1); + signatureObj = JSON.parse(childValue); + timestamp = children['_']['>'][childKey]; + value = signatureObj[':']; + signedObj = { + "#": nodeId, + ".": childKey, + ":": value, + ">": timestamp + }; + signature = signatureObj['~']; + signedStr = JSON.stringify(signedObj); + _context3.next = 23; + return Key.verify({ + s: signature, + m: signedStr + }, user); + case 23: + _context3.t0 = _context3.sent; + _context3.t1 = undefined; + if (!(_context3.t0 === _context3.t1)) { + _context3.next = 27; + break; + } + throw new Error("invalid signature in " + nodeId + " of " + signedStr); + case 27: + // TODO test hash space validity + updatedAt = children['_']['>'][childKey]; + node[childKey] = { + value: childValue, + updatedAt: updatedAt + }; + case 29: + _i4++; + _context3.next = 9; + break; + case 32: + myNodeId = 'global/' + nodeId.replace(/^~/, 'user/'); + updatedNodes[myNodeId] = node; + case 34: + _i3++; + _context3.next = 3; + break; + case 37: + return _context3.abrupt("return", new Put(id, updatedNodes, from, undefined, undefined, jsonStr)); + case 38: + case "end": + return _context3.stop(); + } + } + }, _callee3); + })); + function deserialize(_x6, _x7, _x8) { + return _deserialize3.apply(this, arguments); + } + return deserialize; + }(); + Put.fromObject = function fromObject(obj) { + return new Put(obj.id, obj.updatedNodes, obj.from, obj.inResponseTo, obj.recipients, obj.jsonStr, obj.checksum); + }; + Put["new"] = function _new(updatedNodes, from, inResponseTo, recipients, jsonStr, checksum) { + var id = generateMsgId(); + return new Put(id, updatedNodes, from, inResponseTo, recipients, jsonStr, checksum); + }; + Put.newFromKv = function newFromKv(key, children, from) { + var updatedNodes = {}; + updatedNodes[key] = children; + return Put["new"](updatedNodes, from); + }; + return Put; +}(); +var Hi = /*#__PURE__*/function () { + function Hi(peerId, jsonStr) { + this.type = 'hi'; + this.peerId = peerId; + this.jsonStr = jsonStr; + } + //{"#":"aHHO9Srurq9nh6Q9","dam":"hi"} + var _proto4 = Hi.prototype; + _proto4.serialize = function serialize() { + if (this.jsonStr) { + return this.jsonStr; + } + var obj = { + dam: "hi", + "#": this.peerId + }; + this.jsonStr = JSON.stringify(obj); + return this.jsonStr; + }; + Hi.deserialize = function deserialize(obj) { + var peerId = obj['#']; + return new Hi(peerId); + }; + return Hi; +}(); + +var Memory = /*#__PURE__*/function (_Actor) { + _inheritsLoose(Memory, _Actor); + function Memory(config) { + var _this; + if (config === void 0) { + config = {}; + } + _this = _Actor.call(this) || this; + _this.config = {}; + _this.store = new QuickLRU({ + maxSize: 10000 + }); + _this.config = config; + return _this; + } + var _proto = Memory.prototype; + _proto.handle = function handle(message) { + if (message instanceof Put) { + this.handlePut(message); + } else if (message instanceof Get) { + this.handleGet(message); + } else { + console.log('Memory got unknown message', message); + } + }; + _proto.handleGet = function handleGet(message) { + if (!message.from) { + console.log('no from in get message'); + return; + } + var children = this.store.get(message.nodeId); + if (children) { + //console.log('have', message.nodeId, children); + var putMessage = Put.newFromKv(message.nodeId, children, this); + putMessage.inResponseTo = message.id; + message.from && message.from.postMessage(putMessage); + } + }; + _proto.mergeAndSave = function mergeAndSave(nodeName, children) { + var existing = this.store.get(nodeName); + // TODO check updatedAt timestamp + if (existing === undefined) { + this.store.set(nodeName, children); + } else { + for (var _i = 0, _Object$entries = Object.entries(children); _i < _Object$entries.length; _i++) { + var _Object$entries$_i = _Object$entries[_i], + key = _Object$entries$_i[0], + value = _Object$entries$_i[1]; + if (existing[key] && existing[key].updatedAt >= value.updatedAt) { + continue; + } + existing[key] = value; + } + this.store.set(nodeName, existing); + } + }; + _proto.handlePut = /*#__PURE__*/function () { + var _handlePut = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(put) { + var _i2, _Object$entries2, _Object$entries2$_i, nodeName, children; + return _regeneratorRuntime().wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + _i2 = 0, _Object$entries2 = Object.entries(put.updatedNodes); + case 1: + if (!(_i2 < _Object$entries2.length)) { + _context.next = 11; + break; + } + _Object$entries2$_i = _Object$entries2[_i2], nodeName = _Object$entries2$_i[0], children = _Object$entries2$_i[1]; + if (children) { + _context.next = 7; + break; + } + console.log('deleting', nodeName); + this.store["delete"](nodeName); + return _context.abrupt("continue", 8); + case 7: + this.mergeAndSave(nodeName, children); + case 8: + _i2++; + _context.next = 1; + break; + case 11: + case "end": + return _context.stop(); + } + } + }, _callee, this); + })); + function handlePut(_x) { + return _handlePut.apply(this, arguments); + } + return handlePut; + }(); + return Memory; +}(Actor); + +// import * as Comlink from "comlink"; +// TODO: add LRU or other eviction policy, clean up least important data when db gets too big +var MyDexie = /*#__PURE__*/function (_Dexie) { + _inheritsLoose(MyDexie, _Dexie); + function MyDexie(dbName) { + var _this; + _this = _Dexie.call(this, dbName) || this; + _this.version(1).stores({ + nodes: ", value, updatedAt" + }); + _this.nodes = _this.table("nodes"); + return _this; + } + return MyDexie; +}(Dexie); +var IndexedDB = /*#__PURE__*/function (_Actor) { + _inheritsLoose(IndexedDB, _Actor); + function IndexedDB(config) { + var _this2; + if (config === void 0) { + config = {}; + } + _this2 = _Actor.call(this) || this; + _this2.config = {}; + _this2.notStored = new Set(); + _this2.putQueue = {}; + _this2.getQueue = {}; + _this2.i = 0; + _this2.queue = 0; + _this2.throttledPut = _.throttle(function () { + var keys = Object.keys(_this2.putQueue); + var values = keys.map(function (key) { + _this2.notStored["delete"](key); + return _this2.putQueue[key]; + }); + _this2.db.nodes.bulkPut(values, keys)["catch"](function (err) { + console.error(err); + }); + _this2.putQueue = {}; + }, 500); + _this2.throttledGet = _.throttle(function () { + // clone this.getQueue and clear it + var queue = _this2.getQueue; + var keys = Object.keys(queue); + _this2.db.nodes.bulkGet(keys).then(function (values) { + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + var value = values[i]; + var callbacks = queue[key]; + // console.log('have', key, value); + for (var _iterator = _createForOfIteratorHelperLoose(callbacks), _step; !(_step = _iterator()).done;) { + var callback = _step.value; + callback(value); + } + } + }); + _this2.getQueue = {}; + }, 100); + _this2.config = config; + var dbName = config.dbName || 'iris'; + _this2.db = new MyDexie(dbName); + _this2.db.open()["catch"](function (err) { + console.error(err.stack || err); + }); + return _this2; + } + var _proto = IndexedDB.prototype; + _proto.put = function put(nodeId, value) { + // add puts to a queue and dexie bulk write them once per 500ms + this.putQueue[nodeId] = value; + this.throttledPut(); + }; + _proto.get = function get(path, callback) { + this.getQueue[path] = this.getQueue[path] || []; + this.getQueue[path].push(callback); + this.throttledGet(); + }; + _proto.handle = function handle(message) { + if (message instanceof Put) { + this.handlePut(message); + } else if (message instanceof Get) { + this.handleGet(message); + } else { + console.log('worker got unknown message', message); + } + }; + _proto.handleGet = function handleGet(message) { + var _this3 = this; + if (this.notStored.has(message.nodeId)) { + // TODO message implying that the key is not stored + return; + } + this.get(message.nodeId, function (children) { + // TODO: this takes a long time to return + if (children === undefined) { + _this3.notStored.add(message.nodeId); + // TODO message implying that the key is not stored + } else { + var putMessage = Put.newFromKv(message.nodeId, children, _this3); + putMessage.inResponseTo = message.id; + message.from && message.from.postMessage(putMessage); + } + }); + }; + _proto.mergeAndSave = function mergeAndSave(path, children) { + var _this4 = this; + this.get(path, function (existing) { + // TODO check updatedAt timestamp + if (existing === undefined) { + _this4.put(path, children); + } else { + for (var _i = 0, _Object$entries = Object.entries(children); _i < _Object$entries.length; _i++) { + var _Object$entries$_i = _Object$entries[_i], + key = _Object$entries$_i[0], + value = _Object$entries$_i[1]; + if (existing[key] && existing[key].updatedAt >= value.updatedAt) { + continue; + } + existing[key] = value; + } + _this4.put(path, existing); + } + }); + }; + _proto.savePath = function savePath(path, value) { + if (value === undefined) { + this.db.nodes["delete"](path); + this.notStored.add(path); + } else { + this.notStored["delete"](path); + this.mergeAndSave(path, value); + } + }; + _proto.handlePut = /*#__PURE__*/function () { + var _handlePut = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(put) { + var _i2, _Object$entries2, _Object$entries2$_i, nodeName, children; + return _regeneratorRuntime().wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + _i2 = 0, _Object$entries2 = Object.entries(put.updatedNodes); + case 1: + if (!(_i2 < _Object$entries2.length)) { + _context.next = 10; + break; + } + _Object$entries2$_i = _Object$entries2[_i2], nodeName = _Object$entries2$_i[0], children = _Object$entries2$_i[1]; + if (children) { + _context.next = 6; + break; + } + console.log('deleting', nodeName); + return _context.abrupt("continue", 7); + case 6: + this.mergeAndSave(nodeName, children); + case 7: + _i2++; + _context.next = 1; + break; + case 10: + case "end": + return _context.stop(); + } + } + }, _callee, this); + })); + function handlePut(_x) { + return _handlePut.apply(this, arguments); + } + return handlePut; + }(); + return IndexedDB; +}(Actor); + +//@ts-ignore +var Websocket = /*#__PURE__*/function (_Actor) { + _inheritsLoose(Websocket, _Actor); + function Websocket(url, router) { + var _this; + _this = _Actor.call(this, 'websocket:' + url) || this; + _this.sendQueue = []; + console.log('Websocket', url); + _this.router = router; + _this.ws = new WebSocket(url.replace('http', 'ws')); + _this.ws.onopen = function () { + //this.ws.send(new Hi(this.router.peerId).serialize()); + console.log("Connected to " + url); + _this.sendQueue.forEach(function (message) { + return _this.ws.send(message); + }); + _this.sendQueue = []; + }; + _this.ws.onmessage = /*#__PURE__*/function () { + var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(event) { + var message; + return _regeneratorRuntime().wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + _context.prev = 0; + _context.next = 3; + return Message.deserialize(event.data, _assertThisInitialized(_this)); + case 3: + message = _context.sent; + _this.router.postMessage(message); + _context.next = 9; + break; + case 7: + _context.prev = 7; + _context.t0 = _context["catch"](0); + case 9: + case "end": + return _context.stop(); + } + } + }, _callee, null, [[0, 7]]); + })); + return function (_x) { + return _ref.apply(this, arguments); + }; + }(); + _this.ws.onclose = function () { + console.log("Disconnected from " + url); + }; + _this.ws.onerror = function () { + console.log("Error on " + url); + }; + return _this; + } + var _proto = Websocket.prototype; + _proto.handle = function handle(message) { + if (message instanceof Get || message instanceof Put) { + if (message.from === this) { + return; + } + if (this.ws.readyState === WebSocket.OPEN) { + this.ws.send(message.serialize()); + } else if (this.ws.readyState === WebSocket.CONNECTING) { + this.sendQueue.push(message.serialize()); + } + } + }; + return Websocket; +}(Actor); + +// import * as Comlink from "comlink"; +/* +class SeenGetMessage { + constructor(id, from, lastReplyChecksum) { + this.id = id; + this.from = from; + this.lastReplyChecksum = lastReplyChecksum; + } +} +*/ +var Router = /*#__PURE__*/function (_Actor) { + _inheritsLoose(Router, _Actor); + function Router(config) { + var _this; + if (config === void 0) { + config = {}; + } + _this = _Actor.call(this, 'router') || this; + _this.storageAdapters = new Set(); + _this.networkAdapters = new Set(); + _this.serverPeers = new Set(); + _this.seenMessages = new Set(); + _this.seenGetMessages = new Map(); + _this.subscribersByTopic = new Map(); + _this.msgCounter = 0; + // default random id + _this.peerId = config.peerId || Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15); + _this.storageAdapters.add(new Memory(config)); + _this.storageAdapters.add(new IndexedDB(config)); + console.log('config', config); + if (config.peers) { + for (var _iterator = _createForOfIteratorHelperLoose(config.peers), _step; !(_step = _iterator()).done;) { + var peer = _step.value; + if (peer) { + _this.serverPeers.add(new Websocket(peer, _assertThisInitialized(_this))); + } + } + } + return _this; + } + var _proto = Router.prototype; + _proto.handle = function handle(message) { + //console.log('router received', message); + if (message instanceof Put || message instanceof Get) { + if (this.seenMessages.has(message.id)) { + return; + } + this.seenMessages.add(message.id); + if (message instanceof Put) { + this.handlePut(message); + } else if (message instanceof Get) { + this.handleGet(message); + } + } + }; + _proto.handlePut = function handlePut(put) { + var _this2 = this; + var sendTo = new Set(); + Object.keys(put.updatedNodes).forEach(function (path) { + // topic is first 3 nodes of path + var topic = path.split('/').slice(0, 3).join('/'); + var subscribers = _this2.subscribersByTopic.get(topic); + // send to storage adapters + //console.log('put subscribers', subscribers); + for (var _iterator2 = _createForOfIteratorHelperLoose(_this2.storageAdapters), _step2; !(_step2 = _iterator2()).done;) { + var storageAdapter = _step2.value; + if (put.from !== storageAdapter) { + sendTo.add(storageAdapter); + } + } + for (var _iterator3 = _createForOfIteratorHelperLoose(_this2.serverPeers), _step3; !(_step3 = _iterator3()).done;) { + var peer = _step3.value; + if (put.from !== peer) { + sendTo.add(peer); + } + } + if (subscribers) { + for (var _iterator4 = _createForOfIteratorHelperLoose(subscribers), _step4; !(_step4 = _iterator4()).done;) { + var subscriber = _step4.value; + if (subscriber !== put.from) { + sendTo.add(subscriber); + } + } + } + }); + for (var _iterator5 = _createForOfIteratorHelperLoose(sendTo), _step5; !(_step5 = _iterator5()).done;) { + var actor = _step5.value; + actor.postMessage(put); + } + }; + _proto.opt = function opt(opts) { + if (opts.peers) { + for (var _iterator6 = _createForOfIteratorHelperLoose(opts.peers), _step6; !(_step6 = _iterator6()).done;) { + var peer = _step6.value; + if (peer) { + this.serverPeers.add(new Websocket(peer, this)); + } + } + } + }; + _proto.handleGet = function handleGet(get) { + var topic = get.nodeId.split('/')[1]; + var sendTo = new Set(); + for (var _iterator7 = _createForOfIteratorHelperLoose(this.storageAdapters), _step7; !(_step7 = _iterator7()).done;) { + var storageAdapter = _step7.value; + if (get.from !== storageAdapter) { + sendTo.add(storageAdapter); + } + } + for (var _iterator8 = _createForOfIteratorHelperLoose(this.serverPeers), _step8; !(_step8 = _iterator8()).done;) { + var peer = _step8.value; + if (get.from !== peer) { + sendTo.add(peer); + } + } + if (!this.subscribersByTopic.has(topic)) { + this.subscribersByTopic.set(topic, new Set()); + } + var subscribers = this.subscribersByTopic.get(topic); + if (subscribers) { + if (!subscribers.has(get.from)) { + subscribers.add(get.from); + } + } + for (var _iterator9 = _createForOfIteratorHelperLoose(sendTo), _step9; !(_step9 = _iterator9()).done;) { + var actor = _step9.value; + actor.postMessage(get); + } + }; + return Router; +}(Actor); + +var DEFAULT_CONFIG = { + allowPublicSpace: false, + enableStats: true, + localOnly: true +}; +// TODO move memory storage to its own adapter? it would make things simpler here +var Node = /*#__PURE__*/function (_Actor) { + _inheritsLoose(Node, _Actor); + function Node(id, config, parent) { + var _this; + if (id === void 0) { + id = ''; + } + _this = _Actor.call(this, id) || this; + _this.children = new Map(); + _this.once_subscriptions = new Map(); + _this.on_subscriptions = new Map(); + _this.map_subscriptions = new Map(); + _this.counter = 0; + _this.doCallbacks = function (data, key) { + if (typeof data.value === 'string' && data.value.startsWith('{":":')) { + data.value = JSON.parse(data.value)[':']; + } + var _loop2 = function _loop2() { + var _step$value = _step.value, + id = _step$value[0], + callback = _step$value[1]; + var event = { + off: function off() { + return _this.on_subscriptions["delete"](id); + } + }; + callback(data.value, key, null, event); + }; + for (var _iterator = _createForOfIteratorHelperLoose(_this.on_subscriptions), _step; !(_step = _iterator()).done;) { + _loop2(); + } + for (var _iterator2 = _createForOfIteratorHelperLoose(_this.once_subscriptions), _step2; !(_step2 = _iterator2()).done;) { + var _step2$value = _step2.value, + _id = _step2$value[0], + callback = _step2$value[1]; + callback(data.value, key, null, {}); + _this.once_subscriptions["delete"](_id); + } + if (_this.parent) { + (function () { + var parent = _this.parent; + var _loop = function _loop() { + var _step3$value = _step3.value, + id = _step3$value[0], + callback = _step3$value[1]; + var event = { + off: function off() { + return parent.map_subscriptions["delete"](id); + } + }; + callback(data.value, key, null, event); + }; + for (var _iterator3 = _createForOfIteratorHelperLoose(parent.map_subscriptions), _step3; !(_step3 = _iterator3()).done;) { + _loop(); + } + })(); + } + }; + _this.parent = parent; + _this.config = config || parent && parent.config || DEFAULT_CONFIG; + if (parent) { + _this.root = parent.root; + _this.router = parent.router; + } else { + _this.root = _assertThisInitialized(_this); + //@ts-ignore + _this.router = new Router({ + dbName: _this.id + '-idb', + peers: _this.config.webSocketPeers + }); + //console.log('idbWorker', idbWorker); + //const router = Comlink.wrap(routerWorker); + } + return _this; + } + var _proto = Node.prototype; + _proto.getCurrentUser = function getCurrentUser() { + return this.root.currentUser; + }; + _proto.setCurrentUser = function setCurrentUser(key) { + this.root.currentUser = key; + }; + _proto.handle = function handle(message) { + if (message instanceof Put) { + for (var _i = 0, _Object$entries = Object.entries(message.updatedNodes); _i < _Object$entries.length; _i++) { + var _Object$entries$_i = _Object$entries[_i], + key = _Object$entries$_i[0], + children = _Object$entries$_i[1]; + if (!children || typeof children !== 'object') { + continue; + } + if (key === this.id) { + for (var _i2 = 0, _Object$entries2 = Object.entries(children); _i2 < _Object$entries2.length; _i2++) { + var _Object$entries2$_i = _Object$entries2[_i2], + childKey = _Object$entries2$_i[0], + childData = _Object$entries2$_i[1]; + this.get(childKey).doCallbacks(childData, childKey); // TODO children should have proper NodeData + } + } + } + + this.parent && this.parent.handle(message); + } + }; + _proto.get = function get(key) { + var existing = this.children.get(key); + if (existing) { + return existing; + } + var newNode = new Node(this.id + "/" + key, this.config, this); + this.children.set(key, newNode); + return newNode; + }; + _proto.user = function user(pub) { + pub = pub || this.root.currentUser && this.root.currentUser.pub; + if (!pub) { + throw new Error("no public key!"); + } + return this.get('user').get(pub); + }; + _proto.auth = function auth(key) { + // TODO get public key from key + this.root.setCurrentUser(key); + return; + }; + _proto.put = /*#__PURE__*/function () { + var _put = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(value) { + var updatedAt, key, updatedNodes, put; + return _regeneratorRuntime().wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + updatedAt = Date.now(); + if (!Array.isArray(value)) { + _context.next = 3; + break; + } + throw new Error('put() does not support arrays'); + case 3: + if (!(typeof value === 'function')) { + _context.next = 5; + break; + } + throw new Error('put() does not support functions'); + case 5: + if (!(typeof value === 'object' && value !== null)) { + _context.next = 8; + break; + } + // TODO: update the whole path of parent nodes + for (key in value) { + this.get(key).put(value[key]); + } + return _context.abrupt("return"); + case 8: + _context.next = 10; + return this.signIfNeeded(value); + case 10: + value = _context.sent; + this.children = new Map(); + updatedNodes = {}; + _context.next = 15; + return this.addParentNodes(updatedNodes, value, updatedAt); + case 15: + put = Put["new"](updatedNodes, this); + this.handle(put); + this.router.postMessage(put); + case 18: + case "end": + return _context.stop(); + } + } + }, _callee, this); + })); + function put(_x) { + return _put.apply(this, arguments); + } + return put; + }(); + _proto.signIfNeeded = /*#__PURE__*/function () { + var _signIfNeeded = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(value) { + var signed; + return _regeneratorRuntime().wrap(function _callee2$(_context2) { + while (1) { + switch (_context2.prev = _context2.next) { + case 0: + if (!(this.id.indexOf('global/user/') === 0)) { + _context2.next = 10; + break; + } + if (this.getCurrentUser()) { + _context2.next = 3; + break; + } + throw new Error('not authenticated'); + case 3: + if (!(this.id.indexOf('global/user/' + this.getCurrentUser().pub) !== 0)) { + _context2.next = 5; + break; + } + throw new Error('not allowed ' + this.id); + case 5: + _context2.next = 7; + return Key.sign(value, this.getCurrentUser(), undefined, { + raw: true + }); + case 7: + signed = _context2.sent; + value = JSON.stringify({ + ':': signed.m, + '~': signed.s + }); + console.log('saving signed value', value); + case 10: + return _context2.abrupt("return", value); + case 11: + case "end": + return _context2.stop(); + } + } + }, _callee2, this); + })); + function signIfNeeded(_x2) { + return _signIfNeeded.apply(this, arguments); + } + return signIfNeeded; + }(); + _proto.addParentNodes = /*#__PURE__*/function () { + var _addParentNodes = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3(updatedNodes, value, updatedAt) { + var childName, parentId; + return _regeneratorRuntime().wrap(function _callee3$(_context3) { + while (1) { + switch (_context3.prev = _context3.next) { + case 0: + if (!this.parent) { + _context3.next = 7; + break; + } + childName = this.id.split('/').pop(); + parentId = this.parent.id; + updatedNodes[parentId] = updatedNodes[parentId] || {}; + updatedNodes[parentId][childName] = { + value: value, + updatedAt: updatedAt + }; + _context3.next = 7; + return this.parent.addParentNodes(updatedNodes, { + '#': this.parent.id + }, updatedAt); + case 7: + case "end": + return _context3.stop(); + } + } + }, _callee3, this); + })); + function addParentNodes(_x3, _x4, _x5) { + return _addParentNodes.apply(this, arguments); + } + return addParentNodes; + }(); + _proto.request = function request() { + if (this.parent) { + // TODO router should decide whether to re-request from peers + var childKey = this.id.split('/').pop(); + this.router.postMessage(Get["new"](this.parent.id, this, undefined, childKey)); + } + }; + _proto.once = /*#__PURE__*/function () { + var _once = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee4(callback) { + var id; + return _regeneratorRuntime().wrap(function _callee4$(_context4) { + while (1) { + switch (_context4.prev = _context4.next) { + case 0: + id = this.counter++; + callback && this.once_subscriptions.set(id, callback); + this.request(); + case 3: + case "end": + return _context4.stop(); + } + } + }, _callee4, this); + })); + function once(_x6) { + return _once.apply(this, arguments); + } + return once; + }(); + _proto.on = function on(callback) { + var id = this.counter++; + this.on_subscriptions.set(id, callback); + //const event = { off: () => this.on_subscriptions.delete(id) }; + this.request(); + }; + _proto.map = function map(callback) { + var id = this.counter++; + this.map_subscriptions.set(id, callback); + // TODO: child key should probably still be included. But how to handle link responses? + this.router.postMessage(Get["new"](this.id, this, undefined)); + }; + _proto.opt = function opt(opts) { + this.router.opt(opts); + }; + return Node; +}(Actor); + +var globalState; +function global$1 (opts) { if (opts === void 0) { opts = {}; } - if (!global$1) { + if (!globalState) { + peers.init(); + var webSocketPeers = opts.peers || peers.random(); + console.log('webSocketPeers', webSocketPeers); var myOpts = Object.assign({ - peers: opts.peers || peers.random(), + webSocketPeers: webSocketPeers, localStorage: false, retry: Infinity }, opts); if (opts.peers) { + console.log('adding peers', opts.peers); opts.peers.forEach(function (url) { return peers.add({ url: url }); }); } - peers.init(); - global$1 = new Gun(myOpts); + globalState = new Node('global', myOpts); } - return global$1; + return globalState; } // @ts-nocheck @@ -1131,18 +2914,22 @@ var Attribute = /*#__PURE__*/function () { return Attribute; }(); -var currentUser; /** * Get a public space where only the specified user (public key) can write. Others can read. - * @param pub The public key of the user. Defaults to the current user from session. + * @param pub The public key string or keypair object of the user. Defaults to the current user from session. * @returns {Node} The user space. */ function publicState (pub) { - if (!currentUser) { - currentUser = global$2().user(); - currentUser.auth(session.getKey()); + if (pub === void 0) { + pub = session.getKey(); + } + if (typeof pub === 'string') { + return global$1().user(pub); + } else if (typeof pub === 'object') { + var userSpace = global$1().user(pub.pub); + userSpace.auth(pub); + return userSpace; } - return pub ? global$2().user(pub) : currentUser; } // TODO: extract Group channels into their own class @@ -1191,12 +2978,12 @@ var DEFAULT_PERMISSIONS = { * * var gun1 = new Gun('https://gun-us.herokuapp.com/gun'); * var gun2 = new Gun('https://gun-us.herokuapp.com/gun'); -* var myKey = await iris.Key.getDefault(); +* var myKey = await Key.getDefault(); * var someoneElse = localStorage.getItem('someoneElsesKey'); * if (someoneElse) { * someoneElse = JSON.parse(someoneElse); * } else { -* someoneElse = await iris.Key.generate(); +* someoneElse = await Key.generate(); * localStorage.setItem('someoneElsesKey', JSON.stringify(someoneElse)); * } * @@ -1356,7 +3143,7 @@ var Channel = /*#__PURE__*/function () { if (sharedSecret && linkId) { this.save(); // save the channel first so it's there before inviter subscribes to it options.saved = true; - global$2().user(pub).get('chatLinks').get(linkId).get('encryptedSharedKey').on( /*#__PURE__*/function () { + global$1().user(pub).get('chatLinks').get(linkId).get('encryptedSharedKey').on( /*#__PURE__*/function () { var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(encrypted) { var sharedKey, encryptedChatRequest, channelRequestId; return _regeneratorRuntime().wrap(function _callee$(_context) { @@ -1364,20 +3151,18 @@ var Channel = /*#__PURE__*/function () { switch (_context.prev = _context.next) { case 0: _context.next = 2; - return Gun.SEA.decrypt(encrypted, sharedSecret); + return Key.decrypt(encrypted, sharedSecret); case 2: sharedKey = _context.sent; _context.next = 5; - return Gun.SEA.encrypt(session.getKey().pub, sharedSecret); + return Key.encrypt(session.getKey().pub, sharedSecret); case 5: encryptedChatRequest = _context.sent; _context.next = 8; return util.getHash(encryptedChatRequest); case 8: channelRequestId = _context.sent; - util.gunAsAnotherUser(global$2(), sharedKey, function (user) { - user.get('chatRequests').get(channelRequestId.slice(0, 12)).put(encryptedChatRequest); - }); + global$1(sharedKey).get('chatRequests').get(channelRequestId.slice(0, 12)).put(encryptedChatRequest); case 10: case "end": return _context.stop(); @@ -1423,7 +3208,7 @@ var Channel = /*#__PURE__*/function () { }); }; _proto.changeMyGroupSecret = function changeMyGroupSecret() { - this.myGroupSecret = Gun.SEA.random(32).toString('base64'); + this.myGroupSecret = Key.random(32).toString('base64'); // TODO: secret should be archived and probably messages should include the encryption key id so past messages don't become unreadable this.putDirect("S" + this.uuid, this.myGroupSecret); } @@ -1440,7 +3225,7 @@ var Channel = /*#__PURE__*/function () { while (1) { switch (_context2.prev = _context2.next) { case 0: - global$2().user(participant).get(this.theirSecretUuids[participant]).off(); + global$1().user(participant).get(this.theirSecretUuids[participant]).off(); // TODO: persist case 1: case "end": @@ -1497,7 +3282,7 @@ var Channel = /*#__PURE__*/function () { break; } _context4.next = 3; - return Gun.SEA.secret(session.getKey().epub, session.getKey()); + return Key.secret(session.getKey().epub, session.getKey()); case 3: mySecret = _context4.sent; _context4.next = 6; @@ -1565,11 +3350,11 @@ var Channel = /*#__PURE__*/function () { break; } _context5.next = 3; - return util.gunOnceDefined(global$2().user(pub).get("epub")); + return util.gunOnceDefined(global$1().user(pub).get("epub")); case 3: epub = _context5.sent; _context5.next = 6; - return Gun.SEA.secret(epub, session.getKey()); + return Key.secret(epub, session.getKey()); case 6: this.secrets[pub] = _context5.sent; case 7: @@ -1598,11 +3383,11 @@ var Channel = /*#__PURE__*/function () { switch (_context6.prev = _context6.next) { case 0: _context6.next = 2; - return util.gunOnceDefined(global$2().user(pub).get("epub")); + return util.gunOnceDefined(global$1().user(pub).get("epub")); case 2: epub = _context6.sent; _context6.next = 5; - return Gun.SEA.secret(epub, pair); + return Key.secret(epub, pair); case 5: secret = _context6.sent; return _context6.abrupt("return", util.getHash(secret + pub)); @@ -1630,11 +3415,11 @@ var Channel = /*#__PURE__*/function () { switch (_context7.prev = _context7.next) { case 0: _context7.next = 2; - return util.gunOnceDefined(global$2().user(pub).get("epub")); + return util.gunOnceDefined(global$1().user(pub).get("epub")); case 2: epub = _context7.sent; _context7.next = 5; - return Gun.SEA.secret(epub, pair); + return Key.secret(epub, pair); case 5: secret = _context7.sent; return _context7.abrupt("return", util.getHash(secret + pair.pub)); @@ -1651,7 +3436,7 @@ var Channel = /*#__PURE__*/function () { return getTheirSecretChannelId; }() /** * Calls back with Channels that you have initiated or written to. - * @param {Object} keypair Gun.SEA keypair that the gun instance is authenticated with + * @param {Object} keypair Key keypair that the gun instance is authenticated with * @param callback callback function that is called for each public key you have a channel with */; Channel.getChannels = @@ -1668,7 +3453,7 @@ var Channel = /*#__PURE__*/function () { } keypair = session.getKey(); _context9.next = 4; - return Gun.SEA.secret(keypair.epub, keypair); + return Key.secret(keypair.epub, keypair); case 4: mySecret = _context9.sent; if (listenToChatLinks) { @@ -1691,15 +3476,15 @@ var Channel = /*#__PURE__*/function () { _context8.next = 5; break; } - global$2().user().get("chats").get(ourSecretChannelId).put(null); + global$1().user().get("chats").get(ourSecretChannelId).put(null); return _context8.abrupt("return"); case 5: _context8.next = 7; - return util.gunOnceDefined(global$2().user().get("chats").get(ourSecretChannelId).get("pub")); + return util.gunOnceDefined(global$1().user().get("chats").get(ourSecretChannelId).get("pub")); case 7: encryptedChatId = _context8.sent; _context8.next = 10; - return Gun.SEA.decrypt(encryptedChatId, mySecret); + return Key.decrypt(encryptedChatId, mySecret); case 10: chatId = _context8.sent; if (chatId) { @@ -1734,7 +3519,7 @@ var Channel = /*#__PURE__*/function () { return _ref2.apply(this, arguments); }; }(); - global$2().user().get("chats").map().on(handleChannel); + global$1().user().get("chats").map(handleChannel); case 9: case "end": return _context9.stop(); @@ -1858,7 +3643,8 @@ var Channel = /*#__PURE__*/function () { case 9: theirSecretChannelId = _context12.sent; case 10: - global$2().user(pub).get("chats").get(theirSecretChannelId).get("msgs").map().once(function (data, key) { + // TODO map().once + global$1().user(pub).get("chats").get(theirSecretChannelId).get("msgs").map(function (data, key) { _this5.messageReceived(callback, data, _this5.uuid || pub, false, key, pub); }); case 11: @@ -1870,7 +3656,8 @@ var Channel = /*#__PURE__*/function () { return _this5.getOurSecretChannelId(pub); case 14: ourSecretChannelId = _context12.sent; - publicState().get("chats").get(ourSecretChannelId).get("msgs").map().once(function (data, key) { + // TODO map().once + publicState().get("chats").get(ourSecretChannelId).get("msgs").map(function (data, key) { _this5.messageReceived(callback, data, pub, true, key, session.getKey().pub); }); case 16: @@ -1892,7 +3679,8 @@ var Channel = /*#__PURE__*/function () { return this.getMySecretUuid(); case 4: mySecretUuid = _context13.sent; - publicState().get("chats").get(mySecretUuid).get("msgs").map().once(function (data, key) { + // TODO map().once + publicState().get("chats").get(mySecretUuid).get("msgs").map(function (data, key) { _this5.messageReceived(callback, data, _this5.uuid, true, key, session.getKey().pub); }); case 6: @@ -1938,7 +3726,7 @@ var Channel = /*#__PURE__*/function () { case 11: secret = _context14.t0; _context14.next = 14; - return Gun.SEA.decrypt(data, secret); + return Key.decrypt(data, secret); case 14: decrypted = _context14.sent; if (!(typeof decrypted !== "object")) { @@ -2177,12 +3965,12 @@ var Channel = /*#__PURE__*/function () { break; } _context21.next = 14; - return Gun.SEA.secret(session.getKey().epub, session.getKey()); + return Key.secret(session.getKey().epub, session.getKey()); case 14: mySecret = _context21.sent; - _context21.t0 = global$2().user().get("chats").get(ourSecretChannelId).get("pub"); + _context21.t0 = global$1().user().get("chats").get(ourSecretChannelId).get("pub"); _context21.next = 18; - return Gun.SEA.encrypt({ + return Key.encrypt({ pub: pub }, mySecret); case 18: @@ -2285,7 +4073,7 @@ var Channel = /*#__PURE__*/function () { break; } _context22.next = 15; - return Gun.SEA.encrypt(JSON.stringify(msg), this.getMyGroupSecret()); + return Key.encrypt(JSON.stringify(msg), this.getMyGroupSecret()); case 15: encrypted = _context22.sent; _context22.next = 18; @@ -2304,7 +4092,7 @@ var Channel = /*#__PURE__*/function () { _context22.next = 42; break; } - _context22.t0 = Gun.SEA; + _context22.t0 = Key; _context22.t1 = JSON.stringify(msg); _context22.next = 30; return this.getSecret(keys[i]); @@ -2358,12 +4146,12 @@ var Channel = /*#__PURE__*/function () { publicState().get("chats").get(mySecretUuid).get('msgs').get('a').put(null); this.put("participants", this.participants); // public participants list _context23.next = 8; - return Gun.SEA.secret(session.getKey().epub, session.getKey()); + return Key.secret(session.getKey().epub, session.getKey()); case 8: mySecret = _context23.sent; _context23.t0 = publicState().get("chats").get(mySecretUuid).get("pub"); _context23.next = 12; - return Gun.SEA.encrypt({ + return Key.encrypt({ uuid: this.uuid, myGroupSecret: this.getMyGroupSecret(), participants: this.participants // private participants list @@ -2442,7 +4230,7 @@ var Channel = /*#__PURE__*/function () { throw new Error("Sorry, you can't overwrite the msgs field which is used for .send()"); case 2: _context25.next = 4; - return Gun.SEA.encrypt(JSON.stringify(value), this.getMyGroupSecret()); + return Key.encrypt(JSON.stringify(value), this.getMyGroupSecret()); case 4: encrypted = _context25.sent; _context25.next = 7; @@ -2482,7 +4270,7 @@ var Channel = /*#__PURE__*/function () { _context26.next = 20; break; } - _context26.t0 = Gun.SEA; + _context26.t0 = Key; _context26.t1 = JSON.stringify(value); _context26.next = 9; return this.getSecret(keys[i]); @@ -2639,14 +4427,14 @@ var Channel = /*#__PURE__*/function () { return _this10.getOurSecretChannelId(keys[i]); case 2: ourSecretChannelId = _context32.sent; - global$2().user().get("chats").get(ourSecretChannelId).get(key).on( /*#__PURE__*/function () { + global$1().user().get("chats").get(ourSecretChannelId).get(key).on( /*#__PURE__*/function () { var _ref5 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee31(data) { var decrypted; return _regeneratorRuntime().wrap(function _callee31$(_context31) { while (1) { switch (_context31.prev = _context31.next) { case 0: - _context31.t0 = Gun.SEA; + _context31.t0 = Key; _context31.t1 = data; _context31.next = 4; return _this10.getSecret(keys[i]); @@ -2729,7 +4517,7 @@ var Channel = /*#__PURE__*/function () { return this.getMyGroupSecret(); case 7: mySecret = _context35.sent; - global$2().user().get("chats").get(mySecretUuid).get(key).on( /*#__PURE__*/function () { + global$1().user().get("chats").get(mySecretUuid).get(key).on( /*#__PURE__*/function () { var _ref6 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee33(data) { var decrypted; return _regeneratorRuntime().wrap(function _callee33$(_context34) { @@ -2737,7 +4525,7 @@ var Channel = /*#__PURE__*/function () { switch (_context34.prev = _context34.next) { case 0: _context34.next = 2; - return Gun.SEA.decrypt(data, mySecret); + return Key.decrypt(data, mySecret); case 2: decrypted = _context34.sent; if (decrypted) { @@ -2803,7 +4591,7 @@ var Channel = /*#__PURE__*/function () { return this.getTheirSecretChannelId(pub); case 4: theirSecretChannelId = _context38.sent; - global$2().user(pub).get("chats").get(theirSecretChannelId).get(key).on( /*#__PURE__*/function () { + global$1().user(pub).get("chats").get(theirSecretChannelId).get(key).on( /*#__PURE__*/function () { var _ref7 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee36(data) { var decrypted; return _regeneratorRuntime().wrap(function _callee36$(_context37) { @@ -2816,7 +4604,7 @@ var Channel = /*#__PURE__*/function () { } return _context37.abrupt("return"); case 2: - _context37.t0 = Gun.SEA; + _context37.t0 = Key; _context37.t1 = data; _context37.next = 6; return _this11.getSecret(pub); @@ -2932,7 +4720,7 @@ var Channel = /*#__PURE__*/function () { return this.getTheirSecretUuid(pub); case 4: theirSecretUuid = _context42.sent; - global$2().user(pub).get("chats").get(theirSecretUuid).get(key).on( /*#__PURE__*/function () { + global$1().user(pub).get("chats").get(theirSecretUuid).get(key).on( /*#__PURE__*/function () { var _ref9 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee40(data, _a, _b, e) { var decrypted; return _regeneratorRuntime().wrap(function _callee40$(_context41) { @@ -2948,7 +4736,7 @@ var Channel = /*#__PURE__*/function () { } return _context41.abrupt("return"); case 3: - _context41.t0 = Gun.SEA; + _context41.t0 = Key; _context41.t1 = data; _context41.next = 7; return _this13.getTheirGroupSecret(pub); @@ -3090,36 +4878,6 @@ var Channel = /*#__PURE__*/function () { }); } /** - * Add a chat button to page - * @param options {label, channelOptions} - */; - Channel.addChatButton = function addChatButton(options) { - if (options === void 0) { - options = {}; - } - options = Object.assign({ - label: 'Chat' - }, options); - if (!options.channelOptions) { - throw new Error('addChatButton missing options.channelOptions param'); - } - util.injectCss(); - var channel, box; - var btn = util.createElement('div', 'iris-chat-open-button', document.body); - btn.setAttribute('id', 'iris-chat-open-button'); - btn.innerHTML = " " + options.label; - btn.addEventListener('click', function () { - btn.setAttribute('style', 'display: none'); - if (!channel) { - channel = new Channel(options.channelOptions); - box = channel.getChatBox(); - document.body.appendChild(box); - } else { - box.setAttribute('style', ''); // show - } - }); - } - /** * Get a simple link that points to the channel. * * Direct channel: both users need to give their simple links. Use createChatLink() to get a two-way link that needs to be given by one user only. @@ -3194,7 +4952,7 @@ var Channel = /*#__PURE__*/function () { id: linkId }); if (subscribe) { - global$2().user(link.sharedKey.pub).get('chatRequests').map().on( /*#__PURE__*/function () { + global$1().user(link.sharedKey.pub).get('chatRequests').map( /*#__PURE__*/function () { var _ref11 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee44(encPub, requestId, a, e) { var s, pub; return _regeneratorRuntime().wrap(function _callee44$(_context45) { @@ -3215,7 +4973,7 @@ var Channel = /*#__PURE__*/function () { } channels.push(s); _context45.next = 8; - return Gun.SEA.decrypt(encPub, link.sharedSecret); + return Key.decrypt(encPub, link.sharedSecret); case 8: pub = _context45.sent; _this17.addParticipant(pub, undefined, undefined, true); @@ -3256,24 +5014,24 @@ var Channel = /*#__PURE__*/function () { urlRoot = 'https://iris.to/'; } _context47.next = 3; - return Gun.SEA.pair(); + return Key.generate(); case 3: sharedKey = _context47.sent; sharedKeyString = JSON.stringify(sharedKey); _context47.next = 7; - return Gun.SEA.secret(sharedKey.epub, sharedKey); + return Key.secret(sharedKey.epub, sharedKey); case 7: sharedSecret = _context47.sent; _context47.next = 10; - return Gun.SEA.encrypt(sharedKeyString, sharedSecret); + return Key.encrypt(sharedKeyString, sharedSecret); case 10: encryptedSharedKey = _context47.sent; _context47.next = 13; - return Gun.SEA.secret(session.getKey().epub, session.getKey()); + return Key.secret(session.getKey().epub, session.getKey()); case 13: ownerSecret = _context47.sent; _context47.next = 16; - return Gun.SEA.encrypt(sharedKeyString, ownerSecret); + return Key.encrypt(sharedKeyString, ownerSecret); case 16: ownerEncryptedSharedKey = _context47.sent; _context47.next = 19; @@ -3282,13 +5040,9 @@ var Channel = /*#__PURE__*/function () { linkId = _context47.sent; linkId = linkId.slice(0, 12); // User has to exist, in order for .get(chatRequests).on() to be ever triggered - _context47.next = 23; - return util.gunAsAnotherUser(global$2(), sharedKey, function (user) { - return user.get('chatRequests').put({ - a: 1 - }).then(); + global$1(sharedKey).get('chatRequests').put({ + a: 1 }); - case 23: this.chatLinks[linkId] = { sharedKey: sharedKey, sharedSecret: sharedSecret @@ -3301,175 +5055,41 @@ var Channel = /*#__PURE__*/function () { return _context47.abrupt("return", Channel.formatChatLink({ urlRoot: urlRoot, channelId: this.uuid, - inviter: session.getKey().pub, - sharedSecret: sharedSecret, - linkId: linkId - })); - case 27: - case "end": - return _context47.stop(); - } - } - }, _callee46, this); - })); - function createChatLink(_x86) { - return _createChatLink.apply(this, arguments); - } - return createChatLink; - }() /** - * Get a channel box element that you can add to your page - */; - _proto.getChatBox = function getChatBox() { - var _this18 = this; - util.injectCss(); - var minimized = false; - var chatBox = util.createElement('div', 'iris-chat-box'); - var header = util.createElement('div', 'iris-chat-header', chatBox); - var minimize = util.createElement('span', 'iris-chat-minimize', header); - minimize.innerText = '—'; - minimize.addEventListener('click', function (e) { - e.stopPropagation(); - chatBox.setAttribute('class', 'iris-chat-box minimized'); - minimized = true; - }); - var headerText = util.createElement('div', 'iris-chat-header-text', header); - var onlineIndicator = util.createElement('span', 'iris-online-indicator', headerText); - onlineIndicator.innerHTML = '●'; - var nameEl = util.createElement('span', undefined, headerText); - var close = util.createElement('span', 'iris-chat-close', header); - close.innerHTML = '×'; - close.addEventListener('click', function () { - chatBox.setAttribute('style', 'display: none'); - var openChatBtn = document.getElementById('iris-chat-open-button'); - if (openChatBtn) { - openChatBtn.setAttribute('style', ''); // show - } - }); - - header.addEventListener('click', function () { - if (minimized) { - chatBox.setAttribute('class', 'iris-chat-box'); - minimized = false; - } - }); - var messages = util.createElement('div', 'iris-chat-messages', chatBox); - var typingIndicator = util.createElement('div', 'iris-typing-indicator', chatBox); - typingIndicator.innerText = 'typing...'; - this.getTyping(function (isTyping) { - typingIndicator.setAttribute('class', "iris-typing-indicator" + (isTyping ? ' yes' : '')); - }); - var inputWrapper = util.createElement('div', 'iris-chat-input-wrapper', chatBox); - var textArea = util.createElement('textarea', undefined, inputWrapper); - textArea.setAttribute('rows', '1'); - textArea.setAttribute('placeholder', 'Type a message'); - if (util.isMobile) { - var sendBtn = util.createElement('button', undefined, inputWrapper); - sendBtn.innerHTML = "\n \n "; - sendBtn.addEventListener('click', function () { - _this18.send(textArea.value); - textArea.value = ''; - _this18.setTyping(false); - }); - } - var participants = this.getCurrentParticipants(); - if (participants.length) { - var pub = participants[0]; - global$2().user(pub).get('profile').get('name').on(function (name) { - return nameEl.innerText = name; - }); - Channel.getActivity(global$2(), pub, function (status) { - var cls = "iris-online-indicator" + (status.isActive ? ' yes' : ''); - onlineIndicator.setAttribute('class', cls); - var undelivered = messages.querySelectorAll('.iris-chat-message:not(.delivered)'); - undelivered.forEach(function (msg) { - if (msg.getAttribute('data-time') <= status.lastActive) { - var c = msg.getAttribute('class'); - msg.setAttribute('class', c + " delivered"); - } - }); - }); - } - this.getTheirMsgsLastSeenTime(function (time) { - var unseen = messages.querySelectorAll('.iris-seen:not(.yes)'); - unseen.forEach(function (indicator) { - var msgEl = indicator.parentElement.parentElement.parentElement; - if (msgEl.getAttribute('data-time') <= time) { - var msgClass = msgEl.getAttribute('class'); - if (msgClass.indexOf('delivered') === -1) { - msgEl.setAttribute('class', msgClass + " delivered"); - } - indicator.setAttribute('class', 'iris-seen yes'); - } - }); - }); - this.getMessages(function (msg, info) { - var msgContent = util.createElement('div', 'iris-msg-content'); - msgContent.innerText = msg.text; - var time = util.createElement('div', 'time', msgContent); - time.innerText = util.formatTime(new Date(msg.time)); - if (info.selfAuthored) { - var cls = _this18.theirMsgsLastSeenTime >= msg.time ? 'iris-seen yes' : 'iris-seen'; - var seenIndicator = util.createElement('span', cls, time); - seenIndicator.innerHTML = ' '; - } - msgContent.innerHTML = msgContent.innerHTML.replace(/\n/g, '
\n'); - var msgEl = util.createElement('div', (info.selfAuthored ? 'our' : 'their') + " iris-chat-message"); - msgEl.appendChild(msgContent); - msgEl.setAttribute('data-time', msg.time); - for (var i = messages.children.length; i >= 0; i--) { - if (i === 0) { - messages.insertBefore(msgEl, messages.firstChild); - } else { - var t = messages.children[i - 1].getAttribute('data-time'); - if (t && t < msg.time) { - messages.children[i - 1].insertAdjacentElement('afterend', msgEl); - break; + inviter: session.getKey().pub, + sharedSecret: sharedSecret, + linkId: linkId + })); + case 26: + case "end": + return _context47.stop(); } } - } - messages.scrollTop = messages.scrollHeight; - }); - textArea.addEventListener('keyup', function (event) { - Channel.setActivity(global$2(), true); // TODO - _this18.setMyMsgsLastSeenTime(); // TODO - if (event.keyCode === 13) { - event.preventDefault(); - var content = textArea.value; - var caret = util.getCaret(textArea); - if (event.shiftKey) { - textArea.value = content.substring(0, caret - 1) + "\n" + content.substring(caret, content.length); - } else { - textArea.value = content.substring(0, caret - 1) + content.substring(caret, content.length); - _this18.send(textArea.value); - textArea.value = ''; - _this18.setTyping(false); - } - } else { - _this18.setTyping(!!textArea.value.length); - } - }); - return chatBox; - } - /** - * Set the user's online/active status - * @param {string} activity string: set the activity status every 3 seconds, null/false: stop updating - */; + }, _callee46, this); + })); + function createChatLink(_x86) { + return _createChatLink.apply(this, arguments); + } + return createChatLink; + }() /** + * Set the user's online/active status + * @param {string} activity string: set the activity status every 3 seconds, null/false: stop updating + */; Channel.setActivity = function setActivity(activity) { - if (global$2().irisActivityStatus === activity) { + if (global$1().irisActivityStatus === activity) { return; } - global$2().irisActivityStatus = activity; - clearTimeout(global$2().setActivityTimeout); + global$1().irisActivityStatus = activity; + clearTimeout(global$1().setActivityTimeout); var update = function update() { - global$2().user().get("activity").put({ + global$1().user().get("activity").put({ status: activity, - time: new Date(Gun.state()).toISOString() + time: new Date().toISOString() }); }; update(); function timerUpdate() { update(); - global$2().setActivityTimeout = setTimeout(timerUpdate, 3000); + global$1().setActivityTimeout = setTimeout(timerUpdate, 3000); } if (activity) { timerUpdate(); @@ -3483,12 +5103,12 @@ var Channel = /*#__PURE__*/function () { */; Channel.getActivity = function getActivity(pubKey, callback) { var timeout; - global$2().user(pubKey).get("activity").on(function (activity) { + global$1().user(pubKey).get("activity").on(function (activity) { if (!activity || !(activity.time && activity.status)) { return; } clearTimeout(timeout); - var now = new Date(Gun.state()); + var now = new Date(); var activityDate = new Date(activity.time); var isActive = activityDate > new Date(now.getTime() - 10 * 1000) && activityDate < new Date(now.getTime() + 30 * 1000); callback({ @@ -3534,28 +5154,28 @@ var Channel = /*#__PURE__*/function () { if (urlRoot === void 0) { urlRoot = 'https://iris.to/'; } - user = global$2().user(); + user = global$1().user(); key = session.getKey(); // We create a new Gun user whose private key is shared with the chat link recipients. // Chat link recipients can contact you by writing their public key to the shared key's user space. _context48.next = 5; - return Gun.SEA.pair(); + return Key.generate(); case 5: sharedKey = _context48.sent; sharedKeyString = JSON.stringify(sharedKey); _context48.next = 9; - return Gun.SEA.secret(sharedKey.epub, sharedKey); + return Key.secret(sharedKey.epub, sharedKey); case 9: sharedSecret = _context48.sent; _context48.next = 12; - return Gun.SEA.encrypt(sharedKeyString, sharedSecret); + return Key.encrypt(sharedKeyString, sharedSecret); case 12: encryptedSharedKey = _context48.sent; _context48.next = 15; - return Gun.SEA.secret(key.epub, key); + return Key.secret(key.epub, key); case 15: ownerSecret = _context48.sent; _context48.next = 18; - return Gun.SEA.encrypt(sharedKeyString, ownerSecret); + return Key.encrypt(sharedKeyString, ownerSecret); case 18: ownerEncryptedSharedKey = _context48.sent; _context48.next = 21; @@ -3564,10 +5184,10 @@ var Channel = /*#__PURE__*/function () { linkId = _context48.sent; linkId = linkId.slice(0, 12); // User has to exist, in order for .get(chatRequests).on() to be ever triggered - util.gunAsAnotherUser(global$2(), sharedKey, function (user) { - user.get('chatRequests').put({ - a: 1 - }); + global$1(sharedKey).get('chatRequests').put({ + a: 1 + }).get('chatRequests').put({ + a: 1 }); user.get('chatLinks').get(linkId).put({ encryptedSharedKey: encryptedSharedKey, @@ -3609,13 +5229,13 @@ var Channel = /*#__PURE__*/function () { subscribe = false; } key = session.getKey(); - user = global$2().user(); + user = global$1().user(); _context51.next = 6; - return Gun.SEA.secret(key.epub, key); + return Key.secret(key.epub, key); case 6: mySecret = _context51.sent; chatLinks = []; - user.get('chatLinks').map().on(function (data, linkId) { + user.get('chatLinks').map(function (data, linkId) { if (!data || chatLinks.indexOf(linkId) !== -1) { return; } @@ -3635,11 +5255,11 @@ var Channel = /*#__PURE__*/function () { case 2: chatLinks.push(linkId); _context50.next = 5; - return Gun.SEA.decrypt(enc, mySecret); + return Key.decrypt(enc, mySecret); case 5: sharedKey = _context50.sent; _context50.next = 8; - return Gun.SEA.secret(sharedKey.epub, sharedKey); + return Key.secret(sharedKey.epub, sharedKey); case 8: sharedSecret = _context50.sent; url = Channel.formatChatLink({ @@ -3655,7 +5275,7 @@ var Channel = /*#__PURE__*/function () { }); } if (subscribe) { - global$2().user(sharedKey.pub).get('chatRequests').map().on( /*#__PURE__*/function () { + global$1().user(sharedKey.pub).get('chatRequests').map( /*#__PURE__*/function () { var _ref14 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee48(encPub, requestId) { var s, pub, channel; return _regeneratorRuntime().wrap(function _callee48$(_context49) { @@ -3675,7 +5295,7 @@ var Channel = /*#__PURE__*/function () { } channels.push(s); _context49.next = 7; - return Gun.SEA.decrypt(encPub, sharedSecret); + return Key.decrypt(encPub, sharedSecret); case 7: pub = _context49.sent; channel = new Channel({ @@ -3684,9 +5304,7 @@ var Channel = /*#__PURE__*/function () { }); channel.save(); case 10: - util.gunAsAnotherUser(global$2(), sharedKey, function (user) { - user.get('chatRequests').get(requestId).put(null); - }); + global$1(sharedKey).get('chatRequests').get(requestId).put(null); case 11: case "end": return _context49.stop(); @@ -3728,14 +5346,14 @@ var Channel = /*#__PURE__*/function () { _proto.removeGroupChatLink = function removeGroupChatLink(linkId) { this.chatLinks[linkId] = null; this.put('chatLinks', this.chatLinks); - global$2().user().get('chatLinks').get(linkId).put(null); + global$1().user().get('chatLinks').get(linkId).put(null); } /** * */; Channel.removePrivateChatLink = function removePrivateChatLink(key, linkId) { - global$2().user().auth(key); - global$2().user().get('chatLinks').get(linkId).put(null); + global$1().user().auth(key); + global$1().user().get('chatLinks').get(linkId).put(null); } /** * @@ -3749,13 +5367,13 @@ var Channel = /*#__PURE__*/function () { while (1) { switch (_context52.prev = _context52.next) { case 0: - global$2().user().auth(key); + global$1().user().auth(key); _context52.next = 3; return Channel.getOurSecretChannelId(pub, key); case 3: channelId = _context52.sent; - global$2().user().get('channels').get(channelId).put(null); - global$2().user().get('channels').get(channelId).off(); + global$1().user().get('channels').get(channelId).put(null); + global$1().user().get('channels').get(channelId).off(); case 6: case "end": return _context52.stop(); @@ -3779,426 +5397,57 @@ var Channel = /*#__PURE__*/function () { while (1) { switch (_context53.prev = _context53.next) { case 0: - _context53.next = 2; - return Gun.SEA.secret(key.epub, key); - case 2: - mySecret = _context53.sent; - _context53.next = 5; - return util.getHash(mySecret); - case 5: - mySecretHash = _context53.sent; - _context53.next = 8; - return util.getHash(mySecretHash + uuid); - case 8: - mySecretUuid = _context53.sent; - global$2().user().auth(key); - global$2().user().get('channels').get(mySecretUuid).put(null); - global$2().user().get('channels').get(mySecretUuid).off(); - case 12: - case "end": - return _context53.stop(); - } - } - }, _callee52); - })); - function deleteGroup(_x96, _x97) { - return _deleteGroup.apply(this, arguments); - } - return deleteGroup; - }(); - return Channel; -}(); - -var channels = /*#__PURE__*/new Map(); -/** - * Private channel that only you and publicKey can read/write. - * @param publicKey - * @returns {Channel} - */ -function privateState (publicKey, chatLink) { - if (publicKey === void 0) { - publicKey = session.getKey(); - } - var channel = channels.get(publicKey); - if (!channel) { - channel = new Channel({ - participants: publicKey, - chatLink: chatLink - }); - channels.set(publicKey, channel); - } - return channel; -} - -// Localforage returns null if an item is not found, so we represent null with this uuid instead. -// not foolproof, but good enough for now. -var LOCALFORAGE_NULL = "c2fc1ad0-f76f-11ec-b939-0242ac120002"; -var notInLocalForage = /*#__PURE__*/new Set(); -localForage.config({ - driver: [localForage.LOCALSTORAGE, localForage.INDEXEDDB, localForage.WEBSQL] -}); -/** - Our very own implementation of the Gun API - */ -var Node = /*#__PURE__*/function () { - /** */ - function Node(id, parent) { - var _this = this; - if (id === void 0) { - id = ''; - } - if (parent === void 0) { - parent = null; - } - this.children = new Map(); - this.on_subscriptions = new Map(); - this.map_subscriptions = new Map(); - this.value = undefined; - this.counter = 0; - this.loaded = false; - this.saveLocalForage = _.throttle( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() { - var children; - return _regeneratorRuntime().wrap(function _callee$(_context) { - while (1) { - switch (_context.prev = _context.next) { - case 0: - if (_this.loaded) { - _context.next = 3; - break; - } - _context.next = 3; - return _this.loadLocalForage(); - case 3: - if (_this.children.size) { - children = Array.from(_this.children.keys()); - localForage.setItem(_this.id, children); - } else if (_this.value === undefined) { - localForage.removeItem(_this.id); - } else { - localForage.setItem(_this.id, _this.value === null ? LOCALFORAGE_NULL : _this.value); - } - case 4: - case "end": - return _context.stop(); - } - } - }, _callee); - })), 500); - this.loadLocalForage = _.throttle( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3() { - var result, newResult; - return _regeneratorRuntime().wrap(function _callee3$(_context3) { - while (1) { - switch (_context3.prev = _context3.next) { - case 0: - if (!notInLocalForage.has(_this.id)) { - _context3.next = 2; - break; - } - return _context3.abrupt("return", undefined); - case 2: - _context3.next = 4; - return localForage.getItem(_this.id); - case 4: - result = _context3.sent; - if (!(result === null)) { - _context3.next = 10; - break; - } - result = undefined; - notInLocalForage.add(_this.id); - _context3.next = 22; - break; - case 10: - if (!(result === LOCALFORAGE_NULL)) { - _context3.next = 14; - break; - } - result = null; - _context3.next = 22; - break; - case 14: - if (!Array.isArray(result)) { - _context3.next = 21; - break; - } - // result is a list of children - newResult = {}; - _context3.next = 18; - return Promise.all(result.map( /*#__PURE__*/function () { - var _ref3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(key) { - return _regeneratorRuntime().wrap(function _callee2$(_context2) { - while (1) { - switch (_context2.prev = _context2.next) { - case 0: - _context2.next = 2; - return _this.get(key).once(); - case 2: - newResult[key] = _context2.sent; - case 3: - case "end": - return _context2.stop(); - } - } - }, _callee2); - })); - return function (_x) { - return _ref3.apply(this, arguments); - }; - }())); - case 18: - result = newResult; - _context3.next = 22; - break; - case 21: - // result is a value - _this.value = result; - case 22: - _this.loaded = true; - return _context3.abrupt("return", result); - case 24: - case "end": - return _context3.stop(); - } - } - }, _callee3); - })), 500); - this.doCallbacks = _.throttle(function () { - var _loop3 = function _loop3() { - var _step$value = _step.value, - id = _step$value[0], - callback = _step$value[1]; - var event = { - off: function off() { - return _this.on_subscriptions["delete"](id); - } - }; - _this.once(callback, event, false); - }; - for (var _iterator = _createForOfIteratorHelperLoose(_this.on_subscriptions), _step; !(_step = _iterator()).done;) { - _loop3(); - } - if (_this.parent) { - var _loop = function _loop() { - var _step2$value = _step2.value, - id = _step2$value[0], - callback = _step2$value[1]; - var event = { - off: function off() { - return _this.parent.on_subscriptions["delete"](id); - } - }; - _this.parent.once(callback, event, false); - }; - for (var _iterator2 = _createForOfIteratorHelperLoose(_this.parent.on_subscriptions), _step2; !(_step2 = _iterator2()).done;) { - _loop(); - } - var _loop2 = function _loop2() { - var _step3$value = _step3.value, - id = _step3$value[0], - callback = _step3$value[1]; - var event = { - off: function off() { - return _this.parent.map_subscriptions["delete"](id); - } - }; - _this.once(callback, event, false); - }; - for (var _iterator3 = _createForOfIteratorHelperLoose(_this.parent.map_subscriptions), _step3; !(_step3 = _iterator3()).done;) { - _loop2(); - } - } - }, 40); - this.id = id; - this.parent = parent; - } - /** - * - * @param key - * @returns {Node} - * @example node.get('users').get('alice').put({name: 'Alice'}) - */ - var _proto = Node.prototype; - _proto.get = function get(key) { - var existing = this.children.get(key); - if (existing) { - return existing; - } - var new_node = new Node(this.id + "/" + key, this); - this.children.set(key, new_node); - this.saveLocalForage(); - return new_node; - } - /** - * Set a value to the node. If the value is an object, it will be converted to child nodes. - * @param value - * @example node.get('users').get('alice').put({name: 'Alice'}) - */; - _proto.put = function put(value) { - var _this2 = this; - if (Array.isArray(value)) { - throw new Error('Sorry, we don\'t deal with arrays'); - } - if (typeof value === 'object' && value !== null) { - this.value = undefined; - for (var key in value) { - this.get(key).put(value[key]); - } - _.defer(function () { - return _this2.doCallbacks(); - }, 100); - return; - } - this.children = new Map(); - this.value = value; - this.doCallbacks(); - this.saveLocalForage(); - } - // protip: the code would be a lot cleaner if you separated the Node API from storage adapters. - /** - * Return a value without subscribing to it - * @param callback - * @param event - * @param returnIfUndefined - * @returns {Promise<*>} - */; - _proto.once = - /*#__PURE__*/ - function () { - var _once = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee5(callback, event, returnIfUndefined) { - var _this3 = this; - var result; - return _regeneratorRuntime().wrap(function _callee5$(_context5) { - while (1) { - switch (_context5.prev = _context5.next) { - case 0: - if (returnIfUndefined === void 0) { - returnIfUndefined = true; - } - if (!this.children.size) { - _context5.next = 7; - break; - } - // return an object containing all children - result = {}; - _context5.next = 5; - return Promise.all(Array.from(this.children.keys()).map( /*#__PURE__*/function () { - var _ref4 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee4(key) { - return _regeneratorRuntime().wrap(function _callee4$(_context4) { - while (1) { - switch (_context4.prev = _context4.next) { - case 0: - _context4.next = 2; - return _this3.get(key).once(undefined, event); - case 2: - result[key] = _context4.sent; - case 3: - case "end": - return _context4.stop(); - } - } - }, _callee4); - })); - return function (_x5) { - return _ref4.apply(this, arguments); - }; - }())); - case 5: - _context5.next = 14; - break; - case 7: - if (!(this.value !== undefined)) { - _context5.next = 11; - break; - } - result = this.value; - _context5.next = 14; - break; - case 11: - _context5.next = 13; - return this.loadLocalForage(); - case 13: - result = _context5.sent; - case 14: - if (!(result !== undefined || returnIfUndefined)) { - _context5.next = 17; - break; - } - callback && callback(result, this.id.slice(this.id.lastIndexOf('/') + 1), null, event); - return _context5.abrupt("return", result); - case 17: - case "end": - return _context5.stop(); - } - } - }, _callee5, this); - })); - function once(_x2, _x3, _x4) { - return _once.apply(this, arguments); - } - return once; - }() /** - * Subscribe to a value - * @param callback - */; - _proto.on = function on(callback) { - var _this4 = this; - var id = this.counter++; - this.on_subscriptions.set(id, callback); - var event = { - off: function off() { - return _this4.on_subscriptions["delete"](id); - } - }; - this.once(callback, event, false); - } - /** - * Subscribe to the children of a node. Callback is called separately for each child. - * @param callback - * @returns {Promise} - */; - _proto.map = - /*#__PURE__*/ - function () { - var _map = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee6(callback) { - var _this5 = this; - var id, event, _iterator4, _step4, child; - return _regeneratorRuntime().wrap(function _callee6$(_context6) { - while (1) { - switch (_context6.prev = _context6.next) { - case 0: - id = this.counter++; - this.map_subscriptions.set(id, callback); - event = { - off: function off() { - return _this5.map_subscriptions["delete"](id); - } - }; - if (this.loaded) { - _context6.next = 6; - break; - } - _context6.next = 6; - return this.loadLocalForage(); - case 6: - for (_iterator4 = _createForOfIteratorHelperLoose(this.children.values()); !(_step4 = _iterator4()).done;) { - child = _step4.value; - child.once(callback, event, false); - } - case 7: + _context53.next = 2; + return Key.secret(key.epub, key); + case 2: + mySecret = _context53.sent; + _context53.next = 5; + return util.getHash(mySecret); + case 5: + mySecretHash = _context53.sent; + _context53.next = 8; + return util.getHash(mySecretHash + uuid); + case 8: + mySecretUuid = _context53.sent; + global$1().user().auth(key); + global$1().user().get('channels').get(mySecretUuid).put(null); + global$1().user().get('channels').get(mySecretUuid).off(); + case 12: case "end": - return _context6.stop(); + return _context53.stop(); } } - }, _callee6, this); + }, _callee52); })); - function map(_x6) { - return _map.apply(this, arguments); + function deleteGroup(_x96, _x97) { + return _deleteGroup.apply(this, arguments); } - return map; + return deleteGroup; }(); - return Node; + return Channel; }(); +var channels = /*#__PURE__*/new Map(); +/** + * Private channel that only you and publicKey can read/write. + * @param publicKey + * @returns {Channel} + */ +function privateState (publicKey, chatLink) { + if (publicKey === void 0) { + publicKey = session.getKey(); + } + var channel = channels.get(publicKey); + if (!channel) { + channel = new Channel({ + participants: publicKey, + chatLink: chatLink + }); + channels.set(publicKey, channel); + } + return channel; +} + var local; /** * Get a state that is only synced in memory and local storage. @@ -4208,7 +5457,7 @@ var local; */ function local$1 () { if (!local) { - local = new Node(); + local = new Node('local'); } return local; } @@ -4554,7 +5803,7 @@ var addWebPushSubscriptionsToChats = /*#__PURE__*/_.debounce(function () { }, 5000); function removeSubscription(hash) { delete webPushSubscriptions[hash]; - global$2().user().get('webPushSubscriptions').get(hash).put(null); + global$1().user().get('webPushSubscriptions').get(hash).put(null); addWebPushSubscriptionsToChats(); } function addWebPushSubscription(_x2, _x3) { @@ -4572,11 +5821,11 @@ function _addWebPushSubscription() { } myKey = session.getKey(); _context5.next = 4; - return Gun.SEA.secret(myKey.epub, myKey); + return Key.secret(myKey.epub, myKey); case 4: mySecret = _context5.sent; _context5.next = 7; - return Gun.SEA.encrypt(s, mySecret); + return Key.encrypt(s, mySecret); case 7: enc = _context5.sent; _context5.next = 10; @@ -4584,7 +5833,7 @@ function _addWebPushSubscription() { case 10: hash = _context5.sent; if (saveToGun) { - global$2().user().get('webPushSubscriptions').get(hash).put(enc); + global$1().user().get('webPushSubscriptions').get(hash).put(enc); } webPushSubscriptions[hash] = s; addWebPushSubscriptionsToChats(); @@ -4609,10 +5858,10 @@ function _getWebPushSubscriptions() { case 0: myKey = session.getKey(); _context7.next = 3; - return Gun.SEA.secret(myKey.epub, myKey); + return Key.secret(myKey.epub, myKey); case 3: mySecret = _context7.sent; - global$2().user().get('webPushSubscriptions').map().on( /*#__PURE__*/function () { + global$1().user().get('webPushSubscriptions').map( /*#__PURE__*/function () { var _ref3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee6(enc) { var s; return _regeneratorRuntime().wrap(function _callee6$(_context6) { @@ -4626,7 +5875,7 @@ function _getWebPushSubscriptions() { return _context6.abrupt("return"); case 2: _context6.next = 4; - return Gun.SEA.decrypt(enc, mySecret); + return Key.decrypt(enc, mySecret); case 4: s = _context6.sent; addWebPushSubscription(s, false); @@ -4652,7 +5901,7 @@ function _getWebPushSubscriptions() { } function getEpub(user) { return new Promise(function (resolve) { - global$2().user(user).get('epub').on( /*#__PURE__*/function () { + global$1().user(user).get('epub').on( /*#__PURE__*/function () { var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(epub, k, x, e) { return _regeneratorRuntime().wrap(function _callee$(_context) { while (1) { @@ -4686,7 +5935,7 @@ function _getNotificationText() { switch (_context8.prev = _context8.next) { case 0: _context8.next = 2; - return global$2().user(notification.from).get('profile').once(); + return global$1().user(notification.from).get('profile').once(); case 2: profile = _context8.sent; name = profile && profile.name || 'someone'; @@ -4705,15 +5954,15 @@ function _getNotificationText() { function subscribeToIrisNotifications(onClick) { var notificationsSeenTime; var notificationsShownTime; - global$2().user().get('notificationsSeenTime').on(function (v) { + global$1().user().get('notificationsSeenTime').on(function (v) { notificationsSeenTime = v; console.log(v); }); - global$2().user().get('notificationsShownTime').on(function (v) { + global$1().user().get('notificationsShownTime').on(function (v) { return notificationsShownTime = v; }); var setNotificationsShownTime = _.debounce(function () { - global$2().user().get('notificationsShownTime').put(new Date().toISOString()); + global$1().user().get('notificationsShownTime').put(new Date().toISOString()); }, 1000); var alreadyHave = new Set(); group().on("notifications/" + session.getPubKey(), /*#__PURE__*/function () { @@ -4736,11 +5985,11 @@ function subscribeToIrisNotifications(onClick) { case 6: epub = _context2.sent; _context2.next = 9; - return Gun.SEA.secret(epub, session.getKey()); + return Key.secret(epub, session.getKey()); case 9: secret = _context2.sent; _context2.next = 12; - return Gun.SEA.decrypt(encryptedNotification, secret); + return Key.decrypt(encryptedNotification, secret); case 12: notification = _context2.sent; if (!(!notification || typeof notification !== 'object')) { @@ -4790,7 +6039,7 @@ function subscribeToIrisNotifications(onClick) { function changeUnseenNotificationCount(change) { if (!change) { unseenNotificationCount = 0; - global$2().user().get('notificationsSeenTime').put(new Date().toISOString()); + global$1().user().get('notificationsSeenTime').put(new Date().toISOString()); } else { unseenNotificationCount += change; unseenNotificationCount = Math.max(unseenNotificationCount, 0); @@ -4822,14 +6071,14 @@ function _sendIrisNotification() { case 5: epub = _context9.sent; _context9.next = 8; - return Gun.SEA.secret(epub, session.getKey()); + return Key.secret(epub, session.getKey()); case 8: secret = _context9.sent; _context9.next = 11; - return Gun.SEA.encrypt(notification, secret); + return Key.encrypt(notification, secret); case 11: enc = _context9.sent; - global$2().user().get('notifications').get(recipient).put(enc); + global$1().user().get('notifications').get(recipient).put(enc); case 13: case "end": return _context9.stop(); @@ -4877,11 +6126,11 @@ function _sendWebPushNotification() { case 3: secret = _context10.sent; _context10.next = 6; - return Gun.SEA.encrypt(notification.title, secret); + return Key.encrypt(notification.title, secret); case 6: _context10.t0 = _context10.sent; _context10.next = 9; - return Gun.SEA.encrypt(notification.body, secret); + return Key.encrypt(notification.body, secret); case 9: _context10.t1 = _context10.sent; _context10.t2 = { @@ -4979,12 +6228,8 @@ var notifications = { removeSubscription: removeSubscription }; -var electron = util.isElectron ? /*#__PURE__*/new Gun({ - peers: ['http://localhost:8768/gun'], - file: 'State.electron', - multicast: false, - localStorage: false -}).get('state') : null; +// TODO config {peers: ['http://localhost:8768/gun'], file: 'State.electron', multicast:false, localStorage: false} +var electron = util.isElectron ? /*#__PURE__*/new Node('electron').get('state') : null; var key; var myName; @@ -5031,6 +6276,7 @@ var session = { } initCalled = true; var localStorageKey = localStorage.getItem('chatKeyPair'); + console.log('localStorageKey', localStorageKey); if (localStorageKey) { this.login(JSON.parse(localStorageKey)); } else if (options.autologin !== false) { @@ -5112,7 +6358,6 @@ var session = { this.updateNoFollowers(); } } - console.log('removeFollow', k, followDistance, follower); if (searchableItems[k] && searchableItems[k].followers.size === 0) { delete searchableItems[k]; local$1().get('contacts').get(k).put(false); @@ -5136,7 +6381,7 @@ var session = { } getExtendedFollowsCalled.set(k, currentDepth); this.addFollow(callback, k, currentDepth - 1); - publicState(k).get('follow').map().on(function (isFollowing, followedKey) { + publicState(k).get('follow').map(function (isFollowing, followedKey) { if (isFollowing) { _this2.addFollow(callback, followedKey, currentDepth, k); if (currentDepth < maxDepth) { @@ -5224,25 +6469,18 @@ var session = { * @param key */login: function login(k) { var _this4 = this; + console.log('login', k); var shouldRefresh = !!key; + console.log('shouldRefresh', shouldRefresh, 'key', key); key = k; localStorage.setItem('chatKeyPair', JSON.stringify(k)); publicState().auth(key); publicState().put({ epub: key.epub }); - publicState().get('likes').put({ - a: null - }); // gun bug? - publicState().get('msgs').put({ - a: null - }); // gun bug? - publicState().get('replies').put({ - a: null - }); // gun bug? notifications.subscribeToWebPush(); notifications.getWebPushSubscriptions(); - notifications.subscribeToIrisNotifications(); + //notifications.subscribeToIrisNotifications(); Channel.getMyChatLinks(undefined, function (chatLink) { local$1().get('chatLinks').get(chatLink.id).put(chatLink.url); latestChatLink = chatLink.url; @@ -5256,8 +6494,10 @@ var session = { myName = name; } }); + // a lot of this is iris-messenger stuff notifications.init(); local$1().get('loggedIn').put(true); + console.log('local().get(\'loggedIn\').put(true);', local$1()); local$1().get('settings').once().then(function (settings) { if (!settings) { local$1().get('settings').put(DEFAULT_SETTINGS.local); @@ -5266,7 +6506,7 @@ var session = { local$1().get('settings').get('autoplayWebtorrent').put(DEFAULT_SETTINGS.local.autoplayWebtorrent); } }); - publicState().get('block').map().on(function (isBlocked, user) { + publicState().get('block').map(function (isBlocked, user) { local$1().get('block').get(user).put(isBlocked); if (isBlocked) { delete searchableItems[user]; @@ -5299,7 +6539,7 @@ var session = { } var name = options.name || util.generateName(); console.log('loginAsNewUser name', name); - return Gun.SEA.pair().then(function (k) { + return Key.generate().then(function (k) { _this5.login(k); publicState().get('profile').put({ a: null @@ -5367,12 +6607,10 @@ var session = { case 16: _this6.clearIndexedDB(); localStorage.clear(); // TODO clear only iris data - localForage.clear().then(function () { - window.location.hash = ''; - window.location.href = '/'; - location.reload(); - }); - case 19: + window.location.hash = ''; + window.location.href = '/'; + location.reload(); + case 21: case "end": return _context.stop(); } @@ -5608,304 +6846,110 @@ var session = { if (chat.messageIds[msg.time + info.from]) return; chat.messageIds[msg.time + info.from] = true; if (info) { - msg = Object.assign(msg, info); - } - if (msg.invite) { - var chatLink = "https://iris.to/?channelId=" + msg.invite.group + "&inviter=" + chatId; - this.newChannel(msg.invite.group, chatLink); - return; - } - msg.selfAuthored = info.selfAuthored; - local$1().get('channels').get(chatId).get('msgs').get(msg.time + (msg.from && msg.from.slice(0, 10))).put(JSON.stringify(msg)); - msg.timeObj = new Date(msg.time); - if (!info.selfAuthored && msg.timeObj > chat.myLastSeenTime) { - if (window.location.hash !== "#/chat/" + chatId || document.visibilityState !== 'visible') { - notifications.changeChatUnseenCount(chatId, 1); - } else if (ourActivity === 'active') { - chat.setMyMsgsLastSeenTime(); - } - } - if (!info.selfAuthored && msg.time > chat.theirMsgsLastSeenTime) { - local$1().get('channels').get(chatId).get('theirMsgsLastSeenTime').put(msg.time); - } - if (!chat.latestTime || msg.time > chat.latestTime) { - local$1().get('channels').get(chatId).put({ - latestTime: msg.time, - latest: { - time: msg.time, - text: msg.text, - selfAuthored: info.selfAuthored - } - }); - } - // TODO: onclickNotification should do route(`/chat/${ pub}`); - notifications.notifyMsg(msg, info, chatId, onClickNotification); - }, - subscribeToMsgs: function subscribeToMsgs(pub) { - var _this9 = this; - var c = privateState(pub); - if (c.subscribed) { - return; - } - c.subscribed = true; - c.getMessages(function (msg, info) { - _this9.processMessage(pub, msg, info); - }); - }, - /** - * Known private channels with other users - */ - channelIds: /*#__PURE__*/new Set() -}; - -/** - * Content-addressed storage - */ -var staticState = { - /** - * Get a file identified by its hash - * @param hash - * @param callback - * @returns {Promise} - */get: function get(hash, callback) { - return new Promise(function (resolve, reject) { - if (!hash) { - reject('No hash provided'); - } - if (typeof hash !== 'string') { - reject('Hash must be a string'); - } - global$2().get('#').get(hash).on(function (v, _k, _x, e) { - if (v) { - e.off(); - callback && callback(v); - resolve(v); - } - }); - }); - }, - /** - * Store a file and return its hash - * @param value - * @returns {Promise} - */put: function put(value) { - return _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() { - var hash; - return _regeneratorRuntime().wrap(function _callee$(_context) { - while (1) { - switch (_context.prev = _context.next) { - case 0: - _context.next = 2; - return util.getHash(value); - case 2: - hash = _context.sent; - global$2().get('#').get(hash).put(value); - return _context.abrupt("return", hash); - case 5: - case "end": - return _context.stop(); - } - } - }, _callee); - }))(); - } -}; - -// eslint-disable-line no-unused-vars -var myKey; -var Key = /*#__PURE__*/function () { - function Key() {} - Key.getActiveKey = /*#__PURE__*/function () { - var _getActiveKey = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(datadir, keyfile, fs) { - var privKeyFile, f, newKey, str, _newKey; - return _regeneratorRuntime().wrap(function _callee$(_context) { - while (1) { - switch (_context.prev = _context.next) { - case 0: - if (datadir === void 0) { - datadir = "."; - } - if (keyfile === void 0) { - keyfile = "iris.key"; - } - if (!myKey) { - _context.next = 4; - break; - } - return _context.abrupt("return", myKey); - case 4: - if (!fs) { - _context.next = 21; - break; - } - privKeyFile = datadir + "/" + keyfile; - if (!fs.existsSync(privKeyFile)) { - _context.next = 11; - break; - } - f = fs.readFileSync(privKeyFile, "utf8"); - myKey = Key.fromString(f); - _context.next = 17; - break; - case 11: - _context.next = 13; - return Key.generate(); - case 13: - newKey = _context.sent; - myKey = myKey || newKey; // eslint-disable-line require-atomic-updates - fs.writeFileSync(privKeyFile, Key.toString(myKey)); - fs.chmodSync(privKeyFile, 400); - case 17: - if (myKey) { - _context.next = 19; - break; - } - throw new Error("loading default key failed - check " + datadir + "/" + keyfile); - case 19: - _context.next = 33; - break; - case 21: - str = window.localStorage.getItem("iris.myKey"); - if (!str) { - _context.next = 26; - break; - } - myKey = Key.fromString(str); - _context.next = 31; - break; - case 26: - _context.next = 28; - return Key.generate(); - case 28: - _newKey = _context.sent; - myKey = myKey || _newKey; // eslint-disable-line require-atomic-updates - window.localStorage.setItem("iris.myKey", Key.toString(myKey)); - case 31: - if (myKey) { - _context.next = 33; - break; - } - throw new Error("loading default key failed - check localStorage iris.myKey"); - case 33: - return _context.abrupt("return", myKey); - case 34: - case "end": - return _context.stop(); - } - } - }, _callee); - })); - function getActiveKey(_x, _x2, _x3) { - return _getActiveKey.apply(this, arguments); - } - return getActiveKey; - }(); - Key.getDefault = function getDefault(datadir, keyfile) { - if (datadir === void 0) { - datadir = "."; - } - if (keyfile === void 0) { - keyfile = "iris.key"; - } - return Key.getActiveKey(datadir, keyfile); - }; - Key.getActivePub = /*#__PURE__*/function () { - var _getActivePub = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(datadir, keyfile) { - var key; - return _regeneratorRuntime().wrap(function _callee2$(_context2) { - while (1) { - switch (_context2.prev = _context2.next) { - case 0: - if (datadir === void 0) { - datadir = "."; - } - if (keyfile === void 0) { - keyfile = "iris.key"; - } - _context2.next = 4; - return Key.getActiveKey(datadir, keyfile); - case 4: - key = _context2.sent; - return _context2.abrupt("return", key.pub); - case 6: - case "end": - return _context2.stop(); - } - } - }, _callee2); - })); - function getActivePub(_x4, _x5) { - return _getActivePub.apply(this, arguments); - } - return getActivePub; - }(); - Key.setActiveKey = function setActiveKey(key, save, datadir, keyfile, fs) { - if (save === void 0) { - save = true; + msg = Object.assign(msg, info); } - if (datadir === void 0) { - datadir = "."; + if (msg.invite) { + var chatLink = "https://iris.to/?channelId=" + msg.invite.group + "&inviter=" + chatId; + this.newChannel(msg.invite.group, chatLink); + return; } - if (keyfile === void 0) { - keyfile = "iris.key"; + msg.selfAuthored = info.selfAuthored; + local$1().get('channels').get(chatId).get('msgs').get(msg.time + (msg.from && msg.from.slice(0, 10))).put(JSON.stringify(msg)); + msg.timeObj = new Date(msg.time); + if (!info.selfAuthored && msg.timeObj > chat.myLastSeenTime) { + if (window.location.hash !== "#/chat/" + chatId || document.visibilityState !== 'visible') { + notifications.changeChatUnseenCount(chatId, 1); + } else if (ourActivity === 'active') { + chat.setMyMsgsLastSeenTime(); + } } - myKey = key; - if (!save) return; - if (util.isNode) { - var privKeyFile = datadir + "/" + keyfile; - fs.writeFileSync(privKeyFile, Key.toString(myKey)); - fs.chmodSync(privKeyFile, 400); - } else { - window.localStorage.setItem("iris.myKey", Key.toString(myKey)); + if (!info.selfAuthored && msg.time > chat.theirMsgsLastSeenTime) { + local$1().get('channels').get(chatId).get('theirMsgsLastSeenTime').put(msg.time); } - }; - Key.toString = function toString(key) { - return JSON.stringify(key); - }; - Key.getId = function getId(key) { - if (!(key && key.pub)) { - throw new Error("missing param"); + if (!chat.latestTime || msg.time > chat.latestTime) { + local$1().get('channels').get(chatId).put({ + latestTime: msg.time, + latest: { + time: msg.time, + text: msg.text, + selfAuthored: info.selfAuthored + } + }); } - return key.pub; // hack until GUN supports lookups by keyID - //return util.getHash(key.pub); - }; - Key.fromString = function fromString(str) { - return JSON.parse(str); - }; - Key.generate = function generate() { - return Gun.SEA.pair(); - }; - Key.sign = /*#__PURE__*/function () { - var _sign = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3(msg, pair) { - var sig; - return _regeneratorRuntime().wrap(function _callee3$(_context3) { + // TODO: onclickNotification should do route(`/chat/${ pub}`); + notifications.notifyMsg(msg, info, chatId, onClickNotification); + }, + subscribeToMsgs: function subscribeToMsgs(pub) { + var _this9 = this; + var c = privateState(pub); + if (c.subscribed) { + return; + } + c.subscribed = true; + c.getMessages(function (msg, info) { + _this9.processMessage(pub, msg, info); + }); + }, + /** + * Known private channels with other users + */ + channelIds: /*#__PURE__*/new Set() +}; + +/** + * Content-addressed storage + */ +var staticState = { + /** + * Get a file identified by its hash + * @param hash + * @param callback + * @returns {Promise} + */get: function get(hash, callback) { + return new Promise(function (resolve, reject) { + if (!hash) { + reject('No hash provided'); + } + if (typeof hash !== 'string') { + reject('Hash must be a string'); + } + global$1().get('#').get(hash).on(function (v, _k, _x, e) { + if (v) { + e.off(); + callback && callback(v); + resolve(v); + } + }); + }); + }, + /** + * Store a file and return its hash + * @param value + * @returns {Promise} + */put: function put(value) { + return _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() { + var hash; + return _regeneratorRuntime().wrap(function _callee$(_context) { while (1) { - switch (_context3.prev = _context3.next) { + switch (_context.prev = _context.next) { case 0: - _context3.next = 2; - return Gun.SEA.sign(msg, pair); + _context.next = 2; + return util.getHash(value); case 2: - sig = _context3.sent; - return _context3.abrupt("return", "a" + sig); - case 4: + hash = _context.sent; + global$1().get('#').get(hash).put(value); + return _context.abrupt("return", hash); + case 5: case "end": - return _context3.stop(); + return _context.stop(); } } - }, _callee3); - })); - function sign(_x6, _x7) { - return _sign.apply(this, arguments); - } - return sign; - }(); - Key.verify = function verify(msg, pubKey) { - return Gun.SEA.verify(msg.slice(1), pubKey); - }; - return Key; -}(); + }, _callee); + }))(); + } +}; -var errorMsg = "Invalid message:"; +var errorMsg = "Invalid message:"; var ValidationError = /*#__PURE__*/function (_Error) { _inheritsLoose(ValidationError, _Error); function ValidationError() { @@ -5928,23 +6972,6 @@ var ValidationError = /*#__PURE__*/function (_Error) { * Constructor: creates a message from the param obj.signedData that must contain at least the mandatory fields: author, type and time. * @param obj * - * @example - * https://github.com/irislib/iris-lib/blob/master/__tests__/SignedMessage.js - * - * Verification message: - * { - * signedData: { - * author: {name:'Alice', key:'ABCD1234'}, - * recipient: { - * name: 'Bob', - * email: ['bob@example.com', 'bob.saget@example.com'], - * bitcoin: '1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa' - * }, - * type: 'verification' - * }, - * signer: 'ABCD1234', - * signature: '1234ABCD' - * } */ var SignedMessage = /*#__PURE__*/function () { function SignedMessage(obj) { @@ -5959,89 +6986,7 @@ var SignedMessage = /*#__PURE__*/function () { } this._validate(); } - SignedMessage._getArray = function _getArray(authorOrRecipient) { - var arr = []; - var keys = Object.keys(authorOrRecipient); - for (var i = 0; i < keys.length; i++) { - var type = keys[i]; - var value = authorOrRecipient[keys[i]]; - if (typeof value === "string") { - arr.push(new Attribute(type, value)); - } else { - // array - for (var j = 0; j < value.length; j++) { - var elementValue = value[j]; - arr.push(new Attribute(type, elementValue)); - } - } - } - return arr; - }; - SignedMessage._getIterable = function _getIterable(authorOrRecipient) { - var _ref; - return _ref = {}, _ref[Symbol.iterator] = /*#__PURE__*/_regeneratorRuntime().mark(function _callee() { - var keys, i, type, value, j, elementValue; - return _regeneratorRuntime().wrap(function _callee$(_context) { - while (1) { - switch (_context.prev = _context.next) { - case 0: - keys = Object.keys(authorOrRecipient); - i = 0; - case 2: - if (!(i < keys.length)) { - _context.next = 21; - break; - } - type = keys[i]; - value = authorOrRecipient[keys[i]]; - if (!(typeof value === "string")) { - _context.next = 10; - break; - } - _context.next = 8; - return new Attribute(type, value); - case 8: - _context.next = 18; - break; - case 10: - j = 0; - case 11: - if (!(j < value.length)) { - _context.next = 18; - break; - } - elementValue = value[j]; - _context.next = 15; - return new Attribute(type, elementValue); - case 15: - j++; - _context.next = 11; - break; - case 18: - i++; - _context.next = 2; - break; - case 21: - case "end": - return _context.stop(); - } - } - }, _callee); - }), _ref; - }; var _proto = SignedMessage.prototype; - _proto.getAuthorIterable = function getAuthorIterable() { - return SignedMessage._getIterable(this.signedData.author); - }; - _proto.getRecipientIterable = function getRecipientIterable() { - return SignedMessage._getIterable(this.signedData.recipient); - }; - _proto.getAuthorArray = function getAuthorArray() { - return SignedMessage._getArray(this.signedData.author); - }; - _proto.getRecipientArray = function getRecipientArray() { - return this.signedData.recipient ? SignedMessage._getArray(this.signedData.recipient) : []; - }; _proto.getSignerKeyID = function getSignerKeyID() { return this.pubKey; // hack until gun supports keyID lookups //return util.getHash(this.pubKey); @@ -6131,68 +7076,34 @@ var SignedMessage = /*#__PURE__*/function () { if (!Date.parse(d.time || d.timestamp)) { throw new ValidationError(errorMsg + " Invalid time field"); } - if (d.type === "rating") { - if (isNaN(d.rating)) { - throw new ValidationError(errorMsg + " Invalid rating"); - } - if (isNaN(d.maxRating)) { - throw new ValidationError(errorMsg + " Invalid maxRating"); - } - if (isNaN(d.minRating)) { - throw new ValidationError(errorMsg + " Invalid minRating"); - } - if (d.rating > d.maxRating) { - throw new ValidationError(errorMsg + " Rating is above maxRating"); - } - if (d.rating < d.minRating) { - throw new ValidationError(errorMsg + " Rating is below minRating"); - } - if (typeof d.context !== "string" || !d.context.length) { - throw new ValidationError(errorMsg + " Rating messages must have a context field"); - } - } - if (d.type === "verification" || d.type === "unverification") { - if (d.recipient.length < 2) { - throw new ValidationError(errorMsg + " At least 2 recipient attributes are needed for a connection / disconnection. Got: " + d.recipient); - } - } return true; - }; - _proto.isPositive = function isPositive() { - return this.signedData.type === "rating" && this.signedData.rating > (this.signedData.maxRating + this.signedData.minRating) / 2; - }; - _proto.isNegative = function isNegative() { - return this.signedData.type === "rating" && this.signedData.rating < (this.signedData.maxRating + this.signedData.minRating) / 2; - }; - _proto.isNeutral = function isNeutral() { - return this.signedData.type === "rating" && this.signedData.rating === (this.signedData.maxRating + this.signedData.minRating) / 2; } /** - * @param {Object} key Gun.SEA keypair to sign the message with + * @param {Object} key keypair to sign the message with */; _proto.sign = /*#__PURE__*/ function () { - var _sign = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(key) { - return _regeneratorRuntime().wrap(function _callee2$(_context2) { + var _sign = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(key) { + return _regeneratorRuntime().wrap(function _callee$(_context) { while (1) { - switch (_context2.prev = _context2.next) { + switch (_context.prev = _context.next) { case 0: - _context2.next = 2; + _context.next = 2; return Key.sign(this.signedData, key); case 2: - this.sig = _context2.sent; + this.sig = _context.sent; this.pubKey = key.pub; - _context2.next = 6; + _context.next = 6; return this.getHash(); case 6: - return _context2.abrupt("return", true); + return _context.abrupt("return", true); case 7: case "end": - return _context2.stop(); + return _context.stop(); } } - }, _callee2, this); + }, _callee, this); })); function sign(_x) { return _sign.apply(this, arguments); @@ -6207,11 +7118,11 @@ var SignedMessage = /*#__PURE__*/function () { SignedMessage.create = /*#__PURE__*/ function () { - var _create = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3(signedData, signingKey) { + var _create = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(signedData, signingKey) { var m; - return _regeneratorRuntime().wrap(function _callee3$(_context3) { + return _regeneratorRuntime().wrap(function _callee2$(_context2) { while (1) { - switch (_context3.prev = _context3.next) { + switch (_context2.prev = _context2.next) { case 0: if (!signedData.author && signingKey) { signedData.author = { @@ -6223,36 +7134,25 @@ var SignedMessage = /*#__PURE__*/function () { signedData: signedData }); if (!signingKey) { - _context3.next = 6; + _context2.next = 6; break; } - _context3.next = 6; + _context2.next = 6; return m.sign(signingKey); case 6: - return _context3.abrupt("return", m); + return _context2.abrupt("return", m); case 7: case "end": - return _context3.stop(); + return _context2.stop(); } } - }, _callee3); + }, _callee2); })); function create(_x2, _x3) { return _create.apply(this, arguments); } return create; }(); - SignedMessage.createVerification = function createVerification(signedData, signingKey) { - signedData.type = "verification"; - return SignedMessage.create(signedData, signingKey); - }; - SignedMessage.createRating = function createRating(signedData, signingKey) { - signedData.type = "rating"; - signedData.context = signedData.context || "iris"; - signedData.maxRating = signedData.maxRating || 10; - signedData.minRating = signedData.minRating || -10; - return SignedMessage.create(signedData, signingKey); - }; _proto.getAuthor = function getAuthor(index) { for (var _iterator = _createForOfIteratorHelperLoose(this.getAuthorIterable()), _step; !(_step = _iterator()).done;) { var a = _step.value; @@ -6278,27 +7178,27 @@ var SignedMessage = /*#__PURE__*/function () { _proto.getHash = /*#__PURE__*/ function () { - var _getHash = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee4() { - return _regeneratorRuntime().wrap(function _callee4$(_context4) { + var _getHash = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3() { + return _regeneratorRuntime().wrap(function _callee3$(_context3) { while (1) { - switch (_context4.prev = _context4.next) { + switch (_context3.prev = _context3.next) { case 0: if (!(this.sig && !this.hash)) { - _context4.next = 4; + _context3.next = 4; break; } - _context4.next = 3; + _context3.next = 3; return util.getHash(this.sig); case 3: - this.hash = _context4.sent; + this.hash = _context3.sent; case 4: - return _context4.abrupt("return", this.hash); + return _context3.abrupt("return", this.hash); case 5: case "end": - return _context4.stop(); + return _context3.stop(); } } - }, _callee4, this); + }, _callee3, this); })); function getHash() { return _getHash.apply(this, arguments); @@ -6309,20 +7209,20 @@ var SignedMessage = /*#__PURE__*/function () { return this.getHash(); }; SignedMessage.fromSig = /*#__PURE__*/function () { - var _fromSig = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee5(obj) { + var _fromSig = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee4(obj) { var signedData, o; - return _regeneratorRuntime().wrap(function _callee5$(_context5) { + return _regeneratorRuntime().wrap(function _callee4$(_context4) { while (1) { - switch (_context5.prev = _context5.next) { + switch (_context4.prev = _context4.next) { case 0: if (obj.sig) { - _context5.next = 2; + _context4.next = 2; break; } throw new Error("Missing signature in object:", obj); case 2: if (obj.pubKey) { - _context5.next = 4; + _context4.next = 4; break; } throw new Error("Missing pubKey in object:"); @@ -6334,13 +7234,13 @@ var SignedMessage = /*#__PURE__*/function () { sig: obj.sig, pubKey: obj.pubKey }; - return _context5.abrupt("return", new SignedMessage(o)); + return _context4.abrupt("return", new SignedMessage(o)); case 7: case "end": - return _context5.stop(); + return _context4.stop(); } } - }, _callee5); + }, _callee4); })); function fromSig(_x4) { return _fromSig.apply(this, arguments); @@ -6352,60 +7252,60 @@ var SignedMessage = /*#__PURE__*/function () { _proto.verify = /*#__PURE__*/ function () { - var _verify = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee6() { - return _regeneratorRuntime().wrap(function _callee6$(_context6) { + var _verify = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee5() { + return _regeneratorRuntime().wrap(function _callee5$(_context5) { while (1) { - switch (_context6.prev = _context6.next) { + switch (_context5.prev = _context5.next) { case 0: if (this.pubKey) { - _context6.next = 2; + _context5.next = 2; break; } throw new ValidationError(errorMsg + " SignedMessage has no .pubKey"); case 2: if (this.sig) { - _context6.next = 4; + _context5.next = 4; break; } throw new ValidationError(errorMsg + " SignedMessage has no .sig"); case 4: - _context6.next = 6; + _context5.next = 6; return Key.verify(this.sig, this.pubKey); case 6: - this.signedData = _context6.sent; + this.signedData = _context5.sent; if (this.signedData) { - _context6.next = 9; + _context5.next = 9; break; } throw new ValidationError(errorMsg + " Invalid signature"); case 9: if (!this.hash) { - _context6.next = 18; + _context5.next = 18; break; } - _context6.t0 = this.hash; - _context6.next = 13; + _context5.t0 = this.hash; + _context5.next = 13; return util.getHash(this.sig); case 13: - _context6.t1 = _context6.sent; - if (!(_context6.t0 !== _context6.t1)) { - _context6.next = 16; + _context5.t1 = _context5.sent; + if (!(_context5.t0 !== _context5.t1)) { + _context5.next = 16; break; } throw new ValidationError(errorMsg + " Invalid message hash"); case 16: - _context6.next = 19; + _context5.next = 19; break; case 18: this.getHash(); case 19: - return _context6.abrupt("return", true); + return _context5.abrupt("return", true); case 20: case "end": - return _context6.stop(); + return _context5.stop(); } } - }, _callee6, this); + }, _callee5, this); })); function verify() { return _verify.apply(this, arguments); @@ -6429,18 +7329,18 @@ var SignedMessage = /*#__PURE__*/function () { SignedMessage.deserialize = /*#__PURE__*/ function () { - var _deserialize = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee7(s) { - return _regeneratorRuntime().wrap(function _callee7$(_context7) { + var _deserialize = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee6(s) { + return _regeneratorRuntime().wrap(function _callee6$(_context6) { while (1) { - switch (_context7.prev = _context7.next) { + switch (_context6.prev = _context6.next) { case 0: - return _context7.abrupt("return", SignedMessage.fromSig(s)); + return _context6.abrupt("return", SignedMessage.fromSig(s)); case 1: case "end": - return _context7.stop(); + return _context6.stop(); } } - }, _callee7); + }, _callee6); })); function deserialize(_x5) { return _deserialize.apply(this, arguments); @@ -6448,58 +7348,31 @@ var SignedMessage = /*#__PURE__*/function () { return deserialize; }(); SignedMessage.fromString = /*#__PURE__*/function () { - var _fromString = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee8(s) { - return _regeneratorRuntime().wrap(function _callee8$(_context8) { + var _fromString = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee7(s) { + return _regeneratorRuntime().wrap(function _callee7$(_context7) { while (1) { - switch (_context8.prev = _context8.next) { + switch (_context7.prev = _context7.next) { case 0: - return _context8.abrupt("return", SignedMessage.fromSig(JSON.parse(s))); + return _context7.abrupt("return", SignedMessage.fromSig(JSON.parse(s))); case 1: case "end": - return _context8.stop(); + return _context7.stop(); } } - }, _callee8); + }, _callee7); })); function fromString(_x6) { return _fromString.apply(this, arguments); } return fromString; }(); - SignedMessage.setReaction = /*#__PURE__*/function () { - var _setReaction = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee9(gun, msg, reaction) { - var hash; - return _regeneratorRuntime().wrap(function _callee9$(_context9) { - while (1) { - switch (_context9.prev = _context9.next) { - case 0: - _context9.next = 2; - return msg.getHash(); - case 2: - hash = _context9.sent; - gun.get("reactions").get(hash).put(reaction); - gun.get("reactions").get(hash).put(reaction); - gun.get("messagesByHash").get(hash).get("reactions").get(this.rootContact.value).put(reaction); - gun.get("messagesByHash").get(hash).get("reactions").get(this.rootContact.value).put(reaction); - case 7: - case "end": - return _context9.stop(); - } - } - }, _callee9, this); - })); - function setReaction(_x7, _x8, _x9) { - return _setReaction.apply(this, arguments); - } - return setReaction; - }(); return SignedMessage; }(); /*eslint no-useless-escape: "off", camelcase: "off" */ var index = { local: local$1, - global: global$2, + global: global$1, group: group, "public": publicState, "private": privateState, @@ -6509,11 +7382,10 @@ var index = { session: session, util: util, notifications: notifications, - SEA: Gun.SEA, - Gun: Gun, SignedMessage: SignedMessage, Channel: Channel, - Node: Node + Node: Node, + Key: Key }; export default index; diff --git a/dist/iris.esm.js.map b/dist/iris.esm.js.map index 8e1f538..f3d18d8 100644 --- a/dist/iris.esm.js.map +++ b/dist/iris.esm.js.map @@ -1 +1 @@ -{"version":3,"file":"iris.esm.js","sources":["../src/lodash.ts","../src/util.ts","../src/peers.ts","../src/global.ts","../src/Attribute.ts","../src/public.ts","../src/Channel.ts","../src/private.ts","../src/Node.ts","../src/local.ts","../src/blockedUsers.ts","../src/group.ts","../src/notifications.ts","../src/electron.ts","../src/session.ts","../src/static.ts","../src/Key.ts","../src/SignedMessage.ts","../src/index.ts"],"sourcesContent":["// @ts-nocheck\nexport default {\n throttle: (func: Function, limit: number) => {\n let inThrottle: boolean;\n return function() {\n const args = arguments;\n const context = this;\n if (!inThrottle) {\n func.apply(context, args);\n inThrottle = true;\n setTimeout(() => inThrottle = false, limit);\n }\n };\n },\n debounce: (func: Function, limit: number) => {\n let inDebounce: boolean;\n return function() {\n const args = arguments;\n const context = this;\n clearTimeout(inDebounce);\n inDebounce = setTimeout(() => func.apply(context, args), limit);\n };\n },\n sample: (arr: any[]) => arr[Math.floor(Math.random() * arr.length)],\n sampleSize: (arr: any[], size: number) => {\n const shuffled = arr.slice(0);\n let i = arr.length;\n let min = i - size;\n let temp;\n let index;\n while (i-- > min) {\n index = Math.floor((i + 1) * Math.random());\n temp = shuffled[index];\n shuffled[index] = shuffled[i];\n shuffled[i] = temp;\n }\n return shuffled.slice(min);\n },\n defer: (func: Function) => setTimeout(func, 0),\n once: (func: Function) => {\n let called = false;\n return function() {\n if (called) {\n return;\n }\n called = true;\n func.apply(this, arguments);\n };\n },\n omit: (obj: any, keys: string[]) => {\n const newObj = {};\n Object.keys(obj).forEach(key => {\n if (!keys.includes(key)) {\n newObj[key] = obj[key];\n }\n });\n return newObj;\n },\n defaults: (obj: any, defaults: any) => {\n Object.keys(defaults).forEach(key => {\n if (obj[key] === undefined) {\n obj[key] = defaults[key];\n }\n });\n return obj;\n },\n pickBy: (obj: any, predicate: Function) => {\n const newObj = {};\n Object.keys(obj).forEach(key => {\n if (predicate(obj[key])) {\n newObj[key] = obj[key];\n }\n });\n return newObj;\n }\n}","// @ts-nocheck\n/* eslint no-useless-escape: \"off\", camelcase: \"off\" */\n\nimport Gun from 'gun'; // eslint-disable-line no-unused-vars\nimport 'gun/sea';\nimport _ from './lodash';\n\n// eslint-disable-line no-unused-vars\n\nlet isNode = false;\ntry {\n isNode = Object.prototype.toString.call(global.process) === `[object process]`;\n} catch (e) { null; }\n\nconst userAgent = !isNode && navigator && navigator.userAgent && navigator.userAgent.toLowerCase();\nconst isElectron = (userAgent && userAgent.indexOf(' electron/') > -1);\n\nconst isMobile = !isNode && (function() {\n if (isElectron) { return false; }\n let check = false;\n (function(a) {if (/(android|bb\\d+|meego).+mobile|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\\-(n|u)|c55\\/|capi|ccwa|cdm\\-|cell|chtm|cldc|cmd\\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\\-s|devi|dica|dmob|do(c|p)o|ds(12|\\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\\-|_)|g1 u|g560|gene|gf\\-5|g\\-mo|go(\\.w|od)|gr(ad|un)|haie|hcit|hd\\-(m|p|t)|hei\\-|hi(pt|ta)|hp( i|ip)|hs\\-c|ht(c(\\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\\-(20|go|ma)|i230|iac( |\\-|\\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\\/)|klon|kpt |kwc\\-|kyo(c|k)|le(no|xi)|lg( g|\\/(k|l|u)|50|54|\\-[a-w])|libw|lynx|m1\\-w|m3ga|m50\\/|ma(te|ui|xo)|mc(01|21|ca)|m\\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\\-2|po(ck|rt|se)|prox|psio|pt\\-g|qa\\-a|qc(07|12|21|32|60|\\-[2-7]|i\\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\\-|oo|p\\-)|sdk\\/|se(c(\\-|0|1)|47|mc|nd|ri)|sgh\\-|shar|sie(\\-|m)|sk\\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\\-|v\\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\\-|tdg\\-|tel(i|m)|tim\\-|t\\-mo|to(pl|sh)|ts(70|m\\-|m3|m5)|tx\\-9|up(\\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\\-|your|zeto|zte\\-/i.test(a.substr(0, 4))) check = true;})(navigator.userAgent || navigator.vendor || '');\n return check;\n})();\n\nfunction gunAsAnotherUser(gun: any, key: any, f: Function) { // Hacky way to use multiple users with gun\n const gun2 = new Gun({radisk: false, peers: Object.keys(gun._.opt.peers)}); // TODO: copy other options too\n const user = gun2.user();\n user.auth(key);\n setTimeout(() => {\n // @ts-ignore\n const peers = Object.values(gun2.back('opt.peers'));\n peers.forEach(peer => {\n // @ts-ignore\n gun2.on('bye', peer);\n });\n }, 20000);\n return f(user);\n}\n\nfunction gunOnceDefined(node: any) {\n return new Promise(resolve => {\n node.on((val: any, _k: any, _a: any, eve: any) => {\n if (val !== undefined) {\n eve.off();\n resolve(val);\n }\n });\n });\n}\n\nconst animals = [\n 'canidae',\n 'felidae',\n 'cat',\n 'cattle',\n 'dog',\n 'donkey',\n 'goat',\n 'horse',\n 'pig',\n 'rabbit',\n 'aardvark',\n 'aardwolf',\n 'albatross',\n 'alligator',\n 'alpaca',\n 'amphibian',\n 'anaconda',\n 'angelfish',\n 'anglerfish',\n 'ant',\n 'anteater',\n 'antelope',\n 'antlion',\n 'ape',\n 'aphid',\n 'armadillo',\n 'asp',\n 'baboon',\n 'badger',\n 'bandicoot',\n 'barnacle',\n 'barracuda',\n 'basilisk',\n 'bass',\n 'bat',\n 'bear',\n 'beaver',\n 'bedbug',\n 'bee',\n 'beetle',\n 'bird',\n 'bison',\n 'blackbird',\n 'boa',\n 'boar',\n 'bobcat',\n 'bobolink',\n 'bonobo',\n 'booby',\n 'bovid',\n 'bug',\n 'butterfly',\n 'buzzard',\n 'camel',\n 'canid',\n 'capybara',\n 'cardinal',\n 'caribou',\n 'carp',\n 'cat',\n 'catshark',\n 'caterpillar',\n 'catfish',\n 'cattle',\n 'centipede',\n 'cephalopod',\n 'chameleon',\n 'cheetah',\n 'chickadee',\n 'chicken',\n 'chimpanzee',\n 'chinchilla',\n 'chipmunk',\n 'clam',\n 'clownfish',\n 'cobra',\n 'cockroach',\n 'cod',\n 'condor',\n 'constrictor',\n 'coral',\n 'cougar',\n 'cow',\n 'coyote',\n 'crab',\n 'crane',\n 'crawdad',\n 'crayfish',\n 'cricket',\n 'crocodile',\n 'crow',\n 'cuckoo',\n 'cicada',\n 'damselfly',\n 'deer',\n 'dingo',\n 'dinosaur',\n 'dog',\n 'dolphin',\n 'donkey',\n 'dormouse',\n 'dove',\n 'dragonfly',\n 'dragon',\n 'duck',\n 'eagle',\n 'earthworm',\n 'earwig',\n 'echidna',\n 'eel',\n 'egret',\n 'elephant',\n 'elk',\n 'emu',\n 'ermine',\n 'falcon',\n 'ferret',\n 'finch',\n 'firefly',\n 'fish',\n 'flamingo',\n 'flea',\n 'fly',\n 'flyingfish',\n 'fowl',\n 'fox',\n 'frog',\n 'gamefowl',\n 'galliform',\n 'gazelle',\n 'gecko',\n 'gerbil',\n 'gibbon',\n 'giraffe',\n 'goat',\n 'goldfish',\n 'goose',\n 'gopher',\n 'gorilla',\n 'grasshopper',\n 'grouse',\n 'guan',\n 'guanaco',\n 'guineafowl',\n 'gull',\n 'guppy',\n 'haddock',\n 'halibut',\n 'hamster',\n 'hare',\n 'harrier',\n 'hawk',\n 'hedgehog',\n 'heron',\n 'herring',\n 'hippopotamus',\n 'hookworm',\n 'hornet',\n 'horse',\n 'hoverfly',\n 'hummingbird',\n 'hyena',\n 'iguana',\n 'impala',\n 'jackal',\n 'jaguar',\n 'jay',\n 'jellyfish',\n 'junglefowl',\n 'kangaroo',\n 'kingfisher',\n 'kite',\n 'kiwi',\n 'koala',\n 'koi',\n 'krill',\n 'ladybug',\n 'lamprey',\n 'landfowl',\n 'lark',\n 'leech',\n 'lemming',\n 'lemur',\n 'leopard',\n 'leopon',\n 'limpet',\n 'lion',\n 'lizard',\n 'llama',\n 'lobster',\n 'locust',\n 'loon',\n 'louse',\n 'lungfish',\n 'lynx',\n 'macaw',\n 'mackerel',\n 'magpie',\n 'mammal',\n 'manatee',\n 'mandrill',\n 'marlin',\n 'marmoset',\n 'marmot',\n 'marsupial',\n 'marten',\n 'mastodon',\n 'meadowlark',\n 'meerkat',\n 'mink',\n 'minnow',\n 'mite',\n 'mockingbird',\n 'mole',\n 'mollusk',\n 'mongoose',\n 'monkey',\n 'moose',\n 'mosquito',\n 'moth',\n 'mouse',\n 'mule',\n 'muskox',\n 'narwhal',\n 'newt',\n 'nightingale',\n 'ocelot',\n 'octopus',\n 'opossum',\n 'orangutan',\n 'orca',\n 'ostrich',\n 'otter',\n 'owl',\n 'ox',\n 'panda',\n 'panther',\n 'parakeet',\n 'parrot',\n 'parrotfish',\n 'partridge',\n 'peacock',\n 'peafowl',\n 'pelican',\n 'penguin',\n 'perch',\n 'pheasant',\n 'pig',\n 'pigeon',\n 'pike',\n 'pinniped',\n 'piranha',\n 'planarian',\n 'platypus',\n 'pony',\n 'porcupine',\n 'porpoise',\n 'possum',\n 'prawn',\n 'primate',\n 'ptarmigan',\n 'puffin',\n 'puma',\n 'python',\n 'quail',\n 'quelea',\n 'quokka',\n 'rabbit',\n 'raccoon',\n 'rat',\n 'rattlesnake',\n 'raven',\n 'reindeer',\n 'reptile',\n 'rhinoceros',\n 'roadrunner',\n 'rodent',\n 'rook',\n 'rooster',\n 'roundworm',\n 'sailfish',\n 'salamander',\n 'salmon',\n 'sawfish',\n 'scallop',\n 'scorpion',\n 'seahorse',\n 'shark',\n 'sheep',\n 'shrew',\n 'shrimp',\n 'silkworm',\n 'silverfish',\n 'skink',\n 'skunk',\n 'sloth',\n 'slug',\n 'smelt',\n 'snail',\n 'snake',\n 'snipe',\n 'sole',\n 'sparrow',\n 'spider',\n 'spoonbill',\n 'squid',\n 'squirrel',\n 'starfish',\n 'stingray',\n 'stoat',\n 'stork',\n 'sturgeon',\n 'swallow',\n 'swan',\n 'swift',\n 'swordfish',\n 'swordtail',\n 'tahr',\n 'takin',\n 'tapir',\n 'tarantula',\n 'tarsier',\n 'termite',\n 'tern',\n 'thrush',\n 'tick',\n 'tiger',\n 'tiglon',\n 'toad',\n 'tortoise',\n 'toucan',\n 'trout',\n 'tuna',\n 'turkey',\n 'turtle',\n 'tyrannosaurus',\n 'urial',\n 'vicuna',\n 'viper',\n 'vole',\n 'vulture',\n 'wallaby',\n 'walrus',\n 'wasp',\n 'warbler',\n 'weasel',\n 'whale',\n 'whippet',\n 'whitefish',\n 'wildcat',\n 'wildebeest',\n 'wildfowl',\n 'wolf',\n 'wolverine',\n 'wombat',\n 'woodpecker',\n 'worm',\n 'wren',\n 'xerinae',\n 'yak',\n 'zebra',\n 'alpaca',\n 'cat',\n 'cattle',\n 'chicken',\n 'dog',\n 'donkey',\n 'ferret',\n 'gayal',\n 'goldfish',\n 'guppy',\n 'horse',\n 'koi',\n 'llama',\n 'sheep',\n 'yak',\n 'unicorn',\n];\n\nconst adjectives = [\n 'average',\n 'big',\n 'colossal',\n 'fat',\n 'giant',\n 'gigantic',\n 'great',\n 'huge',\n 'immense',\n 'large',\n 'little',\n 'long',\n 'mammoth',\n 'massive',\n 'miniature',\n 'petite',\n 'puny',\n 'short',\n 'small',\n 'tall',\n 'tiny',\n 'boiling',\n 'breezy',\n 'broken',\n 'bumpy',\n 'chilly',\n 'cold',\n 'cool',\n 'creepy',\n 'crooked',\n 'cuddly',\n 'curly',\n 'damaged',\n 'damp',\n 'dirty',\n 'dry',\n 'dusty',\n 'filthy',\n 'flaky',\n 'fluffy',\n 'wet',\n 'broad',\n 'chubby',\n 'crooked',\n 'curved',\n 'deep',\n 'flat',\n 'high',\n 'hollow',\n 'low',\n 'narrow',\n 'round',\n 'shallow',\n 'skinny',\n 'square',\n 'steep',\n 'straight',\n 'wide',\n 'ancient',\n 'brief',\n 'early',\n 'fast',\n 'late',\n 'long',\n 'modern',\n 'old',\n 'quick',\n 'rapid',\n 'short',\n 'slow',\n 'swift',\n 'young',\n 'abundant',\n 'empty',\n 'few',\n 'heavy',\n 'light',\n 'many',\n 'numerous',\n 'Sound',\n 'cooing',\n 'deafening',\n 'faint',\n 'harsh',\n 'hissing',\n 'hushed',\n 'husky',\n 'loud',\n 'melodic',\n 'moaning',\n 'mute',\n 'noisy',\n 'purring',\n 'quiet',\n 'raspy',\n 'resonant',\n 'screeching',\n 'shrill',\n 'silent',\n 'soft',\n 'squealing',\n 'thundering',\n 'voiceless',\n 'whispering',\n 'bitter',\n 'delicious',\n 'fresh',\n 'juicy',\n 'ripe',\n 'rotten',\n 'salty',\n 'sour',\n 'spicy',\n 'stale',\n 'sticky',\n 'strong',\n 'sweet',\n 'tasteless',\n 'tasty',\n 'thirsty',\n 'fluttering',\n 'fuzzy',\n 'greasy',\n 'grubby',\n 'hard',\n 'hot',\n 'icy',\n 'loose',\n 'melted',\n 'plastic',\n 'prickly',\n 'rainy',\n 'rough',\n 'scattered',\n 'shaggy',\n 'shaky',\n 'sharp',\n 'shivering',\n 'silky',\n 'slimy',\n 'slippery',\n 'smooth',\n 'soft',\n 'solid',\n 'steady',\n 'sticky',\n 'tender',\n 'tight',\n 'uneven',\n 'weak',\n 'wet',\n 'wooden',\n 'afraid',\n 'angry',\n 'annoyed',\n 'anxious',\n 'arrogant',\n 'ashamed',\n 'awful',\n 'bad',\n 'bewildered',\n 'bored',\n 'combative',\n 'condemned',\n 'confused',\n 'creepy',\n 'cruel',\n 'dangerous',\n 'defeated',\n 'defiant',\n 'depressed',\n 'disgusted',\n 'disturbed',\n 'eerie',\n 'embarrassed',\n 'envious',\n 'evil',\n 'fierce',\n 'foolish',\n 'frantic',\n 'frightened',\n 'grieving',\n 'helpless',\n 'homeless',\n 'hungry',\n 'hurt',\n 'ill',\n 'jealous',\n 'lonely',\n 'mysterious',\n 'naughty',\n 'nervous',\n 'obnoxious',\n 'outrageous',\n 'panicky',\n 'repulsive',\n 'scary',\n 'scornful',\n 'selfish',\n 'sore',\n 'tense',\n 'terrible',\n 'thoughtless',\n 'tired',\n 'troubled',\n 'upset',\n 'uptight',\n 'weary',\n 'wicked',\n 'worried',\n 'agreeable',\n 'amused',\n 'brave',\n 'calm',\n 'charming',\n 'cheerful',\n 'comfortable',\n 'cooperative',\n 'courageous',\n 'delightful',\n 'determined',\n 'eager',\n 'elated',\n 'enchanting',\n 'encouraging',\n 'energetic',\n 'enthusiastic',\n 'excited',\n 'exuberant',\n 'fair',\n 'faithful',\n 'fantastic',\n 'fine',\n 'friendly',\n 'funny',\n 'gentle',\n 'glorious',\n 'good',\n 'happy',\n 'healthy',\n 'helpful',\n 'hilarious',\n 'jolly',\n 'joyous',\n 'kind',\n 'lively',\n 'lovely',\n 'lucky',\n 'obedient',\n 'perfect',\n 'pleasant',\n 'proud',\n 'relieved',\n 'silly',\n 'smiling',\n 'splendid',\n 'successful',\n 'thoughtful',\n 'victorious',\n 'vivacious',\n 'witty',\n 'wonderful',\n 'zealous',\n 'zany',\n 'other',\n 'good',\n 'new',\n 'old',\n 'great',\n 'high',\n 'small',\n 'different',\n 'large',\n 'local',\n 'social',\n 'important',\n 'long',\n 'young',\n 'national',\n 'british',\n 'right',\n 'early',\n 'possible',\n 'big',\n 'little',\n 'political',\n 'able',\n 'late',\n 'general',\n 'full',\n 'far',\n 'low',\n 'public',\n 'available',\n 'bad',\n 'main',\n 'sure',\n 'clear',\n 'major',\n 'economic',\n 'only',\n 'likely',\n 'real',\n 'black',\n 'particular',\n 'international',\n 'special',\n 'difficult',\n 'certain',\n 'open',\n 'whole',\n 'white',\n 'free',\n 'short',\n 'easy',\n 'strong',\n 'european',\n 'central',\n 'similar',\n 'human',\n 'common',\n 'necessary',\n 'single',\n 'personal',\n 'hard',\n 'private',\n 'poor',\n 'financial',\n 'wide',\n 'foreign',\n 'simple',\n 'recent',\n 'concerned',\n 'american',\n 'various',\n 'close',\n 'fine',\n 'english',\n 'wrong',\n 'present',\n 'royal',\n 'natural',\n 'individual',\n 'nice',\n 'french',\n 'nihilist',\n 'solipsist',\n 'materialist',\n 'surrealist',\n 'heroic',\n 'awesome',\n 'hedonist',\n 'absurd',\n 'current',\n 'modern',\n 'labour',\n 'legal',\n 'happy',\n 'final',\n 'red',\n 'normal',\n 'serious',\n 'previous',\n 'total',\n 'prime',\n 'significant',\n 'industrial',\n 'sorry',\n 'dead',\n 'specific',\n 'appropriate',\n 'top',\n 'soviet',\n 'basic',\n 'military',\n 'original',\n 'successful',\n 'aware',\n 'hon',\n 'popular',\n 'heavy',\n 'professional',\n 'direct',\n 'dark',\n 'cold',\n 'ready',\n 'green',\n 'useful',\n 'effective',\n 'western',\n 'traditional',\n 'scottish',\n 'german',\n 'independent',\n 'deep',\n 'interesting',\n 'considerable',\n 'involved',\n 'physical',\n 'hot',\n 'existing',\n 'responsible',\n 'complete',\n 'medical',\n 'blue',\n 'extra',\n 'past',\n 'male',\n 'interested',\n 'fair',\n 'essential',\n 'beautiful',\n 'civil',\n 'primary',\n 'obvious',\n 'future',\n 'environmental',\n 'positive',\n 'senior',\n 'nuclear',\n 'annual',\n 'relevant',\n 'huge',\n 'rich',\n 'commercial',\n 'safe',\n 'regional',\n 'practical',\n 'official',\n 'separate',\n 'key',\n 'chief',\n 'regular',\n 'due',\n 'additional',\n 'active',\n 'powerful',\n 'complex',\n 'standard',\n 'impossible',\n 'light',\n 'warm',\n 'middle',\n 'fresh',\n 'sexual',\n 'front',\n 'domestic',\n 'actual',\n 'united',\n 'technical',\n 'ordinary',\n 'cheap',\n 'strange',\n 'internal',\n 'excellent',\n 'quiet',\n 'soft',\n 'potential',\n 'northern',\n 'religious',\n 'quick',\n 'very',\n 'famous',\n 'cultural',\n 'proper',\n 'broad',\n 'joint',\n 'formal',\n 'limited',\n 'conservative',\n 'lovely',\n 'usual',\n 'ltd',\n 'unable',\n 'rural',\n 'initial',\n 'substantial',\n 'bright',\n 'average',\n 'leading',\n 'reasonable',\n 'immediate',\n 'suitable',\n 'equal',\n 'detailed',\n 'working',\n 'overall',\n 'female',\n 'afraid',\n 'democratic',\n 'growing',\n 'sufficient',\n 'scientific',\n 'eastern',\n 'correct',\n 'inc',\n 'irish',\n 'expensive',\n 'educational',\n 'mental',\n 'dangerous',\n 'critical',\n 'increased',\n 'familiar',\n 'unlikely',\n 'double',\n 'perfect',\n 'slow',\n 'tiny',\n 'dry',\n 'historical',\n 'thin',\n 'daily',\n 'southern',\n 'increasing',\n 'wild',\n 'alone',\n 'urban',\n 'empty',\n 'married',\n 'narrow',\n 'liberal',\n 'supposed',\n 'upper',\n 'apparent',\n 'tall',\n 'busy',\n 'bloody',\n 'prepared',\n 'russian',\n 'moral',\n 'careful',\n 'clean',\n 'attractive',\n 'japanese',\n 'vital',\n 'thick',\n 'alternative',\n 'fast',\n 'ancient',\n 'elderly',\n 'rare',\n 'external',\n 'capable',\n 'brief',\n 'wonderful',\n 'grand',\n 'typical',\n 'entire',\n 'grey',\n 'constant',\n 'vast',\n 'surprised',\n 'ideal',\n 'terrible',\n 'academic',\n 'funny',\n 'minor',\n 'pleased',\n 'severe',\n 'ill',\n 'corporate',\n 'negative',\n 'permanent',\n 'weak',\n 'brown',\n 'fundamental',\n 'odd',\n 'crucial',\n 'inner',\n 'used',\n 'criminal',\n 'contemporary',\n 'sharp',\n 'sick',\n 'near',\n 'roman',\n 'massive',\n 'unique',\n 'secondary',\n 'parliamentary',\n 'african',\n 'unknown',\n 'subsequent',\n 'angry',\n 'alive',\n 'guilty',\n 'lucky',\n 'enormous',\n 'well',\n 'yellow',\n 'unusual',\n 'net',\n 'tough',\n 'dear',\n 'extensive',\n 'glad',\n 'remaining',\n 'agricultural',\n 'alright',\n 'healthy',\n 'italian',\n 'principal',\n 'tired',\n 'efficient',\n 'comfortable',\n 'chinese',\n 'relative',\n 'friendly',\n 'conventional',\n 'willing',\n 'sudden',\n 'proposed',\n 'voluntary',\n 'slight',\n 'valuable',\n 'dramatic',\n 'golden',\n 'temporary',\n 'federal',\n 'keen',\n 'flat',\n 'silent',\n 'indian',\n 'worried',\n 'pale',\n 'statutory',\n 'welsh',\n 'dependent',\n 'firm',\n 'wet',\n 'competitive',\n 'armed',\n 'radical',\n 'outside',\n 'acceptable',\n 'sensitive',\n 'living',\n 'pure',\n 'global',\n 'emotional',\n 'sad',\n 'secret',\n 'rapid',\n 'adequate',\n 'fixed',\n 'sweet',\n 'administrative',\n 'wooden',\n 'remarkable',\n 'comprehensive',\n 'surprising',\n 'solid',\n 'rough',\n 'mere',\n 'mass',\n 'brilliant',\n 'maximum',\n 'absolute',\n 'electronic',\n 'visual',\n 'electric',\n 'cool',\n 'spanish',\n 'literary',\n 'continuing',\n 'supreme',\n 'chemical',\n 'genuine',\n 'exciting',\n 'written',\n 'advanced',\n 'extreme',\n 'classical',\n 'fit',\n 'favourite',\n 'widespread',\n 'confident',\n 'straight',\n 'proud',\n 'numerous',\n 'opposite',\n 'distinct',\n 'mad',\n 'helpful',\n 'given',\n 'disabled',\n 'consistent',\n 'anxious',\n 'nervous',\n 'awful',\n 'stable',\n 'constitutional',\n 'satisfied',\n 'conscious',\n 'developing',\n 'strategic',\n 'holy',\n 'smooth',\n 'dominant',\n 'remote',\n 'theoretical',\n 'outstanding',\n 'pink',\n 'pretty',\n 'clinical',\n 'minimum',\n 'honest',\n 'impressive',\n 'related',\n 'residential',\n 'extraordinary',\n 'plain',\n 'visible',\n 'accurate',\n 'distant',\n 'still',\n 'greek',\n 'complicated',\n 'musical',\n 'precise',\n 'gentle',\n 'broken',\n 'live',\n 'silly',\n 'fat',\n 'tight',\n 'monetary',\n 'round',\n 'psychological',\n 'violent',\n 'unemployed',\n 'inevitable',\n 'junior',\n 'sensible',\n 'grateful',\n 'pleasant',\n 'dirty',\n 'structural',\n 'welcome',\n 'deaf',\n 'above',\n 'continuous',\n 'blind',\n 'overseas',\n 'mean',\n 'entitled',\n 'delighted',\n 'loose',\n 'occasional',\n 'evident',\n 'desperate',\n 'fellow',\n 'universal',\n 'square',\n 'steady',\n 'classic',\n 'equivalent',\n 'intellectual',\n 'victorian',\n 'level',\n 'ultimate',\n 'creative',\n 'lost',\n 'medieval',\n 'clever',\n 'linguistic',\n 'convinced',\n 'judicial',\n 'raw',\n 'sophisticated',\n 'asleep',\n 'vulnerable',\n 'illegal',\n 'outer',\n 'revolutionary',\n 'bitter',\n 'changing',\n 'australian',\n 'native',\n 'imperial',\n 'strict',\n 'wise',\n 'informal',\n 'flexible',\n 'collective',\n 'frequent',\n 'experimental',\n 'spiritual',\n 'intense',\n 'rational',\n 'generous',\n 'inadequate',\n 'prominent',\n 'logical',\n 'bare',\n 'historic',\n 'modest',\n 'dutch',\n 'acute',\n 'electrical',\n 'valid',\n 'weekly',\n 'gross',\n 'automatic',\n 'loud',\n 'reliable',\n 'mutual',\n 'liable',\n 'multiple',\n 'ruling',\n 'curious',\n 'sole',\n 'managing',\n 'pregnant',\n 'latin',\n 'nearby',\n 'exact',\n 'underlying',\n 'identical',\n 'satisfactory',\n 'marginal',\n 'distinctive',\n 'electoral',\n 'urgent',\n 'presidential',\n 'controversial',\n 'everyday',\n 'encouraging',\n 'organic',\n 'continued',\n 'expected',\n 'statistical',\n 'desirable',\n 'innocent',\n 'improved',\n 'exclusive',\n 'marked',\n 'experienced',\n 'unexpected',\n 'superb',\n 'sheer',\n 'disappointed',\n 'frightened',\n 'gastric',\n 'romantic',\n 'naked',\n 'reluctant',\n 'magnificent',\n 'convenient',\n 'established',\n 'closed',\n 'uncertain',\n 'artificial',\n 'diplomatic',\n 'tremendous',\n 'marine',\n 'mechanical',\n 'retail',\n 'institutional',\n 'mixed',\n 'required',\n 'biological',\n 'known',\n 'functional',\n 'straightforward',\n 'superior',\n 'digital',\n 'spectacular',\n 'unhappy',\n 'confused',\n 'unfair',\n 'aggressive',\n 'spare',\n 'painful',\n 'abstract',\n 'asian',\n 'associated',\n 'legislative',\n 'monthly',\n 'intelligent',\n 'hungry',\n 'explicit',\n 'nasty',\n 'just',\n 'faint',\n 'coloured',\n 'ridiculous',\n 'amazing',\n 'comparable',\n 'successive',\n 'realistic',\n 'back',\n 'decent',\n 'decentralized',\n 'bitcoin',\n 'cypherpunk',\n 'unnecessary',\n 'flying',\n 'random',\n 'influential',\n 'dull',\n 'genetic',\n 'neat',\n 'marvellous',\n 'crazy',\n 'damp',\n 'giant',\n 'secure',\n 'bottom',\n 'skilled',\n 'subtle',\n 'elegant',\n 'brave',\n 'lesser',\n 'parallel',\n 'steep',\n 'intensive',\n 'casual',\n 'tropical',\n 'lonely',\n 'partial',\n 'preliminary',\n 'concrete',\n 'alleged',\n 'assistant',\n 'vertical',\n 'upset',\n 'delicate',\n 'mild',\n 'occupational',\n 'excessive',\n 'progressive',\n 'exceptional',\n 'integrated',\n 'striking',\n 'continental',\n 'okay',\n 'harsh',\n 'combined',\n 'fierce',\n 'handsome',\n 'characteristic',\n 'chronic',\n 'compulsory',\n 'interim',\n 'objective',\n 'splendid',\n 'magic',\n 'systematic',\n 'obliged',\n 'payable',\n 'fun',\n 'horrible',\n 'primitive',\n 'fascinating',\n 'ideological',\n 'metropolitan',\n 'surrounding',\n 'estimated',\n 'peaceful',\n 'premier',\n 'operational',\n 'technological',\n 'kind',\n 'advisory',\n 'hostile',\n 'precious',\n 'accessible',\n 'determined',\n 'excited',\n 'impressed',\n 'provincial',\n 'smart',\n 'endless',\n 'isolated',\n 'drunk',\n 'geographical',\n 'like',\n 'dynamic',\n 'boring',\n 'forthcoming',\n 'unfortunate',\n 'definite',\n 'super',\n 'notable',\n 'indirect',\n 'stiff',\n 'wealthy',\n 'awkward',\n 'lively',\n 'neutral',\n 'artistic',\n 'content',\n 'mature',\n 'colonial',\n 'ambitious',\n 'evil',\n 'magnetic',\n 'verbal',\n 'legitimate',\n 'sympathetic',\n 'empirical',\n 'head',\n 'shallow',\n 'vague',\n 'naval',\n 'depressed',\n 'shared',\n 'added',\n 'shocked',\n 'mid',\n 'worthwhile',\n 'qualified',\n 'missing',\n 'blank',\n 'absent',\n 'favourable',\n 'polish',\n 'israeli',\n 'developed',\n 'profound',\n 'representative',\n 'enthusiastic',\n 'dreadful',\n 'rigid',\n 'reduced',\n 'cruel',\n 'coastal',\n 'peculiar',\n 'swiss',\n 'crude',\n 'extended',\n 'selected',\n 'eager',\n 'canadian',\n 'bold',\n 'relaxed',\n 'corresponding',\n 'running',\n 'planned',\n 'applicable',\n 'immense',\n 'allied',\n 'comparative',\n 'uncomfortable',\n 'conservation',\n 'productive',\n 'beneficial',\n 'bored',\n 'charming',\n 'minimal',\n 'mobile',\n 'turkish',\n 'orange',\n 'rear',\n 'passive',\n 'suspicious',\n 'overwhelming',\n 'fatal',\n 'resulting',\n 'symbolic',\n 'registered',\n 'neighbouring',\n 'calm',\n 'irrelevant',\n 'patient',\n 'compact',\n 'profitable',\n 'rival',\n 'loyal',\n 'moderate',\n 'distinguished',\n 'interior',\n 'noble',\n 'insufficient',\n 'eligible',\n 'mysterious',\n 'varying',\n 'managerial',\n 'molecular',\n 'olympic',\n 'linear',\n 'prospective',\n 'printed',\n 'parental',\n 'diverse',\n 'elaborate',\n 'furious',\n 'fiscal',\n 'burning',\n 'useless',\n 'semantic',\n 'embarrassed',\n 'inherent',\n 'philosophical',\n 'deliberate',\n 'awake',\n 'variable',\n 'promising',\n 'unpleasant',\n 'varied',\n 'sacred',\n 'selective',\n 'inclined',\n 'tender',\n 'hidden',\n 'worthy',\n 'intermediate',\n 'sound',\n 'protective',\n 'fortunate',\n 'slim',\n 'defensive',\n 'divine',\n 'stuck',\n 'driving',\n 'invisible',\n 'misleading',\n 'circular',\n 'mathematical',\n 'inappropriate',\n 'liquid',\n 'persistent',\n 'solar',\n 'doubtful',\n 'manual',\n 'architectural',\n 'intact',\n 'incredible',\n 'devoted',\n 'prior',\n 'tragic',\n 'respectable',\n 'optimistic',\n 'convincing',\n 'unacceptable',\n 'decisive',\n 'competent',\n 'spatial',\n 'respective',\n 'binding',\n 'relieved',\n 'nursing',\n 'toxic',\n 'select',\n 'redundant',\n 'integral',\n 'then',\n 'probable',\n 'amateur',\n 'fond',\n 'passing',\n 'specified',\n 'territorial',\n 'horizontal',\n 'inland',\n 'cognitive',\n 'regulatory',\n 'miserable',\n 'resident',\n 'polite',\n 'scared',\n 'gothic',\n 'civilian',\n 'instant',\n 'lengthy',\n 'adverse',\n 'korean',\n 'unconscious',\n 'anonymous',\n 'aesthetic',\n 'orthodox',\n 'static',\n 'unaware',\n 'costly',\n 'fantastic',\n 'foolish',\n 'fashionable',\n 'causal',\n 'compatible',\n 'wee',\n 'implicit',\n 'dual',\n 'ok',\n 'cheerful',\n 'subjective',\n 'forward',\n 'surviving',\n 'exotic',\n 'purple',\n 'cautious',\n 'visiting',\n 'aggregate',\n 'ethical',\n 'teenage',\n 'dying',\n 'disastrous',\n 'delicious',\n 'confidential',\n 'underground',\n 'thorough',\n 'grim',\n 'autonomous',\n 'atomic',\n 'frozen',\n 'colourful',\n 'injured',\n 'uniform',\n 'ashamed',\n 'glorious',\n 'wicked',\n 'coherent',\n 'rising',\n 'shy',\n 'novel',\n 'balanced',\n 'delightful',\n 'arbitrary',\n 'adjacent',\n 'worrying',\n 'weird',\n 'unchanged',\n 'rolling',\n 'evolutionary',\n 'intimate',\n 'sporting',\n 'disciplinary',\n 'formidable',\n 'lexical',\n 'noisy',\n 'gradual',\n 'accused',\n 'homeless',\n 'supporting',\n 'coming',\n 'renewed',\n 'excess',\n 'retired',\n 'rubber',\n 'chosen',\n 'outdoor',\n 'embarrassing',\n 'preferred',\n 'bizarre',\n 'appalling',\n 'agreed',\n 'imaginative',\n 'governing',\n 'accepted',\n 'vocational',\n 'mighty',\n 'puzzled',\n 'worldwide',\n 'organisational',\n 'sunny',\n 'eldest',\n 'eventual',\n 'spontaneous',\n 'vivid',\n 'rude',\n 'faithful',\n 'ministerial',\n 'innovative',\n 'controlled',\n 'conceptual',\n 'unwilling',\n 'civic',\n 'meaningful',\n 'alive',\n 'brainy',\n 'breakable',\n 'busy',\n 'careful',\n 'cautious',\n 'clever',\n 'concerned',\n 'crazy',\n 'curious',\n 'dead',\n 'different',\n 'difficult',\n 'doubtful',\n 'easy',\n 'famous',\n 'fragile',\n 'helpful',\n 'helpless',\n 'important',\n 'impossible',\n 'innocent',\n 'inquisitive',\n 'modern',\n 'open',\n 'outstanding',\n 'poor',\n 'powerful',\n 'puzzled',\n 'real',\n 'rich',\n 'shy',\n 'sleepy',\n 'super',\n 'tame',\n 'uninterested',\n 'wandering',\n 'wild',\n 'wrong',\n 'adorable',\n 'alert',\n 'average',\n 'beautiful',\n 'blonde',\n 'bloody',\n 'blushing',\n 'bright',\n 'clean',\n 'clear',\n 'cloudy',\n 'colorful',\n 'crowded',\n 'cute',\n 'dark',\n 'drab',\n 'distinct',\n 'dull',\n 'elegant',\n 'fancy',\n 'filthy',\n 'glamorous',\n 'gleaming',\n 'graceful',\n 'grotesque',\n 'homely',\n 'light',\n 'misty',\n 'motionless',\n 'muddy',\n 'plain',\n 'poised',\n 'quaint',\n 'shiny',\n 'smoggy',\n 'sparkling',\n 'spotless',\n 'stormy',\n 'strange',\n 'ugly',\n 'unsightly',\n 'unusual',\n 'bad',\n 'better',\n 'beautiful',\n 'big',\n 'black',\n 'blue',\n 'bright',\n 'clumsy',\n 'crazy',\n 'dizzy',\n 'dull',\n 'fat',\n 'frail',\n 'friendly',\n 'funny',\n 'great',\n 'green',\n 'gigantic',\n 'gorgeous',\n 'grumpy',\n 'handsome',\n 'happy',\n 'horrible',\n 'itchy',\n 'jittery',\n 'jolly',\n 'kind',\n 'long',\n 'lazy',\n 'magnificent',\n 'magenta',\n 'many',\n 'mighty',\n 'mushy',\n 'nasty',\n 'new',\n 'nice',\n 'nosy',\n 'nutty',\n 'nutritious',\n 'odd',\n 'orange',\n 'ordinary',\n 'pretty',\n 'precious',\n 'prickly',\n 'purple',\n 'quaint',\n 'quiet',\n 'quick',\n 'quickest',\n 'rainy',\n 'rare',\n 'ratty',\n 'red',\n 'roasted',\n 'robust',\n 'round',\n 'sad',\n 'scary',\n 'scrawny',\n 'short',\n 'silly',\n 'stingy',\n 'strange',\n 'striped',\n 'spotty',\n 'tart',\n 'tall',\n 'tame',\n 'tan',\n 'tender',\n 'testy',\n 'tricky',\n 'tough',\n 'ugly',\n 'ugliest',\n 'vast',\n 'watery',\n 'wasteful',\n 'wonderful',\n 'yellow',\n 'yummy',\n 'zany',\n];\n\nexport default {\n gunOnceDefined,\n gunAsAnotherUser,\n async getHash (str: string, format = `base64`) {\n if (!str) {\n return undefined;\n }\n const hash = await Gun.SEA.work(str, undefined, undefined, {name: `SHA-256`});\n if (!hash) {\n throw new Error(`Gun.SEA.work failed for ${str}`);\n }\n if (hash.length > 44) {\n throw new Error(`Gun.SEA.work returned an invalid SHA-256 hash longer than 44 chars: ${hash}. This is probably due to a sea.js bug on Safari.`);\n }\n if (format === `hex`) {\n return this.base64ToHex(hash);\n }\n return hash;\n },\n\n capitalize(s: string) {\n return s.charAt(0).toUpperCase() + s.slice(1)\n },\n\n generateName() {\n return `${this.capitalize(_.sample(adjectives)!)} ${this.capitalize(_.sample(animals)!)}`;\n },\n\n base64ToHex(str: string) {\n const raw = atob(str);\n let result = '';\n for (let i = 0; i < raw.length; i++) {\n const hex = raw.charCodeAt(i).toString(16);\n result += (hex.length === 2 ? hex : `0${ hex}`);\n }\n return result;\n },\n\n getCaret(el: HTMLInputElement) {\n if (el.selectionStart) {\n return el.selectionStart;\n } else { // @ts-ignore\n if (document.selection) {\n el.focus();\n // @ts-ignore\n const r = document.selection.createRange();\n if (r === null) {\n return 0;\n }\n // @ts-ignore\n const re = el.createTextRange(), rc = re.duplicate();\n re.moveToBookmark(r.getBookmark());\n rc.setEndPoint('EndToStart', re);\n return rc.text.length;\n }\n }\n return 0;\n },\n\n injectCss() {\n const elementId = `irisStyle`;\n if (document.getElementById(elementId)) {\n return;\n }\n const sheet = document.createElement(`style`);\n sheet.id = elementId;\n sheet.innerHTML = `\n .iris-follow-button .hover {\n display: none;\n }\n\n .iris-follow-button.following:hover .hover {\n display: inline;\n }\n\n .iris-follow-button.following:hover .nonhover {\n display: none;\n }\n\n .iris-identicon * {\n box-sizing: border-box;\n }\n\n .iris-identicon {\n vertical-align: middle;\n border-radius: 50%;\n text-align: center;\n display: inline-block;\n position: relative;\n max-width: 100%;\n }\n\n .iris-distance {\n z-index: 2;\n position: absolute;\n left:0%;\n top:2px;\n width: 100%;\n text-align: right;\n color: #fff;\n text-shadow: 0 0 1px #000;\n font-size: 75%;\n line-height: 75%;\n font-weight: bold;\n }\n\n .iris-pie {\n border-radius: 50%;\n position: absolute;\n top: 0;\n left: 0;\n box-shadow: 0px 0px 0px 0px #82FF84;\n padding-bottom: 100%;\n max-width: 100%;\n -webkit-transition: all 0.2s ease-in-out;\n -moz-transition: all 0.2s ease-in-out;\n transition: all 0.2s ease-in-out;\n }\n\n .iris-card {\n padding: 10px;\n background-color: #f7f7f7;\n color: #777;\n border: 1px solid #ddd;\n display: flex;\n flex-direction: row;\n overflow: hidden;\n }\n\n .iris-card a {\n -webkit-transition: color 150ms;\n transition: color 150ms;\n text-decoration: none;\n color: #337ab7;\n }\n\n .iris-card a:hover, .iris-card a:active {\n text-decoration: underline;\n color: #23527c;\n }\n\n .iris-pos {\n color: #3c763d;\n }\n\n .iris-neg {\n color: #a94442;\n }\n\n .iris-identicon img {\n position: absolute;\n top: 0;\n left: 0;\n max-width: 100%;\n border-radius: 50%;\n border-color: transparent;\n border-style: solid;\n }\n\n .iris-chat-open-button {\n background-color: #1e1e1e;\n color: #fff;\n padding: 15px;\n cursor: pointer;\n user-select: none;\n }\n\n .iris-chat-open-button svg {\n width: 1em;\n }\n\n .iris-chat-open-button, .iris-chat-box {\n position: fixed;\n bottom: 0.5rem;\n right: 0.5rem;\n border-radius: 8px;\n font-family: system-ui;\n font-size: 15px;\n }\n\n .iris-chat-box {\n background-color: #fff;\n max-height: 25rem;\n box-shadow: 2px 2px 20px rgba(0, 0, 0, 0.2);\n height: calc(100% - 44px);\n display: flex;\n flex-direction: column;\n width: 320px;\n color: rgb(38, 38, 38);\n }\n\n .iris-chat-box.minimized {\n height: auto;\n }\n\n .iris-chat-box.minimized .iris-chat-header {\n border-radius: 8px;\n cursor: pointer;\n }\n\n .iris-chat-box.minimized .iris-chat-messages, .iris-chat-box.minimized .iris-typing-indicator, .iris-chat-box.minimized .iris-chat-input-wrapper, .iris-chat-box.minimized .iris-chat-minimize, .iris-chat-box.minimized .iris-chat-close {\n display: none;\n }\n\n .iris-chat-header {\n background-color: #1e1e1e;\n height: 44px;\n color: #fff;\n border-radius: 8px 8px 0 0;\n text-align: center;\n display: flex;\n flex-direction: row;\n justify-content: center;\n align-items: center;\n flex: none;\n white-space: nowrap;\n text-overflow: ellipsis;\n overflow: hidden;\n }\n\n .iris-chat-header-text {\n flex: 1;\n }\n\n .iris-online-indicator {\n color: #bfbfbf;\n margin-right: 5px;\n font-size: 12px;\n user-select: none;\n flex: none;\n }\n\n .iris-online-indicator.yes {\n color: #80bf5f;\n }\n\n .iris-typing-indicator {\n display: none;\n background-color: rgba(255, 255, 255, 0.5);\n font-size: 12px;\n padding: 2px;\n color: #777;\n }\n\n .iris-typing-indicator.yes {\n display: block;\n }\n\n .iris-chat-messages {\n flex: 1;\n padding: 15px;\n overflow-y: scroll;\n }\n\n .iris-chat-input-wrapper {\n flex: none;\n padding: 15px;\n background-color: #efefef;\n display: flex;\n flex-direction: row;\n border-radius: 0 0 8px 8px;\n }\n\n .iris-chat-input-wrapper textarea {\n padding: 15px 8px;\n border-radius: 4px;\n border: 1px solid rgba(0,0,0,0);\n width: auto;\n font-size: 15px;\n resize: none;\n flex: 1;\n }\n\n .iris-chat-input-wrapper textarea:focus {\n outline: none;\n border: 1px solid #6dd0ed;\n }\n\n .iris-chat-input-wrapper button svg {\n display: inline-block;\n font-size: inherit;\n height: 1em;\n width: 1em;\n overflow: visible;\n vertical-align: -0.125em;\n }\n\n .iris-chat-input-wrapper button, .iris-chat-input-wrapper button:hover, .iris-chat-input-wrapper button:active, .iris-chat-input-wrapper button:focus {\n flex: none;\n color: #999;\n background-color: transparent;\n font-size: 30px;\n padding: 5px;\n border: 1px solid rgba(0,0,0,0);\n border-radius: 4px;\n margin-left: 5px;\n }\n\n .iris-chat-input-wrapper button:active, .iris-chat-input-wrapper button:focus {\n outline: none;\n border: 1px solid #6dd0ed;\n }\n\n .iris-chat-message {\n display: flex;\n flex-direction: column;\n margin-bottom: 2px;\n overflow-wrap: break-word;\n }\n\n .iris-msg-content {\n background-color: #efefef;\n padding: 6px 10px;\n border-radius: 8px;\n box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.1);\n flex: none;\n max-width: 75%;\n }\n\n .emoji {\n font-size: 1.3em;\n line-height: 1em;\n }\n\n .iris-chat-message .emoji-only {\n font-size: 3em;\n text-align: center;\n }\n\n .iris-seen {\n color: rgba(0, 0, 0, 0.45);\n user-select: none;\n }\n\n .iris-seen.yes {\n color: #4fc3f7;\n }\n\n .iris-seen svg {\n width: 18px;\n }\n\n .iris-delivered-checkmark {\n display: none;\n }\n\n .delivered .iris-delivered-checkmark {\n display: initial;\n }\n\n .iris-chat-minimize, .iris-chat-close {\n user-select: none;\n cursor: pointer;\n width: 45px;\n line-height: 44px;\n }\n\n .iris-chat-message.their {\n align-items: flex-start;\n }\n\n .iris-chat-message.their + .iris-chat-message.our .iris-msg-content, .day-separator + .iris-chat-message.our .iris-msg-content {\n margin-top: 15px;\n border-radius: 8px 0px 8px 8px;\n }\n\n .iris-chat-message.their:first-of-type .iris-msg-content {\n border-radius: 0px 8px 8px 8px;\n }\n\n .iris-chat-message.our:first-of-type .iris-msg-content {\n border-radius: 8px 0px 8px 8px;\n }\n\n .iris-chat-message.our + .iris-chat-message.their .iris-msg-content, .day-separator + .iris-chat-message.their .iris-msg-content {\n margin-top: 15px;\n border-radius: 0px 8px 8px 8px;\n }\n\n .iris-chat-message.our {\n align-items: flex-end;\n }\n\n .iris-chat-message.our .iris-msg-content {\n background-color: #c5ecf7;\n }\n\n .iris-chat-message .time {\n text-align: right;\n font-size: 12px;\n color: rgba(0, 0, 0, 0.45);\n }\n\n .iris-non-string {\n color: blue;\n }\n\n .day-separator {\n display: inline-block;\n border-radius: 8px;\n background-color: rgba(227, 249, 255, 0.91);\n padding: 6px 10px;\n margin-top: 15px;\n margin-left: auto;\n margin-right: auto;\n text-transform: uppercase;\n font-size: 13px;\n color: rgba(74, 74, 74, 0.88);\n box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.1);\n user-select: none;\n }\n\n .day-separator:first-of-type {\n margin-top: 0;\n }\n\n *[contenteditable=\"true\"]:not(:focus) {\n cursor: pointer;\n }\n\n *[contenteditable=\"true\"] {\n outline: none;\n }\n\n [placeholder]:empty:before {\n content: attr(placeholder);\n color: #999;\n }\n\n [placeholder]:empty:focus {\n cursor: text;\n }\n `;\n document.head.prepend(sheet);\n },\n\n getUrlParameter(sParam: string, sParams: string) {\n const sPageURL = sParams || window.location.search.substring(1);\n const sURLVariables = sPageURL.split('&');\n let sParameterName, i;\n\n for (i = 0; i < sURLVariables.length; i++) {\n sParameterName = sURLVariables[i].split('=');\n if (sParameterName[0] === sParam) {\n return sParameterName[1] === undefined ? true : decodeURIComponent(sParameterName[1]);\n }\n }\n return;\n },\n\n formatTime(date: Date) {\n // @ts-ignore\n const t: any = date.toLocaleTimeString(undefined, {timeStyle: 'short'});\n const s = t.split(':');\n if (s.length === 3) { // safari tries to display seconds\n return `${s[0] }:${ s[1] }${s[2].slice(2)}`;\n }\n return t;\n },\n\n formatDate(date: Date) {\n const t = date.toLocaleString(undefined, {dateStyle: 'short', timeStyle: 'short'});\n const s = t.split(':');\n if (s.length === 3) { // safari tries to display seconds\n return `${s[0] }:${ s[1] }${s[2].slice(2)}`;\n }\n return t;\n },\n\n getDaySeparatorText(date: Date, dateStr: string, now?: Date, nowStr?: string) {\n if (!now) {\n now = new Date();\n // @ts-ignore\n nowStr = now.toLocaleDateString({dateStyle: 'short'});\n }\n if (dateStr === nowStr) {\n return 'today';\n }\n const dayDifference = Math.round((now - date) / (1000 * 60 * 60 * 24));\n if (dayDifference === 0) {\n return 'today';\n }\n if (dayDifference === 1) {\n return 'yesterday';\n }\n if (dayDifference <= 5) {\n return date.toLocaleDateString(undefined, {weekday: 'long'});\n }\n return dateStr;\n },\n\n getProfileLink(pub: string) {\n return `${window.location.origin}/#/profile/${encodeURIComponent(pub)}`;\n },\n\n truncateString(s: string, length = 30) {\n return s.length > length ? `${s.slice(0, length)}...` : s;\n },\n\n createElement(type: string, cls?: string, parent?: HTMLElement) {\n const el = document.createElement(type);\n if (cls) {\n el.setAttribute('class', cls);\n }\n if (parent) {\n parent.appendChild(el);\n }\n return el;\n },\n\n isNode,\n isElectron,\n isMobile,\n\n throttle: (func: Function, limit: number) => {\n let inThrottle: boolean;\n return function() {\n const args = arguments;\n const context = this;\n if (!inThrottle) {\n func.apply(context, args);\n inThrottle = true;\n setTimeout(() => inThrottle = false, limit);\n }\n };\n },\n debounce: (func: Function, delay: number) => {\n let inDebounce: boolean;\n return function() {\n const context = this;\n const args = arguments;\n clearTimeout(inDebounce);\n inDebounce = setTimeout(() => func.apply(context, args), delay);\n };\n },\n sample: (arr: any[]) => arr[Math.floor(Math.random() * arr.length)],\n sampleSize: (arr: any[], size: number) => {\n const shuffled = arr.slice(0);\n let i = arr.length;\n let min = i - size;\n let temp;\n let index;\n while (i-- > min) {\n index = Math.floor((i + 1) * Math.random());\n temp = shuffled[index];\n shuffled[index] = shuffled[i];\n shuffled[i] = temp;\n }\n return shuffled.slice(min);\n },\n defer: (func: Function) => setTimeout(func, 0),\n once: (func: Function) => {\n let called = false;\n return function() {\n if (called) {\n return;\n }\n called = true;\n func.apply(this, arguments);\n };\n },\n omit: (obj: any, keys: string[]) => {\n const newObj = {};\n Object.keys(obj).forEach(key => {\n if (!keys.includes(key)) {\n newObj[key] = obj[key];\n }\n });\n return newObj;\n }\n};\n","import session from './session';\nimport _ from './lodash';\nimport Gun from 'gun';\nimport util from './util';\nimport publicState from './global';\n\nconst ELECTRON_GUN_URL = 'http://localhost:8767/gun';\nlet maxConnectedPeers = 2;\n\ntype Peer = {\n url?: string;\n enabled?: boolean;\n from?: string;\n visibility?: string;\n}\n\ntype Peers = {\n [key: string]: Peer\n}\n\nconst DEFAULT_PEERS: Peers = {\n 'https://gun-rs.iris.to/gun': {},\n 'https://gun-us.herokuapp.com/gun': {},\n};\n\nconst loc = window.location;\nconst host = loc.host;\nconst is_localhost_but_not_dev = host.startsWith('localhost') && host !== 'localhost:8080';\nif (loc.hostname.endsWith('herokuapp.com') || is_localhost_but_not_dev) {\n Object.keys(DEFAULT_PEERS).forEach(url => DEFAULT_PEERS[url].enabled = false);\n DEFAULT_PEERS[`${loc.origin}/gun`] = {enabled: true};\n}\n\nconst urlRegex = /^(https?:\\/\\/)?([\\da-z.-]+)\\.([a-z.]{2,6})([\\/\\w .-]*)*\\/?$/;\n\n/**\n * Networking and peer management utilities\n */\nexport default {\n known: {} as Peers,\n\n /** */\n async add(peer: Peer) {\n if (peer.url && !urlRegex.test(peer.url)) {\n throw new Error(`Invalid url ${peer.url}`);\n }\n\n if (peer.from) {\n Object.keys(this.known).forEach(k => {\n if (this.known[k].from === peer.from) { // remove previous peer url from the same user\n delete this.known[k];\n }\n });\n }\n const url = peer.url || '';\n this.known[url] = this.known[url] || _.omit(peer, ['url']);\n if (peer.visibility === 'public') {\n // rolling some crypto operations to obfuscate actual url in case we want to remove it\n let secret = await Gun.SEA.secret(session.getKey().epub, session.getKey()) || '';\n let encryptedUrl = await Gun.SEA.encrypt(peer.url, secret);\n let encryptedUrlHash = await Gun.SEA.work(encryptedUrl, null, null, {name: 'SHA-256'});\n publicState().user().get('peers').get(encryptedUrlHash).put({url: peer.url, lastSeen: new Date().toISOString()});\n }\n if (peer.enabled !== false) {\n peer.url && this.connect(peer.url); // this calls savePeers()\n } else {\n this.save();\n }\n },\n\n /** */\n remove(url: string) {\n delete this.known[url];\n this.save();\n },\n\n /** */\n disconnect(peerFromGun: any) {\n publicState().on('bye', peerFromGun);\n peerFromGun.url = '';\n },\n\n save() {\n localStorage.setItem('gunPeers', JSON.stringify(this.known));\n },\n\n getSaved() {\n let p: any = localStorage.getItem('gunPeers');\n if (p && p !== 'undefined') {\n p = JSON.parse(p);\n } else {\n p = DEFAULT_PEERS;\n }\n if (util.isElectron) {\n p[ELECTRON_GUN_URL] = {};\n }\n Object.keys(p).forEach(k => _.defaults(p[k], {enabled: true}));\n return p;\n },\n\n /** */\n reset() {\n localStorage.setItem('gunPeers', '');\n this.known = this.getSaved();\n },\n\n /** */\n connect(url: string) {\n if (this.isMixedContent(url)) { return; }\n if (this.known[url]) {\n this.known[url].enabled = true;\n publicState().opt({peers: [url]});\n this.save();\n } else {\n this.add({url});\n }\n },\n\n /** */\n disable(url: string, peerFromGun: any) {\n this.known[url].enabled = false;\n if (peerFromGun) {\n this.disconnect(peerFromGun);\n }\n this.save();\n },\n\n isMixedContent(url: string) {\n return window.location.protocol === 'https:' && (url.indexOf('http:') === 0);\n },\n\n random() {\n const connectToLocalElectron = util.isElectron && this.known[ELECTRON_GUN_URL] && this.known[ELECTRON_GUN_URL].enabled !== false;\n const sampleSize = connectToLocalElectron ? Math.max(maxConnectedPeers - 1, 1) : maxConnectedPeers;\n const sample = _.sampleSize(\n Object.keys(\n _.pickBy(this.known, (peer: any, url: string) => {\n return !this.isMixedContent(url) && peer.enabled && !(util.isElectron && url === ELECTRON_GUN_URL);\n })\n ), sampleSize\n );\n if (sample && connectToLocalElectron) {\n sample.push(ELECTRON_GUN_URL);\n }\n return sample;\n },\n\n checkGunPeerCount() {\n let peersFromGun = publicState().back('opt.peers');\n let connectedPeers = Object.values(peersFromGun).filter((peer: any) => {\n if (peer && peer.wire && peer.wire.constructor.name !== 'WebSocket') {\n console.log('WebRTC peer', peer);\n }\n return peer && peer.wire && peer.wire.readyState === 1 && peer.wire.bufferedAmount === 0 && peer.wire.constructor.name === 'WebSocket';\n });\n if (connectedPeers.length < maxConnectedPeers) {\n let unconnectedPeers = Object.keys(this.known).filter(url => {\n let addedToGun = Object.values(peersFromGun).map((peer:any) => peer.url).indexOf(url) > -1;\n let enabled = this.known[url].enabled;\n const mixedContent = (window.location.protocol === 'https:' && (url.indexOf('http:') === 0));\n return !mixedContent && enabled && !addedToGun;\n });\n if (unconnectedPeers.length) {\n const sample = String(_.sample(unconnectedPeers));\n this.connect(sample);\n }\n }\n if (connectedPeers.length > maxConnectedPeers) {\n this.disconnect(_.sample(connectedPeers));\n }\n },\n\n init() {\n this.known = this.getSaved();\n /* use the default value of 1 for now because of memory issue\n local().get('settings').get('maxConnectedPeers').on(n => {\n if (n !== undefined) maxConnectedPeers = n;\n });\n */\n setInterval(() => this.checkGunPeerCount(), 1000);\n }\n};\n","import Gun from 'gun';\nimport 'gun/sea';\nimport 'gun/lib/yson';\nimport 'gun/lib/radix';\nimport 'gun/lib/radisk';\nimport 'gun/lib/store';\nimport 'gun/lib/rindexed';\nimport peers from \"./peers\";\n\nlet global: any;\n\nexport default function(opts: any = {}) {\n if (!global) {\n const myOpts = Object.assign({ peers: (opts.peers || peers.random()), localStorage: false, retry:Infinity }, opts);\n if (opts.peers) {\n opts.peers.forEach((url: string) => peers.add({url}));\n }\n peers.init();\n global = new Gun(myOpts);\n }\n return global;\n}","// @ts-nocheck\n\n/*eslint no-useless-escape: \"off\", camelcase: \"off\" */\n\nconst UNIQUE_ID_VALIDATORS = {\n email: /^([\\w-]+(?:\\.[\\w-]+)*)@((?:[\\w-]+\\.)*\\w[\\w-]{0,66})\\.([a-z]{2,6}(?:\\.[a-z]{2})?)$/i,\n bitcoin: /^[13][a-km-zA-HJ-NP-Z0-9]{26,33}$/,\n bitcoin_address: /^[13][a-km-zA-HJ-NP-Z0-9]{26,33}$/,\n ip: /^(([1-9]?\\d|1\\d\\d|2[0-5][0-5]|2[0-4]\\d)\\.){3}([1-9]?\\d|1\\d\\d|2[0-5][0-5]|2[0-4]\\d)$/,\n ipv6: /^(?:[A-F0-9]{1,4}:){7}[A-F0-9]{1,4}$/,\n gpg_fingerprint: null,\n gpg_keyid: null,\n google_oauth2: null,\n tel: /^\\d{7,}$/,\n phone: /^\\d{7,}$/,\n keyID: null,\n url: /[-a-zA-Z0-9@:%_\\+.~#?&//=]{2,256}\\.[a-z]{2,4}\\b(\\/[-a-zA-Z0-9@:%_\\+.~#?&//=]*)?/gi,\n account: /^([\\w-]+(?:\\.[\\w-]+)*)@((?:[\\w-]+\\.)*\\w[\\w-]{0,66})\\.([a-z]{2,6}(?:\\.[a-z]{2})?)$/i,\n uuid: /[0-9a-f]{8}\\-[0-9a-f]{4}\\-[0-9a-f]{4}\\-[0-9a-f]{4}\\-[0-9a-f]{12}/\n};\n\n// TODO this class could perhaps be removed\n\nclass Attribute {\n constructor(a, b) {\n if (typeof a === `object`) {\n if (typeof a.value !== `string`) { throw new Error(`param1.value must be a string, got ${typeof a.value}: ${JSON.stringify(a.value)}`); }\n if (typeof a.type !== `string`) { throw new Error(`param1.type must be a string, got ${typeof a.type}: ${JSON.stringify(a.type)}`); }\n b = a.value;\n a = a.type;\n }\n if (typeof a !== `string`) { throw new Error(`First param must be a string, got ${typeof a}: ${JSON.stringify(a)}`); }\n if (!a.length) { throw new Error(`First param string is empty`); }\n if (b) {\n if (typeof b !== `string`) { throw new Error(`Second parameter must be a string, got ${typeof b}: ${JSON.stringify(b)}`); }\n if (!b.length) { throw new Error(`Second param string is empty`); }\n this.type = a;\n this.value = b;\n } else {\n this.value = a;\n const t = Attribute.guessTypeOf(this.value);\n if (t) {\n this.type = t;\n } else {\n throw new Error(`Type of attribute was omitted and could not be guessed`);\n }\n }\n }\n\n static getUuid() {\n const b = a => a ? (a ^ Math.random() * 16 >> a / 4).toString(16) : ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, b);\n return new Attribute(`uuid`, b());\n }\n\n static getUniqueIdValidators() {\n return UNIQUE_ID_VALIDATORS;\n }\n\n static isUniqueType(type) {\n return Object.keys(UNIQUE_ID_VALIDATORS).indexOf(type) > -1;\n }\n\n isUniqueType() {\n return Attribute.isUniqueType(this.type);\n }\n\n static guessTypeOf(value) {\n for (const key in UNIQUE_ID_VALIDATORS) {\n if (value.match(UNIQUE_ID_VALIDATORS[key])) {\n return key;\n }\n }\n }\n\n static equals(a, b) {\n return a.equals(b);\n }\n\n equals(a) {\n return a && this.type === a.type && this.value === a.value;\n }\n\n uri() {\n return `${encodeURIComponent(this.value)}:${encodeURIComponent(this.type)}`;\n }\n}\n\nexport default Attribute;\n","import publicState from './global';\nimport session from './session';\n\nlet currentUser: any;\n\n/**\n * Get a public space where only the specified user (public key) can write. Others can read.\n * @param pub The public key of the user. Defaults to the current user from session.\n * @returns {Node} The user space.\n */\nexport default function(pub?: string) {\n if (!currentUser) {\n currentUser = publicState().user();\n currentUser.auth(session.getKey());\n }\n return pub ? publicState().user(pub) : currentUser;\n}\n","// @ts-nocheck\n\nimport Gun from 'gun';\nimport 'gun/sea';\nimport util from './util';\nimport Attribute from './Attribute';\nimport session from './session';\nimport publicState from './global';\nimport userState from './public';\n\n// TODO: extract Group channels into their own class\n\nconst DEFAULT_PERMISSIONS = {read: true, write: true, admin: false};\n\n/**\n* Private communication channel between two or more participants ([Gun](https://github.com/amark/gun) public keys). Can be used independently of other Iris stuff.\n*\n* Used as a core element of [iris-messenger](https://github.com/irislib/iris-messenger).\n*\n* You can use iris.private(pub) to always use the same Channel object for a given pub.\n*\n* ---\n*\n* #### Key-value API\n* `channel.put(key, value)` and `channel.on(key, callback)`.\n*\n* Note that each participant has their own versions of each key-value — they don't overwrite each other. `channel.on()` callback returns them all by default and has a parameter that indicates whose value you got.\n*\n* While values are encrypted, encryption of keys is not implemented yet.\n*\n* #### Message API\n* `channel.send()` and `channel.getMessages()` for timestamp-indexed chat-style messaging.\n*\n* Message data is encrypted, but timestamps are public so that peers can return your messages in a sequential order.\n*\n* ---\n*\n* You can open a channel with yourself for a private key-value space or a \"note to self\" type chat with yourself.\n*\n* **Privacy disclaimer:** Channel ids, data values and messages are encrypted, but message timestamps are unencrypted so that peers can return them to you in a sequential order. By looking at the unencrypted timestamps (or Gun subscriptions), it is possible to guess who are communicating with each other. This could be improved by indexing messages by *day* only, so making the guess would be more difficult, while you could still return them in a semi-sequential order.\n*\n* @param {Object} options\n* @param {string} options.key your keypair\n* @param {Object} options.gun [gun](https://github.com/amark/gun) instance\n* @param options.participants (optional) string or string array or permissions object ({'pub1':{read:true,write:true,admin:false},'pub2'...}) of participant public keys (your own key is included by default)\n* @param {string} options.chatLink (optional) chat link instead of participants list\n* @param {string} options.uuid (group channels only) unique channel identifier. Leave out for new channel.\n* @param {string} options.name (group channels only) channel name\n* @example\n* // Copy & paste this to console at https://iris.to or other page that has gun, sea and iris-lib\n* // Due to an unsolved bug, someoneElse's messages only start showing up after a reload\n*\n* var gun1 = new Gun('https://gun-us.herokuapp.com/gun');\n* var gun2 = new Gun('https://gun-us.herokuapp.com/gun');\n* var myKey = await iris.Key.getDefault();\n* var someoneElse = localStorage.getItem('someoneElsesKey');\n* if (someoneElse) {\n* someoneElse = JSON.parse(someoneElse);\n* } else {\n* someoneElse = await iris.Key.generate();\n* localStorage.setItem('someoneElsesKey', JSON.stringify(someoneElse));\n* }\n*\n* iris.Channel.initUser(gun1, myKey); // saves myKey.epub to gun.user().get('epub')\n* iris.Channel.initUser(gun2, someoneElse);\n*\n* var ourChannel = new iris.Channel({key: myKey, gun: gun1, participants: someoneElse.pub});\n* var theirChannel = new iris.Channel({key: someoneElse, gun: gun2, participants: myKey.pub});\n*\n* var myChannels = {}; // you can list them in a user interface\n* function printMessage(msg, info) {\n* console.log(`[${new Date(msg.time).toLocaleString()}] ${info.from.slice(0,8)}: ${msg.text}`)\n* }\n* iris.Channel.getChannels(gun1, myKey, channel => {\n* var pub = channel.getCurrentParticipants()[0];\n* gun1.user(pub).get('profile').get('name').on(name => channel.name = name);\n* myChannels[pub] = channel;\n* channel.getMessages(printMessage);\n* channel.on('mood', (mood, from) => console.log(from.slice(0,8) + ' is feeling ' + mood));\n* });\n*\n* // you can play with these in the console:\n* ourChannel.send('message from myKey');\n* theirChannel.send('message from someoneElse');\n*\n* ourChannel.put('mood', 'blessed');\n* theirChannel.put('mood', 'happy');\n*\n* @example https://github.com/irislib/iris-lib/blob/master/__tests__/Channel.js\n*/\nclass Channel {\n // TODO: these should be done in a cleaner way\n latestTime: any;\n theirMsgsLastSeenDate: any;\n myLastSeenTime: any;\n theirMsgsLastSeenTime: any;\n notificationSetting: any;\n messageIds: any; // this is used from session.processMessage\n latest: any;\n uuid: any;\n name: any;\n attachments: any;\n\n theirSecretUuids = {};\n theirGroupSecrets = {};\n secrets = {};\n ourSecretChannelIds = {};\n theirSecretChannelIds = {};\n messages = {};\n chatLinks = {};\n groupSubscriptions = {};\n directSubscriptions = {};\n getParticipantsCallbacks = {};\n myGroupSecret: any;\n participants: any;\n\n constructor(options: any) {\n this.myGroupSecret = options.myGroupSecret;\n\n if (options.chatLink) {\n this.useChatLink(options);\n }\n\n if (typeof options.participants === `string`) {\n this.addParticipant(options.participants, options.save);\n } else if (Array.isArray(options.participants)) {\n const o = {};\n options.participants.forEach(p => o[p] = Object.assign({}, DEFAULT_PERMISSIONS));\n options.participants = o;\n }\n if (typeof options.participants === `object`) { // it's a group channel\n const keys = Object.keys(options.participants);\n keys.forEach(k => {\n if (k !== session.getKey().pub) {\n this.addParticipant(k, options.save, Object.assign({}, DEFAULT_PERMISSIONS, options.participants[k]));\n }\n });\n options.participants[session.getKey().pub] = options.participants[session.getKey().pub] || Object.assign({}, DEFAULT_PERMISSIONS);\n if (options.uuid) {\n this.uuid = options.uuid;\n this.name = options.name;\n } else {\n options.uuid = Attribute.getUuid().value;\n this.uuid = options.uuid;\n options.participants[session.getKey().pub].admin = true;\n options.participants[session.getKey().pub].founder = true;\n }\n this.getChatLinks({subscribe: true});\n }\n this.participants = options.participants;\n if (options.uuid) { // It's a group channel\n // share secret uuid with other participants. since secret is already non-deterministic, maybe uuid could also be?\n // generate channel-specific secret and share it with other participants\n // put() keys should be encrypted first? so you could do put(uuid, secret)\n // what if you join the channel with 2 unconnected devices? on reconnect, the older secret would be overwritten and messages unreadable. maybe participants should store each others' old keys? or maybe you should store them and re-encrypt old stuff when key changes? return them with map() instead?\n this.putDirect(`S${this.uuid}`, this.getMyGroupSecret());\n this.getMySecretUuid().then(s => {\n this.putDirect(this.uuid, s); // TODO: encrypt keys in put()\n });\n this.onTheirDirect(this.uuid, (s, k, from) => {\n this.theirSecretUuids[from] = s;\n });\n this.onTheirDirect(`S${this.uuid}`, (s, k, from) => {\n this.theirGroupSecrets[from] = s;\n });\n // need to make put(), on(), send() and getMessages() behave differently when it's a group and retain the old versions for mutual signaling\n }\n this.onTheir(`participants`, (participants, k, from) => {\n let hasAdmin = false;\n const keys = Object.keys(this.participants);\n for (let i = 0; i < keys.length; i++) {\n if (this.participants[keys[i]].admin || this.participants[keys[i]].inviter) {\n hasAdmin = true;\n break;\n }\n }\n if (!hasAdmin) {\n keys.forEach(k => this.participants[k].admin = true); // if no admins, make everyone admin\n }\n if (this.participants[from] && (this.participants[from].admin || this.participants[from].inviter)) {\n if (typeof participants === `object`) {\n if (JSON.stringify(this.participants) === JSON.stringify(participants)) { return; }\n this.participants = participants;\n delete this.participants[from].inviter;\n Object.keys(participants).forEach(k => {\n if (k !== session.getKey().pub) {\n this.addParticipant(k, true, Object.assign({}, DEFAULT_PERMISSIONS, participants[k]), true);\n }\n });\n this.participantsChanged();\n options.saved = true;\n }\n }\n });\n if (!options.saved && (options.save === undefined || options.save === true)) {\n this.save();\n }\n }\n\n useChatLink(options) {\n const s = options.chatLink.split('?');\n if (s.length === 2) {\n const chatWith = util.getUrlParameter('chatWith', s[1]);\n const channelId = util.getUrlParameter('channelId', s[1]);\n const inviter = util.getUrlParameter('inviter', s[1]);\n const pub = inviter || chatWith;\n if (chatWith) {\n options.participants = pub;\n } else if (channelId && inviter && inviter !== session.getKey().pub) { // TODO! initializing it twice breaks things - new secret is generated\n options.uuid = channelId;\n options.participants = {};\n options.participants[inviter] = Object.assign({inviter: true}, DEFAULT_PERMISSIONS);\n }\n if (pub !== session.getKey().pub) {\n const sharedSecret = util.getUrlParameter('s', s[1]);\n const linkId = util.getUrlParameter('k', s[1]);\n if (sharedSecret && linkId) {\n this.save(); // save the channel first so it's there before inviter subscribes to it\n options.saved = true;\n publicState().user(pub).get('chatLinks').get(linkId).get('encryptedSharedKey').on(async encrypted => {\n const sharedKey = await Gun.SEA.decrypt(encrypted, sharedSecret);\n const encryptedChatRequest = await Gun.SEA.encrypt(session.getKey().pub, sharedSecret); // TODO encrypt is not deterministic, it uses salt\n const channelRequestId = await util.getHash(encryptedChatRequest);\n util.gunAsAnotherUser(publicState(), sharedKey, user => {\n user.get('chatRequests').get(channelRequestId.slice(0, 12)).put(encryptedChatRequest);\n });\n });\n }\n }\n }\n }\n\n getTheirSecretUuid(pub) {\n return new Promise(resolve => {\n if (!this.theirSecretUuids[pub]) {\n this.onTheirDirect(this.uuid, s => {\n this.theirSecretUuids[pub] = s;\n resolve(this.theirSecretUuids[pub]);\n }, pub);\n } else {\n resolve(this.theirSecretUuids[pub]);\n }\n });\n }\n\n getTheirGroupSecret(pub) {\n if (pub === session.getKey().pub) { return this.getMyGroupSecret(); }\n return new Promise(resolve => {\n if (!this.theirGroupSecrets[pub]) {\n this.onTheirDirect(`S${this.uuid}`, s => {\n this.theirGroupSecrets[pub] = s;\n resolve(this.theirGroupSecrets[pub]);\n }, pub);\n } else {\n resolve(this.theirGroupSecrets[pub]);\n }\n });\n }\n\n changeMyGroupSecret() {\n this.myGroupSecret = Gun.SEA.random(32).toString('base64');\n // TODO: secret should be archived and probably messages should include the encryption key id so past messages don't become unreadable\n this.putDirect(`S${this.uuid}`, this.myGroupSecret);\n }\n\n /**\n * Unsubscribe messages from a channel participants\n *\n * @param {string} participant public key\n */\n async mute(participant) {\n publicState().user(participant).get(this.theirSecretUuids[participant]).off();\n // TODO: persist\n }\n\n /**\n * Mute user and prevent them from seeing your further (and maybe past) messages\n *\n * @param {string} participant public key\n */\n async block(participant) {\n this.mute(participant);\n this.putDirect(this.uuid, null);\n this.putDirect(`S${this.uuid}`, null);\n delete this.secrets[participant];\n delete this.ourSecretChannelIds[participant];\n delete this.theirSecretChannelIds[participant];\n this.changeMyGroupSecret();\n }\n\n async getMySecretUuid() {\n if (!this.mySecretUuid) {\n const mySecret = await Gun.SEA.secret(session.getKey().epub, session.getKey());\n const mySecretHash = await util.getHash(mySecret);\n this.mySecretUuid = await util.getHash(mySecretHash + this.uuid);\n }\n return this.mySecretUuid;\n }\n\n /**\n * List participants of the channel (other than you)\n */\n getCurrentParticipants() {\n return Object.keys(this.secrets);\n }\n\n /**\n * Subscribe to the changing list of participants by channel admins\n */\n getParticipants(callback) {\n if (this.getParticipantsCallbackId) {\n this.getParticipantsCallbackId++;\n } else {\n this.getParticipantsCallbackId = 1;\n }\n this.getParticipantsCallbacks[this.getParticipantsCallbackId] = callback;\n if (this.participants) {\n callback(this.participants);\n }\n }\n\n participantsChanged() {\n Object.keys(this.getParticipantsCallbacks).forEach(id => {\n this.getParticipantsCallbacks[id](this.participants);\n });\n }\n\n /**\n * Returns either the uuid of a group channel or the public key of a direct channel.\n */\n getId() {\n return this.uuid || this.getCurrentParticipants()[0];\n }\n\n async getSecret(pub) {\n if (!this.secrets[pub]) {\n const epub = await util.gunOnceDefined(publicState().user(pub).get(`epub`));\n this.secrets[pub] = await Gun.SEA.secret(epub, session.getKey());\n }\n return this.secrets[pub];\n }\n\n /**\n *\n */\n static async getOurSecretChannelId(pub, pair) {\n const epub = await util.gunOnceDefined(publicState().user(pub).get(`epub`));\n const secret = await Gun.SEA.secret(epub, pair);\n return util.getHash(secret + pub);\n }\n\n /**\n *\n */\n static async getTheirSecretChannelId(pub, pair) {\n const epub = await util.gunOnceDefined(publicState().user(pub).get(`epub`));\n const secret = await Gun.SEA.secret(epub, pair);\n return util.getHash(secret + pair.pub);\n }\n\n /**\n * Calls back with Channels that you have initiated or written to.\n * @param {Object} keypair Gun.SEA keypair that the gun instance is authenticated with\n * @param callback callback function that is called for each public key you have a channel with\n */\n static async getChannels(callback, listenToChatLinks = true) {\n const keypair = session.getKey();\n const mySecret = await Gun.SEA.secret(keypair.epub, keypair);\n if (listenToChatLinks) {\n Channel.getMyChatLinks( undefined, undefined, true);\n }\n const seen = {};\n\n const handleChannel = async (value, ourSecretChannelId) => {\n if (value && !seen[ourSecretChannelId]) {\n seen[ourSecretChannelId] = true;\n if (ourSecretChannelId.length > 44) {\n publicState().user().get(`chats`).get(ourSecretChannelId).put(null);\n return;\n }\n const encryptedChatId = await util.gunOnceDefined(publicState().user().get(`chats`).get(ourSecretChannelId).get(`pub`));\n const chatId = await Gun.SEA.decrypt(encryptedChatId, mySecret);\n if (!chatId) {\n return;\n }\n if (chatId.pub || typeof chatId === `string`) {\n callback(new Channel({\n key: keypair,\n participants: chatId.pub || chatId,\n save: false\n }));\n } else if (chatId.uuid && chatId.participants && chatId.myGroupSecret) {\n callback(new Channel({\n key: keypair,\n participants: chatId.participants,\n uuid: chatId.uuid,\n myGroupSecret: chatId.myGroupSecret,\n save: false\n }));\n }\n }\n };\n\n publicState().user().get(`chats`).map().on(handleChannel);\n }\n\n getMyGroupSecret() { // group secret could be deterministic: hash(encryptToSelf(uuid + iterator))\n if (!this.myGroupSecret) {\n this.changeMyGroupSecret();\n }\n return this.myGroupSecret;\n }\n\n async getOurSecretChannelId(pub) {\n if (!this.ourSecretChannelIds[pub]) {\n const secret = await this.getSecret(pub);\n this.ourSecretChannelIds[pub] = await util.getHash(secret + pub);\n }\n return this.ourSecretChannelIds[pub];\n }\n\n async getTheirSecretChannelId(pub) {\n if (!this.theirSecretChannelIds[pub]) {\n const secret = await this.getSecret(pub);\n this.theirSecretChannelIds[pub] = await util.getHash(secret + session.getKey().pub);\n }\n return this.theirSecretChannelIds[pub];\n }\n\n /**\n * Get messages from the channel\n */\n async getMessages(callback) { // TODO: save callback and apply it when new participants are added to channel\n this.getCurrentParticipants().forEach(async pub => {\n if (pub !== session.getKey().pub) {\n // Subscribe to their messages\n let theirSecretChannelId;\n if (this.uuid) {\n theirSecretChannelId = await this.getTheirSecretUuid(pub);\n } else {\n theirSecretChannelId = await this.getTheirSecretChannelId(pub);\n }\n publicState().user(pub).get(`chats`).get(theirSecretChannelId).get(`msgs`).map().once((data, key) => {this.messageReceived(callback, data, this.uuid || pub, false, key, pub);});\n }\n if (!this.uuid) {\n // Subscribe to our messages\n const ourSecretChannelId = await this.getOurSecretChannelId(pub);\n userState().get(`chats`).get(ourSecretChannelId).get(`msgs`).map().once((data, key) => {this.messageReceived(callback, data, pub, true, key, session.getKey().pub);});\n }\n });\n if (this.uuid) {\n // Subscribe to our messages\n const mySecretUuid = await this.getMySecretUuid();\n userState().get(`chats`).get(mySecretUuid).get(`msgs`).map().once((data, key) => {this.messageReceived(callback, data, this.uuid, true, key, session.getKey().pub);});\n }\n }\n\n async messageReceived(callback, data, channelId, selfAuthored, key, from) {\n if (this.messages[key] || !data) {\n return;\n }\n const secret = this.uuid ? (await this.getTheirGroupSecret(from)) : (await this.getSecret(channelId));\n const decrypted = await Gun.SEA.decrypt(data, secret);\n if (typeof decrypted !== `object`) {\n return;\n }\n const info = {selfAuthored, channelId, from};\n this.messages[key] = decrypted;\n callback(decrypted, info);\n }\n\n /**\n * Get latest message in this channel. Useful for channel listing.\n */\n async getLatestMsg(callback) {\n const callbackIfLatest = async (msg, info) => {\n if (!this.latest) {\n this.latest = msg;\n callback(msg, info);\n } else {\n const t = (typeof this.latest.time === `string` ? this.latest.time : this.latest.time.toISOString());\n if (t < msg.time) {\n this.latest = msg;\n callback(msg, info);\n }\n }\n };\n this.onMy('latestMsg', msg => callbackIfLatest(msg, {selfAuthored: true, from: session.getKey().pub}));\n this.onTheir('latestMsg', (msg, k, from) => callbackIfLatest(msg, {selfAuthored: false, from}));\n }\n\n /**\n * Useful for notifications\n * @param {integer} time last seen msg time (default: now)\n */\n async setMyMsgsLastSeenTime(time?: string) {\n time = time || new Date().toISOString();\n return this.put(`msgsLastSeenTime`, time);\n }\n\n /**\n * Useful for notifications\n */\n async getMyMsgsLastSeenTime(callback) {\n this.onMy(`msgsLastSeenTime`, time => {\n this.myMsgsLastSeenTime = time;\n if (callback) {\n callback(this.myMsgsLastSeenTime);\n }\n });\n }\n\n /**\n * For \"seen\" status indicator\n */\n async getTheirMsgsLastSeenTime(callback) {\n this.onTheir(`msgsLastSeenTime`, time => {\n this.theirMsgsLastSeenTime = time;\n if (callback) {\n callback(this.theirMsgsLastSeenTime);\n }\n });\n }\n\n async removeParticipant(pub) {\n this.addParticipant(pub, true, {read: false, write: false});\n }\n\n /**\n * Add a public key to the channel or update its permissions\n * @param {string} pub\n */\n async addParticipant(pub: string, save = true, permissions?: any, subscribe?: boolean) {\n if (this.uuid) {\n return;\n }\n if (permissions === undefined) {\n permissions = DEFAULT_PERMISSIONS;\n }\n if (this.secrets[pub] && JSON.stringify(this.secrets[pub]) === JSON.stringify(permissions)) { // TODO: should be this.participants[pub]\n return;\n }\n this.secrets[pub] = null;\n this.getSecret(pub);\n const ourSecretChannelId = await this.getOurSecretChannelId(pub);\n if (save) {\n // Save their public key in encrypted format, so in channel listing we know who we are channeling with\n const mySecret = await Gun.SEA.secret(session.getKey().epub, session.getKey());\n publicState().user().get(`chats`).get(ourSecretChannelId).get(`pub`).put(await Gun.SEA.encrypt({pub}, mySecret));\n }\n if (this.uuid) {\n this.participants[pub] = permissions;\n if (save) {\n this.putDirect(`S${this.uuid}`, this.getMyGroupSecret());\n this.getMySecretUuid().then(s => {\n this.putDirect(this.uuid, s); // TODO: encrypt keys in put()\n });\n this.onTheirDirect(this.uuid, (s, k, from) => {\n this.theirSecretUuids[from] = s;\n });\n this.onTheirDirect(`S${this.uuid}`, (s, k, from) => {\n this.theirGroupSecrets[from] = s;\n });\n this.save();\n }\n }\n if (subscribe) {\n Object.values(this.directSubscriptions).forEach(arr => {\n arr.forEach(o => {\n if (!o.from || o.from === pub) {\n this._onTheirDirectFromUser(pub, o.key, o.callback);\n }\n });\n });\n Object.values(this.groupSubscriptions).forEach(arr => {\n arr.forEach(o => {\n if (o.from && o.from !== pub) { return; }\n if (permissions.write) {\n this._onTheirGroupFromUser(pub, o.key, o.callback);\n } else { // unsubscribe\n o.event && o.event.off();\n }\n });\n });\n }\n }\n\n /**\n * Send a message to the channel\n * @param msg string or {time, text, ...} object\n */\n async send(msg) {\n if (typeof msg === `string`) {\n msg = msg.trim();\n if (msg.length === 0) {\n return;\n }\n msg = {\n time: (new Date()).toISOString(),\n text: msg\n };\n } else if (typeof msg === `object`) {\n msg.time = msg.time || (new Date()).toISOString();\n } else {\n throw new Error(`msg param must be a string or an object`);\n }\n //publicState().user().get('message').set(temp);\n if (this.uuid) {\n const encrypted = await Gun.SEA.encrypt(JSON.stringify(msg), this.getMyGroupSecret());\n const mySecretUuid = await this.getMySecretUuid();\n userState().get(`chats`).get(mySecretUuid).get(`msgs`).get(`${msg.time}`).put(encrypted);\n userState().get(`chats`).get(mySecretUuid).get(`latestMsg`).put(encrypted);\n } else {\n const keys = this.getCurrentParticipants();\n for (let i = 0;i < keys.length;i++) {\n const encrypted = await Gun.SEA.encrypt(JSON.stringify(msg), (await this.getSecret(keys[i])));\n const ourSecretChannelId = await this.getOurSecretChannelId(keys[i]);\n userState().get(`chats`).get(ourSecretChannelId).get(`msgs`).get(`${msg.time}`).put(encrypted);\n userState().get(`chats`).get(ourSecretChannelId).get(`latestMsg`).put(encrypted);\n }\n }\n }\n\n /**\n * Save the channel to our channels list without sending a message\n */\n async save() {\n if (this.uuid) {\n const mySecretUuid = await this.getMySecretUuid();\n userState().get(`chats`).get(mySecretUuid).get('msgs').get('a').put(null);\n this.put(`participants`, this.participants); // public participants list\n const mySecret = await Gun.SEA.secret(session.getKey().epub, session.getKey());\n userState().get(`chats`).get(mySecretUuid).get(`pub`).put(await Gun.SEA.encrypt({\n uuid: this.uuid,\n myGroupSecret: this.getMyGroupSecret(),\n participants: this.participants // private participants list\n }, mySecret));\n this.participantsChanged();\n } else {\n const keys = this.getCurrentParticipants();\n for (let i = 0;i < keys.length;i++) {\n const ourSecretChannelId = await this.getOurSecretChannelId(keys[i]);\n userState().get(`chats`).get(ourSecretChannelId).get('msgs').get('a').put(null);\n }\n }\n }\n\n /**\n * Save a key-value pair, encrypt value. Each participant in the Channel writes to their own version of the key-value pair — they don't overwrite the same one.\n * @param {string} key\n * @param value\n */\n async put(key, value) {\n return (this.uuid ? this.putGroup : this.putDirect).call(this, key, value);\n }\n\n async putGroup(key, value) {\n if (key === `msgs`) { throw new Error(`Sorry, you can't overwrite the msgs field which is used for .send()`); }\n const encrypted = await Gun.SEA.encrypt(JSON.stringify(value), this.getMyGroupSecret());\n const mySecretUuid = await this.getMySecretUuid();\n userState().get(`chats`).get(mySecretUuid).get(key).put(encrypted);\n }\n\n async putDirect(key, value) {\n if (key === `msgs`) { throw new Error(`Sorry, you can't overwrite the msgs field which is used for .send()`); }\n const keys = this.getCurrentParticipants();\n for (let i = 0;i < keys.length;i++) {\n const encrypted = await Gun.SEA.encrypt(JSON.stringify(value), (await this.getSecret(keys[i])));\n const ourSecretChannelId = await this.getOurSecretChannelId(keys[i]);\n userState().get(`chats`).get(ourSecretChannelId).get(key).put(encrypted);\n }\n }\n\n /**\n * Subscribe to a key-value pair. Callback returns every participant's value unless you limit it with *from* param.\n * @param {string} key\n * @param {function} callback\n * @param {string} from public key whose value you want, or *\"me\"* for your value only, or *\"them\"* for the value of others only\n */\n async on(key: string, callback: Function, from?: string) {\n return (this.uuid ? this.onGroup : this.onDirect).call(this, key, callback, from);\n }\n\n async onDirect(key: string, callback: Function, from?: string) {\n if (!from || from === `me` || from === session.getKey().pub) {\n this.onMy(key, (val: any) => callback(val, session.getKey().pub));\n }\n if (!from || (from !== `me` && from !== session.getKey().pub)) {\n this.onTheir(key, (val: any, k: string, pub: string) => callback(val, pub));\n }\n }\n\n async onGroup(key: string, callback: Function, from?: string) {\n if (!from || from === `me` || from === session.getKey().pub) {\n this.onMyGroup(key, val => callback(val, session.getKey().pub));\n }\n if (!from || (from !== `me` && from !== session.getKey().pub)) {\n this.onTheirGroup(key, (val, k, pub) => callback(val, pub));\n }\n }\n\n async onMy(key: string, callback: Function) {\n return (this.uuid ? this.onMyGroup : this.onMyDirect).call(this, key, callback);\n }\n\n async onMyDirect(key: string, callback: Function) {\n if (typeof callback !== 'function') {\n throw new Error(`onMy callback must be a function, got ${typeof callback}`);\n }\n const keys = this.getCurrentParticipants();\n for (let i = 0;i < keys.length;i++) {\n const ourSecretChannelId = await this.getOurSecretChannelId(keys[i]);\n publicState().user().get(`chats`).get(ourSecretChannelId).get(key).on(async (data: any) => {\n const decrypted = await Gun.SEA.decrypt(data, (await this.getSecret(keys[i])));\n if (decrypted) {\n callback(typeof decrypted.v !== `undefined` ? decrypted.v : decrypted, key);\n }\n });\n break;\n }\n }\n\n async onMyGroup(key, callback) {\n if (typeof callback !== 'function') {\n throw new Error(`onMy callback must be a function, got ${typeof callback}`);\n }\n const mySecretUuid = await this.getMySecretUuid();\n const mySecret = await this.getMyGroupSecret();\n publicState().user().get(`chats`).get(mySecretUuid).get(key).on(async data => {\n const decrypted = await Gun.SEA.decrypt(data, mySecret);\n if (decrypted) {\n callback(typeof decrypted.v !== `undefined` ? decrypted.v : decrypted, key, session.getKey().pub);\n }\n });\n }\n\n async onTheir(key: string, callback: Function, from: string) {\n return (this.uuid ? this.onTheirGroup : this.onTheirDirect).call(this, key, callback, from);\n }\n\n async _onTheirDirectFromUser(key: string, callback: Function, pub: string) {\n if (!this.hasWritePermission(pub)) { return; }\n const theirSecretChannelId = await this.getTheirSecretChannelId(pub);\n publicState().user(pub).get(`chats`).get(theirSecretChannelId).get(key).on(async (data: any) => {\n if (!this.hasWritePermission(pub)) { return; }\n const decrypted = await Gun.SEA.decrypt(data, (await this.getSecret(pub)));\n if (decrypted) {\n callback(typeof decrypted.v !== `undefined` ? decrypted.v : decrypted, key, pub);\n }\n });\n }\n\n async onTheirDirect(key: string, callback: Function, from: string) { // TODO: subscribe to new channel participants\n if (typeof callback !== 'function') {\n throw new Error(`onTheir callback must be a function, got ${typeof callback}`);\n }\n if (!Object.prototype.hasOwnProperty.call(this.directSubscriptions, key)) {\n this.directSubscriptions[key] = [];\n }\n this.directSubscriptions[key].push({key, callback, from});\n const participants = this.getCurrentParticipants();\n participants.forEach(async pub => {\n if (from && pub !== from) { return; }\n this._onTheirDirectFromUser(pub, key, callback);\n });\n }\n\n hasWritePermission(pub) {\n return !this.uuid || (this.participants && this.participants[pub] && this.participants[pub].write);\n }\n\n async _onTheirGroupFromUser(pub: string, key: string, callback: Function, subscription: any) {\n if (!this.hasWritePermission(pub)) { return; }\n const theirSecretUuid = await this.getTheirSecretUuid(pub);\n publicState().user(pub).get(`chats`).get(theirSecretUuid).get(key).on(async (data: any, _a: any, _b: any, e: Event) => {\n if (subscription) { subscription.event = e; }\n if (!this.hasWritePermission(pub)) { return; }\n const decrypted = await Gun.SEA.decrypt(data, (await this.getTheirGroupSecret(pub)));\n if (decrypted) {\n callback(typeof decrypted.v !== `undefined` ? decrypted.v : decrypted, key, pub);\n }\n });\n }\n\n async onTheirGroup(key, callback, from) {\n if (typeof callback !== 'function') {\n throw new Error(`onTheir callback must be a function, got ${typeof callback}`);\n }\n if (!Object.prototype.hasOwnProperty.call(this.groupSubscriptions, key)) {\n this.groupSubscriptions[key] = [];\n }\n const subscription = {key, callback, from};\n this.groupSubscriptions[key].push(subscription);\n\n this.getParticipants(participants => {\n Object.keys(participants).forEach(async pub => {\n if (from && pub !== from) { return; }\n if (!(participants[pub] && participants[pub].write)) { return; }\n this._onTheirGroupFromUser(pub, key, callback, subscription);\n });\n });\n }\n\n /**\n * Set typing status\n */\n setTyping(isTyping, timeout = 5) {\n isTyping = typeof isTyping === `undefined` ? true : isTyping;\n timeout = timeout * 1000;\n this.put(`typing`, isTyping ? new Date().toISOString() : new Date(0).toISOString());\n clearTimeout(this.setTypingTimeout);\n this.setTypingTimeout = setTimeout(() => this.put(`typing`, false), timeout);\n }\n\n /**\n * Get typing status\n */\n getTyping(callback, timeout = 5) { // TODO callback not called on setTyping(false), at least for self chat\n timeout = timeout * 1000;\n this.onTheir(`typing`, (typing, key, pub) => {\n if (callback) {\n const isTyping = typing && new Date() - new Date(typing) <= timeout;\n callback(isTyping, pub);\n this.getTypingTimeouts = this.getTypingTimeouts || {};\n clearTimeout(this.getTypingTimeouts[pub]);\n if (isTyping) {\n this.getTypingTimeouts[pub] = setTimeout(() => callback(false, pub), timeout);\n }\n }\n });\n }\n\n /**\n * Add a chat button to page\n * @param options {label, channelOptions}\n */\n static addChatButton(options = {}) {\n options = Object.assign({label: 'Chat'}, options);\n if (!options.channelOptions) {\n throw new Error('addChatButton missing options.channelOptions param');\n }\n util.injectCss();\n let channel, box;\n const btn = util.createElement('div', 'iris-chat-open-button', document.body);\n btn.setAttribute('id', 'iris-chat-open-button');\n btn.innerHTML = ` ${options.label}`;\n btn.addEventListener('click', () => {\n btn.setAttribute('style', 'display: none');\n if (!channel) {\n channel = new Channel(options.channelOptions);\n box = channel.getChatBox();\n document.body.appendChild(box);\n } else {\n box.setAttribute('style', ''); // show\n }\n });\n }\n\n /**\n * Get a simple link that points to the channel.\n *\n * Direct channel: both users need to give their simple links. Use createChatLink() to get a two-way link that needs to be given by one user only.\n *\n * Group channel: Works only if the link recipient has been already added onto the channel participants list.\n */\n getSimpleLink(urlRoot = 'https://iris.to/') {\n if (this.uuid) {\n return `${urlRoot}?channelId=${this.uuid}&inviter=${session.getKey().pub}`;\n }\n return `${urlRoot}?chatWith=${this.getCurrentParticipants()[0]}`;\n }\n\n /**\n *\n */\n async getChatLinks(opts: any = {}) {\n let {callback, urlRoot, subscribe} = opts;\n urlRoot = urlRoot || 'https://iris.to/';\n if (!this.uuid) { throw new Error('Only group channels may have chat links'); }\n const chatLinks: any[] = [];\n const chatLinkSubscriptions = {};\n this.on('chatLinks', (links: any, from: string) => {\n // TODO: check admin permissions\n if (!links || typeof links !== 'object') { return; }\n Object.keys(links).forEach(linkId => {\n const link = links[linkId];\n if (link === null) {\n chatLinkSubscriptions[linkId] && chatLinkSubscriptions[linkId].off(); // unsubscribe removed chat link\n delete chatLinkSubscriptions[linkId];\n callback && callback({id: linkId, url: null});\n return;\n }\n if (chatLinks.indexOf(linkId) !== -1) { return; }\n const channels = [];\n chatLinks.push(linkId);\n const url = Channel.formatChatLink({urlRoot, inviter: from, channelId: this.uuid, sharedSecret: link.sharedSecret, linkId});\n callback && callback({url, id: linkId});\n if (subscribe) {\n publicState().user(link.sharedKey.pub).get('chatRequests').map().on(async (encPub, requestId, a, e) => {\n if (!encPub || typeof encPub !== 'string' || encPub.length < 10) { return; }\n chatLinkSubscriptions[linkId] = e;\n const s = JSON.stringify(encPub);\n if (channels.indexOf(s) === -1) {\n channels.push(s);\n const pub = await Gun.SEA.decrypt(encPub, link.sharedSecret);\n this.addParticipant(pub, undefined, undefined, true);\n }\n });\n }\n });\n });\n }\n\n async createChatLink(urlRoot = 'https://iris.to/') {\n const sharedKey = await Gun.SEA.pair();\n const sharedKeyString = JSON.stringify(sharedKey);\n const sharedSecret = await Gun.SEA.secret(sharedKey.epub, sharedKey);\n const encryptedSharedKey = await Gun.SEA.encrypt(sharedKeyString, sharedSecret);\n const ownerSecret = await Gun.SEA.secret(session.getKey().epub, session.getKey());\n const ownerEncryptedSharedKey = await Gun.SEA.encrypt(sharedKeyString, ownerSecret);\n let linkId = await util.getHash(encryptedSharedKey);\n linkId = linkId.slice(0, 12);\n\n // User has to exist, in order for .get(chatRequests).on() to be ever triggered\n await util.gunAsAnotherUser(publicState(), sharedKey, user => {\n return user.get('chatRequests').put({a: 1}).then();\n });\n\n this.chatLinks[linkId] = {sharedKey, sharedSecret};\n this.put('chatLinks', this.chatLinks);\n userState().get('chatLinks').get(linkId).put({encryptedSharedKey, ownerEncryptedSharedKey});\n\n return Channel.formatChatLink({urlRoot, channelId: this.uuid, inviter: session.getKey().pub, sharedSecret, linkId});\n }\n\n /**\n * Get a channel box element that you can add to your page\n */\n getChatBox() {\n util.injectCss();\n let minimized = false;\n\n const chatBox = util.createElement('div', 'iris-chat-box');\n const header = util.createElement('div', 'iris-chat-header', chatBox);\n const minimize = util.createElement('span', 'iris-chat-minimize', header);\n minimize.innerText = '—';\n minimize.addEventListener('click', e => {\n e.stopPropagation();\n chatBox.setAttribute('class', 'iris-chat-box minimized');\n minimized = true;\n });\n const headerText = util.createElement('div', 'iris-chat-header-text', header);\n const onlineIndicator = util.createElement('span', 'iris-online-indicator', headerText);\n onlineIndicator.innerHTML = '●';\n const nameEl = util.createElement('span', undefined, headerText);\n const close = util.createElement('span', 'iris-chat-close', header);\n close.innerHTML = '×';\n close.addEventListener('click', () => {\n chatBox.setAttribute('style', 'display: none');\n const openChatBtn = document.getElementById('iris-chat-open-button');\n if (openChatBtn) {\n openChatBtn.setAttribute('style', ''); // show\n }\n });\n header.addEventListener('click', () => {\n if (minimized) {\n chatBox.setAttribute('class', 'iris-chat-box');\n minimized = false;\n }\n });\n\n const messages = util.createElement('div', 'iris-chat-messages', chatBox);\n\n const typingIndicator = util.createElement('div', 'iris-typing-indicator', chatBox);\n typingIndicator.innerText = 'typing...';\n this.getTyping(isTyping => {\n typingIndicator.setAttribute('class', `iris-typing-indicator${ isTyping ? ' yes' : ''}`);\n });\n\n const inputWrapper = util.createElement('div', 'iris-chat-input-wrapper', chatBox);\n const textArea = util.createElement('textarea', undefined, inputWrapper);\n textArea.setAttribute('rows', '1');\n textArea.setAttribute('placeholder', 'Type a message');\n if (util.isMobile) {\n const sendBtn = util.createElement('button', undefined, inputWrapper);\n sendBtn.innerHTML = `\n \n `;\n sendBtn.addEventListener('click', () => {\n this.send(textArea.value);\n textArea.value = '';\n this.setTyping(false);\n });\n }\n\n const participants = this.getCurrentParticipants();\n if (participants.length) {\n const pub = participants[0];\n publicState().user(pub).get('profile').get('name').on(name => nameEl.innerText = name);\n Channel.getActivity(publicState(), pub, status => {\n const cls = `iris-online-indicator${ status.isActive ? ' yes' : ''}`;\n onlineIndicator.setAttribute('class', cls);\n const undelivered = messages.querySelectorAll('.iris-chat-message:not(.delivered)');\n undelivered.forEach(msg => {\n if (msg.getAttribute('data-time') <= status.lastActive) {\n const c = msg.getAttribute('class');\n msg.setAttribute('class', `${c } delivered`);\n }\n });\n });\n }\n\n this.getTheirMsgsLastSeenTime(time => {\n const unseen = messages.querySelectorAll('.iris-seen:not(.yes)');\n unseen.forEach(indicator => {\n const msgEl = indicator.parentElement.parentElement.parentElement;\n if (msgEl.getAttribute('data-time') <= time) {\n const msgClass = msgEl.getAttribute('class');\n if (msgClass.indexOf('delivered') === -1) {\n msgEl.setAttribute('class', `${msgClass } delivered`);\n }\n indicator.setAttribute('class', 'iris-seen yes');\n }\n });\n });\n\n this.getMessages((msg, info) => {\n const msgContent = util.createElement('div', 'iris-msg-content');\n msgContent.innerText = msg.text;\n const time = util.createElement('div', 'time', msgContent);\n time.innerText = util.formatTime(new Date(msg.time));\n if (info.selfAuthored) {\n const cls = this.theirMsgsLastSeenTime >= msg.time ? 'iris-seen yes' : 'iris-seen';\n const seenIndicator = util.createElement('span', cls, time);\n seenIndicator.innerHTML = ' ';\n }\n msgContent.innerHTML = msgContent.innerHTML.replace(/\\n/g, '
\\n');\n\n const msgEl = util.createElement('div', `${info.selfAuthored ? 'our' : 'their'} iris-chat-message`);\n msgEl.appendChild(msgContent);\n msgEl.setAttribute('data-time', msg.time);\n for (let i = messages.children.length; i >= 0; i--) {\n if (i === 0) {\n messages.insertBefore(msgEl, messages.firstChild);\n } else {\n const t = messages.children[i - 1].getAttribute('data-time');\n if (t && t < msg.time) {\n messages.children[i - 1].insertAdjacentElement('afterend', msgEl);\n break;\n }\n }\n }\n messages.scrollTop = messages.scrollHeight;\n });\n\n textArea.addEventListener('keyup', event => {\n Channel.setActivity(publicState(), true); // TODO\n this.setMyMsgsLastSeenTime(); // TODO\n if (event.keyCode === 13) {\n event.preventDefault();\n const content = textArea.value;\n const caret = util.getCaret(textArea);\n if (event.shiftKey) {\n textArea.value = `${content.substring(0, caret - 1) }\\n${ content.substring(caret, content.length)}`;\n } else {\n textArea.value = content.substring(0, caret - 1) + content.substring(caret, content.length);\n this.send(textArea.value);\n textArea.value = '';\n this.setTyping(false);\n }\n } else {\n this.setTyping(!!textArea.value.length);\n }\n });\n\n return chatBox;\n }\n\n /**\n * Set the user's online/active status\n * @param {string} activity string: set the activity status every 3 seconds, null/false: stop updating\n */\n static setActivity(activity) {\n if (publicState().irisActivityStatus === activity) { return; }\n publicState().irisActivityStatus = activity;\n clearTimeout(publicState().setActivityTimeout);\n const update = () => {\n publicState().user().get(`activity`).put({status: activity, time: new Date(Gun.state()).toISOString()});\n };\n update();\n function timerUpdate() {\n update();\n publicState().setActivityTimeout = setTimeout(timerUpdate, 3000);\n }\n if (activity) {\n timerUpdate();\n }\n }\n\n /**\n * Get the online status of a user.\n *\n * @param {string} pubKey public key of the user\n * @param {boolean} callback receives a boolean each time the user's online status changes\n */\n static getActivity(pubKey, callback) {\n let timeout;\n publicState().user(pubKey).get(`activity`).on(activity => {\n if (!activity || !(activity.time && activity.status)) { return; }\n clearTimeout(timeout);\n const now = new Date(Gun.state());\n const activityDate = new Date(activity.time);\n const isActive = activityDate > new Date(now.getTime() - 10 * 1000) && activityDate < new Date(now.getTime() + 30 * 1000);\n callback({isActive, lastActive: activity.time, status: activity.status});\n if (isActive) {\n timeout = setTimeout(() => callback({isOnline: false, lastActive: activity.time}), 10000);\n }\n });\n }\n\n static formatChatLink({urlRoot, chatWith, channelId, inviter, sharedSecret, linkId}) {\n const enc = encodeURIComponent;\n if (channelId && inviter) {\n return `${urlRoot}?channelId=${enc(channelId)}&inviter=${enc(inviter)}&s=${enc(sharedSecret)}&k=${enc(linkId)}`;\n }\n return `${urlRoot}?chatWith=${enc(chatWith)}&s=${enc(sharedSecret)}&k=${enc(linkId)}`;\n }\n\n /**\n * Creates a channel link that can be used for two-way communication, i.e. only one link needs to be exchanged.\n */\n static async createChatLink(urlRoot = 'https://iris.to/') {\n const user = publicState().user();\n const key = session.getKey();\n\n // We create a new Gun user whose private key is shared with the chat link recipients.\n // Chat link recipients can contact you by writing their public key to the shared key's user space.\n const sharedKey = await Gun.SEA.pair();\n const sharedKeyString = JSON.stringify(sharedKey);\n const sharedSecret = await Gun.SEA.secret(sharedKey.epub, sharedKey);\n const encryptedSharedKey = await Gun.SEA.encrypt(sharedKeyString, sharedSecret);\n const ownerSecret = await Gun.SEA.secret(key.epub, key);\n const ownerEncryptedSharedKey = await Gun.SEA.encrypt(sharedKeyString, ownerSecret);\n let linkId = await util.getHash(encryptedSharedKey);\n linkId = linkId.slice(0, 12);\n\n // User has to exist, in order for .get(chatRequests).on() to be ever triggered\n util.gunAsAnotherUser(publicState(), sharedKey, user => {\n user.get('chatRequests').put({a: 1});\n });\n\n user.get('chatLinks').get(linkId).put({encryptedSharedKey, ownerEncryptedSharedKey});\n\n return Channel.formatChatLink({urlRoot, chatWith: key.pub, sharedSecret, linkId});\n }\n\n /**\n *\n */\n static async getMyChatLinks(urlRoot = 'https://iris.to/', callback: Function, subscribe = false) {\n const key = session.getKey();\n const user = publicState().user();\n const mySecret = await Gun.SEA.secret(key.epub, key);\n const chatLinks = [];\n user.get('chatLinks').map().on((data, linkId) => {\n if (!data || chatLinks.indexOf(linkId) !== -1) { return; }\n const channels = [];\n user.get('chatLinks').get(linkId).get('ownerEncryptedSharedKey').on(async enc => {\n if (!enc || chatLinks.indexOf(linkId) !== -1) { return; }\n chatLinks.push(linkId);\n const sharedKey = await Gun.SEA.decrypt(enc, mySecret);\n const sharedSecret = await Gun.SEA.secret(sharedKey.epub, sharedKey);\n const url = Channel.formatChatLink({urlRoot, chatWith: key.pub, sharedSecret, linkId});\n if (callback) {\n callback({url, id: linkId});\n }\n if (subscribe) {\n publicState().user(sharedKey.pub).get('chatRequests').map().on(async (encPub, requestId) => {\n if (!encPub) { return; }\n const s = JSON.stringify(encPub);\n if (channels.indexOf(s) === -1) {\n channels.push(s);\n const pub = await Gun.SEA.decrypt(encPub, sharedSecret);\n const channel = new Channel({key, participants: pub});\n channel.save();\n }\n util.gunAsAnotherUser(publicState(), sharedKey, user => { // remove the channel request after reading\n user.get('chatRequests').get(requestId).put(null);\n });\n });\n }\n });\n });\n }\n\n /**\n *\n */\n removeGroupChatLink(linkId) {\n this.chatLinks[linkId] = null;\n this.put('chatLinks', this.chatLinks);\n publicState().user().get('chatLinks').get(linkId).put(null);\n }\n\n /**\n *\n */\n static removePrivateChatLink(key, linkId) {\n publicState().user().auth(key);\n publicState().user().get('chatLinks').get(linkId).put(null);\n }\n\n /**\n *\n */\n static async deleteChannel(key, pub) {\n publicState().user().auth(key);\n const channelId = await Channel.getOurSecretChannelId(pub, key);\n publicState().user().get('channels').get(channelId).put(null);\n publicState().user().get('channels').get(channelId).off();\n }\n\n /**\n *\n */\n static async deleteGroup(key, uuid) {\n const mySecret = await Gun.SEA.secret(key.epub, key);\n const mySecretHash = await util.getHash(mySecret);\n const mySecretUuid = await util.getHash(mySecretHash + uuid);\n publicState().user().auth(key);\n publicState().user().get('channels').get(mySecretUuid).put(null);\n publicState().user().get('channels').get(mySecretUuid).off();\n }\n}\n\nexport default Channel;\n","import Channel from './Channel';\nimport session from './session';\n\nconst channels = new Map();\n\n/**\n * Private channel that only you and publicKey can read/write.\n * @param publicKey\n * @returns {Channel}\n */\nexport default function(publicKey = session.getKey(), chatLink?: string): Channel {\n let channel = channels.get(publicKey);\n if (!channel) {\n channel = new Channel({participants: publicKey, chatLink})\n channels.set(publicKey, channel);\n }\n return channel;\n}","// @ts-nocheck\n\nimport localForage from 'localforage';\nimport _ from './lodash';\n\ntype MyEventListener = {\n off: Function\n};\n\n// Localforage returns null if an item is not found, so we represent null with this uuid instead.\n// not foolproof, but good enough for now.\nconst LOCALFORAGE_NULL = \"c2fc1ad0-f76f-11ec-b939-0242ac120002\";\nconst notInLocalForage = new Set();\n\nlocalForage.config({\n driver: [localForage.LOCALSTORAGE, localForage.INDEXEDDB, localForage.WEBSQL]\n})\n\n/**\n Our very own implementation of the Gun API\n */\nexport default class Node {\n id: string;\n parent: Node | null;\n children = new Map();\n on_subscriptions = new Map();\n map_subscriptions = new Map();\n value: any = undefined;\n counter = 0;\n loaded = false;\n\n /** */\n constructor(id: string = '', parent: Node|null = null) {\n this.id = id;\n this.parent = parent;\n }\n\n saveLocalForage = _.throttle(async () => {\n if (!this.loaded) {\n await this.loadLocalForage();\n }\n if (this.children.size) {\n const children = Array.from(this.children.keys());\n localForage.setItem(this.id, children);\n } else if (this.value === undefined) {\n localForage.removeItem(this.id);\n } else {\n localForage.setItem(this.id, this.value === null ? LOCALFORAGE_NULL : this.value);\n }\n }, 500);\n\n loadLocalForage = _.throttle(async () => {\n if (notInLocalForage.has(this.id)) {\n return undefined;\n }\n // try to get the value from localforage\n let result = await localForage.getItem(this.id);\n // getItem returns null if not found\n if (result === null) {\n result = undefined;\n notInLocalForage.add(this.id);\n } else if (result === LOCALFORAGE_NULL) {\n result = null;\n } else if (Array.isArray(result)) {\n // result is a list of children\n const newResult = {};\n await Promise.all(result.map(async key => {\n newResult[key] = await this.get(key).once();\n }));\n result = newResult;\n } else {\n // result is a value\n this.value = result;\n }\n this.loaded = true;\n return result;\n }, 500);\n\n doCallbacks = _.throttle(() => {\n for (const [id, callback] of this.on_subscriptions) {\n const event = { off: () => this.on_subscriptions.delete(id) };\n this.once(callback, event, false);\n }\n if (this.parent) {\n for (const [id, callback] of this.parent.on_subscriptions) {\n const event = { off: () => this.parent.on_subscriptions.delete(id) };\n this.parent.once(callback, event, false);\n }\n for (const [id, callback] of this.parent.map_subscriptions) {\n const event = { off: () => this.parent.map_subscriptions.delete(id) };\n this.once(callback, event, false);\n }\n }\n }, 40);\n\n /**\n *\n * @param key\n * @returns {Node}\n * @example node.get('users').get('alice').put({name: 'Alice'})\n */\n get(key) {\n const existing = this.children.get(key);\n if (existing) {\n return existing;\n }\n const new_node = new Node(`${this.id}/${key}`, this);\n this.children.set(key, new_node);\n this.saveLocalForage();\n return new_node;\n }\n\n /**\n * Set a value to the node. If the value is an object, it will be converted to child nodes.\n * @param value\n * @example node.get('users').get('alice').put({name: 'Alice'})\n */\n put(value) {\n if (Array.isArray(value)) {\n throw new Error('Sorry, we don\\'t deal with arrays');\n }\n if (typeof value === 'object' && value !== null) {\n this.value = undefined;\n for (const key in value) {\n this.get(key).put(value[key]);\n }\n _.defer(() => this.doCallbacks(), 100);\n return;\n }\n this.children = new Map();\n this.value = value;\n this.doCallbacks();\n this.saveLocalForage();\n }\n\n // protip: the code would be a lot cleaner if you separated the Node API from storage adapters.\n /**\n * Return a value without subscribing to it\n * @param callback\n * @param event\n * @param returnIfUndefined\n * @returns {Promise<*>}\n */\n async once(callback?: Function, event?: MyEventListener, returnIfUndefined = true): Promise {\n let result: any;\n if (this.children.size) {\n // return an object containing all children\n result = {};\n await Promise.all(Array.from(this.children.keys()).map(async key => {\n result[key] = await this.get(key).once(undefined, event);\n }));\n } else if (this.value !== undefined) {\n result = this.value;\n } else {\n result = await this.loadLocalForage();\n }\n if (result !== undefined || returnIfUndefined) {\n callback && callback(result, this.id.slice(this.id.lastIndexOf('/') + 1), null, event);\n return result;\n }\n }\n\n /**\n * Subscribe to a value\n * @param callback\n */\n on(callback: Function): void {\n const id = this.counter++;\n this.on_subscriptions.set(id, callback);\n const event = { off: () => this.on_subscriptions.delete(id) };\n this.once(callback, event, false);\n }\n\n /**\n * Subscribe to the children of a node. Callback is called separately for each child.\n * @param callback\n * @returns {Promise}\n */\n async map(callback: Function) {\n const id = this.counter++;\n this.map_subscriptions.set(id, callback);\n const event = { off: () => this.map_subscriptions.delete(id) };\n if (!this.loaded) {\n // ensure that the list of children is loaded\n await this.loadLocalForage();\n }\n for (const child of this.children.values()) {\n child.once(callback, event, false);\n }\n }\n}","import Node from './Node';\n\nlet local: Node;\n\n/**\n * Get a state that is only synced in memory and local storage.\n *\n * Useful for storing things like UI state, local indexes or logged in user.\n * @returns {Node}\n */\nexport default function() {\n if (!local) {\n local = new Node();\n }\n return local;\n}","import local from './local';\n\nlet blockedUsers: { [key: string]: boolean } = {};\n\nexport default function() {\n if (!blockedUsers) {\n blockedUsers = {};\n local().get('block').map((isBlocked: boolean, user: string) => {\n if (isBlocked === blockedUsers[user]) { return; }\n if (isBlocked) {\n blockedUsers[user] = isBlocked;\n local().get('groups').map((_v: any, k: string) => {\n local().get('groups').get(k).get(user).put(false);\n });\n } else {\n delete blockedUsers[user];\n }\n });\n }\n return blockedUsers;\n}","import local from \"./local\";\nimport userSpace from './public';\nimport blockedUsers from './blockedUsers';\n\nlet counter = 0;\nconst cache = new Map>();\nconst callbacks = new Map();\n\ntype Event = {\n off: () => void;\n}\n\n/**\n * Aggregates public data from all users in the group.\n *\n * For example, the public message feed, message replies and likes are aggregated using this.\n * @param groupName\n * @returns object\n */\nexport default function(groupName = 'everyone') {\n return {\n get(path: string, callback: any) {\n const groupNode = local().get('groups').get(groupName);\n const follows: { [key: string]: boolean; } = {};\n requestAnimationFrame(() => {\n groupNode.map((isFollowing: any, user: string) => {\n if (blockedUsers()[user]) { return; } // TODO: allow to specifically query blocked users?\n if (follows[user] && follows[user] === isFollowing) { return; }\n follows[user] = isFollowing;\n if (isFollowing) { // TODO: callback on unfollow, for unsubscribe\n let node = userSpace(user);\n if (path && path !== '/') {\n node = path.split('/').reduce((sum:any, s:string) => sum.get(decodeURIComponent(s)), node);\n }\n callback(node, user);\n }\n });\n });\n },\n\n _cached_map(cached: Map | undefined, cacheKey: string, path: string, myEvent: Event, callback: Function) {\n if (!cached) {\n const cached = new Map();\n cache.set(cacheKey, cached);\n this.get(path, (node: any, from: string) => node.map((value: any, key: string, x: any) => {\n const item = {value, key, from};\n cached.set(key, item);\n for (let cb of callbacks.get(cacheKey).values()) {\n cb(value, key, x, myEvent, from);\n }\n }));\n } else {\n for (let item of cached.values()) {\n callback(item.value, item.key, 0, myEvent, item.from);\n }\n }\n },\n\n // TODO: this should probably store just the most recent value, not everyone's value\n // TODO: for counting of likes etc, use this.count() instead\n _cached_on(cached: Map | undefined, cacheKey: string, path: string, myEvent: Event, callback: Function) {\n if (!cached) {\n const cached = new Map();\n cache.set(cacheKey, cached);\n this.get(path, (node: any, from: string) => node.on((value: any, key: string, x: any) => {\n const item = {value, key, from};\n cached.set(from, item);\n for (let cb of callbacks.get(cacheKey).values()) {\n cb(value, key, x, myEvent, from);\n }\n }));\n } else {\n for (let item of cached.values()) {\n callback(item.value, item.key, 0, myEvent, item.from);\n }\n }\n },\n\n _cached_count(cached: Map | undefined, cacheKey: string, path: string, myEvent: Event, callback: Function) {\n if (!cached) {\n const cached = new Map();\n cache.set(cacheKey, cached);\n this.get(path, (node: any, from: string) => node.on((value: any, key: string) => {\n value ? cached.set(from, true) : cached.delete(from);\n const count = cached.size;\n for (let cb of callbacks.get(cacheKey).values()) {\n cb(count, key, null, myEvent, from);\n }\n }));\n } else {\n callback(cached.size, path.split('/').pop(), null, myEvent);\n }\n },\n\n _cached_fn(fn: string, path: string, callback: Function) {\n const cacheKey = `${fn}:${groupName}:${path}`;\n\n let callbackId = counter++;\n if (callbacks.has(cacheKey)) {\n callbacks.get(cacheKey).set(callbackId, callback);\n } else {\n callbacks.set(cacheKey, new Map([[callbackId, callback]]));\n }\n\n const myEvent = {off: () => {\n let myCallbacks = callbacks.get(cacheKey);\n myCallbacks && myCallbacks.delete(callbackId);\n }};\n\n const cached = cache.get(cacheKey);\n\n switch (fn) {\n case 'map':\n this._cached_map(cached, cacheKey, path, myEvent, callback);\n break;\n case 'on':\n this._cached_on(cached, cacheKey, path, myEvent, callback);\n break;\n case 'count':\n this._cached_count(cached, cacheKey, path, myEvent, callback);\n break;\n }\n },\n\n map(path: string, callback: Function) { // group queries are slow, so we cache them\n this._cached_fn('map', path, callback);\n },\n\n on(path: string, callback: Function) {\n this._cached_fn('on', path, callback);\n },\n\n count(path: string, callback: Function) {\n this._cached_fn('count', path, callback);\n }\n }\n}","// @ts-nocheck\n\nimport _ from './lodash';\nimport Gun from 'gun';\n\nimport session from './session';\nimport util from './util';\nimport publicState from './global';\nimport privateState from './private';\nimport local from './local';\nimport group from './group';\n\nconst NOTIFICATION_SERVICE_URL = 'https://iris-notifications.herokuapp.com/notify';\n// const notificationSound = new Audio('../../assets/audio/notification.mp3'); // TODO\nlet loginTime;\nlet unseenMsgsTotal = 0;\nlet unseenNotificationCount = 0;\nconst webPushSubscriptions = {};\n\nfunction desktopNotificationsEnabled() {\n return window.Notification && Notification.permission === 'granted';\n}\n\nfunction notifyMsg(msg, info, channelId, onClick) {\n function shouldNotify() {\n if (msg.timeObj < loginTime) { return false; }\n if (info.selfAuthored) { return false; }\n if (document.visibilityState === 'visible') { return false; }\n const channel = privateState(channelId);\n if (channel.notificationSetting === 'nothing') { return false; }\n if (channel.notificationSetting === 'mentions' && !msg.text.includes(session.getMyName())) { return false; }\n return true;\n }\n function shouldDesktopNotify() {\n if (!desktopNotificationsEnabled()) { return false; }\n return shouldNotify();\n }\n function shouldAudioNotify() {\n return shouldNotify();\n }\n if (shouldAudioNotify()) {\n //notificationSound.play(); // TODO\n }\n if (shouldDesktopNotify()) {\n let body, title;\n const channel = privateState(channelId);\n if (channel.uuid) {\n title = channel.participantProfiles[info.from].name;\n body = `${name}: ${msg.text}`;\n } else {\n title = 'Message'\n body = msg.text;\n }\n body = util.truncateString(body, 50);\n let desktopNotification = new Notification(title, { // TODO: replace with actual name\n icon: '/assets/img/icon128.png',\n body,\n silent: true\n });\n desktopNotification.onclick = function() {\n changeUnseenNotificationCount(-1);\n onClick && onClick();\n window.focus();\n };\n }\n}\n\nfunction changeChatUnseenMsgsCount(chatId, change) {\n const chat = privateState(chatId);\n if (!chat) return;\n const chatNode = local().get('channels').get(chatId);\n if (change) {\n unseenMsgsTotal += change;\n chat.unseen += change;\n } else {\n unseenMsgsTotal = unseenMsgsTotal - (chat.unseen || 0);\n chat.unseen = 0;\n }\n chatNode.get('unseen').put(chat.unseen);\n unseenMsgsTotal = unseenMsgsTotal >= 0 ? unseenMsgsTotal : 0;\n local().get('unseenMsgsTotal').put(unseenMsgsTotal);\n}\n\nconst publicVapidKey = 'BMqSvZArOIdn7vGkYplSpkZ70-Qt8nhYbey26WVa3LF3SwzblSzm3n3HHycpNkAKVq7MCkrzFuTFs_en7Y_J2MI';\n\nfunction urlBase64ToUint8Array(base64String) {\n const padding = '='.repeat((4 - base64String.length % 4) % 4);\n const base64 = (base64String + padding)\n .replace(/-/g, '+')\n .replace(/_/g, '/');\n\n const rawData = window.atob(base64);\n const outputArray = new Uint8Array(rawData.length);\n\n for (let i = 0; i < rawData.length; ++i) {\n outputArray[i] = rawData.charCodeAt(i);\n }\n return outputArray;\n}\n\nasync function subscribe(reg) {\n try {\n const subscription = await reg.pushManager.subscribe({\n userVisibleOnly: true,\n applicationServerKey: urlBase64ToUint8Array(publicVapidKey)\n });\n addWebPushSubscription(subscription);\n } catch (e) {\n console.error('web push subscription error', e);\n }\n}\n\nasync function subscribeToWebPush() {\n console.log('subscribing to web push', navigator.serviceWorker);\n if (!desktopNotificationsEnabled() || !navigator.serviceWorker) { return false; }\n await navigator.serviceWorker.ready;\n const reg = await navigator.serviceWorker.getRegistration();\n reg.active.postMessage({key: session.getKey()});\n const sub = await reg.pushManager.getSubscription();\n sub ? addWebPushSubscription(sub) : subscribe(reg);\n}\n\nconst addWebPushSubscriptionsToChats = _.debounce(() => {\n const arr = Object.values(webPushSubscriptions);\n session.channelIds.forEach(channelId => {\n privateState(channelId).put('webPushSubscriptions', arr);\n });\n}, 5000);\n\nfunction removeSubscription(hash) {\n delete webPushSubscriptions[hash];\n publicState().user().get('webPushSubscriptions').get(hash).put(null);\n addWebPushSubscriptionsToChats();\n}\n\nasync function addWebPushSubscription(s, saveToGun = true) {\n const myKey = session.getKey();\n const mySecret = await Gun.SEA.secret(myKey.epub, myKey);\n const enc = await Gun.SEA.encrypt(s, mySecret);\n const hash = await util.getHash(JSON.stringify(s));\n if (saveToGun) {\n publicState().user().get('webPushSubscriptions').get(hash).put(enc);\n }\n webPushSubscriptions[hash] = s;\n addWebPushSubscriptionsToChats();\n}\n\nasync function getWebPushSubscriptions() {\n const myKey = session.getKey();\n const mySecret = await Gun.SEA.secret(myKey.epub, myKey);\n publicState().user().get('webPushSubscriptions').map().on(async enc => {\n if (!enc) { return; }\n const s = await Gun.SEA.decrypt(enc, mySecret);\n addWebPushSubscription(s, false);\n });\n}\n\nfunction getEpub(user) {\n return new Promise(resolve => {\n publicState().user(user).get('epub').on(async (epub,k,x,e) => {\n if (epub) {\n e.off();\n resolve(epub);\n }\n });\n });\n}\n\nasync function getNotificationText(notification) {\n const profile = await publicState().user(notification.from).get('profile').once();\n const name = (profile && profile.name) || 'someone';\n const event = notification.event || notification.action;\n let eventText;\n if (event === 'like') eventText = `${name} liked your post`;\n else if (event === 'reply') eventText = `${name} replied to your post`;\n else if (event === 'mention') eventText = `${name} mentioned you in their post`;\n else if (event === 'follow') eventText = `${name} started following you`;\n else eventText = `${name} sent you a notification: ${event}`;\n return eventText;\n}\n\nfunction subscribeToIrisNotifications(onClick?: Function) {\n let notificationsSeenTime: any;\n let notificationsShownTime: any;\n publicState().user().get('notificationsSeenTime').on(v => {\n notificationsSeenTime = v;\n console.log(v);\n });\n publicState().user().get('notificationsShownTime').on(v => notificationsShownTime = v);\n const setNotificationsShownTime = _.debounce(() => {\n publicState().user().get('notificationsShownTime').put(new Date().toISOString());\n }, 1000);\n const alreadyHave = new Set();\n group().on(`notifications/${session.getPubKey()}`, async (encryptedNotification, k, x, e, from) => {\n const id = from.slice(0,30) + encryptedNotification.slice(0,30);\n if (alreadyHave.has(id)) { return; }\n alreadyHave.add(id);\n const epub = await getEpub(from);\n const secret = await Gun.SEA.secret(epub, session.getKey());\n const notification = await Gun.SEA.decrypt(encryptedNotification, secret);\n if (!notification || typeof notification !== 'object') { return; }\n setNotificationsShownTime();\n notification.from = from;\n local().get('notifications').get(notification.time).put(notification);\n if (!notificationsSeenTime || (notificationsSeenTime < notification.time)) {\n changeUnseenNotificationCount(1);\n }\n if (!notificationsShownTime || notificationsShownTime < notification.time) {\n console.log('was new!');\n const text = await getNotificationText(notification);\n let desktopNotification = new Notification(text, {\n icon: '/assets/img/icon128.png',\n body: text,\n silent: true\n });\n desktopNotification.onclick = function() {\n const link = notification.target ? `/post/${notification.target}` : `/profile/${notification.from}`;\n onClick && onClick(link);\n changeUnseenNotificationCount(-1);\n window.focus();\n };\n }\n });\n}\n\nfunction changeUnseenNotificationCount(change) {\n if (!change) {\n unseenNotificationCount = 0;\n publicState().user().get('notificationsSeenTime').put(new Date().toISOString());\n } else {\n unseenNotificationCount += change;\n unseenNotificationCount = Math.max(unseenNotificationCount, 0);\n }\n local().get('unseenNotificationCount').put(unseenNotificationCount);\n}\n\nasync function sendIrisNotification(recipient, notification) {\n if (!(recipient && notification)) { return; } // TODO: use typescript or sth :D\n if (typeof notification === 'object') { notification.time = new Date().toISOString() }\n const epub = await getEpub(recipient);\n const secret = await Gun.SEA.secret(epub, session.getKey());\n const enc = await Gun.SEA.encrypt(notification, secret);\n publicState().user().get('notifications').get(recipient).put(enc);\n}\n\nasync function sendWebPushNotification(recipient, notification) {\n console.log('sending web push notification to', recipient, notification);\n const channel = privateState(recipient);\n const myKey = session.getKey();\n const shouldWebPush = (recipient === myKey.pub) || !(channel.activity && channel.activity.isActive);\n if (shouldWebPush && channel.webPushSubscriptions) {\n const subscriptions = [];\n const participants = Object.keys(channel.webPushSubscriptions);\n for (let i = 0; i < participants.length; i++) {\n const participant = participants[i];\n const secret = await channel.getSecret(participant);\n const payload = {\n title: await Gun.SEA.encrypt(notification.title, secret),\n body: await Gun.SEA.encrypt(notification.body, secret),\n from:{pub: myKey.pub, epub: myKey.epub}\n };\n channel.webPushSubscriptions[participant].forEach(s => {\n if (s && s.endpoint) {\n subscriptions.push({subscription: s, payload});\n }\n });\n }\n if (subscriptions.length === 0) {return;}\n fetch(NOTIFICATION_SERVICE_URL, {\n method: 'POST',\n body: JSON.stringify({subscriptions}),\n headers: {\n 'content-type': 'application/json'\n }\n }).catch(() => {});\n }\n}\n\nfunction init() {\n loginTime = new Date();\n unseenMsgsTotal = 0;\n}\n\nexport default {init, notifyMsg, getNotificationText, sendWebPushNotification, changeUnseenNotificationCount, subscribeToIrisNotifications, sendIrisNotification, changeChatUnseenCount: changeChatUnseenMsgsCount, webPushSubscriptions, subscribeToWebPush, getWebPushSubscriptions, removeSubscription};\n","import util from \"./util\";\nimport Gun from \"gun\";\n\nconst electron = util.isElectron ? new Gun({peers: ['http://localhost:8768/gun'], file: 'State.electron', multicast:false, localStorage: false}).get('state') : null;\n\nexport default electron;","// @ts-nocheck\nimport Gun from 'gun';\nimport notifications from './notifications';\nimport Channel from './Channel';\nimport util from './util';\nimport _ from './lodash';\nimport Fuse from \"fuse.js\";\nimport localforage from 'localforage';\nimport local from './local';\nimport electron from './electron';\nimport user from './public';\nimport privateState from './private';\nimport blockedUsers from './blockedUsers';\n\nlet key: any;\nlet myName: string;\nlet latestChatLink: string;\nlet onlineTimeout: any;\nlet ourActivity: any;\nlet noFollows: boolean;\nlet noFollowers: boolean;\nlet searchIndex: any;\nlet initCalled: boolean;\nconst searchableItems: any = {};\nconst getExtendedFollowsCalled = new Map();\n\nconst DEFAULT_FOLLOW = 'hyECQHwSo7fgr2MVfPyakvayPeixxsaAWVtZ-vbaiSc.TXIp8MnCtrnW6n2MrYquWPcc-DTmZzMBmc2yaGv9gIU';\n\nconst DEFAULT_SETTINGS = {\n electron: {\n openAtLogin: true,\n minimizeOnClose: true\n },\n local: {\n enableWebtorrent: !util.isMobile,\n enablePublicPeerDiscovery: true,\n autoplayWebtorrent: true,\n maxConnectedPeers: util.isElectron ? 2 : 1\n }\n}\n\n/**\n * User session management utilities.\n */\nexport default {\n /**\n * Log in with a key from localStorage.\n *\n * If no key is found and options.autologin is not false, a new user will be created.\n *\n * If options.autofollow is not false, the default follow will be added.\n * @param options\n */\n init(options: any = {}) {\n if (initCalled) { return; }\n initCalled = true;\n let localStorageKey = localStorage.getItem('chatKeyPair');\n if (localStorageKey) {\n this.login(JSON.parse(localStorageKey));\n } else if (options.autologin !== false) {\n this.loginAsNewUser(options);\n } else {\n this.clearIndexedDB();\n }\n setTimeout(() => {\n local().get('block').map(() => {\n this.updateSearchIndex();\n });\n this.updateSearchIndex();\n });\n setInterval(() => {\n if (this.taskQueue.length) {\n //console.log('this.taskQueue', this.taskQueue.length);\n const t = this.taskQueue.shift();\n t && t();\n }\n }, 10);\n },\n\n DEFAULT_SETTINGS,\n DEFAULT_FOLLOW,\n\n taskQueue: [] as any[],\n\n updateSearchIndex: _.throttle(() => {\n const options = {keys: ['name'], includeScore: true, includeMatches: true, threshold: 0.3};\n const values = Object.values(_.omit(searchableItems, Object.keys(blockedUsers())));\n searchIndex = new Fuse(values, options);\n local().get('searchIndexUpdated').put(true);\n }, 2000, {leading:true}),\n\n saveSearchResult: _.throttle(k => {\n local().get('contacts').get(k).put({followDistance: searchableItems[k].followDistance,followerCount: searchableItems[k].followers.size});\n }, 1000, {leading:true}),\n\n addFollow(callback: Function, k: string, followDistance: number, follower?: string) {\n if (searchableItems[k]) {\n if (searchableItems[k].followDistance > followDistance) {\n searchableItems[k].followDistance = followDistance;\n }\n follower && searchableItems[k].followers.add(follower);\n } else {\n searchableItems[k] = {key: k, followDistance, followers: new Set(follower && [follower])};\n this.taskQueue.push(() => {\n user(k).get('profile').get('name').on((name: string) => {\n searchableItems[k].name = name;\n local().get('contacts').get(k).get('name').put(name);\n callback && callback(k, searchableItems[k]);\n });\n });\n }\n this.saveSearchResult(k);\n callback && callback(k, searchableItems[k]);\n this.updateSearchIndex();\n this.updateNoFollows();\n this.updateNoFollowers();\n },\n\n removeFollow(k: string, followDistance: number, follower: string) {\n if (followDistance === 1) {\n local().get('contacts').get(k).put(false);\n local().get('groups').get('follows').get(k).put(false);\n if (searchableItems[k]) {\n searchableItems[k].followers.delete(follower);\n this.updateNoFollows();\n this.updateNoFollowers();\n }\n }\n console.log('removeFollow', k, followDistance, follower);\n if (searchableItems[k] && searchableItems[k].followers.size === 0) {\n delete searchableItems[k];\n local().get('contacts').get(k).put(false);\n local().get('groups').get('everyone').get(k).put(false);\n }\n },\n\n getExtendedFollows(callback: Function, k = key.pub, maxDepth = 3, currentDepth = 1) {\n const called = getExtendedFollowsCalled.get(k);\n if (called && called <= currentDepth) {\n return;\n }\n getExtendedFollowsCalled.set(k, currentDepth);\n\n this.addFollow(callback, k, currentDepth - 1);\n\n user(k).get('follow').map().on((isFollowing: boolean, followedKey: string) => { // TODO: unfollow\n if (isFollowing) {\n this.addFollow(callback, followedKey, currentDepth, k);\n if (currentDepth < maxDepth) {\n this.taskQueue.push(() => this.getExtendedFollows(callback, followedKey, maxDepth, currentDepth + 1));\n }\n } else {\n this.removeFollow(followedKey, currentDepth, k);\n }\n });\n\n return searchableItems;\n },\n\n updateNoFollows: _.throttle(() => {\n const v = Object.keys(searchableItems).length <= 1;\n if (v !== noFollows) {\n noFollows = v;\n local().get('noFollows').put(noFollows);\n }\n }, 1000, {leading:true}),\n\n updateNoFollowers: _.throttle(() => {\n const v = !(searchableItems[key.pub] && (searchableItems[key.pub].followers.size > 0));\n if (v !== noFollowers) {\n noFollowers = v;\n local().get('noFollowers').put(noFollowers);\n }\n }, 1000, {leading:true}),\n\n getSearchIndex() {\n return searchIndex;\n },\n\n setOurOnlineStatus() {\n const activeRoute = window.location.hash;\n Channel.setActivity(ourActivity = 'active');\n const setActive = _.debounce(() => {\n const chatId = activeRoute && activeRoute.replace('#/profile/','').replace('#/chat/','');\n const chat = privateState(chatId);\n if (chat && !ourActivity) {\n chat.setMyMsgsLastSeenTime();\n }\n Channel.setActivity(ourActivity = 'active');\n clearTimeout(onlineTimeout);\n onlineTimeout = setTimeout(() => Channel.setActivity(ourActivity = 'online'), 30000);\n }, 1000);\n document.addEventListener(\"touchmove\", setActive);\n document.addEventListener(\"mousemove\", setActive);\n document.addEventListener(\"keypress\", setActive);\n document.addEventListener(\"visibilitychange\", () => {\n if (document.visibilityState === 'visible') {\n Channel.setActivity(ourActivity = 'active');\n const chatId = location.pathname.slice(1).replace('chat/','');\n const chat = activeRoute && privateState(chatId);\n if (chat) {\n chat.setMyMsgsLastSeenTime();\n notifications.changeChatUnseenCount(chatId, 0);\n }\n } else {\n Channel.setActivity(ourActivity = 'online');\n }\n });\n setActive();\n window.addEventListener(\"beforeunload\", () => {\n Channel.setActivity(ourActivity = null);\n });\n },\n\n updateGroups() {\n this.getExtendedFollows((k: string, info: any) => {\n if (info.followDistance <= 1) {\n local().get('groups').get('follows').get(k).put(true);\n }\n local().get('groups').get('everyone').get(k).put(true);\n if (k === this.getPubKey()) {\n this.updateNoFollowers();\n }\n });\n },\n\n /**\n * Log in with a private key.\n * @param key\n */\n login(k: any) {\n const shouldRefresh = !!key;\n key = k;\n localStorage.setItem('chatKeyPair', JSON.stringify(k));\n user().auth(key);\n user().put({epub: key.epub});\n user().get('likes').put({a:null}); // gun bug?\n user().get('msgs').put({a:null}); // gun bug?\n user().get('replies').put({a:null}); // gun bug?\n notifications.subscribeToWebPush();\n notifications.getWebPushSubscriptions();\n notifications.subscribeToIrisNotifications();\n Channel.getMyChatLinks( undefined, (chatLink: any) => {\n local().get('chatLinks').get(chatLink.id).put(chatLink.url);\n latestChatLink = chatLink.url;\n });\n this.setOurOnlineStatus();\n Channel.getChannels( (c: Channel) => this.addChannel(c));\n user().get('profile').get('name').on((name: any) => {\n if (name && typeof name === 'string') {\n myName = name;\n }\n });\n notifications.init();\n local().get('loggedIn').put(true);\n local().get('settings').once().then(settings => {\n if (!settings) {\n local().get('settings').put(DEFAULT_SETTINGS.local);\n } else if (settings.enableWebtorrent === undefined || settings.autoplayWebtorrent === undefined) {\n local().get('settings').get('enableWebtorrent').put(DEFAULT_SETTINGS.local.enableWebtorrent);\n local().get('settings').get('autoplayWebtorrent').put(DEFAULT_SETTINGS.local.autoplayWebtorrent);\n }\n });\n user().get('block').map().on((isBlocked: boolean, user: string) => {\n local().get('block').get(user).put(isBlocked);\n if (isBlocked) {\n delete searchableItems[user];\n }\n });\n this.updateGroups();\n if (shouldRefresh) {\n location.reload();\n }\n if (electron) {\n electron.get('settings').on(electron => {\n local().get('settings').get('electron').put(electron);\n });\n electron.get('user').put(key.pub);\n }\n local().get('filters').get('group').once().then(v => {\n if (!v) {\n local().get('filters').get('group').put('follows');\n }\n });\n },\n\n /**\n * Create a new user account and log in.\n * @param options {Object} - Options for the new account.\n * @returns {Promise<*>}\n */\n loginAsNewUser(options: any = {}) {\n const name = options.name || util.generateName();\n console.log('loginAsNewUser name', name);\n return Gun.SEA.pair().then(k => {\n this.login(k);\n user().get('profile').put({a:null});\n user().get('profile').get('name').put(name);\n local().get('filters').put({a:null});\n local().get('filters').get('group').put('follows');\n Channel.createChatLink().then(l => latestChatLink = l);\n setTimeout(() => {\n if (options.autofollow !== false) {\n console.log('autofollowing', DEFAULT_FOLLOW);\n user().get('follow').get(DEFAULT_FOLLOW).put(true);\n }\n }, 1000); // maybe wait for login return instead\n });\n },\n\n /**\n * Log out the current user.\n * @returns {Promise}\n */\n async logOut() {\n if (electron) {\n electron.get('user').put(null);\n }\n // TODO: remove subscription from your channels\n if (navigator.serviceWorker) {\n const reg = await navigator.serviceWorker.getRegistration();\n if (reg && reg.pushManager) {\n reg.active?.postMessage({key: null});\n const sub = await reg.pushManager.getSubscription();\n if (sub) {\n const hash = await util.getHash(JSON.stringify(sub));\n notifications.removeSubscription(hash);\n sub.unsubscribe && sub.unsubscribe();\n }\n }\n }\n this.clearIndexedDB();\n localStorage.clear(); // TODO clear only iris data\n localforage.clear().then(() => {\n window.location.hash = '';\n window.location.href = '/';\n location.reload();\n });\n },\n\n clearIndexedDB() {\n return new Promise(resolve => {\n const r1 = window.indexedDB.deleteDatabase('local()');\n const r2 = window.indexedDB.deleteDatabase('radata');\n let r1done = false;\n let r2done = false;\n const check = () => {\n r1done && r2done && resolve(undefined);\n }\n r1.onerror = r2.onerror = e => console.error(e);\n //r1.onblocked = r2.onblocked = e => console.error('blocked', e);\n r1.onsuccess = () => {\n r1done = true;\n check();\n }\n r2.onsuccess = () => {\n r2done = true;\n check();\n }\n });\n },\n\n getMyChatLink() {\n return latestChatLink || util.getProfileLink(key.pub);\n },\n\n /**\n * Get the keypair of the logged in user.\n * @returns {*}\n */\n getKey() { return key; },\n\n /**\n * Get the public key of the logged in user.\n * @returns {*}\n */\n getPubKey() {\n return key && key.pub;\n },\n\n /**\n * Get the name of the logged in user.\n * @returns {*}\n */\n getMyName() { return myName; }, // TODO maybe remove and use iris.user().get('profile').get('name') instead?\n\n myPeerUrl: (ip: string) => `http://${ip}:8767/gun`,\n\n async shareMyPeerUrl(channel: Channel) {\n const myIp = await local().get('settings').get('electron').get('publicIp').once();\n myIp && channel.put && channel.put('my_peer', this.myPeerUrl(myIp));\n },\n\n newChannel(pub: string, chatLink?: string) {\n if (!pub || this.channelIds.has(pub)) {\n return;\n }\n const chat = privateState(pub, chatLink);\n this.addChannel(chat);\n return chat;\n },\n\n addChannel(chat: Channel) {\n this.taskQueue.push(() => {\n let pub = chat.getId();\n if (this.channelIds.has(pub)) { return; }\n this.channelIds.add(pub);\n const chatNode = local().get('channels').get(pub);\n chatNode.get('latestTime').on((t: string) => {\n if (t && (!chat.latestTime || t > chat.latestTime)) {\n chat.latestTime = t;\n } else {\n // chatNode.get('latestTime').put(chat.latestTime); // omg recursion\n }\n });\n chatNode.get('theirMsgsLastSeenTime').on((t: string) => {\n if (!t) { return; }\n const d = new Date(t);\n if (!chat.theirMsgsLastSeenDate || chat.theirMsgsLastSeenDate < d) {\n chat.theirMsgsLastSeenDate = d;\n }\n });\n chat.getLatestMsg && chat.getLatestMsg((latest: any, info: any) => {\n this.processMessage(pub, latest, info);\n });\n notifications.changeChatUnseenCount(pub, 0);\n chat.notificationSetting = 'all';\n chat.onMy('notificationSetting', (val: any) => {\n chat.notificationSetting = val;\n });\n //$(\".chat-list\").append(el);\n chat.theirMsgsLastSeenTime = '';\n chat.getTheirMsgsLastSeenTime((time: any) => {\n if (chat && time && time >= chat.theirMsgsLastSeenTime) {\n chat.theirMsgsLastSeenTime = time;\n chatNode.get('theirMsgsLastSeenTime').put(time);\n }\n });\n chat.getMyMsgsLastSeenTime((time: any) => {\n chat.myLastSeenTime = new Date(time);\n if (chat.latest && chat.myLastSeenTime >= chat.latest.time) {\n notifications.changeChatUnseenCount(pub, 0);\n }\n });\n chat.isTyping = false;\n chat.getTyping(isTyping => {\n chat.isTyping = isTyping;\n local().get('channels').get(pub).get('isTyping').put(isTyping);\n });\n chat.online = {};\n Channel.getActivity(pub, (activity) => {\n if (chat) {\n chatNode.put({theirLastActiveTime: activity && activity.lastActive, activity: activity && activity.isActive && activity.status});\n chat.activity = activity;\n }\n });\n if (chat.uuid) {\n let isDarkMode = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches;\n chat.participantProfiles = {};\n chat.on('name', v => {\n chat.name = v;\n searchableItems[chat.uuid] = {name: v, uuid: chat.uuid};\n local().get('channels').get(chat.uuid).get('name').put(v);\n });\n chat.on('photo', v => {\n searchableItems[chat.uuid] = searchableItems[chat.uuid] || {};\n searchableItems[chat.uuid].photo = v;\n local().get('channels').get(chat.uuid).get('photo').put(v)\n });\n chat.on('about', v => local().get('channels').get(chat.uuid).get('about').put(v));\n chat.getParticipants(participants => {\n delete participants.undefined; // TODO fix where it comes from\n if (typeof participants === 'object') {\n let keys = Object.keys(participants);\n keys.forEach((k, i) => {\n let hue = 360 / Math.max(keys.length, 2) * i; // TODO use css filter brightness\n chat.participantProfiles[k] = {permissions: participants[k], color: `hsl(${hue}, 98%, ${isDarkMode ? 80 : 33}%)`};\n user(k).get('profile').get('name').on(name => {\n chat.participantProfiles[k].name = name;\n });\n });\n }\n local().get('channels').get(chat.uuid).get('participants').put(participants);\n });\n chat.inviteLinks = {};\n chat.getChatLinks({callback: ({url, id}) => {\n console.log('got chat link', id, url);\n chat.inviteLinks[id] = url; // TODO use State\n local().get('inviteLinksChanged').put(true);\n }});\n } else {\n // TODO do we want this?\n user(pub).get('profile').get('name').on(v => local().get('channels').get(pub).get('name').put(v))\n }\n if (chat.put) {\n chat.onTheir('webPushSubscriptions', (s, k, from) => {\n if (!Array.isArray(s)) { return; }\n chat.webPushSubscriptions = chat.webPushSubscriptions || {};\n chat.webPushSubscriptions[from || pub] = s;\n });\n const arr = Object.values(notifications.webPushSubscriptions);\n setTimeout(() => chat.put('webPushSubscriptions', arr), 5000);\n this.shareMyPeerUrl(chat);\n }\n chat.onTheir('call', call => {\n local().get('call').put({pub, call});\n });\n local().get('channels').get(pub).put({enabled:true});\n /* Disable private peer discovery, since they're not connecting anyway\n if (chat.onTheir) {\n chat.onTheir('my_peer', (url, k, from) => {\n console.log('Got private peer url', url, 'from', from);\n peers.addPeer({url, from})\n });\n }\n */\n\n });\n },\n\n // TODO: should perhaps be in Channel\n processMessage(chatId: string, msg: any, info: any, onClickNotification?: Function) {\n const chat = privateState(chatId);\n chat.messageIds = chat.messageIds || {};\n if (chat.messageIds[msg.time + info.from]) return;\n chat.messageIds[msg.time + info.from] = true;\n if (info) {\n msg = Object.assign(msg, info);\n }\n if (msg.invite) {\n const chatLink = `https://iris.to/?channelId=${msg.invite.group}&inviter=${chatId}`;\n this.newChannel(msg.invite.group, chatLink);\n return;\n }\n msg.selfAuthored = info.selfAuthored;\n local().get('channels').get(chatId).get('msgs').get(msg.time + (msg.from && msg.from.slice(0, 10))).put(JSON.stringify(msg));\n msg.timeObj = new Date(msg.time);\n if (!info.selfAuthored && msg.timeObj > chat.myLastSeenTime) {\n if (window.location.hash !== `#/chat/${ chatId}` || document.visibilityState !== 'visible') {\n notifications.changeChatUnseenCount(chatId, 1);\n } else if (ourActivity === 'active') {\n chat.setMyMsgsLastSeenTime();\n }\n }\n if (!info.selfAuthored && msg.time > chat.theirMsgsLastSeenTime) {\n local().get('channels').get(chatId).get('theirMsgsLastSeenTime').put(msg.time);\n }\n if (!chat.latestTime || (msg.time > chat.latestTime)) {\n local().get('channels').get(chatId).put({\n latestTime: msg.time,\n latest: {time: msg.time, text: msg.text, selfAuthored: info.selfAuthored}\n });\n }\n // TODO: onclickNotification should do route(`/chat/${ pub}`);\n notifications.notifyMsg(msg, info, chatId, onClickNotification);\n },\n\n subscribeToMsgs(pub) {\n const c = privateState(pub);\n if (c.subscribed) { return; }\n c.subscribed = true;\n c.getMessages((msg, info) => {\n this.processMessage(pub, msg, info);\n });\n },\n\n /**\n * Known private channels with other users\n */\n channelIds: new Set(),\n};\n","import publicSpace from './global';\nimport util from './util';\n\n/**\n * Content-addressed storage\n */\nexport default {\n /**\n * Get a file identified by its hash\n * @param hash\n * @param callback\n * @returns {Promise}\n */\n get(hash: string, callback: Function) {\n return new Promise((resolve, reject) => {\n if (!hash) {\n reject('No hash provided');\n }\n if (typeof hash !== 'string') {\n reject('Hash must be a string');\n }\n publicSpace().get('#').get(hash).on((v: any, _k: string, _x: any, e: any) => {\n if (v) {\n e.off();\n callback && callback(v);\n resolve(v);\n }\n });\n });\n },\n\n /**\n * Store a file and return its hash\n * @param value\n * @returns {Promise}\n */\n async put(value: any) {\n const hash = await util.getHash(value);\n publicSpace().get('#').get(hash).put(value);\n return hash;\n }\n}","/*eslint no-useless-escape: \"off\", camelcase: \"off\" */\n\nimport util from './util';\nimport Gun from 'gun'; // eslint-disable-line no-unused-vars\nimport 'gun/sea';\n// eslint-disable-line no-unused-vars\n\nlet myKey: any;\n\nclass Key {\n static async getActiveKey(datadir = `.`, keyfile = `iris.key`, fs?: any) {\n if (myKey) {\n return myKey;\n }\n if (fs) {\n const privKeyFile = `${datadir}/${keyfile}`;\n if (fs.existsSync(privKeyFile)) {\n const f = fs.readFileSync(privKeyFile, `utf8`);\n myKey = Key.fromString(f);\n } else {\n const newKey = await Key.generate();\n myKey = myKey || newKey; // eslint-disable-line require-atomic-updates\n fs.writeFileSync(privKeyFile, Key.toString(myKey));\n fs.chmodSync(privKeyFile, 400);\n }\n if (!myKey) {\n throw new Error(`loading default key failed - check ${datadir}/${keyfile}`);\n }\n } else {\n const str = window.localStorage.getItem(`iris.myKey`);\n if (str) {\n myKey = Key.fromString(str);\n } else {\n const newKey = await Key.generate();\n myKey = myKey || newKey; // eslint-disable-line require-atomic-updates\n window.localStorage.setItem(`iris.myKey`, Key.toString(myKey));\n }\n if (!myKey) {\n throw new Error(`loading default key failed - check localStorage iris.myKey`);\n }\n }\n return myKey;\n }\n\n static getDefault(datadir = `.`, keyfile = `iris.key`) {\n return Key.getActiveKey(datadir, keyfile);\n }\n\n static async getActivePub(datadir = `.`, keyfile = `iris.key`) {\n const key = await Key.getActiveKey(datadir, keyfile);\n return key.pub;\n }\n\n static setActiveKey(key: any, save = true, datadir = `.`, keyfile = `iris.key`, fs: any) {\n myKey = key;\n if (!save) return;\n if (util.isNode) {\n const privKeyFile = `${datadir}/${keyfile}`;\n fs.writeFileSync(privKeyFile, Key.toString(myKey));\n fs.chmodSync(privKeyFile, 400);\n } else {\n window.localStorage.setItem(`iris.myKey`, Key.toString(myKey));\n }\n }\n\n static toString(key: any) {\n return JSON.stringify(key);\n }\n\n static getId(key: any) {\n if (!(key && key.pub)) {\n throw new Error(`missing param`);\n }\n return key.pub; // hack until GUN supports lookups by keyID\n //return util.getHash(key.pub);\n }\n\n static fromString(str: string) {\n return JSON.parse(str);\n }\n\n static generate() {\n return Gun.SEA.pair();\n }\n\n static async sign(msg: any, pair: any) {\n const sig = await Gun.SEA.sign(msg, pair);\n return `a${sig}`;\n }\n\n static verify(msg: any, pubKey: any) {\n return Gun.SEA.verify(msg.slice(1), pubKey);\n }\n}\n\nexport default Key;\n","// @ts-nocheck\n\n/*jshint unused: false */\n`use strict`;\nimport util from './util';\nimport Attribute from './Attribute';\nimport Key from './Key';\n\nconst errorMsg = `Invalid message:`;\n\nclass ValidationError extends Error {}\n\n/**\n* Signed message object. Your friends can index and relay your messages, while others can still verify that they were signed by you.\n*\n* Fields: signedData, signer (public key) and signature.\n*\n* signedData has an author, signer, type, time and optionally other fields.\n*\n* signature covers the utf8 string representation of signedData. Since messages are digitally signed, users only need to care about the message signer and not who relayed it or whose index it was found from.\n*\n* signer is the entity that verified its origin. In other words: message author and signer can be different entities, and only the signer needs to use Iris.\n*\n* For example, a crawler can import and sign other people's messages from Twitter. Only the users who trust the crawler will see the messages.\n*\n* Constructor: creates a message from the param obj.signedData that must contain at least the mandatory fields: author, type and time.\n* @param obj\n*\n* @example\n* https://github.com/irislib/iris-lib/blob/master/__tests__/SignedMessage.js\n*\n* Verification message:\n* {\n* signedData: {\n* author: {name:'Alice', key:'ABCD1234'},\n* recipient: {\n* name: 'Bob',\n* email: ['bob@example.com', 'bob.saget@example.com'],\n* bitcoin: '1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa'\n* },\n* type: 'verification'\n* },\n* signer: 'ABCD1234',\n* signature: '1234ABCD'\n* }\n*/\nclass SignedMessage {\n signedData: any;\n pubKey: any;\n sig: any;\n\n constructor(obj: any) {\n this.signedData = obj.signedData;\n this.pubKey = obj.pubKey;\n if (obj.sig) {\n if (typeof obj.sig !== `string`) {\n throw new ValidationError(`SignedMessage signature must be a string`);\n }\n this.sig = obj.sig;\n this.getHash();\n }\n this._validate();\n }\n\n static _getArray(authorOrRecipient) {\n const arr = [];\n const keys = Object.keys(authorOrRecipient);\n for (let i = 0;i < keys.length;i++) {\n const type = keys[i];\n const value = authorOrRecipient[keys[i]];\n if (typeof value === `string`) {\n arr.push(new Attribute(type, value));\n } else { // array\n for (let j = 0;j < value.length;j++) {\n const elementValue = value[j];\n arr.push(new Attribute(type, elementValue));\n }\n }\n }\n return arr;\n }\n\n static _getIterable(authorOrRecipient) {\n return {\n *[Symbol.iterator]() {\n const keys = Object.keys(authorOrRecipient);\n for (let i = 0;i < keys.length;i++) {\n const type = keys[i];\n const value = authorOrRecipient[keys[i]];\n if (typeof value === `string`) {\n yield new Attribute(type, value);\n } else { // array\n for (let j = 0;j < value.length;j++) {\n const elementValue = value[j];\n yield new Attribute(type, elementValue);\n }\n }\n }\n }\n };\n }\n\n getAuthorIterable() {\n return SignedMessage._getIterable(this.signedData.author);\n }\n\n getRecipientIterable() {\n return SignedMessage._getIterable(this.signedData.recipient);\n }\n\n getAuthorArray() {\n return SignedMessage._getArray(this.signedData.author);\n }\n\n getRecipientArray() {\n return this.signedData.recipient ? SignedMessage._getArray(this.signedData.recipient) : [];\n }\n\n getSignerKeyID() {\n return this.pubKey; // hack until gun supports keyID lookups\n //return util.getHash(this.pubKey);\n }\n\n _validate() {\n if (!this.signedData) {throw new ValidationError(`${errorMsg} Missing signedData`);}\n if (typeof this.signedData !== `object`) {throw new ValidationError(`${errorMsg} signedData must be an object`);}\n const d = this.signedData;\n\n if (!d.type) {throw new ValidationError(`${errorMsg} Missing type definition`);}\n if (!d.author) {throw new ValidationError(`${errorMsg} Missing author`);}\n if (typeof d.author !== `object`) {throw new ValidationError(`${errorMsg} Author must be object`);}\n if (Array.isArray(d.author)) {throw new ValidationError(`${errorMsg} Author must not be an array`);}\n if (Object.keys(d.author).length === 0) {throw new ValidationError(`${errorMsg} Author empty`);}\n if (this.pubKey) {\n this.signerKeyHash = this.getSignerKeyID();\n }\n for (const attr in d.author) {\n const t = typeof d.author[attr];\n if (t !== `string`) {\n if (Array.isArray(d.author[attr])) {\n for (let i = 0;i < d.author[attr].length;i++) {\n if (typeof d.author[attr][i] !== `string`) {throw new ValidationError(`${errorMsg} Author attribute must be string, got ${attr}: [${d.author[attr][i]}]`);}\n if (d.author[attr][i].length === 0) {\n throw new ValidationError(`${errorMsg} author ${attr} in array[${i}] is empty`);\n }\n }\n } else {\n throw new ValidationError(`${errorMsg} Author attribute must be string or array, got ${attr}: ${d.author[attr]}`);\n }\n }\n if (attr === `keyID`) {\n if (t !== `string`) {throw new ValidationError(`${errorMsg} Author keyID must be string, got ${t}`);}\n if (this.signerKeyHash && d.author[attr] !== this.signerKeyHash) {throw new ValidationError(`${errorMsg} If message has a keyID author, it must be signed by the same key`);}\n }\n }\n if (d.recipient) {\n if (typeof d.recipient !== `object`) {throw new ValidationError(`${errorMsg} Recipient must be object`);}\n if (Array.isArray(d.recipient)) {throw new ValidationError(`${errorMsg} Recipient must not be an array`);}\n if (Object.keys(d.recipient).length === 0) {throw new ValidationError(`${errorMsg} Recipient empty`);}\n for (const attr in d.recipient) {\n const t = typeof d.recipient[attr];\n if (t !== `string`) {\n if (Array.isArray(d.recipient[attr])) {\n for (let i = 0;i < d.recipient[attr].length;i++) {\n if (typeof d.recipient[attr][i] !== `string`) {throw new ValidationError(`${errorMsg} Recipient attribute must be string, got ${attr}: [${d.recipient[attr][i]}]`);}\n if (d.recipient[attr][i].length === 0) {\n throw new ValidationError(`${errorMsg} recipient ${attr} in array[${i}] is empty`);\n }\n }\n } else {\n throw new ValidationError(`${errorMsg} Recipient attribute must be string or array, got ${attr}: ${d.recipient[attr]}`);\n }\n }\n }\n }\n if (!(d.time || d.timestamp)) {throw new ValidationError(`${errorMsg} Missing time field`);}\n\n if (!Date.parse(d.time || d.timestamp)) {throw new ValidationError(`${errorMsg} Invalid time field`);}\n\n if (d.type === `rating`) {\n if (isNaN(d.rating)) {throw new ValidationError(`${errorMsg} Invalid rating`);}\n if (isNaN(d.maxRating)) {throw new ValidationError(`${errorMsg} Invalid maxRating`);}\n if (isNaN(d.minRating)) {throw new ValidationError(`${errorMsg} Invalid minRating`);}\n if (d.rating > d.maxRating) {throw new ValidationError(`${errorMsg} Rating is above maxRating`);}\n if (d.rating < d.minRating) {throw new ValidationError(`${errorMsg} Rating is below minRating`);}\n if (typeof d.context !== `string` || !d.context.length) {throw new ValidationError(`${errorMsg} Rating messages must have a context field`);}\n }\n\n if (d.type === `verification` || d.type === `unverification`) {\n if (d.recipient.length < 2) {throw new ValidationError(`${errorMsg} At least 2 recipient attributes are needed for a connection / disconnection. Got: ${d.recipient}`);}\n }\n\n return true;\n }\n\n isPositive() {\n return this.signedData.type === `rating` && this.signedData.rating > (this.signedData.maxRating + this.signedData.minRating) / 2;\n }\n\n isNegative() {\n return this.signedData.type === `rating` && this.signedData.rating < (this.signedData.maxRating + this.signedData.minRating) / 2;\n }\n\n isNeutral() {\n return this.signedData.type === `rating` && this.signedData.rating === (this.signedData.maxRating + this.signedData.minRating) / 2;\n }\n\n /**\n * @param {Object} key Gun.SEA keypair to sign the message with\n */\n async sign(key) {\n this.sig = await Key.sign(this.signedData, key);\n this.pubKey = key.pub;\n await this.getHash();\n return true;\n }\n\n /**\n * Create an iris message. SignedMessage time is automatically set. If signingKey is specified and author omitted, signingKey will be used as author.\n * @param {Object} signedData message data object including author, recipient and other possible attributes\n * @param {Object} signingKey optionally, you can set the key to sign the message with\n * @returns {Promise} message\n */\n static async create(signedData, signingKey) {\n if (!signedData.author && signingKey) {\n signedData.author = {keyID: Key.getId(signingKey)};\n }\n signedData.time = signedData.time || (new Date()).toISOString();\n const m = new SignedMessage({signedData});\n if (signingKey) {\n await m.sign(signingKey);\n }\n return m;\n }\n\n static createVerification(signedData, signingKey) {\n signedData.type = `verification`;\n return SignedMessage.create(signedData, signingKey);\n }\n\n static createRating(signedData, signingKey) {\n signedData.type = `rating`;\n signedData.context = signedData.context || `iris`;\n signedData.maxRating = signedData.maxRating || 10;\n signedData.minRating = signedData.minRating || -10;\n return SignedMessage.create(signedData, signingKey);\n }\n\n getAuthor(index) {\n for (const a of this.getAuthorIterable()) {\n if (a.isUniqueType()) {\n return index.getContacts(a);\n }\n }\n }\n\n getRecipient(index) {\n if (!this.signedData.recipient) {\n return undefined;\n }\n for (const a of this.getRecipientIterable()) {\n if (a.isUniqueType()) {\n return index.getContacts(a);\n }\n }\n }\n\n /**\n * @returns {string} base64 sha256 hash of message\n */\n async getHash() {\n if (this.sig && !this.hash) {\n this.hash = await util.getHash(this.sig);\n }\n return this.hash;\n }\n\n getId() {\n return this.getHash();\n }\n\n static async fromSig(obj) {\n if (!obj.sig) {\n throw new Error(`Missing signature in object:`, obj);\n }\n if (!obj.pubKey) {\n throw new Error(`Missing pubKey in object:`);\n }\n //const signedData = await Key.verify(obj.sig, obj.pubKey); // disable sig verification while migrating to new gun :(\n const signedData = JSON.parse(obj.sig.slice(4)).m;\n const o = {signedData, sig: obj.sig, pubKey: obj.pubKey};\n return new SignedMessage(o);\n }\n\n /**\n * @return {boolean} true if message signature is valid. Otherwise throws ValidationError.\n */\n async verify() {\n if (!this.pubKey) {\n throw new ValidationError(`${errorMsg} SignedMessage has no .pubKey`);\n }\n if (!this.sig) {\n throw new ValidationError(`${errorMsg} SignedMessage has no .sig`);\n }\n this.signedData = await Key.verify(this.sig, this.pubKey);\n if (!this.signedData) {\n throw new ValidationError(`${errorMsg} Invalid signature`);\n }\n if (this.hash) {\n if (this.hash !== (await util.getHash(this.sig))) {\n throw new ValidationError(`${errorMsg} Invalid message hash`);\n }\n } else {\n this.getHash();\n }\n return true;\n }\n\n /**\n * @returns {string}\n */\n serialize() {\n return {sig: this.sig, pubKey: this.pubKey};\n }\n\n toString() {\n return JSON.stringify(this.serialize());\n }\n\n /**\n * @returns {Promise}\n */\n static async deserialize(s) {\n return SignedMessage.fromSig(s);\n }\n\n static async fromString(s) {\n return SignedMessage.fromSig(JSON.parse(s));\n }\n\n static async setReaction(gun, msg, reaction) {\n const hash = await msg.getHash();\n gun.get(`reactions`).get(hash).put(reaction);\n gun.get(`reactions`).get(hash).put(reaction);\n gun.get(`messagesByHash`).get(hash).get(`reactions`).get(this.rootContact.value).put(reaction);\n gun.get(`messagesByHash`).get(hash).get(`reactions`).get(this.rootContact.value).put(reaction);\n }\n}\n\nexport default SignedMessage;\n","/*eslint no-useless-escape: \"off\", camelcase: \"off\" */\n\nimport Gun from 'gun';\nimport 'gun/sea';\n\nimport session from './session';\nimport peers from './peers';\nimport util from './util';\nimport local from './local';\nimport global from './global';\nimport publicState from './public';\nimport group from './group';\nimport electron from './electron';\nimport privateState from './private';\nimport staticState from './static';\nimport notifications from './notifications';\n\nimport SignedMessage from './SignedMessage';\nimport Channel from './Channel';\nimport Node from './Node';\n\nexport default {\n local,\n global,\n\n group,\n public: publicState,\n private: privateState,\n static: staticState,\n electron,\n peers,\n session,\n util,\n notifications,\n\n SEA: Gun.SEA,\n Gun,\n SignedMessage,\n Channel,\n Node,\n};"],"names":["throttle","func","limit","inThrottle","args","arguments","context","apply","setTimeout","debounce","inDebounce","clearTimeout","sample","arr","Math","floor","random","length","sampleSize","size","shuffled","slice","i","min","temp","index","defer","once","called","omit","obj","keys","newObj","Object","forEach","key","includes","defaults","undefined","pickBy","predicate","isNode","prototype","toString","call","global","process","e","userAgent","navigator","toLowerCase","isElectron","indexOf","isMobile","check","a","test","substr","vendor","gunAsAnotherUser","gun","f","gun2","Gun","radisk","peers","_","opt","user","auth","values","back","peer","on","gunOnceDefined","node","Promise","resolve","val","_k","_a","eve","off","animals","adjectives","getHash","str","format","SEA","work","name","hash","Error","base64ToHex","capitalize","s","charAt","toUpperCase","generateName","raw","atob","result","hex","charCodeAt","getCaret","el","selectionStart","document","selection","focus","r","createRange","re","createTextRange","rc","duplicate","moveToBookmark","getBookmark","setEndPoint","text","injectCss","elementId","getElementById","sheet","createElement","id","innerHTML","head","prepend","getUrlParameter","sParam","sParams","sPageURL","window","location","search","substring","sURLVariables","split","sParameterName","decodeURIComponent","formatTime","date","t","toLocaleTimeString","timeStyle","formatDate","toLocaleString","dateStyle","getDaySeparatorText","dateStr","now","nowStr","Date","toLocaleDateString","dayDifference","round","weekday","getProfileLink","pub","origin","encodeURIComponent","truncateString","type","cls","parent","setAttribute","appendChild","delay","ELECTRON_GUN_URL","maxConnectedPeers","DEFAULT_PEERS","loc","host","is_localhost_but_not_dev","startsWith","hostname","endsWith","url","enabled","urlRegex","known","add","from","k","visibility","secret","session","getKey","epub","encrypt","encryptedUrl","encryptedUrlHash","publicState","get","put","lastSeen","toISOString","connect","save","remove","disconnect","peerFromGun","localStorage","setItem","JSON","stringify","getSaved","p","getItem","parse","util","reset","isMixedContent","disable","protocol","connectToLocalElectron","max","push","checkGunPeerCount","peersFromGun","connectedPeers","filter","wire","constructor","console","log","readyState","bufferedAmount","unconnectedPeers","addedToGun","map","mixedContent","String","init","setInterval","opts","myOpts","assign","retry","Infinity","UNIQUE_ID_VALIDATORS","email","bitcoin","bitcoin_address","ip","ipv6","gpg_fingerprint","gpg_keyid","google_oauth2","tel","phone","keyID","account","uuid","Attribute","b","value","guessTypeOf","getUuid","replace","getUniqueIdValidators","isUniqueType","match","equals","uri","currentUser","DEFAULT_PERMISSIONS","read","write","admin","Channel","options","myGroupSecret","chatLink","useChatLink","participants","addParticipant","Array","isArray","o","founder","getChatLinks","subscribe","putDirect","getMyGroupSecret","getMySecretUuid","then","onTheirDirect","theirSecretUuids","theirGroupSecrets","onTheir","hasAdmin","inviter","participantsChanged","saved","chatWith","channelId","sharedSecret","linkId","encrypted","decrypt","sharedKey","encryptedChatRequest","channelRequestId","getTheirSecretUuid","getTheirGroupSecret","changeMyGroupSecret","mute","participant","block","secrets","ourSecretChannelIds","theirSecretChannelIds","mySecretUuid","mySecret","mySecretHash","getCurrentParticipants","getParticipants","callback","getParticipantsCallbackId","getParticipantsCallbacks","getId","getSecret","getOurSecretChannelId","pair","getTheirSecretChannelId","getChannels","listenToChatLinks","keypair","getMyChatLinks","seen","handleChannel","ourSecretChannelId","encryptedChatId","chatId","getMessages","theirSecretChannelId","data","messageReceived","userState","selfAuthored","messages","decrypted","info","getLatestMsg","callbackIfLatest","msg","latest","time","onMy","setMyMsgsLastSeenTime","getMyMsgsLastSeenTime","myMsgsLastSeenTime","getTheirMsgsLastSeenTime","theirMsgsLastSeenTime","removeParticipant","permissions","directSubscriptions","_onTheirDirectFromUser","groupSubscriptions","_onTheirGroupFromUser","event","send","trim","putGroup","onGroup","onDirect","onMyGroup","onTheirGroup","onMyDirect","v","hasWritePermission","hasOwnProperty","subscription","theirSecretUuid","_b","setTyping","isTyping","timeout","setTypingTimeout","getTyping","typing","getTypingTimeouts","addChatButton","label","channelOptions","channel","box","btn","body","addEventListener","getChatBox","getSimpleLink","urlRoot","chatLinks","chatLinkSubscriptions","links","link","channels","formatChatLink","encPub","requestId","createChatLink","sharedKeyString","encryptedSharedKey","ownerSecret","ownerEncryptedSharedKey","minimized","chatBox","header","minimize","innerText","stopPropagation","headerText","onlineIndicator","nameEl","close","openChatBtn","typingIndicator","inputWrapper","textArea","sendBtn","getActivity","status","isActive","undelivered","querySelectorAll","getAttribute","lastActive","c","unseen","indicator","msgEl","parentElement","msgClass","msgContent","seenIndicator","children","insertBefore","firstChild","insertAdjacentElement","scrollTop","scrollHeight","setActivity","keyCode","preventDefault","content","caret","shiftKey","activity","irisActivityStatus","setActivityTimeout","update","state","timerUpdate","pubKey","activityDate","getTime","isOnline","enc","removeGroupChatLink","removePrivateChatLink","deleteChannel","deleteGroup","Map","publicKey","set","LOCALFORAGE_NULL","notInLocalForage","Set","localForage","config","driver","LOCALSTORAGE","INDEXEDDB","WEBSQL","Node","loaded","loadLocalForage","removeItem","has","newResult","all","on_subscriptions","map_subscriptions","existing","new_node","saveLocalForage","doCallbacks","returnIfUndefined","lastIndexOf","counter","child","local","blockedUsers","isBlocked","_v","cache","callbacks","groupName","path","groupNode","follows","requestAnimationFrame","isFollowing","userSpace","reduce","sum","_cached_map","cached","cacheKey","myEvent","x","item","cb","_cached_on","_cached_count","count","pop","_cached_fn","fn","callbackId","myCallbacks","NOTIFICATION_SERVICE_URL","loginTime","unseenMsgsTotal","unseenNotificationCount","webPushSubscriptions","desktopNotificationsEnabled","Notification","permission","notifyMsg","onClick","shouldNotify","timeObj","visibilityState","privateState","notificationSetting","getMyName","shouldDesktopNotify","shouldAudioNotify","title","participantProfiles","desktopNotification","icon","silent","onclick","changeUnseenNotificationCount","changeChatUnseenMsgsCount","change","chat","chatNode","publicVapidKey","urlBase64ToUint8Array","base64String","padding","repeat","base64","rawData","outputArray","Uint8Array","reg","pushManager","userVisibleOnly","applicationServerKey","addWebPushSubscription","error","subscribeToWebPush","serviceWorker","ready","getRegistration","active","postMessage","getSubscription","sub","addWebPushSubscriptionsToChats","channelIds","removeSubscription","saveToGun","myKey","getWebPushSubscriptions","getEpub","getNotificationText","notification","profile","action","eventText","subscribeToIrisNotifications","notificationsSeenTime","notificationsShownTime","setNotificationsShownTime","alreadyHave","group","getPubKey","encryptedNotification","target","sendIrisNotification","recipient","sendWebPushNotification","shouldWebPush","subscriptions","payload","endpoint","fetch","method","headers","changeChatUnseenCount","electron","file","multicast","myName","latestChatLink","onlineTimeout","ourActivity","noFollows","noFollowers","searchIndex","initCalled","searchableItems","getExtendedFollowsCalled","DEFAULT_FOLLOW","DEFAULT_SETTINGS","openAtLogin","minimizeOnClose","enableWebtorrent","enablePublicPeerDiscovery","autoplayWebtorrent","localStorageKey","login","autologin","loginAsNewUser","clearIndexedDB","updateSearchIndex","taskQueue","shift","includeScore","includeMatches","threshold","Fuse","leading","saveSearchResult","followDistance","followerCount","followers","addFollow","follower","updateNoFollows","updateNoFollowers","removeFollow","getExtendedFollows","maxDepth","currentDepth","followedKey","getSearchIndex","setOurOnlineStatus","activeRoute","setActive","pathname","notifications","updateGroups","shouldRefresh","addChannel","settings","reload","l","autofollow","logOut","unsubscribe","clear","localforage","href","r1","indexedDB","deleteDatabase","r2","r1done","r2done","onerror","onsuccess","getMyChatLink","myPeerUrl","shareMyPeerUrl","myIp","newChannel","latestTime","d","theirMsgsLastSeenDate","processMessage","myLastSeenTime","online","theirLastActiveTime","isDarkMode","matchMedia","matches","photo","hue","color","inviteLinks","onClickNotification","messageIds","invite","subscribeToMsgs","subscribed","reject","publicSpace","_x","Key","getActiveKey","datadir","keyfile","fs","privKeyFile","existsSync","readFileSync","fromString","generate","newKey","writeFileSync","chmodSync","getDefault","getActivePub","setActiveKey","sign","sig","verify","errorMsg","ValidationError","SignedMessage","signedData","_validate","_getArray","authorOrRecipient","j","elementValue","_getIterable","Symbol","iterator","getAuthorIterable","author","getRecipientIterable","getAuthorArray","getRecipientArray","getSignerKeyID","signerKeyHash","attr","timestamp","isNaN","rating","maxRating","minRating","isPositive","isNegative","isNeutral","create","signingKey","m","createVerification","createRating","getAuthor","getContacts","getRecipient","fromSig","serialize","deserialize","setReaction","reaction","rootContact","staticState"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"iris.esm.js","sources":["../src/lodash.ts","../src/util.ts","../src/Key.ts","../src/peers.ts","../src/db/Actor.ts","../src/db/Message.ts","../src/db/adapters/Memory.ts","../src/db/adapters/IndexedDB.ts","../src/db/adapters/Websocket.ts","../src/db/Router.ts","../src/db/Node.ts","../src/global.ts","../src/Attribute.ts","../src/public.ts","../src/Channel.ts","../src/private.ts","../src/local.ts","../src/blockedUsers.ts","../src/group.ts","../src/notifications.ts","../src/electron.ts","../src/session.ts","../src/static.ts","../src/SignedMessage.ts","../src/index.ts"],"sourcesContent":["// @ts-nocheck\nconst _ = {\n throttle: (func: Function, limit: number) => {\n let inThrottle: boolean;\n return function() {\n const args = arguments;\n const context = this;\n if (!inThrottle) {\n func.apply(context, args);\n inThrottle = true;\n setTimeout(() => inThrottle = false, limit);\n }\n };\n },\n debounce: (func: Function, limit: number) => {\n let inDebounce: boolean;\n return function() {\n const args = arguments;\n const context = this;\n clearTimeout(inDebounce);\n inDebounce = setTimeout(() => func.apply(context, args), limit);\n };\n },\n sample: (arr: any[]) => arr[Math.floor(Math.random() * arr.length)],\n sampleSize: (arr: any[], size: number) => {\n const shuffled = arr.slice(0);\n let i = arr.length;\n let min = i - size;\n let temp;\n let index;\n while (i-- > min) {\n index = Math.floor((i + 1) * Math.random());\n temp = shuffled[index];\n shuffled[index] = shuffled[i];\n shuffled[i] = temp;\n }\n return shuffled.slice(min);\n },\n defer: (func: Function) => setTimeout(func, 0),\n once: (func: Function) => {\n let called = false;\n return function() {\n if (called) {\n return;\n }\n called = true;\n func.apply(this, arguments);\n };\n },\n omit: (obj: any, keys: string[]) => {\n const newObj = {};\n Object.keys(obj).forEach(key => {\n if (!keys.includes(key)) {\n newObj[key] = obj[key];\n }\n });\n return newObj;\n },\n defaults: (obj: any, defaults: any) => {\n Object.keys(defaults).forEach(key => {\n if (obj[key] === undefined) {\n obj[key] = defaults[key];\n }\n });\n return obj;\n },\n pickBy: (obj: any, predicate: Function) => {\n const newObj = {};\n Object.keys(obj).forEach(key => {\n if (predicate(obj[key])) {\n newObj[key] = obj[key];\n }\n });\n return newObj;\n },\n isEqual: (a: any, b: any) => {\n if (a === b) {\n return true;\n }\n if (a instanceof Date && b instanceof Date) {\n return a.getTime() === b.getTime();\n }\n if (!a || !b || (typeof a !== 'object' && typeof b !== 'object')) {\n return a !== a && b !== b;\n }\n if (a.prototype !== b.prototype) {\n return false;\n }\n const keys = Object.keys(a);\n if (keys.length !== Object.keys(b).length) {\n return false;\n }\n return keys.every(k => _.isEqual(a[k], b[k]));\n },\n uniq: (arr: any[]) => {\n const set = new Set(arr);\n return Array.from(set);\n }\n};\n\nexport default _;","// @ts-nocheck\n/* eslint no-useless-escape: \"off\", camelcase: \"off\" */\n\nimport _ from './lodash';\n\n// eslint-disable-line no-unused-vars\n\nlet isNode = false;\ntry {\n isNode = Object.prototype.toString.call(global.process) === `[object process]`;\n} catch (e) { null; }\n\nconst userAgent = !isNode && navigator && navigator.userAgent && navigator.userAgent.toLowerCase();\nconst isElectron = (userAgent && userAgent.indexOf(' electron/') > -1);\n\nconst isMobile = !isNode && (function() {\n if (isElectron) { return false; }\n let check = false;\n (function(a) {if (/(android|bb\\d+|meego).+mobile|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\\-(n|u)|c55\\/|capi|ccwa|cdm\\-|cell|chtm|cldc|cmd\\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\\-s|devi|dica|dmob|do(c|p)o|ds(12|\\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\\-|_)|g1 u|g560|gene|gf\\-5|g\\-mo|go(\\.w|od)|gr(ad|un)|haie|hcit|hd\\-(m|p|t)|hei\\-|hi(pt|ta)|hp( i|ip)|hs\\-c|ht(c(\\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\\-(20|go|ma)|i230|iac( |\\-|\\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\\/)|klon|kpt |kwc\\-|kyo(c|k)|le(no|xi)|lg( g|\\/(k|l|u)|50|54|\\-[a-w])|libw|lynx|m1\\-w|m3ga|m50\\/|ma(te|ui|xo)|mc(01|21|ca)|m\\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\\-2|po(ck|rt|se)|prox|psio|pt\\-g|qa\\-a|qc(07|12|21|32|60|\\-[2-7]|i\\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\\-|oo|p\\-)|sdk\\/|se(c(\\-|0|1)|47|mc|nd|ri)|sgh\\-|shar|sie(\\-|m)|sk\\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\\-|v\\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\\-|tdg\\-|tel(i|m)|tim\\-|t\\-mo|to(pl|sh)|ts(70|m\\-|m3|m5)|tx\\-9|up(\\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\\-|your|zeto|zte\\-/i.test(a.substr(0, 4))) check = true;})(navigator.userAgent || navigator.vendor || '');\n return check;\n})();\n\nfunction gunOnceDefined(node: any) {\n return new Promise(resolve => {\n node.on((val: any, _k: any, _a: any, eve: any) => {\n if (val !== undefined) {\n eve.off();\n resolve(val);\n }\n });\n });\n}\n\nconst animals = [\n 'canidae',\n 'felidae',\n 'cat',\n 'cattle',\n 'dog',\n 'donkey',\n 'goat',\n 'horse',\n 'pig',\n 'rabbit',\n 'aardvark',\n 'aardwolf',\n 'albatross',\n 'alligator',\n 'alpaca',\n 'amphibian',\n 'anaconda',\n 'angelfish',\n 'anglerfish',\n 'ant',\n 'anteater',\n 'antelope',\n 'antlion',\n 'ape',\n 'aphid',\n 'armadillo',\n 'asp',\n 'baboon',\n 'badger',\n 'bandicoot',\n 'barnacle',\n 'barracuda',\n 'basilisk',\n 'bass',\n 'bat',\n 'bear',\n 'beaver',\n 'bedbug',\n 'bee',\n 'beetle',\n 'bird',\n 'bison',\n 'blackbird',\n 'boa',\n 'boar',\n 'bobcat',\n 'bobolink',\n 'bonobo',\n 'booby',\n 'bovid',\n 'bug',\n 'butterfly',\n 'buzzard',\n 'camel',\n 'canid',\n 'capybara',\n 'cardinal',\n 'caribou',\n 'carp',\n 'cat',\n 'catshark',\n 'caterpillar',\n 'catfish',\n 'cattle',\n 'centipede',\n 'cephalopod',\n 'chameleon',\n 'cheetah',\n 'chickadee',\n 'chicken',\n 'chimpanzee',\n 'chinchilla',\n 'chipmunk',\n 'clam',\n 'clownfish',\n 'cobra',\n 'cockroach',\n 'cod',\n 'condor',\n 'constrictor',\n 'coral',\n 'cougar',\n 'cow',\n 'coyote',\n 'crab',\n 'crane',\n 'crawdad',\n 'crayfish',\n 'cricket',\n 'crocodile',\n 'crow',\n 'cuckoo',\n 'cicada',\n 'damselfly',\n 'deer',\n 'dingo',\n 'dinosaur',\n 'dog',\n 'dolphin',\n 'donkey',\n 'dormouse',\n 'dove',\n 'dragonfly',\n 'dragon',\n 'duck',\n 'eagle',\n 'earthworm',\n 'earwig',\n 'echidna',\n 'eel',\n 'egret',\n 'elephant',\n 'elk',\n 'emu',\n 'ermine',\n 'falcon',\n 'ferret',\n 'finch',\n 'firefly',\n 'fish',\n 'flamingo',\n 'flea',\n 'fly',\n 'flyingfish',\n 'fowl',\n 'fox',\n 'frog',\n 'gamefowl',\n 'galliform',\n 'gazelle',\n 'gecko',\n 'gerbil',\n 'gibbon',\n 'giraffe',\n 'goat',\n 'goldfish',\n 'goose',\n 'gopher',\n 'gorilla',\n 'grasshopper',\n 'grouse',\n 'guan',\n 'guanaco',\n 'guineafowl',\n 'gull',\n 'guppy',\n 'haddock',\n 'halibut',\n 'hamster',\n 'hare',\n 'harrier',\n 'hawk',\n 'hedgehog',\n 'heron',\n 'herring',\n 'hippopotamus',\n 'hookworm',\n 'hornet',\n 'horse',\n 'hoverfly',\n 'hummingbird',\n 'hyena',\n 'iguana',\n 'impala',\n 'jackal',\n 'jaguar',\n 'jay',\n 'jellyfish',\n 'junglefowl',\n 'kangaroo',\n 'kingfisher',\n 'kite',\n 'kiwi',\n 'koala',\n 'koi',\n 'krill',\n 'ladybug',\n 'lamprey',\n 'landfowl',\n 'lark',\n 'leech',\n 'lemming',\n 'lemur',\n 'leopard',\n 'leopon',\n 'limpet',\n 'lion',\n 'lizard',\n 'llama',\n 'lobster',\n 'locust',\n 'loon',\n 'louse',\n 'lungfish',\n 'lynx',\n 'macaw',\n 'mackerel',\n 'magpie',\n 'mammal',\n 'manatee',\n 'mandrill',\n 'marlin',\n 'marmoset',\n 'marmot',\n 'marsupial',\n 'marten',\n 'mastodon',\n 'meadowlark',\n 'meerkat',\n 'mink',\n 'minnow',\n 'mite',\n 'mockingbird',\n 'mole',\n 'mollusk',\n 'mongoose',\n 'monkey',\n 'moose',\n 'mosquito',\n 'moth',\n 'mouse',\n 'mule',\n 'muskox',\n 'narwhal',\n 'newt',\n 'nightingale',\n 'ocelot',\n 'octopus',\n 'opossum',\n 'orangutan',\n 'orca',\n 'ostrich',\n 'otter',\n 'owl',\n 'ox',\n 'panda',\n 'panther',\n 'parakeet',\n 'parrot',\n 'parrotfish',\n 'partridge',\n 'peacock',\n 'peafowl',\n 'pelican',\n 'penguin',\n 'perch',\n 'pheasant',\n 'pig',\n 'pigeon',\n 'pike',\n 'pinniped',\n 'piranha',\n 'planarian',\n 'platypus',\n 'pony',\n 'porcupine',\n 'porpoise',\n 'possum',\n 'prawn',\n 'primate',\n 'ptarmigan',\n 'puffin',\n 'puma',\n 'python',\n 'quail',\n 'quelea',\n 'quokka',\n 'rabbit',\n 'raccoon',\n 'rat',\n 'rattlesnake',\n 'raven',\n 'reindeer',\n 'reptile',\n 'rhinoceros',\n 'roadrunner',\n 'rodent',\n 'rook',\n 'rooster',\n 'roundworm',\n 'sailfish',\n 'salamander',\n 'salmon',\n 'sawfish',\n 'scallop',\n 'scorpion',\n 'seahorse',\n 'shark',\n 'sheep',\n 'shrew',\n 'shrimp',\n 'silkworm',\n 'silverfish',\n 'skink',\n 'skunk',\n 'sloth',\n 'slug',\n 'smelt',\n 'snail',\n 'snake',\n 'snipe',\n 'sole',\n 'sparrow',\n 'spider',\n 'spoonbill',\n 'squid',\n 'squirrel',\n 'starfish',\n 'stingray',\n 'stoat',\n 'stork',\n 'sturgeon',\n 'swallow',\n 'swan',\n 'swift',\n 'swordfish',\n 'swordtail',\n 'tahr',\n 'takin',\n 'tapir',\n 'tarantula',\n 'tarsier',\n 'termite',\n 'tern',\n 'thrush',\n 'tick',\n 'tiger',\n 'tiglon',\n 'toad',\n 'tortoise',\n 'toucan',\n 'trout',\n 'tuna',\n 'turkey',\n 'turtle',\n 'tyrannosaurus',\n 'urial',\n 'vicuna',\n 'viper',\n 'vole',\n 'vulture',\n 'wallaby',\n 'walrus',\n 'wasp',\n 'warbler',\n 'weasel',\n 'whale',\n 'whippet',\n 'whitefish',\n 'wildcat',\n 'wildebeest',\n 'wildfowl',\n 'wolf',\n 'wolverine',\n 'wombat',\n 'woodpecker',\n 'worm',\n 'wren',\n 'xerinae',\n 'yak',\n 'zebra',\n 'alpaca',\n 'cat',\n 'cattle',\n 'chicken',\n 'dog',\n 'donkey',\n 'ferret',\n 'gayal',\n 'goldfish',\n 'guppy',\n 'horse',\n 'koi',\n 'llama',\n 'sheep',\n 'yak',\n 'unicorn',\n];\n\nconst adjectives = [\n 'average',\n 'big',\n 'colossal',\n 'fat',\n 'giant',\n 'gigantic',\n 'great',\n 'huge',\n 'immense',\n 'large',\n 'little',\n 'long',\n 'mammoth',\n 'massive',\n 'miniature',\n 'petite',\n 'puny',\n 'short',\n 'small',\n 'tall',\n 'tiny',\n 'boiling',\n 'breezy',\n 'broken',\n 'bumpy',\n 'chilly',\n 'cold',\n 'cool',\n 'creepy',\n 'crooked',\n 'cuddly',\n 'curly',\n 'damaged',\n 'damp',\n 'dirty',\n 'dry',\n 'dusty',\n 'filthy',\n 'flaky',\n 'fluffy',\n 'wet',\n 'broad',\n 'chubby',\n 'crooked',\n 'curved',\n 'deep',\n 'flat',\n 'high',\n 'hollow',\n 'low',\n 'narrow',\n 'round',\n 'shallow',\n 'skinny',\n 'square',\n 'steep',\n 'straight',\n 'wide',\n 'ancient',\n 'brief',\n 'early',\n 'fast',\n 'late',\n 'long',\n 'modern',\n 'old',\n 'quick',\n 'rapid',\n 'short',\n 'slow',\n 'swift',\n 'young',\n 'abundant',\n 'empty',\n 'few',\n 'heavy',\n 'light',\n 'many',\n 'numerous',\n 'Sound',\n 'cooing',\n 'deafening',\n 'faint',\n 'harsh',\n 'hissing',\n 'hushed',\n 'husky',\n 'loud',\n 'melodic',\n 'moaning',\n 'mute',\n 'noisy',\n 'purring',\n 'quiet',\n 'raspy',\n 'resonant',\n 'screeching',\n 'shrill',\n 'silent',\n 'soft',\n 'squealing',\n 'thundering',\n 'voiceless',\n 'whispering',\n 'bitter',\n 'delicious',\n 'fresh',\n 'juicy',\n 'ripe',\n 'rotten',\n 'salty',\n 'sour',\n 'spicy',\n 'stale',\n 'sticky',\n 'strong',\n 'sweet',\n 'tasteless',\n 'tasty',\n 'thirsty',\n 'fluttering',\n 'fuzzy',\n 'greasy',\n 'grubby',\n 'hard',\n 'hot',\n 'icy',\n 'loose',\n 'melted',\n 'plastic',\n 'prickly',\n 'rainy',\n 'rough',\n 'scattered',\n 'shaggy',\n 'shaky',\n 'sharp',\n 'shivering',\n 'silky',\n 'slimy',\n 'slippery',\n 'smooth',\n 'soft',\n 'solid',\n 'steady',\n 'sticky',\n 'tender',\n 'tight',\n 'uneven',\n 'weak',\n 'wet',\n 'wooden',\n 'afraid',\n 'angry',\n 'annoyed',\n 'anxious',\n 'arrogant',\n 'ashamed',\n 'awful',\n 'bad',\n 'bewildered',\n 'bored',\n 'combative',\n 'condemned',\n 'confused',\n 'creepy',\n 'cruel',\n 'dangerous',\n 'defeated',\n 'defiant',\n 'depressed',\n 'disgusted',\n 'disturbed',\n 'eerie',\n 'embarrassed',\n 'envious',\n 'evil',\n 'fierce',\n 'foolish',\n 'frantic',\n 'frightened',\n 'grieving',\n 'helpless',\n 'homeless',\n 'hungry',\n 'hurt',\n 'ill',\n 'jealous',\n 'lonely',\n 'mysterious',\n 'naughty',\n 'nervous',\n 'obnoxious',\n 'outrageous',\n 'panicky',\n 'repulsive',\n 'scary',\n 'scornful',\n 'selfish',\n 'sore',\n 'tense',\n 'terrible',\n 'thoughtless',\n 'tired',\n 'troubled',\n 'upset',\n 'uptight',\n 'weary',\n 'wicked',\n 'worried',\n 'agreeable',\n 'amused',\n 'brave',\n 'calm',\n 'charming',\n 'cheerful',\n 'comfortable',\n 'cooperative',\n 'courageous',\n 'delightful',\n 'determined',\n 'eager',\n 'elated',\n 'enchanting',\n 'encouraging',\n 'energetic',\n 'enthusiastic',\n 'excited',\n 'exuberant',\n 'fair',\n 'faithful',\n 'fantastic',\n 'fine',\n 'friendly',\n 'funny',\n 'gentle',\n 'glorious',\n 'good',\n 'happy',\n 'healthy',\n 'helpful',\n 'hilarious',\n 'jolly',\n 'joyous',\n 'kind',\n 'lively',\n 'lovely',\n 'lucky',\n 'obedient',\n 'perfect',\n 'pleasant',\n 'proud',\n 'relieved',\n 'silly',\n 'smiling',\n 'splendid',\n 'successful',\n 'thoughtful',\n 'victorious',\n 'vivacious',\n 'witty',\n 'wonderful',\n 'zealous',\n 'zany',\n 'other',\n 'good',\n 'new',\n 'old',\n 'great',\n 'high',\n 'small',\n 'different',\n 'large',\n 'local',\n 'social',\n 'important',\n 'long',\n 'young',\n 'national',\n 'british',\n 'right',\n 'early',\n 'possible',\n 'big',\n 'little',\n 'political',\n 'able',\n 'late',\n 'general',\n 'full',\n 'far',\n 'low',\n 'public',\n 'available',\n 'bad',\n 'main',\n 'sure',\n 'clear',\n 'major',\n 'economic',\n 'only',\n 'likely',\n 'real',\n 'black',\n 'particular',\n 'international',\n 'special',\n 'difficult',\n 'certain',\n 'open',\n 'whole',\n 'white',\n 'free',\n 'short',\n 'easy',\n 'strong',\n 'european',\n 'central',\n 'similar',\n 'human',\n 'common',\n 'necessary',\n 'single',\n 'personal',\n 'hard',\n 'private',\n 'poor',\n 'financial',\n 'wide',\n 'foreign',\n 'simple',\n 'recent',\n 'concerned',\n 'american',\n 'various',\n 'close',\n 'fine',\n 'english',\n 'wrong',\n 'present',\n 'royal',\n 'natural',\n 'individual',\n 'nice',\n 'french',\n 'nihilist',\n 'solipsist',\n 'materialist',\n 'surrealist',\n 'heroic',\n 'awesome',\n 'hedonist',\n 'absurd',\n 'current',\n 'modern',\n 'labour',\n 'legal',\n 'happy',\n 'final',\n 'red',\n 'normal',\n 'serious',\n 'previous',\n 'total',\n 'prime',\n 'significant',\n 'industrial',\n 'sorry',\n 'dead',\n 'specific',\n 'appropriate',\n 'top',\n 'soviet',\n 'basic',\n 'military',\n 'original',\n 'successful',\n 'aware',\n 'hon',\n 'popular',\n 'heavy',\n 'professional',\n 'direct',\n 'dark',\n 'cold',\n 'ready',\n 'green',\n 'useful',\n 'effective',\n 'western',\n 'traditional',\n 'scottish',\n 'german',\n 'independent',\n 'deep',\n 'interesting',\n 'considerable',\n 'involved',\n 'physical',\n 'hot',\n 'existing',\n 'responsible',\n 'complete',\n 'medical',\n 'blue',\n 'extra',\n 'past',\n 'male',\n 'interested',\n 'fair',\n 'essential',\n 'beautiful',\n 'civil',\n 'primary',\n 'obvious',\n 'future',\n 'environmental',\n 'positive',\n 'senior',\n 'nuclear',\n 'annual',\n 'relevant',\n 'huge',\n 'rich',\n 'commercial',\n 'safe',\n 'regional',\n 'practical',\n 'official',\n 'separate',\n 'key',\n 'chief',\n 'regular',\n 'due',\n 'additional',\n 'active',\n 'powerful',\n 'complex',\n 'standard',\n 'impossible',\n 'light',\n 'warm',\n 'middle',\n 'fresh',\n 'sexual',\n 'front',\n 'domestic',\n 'actual',\n 'united',\n 'technical',\n 'ordinary',\n 'cheap',\n 'strange',\n 'internal',\n 'excellent',\n 'quiet',\n 'soft',\n 'potential',\n 'northern',\n 'religious',\n 'quick',\n 'very',\n 'famous',\n 'cultural',\n 'proper',\n 'broad',\n 'joint',\n 'formal',\n 'limited',\n 'conservative',\n 'lovely',\n 'usual',\n 'ltd',\n 'unable',\n 'rural',\n 'initial',\n 'substantial',\n 'bright',\n 'average',\n 'leading',\n 'reasonable',\n 'immediate',\n 'suitable',\n 'equal',\n 'detailed',\n 'working',\n 'overall',\n 'female',\n 'afraid',\n 'democratic',\n 'growing',\n 'sufficient',\n 'scientific',\n 'eastern',\n 'correct',\n 'inc',\n 'irish',\n 'expensive',\n 'educational',\n 'mental',\n 'dangerous',\n 'critical',\n 'increased',\n 'familiar',\n 'unlikely',\n 'double',\n 'perfect',\n 'slow',\n 'tiny',\n 'dry',\n 'historical',\n 'thin',\n 'daily',\n 'southern',\n 'increasing',\n 'wild',\n 'alone',\n 'urban',\n 'empty',\n 'married',\n 'narrow',\n 'liberal',\n 'supposed',\n 'upper',\n 'apparent',\n 'tall',\n 'busy',\n 'bloody',\n 'prepared',\n 'russian',\n 'moral',\n 'careful',\n 'clean',\n 'attractive',\n 'japanese',\n 'vital',\n 'thick',\n 'alternative',\n 'fast',\n 'ancient',\n 'elderly',\n 'rare',\n 'external',\n 'capable',\n 'brief',\n 'wonderful',\n 'grand',\n 'typical',\n 'entire',\n 'grey',\n 'constant',\n 'vast',\n 'surprised',\n 'ideal',\n 'terrible',\n 'academic',\n 'funny',\n 'minor',\n 'pleased',\n 'severe',\n 'ill',\n 'corporate',\n 'negative',\n 'permanent',\n 'weak',\n 'brown',\n 'fundamental',\n 'odd',\n 'crucial',\n 'inner',\n 'used',\n 'criminal',\n 'contemporary',\n 'sharp',\n 'sick',\n 'near',\n 'roman',\n 'massive',\n 'unique',\n 'secondary',\n 'parliamentary',\n 'african',\n 'unknown',\n 'subsequent',\n 'angry',\n 'alive',\n 'guilty',\n 'lucky',\n 'enormous',\n 'well',\n 'yellow',\n 'unusual',\n 'net',\n 'tough',\n 'dear',\n 'extensive',\n 'glad',\n 'remaining',\n 'agricultural',\n 'alright',\n 'healthy',\n 'italian',\n 'principal',\n 'tired',\n 'efficient',\n 'comfortable',\n 'chinese',\n 'relative',\n 'friendly',\n 'conventional',\n 'willing',\n 'sudden',\n 'proposed',\n 'voluntary',\n 'slight',\n 'valuable',\n 'dramatic',\n 'golden',\n 'temporary',\n 'federal',\n 'keen',\n 'flat',\n 'silent',\n 'indian',\n 'worried',\n 'pale',\n 'statutory',\n 'welsh',\n 'dependent',\n 'firm',\n 'wet',\n 'competitive',\n 'armed',\n 'radical',\n 'outside',\n 'acceptable',\n 'sensitive',\n 'living',\n 'pure',\n 'global',\n 'emotional',\n 'sad',\n 'secret',\n 'rapid',\n 'adequate',\n 'fixed',\n 'sweet',\n 'administrative',\n 'wooden',\n 'remarkable',\n 'comprehensive',\n 'surprising',\n 'solid',\n 'rough',\n 'mere',\n 'mass',\n 'brilliant',\n 'maximum',\n 'absolute',\n 'electronic',\n 'visual',\n 'electric',\n 'cool',\n 'spanish',\n 'literary',\n 'continuing',\n 'supreme',\n 'chemical',\n 'genuine',\n 'exciting',\n 'written',\n 'advanced',\n 'extreme',\n 'classical',\n 'fit',\n 'favourite',\n 'widespread',\n 'confident',\n 'straight',\n 'proud',\n 'numerous',\n 'opposite',\n 'distinct',\n 'mad',\n 'helpful',\n 'given',\n 'disabled',\n 'consistent',\n 'anxious',\n 'nervous',\n 'awful',\n 'stable',\n 'constitutional',\n 'satisfied',\n 'conscious',\n 'developing',\n 'strategic',\n 'holy',\n 'smooth',\n 'dominant',\n 'remote',\n 'theoretical',\n 'outstanding',\n 'pink',\n 'pretty',\n 'clinical',\n 'minimum',\n 'honest',\n 'impressive',\n 'related',\n 'residential',\n 'extraordinary',\n 'plain',\n 'visible',\n 'accurate',\n 'distant',\n 'still',\n 'greek',\n 'complicated',\n 'musical',\n 'precise',\n 'gentle',\n 'broken',\n 'live',\n 'silly',\n 'fat',\n 'tight',\n 'monetary',\n 'round',\n 'psychological',\n 'violent',\n 'unemployed',\n 'inevitable',\n 'junior',\n 'sensible',\n 'grateful',\n 'pleasant',\n 'dirty',\n 'structural',\n 'welcome',\n 'deaf',\n 'above',\n 'continuous',\n 'blind',\n 'overseas',\n 'mean',\n 'entitled',\n 'delighted',\n 'loose',\n 'occasional',\n 'evident',\n 'desperate',\n 'fellow',\n 'universal',\n 'square',\n 'steady',\n 'classic',\n 'equivalent',\n 'intellectual',\n 'victorian',\n 'level',\n 'ultimate',\n 'creative',\n 'lost',\n 'medieval',\n 'clever',\n 'linguistic',\n 'convinced',\n 'judicial',\n 'raw',\n 'sophisticated',\n 'asleep',\n 'vulnerable',\n 'illegal',\n 'outer',\n 'revolutionary',\n 'bitter',\n 'changing',\n 'australian',\n 'native',\n 'imperial',\n 'strict',\n 'wise',\n 'informal',\n 'flexible',\n 'collective',\n 'frequent',\n 'experimental',\n 'spiritual',\n 'intense',\n 'rational',\n 'generous',\n 'inadequate',\n 'prominent',\n 'logical',\n 'bare',\n 'historic',\n 'modest',\n 'dutch',\n 'acute',\n 'electrical',\n 'valid',\n 'weekly',\n 'gross',\n 'automatic',\n 'loud',\n 'reliable',\n 'mutual',\n 'liable',\n 'multiple',\n 'ruling',\n 'curious',\n 'sole',\n 'managing',\n 'pregnant',\n 'latin',\n 'nearby',\n 'exact',\n 'underlying',\n 'identical',\n 'satisfactory',\n 'marginal',\n 'distinctive',\n 'electoral',\n 'urgent',\n 'presidential',\n 'controversial',\n 'everyday',\n 'encouraging',\n 'organic',\n 'continued',\n 'expected',\n 'statistical',\n 'desirable',\n 'innocent',\n 'improved',\n 'exclusive',\n 'marked',\n 'experienced',\n 'unexpected',\n 'superb',\n 'sheer',\n 'disappointed',\n 'frightened',\n 'gastric',\n 'romantic',\n 'naked',\n 'reluctant',\n 'magnificent',\n 'convenient',\n 'established',\n 'closed',\n 'uncertain',\n 'artificial',\n 'diplomatic',\n 'tremendous',\n 'marine',\n 'mechanical',\n 'retail',\n 'institutional',\n 'mixed',\n 'required',\n 'biological',\n 'known',\n 'functional',\n 'straightforward',\n 'superior',\n 'digital',\n 'spectacular',\n 'unhappy',\n 'confused',\n 'unfair',\n 'aggressive',\n 'spare',\n 'painful',\n 'abstract',\n 'asian',\n 'associated',\n 'legislative',\n 'monthly',\n 'intelligent',\n 'hungry',\n 'explicit',\n 'nasty',\n 'just',\n 'faint',\n 'coloured',\n 'ridiculous',\n 'amazing',\n 'comparable',\n 'successive',\n 'realistic',\n 'back',\n 'decent',\n 'decentralized',\n 'bitcoin',\n 'cypherpunk',\n 'unnecessary',\n 'flying',\n 'random',\n 'influential',\n 'dull',\n 'genetic',\n 'neat',\n 'marvellous',\n 'crazy',\n 'damp',\n 'giant',\n 'secure',\n 'bottom',\n 'skilled',\n 'subtle',\n 'elegant',\n 'brave',\n 'lesser',\n 'parallel',\n 'steep',\n 'intensive',\n 'casual',\n 'tropical',\n 'lonely',\n 'partial',\n 'preliminary',\n 'concrete',\n 'alleged',\n 'assistant',\n 'vertical',\n 'upset',\n 'delicate',\n 'mild',\n 'occupational',\n 'excessive',\n 'progressive',\n 'exceptional',\n 'integrated',\n 'striking',\n 'continental',\n 'okay',\n 'harsh',\n 'combined',\n 'fierce',\n 'handsome',\n 'characteristic',\n 'chronic',\n 'compulsory',\n 'interim',\n 'objective',\n 'splendid',\n 'magic',\n 'systematic',\n 'obliged',\n 'payable',\n 'fun',\n 'horrible',\n 'primitive',\n 'fascinating',\n 'ideological',\n 'metropolitan',\n 'surrounding',\n 'estimated',\n 'peaceful',\n 'premier',\n 'operational',\n 'technological',\n 'kind',\n 'advisory',\n 'hostile',\n 'precious',\n 'accessible',\n 'determined',\n 'excited',\n 'impressed',\n 'provincial',\n 'smart',\n 'endless',\n 'isolated',\n 'drunk',\n 'geographical',\n 'like',\n 'dynamic',\n 'boring',\n 'forthcoming',\n 'unfortunate',\n 'definite',\n 'super',\n 'notable',\n 'indirect',\n 'stiff',\n 'wealthy',\n 'awkward',\n 'lively',\n 'neutral',\n 'artistic',\n 'content',\n 'mature',\n 'colonial',\n 'ambitious',\n 'evil',\n 'magnetic',\n 'verbal',\n 'legitimate',\n 'sympathetic',\n 'empirical',\n 'head',\n 'shallow',\n 'vague',\n 'naval',\n 'depressed',\n 'shared',\n 'added',\n 'shocked',\n 'mid',\n 'worthwhile',\n 'qualified',\n 'missing',\n 'blank',\n 'absent',\n 'favourable',\n 'polish',\n 'israeli',\n 'developed',\n 'profound',\n 'representative',\n 'enthusiastic',\n 'dreadful',\n 'rigid',\n 'reduced',\n 'cruel',\n 'coastal',\n 'peculiar',\n 'swiss',\n 'crude',\n 'extended',\n 'selected',\n 'eager',\n 'canadian',\n 'bold',\n 'relaxed',\n 'corresponding',\n 'running',\n 'planned',\n 'applicable',\n 'immense',\n 'allied',\n 'comparative',\n 'uncomfortable',\n 'conservation',\n 'productive',\n 'beneficial',\n 'bored',\n 'charming',\n 'minimal',\n 'mobile',\n 'turkish',\n 'orange',\n 'rear',\n 'passive',\n 'suspicious',\n 'overwhelming',\n 'fatal',\n 'resulting',\n 'symbolic',\n 'registered',\n 'neighbouring',\n 'calm',\n 'irrelevant',\n 'patient',\n 'compact',\n 'profitable',\n 'rival',\n 'loyal',\n 'moderate',\n 'distinguished',\n 'interior',\n 'noble',\n 'insufficient',\n 'eligible',\n 'mysterious',\n 'varying',\n 'managerial',\n 'molecular',\n 'olympic',\n 'linear',\n 'prospective',\n 'printed',\n 'parental',\n 'diverse',\n 'elaborate',\n 'furious',\n 'fiscal',\n 'burning',\n 'useless',\n 'semantic',\n 'embarrassed',\n 'inherent',\n 'philosophical',\n 'deliberate',\n 'awake',\n 'variable',\n 'promising',\n 'unpleasant',\n 'varied',\n 'sacred',\n 'selective',\n 'inclined',\n 'tender',\n 'hidden',\n 'worthy',\n 'intermediate',\n 'sound',\n 'protective',\n 'fortunate',\n 'slim',\n 'defensive',\n 'divine',\n 'stuck',\n 'driving',\n 'invisible',\n 'misleading',\n 'circular',\n 'mathematical',\n 'inappropriate',\n 'liquid',\n 'persistent',\n 'solar',\n 'doubtful',\n 'manual',\n 'architectural',\n 'intact',\n 'incredible',\n 'devoted',\n 'prior',\n 'tragic',\n 'respectable',\n 'optimistic',\n 'convincing',\n 'unacceptable',\n 'decisive',\n 'competent',\n 'spatial',\n 'respective',\n 'binding',\n 'relieved',\n 'nursing',\n 'toxic',\n 'select',\n 'redundant',\n 'integral',\n 'then',\n 'probable',\n 'amateur',\n 'fond',\n 'passing',\n 'specified',\n 'territorial',\n 'horizontal',\n 'inland',\n 'cognitive',\n 'regulatory',\n 'miserable',\n 'resident',\n 'polite',\n 'scared',\n 'gothic',\n 'civilian',\n 'instant',\n 'lengthy',\n 'adverse',\n 'korean',\n 'unconscious',\n 'anonymous',\n 'aesthetic',\n 'orthodox',\n 'static',\n 'unaware',\n 'costly',\n 'fantastic',\n 'foolish',\n 'fashionable',\n 'causal',\n 'compatible',\n 'wee',\n 'implicit',\n 'dual',\n 'ok',\n 'cheerful',\n 'subjective',\n 'forward',\n 'surviving',\n 'exotic',\n 'purple',\n 'cautious',\n 'visiting',\n 'aggregate',\n 'ethical',\n 'teenage',\n 'dying',\n 'disastrous',\n 'delicious',\n 'confidential',\n 'underground',\n 'thorough',\n 'grim',\n 'autonomous',\n 'atomic',\n 'frozen',\n 'colourful',\n 'injured',\n 'uniform',\n 'ashamed',\n 'glorious',\n 'wicked',\n 'coherent',\n 'rising',\n 'shy',\n 'novel',\n 'balanced',\n 'delightful',\n 'arbitrary',\n 'adjacent',\n 'worrying',\n 'weird',\n 'unchanged',\n 'rolling',\n 'evolutionary',\n 'intimate',\n 'sporting',\n 'disciplinary',\n 'formidable',\n 'lexical',\n 'noisy',\n 'gradual',\n 'accused',\n 'homeless',\n 'supporting',\n 'coming',\n 'renewed',\n 'excess',\n 'retired',\n 'rubber',\n 'chosen',\n 'outdoor',\n 'embarrassing',\n 'preferred',\n 'bizarre',\n 'appalling',\n 'agreed',\n 'imaginative',\n 'governing',\n 'accepted',\n 'vocational',\n 'mighty',\n 'puzzled',\n 'worldwide',\n 'organisational',\n 'sunny',\n 'eldest',\n 'eventual',\n 'spontaneous',\n 'vivid',\n 'rude',\n 'faithful',\n 'ministerial',\n 'innovative',\n 'controlled',\n 'conceptual',\n 'unwilling',\n 'civic',\n 'meaningful',\n 'alive',\n 'brainy',\n 'breakable',\n 'busy',\n 'careful',\n 'cautious',\n 'clever',\n 'concerned',\n 'crazy',\n 'curious',\n 'dead',\n 'different',\n 'difficult',\n 'doubtful',\n 'easy',\n 'famous',\n 'fragile',\n 'helpful',\n 'helpless',\n 'important',\n 'impossible',\n 'innocent',\n 'inquisitive',\n 'modern',\n 'open',\n 'outstanding',\n 'poor',\n 'powerful',\n 'puzzled',\n 'real',\n 'rich',\n 'shy',\n 'sleepy',\n 'super',\n 'tame',\n 'uninterested',\n 'wandering',\n 'wild',\n 'wrong',\n 'adorable',\n 'alert',\n 'average',\n 'beautiful',\n 'blonde',\n 'bloody',\n 'blushing',\n 'bright',\n 'clean',\n 'clear',\n 'cloudy',\n 'colorful',\n 'crowded',\n 'cute',\n 'dark',\n 'drab',\n 'distinct',\n 'dull',\n 'elegant',\n 'fancy',\n 'filthy',\n 'glamorous',\n 'gleaming',\n 'graceful',\n 'grotesque',\n 'homely',\n 'light',\n 'misty',\n 'motionless',\n 'muddy',\n 'plain',\n 'poised',\n 'quaint',\n 'shiny',\n 'smoggy',\n 'sparkling',\n 'spotless',\n 'stormy',\n 'strange',\n 'ugly',\n 'unsightly',\n 'unusual',\n 'bad',\n 'better',\n 'beautiful',\n 'big',\n 'black',\n 'blue',\n 'bright',\n 'clumsy',\n 'crazy',\n 'dizzy',\n 'dull',\n 'fat',\n 'frail',\n 'friendly',\n 'funny',\n 'great',\n 'green',\n 'gigantic',\n 'gorgeous',\n 'grumpy',\n 'handsome',\n 'happy',\n 'horrible',\n 'itchy',\n 'jittery',\n 'jolly',\n 'kind',\n 'long',\n 'lazy',\n 'magnificent',\n 'magenta',\n 'many',\n 'mighty',\n 'mushy',\n 'nasty',\n 'new',\n 'nice',\n 'nosy',\n 'nutty',\n 'nutritious',\n 'odd',\n 'orange',\n 'ordinary',\n 'pretty',\n 'precious',\n 'prickly',\n 'purple',\n 'quaint',\n 'quiet',\n 'quick',\n 'quickest',\n 'rainy',\n 'rare',\n 'ratty',\n 'red',\n 'roasted',\n 'robust',\n 'round',\n 'sad',\n 'scary',\n 'scrawny',\n 'short',\n 'silly',\n 'stingy',\n 'strange',\n 'striped',\n 'spotty',\n 'tart',\n 'tall',\n 'tame',\n 'tan',\n 'tender',\n 'testy',\n 'tricky',\n 'tough',\n 'ugly',\n 'ugliest',\n 'vast',\n 'watery',\n 'wasteful',\n 'wonderful',\n 'yellow',\n 'yummy',\n 'zany',\n];\n\nexport default {\n gunOnceDefined,\n async getHash (data: any, format = `base64`) {\n if (data === undefined) {\n throw new Error('getHash data was undefined');\n }\n if (typeof data !== 'string') {\n data = JSON.stringify(data);\n }\n\n const encoder = new TextEncoder();\n data = encoder.encode(data);\n const buffer = await crypto.subtle.digest('SHA-256', data);\n\n if (format === 'buffer') {\n return buffer;\n }\n\n const hash = this.arrayBufferToBase64(buffer);\n if (format === `hex`) {\n return this.base64ToHex(hash);\n }\n return hash;\n },\n\n capitalize(s: string) {\n return s.charAt(0).toUpperCase() + s.slice(1)\n },\n\n generateName() {\n return `${this.capitalize(_.sample(adjectives)!)} ${this.capitalize(_.sample(animals)!)}`;\n },\n\n base64ToHex(str: string) {\n const raw = atob(str);\n let result = '';\n for (let i = 0; i < raw.length; i++) {\n const hex = raw.charCodeAt(i).toString(16);\n result += (hex.length === 2 ? hex : `0${ hex}`);\n }\n return result;\n },\n\n arrayBufferToBase64( buffer ) {\n var binary = '';\n var bytes = new Uint8Array( buffer );\n var len = bytes.byteLength;\n for (var i = 0; i < len; i++) {\n binary += String.fromCharCode( bytes[ i ] );\n }\n return window.btoa( binary );\n },\n\n getCaret(el: HTMLInputElement) {\n if (el.selectionStart) {\n return el.selectionStart;\n } else { // @ts-ignore\n if (document.selection) {\n el.focus();\n // @ts-ignore\n const r = document.selection.createRange();\n if (r === null) {\n return 0;\n }\n // @ts-ignore\n const re = el.createTextRange(), rc = re.duplicate();\n re.moveToBookmark(r.getBookmark());\n rc.setEndPoint('EndToStart', re);\n return rc.text.length;\n }\n }\n return 0;\n },\n\n getUrlParameter(sParam: string, sParams: string) {\n const sPageURL = sParams || window.location.search.substring(1);\n const sURLVariables = sPageURL.split('&');\n let sParameterName, i;\n\n for (i = 0; i < sURLVariables.length; i++) {\n sParameterName = sURLVariables[i].split('=');\n if (sParameterName[0] === sParam) {\n return sParameterName[1] === undefined ? true : decodeURIComponent(sParameterName[1]);\n }\n }\n return;\n },\n\n formatTime(date: Date) {\n // @ts-ignore\n const t: any = date.toLocaleTimeString(undefined, {timeStyle: 'short'});\n const s = t.split(':');\n if (s.length === 3) { // safari tries to display seconds\n return `${s[0] }:${ s[1] }${s[2].slice(2)}`;\n }\n return t;\n },\n\n formatDate(date: Date) {\n const t = date.toLocaleString(undefined, {dateStyle: 'short', timeStyle: 'short'});\n const s = t.split(':');\n if (s.length === 3) { // safari tries to display seconds\n return `${s[0] }:${ s[1] }${s[2].slice(2)}`;\n }\n return t;\n },\n\n getDaySeparatorText(date: Date, dateStr: string, now?: Date, nowStr?: string) {\n if (!now) {\n now = new Date();\n // @ts-ignore\n nowStr = now.toLocaleDateString({dateStyle: 'short'});\n }\n if (dateStr === nowStr) {\n return 'today';\n }\n const dayDifference = Math.round((now - date) / (1000 * 60 * 60 * 24));\n if (dayDifference === 0) {\n return 'today';\n }\n if (dayDifference === 1) {\n return 'yesterday';\n }\n if (dayDifference <= 5) {\n return date.toLocaleDateString(undefined, {weekday: 'long'});\n }\n return dateStr;\n },\n\n getProfileLink(pub: string) {\n return `${window.location.origin}/#/profile/${encodeURIComponent(pub)}`;\n },\n\n truncateString(s: string, length = 30) {\n return s.length > length ? `${s.slice(0, length)}...` : s;\n },\n\n createElement(type: string, cls?: string, parent?: HTMLElement) {\n const el = document.createElement(type);\n if (cls) {\n el.setAttribute('class', cls);\n }\n if (parent) {\n parent.appendChild(el);\n }\n return el;\n },\n\n isNode,\n isElectron,\n isMobile,\n\n throttle: (func: Function, limit: number) => {\n let inThrottle: boolean;\n return function() {\n const args = arguments;\n const context = this;\n if (!inThrottle) {\n func.apply(context, args);\n inThrottle = true;\n setTimeout(() => inThrottle = false, limit);\n }\n };\n },\n debounce: (func: Function, delay: number) => {\n let inDebounce: boolean;\n return function() {\n const context = this;\n const args = arguments;\n clearTimeout(inDebounce);\n inDebounce = setTimeout(() => func.apply(context, args), delay);\n };\n },\n sample: (arr: any[]) => arr[Math.floor(Math.random() * arr.length)],\n sampleSize: (arr: any[], size: number) => {\n const shuffled = arr.slice(0);\n let i = arr.length;\n let min = i - size;\n let temp;\n let index;\n while (i-- > min) {\n index = Math.floor((i + 1) * Math.random());\n temp = shuffled[index];\n shuffled[index] = shuffled[i];\n shuffled[i] = temp;\n }\n return shuffled.slice(min);\n },\n defer: (func: Function) => setTimeout(func, 0),\n once: (func: Function) => {\n let called = false;\n return function() {\n if (called) {\n return;\n }\n called = true;\n func.apply(this, arguments);\n };\n },\n omit: (obj: any, keys: string[]) => {\n const newObj = {};\n Object.keys(obj).forEach(key => {\n if (!keys.includes(key)) {\n newObj[key] = obj[key];\n }\n });\n return newObj;\n }\n};\n","/*eslint no-useless-escape: \"off\", camelcase: \"off\" */\n\nimport util from './util';\n// eslint-disable-line no-unused-vars\n\nlet myKey: any;\n\nexport default {\n async getActiveKey(datadir = `.`, keyfile = `iris.key`, fs?: any) {\n if (myKey) {\n return myKey;\n }\n if (fs) {\n const privKeyFile = `${datadir}/${keyfile}`;\n if (fs.existsSync(privKeyFile)) {\n const f = fs.readFileSync(privKeyFile, `utf8`);\n myKey = this.fromString(f);\n } else {\n const newKey = await this.generate();\n myKey = myKey || newKey; // eslint-disable-line require-atomic-updates\n fs.writeFileSync(privKeyFile, this.toString(myKey));\n fs.chmodSync(privKeyFile, 400);\n }\n if (!myKey) {\n throw new Error(`loading default key failed - check ${datadir}/${keyfile}`);\n }\n } else {\n const str = window.localStorage.getItem(`iris.myKey`);\n if (str) {\n myKey = this.fromString(str);\n } else {\n const newKey = await this.generate();\n myKey = myKey || newKey; // eslint-disable-line require-atomic-updates\n window.localStorage.setItem(`iris.myKey`, this.toString(myKey));\n }\n if (!myKey) {\n throw new Error(`loading default key failed - check localStorage iris.myKey`);\n }\n }\n return myKey;\n },\n\n getDefault(datadir = `.`, keyfile = `iris.key`) {\n return this.getActiveKey(datadir, keyfile);\n },\n\n async getActivePub(datadir = `.`, keyfile = `iris.key`) {\n const key = await this.getActiveKey(datadir, keyfile);\n return key.pub;\n },\n\n setActiveKey(key: any, save = true, datadir = `.`, keyfile = `iris.key`, fs: any) {\n myKey = key;\n if (!save) return;\n if (util.isNode) {\n const privKeyFile = `${datadir}/${keyfile}`;\n fs.writeFileSync(privKeyFile, this.toString(myKey));\n fs.chmodSync(privKeyFile, 400);\n } else {\n window.localStorage.setItem(`iris.myKey`, this.toString(myKey));\n }\n },\n\n toString(key: any) {\n return JSON.stringify(key);\n },\n\n getId(key: any) {\n if (!(key && key.pub)) {\n throw new Error(`missing param`);\n }\n return key.pub; // hack until GUN supports lookups by keyID\n //return util.getHash(key.pub);\n },\n\n fromString(str: string) {\n return JSON.parse(str);\n },\n\n // copied from Gun.SEA\n async generate() {\n try {\n var ecdhSubtle = window.crypto.subtle;\n // First: ECDSA keys for signing/verifying...\n var sa = await ecdhSubtle.generateKey({name: 'ECDSA', namedCurve: 'P-256'}, true, ['sign', 'verify'])\n .then(async (keys) => {\n // privateKey scope doesn't leak out from here!\n //const { d: priv } = await shim.subtle.exportKey('jwk', keys.privateKey)\n var key: any = {};\n key.priv = (await ecdhSubtle.exportKey('jwk', keys.privateKey)).d;\n var pub = await ecdhSubtle.exportKey('jwk', keys.publicKey);\n //const pub = Buff.from([ x, y ].join(':')).toString('base64') // old\n key.pub = pub.x + '.' + pub.y; // new\n // x and y are already base64\n // pub is UTF8 but filename/URL safe (https://www.ietf.org/rfc/rfc3986.txt)\n // but split on a non-base64 letter.\n return key;\n })\n\n // To include PGPv4 kind of keyId:\n // const pubId = await SEA.keyid(keys.pub)\n // Next: ECDH keys for encryption/decryption...\n\n try {\n var dh = await ecdhSubtle.generateKey({name: 'ECDH', namedCurve: 'P-256'}, true, ['deriveKey'])\n .then(async (keys) => {\n // privateKey scope doesn't leak out from here!\n var key: any = {};\n key.epriv = (await ecdhSubtle.exportKey('jwk', keys.privateKey)).d;\n var pub = await ecdhSubtle.exportKey('jwk', keys.publicKey);\n //const epub = Buff.from([ ex, ey ].join(':')).toString('base64') // old\n key.epub = pub.x + '.' + pub.y; // new\n // ex and ey are already base64\n // epub is UTF8 but filename/URL safe (https://www.ietf.org/rfc/rfc3986.txt)\n // but split on a non-base64 letter.\n return key;\n })\n } catch (e) {\n if (e == 'Error: ECDH is not a supported algorithm') {\n console.log('Ignoring ECDH...')\n } else {\n throw e\n }\n }\n dh = dh || {};\n\n var r = {pub: sa.pub, priv: sa.priv, /* pubId, */ epub: dh.epub, epriv: dh.epriv}\n return r;\n } catch (e) {\n console.log(e);\n throw e;\n return;\n }\n },\n\n keyToJwk(key: any): JsonWebKey {\n if (typeof key === 'string') {\n key = { pub: key };\n }\n const jwk: JsonWebKey = {\n kty: 'EC',\n crv: 'P-256',\n x: key.pub.split('.')[0],\n y: key.pub.split('.')[1],\n ext: true,\n };\n jwk.key_ops = key.priv ? ['sign'] : ['verify'];\n if (key.priv) {\n jwk.d = key.priv\n }\n return jwk;\n },\n\n async sign(data: any, pair: any, cb?: Function, opt: any = {}) {\n if(undefined === data){ throw '`undefined` not allowed.' }\n const text = typeof data === 'string' ? data : JSON.stringify(data); // Gun.SEA doesn't preserve data type: \"0\" -> 0. Should we change this?\n var jwk = this.keyToJwk(pair);\n var hash = await util.getHash(text, 'buffer') as Buffer;\n var sig = await window.crypto.subtle.importKey('jwk', jwk, {name: 'ECDSA', namedCurve: 'P-256'}, false, ['sign'])\n .then((key) =>\n window.crypto.subtle.sign({name: 'ECDSA', hash: {name: 'SHA-256'}}, key, hash)\n ) // privateKey scope doesn't leak out from here!\n var r: any = {m: text, s: Buffer.from(sig).toString(opt.encode || 'base64')}\n if(!opt.raw){ r = 'aSEA' + JSON.stringify(r) } // \"aSEA\" was a dumb fix for an earlier bug in Gun.SEA\n\n if(cb){ try{ cb(r) }catch(e){console.log(e)} }\n return r;\n },\n\n async verify(data: any, pair: any, cb?: Function, opt: any = {}) {\n try {\n if (typeof data === 'string') {\n if (data.slice(0, 4) === 'aSEA') {\n data = data.slice(4)\n }\n try {\n data = JSON.parse(data);\n } catch (e) {\n // not JSON\n }\n }\n var pub = pair.pub || pair;\n var jwk = this.keyToJwk(pub);\n var key = await crypto.subtle.importKey('jwk', jwk, {name: 'ECDSA', namedCurve: 'P-256'}, false, ['verify']);\n\n let text = data.m;\n try {\n text = JSON.parse(text);\n } catch (e) {\n // ignore\n }\n\n let hash = await util.getHash(text, 'buffer') as Buffer;\n var buf, sig, isValid;\n buf = Buffer.from(data.s, opt.encode || 'base64');\n sig = new Uint8Array(buf);\n isValid = await crypto.subtle.verify({name: 'ECDSA', hash: {name: 'SHA-256'}}, key, sig, hash);\n var r = isValid? JSON.parse(text) : undefined;\n if (r === undefined) {\n //console.log('invalid', data, pair, hash);\n }\n\n if(cb){ try{ cb(r) }catch(e){console.log(e)} }\n return r;\n } catch (e) {\n console.log(e);\n return undefined;\n }\n },\n\n async secret(key: any, pair: any) {\n var keysToEcdhJwk = (pub: any, d?: any): any => { // d === priv\n //var [ x, y ] = shim.Buffer.from(pub, 'base64').toString('utf8').split(':') // old\n var [ x, y ] = pub.split('.') // new\n const jwk: JsonWebKey = Object.assign(\n d ? { d } : {},\n { x: x, y: y, kty: 'EC', crv: 'P-256', ext: true }\n );\n return jwk;\n }\n\n var pub = key.epub || key;\n var epub = pair.epub;\n var epriv = pair.epriv;\n var pubJwk = keysToEcdhJwk(pub);\n var props = Object.assign({\n public: await crypto.subtle.importKey('jwk', pubJwk, {name: 'ECDH', namedCurve: 'P-256'}, true, [])\n },{name: 'ECDH', namedCurve: 'P-256'});\n var privJwk = keysToEcdhJwk(epub, epriv);\n return crypto.subtle.importKey('jwk', privJwk, {name: 'ECDH', namedCurve: 'P-256'}, false, ['deriveBits'])\n .then(async (privKey) => {\n var derivedBits = await crypto.subtle.deriveBits(props, privKey, 256);\n var rawBits = new Uint8Array(derivedBits);\n var derivedKey = await crypto.subtle.importKey('raw', rawBits,{ name: 'AES-GCM', length: 256 }, true, [ 'encrypt', 'decrypt' ]);\n return crypto.subtle.exportKey('jwk', derivedKey).then(({ k }) => k);\n });\n },\n\n async aeskey(key: any, salt?: Buffer) {\n const combo = key + (salt || this.random(8)).toString('utf8'); // new\n let hash: any = await crypto.subtle.digest({name: 'SHA-256'}, new TextEncoder().encode(combo));\n hash = Buffer.from(hash, 'binary');\n\n const keyB64 = hash.toString('base64');\n const k = keyB64.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/\\=/g, '');\n\n const jwkKey = { kty: 'oct', k: k, ext: false, alg: 'A256GCM' };\n return await crypto.subtle.importKey('jwk', jwkKey, {name:'AES-GCM'}, false, ['encrypt', 'decrypt'])\n },\n\n random(len: number) {\n return Buffer.from(crypto.getRandomValues(new Uint8Array(len)));\n },\n\n async encrypt(data: any, pair: any, cb?: Function, opt: any = {}) {\n var key = pair.epriv || pair;\n if(undefined === data){ throw '`undefined` not allowed.' }\n var msg = (typeof data == 'string')? data : JSON.stringify(data); // Gun.SEA doesn't preserve data type: \"0\" -> 0. Should we change this?\n var rand = {s: this.random(9), iv: this.random(15)}; // consider making this 9 and 15 or 18 or 12 to reduce == padding.\n var ct = await this.aeskey(key, rand.s).then((aes) => crypto.subtle.encrypt({ // Keeping the AES key scope as private as possible...\n name: opt.name || 'AES-GCM', iv: new Uint8Array(rand.iv)\n }, aes, new TextEncoder().encode(msg)));\n var r: any = {\n // @ts-ignore\n ct: Buffer.from(ct, 'binary').toString(opt.encode || 'base64'),\n iv: rand.iv.toString(opt.encode || 'base64'),\n s: rand.s.toString(opt.encode || 'base64')\n }\n if(!opt.raw){ r = 'SEA' + JSON.stringify(r) }\n\n if(cb){ try{ cb(r) }catch(e){console.log(e)} }\n return r;\n },\n\n async decrypt(data: any, pair: any, cb?: Function, opt: any = {}) {\n var key = pair.epriv || pair;\n let json;\n try { data = JSON.parse(data); } catch (e) {}\n if (data.indexOf('SEA{') === 0) {\n json = JSON.parse(data.slice(3));\n } else {\n json = JSON.parse(data);\n }\n if (!json.ct || !json.iv || !json.s) {\n throw 'Invalid ciphertext ' + json;\n }\n var buf: Buffer, bufiv: Buffer, bufct: Buffer;\n buf = Buffer.from(json.s, opt.encode || 'base64');\n bufiv = Buffer.from(json.iv, opt.encode || 'base64');\n bufct = Buffer.from(json.ct, opt.encode || 'base64');\n var ct = await this.aeskey(key, buf).then((aes) => crypto.subtle.decrypt({ // Keeping aesKey scope as private as possible...\n name: opt.name || 'AES-GCM', iv: new Uint8Array(bufiv), tagLength: 128\n }, aes, new Uint8Array(bufct)));\n const text = new TextDecoder('utf8').decode(ct);\n var r = text;\n try { r = JSON.parse(text); } catch (_e) {}\n if(cb){ try{ cb(r) }catch(e){console.log(e)} }\n return r;\n }\n}","import session from './session';\nimport _ from './lodash';\nimport util from './util';\nimport publicState from './global';\nimport Key from './Key';\n\nconst ELECTRON_GUN_URL = 'http://localhost:8767/gun';\nlet maxConnectedPeers = 1;\n\ntype Peer = {\n url?: string;\n enabled?: boolean;\n from?: string;\n visibility?: string;\n}\n\ntype Peers = {\n [key: string]: Peer\n}\n\nconst DEFAULT_PEERS: Peers = {\n 'wss://gun-rs.iris.to/gun': {},\n// 'wss://gun-us.herokuapp.com/gun': {},\n};\n\nif (self.window) {\n const loc = window.location;\n const host = loc.host;\n const is_localhost_but_not_dev = host.startsWith('localhost') && host !== 'localhost:8080';\n if (loc.hostname.endsWith('herokuapp.com') || is_localhost_but_not_dev) {\n Object.keys(DEFAULT_PEERS).forEach(url => DEFAULT_PEERS[url].enabled = false);\n DEFAULT_PEERS[`${loc.origin}/gun`] = {enabled: true};\n }\n}\n\n/**\n * Networking and peer management utilities\n */\nexport default {\n known: {} as Peers,\n\n /** */\n async add(peer: Peer) {\n if (peer.from) {\n Object.keys(this.known).forEach(k => {\n if (this.known[k].from === peer.from) { // remove previous peer url from the same user\n delete this.known[k];\n }\n });\n }\n const url = peer.url || '';\n this.known[url] = this.known[url] || _.omit(peer, ['url']);\n if (peer.visibility === 'public') {\n // rolling some crypto operations to obfuscate actual url in case we want to remove it\n let secret = await Key.secret(session.getKey().epub, session.getKey()) || '';\n let encryptedUrl = await Key.encrypt(peer.url, secret);\n let encryptedUrlHash = await util.getHash(encryptedUrl);\n publicState().user().get('peers').get(encryptedUrlHash).put({url: peer.url, lastSeen: new Date().toISOString()});\n }\n if (peer.enabled !== false) {\n peer.url && this.connect(peer.url); // this calls savePeers()\n } else {\n this.save();\n }\n },\n\n /** */\n remove(url: string) {\n delete this.known[url];\n this.save();\n },\n\n /** */\n disconnect(peerFromGun: any) {\n publicState().on('bye', peerFromGun);\n peerFromGun.url = '';\n },\n\n save() {\n // TODO store them in iris.local() instead of localStorage\n localStorage.setItem('gunPeers', JSON.stringify(this.known));\n },\n\n getSaved() {\n let p: any = localStorage.getItem('gunPeers');\n if (p && p !== 'undefined') {\n p = JSON.parse(p);\n } else {\n p = DEFAULT_PEERS;\n }\n if (util.isElectron) {\n p[ELECTRON_GUN_URL] = {};\n }\n Object.keys(p).forEach(k => _.defaults(p[k], {enabled: true}));\n return p;\n },\n\n /** */\n reset() {\n localStorage.setItem('gunPeers', '');\n this.known = this.getSaved();\n },\n\n /** */\n connect(url: string) {\n if (!url) {\n return;\n }\n if (this.isMixedContent(url)) { return; }\n if (this.known[url]) {\n this.known[url].enabled = true;\n publicState().opt({peers: [url]});\n this.save();\n } else {\n this.add({url});\n }\n },\n\n /** */\n disable(url: string, peerFromGun: any) {\n this.known[url].enabled = false;\n if (peerFromGun) {\n this.disconnect(peerFromGun);\n }\n this.save();\n },\n\n isMixedContent(url: string) {\n if (!url) { return false; }\n return window.location.protocol === 'https:' && (url.indexOf('http:') === 0);\n },\n\n random() {\n const connectToLocalElectron = util.isElectron && this.known[ELECTRON_GUN_URL] && this.known[ELECTRON_GUN_URL].enabled !== false;\n const sampleSize = connectToLocalElectron ? Math.max(maxConnectedPeers - 1, 1) : maxConnectedPeers;\n const sample = _.sampleSize(\n Object.keys(\n _.pickBy(this.known, (peer: any, url: string) => {\n return !this.isMixedContent(url) && peer.enabled && !(util.isElectron && url === ELECTRON_GUN_URL);\n })\n ), sampleSize\n );\n if (sample && connectToLocalElectron) {\n sample.push(ELECTRON_GUN_URL);\n }\n console.log('sample', sample, JSON.stringify(this.known));\n return sample;\n },\n\n checkGunPeerCount() {\n return;\n let peersFromGun = publicState().back('opt.peers');\n let connectedPeers = Object.values(peersFromGun).filter((peer: any) => {\n if (peer && peer.wire && peer.wire.constructor.name !== 'WebSocket') {\n console.log('WebRTC peer', peer);\n }\n return peer && peer.wire && peer.wire.readyState === 1 && peer.wire.bufferedAmount === 0 && peer.wire.constructor.name === 'WebSocket';\n });\n if (connectedPeers.length < maxConnectedPeers) {\n let unconnectedPeers = Object.keys(this.known).filter(url => {\n let addedToGun = Object.values(peersFromGun).map((peer:any) => peer.url).indexOf(url) > -1;\n let enabled = this.known[url].enabled;\n const mixedContent = (window.location.protocol === 'https:' && (url.indexOf('http:') === 0));\n return !mixedContent && enabled && !addedToGun;\n });\n if (unconnectedPeers.length) {\n const sample = String(_.sample(unconnectedPeers));\n this.connect(sample);\n }\n }\n if (connectedPeers.length > maxConnectedPeers) {\n this.disconnect(_.sample(connectedPeers));\n }\n },\n\n init() {\n this.known = this.getSaved();\n /* use the default value of 1 for now because of memory issue\n local().get('settings').get('maxConnectedPeers').on(n => {\n if (n !== undefined) maxConnectedPeers = n;\n });\n */\n setInterval(() => this.checkGunPeerCount(), 1000);\n }\n};\n","import {Message} from './Message';\n\nexport function generateUuid() {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\n const r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8);\n return v.toString(16);\n });\n}\n\nexport class Actor {\n id: string;\n\n handle(_message: Message) {\n throw new Error('not implemented');\n }\n\n // so we can support a similar api as Channels\n postMessage(message: Message) {\n this.handle(message);\n }\n\n constructor(id = generateUuid()) {\n this.id = id;\n }\n}","import {Actor} from './Actor';\nimport {Children} from \"./Node\";\nimport Key from \"../Key\";\n\nexport class Message {\n // When Messages are sent over BroadcastChannel, class name is lost.\n static fromObject(obj: any): Message {\n if (obj.type === 'get') {\n return Get.fromObject(obj);\n } else if (obj.type === 'put') {\n return Put.fromObject(obj);\n } else {\n throw new Error('not implemented');\n }\n }\n\n static async deserialize(str: string, from: Actor): Promise {\n const obj = JSON.parse(str);\n if (obj.get) {\n return Get.deserialize(obj, str, from);\n } else if (obj.put) {\n return Put.deserialize(obj, str, from);\n } else if (obj.dam && obj.dam === \"hi\") {\n return Hi.deserialize(obj);\n } else {\n throw new Error('unknown message type');\n }\n }\n\n serialize(): string {\n throw new Error('not implemented');\n }\n}\n\nfunction generateMsgId(): string {\n return Math.random().toString(36).slice(2, 10);\n}\n\nexport class Get implements Message {\n type: string = 'get';\n id: string;\n nodeId: string;\n from: Actor;\n recipients?: string[];\n childKey?: string;\n jsonStr?: string;\n checksum?: string;\n\n serialize(): string {\n if (this.jsonStr) {\n return this.jsonStr;\n }\n\n // TODO remove \"global/\", replace /^user\\// with ~\n let nodeId = this.nodeId.replace(/^global\\//, '').replace(/^user\\//, '~');\n const obj: any = {\n \"#\": this.id,\n get: {\n \"#\": nodeId,\n \".\": this.childKey\n },\n };\n\n if (this.childKey) {\n obj.get['.'] = this.childKey;\n }\n this.jsonStr = JSON.stringify(obj);\n return this.jsonStr;\n }\n\n static async deserialize(obj: any, jsonStr: string, from: Actor): Promise {\n const id = obj['#'];\n let nodeId = obj.get['#']; // TODO add \"global/\" prefix, replace /^~/ with \"user/\"\n if (nodeId.startsWith('~')) {\n nodeId = 'user/' + nodeId.slice(1);\n }\n nodeId = 'global/' + nodeId;\n const childKey = obj.get['.'];\n return new Get(id, nodeId, from, undefined, childKey, jsonStr);\n }\n\n static fromObject(obj: any): Get {\n return new Get(obj.id, obj.nodeId, obj.from, obj.recipients, obj.childKey, obj.jsonStr, obj.checksum);\n }\n\n static new(nodeId: string, from: Actor, recipients?: string[], childKey?: string, jsonStr?: string, checksum?: string): Get {\n const id = generateMsgId();\n return new Get(id, nodeId, from, recipients, childKey, jsonStr, checksum);\n }\n\n constructor(id: string, nodeId: string, from: Actor, recipients?: string[], childKey?: string, jsonStr?: string, checksum?: string) {\n this.id = id;\n this.from = from;\n this.nodeId = nodeId;\n this.recipients = recipients;\n this.childKey = childKey;\n this.jsonStr = jsonStr;\n this.checksum = checksum;\n }\n}\n\nexport type UpdatedNodes = {\n [key: string]: Children;\n};\n\nexport class Put implements Message {\n type: string = 'put';\n id: string;\n from: Actor;\n updatedNodes: UpdatedNodes;\n inResponseTo?: string;\n recipients?: string[];\n jsonStr?: string;\n checksum?: string;\n\n serialize(): string {\n const obj = {\n \"#\" : this.id,\n \"put\": {} as any\n };\n\n // iterate over this.updatedNodes\n for (const [nodeId, children] of Object.entries(this.updatedNodes)) {\n let myNodeId = nodeId.replace(/^global\\//, '').replace(/^user\\//, '~');\n const node: any = obj.put[myNodeId] = {};\n for (const [childKey, childValue] of Object.entries(children)) {\n if (!childValue) {\n continue;\n }\n const data = childValue;\n node[childKey] = data.value;\n node[\"_\"] = node[\"_\"] || {};\n node[\"_\"][\">\"] = node[\"_\"][\">\"] || {};\n node[\"_\"][\">\"][childKey] = data.updatedAt;\n }\n }\n return JSON.stringify(obj);\n }\n\n static async deserialize(obj: any, jsonStr: string, from: Actor): Promise {\n const id = obj['#'];\n const updatedNodes: UpdatedNodes = {};\n type SerializedChildren = {\n [key: string]: any;\n }\n for (const [nodeId, c] of Object.entries(obj.put)) {\n const children = c as SerializedChildren;\n const node: any = {};\n const isUserSpace = nodeId.startsWith('~');\n for (const [childKey, childValue] of Object.entries(children)) {\n if (childKey === '_') {\n continue;\n }\n if (isUserSpace) {\n const user = nodeId.split('/')[0].slice(1);\n const signatureObj = JSON.parse(childValue);\n const timestamp = children['_']['>'][childKey];\n const value = signatureObj[':'];\n const signedObj = {\n \"#\": nodeId,\n \".\": childKey,\n \":\": value,\n \">\": timestamp\n };\n const signature = signatureObj['~'];\n const signedStr = JSON.stringify(signedObj);\n if (await Key.verify({s: signature, m: signedStr}, user) === undefined) {\n throw new Error(`invalid signature in ${nodeId} of ${signedStr}`);\n }\n }\n // TODO test hash space validity\n const updatedAt = children['_']['>'][childKey];\n node[childKey] = {\n value: childValue,\n updatedAt,\n };\n }\n const myNodeId = 'global/' + nodeId.replace(/^~/, 'user/');\n updatedNodes[myNodeId] = node;\n }\n return new Put(id, updatedNodes, from, undefined, undefined, jsonStr);\n }\n\n static fromObject(obj: any): Put {\n return new Put(obj.id, obj.updatedNodes, obj.from, obj.inResponseTo, obj.recipients, obj.jsonStr, obj.checksum);\n }\n\n static new(updatedNodes: UpdatedNodes, from: Actor, inResponseTo?: string, recipients?: string[], jsonStr?: string, checksum?: string): Put {\n const id = generateMsgId();\n return new Put(id, updatedNodes, from, inResponseTo, recipients, jsonStr, checksum);\n }\n\n static newFromKv(key: string, children: Children, from:Actor) {\n const updatedNodes: UpdatedNodes = {};\n updatedNodes[key] = children;\n return Put.new(updatedNodes, from);\n }\n\n constructor(id: string, updatedNodes: UpdatedNodes, from: Actor, inResponseTo?: string, recipients?: string[], jsonStr?: string, checksum?: string) {\n this.id = id;\n this.from = from;\n this.updatedNodes = updatedNodes;\n this.inResponseTo = inResponseTo;\n this.recipients = recipients;\n this.jsonStr = jsonStr;\n this.checksum = checksum;\n }\n}\n\nexport class Hi implements Message {\n type: string = 'hi';\n peerId: string;\n jsonStr?: string;\n\n //{\"#\":\"aHHO9Srurq9nh6Q9\",\"dam\":\"hi\"}\n\n\n serialize(): string {\n if (this.jsonStr) {\n return this.jsonStr;\n }\n\n const obj: any = {\n dam: \"hi\",\n \"#\": this.peerId,\n };\n\n this.jsonStr = JSON.stringify(obj);\n return this.jsonStr;\n }\n\n static deserialize(obj: any): Hi {\n const peerId = obj['#'];\n return new Hi(peerId);\n }\n\n constructor(peerId: string, jsonStr?: string) {\n this.peerId = peerId;\n this.jsonStr = jsonStr;\n }\n}\n\nconst parseGet = (get: any, from: Actor): Get => {\n return new Get(get.id, get.nodeId, from, get.recipients, get.childKey, get.jsonStr, get.checksum);\n}\n\nconst parsePut = (put: any, from: Actor): Put => {\n return new Put(put.id, put.updatedNodes, from, put.inResponseTo, put.recipients, put.jsonStr, put.checksum);\n}\n\nexport function messageFromJsonString(jsonStr: string, from: Actor): Message {\n const obj = JSON.parse(jsonStr);\n if (obj.get) {\n return parseGet(obj.get, from);\n } else if (obj.put) {\n return parsePut(obj.put, from);\n } else {\n throw new Error('Unknown message type');\n }\n}","import {Put, Get, Message} from '../Message'\nimport { Actor } from '../Actor';\nimport QuickLRU from 'quick-lru';\nimport {Children} from \"../Node\";\n//import {NodeData} from \"../Node\";\n// import * as Comlink from \"comlink\";\nimport _ from '../../lodash';\n\nexport default class Memory extends Actor {\n config = {};\n store: QuickLRU = new QuickLRU({ maxSize: 10000 });\n\n constructor(config: any = {}) {\n super();\n this.config = config;\n }\n\n handle(message: Message) {\n if (message instanceof Put) {\n this.handlePut(message);\n } else if (message instanceof Get) {\n this.handleGet(message);\n } else {\n console.log('Memory got unknown message', message);\n }\n }\n\n handleGet(message: Get) {\n if (!message.from) {\n console.log('no from in get message');\n return;\n }\n let children = this.store.get(message.nodeId);\n if (children) {\n //console.log('have', message.nodeId, children);\n const putMessage = Put.newFromKv(message.nodeId, children, this);\n putMessage.inResponseTo = message.id;\n message.from && message.from.postMessage(putMessage);\n } else {\n //console.log('dont have', message.nodeId);\n }\n }\n\n mergeAndSave(nodeName: string, children: Children) {\n const existing = this.store.get(nodeName);\n\n // TODO check updatedAt timestamp\n if (existing === undefined) {\n this.store.set(nodeName, children);\n } else {\n for (const [key, value] of Object.entries(children)) {\n if (existing[key] && existing[key].updatedAt >= value.updatedAt) {\n continue;\n }\n existing[key] = value;\n }\n this.store.set(nodeName, existing);\n }\n }\n\n async handlePut(put: Put) {\n for (const [nodeName, children] of Object.entries(put.updatedNodes)) {\n if (!children) {\n console.log('deleting', nodeName);\n this.store.delete(nodeName);\n continue;\n }\n this.mergeAndSave(nodeName, children);\n }\n }\n}\n\n/*\nlet actor;\nglobal.onconnect = () => {\n if (actor) {\n console.log ('worker already exists');\n } else {\n console.log('starting worker');\n actor = actor || new IndexedDB();\n }\n}\n */\n\n// self.onconnect = (e) => Comlink.expose(actor, e.ports[0]);","import {Put, Get, Message} from '../Message'\nimport { Actor } from '../Actor';\nimport _ from \"../../lodash\";\nimport Dexie from 'dexie';\nimport {Children, NodeData} from \"../Node\";\n// import * as Comlink from \"comlink\";\n\n// TODO: add LRU or other eviction policy, clean up least important data when db gets too big\nclass MyDexie extends Dexie {\n nodes: Dexie.Table;\n constructor(dbName: string) {\n super(dbName);\n this.version(1).stores({\n nodes: \", value, updatedAt\"\n });\n this.nodes = this.table(\"nodes\");\n }\n}\n\nexport default class IndexedDB extends Actor {\n config = {};\n notStored = new Set();\n putQueue: any = {};\n getQueue: any = {};\n i = 0;\n queue = 0;\n db: MyDexie;\n\n constructor(config: any = {}) {\n super();\n this.config = config;\n const dbName = (config.dbName || 'iris');\n this.db = new MyDexie(dbName);\n this.db.open().catch((err) => {\n console.error(err.stack || err);\n });\n }\n\n put(nodeId: string, value: any) {\n // add puts to a queue and dexie bulk write them once per 500ms\n this.putQueue[nodeId] = value;\n this.throttledPut();\n }\n\n throttledPut = _.throttle(() => {\n const keys = Object.keys(this.putQueue);\n const values = keys.map(key => {\n this.notStored.delete(key);\n return this.putQueue[key];\n });\n this.db.nodes.bulkPut(values, keys).catch((err) => {\n console.error(err);\n });\n this.putQueue = {};\n }, 500);\n\n get(path: string, callback: Function) {\n this.getQueue[path] = this.getQueue[path] || [];\n this.getQueue[path].push(callback);\n this.throttledGet();\n }\n\n throttledGet = _.throttle(() => {\n // clone this.getQueue and clear it\n const queue = this.getQueue;\n const keys = Object.keys(queue);\n this.db.nodes.bulkGet(keys).then((values: (any | undefined)[]) => {\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n const value = values[i];\n const callbacks = queue[key];\n // console.log('have', key, value);\n for (const callback of callbacks) {\n callback(value);\n }\n }\n });\n this.getQueue = {};\n }, 100);\n\n handle(message: Message) {\n if (message instanceof Put) {\n this.handlePut(message);\n } else if (message instanceof Get) {\n this.handleGet(message);\n } else {\n console.log('worker got unknown message', message);\n }\n }\n\n handleGet(message: Get) {\n if (this.notStored.has(message.nodeId)) {\n // TODO message implying that the key is not stored\n return;\n }\n this.get(message.nodeId, (children: any) => {\n // TODO: this takes a long time to return\n if (children === undefined) {\n this.notStored.add(message.nodeId);\n // TODO message implying that the key is not stored\n } else {\n const putMessage = Put.newFromKv(message.nodeId, children, this);\n putMessage.inResponseTo = message.id;\n message.from && message.from.postMessage(putMessage);\n }\n });\n }\n\n mergeAndSave(path: string, children: Children) {\n this.get(path, (existing: any) => {\n // TODO check updatedAt timestamp\n if (existing === undefined) {\n this.put(path, children);\n } else {\n for (const [key, value] of Object.entries(children)) {\n if (existing[key] && existing[key].updatedAt >= value.updatedAt) {\n continue;\n }\n existing[key] = value;\n }\n this.put(path, existing);\n }\n });\n }\n\n savePath(path: string, value: any) {\n if (value === undefined) {\n this.db.nodes.delete(path);\n this.notStored.add(path);\n } else {\n this.notStored.delete(path);\n this.mergeAndSave(path, value);\n }\n }\n\n async handlePut(put: Put) {\n for (const [nodeName, children] of Object.entries(put.updatedNodes)) {\n if (!children) {\n console.log('deleting', nodeName);\n continue;\n }\n this.mergeAndSave(nodeName, children);\n }\n }\n}\n\n/*\nlet actor;\nglobal.onconnect = () => {\n if (actor) {\n console.log ('worker already exists');\n } else {\n console.log('starting worker');\n actor = actor || new IndexedDB();\n }\n}\n */\n\n// self.onconnect = (e) => Comlink.expose(actor, e.ports[0]);","import {Get, Message, Put} from \"../Message\";\nimport {Actor} from \"../Actor\";\n//@ts-ignore\n\nexport default class Websocket extends Actor {\n ws: WebSocket;\n router: Actor;\n sendQueue: string[] = [];\n\n constructor(url: string, router: Actor) {\n super('websocket:' + url);\n console.log('Websocket', url);\n this.router = router;\n this.ws = new WebSocket(url.replace('http', 'ws'));\n this.ws.onopen = () => {\n //this.ws.send(new Hi(this.router.peerId).serialize());\n console.log(`Connected to ${url}`);\n this.sendQueue.forEach((message) => this.ws.send(message));\n this.sendQueue = [];\n }\n this.ws.onmessage = async (event) => {\n try {\n const message = await Message.deserialize(event.data, this);\n this.router.postMessage(message);\n } catch (e) {\n //console.log('Failed to deserialize message', event.data, e);\n }\n }\n this.ws.onclose = () => {\n console.log(`Disconnected from ${url}`);\n }\n this.ws.onerror = () => {\n console.log(`Error on ${url}`);\n }\n }\n\n handle(message: Message): void {\n if (message instanceof Get || message instanceof Put) {\n if (message.from === this) {\n return;\n }\n if (this.ws.readyState === WebSocket.OPEN) {\n this.ws.send(message.serialize());\n } else if (this.ws.readyState === WebSocket.CONNECTING) {\n this.sendQueue.push(message.serialize());\n }\n }\n }\n}\n\n\n","import {Actor} from \"./Actor\";\nimport Memory from \"./adapters/Memory\";\nimport IndexedDB from \"./adapters/IndexedDB\";\nimport Websocket from \"./adapters/Websocket\";\nimport {Put, Get, Message} from \"./Message\";\n// import * as Comlink from \"comlink\";\n\n/*\nclass SeenGetMessage {\n constructor(id, from, lastReplyChecksum) {\n this.id = id;\n this.from = from;\n this.lastReplyChecksum = lastReplyChecksum;\n }\n}\n*/\n\nexport default class Router extends Actor {\n storageAdapters: Set = new Set();\n networkAdapters: Set = new Set();\n serverPeers: Set = new Set();\n seenMessages: Set = new Set();\n seenGetMessages: Map = new Map();\n subscribersByTopic: Map> = new Map();\n msgCounter = 0;\n peerId: string;\n\n constructor(config: any = {}) {\n super('router');\n // default random id\n this.peerId = config.peerId || Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15);\n this.storageAdapters.add(new Memory(config));\n this.storageAdapters.add(new IndexedDB(config));\n console.log('config', config);\n if (config.peers) {\n for (const peer of config.peers) {\n if (peer) {\n this.serverPeers.add(new Websocket(peer, this));\n }\n }\n }\n }\n\n handle(message: Message) {\n //console.log('router received', message);\n if (message instanceof Put || message instanceof Get) {\n if (this.seenMessages.has(message.id)) {\n return;\n }\n this.seenMessages.add(message.id);\n if (message instanceof Put) {\n this.handlePut(message);\n } else if (message instanceof Get) {\n this.handleGet(message);\n }\n }\n }\n\n handlePut(put: Put) {\n const sendTo: Set = new Set();\n Object.keys(put.updatedNodes).forEach(path => {\n // topic is first 3 nodes of path\n const topic = path.split('/').slice(0, 3).join('/');\n const subscribers = this.subscribersByTopic.get(topic);\n // send to storage adapters\n //console.log('put subscribers', subscribers);\n for (const storageAdapter of this.storageAdapters) {\n if (put.from !== storageAdapter) {\n sendTo.add(storageAdapter);\n }\n }\n\n for (const peer of this.serverPeers) {\n if (put.from !== peer) {\n sendTo.add(peer);\n }\n }\n\n if (subscribers) {\n for (const subscriber of subscribers) {\n if (subscriber !== put.from) {\n sendTo.add(subscriber);\n }\n }\n }\n });\n for (const actor of sendTo) {\n actor.postMessage(put);\n }\n }\n\n opt(opts: any) {\n if (opts.peers) {\n for (const peer of opts.peers) {\n if (peer) {\n this.serverPeers.add(new Websocket(peer, this));\n }\n }\n }\n }\n\n handleGet(get: Get) {\n const topic = get.nodeId.split('/')[1];\n const sendTo: Set = new Set();\n for (const storageAdapter of this.storageAdapters) {\n if (get.from !== storageAdapter) {\n sendTo.add(storageAdapter);\n }\n }\n for (const peer of this.serverPeers) {\n if (get.from !== peer) {\n sendTo.add(peer);\n }\n }\n if (!this.subscribersByTopic.has(topic)) {\n this.subscribersByTopic.set(topic, new Set());\n }\n const subscribers = this.subscribersByTopic.get(topic);\n if (subscribers) {\n if (!subscribers.has(get.from)) {\n subscribers.add(get.from);\n }\n }\n for (const actor of sendTo) {\n actor.postMessage(get);\n }\n }\n}\n\n/*\nlet actor: Actor;\nself.onconnect = () => {\n console.log('router shared worker connected');\n actor = actor || new Router();\n}\n*/\n\n// self.onconnect = (e) => Comlink.expose(actor, e.ports[0]);","import _ from '../lodash';\nimport {Actor} from './Actor';\nimport {Message, Put, Get, UpdatedNodes} from './Message';\n\n// @ts-ignore\nimport Router from './Router';\nimport Key from \"../Key\";\n//import * as Comlink from \"comlink\";\n\nexport type NodeData = {\n value: any;\n updatedAt: number;\n};\n\nexport type Children = {\n [key: string]: NodeData;\n}\n\nexport type Config = {\n peerId?: string;\n allowPublicSpace: boolean;\n myPublicKey?: string;\n enableStats: boolean;\n webSocketPeers?: string[];\n localOnly: boolean;\n}\n\nexport const DEFAULT_CONFIG: Config = {\n allowPublicSpace: false,\n enableStats: true,\n localOnly: true\n}\n\n// TODO move memory storage to its own adapter? it would make things simpler here\nexport default class Node extends Actor {\n root: Node;\n parent?: Node;\n children = new Map();\n once_subscriptions = new Map();\n on_subscriptions = new Map();\n map_subscriptions = new Map();\n counter = 0;\n config: Config;\n currentUser: any;\n router: Router;\n\n constructor(id = '', config?: Config, parent?: Node) {\n super(id);\n this.parent = parent;\n this.config = config || (parent && parent.config) || DEFAULT_CONFIG;\n if (parent) {\n this.root = parent.root;\n this.router = parent.router;\n } else {\n this.root = this;\n //@ts-ignore\n this.router = new Router({dbName: this.id + '-idb', peers: this.config.webSocketPeers});\n //console.log('idbWorker', idbWorker);\n //const router = Comlink.wrap(routerWorker);\n }\n }\n\n getCurrentUser(): any {\n return this.root.currentUser;\n }\n\n setCurrentUser(key: any) {\n this.root.currentUser = key;\n }\n\n handle(message: Message): void {\n if (message instanceof Put) {\n for (const [key, children] of Object.entries(message.updatedNodes)) {\n if (!children || typeof children !== 'object') {\n continue;\n }\n if (key === this.id) {\n for (const [childKey, childData] of Object.entries(children)) {\n this.get(childKey).doCallbacks(childData, childKey); // TODO children should have proper NodeData\n }\n }\n }\n this.parent && this.parent.handle(message);\n }\n };\n\n get(key: string): Node {\n const existing = this.children.get(key);\n if (existing) {\n return existing;\n }\n const newNode = new Node(`${this.id}/${key}`, this.config, this);\n this.children.set(key, newNode);\n return newNode;\n }\n\n user(pub: string | undefined): Node {\n pub = pub || (this.root.currentUser && this.root.currentUser.pub);\n if (!pub) {\n throw new Error(\"no public key!\");\n }\n return this.get('user').get(pub as string);\n }\n\n auth(key: any) {\n // TODO get public key from key\n this.root.setCurrentUser(key);\n return;\n }\n\n doCallbacks = (data: NodeData, key: string) => {\n if (typeof data.value === 'string' && data.value.startsWith('{\":\":')) {\n data.value = JSON.parse(data.value)[':'];\n }\n for (const [id, callback] of this.on_subscriptions) {\n const event = { off: () => this.on_subscriptions.delete(id) };\n callback(data.value, key, null, event);\n }\n for (const [id, callback] of this.once_subscriptions) {\n callback(data.value, key, null, {});\n this.once_subscriptions.delete(id);\n }\n if (this.parent) {\n const parent = this.parent;\n for (const [id, callback] of parent.map_subscriptions) {\n const event = { off: () => parent.map_subscriptions.delete(id) };\n callback(data.value, key, null, event);\n }\n }\n };\n\n async put(value: any): Promise {\n const updatedAt = Date.now();\n if (Array.isArray(value)) {\n throw new Error('put() does not support arrays');\n }\n if (typeof value === 'function') {\n throw new Error('put() does not support functions');\n }\n if (typeof value === 'object' && value !== null) {\n // TODO: update the whole path of parent nodes\n for (const key in value) {\n this.get(key).put(value[key]);\n }\n return;\n }\n value = await this.signIfNeeded(value);\n this.children = new Map();\n const updatedNodes: UpdatedNodes = {};\n await this.addParentNodes(updatedNodes, value, updatedAt);\n const put = Put.new(updatedNodes, this);\n this.handle(put);\n this.router.postMessage(put);\n }\n\n private async signIfNeeded(value: any) {\n if (this.id.indexOf('global/user/') === 0) {\n if (!this.getCurrentUser()) {\n throw new Error('not authenticated');\n }\n if (this.id.indexOf('global/user/' + this.getCurrentUser().pub) !== 0) {\n throw new Error('not allowed ' + this.id);\n }\n const signed = await Key.sign(value, this.getCurrentUser(), undefined, {raw: true});\n value = JSON.stringify({':': signed.m, '~': signed.s});\n console.log('saving signed value', value);\n }\n return value;\n }\n\n private async addParentNodes(updatedNodes: UpdatedNodes, value: any, updatedAt: number) {\n // TODO sign\n if (this.parent) {\n const childName = this.id.split('/').pop() as string;\n const parentId = this.parent.id;\n updatedNodes[parentId] = updatedNodes[parentId] || {};\n updatedNodes[parentId][childName] = {value, updatedAt};\n await this.parent.addParentNodes(updatedNodes, {'#': this.parent.id }, updatedAt);\n }\n }\n\n private request() {\n if (this.parent) { // TODO router should decide whether to re-request from peers\n const childKey = this.id.split('/').pop();\n this.router.postMessage(Get.new(this.parent.id, this, undefined, childKey));\n }\n }\n\n async once(callback?: Function | null): Promise {\n const id = this.counter++;\n callback && this.once_subscriptions.set(id, callback);\n this.request();\n }\n\n on(callback: Function): void {\n const id = this.counter++;\n this.on_subscriptions.set(id, callback);\n //const event = { off: () => this.on_subscriptions.delete(id) };\n this.request();\n }\n\n map(callback: Function): void {\n const id = this.counter++;\n this.map_subscriptions.set(id, callback);\n // TODO: child key should probably still be included. But how to handle link responses?\n this.router.postMessage(Get.new(this.id, this, undefined));\n }\n\n opt(opts: any) {\n this.router.opt(opts);\n }\n}","import peers from \"./peers\";\nimport Node from \"./db/Node\";\n\nlet globalState: any;\n\nexport default function(opts: any = {}) {\n if (!globalState) {\n peers.init();\n const webSocketPeers = (opts.peers || peers.random());\n console.log('webSocketPeers', webSocketPeers);\n const myOpts = Object.assign({ webSocketPeers, localStorage: false, retry:Infinity }, opts);\n if (opts.peers) {\n console.log('adding peers', opts.peers);\n opts.peers.forEach((url: string) => peers.add({url}));\n }\n globalState = new Node('global', myOpts);\n }\n return globalState;\n}","// @ts-nocheck\n\n/*eslint no-useless-escape: \"off\", camelcase: \"off\" */\n\nconst UNIQUE_ID_VALIDATORS = {\n email: /^([\\w-]+(?:\\.[\\w-]+)*)@((?:[\\w-]+\\.)*\\w[\\w-]{0,66})\\.([a-z]{2,6}(?:\\.[a-z]{2})?)$/i,\n bitcoin: /^[13][a-km-zA-HJ-NP-Z0-9]{26,33}$/,\n bitcoin_address: /^[13][a-km-zA-HJ-NP-Z0-9]{26,33}$/,\n ip: /^(([1-9]?\\d|1\\d\\d|2[0-5][0-5]|2[0-4]\\d)\\.){3}([1-9]?\\d|1\\d\\d|2[0-5][0-5]|2[0-4]\\d)$/,\n ipv6: /^(?:[A-F0-9]{1,4}:){7}[A-F0-9]{1,4}$/,\n gpg_fingerprint: null,\n gpg_keyid: null,\n google_oauth2: null,\n tel: /^\\d{7,}$/,\n phone: /^\\d{7,}$/,\n keyID: null,\n url: /[-a-zA-Z0-9@:%_\\+.~#?&//=]{2,256}\\.[a-z]{2,4}\\b(\\/[-a-zA-Z0-9@:%_\\+.~#?&//=]*)?/gi,\n account: /^([\\w-]+(?:\\.[\\w-]+)*)@((?:[\\w-]+\\.)*\\w[\\w-]{0,66})\\.([a-z]{2,6}(?:\\.[a-z]{2})?)$/i,\n uuid: /[0-9a-f]{8}\\-[0-9a-f]{4}\\-[0-9a-f]{4}\\-[0-9a-f]{4}\\-[0-9a-f]{12}/\n};\n\n// TODO this class could perhaps be removed\n\nclass Attribute {\n constructor(a, b) {\n if (typeof a === `object`) {\n if (typeof a.value !== `string`) { throw new Error(`param1.value must be a string, got ${typeof a.value}: ${JSON.stringify(a.value)}`); }\n if (typeof a.type !== `string`) { throw new Error(`param1.type must be a string, got ${typeof a.type}: ${JSON.stringify(a.type)}`); }\n b = a.value;\n a = a.type;\n }\n if (typeof a !== `string`) { throw new Error(`First param must be a string, got ${typeof a}: ${JSON.stringify(a)}`); }\n if (!a.length) { throw new Error(`First param string is empty`); }\n if (b) {\n if (typeof b !== `string`) { throw new Error(`Second parameter must be a string, got ${typeof b}: ${JSON.stringify(b)}`); }\n if (!b.length) { throw new Error(`Second param string is empty`); }\n this.type = a;\n this.value = b;\n } else {\n this.value = a;\n const t = Attribute.guessTypeOf(this.value);\n if (t) {\n this.type = t;\n } else {\n throw new Error(`Type of attribute was omitted and could not be guessed`);\n }\n }\n }\n\n static getUuid() {\n const b = a => a ? (a ^ Math.random() * 16 >> a / 4).toString(16) : ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, b);\n return new Attribute(`uuid`, b());\n }\n\n static getUniqueIdValidators() {\n return UNIQUE_ID_VALIDATORS;\n }\n\n static isUniqueType(type) {\n return Object.keys(UNIQUE_ID_VALIDATORS).indexOf(type) > -1;\n }\n\n isUniqueType() {\n return Attribute.isUniqueType(this.type);\n }\n\n static guessTypeOf(value) {\n for (const key in UNIQUE_ID_VALIDATORS) {\n if (value.match(UNIQUE_ID_VALIDATORS[key])) {\n return key;\n }\n }\n }\n\n static equals(a, b) {\n return a.equals(b);\n }\n\n equals(a) {\n return a && this.type === a.type && this.value === a.value;\n }\n\n uri() {\n return `${encodeURIComponent(this.value)}:${encodeURIComponent(this.type)}`;\n }\n}\n\nexport default Attribute;\n","import globalState from './global';\nimport session from './session';\n\n/**\n * Get a public space where only the specified user (public key) can write. Others can read.\n * @param pub The public key string or keypair object of the user. Defaults to the current user from session.\n * @returns {Node} The user space.\n */\nexport default function(pub: any = session.getKey()) {\n if (typeof pub === 'string') {\n return globalState().user(pub);\n } else if (typeof pub === 'object') {\n const userSpace = globalState().user(pub.pub);\n userSpace.auth(pub);\n return userSpace;\n }\n}\n","// @ts-nocheck\n\nimport util from './util';\nimport Attribute from './Attribute';\nimport session from './session';\nimport publicState from './global';\nimport userState from './public';\nimport Key from './Key';\n\n// TODO: extract Group channels into their own class\n\nconst DEFAULT_PERMISSIONS = {read: true, write: true, admin: false};\n\n/**\n* Private communication channel between two or more participants ([Gun](https://github.com/amark/gun) public keys). Can be used independently of other Iris stuff.\n*\n* Used as a core element of [iris-messenger](https://github.com/irislib/iris-messenger).\n*\n* You can use iris.private(pub) to always use the same Channel object for a given pub.\n*\n* ---\n*\n* #### Key-value API\n* `channel.put(key, value)` and `channel.on(key, callback)`.\n*\n* Note that each participant has their own versions of each key-value — they don't overwrite each other. `channel.on()` callback returns them all by default and has a parameter that indicates whose value you got.\n*\n* While values are encrypted, encryption of keys is not implemented yet.\n*\n* #### Message API\n* `channel.send()` and `channel.getMessages()` for timestamp-indexed chat-style messaging.\n*\n* Message data is encrypted, but timestamps are public so that peers can return your messages in a sequential order.\n*\n* ---\n*\n* You can open a channel with yourself for a private key-value space or a \"note to self\" type chat with yourself.\n*\n* **Privacy disclaimer:** Channel ids, data values and messages are encrypted, but message timestamps are unencrypted so that peers can return them to you in a sequential order. By looking at the unencrypted timestamps (or Gun subscriptions), it is possible to guess who are communicating with each other. This could be improved by indexing messages by *day* only, so making the guess would be more difficult, while you could still return them in a semi-sequential order.\n*\n* @param {Object} options\n* @param {string} options.key your keypair\n* @param {Object} options.gun [gun](https://github.com/amark/gun) instance\n* @param options.participants (optional) string or string array or permissions object ({'pub1':{read:true,write:true,admin:false},'pub2'...}) of participant public keys (your own key is included by default)\n* @param {string} options.chatLink (optional) chat link instead of participants list\n* @param {string} options.uuid (group channels only) unique channel identifier. Leave out for new channel.\n* @param {string} options.name (group channels only) channel name\n* @example\n* // Copy & paste this to console at https://iris.to or other page that has gun, sea and iris-lib\n* // Due to an unsolved bug, someoneElse's messages only start showing up after a reload\n*\n* var gun1 = new Gun('https://gun-us.herokuapp.com/gun');\n* var gun2 = new Gun('https://gun-us.herokuapp.com/gun');\n* var myKey = await Key.getDefault();\n* var someoneElse = localStorage.getItem('someoneElsesKey');\n* if (someoneElse) {\n* someoneElse = JSON.parse(someoneElse);\n* } else {\n* someoneElse = await Key.generate();\n* localStorage.setItem('someoneElsesKey', JSON.stringify(someoneElse));\n* }\n*\n* iris.Channel.initUser(gun1, myKey); // saves myKey.epub to gun.user().get('epub')\n* iris.Channel.initUser(gun2, someoneElse);\n*\n* var ourChannel = new iris.Channel({key: myKey, gun: gun1, participants: someoneElse.pub});\n* var theirChannel = new iris.Channel({key: someoneElse, gun: gun2, participants: myKey.pub});\n*\n* var myChannels = {}; // you can list them in a user interface\n* function printMessage(msg, info) {\n* console.log(`[${new Date(msg.time).toLocaleString()}] ${info.from.slice(0,8)}: ${msg.text}`)\n* }\n* iris.Channel.getChannels(gun1, myKey, channel => {\n* var pub = channel.getCurrentParticipants()[0];\n* gun1.user(pub).get('profile').get('name').on(name => channel.name = name);\n* myChannels[pub] = channel;\n* channel.getMessages(printMessage);\n* channel.on('mood', (mood, from) => console.log(from.slice(0,8) + ' is feeling ' + mood));\n* });\n*\n* // you can play with these in the console:\n* ourChannel.send('message from myKey');\n* theirChannel.send('message from someoneElse');\n*\n* ourChannel.put('mood', 'blessed');\n* theirChannel.put('mood', 'happy');\n*\n* @example https://github.com/irislib/iris-lib/blob/master/__tests__/Channel.js\n*/\nclass Channel {\n // TODO: these should be done in a cleaner way\n latestTime: any;\n theirMsgsLastSeenDate: any;\n myLastSeenTime: any;\n theirMsgsLastSeenTime: any;\n notificationSetting: any;\n messageIds: any; // this is used from session.processMessage\n latest: any;\n uuid: any;\n name: any;\n attachments: any;\n\n theirSecretUuids = {};\n theirGroupSecrets = {};\n secrets = {};\n ourSecretChannelIds = {};\n theirSecretChannelIds = {};\n messages = {};\n chatLinks = {};\n groupSubscriptions = {};\n directSubscriptions = {};\n getParticipantsCallbacks = {};\n myGroupSecret: any;\n participants: any;\n\n constructor(options: any) {\n this.myGroupSecret = options.myGroupSecret;\n\n if (options.chatLink) {\n this.useChatLink(options);\n }\n\n if (typeof options.participants === `string`) {\n this.addParticipant(options.participants, options.save);\n } else if (Array.isArray(options.participants)) {\n const o = {};\n options.participants.forEach(p => o[p] = Object.assign({}, DEFAULT_PERMISSIONS));\n options.participants = o;\n }\n if (typeof options.participants === `object`) { // it's a group channel\n const keys = Object.keys(options.participants);\n keys.forEach(k => {\n if (k !== session.getKey().pub) {\n this.addParticipant(k, options.save, Object.assign({}, DEFAULT_PERMISSIONS, options.participants[k]));\n }\n });\n options.participants[session.getKey().pub] = options.participants[session.getKey().pub] || Object.assign({}, DEFAULT_PERMISSIONS);\n if (options.uuid) {\n this.uuid = options.uuid;\n this.name = options.name;\n } else {\n options.uuid = Attribute.getUuid().value;\n this.uuid = options.uuid;\n options.participants[session.getKey().pub].admin = true;\n options.participants[session.getKey().pub].founder = true;\n }\n this.getChatLinks({subscribe: true});\n }\n this.participants = options.participants;\n if (options.uuid) { // It's a group channel\n // share secret uuid with other participants. since secret is already non-deterministic, maybe uuid could also be?\n // generate channel-specific secret and share it with other participants\n // put() keys should be encrypted first? so you could do put(uuid, secret)\n // what if you join the channel with 2 unconnected devices? on reconnect, the older secret would be overwritten and messages unreadable. maybe participants should store each others' old keys? or maybe you should store them and re-encrypt old stuff when key changes? return them with map() instead?\n this.putDirect(`S${this.uuid}`, this.getMyGroupSecret());\n this.getMySecretUuid().then(s => {\n this.putDirect(this.uuid, s); // TODO: encrypt keys in put()\n });\n this.onTheirDirect(this.uuid, (s, k, from) => {\n this.theirSecretUuids[from] = s;\n });\n this.onTheirDirect(`S${this.uuid}`, (s, k, from) => {\n this.theirGroupSecrets[from] = s;\n });\n // need to make put(), on(), send() and getMessages() behave differently when it's a group and retain the old versions for mutual signaling\n }\n this.onTheir(`participants`, (participants, k, from) => {\n let hasAdmin = false;\n const keys = Object.keys(this.participants);\n for (let i = 0; i < keys.length; i++) {\n if (this.participants[keys[i]].admin || this.participants[keys[i]].inviter) {\n hasAdmin = true;\n break;\n }\n }\n if (!hasAdmin) {\n keys.forEach(k => this.participants[k].admin = true); // if no admins, make everyone admin\n }\n if (this.participants[from] && (this.participants[from].admin || this.participants[from].inviter)) {\n if (typeof participants === `object`) {\n if (JSON.stringify(this.participants) === JSON.stringify(participants)) { return; }\n this.participants = participants;\n delete this.participants[from].inviter;\n Object.keys(participants).forEach(k => {\n if (k !== session.getKey().pub) {\n this.addParticipant(k, true, Object.assign({}, DEFAULT_PERMISSIONS, participants[k]), true);\n }\n });\n this.participantsChanged();\n options.saved = true;\n }\n }\n });\n if (!options.saved && (options.save === undefined || options.save === true)) {\n this.save();\n }\n }\n\n useChatLink(options) {\n const s = options.chatLink.split('?');\n if (s.length === 2) {\n const chatWith = util.getUrlParameter('chatWith', s[1]);\n const channelId = util.getUrlParameter('channelId', s[1]);\n const inviter = util.getUrlParameter('inviter', s[1]);\n const pub = inviter || chatWith;\n if (chatWith) {\n options.participants = pub;\n } else if (channelId && inviter && inviter !== session.getKey().pub) { // TODO! initializing it twice breaks things - new secret is generated\n options.uuid = channelId;\n options.participants = {};\n options.participants[inviter] = Object.assign({inviter: true}, DEFAULT_PERMISSIONS);\n }\n if (pub !== session.getKey().pub) {\n const sharedSecret = util.getUrlParameter('s', s[1]);\n const linkId = util.getUrlParameter('k', s[1]);\n if (sharedSecret && linkId) {\n this.save(); // save the channel first so it's there before inviter subscribes to it\n options.saved = true;\n publicState().user(pub).get('chatLinks').get(linkId).get('encryptedSharedKey').on(async encrypted => {\n const sharedKey = await Key.decrypt(encrypted, sharedSecret);\n const encryptedChatRequest = await Key.encrypt(session.getKey().pub, sharedSecret); // TODO encrypt is not deterministic, it uses salt\n const channelRequestId = await util.getHash(encryptedChatRequest);\n publicState(sharedKey).get('chatRequests').get(channelRequestId.slice(0, 12)).put(encryptedChatRequest);\n });\n }\n }\n }\n }\n\n getTheirSecretUuid(pub) {\n return new Promise(resolve => {\n if (!this.theirSecretUuids[pub]) {\n this.onTheirDirect(this.uuid, s => {\n this.theirSecretUuids[pub] = s;\n resolve(this.theirSecretUuids[pub]);\n }, pub);\n } else {\n resolve(this.theirSecretUuids[pub]);\n }\n });\n }\n\n getTheirGroupSecret(pub) {\n if (pub === session.getKey().pub) { return this.getMyGroupSecret(); }\n return new Promise(resolve => {\n if (!this.theirGroupSecrets[pub]) {\n this.onTheirDirect(`S${this.uuid}`, s => {\n this.theirGroupSecrets[pub] = s;\n resolve(this.theirGroupSecrets[pub]);\n }, pub);\n } else {\n resolve(this.theirGroupSecrets[pub]);\n }\n });\n }\n\n changeMyGroupSecret() {\n this.myGroupSecret = Key.random(32).toString('base64');\n // TODO: secret should be archived and probably messages should include the encryption key id so past messages don't become unreadable\n this.putDirect(`S${this.uuid}`, this.myGroupSecret);\n }\n\n /**\n * Unsubscribe messages from a channel participants\n *\n * @param {string} participant public key\n */\n async mute(participant) {\n publicState().user(participant).get(this.theirSecretUuids[participant]).off();\n // TODO: persist\n }\n\n /**\n * Mute user and prevent them from seeing your further (and maybe past) messages\n *\n * @param {string} participant public key\n */\n async block(participant) {\n this.mute(participant);\n this.putDirect(this.uuid, null);\n this.putDirect(`S${this.uuid}`, null);\n delete this.secrets[participant];\n delete this.ourSecretChannelIds[participant];\n delete this.theirSecretChannelIds[participant];\n this.changeMyGroupSecret();\n }\n\n async getMySecretUuid() {\n if (!this.mySecretUuid) {\n const mySecret = await Key.secret(session.getKey().epub, session.getKey());\n const mySecretHash = await util.getHash(mySecret);\n this.mySecretUuid = await util.getHash(mySecretHash + this.uuid);\n }\n return this.mySecretUuid;\n }\n\n /**\n * List participants of the channel (other than you)\n */\n getCurrentParticipants() {\n return Object.keys(this.secrets);\n }\n\n /**\n * Subscribe to the changing list of participants by channel admins\n */\n getParticipants(callback) {\n if (this.getParticipantsCallbackId) {\n this.getParticipantsCallbackId++;\n } else {\n this.getParticipantsCallbackId = 1;\n }\n this.getParticipantsCallbacks[this.getParticipantsCallbackId] = callback;\n if (this.participants) {\n callback(this.participants);\n }\n }\n\n participantsChanged() {\n Object.keys(this.getParticipantsCallbacks).forEach(id => {\n this.getParticipantsCallbacks[id](this.participants);\n });\n }\n\n /**\n * Returns either the uuid of a group channel or the public key of a direct channel.\n */\n getId() {\n return this.uuid || this.getCurrentParticipants()[0];\n }\n\n async getSecret(pub) {\n if (!this.secrets[pub]) {\n const epub = await util.gunOnceDefined(publicState().user(pub).get(`epub`));\n this.secrets[pub] = await Key.secret(epub, session.getKey());\n }\n return this.secrets[pub];\n }\n\n /**\n *\n */\n static async getOurSecretChannelId(pub, pair) {\n const epub = await util.gunOnceDefined(publicState().user(pub).get(`epub`));\n const secret = await Key.secret(epub, pair);\n return util.getHash(secret + pub);\n }\n\n /**\n *\n */\n static async getTheirSecretChannelId(pub, pair) {\n const epub = await util.gunOnceDefined(publicState().user(pub).get(`epub`));\n const secret = await Key.secret(epub, pair);\n return util.getHash(secret + pair.pub);\n }\n\n /**\n * Calls back with Channels that you have initiated or written to.\n * @param {Object} keypair Key keypair that the gun instance is authenticated with\n * @param callback callback function that is called for each public key you have a channel with\n */\n static async getChannels(callback, listenToChatLinks = true) {\n const keypair = session.getKey();\n const mySecret = await Key.secret(keypair.epub, keypair);\n if (listenToChatLinks) {\n Channel.getMyChatLinks( undefined, undefined, true);\n }\n const seen = {};\n\n const handleChannel = async (value, ourSecretChannelId) => {\n if (value && !seen[ourSecretChannelId]) {\n seen[ourSecretChannelId] = true;\n if (ourSecretChannelId.length > 44) {\n publicState().user().get(`chats`).get(ourSecretChannelId).put(null);\n return;\n }\n const encryptedChatId = await util.gunOnceDefined(publicState().user().get(`chats`).get(ourSecretChannelId).get(`pub`));\n const chatId = await Key.decrypt(encryptedChatId, mySecret);\n if (!chatId) {\n return;\n }\n if (chatId.pub || typeof chatId === `string`) {\n callback(new Channel({\n key: keypair,\n participants: chatId.pub || chatId,\n save: false\n }));\n } else if (chatId.uuid && chatId.participants && chatId.myGroupSecret) {\n callback(new Channel({\n key: keypair,\n participants: chatId.participants,\n uuid: chatId.uuid,\n myGroupSecret: chatId.myGroupSecret,\n save: false\n }));\n }\n }\n };\n\n publicState().user().get(`chats`).map(handleChannel);\n }\n\n getMyGroupSecret() { // group secret could be deterministic: hash(encryptToSelf(uuid + iterator))\n if (!this.myGroupSecret) {\n this.changeMyGroupSecret();\n }\n return this.myGroupSecret;\n }\n\n async getOurSecretChannelId(pub) {\n if (!this.ourSecretChannelIds[pub]) {\n const secret = await this.getSecret(pub);\n this.ourSecretChannelIds[pub] = await util.getHash(secret + pub);\n }\n return this.ourSecretChannelIds[pub];\n }\n\n async getTheirSecretChannelId(pub) {\n if (!this.theirSecretChannelIds[pub]) {\n const secret = await this.getSecret(pub);\n this.theirSecretChannelIds[pub] = await util.getHash(secret + session.getKey().pub);\n }\n return this.theirSecretChannelIds[pub];\n }\n\n /**\n * Get messages from the channel\n */\n async getMessages(callback) { // TODO: save callback and apply it when new participants are added to channel\n this.getCurrentParticipants().forEach(async pub => {\n if (pub !== session.getKey().pub) {\n // Subscribe to their messages\n let theirSecretChannelId;\n if (this.uuid) {\n theirSecretChannelId = await this.getTheirSecretUuid(pub);\n } else {\n theirSecretChannelId = await this.getTheirSecretChannelId(pub);\n }\n // TODO map().once\n publicState().user(pub).get(`chats`).get(theirSecretChannelId).get(`msgs`).map((data, key) => {this.messageReceived(callback, data, this.uuid || pub, false, key, pub);});\n }\n if (!this.uuid) {\n // Subscribe to our messages\n const ourSecretChannelId = await this.getOurSecretChannelId(pub);\n // TODO map().once\n userState().get(`chats`).get(ourSecretChannelId).get(`msgs`).map((data, key) => {this.messageReceived(callback, data, pub, true, key, session.getKey().pub);});\n }\n });\n if (this.uuid) {\n // Subscribe to our messages\n const mySecretUuid = await this.getMySecretUuid();\n // TODO map().once\n userState().get(`chats`).get(mySecretUuid).get(`msgs`).map((data, key) => {this.messageReceived(callback, data, this.uuid, true, key, session.getKey().pub);});\n }\n }\n\n async messageReceived(callback, data, channelId, selfAuthored, key, from) {\n if (this.messages[key] || !data) {\n return;\n }\n const secret = this.uuid ? (await this.getTheirGroupSecret(from)) : (await this.getSecret(channelId));\n const decrypted = await Key.decrypt(data, secret);\n if (typeof decrypted !== `object`) {\n return;\n }\n const info = {selfAuthored, channelId, from};\n this.messages[key] = decrypted;\n callback(decrypted, info);\n }\n\n /**\n * Get latest message in this channel. Useful for channel listing.\n */\n async getLatestMsg(callback) {\n const callbackIfLatest = async (msg, info) => {\n if (!this.latest) {\n this.latest = msg;\n callback(msg, info);\n } else {\n const t = (typeof this.latest.time === `string` ? this.latest.time : this.latest.time.toISOString());\n if (t < msg.time) {\n this.latest = msg;\n callback(msg, info);\n }\n }\n };\n this.onMy('latestMsg', msg => callbackIfLatest(msg, {selfAuthored: true, from: session.getKey().pub}));\n this.onTheir('latestMsg', (msg, k, from) => callbackIfLatest(msg, {selfAuthored: false, from}));\n }\n\n /**\n * Useful for notifications\n * @param {integer} time last seen msg time (default: now)\n */\n async setMyMsgsLastSeenTime(time?: string) {\n time = time || new Date().toISOString();\n return this.put(`msgsLastSeenTime`, time);\n }\n\n /**\n * Useful for notifications\n */\n async getMyMsgsLastSeenTime(callback) {\n this.onMy(`msgsLastSeenTime`, time => {\n this.myMsgsLastSeenTime = time;\n if (callback) {\n callback(this.myMsgsLastSeenTime);\n }\n });\n }\n\n /**\n * For \"seen\" status indicator\n */\n async getTheirMsgsLastSeenTime(callback) {\n this.onTheir(`msgsLastSeenTime`, time => {\n this.theirMsgsLastSeenTime = time;\n if (callback) {\n callback(this.theirMsgsLastSeenTime);\n }\n });\n }\n\n async removeParticipant(pub) {\n this.addParticipant(pub, true, {read: false, write: false});\n }\n\n /**\n * Add a public key to the channel or update its permissions\n * @param {string} pub\n */\n async addParticipant(pub: string, save = true, permissions?: any, subscribe?: boolean) {\n if (this.uuid) {\n return;\n }\n if (permissions === undefined) {\n permissions = DEFAULT_PERMISSIONS;\n }\n if (this.secrets[pub] && JSON.stringify(this.secrets[pub]) === JSON.stringify(permissions)) { // TODO: should be this.participants[pub]\n return;\n }\n this.secrets[pub] = null;\n this.getSecret(pub);\n const ourSecretChannelId = await this.getOurSecretChannelId(pub);\n if (save) {\n // Save their public key in encrypted format, so in channel listing we know who we are channeling with\n const mySecret = await Key.secret(session.getKey().epub, session.getKey());\n publicState().user().get(`chats`).get(ourSecretChannelId).get(`pub`).put(await Key.encrypt({pub}, mySecret));\n }\n if (this.uuid) {\n this.participants[pub] = permissions;\n if (save) {\n this.putDirect(`S${this.uuid}`, this.getMyGroupSecret());\n this.getMySecretUuid().then(s => {\n this.putDirect(this.uuid, s); // TODO: encrypt keys in put()\n });\n this.onTheirDirect(this.uuid, (s, k, from) => {\n this.theirSecretUuids[from] = s;\n });\n this.onTheirDirect(`S${this.uuid}`, (s, k, from) => {\n this.theirGroupSecrets[from] = s;\n });\n this.save();\n }\n }\n if (subscribe) {\n Object.values(this.directSubscriptions).forEach(arr => {\n arr.forEach(o => {\n if (!o.from || o.from === pub) {\n this._onTheirDirectFromUser(pub, o.key, o.callback);\n }\n });\n });\n Object.values(this.groupSubscriptions).forEach(arr => {\n arr.forEach(o => {\n if (o.from && o.from !== pub) { return; }\n if (permissions.write) {\n this._onTheirGroupFromUser(pub, o.key, o.callback);\n } else { // unsubscribe\n o.event && o.event.off();\n }\n });\n });\n }\n }\n\n /**\n * Send a message to the channel\n * @param msg string or {time, text, ...} object\n */\n async send(msg) {\n if (typeof msg === `string`) {\n msg = msg.trim();\n if (msg.length === 0) {\n return;\n }\n msg = {\n time: (new Date()).toISOString(),\n text: msg\n };\n } else if (typeof msg === `object`) {\n msg.time = msg.time || (new Date()).toISOString();\n } else {\n throw new Error(`msg param must be a string or an object`);\n }\n //publicState().user().get('message').set(temp);\n if (this.uuid) {\n const encrypted = await Key.encrypt(JSON.stringify(msg), this.getMyGroupSecret());\n const mySecretUuid = await this.getMySecretUuid();\n userState().get(`chats`).get(mySecretUuid).get(`msgs`).get(`${msg.time}`).put(encrypted);\n userState().get(`chats`).get(mySecretUuid).get(`latestMsg`).put(encrypted);\n } else {\n const keys = this.getCurrentParticipants();\n for (let i = 0;i < keys.length;i++) {\n const encrypted = await Key.encrypt(JSON.stringify(msg), (await this.getSecret(keys[i])));\n const ourSecretChannelId = await this.getOurSecretChannelId(keys[i]);\n userState().get(`chats`).get(ourSecretChannelId).get(`msgs`).get(`${msg.time}`).put(encrypted);\n userState().get(`chats`).get(ourSecretChannelId).get(`latestMsg`).put(encrypted);\n }\n }\n }\n\n /**\n * Save the channel to our channels list without sending a message\n */\n async save() {\n if (this.uuid) {\n const mySecretUuid = await this.getMySecretUuid();\n userState().get(`chats`).get(mySecretUuid).get('msgs').get('a').put(null);\n this.put(`participants`, this.participants); // public participants list\n const mySecret = await Key.secret(session.getKey().epub, session.getKey());\n userState().get(`chats`).get(mySecretUuid).get(`pub`).put(await Key.encrypt({\n uuid: this.uuid,\n myGroupSecret: this.getMyGroupSecret(),\n participants: this.participants // private participants list\n }, mySecret));\n this.participantsChanged();\n } else {\n const keys = this.getCurrentParticipants();\n for (let i = 0;i < keys.length;i++) {\n const ourSecretChannelId = await this.getOurSecretChannelId(keys[i]);\n userState().get(`chats`).get(ourSecretChannelId).get('msgs').get('a').put(null);\n }\n }\n }\n\n /**\n * Save a key-value pair, encrypt value. Each participant in the Channel writes to their own version of the key-value pair — they don't overwrite the same one.\n * @param {string} key\n * @param value\n */\n async put(key, value) {\n return (this.uuid ? this.putGroup : this.putDirect).call(this, key, value);\n }\n\n async putGroup(key, value) {\n if (key === `msgs`) { throw new Error(`Sorry, you can't overwrite the msgs field which is used for .send()`); }\n const encrypted = await Key.encrypt(JSON.stringify(value), this.getMyGroupSecret());\n const mySecretUuid = await this.getMySecretUuid();\n userState().get(`chats`).get(mySecretUuid).get(key).put(encrypted);\n }\n\n async putDirect(key, value) {\n if (key === `msgs`) { throw new Error(`Sorry, you can't overwrite the msgs field which is used for .send()`); }\n const keys = this.getCurrentParticipants();\n for (let i = 0;i < keys.length;i++) {\n const encrypted = await Key.encrypt(JSON.stringify(value), (await this.getSecret(keys[i])));\n const ourSecretChannelId = await this.getOurSecretChannelId(keys[i]);\n userState().get(`chats`).get(ourSecretChannelId).get(key).put(encrypted);\n }\n }\n\n /**\n * Subscribe to a key-value pair. Callback returns every participant's value unless you limit it with *from* param.\n * @param {string} key\n * @param {function} callback\n * @param {string} from public key whose value you want, or *\"me\"* for your value only, or *\"them\"* for the value of others only\n */\n async on(key: string, callback: Function, from?: string) {\n return (this.uuid ? this.onGroup : this.onDirect).call(this, key, callback, from);\n }\n\n async onDirect(key: string, callback: Function, from?: string) {\n if (!from || from === `me` || from === session.getKey().pub) {\n this.onMy(key, (val: any) => callback(val, session.getKey().pub));\n }\n if (!from || (from !== `me` && from !== session.getKey().pub)) {\n this.onTheir(key, (val: any, k: string, pub: string) => callback(val, pub));\n }\n }\n\n async onGroup(key: string, callback: Function, from?: string) {\n if (!from || from === `me` || from === session.getKey().pub) {\n this.onMyGroup(key, val => callback(val, session.getKey().pub));\n }\n if (!from || (from !== `me` && from !== session.getKey().pub)) {\n this.onTheirGroup(key, (val, k, pub) => callback(val, pub));\n }\n }\n\n async onMy(key: string, callback: Function) {\n return (this.uuid ? this.onMyGroup : this.onMyDirect).call(this, key, callback);\n }\n\n async onMyDirect(key: string, callback: Function) {\n if (typeof callback !== 'function') {\n throw new Error(`onMy callback must be a function, got ${typeof callback}`);\n }\n const keys = this.getCurrentParticipants();\n for (let i = 0;i < keys.length;i++) {\n const ourSecretChannelId = await this.getOurSecretChannelId(keys[i]);\n publicState().user().get(`chats`).get(ourSecretChannelId).get(key).on(async (data: any) => {\n const decrypted = await Key.decrypt(data, (await this.getSecret(keys[i])));\n if (decrypted) {\n callback(typeof decrypted.v !== `undefined` ? decrypted.v : decrypted, key);\n }\n });\n break;\n }\n }\n\n async onMyGroup(key, callback) {\n if (typeof callback !== 'function') {\n throw new Error(`onMy callback must be a function, got ${typeof callback}`);\n }\n const mySecretUuid = await this.getMySecretUuid();\n const mySecret = await this.getMyGroupSecret();\n publicState().user().get(`chats`).get(mySecretUuid).get(key).on(async data => {\n const decrypted = await Key.decrypt(data, mySecret);\n if (decrypted) {\n callback(typeof decrypted.v !== `undefined` ? decrypted.v : decrypted, key, session.getKey().pub);\n }\n });\n }\n\n async onTheir(key: string, callback: Function, from: string) {\n return (this.uuid ? this.onTheirGroup : this.onTheirDirect).call(this, key, callback, from);\n }\n\n async _onTheirDirectFromUser(key: string, callback: Function, pub: string) {\n if (!this.hasWritePermission(pub)) { return; }\n const theirSecretChannelId = await this.getTheirSecretChannelId(pub);\n publicState().user(pub).get(`chats`).get(theirSecretChannelId).get(key).on(async (data: any) => {\n if (!this.hasWritePermission(pub)) { return; }\n const decrypted = await Key.decrypt(data, (await this.getSecret(pub)));\n if (decrypted) {\n callback(typeof decrypted.v !== `undefined` ? decrypted.v : decrypted, key, pub);\n }\n });\n }\n\n async onTheirDirect(key: string, callback: Function, from: string) { // TODO: subscribe to new channel participants\n if (typeof callback !== 'function') {\n throw new Error(`onTheir callback must be a function, got ${typeof callback}`);\n }\n if (!Object.prototype.hasOwnProperty.call(this.directSubscriptions, key)) {\n this.directSubscriptions[key] = [];\n }\n this.directSubscriptions[key].push({key, callback, from});\n const participants = this.getCurrentParticipants();\n participants.forEach(async pub => {\n if (from && pub !== from) { return; }\n this._onTheirDirectFromUser(pub, key, callback);\n });\n }\n\n hasWritePermission(pub) {\n return !this.uuid || (this.participants && this.participants[pub] && this.participants[pub].write);\n }\n\n async _onTheirGroupFromUser(pub: string, key: string, callback: Function, subscription: any) {\n if (!this.hasWritePermission(pub)) { return; }\n const theirSecretUuid = await this.getTheirSecretUuid(pub);\n publicState().user(pub).get(`chats`).get(theirSecretUuid).get(key).on(async (data: any, _a: any, _b: any, e: Event) => {\n if (subscription) { subscription.event = e; }\n if (!this.hasWritePermission(pub)) { return; }\n const decrypted = await Key.decrypt(data, (await this.getTheirGroupSecret(pub)));\n if (decrypted) {\n callback(typeof decrypted.v !== `undefined` ? decrypted.v : decrypted, key, pub);\n }\n });\n }\n\n async onTheirGroup(key, callback, from) {\n if (typeof callback !== 'function') {\n throw new Error(`onTheir callback must be a function, got ${typeof callback}`);\n }\n if (!Object.prototype.hasOwnProperty.call(this.groupSubscriptions, key)) {\n this.groupSubscriptions[key] = [];\n }\n const subscription = {key, callback, from};\n this.groupSubscriptions[key].push(subscription);\n\n this.getParticipants(participants => {\n Object.keys(participants).forEach(async pub => {\n if (from && pub !== from) { return; }\n if (!(participants[pub] && participants[pub].write)) { return; }\n this._onTheirGroupFromUser(pub, key, callback, subscription);\n });\n });\n }\n\n /**\n * Set typing status\n */\n setTyping(isTyping, timeout = 5) {\n isTyping = typeof isTyping === `undefined` ? true : isTyping;\n timeout = timeout * 1000;\n this.put(`typing`, isTyping ? new Date().toISOString() : new Date(0).toISOString());\n clearTimeout(this.setTypingTimeout);\n this.setTypingTimeout = setTimeout(() => this.put(`typing`, false), timeout);\n }\n\n /**\n * Get typing status\n */\n getTyping(callback, timeout = 5) { // TODO callback not called on setTyping(false), at least for self chat\n timeout = timeout * 1000;\n this.onTheir(`typing`, (typing, key, pub) => {\n if (callback) {\n const isTyping = typing && new Date() - new Date(typing) <= timeout;\n callback(isTyping, pub);\n this.getTypingTimeouts = this.getTypingTimeouts || {};\n clearTimeout(this.getTypingTimeouts[pub]);\n if (isTyping) {\n this.getTypingTimeouts[pub] = setTimeout(() => callback(false, pub), timeout);\n }\n }\n });\n }\n\n /**\n * Get a simple link that points to the channel.\n *\n * Direct channel: both users need to give their simple links. Use createChatLink() to get a two-way link that needs to be given by one user only.\n *\n * Group channel: Works only if the link recipient has been already added onto the channel participants list.\n */\n getSimpleLink(urlRoot = 'https://iris.to/') {\n if (this.uuid) {\n return `${urlRoot}?channelId=${this.uuid}&inviter=${session.getKey().pub}`;\n }\n return `${urlRoot}?chatWith=${this.getCurrentParticipants()[0]}`;\n }\n\n /**\n *\n */\n async getChatLinks(opts: any = {}) {\n let {callback, urlRoot, subscribe} = opts;\n urlRoot = urlRoot || 'https://iris.to/';\n if (!this.uuid) { throw new Error('Only group channels may have chat links'); }\n const chatLinks: any[] = [];\n const chatLinkSubscriptions = {};\n this.on('chatLinks', (links: any, from: string) => {\n // TODO: check admin permissions\n if (!links || typeof links !== 'object') { return; }\n Object.keys(links).forEach(linkId => {\n const link = links[linkId];\n if (link === null) {\n chatLinkSubscriptions[linkId] && chatLinkSubscriptions[linkId].off(); // unsubscribe removed chat link\n delete chatLinkSubscriptions[linkId];\n callback && callback({id: linkId, url: null});\n return;\n }\n if (chatLinks.indexOf(linkId) !== -1) { return; }\n const channels = [];\n chatLinks.push(linkId);\n const url = Channel.formatChatLink({urlRoot, inviter: from, channelId: this.uuid, sharedSecret: link.sharedSecret, linkId});\n callback && callback({url, id: linkId});\n if (subscribe) {\n publicState().user(link.sharedKey.pub).get('chatRequests').map(async (encPub, requestId, a, e) => {\n if (!encPub || typeof encPub !== 'string' || encPub.length < 10) { return; }\n chatLinkSubscriptions[linkId] = e;\n const s = JSON.stringify(encPub);\n if (channels.indexOf(s) === -1) {\n channels.push(s);\n const pub = await Key.decrypt(encPub, link.sharedSecret);\n this.addParticipant(pub, undefined, undefined, true);\n }\n });\n }\n });\n });\n }\n\n async createChatLink(urlRoot = 'https://iris.to/') {\n const sharedKey = await Key.generate();\n const sharedKeyString = JSON.stringify(sharedKey);\n const sharedSecret = await Key.secret(sharedKey.epub, sharedKey);\n const encryptedSharedKey = await Key.encrypt(sharedKeyString, sharedSecret);\n const ownerSecret = await Key.secret(session.getKey().epub, session.getKey());\n const ownerEncryptedSharedKey = await Key.encrypt(sharedKeyString, ownerSecret);\n let linkId = await util.getHash(encryptedSharedKey);\n linkId = linkId.slice(0, 12);\n\n // User has to exist, in order for .get(chatRequests).on() to be ever triggered\n publicState(sharedKey).get('chatRequests').put({a: 1});\n\n this.chatLinks[linkId] = {sharedKey, sharedSecret};\n this.put('chatLinks', this.chatLinks);\n userState().get('chatLinks').get(linkId).put({encryptedSharedKey, ownerEncryptedSharedKey});\n\n return Channel.formatChatLink({urlRoot, channelId: this.uuid, inviter: session.getKey().pub, sharedSecret, linkId});\n }\n\n /**\n * Set the user's online/active status\n * @param {string} activity string: set the activity status every 3 seconds, null/false: stop updating\n */\n static setActivity(activity) {\n if (publicState().irisActivityStatus === activity) { return; }\n publicState().irisActivityStatus = activity;\n clearTimeout(publicState().setActivityTimeout);\n const update = () => {\n publicState().user().get(`activity`).put({status: activity, time: new Date().toISOString()});\n };\n update();\n function timerUpdate() {\n update();\n publicState().setActivityTimeout = setTimeout(timerUpdate, 3000);\n }\n if (activity) {\n timerUpdate();\n }\n }\n\n /**\n * Get the online status of a user.\n *\n * @param {string} pubKey public key of the user\n * @param {boolean} callback receives a boolean each time the user's online status changes\n */\n static getActivity(pubKey, callback) {\n let timeout;\n publicState().user(pubKey).get(`activity`).on(activity => {\n if (!activity || !(activity.time && activity.status)) { return; }\n clearTimeout(timeout);\n const now = new Date();\n const activityDate = new Date(activity.time);\n const isActive = activityDate > new Date(now.getTime() - 10 * 1000) && activityDate < new Date(now.getTime() + 30 * 1000);\n callback({isActive, lastActive: activity.time, status: activity.status});\n if (isActive) {\n timeout = setTimeout(() => callback({isOnline: false, lastActive: activity.time}), 10000);\n }\n });\n }\n\n static formatChatLink({urlRoot, chatWith, channelId, inviter, sharedSecret, linkId}) {\n const enc = encodeURIComponent;\n if (channelId && inviter) {\n return `${urlRoot}?channelId=${enc(channelId)}&inviter=${enc(inviter)}&s=${enc(sharedSecret)}&k=${enc(linkId)}`;\n }\n return `${urlRoot}?chatWith=${enc(chatWith)}&s=${enc(sharedSecret)}&k=${enc(linkId)}`;\n }\n\n /**\n * Creates a channel link that can be used for two-way communication, i.e. only one link needs to be exchanged.\n */\n static async createChatLink(urlRoot = 'https://iris.to/') {\n const user = publicState().user();\n const key = session.getKey();\n\n // We create a new Gun user whose private key is shared with the chat link recipients.\n // Chat link recipients can contact you by writing their public key to the shared key's user space.\n const sharedKey = await Key.generate();\n const sharedKeyString = JSON.stringify(sharedKey);\n const sharedSecret = await Key.secret(sharedKey.epub, sharedKey);\n const encryptedSharedKey = await Key.encrypt(sharedKeyString, sharedSecret);\n const ownerSecret = await Key.secret(key.epub, key);\n const ownerEncryptedSharedKey = await Key.encrypt(sharedKeyString, ownerSecret);\n let linkId = await util.getHash(encryptedSharedKey);\n linkId = linkId.slice(0, 12);\n\n // User has to exist, in order for .get(chatRequests).on() to be ever triggered\n publicState(sharedKey).get('chatRequests').put({a: 1}).get('chatRequests').put({a: 1});\n\n user.get('chatLinks').get(linkId).put({encryptedSharedKey, ownerEncryptedSharedKey});\n\n return Channel.formatChatLink({urlRoot, chatWith: key.pub, sharedSecret, linkId});\n }\n\n /**\n *\n */\n static async getMyChatLinks(urlRoot = 'https://iris.to/', callback: Function, subscribe = false) {\n const key = session.getKey();\n const user = publicState().user();\n const mySecret = await Key.secret(key.epub, key);\n const chatLinks = [];\n user.get('chatLinks').map((data, linkId) => {\n if (!data || chatLinks.indexOf(linkId) !== -1) { return; }\n const channels = [];\n user.get('chatLinks').get(linkId).get('ownerEncryptedSharedKey').on(async enc => {\n if (!enc || chatLinks.indexOf(linkId) !== -1) { return; }\n chatLinks.push(linkId);\n const sharedKey = await Key.decrypt(enc, mySecret);\n const sharedSecret = await Key.secret(sharedKey.epub, sharedKey);\n const url = Channel.formatChatLink({urlRoot, chatWith: key.pub, sharedSecret, linkId});\n if (callback) {\n callback({url, id: linkId});\n }\n if (subscribe) {\n publicState().user(sharedKey.pub).get('chatRequests').map(async (encPub, requestId) => {\n if (!encPub) { return; }\n const s = JSON.stringify(encPub);\n if (channels.indexOf(s) === -1) {\n channels.push(s);\n const pub = await Key.decrypt(encPub, sharedSecret);\n const channel = new Channel({key, participants: pub});\n channel.save();\n }\n publicState(sharedKey).get('chatRequests').get(requestId).put(null);\n });\n }\n });\n });\n }\n\n /**\n *\n */\n removeGroupChatLink(linkId) {\n this.chatLinks[linkId] = null;\n this.put('chatLinks', this.chatLinks);\n publicState().user().get('chatLinks').get(linkId).put(null);\n }\n\n /**\n *\n */\n static removePrivateChatLink(key, linkId) {\n publicState().user().auth(key);\n publicState().user().get('chatLinks').get(linkId).put(null);\n }\n\n /**\n *\n */\n static async deleteChannel(key, pub) {\n publicState().user().auth(key);\n const channelId = await Channel.getOurSecretChannelId(pub, key);\n publicState().user().get('channels').get(channelId).put(null);\n publicState().user().get('channels').get(channelId).off();\n }\n\n /**\n *\n */\n static async deleteGroup(key, uuid) {\n const mySecret = await Key.secret(key.epub, key);\n const mySecretHash = await util.getHash(mySecret);\n const mySecretUuid = await util.getHash(mySecretHash + uuid);\n publicState().user().auth(key);\n publicState().user().get('channels').get(mySecretUuid).put(null);\n publicState().user().get('channels').get(mySecretUuid).off();\n }\n}\n\nexport default Channel;\n","import Channel from './Channel';\nimport session from './session';\n\nconst channels = new Map();\n\n/**\n * Private channel that only you and publicKey can read/write.\n * @param publicKey\n * @returns {Channel}\n */\nexport default function(publicKey = session.getKey(), chatLink?: string): Channel {\n let channel = channels.get(publicKey);\n if (!channel) {\n channel = new Channel({participants: publicKey, chatLink})\n channels.set(publicKey, channel);\n }\n return channel;\n}","import Node from './db/Node';\n\nlet local: Node;\n\n/**\n * Get a state that is only synced in memory and local storage.\n *\n * Useful for storing things like UI state, local indexes or logged in user.\n * @returns {Node}\n */\nexport default function() {\n if (!local) {\n local = new Node('local');\n }\n return local;\n}","import local from './local';\n\nlet blockedUsers: { [key: string]: boolean } = {};\n\nexport default function() {\n if (!blockedUsers) {\n blockedUsers = {};\n local().get('block').map((isBlocked: boolean, user: string) => {\n if (isBlocked === blockedUsers[user]) { return; }\n if (isBlocked) {\n blockedUsers[user] = isBlocked;\n local().get('groups').map((_v: any, k: string) => {\n local().get('groups').get(k).get(user).put(false);\n });\n } else {\n delete blockedUsers[user];\n }\n });\n }\n return blockedUsers;\n}","import local from \"./local\";\nimport userSpace from './public';\nimport blockedUsers from './blockedUsers';\n\nlet counter = 0;\nconst cache = new Map>();\nconst callbacks = new Map();\n\ntype Event = {\n off: () => void;\n}\n\n/**\n * Aggregates public data from all users in the group.\n *\n * For example, the public message feed, message replies and likes are aggregated using this.\n * @param groupName\n * @returns object\n */\nexport default function(groupName = 'everyone') {\n return {\n get(path: string, callback: any) {\n const groupNode = local().get('groups').get(groupName);\n const follows: { [key: string]: boolean; } = {};\n requestAnimationFrame(() => {\n groupNode.map((isFollowing: any, user: string) => {\n if (blockedUsers()[user]) { return; } // TODO: allow to specifically query blocked users?\n if (follows[user] && follows[user] === isFollowing) { return; }\n follows[user] = isFollowing;\n if (isFollowing) { // TODO: callback on unfollow, for unsubscribe\n let node = userSpace(user);\n if (path && path !== '/') {\n node = path.split('/').reduce((sum:any, s:string) => sum.get(decodeURIComponent(s)), node);\n }\n callback(node, user);\n }\n });\n });\n },\n\n _cached_map(cached: Map | undefined, cacheKey: string, path: string, myEvent: Event, callback: Function) {\n if (!cached) {\n const cached = new Map();\n cache.set(cacheKey, cached);\n this.get(path, (node: any, from: string) => node.map((value: any, key: string, x: any) => {\n const item = {value, key, from};\n cached.set(key, item);\n for (let cb of callbacks.get(cacheKey).values()) {\n cb(value, key, x, myEvent, from);\n }\n }));\n } else {\n for (let item of cached.values()) {\n callback(item.value, item.key, 0, myEvent, item.from);\n }\n }\n },\n\n // TODO: this should probably store just the most recent value, not everyone's value\n // TODO: for counting of likes etc, use this.count() instead\n _cached_on(cached: Map | undefined, cacheKey: string, path: string, myEvent: Event, callback: Function) {\n if (!cached) {\n const cached = new Map();\n cache.set(cacheKey, cached);\n this.get(path, (node: any, from: string) => node.on((value: any, key: string, x: any) => {\n const item = {value, key, from};\n cached.set(from, item);\n for (let cb of callbacks.get(cacheKey).values()) {\n cb(value, key, x, myEvent, from);\n }\n }));\n } else {\n for (let item of cached.values()) {\n callback(item.value, item.key, 0, myEvent, item.from);\n }\n }\n },\n\n _cached_count(cached: Map | undefined, cacheKey: string, path: string, myEvent: Event, callback: Function) {\n if (!cached) {\n const cached = new Map();\n cache.set(cacheKey, cached);\n this.get(path, (node: any, from: string) => node.on((value: any, key: string) => {\n value ? cached.set(from, true) : cached.delete(from);\n const count = cached.size;\n for (let cb of callbacks.get(cacheKey).values()) {\n cb(count, key, null, myEvent, from);\n }\n }));\n } else {\n callback(cached.size, path.split('/').pop(), null, myEvent);\n }\n },\n\n _cached_fn(fn: string, path: string, callback: Function) {\n const cacheKey = `${fn}:${groupName}:${path}`;\n\n let callbackId = counter++;\n if (callbacks.has(cacheKey)) {\n callbacks.get(cacheKey).set(callbackId, callback);\n } else {\n callbacks.set(cacheKey, new Map([[callbackId, callback]]));\n }\n\n const myEvent = {off: () => {\n let myCallbacks = callbacks.get(cacheKey);\n myCallbacks && myCallbacks.delete(callbackId);\n }};\n\n const cached = cache.get(cacheKey);\n\n switch (fn) {\n case 'map':\n this._cached_map(cached, cacheKey, path, myEvent, callback);\n break;\n case 'on':\n this._cached_on(cached, cacheKey, path, myEvent, callback);\n break;\n case 'count':\n this._cached_count(cached, cacheKey, path, myEvent, callback);\n break;\n }\n },\n\n map(path: string, callback: Function) { // group queries are slow, so we cache them\n this._cached_fn('map', path, callback);\n },\n\n on(path: string, callback: Function) {\n this._cached_fn('on', path, callback);\n },\n\n count(path: string, callback: Function) {\n this._cached_fn('count', path, callback);\n }\n }\n}","// @ts-nocheck\n\nimport _ from './lodash';\nimport session from './session';\nimport util from './util';\nimport publicState from './global';\nimport privateState from './private';\nimport local from './local';\nimport group from './group';\nimport Key from './Key';\n\nconst NOTIFICATION_SERVICE_URL = 'https://iris-notifications.herokuapp.com/notify';\n// const notificationSound = new Audio('../../assets/audio/notification.mp3'); // TODO\nlet loginTime;\nlet unseenMsgsTotal = 0;\nlet unseenNotificationCount = 0;\nconst webPushSubscriptions = {};\n\nfunction desktopNotificationsEnabled() {\n return window.Notification && Notification.permission === 'granted';\n}\n\nfunction notifyMsg(msg, info, channelId, onClick) {\n function shouldNotify() {\n if (msg.timeObj < loginTime) { return false; }\n if (info.selfAuthored) { return false; }\n if (document.visibilityState === 'visible') { return false; }\n const channel = privateState(channelId);\n if (channel.notificationSetting === 'nothing') { return false; }\n if (channel.notificationSetting === 'mentions' && !msg.text.includes(session.getMyName())) { return false; }\n return true;\n }\n function shouldDesktopNotify() {\n if (!desktopNotificationsEnabled()) { return false; }\n return shouldNotify();\n }\n function shouldAudioNotify() {\n return shouldNotify();\n }\n if (shouldAudioNotify()) {\n //notificationSound.play(); // TODO\n }\n if (shouldDesktopNotify()) {\n let body, title;\n const channel = privateState(channelId);\n if (channel.uuid) {\n title = channel.participantProfiles[info.from].name;\n body = `${name}: ${msg.text}`;\n } else {\n title = 'Message'\n body = msg.text;\n }\n body = util.truncateString(body, 50);\n let desktopNotification = new Notification(title, { // TODO: replace with actual name\n icon: '/assets/img/icon128.png',\n body,\n silent: true\n });\n desktopNotification.onclick = function() {\n changeUnseenNotificationCount(-1);\n onClick && onClick();\n window.focus();\n };\n }\n}\n\nfunction changeChatUnseenMsgsCount(chatId, change) {\n const chat = privateState(chatId);\n if (!chat) return;\n const chatNode = local().get('channels').get(chatId);\n if (change) {\n unseenMsgsTotal += change;\n chat.unseen += change;\n } else {\n unseenMsgsTotal = unseenMsgsTotal - (chat.unseen || 0);\n chat.unseen = 0;\n }\n chatNode.get('unseen').put(chat.unseen);\n unseenMsgsTotal = unseenMsgsTotal >= 0 ? unseenMsgsTotal : 0;\n local().get('unseenMsgsTotal').put(unseenMsgsTotal);\n}\n\nconst publicVapidKey = 'BMqSvZArOIdn7vGkYplSpkZ70-Qt8nhYbey26WVa3LF3SwzblSzm3n3HHycpNkAKVq7MCkrzFuTFs_en7Y_J2MI';\n\nfunction urlBase64ToUint8Array(base64String) {\n const padding = '='.repeat((4 - base64String.length % 4) % 4);\n const base64 = (base64String + padding)\n .replace(/-/g, '+')\n .replace(/_/g, '/');\n\n const rawData = window.atob(base64);\n const outputArray = new Uint8Array(rawData.length);\n\n for (let i = 0; i < rawData.length; ++i) {\n outputArray[i] = rawData.charCodeAt(i);\n }\n return outputArray;\n}\n\nasync function subscribe(reg) {\n try {\n const subscription = await reg.pushManager.subscribe({\n userVisibleOnly: true,\n applicationServerKey: urlBase64ToUint8Array(publicVapidKey)\n });\n addWebPushSubscription(subscription);\n } catch (e) {\n console.error('web push subscription error', e);\n }\n}\n\nasync function subscribeToWebPush() {\n console.log('subscribing to web push', navigator.serviceWorker);\n if (!desktopNotificationsEnabled() || !navigator.serviceWorker) { return false; }\n await navigator.serviceWorker.ready;\n const reg = await navigator.serviceWorker.getRegistration();\n reg.active.postMessage({key: session.getKey()});\n const sub = await reg.pushManager.getSubscription();\n sub ? addWebPushSubscription(sub) : subscribe(reg);\n}\n\nconst addWebPushSubscriptionsToChats = _.debounce(() => {\n const arr = Object.values(webPushSubscriptions);\n session.channelIds.forEach(channelId => {\n privateState(channelId).put('webPushSubscriptions', arr);\n });\n}, 5000);\n\nfunction removeSubscription(hash) {\n delete webPushSubscriptions[hash];\n publicState().user().get('webPushSubscriptions').get(hash).put(null);\n addWebPushSubscriptionsToChats();\n}\n\nasync function addWebPushSubscription(s, saveToGun = true) {\n const myKey = session.getKey();\n const mySecret = await Key.secret(myKey.epub, myKey);\n const enc = await Key.encrypt(s, mySecret);\n const hash = await util.getHash(JSON.stringify(s));\n if (saveToGun) {\n publicState().user().get('webPushSubscriptions').get(hash).put(enc);\n }\n webPushSubscriptions[hash] = s;\n addWebPushSubscriptionsToChats();\n}\n\nasync function getWebPushSubscriptions() {\n const myKey = session.getKey();\n const mySecret = await Key.secret(myKey.epub, myKey);\n publicState().user().get('webPushSubscriptions').map(async enc => {\n if (!enc) { return; }\n const s = await Key.decrypt(enc, mySecret);\n addWebPushSubscription(s, false);\n });\n}\n\nfunction getEpub(user) {\n return new Promise(resolve => {\n publicState().user(user).get('epub').on(async (epub,k,x,e) => {\n if (epub) {\n e.off();\n resolve(epub);\n }\n });\n });\n}\n\nasync function getNotificationText(notification) {\n const profile = await publicState().user(notification.from).get('profile').once();\n const name = (profile && profile.name) || 'someone';\n const event = notification.event || notification.action;\n let eventText;\n if (event === 'like') eventText = `${name} liked your post`;\n else if (event === 'reply') eventText = `${name} replied to your post`;\n else if (event === 'mention') eventText = `${name} mentioned you in their post`;\n else if (event === 'follow') eventText = `${name} started following you`;\n else eventText = `${name} sent you a notification: ${event}`;\n return eventText;\n}\n\nfunction subscribeToIrisNotifications(onClick?: Function) {\n let notificationsSeenTime: any;\n let notificationsShownTime: any;\n publicState().user().get('notificationsSeenTime').on(v => {\n notificationsSeenTime = v;\n console.log(v);\n });\n publicState().user().get('notificationsShownTime').on(v => notificationsShownTime = v);\n const setNotificationsShownTime = _.debounce(() => {\n publicState().user().get('notificationsShownTime').put(new Date().toISOString());\n }, 1000);\n const alreadyHave = new Set();\n group().on(`notifications/${session.getPubKey()}`, async (encryptedNotification, k, x, e, from) => {\n const id = from.slice(0,30) + encryptedNotification.slice(0,30);\n if (alreadyHave.has(id)) { return; }\n alreadyHave.add(id);\n const epub = await getEpub(from);\n const secret = await Key.secret(epub, session.getKey());\n const notification = await Key.decrypt(encryptedNotification, secret);\n if (!notification || typeof notification !== 'object') { return; }\n setNotificationsShownTime();\n notification.from = from;\n local().get('notifications').get(notification.time).put(notification);\n if (!notificationsSeenTime || (notificationsSeenTime < notification.time)) {\n changeUnseenNotificationCount(1);\n }\n if (!notificationsShownTime || notificationsShownTime < notification.time) {\n console.log('was new!');\n const text = await getNotificationText(notification);\n let desktopNotification = new Notification(text, {\n icon: '/assets/img/icon128.png',\n body: text,\n silent: true\n });\n desktopNotification.onclick = function() {\n const link = notification.target ? `/post/${notification.target}` : `/profile/${notification.from}`;\n onClick && onClick(link);\n changeUnseenNotificationCount(-1);\n window.focus();\n };\n }\n });\n}\n\nfunction changeUnseenNotificationCount(change) {\n if (!change) {\n unseenNotificationCount = 0;\n publicState().user().get('notificationsSeenTime').put(new Date().toISOString());\n } else {\n unseenNotificationCount += change;\n unseenNotificationCount = Math.max(unseenNotificationCount, 0);\n }\n local().get('unseenNotificationCount').put(unseenNotificationCount);\n}\n\nasync function sendIrisNotification(recipient, notification) {\n if (!(recipient && notification)) { return; } // TODO: use typescript or sth :D\n if (typeof notification === 'object') { notification.time = new Date().toISOString() }\n const epub = await getEpub(recipient);\n const secret = await Key.secret(epub, session.getKey());\n const enc = await Key.encrypt(notification, secret);\n publicState().user().get('notifications').get(recipient).put(enc);\n}\n\nasync function sendWebPushNotification(recipient, notification) {\n console.log('sending web push notification to', recipient, notification);\n const channel = privateState(recipient);\n const myKey = session.getKey();\n const shouldWebPush = (recipient === myKey.pub) || !(channel.activity && channel.activity.isActive);\n if (shouldWebPush && channel.webPushSubscriptions) {\n const subscriptions = [];\n const participants = Object.keys(channel.webPushSubscriptions);\n for (let i = 0; i < participants.length; i++) {\n const participant = participants[i];\n const secret = await channel.getSecret(participant);\n const payload = {\n title: await Key.encrypt(notification.title, secret),\n body: await Key.encrypt(notification.body, secret),\n from:{pub: myKey.pub, epub: myKey.epub}\n };\n channel.webPushSubscriptions[participant].forEach(s => {\n if (s && s.endpoint) {\n subscriptions.push({subscription: s, payload});\n }\n });\n }\n if (subscriptions.length === 0) {return;}\n fetch(NOTIFICATION_SERVICE_URL, {\n method: 'POST',\n body: JSON.stringify({subscriptions}),\n headers: {\n 'content-type': 'application/json'\n }\n }).catch(() => {});\n }\n}\n\nfunction init() {\n loginTime = new Date();\n unseenMsgsTotal = 0;\n}\n\nexport default {init, notifyMsg, getNotificationText, sendWebPushNotification, changeUnseenNotificationCount, subscribeToIrisNotifications, sendIrisNotification, changeChatUnseenCount: changeChatUnseenMsgsCount, webPushSubscriptions, subscribeToWebPush, getWebPushSubscriptions, removeSubscription};\n","import util from \"./util\";\nimport Node from \"./db/Node\";\n\n// TODO config {peers: ['http://localhost:8768/gun'], file: 'State.electron', multicast:false, localStorage: false}\nconst electron = util.isElectron ? new Node('electron').get('state') : null;\n\nexport default electron;","// @ts-nocheck\nimport Key from './Key';\nimport notifications from './notifications';\nimport Channel from './Channel';\nimport util from './util';\nimport _ from './lodash';\nimport Fuse from \"fuse.js\";\nimport local from './local';\nimport electron from './electron';\nimport user from './public';\nimport privateState from './private';\nimport blockedUsers from './blockedUsers';\n\nlet key: any;\nlet myName: string;\nlet latestChatLink: string;\nlet onlineTimeout: any;\nlet ourActivity: any;\nlet noFollows: boolean;\nlet noFollowers: boolean;\nlet searchIndex: any;\nlet initCalled: boolean;\nconst searchableItems: any = {};\nconst getExtendedFollowsCalled = new Map();\n\nconst DEFAULT_FOLLOW = 'hyECQHwSo7fgr2MVfPyakvayPeixxsaAWVtZ-vbaiSc.TXIp8MnCtrnW6n2MrYquWPcc-DTmZzMBmc2yaGv9gIU';\n\nconst DEFAULT_SETTINGS = {\n electron: {\n openAtLogin: true,\n minimizeOnClose: true\n },\n local: {\n enableWebtorrent: !util.isMobile,\n enablePublicPeerDiscovery: true,\n autoplayWebtorrent: true,\n maxConnectedPeers: util.isElectron ? 2 : 1\n }\n};\n\n/**\n * User session management utilities.\n */\nexport default {\n /**\n * Log in with a key from localStorage.\n *\n * If no key is found and options.autologin is not false, a new user will be created.\n *\n * If options.autofollow is not false, the default follow will be added.\n * @param options\n */\n init(options: any = {}) {\n if (initCalled) { return; }\n initCalled = true;\n let localStorageKey = localStorage.getItem('chatKeyPair');\n console.log('localStorageKey', localStorageKey);\n if (localStorageKey) {\n this.login(JSON.parse(localStorageKey));\n } else if (options.autologin !== false) {\n this.loginAsNewUser(options);\n } else {\n this.clearIndexedDB();\n }\n setTimeout(() => {\n local().get('block').map(() => {\n this.updateSearchIndex();\n });\n this.updateSearchIndex();\n });\n setInterval(() => {\n if (this.taskQueue.length) {\n //console.log('this.taskQueue', this.taskQueue.length);\n const t = this.taskQueue.shift();\n t && t();\n }\n }, 10);\n },\n\n DEFAULT_SETTINGS,\n DEFAULT_FOLLOW,\n\n taskQueue: [] as any[],\n\n updateSearchIndex: _.throttle(() => {\n const options = {keys: ['name'], includeScore: true, includeMatches: true, threshold: 0.3};\n const values = Object.values(_.omit(searchableItems, Object.keys(blockedUsers())));\n searchIndex = new Fuse(values, options);\n local().get('searchIndexUpdated').put(true);\n }, 2000, {leading:true}),\n\n saveSearchResult: _.throttle(k => {\n local().get('contacts').get(k).put({followDistance: searchableItems[k].followDistance,followerCount: searchableItems[k].followers.size});\n }, 1000, {leading:true}),\n\n addFollow(callback: Function, k: string, followDistance: number, follower?: string) {\n if (searchableItems[k]) {\n if (searchableItems[k].followDistance > followDistance) {\n searchableItems[k].followDistance = followDistance;\n }\n follower && searchableItems[k].followers.add(follower);\n } else {\n searchableItems[k] = {key: k, followDistance, followers: new Set(follower && [follower])};\n this.taskQueue.push(() => {\n user(k).get('profile').get('name').on((name: string) => {\n searchableItems[k].name = name;\n local().get('contacts').get(k).get('name').put(name);\n callback && callback(k, searchableItems[k]);\n });\n });\n }\n this.saveSearchResult(k);\n callback && callback(k, searchableItems[k]);\n this.updateSearchIndex();\n this.updateNoFollows();\n this.updateNoFollowers();\n },\n\n removeFollow(k: string, followDistance: number, follower: string) {\n if (followDistance === 1) {\n local().get('contacts').get(k).put(false);\n local().get('groups').get('follows').get(k).put(false);\n if (searchableItems[k]) {\n searchableItems[k].followers.delete(follower);\n this.updateNoFollows();\n this.updateNoFollowers();\n }\n }\n if (searchableItems[k] && searchableItems[k].followers.size === 0) {\n delete searchableItems[k];\n local().get('contacts').get(k).put(false);\n local().get('groups').get('everyone').get(k).put(false);\n }\n },\n\n getExtendedFollows(callback: Function, k = key.pub, maxDepth = 3, currentDepth = 1) {\n const called = getExtendedFollowsCalled.get(k);\n if (called && called <= currentDepth) {\n return;\n }\n getExtendedFollowsCalled.set(k, currentDepth);\n\n this.addFollow(callback, k, currentDepth - 1);\n\n user(k).get('follow').map((isFollowing: boolean, followedKey: string) => { // TODO: unfollow\n if (isFollowing) {\n this.addFollow(callback, followedKey, currentDepth, k);\n if (currentDepth < maxDepth) {\n this.taskQueue.push(() => this.getExtendedFollows(callback, followedKey, maxDepth, currentDepth + 1));\n }\n } else {\n this.removeFollow(followedKey, currentDepth, k);\n }\n });\n\n return searchableItems;\n },\n\n updateNoFollows: _.throttle(() => {\n const v = Object.keys(searchableItems).length <= 1;\n if (v !== noFollows) {\n noFollows = v;\n local().get('noFollows').put(noFollows);\n }\n }, 1000, {leading:true}),\n\n updateNoFollowers: _.throttle(() => {\n const v = !(searchableItems[key.pub] && (searchableItems[key.pub].followers.size > 0));\n if (v !== noFollowers) {\n noFollowers = v;\n local().get('noFollowers').put(noFollowers);\n }\n }, 1000, {leading:true}),\n\n getSearchIndex() {\n return searchIndex;\n },\n\n setOurOnlineStatus() {\n const activeRoute = window.location.hash;\n Channel.setActivity(ourActivity = 'active');\n const setActive = _.debounce(() => {\n const chatId = activeRoute && activeRoute.replace('#/profile/','').replace('#/chat/','');\n const chat = privateState(chatId);\n if (chat && !ourActivity) {\n chat.setMyMsgsLastSeenTime();\n }\n Channel.setActivity(ourActivity = 'active');\n clearTimeout(onlineTimeout);\n onlineTimeout = setTimeout(() => Channel.setActivity(ourActivity = 'online'), 30000);\n }, 1000);\n document.addEventListener(\"touchmove\", setActive);\n document.addEventListener(\"mousemove\", setActive);\n document.addEventListener(\"keypress\", setActive);\n document.addEventListener(\"visibilitychange\", () => {\n if (document.visibilityState === 'visible') {\n Channel.setActivity(ourActivity = 'active');\n const chatId = location.pathname.slice(1).replace('chat/','');\n const chat = activeRoute && privateState(chatId);\n if (chat) {\n chat.setMyMsgsLastSeenTime();\n notifications.changeChatUnseenCount(chatId, 0);\n }\n } else {\n Channel.setActivity(ourActivity = 'online');\n }\n });\n setActive();\n window.addEventListener(\"beforeunload\", () => {\n Channel.setActivity(ourActivity = null);\n });\n },\n\n updateGroups() {\n this.getExtendedFollows((k: string, info: any) => {\n if (info.followDistance <= 1) {\n local().get('groups').get('follows').get(k).put(true);\n }\n local().get('groups').get('everyone').get(k).put(true);\n if (k === this.getPubKey()) {\n this.updateNoFollowers();\n }\n });\n },\n\n /**\n * Log in with a private key.\n * @param key\n */\n login(k: any) {\n console.log('login', k);\n const shouldRefresh = !!key;\n console.log('shouldRefresh', shouldRefresh, 'key', key);\n key = k;\n localStorage.setItem('chatKeyPair', JSON.stringify(k));\n user().auth(key);\n user().put({epub: key.epub});\n notifications.subscribeToWebPush();\n notifications.getWebPushSubscriptions();\n //notifications.subscribeToIrisNotifications();\n Channel.getMyChatLinks( undefined, (chatLink: any) => {\n local().get('chatLinks').get(chatLink.id).put(chatLink.url);\n latestChatLink = chatLink.url;\n });\n this.setOurOnlineStatus();\n Channel.getChannels( (c: Channel) => this.addChannel(c));\n user().get('profile').get('name').on((name: any) => {\n if (name && typeof name === 'string') {\n myName = name;\n }\n });\n // a lot of this is iris-messenger stuff\n notifications.init();\n local().get('loggedIn').put(true);\n console.log('local().get(\\'loggedIn\\').put(true);', local());\n local().get('settings').once().then(settings => {\n if (!settings) {\n local().get('settings').put(DEFAULT_SETTINGS.local);\n } else if (settings.enableWebtorrent === undefined || settings.autoplayWebtorrent === undefined) {\n local().get('settings').get('enableWebtorrent').put(DEFAULT_SETTINGS.local.enableWebtorrent);\n local().get('settings').get('autoplayWebtorrent').put(DEFAULT_SETTINGS.local.autoplayWebtorrent);\n }\n });\n user().get('block').map((isBlocked: boolean, user: string) => {\n local().get('block').get(user).put(isBlocked);\n if (isBlocked) {\n delete searchableItems[user];\n }\n });\n this.updateGroups();\n if (shouldRefresh) {\n location.reload();\n }\n if (electron) {\n electron.get('settings').on(electron => {\n local().get('settings').get('electron').put(electron);\n });\n electron.get('user').put(key.pub);\n }\n local().get('filters').get('group').once().then(v => {\n if (!v) {\n local().get('filters').get('group').put('follows');\n }\n });\n },\n\n\n\n /**\n * Create a new user account and log in.\n * @param options {Object} - Options for the new account.\n * @returns {Promise<*>}\n */\n loginAsNewUser(options: any = {}) {\n const name = options.name || util.generateName();\n console.log('loginAsNewUser name', name);\n return Key.generate().then(k => {\n this.login(k);\n user().get('profile').put({a:null});\n user().get('profile').get('name').put(name);\n local().get('filters').put({a:null});\n local().get('filters').get('group').put('follows');\n Channel.createChatLink().then(l => latestChatLink = l);\n setTimeout(() => {\n if (options.autofollow !== false) {\n console.log('autofollowing', DEFAULT_FOLLOW);\n user().get('follow').get(DEFAULT_FOLLOW).put(true);\n }\n }, 1000); // maybe wait for login return instead\n });\n },\n\n /**\n * Log out the current user.\n * @returns {Promise}\n */\n async logOut() {\n if (electron) {\n electron.get('user').put(null);\n }\n // TODO: remove subscription from your channels\n if (navigator.serviceWorker) {\n const reg = await navigator.serviceWorker.getRegistration();\n if (reg && reg.pushManager) {\n reg.active?.postMessage({key: null});\n const sub = await reg.pushManager.getSubscription();\n if (sub) {\n const hash = await util.getHash(JSON.stringify(sub));\n notifications.removeSubscription(hash);\n sub.unsubscribe && sub.unsubscribe();\n }\n }\n }\n this.clearIndexedDB();\n localStorage.clear(); // TODO clear only iris data\n window.location.hash = '';\n window.location.href = '/';\n location.reload();\n },\n\n clearIndexedDB() {\n return new Promise(resolve => {\n const r1 = window.indexedDB.deleteDatabase('local()');\n const r2 = window.indexedDB.deleteDatabase('radata');\n let r1done = false;\n let r2done = false;\n const check = () => {\n r1done && r2done && resolve(undefined);\n }\n r1.onerror = r2.onerror = e => console.error(e);\n //r1.onblocked = r2.onblocked = e => console.error('blocked', e);\n r1.onsuccess = () => {\n r1done = true;\n check();\n }\n r2.onsuccess = () => {\n r2done = true;\n check();\n }\n });\n },\n\n getMyChatLink() {\n return latestChatLink || util.getProfileLink(key.pub);\n },\n\n /**\n * Get the keypair of the logged in user.\n * @returns {*}\n */\n getKey() { return key; },\n\n /**\n * Get the public key of the logged in user.\n * @returns {*}\n */\n getPubKey() {\n return key && key.pub;\n },\n\n /**\n * Get the name of the logged in user.\n * @returns {*}\n */\n getMyName() { return myName; }, // TODO maybe remove and use iris.user().get('profile').get('name') instead?\n\n myPeerUrl: (ip: string) => `http://${ip}:8767/gun`,\n\n async shareMyPeerUrl(channel: Channel) {\n const myIp = await local().get('settings').get('electron').get('publicIp').once();\n myIp && channel.put && channel.put('my_peer', this.myPeerUrl(myIp));\n },\n\n newChannel(pub: string, chatLink?: string) {\n if (!pub || this.channelIds.has(pub)) {\n return;\n }\n const chat = privateState(pub, chatLink);\n this.addChannel(chat);\n return chat;\n },\n\n addChannel(chat: Channel) {\n this.taskQueue.push(() => {\n let pub = chat.getId();\n if (this.channelIds.has(pub)) { return; }\n this.channelIds.add(pub);\n const chatNode = local().get('channels').get(pub);\n chatNode.get('latestTime').on((t: string) => {\n if (t && (!chat.latestTime || t > chat.latestTime)) {\n chat.latestTime = t;\n } else {\n // chatNode.get('latestTime').put(chat.latestTime); // omg recursion\n }\n });\n chatNode.get('theirMsgsLastSeenTime').on((t: string) => {\n if (!t) { return; }\n const d = new Date(t);\n if (!chat.theirMsgsLastSeenDate || chat.theirMsgsLastSeenDate < d) {\n chat.theirMsgsLastSeenDate = d;\n }\n });\n chat.getLatestMsg && chat.getLatestMsg((latest: any, info: any) => {\n this.processMessage(pub, latest, info);\n });\n notifications.changeChatUnseenCount(pub, 0);\n chat.notificationSetting = 'all';\n chat.onMy('notificationSetting', (val: any) => {\n chat.notificationSetting = val;\n });\n //$(\".chat-list\").append(el);\n chat.theirMsgsLastSeenTime = '';\n chat.getTheirMsgsLastSeenTime((time: any) => {\n if (chat && time && time >= chat.theirMsgsLastSeenTime) {\n chat.theirMsgsLastSeenTime = time;\n chatNode.get('theirMsgsLastSeenTime').put(time);\n }\n });\n chat.getMyMsgsLastSeenTime((time: any) => {\n chat.myLastSeenTime = new Date(time);\n if (chat.latest && chat.myLastSeenTime >= chat.latest.time) {\n notifications.changeChatUnseenCount(pub, 0);\n }\n });\n chat.isTyping = false;\n chat.getTyping(isTyping => {\n chat.isTyping = isTyping;\n local().get('channels').get(pub).get('isTyping').put(isTyping);\n });\n chat.online = {};\n Channel.getActivity(pub, (activity) => {\n if (chat) {\n chatNode.put({theirLastActiveTime: activity && activity.lastActive, activity: activity && activity.isActive && activity.status});\n chat.activity = activity;\n }\n });\n if (chat.uuid) {\n let isDarkMode = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches;\n chat.participantProfiles = {};\n chat.on('name', v => {\n chat.name = v;\n searchableItems[chat.uuid] = {name: v, uuid: chat.uuid};\n local().get('channels').get(chat.uuid).get('name').put(v);\n });\n chat.on('photo', v => {\n searchableItems[chat.uuid] = searchableItems[chat.uuid] || {};\n searchableItems[chat.uuid].photo = v;\n local().get('channels').get(chat.uuid).get('photo').put(v)\n });\n chat.on('about', v => local().get('channels').get(chat.uuid).get('about').put(v));\n chat.getParticipants(participants => {\n delete participants.undefined; // TODO fix where it comes from\n if (typeof participants === 'object') {\n let keys = Object.keys(participants);\n keys.forEach((k, i) => {\n let hue = 360 / Math.max(keys.length, 2) * i; // TODO use css filter brightness\n chat.participantProfiles[k] = {permissions: participants[k], color: `hsl(${hue}, 98%, ${isDarkMode ? 80 : 33}%)`};\n user(k).get('profile').get('name').on(name => {\n chat.participantProfiles[k].name = name;\n });\n });\n }\n local().get('channels').get(chat.uuid).get('participants').put(participants);\n });\n chat.inviteLinks = {};\n chat.getChatLinks({callback: ({url, id}) => {\n console.log('got chat link', id, url);\n chat.inviteLinks[id] = url; // TODO use State\n local().get('inviteLinksChanged').put(true);\n }});\n } else {\n // TODO do we want this?\n user(pub).get('profile').get('name').on(v => local().get('channels').get(pub).get('name').put(v))\n }\n if (chat.put) {\n chat.onTheir('webPushSubscriptions', (s, k, from) => {\n if (!Array.isArray(s)) { return; }\n chat.webPushSubscriptions = chat.webPushSubscriptions || {};\n chat.webPushSubscriptions[from || pub] = s;\n });\n const arr = Object.values(notifications.webPushSubscriptions);\n setTimeout(() => chat.put('webPushSubscriptions', arr), 5000);\n this.shareMyPeerUrl(chat);\n }\n chat.onTheir('call', call => {\n local().get('call').put({pub, call});\n });\n local().get('channels').get(pub).put({enabled:true});\n /* Disable private peer discovery, since they're not connecting anyway\n if (chat.onTheir) {\n chat.onTheir('my_peer', (url, k, from) => {\n console.log('Got private peer url', url, 'from', from);\n peers.addPeer({url, from})\n });\n }\n */\n\n });\n },\n\n // TODO: should perhaps be in Channel\n processMessage(chatId: string, msg: any, info: any, onClickNotification?: Function) {\n const chat = privateState(chatId);\n chat.messageIds = chat.messageIds || {};\n if (chat.messageIds[msg.time + info.from]) return;\n chat.messageIds[msg.time + info.from] = true;\n if (info) {\n msg = Object.assign(msg, info);\n }\n if (msg.invite) {\n const chatLink = `https://iris.to/?channelId=${msg.invite.group}&inviter=${chatId}`;\n this.newChannel(msg.invite.group, chatLink);\n return;\n }\n msg.selfAuthored = info.selfAuthored;\n local().get('channels').get(chatId).get('msgs').get(msg.time + (msg.from && msg.from.slice(0, 10))).put(JSON.stringify(msg));\n msg.timeObj = new Date(msg.time);\n if (!info.selfAuthored && msg.timeObj > chat.myLastSeenTime) {\n if (window.location.hash !== `#/chat/${ chatId}` || document.visibilityState !== 'visible') {\n notifications.changeChatUnseenCount(chatId, 1);\n } else if (ourActivity === 'active') {\n chat.setMyMsgsLastSeenTime();\n }\n }\n if (!info.selfAuthored && msg.time > chat.theirMsgsLastSeenTime) {\n local().get('channels').get(chatId).get('theirMsgsLastSeenTime').put(msg.time);\n }\n if (!chat.latestTime || (msg.time > chat.latestTime)) {\n local().get('channels').get(chatId).put({\n latestTime: msg.time,\n latest: {time: msg.time, text: msg.text, selfAuthored: info.selfAuthored}\n });\n }\n // TODO: onclickNotification should do route(`/chat/${ pub}`);\n notifications.notifyMsg(msg, info, chatId, onClickNotification);\n },\n\n subscribeToMsgs(pub) {\n const c = privateState(pub);\n if (c.subscribed) { return; }\n c.subscribed = true;\n c.getMessages((msg, info) => {\n this.processMessage(pub, msg, info);\n });\n },\n\n /**\n * Known private channels with other users\n */\n channelIds: new Set(),\n};\n","import publicSpace from './global';\nimport util from './util';\n\n/**\n * Content-addressed storage\n */\nexport default {\n /**\n * Get a file identified by its hash\n * @param hash\n * @param callback\n * @returns {Promise}\n */\n get(hash: string, callback: Function) {\n return new Promise((resolve, reject) => {\n if (!hash) {\n reject('No hash provided');\n }\n if (typeof hash !== 'string') {\n reject('Hash must be a string');\n }\n publicSpace().get('#').get(hash).on((v: any, _k: string, _x: any, e: any) => {\n if (v) {\n e.off();\n callback && callback(v);\n resolve(v);\n }\n });\n });\n },\n\n /**\n * Store a file and return its hash\n * @param value\n * @returns {Promise}\n */\n async put(value: any) {\n const hash = await util.getHash(value);\n publicSpace().get('#').get(hash).put(value);\n return hash;\n }\n}","// @ts-nocheck\n\n/*jshint unused: false */\n`use strict`;\nimport util from './util';\nimport Attribute from './Attribute';\nimport Key from './Key';\n\nconst errorMsg = `Invalid message:`;\n\nclass ValidationError extends Error {}\n\n/**\n* Signed message object. Your friends can index and relay your messages, while others can still verify that they were signed by you.\n*\n* Fields: signedData, signer (public key) and signature.\n*\n* signedData has an author, signer, type, time and optionally other fields.\n*\n* signature covers the utf8 string representation of signedData. Since messages are digitally signed, users only need to care about the message signer and not who relayed it or whose index it was found from.\n*\n* signer is the entity that verified its origin. In other words: message author and signer can be different entities, and only the signer needs to use Iris.\n*\n* For example, a crawler can import and sign other people's messages from Twitter. Only the users who trust the crawler will see the messages.\n*\n* Constructor: creates a message from the param obj.signedData that must contain at least the mandatory fields: author, type and time.\n* @param obj\n*\n*/\nclass SignedMessage {\n signedData: any;\n pubKey: any;\n sig: any;\n\n constructor(obj: any) {\n this.signedData = obj.signedData;\n this.pubKey = obj.pubKey;\n if (obj.sig) {\n if (typeof obj.sig !== `string`) {\n throw new ValidationError(`SignedMessage signature must be a string`);\n }\n this.sig = obj.sig;\n this.getHash();\n }\n this._validate();\n }\n\n getSignerKeyID() {\n return this.pubKey; // hack until gun supports keyID lookups\n //return util.getHash(this.pubKey);\n }\n\n _validate() {\n if (!this.signedData) {throw new ValidationError(`${errorMsg} Missing signedData`);}\n if (typeof this.signedData !== `object`) {throw new ValidationError(`${errorMsg} signedData must be an object`);}\n const d = this.signedData;\n\n if (!d.type) {throw new ValidationError(`${errorMsg} Missing type definition`);}\n if (!d.author) {throw new ValidationError(`${errorMsg} Missing author`);}\n if (typeof d.author !== `object`) {throw new ValidationError(`${errorMsg} Author must be object`);}\n if (Array.isArray(d.author)) {throw new ValidationError(`${errorMsg} Author must not be an array`);}\n if (Object.keys(d.author).length === 0) {throw new ValidationError(`${errorMsg} Author empty`);}\n if (this.pubKey) {\n this.signerKeyHash = this.getSignerKeyID();\n }\n for (const attr in d.author) {\n const t = typeof d.author[attr];\n if (t !== `string`) {\n if (Array.isArray(d.author[attr])) {\n for (let i = 0;i < d.author[attr].length;i++) {\n if (typeof d.author[attr][i] !== `string`) {throw new ValidationError(`${errorMsg} Author attribute must be string, got ${attr}: [${d.author[attr][i]}]`);}\n if (d.author[attr][i].length === 0) {\n throw new ValidationError(`${errorMsg} author ${attr} in array[${i}] is empty`);\n }\n }\n } else {\n throw new ValidationError(`${errorMsg} Author attribute must be string or array, got ${attr}: ${d.author[attr]}`);\n }\n }\n if (attr === `keyID`) {\n if (t !== `string`) {throw new ValidationError(`${errorMsg} Author keyID must be string, got ${t}`);}\n if (this.signerKeyHash && d.author[attr] !== this.signerKeyHash) {throw new ValidationError(`${errorMsg} If message has a keyID author, it must be signed by the same key`);}\n }\n }\n if (d.recipient) {\n if (typeof d.recipient !== `object`) {throw new ValidationError(`${errorMsg} Recipient must be object`);}\n if (Array.isArray(d.recipient)) {throw new ValidationError(`${errorMsg} Recipient must not be an array`);}\n if (Object.keys(d.recipient).length === 0) {throw new ValidationError(`${errorMsg} Recipient empty`);}\n for (const attr in d.recipient) {\n const t = typeof d.recipient[attr];\n if (t !== `string`) {\n if (Array.isArray(d.recipient[attr])) {\n for (let i = 0;i < d.recipient[attr].length;i++) {\n if (typeof d.recipient[attr][i] !== `string`) {throw new ValidationError(`${errorMsg} Recipient attribute must be string, got ${attr}: [${d.recipient[attr][i]}]`);}\n if (d.recipient[attr][i].length === 0) {\n throw new ValidationError(`${errorMsg} recipient ${attr} in array[${i}] is empty`);\n }\n }\n } else {\n throw new ValidationError(`${errorMsg} Recipient attribute must be string or array, got ${attr}: ${d.recipient[attr]}`);\n }\n }\n }\n }\n if (!(d.time || d.timestamp)) {throw new ValidationError(`${errorMsg} Missing time field`);}\n\n if (!Date.parse(d.time || d.timestamp)) {throw new ValidationError(`${errorMsg} Invalid time field`);}\n\n return true;\n }\n\n /**\n * @param {Object} key keypair to sign the message with\n */\n async sign(key) {\n this.sig = await Key.sign(this.signedData, key);\n this.pubKey = key.pub;\n await this.getHash();\n return true;\n }\n\n /**\n * Create an iris message. SignedMessage time is automatically set. If signingKey is specified and author omitted, signingKey will be used as author.\n * @param {Object} signedData message data object including author, recipient and other possible attributes\n * @param {Object} signingKey optionally, you can set the key to sign the message with\n * @returns {Promise} message\n */\n static async create(signedData, signingKey) {\n if (!signedData.author && signingKey) {\n signedData.author = {keyID: Key.getId(signingKey)};\n }\n signedData.time = signedData.time || (new Date()).toISOString();\n const m = new SignedMessage({signedData});\n if (signingKey) {\n await m.sign(signingKey);\n }\n return m;\n }\n\n getAuthor(index) {\n for (const a of this.getAuthorIterable()) {\n if (a.isUniqueType()) {\n return index.getContacts(a);\n }\n }\n }\n\n getRecipient(index) {\n if (!this.signedData.recipient) {\n return undefined;\n }\n for (const a of this.getRecipientIterable()) {\n if (a.isUniqueType()) {\n return index.getContacts(a);\n }\n }\n }\n\n /**\n * @returns {string} base64 sha256 hash of message\n */\n async getHash() {\n if (this.sig && !this.hash) {\n this.hash = await util.getHash(this.sig);\n }\n return this.hash;\n }\n\n getId() {\n return this.getHash();\n }\n\n static async fromSig(obj) {\n if (!obj.sig) {\n throw new Error(`Missing signature in object:`, obj);\n }\n if (!obj.pubKey) {\n throw new Error(`Missing pubKey in object:`);\n }\n //const signedData = await Key.verify(obj.sig, obj.pubKey); // disable sig verification while migrating to new gun :(\n const signedData = JSON.parse(obj.sig.slice(4)).m;\n const o = {signedData, sig: obj.sig, pubKey: obj.pubKey};\n return new SignedMessage(o);\n }\n\n /**\n * @return {boolean} true if message signature is valid. Otherwise throws ValidationError.\n */\n async verify() {\n if (!this.pubKey) {\n throw new ValidationError(`${errorMsg} SignedMessage has no .pubKey`);\n }\n if (!this.sig) {\n throw new ValidationError(`${errorMsg} SignedMessage has no .sig`);\n }\n this.signedData = await Key.verify(this.sig, this.pubKey);\n if (!this.signedData) {\n throw new ValidationError(`${errorMsg} Invalid signature`);\n }\n if (this.hash) {\n if (this.hash !== (await util.getHash(this.sig))) {\n throw new ValidationError(`${errorMsg} Invalid message hash`);\n }\n } else {\n this.getHash();\n }\n return true;\n }\n\n /**\n * @returns {string}\n */\n serialize() {\n return {sig: this.sig, pubKey: this.pubKey};\n }\n\n toString() {\n return JSON.stringify(this.serialize());\n }\n\n /**\n * @returns {Promise}\n */\n static async deserialize(s) {\n return SignedMessage.fromSig(s);\n }\n\n static async fromString(s) {\n return SignedMessage.fromSig(JSON.parse(s));\n }\n}\n\nexport default SignedMessage;\n","/*eslint no-useless-escape: \"off\", camelcase: \"off\" */\n\nimport session from './session';\nimport peers from './peers';\nimport util from './util';\nimport local from './local';\nimport global from './global';\nimport publicState from './public';\nimport group from './group';\nimport electron from './electron';\nimport privateState from './private';\nimport staticState from './static';\nimport notifications from './notifications';\n\nimport SignedMessage from './SignedMessage';\nimport Channel from './Channel';\nimport Node from './db/Node';\nimport Key from './Key';\n\nexport default {\n local,\n global,\n group,\n public: publicState,\n private: privateState,\n static: staticState,\n electron,\n peers,\n session,\n util,\n notifications,\n SignedMessage,\n Channel,\n Node,\n Key\n};"],"names":["_","throttle","func","limit","inThrottle","args","arguments","context","apply","setTimeout","debounce","inDebounce","clearTimeout","sample","arr","Math","floor","random","length","sampleSize","size","shuffled","slice","i","min","temp","index","defer","once","called","omit","obj","keys","newObj","Object","forEach","key","includes","defaults","undefined","pickBy","predicate","isEqual","a","b","Date","getTime","prototype","every","k","uniq","set","Set","Array","from","isNode","toString","call","global","process","e","userAgent","navigator","toLowerCase","isElectron","indexOf","isMobile","check","test","substr","vendor","gunOnceDefined","node","Promise","resolve","on","val","_k","_a","eve","off","animals","adjectives","getHash","data","format","Error","JSON","stringify","encoder","TextEncoder","encode","crypto","subtle","digest","buffer","hash","arrayBufferToBase64","base64ToHex","capitalize","s","charAt","toUpperCase","generateName","str","raw","atob","result","hex","charCodeAt","binary","bytes","Uint8Array","len","byteLength","String","fromCharCode","window","btoa","getCaret","el","selectionStart","document","selection","focus","r","createRange","re","createTextRange","rc","duplicate","moveToBookmark","getBookmark","setEndPoint","text","getUrlParameter","sParam","sParams","sPageURL","location","search","substring","sURLVariables","split","sParameterName","decodeURIComponent","formatTime","date","t","toLocaleTimeString","timeStyle","formatDate","toLocaleString","dateStyle","getDaySeparatorText","dateStr","now","nowStr","toLocaleDateString","dayDifference","round","weekday","getProfileLink","pub","origin","encodeURIComponent","truncateString","createElement","type","cls","parent","setAttribute","appendChild","delay","myKey","getActiveKey","datadir","keyfile","fs","privKeyFile","existsSync","f","readFileSync","fromString","generate","newKey","writeFileSync","chmodSync","localStorage","getItem","setItem","getDefault","getActivePub","setActiveKey","save","util","getId","parse","ecdhSubtle","generateKey","name","namedCurve","then","exportKey","privateKey","priv","d","publicKey","x","y","sa","epriv","epub","dh","console","log","keyToJwk","jwk","kty","crv","ext","key_ops","sign","pair","cb","opt","importKey","sig","m","Buffer","verify","buf","isValid","secret","keysToEcdhJwk","assign","pubJwk","props","privJwk","privKey","deriveBits","derivedBits","rawBits","derivedKey","aeskey","salt","combo","keyB64","replace","jwkKey","alg","getRandomValues","encrypt","msg","rand","iv","aes","ct","decrypt","json","bufiv","bufct","tagLength","TextDecoder","decode","_e","ELECTRON_GUN_URL","maxConnectedPeers","DEFAULT_PEERS","self","loc","host","is_localhost_but_not_dev","startsWith","hostname","endsWith","url","enabled","known","add","peer","visibility","Key","session","getKey","encryptedUrl","encryptedUrlHash","publicState","user","get","put","lastSeen","toISOString","connect","remove","disconnect","peerFromGun","getSaved","p","reset","isMixedContent","peers","disable","protocol","connectToLocalElectron","max","push","checkGunPeerCount","init","setInterval","generateUuid","c","v","Actor","id","handle","_message","postMessage","message","Message","fromObject","Get","Put","deserialize","dam","Hi","serialize","generateMsgId","nodeId","recipients","childKey","jsonStr","checksum","updatedNodes","inResponseTo","entries","children","myNodeId","childValue","value","updatedAt","isUserSpace","signatureObj","timestamp","signedObj","signature","signedStr","newFromKv","peerId","Memory","config","QuickLRU","maxSize","handlePut","handleGet","store","putMessage","mergeAndSave","nodeName","existing","MyDexie","dbName","version","stores","nodes","table","Dexie","IndexedDB","putQueue","values","map","notStored","db","bulkPut","err","error","queue","getQueue","bulkGet","callbacks","callback","open","stack","throttledPut","path","throttledGet","has","savePath","Websocket","router","ws","WebSocket","onopen","sendQueue","send","onmessage","event","onclose","onerror","readyState","OPEN","CONNECTING","Router","Map","storageAdapters","serverPeers","seenMessages","sendTo","topic","join","subscribers","subscribersByTopic","storageAdapter","subscriber","actor","opts","DEFAULT_CONFIG","allowPublicSpace","enableStats","localOnly","Node","on_subscriptions","once_subscriptions","map_subscriptions","root","webSocketPeers","getCurrentUser","currentUser","setCurrentUser","childData","doCallbacks","newNode","auth","isArray","signIfNeeded","addParentNodes","signed","childName","pop","parentId","request","counter","globalState","myOpts","retry","Infinity","UNIQUE_ID_VALIDATORS","email","bitcoin","bitcoin_address","ip","ipv6","gpg_fingerprint","gpg_keyid","google_oauth2","tel","phone","keyID","account","uuid","Attribute","guessTypeOf","getUuid","getUniqueIdValidators","isUniqueType","match","equals","uri","userSpace","DEFAULT_PERMISSIONS","read","write","admin","Channel","options","myGroupSecret","chatLink","useChatLink","participants","addParticipant","o","founder","getChatLinks","subscribe","putDirect","getMyGroupSecret","getMySecretUuid","onTheirDirect","theirSecretUuids","theirGroupSecrets","onTheir","hasAdmin","inviter","participantsChanged","saved","chatWith","channelId","sharedSecret","linkId","encrypted","sharedKey","encryptedChatRequest","channelRequestId","getTheirSecretUuid","getTheirGroupSecret","changeMyGroupSecret","mute","participant","block","secrets","ourSecretChannelIds","theirSecretChannelIds","mySecretUuid","mySecret","mySecretHash","getCurrentParticipants","getParticipants","getParticipantsCallbackId","getParticipantsCallbacks","getSecret","getOurSecretChannelId","getTheirSecretChannelId","getChannels","listenToChatLinks","keypair","getMyChatLinks","seen","handleChannel","ourSecretChannelId","encryptedChatId","chatId","getMessages","theirSecretChannelId","messageReceived","userState","selfAuthored","messages","decrypted","info","getLatestMsg","callbackIfLatest","latest","time","onMy","setMyMsgsLastSeenTime","getMyMsgsLastSeenTime","myMsgsLastSeenTime","getTheirMsgsLastSeenTime","theirMsgsLastSeenTime","removeParticipant","permissions","directSubscriptions","_onTheirDirectFromUser","groupSubscriptions","_onTheirGroupFromUser","trim","putGroup","onGroup","onDirect","onMyGroup","onTheirGroup","onMyDirect","hasWritePermission","hasOwnProperty","subscription","theirSecretUuid","_b","setTyping","isTyping","timeout","setTypingTimeout","getTyping","typing","getTypingTimeouts","getSimpleLink","urlRoot","chatLinks","chatLinkSubscriptions","links","link","channels","formatChatLink","encPub","requestId","createChatLink","sharedKeyString","encryptedSharedKey","ownerSecret","ownerEncryptedSharedKey","setActivity","activity","irisActivityStatus","setActivityTimeout","update","status","timerUpdate","getActivity","pubKey","activityDate","isActive","lastActive","isOnline","enc","channel","removeGroupChatLink","removePrivateChatLink","deleteChannel","deleteGroup","local","blockedUsers","isBlocked","_v","cache","groupName","groupNode","follows","requestAnimationFrame","isFollowing","reduce","sum","_cached_map","cached","cacheKey","myEvent","item","_cached_on","_cached_count","count","_cached_fn","fn","callbackId","myCallbacks","NOTIFICATION_SERVICE_URL","loginTime","unseenMsgsTotal","unseenNotificationCount","webPushSubscriptions","desktopNotificationsEnabled","Notification","permission","notifyMsg","onClick","shouldNotify","timeObj","visibilityState","privateState","notificationSetting","getMyName","shouldDesktopNotify","shouldAudioNotify","body","title","participantProfiles","desktopNotification","icon","silent","onclick","changeUnseenNotificationCount","changeChatUnseenMsgsCount","change","chat","chatNode","unseen","publicVapidKey","urlBase64ToUint8Array","base64String","padding","repeat","base64","rawData","outputArray","reg","pushManager","userVisibleOnly","applicationServerKey","addWebPushSubscription","subscribeToWebPush","serviceWorker","ready","getRegistration","active","getSubscription","sub","addWebPushSubscriptionsToChats","channelIds","removeSubscription","saveToGun","getWebPushSubscriptions","getEpub","getNotificationText","notification","profile","action","eventText","subscribeToIrisNotifications","notificationsSeenTime","notificationsShownTime","setNotificationsShownTime","alreadyHave","group","getPubKey","encryptedNotification","target","sendIrisNotification","recipient","sendWebPushNotification","shouldWebPush","subscriptions","payload","endpoint","fetch","method","headers","changeChatUnseenCount","electron","myName","latestChatLink","onlineTimeout","ourActivity","noFollows","noFollowers","searchIndex","initCalled","searchableItems","getExtendedFollowsCalled","DEFAULT_FOLLOW","DEFAULT_SETTINGS","openAtLogin","minimizeOnClose","enableWebtorrent","enablePublicPeerDiscovery","autoplayWebtorrent","localStorageKey","login","autologin","loginAsNewUser","clearIndexedDB","updateSearchIndex","taskQueue","shift","includeScore","includeMatches","threshold","Fuse","leading","saveSearchResult","followDistance","followerCount","followers","addFollow","follower","updateNoFollows","updateNoFollowers","removeFollow","getExtendedFollows","maxDepth","currentDepth","followedKey","getSearchIndex","setOurOnlineStatus","activeRoute","setActive","addEventListener","pathname","notifications","updateGroups","shouldRefresh","addChannel","settings","reload","l","autofollow","logOut","unsubscribe","clear","href","r1","indexedDB","deleteDatabase","r2","r1done","r2done","onsuccess","getMyChatLink","myPeerUrl","shareMyPeerUrl","myIp","newChannel","latestTime","theirMsgsLastSeenDate","processMessage","myLastSeenTime","online","theirLastActiveTime","isDarkMode","matchMedia","matches","photo","hue","color","inviteLinks","onClickNotification","messageIds","invite","subscribeToMsgs","subscribed","reject","publicSpace","_x","errorMsg","ValidationError","SignedMessage","signedData","_validate","getSignerKeyID","author","signerKeyHash","attr","create","signingKey","getAuthor","getAuthorIterable","getContacts","getRecipient","getRecipientIterable","fromSig","staticState"],"mappings":"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"} \ No newline at end of file diff --git a/dist/iris.umd.development.js b/dist/iris.umd.development.js index 5eab4f0..bbde869 100644 --- a/dist/iris.umd.development.js +++ b/dist/iris.umd.development.js @@ -1,21006 +1,14625 @@ (function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('fs'), require('path'), require('aws-sdk'), require('url'), require('events'), require('https'), require('http'), require('net'), require('tls'), require('crypto'), require('stream'), require('zlib'), require('bufferutil'), require('utf-8-validate'), require('dgram'), require('os'), require('child_process')) : - typeof define === 'function' && define.amd ? define(['exports', 'fs', 'path', 'aws-sdk', 'url', 'events', 'https', 'http', 'net', 'tls', 'crypto', 'stream', 'zlib', 'bufferutil', 'utf-8-validate', 'dgram', 'os', 'child_process'], factory) : - (global = global || self, factory(global.iris = {}, global.fs, global.path$1, global.awsSdk, global.url, global.events, global.https, global.http, global.net, global.tls, global.crypto, global.stream$1, global.zlib, global.bufferutil, global.utf8Validate, global.dgram, global.os, global.child_process)); -}(this, (function (exports, fs, path$1, awsSdk, url, events, https, http, net, tls, crypto, stream$1, zlib, bufferutil, utf8Validate, dgram, os, child_process) { 'use strict'; - - fs = fs && Object.prototype.hasOwnProperty.call(fs, 'default') ? fs['default'] : fs; - path$1 = path$1 && Object.prototype.hasOwnProperty.call(path$1, 'default') ? path$1['default'] : path$1; - awsSdk = awsSdk && Object.prototype.hasOwnProperty.call(awsSdk, 'default') ? awsSdk['default'] : awsSdk; - url = url && Object.prototype.hasOwnProperty.call(url, 'default') ? url['default'] : url; - events = events && Object.prototype.hasOwnProperty.call(events, 'default') ? events['default'] : events; - https = https && Object.prototype.hasOwnProperty.call(https, 'default') ? https['default'] : https; - http = http && Object.prototype.hasOwnProperty.call(http, 'default') ? http['default'] : http; - net = net && Object.prototype.hasOwnProperty.call(net, 'default') ? net['default'] : net; - tls = tls && Object.prototype.hasOwnProperty.call(tls, 'default') ? tls['default'] : tls; - crypto = crypto && Object.prototype.hasOwnProperty.call(crypto, 'default') ? crypto['default'] : crypto; - stream$1 = stream$1 && Object.prototype.hasOwnProperty.call(stream$1, 'default') ? stream$1['default'] : stream$1; - zlib = zlib && Object.prototype.hasOwnProperty.call(zlib, 'default') ? zlib['default'] : zlib; - bufferutil = bufferutil && Object.prototype.hasOwnProperty.call(bufferutil, 'default') ? bufferutil['default'] : bufferutil; - utf8Validate = utf8Validate && Object.prototype.hasOwnProperty.call(utf8Validate, 'default') ? utf8Validate['default'] : utf8Validate; - dgram = dgram && Object.prototype.hasOwnProperty.call(dgram, 'default') ? dgram['default'] : dgram; - os = os && Object.prototype.hasOwnProperty.call(os, 'default') ? os['default'] : os; - child_process = child_process && Object.prototype.hasOwnProperty.call(child_process, 'default') ? child_process['default'] : child_process; - - var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {}; - - function createCommonjsModule(fn, module) { - return module = { exports: {} }, fn(module, module.exports), module.exports; - } - - function commonjsRequire () { - throw new Error('Dynamic requires are not currently supported by @rollup/plugin-commonjs'); - } - - var yson = createCommonjsModule(function (module) { - (function(){ - // JSON: JavaScript Object Notation - // YSON: Yielding javaScript Object Notation - var yson = {}, u, sI = setTimeout.turn || (typeof setImmediate != ''+u && setImmediate) || setTimeout; - - yson.parseAsync = function(text, done, revive, M){ - if('string' != typeof text){ try{ done(u,JSON.parse(text)); }catch(e){ done(e); } return } - var ctx = {i: 0, text: text, done: done, l: text.length, up: []}; - //M = 1024 * 1024 * 100; - //M = M || 1024 * 64; - M = M || 1024 * 32; - parse(); - function parse(){ - //var S = +new Date; - var s = ctx.text; - var i = ctx.i, l = ctx.l, j = 0; - var w = ctx.w, b, tmp; - while(j++ < M){ - var c = s[i++]; - if(i > l){ - ctx.end = true; - break; - } - if(w){ - i = s.indexOf('"', i-1); c = s[i]; - tmp = 0; while('\\' == s[i-(++tmp)]){} tmp = !(tmp % 2);//tmp = ('\\' == s[i-1]); // json is stupid - b = b || tmp; - if('"' == c && !tmp){ - w = u; - tmp = ctx.s; - if(ctx.a){ - tmp = s.slice(ctx.sl, i); - if(b || (1+tmp.indexOf('\\'))){ tmp = JSON.parse('"'+tmp+'"'); } // escape + unicode :( handling - if(ctx.at instanceof Array){ - ctx.at.push(ctx.s = tmp); - } else { - if(!ctx.at){ ctx.end = j = M; tmp = u; } - (ctx.at||{})[ctx.s] = ctx.s = tmp; - } - ctx.s = u; - } else { - ctx.s = s.slice(ctx.sl, i); - if(b || (1+ctx.s.indexOf('\\'))){ ctx.s = JSON.parse('"'+ctx.s+'"'); } // escape + unicode :( handling - } - ctx.a = b = u; - } - ++i; - } else { - switch(c){ - case '"': - ctx.sl = i; - w = true; - break; - case ':': - ctx.ai = i; - ctx.a = true; - break; - case ',': - if(ctx.a || ctx.at instanceof Array){ - if(tmp = s.slice(ctx.ai, i-1)){ - if(u !== (tmp = value(tmp))){ - if(ctx.at instanceof Array){ - ctx.at.push(tmp); - } else { - ctx.at[ctx.s] = tmp; - } - } - } - } - ctx.a = u; - if(ctx.at instanceof Array){ - ctx.a = true; - ctx.ai = i; - } - break; - case '{': - ctx.up.push(ctx.at||(ctx.at = {})); - if(ctx.at instanceof Array){ - ctx.at.push(ctx.at = {}); - } else - if(u !== (tmp = ctx.s)){ - ctx.at[tmp] = ctx.at = {}; - } - ctx.a = u; - break; - case '}': - if(ctx.a){ - if(tmp = s.slice(ctx.ai, i-1)){ - if(u !== (tmp = value(tmp))){ - if(ctx.at instanceof Array){ - ctx.at.push(tmp); - } else { - if(!ctx.at){ ctx.end = j = M; tmp = u; } - (ctx.at||{})[ctx.s] = tmp; - } - } - } - } - ctx.a = u; - ctx.at = ctx.up.pop(); - break; - case '[': - if(u !== (tmp = ctx.s)){ - ctx.up.push(ctx.at); - ctx.at[tmp] = ctx.at = []; - } else - if(!ctx.at){ - ctx.up.push(ctx.at = []); - } - ctx.a = true; - ctx.ai = i; - break; - case ']': - if(ctx.a){ - if(tmp = s.slice(ctx.ai, i-1)){ - if(u !== (tmp = value(tmp))){ - if(ctx.at instanceof Array){ - ctx.at.push(tmp); - } else { - ctx.at[ctx.s] = tmp; - } - } - } - } - ctx.a = u; - ctx.at = ctx.up.pop(); - break; - } - } - } - ctx.s = u; - ctx.i = i; - ctx.w = w; - if(ctx.end){ - tmp = ctx.at; - if(u === tmp){ - try{ tmp = JSON.parse(text); - }catch(e){ return ctx.done(e) } - } - ctx.done(u, tmp); - } else { - sI(parse); - } - } - }; - function value(s){ - var n = parseFloat(s); - if(!isNaN(n)){ - return n; - } - s = s.trim(); - if('true' == s){ - return true; - } - if('false' == s){ - return false; - } - if('null' == s){ - return null; - } - } - - yson.stringifyAsync = function(data, done, replacer, space, ctx){ - //try{done(u, JSON.stringify(data, replacer, space))}catch(e){done(e)}return; - ctx = ctx || {}; - ctx.text = ctx.text || ""; - ctx.up = [ctx.at = {d: data}]; - ctx.done = done; - ctx.i = 0; - var j = 0; - ify(); - function ify(){ - var at = ctx.at, data = at.d, add = '', tmp; - if(at.i && (at.i - at.j) > 0){ add += ','; } - if(u !== (tmp = at.k)){ add += JSON.stringify(tmp) + ':'; } //'"'+tmp+'":' } // only if backslash - switch(typeof data){ - case 'boolean': - add += ''+data; - break; - case 'string': - add += JSON.stringify(data); //ctx.text += '"'+data+'"';//JSON.stringify(data); // only if backslash - break; - case 'number': - add += (isNaN(data)? 'null' : data); - break; - case 'object': - if(!data){ - add += 'null'; - break; - } - if(data instanceof Array){ - add += '['; - at = {i: -1, as: data, up: at, j: 0}; - at.l = data.length; - ctx.up.push(ctx.at = at); - break; - } - if('function' != typeof (data||'').toJSON){ - add += '{'; - at = {i: -1, ok: Object.keys(data).sort(), as: data, up: at, j: 0}; - at.l = at.ok.length; - ctx.up.push(ctx.at = at); - break; - } - if(tmp = data.toJSON()){ - add += tmp; - break; - } - // let this & below pass into default case... - case 'function': - if(at.as instanceof Array){ - add += 'null'; - break; - } - default: // handle wrongly added leading `,` if previous item not JSON-able. - add = ''; - at.j++; - } - ctx.text += add; - while(1+at.i >= at.l){ - ctx.text += (at.ok? '}' : ']'); - at = ctx.at = at.up; - } - if(++at.i < at.l){ - if(tmp = at.ok){ - at.d = at.as[at.k = tmp[at.i]]; - } else { - at.d = at.as[at.i]; - } - if(++j < 9){ return ify() } else { j = 0; } - sI(ify); - return; - } - ctx.done(u, ctx.text); - } - }; - if(typeof window != ''+u){ window.YSON = yson; } - try{ if('object' != ''+u){ module.exports = yson; } }catch(e){} - if(typeof JSON != ''+u){ - JSON.parseAsync = yson.parseAsync; - JSON.stringifyAsync = yson.stringifyAsync; - } - - }()); - }); - - var gun = createCommonjsModule(function (module) { - (function(){ - - /* UNBUILD */ - function USE(arg, req){ - return req? commonjsRequire() : arg.slice? USE[R(arg)] : function(mod, path){ - arg(mod = {exports: {}}); - USE[R(path)] = mod.exports; - } - function R(p){ - return p.split('/').slice(-1).toString().replace('.js',''); - } - } - { var MODULE = module; } - USE(function(module){ - // Shim for generic javascript utilities. - String.random = function(l, c){ - var s = ''; - l = l || 24; // you are not going to make a 0 length random number, so no need to check type - c = c || '0123456789ABCDEFGHIJKLMNOPQRSTUVWXZabcdefghijklmnopqrstuvwxyz'; - while(l-- > 0){ s += c.charAt(Math.floor(Math.random() * c.length)); } - return s; - }; - String.match = function(t, o){ var tmp, u; - if('string' !== typeof t){ return false } - if('string' == typeof o){ o = {'=': o}; } - o = o || {}; - tmp = (o['='] || o['*'] || o['>'] || o['<']); - if(t === tmp){ return true } - if(u !== o['=']){ return false } - tmp = (o['*'] || o['>']); - if(t.slice(0, (tmp||'').length) === tmp){ return true } - if(u !== o['*']){ return false } - if(u !== o['>'] && u !== o['<']){ - return (t >= o['>'] && t <= o['<'])? true : false; - } - if(u !== o['>'] && t >= o['>']){ return true } - if(u !== o['<'] && t <= o['<']){ return true } - return false; - }; - String.hash = function(s, c){ // via SO - if(typeof s !== 'string'){ return } - c = c || 0; // CPU schedule hashing by - if(!s.length){ return c } - for(var i=0,l=s.length,n; i= (check.now() - l)) && c++ < 3333){ f(); return } - sI(function(){ l = check.now(); f(); },c=0); - }; - }()); - (function(){ // Too many polls block, this "threads" them in turns over a single thread in time. - var sT = setTimeout, t = sT.turn = sT.turn || function(f){ 1 == s.push(f) && p(T); } - , s = t.s = [], p = sT.poll, i = 0, f, T = function(){ - if(f = s[i++]){ f(); } - if(i == s.length || 99 == i){ - s = t.s = s.slice(i); - i = 0; - } - if(s.length){ p(T); } - }; - }()); - (function(){ - var u, sT = setTimeout, T = sT.turn; - (sT.each = sT.each || function(l,f,e,S){ S = S || 9; (function t(s,L,r){ - if(L = (s = (l||[]).splice(0,S)).length){ - for(var i = 0; i < L; i++){ - if(u !== (r = f(s[i]))){ break } - } - if(u === r){ T(t); return } - } e && e(r); - }());})(); - }()); - })(USE, './shim'); - USE(function(module){ - // On event emitter generic javascript utility. - module.exports = function onto(tag, arg, as){ - if(!tag){ return {to: onto} } - var u, f = 'function' == typeof arg, tag = (this.tag || (this.tag = {}))[tag] || f && ( - this.tag[tag] = {tag: tag, to: onto._ = { next: function(arg){ var tmp; - if(tmp = this.to){ tmp.next(arg); } - }}}); - if(f){ - var be = { - off: onto.off || - (onto.off = function(){ - if(this.next === onto._.next){ return !0 } - if(this === this.the.last){ - this.the.last = this.back; - } - this.to.back = this.back; - this.next = onto._.next; - this.back.to = this.to; - if(this.the.last === this.the){ - delete this.on.tag[this.the.tag]; - } - }), - to: onto._, - next: arg, - the: tag, - on: this, - as: as, - }; - (be.back = tag.last || tag).to = be; - return tag.last = be; - } - if((tag = tag.to) && u !== arg){ tag.next(arg); } - return tag; - }; - })(USE, './onto'); - USE(function(module){ - // Valid values are a subset of JSON: null, binary, number (!Infinity), text, - // or a soul relation. Arrays need special algorithms to handle concurrency, - // so they are not supported directly. Use an extension that supports them if - // needed but research their problems first. - module.exports = function (v) { - // "deletes", nulling out keys. - return v === null || - "string" === typeof v || - "boolean" === typeof v || - // we want +/- Infinity to be, but JSON does not support it, sad face. - // can you guess what v === v checks for? ;) - ("number" === typeof v && v != Infinity && v != -Infinity && v === v) || - (!!v && "string" == typeof v["#"] && Object.keys(v).length === 1 && v["#"]); - }; - })(USE, './valid'); - USE(function(module){ - USE('./shim'); - function State(){ - var t = +new Date; - if(last < t){ - return N = 0, last = t + State.drift; - } - return last = t + ((N += 1) / D) + State.drift; - } - State.drift = 0; - var NI = -Infinity, N = 0, D = 999, last = NI, u; // WARNING! In the future, on machines that are D times faster than 2016AD machines, you will want to increase D by another several orders of magnitude so the processing speed never out paces the decimal resolution (increasing an integer effects the state accuracy). - State.is = function(n, k, o){ // convenience function to get the state on a key on a node and return it. - var tmp = (k && n && n._ && n._['>']) || o; - if(!tmp){ return } - return ('number' == typeof (tmp = tmp[k]))? tmp : NI; - }; - State.ify = function(n, k, s, v, soul){ // put a key's state on a node. - (n = n || {})._ = n._ || {}; // safety check or init. - if(soul){ n._['#'] = soul; } // set a soul if specified. - var tmp = n._['>'] || (n._['>'] = {}); // grab the states data. - if(u !== k && k !== '_'){ - if('number' == typeof s){ tmp[k] = s; } // add the valid state. - if(u !== v){ n[k] = v; } // Note: Not its job to check for valid values! - } - return n; - }; - module.exports = State; - })(USE, './state'); - USE(function(module){ - USE('./shim'); - function Dup(opt){ - var dup = {s:{}}, s = dup.s; - opt = opt || {max: 999, age: 1000 * 9};//*/ 1000 * 9 * 3}; - dup.check = function(id){ - if(!s[id]){ return false } - return dt(id); - }; - var dt = dup.track = function(id){ - var it = s[id] || (s[id] = {}); - it.was = dup.now = +new Date; - if(!dup.to){ dup.to = setTimeout(dup.drop, opt.age + 9); } - if(dt.ed){ dt.ed(id); } - return it; - }; - dup.drop = function(age){ - dup.to = null; - dup.now = +new Date; - var l = Object.keys(s); - console.STAT && console.STAT(dup.now, +new Date - dup.now, 'dup drop keys'); // prev ~20% CPU 7% RAM 300MB // now ~25% CPU 7% RAM 500MB - setTimeout.each(l, function(id){ var it = s[id]; // TODO: .keys( is slow? - if(it && (age || opt.age) > (dup.now - it.was)){ return } - delete s[id]; - },0,99); - }; - return dup; - } - module.exports = Dup; - })(USE, './dup'); - USE(function(module){ - // request / response module, for asking and acking messages. - USE('./onto'); // depends upon onto! - module.exports = function ask(cb, as){ - if(!this.on){ return } - var lack = (this.opt||{}).lack || 9000; - if(!('function' == typeof cb)){ - if(!cb){ return } - var id = cb['#'] || cb, tmp = (this.tag||'')[id]; - if(!tmp){ return } - if(as){ - tmp = this.on(id, as); - clearTimeout(tmp.err); - tmp.err = setTimeout(function(){ tmp.off(); }, lack); - } - return true; - } - var id = (as && as['#']) || random(9); - if(!cb){ return id } - var to = this.on(id, cb, as); - to.err = to.err || setTimeout(function(){ to.off(); - to.next({err: "Error: No ACK yet.", lack: true}); - }, lack); - return id; - }; - var random = String.random || function(){ return Math.random().toString(36).slice(2) }; - })(USE, './ask'); - USE(function(module){ - - function Gun(o){ - if(o instanceof Gun){ return (this._ = {$: this}).$ } - if(!(this instanceof Gun)){ return new Gun(o) } - return Gun.create(this._ = {$: this, opt: o}); - } - - Gun.is = function($){ return ($ instanceof Gun) || ($ && $._ && ($ === $._.$)) || false }; - - Gun.version = 0.2020; - - Gun.chain = Gun.prototype; - Gun.chain.toJSON = function(){}; - - USE('./shim'); - Gun.valid = USE('./valid'); - Gun.state = USE('./state'); - Gun.on = USE('./onto'); - Gun.dup = USE('./dup'); - Gun.ask = USE('./ask'); - (function(){ - Gun.create = function(at){ - at.root = at.root || at; - at.graph = at.graph || {}; - at.on = at.on || Gun.on; - at.ask = at.ask || Gun.ask; - at.dup = at.dup || Gun.dup(); - var gun = at.$.opt(at.opt); - if(!at.once){ - at.on('in', universe, at); - at.on('out', universe, at); - at.on('put', map, at); - Gun.on('create', at); - at.on('create', at); - } - at.once = 1; - return gun; - }; - function universe(msg){ - // TODO: BUG! msg.out = null being set! - //if(!F){ var eve = this; setTimeout(function(){ universe.call(eve, msg,1) },Math.random() * 100);return; } // ADD F TO PARAMS! - if(!msg){ return } - if(msg.out === universe){ this.to.next(msg); return } - var eve = this, as = eve.as, at = as.at || as, gun = at.$, dup = at.dup, tmp, DBG = msg.DBG; - (tmp = msg['#']) || (tmp = msg['#'] = text_rand(9)); - if(dup.check(tmp)){ return } dup.track(tmp); - tmp = msg._; msg._ = ('function' == typeof tmp)? tmp : function(){}; - (msg.$ && (msg.$ === (msg.$._||'').$)) || (msg.$ = gun); - if(msg['@'] && !msg.put){ ack(msg); } - if(!at.ask(msg['@'], msg)){ // is this machine listening for an ack? - DBG && (DBG.u = +new Date); - if(msg.put){ put(msg); return } else - if(msg.get){ Gun.on.get(msg, gun); } - } - DBG && (DBG.uc = +new Date); - eve.to.next(msg); - DBG && (DBG.ua = +new Date); - if(msg.nts || msg.NTS){ return } // TODO: This shouldn't be in core, but fast way to prevent NTS spread. Delete this line after all peers have upgraded to newer versions. - msg.out = universe; at.on('out', msg); - DBG && (DBG.ue = +new Date); - } - function put(msg){ - if(!msg){ return } - var ctx = msg._||'', root = ctx.root = ((ctx.$ = msg.$||'')._||'').root; - if(msg['@'] && ctx.faith && !ctx.miss){ // TODO: AXE may split/route based on 'put' what should we do here? Detect @ in AXE? I think we don't have to worry, as DAM will route it on @. - msg.out = universe; - root.on('out', msg); - return; - } - ctx.latch = root.hatch; ctx.match = root.hatch = []; - var put = msg.put; - var DBG = ctx.DBG = msg.DBG, S = +new Date; CT = CT || S; - if(put['#'] && put['.']){ /*root && root.on('put', msg);*/ return } // TODO: BUG! This needs to call HAM instead. - DBG && (DBG.p = S); - ctx['#'] = msg['#']; - ctx.msg = msg; - ctx.all = 0; - ctx.stun = 1; - var nl = Object.keys(put);//.sort(); // TODO: This is unbounded operation, large graphs will be slower. Write our own CPU scheduled sort? Or somehow do it in below? Keys itself is not O(1) either, create ES5 shim over ?weak map? or custom which is constant. - console.STAT && console.STAT(S, ((DBG||ctx).pk = +new Date) - S, 'put sort'); - var ni = 0, nj, kl, soul, node, states, err, tmp; - (function pop(o){ - if(nj != ni){ nj = ni; - if(!(soul = nl[ni])){ - console.STAT && console.STAT(S, ((DBG||ctx).pd = +new Date) - S, 'put'); - fire(ctx); - return; - } - if(!(node = put[soul])){ err = ERR+cut(soul)+"no node."; } else - if(!(tmp = node._)){ err = ERR+cut(soul)+"no meta."; } else - if(soul !== tmp['#']){ err = ERR+cut(soul)+"soul not same."; } else - if(!(states = tmp['>'])){ err = ERR+cut(soul)+"no state."; } - kl = Object.keys(node||{}); // TODO: .keys( is slow - } - if(err){ - msg.err = ctx.err = err; // invalid data should error and stun the message. - fire(ctx); - //console.log("handle error!", err) // handle! - return; - } - var i = 0, key; o = o || 0; - while(o++ < 9 && (key = kl[i++])){ - if('_' === key){ continue } - var val = node[key], state = states[key]; - if(u === state){ err = ERR+cut(key)+"on"+cut(soul)+"no state."; break } - if(!valid(val)){ err = ERR+cut(key)+"on"+cut(soul)+"bad "+(typeof val)+cut(val); break } - //ctx.all++; //ctx.ack[soul+key] = ''; - ham(val, key, soul, state, msg); - ++C; // courtesy count; - } - if((kl = kl.slice(i)).length){ turn(pop); return } - ++ni; kl = null; pop(o); - }()); - } Gun.on.put = put; - // TODO: MARK!!! clock below, reconnect sync, SEA certify wire merge, User.auth taking multiple times, // msg put, put, say ack, hear loop... - // WASIS BUG! local peer not ack. .off other people: .open - function ham(val, key, soul, state, msg){ - var ctx = msg._||'', root = ctx.root, graph = root.graph, tmp; - var vertex = graph[soul] || empty, was = state_is(vertex, key, 1), known = vertex[key]; - - var DBG = ctx.DBG; if(tmp = console.STAT){ if(!graph[soul] || !known){ tmp.has = (tmp.has || 0) + 1; } } - - var now = State(); - if(state > now){ - setTimeout(function(){ ham(val, key, soul, state, msg); }, (tmp = state - now) > MD? MD : tmp); // Max Defer 32bit. :( - console.STAT && console.STAT(((DBG||ctx).Hf = +new Date), tmp, 'future'); - return; - } - if(state < was){ /*old;*/ { return } } // but some chains have a cache miss that need to re-fire. // TODO: Improve in future. // for AXE this would reduce rebroadcast, but GUN does it on message forwarding. // TURNS OUT CACHE MISS WAS NOT NEEDED FOR NEW CHAINS ANYMORE!!! DANGER DANGER DANGER, ALWAYS RETURN! (or am I missing something?) - if(!ctx.faith){ // TODO: BUG? Can this be used for cache miss as well? // Yes this was a bug, need to check cache miss for RAD tests, but should we care about the faith check now? Probably not. - if(state === was && (val === known || L(val) <= L(known))){ /*console.log("same");*/ /*same;*/ if(!ctx.miss){ return } } // same - } - ctx.stun++; // TODO: 'forget' feature in SEA tied to this, bad approach, but hacked in for now. Any changes here must update there. - var aid = msg['#']+ctx.all++, id = {toString: function(){ return aid }, _: ctx}; id.toJSON = id.toString; // this *trick* makes it compatible between old & new versions. - root.dup.track(id)['#'] = msg['#']; // fixes new OK acks for RPC like RTC. - DBG && (DBG.ph = DBG.ph || +new Date); - root.on('put', {'#': id, '@': msg['@'], put: {'#': soul, '.': key, ':': val, '>': state}, ok: msg.ok, _: ctx}); - } - function map(msg){ - var DBG; if(DBG = (msg._||'').DBG){ DBG.pa = +new Date; DBG.pm = DBG.pm || +new Date;} - var eve = this, root = eve.as, graph = root.graph, ctx = msg._, put = msg.put, soul = put['#'], key = put['.'], val = put[':'], state = put['>'], tmp; - if((tmp = ctx.msg) && (tmp = tmp.put) && (tmp = tmp[soul])){ state_ify(tmp, key, state, val, soul); } // necessary! or else out messages do not get SEA transforms. - //var bytes = ((graph[soul]||'')[key]||'').length||1; - graph[soul] = state_ify(graph[soul], key, state, val, soul); - if(tmp = (root.next||'')[soul]){ - //tmp.bytes = (tmp.bytes||0) + ((val||'').length||1) - bytes; - //if(tmp.bytes > 2**13){ Gun.log.once('byte-limit', "Note: In the future, GUN peers will enforce a ~4KB query limit. Please see https://gun.eco/docs/Page") } - tmp.on('in', msg); - } - fire(ctx); - eve.to.next(msg); - } - function fire(ctx, msg){ var root; - if(ctx.stop){ return } - if(!ctx.err && 0 < --ctx.stun){ return } // TODO: 'forget' feature in SEA tied to this, bad approach, but hacked in for now. Any changes here must update there. - ctx.stop = 1; - if(!(root = ctx.root)){ return } - var tmp = ctx.match; tmp.end = 1; - if(tmp === root.hatch){ if(!(tmp = ctx.latch) || tmp.end){ delete root.hatch; } else { root.hatch = tmp; } } - ctx.hatch && ctx.hatch(); // TODO: rename/rework how put & this interact. - setTimeout.each(ctx.match, function(cb){cb && cb();}); - if(!(msg = ctx.msg) || ctx.err || msg.err){ return } - msg.out = universe; - ctx.root.on('out', msg); - - CF(); // courtesy check; - } - function ack(msg){ // aggregate ACKs. - var id = msg['@'] || '', ctx; - if(!(ctx = id._)){ - var dup = (dup = msg.$) && (dup = dup._) && (dup = dup.root) && (dup = dup.dup); - if(!(dup = dup.check(id))){ return } - msg['@'] = dup['#'] || msg['@']; // This doesn't do anything anymore, backtrack it to something else? - return; - } - ctx.acks = (ctx.acks||0) + 1; - if(ctx.err = msg.err){ - msg['@'] = ctx['#']; - fire(ctx); // TODO: BUG? How it skips/stops propagation of msg if any 1 item is error, this would assume a whole batch/resync has same malicious intent. - } - ctx.ok = msg.ok || ctx.ok; - if(!ctx.stop && !ctx.crack){ ctx.crack = ctx.match && ctx.match.push(function(){back(ctx);}); } // handle synchronous acks. NOTE: If a storage peer ACKs synchronously then the PUT loop has not even counted up how many items need to be processed, so ctx.STOP flags this and adds only 1 callback to the end of the PUT loop. - back(ctx); - } - function back(ctx){ - if(!ctx || !ctx.root){ return } - if(ctx.stun || ctx.acks !== ctx.all){ return } - ctx.root.on('in', {'@': ctx['#'], err: ctx.err, ok: ctx.err? u : ctx.ok || {'':1}}); - } - - var ERR = "Error: Invalid graph!"; - var cut = function(s){ return " '"+(''+s).slice(0,9)+"...' " }; - var L = JSON.stringify, MD = 2147483647, State = Gun.state; - var C = 0, CT, CF = function(){if(C>999 && (C/-(CT - (CT = +new Date))>1)){Gun.window && console.log("Warning: You're syncing 1K+ records a second, faster than DOM can update - consider limiting query.");CF=function(){C=0;};}}; - - }()); - (function(){ - Gun.on.get = function(msg, gun){ - var root = gun._, get = msg.get, soul = get['#'], node = root.graph[soul], has = get['.']; - var next = root.next || (root.next = {}), at = next[soul]; - - // TODO: Azarattum bug, what is in graph is not same as what is in next. Fix! - - // queue concurrent GETs? - // TODO: consider tagging original message into dup for DAM. - // TODO: ^ above? In chat app, 12 messages resulted in same peer asking for `#user.pub` 12 times. (same with #user GET too, yipes!) // DAM note: This also resulted in 12 replies from 1 peer which all had same ##hash but none of them deduped because each get was different. - // TODO: Moving quick hacks fixing these things to axe for now. - // TODO: a lot of GET #foo then GET #foo."" happening, why? - // TODO: DAM's ## hash check, on same get ACK, producing multiple replies still, maybe JSON vs YSON? - // TMP note for now: viMZq1slG was chat LEX query #. - /*if(gun !== (tmp = msg.$) && (tmp = (tmp||'')._)){ - if(tmp.Q){ tmp.Q[msg['#']] = ''; return } // chain does not need to ask for it again. - tmp.Q = {}; - }*/ - /*if(u === has){ - if(at.Q){ - //at.Q[msg['#']] = ''; - //return; - } - at.Q = {}; - }*/ - var ctx = msg._||{}, DBG = ctx.DBG = msg.DBG; - DBG && (DBG.g = +new Date); - //console.log("GET:", get, node, has); - if(!node){ return root.on('get', msg) } - if(has){ - if('string' != typeof has || u === node[has]){ - if(!((at||'').next||'')[has]){ root.on('get', msg); return } - } - node = state_ify({}, has, state_is(node, has), node[has], soul); - // If we have a key in-memory, do we really need to fetch? - // Maybe... in case the in-memory key we have is a local write - // we still need to trigger a pull/merge from peers. - } - //Gun.window? Gun.obj.copy(node) : node; // HNPERF: If !browser bump Performance? Is this too dangerous to reference root graph? Copy / shallow copy too expensive for big nodes. Gun.obj.to(node); // 1 layer deep copy // Gun.obj.copy(node); // too slow on big nodes - node && ack(msg, node); - root.on('get', msg); // send GET to storage adapters. - }; - function ack(msg, node){ - var S = +new Date, ctx = msg._||{}, DBG = ctx.DBG = msg.DBG; - var to = msg['#'], id = text_rand(9), keys = Object.keys(node||'').sort(), soul = ((node||'')._||'')['#'], root = msg.$._.root, F = (node === root.graph[soul]); - console.STAT && console.STAT(S, ((DBG||ctx).gk = +new Date) - S, 'got keys'); - // PERF: Consider commenting this out to force disk-only reads for perf testing? // TODO: .keys( is slow - node && (function go(){ - S = +new Date; - var i = 0, k, put = {}, tmp; - while(i < 9 && (k = keys[i++])){ - state_ify(put, k, state_is(node, k), node[k], soul); - } - keys = keys.slice(i); - (tmp = {})[soul] = put; put = tmp; - var faith; if(F){ faith = function(){}; faith.ram = faith.faith = true; } // HNPERF: We're testing performance improvement by skipping going through security again, but this should be audited. - tmp = keys.length; - console.STAT && console.STAT(S, -(S - (S = +new Date)), 'got copied some'); - DBG && (DBG.ga = +new Date); - root.on('in', {'@': to, '#': id, put: put, '%': (tmp? (id = text_rand(9)) : u), $: root.$, _: faith, DBG: DBG, FOO: 1}); - console.STAT && console.STAT(S, +new Date - S, 'got in'); - if(!tmp){ return } - setTimeout.turn(go); - }()); - if(!node){ root.on('in', {'@': msg['#']}); } // TODO: I don't think I like this, the default lS adapter uses this but "not found" is a sensitive issue, so should probably be handled more carefully/individually. - } Gun.on.get.ack = ack; - }()); - (function(){ - Gun.chain.opt = function(opt){ - opt = opt || {}; - var gun = this, at = gun._, tmp = opt.peers || opt; - if(!Object.plain(opt)){ opt = {}; } - if(!Object.plain(at.opt)){ at.opt = opt; } - if('string' == typeof tmp){ tmp = [tmp]; } - if(!Object.plain(at.opt.peers)){ at.opt.peers = {};} - if(tmp instanceof Array){ - opt.peers = {}; - tmp.forEach(function(url){ - var p = {}; p.id = p.url = url; - opt.peers[url] = at.opt.peers[url] = at.opt.peers[url] || p; - }); - } - obj_each(opt, function each(k){ var v = this[k]; - if((this && this.hasOwnProperty(k)) || 'string' == typeof v || Object.empty(v)){ this[k] = v; return } - if(v && v.constructor !== Object && !(v instanceof Array)){ return } - obj_each(v, each); - }); - at.opt.from = opt; - Gun.on('opt', at); - at.opt.uuid = at.opt.uuid || function uuid(l){ return Gun.state().toString(36).replace('.','') + String.random(l||12) }; - return gun; - }; - }()); - - var obj_each = function(o,f){ Object.keys(o).forEach(f,o); }, text_rand = String.random, turn = setTimeout.turn, valid = Gun.valid, state_is = Gun.state.is, state_ify = Gun.state.ify, u, empty = {}, C; - - Gun.log = function(){ return (!Gun.log.off && C.log.apply(C, arguments)), [].slice.call(arguments).join(' ') }; - Gun.log.once = function(w,s,o){ return (o = Gun.log.once)[w] = o[w] || 0, o[w]++ || Gun.log(s) }; - - if(typeof window !== "undefined"){ (window.GUN = window.Gun = Gun).window = window; } - try{ if(typeof MODULE !== "undefined"){ MODULE.exports = Gun; } }catch(e){} - module.exports = Gun; - - (Gun.window||{}).console = (Gun.window||{}).console || {log: function(){}}; - (C = console).only = function(i, s){ return (C.only.i && i === C.only.i && C.only.i++) && (C.log.apply(C, arguments) || s) }; - Gun.log.once("welcome", "Hello wonderful person! :) Thanks for using GUN, please ask for help on http://chat.gun.eco if anything takes you longer than 5min to figure out!"); - })(USE, './root'); - USE(function(module){ - var Gun = USE('./root'); - Gun.chain.back = function(n, opt){ var tmp; - n = n || 1; - if(-1 === n || Infinity === n){ - return this._.root.$; - } else - if(1 === n){ - return (this._.back || this._).$; - } - var gun = this, at = gun._; - if(typeof n === 'string'){ - n = n.split('.'); - } - if(n instanceof Array){ - var i = 0, l = n.length, tmp = at; - for(i; i < l; i++){ - tmp = (tmp||empty)[n[i]]; - } - if(u !== tmp){ - return opt? gun : tmp; - } else - if((tmp = at.back)){ - return tmp.$.back(n, opt); - } - return; - } - if('function' == typeof n){ - var yes, tmp = {back: at}; - while((tmp = tmp.back) - && u === (yes = n(tmp, opt))){} - return yes; - } - if('number' == typeof n){ - return (at.back || at).$.back(n - 1); - } - return this; - }; - var empty = {}, u; - })(USE, './back'); - USE(function(module){ - // WARNING: GUN is very simple, but the JavaScript chaining API around GUN - // is complicated and was extremely hard to build. If you port GUN to another - // language, consider implementing an easier API to build. - var Gun = USE('./root'); - Gun.chain.chain = function(sub){ - var gun = this, at = gun._, chain = new (sub || gun).constructor(gun), cat = chain._, root; - cat.root = root = at.root; - cat.id = ++root.once; - cat.back = gun._; - cat.on = Gun.on; - cat.on('in', Gun.on.in, cat); // For 'in' if I add my own listeners to each then I MUST do it before in gets called. If I listen globally for all incoming data instead though, regardless of individual listeners, I can transform the data there and then as well. - cat.on('out', Gun.on.out, cat); // However for output, there isn't really the global option. I must listen by adding my own listener individually BEFORE this one is ever called. - return chain; - }; - - function output(msg){ - var get, at = this.as, back = at.back, root = at.root, tmp; - if(!msg.$){ msg.$ = at.$; } - this.to.next(msg); - if(at.err){ at.on('in', {put: at.put = u, $: at.$}); return } - if(get = msg.get){ - /*if(u !== at.put){ - at.on('in', at); - return; - }*/ - if(root.pass){ root.pass[at.id] = at; } // will this make for buggy behavior elsewhere? - if(at.lex){ Object.keys(at.lex).forEach(function(k){ tmp[k] = at.lex[k]; }, tmp = msg.get = msg.get || {}); } - if(get['#'] || at.soul){ - get['#'] = get['#'] || at.soul; - //root.graph[get['#']] = root.graph[get['#']] || {_:{'#':get['#'],'>':{}}}; - msg['#'] || (msg['#'] = text_rand(9)); // A3120 ? - back = (root.$.get(get['#'])._); - if(!(get = get['.'])){ // soul - tmp = back.ask && back.ask['']; // check if we have already asked for the full node - (back.ask || (back.ask = {}))[''] = back; // add a flag that we are now. - if(u !== back.put){ // if we already have data, - back.on('in', back); // send what is cached down the chain - if(tmp){ return } // and don't ask for it again. - } - msg.$ = back.$; - } else - if(obj_has(back.put, get)){ // TODO: support #LEX ! - tmp = back.ask && back.ask[get]; - (back.ask || (back.ask = {}))[get] = back.$.get(get)._; - back.on('in', {get: get, put: {'#': back.soul, '.': get, ':': back.put[get], '>': state_is(root.graph[back.soul], get)}}); - if(tmp){ return } - } - /*put = (back.$.get(get)._); - if(!(tmp = put.ack)){ put.ack = -1 } - back.on('in', { - $: back.$, - put: Gun.state.ify({}, get, Gun.state(back.put, get), back.put[get]), - get: back.get - }); - if(tmp){ return } - } else - if('string' != typeof get){ - var put = {}, meta = (back.put||{})._; - Gun.obj.map(back.put, function(v,k){ - if(!Gun.text.match(k, get)){ return } - put[k] = v; - }) - if(!Gun.obj.empty(put)){ - put._ = meta; - back.on('in', {$: back.$, put: put, get: back.get}) - } - if(tmp = at.lex){ - tmp = (tmp._) || (tmp._ = function(){}); - if(back.ack < tmp.ask){ tmp.ask = back.ack } - if(tmp.ask){ return } - tmp.ask = 1; - } - } - */ - root.ask(ack, msg); // A3120 ? - return root.on('in', msg); - } - //if(root.now){ root.now[at.id] = root.now[at.id] || true; at.pass = {} } - if(get['.']){ - if(at.get){ - msg = {get: {'.': at.get}, $: at.$}; - (back.ask || (back.ask = {}))[at.get] = msg.$._; // TODO: PERFORMANCE? More elegant way? - return back.on('out', msg); - } - msg = {get: at.lex? msg.get : {}, $: at.$}; - return back.on('out', msg); - } - (at.ask || (at.ask = {}))[''] = at; //at.ack = at.ack || -1; - if(at.get){ - get['.'] = at.get; - (back.ask || (back.ask = {}))[at.get] = msg.$._; // TODO: PERFORMANCE? More elegant way? - return back.on('out', msg); - } - } - return back.on('out', msg); - } Gun.on.out = output; - - function input(msg, cat){ cat = cat || this.as; // TODO: V8 may not be able to optimize functions with different parameter calls, so try to do benchmark to see if there is any actual difference. - var root = cat.root, gun = msg.$ || (msg.$ = cat.$), at = (gun||'')._ || empty, tmp = msg.put||'', soul = tmp['#'], key = tmp['.'], change = (u !== tmp['='])? tmp['='] : tmp[':'], state = tmp['>'] || -Infinity, sat; // eve = event, at = data at, cat = chain at, sat = sub at (children chains). - if(u !== msg.put && (u === tmp['#'] || u === tmp['.'] || (u === tmp[':'] && u === tmp['=']) || u === tmp['>'])){ // convert from old format - if(!valid(tmp)){ - if(!(soul = ((tmp||'')._||'')['#'])){ console.log("chain not yet supported for", tmp, '...', msg, cat); return; } - gun = cat.root.$.get(soul); - return setTimeout.each(Object.keys(tmp).sort(), function(k){ // TODO: .keys( is slow // BUG? ?Some re-in logic may depend on this being sync? - if('_' == k || u === (state = state_is(tmp, k))){ return } - cat.on('in', {$: gun, put: {'#': soul, '.': k, '=': tmp[k], '>': state}, VIA: msg}); - }); - } - cat.on('in', {$: at.back.$, put: {'#': soul = at.back.soul, '.': key = at.has || at.get, '=': tmp, '>': state_is(at.back.put, key)}, via: msg}); // TODO: This could be buggy! It assumes/approxes data, other stuff could have corrupted it. - return; - } - if((msg.seen||'')[cat.id]){ return } (msg.seen || (msg.seen = function(){}))[cat.id] = cat; // help stop some infinite loops - - if(cat !== at){ // don't worry about this when first understanding the code, it handles changing contexts on a message. A soul chain will never have a different context. - Object.keys(msg).forEach(function(k){ tmp[k] = msg[k]; }, tmp = {}); // make copy of message - tmp.get = cat.get || tmp.get; - if(!cat.soul && !cat.has){ // if we do not recognize the chain type - tmp.$$$ = tmp.$$$ || cat.$; // make a reference to wherever it came from. - } else - if(at.soul){ // a has (property) chain will have a different context sometimes if it is linked (to a soul chain). Anything that is not a soul or has chain, will always have different contexts. - tmp.$ = cat.$; - tmp.$$ = tmp.$$ || at.$; - } - msg = tmp; // use the message with the new context instead; - } - unlink(msg, cat); - - if(((cat.soul/* && (cat.ask||'')['']*/) || msg.$$) && state >= state_is(root.graph[soul], key)){ // The root has an in-memory cache of the graph, but if our peer has asked for the data then we want a per deduplicated chain copy of the data that might have local edits on it. - (tmp = root.$.get(soul)._).put = state_ify(tmp.put, key, state, change, soul); - } - if(!at.soul /*&& (at.ask||'')['']*/ && state >= state_is(root.graph[soul], key) && (sat = (root.$.get(soul)._.next||'')[key])){ // Same as above here, but for other types of chains. // TODO: Improve perf by preventing echoes recaching. - sat.put = change; // update cache - if('string' == typeof (tmp = valid(change))){ - sat.put = root.$.get(tmp)._.put || change; // share same cache as what we're linked to. - } - } - - this.to && this.to.next(msg); // 1st API job is to call all chain listeners. - // TODO: Make input more reusable by only doing these (some?) calls if we are a chain we recognize? This means each input listener would be responsible for when listeners need to be called, which makes sense, as they might want to filter. - cat.any && setTimeout.each(Object.keys(cat.any), function(any){ (any = cat.any[any]) && any(msg); },0,99); // 1st API job is to call all chain listeners. // TODO: .keys( is slow // BUG: Some re-in logic may depend on this being sync. - cat.echo && setTimeout.each(Object.keys(cat.echo), function(lat){ (lat = cat.echo[lat]) && lat.on('in', msg); },0,99); // & linked at chains // TODO: .keys( is slow // BUG: Some re-in logic may depend on this being sync. - - if(((msg.$$||'')._||at).soul){ // comments are linear, but this line of code is non-linear, so if I were to comment what it does, you'd have to read 42 other comments first... but you can't read any of those comments until you first read this comment. What!? // shouldn't this match link's check? - // is there cases where it is a $$ that we do NOT want to do the following? - if((sat = cat.next) && (sat = sat[key])){ // TODO: possible trick? Maybe have `ionmap` code set a sat? // TODO: Maybe we should do `cat.ask` instead? I guess does not matter. - tmp = {}; Object.keys(msg).forEach(function(k){ tmp[k] = msg[k]; }); - tmp.$ = (msg.$$||msg.$).get(tmp.get = key); delete tmp.$$; delete tmp.$$$; - sat.on('in', tmp); - } - } - - link(msg, cat); - } Gun.on.in = input; - - function link(msg, cat){ cat = cat || this.as || msg.$._; - if(msg.$$ && this !== Gun.on){ return } // $$ means we came from a link, so we are at the wrong level, thus ignore it unless overruled manually by being called directly. - if(!msg.put || cat.soul){ return } // But you cannot overrule being linked to nothing, or trying to link a soul chain - that must never happen. - var put = msg.put||'', link = put['=']||put[':'], tmp; - var root = cat.root, tat = root.$.get(put['#']).get(put['.'])._; - if('string' != typeof (link = valid(link))){ - if(this === Gun.on){ (tat.echo || (tat.echo = {}))[cat.id] = cat; } // allow some chain to explicitly force linking to simple data. - return; // by default do not link to data that is not a link. - } - if((tat.echo || (tat.echo = {}))[cat.id] // we've already linked ourselves so we do not need to do it again. Except... (annoying implementation details) - && !(root.pass||'')[cat.id]){ return } // if a new event listener was added, we need to make a pass through for it. The pass will be on the chain, not always the chain passed down. - if(tmp = root.pass){ if(tmp[link+cat.id]){ return } tmp[link+cat.id] = 1; } // But the above edge case may "pass through" on a circular graph causing infinite passes, so we hackily add a temporary check for that. - - (tat.echo||(tat.echo={}))[cat.id] = cat; // set ourself up for the echo! // TODO: BUG? Echo to self no longer causes problems? Confirm. - - if(cat.has){ cat.link = link; } - var sat = root.$.get(tat.link = link)._; // grab what we're linking to. - (sat.echo || (sat.echo = {}))[tat.id] = tat; // link it. - var tmp = cat.ask||''; // ask the chain for what needs to be loaded next! - if(tmp[''] || cat.lex){ // we might need to load the whole thing // TODO: cat.lex probably has edge case bugs to it, need more test coverage. - sat.on('out', {get: {'#': link}}); - } - setTimeout.each(Object.keys(tmp), function(get, sat){ // if sub chains are asking for data. // TODO: .keys( is slow // BUG? ?Some re-in logic may depend on this being sync? - if(!get || !(sat = tmp[get])){ return } - sat.on('out', {get: {'#': link, '.': get}}); // go get it. - },0,99); - } Gun.on.link = link; - - function unlink(msg, cat){ // ugh, so much code for seemingly edge case behavior. - var put = msg.put||'', change = (u !== put['='])? put['='] : put[':'], root = cat.root, link, tmp; - if(u === change){ // 1st edge case: If we have a brand new database, no data will be found. - // TODO: BUG! because emptying cache could be async from below, make sure we are not emptying a newer cache. So maybe pass an Async ID to check against? - // TODO: BUG! What if this is a map? // Warning! Clearing things out needs to be robust against sync/async ops, or else you'll see `map val get put` test catastrophically fail because map attempts to link when parent graph is streamed before child value gets set. Need to differentiate between lack acks and force clearing. - if(cat.soul && u !== cat.put){ return } // data may not be found on a soul, but if a soul already has data, then nothing can clear the soul as a whole. - //if(!cat.has){ return } - tmp = (msg.$$||msg.$||'')._||''; - if(msg['@'] && (u !== tmp.put || u !== cat.put)){ return } // a "not found" from other peers should not clear out data if we have already found it. - //if(cat.has && u === cat.put && !(root.pass||'')[cat.id]){ return } // if we are already unlinked, do not call again, unless edge case. // TODO: BUG! This line should be deleted for "unlink deeply nested". - if(link = cat.link || msg.linked){ - delete (root.$.get(link)._.echo||'')[cat.id]; - } - if(cat.has){ // TODO: Empty out links, maps, echos, acks/asks, etc.? - cat.link = null; - } - cat.put = u; // empty out the cache if, for example, alice's car's color no longer exists (relative to alice) if alice no longer has a car. - // TODO: BUG! For maps, proxy this so the individual sub is triggered, not all subs. - setTimeout.each(Object.keys(cat.next||''), function(get, sat){ // empty out all sub chains. // TODO: .keys( is slow // BUG? ?Some re-in logic may depend on this being sync? // TODO: BUG? This will trigger deeper put first, does put logic depend on nested order? // TODO: BUG! For map, this needs to be the isolated child, not all of them. - if(!(sat = cat.next[get])){ return } - //if(cat.has && u === sat.put && !(root.pass||'')[sat.id]){ return } // if we are already unlinked, do not call again, unless edge case. // TODO: BUG! This line should be deleted for "unlink deeply nested". - if(link){ delete (root.$.get(link).get(get)._.echo||'')[sat.id]; } - sat.on('in', {get: get, put: u, $: sat.$}); // TODO: BUG? Add recursive seen check? - },0,99); - return; - } - if(cat.soul){ return } // a soul cannot unlink itself. - if(msg.$$){ return } // a linked chain does not do the unlinking, the sub chain does. // TODO: BUG? Will this cancel maps? - link = valid(change); // need to unlink anytime we are not the same link, though only do this once per unlink (and not on init). - tmp = msg.$._||''; - if(link === tmp.link || (cat.has && !tmp.link)){ - if((root.pass||'')[cat.id] && 'string' !== typeof link); else { - return; - } - } - delete (tmp.echo||'')[cat.id]; - unlink({get: cat.get, put: u, $: msg.$, linked: msg.linked = msg.linked || tmp.link}, cat); // unlink our sub chains. - } Gun.on.unlink = unlink; - - function ack(msg, ev){ - //if(!msg['%'] && (this||'').off){ this.off() } // do NOT memory leak, turn off listeners! Now handled by .ask itself - // manhattan: - var as = this.as, at = as.$._, get = as.get||'', tmp = (msg.put||'')[get['#']]||''; - if(!msg.put || ('string' == typeof get['.'] && u === tmp[get['.']])){ - if(u !== at.put){ return } - if(!at.soul && !at.has){ return } // TODO: BUG? For now, only core-chains will handle not-founds, because bugs creep in if non-core chains are used as $ but we can revisit this later for more powerful extensions. - at.ack = (at.ack || 0) + 1; - at.on('in', { - get: at.get, - put: at.put = u, - $: at.$, - '@': msg['@'] - }); - /*(tmp = at.Q) && setTimeout.each(Object.keys(tmp), function(id){ // TODO: Temporary testing, not integrated or being used, probably delete. - Object.keys(msg).forEach(function(k){ tmp[k] = msg[k] }, tmp = {}); tmp['@'] = id; // copy message - root.on('in', tmp); - }); delete at.Q;*/ - return; - } - (msg._||{}).miss = 1; - Gun.on.put(msg); - return; // eom - } - - var empty = {}, u, text_rand = String.random, valid = Gun.valid, obj_has = function(o, k){ return o && Object.prototype.hasOwnProperty.call(o, k) }, state = Gun.state, state_is = state.is, state_ify = state.ify; - })(USE, './chain'); - USE(function(module){ - var Gun = USE('./root'); - Gun.chain.get = function(key, cb, as){ - var gun, tmp; - if(typeof key === 'string'){ - if(key.length == 0) { - (gun = this.chain())._.err = {err: Gun.log('0 length key!', key)}; - if(cb){ cb.call(gun, gun._.err); } - return gun; - } - var back = this, cat = back._; - var next = cat.next || empty; - if(!(gun = next[key])){ - gun = key && cache(key, back); - } - gun = gun && gun.$; - } else - if('function' == typeof key){ - if(true === cb){ return soul(this, key, cb, as), this } - gun = this; - var cat = gun._, opt = cb || {}, root = cat.root, id; - opt.at = cat; - opt.ok = key; - var wait = {}; // can we assign this to the at instead, like in once? - //var path = []; cat.$.back(at => { at.get && path.push(at.get.slice(0,9))}); path = path.reverse().join('.'); - function any(msg, eve, f){ - if(any.stun){ return } - if((tmp = root.pass) && !tmp[id]){ return } - var at = msg.$._, sat = (msg.$$||'')._, data = (sat||at).put, odd = (!at.has && !at.soul), test = {}, link, tmp; - if(odd || u === data){ // handles non-core - data = (u === ((tmp = msg.put)||'')['='])? (u === (tmp||'')[':'])? tmp : tmp[':'] : tmp['=']; - } - if(link = ('string' == typeof (tmp = Gun.valid(data)))){ - data = (u === (tmp = root.$.get(tmp)._.put))? opt.not? u : data : tmp; - } - if(opt.not && u === data){ return } - if(u === opt.stun){ - if((tmp = root.stun) && tmp.on){ - cat.$.back(function(a){ // our chain stunned? - tmp.on(''+a.id, test = {}); - if((test.run || 0) < any.id){ return test } // if there is an earlier stun on gapless parents/self. - }); - !test.run && tmp.on(''+at.id, test = {}); // this node stunned? - !test.run && sat && tmp.on(''+sat.id, test = {}); // linked node stunned? - if(any.id > test.run){ - if(!test.stun || test.stun.end){ - test.stun = tmp.on('stun'); - test.stun = test.stun && test.stun.last; - } - if(test.stun && !test.stun.end){ - //if(odd && u === data){ return } - //if(u === msg.put){ return } // "not found" acks will be found if there is stun, so ignore these. - (test.stun.add || (test.stun.add = {}))[id] = function(){ any(msg,eve,1); }; // add ourself to the stun callback list that is called at end of the write. - return; - } - } - } - if(/*odd &&*/ u === data){ f = 0; } // if data not found, keep waiting/trying. - /*if(f && u === data){ - cat.on('out', opt.out); - return; - }*/ - if((tmp = root.hatch) && !tmp.end && u === opt.hatch && !f){ // quick hack! // What's going on here? Because data is streamed, we get things one by one, but a lot of developers would rather get a callback after each batch instead, so this does that by creating a wait list per chain id that is then called at the end of the batch by the hatch code in the root put listener. - if(wait[at.$._.id]){ return } wait[at.$._.id] = 1; - tmp.push(function(){any(msg,eve,1);}); - return; - } wait = {}; // end quick hack. - } - // call: - if(root.pass){ if(root.pass[id+at.id]){ return } root.pass[id+at.id] = 1; } - if(opt.on){ opt.ok.call(at.$, data, at.get, msg, eve || any); return } // TODO: Also consider breaking `this` since a lot of people do `=>` these days and `.call(` has slower performance. - if(opt.v2020){ opt.ok(msg, eve || any); return } - Object.keys(msg).forEach(function(k){ tmp[k] = msg[k]; }, tmp = {}); msg = tmp; msg.put = data; // 2019 COMPATIBILITY! TODO: GET RID OF THIS! - opt.ok.call(opt.as, msg, eve || any); // is this the right - } any.at = cat; - //(cat.any||(cat.any=function(msg){ setTimeout.each(Object.keys(cat.any||''), function(act){ (act = cat.any[act]) && act(msg) },0,99) }))[id = String.random(7)] = any; // maybe switch to this in future? - (cat.any||(cat.any={}))[id = String.random(7)] = any; - any.off = function(){ any.stun = 1; if(!cat.any){ return } delete cat.any[id]; }; - any.rid = rid; // logic from old version, can we clean it up now? - any.id = opt.run || ++root.once; // used in callback to check if we are earlier than a write. // will this ever cause an integer overflow? - tmp = root.pass; (root.pass = {})[id] = 1; // Explanation: test trade-offs want to prevent recursion so we add/remove pass flag as it gets fulfilled to not repeat, however map map needs many pass flags - how do we reconcile? - opt.out = opt.out || {get: {}}; - cat.on('out', opt.out); - root.pass = tmp; - return gun; - } else - if('number' == typeof key){ - return this.get(''+key, cb, as); - } else - if('string' == typeof (tmp = valid(key))){ - return this.get(tmp, cb, as); - } else - if(tmp = this.get.next){ - gun = tmp(this, key); - } - if(!gun){ - (gun = this.chain())._.err = {err: Gun.log('Invalid get request!', key)}; // CLEAN UP - if(cb){ cb.call(gun, gun._.err); } - return gun; - } - if(cb && 'function' == typeof cb){ - gun.get(cb, as); - } - return gun; - }; - function cache(key, back){ - var cat = back._, next = cat.next, gun = back.chain(), at = gun._; - if(!next){ next = cat.next = {}; } - next[at.get = key] = at; - if(back === cat.root.$){ - at.soul = key; - //at.put = {}; - } else - if(cat.soul || cat.has){ - at.has = key; - //if(obj_has(cat.put, key)){ - //at.put = cat.put[key]; - //} - } - return at; - } - function soul(gun, cb, opt, as){ - var cat = gun._, acks = 0, tmp; - if(tmp = cat.soul || cat.link){ return cb(tmp, as, cat) } - if(cat.jam){ return cat.jam.push([cb, as]) } - cat.jam = [[cb,as]]; - gun.get(function go(msg, eve){ - if(u === msg.put && !cat.root.opt.super && (tmp = Object.keys(cat.root.opt.peers).length) && ++acks <= tmp){ // TODO: super should not be in core code, bring AXE up into core instead to fix? // TODO: .keys( is slow - return; - } - eve.rid(msg); - var at = ((at = msg.$) && at._) || {}, i = 0, as; - tmp = cat.jam; delete cat.jam; // tmp = cat.jam.splice(0, 100); - //if(tmp.length){ process.nextTick(function(){ go(msg, eve) }) } - while(as = tmp[i++]){ //Gun.obj.map(tmp, function(as, cb){ - var cb = as[0], id; as = as[1]; - cb && cb(id = at.link || at.soul || Gun.valid(msg.put) || ((msg.put||{})._||{})['#'], as, msg, eve); - } //); - }, {out: {get: {'.':true}}}); - return gun; - } - function rid(at){ - var cat = this.at || this.on; - if(!at || cat.soul || cat.has){ return this.off() } - if(!(at = (at = (at = at.$ || at)._ || at).id)){ return } - var tmp, seen; - //if(!map || !(tmp = map[at]) || !(tmp = tmp.at)){ return } - if(tmp = (seen = this.seen || (this.seen = {}))[at]){ return true } - seen[at] = true; - return; - } - var empty = {}, valid = Gun.valid, u; - })(USE, './get'); - USE(function(module){ - var Gun = USE('./root'); - Gun.chain.put = function(data, cb, as){ // I rewrote it :) - var gun = this, at = gun._, root = at.root; - as = as || {}; - as.root = at.root; - as.run || (as.run = root.once); - stun(as, at.id); // set a flag for reads to check if this chain is writing. - as.ack = as.ack || cb; - as.via = as.via || gun; - as.data = as.data || data; - as.soul || (as.soul = at.soul || ('string' == typeof cb && cb)); - var s = as.state = as.state || Gun.state(); - if('function' == typeof data){ data(function(d){ as.data = d; gun.put(u,u,as); }); return gun } - if(!as.soul){ return get(as), gun } - as.$ = root.$.get(as.soul); // TODO: This may not allow user chaining and similar? - as.todo = [{it: as.data, ref: as.$}]; - as.turn = as.turn || turn; - as.ran = as.ran || ran; - //var path = []; as.via.back(at => { at.get && path.push(at.get.slice(0,9)) }); path = path.reverse().join('.'); - // TODO: Perf! We only need to stun chains that are being modified, not necessarily written to. - (function walk(){ - var to = as.todo, at = to.pop(), d = at.it, v, k, cat, tmp, g; - stun(as, at.ref); - if(tmp = at.todo){ - k = tmp.pop(); d = d[k]; - if(tmp.length){ to.push(at); } - } - k && (to.path || (to.path = [])).push(k); - if(!(v = valid(d)) && !(g = Gun.is(d))){ - if(!Object.plain(d)){ ran.err(as, "Invalid data: "+ check(d) +" at " + (as.via.back(function(at){at.get && tmp.push(at.get);}, tmp = []) || tmp.join('.'))+'.'+(to.path||[]).join('.')); return } - var seen = as.seen || (as.seen = []), i = seen.length; - while(i--){ if(d === (tmp = seen[i]).it){ v = d = tmp.link; break } } - } - if(k && v){ at.node = state_ify(at.node, k, s, d); } // handle soul later. - else { - if(!as.seen){ ran.err(as, "Data at root of graph must be a node (an object)."); return } - as.seen.push(cat = {it: d, link: {}, todo: g? [] : Object.keys(d).sort().reverse(), path: (to.path||[]).slice(), up: at}); // Any perf reasons to CPU schedule this .keys( ? - at.node = state_ify(at.node, k, s, cat.link); - !g && cat.todo.length && to.push(cat); - // --------------- - var id = as.seen.length; - (as.wait || (as.wait = {}))[id] = ''; - tmp = (cat.ref = (g? d : k? at.ref.get(k) : at.ref))._; - (tmp = (d && (d._||'')['#']) || tmp.soul || tmp.link)? resolve({soul: tmp}) : cat.ref.get(resolve, {run: as.run, /*hatch: 0,*/ v2020:1, out:{get:{'.':' '}}}); // TODO: BUG! This should be resolve ONLY soul to prevent full data from being loaded. // Fixed now? - //setTimeout(function(){ if(F){ return } console.log("I HAVE NOT BEEN CALLED!", path, id, cat.ref._.id, k) }, 9000); var F; // MAKE SURE TO ADD F = 1 below! - function resolve(msg, eve){ - var end = cat.link['#']; - if(eve){ eve.off(); eve.rid(msg); } // TODO: Too early! Check all peers ack not found. - // TODO: BUG maybe? Make sure this does not pick up a link change wipe, that it uses the changign link instead. - var soul = end || msg.soul || (tmp = (msg.$$||msg.$)._||'').soul || tmp.link || ((tmp = tmp.put||'')._||'')['#'] || tmp['#'] || (((tmp = msg.put||'') && msg.$$)? tmp['#'] : (tmp['=']||tmp[':']||'')['#']); - !end && stun(as, msg.$); - if(!soul && !at.link['#']){ // check soul link above us - (at.wait || (at.wait = [])).push(function(){ resolve(msg, eve); }); // wait - return; - } - if(!soul){ - soul = []; - (msg.$$||msg.$).back(function(at){ - if(tmp = at.soul || at.link){ return soul.push(tmp) } - soul.push(at.get); - }); - soul = soul.reverse().join('/'); - } - cat.link['#'] = soul; - !g && (((as.graph || (as.graph = {}))[soul] = (cat.node || (cat.node = {_:{}})))._['#'] = soul); - delete as.wait[id]; - cat.wait && setTimeout.each(cat.wait, function(cb){ cb && cb(); }); - as.ran(as); - } // --------------- - } - if(!to.length){ return as.ran(as) } - as.turn(walk); - }()); - return gun; - }; - - function stun(as, id){ - if(!id){ return } id = (id._||'').id||id; - var run = as.root.stun || (as.root.stun = {on: Gun.on}), test = {}, tmp; - as.stun || (as.stun = run.on('stun', function(){ })); - if(tmp = run.on(''+id)){ tmp.the.last.next(test); } - if(test.run >= as.run){ return } - run.on(''+id, function(test){ - if(as.stun.end){ - this.off(); - this.to.next(test); - return; - } - test.run = test.run || as.run; - test.stun = test.stun || as.stun; return; - }); - } - - function ran(as){ - if(as.err){ ran.end(as.stun, as.root); return } // move log handle here. - if(as.todo.length || as.end || !Object.empty(as.wait)){ return } as.end = 1; - //(as.retry = function(){ as.acks = 0; - var cat = (as.$.back(-1)._), root = cat.root, ask = cat.ask(function(ack){ - root.on('ack', ack); - if(ack.err && !ack.lack){ Gun.log(ack); } - if(++acks > (as.acks || 0)){ this.off(); } // Adjustable ACKs! Only 1 by default. - if(!as.ack){ return } - as.ack(ack, this); - }, as.opt), acks = 0, stun = as.stun, tmp; - (tmp = function(){ // this is not official yet, but quick solution to hack in for now. - if(!stun){ return } - ran.end(stun, root); - setTimeout.each(Object.keys(stun = stun.add||''), function(cb){ if(cb = stun[cb]){cb();} }); // resume the stunned reads // Any perf reasons to CPU schedule this .keys( ? - }).hatch = tmp; // this is not official yet ^ - //console.log(1, "PUT", as.run, as.graph); - if(as.ack && !as.ok){ as.ok = as.acks || 9; } // TODO: In future! Remove this! This is just old API support. - (as.via._).on('out', {put: as.out = as.graph, ok: as.ok && {'@': as.ok+1}, opt: as.opt, '#': ask, _: tmp}); - //})(); - } ran.end = function(stun,root){ - stun.end = noop; // like with the earlier id, cheaper to make this flag a function so below callbacks do not have to do an extra type check. - if(stun.the.to === stun && stun === stun.the.last){ delete root.stun; } - stun.off(); - }; ran.err = function(as, err){ - (as.ack||noop).call(as, as.out = { err: as.err = Gun.log(err) }); - as.ran(as); - }; - - function get(as){ - var at = as.via._, tmp; - as.via = as.via.back(function(at){ - if(at.soul || !at.get){ return at.$ } - tmp = as.data; (as.data = {})[at.get] = tmp; - }); - if(!as.via || !as.via._.soul){ - as.via = at.root.$.get(((as.data||'')._||'')['#'] || at.$.back('opt.uuid')()); - } - as.via.put(as.data, as.ack, as); - - - return; - } - function check(d, tmp){ return ((d && (tmp = d.constructor) && tmp.name) || typeof d) } - - var u, noop = function(){}, turn = setTimeout.turn, valid = Gun.valid, state_ify = Gun.state.ify; - })(USE, './put'); - USE(function(module){ - var Gun = USE('./root'); - USE('./chain'); - USE('./back'); - USE('./put'); - USE('./get'); - module.exports = Gun; - })(USE, './index'); - USE(function(module){ - var Gun = USE('./index'); - Gun.chain.on = function(tag, arg, eas, as){ // don't rewrite! - var gun = this, cat = gun._, act; - if(typeof tag === 'string'){ - if(!arg){ return cat.on(tag) } - act = cat.on(tag, arg, eas || cat, as); - if(eas && eas.$){ - (eas.subs || (eas.subs = [])).push(act); - } - return gun; - } - var opt = arg; - (opt = (true === opt)? {change: true} : opt || {}).not = 1; opt.on = 1; - gun.get(tag, opt); - /*gun.get(function on(data,key,msg,eve){ var $ = this; - if(tmp = root.hatch){ // quick hack! - if(wait[$._.id]){ return } wait[$._.id] = 1; - tmp.push(function(){on.call($, data,key,msg,eve)}); - return; - }; wait = {}; // end quick hack. - tag.call($, data,key,msg,eve); - }, opt); // TODO: PERF! Event listener leak!!!?*/ - /* - function one(msg, eve){ - if(one.stun){ return } - var at = msg.$._, data = at.put, tmp; - if(tmp = at.link){ data = root.$.get(tmp)._.put } - if(opt.not===u && u === data){ return } - if(opt.stun===u && (tmp = root.stun) && (tmp = tmp[at.id] || tmp[at.back.id]) && !tmp.end){ // Remember! If you port this into `.get(cb` make sure you allow stun:0 skip option for `.put(`. - tmp[id] = function(){one(msg,eve)}; - return; - } - //tmp = one.wait || (one.wait = {}); console.log(tmp[at.id] === ''); if(tmp[at.id] !== ''){ tmp[at.id] = tmp[at.id] || setTimeout(function(){tmp[at.id]='';one(msg,eve)},1); return } delete tmp[at.id]; - // call: - if(opt.as){ - opt.ok.call(opt.as, msg, eve || one); - } else { - opt.ok.call(at.$, data, msg.get || at.get, msg, eve || one); - } - }; - one.at = cat; - (cat.act||(cat.act={}))[id = String.random(7)] = one; - one.off = function(){ one.stun = 1; if(!cat.act){ return } delete cat.act[id] } - cat.on('out', {get: {}});*/ - return gun; - }; - // Rules: - // 1. If cached, should be fast, but not read while write. - // 2. Should not retrigger other listeners, should get triggered even if nothing found. - // 3. If the same callback passed to many different once chains, each should resolve - an unsubscribe from the same callback should not effect the state of the other resolving chains, if you do want to cancel them all early you should mutate the callback itself with a flag & check for it at top of callback - Gun.chain.once = function(cb, opt){ opt = opt || {}; // avoid rewriting - if(!cb){ return none(this) } - var gun = this, cat = gun._, root = cat.root, id = String.random(7), tmp; - gun.get(function(data,key,msg,eve){ - var $ = this, at = $._, one = (at.one||(at.one={})); - if(eve.stun){ return } if('' === one[id]){ return } - if(true === (tmp = Gun.valid(data))){ once(); return } - if('string' == typeof tmp){ return } // TODO: BUG? Will this always load? - clearTimeout((cat.one||'')[id]); // clear "not found" since they only get set on cat. - clearTimeout(one[id]); one[id] = setTimeout(once, opt.wait||99); // TODO: Bug? This doesn't handle plural chains. - function once(f){ - if(!at.has && !at.soul){ at = {put: data, get: key}; } // handles non-core messages. - if(u === (tmp = at.put)){ tmp = ((msg.$$||'')._||'').put; } - if('string' == typeof Gun.valid(tmp)){ - tmp = root.$.get(tmp)._.put; - if(tmp === u && !f){ - one[id] = setTimeout(function(){ once(1); }, opt.wait||99); // TODO: Quick fix. Maybe use ack count for more predictable control? - return - } - } - //console.log("AND VANISHED", data); - if(eve.stun){ return } if('' === one[id]){ return } one[id] = ''; - if(cat.soul || cat.has){ eve.off(); } // TODO: Plural chains? // else { ?.off() } // better than one check? - cb.call($, tmp, at.get); - clearTimeout(one[id]); // clear "not found" since they only get set on cat. // TODO: This was hackily added, is it necessary or important? Probably not, in future try removing this. Was added just as a safety for the `&& !f` check. - } }, {on: 1}); - return gun; - }; - function none(gun,opt,chain){ - Gun.log.once("valonce", "Chainable val is experimental, its behavior and API may change moving forward. Please play with it and report bugs and ideas on how to improve it."); - (chain = gun.chain())._.nix = gun.once(function(data, key){ chain._.on('in', this._); }); - chain._.lex = gun._.lex; // TODO: Better approach in future? This is quick for now. - return chain; - } - - Gun.chain.off = function(){ - // make off more aggressive. Warning, it might backfire! - var gun = this, at = gun._, tmp; - var cat = at.back; - if(!cat){ return } - at.ack = 0; // so can resubscribe. - if(tmp = cat.next){ - if(tmp[at.get]){ - delete tmp[at.get]; - } - } - // TODO: delete cat.one[map.id]? - if(tmp = cat.ask){ - delete tmp[at.get]; - } - if(tmp = cat.put){ - delete tmp[at.get]; - } - if(tmp = at.soul){ - delete cat.root.graph[tmp]; - } - if(tmp = at.map){ - Object.keys(tmp).forEach(function(i,at){ at = tmp[i]; //obj_map(tmp, function(at){ - if(at.link){ - cat.root.$.get(at.link).off(); - } - }); - } - if(tmp = at.next){ - Object.keys(tmp).forEach(function(i,neat){ neat = tmp[i]; //obj_map(tmp, function(neat){ - neat.$.off(); - }); - } - at.on('off', {}); - return gun; - }; - var u; - })(USE, './on'); - USE(function(module){ - var Gun = USE('./index'), next = Gun.chain.get.next; - Gun.chain.get.next = function(gun, lex){ var tmp; - if(!Object.plain(lex)){ return (next||noop)(gun, lex) } - if(tmp = ((tmp = lex['#'])||'')['='] || tmp){ return gun.get(tmp) } - (tmp = gun.chain()._).lex = lex; // LEX! - gun.on('in', function(eve){ - if(String.match(eve.get|| (eve.put||'')['.'], lex['.'] || lex['#'] || lex)){ - tmp.on('in', eve); - } - this.to.next(eve); - }); - return tmp.$; - }; - Gun.chain.map = function(cb, opt, t){ - var gun = this, cat = gun._, lex, chain; - if(Object.plain(cb)){ lex = cb['.']? cb : {'.': cb}; cb = u; } - if(!cb){ - if(chain = cat.each){ return chain } - (cat.each = chain = gun.chain())._.lex = lex || chain._.lex || cat.lex; - chain._.nix = gun.back('nix'); - gun.on('in', map, chain._); - return chain; - } - Gun.log.once("mapfn", "Map functions are experimental, their behavior and API may change moving forward. Please play with it and report bugs and ideas on how to improve it."); - chain = gun.chain(); - gun.map().on(function(data, key, msg, eve){ - var next = (cb||noop).call(this, data, key, msg, eve); - if(u === next){ return } - if(data === next){ return chain._.on('in', msg) } - if(Gun.is(next)){ return chain._.on('in', next._) } - var tmp = {}; Object.keys(msg.put).forEach(function(k){ tmp[k] = msg.put[k]; }, tmp); tmp['='] = next; - chain._.on('in', {get: key, put: tmp}); - }); - return chain; - }; - function map(msg){ this.to.next(msg); - var cat = this.as, gun = msg.$, at = gun._, put = msg.put, tmp; - if(!at.soul && !msg.$$){ return } // this line took hundreds of tries to figure out. It only works if core checks to filter out above chains during link tho. This says "only bother to map on a node" for this layer of the chain. If something is not a node, map should not work. - if((tmp = cat.lex) && !String.match(msg.get|| (put||'')['.'], tmp['.'] || tmp['#'] || tmp)){ return } - Gun.on.link(msg, cat); - } - var noop = function(){}, u; - })(USE, './map'); - USE(function(module){ - var Gun = USE('./index'); - Gun.chain.set = function(item, cb, opt){ - var gun = this, root = gun.back(-1), soul, tmp; - cb = cb || function(){}; - opt = opt || {}; opt.item = opt.item || item; - if(soul = ((item||'')._||'')['#']){ (item = {})['#'] = soul; } // check if node, make link. - if('string' == typeof (tmp = Gun.valid(item))){ return gun.get(soul = tmp).put(item, cb, opt) } // check if link - if(!Gun.is(item)){ - if(Object.plain(item)){ - item = root.get(soul = gun.back('opt.uuid')()).put(item); - } - return gun.get(soul || root.back('opt.uuid')(7)).put(item, cb, opt); - } - gun.put(function(go){ - item.get(function(soul, o, msg){ // TODO: BUG! We no longer have this option? & go error not handled? - if(!soul){ return cb.call(gun, {err: Gun.log('Only a node can be linked! Not "' + msg.put + '"!')}) } - (tmp = {})[soul] = {'#': soul}; go(tmp); - },true); - }); - return item; - }; - })(USE, './set'); - USE(function(module){ - USE('./shim'); - - var noop = function(){}; - var parse = JSON.parseAsync || function(t,cb,r){ var u, d = +new Date; try{ cb(u, JSON.parse(t,r), json.sucks(+new Date - d)); }catch(e){ cb(e); } }; - var json = JSON.stringifyAsync || function(v,cb,r,s){ var u, d = +new Date; try{ cb(u, JSON.stringify(v,r,s), json.sucks(+new Date - d)); }catch(e){ cb(e); } }; - json.sucks = function(d){ if(d > 99){ console.log("Warning: JSON blocking CPU detected. Add `gun/lib/yson.js` to fix."); json.sucks = noop; } }; - - function Mesh(root){ - var mesh = function(){}; - var opt = root.opt || {}; - opt.log = opt.log || console.log; - opt.gap = opt.gap || opt.wait || 0; - opt.max = opt.max || (opt.memory? (opt.memory * 999 * 999) : 300000000) * 0.3; - opt.pack = opt.pack || (opt.max * 0.01 * 0.01); - opt.puff = opt.puff || 9; // IDEA: do a start/end benchmark, divide ops/result. - var puff = setTimeout.turn || setTimeout; - - var dup = root.dup, dup_check = dup.check, dup_track = dup.track; - - var hear = mesh.hear = function(raw, peer){ - if(!raw){ return } - if(opt.max <= raw.length){ return mesh.say({dam: '!', err: "Message too big!"}, peer) } - if(mesh === this){ - /*if('string' == typeof raw){ try{ - var stat = console.STAT || {}; - //console.log('HEAR:', peer.id, (raw||'').slice(0,250), ((raw||'').length / 1024 / 1024).toFixed(4)); - - //console.log(setTimeout.turn.s.length, 'stacks', parseFloat((-(LT - (LT = +new Date))/1000).toFixed(3)), 'sec', parseFloat(((LT-ST)/1000 / 60).toFixed(1)), 'up', stat.peers||0, 'peers', stat.has||0, 'has', stat.memhused||0, stat.memused||0, stat.memax||0, 'heap mem max'); - }catch(e){ console.log('DBG err', e) }}*/ - hear.d += raw.length||0 ; ++hear.c; } // STATS! - var S = peer.SH = +new Date; - var tmp = raw[0], msg; - //raw && raw.slice && console.log("hear:", ((peer.wire||'').headers||'').origin, raw.length, raw.slice && raw.slice(0,50)); //tc-iamunique-tc-package-ds1 - if('[' === tmp){ - parse(raw, function(err, msg){ - if(err || !msg){ return mesh.say({dam: '!', err: "DAM JSON parse error."}, peer) } - console.STAT && console.STAT(+new Date, msg.length, '# on hear batch'); - var P = opt.puff; - (function go(){ - var S = +new Date; - var i = 0, m; while(i < P && (m = msg[i++])){ mesh.hear(m, peer); } - msg = msg.slice(i); // slicing after is faster than shifting during. - console.STAT && console.STAT(S, +new Date - S, 'hear loop'); - flush(peer); // force send all synchronously batched acks. - if(!msg.length){ return } - puff(go, 0); - }()); - }); - raw = ''; // - return; - } - if('{' === tmp || ((raw['#'] || Object.plain(raw)) && (msg = raw))){ - if(msg){ return hear.one(msg, peer, S) } - parse(raw, function(err, msg){ - if(err || !msg){ return mesh.say({dam: '!', err: "DAM JSON parse error."}, peer) } - hear.one(msg, peer, S); - }); - return; - } - }; - hear.one = function(msg, peer, S){ // S here is temporary! Undo. - var id, hash, tmp, ash, DBG; - if(msg.DBG){ msg.DBG = DBG = {DBG: msg.DBG}; } - DBG && (DBG.h = S); - DBG && (DBG.hp = +new Date); - if(!(id = msg['#'])){ id = msg['#'] = String.random(9); } - if(tmp = dup_check(id)){ return } - // DAM logic: - if(!(hash = msg['##']) && false && u !== msg.put); // disable hashing for now // TODO: impose warning/penalty instead (?) - if(hash && (tmp = msg['@'] || (msg.get && id)) && dup.check(ash = tmp+hash)){ return } // Imagine A <-> B <=> (C & D), C & D reply with same ACK but have different IDs, B can use hash to dedup. Or if a GET has a hash already, we shouldn't ACK if same. - (msg._ = function(){}).via = mesh.leap = peer; - if((tmp = msg['><']) && 'string' == typeof tmp){ tmp.slice(0,99).split(',').forEach(function(k){ this[k] = 1; }, (msg._).yo = {}); } // Peers already sent to, do not resend. - // DAM ^ - if(tmp = msg.dam){ - if(tmp = mesh.hear[tmp]){ - tmp(msg, peer, root); - } - dup_track(id); - return; - } - if(tmp = msg.ok){ msg._.near = tmp['/']; } - var S = +new Date; - DBG && (DBG.is = S); peer.SI = id; - dup_track.ed = function(d){ - if(id !== d){ return } - dup_track.ed = 0; - if(!(d = dup.s[id])){ return } - d.via = peer; - if(msg.get){ d.it = msg; } - }; - root.on('in', mesh.last = msg); - DBG && (DBG.hd = +new Date); - console.STAT && console.STAT(S, +new Date - S, msg.get? 'msg get' : msg.put? 'msg put' : 'msg'); - dup_track(id); // in case 'in' does not call track. - if(ash){ dup_track(ash); } //dup.track(tmp+hash, true).it = it(msg); - mesh.leap = mesh.last = null; // warning! mesh.leap could be buggy. - }; - hear.c = hear.d = 0; - (function(){ - var SMIA = 0; - var loop; - mesh.hash = function(msg, peer){ var h, s, t; - var S = +new Date; - json(msg.put, function hash(err, text){ - var ss = (s || (s = t = text||'')).slice(0, 32768); // 1024 * 32 - h = String.hash(ss, h); s = s.slice(32768); - if(s){ puff(hash, 0); return } - console.STAT && console.STAT(S, +new Date - S, 'say json+hash'); - msg._.$put = t; - msg['##'] = h; - mesh.say(msg, peer); - delete msg._.$put; - }, sort); - }; - function sort(k, v){ var tmp; - if(!(v instanceof Object)){ return v } - Object.keys(v).sort().forEach(sorta, {to: tmp = {}, on: v}); - return tmp; - } function sorta(k){ this.to[k] = this.on[k]; } - - var say = mesh.say = function(msg, peer){ var tmp; - if((tmp = this) && (tmp = tmp.to) && tmp.next){ tmp.next(msg); } // compatible with middleware adapters. - if(!msg){ return false } - var id, hash, raw, ack = msg['@']; - //if(opt.super && (!ack || !msg.put)){ return } // TODO: MANHATTAN STUB //OBVIOUSLY BUG! But squelch relay. // :( get only is 100%+ CPU usage :( - var meta = msg._||(msg._=function(){}); - var DBG = msg.DBG, S = +new Date; meta.y = meta.y || S; if(!peer){ DBG && (DBG.y = S); } - if(!(id = msg['#'])){ id = msg['#'] = String.random(9); } - !loop && dup_track(id);//.it = it(msg); // track for 9 seconds, default. Earth<->Mars would need more! // always track, maybe move this to the 'after' logic if we split function. - //if(msg.put && (msg.err || (dup.s[id]||'').err)){ return false } // TODO: in theory we should not be able to stun a message, but for now going to check if it can help network performance preventing invalid data to relay. - if(!(hash = msg['##']) && u !== msg.put && !meta.via && ack){ mesh.hash(msg, peer); return } // TODO: Should broadcasts be hashed? - if(!peer && ack){ peer = ((tmp = dup.s[ack]) && (tmp.via || ((tmp = tmp.it) && (tmp = tmp._) && tmp.via))) || ((tmp = mesh.last) && ack === tmp['#'] && mesh.leap); } // warning! mesh.leap could be buggy! mesh last check reduces this. // TODO: CLEAN UP THIS LINE NOW? `.it` should be reliable. - if(!peer && ack){ // still no peer, then ack daisy chain 'tunnel' got lost. - if(dup.s[ack]){ return } // in dups but no peer hints that this was ack to ourself, ignore. - console.STAT && console.STAT(+new Date, ++SMIA, 'total no peer to ack to'); // TODO: Delete this now. Dropping lost ACKs is protocol fine now. - return false; - } // TODO: Temporary? If ack via trace has been lost, acks will go to all peers, which trashes browser bandwidth. Not relaying the ack will force sender to ask for ack again. Note, this is technically wrong for mesh behavior. - if(ack && !msg.put && !hash && ((dup.s[ack]||'').it||'')['##']){ return false } // If we're saying 'not found' but a relay had data, do not bother sending our not found. // Is this correct, return false? // NOTE: ADD PANIC TEST FOR THIS! - if(!peer && mesh.way){ return mesh.way(msg) } - DBG && (DBG.yh = +new Date); - if(!(raw = meta.raw)){ mesh.raw(msg, peer); return } - DBG && (DBG.yr = +new Date); - if(!peer || !peer.id){ - if(!Object.plain(peer || opt.peers)){ return false } - var S = +new Date; - var ps = opt.peers, pl = Object.keys(peer || opt.peers || {}); // TODO: .keys( is slow - console.STAT && console.STAT(S, +new Date - S, 'peer keys'); - (function go(){ - var S = +new Date; - //Type.obj.map(peer || opt.peers, each); // in case peer is a peer list. - loop = 1; var wr = meta.raw; meta.raw = raw; // quick perf hack - var i = 0, p; while(i < 9 && (p = (pl||'')[i++])){ - if(!(p = ps[p] || (peer||'')[p])){ continue } - mesh.say(msg, p); - } - meta.raw = wr; loop = 0; - pl = pl.slice(i); // slicing after is faster than shifting during. - console.STAT && console.STAT(S, +new Date - S, 'say loop'); - if(!pl.length){ return } - puff(go, 0); - ack && dup_track(ack); // keep for later - }()); - return; - } - // TODO: PERF: consider splitting function here, so say loops do less work. - if(!peer.wire && mesh.wire){ mesh.wire(peer); } - if(id === peer.last){ return } peer.last = id; // was it just sent? - if(peer === meta.via){ return false } // don't send back to self. - if((tmp = meta.yo) && (tmp[peer.url] || tmp[peer.pid] || tmp[peer.id]) /*&& !o*/){ return false } - console.STAT && console.STAT(S, ((DBG||meta).yp = +new Date) - (meta.y || S), 'say prep'); - !loop && ack && dup_track(ack); // streaming long responses needs to keep alive the ack. - if(peer.batch){ - peer.tail = (tmp = peer.tail || 0) + raw.length; - if(peer.tail <= opt.pack){ - peer.batch += (tmp?',':'')+raw; - return; - } - flush(peer); - } - peer.batch = '['; // Prevents double JSON! - var ST = +new Date; - setTimeout(function(){ - console.STAT && console.STAT(ST, +new Date - ST, '0ms TO'); - flush(peer); - }, opt.gap); // TODO: queuing/batching might be bad for low-latency video game performance! Allow opt out? - send(raw, peer); - console.STAT && (ack === peer.SI) && console.STAT(S, +new Date - peer.SH, 'say ack'); - }; - mesh.say.c = mesh.say.d = 0; - // TODO: this caused a out-of-memory crash! - mesh.raw = function(msg, peer){ // TODO: Clean this up / delete it / move logic out! - if(!msg){ return '' } - var meta = (msg._) || {}, put, tmp; - if(tmp = meta.raw){ return tmp } - if('string' == typeof msg){ return msg } - var hash = msg['##'], ack = msg['@']; - if(hash && ack){ - if(!meta.via && dup_check(ack+hash)){ return false } // for our own out messages, memory & storage may ack the same thing, so dedup that. Tho if via another peer, we already tracked it upon hearing, so this will always trigger false positives, so don't do that! - if(tmp = (dup.s[ack]||'').it){ - if(hash === tmp['##']){ return false } // if ask has a matching hash, acking is optional. - if(!tmp['##']){ tmp['##'] = hash; } // if none, add our hash to ask so anyone we relay to can dedup. // NOTE: May only check against 1st ack chunk, 2nd+ won't know and still stream back to relaying peers which may then dedup. Any way to fix this wasted bandwidth? I guess force rate limiting breaking change, that asking peer has to ask for next lexical chunk. - } - } - if(!msg.dam && !msg['@']){ - var i = 0, to = []; tmp = opt.peers; - for(var k in tmp){ var p = tmp[k]; // TODO: Make it up peers instead! - to.push(p.url || p.pid || p.id); - if(++i > 6){ break } - } - if(i > 1){ msg['><'] = to.join(); } // TODO: BUG! This gets set regardless of peers sent to! Detect? - } - if(msg.put && (tmp = msg.ok)){ msg.ok = {'@':(tmp['@']||1)-1, '/': (tmp['/']==msg._.near)? mesh.near : tmp['/']}; } - if(put = meta.$put){ - tmp = {}; Object.keys(msg).forEach(function(k){ tmp[k] = msg[k]; }); - tmp.put = ':])([:'; - json(tmp, function(err, raw){ - if(err){ return } // TODO: Handle!! - var S = +new Date; - tmp = raw.indexOf('"put":":])([:"'); - res(u, raw = raw.slice(0, tmp+6) + put + raw.slice(tmp + 14)); - console.STAT && console.STAT(S, +new Date - S, 'say slice'); - }); - return; - } - json(msg, res); - function res(err, raw){ - if(err){ return } // TODO: Handle!! - meta.raw = raw; //if(meta && (raw||'').length < (999 * 99)){ meta.raw = raw } // HNPERF: If string too big, don't keep in memory. - mesh.say(msg, peer); - } - }; - }()); - - function flush(peer){ - var tmp = peer.batch, t = 'string' == typeof tmp; - if(t){ tmp += ']'; }// TODO: Prevent double JSON! - peer.batch = peer.tail = null; - if(!tmp){ return } - if(t? 3 > tmp.length : !tmp.length){ return } // TODO: ^ - if(!t){try{tmp = (1 === tmp.length? tmp[0] : JSON.stringify(tmp)); - }catch(e){return opt.log('DAM JSON stringify error', e)}} - if(!tmp){ return } - send(tmp, peer); - } - // for now - find better place later. - function send(raw, peer){ try{ - var wire = peer.wire; - if(peer.say){ - peer.say(raw); - } else - if(wire.send){ - wire.send(raw); - } - mesh.say.d += raw.length||0; ++mesh.say.c; // STATS! - }catch(e){ - (peer.queue = peer.queue || []).push(raw); - }} - - mesh.near = 0; - mesh.hi = function(peer){ - var wire = peer.wire, tmp; - if(!wire){ mesh.wire((peer.length && {url: peer, id: peer}) || peer); return } - if(peer.id){ - opt.peers[peer.url || peer.id] = peer; - } else { - tmp = peer.id = peer.id || peer.url || String.random(9); - mesh.say({dam: '?', pid: root.opt.pid}, opt.peers[tmp] = peer); - delete dup.s[peer.last]; // IMPORTANT: see https://gun.eco/docs/DAM#self - } - if(!peer.met){ - mesh.near++; - peer.met = +(new Date); - root.on('hi', peer); - } - // @rogowski I need this here by default for now to fix go1dfish's bug - tmp = peer.queue; peer.queue = []; - setTimeout.each(tmp||[],function(msg){ - send(msg, peer); - },0,9); - //Type.obj.native && Type.obj.native(); // dirty place to check if other JS polluted. - }; - mesh.bye = function(peer){ - peer.met && --mesh.near; - delete peer.met; - root.on('bye', peer); - var tmp = +(new Date); tmp = (tmp - (peer.met||tmp)); - mesh.bye.time = ((mesh.bye.time || tmp) + tmp) / 2; - }; - mesh.hear['!'] = function(msg, peer){ opt.log('Error:', msg.err); }; - mesh.hear['?'] = function(msg, peer){ - if(msg.pid){ - if(!peer.pid){ peer.pid = msg.pid; } - if(msg['@']){ return } - } - mesh.say({dam: '?', pid: opt.pid, '@': msg['#']}, peer); - delete dup.s[peer.last]; // IMPORTANT: see https://gun.eco/docs/DAM#self - }; - mesh.hear['mob'] = function(msg, peer){ // NOTE: AXE will overload this with better logic. - if(!msg.peers){ return } - var peers = Object.keys(msg.peers), one = peers[(Math.random()*peers.length) >> 0]; - if(!one){ return } - mesh.bye(peer); - mesh.hi(one); - }; - - root.on('create', function(root){ - root.opt.pid = root.opt.pid || String.random(9); - this.to.next(root); - root.on('out', mesh.say); - }); - - root.on('bye', function(peer, tmp){ - peer = opt.peers[peer.id || peer] || peer; - this.to.next(peer); - peer.bye? peer.bye() : (tmp = peer.wire) && tmp.close && tmp.close(); - delete opt.peers[peer.id]; - peer.wire = null; - }); - root.on('bye', function(peer, tmp){ this.to.next(peer); - if(tmp = console.STAT){ tmp.peers = mesh.near; } - if(!(tmp = peer.url)){ return } setTimeout(function(){ },opt.lack || 9000); - }); - root.on('hi', function(peer, tmp){ this.to.next(peer); - if(tmp = console.STAT){ tmp.peers = mesh.near; } - if(opt.super){ return } // temporary (?) until we have better fix/solution? - var souls = Object.keys(root.next||''); // TODO: .keys( is slow - if(souls.length > 9999 && !console.SUBS){ console.log(console.SUBS = "Warning: You have more than 10K live GETs, which might use more bandwidth than your screen can show - consider `.off()`."); } - setTimeout.each(souls, function(soul){ var node = root.next[soul]; - if(opt.super || (node.ask||'')['']){ mesh.say({get: {'#': soul}}, peer); return } - setTimeout.each(Object.keys(node.ask||''), function(key){ if(!key){ return } - // is the lack of ## a !onion hint? - mesh.say({'##': String.hash((root.graph[soul]||'')[key]), get: {'#': soul, '.': key}}, peer); - // TODO: Switch this so Book could route? - }); - }); - }); - - return mesh; - } - var u; - - try{ module.exports = Mesh; }catch(e){} - - })(USE, './mesh'); - USE(function(module){ - var Gun = USE('./index'); - Gun.Mesh = USE('./mesh'); - - // TODO: resync upon reconnect online/offline - //window.ononline = window.onoffline = function(){ console.log('online?', navigator.onLine) } - - Gun.on('opt', function(root){ - this.to.next(root); - if(root.once){ return } - var opt = root.opt; - if(false === opt.WebSocket){ return } - - var env = Gun.window || {}; - var websocket = opt.WebSocket || env.WebSocket || env.webkitWebSocket || env.mozWebSocket; - if(!websocket){ return } - opt.WebSocket = websocket; - - var mesh = opt.mesh = opt.mesh || Gun.Mesh(root); - mesh.wire = opt.wire = open; - function open(peer){ try{ - if(!peer || !peer.url){ return wire && wire(peer) } - var url = peer.url.replace(/^http/, 'ws'); - var wire = peer.wire = new opt.WebSocket(url); - wire.onclose = function(){ - reconnect(peer); - opt.mesh.bye(peer); - }; - wire.onerror = function(err){ - reconnect(peer); - }; - wire.onopen = function(){ - opt.mesh.hi(peer); - }; - wire.onmessage = function(msg){ - if(!msg){ return } - opt.mesh.hear(msg.data || msg, peer); - }; - return wire; - }catch(e){ opt.mesh.bye(peer); }} - - setTimeout(function(){ !opt.super && root.on('out', {dam:'hi'}); },1); // it can take a while to open a socket, so maybe no longer lazy load for perf reasons? - - var wait = 2 * 999; - function reconnect(peer){ - clearTimeout(peer.defer); - if(!opt.peers[peer.url]){ return } - if(doc && peer.retry <= 0){ return } - peer.retry = (peer.retry || opt.retry+1 || 60) - ((-peer.tried + (peer.tried = +new Date) < wait*4)?1:0); - peer.defer = setTimeout(function to(){ - if(doc && doc.hidden){ return setTimeout(to,wait) } - open(peer); - }, wait); - } - var doc = (''+u !== typeof document) && document; - }); - var u; - })(USE, './websocket'); - USE(function(module){ - if(typeof Gun === 'undefined'){ return } - - var noop = function(){}, store; - try{store = (Gun.window||noop).localStorage;}catch(e){} - if(!store){ - Gun.log("Warning: No localStorage exists to persist data to!"); - store = {setItem: function(k,v){this[k]=v;}, removeItem: function(k){delete this[k];}, getItem: function(k){return this[k]}}; - } - var json = JSON.stringifyAsync || function(v,cb,r,s){ var u; try{ cb(u, JSON.stringify(v,r,s)); }catch(e){ cb(e); } }; - - Gun.on('create', function lg(root){ - this.to.next(root); - var opt = root.opt, acks = [], disk, to, size, stop; - if(false === opt.localStorage){ return } - opt.prefix = opt.file || 'gun/'; - try{ disk = lg[opt.prefix] = lg[opt.prefix] || JSON.parse(size = store.getItem(opt.prefix)) || {}; // TODO: Perf! This will block, should we care, since limited to 5MB anyways? - }catch(e){ disk = lg[opt.prefix] = {}; } - size = (size||'').length; - - root.on('get', function(msg){ - this.to.next(msg); - var lex = msg.get, soul, data, tmp, u; - if(!lex || !(soul = lex['#'])){ return } - data = disk[soul] || u; - if(data && (tmp = lex['.']) && !Object.plain(tmp)){ // pluck! - data = Gun.state.ify({}, tmp, Gun.state.is(data, tmp), data[tmp], soul); - } - //if(data){ (tmp = {})[soul] = data } // back into a graph. - //setTimeout(function(){ - Gun.on.get.ack(msg, data); //root.on('in', {'@': msg['#'], put: tmp, lS:1});// || root.$}); - //}, Math.random() * 10); // FOR TESTING PURPOSES! - }); - - root.on('put', function(msg){ - this.to.next(msg); // remember to call next middleware adapter - var put = msg.put, soul = put['#'], key = put['.'], id = msg['#'], ok = msg.ok||''; // pull data off wire envelope - disk[soul] = Gun.state.ify(disk[soul], key, put['>'], put[':'], soul); // merge into disk object - if(stop && size > (4999880)){ root.on('in', {'@': id, err: "localStorage max!"}); return; } - //if(!msg['@']){ acks.push(id) } // then ack any non-ack write. // TODO: use batch id. - if(!msg['@'] && (!msg._.via || Math.random() < (ok['@'] / ok['/']))){ acks.push(id); } // then ack any non-ack write. // TODO: use batch id. - if(to){ return } - to = setTimeout(flush, 9+(size / 333)); // 0.1MB = 0.3s, 5MB = 15s - }); - function flush(){ - if(!acks.length && ((setTimeout.turn||'').s||'').length){ setTimeout(flush,99); return; } // defer if "busy" && no saves. - var ack = acks; clearTimeout(to); to = false; acks = []; - json(disk, function(err, tmp){ - try{!err && store.setItem(opt.prefix, tmp); - }catch(e){ err = stop = e || "localStorage failure"; } - if(err){ - Gun.log(err + " Consider using GUN's IndexedDB plugin for RAD for more storage space, https://gun.eco/docs/RAD#install"); - root.on('localStorage:error', {err: err, get: opt.prefix, put: disk}); - } - size = tmp.length; - - //if(!err && !Object.empty(opt.peers)){ return } // only ack if there are no peers. // Switch this to probabilistic mode - setTimeout.each(ack, function(id){ - root.on('in', {'@': id, err: err, ok: 0}); // localStorage isn't reliable, so make its `ok` code be a low number. - },0,99); - }); - } - - }); - })(USE, './localStorage'); - - }()); - (function(){ - var u; - if(''+u == typeof Gun){ return } - var DEP = function(n){ console.warn("Warning! Deprecated internal utility will break in next version:", n); }; - // Generic javascript utilities. - var Type = Gun; - //Type.fns = Type.fn = {is: function(fn){ return (!!fn && fn instanceof Function) }} - Type.fn = Type.fn || {is: function(fn){ DEP('fn'); return (!!fn && 'function' == typeof fn) }}; - Type.bi = Type.bi || {is: function(b){ DEP('bi');return (b instanceof Boolean || typeof b == 'boolean') }}; - Type.num = Type.num || {is: function(n){ DEP('num'); return !list_is(n) && ((n - parseFloat(n) + 1) >= 0 || Infinity === n || -Infinity === n) }}; - Type.text = Type.text || {is: function(t){ DEP('text'); return (typeof t == 'string') }}; - Type.text.ify = Type.text.ify || function(t){ DEP('text.ify'); - if(Type.text.is(t)){ return t } - if(typeof JSON !== "undefined"){ return JSON.stringify(t) } - return (t && t.toString)? t.toString() : t; - }; - Type.text.random = Type.text.random || function(l, c){ DEP('text.random'); - var s = ''; - l = l || 24; // you are not going to make a 0 length random number, so no need to check type - c = c || '0123456789ABCDEFGHIJKLMNOPQRSTUVWXZabcdefghijklmnopqrstuvwxyz'; - while(l > 0){ s += c.charAt(Math.floor(Math.random() * c.length)); l--; } - return s; - }; - Type.text.match = Type.text.match || function(t, o){ var tmp, u; DEP('text.match'); - if('string' !== typeof t){ return false } - if('string' == typeof o){ o = {'=': o}; } - o = o || {}; - tmp = (o['='] || o['*'] || o['>'] || o['<']); - if(t === tmp){ return true } - if(u !== o['=']){ return false } - tmp = (o['*'] || o['>'] || o['<']); - if(t.slice(0, (tmp||'').length) === tmp){ return true } - if(u !== o['*']){ return false } - if(u !== o['>'] && u !== o['<']){ - return (t >= o['>'] && t <= o['<'])? true : false; - } - if(u !== o['>'] && t >= o['>']){ return true } - if(u !== o['<'] && t <= o['<']){ return true } - return false; - }; - Type.text.hash = Type.text.hash || function(s, c){ // via SO - DEP('text.hash'); - if(typeof s !== 'string'){ return } - c = c || 0; - if(!s.length){ return c } - for(var i=0,l=s.length,n; i B){ return 1 } - else { return 0 } - } - }; - Type.list.map = Type.list.map || function(l, c, _){ DEP('list.map'); return obj_map(l, c, _) }; - Type.list.index = 1; // change this to 0 if you want non-logical, non-mathematical, non-matrix, non-convenient array notation - Type.obj = Type.boj || {is: function(o){ DEP('obj'); return o? (o instanceof Object && o.constructor === Object) || Object.prototype.toString.call(o).match(/^\[object (\w+)\]$/)[1] === 'Object' : false }}; - Type.obj.put = Type.obj.put || function(o, k, v){ DEP('obj.put'); return (o||{})[k] = v, o }; - Type.obj.has = Type.obj.has || function(o, k){ DEP('obj.has'); return o && Object.prototype.hasOwnProperty.call(o, k) }; - Type.obj.del = Type.obj.del || function(o, k){ DEP('obj.del'); - if(!o){ return } - o[k] = null; - delete o[k]; - return o; - }; - Type.obj.as = Type.obj.as || function(o, k, v, u){ DEP('obj.as'); return o[k] = o[k] || (u === v? {} : v) }; - Type.obj.ify = Type.obj.ify || function(o){ DEP('obj.ify'); - if(obj_is(o)){ return o } - try{o = JSON.parse(o); - }catch(e){o={};} return o; - } - ;(function(){ var u; - function map(v,k){ - if(obj_has(this,k) && u !== this[k]){ return } - this[k] = v; - } - Type.obj.to = Type.obj.to || function(from, to){ DEP('obj.to'); - to = to || {}; - obj_map(from, map, to); - return to; - }; - }()); - Type.obj.copy = Type.obj.copy || function(o){ DEP('obj.copy'); // because http://web.archive.org/web/20140328224025/http://jsperf.com/cloning-an-object/2 - return !o? o : JSON.parse(JSON.stringify(o)); // is shockingly faster than anything else, and our data has to be a subset of JSON anyways! - } - ;(function(){ - function empty(v,i){ var n = this.n, u; - if(n && (i === n || (obj_is(n) && obj_has(n, i)))){ return } - if(u !== i){ return true } - } - Type.obj.empty = Type.obj.empty || function(o, n){ DEP('obj.empty'); - if(!o){ return true } - return obj_map(o,empty,{n:n})? false : true; - }; - }()); - (function(){ - function t(k,v){ - if(2 === arguments.length){ - t.r = t.r || {}; - t.r[k] = v; - return; - } t.r = t.r || []; - t.r.push(k); - } var keys = Object.keys, map; - Object.keys = Object.keys || function(o){ return map(o, function(v,k,t){t(k);}) }; - Type.obj.map = map = Type.obj.map || function(l, c, _){ DEP('obj.map'); - var u, i = 0, x, r, ll, lle, f = 'function' == typeof c; - t.r = u; - if(keys && obj_is(l)){ - ll = keys(l); lle = true; - } - _ = _ || {}; - if(list_is(l) || ll){ - x = (ll || l).length; - for(;i < x; i++){ - var ii = (i + Type.list.index); - if(f){ - r = lle? c.call(_, l[ll[i]], ll[i], t) : c.call(_, l[i], ii, t); - if(r !== u){ return r } - } else { - //if(Type.test.is(c,l[i])){ return ii } // should implement deep equality testing! - if(c === l[lle? ll[i] : i]){ return ll? ll[i] : ii } // use this for now - } - } - } else { - for(i in l){ - if(f){ - if(obj_has(l,i)){ - r = _? c.call(_, l[i], i, t) : c(l[i], i, t); - if(r !== u){ return r } - } - } else { - //if(a.test.is(c,l[i])){ return i } // should implement deep equality testing! - if(c === l[i]){ return i } // use this for now - } - } - } - return f? t.r : Type.list.index? 0 : -1; - }; - }()); - Type.time = Type.time || {}; - Type.time.is = Type.time.is || function(t){ DEP('time'); return t? t instanceof Date : (+new Date().getTime()) }; - - var fn_is = Type.fn.is; - var list_is = Type.list.is; - var obj = Type.obj, obj_is = obj.is, obj_has = obj.has, obj_map = obj.map; - - var Val = {}; - Val.is = function(v){ DEP('val.is'); // Valid values are a subset of JSON: null, binary, number (!Infinity), text, or a soul relation. Arrays need special algorithms to handle concurrency, so they are not supported directly. Use an extension that supports them if needed but research their problems first. - if(v === u){ return false } - if(v === null){ return true } // "deletes", nulling out keys. - if(v === Infinity){ return false } // we want this to be, but JSON does not support it, sad face. - if(text_is(v) // by "text" we mean strings. - || bi_is(v) // by "binary" we mean boolean. - || num_is(v)){ // by "number" we mean integers or decimals. - return true; // simple values are valid. - } - return Val.link.is(v) || false; // is the value a soul relation? Then it is valid and return it. If not, everything else remaining is an invalid data type. Custom extensions can be built on top of these primitives to support other types. - }; - Val.link = Val.rel = {_: '#'}; - (function(){ - Val.link.is = function(v){ DEP('val.link.is'); // this defines whether an object is a soul relation or not, they look like this: {'#': 'UUID'} - if(v && v[rel_] && !v._ && obj_is(v)){ // must be an object. - var o = {}; - obj_map(v, map, o); - if(o.id){ // a valid id was found. - return o.id; // yay! Return it. - } - } - return false; // the value was not a valid soul relation. - }; - function map(s, k){ var o = this; // map over the object... - if(o.id){ return o.id = false } // if ID is already defined AND we're still looping through the object, it is considered invalid. - if(k == rel_ && text_is(s)){ // the key should be '#' and have a text value. - o.id = s; // we found the soul! - } else { - return o.id = false; // if there exists anything else on the object that isn't the soul, then it is considered invalid. - } - } - }()); - Val.link.ify = function(t){ DEP('val.link.ify'); return obj_put({}, rel_, t) }; // convert a soul into a relation and return it. - Type.obj.has._ = '.'; - var rel_ = Val.link._, u; - var bi_is = Type.bi.is; - var num_is = Type.num.is; - var text_is = Type.text.is; - var obj = Type.obj, obj_is = obj.is, obj_put = obj.put, obj_map = obj.map; - - Type.val = Type.val || Val; - - var Node = {_: '_'}; - Node.soul = function(n, o){ DEP('node.soul'); return (n && n._ && n._[o || soul_]) }; // convenience function to check to see if there is a soul on a node and return it. - Node.soul.ify = function(n, o){ DEP('node.soul.ify'); // put a soul on an object. - o = (typeof o === 'string')? {soul: o} : o || {}; - n = n || {}; // make sure it exists. - n._ = n._ || {}; // make sure meta exists. - n._[soul_] = o.soul || n._[soul_] || text_random(); // put the soul on it. - return n; - }; - Node.soul._ = Val.link._; - (function(){ - Node.is = function(n, cb, as){ DEP('node.is'); var s; // checks to see if an object is a valid node. - if(!obj_is(n)){ return false } // must be an object. - if(s = Node.soul(n)){ // must have a soul on it. - return !obj_map(n, map, {as:as,cb:cb,s:s,n:n}); - } - return false; // nope! This was not a valid node. - }; - function map(v, k){ // we invert this because the way we check for this is via a negation. - if(k === Node._){ return } // skip over the metadata. - if(!Val.is(v)){ return true } // it is true that this is an invalid node. - if(this.cb){ this.cb.call(this.as, v, k, this.n, this.s); } // optionally callback each key/value. - } - }()); - (function(){ - Node.ify = function(obj, o, as){ DEP('node.ify'); // returns a node from a shallow object. - if(!o){ o = {}; } - else if(typeof o === 'string'){ o = {soul: o}; } - else if('function' == typeof o){ o = {map: o}; } - if(o.map){ o.node = o.map.call(as, obj, u, o.node || {}); } - if(o.node = Node.soul.ify(o.node || {}, o)){ - obj_map(obj, map, {o:o,as:as}); - } - return o.node; // This will only be a valid node if the object wasn't already deep! - }; - function map(v, k){ var o = this.o, tmp, u; // iterate over each key/value. - if(o.map){ - tmp = o.map.call(this.as, v, ''+k, o.node); - if(u === tmp){ - obj_del(o.node, k); - } else - if(o.node){ o.node[k] = tmp; } - return; - } - if(Val.is(v)){ - o.node[k] = v; - } - } - }()); - var obj = Type.obj, obj_is = obj.is, obj_del = obj.del, obj_map = obj.map; - var text = Type.text, text_random = text.random; - var soul_ = Node.soul._; - var u; - Type.node = Type.node || Node; - - var State = Type.state; - State.lex = function(){ DEP('state.lex'); return State().toString(36).replace('.','') }; - State.to = function(from, k, to){ DEP('state.to'); - var val = (from||{})[k]; - if(obj_is(val)){ - val = obj_copy(val); - } - return State.ify(to, k, State.is(from, k), val, Node.soul(from)); - } - ;(function(){ - State.map = function(cb, s, as){ DEP('state.map'); var u; // for use with Node.ify - var o = obj_is(o = cb || s)? o : null; - cb = fn_is(cb = cb || s)? cb : null; - if(o && !cb){ - s = num_is(s)? s : State(); - o[N_] = o[N_] || {}; - obj_map(o, map, {o:o,s:s}); - return o; - } - as = as || obj_is(s)? s : u; - s = num_is(s)? s : State(); - return function(v, k, o, opt){ - if(!cb){ - map.call({o: o, s: s}, v,k); - return v; - } - cb.call(as || this || {}, v, k, o, opt); - if(obj_has(o,k) && u === o[k]){ return } - map.call({o: o, s: s}, v,k); - } - }; - function map(v,k){ - if(N_ === k){ return } - State.ify(this.o, k, this.s) ; - } - }()); - var obj = Type.obj, obj_has = obj.has, obj_is = obj.is, obj_map = obj.map, obj_copy = obj.copy; - var num = Type.num, num_is = num.is; - var fn = Type.fn, fn_is = fn.is; - var N_ = Node._, u; - - var Graph = {}; - (function(){ - Graph.is = function(g, cb, fn, as){ DEP('graph.is'); // checks to see if an object is a valid graph. - if(!g || !obj_is(g) || obj_empty(g)){ return false } // must be an object. - return !obj_map(g, map, {cb:cb,fn:fn,as:as}); // makes sure it wasn't an empty object. - }; - function map(n, s){ // we invert this because the way'? we check for this is via a negation. - if(!n || s !== Node.soul(n) || !Node.is(n, this.fn, this.as)){ return true } // it is true that this is an invalid graph. - if(!this.cb){ return } - nf.n = n; nf.as = this.as; // sequential race conditions aren't races. - this.cb.call(nf.as, n, s, nf); - } - function nf(fn){ // optional callback for each node. - if(fn){ Node.is(nf.n, fn, nf.as); } // where we then have an optional callback for each key/value. - } - }()); - (function(){ - Graph.ify = function(obj, env, as){ DEP('graph.ify'); - var at = {path: [], obj: obj}; - if(!env){ - env = {}; - } else - if(typeof env === 'string'){ - env = {soul: env}; - } else - if('function' == typeof env){ - env.map = env; - } - if(typeof as === 'string'){ - env.soul = env.soul || as; - as = u; - } - if(env.soul){ - at.link = Val.link.ify(env.soul); - } - env.shell = (as||{}).shell; - env.graph = env.graph || {}; - env.seen = env.seen || []; - env.as = env.as || as; - node(env, at); - env.root = at.node; - return env.graph; - }; - function node(env, at){ var tmp; - if(tmp = seen(env, at)){ return tmp } - at.env = env; - at.soul = soul; - if(Node.ify(at.obj, map, at)){ - at.link = at.link || Val.link.ify(Node.soul(at.node)); - if(at.obj !== env.shell){ - env.graph[Val.link.is(at.link)] = at.node; - } - } - return at; - } - function map(v,k,n){ - var at = this, env = at.env, is, tmp; - if(Node._ === k && obj_has(v,Val.link._)){ - return n._; // TODO: Bug? - } - if(!(is = valid(v,k,n, at,env))){ return } - if(!k){ - at.node = at.node || n || {}; - if(obj_has(v, Node._) && Node.soul(v)){ // ? for safety ? - at.node._ = obj_copy(v._); - } - at.node = Node.soul.ify(at.node, Val.link.is(at.link)); - at.link = at.link || Val.link.ify(Node.soul(at.node)); - } - if(tmp = env.map){ - tmp.call(env.as || {}, v,k,n, at); - if(obj_has(n,k)){ - v = n[k]; - if(u === v){ - obj_del(n, k); - return; - } - if(!(is = valid(v,k,n, at,env))){ return } - } - } - if(!k){ return at.node } - if(true === is){ - return v; - } - tmp = node(env, {obj: v, path: at.path.concat(k)}); - if(!tmp.node){ return } - return tmp.link; //{'#': Node.soul(tmp.node)}; - } - function soul(id){ var at = this; - var prev = Val.link.is(at.link), graph = at.env.graph; - at.link = at.link || Val.link.ify(id); - at.link[Val.link._] = id; - if(at.node && at.node[Node._]){ - at.node[Node._][Val.link._] = id; - } - if(obj_has(graph, prev)){ - graph[id] = graph[prev]; - obj_del(graph, prev); - } - } - function valid(v,k,n, at,env){ var tmp; - if(Val.is(v)){ return true } - if(obj_is(v)){ return 1 } - if(tmp = env.invalid){ - v = tmp.call(env.as || {}, v,k,n); - return valid(v,k,n, at,env); - } - env.err = "Invalid value at '" + at.path.concat(k).join('.') + "'!"; - if(Type.list.is(v)){ env.err += " Use `.set(item)` instead of an Array."; } - } - function seen(env, at){ - var arr = env.seen, i = arr.length, has; - while(i--){ has = arr[i]; - if(at.obj === has.obj){ return has } - } - arr.push(at); - } - }()); - Graph.node = function(node){ DEP('graph.node'); - var soul = Node.soul(node); - if(!soul){ return } - return obj_put({}, soul, node); - } - ;(function(){ - Graph.to = function(graph, root, opt){ DEP('graph.to'); - if(!graph){ return } - var obj = {}; - opt = opt || {seen: {}}; - obj_map(graph[root], map, {obj:obj, graph: graph, opt: opt}); - return obj; - }; - function map(v,k){ var tmp, obj; - if(Node._ === k){ - if(obj_empty(v, Val.link._)){ - return; - } - this.obj[k] = obj_copy(v); - return; - } - if(!(tmp = Val.link.is(v))){ - this.obj[k] = v; - return; - } - if(obj = this.opt.seen[tmp]){ - this.obj[k] = obj; - return; - } - this.obj[k] = this.opt.seen[tmp] = Graph.to(this.graph, tmp, this.opt); - } - }()); - var fn_is = Type.fn.is; - var obj = Type.obj, obj_is = obj.is, obj_del = obj.del, obj_has = obj.has, obj_empty = obj.empty, obj_put = obj.put, obj_map = obj.map, obj_copy = obj.copy; - var u; - Type.graph = Type.graph || Graph; - }()); - }); - - var dot = /\.\.+/g; - var slash = /\/\/+/g; - - function CDN(dir){ - return function(req, res){ - req.url = (req.url||'').replace(dot,'').replace(slash,'/'); - if(serve(req, res)){ return } // filters GUN requests! - if (req.url.slice(-3) === '.js') { - res.writeHead(200, {'Content-Type': 'text/javascript'}); - } - fs.createReadStream(path$1.join(dir, req.url)).on('error',function(tmp){ // static files! - fs.readFile(path$1.join(dir, 'index.html'), function(err, tmp){ - try{ res.writeHead(200, {'Content-Type': 'text/html'}); - res.end(tmp+''); }catch(e){} // or default to index - });}).pipe(res); // stream - } - } - - function serve(req, res, next){ var tmp; - if(typeof req === 'string'){ - return CDN(req); - } - if(!req || !res){ return false } - next = next || serve; - if(!req.url){ return next() } - if(res.setHeader){ res.setHeader('Access-Control-Allow-Origin', '*'); } - if(0 <= req.url.indexOf('gun.js')){ - res.writeHead(200, {'Content-Type': 'text/javascript'}); - res.end(serve.js = serve.js || fs.readFileSync(__dirname + '/../gun.js')); - return true; - } - if(0 <= req.url.indexOf('gun/')){ - var path = __dirname + '/../' + req.url.split('/').slice(2).join('/'); - if('/' === path.slice(-1)){ - fs.readdir(path, function(err, dir){ res.end((dir || (err && 404))+''); }); - return true; - } - var S = +new Date; - var rs = fs.createReadStream(path); - rs.on('open', function(){ console.STAT && console.STAT(S, +new Date - S, 'serve file open'); rs.pipe(res); }); - rs.on('error', function(err){ res.end(404+''); }); - rs.on('end', function(){ console.STAT && console.STAT(S, +new Date - S, 'serve file end'); }); - return true; - } - if((tmp = req.socket) && (tmp = tmp.server) && (tmp = tmp.route)){ if(tmp = tmp[(((req.url||'').slice(1)).split('/')[0]||'').split('.')[0]]){ - try{ return tmp(req, res, next) }catch(e){ console.log(req.url+' crashed with '+e); } - } - } - return next(); - } - - var serve_1 = serve; - - var radix = createCommonjsModule(function (module) { - (function(){ - - function Radix(){ - var radix = function(key, val, t){ - radix.unit = 0; - if(!t && u !== val){ - radix.last = (''+key < radix.last)? radix.last : ''+key; - delete (radix.$||{})[_]; - } - t = t || radix.$ || (radix.$ = {}); - if(!key && Object.keys(t).length){ return t } - key = ''+key; - var i = 0, l = key.length-1, k = key[i], at, tmp; - while(!(at = t[k]) && i < l){ - k += key[++i]; - } - if(!at){ - if(!each(t, function(r, s){ - var ii = 0, kk = ''; - if((s||'').length){ while(s[ii] == key[ii]){ - kk += s[ii++]; - } } - if(kk){ - if(u === val){ - if(ii <= l){ return } - (tmp || (tmp = {}))[s.slice(ii)] = r; - //(tmp[_] = function $(){ $.sort = Object.keys(tmp).sort(); return $ }()); // get rid of this one, cause it is on read? - return r; - } - var __ = {}; - __[s.slice(ii)] = r; - ii = key.slice(ii); - ('' === ii)? (__[''] = val) : ((__[ii] = {})[''] = val); - //(__[_] = function $(){ $.sort = Object.keys(__).sort(); return $ }()); - t[kk] = __; - if(Radix.debug && 'undefined' === ''+kk){ console.log(0, kk); debugger } - delete t[s]; - //(t[_] = function $(){ $.sort = Object.keys(t).sort(); return $ }()); - return true; - } - })){ - if(u === val){ return; } - (t[k] || (t[k] = {}))[''] = val; - if(Radix.debug && 'undefined' === ''+k){ console.log(1, k); debugger } - //(t[_] = function $(){ $.sort = Object.keys(t).sort(); return $ }()); - } - if(u === val){ - return tmp; - } - } else - if(i == l){ - //if(u === val){ return (u === (tmp = at['']))? at : tmp } // THIS CODE IS CORRECT, below is - if(u === val){ return (u === (tmp = at['']))? at : ((radix.unit = 1) && tmp) } // temporary help?? - at[''] = val; - //(at[_] = function $(){ $.sort = Object.keys(at).sort(); return $ }()); - } else { - if(u !== val){ delete at[_]; } - //at && (at[_] = function $(){ $.sort = Object.keys(at).sort(); return $ }()); - return radix(key.slice(++i), val, at || (at = {})); - } - }; - return radix; - } - Radix.map = function rap(radix, cb, opt, pre){ - try { - pre = pre || []; // TODO: BUG: most out-of-memory crashes come from here. - var t = ('function' == typeof radix)? radix.$ || {} : radix; - //!opt && console.log("WHAT IS T?", JSON.stringify(t).length); - if(!t){ return } - if('string' == typeof t){ if(Radix.debug){ throw ['BUG:', radix, cb, opt, pre] } return; } - var keys = (t[_]||no).sort || (t[_] = function $(){ $.sort = Object.keys(t).sort(); return $ }()).sort, rev; // ONLY 17% of ops are pre-sorted! - //var keys = Object.keys(t).sort(); - opt = (true === opt)? {branch: true} : (opt || {}); - if(rev = opt.reverse){ keys = keys.slice(0).reverse(); } - var start = opt.start, end = opt.end, END = '\uffff'; - var i = 0, l = keys.length; - for(;i < l; i++){ var key = keys[i], tree = t[key], tmp, p, pt; - if(!tree || '' === key || _ === key || 'undefined' === key){ continue } - p = pre.slice(0); p.push(key); - pt = p.join(''); - if(u !== start && pt < (start||'').slice(0,pt.length)){ continue } - if(u !== end && (end || END) < pt){ continue } - if(rev){ // children must be checked first when going in reverse. - tmp = rap(tree, cb, opt, p); - if(u !== tmp){ return tmp } - } - if(u !== (tmp = tree[''])){ - var yes = 1; - if(u !== start && pt < (start||'')){ yes = 0; } - if(u !== end && pt > (end || END)){ yes = 0; } - if(yes){ - tmp = cb(tmp, pt, key, pre); - if(u !== tmp){ return tmp } - } - } else - if(opt.branch){ - tmp = cb(u, pt, key, pre); - if(u !== tmp){ return tmp } - } - pre = p; - if(!rev){ - tmp = rap(tree, cb, opt, pre); - if(u !== tmp){ return tmp } - } - pre.pop(); - } - } catch (e) { console.error(e); } - }; - - if(typeof window !== "undefined"){ - window.Radix = Radix; - } else { - try{ module.exports = Radix; }catch(e){} - } - var each = Radix.object = function(o, f, r){ - for(var k in o){ - if(!o.hasOwnProperty(k)){ continue } - if((r = f(o[k], k)) !== u){ return r } - } - }, no = {}, u; - var _ = String.fromCharCode(24); - - }()); - }); - - var radmigtmp = function(r){ - var Radix = radix; - r.find('a', function(){ - var l = []; - Radix.map(r.list, function(v,f){ - if(!(f.indexOf('%1B') + 1)){ return } - if(!v){ return } - l.push([f,v]); - }); - if(l.length){ - console.log("\n! ! ! WARNING ! ! !\nRAD v0.2020.x has detected OLD v0.2019.x data & automatically migrating. Automatic migration will be turned OFF in future versions! If you are just developing/testing, we recommend you reset your data. Please contact us if you have any concerns.\nThis message should only log once."); - } - var f, v; - l.forEach(function(a){ - f = a[0]; v = a[1]; - r.list(decodeURIComponent(f), v); - r.list(f, 0); - }); - if(!f){ return } - r.find.bad(f); - }); - }; - - var radisk = createCommonjsModule(function (module) { - (function(){ - - function Radisk(opt){ - - opt = opt || {}; - opt.log = opt.log || console.log; - opt.file = String(opt.file || 'radata'); - var has = (Radisk.has || (Radisk.has = {}))[opt.file]; - if(has){ return has } - - opt.max = opt.max || (opt.memory? (opt.memory * 999 * 999) : 300000000) * 0.3; - opt.until = opt.until || opt.wait || 250; - opt.batch = opt.batch || (10 * 1000); - opt.chunk = opt.chunk || (1024 * 1024 * 1); // 1MB - opt.code = opt.code || {}; - opt.code.from = opt.code.from || '!'; - opt.jsonify = true; - - - function ename(t){ return encodeURIComponent(t).replace(/\*/g, '%2A') } // TODO: Hash this also, but allow migration! - function atomic(v){ return u !== v && (!v || 'object' != typeof v) } - var timediate = (''+u === typeof setImmediate)? setTimeout : setImmediate; - var puff = setTimeout.turn || timediate, u; - var map = Radix.object; - var ST = 0; - - if(!opt.store){ - return opt.log("ERROR: Radisk needs `opt.store` interface with `{get: fn, put: fn (, list: fn)}`!"); - } - if(!opt.store.put){ - return opt.log("ERROR: Radisk needs `store.put` interface with `(file, data, cb)`!"); - } - if(!opt.store.get){ - return opt.log("ERROR: Radisk needs `store.get` interface with `(file, cb)`!"); - } - var parse = JSON.parseAsync || function(t,cb,r){ var u; try{ cb(u, JSON.parse(t,r)); }catch(e){ cb(e); } }; - /* - Any and all storage adapters should... - 1. Because writing to disk takes time, we should batch data to disk. This improves performance, and reduces potential disk corruption. - 2. If a batch exceeds a certain number of writes, we should immediately write to disk when physically possible. This caps total performance, but reduces potential loss. - */ - var r = function(key, data, cb, tag, DBG){ - if('function' === typeof data){ - var o = cb || {}; - cb = data; - r.read(key, cb, o, DBG || tag); - return; - } - //var tmp = (tmp = r.batch = r.batch || {})[key] = tmp[key] || {}; - //var tmp = (tmp = r.batch = r.batch || {})[key] = data; - r.save(key, data, cb, tag, DBG); - }; - r.save = function(key, data, cb, tag, DBG){ - var s = {key: key}, tags, f, d, q; - s.find = function(file){ var tmp; - s.file = file || (file = opt.code.from); - DBG && (DBG = DBG[file] = DBG[file] || {}); - DBG && (DBG.sf = DBG.sf || +new Date); - //console.only.i && console.log('found', file); - if(tmp = r.disk[file]){ s.mix(u, tmp); return } - r.parse(file, s.mix, u, DBG); - }; - s.mix = function(err, disk){ - DBG && (DBG.sml = +new Date); - DBG && (DBG.sm = DBG.sm || +new Date); - if(s.err = err || s.err){ cb(err); return } // TODO: HANDLE BATCH EMIT - var file = s.file = (disk||'').file || s.file, tmp; - if(!disk && file !== opt.code.from){ // corrupt file? - r.find.bad(file); // remove from dir list - r.save(key, data, cb, tag); // try again - return; - } - (disk = r.disk[file] || (r.disk[file] = disk || Radix())).file || (disk.file = file); - if(opt.compare){ - data = opt.compare(disk(key), data, key, file); - if(u === data){ cb(err, -1); return } // TODO: HANDLE BATCH EMIT - } - (s.disk = disk)(key, data); - if(tag){ - (tmp = (tmp = disk.tags || (disk.tags = {}))[tag] || (tmp[tag] = r.tags[tag] || (r.tags[tag] = {})))[file] || (tmp[file] = r.one[tag] || (r.one[tag] = cb)); - cb = null; - } - DBG && (DBG.st = DBG.st || +new Date); - //console.only.i && console.log('mix', disk.Q); - if(disk.Q){ cb && disk.Q.push(cb); return } disk.Q = (cb? [cb] : []); - disk.to = setTimeout(s.write, opt.until); - }; - s.write = function(){ - DBG && (DBG.sto = DBG.sto || +new Date); - var file = f = s.file, disk = d = s.disk; - q = s.q = disk.Q; - tags = s.tags = disk.tags; - delete disk.Q; - delete r.disk[file]; - delete disk.tags; - //console.only.i && console.log('write', file, disk, 'was saving:', key, data); - r.write(file, disk, s.ack, u, DBG); - }; - s.ack = function(err, ok){ - DBG && (DBG.sa = DBG.sa || +new Date); - DBG && (DBG.sal = q.length); - var ack, tmp; - // TODO!!!! CHANGE THIS INTO PUFF!!!!!!!!!!!!!!!! - for(var id in r.tags){ - if(!r.tags.hasOwnProperty(id)){ continue } var tag = r.tags[id]; - if((tmp = r.disk[f]) && (tmp = tmp.tags) && tmp[tag]){ continue } - ack = tag[f]; - delete tag[f]; - var ne; for(var k in tag){ if(tag.hasOwnProperty(k)){ ne = true; break } } // is not empty? - if(ne){ continue } //if(!obj_empty(tag)){ continue } - delete r.tags[tag]; - ack && ack(err, ok); - } - !q && (q = ''); - var l = q.length, i = 0; - // TODO: PERF: Why is acks so slow, what work do they do??? CHECK THIS!! - // TODO: PERF: Why is acks so slow, what work do they do??? CHECK THIS!! - // TODO: PERF: Why is acks so slow, what work do they do??? CHECK THIS!! - // TODO: PERF: Why is acks so slow, what work do they do??? CHECK THIS!! - // TODO: PERF: Why is acks so slow, what work do they do??? CHECK THIS!! - // TODO: PERF: Why is acks so slow, what work do they do??? CHECK THIS!! - // TODO: PERF: Why is acks so slow, what work do they do??? CHECK THIS!! - var S = +new Date; - for(;i < l; i++){ (ack = q[i]) && ack(err, ok); } - console.STAT && console.STAT(S, +new Date - S, 'rad acks', ename(s.file)); - console.STAT && console.STAT(S, q.length, 'rad acks #', ename(s.file)); - }; - cb || (cb = function(err, ok){ // test delete! - if(!err){ return } - }); - //console.only.i && console.log('save', key); - r.find(key, s.find); - }; - r.disk = {}; - r.one = {}; - r.tags = {}; - - /* - Any storage engine at some point will have to do a read in order to write. - This is true of even systems that use an append only log, if they support updates. - Therefore it is unavoidable that a read will have to happen, - the question is just how long you delay it. - */ - var RWC = 0; - r.write = function(file, rad, cb, o, DBG){ - if(!rad){ cb('No radix!'); return } - o = ('object' == typeof o)? o : {force: o}; - var f = function Fractal(){}, a, b; - f.text = ''; - f.file = file = rad.file || (rad.file = file); - if(!file){ cb('What file?'); return } - f.write = function(){ - var text = rad.raw = f.text; - r.disk[file = rad.file || f.file || file] = rad; - var S = +new Date; - DBG && (DBG.wd = S); - //console.only.i && console.log('add', file); - r.find.add(file, function add(err){ - DBG && (DBG.wa = +new Date); - if(err){ cb(err); return } - //console.only.i && console.log('disk', file, text); - opt.store.put(ename(file), text, function safe(err, ok){ - DBG && (DBG.wp = +new Date); - console.STAT && console.STAT(S, ST = +new Date - S, "wrote disk", JSON.stringify(file), ++RWC, 'total all writes.'); - //console.only.i && console.log('done', err, ok || 1, cb); - cb(err, ok || 1); - if(!rad.Q){ delete r.disk[file]; } // VERY IMPORTANT! Clean up memory, but not if there is already queued writes on it! - }); - }); - }; - f.split = function(){ - var S = +new Date; - DBG && (DBG.wf = S); - f.text = ''; - if(!f.count){ f.count = 0; - Radix.map(rad, function count(){ f.count++; }); // TODO: Perf? Any faster way to get total length? - } - DBG && (DBG.wfc = f.count); - f.limit = Math.ceil(f.count/2); - var SC = f.count; - f.count = 0; - DBG && (DBG.wf1 = +new Date); - f.sub = Radix(); - Radix.map(rad, f.slice, {reverse: 1}); // IMPORTANT: DO THIS IN REVERSE, SO LAST HALF OF DATA MOVED TO NEW FILE BEFORE DROPPING FROM CURRENT FILE. - DBG && (DBG.wf2 = +new Date); - r.write(f.end, f.sub, f.both, o); - DBG && (DBG.wf3 = +new Date); - f.hub = Radix(); - Radix.map(rad, f.stop); - DBG && (DBG.wf4 = +new Date); - r.write(rad.file, f.hub, f.both, o); - DBG && (DBG.wf5 = +new Date); - console.STAT && console.STAT(S, +new Date - S, "rad split", ename(rad.file), SC); - return true; - }; - f.slice = function(val, key){ - f.sub(f.end = key, val); - if(f.limit <= (++f.count)){ return true } - }; - f.stop = function(val, key){ - if(key >= f.end){ return true } - f.hub(key, val); - }; - f.both = function(err, ok){ - DBG && (DBG.wfd = +new Date); - if(b){ cb(err || b); return } - if(a){ cb(err, ok); return } - a = true; - b = err; - }; - f.each = function(val, key, k, pre){ - if(u !== val){ f.count++; } - if(opt.max <= (val||'').length){ return cb("Data too big!"), true } - var enc = Radisk.encode(pre.length) +'#'+ Radisk.encode(k) + (u === val? '' : ':'+ Radisk.encode(val)) +'\n'; - if((opt.chunk < f.text.length + enc.length) && (1 < f.count) && !o.force){ - return f.split(); - } - f.text += enc; - }; - //console.only.i && console.log('writing'); - if(opt.jsonify){ r.write.jsonify(f, rad, cb, o, DBG); return } // temporary testing idea - if(!Radix.map(rad, f.each, true)){ f.write(); } - }; - - r.write.jsonify = function(f, rad, cb, o, DBG){ - var raw; - var S = +new Date; - DBG && (DBG.w = S); - try{raw = JSON.stringify(rad.$); - }catch(e){ cb("Cannot radisk!"); return } - DBG && (DBG.ws = +new Date); - console.STAT && console.STAT(S, +new Date - S, "rad stringified JSON"); - if(opt.chunk < raw.length && !o.force){ - var c = 0; - Radix.map(rad, function(){ - if(c++){ return true } // more than 1 item - }); - if(c > 1){ - return f.split(); - } - } - f.text = raw; - f.write(); - }; - - r.range = function(tree, o){ - if(!tree || !o){ return } - if(u === o.start && u === o.end){ return tree } - if(atomic(tree)){ return tree } - var sub = Radix(); - Radix.map(tree, function(v,k){ sub(k,v); }, o); // ONLY PLACE THAT TAKES TREE, maybe reduce API for better perf? - return sub(''); - } - - ;(function(){ - r.read = function(key, cb, o, DBG){ - o = o || {}; - var g = {key: key}; - g.find = function(file){ var tmp; - g.file = file || (file = opt.code.from); - DBG && (DBG = DBG[file] = DBG[file] || {}); - DBG && (DBG.rf = DBG.rf || +new Date); - if(tmp = r.disk[g.file = file]){ g.check(u, tmp); return } - r.parse(file, g.check, u, DBG); - }; - g.get = function(err, disk, info){ - DBG && (DBG.rgl = +new Date); - DBG && (DBG.rg = DBG.rg || +new Date); - if(g.err = err || g.err){ cb(err); return } - var file = g.file = (disk||'').file || g.file; - if(!disk && file !== opt.code.from){ // corrupt file? - r.find.bad(file); // remove from dir list - r.read(key, cb, o); // try again - return; - } - disk = r.disk[file] || (r.disk[file] = disk); - if(!disk){ cb(file === opt.code.from? u : "No file!"); return } - disk.file || (disk.file = file); - var data = r.range(disk(key), o); - DBG && (DBG.rr = +new Date); - o.unit = disk.unit; - o.chunks = (o.chunks || 0) + 1; - o.parsed = (o.parsed || 0) + ((info||'').parsed||(o.chunks*opt.chunk)); - o.more = 1; - o.next = u; - Radix.map(r.list, function next(v,f){ - if(!v || file === f){ return } - o.next = f; - return 1; - }, o.reverse? {reverse: 1, end: file} : {start: file}); - DBG && (DBG.rl = +new Date); - if(!o.next){ o.more = 0; } - if(o.next){ - if(!o.reverse && ((key < o.next && 0 != o.next.indexOf(key)) || (u !== o.end && (o.end || '\uffff') < o.next))){ o.more = 0; } - if(o.reverse && ((key > o.next && 0 != key.indexOf(o.next)) || ((u !== o.start && (o.start || '') > o.next && file <= o.start)))){ o.more = 0; } - } - //console.log(5, process.memoryUsage().heapUsed); - if(!o.more){ cb(g.err, data, o); return } - if(data){ cb(g.err, data, o); } - if(o.parsed >= o.limit){ return } - var S = +new Date; - DBG && (DBG.rm = S); - var next = o.next; - timediate(function(){ - console.STAT && console.STAT(S, +new Date - S, 'rad more'); - r.parse(next, g.check); - },0); - }; - g.check = function(err, disk, info){ - //console.log(4, process.memoryUsage().heapUsed); - g.get(err, disk, info); - if(!disk || disk.check){ return } disk.check = 1; - var S = +new Date; - (info || (info = {})).file || (info.file = g.file); - Radix.map(disk, function(val, key){ - // assume in memory for now, since both write/read already call r.find which will init it. - r.find(key, function(file){ - if((file || (file = opt.code.from)) === info.file){ return } - var id = (''+Math.random()).slice(-3); - puff(function(){ - r.save(key, val, function ack(err, ok){ - if(err){ r.save(key, val, ack); return } // ad infinitum??? - // TODO: NOTE!!! Mislocated data could be because of a synchronous `put` from the `g.get(` other than perf shouldn't we do the check first before acking? - console.STAT && console.STAT("MISLOCATED DATA CORRECTED", id, ename(key), ename(info.file), ename(file)); - }); - },0); - }); - }); - console.STAT && console.STAT(S, +new Date - S, "rad check"); - }; - r.find(key || (o.reverse? (o.end||'') : (o.start||'')), g.find); - }; - }()); - (function(){ - /* - Let us start by assuming we are the only process that is - changing the directory or bucket. Not because we do not want - to be multi-process/machine, but because we want to experiment - with how much performance and scale we can get out of only one. - Then we can work on the harder problem of being multi-process. - */ - var RPC = 0; - var Q = {}, s = String.fromCharCode(31); - r.parse = function(file, cb, raw, DBG){ var q; - if(!file){ return cb(); } - if(q = Q[file]){ q.push(cb); return } q = Q[file] = [cb]; - var p = function Parse(){}, info = {file: file}; - (p.disk = Radix()).file = file; - p.read = function(err, data){ DBG && (DBG.rpg = +new Date); - console.STAT && console.STAT(S, +new Date - S, 'read disk', JSON.stringify(file), ++RPC, 'total all parses.'); - //console.log(2, process.memoryUsage().heapUsed); - if((p.err = err) || (p.not = !data)){ - delete Q[file]; - p.map(q, p.ack); - return; - } - if('string' !== typeof data){ - try{ - if(opt.max <= data.length){ - p.err = "Chunk too big!"; - } else { - data = data.toString(); // If it crashes, it crashes here. How!?? We check size first! - } - }catch(e){ p.err = e; } - if(p.err){ - delete Q[file]; - p.map(q, p.ack); - return; - } - } - info.parsed = data.length; - DBG && (DBG.rpl = info.parsed); - DBG && (DBG.rpa = q.length); - S = +new Date; - if(!(opt.jsonify || '{' === data[0])){ - p.radec(err, data); - return; - } - parse(data, function(err, tree){ - //console.log(3, process.memoryUsage().heapUsed); - if(!err){ - delete Q[file]; - p.disk.$ = tree; - console.STAT && (ST = +new Date - S) > 9 && console.STAT(S, ST, 'rad parsed JSON'); - DBG && (DBG.rpd = +new Date); - p.map(q, p.ack); // hmmm, v8 profiler can't see into this cause of try/catch? - return; - } - if('{' === data[0]){ - delete Q[file]; - p.err = "JSON error!"; - p.map(q, p.ack); - return; - } - p.radec(err, data); - }); - }; - p.map = function(){ // switch to setTimeout.each now? - if(!q || !q.length){ return } - //var i = 0, l = q.length, ack; - var S = +new Date; - var err = p.err, data = p.not? u : p.disk; - var i = 0, ack; while(i < 9 && (ack = q[i++])){ ack(err, data, info); } // too much? - console.STAT && console.STAT(S, +new Date - S, 'rad packs', ename(file)); - console.STAT && console.STAT(S, i, 'rad packs #', ename(file)); - if(!(q = q.slice(i)).length){ return } - puff(p.map, 0); - }; - p.ack = function(cb){ - if(!cb){ return } - if(p.err || p.not){ - cb(p.err, u, info); - return; - } - cb(u, p.disk, info); - }; - p.radec = function(err, data){ - delete Q[file]; - S = +new Date; - var tmp = p.split(data), pre = [], i, k, v; - if(!tmp || 0 !== tmp[1]){ - p.err = "File '"+file+"' does not have root radix! "; - p.map(q, p.ack); - return; - } - while(tmp){ - k = v = u; - i = tmp[1]; - tmp = p.split(tmp[2])||''; - if('#' == tmp[0]){ - k = tmp[1]; - pre = pre.slice(0,i); - if(i <= pre.length){ - pre.push(k); - } - } - tmp = p.split(tmp[2])||''; - if('\n' == tmp[0]){ continue } - if('=' == tmp[0] || ':' == tmp[0]){ v = tmp[1]; } - if(u !== k && u !== v){ p.disk(pre.join(''), v); } - tmp = p.split(tmp[2]); - } - console.STAT && console.STAT(S, +new Date - S, 'parsed RAD'); - p.map(q, p.ack); - }; - p.split = function(t){ - if(!t){ return } - var l = [], o = {}, i = -1, a = '', b; - i = t.indexOf(s); - if(!t[i]){ return } - a = t.slice(0, i); - l[0] = a; - l[1] = b = Radisk.decode(t.slice(i), o); - l[2] = t.slice(i + o.i); - return l; - }; - if(r.disk){ raw || (raw = (r.disk[file]||'').raw); } - var S = +new Date; - DBG && (DBG.rp = S); - if(raw){ return puff(function(){ p.read(u, raw); }, 0) } - opt.store.get(ename(file), p.read); - // TODO: What if memory disk gets filled with updates, and we get an old one back? - }; - }()); - (function(){ - var dir, f = String.fromCharCode(28), Q; - r.find = function(key, cb){ - if(!dir){ - if(Q){ Q.push([key, cb]); return } Q = [[key, cb]]; - r.parse(f, init); - return; - } - Radix.map(r.list = dir, function(val, key){ - if(!val){ return } - return cb(key) || true; - }, {reverse: 1, end: key}) || cb(opt.code.from); - }; - r.find.add = function(file, cb){ - var has = dir(file); - if(has || file === f){ cb(u, 1); return } - dir(file, 1); - cb.found = (cb.found || 0) + 1; - r.write(f, dir, function(err, ok){ - if(err){ cb(err); return } - cb.found = (cb.found || 0) - 1; - if(0 !== cb.found){ return } - cb(u, 1); - }, true); - }; - r.find.bad = function(file, cb){ - dir(file, 0); - r.write(f, dir, cb||noop); - }; - function init(err, disk){ - if(err){ - opt.log('list', err); - setTimeout(function(){ r.parse(f, init); }, 1000); - return; - } - if(disk){ drain(disk); return } - dir = dir || disk || Radix(); - if(!opt.store.list){ drain(dir); return } - // import directory. - opt.store.list(function(file){ - if(!file){ drain(dir); return } - r.find.add(file, noop); - }); - } - function drain(rad, tmp){ - dir = dir || rad; - dir.file = f; - tmp = Q; Q = null; - map(tmp, function(arg){ - r.find(arg[0], arg[1]); - }); - } - }()); - - try{ !Gun.window && radmigtmp(r); }catch(e){} - - var noop = function(){}, u; - Radisk.has[opt.file] = r; - return r; - } - (function(){ - var _ = String.fromCharCode(31); - Radisk.encode = function(d, o, s){ s = s || _; - var t = s, tmp; - if(typeof d == 'string'){ - var i = d.indexOf(s); - while(i != -1){ t += s; i = d.indexOf(s, i+1); } - return t + '"' + d + s; - } else - if(d && d['#'] && 1 == Object.keys(d).length){ - return t + '#' + tmp + t; - } else - if('number' == typeof d){ - return t + '+' + (d||0) + t; - } else - if(null === d){ - return t + ' ' + t; - } else - if(true === d){ - return t + '+' + t; - } else - if(false === d){ - return t + '-' + t; - }// else - //if(binary){} - }; - Radisk.decode = function(t, o, s){ s = s || _; - var d = '', i = -1, n = 0, c, p; - if(s !== t[0]){ return } - while(s === t[++i]){ ++n; } - p = t[c = n] || true; - while(--n >= 0){ i = t.indexOf(s, i+1); } - if(i == -1){ i = t.length; } - d = t.slice(c+1, i); - if(o){ o.i = i+1; } - if('"' === p){ - return d; - } else - if('#' === p){ - return {'#':d}; - } else - if('+' === p){ - if(0 === d.length){ - return true; - } - return parseFloat(d); - } else - if(' ' === p){ - return null; - } else - if('-' === p){ - return false; - } - }; - }()); - - if(typeof window !== "undefined"){ - var Gun = window.Gun; - var Radix = window.Radix; - window.Radisk = Radisk; - } else { - var Gun = gun; - var Radix = radix; - //var Radix = require('./radix2'); Radisk = require('./radisk2'); - try{ module.exports = Radisk; }catch(e){} - } - - Radisk.Radix = Radix; - - }()); - }); - - var Gun$1 = (typeof window !== "undefined")? window.Gun : gun; - - Gun$1.on('create', function(root){ - if(Gun$1.TESTING){ root.opt.file = 'radatatest'; } - this.to.next(root); - var opt = root.opt, u; - if(false === opt.rad || false === opt.radisk){ return } - if((u+'' != typeof process) && 'false' === ''+(process.env||'').RAD){ return } - var Radisk = (Gun$1.window && Gun$1.window.Radisk) || radisk; - var Radix = Radisk.Radix; - var dare = Radisk(opt), esc = String.fromCharCode(27); - var ST = 0; - - root.on('put', function(msg){ - this.to.next(msg); - if((msg._||'').rad){ return } // don't save what just came from a read. - //if(msg['@']){ return } // WHY DID I NOT ADD THIS? - var id = msg['#'], put = msg.put, soul = put['#'], key = put['.'], val = put[':'], state = put['>']; - var DBG = (msg._||'').DBG; DBG && (DBG.sp = DBG.sp || +new Date); - //var lot = (msg._||'').lot||''; count[id] = (count[id] || 0) + 1; - var S = (msg._||'').RPS || ((msg._||'').RPS = +new Date); - //console.log("PUT ------->>>", soul,key, val, state); - //dare(soul+esc+key, {':': val, '>': state}, dare.one[id] || function(err, ok){ - dare(soul+esc+key, {':': val, '>': state}, function(err, ok){ - //console.log("<<<------- PAT", soul,key, val, state, 'in', +new Date - S); - DBG && (DBG.spd = DBG.spd || +new Date); - console.STAT && console.STAT(S, +new Date - S, 'put'); - //if(!err && count[id] !== lot.s){ console.log(err = "Disk count not same as ram count."); console.STAT && console.STAT(+new Date, lot.s - count[id], 'put ack != count') } delete count[id]; - if(err){ root.on('in', {'@': id, err: err, DBG: DBG}); return } - root.on('in', {'@': id, ok: ok, DBG: DBG}); - //}, id, DBG && (DBG.r = DBG.r || {})); - }, false , DBG && (DBG.r = DBG.r || {})); - DBG && (DBG.sps = DBG.sps || +new Date); - }); - - root.on('get', function(msg){ - this.to.next(msg); - var ctx = msg._||'', DBG = ctx.DBG = msg.DBG; DBG && (DBG.sg = +new Date); - var id = msg['#'], get = msg.get, soul = msg.get['#'], has = msg.get['.']||'', o = {}, graph, key, tmp, force; - if('string' == typeof soul){ - key = soul; - } else - if(soul){ - if(u !== (tmp = soul['*'])){ o.limit = force = 1; } - if(u !== soul['>']){ o.start = soul['>']; } - if(u !== soul['<']){ o.end = soul['<']; } - key = force? (''+tmp) : tmp || soul['=']; - force = null; - } - if(key && !o.limit){ // a soul.has must be on a soul, and not during soul* - if('string' == typeof has){ - key = key+esc+(o.atom = has); - } else - if(has){ - if(u !== has['>']){ o.start = has['>']; o.limit = 1; } - if(u !== has['<']){ o.end = has['<']; o.limit = 1; } - if(u !== (tmp = has['*'])){ o.limit = force = 1; } - if(key){ key = key+esc + (force? (''+(tmp||'')) : tmp || (o.atom = has['='] || '')); } - } - } - if((tmp = get['%']) || o.limit){ - o.limit = (tmp <= (o.pack || (1000 * 100)))? tmp : 1; - } - if(has['-'] || (soul||{})['-'] || get['-']){ o.reverse = true; } - if((tmp = (root.next||'')[soul]) && tmp.put){ - if(o.atom){ - tmp = (tmp.next||'')[o.atom] ; - if(tmp && tmp.rad){ return } - } else - if(tmp && tmp.rad){ return } - } - var now = Gun$1.state(); - var S = (+new Date), C = 0; // STATS! - DBG && (DBG.sgm = S); - //var GID = String.random(3); console.log("GET ------->>>", GID, key, o, '?', get); - dare(key||'', function(err, data, info){ - //console.log("<<<------- GOT", GID, +new Date - S, err, data); - DBG && (DBG.sgr = +new Date); - DBG && (DBG.sgi = info); - try{opt.store.stats.get.time[statg % 50] = (+new Date) - S; ++statg; - opt.store.stats.get.count++; - if(err){ opt.store.stats.get.err = err; } - }catch(e){} // STATS! - //if(u === data && info.chunks > 1){ return } // if we already sent a chunk, ignore ending empty responses. // this causes tests to fail. - console.STAT && console.STAT(S, +new Date - S, 'got', JSON.stringify(key)); S = +new Date; - info = info || ''; - var va, ve; - if(info.unit && data && u !== (va = data[':']) && u !== (ve = data['>'])){ // new format - var tmp = key.split(esc), so = tmp[0], ha = tmp[1]; - (graph = graph || {})[so] = Gun$1.state.ify(graph[so], ha, ve, va, so); - root.$.get(so).get(ha)._.rad = now; - // REMEMBER TO ADD _rad TO NODE/SOUL QUERY! - } else - if(data){ // old code path - if(typeof data !== 'string'){ - if(o.atom){ - data = u; - } else { - Radix.map(data, each, o); // IS A RADIX TREE, NOT FUNCTION! - } - } - if(!graph && data){ each(data, ''); } - // TODO: !has what about soul lookups? - if(!o.atom && !has & 'string' == typeof soul && !o.limit && !o.more){ - root.$.get(soul)._.rad = now; - } - } - DBG && (DBG.sgp = +new Date); - // TODO: PERF NOTES! This is like 0.2s, but for each ack, or all? Can you cache these preps? - // TODO: PERF NOTES! This is like 0.2s, but for each ack, or all? Can you cache these preps? - // TODO: PERF NOTES! This is like 0.2s, but for each ack, or all? Can you cache these preps? - // TODO: PERF NOTES! This is like 0.2s, but for each ack, or all? Can you cache these preps? - // TODO: PERF NOTES! This is like 0.2s, but for each ack, or all? Can you cache these preps? - // Or benchmark by reusing first start date. - if(console.STAT && (ST = +new Date - S) > 9){ console.STAT(S, ST, 'got prep time'); console.STAT(S, C, 'got prep #'); } C = 0; S = +new Date; - var faith = function(){}; faith.faith = true; faith.rad = get; // HNPERF: We're testing performance improvement by skipping going through security again, but this should be audited. - root.on('in', {'@': id, put: graph, '%': info.more? 1 : u, err: err? err : u, _: faith, DBG: DBG}); - console.STAT && (ST = +new Date - S) > 9 && console.STAT(S, ST, 'got emit', Object.keys(graph||{}).length); - graph = u; // each is outside our scope, we have to reset graph to nothing! - }, o, DBG && (DBG.r = DBG.r || {})); - DBG && (DBG.sgd = +new Date); - console.STAT && (ST = +new Date - S) > 9 && console.STAT(S, ST, 'get call'); // TODO: Perf: this was half a second?????? - function each(val, has, a,b){ // TODO: THIS CODE NEEDS TO BE FASTER!!!! - C++; - if(!val){ return } - has = (key+has).split(esc); - var soul = has.slice(0,1)[0]; - has = has.slice(-1)[0]; - if(o.limit && o.limit <= o.count){ return true } - var va, ve, so = soul, ha = has; - //if(u !== (va = val[':']) && u !== (ve = val['>'])){ // THIS HANDLES NEW CODE! - if('string' != typeof val){ // THIS HANDLES NEW CODE! - va = val[':']; ve = val['>']; - (graph = graph || {})[so] = Gun$1.state.ify(graph[so], ha, ve, va, so); - //root.$.get(so).get(ha)._.rad = now; - o.count = (o.count || 0) + ((va||'').length || 9); - return; - } - o.count = (o.count || 0) + val.length; - var tmp = val.lastIndexOf('>'); - var state = Radisk.decode(val.slice(tmp+1), null, esc); - val = Radisk.decode(val.slice(0,tmp), null, esc); - (graph = graph || {})[soul] = Gun$1.state.ify(graph[soul], has, state, val, soul); - } - }); - (opt.store||{}).stats = {get:{time:{}, count:0}, put: {time:{}, count:0}}; // STATS! - var statg = 0; // STATS! - }); - - function Store(opt){ - opt = opt || {}; - opt.log = opt.log || console.log; - opt.file = String(opt.file || 'radata'); - var fs$1 = fs, u; - - var store = function Store(){}; - if(Store[opt.file]){ - console.log("Warning: reusing same fs store and options as 1st."); - return Store[opt.file]; - } - Store[opt.file] = store; - var puts = {}; - - // TODO!!! ADD ZLIB INFLATE / DEFLATE COMPRESSION! - store.put = function(file, data, cb){ - var random = Math.random().toString(36).slice(-3); - puts[file] = {id: random, data: data}; - var tmp = opt.file+'-'+file+'-'+random+'.tmp'; - fs$1.writeFile(tmp, data, function(err, ok){ - if(err){ - if(random === (puts[file]||'').id){ delete puts[file]; } - return cb(err); - } - move(tmp, opt.file+'/'+file, function(err, ok){ - if(random === (puts[file]||'').id){ delete puts[file]; } - cb(err, ok || !err); - }); - }); - }; - store.get = function(file, cb){ var tmp; // this took 3s+? - if(tmp = puts[file]){ cb(u, tmp.data); return } - fs$1.readFile(opt.file+'/'+file, function(err, data){ - if(err){ - if('ENOENT' === (err.code||'').toUpperCase()){ - return cb(); - } - opt.log("ERROR:", err); - } - cb(err, data); - }); - }; - - if(!fs$1.existsSync(opt.file)){ fs$1.mkdirSync(opt.file); } - - function move(oldPath, newPath, cb) { - fs$1.rename(oldPath, newPath, function (err) { - if (err) { - if (err.code === 'EXDEV') { - var readStream = fs$1.createReadStream(oldPath); - var writeStream = fs$1.createWriteStream(newPath); - - readStream.on('error', cb); - writeStream.on('error', cb); - - readStream.on('close', function () { - fs$1.unlink(oldPath, cb); - }); - - readStream.pipe(writeStream); - } else { - cb(err); - } - } else { - cb(); - } - }); - } - store.list = function(cb, match, params, cbs){ - var dir = fs$1.readdirSync(opt.file); - dir.forEach(function(file){ - cb(file); - }); - cb(); - }; - - return store; - } - - var Gun$2 = (typeof window !== "undefined")? window.Gun : gun; - Gun$2.on('create', function(root){ - this.to.next(root); - var opt = root.opt; - if(opt.rfs === false){ return } - opt.store = opt.store || (!Gun$2.window && Store(opt)); - }); - - var rfs = Store; - - var rfsmix = function(opt, store){ - var rfs$1 = rfs(opt); - var p = store.put; - var g = store.get; - store.put = function(file, data, cb){ - var a, b, c = function(err, ok){ - if(b){ return cb(err || b) } - if(a){ return cb(err, ok) } - a = true; - b = err; - }; - p(file, data, c); // parallel - rfs$1.put(file, data, c); // parallel - }; - store.get = function(file, cb){ - rfs$1.get(file, function(err, data){ - //console.log("rfs3 hijacked", file); - if(data){ return cb(err, data) } - g(file, cb); - }); - }; - return store; - }; - - var u, AWS; - - gun.on('create', function(root){ - this.to.next(root); - var opt = root.opt; - if(!opt.s3 && !process.env.AWS_S3_BUCKET){ return } - //opt.batch = opt.batch || (1000 * 10); - //opt.until = opt.until || (1000 * 3); // ignoring these now, cause perf > cost - //opt.chunk = opt.chunk || (1024 * 1024 * 10); // 10MB // when cost only cents - - try{AWS = awsSdk; - }catch(e){ - console.log("Please `npm install aws-sdk` or add it to your package.json !"); - AWS_SDK_NOT_INSTALLED; - } - - var opts = opt.s3 || (opt.s3 = {}); - opts.bucket = opts.bucket || process.env.AWS_S3_BUCKET; - opts.region = opts.region || process.env.AWS_REGION || "us-east-1"; - opts.accessKeyId = opts.key = opts.key || opts.accessKeyId || process.env.AWS_ACCESS_KEY_ID; - opts.secretAccessKey = opts.secret = opts.secret || opts.secretAccessKey || process.env.AWS_SECRET_ACCESS_KEY; - - if(opt.fakes3 = opt.fakes3 || process.env.fakes3){ - opts.endpoint = opt.fakes3; - opts.sslEnabled = false; - opts.bucket = opts.bucket.replace('.','p'); - } - - opts.config = new AWS.Config(opts); - opts.s3 = opts.s3 || new AWS.S3(opts.config); - - opt.store = Object.keys(opts.s3).length === 0 ? opt.store : Store$1(opt); - }); - - function Store$1(opt){ - opt = opt || {}; - opt.file = String(opt.file || 'radata'); - var opts = opt.s3, s3 = opts.s3; - var c = {p: {}, g: {}, l: {}}; - - var store = function Store(){}; - if(Store$1[opt.file]){ - console.log("Warning: reusing same S3 store and options as 1st."); - return Store$1[opt.file]; - } - Store$1[opt.file] = store; - - store.put = function(file, data, cb){ - var params = {Bucket: opts.bucket, Key: file, Body: data}; - //console.log("RS3 PUT ---->", (data||"").slice(0,20)); - c.p[file] = data; - delete c.g[file];//Gun.obj.del(c.g, file); - delete c.l[1];//Gun.obj.del(c.l, 1); - s3.putObject(params, function(err, ok){ - delete c.p[file]; - cb(err, 's3'); - }); - }; - store.get = function(file, cb){ var tmp; - if(tmp = c.p[file]){ cb(u, tmp); return } - if(tmp = c.g[file]){ tmp.push(cb); return } - var cbs = c.g[file] = [cb]; - var params = {Bucket: opts.bucket, Key: file||''}; - //console.log("RS3 GET ---->", file); - s3.getObject(params, function got(err, ack){ - if(err && 'NoSuchKey' === err.code){ err = u; } - //console.log("RS3 GOT <----", err, file, cbs.length, ((ack||{}).Body||'').length);//.toString().slice(0,20)); - delete c.g[file];//Gun.obj.del(c.g, file); - var data, data = (ack||'').Body; - //console.log(1, process.memoryUsage().heapUsed); - var i = 0, cba; while(cba = cbs[i++]){ cba && cba(err, data); }//Gun.obj.map(cbs, cbe); - }); - }; - store.list = function(cb, match, params, cbs){ - if(!cbs){ - if(c.l[1]){ return c.l[1].push(cb) } - cbs = c.l[1] = [cb]; - } - params = params || {Bucket: opts.bucket}; - //console.log("RS3 LIST --->"); - s3.listObjectsV2(params, function(err, data){ - //console.log("RS3 LIST <---", err, data, cbs.length); - if(err){ return gun.log(err, err.stack) } - var IT = data.IsTruncated; - // Gun.obj.map(cbs, cbe); // lets see if fixes heroku - if(!IT){ delete c.l[1]; return } - params.ContinuationToken = data.NextContinuationToken; - store.list(cb, match, params, cbs); - }); - }; - //store.list(function(){ return true }); - if(false !== opt.rfs){ rfsmix(opt, store); } // ugly, but gotta move fast for now. - return store; - } - - var constants = { - BINARY_TYPES: ['nodebuffer', 'arraybuffer', 'fragments'], - GUID: '258EAFA5-E914-47DA-95CA-C5AB0DC85B11', - kStatusCode: Symbol('status-code'), - kWebSocket: Symbol('websocket'), - EMPTY_BUFFER: Buffer.alloc(0), - NOOP: () => {} - }; - - var bufferUtil = createCommonjsModule(function (module) { - - const { EMPTY_BUFFER } = constants; - - /** - * Merges an array of buffers into a new buffer. - * - * @param {Buffer[]} list The array of buffers to concat - * @param {Number} totalLength The total length of buffers in the list - * @return {Buffer} The resulting buffer - * @public - */ - function concat(list, totalLength) { - if (list.length === 0) return EMPTY_BUFFER; - if (list.length === 1) return list[0]; - - const target = Buffer.allocUnsafe(totalLength); - let offset = 0; - - for (let i = 0; i < list.length; i++) { - const buf = list[i]; - target.set(buf, offset); - offset += buf.length; - } - - if (offset < totalLength) return target.slice(0, offset); - - return target; - } - - /** - * Masks a buffer using the given mask. - * - * @param {Buffer} source The buffer to mask - * @param {Buffer} mask The mask to use - * @param {Buffer} output The buffer where to store the result - * @param {Number} offset The offset at which to start writing - * @param {Number} length The number of bytes to mask. - * @public - */ - function _mask(source, mask, output, offset, length) { - for (let i = 0; i < length; i++) { - output[offset + i] = source[i] ^ mask[i & 3]; - } - } - - /** - * Unmasks a buffer using the given mask. - * - * @param {Buffer} buffer The buffer to unmask - * @param {Buffer} mask The mask to use - * @public - */ - function _unmask(buffer, mask) { - // Required until https://github.com/nodejs/node/issues/9006 is resolved. - const length = buffer.length; - for (let i = 0; i < length; i++) { - buffer[i] ^= mask[i & 3]; - } - } - - /** - * Converts a buffer to an `ArrayBuffer`. - * - * @param {Buffer} buf The buffer to convert - * @return {ArrayBuffer} Converted buffer - * @public - */ - function toArrayBuffer(buf) { - if (buf.byteLength === buf.buffer.byteLength) { - return buf.buffer; - } - - return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength); - } - - /** - * Converts `data` to a `Buffer`. - * - * @param {*} data The data to convert - * @return {Buffer} The buffer - * @throws {TypeError} - * @public - */ - function toBuffer(data) { - toBuffer.readOnly = true; - - if (Buffer.isBuffer(data)) return data; - - let buf; - - if (data instanceof ArrayBuffer) { - buf = Buffer.from(data); - } else if (ArrayBuffer.isView(data)) { - buf = Buffer.from(data.buffer, data.byteOffset, data.byteLength); - } else { - buf = Buffer.from(data); - toBuffer.readOnly = false; - } - - return buf; - } - - try { - const bufferUtil = bufferutil; - const bu = bufferUtil.BufferUtil || bufferUtil; - - module.exports = { - concat, - mask(source, mask, output, offset, length) { - if (length < 48) _mask(source, mask, output, offset, length); - else bu.mask(source, mask, output, offset, length); - }, - toArrayBuffer, - toBuffer, - unmask(buffer, mask) { - if (buffer.length < 32) _unmask(buffer, mask); - else bu.unmask(buffer, mask); - } - }; - } catch (e) /* istanbul ignore next */ { - module.exports = { - concat, - mask: _mask, - toArrayBuffer, - toBuffer, - unmask: _unmask - }; - } - }); - - const kDone = Symbol('kDone'); - const kRun = Symbol('kRun'); - - /** - * A very simple job queue with adjustable concurrency. Adapted from - * https://github.com/STRML/async-limiter - */ - class Limiter { - /** - * Creates a new `Limiter`. - * - * @param {Number} [concurrency=Infinity] The maximum number of jobs allowed - * to run concurrently - */ - constructor(concurrency) { - this[kDone] = () => { - this.pending--; - this[kRun](); - }; - this.concurrency = concurrency || Infinity; - this.jobs = []; - this.pending = 0; - } - - /** - * Adds a job to the queue. - * - * @param {Function} job The job to run - * @public - */ - add(job) { - this.jobs.push(job); - this[kRun](); - } - - /** - * Removes a job from the queue and runs it if possible. - * - * @private - */ - [kRun]() { - if (this.pending === this.concurrency) return; - - if (this.jobs.length) { - const job = this.jobs.shift(); - - this.pending++; - job(this[kDone]); - } - } - } - - var limiter = Limiter; - - const { kStatusCode, NOOP } = constants; - - const TRAILER = Buffer.from([0x00, 0x00, 0xff, 0xff]); - const kPerMessageDeflate = Symbol('permessage-deflate'); - const kTotalLength = Symbol('total-length'); - const kCallback = Symbol('callback'); - const kBuffers = Symbol('buffers'); - const kError = Symbol('error'); - - // - // We limit zlib concurrency, which prevents severe memory fragmentation - // as documented in https://github.com/nodejs/node/issues/8871#issuecomment-250915913 - // and https://github.com/websockets/ws/issues/1202 - // - // Intentionally global; it's the global thread pool that's an issue. - // - let zlibLimiter; - - /** - * permessage-deflate implementation. - */ - class PerMessageDeflate { - /** - * Creates a PerMessageDeflate instance. - * - * @param {Object} [options] Configuration options - * @param {Boolean} [options.serverNoContextTakeover=false] Request/accept - * disabling of server context takeover - * @param {Boolean} [options.clientNoContextTakeover=false] Advertise/ - * acknowledge disabling of client context takeover - * @param {(Boolean|Number)} [options.serverMaxWindowBits] Request/confirm the - * use of a custom server window size - * @param {(Boolean|Number)} [options.clientMaxWindowBits] Advertise support - * for, or request, a custom client window size - * @param {Object} [options.zlibDeflateOptions] Options to pass to zlib on - * deflate - * @param {Object} [options.zlibInflateOptions] Options to pass to zlib on - * inflate - * @param {Number} [options.threshold=1024] Size (in bytes) below which - * messages should not be compressed - * @param {Number} [options.concurrencyLimit=10] The number of concurrent - * calls to zlib - * @param {Boolean} [isServer=false] Create the instance in either server or - * client mode - * @param {Number} [maxPayload=0] The maximum allowed message length - */ - constructor(options, isServer, maxPayload) { - this._maxPayload = maxPayload | 0; - this._options = options || {}; - this._threshold = - this._options.threshold !== undefined ? this._options.threshold : 1024; - this._isServer = !!isServer; - this._deflate = null; - this._inflate = null; - - this.params = null; - - if (!zlibLimiter) { - const concurrency = - this._options.concurrencyLimit !== undefined - ? this._options.concurrencyLimit - : 10; - zlibLimiter = new limiter(concurrency); - } - } - - /** - * @type {String} - */ - static get extensionName() { - return 'permessage-deflate'; - } - - /** - * Create an extension negotiation offer. - * - * @return {Object} Extension parameters - * @public - */ - offer() { - const params = {}; - - if (this._options.serverNoContextTakeover) { - params.server_no_context_takeover = true; - } - if (this._options.clientNoContextTakeover) { - params.client_no_context_takeover = true; - } - if (this._options.serverMaxWindowBits) { - params.server_max_window_bits = this._options.serverMaxWindowBits; - } - if (this._options.clientMaxWindowBits) { - params.client_max_window_bits = this._options.clientMaxWindowBits; - } else if (this._options.clientMaxWindowBits == null) { - params.client_max_window_bits = true; - } - - return params; - } - - /** - * Accept an extension negotiation offer/response. - * - * @param {Array} configurations The extension negotiation offers/reponse - * @return {Object} Accepted configuration - * @public - */ - accept(configurations) { - configurations = this.normalizeParams(configurations); - - this.params = this._isServer - ? this.acceptAsServer(configurations) - : this.acceptAsClient(configurations); - - return this.params; - } - - /** - * Releases all resources used by the extension. - * - * @public - */ - cleanup() { - if (this._inflate) { - this._inflate.close(); - this._inflate = null; - } - - if (this._deflate) { - const callback = this._deflate[kCallback]; - - this._deflate.close(); - this._deflate = null; - - if (callback) { - callback( - new Error( - 'The deflate stream was closed while data was being processed' - ) - ); - } - } - } - - /** - * Accept an extension negotiation offer. - * - * @param {Array} offers The extension negotiation offers - * @return {Object} Accepted configuration - * @private - */ - acceptAsServer(offers) { - const opts = this._options; - const accepted = offers.find((params) => { - if ( - (opts.serverNoContextTakeover === false && - params.server_no_context_takeover) || - (params.server_max_window_bits && - (opts.serverMaxWindowBits === false || - (typeof opts.serverMaxWindowBits === 'number' && - opts.serverMaxWindowBits > params.server_max_window_bits))) || - (typeof opts.clientMaxWindowBits === 'number' && - !params.client_max_window_bits) - ) { - return false; - } - - return true; - }); - - if (!accepted) { - throw new Error('None of the extension offers can be accepted'); - } - - if (opts.serverNoContextTakeover) { - accepted.server_no_context_takeover = true; - } - if (opts.clientNoContextTakeover) { - accepted.client_no_context_takeover = true; - } - if (typeof opts.serverMaxWindowBits === 'number') { - accepted.server_max_window_bits = opts.serverMaxWindowBits; - } - if (typeof opts.clientMaxWindowBits === 'number') { - accepted.client_max_window_bits = opts.clientMaxWindowBits; - } else if ( - accepted.client_max_window_bits === true || - opts.clientMaxWindowBits === false - ) { - delete accepted.client_max_window_bits; - } - - return accepted; - } - - /** - * Accept the extension negotiation response. - * - * @param {Array} response The extension negotiation response - * @return {Object} Accepted configuration - * @private - */ - acceptAsClient(response) { - const params = response[0]; - - if ( - this._options.clientNoContextTakeover === false && - params.client_no_context_takeover - ) { - throw new Error('Unexpected parameter "client_no_context_takeover"'); - } - - if (!params.client_max_window_bits) { - if (typeof this._options.clientMaxWindowBits === 'number') { - params.client_max_window_bits = this._options.clientMaxWindowBits; - } - } else if ( - this._options.clientMaxWindowBits === false || - (typeof this._options.clientMaxWindowBits === 'number' && - params.client_max_window_bits > this._options.clientMaxWindowBits) - ) { - throw new Error( - 'Unexpected or invalid parameter "client_max_window_bits"' - ); - } - - return params; - } - - /** - * Normalize parameters. - * - * @param {Array} configurations The extension negotiation offers/reponse - * @return {Array} The offers/response with normalized parameters - * @private - */ - normalizeParams(configurations) { - configurations.forEach((params) => { - Object.keys(params).forEach((key) => { - let value = params[key]; - - if (value.length > 1) { - throw new Error(`Parameter "${key}" must have only a single value`); - } - - value = value[0]; - - if (key === 'client_max_window_bits') { - if (value !== true) { - const num = +value; - if (!Number.isInteger(num) || num < 8 || num > 15) { - throw new TypeError( - `Invalid value for parameter "${key}": ${value}` - ); - } - value = num; - } else if (!this._isServer) { - throw new TypeError( - `Invalid value for parameter "${key}": ${value}` - ); - } - } else if (key === 'server_max_window_bits') { - const num = +value; - if (!Number.isInteger(num) || num < 8 || num > 15) { - throw new TypeError( - `Invalid value for parameter "${key}": ${value}` - ); - } - value = num; - } else if ( - key === 'client_no_context_takeover' || - key === 'server_no_context_takeover' - ) { - if (value !== true) { - throw new TypeError( - `Invalid value for parameter "${key}": ${value}` - ); - } - } else { - throw new Error(`Unknown parameter "${key}"`); - } - - params[key] = value; - }); - }); - - return configurations; - } - - /** - * Decompress data. Concurrency limited. - * - * @param {Buffer} data Compressed data - * @param {Boolean} fin Specifies whether or not this is the last fragment - * @param {Function} callback Callback - * @public - */ - decompress(data, fin, callback) { - zlibLimiter.add((done) => { - this._decompress(data, fin, (err, result) => { - done(); - callback(err, result); - }); - }); - } - - /** - * Compress data. Concurrency limited. - * - * @param {Buffer} data Data to compress - * @param {Boolean} fin Specifies whether or not this is the last fragment - * @param {Function} callback Callback - * @public - */ - compress(data, fin, callback) { - zlibLimiter.add((done) => { - this._compress(data, fin, (err, result) => { - done(); - callback(err, result); - }); - }); - } - - /** - * Decompress data. - * - * @param {Buffer} data Compressed data - * @param {Boolean} fin Specifies whether or not this is the last fragment - * @param {Function} callback Callback - * @private - */ - _decompress(data, fin, callback) { - const endpoint = this._isServer ? 'client' : 'server'; - - if (!this._inflate) { - const key = `${endpoint}_max_window_bits`; - const windowBits = - typeof this.params[key] !== 'number' - ? zlib.Z_DEFAULT_WINDOWBITS - : this.params[key]; - - this._inflate = zlib.createInflateRaw({ - ...this._options.zlibInflateOptions, - windowBits - }); - this._inflate[kPerMessageDeflate] = this; - this._inflate[kTotalLength] = 0; - this._inflate[kBuffers] = []; - this._inflate.on('error', inflateOnError); - this._inflate.on('data', inflateOnData); - } - - this._inflate[kCallback] = callback; - - this._inflate.write(data); - if (fin) this._inflate.write(TRAILER); - - this._inflate.flush(() => { - const err = this._inflate[kError]; - - if (err) { - this._inflate.close(); - this._inflate = null; - callback(err); - return; - } - - const data = bufferUtil.concat( - this._inflate[kBuffers], - this._inflate[kTotalLength] - ); - - if (this._inflate._readableState.endEmitted) { - this._inflate.close(); - this._inflate = null; - } else { - this._inflate[kTotalLength] = 0; - this._inflate[kBuffers] = []; - - if (fin && this.params[`${endpoint}_no_context_takeover`]) { - this._inflate.reset(); - } - } - - callback(null, data); - }); - } - - /** - * Compress data. - * - * @param {Buffer} data Data to compress - * @param {Boolean} fin Specifies whether or not this is the last fragment - * @param {Function} callback Callback - * @private - */ - _compress(data, fin, callback) { - const endpoint = this._isServer ? 'server' : 'client'; - - if (!this._deflate) { - const key = `${endpoint}_max_window_bits`; - const windowBits = - typeof this.params[key] !== 'number' - ? zlib.Z_DEFAULT_WINDOWBITS - : this.params[key]; - - this._deflate = zlib.createDeflateRaw({ - ...this._options.zlibDeflateOptions, - windowBits - }); - - this._deflate[kTotalLength] = 0; - this._deflate[kBuffers] = []; - - // - // An `'error'` event is emitted, only on Node.js < 10.0.0, if the - // `zlib.DeflateRaw` instance is closed while data is being processed. - // This can happen if `PerMessageDeflate#cleanup()` is called at the wrong - // time due to an abnormal WebSocket closure. - // - this._deflate.on('error', NOOP); - this._deflate.on('data', deflateOnData); - } - - this._deflate[kCallback] = callback; - - this._deflate.write(data); - this._deflate.flush(zlib.Z_SYNC_FLUSH, () => { - if (!this._deflate) { - // - // The deflate stream was closed while data was being processed. - // - return; - } - - let data = bufferUtil.concat( - this._deflate[kBuffers], - this._deflate[kTotalLength] - ); - - if (fin) data = data.slice(0, data.length - 4); - - // - // Ensure that the callback will not be called again in - // `PerMessageDeflate#cleanup()`. - // - this._deflate[kCallback] = null; - - this._deflate[kTotalLength] = 0; - this._deflate[kBuffers] = []; - - if (fin && this.params[`${endpoint}_no_context_takeover`]) { - this._deflate.reset(); - } - - callback(null, data); - }); - } - } - - var permessageDeflate = PerMessageDeflate; - - /** - * The listener of the `zlib.DeflateRaw` stream `'data'` event. - * - * @param {Buffer} chunk A chunk of data - * @private - */ - function deflateOnData(chunk) { - this[kBuffers].push(chunk); - this[kTotalLength] += chunk.length; - } - - /** - * The listener of the `zlib.InflateRaw` stream `'data'` event. - * - * @param {Buffer} chunk A chunk of data - * @private - */ - function inflateOnData(chunk) { - this[kTotalLength] += chunk.length; - - if ( - this[kPerMessageDeflate]._maxPayload < 1 || - this[kTotalLength] <= this[kPerMessageDeflate]._maxPayload - ) { - this[kBuffers].push(chunk); - return; - } - - this[kError] = new RangeError('Max payload size exceeded'); - this[kError].code = 'WS_ERR_UNSUPPORTED_MESSAGE_LENGTH'; - this[kError][kStatusCode] = 1009; - this.removeListener('data', inflateOnData); - this.reset(); - } - - /** - * The listener of the `zlib.InflateRaw` stream `'error'` event. - * - * @param {Error} err The emitted error - * @private - */ - function inflateOnError(err) { - // - // There is no need to call `Zlib#close()` as the handle is automatically - // closed when an error is emitted. - // - this[kPerMessageDeflate]._inflate = null; - err[kStatusCode] = 1007; - this[kCallback](err); - } - - var validation = createCommonjsModule(function (module) { - - /** - * Checks if a status code is allowed in a close frame. - * - * @param {Number} code The status code - * @return {Boolean} `true` if the status code is valid, else `false` - * @public - */ - function isValidStatusCode(code) { - return ( - (code >= 1000 && - code <= 1014 && - code !== 1004 && - code !== 1005 && - code !== 1006) || - (code >= 3000 && code <= 4999) - ); - } - - /** - * Checks if a given buffer contains only correct UTF-8. - * Ported from https://www.cl.cam.ac.uk/%7Emgk25/ucs/utf8_check.c by - * Markus Kuhn. - * - * @param {Buffer} buf The buffer to check - * @return {Boolean} `true` if `buf` contains only correct UTF-8, else `false` - * @public - */ - function _isValidUTF8(buf) { - const len = buf.length; - let i = 0; - - while (i < len) { - if ((buf[i] & 0x80) === 0) { - // 0xxxxxxx - i++; - } else if ((buf[i] & 0xe0) === 0xc0) { - // 110xxxxx 10xxxxxx - if ( - i + 1 === len || - (buf[i + 1] & 0xc0) !== 0x80 || - (buf[i] & 0xfe) === 0xc0 // Overlong - ) { - return false; - } - - i += 2; - } else if ((buf[i] & 0xf0) === 0xe0) { - // 1110xxxx 10xxxxxx 10xxxxxx - if ( - i + 2 >= len || - (buf[i + 1] & 0xc0) !== 0x80 || - (buf[i + 2] & 0xc0) !== 0x80 || - (buf[i] === 0xe0 && (buf[i + 1] & 0xe0) === 0x80) || // Overlong - (buf[i] === 0xed && (buf[i + 1] & 0xe0) === 0xa0) // Surrogate (U+D800 - U+DFFF) - ) { - return false; - } - - i += 3; - } else if ((buf[i] & 0xf8) === 0xf0) { - // 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx - if ( - i + 3 >= len || - (buf[i + 1] & 0xc0) !== 0x80 || - (buf[i + 2] & 0xc0) !== 0x80 || - (buf[i + 3] & 0xc0) !== 0x80 || - (buf[i] === 0xf0 && (buf[i + 1] & 0xf0) === 0x80) || // Overlong - (buf[i] === 0xf4 && buf[i + 1] > 0x8f) || - buf[i] > 0xf4 // > U+10FFFF - ) { - return false; - } - - i += 4; - } else { - return false; - } - } - - return true; - } - - try { - let isValidUTF8 = utf8Validate; - - /* istanbul ignore if */ - if (typeof isValidUTF8 === 'object') { - isValidUTF8 = isValidUTF8.Validation.isValidUTF8; // utf-8-validate@<3.0.0 - } - - module.exports = { - isValidStatusCode, - isValidUTF8(buf) { - return buf.length < 150 ? _isValidUTF8(buf) : isValidUTF8(buf); - } - }; - } catch (e) /* istanbul ignore next */ { - module.exports = { - isValidStatusCode, - isValidUTF8: _isValidUTF8 - }; - } - }); - - const { Writable } = stream$1; - - - const { - BINARY_TYPES, - EMPTY_BUFFER, - kStatusCode: kStatusCode$1, - kWebSocket - } = constants; - const { concat, toArrayBuffer, unmask } = bufferUtil; - const { isValidStatusCode, isValidUTF8 } = validation; - - const GET_INFO = 0; - const GET_PAYLOAD_LENGTH_16 = 1; - const GET_PAYLOAD_LENGTH_64 = 2; - const GET_MASK = 3; - const GET_DATA = 4; - const INFLATING = 5; - - /** - * HyBi Receiver implementation. - * - * @extends Writable - */ - class Receiver extends Writable { - /** - * Creates a Receiver instance. - * - * @param {String} [binaryType=nodebuffer] The type for binary data - * @param {Object} [extensions] An object containing the negotiated extensions - * @param {Boolean} [isServer=false] Specifies whether to operate in client or - * server mode - * @param {Number} [maxPayload=0] The maximum allowed message length - */ - constructor(binaryType, extensions, isServer, maxPayload) { - super(); - - this._binaryType = binaryType || BINARY_TYPES[0]; - this[kWebSocket] = undefined; - this._extensions = extensions || {}; - this._isServer = !!isServer; - this._maxPayload = maxPayload | 0; - - this._bufferedBytes = 0; - this._buffers = []; - - this._compressed = false; - this._payloadLength = 0; - this._mask = undefined; - this._fragmented = 0; - this._masked = false; - this._fin = false; - this._opcode = 0; - - this._totalPayloadLength = 0; - this._messageLength = 0; - this._fragments = []; - - this._state = GET_INFO; - this._loop = false; - } - - /** - * Implements `Writable.prototype._write()`. - * - * @param {Buffer} chunk The chunk of data to write - * @param {String} encoding The character encoding of `chunk` - * @param {Function} cb Callback - * @private - */ - _write(chunk, encoding, cb) { - if (this._opcode === 0x08 && this._state == GET_INFO) return cb(); - - this._bufferedBytes += chunk.length; - this._buffers.push(chunk); - this.startLoop(cb); - } - - /** - * Consumes `n` bytes from the buffered data. - * - * @param {Number} n The number of bytes to consume - * @return {Buffer} The consumed bytes - * @private - */ - consume(n) { - this._bufferedBytes -= n; - - if (n === this._buffers[0].length) return this._buffers.shift(); - - if (n < this._buffers[0].length) { - const buf = this._buffers[0]; - this._buffers[0] = buf.slice(n); - return buf.slice(0, n); - } - - const dst = Buffer.allocUnsafe(n); - - do { - const buf = this._buffers[0]; - const offset = dst.length - n; - - if (n >= buf.length) { - dst.set(this._buffers.shift(), offset); - } else { - dst.set(new Uint8Array(buf.buffer, buf.byteOffset, n), offset); - this._buffers[0] = buf.slice(n); - } - - n -= buf.length; - } while (n > 0); - - return dst; - } - - /** - * Starts the parsing loop. - * - * @param {Function} cb Callback - * @private - */ - startLoop(cb) { - let err; - this._loop = true; - - do { - switch (this._state) { - case GET_INFO: - err = this.getInfo(); - break; - case GET_PAYLOAD_LENGTH_16: - err = this.getPayloadLength16(); - break; - case GET_PAYLOAD_LENGTH_64: - err = this.getPayloadLength64(); - break; - case GET_MASK: - this.getMask(); - break; - case GET_DATA: - err = this.getData(cb); - break; - default: - // `INFLATING` - this._loop = false; - return; - } - } while (this._loop); - - cb(err); - } - - /** - * Reads the first two bytes of a frame. - * - * @return {(RangeError|undefined)} A possible error - * @private - */ - getInfo() { - if (this._bufferedBytes < 2) { - this._loop = false; - return; - } - - const buf = this.consume(2); - - if ((buf[0] & 0x30) !== 0x00) { - this._loop = false; - return error( - RangeError, - 'RSV2 and RSV3 must be clear', - true, - 1002, - 'WS_ERR_UNEXPECTED_RSV_2_3' - ); - } - - const compressed = (buf[0] & 0x40) === 0x40; - - if (compressed && !this._extensions[permessageDeflate.extensionName]) { - this._loop = false; - return error( - RangeError, - 'RSV1 must be clear', - true, - 1002, - 'WS_ERR_UNEXPECTED_RSV_1' - ); - } - - this._fin = (buf[0] & 0x80) === 0x80; - this._opcode = buf[0] & 0x0f; - this._payloadLength = buf[1] & 0x7f; - - if (this._opcode === 0x00) { - if (compressed) { - this._loop = false; - return error( - RangeError, - 'RSV1 must be clear', - true, - 1002, - 'WS_ERR_UNEXPECTED_RSV_1' - ); - } - - if (!this._fragmented) { - this._loop = false; - return error( - RangeError, - 'invalid opcode 0', - true, - 1002, - 'WS_ERR_INVALID_OPCODE' - ); - } - - this._opcode = this._fragmented; - } else if (this._opcode === 0x01 || this._opcode === 0x02) { - if (this._fragmented) { - this._loop = false; - return error( - RangeError, - `invalid opcode ${this._opcode}`, - true, - 1002, - 'WS_ERR_INVALID_OPCODE' - ); - } - - this._compressed = compressed; - } else if (this._opcode > 0x07 && this._opcode < 0x0b) { - if (!this._fin) { - this._loop = false; - return error( - RangeError, - 'FIN must be set', - true, - 1002, - 'WS_ERR_EXPECTED_FIN' - ); - } - - if (compressed) { - this._loop = false; - return error( - RangeError, - 'RSV1 must be clear', - true, - 1002, - 'WS_ERR_UNEXPECTED_RSV_1' - ); - } - - if (this._payloadLength > 0x7d) { - this._loop = false; - return error( - RangeError, - `invalid payload length ${this._payloadLength}`, - true, - 1002, - 'WS_ERR_INVALID_CONTROL_PAYLOAD_LENGTH' - ); - } - } else { - this._loop = false; - return error( - RangeError, - `invalid opcode ${this._opcode}`, - true, - 1002, - 'WS_ERR_INVALID_OPCODE' - ); - } - - if (!this._fin && !this._fragmented) this._fragmented = this._opcode; - this._masked = (buf[1] & 0x80) === 0x80; - - if (this._isServer) { - if (!this._masked) { - this._loop = false; - return error( - RangeError, - 'MASK must be set', - true, - 1002, - 'WS_ERR_EXPECTED_MASK' - ); - } - } else if (this._masked) { - this._loop = false; - return error( - RangeError, - 'MASK must be clear', - true, - 1002, - 'WS_ERR_UNEXPECTED_MASK' - ); - } - - if (this._payloadLength === 126) this._state = GET_PAYLOAD_LENGTH_16; - else if (this._payloadLength === 127) this._state = GET_PAYLOAD_LENGTH_64; - else return this.haveLength(); - } - - /** - * Gets extended payload length (7+16). - * - * @return {(RangeError|undefined)} A possible error - * @private - */ - getPayloadLength16() { - if (this._bufferedBytes < 2) { - this._loop = false; - return; - } - - this._payloadLength = this.consume(2).readUInt16BE(0); - return this.haveLength(); - } - - /** - * Gets extended payload length (7+64). - * - * @return {(RangeError|undefined)} A possible error - * @private - */ - getPayloadLength64() { - if (this._bufferedBytes < 8) { - this._loop = false; - return; - } - - const buf = this.consume(8); - const num = buf.readUInt32BE(0); - - // - // The maximum safe integer in JavaScript is 2^53 - 1. An error is returned - // if payload length is greater than this number. - // - if (num > Math.pow(2, 53 - 32) - 1) { - this._loop = false; - return error( - RangeError, - 'Unsupported WebSocket frame: payload length > 2^53 - 1', - false, - 1009, - 'WS_ERR_UNSUPPORTED_DATA_PAYLOAD_LENGTH' - ); - } - - this._payloadLength = num * Math.pow(2, 32) + buf.readUInt32BE(4); - return this.haveLength(); - } - - /** - * Payload length has been read. - * - * @return {(RangeError|undefined)} A possible error - * @private - */ - haveLength() { - if (this._payloadLength && this._opcode < 0x08) { - this._totalPayloadLength += this._payloadLength; - if (this._totalPayloadLength > this._maxPayload && this._maxPayload > 0) { - this._loop = false; - return error( - RangeError, - 'Max payload size exceeded', - false, - 1009, - 'WS_ERR_UNSUPPORTED_MESSAGE_LENGTH' - ); - } - } - - if (this._masked) this._state = GET_MASK; - else this._state = GET_DATA; - } - - /** - * Reads mask bytes. - * - * @private - */ - getMask() { - if (this._bufferedBytes < 4) { - this._loop = false; - return; - } - - this._mask = this.consume(4); - this._state = GET_DATA; - } - - /** - * Reads data bytes. - * - * @param {Function} cb Callback - * @return {(Error|RangeError|undefined)} A possible error - * @private - */ - getData(cb) { - let data = EMPTY_BUFFER; - - if (this._payloadLength) { - if (this._bufferedBytes < this._payloadLength) { - this._loop = false; - return; - } - - data = this.consume(this._payloadLength); - if (this._masked) unmask(data, this._mask); - } - - if (this._opcode > 0x07) return this.controlMessage(data); - - if (this._compressed) { - this._state = INFLATING; - this.decompress(data, cb); - return; - } - - if (data.length) { - // - // This message is not compressed so its lenght is the sum of the payload - // length of all fragments. - // - this._messageLength = this._totalPayloadLength; - this._fragments.push(data); - } - - return this.dataMessage(); - } - - /** - * Decompresses data. - * - * @param {Buffer} data Compressed data - * @param {Function} cb Callback - * @private - */ - decompress(data, cb) { - const perMessageDeflate = this._extensions[permessageDeflate.extensionName]; - - perMessageDeflate.decompress(data, this._fin, (err, buf) => { - if (err) return cb(err); - - if (buf.length) { - this._messageLength += buf.length; - if (this._messageLength > this._maxPayload && this._maxPayload > 0) { - return cb( - error( - RangeError, - 'Max payload size exceeded', - false, - 1009, - 'WS_ERR_UNSUPPORTED_MESSAGE_LENGTH' - ) - ); - } - - this._fragments.push(buf); - } - - const er = this.dataMessage(); - if (er) return cb(er); - - this.startLoop(cb); - }); - } - - /** - * Handles a data message. - * - * @return {(Error|undefined)} A possible error - * @private - */ - dataMessage() { - if (this._fin) { - const messageLength = this._messageLength; - const fragments = this._fragments; - - this._totalPayloadLength = 0; - this._messageLength = 0; - this._fragmented = 0; - this._fragments = []; - - if (this._opcode === 2) { - let data; - - if (this._binaryType === 'nodebuffer') { - data = concat(fragments, messageLength); - } else if (this._binaryType === 'arraybuffer') { - data = toArrayBuffer(concat(fragments, messageLength)); - } else { - data = fragments; - } - - this.emit('message', data); - } else { - const buf = concat(fragments, messageLength); - - if (!isValidUTF8(buf)) { - this._loop = false; - return error( - Error, - 'invalid UTF-8 sequence', - true, - 1007, - 'WS_ERR_INVALID_UTF8' - ); - } - - this.emit('message', buf.toString()); - } - } - - this._state = GET_INFO; - } - - /** - * Handles a control message. - * - * @param {Buffer} data Data to handle - * @return {(Error|RangeError|undefined)} A possible error - * @private - */ - controlMessage(data) { - if (this._opcode === 0x08) { - this._loop = false; - - if (data.length === 0) { - this.emit('conclude', 1005, ''); - this.end(); - } else if (data.length === 1) { - return error( - RangeError, - 'invalid payload length 1', - true, - 1002, - 'WS_ERR_INVALID_CONTROL_PAYLOAD_LENGTH' - ); - } else { - const code = data.readUInt16BE(0); - - if (!isValidStatusCode(code)) { - return error( - RangeError, - `invalid status code ${code}`, - true, - 1002, - 'WS_ERR_INVALID_CLOSE_CODE' - ); - } - - const buf = data.slice(2); - - if (!isValidUTF8(buf)) { - return error( - Error, - 'invalid UTF-8 sequence', - true, - 1007, - 'WS_ERR_INVALID_UTF8' - ); - } - - this.emit('conclude', code, buf.toString()); - this.end(); - } - } else if (this._opcode === 0x09) { - this.emit('ping', data); - } else { - this.emit('pong', data); - } - - this._state = GET_INFO; - } - } - - var receiver = Receiver; - - /** - * Builds an error object. - * - * @param {function(new:Error|RangeError)} ErrorCtor The error constructor - * @param {String} message The error message - * @param {Boolean} prefix Specifies whether or not to add a default prefix to - * `message` - * @param {Number} statusCode The status code - * @param {String} errorCode The exposed error code - * @return {(Error|RangeError)} The error - * @private - */ - function error(ErrorCtor, message, prefix, statusCode, errorCode) { - const err = new ErrorCtor( - prefix ? `Invalid WebSocket frame: ${message}` : message - ); - - Error.captureStackTrace(err, error); - err.code = errorCode; - err[kStatusCode$1] = statusCode; - return err; - } - - const { randomFillSync } = crypto; - - - const { EMPTY_BUFFER: EMPTY_BUFFER$1 } = constants; - const { isValidStatusCode: isValidStatusCode$1 } = validation; - const { mask: applyMask, toBuffer } = bufferUtil; - - const mask = Buffer.alloc(4); - - /** - * HyBi Sender implementation. - */ - class Sender { - /** - * Creates a Sender instance. - * - * @param {(net.Socket|tls.Socket)} socket The connection socket - * @param {Object} [extensions] An object containing the negotiated extensions - */ - constructor(socket, extensions) { - this._extensions = extensions || {}; - this._socket = socket; - - this._firstFragment = true; - this._compress = false; - - this._bufferedBytes = 0; - this._deflating = false; - this._queue = []; - } - - /** - * Frames a piece of data according to the HyBi WebSocket protocol. - * - * @param {Buffer} data The data to frame - * @param {Object} options Options object - * @param {Number} options.opcode The opcode - * @param {Boolean} [options.readOnly=false] Specifies whether `data` can be - * modified - * @param {Boolean} [options.fin=false] Specifies whether or not to set the - * FIN bit - * @param {Boolean} [options.mask=false] Specifies whether or not to mask - * `data` - * @param {Boolean} [options.rsv1=false] Specifies whether or not to set the - * RSV1 bit - * @return {Buffer[]} The framed data as a list of `Buffer` instances - * @public - */ - static frame(data, options) { - const merge = options.mask && options.readOnly; - let offset = options.mask ? 6 : 2; - let payloadLength = data.length; - - if (data.length >= 65536) { - offset += 8; - payloadLength = 127; - } else if (data.length > 125) { - offset += 2; - payloadLength = 126; - } - - const target = Buffer.allocUnsafe(merge ? data.length + offset : offset); - - target[0] = options.fin ? options.opcode | 0x80 : options.opcode; - if (options.rsv1) target[0] |= 0x40; - - target[1] = payloadLength; - - if (payloadLength === 126) { - target.writeUInt16BE(data.length, 2); - } else if (payloadLength === 127) { - target.writeUInt32BE(0, 2); - target.writeUInt32BE(data.length, 6); - } - - if (!options.mask) return [target, data]; - - randomFillSync(mask, 0, 4); - - target[1] |= 0x80; - target[offset - 4] = mask[0]; - target[offset - 3] = mask[1]; - target[offset - 2] = mask[2]; - target[offset - 1] = mask[3]; - - if (merge) { - applyMask(data, mask, target, offset, data.length); - return [target]; - } - - applyMask(data, mask, data, 0, data.length); - return [target, data]; - } - - /** - * Sends a close message to the other peer. - * - * @param {Number} [code] The status code component of the body - * @param {String} [data] The message component of the body - * @param {Boolean} [mask=false] Specifies whether or not to mask the message - * @param {Function} [cb] Callback - * @public - */ - close(code, data, mask, cb) { - let buf; - - if (code === undefined) { - buf = EMPTY_BUFFER$1; - } else if (typeof code !== 'number' || !isValidStatusCode$1(code)) { - throw new TypeError('First argument must be a valid error code number'); - } else if (data === undefined || data === '') { - buf = Buffer.allocUnsafe(2); - buf.writeUInt16BE(code, 0); - } else { - const length = Buffer.byteLength(data); - - if (length > 123) { - throw new RangeError('The message must not be greater than 123 bytes'); - } - - buf = Buffer.allocUnsafe(2 + length); - buf.writeUInt16BE(code, 0); - buf.write(data, 2); - } - - if (this._deflating) { - this.enqueue([this.doClose, buf, mask, cb]); - } else { - this.doClose(buf, mask, cb); - } - } - - /** - * Frames and sends a close message. - * - * @param {Buffer} data The message to send - * @param {Boolean} [mask=false] Specifies whether or not to mask `data` - * @param {Function} [cb] Callback - * @private - */ - doClose(data, mask, cb) { - this.sendFrame( - Sender.frame(data, { - fin: true, - rsv1: false, - opcode: 0x08, - mask, - readOnly: false - }), - cb - ); - } - - /** - * Sends a ping message to the other peer. - * - * @param {*} data The message to send - * @param {Boolean} [mask=false] Specifies whether or not to mask `data` - * @param {Function} [cb] Callback - * @public - */ - ping(data, mask, cb) { - const buf = toBuffer(data); - - if (buf.length > 125) { - throw new RangeError('The data size must not be greater than 125 bytes'); - } - - if (this._deflating) { - this.enqueue([this.doPing, buf, mask, toBuffer.readOnly, cb]); - } else { - this.doPing(buf, mask, toBuffer.readOnly, cb); - } - } - - /** - * Frames and sends a ping message. - * - * @param {Buffer} data The message to send - * @param {Boolean} [mask=false] Specifies whether or not to mask `data` - * @param {Boolean} [readOnly=false] Specifies whether `data` can be modified - * @param {Function} [cb] Callback - * @private - */ - doPing(data, mask, readOnly, cb) { - this.sendFrame( - Sender.frame(data, { - fin: true, - rsv1: false, - opcode: 0x09, - mask, - readOnly - }), - cb - ); - } - - /** - * Sends a pong message to the other peer. - * - * @param {*} data The message to send - * @param {Boolean} [mask=false] Specifies whether or not to mask `data` - * @param {Function} [cb] Callback - * @public - */ - pong(data, mask, cb) { - const buf = toBuffer(data); - - if (buf.length > 125) { - throw new RangeError('The data size must not be greater than 125 bytes'); - } - - if (this._deflating) { - this.enqueue([this.doPong, buf, mask, toBuffer.readOnly, cb]); - } else { - this.doPong(buf, mask, toBuffer.readOnly, cb); - } - } - - /** - * Frames and sends a pong message. - * - * @param {Buffer} data The message to send - * @param {Boolean} [mask=false] Specifies whether or not to mask `data` - * @param {Boolean} [readOnly=false] Specifies whether `data` can be modified - * @param {Function} [cb] Callback - * @private - */ - doPong(data, mask, readOnly, cb) { - this.sendFrame( - Sender.frame(data, { - fin: true, - rsv1: false, - opcode: 0x0a, - mask, - readOnly - }), - cb - ); - } - - /** - * Sends a data message to the other peer. - * - * @param {*} data The message to send - * @param {Object} options Options object - * @param {Boolean} [options.compress=false] Specifies whether or not to - * compress `data` - * @param {Boolean} [options.binary=false] Specifies whether `data` is binary - * or text - * @param {Boolean} [options.fin=false] Specifies whether the fragment is the - * last one - * @param {Boolean} [options.mask=false] Specifies whether or not to mask - * `data` - * @param {Function} [cb] Callback - * @public - */ - send(data, options, cb) { - const buf = toBuffer(data); - const perMessageDeflate = this._extensions[permessageDeflate.extensionName]; - let opcode = options.binary ? 2 : 1; - let rsv1 = options.compress; - - if (this._firstFragment) { - this._firstFragment = false; - if (rsv1 && perMessageDeflate) { - rsv1 = buf.length >= perMessageDeflate._threshold; - } - this._compress = rsv1; - } else { - rsv1 = false; - opcode = 0; - } - - if (options.fin) this._firstFragment = true; - - if (perMessageDeflate) { - const opts = { - fin: options.fin, - rsv1, - opcode, - mask: options.mask, - readOnly: toBuffer.readOnly - }; - - if (this._deflating) { - this.enqueue([this.dispatch, buf, this._compress, opts, cb]); - } else { - this.dispatch(buf, this._compress, opts, cb); - } - } else { - this.sendFrame( - Sender.frame(buf, { - fin: options.fin, - rsv1: false, - opcode, - mask: options.mask, - readOnly: toBuffer.readOnly - }), - cb - ); - } - } - - /** - * Dispatches a data message. - * - * @param {Buffer} data The message to send - * @param {Boolean} [compress=false] Specifies whether or not to compress - * `data` - * @param {Object} options Options object - * @param {Number} options.opcode The opcode - * @param {Boolean} [options.readOnly=false] Specifies whether `data` can be - * modified - * @param {Boolean} [options.fin=false] Specifies whether or not to set the - * FIN bit - * @param {Boolean} [options.mask=false] Specifies whether or not to mask - * `data` - * @param {Boolean} [options.rsv1=false] Specifies whether or not to set the - * RSV1 bit - * @param {Function} [cb] Callback - * @private - */ - dispatch(data, compress, options, cb) { - if (!compress) { - this.sendFrame(Sender.frame(data, options), cb); - return; - } - - const perMessageDeflate = this._extensions[permessageDeflate.extensionName]; - - this._bufferedBytes += data.length; - this._deflating = true; - perMessageDeflate.compress(data, options.fin, (_, buf) => { - if (this._socket.destroyed) { - const err = new Error( - 'The socket was closed while data was being compressed' - ); - - if (typeof cb === 'function') cb(err); - - for (let i = 0; i < this._queue.length; i++) { - const callback = this._queue[i][4]; - - if (typeof callback === 'function') callback(err); - } - - return; - } - - this._bufferedBytes -= data.length; - this._deflating = false; - options.readOnly = false; - this.sendFrame(Sender.frame(buf, options), cb); - this.dequeue(); - }); - } - - /** - * Executes queued send operations. - * - * @private - */ - dequeue() { - while (!this._deflating && this._queue.length) { - const params = this._queue.shift(); - - this._bufferedBytes -= params[1].length; - Reflect.apply(params[0], this, params.slice(1)); - } - } - - /** - * Enqueues a send operation. - * - * @param {Array} params Send operation parameters. - * @private - */ - enqueue(params) { - this._bufferedBytes += params[1].length; - this._queue.push(params); - } - - /** - * Sends a frame. - * - * @param {Buffer[]} list The frame to send - * @param {Function} [cb] Callback - * @private - */ - sendFrame(list, cb) { - if (list.length === 2) { - this._socket.cork(); - this._socket.write(list[0]); - this._socket.write(list[1], cb); - this._socket.uncork(); - } else { - this._socket.write(list[0], cb); - } - } - } - - var sender = Sender; - - /** - * Class representing an event. - * - * @private - */ - class Event { - /** - * Create a new `Event`. - * - * @param {String} type The name of the event - * @param {Object} target A reference to the target to which the event was - * dispatched - */ - constructor(type, target) { - this.target = target; - this.type = type; - } - } - - /** - * Class representing a message event. - * - * @extends Event - * @private - */ - class MessageEvent extends Event { - /** - * Create a new `MessageEvent`. - * - * @param {(String|Buffer|ArrayBuffer|Buffer[])} data The received data - * @param {WebSocket} target A reference to the target to which the event was - * dispatched - */ - constructor(data, target) { - super('message', target); - - this.data = data; - } - } - - /** - * Class representing a close event. - * - * @extends Event - * @private - */ - class CloseEvent extends Event { - /** - * Create a new `CloseEvent`. - * - * @param {Number} code The status code explaining why the connection is being - * closed - * @param {String} reason A human-readable string explaining why the - * connection is closing - * @param {WebSocket} target A reference to the target to which the event was - * dispatched - */ - constructor(code, reason, target) { - super('close', target); - - this.wasClean = target._closeFrameReceived && target._closeFrameSent; - this.reason = reason; - this.code = code; - } - } - - /** - * Class representing an open event. - * - * @extends Event - * @private - */ - class OpenEvent extends Event { - /** - * Create a new `OpenEvent`. - * - * @param {WebSocket} target A reference to the target to which the event was - * dispatched - */ - constructor(target) { - super('open', target); - } - } - - /** - * Class representing an error event. - * - * @extends Event - * @private - */ - class ErrorEvent extends Event { - /** - * Create a new `ErrorEvent`. - * - * @param {Object} error The error that generated this event - * @param {WebSocket} target A reference to the target to which the event was - * dispatched - */ - constructor(error, target) { - super('error', target); - - this.message = error.message; - this.error = error; - } - } - - /** - * This provides methods for emulating the `EventTarget` interface. It's not - * meant to be used directly. - * - * @mixin - */ - const EventTarget = { - /** - * Register an event listener. - * - * @param {String} type A string representing the event type to listen for - * @param {Function} listener The listener to add - * @param {Object} [options] An options object specifies characteristics about - * the event listener - * @param {Boolean} [options.once=false] A `Boolean`` indicating that the - * listener should be invoked at most once after being added. If `true`, - * the listener would be automatically removed when invoked. - * @public - */ - addEventListener(type, listener, options) { - if (typeof listener !== 'function') return; - - function onMessage(data) { - listener.call(this, new MessageEvent(data, this)); - } - - function onClose(code, message) { - listener.call(this, new CloseEvent(code, message, this)); - } - - function onError(error) { - listener.call(this, new ErrorEvent(error, this)); - } - - function onOpen() { - listener.call(this, new OpenEvent(this)); - } - - const method = options && options.once ? 'once' : 'on'; - - if (type === 'message') { - onMessage._listener = listener; - this[method](type, onMessage); - } else if (type === 'close') { - onClose._listener = listener; - this[method](type, onClose); - } else if (type === 'error') { - onError._listener = listener; - this[method](type, onError); - } else if (type === 'open') { - onOpen._listener = listener; - this[method](type, onOpen); - } else { - this[method](type, listener); - } - }, - - /** - * Remove an event listener. - * - * @param {String} type A string representing the event type to remove - * @param {Function} listener The listener to remove - * @public - */ - removeEventListener(type, listener) { - const listeners = this.listeners(type); - - for (let i = 0; i < listeners.length; i++) { - if (listeners[i] === listener || listeners[i]._listener === listener) { - this.removeListener(type, listeners[i]); - } - } - } - }; - - var eventTarget = EventTarget; - - // - // Allowed token characters: - // - // '!', '#', '$', '%', '&', ''', '*', '+', '-', - // '.', 0-9, A-Z, '^', '_', '`', a-z, '|', '~' - // - // tokenChars[32] === 0 // ' ' - // tokenChars[33] === 1 // '!' - // tokenChars[34] === 0 // '"' - // ... - // - // prettier-ignore - const tokenChars = [ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0 - 15 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 16 - 31 - 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, // 32 - 47 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, // 48 - 63 - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 64 - 79 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, // 80 - 95 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 96 - 111 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0 // 112 - 127 - ]; - - /** - * Adds an offer to the map of extension offers or a parameter to the map of - * parameters. - * - * @param {Object} dest The map of extension offers or parameters - * @param {String} name The extension or parameter name - * @param {(Object|Boolean|String)} elem The extension parameters or the - * parameter value - * @private - */ - function push(dest, name, elem) { - if (dest[name] === undefined) dest[name] = [elem]; - else dest[name].push(elem); - } - - /** - * Parses the `Sec-WebSocket-Extensions` header into an object. - * - * @param {String} header The field value of the header - * @return {Object} The parsed object - * @public - */ - function parse(header) { - const offers = Object.create(null); - - if (header === undefined || header === '') return offers; - - let params = Object.create(null); - let mustUnescape = false; - let isEscaping = false; - let inQuotes = false; - let extensionName; - let paramName; - let start = -1; - let end = -1; - let i = 0; - - for (; i < header.length; i++) { - const code = header.charCodeAt(i); - - if (extensionName === undefined) { - if (end === -1 && tokenChars[code] === 1) { - if (start === -1) start = i; - } else if (code === 0x20 /* ' ' */ || code === 0x09 /* '\t' */) { - if (end === -1 && start !== -1) end = i; - } else if (code === 0x3b /* ';' */ || code === 0x2c /* ',' */) { - if (start === -1) { - throw new SyntaxError(`Unexpected character at index ${i}`); - } - - if (end === -1) end = i; - const name = header.slice(start, end); - if (code === 0x2c) { - push(offers, name, params); - params = Object.create(null); - } else { - extensionName = name; - } - - start = end = -1; - } else { - throw new SyntaxError(`Unexpected character at index ${i}`); - } - } else if (paramName === undefined) { - if (end === -1 && tokenChars[code] === 1) { - if (start === -1) start = i; - } else if (code === 0x20 || code === 0x09) { - if (end === -1 && start !== -1) end = i; - } else if (code === 0x3b || code === 0x2c) { - if (start === -1) { - throw new SyntaxError(`Unexpected character at index ${i}`); - } - - if (end === -1) end = i; - push(params, header.slice(start, end), true); - if (code === 0x2c) { - push(offers, extensionName, params); - params = Object.create(null); - extensionName = undefined; - } - - start = end = -1; - } else if (code === 0x3d /* '=' */ && start !== -1 && end === -1) { - paramName = header.slice(start, i); - start = end = -1; - } else { - throw new SyntaxError(`Unexpected character at index ${i}`); - } - } else { - // - // The value of a quoted-string after unescaping must conform to the - // token ABNF, so only token characters are valid. - // Ref: https://tools.ietf.org/html/rfc6455#section-9.1 - // - if (isEscaping) { - if (tokenChars[code] !== 1) { - throw new SyntaxError(`Unexpected character at index ${i}`); - } - if (start === -1) start = i; - else if (!mustUnescape) mustUnescape = true; - isEscaping = false; - } else if (inQuotes) { - if (tokenChars[code] === 1) { - if (start === -1) start = i; - } else if (code === 0x22 /* '"' */ && start !== -1) { - inQuotes = false; - end = i; - } else if (code === 0x5c /* '\' */) { - isEscaping = true; - } else { - throw new SyntaxError(`Unexpected character at index ${i}`); - } - } else if (code === 0x22 && header.charCodeAt(i - 1) === 0x3d) { - inQuotes = true; - } else if (end === -1 && tokenChars[code] === 1) { - if (start === -1) start = i; - } else if (start !== -1 && (code === 0x20 || code === 0x09)) { - if (end === -1) end = i; - } else if (code === 0x3b || code === 0x2c) { - if (start === -1) { - throw new SyntaxError(`Unexpected character at index ${i}`); - } - - if (end === -1) end = i; - let value = header.slice(start, end); - if (mustUnescape) { - value = value.replace(/\\/g, ''); - mustUnescape = false; - } - push(params, paramName, value); - if (code === 0x2c) { - push(offers, extensionName, params); - params = Object.create(null); - extensionName = undefined; - } - - paramName = undefined; - start = end = -1; - } else { - throw new SyntaxError(`Unexpected character at index ${i}`); - } - } - } - - if (start === -1 || inQuotes) { - throw new SyntaxError('Unexpected end of input'); - } - - if (end === -1) end = i; - const token = header.slice(start, end); - if (extensionName === undefined) { - push(offers, token, params); - } else { - if (paramName === undefined) { - push(params, token, true); - } else if (mustUnescape) { - push(params, paramName, token.replace(/\\/g, '')); - } else { - push(params, paramName, token); - } - push(offers, extensionName, params); - } - - return offers; - } - - /** - * Builds the `Sec-WebSocket-Extensions` header field value. - * - * @param {Object} extensions The map of extensions and parameters to format - * @return {String} A string representing the given object - * @public - */ - function format(extensions) { - return Object.keys(extensions) - .map((extension) => { - let configurations = extensions[extension]; - if (!Array.isArray(configurations)) configurations = [configurations]; - return configurations - .map((params) => { - return [extension] - .concat( - Object.keys(params).map((k) => { - let values = params[k]; - if (!Array.isArray(values)) values = [values]; - return values - .map((v) => (v === true ? k : `${k}=${v}`)) - .join('; '); - }) - ) - .join('; '); - }) - .join(', '); - }) - .join(', '); - } - - var extension = { format, parse }; - - const { randomBytes, createHash } = crypto; - const { URL } = url; - - - - - const { - BINARY_TYPES: BINARY_TYPES$1, - EMPTY_BUFFER: EMPTY_BUFFER$2, - GUID, - kStatusCode: kStatusCode$2, - kWebSocket: kWebSocket$1, - NOOP: NOOP$1 - } = constants; - const { addEventListener, removeEventListener } = eventTarget; - const { format: format$1, parse: parse$1 } = extension; - const { toBuffer: toBuffer$1 } = bufferUtil; - - const readyStates = ['CONNECTING', 'OPEN', 'CLOSING', 'CLOSED']; - const protocolVersions = [8, 13]; - const closeTimeout = 30 * 1000; - - /** - * Class representing a WebSocket. - * - * @extends EventEmitter - */ - class WebSocket extends events { - /** - * Create a new `WebSocket`. - * - * @param {(String|URL)} address The URL to which to connect - * @param {(String|String[])} [protocols] The subprotocols - * @param {Object} [options] Connection options - */ - constructor(address, protocols, options) { - super(); - - this._binaryType = BINARY_TYPES$1[0]; - this._closeCode = 1006; - this._closeFrameReceived = false; - this._closeFrameSent = false; - this._closeMessage = ''; - this._closeTimer = null; - this._extensions = {}; - this._protocol = ''; - this._readyState = WebSocket.CONNECTING; - this._receiver = null; - this._sender = null; - this._socket = null; - - if (address !== null) { - this._bufferedAmount = 0; - this._isServer = false; - this._redirects = 0; - - if (Array.isArray(protocols)) { - protocols = protocols.join(', '); - } else if (typeof protocols === 'object' && protocols !== null) { - options = protocols; - protocols = undefined; - } - - initAsClient(this, address, protocols, options); - } else { - this._isServer = true; - } - } - - /** - * This deviates from the WHATWG interface since ws doesn't support the - * required default "blob" type (instead we define a custom "nodebuffer" - * type). - * - * @type {String} - */ - get binaryType() { - return this._binaryType; - } - - set binaryType(type) { - if (!BINARY_TYPES$1.includes(type)) return; - - this._binaryType = type; - - // - // Allow to change `binaryType` on the fly. - // - if (this._receiver) this._receiver._binaryType = type; - } - - /** - * @type {Number} - */ - get bufferedAmount() { - if (!this._socket) return this._bufferedAmount; - - return this._socket._writableState.length + this._sender._bufferedBytes; - } - - /** - * @type {String} - */ - get extensions() { - return Object.keys(this._extensions).join(); - } - - /** - * @type {Function} - */ - /* istanbul ignore next */ - get onclose() { - return undefined; - } - - /* istanbul ignore next */ - set onclose(listener) {} - - /** - * @type {Function} - */ - /* istanbul ignore next */ - get onerror() { - return undefined; - } - - /* istanbul ignore next */ - set onerror(listener) {} - - /** - * @type {Function} - */ - /* istanbul ignore next */ - get onopen() { - return undefined; - } - - /* istanbul ignore next */ - set onopen(listener) {} - - /** - * @type {Function} - */ - /* istanbul ignore next */ - get onmessage() { - return undefined; - } - - /* istanbul ignore next */ - set onmessage(listener) {} - - /** - * @type {String} - */ - get protocol() { - return this._protocol; - } - - /** - * @type {Number} - */ - get readyState() { - return this._readyState; - } - - /** - * @type {String} - */ - get url() { - return this._url; - } - - /** - * Set up the socket and the internal resources. - * - * @param {(net.Socket|tls.Socket)} socket The network socket between the - * server and client - * @param {Buffer} head The first packet of the upgraded stream - * @param {Number} [maxPayload=0] The maximum allowed message size - * @private - */ - setSocket(socket, head, maxPayload) { - const receiver$1 = new receiver( - this.binaryType, - this._extensions, - this._isServer, - maxPayload - ); - - this._sender = new sender(socket, this._extensions); - this._receiver = receiver$1; - this._socket = socket; - - receiver$1[kWebSocket$1] = this; - socket[kWebSocket$1] = this; - - receiver$1.on('conclude', receiverOnConclude); - receiver$1.on('drain', receiverOnDrain); - receiver$1.on('error', receiverOnError); - receiver$1.on('message', receiverOnMessage); - receiver$1.on('ping', receiverOnPing); - receiver$1.on('pong', receiverOnPong); - - socket.setTimeout(0); - socket.setNoDelay(); - - if (head.length > 0) socket.unshift(head); - - socket.on('close', socketOnClose); - socket.on('data', socketOnData); - socket.on('end', socketOnEnd); - socket.on('error', socketOnError); - - this._readyState = WebSocket.OPEN; - this.emit('open'); - } - - /** - * Emit the `'close'` event. - * - * @private - */ - emitClose() { - if (!this._socket) { - this._readyState = WebSocket.CLOSED; - this.emit('close', this._closeCode, this._closeMessage); - return; - } - - if (this._extensions[permessageDeflate.extensionName]) { - this._extensions[permessageDeflate.extensionName].cleanup(); - } - - this._receiver.removeAllListeners(); - this._readyState = WebSocket.CLOSED; - this.emit('close', this._closeCode, this._closeMessage); - } - - /** - * Start a closing handshake. - * - * +----------+ +-----------+ +----------+ - * - - -|ws.close()|-->|close frame|-->|ws.close()|- - - - * | +----------+ +-----------+ +----------+ | - * +----------+ +-----------+ | - * CLOSING |ws.close()|<--|close frame|<--+-----+ CLOSING - * +----------+ +-----------+ | - * | | | +---+ | - * +------------------------+-->|fin| - - - - - * | +---+ | +---+ - * - - - - -|fin|<---------------------+ - * +---+ - * - * @param {Number} [code] Status code explaining why the connection is closing - * @param {String} [data] A string explaining why the connection is closing - * @public - */ - close(code, data) { - if (this.readyState === WebSocket.CLOSED) return; - if (this.readyState === WebSocket.CONNECTING) { - const msg = 'WebSocket was closed before the connection was established'; - return abortHandshake(this, this._req, msg); - } - - if (this.readyState === WebSocket.CLOSING) { - if ( - this._closeFrameSent && - (this._closeFrameReceived || this._receiver._writableState.errorEmitted) - ) { - this._socket.end(); - } - - return; - } - - this._readyState = WebSocket.CLOSING; - this._sender.close(code, data, !this._isServer, (err) => { - // - // This error is handled by the `'error'` listener on the socket. We only - // want to know if the close frame has been sent here. - // - if (err) return; - - this._closeFrameSent = true; - - if ( - this._closeFrameReceived || - this._receiver._writableState.errorEmitted - ) { - this._socket.end(); - } - }); - - // - // Specify a timeout for the closing handshake to complete. - // - this._closeTimer = setTimeout( - this._socket.destroy.bind(this._socket), - closeTimeout - ); - } - - /** - * Send a ping. - * - * @param {*} [data] The data to send - * @param {Boolean} [mask] Indicates whether or not to mask `data` - * @param {Function} [cb] Callback which is executed when the ping is sent - * @public - */ - ping(data, mask, cb) { - if (this.readyState === WebSocket.CONNECTING) { - throw new Error('WebSocket is not open: readyState 0 (CONNECTING)'); - } - - if (typeof data === 'function') { - cb = data; - data = mask = undefined; - } else if (typeof mask === 'function') { - cb = mask; - mask = undefined; - } - - if (typeof data === 'number') data = data.toString(); - - if (this.readyState !== WebSocket.OPEN) { - sendAfterClose(this, data, cb); - return; - } - - if (mask === undefined) mask = !this._isServer; - this._sender.ping(data || EMPTY_BUFFER$2, mask, cb); - } - - /** - * Send a pong. - * - * @param {*} [data] The data to send - * @param {Boolean} [mask] Indicates whether or not to mask `data` - * @param {Function} [cb] Callback which is executed when the pong is sent - * @public - */ - pong(data, mask, cb) { - if (this.readyState === WebSocket.CONNECTING) { - throw new Error('WebSocket is not open: readyState 0 (CONNECTING)'); - } - - if (typeof data === 'function') { - cb = data; - data = mask = undefined; - } else if (typeof mask === 'function') { - cb = mask; - mask = undefined; - } - - if (typeof data === 'number') data = data.toString(); - - if (this.readyState !== WebSocket.OPEN) { - sendAfterClose(this, data, cb); - return; - } - - if (mask === undefined) mask = !this._isServer; - this._sender.pong(data || EMPTY_BUFFER$2, mask, cb); - } - - /** - * Send a data message. - * - * @param {*} data The message to send - * @param {Object} [options] Options object - * @param {Boolean} [options.compress] Specifies whether or not to compress - * `data` - * @param {Boolean} [options.binary] Specifies whether `data` is binary or - * text - * @param {Boolean} [options.fin=true] Specifies whether the fragment is the - * last one - * @param {Boolean} [options.mask] Specifies whether or not to mask `data` - * @param {Function} [cb] Callback which is executed when data is written out - * @public - */ - send(data, options, cb) { - if (this.readyState === WebSocket.CONNECTING) { - throw new Error('WebSocket is not open: readyState 0 (CONNECTING)'); - } - - if (typeof options === 'function') { - cb = options; - options = {}; - } - - if (typeof data === 'number') data = data.toString(); - - if (this.readyState !== WebSocket.OPEN) { - sendAfterClose(this, data, cb); - return; - } - - const opts = { - binary: typeof data !== 'string', - mask: !this._isServer, - compress: true, - fin: true, - ...options - }; - - if (!this._extensions[permessageDeflate.extensionName]) { - opts.compress = false; - } - - this._sender.send(data || EMPTY_BUFFER$2, opts, cb); - } - - /** - * Forcibly close the connection. - * - * @public - */ - terminate() { - if (this.readyState === WebSocket.CLOSED) return; - if (this.readyState === WebSocket.CONNECTING) { - const msg = 'WebSocket was closed before the connection was established'; - return abortHandshake(this, this._req, msg); - } - - if (this._socket) { - this._readyState = WebSocket.CLOSING; - this._socket.destroy(); - } - } - } - - /** - * @constant {Number} CONNECTING - * @memberof WebSocket - */ - Object.defineProperty(WebSocket, 'CONNECTING', { - enumerable: true, - value: readyStates.indexOf('CONNECTING') - }); - - /** - * @constant {Number} CONNECTING - * @memberof WebSocket.prototype - */ - Object.defineProperty(WebSocket.prototype, 'CONNECTING', { - enumerable: true, - value: readyStates.indexOf('CONNECTING') - }); - - /** - * @constant {Number} OPEN - * @memberof WebSocket - */ - Object.defineProperty(WebSocket, 'OPEN', { - enumerable: true, - value: readyStates.indexOf('OPEN') - }); - - /** - * @constant {Number} OPEN - * @memberof WebSocket.prototype - */ - Object.defineProperty(WebSocket.prototype, 'OPEN', { - enumerable: true, - value: readyStates.indexOf('OPEN') - }); - - /** - * @constant {Number} CLOSING - * @memberof WebSocket - */ - Object.defineProperty(WebSocket, 'CLOSING', { - enumerable: true, - value: readyStates.indexOf('CLOSING') - }); - - /** - * @constant {Number} CLOSING - * @memberof WebSocket.prototype - */ - Object.defineProperty(WebSocket.prototype, 'CLOSING', { - enumerable: true, - value: readyStates.indexOf('CLOSING') - }); - - /** - * @constant {Number} CLOSED - * @memberof WebSocket - */ - Object.defineProperty(WebSocket, 'CLOSED', { - enumerable: true, - value: readyStates.indexOf('CLOSED') - }); - - /** - * @constant {Number} CLOSED - * @memberof WebSocket.prototype - */ - Object.defineProperty(WebSocket.prototype, 'CLOSED', { - enumerable: true, - value: readyStates.indexOf('CLOSED') - }); - - [ - 'binaryType', - 'bufferedAmount', - 'extensions', - 'protocol', - 'readyState', - 'url' - ].forEach((property) => { - Object.defineProperty(WebSocket.prototype, property, { enumerable: true }); - }); - - // - // Add the `onopen`, `onerror`, `onclose`, and `onmessage` attributes. - // See https://html.spec.whatwg.org/multipage/comms.html#the-websocket-interface - // - ['open', 'error', 'close', 'message'].forEach((method) => { - Object.defineProperty(WebSocket.prototype, `on${method}`, { - enumerable: true, - get() { - const listeners = this.listeners(method); - for (let i = 0; i < listeners.length; i++) { - if (listeners[i]._listener) return listeners[i]._listener; - } - - return undefined; - }, - set(listener) { - const listeners = this.listeners(method); - for (let i = 0; i < listeners.length; i++) { - // - // Remove only the listeners added via `addEventListener`. - // - if (listeners[i]._listener) this.removeListener(method, listeners[i]); - } - this.addEventListener(method, listener); - } - }); - }); - - WebSocket.prototype.addEventListener = addEventListener; - WebSocket.prototype.removeEventListener = removeEventListener; - - var websocket = WebSocket; - - /** - * Initialize a WebSocket client. - * - * @param {WebSocket} websocket The client to initialize - * @param {(String|URL)} address The URL to which to connect - * @param {String} [protocols] The subprotocols - * @param {Object} [options] Connection options - * @param {(Boolean|Object)} [options.perMessageDeflate=true] Enable/disable - * permessage-deflate - * @param {Number} [options.handshakeTimeout] Timeout in milliseconds for the - * handshake request - * @param {Number} [options.protocolVersion=13] Value of the - * `Sec-WebSocket-Version` header - * @param {String} [options.origin] Value of the `Origin` or - * `Sec-WebSocket-Origin` header - * @param {Number} [options.maxPayload=104857600] The maximum allowed message - * size - * @param {Boolean} [options.followRedirects=false] Whether or not to follow - * redirects - * @param {Number} [options.maxRedirects=10] The maximum number of redirects - * allowed - * @private - */ - function initAsClient(websocket, address, protocols, options) { - const opts = { - protocolVersion: protocolVersions[1], - maxPayload: 100 * 1024 * 1024, - perMessageDeflate: true, - followRedirects: false, - maxRedirects: 10, - ...options, - createConnection: undefined, - socketPath: undefined, - hostname: undefined, - protocol: undefined, - timeout: undefined, - method: undefined, - host: undefined, - path: undefined, - port: undefined - }; - - if (!protocolVersions.includes(opts.protocolVersion)) { - throw new RangeError( - `Unsupported protocol version: ${opts.protocolVersion} ` + - `(supported versions: ${protocolVersions.join(', ')})` - ); - } - - let parsedUrl; - - if (address instanceof URL) { - parsedUrl = address; - websocket._url = address.href; - } else { - parsedUrl = new URL(address); - websocket._url = address; - } - - const isUnixSocket = parsedUrl.protocol === 'ws+unix:'; - - if (!parsedUrl.host && (!isUnixSocket || !parsedUrl.pathname)) { - const err = new Error(`Invalid URL: ${websocket.url}`); - - if (websocket._redirects === 0) { - throw err; - } else { - emitErrorAndClose(websocket, err); - return; - } - } - - const isSecure = - parsedUrl.protocol === 'wss:' || parsedUrl.protocol === 'https:'; - const defaultPort = isSecure ? 443 : 80; - const key = randomBytes(16).toString('base64'); - const get = isSecure ? https.get : http.get; - let perMessageDeflate; - - opts.createConnection = isSecure ? tlsConnect : netConnect; - opts.defaultPort = opts.defaultPort || defaultPort; - opts.port = parsedUrl.port || defaultPort; - opts.host = parsedUrl.hostname.startsWith('[') - ? parsedUrl.hostname.slice(1, -1) - : parsedUrl.hostname; - opts.headers = { - 'Sec-WebSocket-Version': opts.protocolVersion, - 'Sec-WebSocket-Key': key, - Connection: 'Upgrade', - Upgrade: 'websocket', - ...opts.headers - }; - opts.path = parsedUrl.pathname + parsedUrl.search; - opts.timeout = opts.handshakeTimeout; - - if (opts.perMessageDeflate) { - perMessageDeflate = new permessageDeflate( - opts.perMessageDeflate !== true ? opts.perMessageDeflate : {}, - false, - opts.maxPayload - ); - opts.headers['Sec-WebSocket-Extensions'] = format$1({ - [permessageDeflate.extensionName]: perMessageDeflate.offer() - }); - } - if (protocols) { - opts.headers['Sec-WebSocket-Protocol'] = protocols; - } - if (opts.origin) { - if (opts.protocolVersion < 13) { - opts.headers['Sec-WebSocket-Origin'] = opts.origin; - } else { - opts.headers.Origin = opts.origin; - } - } - if (parsedUrl.username || parsedUrl.password) { - opts.auth = `${parsedUrl.username}:${parsedUrl.password}`; - } - - if (isUnixSocket) { - const parts = opts.path.split(':'); - - opts.socketPath = parts[0]; - opts.path = parts[1]; - } - - if (opts.followRedirects) { - if (websocket._redirects === 0) { - websocket._originalUnixSocket = isUnixSocket; - websocket._originalSecure = isSecure; - websocket._originalHostOrSocketPath = isUnixSocket - ? opts.socketPath - : parsedUrl.host; - - const headers = options && options.headers; - - // - // Shallow copy the user provided options so that headers can be changed - // without mutating the original object. - // - options = { ...options, headers: {} }; - - if (headers) { - for (const [key, value] of Object.entries(headers)) { - options.headers[key.toLowerCase()] = value; - } - } - } else { - const isSameHost = isUnixSocket - ? websocket._originalUnixSocket - ? opts.socketPath === websocket._originalHostOrSocketPath - : false - : websocket._originalUnixSocket - ? false - : parsedUrl.host === websocket._originalHostOrSocketPath; - - if (!isSameHost || (websocket._originalSecure && !isSecure)) { - // - // Match curl 7.77.0 behavior and drop the following headers. These - // headers are also dropped when following a redirect to a subdomain. - // - delete opts.headers.authorization; - delete opts.headers.cookie; - - if (!isSameHost) delete opts.headers.host; - - opts.auth = undefined; - } - } - - // - // Match curl 7.77.0 behavior and make the first `Authorization` header win. - // If the `Authorization` header is set, then there is nothing to do as it - // will take precedence. - // - if (opts.auth && !options.headers.authorization) { - options.headers.authorization = - 'Basic ' + Buffer.from(opts.auth).toString('base64'); - } - } - - let req = (websocket._req = get(opts)); - - if (opts.timeout) { - req.on('timeout', () => { - abortHandshake(websocket, req, 'Opening handshake has timed out'); - }); - } - - req.on('error', (err) => { - if (req === null || req.aborted) return; - - req = websocket._req = null; - emitErrorAndClose(websocket, err); - }); - - req.on('response', (res) => { - const location = res.headers.location; - const statusCode = res.statusCode; - - if ( - location && - opts.followRedirects && - statusCode >= 300 && - statusCode < 400 - ) { - if (++websocket._redirects > opts.maxRedirects) { - abortHandshake(websocket, req, 'Maximum redirects exceeded'); - return; - } - - req.abort(); - - let addr; - - try { - addr = new URL(location, address); - } catch (err) { - emitErrorAndClose(websocket, err); - return; - } - - initAsClient(websocket, addr, protocols, options); - } else if (!websocket.emit('unexpected-response', req, res)) { - abortHandshake( - websocket, - req, - `Unexpected server response: ${res.statusCode}` - ); - } - }); - - req.on('upgrade', (res, socket, head) => { - websocket.emit('upgrade', res); - - // - // The user may have closed the connection from a listener of the `upgrade` - // event. - // - if (websocket.readyState !== WebSocket.CONNECTING) return; - - req = websocket._req = null; - - if (res.headers.upgrade.toLowerCase() !== 'websocket') { - abortHandshake(websocket, socket, 'Invalid Upgrade header'); - return; - } - - const digest = createHash('sha1') - .update(key + GUID) - .digest('base64'); - - if (res.headers['sec-websocket-accept'] !== digest) { - abortHandshake(websocket, socket, 'Invalid Sec-WebSocket-Accept header'); - return; - } - - const serverProt = res.headers['sec-websocket-protocol']; - const protList = (protocols || '').split(/, */); - let protError; - - if (!protocols && serverProt) { - protError = 'Server sent a subprotocol but none was requested'; - } else if (protocols && !serverProt) { - protError = 'Server sent no subprotocol'; - } else if (serverProt && !protList.includes(serverProt)) { - protError = 'Server sent an invalid subprotocol'; - } - - if (protError) { - abortHandshake(websocket, socket, protError); - return; - } - - if (serverProt) websocket._protocol = serverProt; - - const secWebSocketExtensions = res.headers['sec-websocket-extensions']; - - if (secWebSocketExtensions !== undefined) { - if (!perMessageDeflate) { - const message = - 'Server sent a Sec-WebSocket-Extensions header but no extension ' + - 'was requested'; - abortHandshake(websocket, socket, message); - return; - } - - let extensions; - - try { - extensions = parse$1(secWebSocketExtensions); - } catch (err) { - const message = 'Invalid Sec-WebSocket-Extensions header'; - abortHandshake(websocket, socket, message); - return; - } - - const extensionNames = Object.keys(extensions); - - if (extensionNames.length) { - if ( - extensionNames.length !== 1 || - extensionNames[0] !== permessageDeflate.extensionName - ) { - const message = - 'Server indicated an extension that was not requested'; - abortHandshake(websocket, socket, message); - return; - } - - try { - perMessageDeflate.accept(extensions[permessageDeflate.extensionName]); - } catch (err) { - const message = 'Invalid Sec-WebSocket-Extensions header'; - abortHandshake(websocket, socket, message); - return; - } - - websocket._extensions[permessageDeflate.extensionName] = - perMessageDeflate; - } - } - - websocket.setSocket(socket, head, opts.maxPayload); - }); - } - - /** - * Emit the `'error'` and `'close'` event. - * - * @param {WebSocket} websocket The WebSocket instance - * @param {Error} The error to emit - * @private - */ - function emitErrorAndClose(websocket, err) { - websocket._readyState = WebSocket.CLOSING; - websocket.emit('error', err); - websocket.emitClose(); - } - - /** - * Create a `net.Socket` and initiate a connection. - * - * @param {Object} options Connection options - * @return {net.Socket} The newly created socket used to start the connection - * @private - */ - function netConnect(options) { - options.path = options.socketPath; - return net.connect(options); - } - - /** - * Create a `tls.TLSSocket` and initiate a connection. - * - * @param {Object} options Connection options - * @return {tls.TLSSocket} The newly created socket used to start the connection - * @private - */ - function tlsConnect(options) { - options.path = undefined; - - if (!options.servername && options.servername !== '') { - options.servername = net.isIP(options.host) ? '' : options.host; - } - - return tls.connect(options); - } - - /** - * Abort the handshake and emit an error. - * - * @param {WebSocket} websocket The WebSocket instance - * @param {(http.ClientRequest|net.Socket|tls.Socket)} stream The request to - * abort or the socket to destroy - * @param {String} message The error message - * @private - */ - function abortHandshake(websocket, stream, message) { - websocket._readyState = WebSocket.CLOSING; - - const err = new Error(message); - Error.captureStackTrace(err, abortHandshake); - - if (stream.setHeader) { - stream.abort(); - - if (stream.socket && !stream.socket.destroyed) { - // - // On Node.js >= 14.3.0 `request.abort()` does not destroy the socket if - // called after the request completed. See - // https://github.com/websockets/ws/issues/1869. - // - stream.socket.destroy(); - } - - stream.once('abort', websocket.emitClose.bind(websocket)); - websocket.emit('error', err); - } else { - stream.destroy(err); - stream.once('error', websocket.emit.bind(websocket, 'error')); - stream.once('close', websocket.emitClose.bind(websocket)); - } - } - - /** - * Handle cases where the `ping()`, `pong()`, or `send()` methods are called - * when the `readyState` attribute is `CLOSING` or `CLOSED`. - * - * @param {WebSocket} websocket The WebSocket instance - * @param {*} [data] The data to send - * @param {Function} [cb] Callback - * @private - */ - function sendAfterClose(websocket, data, cb) { - if (data) { - const length = toBuffer$1(data).length; - - // - // The `_bufferedAmount` property is used only when the peer is a client and - // the opening handshake fails. Under these circumstances, in fact, the - // `setSocket()` method is not called, so the `_socket` and `_sender` - // properties are set to `null`. - // - if (websocket._socket) websocket._sender._bufferedBytes += length; - else websocket._bufferedAmount += length; - } - - if (cb) { - const err = new Error( - `WebSocket is not open: readyState ${websocket.readyState} ` + - `(${readyStates[websocket.readyState]})` - ); - cb(err); - } - } - - /** - * The listener of the `Receiver` `'conclude'` event. - * - * @param {Number} code The status code - * @param {String} reason The reason for closing - * @private - */ - function receiverOnConclude(code, reason) { - const websocket = this[kWebSocket$1]; - - websocket._closeFrameReceived = true; - websocket._closeMessage = reason; - websocket._closeCode = code; - - if (websocket._socket[kWebSocket$1] === undefined) return; - - websocket._socket.removeListener('data', socketOnData); - process.nextTick(resume, websocket._socket); - - if (code === 1005) websocket.close(); - else websocket.close(code, reason); - } - - /** - * The listener of the `Receiver` `'drain'` event. - * - * @private - */ - function receiverOnDrain() { - this[kWebSocket$1]._socket.resume(); - } - - /** - * The listener of the `Receiver` `'error'` event. - * - * @param {(RangeError|Error)} err The emitted error - * @private - */ - function receiverOnError(err) { - const websocket = this[kWebSocket$1]; - - if (websocket._socket[kWebSocket$1] !== undefined) { - websocket._socket.removeListener('data', socketOnData); - - // - // On Node.js < 14.0.0 the `'error'` event is emitted synchronously. See - // https://github.com/websockets/ws/issues/1940. - // - process.nextTick(resume, websocket._socket); - - websocket.close(err[kStatusCode$2]); - } - - websocket.emit('error', err); - } - - /** - * The listener of the `Receiver` `'finish'` event. - * - * @private - */ - function receiverOnFinish() { - this[kWebSocket$1].emitClose(); - } - - /** - * The listener of the `Receiver` `'message'` event. - * - * @param {(String|Buffer|ArrayBuffer|Buffer[])} data The message - * @private - */ - function receiverOnMessage(data) { - this[kWebSocket$1].emit('message', data); - } - - /** - * The listener of the `Receiver` `'ping'` event. - * - * @param {Buffer} data The data included in the ping frame - * @private - */ - function receiverOnPing(data) { - const websocket = this[kWebSocket$1]; - - websocket.pong(data, !websocket._isServer, NOOP$1); - websocket.emit('ping', data); - } - - /** - * The listener of the `Receiver` `'pong'` event. - * - * @param {Buffer} data The data included in the pong frame - * @private - */ - function receiverOnPong(data) { - this[kWebSocket$1].emit('pong', data); - } - - /** - * Resume a readable stream - * - * @param {Readable} stream The readable stream - * @private - */ - function resume(stream) { - stream.resume(); - } - - /** - * The listener of the `net.Socket` `'close'` event. - * - * @private - */ - function socketOnClose() { - const websocket = this[kWebSocket$1]; - - this.removeListener('close', socketOnClose); - this.removeListener('data', socketOnData); - this.removeListener('end', socketOnEnd); - - websocket._readyState = WebSocket.CLOSING; - - let chunk; - - // - // The close frame might not have been received or the `'end'` event emitted, - // for example, if the socket was destroyed due to an error. Ensure that the - // `receiver` stream is closed after writing any remaining buffered data to - // it. If the readable side of the socket is in flowing mode then there is no - // buffered data as everything has been already written and `readable.read()` - // will return `null`. If instead, the socket is paused, any possible buffered - // data will be read as a single chunk. - // - if ( - !this._readableState.endEmitted && - !websocket._closeFrameReceived && - !websocket._receiver._writableState.errorEmitted && - (chunk = websocket._socket.read()) !== null - ) { - websocket._receiver.write(chunk); - } - - websocket._receiver.end(); - - this[kWebSocket$1] = undefined; - - clearTimeout(websocket._closeTimer); - - if ( - websocket._receiver._writableState.finished || - websocket._receiver._writableState.errorEmitted - ) { - websocket.emitClose(); - } else { - websocket._receiver.on('error', receiverOnFinish); - websocket._receiver.on('finish', receiverOnFinish); - } - } - - /** - * The listener of the `net.Socket` `'data'` event. - * - * @param {Buffer} chunk A chunk of data - * @private - */ - function socketOnData(chunk) { - if (!this[kWebSocket$1]._receiver.write(chunk)) { - this.pause(); - } - } - - /** - * The listener of the `net.Socket` `'end'` event. - * - * @private - */ - function socketOnEnd() { - const websocket = this[kWebSocket$1]; - - websocket._readyState = WebSocket.CLOSING; - websocket._receiver.end(); - this.end(); - } - - /** - * The listener of the `net.Socket` `'error'` event. - * - * @private - */ - function socketOnError() { - const websocket = this[kWebSocket$1]; - - this.removeListener('error', socketOnError); - this.on('error', NOOP$1); - - if (websocket) { - websocket._readyState = WebSocket.CLOSING; - this.destroy(); - } - } - - const { Duplex } = stream$1; - - /** - * Emits the `'close'` event on a stream. - * - * @param {Duplex} stream The stream. - * @private - */ - function emitClose(stream) { - stream.emit('close'); - } - - /** - * The listener of the `'end'` event. - * - * @private - */ - function duplexOnEnd() { - if (!this.destroyed && this._writableState.finished) { - this.destroy(); - } - } - - /** - * The listener of the `'error'` event. - * - * @param {Error} err The error - * @private - */ - function duplexOnError(err) { - this.removeListener('error', duplexOnError); - this.destroy(); - if (this.listenerCount('error') === 0) { - // Do not suppress the throwing behavior. - this.emit('error', err); - } - } - - /** - * Wraps a `WebSocket` in a duplex stream. - * - * @param {WebSocket} ws The `WebSocket` to wrap - * @param {Object} [options] The options for the `Duplex` constructor - * @return {Duplex} The duplex stream - * @public - */ - function createWebSocketStream(ws, options) { - let resumeOnReceiverDrain = true; - let terminateOnDestroy = true; - - function receiverOnDrain() { - if (resumeOnReceiverDrain) ws._socket.resume(); - } - - if (ws.readyState === ws.CONNECTING) { - ws.once('open', function open() { - ws._receiver.removeAllListeners('drain'); - ws._receiver.on('drain', receiverOnDrain); - }); - } else { - ws._receiver.removeAllListeners('drain'); - ws._receiver.on('drain', receiverOnDrain); - } - - const duplex = new Duplex({ - ...options, - autoDestroy: false, - emitClose: false, - objectMode: false, - writableObjectMode: false - }); - - ws.on('message', function message(msg) { - if (!duplex.push(msg)) { - resumeOnReceiverDrain = false; - ws._socket.pause(); - } - }); - - ws.once('error', function error(err) { - if (duplex.destroyed) return; - - // Prevent `ws.terminate()` from being called by `duplex._destroy()`. - // - // - If the `'error'` event is emitted before the `'open'` event, then - // `ws.terminate()` is a noop as no socket is assigned. - // - Otherwise, the error is re-emitted by the listener of the `'error'` - // event of the `Receiver` object. The listener already closes the - // connection by calling `ws.close()`. This allows a close frame to be - // sent to the other peer. If `ws.terminate()` is called right after this, - // then the close frame might not be sent. - terminateOnDestroy = false; - duplex.destroy(err); - }); - - ws.once('close', function close() { - if (duplex.destroyed) return; - - duplex.push(null); - }); - - duplex._destroy = function (err, callback) { - if (ws.readyState === ws.CLOSED) { - callback(err); - process.nextTick(emitClose, duplex); - return; - } - - let called = false; - - ws.once('error', function error(err) { - called = true; - callback(err); - }); - - ws.once('close', function close() { - if (!called) callback(err); - process.nextTick(emitClose, duplex); - }); - - if (terminateOnDestroy) ws.terminate(); - }; - - duplex._final = function (callback) { - if (ws.readyState === ws.CONNECTING) { - ws.once('open', function open() { - duplex._final(callback); - }); - return; - } - - // If the value of the `_socket` property is `null` it means that `ws` is a - // client websocket and the handshake failed. In fact, when this happens, a - // socket is never assigned to the websocket. Wait for the `'error'` event - // that will be emitted by the websocket. - if (ws._socket === null) return; - - if (ws._socket._writableState.finished) { - callback(); - if (duplex._readableState.endEmitted) duplex.destroy(); - } else { - ws._socket.once('finish', function finish() { - // `duplex` is not destroyed here because the `'end'` event will be - // emitted on `duplex` after this `'finish'` event. The EOF signaling - // `null` chunk is, in fact, pushed when the websocket emits `'close'`. - callback(); - }); - ws.close(); - } - }; - - duplex._read = function () { - if ( - (ws.readyState === ws.OPEN || ws.readyState === ws.CLOSING) && - !resumeOnReceiverDrain - ) { - resumeOnReceiverDrain = true; - if (!ws._receiver._writableState.needDrain) ws._socket.resume(); - } - }; - - duplex._write = function (chunk, encoding, callback) { - if (ws.readyState === ws.CONNECTING) { - ws.once('open', function open() { - duplex._write(chunk, encoding, callback); - }); - return; - } - - ws.send(chunk, callback); - }; - - duplex.on('end', duplexOnEnd); - duplex.on('error', duplexOnError); - return duplex; - } - - var stream = createWebSocketStream; - - const { createHash: createHash$1 } = crypto; - - - - const { format: format$2, parse: parse$2 } = extension; - const { GUID: GUID$1, kWebSocket: kWebSocket$2 } = constants; - - const keyRegex = /^[+/0-9A-Za-z]{22}==$/; - - const RUNNING = 0; - const CLOSING = 1; - const CLOSED = 2; - - /** - * Class representing a WebSocket server. - * - * @extends EventEmitter - */ - class WebSocketServer extends events { - /** - * Create a `WebSocketServer` instance. - * - * @param {Object} options Configuration options - * @param {Number} [options.backlog=511] The maximum length of the queue of - * pending connections - * @param {Boolean} [options.clientTracking=true] Specifies whether or not to - * track clients - * @param {Function} [options.handleProtocols] A hook to handle protocols - * @param {String} [options.host] The hostname where to bind the server - * @param {Number} [options.maxPayload=104857600] The maximum allowed message - * size - * @param {Boolean} [options.noServer=false] Enable no server mode - * @param {String} [options.path] Accept only connections matching this path - * @param {(Boolean|Object)} [options.perMessageDeflate=false] Enable/disable - * permessage-deflate - * @param {Number} [options.port] The port where to bind the server - * @param {(http.Server|https.Server)} [options.server] A pre-created HTTP/S - * server to use - * @param {Function} [options.verifyClient] A hook to reject connections - * @param {Function} [callback] A listener for the `listening` event - */ - constructor(options, callback) { - super(); - - options = { - maxPayload: 100 * 1024 * 1024, - perMessageDeflate: false, - handleProtocols: null, - clientTracking: true, - verifyClient: null, - noServer: false, - backlog: null, // use default (511 as implemented in net.js) - server: null, - host: null, - path: null, - port: null, - ...options - }; - - if ( - (options.port == null && !options.server && !options.noServer) || - (options.port != null && (options.server || options.noServer)) || - (options.server && options.noServer) - ) { - throw new TypeError( - 'One and only one of the "port", "server", or "noServer" options ' + - 'must be specified' - ); - } - - if (options.port != null) { - this._server = http.createServer((req, res) => { - const body = http.STATUS_CODES[426]; - - res.writeHead(426, { - 'Content-Length': body.length, - 'Content-Type': 'text/plain' - }); - res.end(body); - }); - this._server.listen( - options.port, - options.host, - options.backlog, - callback - ); - } else if (options.server) { - this._server = options.server; - } - - if (this._server) { - const emitConnection = this.emit.bind(this, 'connection'); - - this._removeListeners = addListeners(this._server, { - listening: this.emit.bind(this, 'listening'), - error: this.emit.bind(this, 'error'), - upgrade: (req, socket, head) => { - this.handleUpgrade(req, socket, head, emitConnection); - } - }); - } - - if (options.perMessageDeflate === true) options.perMessageDeflate = {}; - if (options.clientTracking) this.clients = new Set(); - this.options = options; - this._state = RUNNING; - } - - /** - * Returns the bound address, the address family name, and port of the server - * as reported by the operating system if listening on an IP socket. - * If the server is listening on a pipe or UNIX domain socket, the name is - * returned as a string. - * - * @return {(Object|String|null)} The address of the server - * @public - */ - address() { - if (this.options.noServer) { - throw new Error('The server is operating in "noServer" mode'); - } - - if (!this._server) return null; - return this._server.address(); - } - - /** - * Close the server. - * - * @param {Function} [cb] Callback - * @public - */ - close(cb) { - if (cb) this.once('close', cb); - - if (this._state === CLOSED) { - process.nextTick(emitClose$1, this); - return; - } - - if (this._state === CLOSING) return; - this._state = CLOSING; - - // - // Terminate all associated clients. - // - if (this.clients) { - for (const client of this.clients) client.terminate(); - } - - const server = this._server; - - if (server) { - this._removeListeners(); - this._removeListeners = this._server = null; - - // - // Close the http server if it was internally created. - // - if (this.options.port != null) { - server.close(emitClose$1.bind(undefined, this)); - return; - } - } - - process.nextTick(emitClose$1, this); - } - - /** - * See if a given request should be handled by this server instance. - * - * @param {http.IncomingMessage} req Request object to inspect - * @return {Boolean} `true` if the request is valid, else `false` - * @public - */ - shouldHandle(req) { - if (this.options.path) { - const index = req.url.indexOf('?'); - const pathname = index !== -1 ? req.url.slice(0, index) : req.url; - - if (pathname !== this.options.path) return false; - } - - return true; - } - - /** - * Handle a HTTP Upgrade request. - * - * @param {http.IncomingMessage} req The request object - * @param {(net.Socket|tls.Socket)} socket The network socket between the - * server and client - * @param {Buffer} head The first packet of the upgraded stream - * @param {Function} cb Callback - * @public - */ - handleUpgrade(req, socket, head, cb) { - socket.on('error', socketOnError$1); - - const key = - req.headers['sec-websocket-key'] !== undefined - ? req.headers['sec-websocket-key'].trim() - : false; - const version = +req.headers['sec-websocket-version']; - const extensions = {}; - - if ( - req.method !== 'GET' || - req.headers.upgrade.toLowerCase() !== 'websocket' || - !key || - !keyRegex.test(key) || - (version !== 8 && version !== 13) || - !this.shouldHandle(req) - ) { - return abortHandshake$1(socket, 400); - } - - if (this.options.perMessageDeflate) { - const perMessageDeflate = new permessageDeflate( - this.options.perMessageDeflate, - true, - this.options.maxPayload - ); - - try { - const offers = parse$2(req.headers['sec-websocket-extensions']); - - if (offers[permessageDeflate.extensionName]) { - perMessageDeflate.accept(offers[permessageDeflate.extensionName]); - extensions[permessageDeflate.extensionName] = perMessageDeflate; - } - } catch (err) { - return abortHandshake$1(socket, 400); - } - } - - // - // Optionally call external client verification handler. - // - if (this.options.verifyClient) { - const info = { - origin: - req.headers[`${version === 8 ? 'sec-websocket-origin' : 'origin'}`], - secure: !!(req.socket.authorized || req.socket.encrypted), - req - }; - - if (this.options.verifyClient.length === 2) { - this.options.verifyClient(info, (verified, code, message, headers) => { - if (!verified) { - return abortHandshake$1(socket, code || 401, message, headers); - } - - this.completeUpgrade(key, extensions, req, socket, head, cb); - }); - return; - } - - if (!this.options.verifyClient(info)) return abortHandshake$1(socket, 401); - } - - this.completeUpgrade(key, extensions, req, socket, head, cb); - } - - /** - * Upgrade the connection to WebSocket. - * - * @param {String} key The value of the `Sec-WebSocket-Key` header - * @param {Object} extensions The accepted extensions - * @param {http.IncomingMessage} req The request object - * @param {(net.Socket|tls.Socket)} socket The network socket between the - * server and client - * @param {Buffer} head The first packet of the upgraded stream - * @param {Function} cb Callback - * @throws {Error} If called more than once with the same socket - * @private - */ - completeUpgrade(key, extensions, req, socket, head, cb) { - // - // Destroy the socket if the client has already sent a FIN packet. - // - if (!socket.readable || !socket.writable) return socket.destroy(); - - if (socket[kWebSocket$2]) { - throw new Error( - 'server.handleUpgrade() was called more than once with the same ' + - 'socket, possibly due to a misconfiguration' - ); - } - - if (this._state > RUNNING) return abortHandshake$1(socket, 503); - - const digest = createHash$1('sha1') - .update(key + GUID$1) - .digest('base64'); - - const headers = [ - 'HTTP/1.1 101 Switching Protocols', - 'Upgrade: websocket', - 'Connection: Upgrade', - `Sec-WebSocket-Accept: ${digest}` - ]; - - const ws = new websocket(null); - let protocol = req.headers['sec-websocket-protocol']; - - if (protocol) { - protocol = protocol.split(',').map(trim); - - // - // Optionally call external protocol selection handler. - // - if (this.options.handleProtocols) { - protocol = this.options.handleProtocols(protocol, req); - } else { - protocol = protocol[0]; - } - - if (protocol) { - headers.push(`Sec-WebSocket-Protocol: ${protocol}`); - ws._protocol = protocol; - } - } - - if (extensions[permessageDeflate.extensionName]) { - const params = extensions[permessageDeflate.extensionName].params; - const value = format$2({ - [permessageDeflate.extensionName]: [params] - }); - headers.push(`Sec-WebSocket-Extensions: ${value}`); - ws._extensions = extensions; - } - - // - // Allow external modification/inspection of handshake headers. - // - this.emit('headers', headers, req); - - socket.write(headers.concat('\r\n').join('\r\n')); - socket.removeListener('error', socketOnError$1); - - ws.setSocket(socket, head, this.options.maxPayload); - - if (this.clients) { - this.clients.add(ws); - ws.on('close', () => this.clients.delete(ws)); - } - - cb(ws, req); - } - } - - var websocketServer = WebSocketServer; - - /** - * Add event listeners on an `EventEmitter` using a map of - * pairs. - * - * @param {EventEmitter} server The event emitter - * @param {Object.} map The listeners to add - * @return {Function} A function that will remove the added listeners when - * called - * @private - */ - function addListeners(server, map) { - for (const event of Object.keys(map)) server.on(event, map[event]); - - return function removeListeners() { - for (const event of Object.keys(map)) { - server.removeListener(event, map[event]); - } - }; - } - - /** - * Emit a `'close'` event on an `EventEmitter`. - * - * @param {EventEmitter} server The event emitter - * @private - */ - function emitClose$1(server) { - server._state = CLOSED; - server.emit('close'); - } - - /** - * Handle premature socket errors. - * - * @private - */ - function socketOnError$1() { - this.destroy(); - } - - /** - * Close the connection when preconditions are not fulfilled. - * - * @param {(net.Socket|tls.Socket)} socket The socket of the upgrade request - * @param {Number} code The HTTP response status code - * @param {String} [message] The HTTP response body - * @param {Object} [headers] Additional HTTP response headers - * @private - */ - function abortHandshake$1(socket, code, message, headers) { - if (socket.writable) { - message = message || http.STATUS_CODES[code]; - headers = { - Connection: 'close', - 'Content-Type': 'text/html', - 'Content-Length': Buffer.byteLength(message), - ...headers - }; - - socket.write( - `HTTP/1.1 ${code} ${http.STATUS_CODES[code]}\r\n` + - Object.keys(headers) - .map((h) => `${h}: ${headers[h]}`) - .join('\r\n') + - '\r\n\r\n' + - message - ); - } - - socket.removeListener('error', socketOnError$1); - socket.destroy(); - } - - /** - * Remove whitespace characters from both ends of a string. - * - * @param {String} str The string - * @return {String} A new string representing `str` stripped of whitespace - * characters from both its beginning and end - * @private - */ - function trim(str) { - return str.trim(); - } - - websocket.createWebSocketStream = stream; - websocket.Server = websocketServer; - websocket.Receiver = receiver; - websocket.Sender = sender; - - var ws = websocket; - - /* - An Ad-Hoc Mesh-Network Daisy-Chain - should work even if humans are - communicating with each other blind. - - To prevent infinite broadcast loops, - we use a deduplication process - based on the message's identifier. - This is currently implemented in core. - - However, because this still creates a - N*2 (where N is the number of connections) - flood, it is not scalable for traditional - services that have a hub network topology. - - Does this mean we have to abandon mesh - algorithms? No, we can simply layer more - efficient optimizations in based on constraints. - If these constraints exist, it automatically - upgrades, but if not, it falls back to the - brute-force mesh based robust algorithm. - A simple example is to limit peer connections - and rely upon daisy chaining to relay messages. - - Another example, is if peers are willing to - identify themselves, then we can improve the - efficiency of the network by having each peer - include the names of peers it is connected in - each message. Then each subsequent peer will - not relay it to them, since it is unnecessary. - This should create N (where N is the number of - peers) messages (or possibly N+ if there is a - common peer of uncommon peers that receives it - and relays at exact latency timings), which is - optimal. - - Since computer networks aren't actually blind, - we will implement the above method to improve - the performance of the ad-hoc mesh network. - - But why not have every message contain the - whole history of peers that it relayed through? - Because in sufficiently large enough networks, - with extensive daisy chaining, this will cause - the message to become prohibitively slow and - increase indefinitely in size. - - */ - - gun.on('opt', function(root){ - var opt = root.opt; - if(false === opt.ws || opt.once){ - this.to.next(root); - return; - } - opt.mesh = opt.mesh || gun.Mesh(root); - opt.WebSocket = opt.WebSocket || ws; - var ws$1 = opt.ws = opt.ws || {}; - ws$1.path = ws$1.path || '/gun'; - // if we DO need an HTTP server, then choose ws specific one or GUN default one. - if(!ws$1.noServer){ - ws$1.server = ws$1.server || opt.web; - if(!ws$1.server){ this.to.next(root); return } // ugh, bug fix for @jamierez & unstoppable ryan. - } - ws$1.web = ws$1.web || new opt.WebSocket.Server(ws$1); // we still need a WS server. - ws$1.web.on('connection', function(wire, req){ var peer; - wire.headers = wire.headers || (req||'').headers || ''; - console.STAT && ((console.STAT.sites || (console.STAT.sites = {}))[wire.headers.origin] = 1); - opt.mesh.hi(peer = {wire: wire}); - wire.on('message', function(msg){ - opt.mesh.hear(msg.data || msg, peer); - }); - wire.on('close', function(){ - opt.mesh.bye(peer); - }); - wire.on('error', function(e){}); - setTimeout(function heart(){ if(!opt.peers[peer.id]){ return } try{ wire.send("[]"); }catch(e){}setTimeout(heart, 1000 * 20); }, 1000 * 20); // Some systems, like Heroku, require heartbeats to not time out. // TODO: Make this configurable? // TODO: PERF: Find better approach than try/timeouts? - }); - this.to.next(root); - }); - - var sea = createCommonjsModule(function (module) { - (function(){ - - var window = this || self || window; - - /* UNBUILD */ - function USE(arg, req){ - return req? commonjsRequire() : arg.slice? USE[R(arg)] : function(mod, path){ - arg(mod = {exports: {}}); - USE[R(path)] = mod.exports; - } - function R(p){ - return p.split('/').slice(-1).toString().replace('.js',''); - } - } - { var MODULE = module; } - USE(function(module){ - // Security, Encryption, and Authorization: SEA.js - // MANDATORY READING: https://gun.eco/explainers/data/security.html - // IT IS IMPLEMENTED IN A POLYFILL/SHIM APPROACH. - // THIS IS AN EARLY ALPHA! - - if(typeof window !== "undefined"){ module.window = window; } - - var tmp = module.window || module, u; - var SEA = tmp.SEA || {}; - - if(SEA.window = module.window){ SEA.window.SEA = SEA; } - - try{ if(u+'' !== typeof MODULE){ MODULE.exports = SEA; } }catch(e){} - module.exports = SEA; - })(USE, './root'); - USE(function(module){ - var SEA = USE('./root'); - try{ if(SEA.window){ - if(location.protocol.indexOf('s') < 0 - && location.host.indexOf('localhost') < 0 - && ! /^127\.\d+\.\d+\.\d+$/.test(location.hostname) - && location.protocol.indexOf('file:') < 0){ - console.warn('HTTPS needed for WebCrypto in SEA, redirecting...'); - location.protocol = 'https:'; // WebCrypto does NOT work without HTTPS! - } - } }catch(e){} - })(USE, './https'); - USE(function(module){ - var u; - if(u+''== typeof btoa){ - if(u+'' == typeof Buffer){ - try{ commonjsGlobal.Buffer = USE("buffer", 1).Buffer; }catch(e){ console.log("Please `npm install buffer` or add it to your package.json !"); } - } - commonjsGlobal.btoa = function(data){ return Buffer.from(data, "binary").toString("base64") }; - commonjsGlobal.atob = function(data){ return Buffer.from(data, "base64").toString("binary") }; - } - })(USE, './base64'); - USE(function(module){ - USE('./base64'); - // This is Array extended to have .toString(['utf8'|'hex'|'base64']) - function SeaArray() {} - Object.assign(SeaArray, { from: Array.from }); - SeaArray.prototype = Object.create(Array.prototype); - SeaArray.prototype.toString = function(enc, start, end) { enc = enc || 'utf8'; start = start || 0; - const length = this.length; - if (enc === 'hex') { - const buf = new Uint8Array(this); - return [ ...Array(((end && (end + 1)) || length) - start).keys()] - .map((i) => buf[ i + start ].toString(16).padStart(2, '0')).join('') - } - if (enc === 'utf8') { - return Array.from( - { length: (end || length) - start }, - (_, i) => String.fromCharCode(this[ i + start]) - ).join('') - } - if (enc === 'base64') { - return btoa(this) - } - }; - module.exports = SeaArray; - })(USE, './array'); - USE(function(module){ - USE('./base64'); - // This is Buffer implementation used in SEA. Functionality is mostly - // compatible with NodeJS 'safe-buffer' and is used for encoding conversions - // between binary and 'hex' | 'utf8' | 'base64' - // See documentation and validation for safe implementation in: - // https://github.com/feross/safe-buffer#update - var SeaArray = USE('./array'); - function SafeBuffer(...props) { - console.warn('new SafeBuffer() is depreciated, please use SafeBuffer.from()'); - return SafeBuffer.from(...props) - } - SafeBuffer.prototype = Object.create(Array.prototype); - Object.assign(SafeBuffer, { - // (data, enc) where typeof data === 'string' then enc === 'utf8'|'hex'|'base64' - from() { - if (!Object.keys(arguments).length || arguments[0]==null) { - throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.') - } - const input = arguments[0]; - let buf; - if (typeof input === 'string') { - const enc = arguments[1] || 'utf8'; - if (enc === 'hex') { - const bytes = input.match(/([\da-fA-F]{2})/g) - .map((byte) => parseInt(byte, 16)); - if (!bytes || !bytes.length) { - throw new TypeError('Invalid first argument for type \'hex\'.') - } - buf = SeaArray.from(bytes); - } else if (enc === 'utf8' || 'binary' === enc) { // EDIT BY MARK: I think this is safe, tested it against a couple "binary" strings. This lets SafeBuffer match NodeJS Buffer behavior more where it safely btoas regular strings. - const length = input.length; - const words = new Uint16Array(length); - buf = SeaArray.from(words); - } else if (enc === 'base64') { - const dec = atob(input); - const length = dec.length; - const bytes = new Uint8Array(length); - buf = SeaArray.from(bytes); - } else if (enc === 'binary') { // deprecated by above comment - buf = SeaArray.from(input); // some btoas were mishandled. - } else { - console.info('SafeBuffer.from unknown encoding: '+enc); - } - return buf - } - const length = input.byteLength ? input.byteLength : input.length; - if (length) { - let buf; - if (input instanceof ArrayBuffer) { - buf = new Uint8Array(input); - } - return SeaArray.from(buf || input) - } - }, - // This is 'safe-buffer.alloc' sans encoding support - alloc(length, fill = 0 /*, enc*/ ) { - return SeaArray.from(new Uint8Array(Array.from({ length: length }, () => fill))) - }, - // This is normal UNSAFE 'buffer.alloc' or 'new Buffer(length)' - don't use! - allocUnsafe(length) { - return SeaArray.from(new Uint8Array(Array.from({ length : length }))) - }, - // This puts together array of array like members - concat(arr) { // octet array - if (!Array.isArray(arr)) { - throw new TypeError('First argument must be Array containing ArrayBuffer or Uint8Array instances.') - } - return SeaArray.from(arr.reduce((ret, item) => ret.concat(Array.from(item)), [])) - } - }); - SafeBuffer.prototype.from = SafeBuffer.from; - SafeBuffer.prototype.toString = SeaArray.prototype.toString; - - module.exports = SafeBuffer; - })(USE, './buffer'); - USE(function(module){ - const SEA = USE('./root'); - const api = {Buffer: USE('./buffer')}; - var o = {}, u; - - // ideally we can move away from JSON entirely? unlikely due to compatibility issues... oh well. - JSON.parseAsync = JSON.parseAsync || function(t,cb,r){ var u; try{ cb(u, JSON.parse(t,r)); }catch(e){ cb(e); } }; - JSON.stringifyAsync = JSON.stringifyAsync || function(v,cb,r,s){ var u; try{ cb(u, JSON.stringify(v,r,s)); }catch(e){ cb(e); } }; - - api.parse = function(t,r){ return new Promise(function(res, rej){ - JSON.parseAsync(t,function(err, raw){ err? rej(err) : res(raw); },r); - })}; - api.stringify = function(v,r,s){ return new Promise(function(res, rej){ - JSON.stringifyAsync(v,function(err, raw){ err? rej(err) : res(raw); },r,s); - })}; - - if(SEA.window){ - api.crypto = window.crypto || window.msCrypto; - api.subtle = (api.crypto||o).subtle || (api.crypto||o).webkitSubtle; - api.TextEncoder = window.TextEncoder; - api.TextDecoder = window.TextDecoder; - api.random = (len) => api.Buffer.from(api.crypto.getRandomValues(new Uint8Array(api.Buffer.alloc(len)))); - } - if(!api.TextDecoder) - { - const { TextEncoder, TextDecoder } = USE((u+'' == typeof MODULE?'.':'')+'./lib/text-encoding', 1); - api.TextDecoder = TextDecoder; - api.TextEncoder = TextEncoder; - } - if(!api.crypto) - { - try - { - var crypto = USE('crypto', 1); - Object.assign(api, { - crypto, - random: (len) => api.Buffer.from(crypto.randomBytes(len)) - }); - const { Crypto: WebCrypto } = USE('@peculiar/webcrypto', 1); - api.ossl = api.subtle = new WebCrypto({directory: 'ossl'}).subtle; // ECDH - } - catch(e){ - console.log("Please `npm install @peculiar/webcrypto` or add it to your package.json !"); - }} - - module.exports = api; - })(USE, './shim'); - USE(function(module){ - var SEA = USE('./root'); - var shim = USE('./shim'); - var s = {}; - s.pbkdf2 = {hash: {name : 'SHA-256'}, iter: 100000, ks: 64}; - s.ecdsa = { - pair: {name: 'ECDSA', namedCurve: 'P-256'}, - sign: {name: 'ECDSA', hash: {name: 'SHA-256'}} - }; - s.ecdh = {name: 'ECDH', namedCurve: 'P-256'}; - - // This creates Web Cryptography API compliant JWK for sign/verify purposes - s.jwk = function(pub, d){ // d === priv - pub = pub.split('.'); - var x = pub[0], y = pub[1]; - var jwk = {kty: "EC", crv: "P-256", x: x, y: y, ext: true}; - jwk.key_ops = d ? ['sign'] : ['verify']; - if(d){ jwk.d = d; } - return jwk; - }; - - s.keyToJwk = function(keyBytes) { - const keyB64 = keyBytes.toString('base64'); - const k = keyB64.replace(/\+/g, '-').replace(/\//g, '_').replace(/\=/g, ''); - return { kty: 'oct', k: k, ext: false, alg: 'A256GCM' }; - }; - - s.recall = { - validity: 12 * 60 * 60, // internally in seconds : 12 hours - hook: function(props){ return props } // { iat, exp, alias, remember } // or return new Promise((resolve, reject) => resolve(props) - }; - - s.check = function(t){ return (typeof t == 'string') && ('SEA{' === t.slice(0,4)) }; - s.parse = async function p(t){ try { - var yes = (typeof t == 'string'); - if(yes && 'SEA{' === t.slice(0,4)){ t = t.slice(3); } - return yes ? await shim.parse(t) : t; - } catch (e) {} - return t; - }; - - SEA.opt = s; - module.exports = s; - })(USE, './settings'); - USE(function(module){ - var shim = USE('./shim'); - module.exports = async function(d, o){ - var t = (typeof d == 'string')? d : await shim.stringify(d); - var hash = await shim.subtle.digest({name: o||'SHA-256'}, new shim.TextEncoder().encode(t)); - return shim.Buffer.from(hash); - }; - })(USE, './sha256'); - USE(function(module){ - // This internal func returns SHA-1 hashed data for KeyID generation - const __shim = USE('./shim'); - const subtle = __shim.subtle; - const ossl = __shim.ossl ? __shim.ossl : subtle; - const sha1hash = (b) => ossl.digest({name: 'SHA-1'}, new ArrayBuffer(b)); - module.exports = sha1hash; - })(USE, './sha1'); - USE(function(module){ - var SEA = USE('./root'); - var shim = USE('./shim'); - var S = USE('./settings'); - var sha = USE('./sha256'); - var u; - - SEA.work = SEA.work || (async (data, pair, cb, opt) => { try { // used to be named `proof` - var salt = (pair||{}).epub || pair; // epub not recommended, salt should be random! - opt = opt || {}; - if(salt instanceof Function){ - cb = salt; - salt = u; - } - data = (typeof data == 'string')? data : await shim.stringify(data); - if('sha' === (opt.name||'').toLowerCase().slice(0,3)){ - var rsha = shim.Buffer.from(await sha(data, opt.name), 'binary').toString(opt.encode || 'base64'); - if(cb){ try{ cb(rsha); }catch(e){console.log(e);} } - return rsha; - } - salt = salt || shim.random(9); - var key = await (shim.ossl || shim.subtle).importKey('raw', new shim.TextEncoder().encode(data), {name: opt.name || 'PBKDF2'}, false, ['deriveBits']); - var work = await (shim.ossl || shim.subtle).deriveBits({ - name: opt.name || 'PBKDF2', - iterations: opt.iterations || S.pbkdf2.iter, - salt: new shim.TextEncoder().encode(opt.salt || salt), - hash: opt.hash || S.pbkdf2.hash, - }, key, opt.length || (S.pbkdf2.ks * 8)); - data = shim.random(data.length); // Erase data in case of passphrase - var r = shim.Buffer.from(work, 'binary').toString(opt.encode || 'base64'); - if(cb){ try{ cb(r); }catch(e){console.log(e);} } - return r; - } catch(e) { - console.log(e); - SEA.err = e; - if(SEA.throw){ throw e } - if(cb){ cb(); } - return; - }}); - - module.exports = SEA.work; - })(USE, './work'); - USE(function(module){ - var SEA = USE('./root'); - var shim = USE('./shim'); - var S = USE('./settings'); - - SEA.name = SEA.name || (async (cb, opt) => { try { - if(cb){ try{ cb(); }catch(e){console.log(e);} } - return; - } catch(e) { - console.log(e); - SEA.err = e; - if(SEA.throw){ throw e } - if(cb){ cb(); } - return; - }}); - - //SEA.pair = async (data, proof, cb) => { try { - SEA.pair = SEA.pair || (async (cb, opt) => { try { - - var ecdhSubtle = shim.ossl || shim.subtle; - // First: ECDSA keys for signing/verifying... - var sa = await shim.subtle.generateKey({name: 'ECDSA', namedCurve: 'P-256'}, true, [ 'sign', 'verify' ]) - .then(async (keys) => { - // privateKey scope doesn't leak out from here! - //const { d: priv } = await shim.subtle.exportKey('jwk', keys.privateKey) - var key = {}; - key.priv = (await shim.subtle.exportKey('jwk', keys.privateKey)).d; - var pub = await shim.subtle.exportKey('jwk', keys.publicKey); - //const pub = Buff.from([ x, y ].join(':')).toString('base64') // old - key.pub = pub.x+'.'+pub.y; // new - // x and y are already base64 - // pub is UTF8 but filename/URL safe (https://www.ietf.org/rfc/rfc3986.txt) - // but split on a non-base64 letter. - return key; - }); - - // To include PGPv4 kind of keyId: - // const pubId = await SEA.keyid(keys.pub) - // Next: ECDH keys for encryption/decryption... - - try{ - var dh = await ecdhSubtle.generateKey({name: 'ECDH', namedCurve: 'P-256'}, true, ['deriveKey']) - .then(async (keys) => { - // privateKey scope doesn't leak out from here! - var key = {}; - key.epriv = (await ecdhSubtle.exportKey('jwk', keys.privateKey)).d; - var pub = await ecdhSubtle.exportKey('jwk', keys.publicKey); - //const epub = Buff.from([ ex, ey ].join(':')).toString('base64') // old - key.epub = pub.x+'.'+pub.y; // new - // ex and ey are already base64 - // epub is UTF8 but filename/URL safe (https://www.ietf.org/rfc/rfc3986.txt) - // but split on a non-base64 letter. - return key; - }); - }catch(e){ - if(SEA.window){ throw e } - if(e == 'Error: ECDH is not a supported algorithm'){ console.log('Ignoring ECDH...'); } - else { throw e } - } dh = dh || {}; - - var r = { pub: sa.pub, priv: sa.priv, /* pubId, */ epub: dh.epub, epriv: dh.epriv }; - if(cb){ try{ cb(r); }catch(e){console.log(e);} } - return r; - } catch(e) { - console.log(e); - SEA.err = e; - if(SEA.throw){ throw e } - if(cb){ cb(); } - return; - }}); - - module.exports = SEA.pair; - })(USE, './pair'); - USE(function(module){ - var SEA = USE('./root'); - var shim = USE('./shim'); - var S = USE('./settings'); - var sha = USE('./sha256'); - var u; - - SEA.sign = SEA.sign || (async (data, pair, cb, opt) => { try { - opt = opt || {}; - if(!(pair||opt).priv){ - if(!SEA.I){ throw 'No signing key.' } - pair = await SEA.I(null, {what: data, how: 'sign', why: opt.why}); - } - if(u === data){ throw '`undefined` not allowed.' } - var json = await S.parse(data); - var check = opt.check = opt.check || json; - if(SEA.verify && (SEA.opt.check(check) || (check && check.s && check.m)) - && u !== await SEA.verify(check, pair)){ // don't sign if we already signed it. - var r = await S.parse(check); - if(!opt.raw){ r = 'SEA' + await shim.stringify(r); } - if(cb){ try{ cb(r); }catch(e){console.log(e);} } - return r; - } - var pub = pair.pub; - var priv = pair.priv; - var jwk = S.jwk(pub, priv); - var hash = await sha(json); - var sig = await (shim.ossl || shim.subtle).importKey('jwk', jwk, {name: 'ECDSA', namedCurve: 'P-256'}, false, ['sign']) - .then((key) => (shim.ossl || shim.subtle).sign({name: 'ECDSA', hash: {name: 'SHA-256'}}, key, new Uint8Array(hash))); // privateKey scope doesn't leak out from here! - var r = {m: json, s: shim.Buffer.from(sig, 'binary').toString(opt.encode || 'base64')}; - if(!opt.raw){ r = 'SEA' + await shim.stringify(r); } - - if(cb){ try{ cb(r); }catch(e){console.log(e);} } - return r; - } catch(e) { - console.log(e); - SEA.err = e; - if(SEA.throw){ throw e } - if(cb){ cb(); } - return; - }}); - - module.exports = SEA.sign; - })(USE, './sign'); - USE(function(module){ - var SEA = USE('./root'); - var shim = USE('./shim'); - var S = USE('./settings'); - var sha = USE('./sha256'); - var u; - - SEA.verify = SEA.verify || (async (data, pair, cb, opt) => { try { - var json = await S.parse(data); - if(false === pair){ // don't verify! - var raw = await S.parse(json.m); - if(cb){ try{ cb(raw); }catch(e){console.log(e);} } - return raw; - } - opt = opt || {}; - // SEA.I // verify is free! Requires no user permission. - var pub = pair.pub || pair; - var key = SEA.opt.slow_leak? await SEA.opt.slow_leak(pub) : await (shim.ossl || shim.subtle).importKey('jwk', S.jwk(pub), {name: 'ECDSA', namedCurve: 'P-256'}, false, ['verify']); - var hash = await sha(json.m); - var buf, sig, check, tmp; try{ - buf = shim.Buffer.from(json.s, opt.encode || 'base64'); // NEW DEFAULT! - sig = new Uint8Array(buf); - check = await (shim.ossl || shim.subtle).verify({name: 'ECDSA', hash: {name: 'SHA-256'}}, key, sig, new Uint8Array(hash)); - if(!check){ throw "Signature did not match." } - }catch(e){ - if(SEA.opt.fallback){ - return await SEA.opt.fall_verify(data, pair, cb, opt); - } - } - var r = check? await S.parse(json.m) : u; - - if(cb){ try{ cb(r); }catch(e){console.log(e);} } - return r; - } catch(e) { - console.log(e); // mismatched owner FOR MARTTI - SEA.err = e; - if(SEA.throw){ throw e } - if(cb){ cb(); } - return; - }}); - - module.exports = SEA.verify; - // legacy & ossl memory leak mitigation: - - var knownKeys = {}; - var keyForPair = SEA.opt.slow_leak = pair => { - if (knownKeys[pair]) return knownKeys[pair]; - var jwk = S.jwk(pair); - knownKeys[pair] = (shim.ossl || shim.subtle).importKey("jwk", jwk, {name: 'ECDSA', namedCurve: 'P-256'}, false, ["verify"]); - return knownKeys[pair]; - }; - - var O = SEA.opt; - SEA.opt.fall_verify = async function(data, pair, cb, opt, f){ - if(f === SEA.opt.fallback){ throw "Signature did not match" } f = f || 1; - var tmp = data||''; - data = SEA.opt.unpack(data) || data; - var json = await S.parse(data), pub = pair.pub || pair, key = await SEA.opt.slow_leak(pub); - var hash = (f <= SEA.opt.fallback)? shim.Buffer.from(await shim.subtle.digest({name: 'SHA-256'}, new shim.TextEncoder().encode(await S.parse(json.m)))) : await sha(json.m); // this line is old bad buggy code but necessary for old compatibility. - var buf; var sig; var check; try{ - buf = shim.Buffer.from(json.s, opt.encode || 'base64'); // NEW DEFAULT! - sig = new Uint8Array(buf); - check = await (shim.ossl || shim.subtle).verify({name: 'ECDSA', hash: {name: 'SHA-256'}}, key, sig, new Uint8Array(hash)); - if(!check){ throw "Signature did not match." } - }catch(e){ try{ - buf = shim.Buffer.from(json.s, 'utf8'); // AUTO BACKWARD OLD UTF8 DATA! - sig = new Uint8Array(buf); - check = await (shim.ossl || shim.subtle).verify({name: 'ECDSA', hash: {name: 'SHA-256'}}, key, sig, new Uint8Array(hash)); - }catch(e){ - if(!check){ throw "Signature did not match." } - } - } - var r = check? await S.parse(json.m) : u; - O.fall_soul = tmp['#']; O.fall_key = tmp['.']; O.fall_val = data; O.fall_state = tmp['>']; - if(cb){ try{ cb(r); }catch(e){console.log(e);} } - return r; - }; - SEA.opt.fallback = 2; - - })(USE, './verify'); - USE(function(module){ - var shim = USE('./shim'); - var S = USE('./settings'); - var sha256hash = USE('./sha256'); - - const importGen = async (key, salt, opt) => { - const combo = key + (salt || shim.random(8)).toString('utf8'); // new - const hash = shim.Buffer.from(await sha256hash(combo), 'binary'); - - const jwkKey = S.keyToJwk(hash); - return await shim.subtle.importKey('jwk', jwkKey, {name:'AES-GCM'}, false, ['encrypt', 'decrypt']) - }; - module.exports = importGen; - })(USE, './aeskey'); - USE(function(module){ - var SEA = USE('./root'); - var shim = USE('./shim'); - var S = USE('./settings'); - var aeskey = USE('./aeskey'); - var u; - - SEA.encrypt = SEA.encrypt || (async (data, pair, cb, opt) => { try { - opt = opt || {}; - var key = (pair||opt).epriv || pair; - if(u === data){ throw '`undefined` not allowed.' } - if(!key){ - if(!SEA.I){ throw 'No encryption key.' } - pair = await SEA.I(null, {what: data, how: 'encrypt', why: opt.why}); - key = pair.epriv || pair; - } - var msg = (typeof data == 'string')? data : await shim.stringify(data); - var rand = {s: shim.random(9), iv: shim.random(15)}; // consider making this 9 and 15 or 18 or 12 to reduce == padding. - var ct = await aeskey(key, rand.s, opt).then((aes) => (/*shim.ossl ||*/ shim.subtle).encrypt({ // Keeping the AES key scope as private as possible... - name: opt.name || 'AES-GCM', iv: new Uint8Array(rand.iv) - }, aes, new shim.TextEncoder().encode(msg))); - var r = { - ct: shim.Buffer.from(ct, 'binary').toString(opt.encode || 'base64'), - iv: rand.iv.toString(opt.encode || 'base64'), - s: rand.s.toString(opt.encode || 'base64') - }; - if(!opt.raw){ r = 'SEA' + await shim.stringify(r); } - - if(cb){ try{ cb(r); }catch(e){console.log(e);} } - return r; - } catch(e) { - console.log(e); - SEA.err = e; - if(SEA.throw){ throw e } - if(cb){ cb(); } - return; - }}); - - module.exports = SEA.encrypt; - })(USE, './encrypt'); - USE(function(module){ - var SEA = USE('./root'); - var shim = USE('./shim'); - var S = USE('./settings'); - var aeskey = USE('./aeskey'); - - SEA.decrypt = SEA.decrypt || (async (data, pair, cb, opt) => { try { - opt = opt || {}; - var key = (pair||opt).epriv || pair; - if(!key){ - if(!SEA.I){ throw 'No decryption key.' } - pair = await SEA.I(null, {what: data, how: 'decrypt', why: opt.why}); - key = pair.epriv || pair; - } - var json = await S.parse(data); - var buf, bufiv, bufct; try{ - buf = shim.Buffer.from(json.s, opt.encode || 'base64'); - bufiv = shim.Buffer.from(json.iv, opt.encode || 'base64'); - bufct = shim.Buffer.from(json.ct, opt.encode || 'base64'); - var ct = await aeskey(key, buf, opt).then((aes) => (/*shim.ossl ||*/ shim.subtle).decrypt({ // Keeping aesKey scope as private as possible... - name: opt.name || 'AES-GCM', iv: new Uint8Array(bufiv), tagLength: 128 - }, aes, new Uint8Array(bufct))); - }catch(e){ - if('utf8' === opt.encode){ throw "Could not decrypt" } - if(SEA.opt.fallback){ - opt.encode = 'utf8'; - return await SEA.decrypt(data, pair, cb, opt); - } - } - var r = await S.parse(new shim.TextDecoder('utf8').decode(ct)); - if(cb){ try{ cb(r); }catch(e){console.log(e);} } - return r; - } catch(e) { - console.log(e); - SEA.err = e; - if(SEA.throw){ throw e } - if(cb){ cb(); } - return; - }}); - - module.exports = SEA.decrypt; - })(USE, './decrypt'); - USE(function(module){ - var SEA = USE('./root'); - var shim = USE('./shim'); - var S = USE('./settings'); - // Derive shared secret from other's pub and my epub/epriv - SEA.secret = SEA.secret || (async (key, pair, cb, opt) => { try { - opt = opt || {}; - if(!pair || !pair.epriv || !pair.epub){ - if(!SEA.I){ throw 'No secret mix.' } - pair = await SEA.I(null, {what: key, how: 'secret', why: opt.why}); - } - var pub = key.epub || key; - var epub = pair.epub; - var epriv = pair.epriv; - var ecdhSubtle = shim.ossl || shim.subtle; - var pubKeyData = keysToEcdhJwk(pub); - var props = Object.assign({ public: await ecdhSubtle.importKey(...pubKeyData, true, []) },{name: 'ECDH', namedCurve: 'P-256'}); // Thanks to @sirpy ! - var privKeyData = keysToEcdhJwk(epub, epriv); - var derived = await ecdhSubtle.importKey(...privKeyData, false, ['deriveBits']).then(async (privKey) => { - // privateKey scope doesn't leak out from here! - var derivedBits = await ecdhSubtle.deriveBits(props, privKey, 256); - var rawBits = new Uint8Array(derivedBits); - var derivedKey = await ecdhSubtle.importKey('raw', rawBits,{ name: 'AES-GCM', length: 256 }, true, [ 'encrypt', 'decrypt' ]); - return ecdhSubtle.exportKey('jwk', derivedKey).then(({ k }) => k); - }); - var r = derived; - if(cb){ try{ cb(r); }catch(e){console.log(e);} } - return r; - } catch(e) { - console.log(e); - SEA.err = e; - if(SEA.throw){ throw e } - if(cb){ cb(); } - return; - }}); - - // can this be replaced with settings.jwk? - var keysToEcdhJwk = (pub, d) => { // d === priv - //var [ x, y ] = shim.Buffer.from(pub, 'base64').toString('utf8').split(':') // old - var [ x, y ] = pub.split('.'); // new - var jwk = d ? { d: d } : {}; - return [ // Use with spread returned value... - 'jwk', - Object.assign( - jwk, - { x: x, y: y, kty: 'EC', crv: 'P-256', ext: true } - ), // ??? refactor - {name: 'ECDH', namedCurve: 'P-256'} - ] - }; - - module.exports = SEA.secret; - })(USE, './secret'); - USE(function(module){ - var SEA = USE('./root'); - // This is to certify that a group of "certificants" can "put" anything at a group of matched "paths" to the certificate authority's graph - SEA.certify = SEA.certify || (async (certificants, policy = {}, authority, cb, opt = {}) => { try { - /* - The Certify Protocol was made out of love by a Vietnamese code enthusiast. Vietnamese people around the world deserve respect! - IMPORTANT: A Certificate is like a Signature. No one knows who (authority) created/signed a cert until you put it into their graph. - "certificants": '*' or a String (Bob.pub) || an Object that contains "pub" as a key || an array of [object || string]. These people will have the rights. - "policy": A string ('inbox'), or a RAD/LEX object {'*': 'inbox'}, or an Array of RAD/LEX objects or strings. RAD/LEX object can contain key "?" with indexOf("*") > -1 to force key equals certificant pub. This rule is used to check against soul+'/'+key using Gun.text.match or String.match. - "authority": Key pair or priv of the certificate authority. - "cb": A callback function after all things are done. - "opt": If opt.expiry (a timestamp) is set, SEA won't sync data after opt.expiry. If opt.block is set, SEA will look for block before syncing. - */ - console.log('SEA.certify() is an early experimental community supported method that may change API behavior without warning in any future version.'); - - certificants = (() => { - var data = []; - if (certificants) { - if ((typeof certificants === 'string' || Array.isArray(certificants)) && certificants.indexOf('*') > -1) return '*' - if (typeof certificants === 'string') return certificants - if (Array.isArray(certificants)) { - if (certificants.length === 1 && certificants[0]) return typeof certificants[0] === 'object' && certificants[0].pub ? certificants[0].pub : typeof certificants[0] === 'string' ? certificants[0] : null - certificants.map(certificant => { - if (typeof certificant ==='string') data.push(certificant); - else if (typeof certificant === 'object' && certificant.pub) data.push(certificant.pub); - }); - } - - if (typeof certificants === 'object' && certificants.pub) return certificants.pub - return data.length > 0 ? data : null - } - return - })(); - - if (!certificants) return console.log("No certificant found.") - - const expiry = opt.expiry && (typeof opt.expiry === 'number' || typeof opt.expiry === 'string') ? parseFloat(opt.expiry) : null; - const readPolicy = (policy || {}).read ? policy.read : null; - const writePolicy = (policy || {}).write ? policy.write : typeof policy === 'string' || Array.isArray(policy) || policy["+"] || policy["#"] || policy["."] || policy["="] || policy["*"] || policy[">"] || policy["<"] ? policy : null; - // The "blacklist" feature is now renamed to "block". Why ? BECAUSE BLACK LIVES MATTER! - // We can now use 3 keys: block, blacklist, ban - const block = (opt || {}).block || (opt || {}).blacklist || (opt || {}).ban || {}; - const readBlock = block.read && (typeof block.read === 'string' || (block.read || {})['#']) ? block.read : null; - const writeBlock = typeof block === 'string' ? block : block.write && (typeof block.write === 'string' || block.write['#']) ? block.write : null; - - if (!readPolicy && !writePolicy) return console.log("No policy found.") - - // reserved keys: c, e, r, w, rb, wb - const data = JSON.stringify({ - c: certificants, - ...(expiry ? {e: expiry} : {}), // inject expiry if possible - ...(readPolicy ? {r: readPolicy } : {}), // "r" stands for read, which means read permission. - ...(writePolicy ? {w: writePolicy} : {}), // "w" stands for write, which means write permission. - ...(readBlock ? {rb: readBlock} : {}), // inject READ block if possible - ...(writeBlock ? {wb: writeBlock} : {}), // inject WRITE block if possible - }); - - const certificate = await SEA.sign(data, authority, null, {raw:1}); - - var r = certificate; - if(!opt.raw){ r = 'SEA'+JSON.stringify(r); } - if(cb){ try{ cb(r); }catch(e){console.log(e);} } - return r; - } catch(e) { - SEA.err = e; - if(SEA.throw){ throw e } - if(cb){ cb(); } - return; - }}); - - module.exports = SEA.certify; - })(USE, './certify'); - USE(function(module){ - var shim = USE('./shim'); - // Practical examples about usage found in tests. - var SEA = USE('./root'); - SEA.work = USE('./work'); - SEA.sign = USE('./sign'); - SEA.verify = USE('./verify'); - SEA.encrypt = USE('./encrypt'); - SEA.decrypt = USE('./decrypt'); - SEA.certify = USE('./certify'); - //SEA.opt.aeskey = USE('./aeskey'); // not official! // this causes problems in latest WebCrypto. - - SEA.random = SEA.random || shim.random; - - // This is Buffer used in SEA and usable from Gun/SEA application also. - // For documentation see https://nodejs.org/api/buffer.html - SEA.Buffer = SEA.Buffer || USE('./buffer'); - - // These SEA functions support now ony Promises or - // async/await (compatible) code, use those like Promises. - // - // Creates a wrapper library around Web Crypto API - // for various AES, ECDSA, PBKDF2 functions we called above. - // Calculate public key KeyID aka PGPv4 (result: 8 bytes as hex string) - SEA.keyid = SEA.keyid || (async (pub) => { - try { - // base64('base64(x):base64(y)') => shim.Buffer(xy) - const pb = shim.Buffer.concat( - pub.replace(/-/g, '+').replace(/_/g, '/').split('.') - .map((t) => shim.Buffer.from(t, 'base64')) - ); - // id is PGPv4 compliant raw key - const id = shim.Buffer.concat([ - shim.Buffer.from([0x99, pb.length / 0x100, pb.length % 0x100]), pb - ]); - const sha1 = await sha1hash(id); - const hash = shim.Buffer.from(sha1, 'binary'); - return hash.toString('hex', hash.length - 8) // 16-bit ID as hex - } catch (e) { - console.log(e); - throw e - } - }); - // all done! - // Obviously it is missing MANY necessary features. This is only an alpha release. - // Please experiment with it, audit what I've done so far, and complain about what needs to be added. - // SEA should be a full suite that is easy and seamless to use. - // Again, scroll naer the top, where I provide an EXAMPLE of how to create a user and sign in. - // Once logged in, the rest of the code you just read handled automatically signing/validating data. - // But all other behavior needs to be equally easy, like opinionated ways of - // Adding friends (trusted public keys), sending private messages, etc. - // Cheers! Tell me what you think. - ((SEA.window||{}).GUN||{}).SEA = SEA; - - module.exports = SEA; - // -------------- END SEA MODULES -------------------- - // -- BEGIN SEA+GUN MODULES: BUNDLED BY DEFAULT UNTIL OTHERS USE SEA ON OWN ------- - })(USE, './sea'); - USE(function(module){ - var SEA = USE('./sea'), Gun, u; - if(SEA.window){ - Gun = SEA.window.GUN || {chain:{}}; - } else { - Gun = USE((u+'' == typeof MODULE?'.':'')+'./gun', 1); - } - SEA.GUN = Gun; - - function User(root){ - this._ = {$: this}; - } - User.prototype = (function(){ function F(){} F.prototype = Gun.chain; return new F() }()); // Object.create polyfill - User.prototype.constructor = User; - - // let's extend the gun chain with a `user` function. - // only one user can be logged in at a time, per gun instance. - Gun.chain.user = function(pub){ - var gun = this, root = gun.back(-1), user; - if(pub){ - pub = SEA.opt.pub((pub._||'')['#']) || pub; - return root.get('~'+pub); - } - if(user = root.back('user')){ return user } - var root = (root._), at = root, uuid = at.opt.uuid || lex; - (at = (user = at.user = gun.chain(new User))._).opt = {}; - at.opt.uuid = function(cb){ - var id = uuid(), pub = root.user; - if(!pub || !(pub = pub.is) || !(pub = pub.pub)){ return id } - id = '~' + pub + '/' + id; - if(cb && cb.call){ cb(null, id); } - return id; - }; - return user; - }; - function lex(){ return Gun.state().toString(36).replace('.','') } - Gun.User = User; - User.GUN = Gun; - User.SEA = Gun.SEA = SEA; - module.exports = User; - })(USE, './user'); - USE(function(module){ - var u, Gun = (''+u != typeof window)? (window.Gun||{chain:{}}) : USE((''+u === typeof MODULE?'.':'')+'./gun', 1); - Gun.chain.then = function(cb, opt){ - var gun = this, p = (new Promise(function(res, rej){ - gun.once(res, opt); - })); - return cb? p.then(cb) : p; - }; - })(USE, './then'); - USE(function(module){ - var User = USE('./user'), SEA = User.SEA, Gun = User.GUN, noop = function(){}; - - // Well first we have to actually create a user. That is what this function does. - User.prototype.create = function(...args){ - var pair = typeof args[0] === 'object' && (args[0].pub || args[0].epub) ? args[0] : typeof args[1] === 'object' && (args[1].pub || args[1].epub) ? args[1] : null; - var alias = pair && (pair.pub || pair.epub) ? pair.pub : typeof args[0] === 'string' ? args[0] : null; - var pass = pair && (pair.pub || pair.epub) ? pair : alias && typeof args[1] === 'string' ? args[1] : null; - var cb = args.filter(arg => typeof arg === 'function')[0] || null; // cb now can stand anywhere, after alias/pass or pair - var opt = args && args.length > 1 && typeof args[args.length-1] === 'object' ? args[args.length-1] : {}; // opt is always the last parameter which typeof === 'object' and stands after cb - - var gun = this, cat = (gun._), root = gun.back(-1); - cb = cb || noop; - opt = opt || {}; - if(false !== opt.check){ - var err; - if(!alias){ err = "No user."; } - if((pass||'').length < 8){ err = "Password too short!"; } - if(err){ - cb({err: Gun.log(err)}); - return gun; - } - } - if(cat.ing){ - (cb || noop)({err: Gun.log("User is already being created or authenticated!"), wait: true}); - return gun; - } - cat.ing = true; - var act = {}; - act.a = function(pubs){ - act.pubs = pubs; - if(pubs && !opt.already){ - // If we can enforce that a user name is already taken, it might be nice to try, but this is not guaranteed. - var ack = {err: Gun.log('User already created!')}; - cat.ing = false; - (cb || noop)(ack); - gun.leave(); - return; - } - act.salt = String.random(64); // pseudo-randomly create a salt, then use PBKDF2 function to extend the password with it. - SEA.work(pass, act.salt, act.b); // this will take some short amount of time to produce a proof, which slows brute force attacks. - }; - act.b = function(proof){ - act.proof = proof; - pair ? act.c(pair) : SEA.pair(act.c); // generate a brand new key pair or use the existing. - }; - act.c = function(pair){ - var tmp; - act.pair = pair || {}; - if(tmp = cat.root.user){ - tmp._.sea = pair; - tmp.is = {pub: pair.pub, epub: pair.epub, alias: alias}; - } - // the user's public key doesn't need to be signed. But everything else needs to be signed with it! // we have now automated it! clean up these extra steps now! - act.data = {pub: pair.pub}; - act.d(); - }; - act.d = function(){ - act.data.alias = alias; - act.e(); - }; - act.e = function(){ - act.data.epub = act.pair.epub; - SEA.encrypt({priv: act.pair.priv, epriv: act.pair.epriv}, act.proof, act.f, {raw:1}); // to keep the private key safe, we AES encrypt it with the proof of work! - }; - act.f = function(auth){ - act.data.auth = JSON.stringify({ek: auth, s: act.salt}); - act.g(act.data.auth); - }; - act.g = function(auth){ var tmp; - act.data.auth = act.data.auth || auth; - root.get(tmp = '~'+act.pair.pub).put(act.data).on(act.h); // awesome, now we can actually save the user with their public key as their ID. - var link = {}; link[tmp] = {'#': tmp}; root.get('~@'+alias).put(link).get(tmp).on(act.i); // next up, we want to associate the alias with the public key. So we add it to the alias list. - }; - act.h = function(data, key, msg, eve){ - eve.off(); act.h.ok = 1; act.i(); - }; - act.i = function(data, key, msg, eve){ - if(eve){ act.i.ok = 1; eve.off(); } - if(!act.h.ok || !act.i.ok){ return } - cat.ing = false; - cb({ok: 0, pub: act.pair.pub}); // callback that the user has been created. (Note: ok = 0 because we didn't wait for disk to ack) - if(noop === cb){ pair ? gun.auth(pair) : gun.auth(alias, pass); } // if no callback is passed, auto-login after signing up. - }; - root.get('~@'+alias).once(act.a); - return gun; - }; - User.prototype.leave = function(opt, cb){ - var gun = this, user = (gun.back(-1)._).user; - if(user){ - delete user.is; - delete user._.is; - delete user._.sea; - } - if(SEA.window){ - try{var sS = {}; - sS = window.sessionStorage; - delete sS.recall; - delete sS.pair; - }catch(e){} } - return gun; - }; - })(USE, './create'); - USE(function(module){ - var User = USE('./user'), SEA = User.SEA, Gun = User.GUN, noop = function(){}; - // now that we have created a user, we want to authenticate them! - User.prototype.auth = function(...args){ // TODO: this PR with arguments need to be cleaned up / refactored. - var pair = typeof args[0] === 'object' && (args[0].pub || args[0].epub) ? args[0] : typeof args[1] === 'object' && (args[1].pub || args[1].epub) ? args[1] : null; - var alias = !pair && typeof args[0] === 'string' ? args[0] : null; - var pass = (alias || (pair && !(pair.priv && pair.epriv))) && typeof args[1] === 'string' ? args[1] : null; - var cb = args.filter(arg => typeof arg === 'function')[0] || null; // cb now can stand anywhere, after alias/pass or pair - var opt = args && args.length > 1 && typeof args[args.length-1] === 'object' ? args[args.length-1] : {}; // opt is always the last parameter which typeof === 'object' and stands after cb - - var gun = this, cat = (gun._), root = gun.back(-1); - - if(cat.ing){ - (cb || noop)({err: Gun.log("User is already being created or authenticated!"), wait: true}); - return gun; - } - cat.ing = true; - - var act = {}, u, tries = 9; - act.a = function(data){ - if(!data){ return act.b() } - if(!data.pub){ - var tmp = []; Object.keys(data).forEach(function(k){ if('_'==k){ return } tmp.push(data[k]); }); - return act.b(tmp); - } - if(act.name){ return act.f(data) } - act.c((act.data = data).auth); - }; - act.b = function(list){ - var get = (act.list = (act.list||[]).concat(list||[])).shift(); - if(u === get){ - if(act.name){ return act.err('Your user account is not published for dApps to access, please consider syncing it online, or allowing local access by adding your device as a peer.') } - if(alias && tries--){ - root.get('~@'+alias).once(act.a); - return; - } - return act.err('Wrong user or password.') - } - root.get(get).once(act.a); - }; - act.c = function(auth){ - if(u === auth){ return act.b() } - if('string' == typeof auth){ return act.c(obj_ify(auth)) } // in case of legacy - SEA.work(pass, (act.auth = auth).s, act.d, act.enc); // the proof of work is evidence that we've spent some time/effort trying to log in, this slows brute force. - }; - act.d = function(proof){ - SEA.decrypt(act.auth.ek, proof, act.e, act.enc); - }; - act.e = function(half){ - if(u === half){ - if(!act.enc){ // try old format - act.enc = {encode: 'utf8'}; - return act.c(act.auth); - } act.enc = null; // end backwards - return act.b(); - } - act.half = half; - act.f(act.data); - }; - act.f = function(pair){ - var half = act.half || {}, data = act.data || {}; - act.g(act.lol = {pub: pair.pub || data.pub, epub: pair.epub || data.epub, priv: pair.priv || half.priv, epriv: pair.epriv || half.epriv}); - }; - act.g = function(pair){ - if(!pair || !pair.pub || !pair.epub){ return act.b() } - act.pair = pair; - var user = (root._).user, at = (user._); - var upt = at.opt; - at = user._ = root.get('~'+pair.pub)._; - at.opt = upt; - // add our credentials in-memory only to our root user instance - user.is = {pub: pair.pub, epub: pair.epub, alias: alias || pair.pub}; - at.sea = act.pair; - cat.ing = false; - try{if(pass && u == (obj_ify(cat.root.graph['~'+pair.pub].auth)||'')[':']){ opt.shuffle = opt.change = pass; } }catch(e){} // migrate UTF8 & Shuffle! - opt.change? act.z() : (cb || noop)(at); - if(SEA.window && ((gun.back('user')._).opt||opt).remember){ - // TODO: this needs to be modular. - try{var sS = {}; - sS = window.sessionStorage; // TODO: FIX BUG putting on `.is`! - sS.recall = true; - sS.pair = JSON.stringify(pair); // auth using pair is more reliable than alias/pass - }catch(e){} - } - try{ - if(root._.tag.auth){ // auth handle might not be registered yet - (root._).on('auth', at); // TODO: Deprecate this, emit on user instead! Update docs when you do. - } else { setTimeout(function(){ (root._).on('auth', at); },1); } // if not, hackily add a timeout. - //at.on('auth', at) // Arrgh, this doesn't work without event "merge" code, but "merge" code causes stack overflow and crashes after logging in & trying to write data. - }catch(e){ - Gun.log("Your 'auth' callback crashed with:", e); - } - }; - act.h = function(data){ - if(!data){ return act.b() } - alias = data.alias; - if(!alias) - alias = data.alias = "~" + pair.pub; - if(!data.auth){ - return act.g(pair); - } - pair = null; - act.c((act.data = data).auth); - }; - act.z = function(){ - // password update so encrypt private key using new pwd + salt - act.salt = String.random(64); // pseudo-random - SEA.work(opt.change, act.salt, act.y); - }; - act.y = function(proof){ - SEA.encrypt({priv: act.pair.priv, epriv: act.pair.epriv}, proof, act.x, {raw:1}); - }; - act.x = function(auth){ - act.w(JSON.stringify({ek: auth, s: act.salt})); - }; - act.w = function(auth){ - if(opt.shuffle){ // delete in future! - console.log('migrate core account from UTF8 & shuffle'); - var tmp = {}; Object.keys(act.data).forEach(function(k){ tmp[k] = act.data[k]; }); - delete tmp._; - tmp.auth = auth; - root.get('~'+act.pair.pub).put(tmp); - } // end delete - root.get('~'+act.pair.pub).get('auth').put(auth, cb || noop); - }; - act.err = function(e){ - var ack = {err: Gun.log(e || 'User cannot be found!')}; - cat.ing = false; - (cb || noop)(ack); - }; - act.plugin = function(name){ - if(!(act.name = name)){ return act.err() } - var tmp = [name]; - if('~' !== name[0]){ - tmp[1] = '~'+name; - tmp[2] = '~@'+name; - } - act.b(tmp); - }; - if(pair){ - if(pair.priv && pair.epriv) - act.g(pair); - else - root.get('~'+pair.pub).once(act.h); - } else - if(alias){ - root.get('~@'+alias).once(act.a); - } else - if(!alias && !pass){ - SEA.name(act.plugin); - } - return gun; - }; - function obj_ify(o){ - if('string' != typeof o){ return o } - try{o = JSON.parse(o); - }catch(e){o={};} return o; - } - })(USE, './auth'); - USE(function(module){ - var User = USE('./user'), SEA = User.SEA; - User.prototype.recall = function(opt, cb){ - var gun = this, root = gun.back(-1); - opt = opt || {}; - if(opt && opt.sessionStorage){ - if(SEA.window){ - try{ - var sS = {}; - sS = window.sessionStorage; // TODO: FIX BUG putting on `.is`! - if(sS){ - (root._).opt.remember = true; - ((gun.back('user')._).opt||opt).remember = true; - if(sS.recall || sS.pair) root.user().auth(JSON.parse(sS.pair), cb); // pair is more reliable than alias/pass - } - }catch(e){} - } - return gun; - } - /* - TODO: copy mhelander's expiry code back in. - Although, we should check with community, - should expiry be core or a plugin? - */ - return gun; - }; - })(USE, './recall'); - USE(function(module){ - var User = USE('./user'), SEA = User.SEA, Gun = User.GUN, noop = function(){}; - User.prototype.pair = function(){ - var user = this, proxy; // undeprecated, hiding with proxies. - try{ proxy = new Proxy({DANGER:'\u2620'}, {get: function(t,p,r){ - if(!user.is || !(user._||'').sea){ return } - return user._.sea[p]; - }});}catch(e){} - return proxy; - }; - // If authenticated user wants to delete his/her account, let's support it! - User.prototype.delete = async function(alias, pass, cb){ - console.log("user.delete() IS DEPRECATED AND WILL BE MOVED TO A MODULE!!!"); - var gun = this, root = gun.back(-1), user = gun.back('user'); - try { - user.auth(alias, pass, function(ack){ - var pub = (user.is||{}).pub; - // Delete user data - user.map().once(function(){ this.put(null); }); - // Wipe user data from memory - user.leave(); - (cb || noop)({ok: 0}); - }); - } catch (e) { - Gun.log('User.delete failed! Error:', e); - } - return gun; - }; - User.prototype.alive = async function(){ - console.log("user.alive() IS DEPRECATED!!!"); - const gunRoot = this.back(-1); - try { - // All is good. Should we do something more with actual recalled data? - await authRecall(gunRoot); - return gunRoot._.user._ - } catch (e) { - const err = 'No session!'; - Gun.log(err); - throw { err } - } - }; - User.prototype.trust = async function(user){ - console.log("`.trust` API MAY BE DELETED OR CHANGED OR RENAMED, DO NOT USE!"); - // TODO: BUG!!! SEA `node` read listener needs to be async, which means core needs to be async too. - //gun.get('alice').get('age').trust(bob); - if (Gun.is(user)) { - user.get('pub').get((ctx, ev) => { - console.log(ctx, ev); - }); - } - user.get('trust').get(path).put(theirPubkey); - - // do a lookup on this gun chain directly (that gets bob's copy of the data) - // do a lookup on the metadata trust table for this path (that gets all the pubkeys allowed to write on this path) - // do a lookup on each of those pubKeys ON the path (to get the collab data "layers") - // THEN you perform Jachen's mix operation - // and return the result of that to... - }; - User.prototype.grant = function(to, cb){ - console.log("`.grant` API MAY BE DELETED OR CHANGED OR RENAMED, DO NOT USE!"); - var gun = this, user = gun.back(-1).user(), pair = user._.sea, path = ''; - gun.back(function(at){ if(at.is){ return } path += (at.get||''); }); - (async function(){ - var enc, sec = await user.get('grant').get(pair.pub).get(path).then(); - sec = await SEA.decrypt(sec, pair); - if(!sec){ - sec = SEA.random(16).toString(); - enc = await SEA.encrypt(sec, pair); - user.get('grant').get(pair.pub).get(path).put(enc); - } - var pub = to.get('pub').then(); - var epub = to.get('epub').then(); - pub = await pub; epub = await epub; - var dh = await SEA.secret(epub, pair); - enc = await SEA.encrypt(sec, dh); - user.get('grant').get(pub).get(path).put(enc, cb); - }()); - return gun; - }; - User.prototype.secret = function(data, cb){ - console.log("`.secret` API MAY BE DELETED OR CHANGED OR RENAMED, DO NOT USE!"); - var gun = this, user = gun.back(-1).user(), pair = user.pair(), path = ''; - gun.back(function(at){ if(at.is){ return } path += (at.get||''); }); - (async function(){ - var enc, sec = await user.get('trust').get(pair.pub).get(path).then(); - sec = await SEA.decrypt(sec, pair); - if(!sec){ - sec = SEA.random(16).toString(); - enc = await SEA.encrypt(sec, pair); - user.get('trust').get(pair.pub).get(path).put(enc); - } - enc = await SEA.encrypt(data, sec); - gun.put(enc, cb); - }()); - return gun; - }; - - /** - * returns the decrypted value, encrypted by secret - * @returns {Promise} - // Mark needs to review 1st before officially supported - User.prototype.decrypt = function(cb) { - let gun = this, - path = '' - gun.back(function(at) { - if (at.is) { - return - } - path += at.get || '' - }) - return gun - .then(async data => { - if (data == null) { - return - } - const user = gun.back(-1).user() - const pair = user.pair() - let sec = await user - .get('trust') - .get(pair.pub) - .get(path) - sec = await SEA.decrypt(sec, pair) - if (!sec) { - return data - } - let decrypted = await SEA.decrypt(data, sec) - return decrypted - }) - .then(res => { - cb && cb(res) - return res - }) - } - */ - module.exports = User; - })(USE, './share'); - USE(function(module){ - var SEA = USE('./sea'), S = USE('./settings'), noop = function() {}, u; - var Gun = (''+u != typeof window)? (window.Gun||{on:noop}) : USE((''+u === typeof MODULE?'.':'')+'./gun', 1); - // After we have a GUN extension to make user registration/login easy, we then need to handle everything else. - - // We do this with a GUN adapter, we first listen to when a gun instance is created (and when its options change) - Gun.on('opt', function(at){ - if(!at.sea){ // only add SEA once per instance, on the "at" context. - at.sea = {own: {}}; - at.on('put', check, at); // SEA now runs its firewall on HAM diffs, not all i/o. - } - this.to.next(at); // make sure to call the "next" middleware adapter. - }); - - // Alright, this next adapter gets run at the per node level in the graph database. - // correction: 2020 it gets run on each key/value pair in a node upon a HAM diff. - // This will let us verify that every property on a node has a value signed by a public key we trust. - // If the signature does not match, the data is just `undefined` so it doesn't get passed on. - // If it does match, then we transform the in-memory "view" of the data into its plain value (without the signature). - // Now NOTE! Some data is "system" data, not user data. Example: List of public keys, aliases, etc. - // This data is self-enforced (the value can only match its ID), but that is handled in the `security` function. - // From the self-enforced data, we can see all the edges in the graph that belong to a public key. - // Example: ~ASDF is the ID of a node with ASDF as its public key, signed alias and salt, and - // its encrypted private key, but it might also have other signed values on it like `profile = ` edge. - // Using that directed edge's ID, we can then track (in memory) which IDs belong to which keys. - // Here is a problem: Multiple public keys can "claim" any node's ID, so this is dangerous! - // This means we should ONLY trust our "friends" (our key ring) public keys, not any ones. - // I have not yet added that to SEA yet in this alpha release. That is coming soon, but beware in the meanwhile! - - function check(msg){ // REVISE / IMPROVE, NO NEED TO PASS MSG/EVE EACH SUB? - var eve = this, at = eve.as, put = msg.put, soul = put['#'], key = put['.'], val = put[':'], state = put['>'], id = msg['#'], tmp; - if(!soul || !key){ return } - if((msg._||'').faith && (at.opt||'').faith && 'function' == typeof msg._){ - SEA.opt.pack(put, function(raw){ - SEA.verify(raw, false, function(data){ // this is synchronous if false - put['='] = SEA.opt.unpack(data); - eve.to.next(msg); - });}); - return - } - var no = function(why){ at.on('in', {'@': id, err: msg.err = why}); }; // exploit internal relay stun for now, maybe violates spec, but testing for now. // Note: this may be only the sharded message, not original batch. - //var no = function(why){ msg.ack(why) }; - (msg._||'').DBG && ((msg._||'').DBG.c = +new Date); - if(0 <= soul.indexOf(' { - if (certificate.m && certificate.s && certificant && pub) - // now verify certificate - return SEA.verify(certificate, pub, data => { // check if "pub" (of the graph owner) really issued this cert - if (u !== data && u !== data.e && msg.put['>'] && msg.put['>'] > parseFloat(data.e)) return no("Certificate expired.") // certificate expired - // "data.c" = a list of certificants/certified users - // "data.w" = lex WRITE permission, in the future, there will be "data.r" which means lex READ permission - if (u !== data && data.c && data.w && (data.c === certificant || data.c.indexOf('*' ) > -1)) { - // ok, now "certificant" is in the "certificants" list, but is "path" allowed? Check path - let path = soul.indexOf('/') > -1 ? soul.replace(soul.substring(0, soul.indexOf('/') + 1), '') : ''; - String.match = String.match || Gun.text.match; - const w = Array.isArray(data.w) ? data.w : typeof data.w === 'object' || typeof data.w === 'string' ? [data.w] : []; - for (const lex of w) { - if ((String.match(path, lex['#']) && String.match(key, lex['.'])) || (!lex['.'] && String.match(path, lex['#'])) || (!lex['#'] && String.match(key, lex['.'])) || String.match((path ? path + '/' + key : key), lex['#'] || lex)) { - // is Certificant forced to present in Path - if (lex['+'] && lex['+'].indexOf('*') > -1 && path && path.indexOf(certificant) == -1 && key.indexOf(certificant) == -1) return no(`Path "${path}" or key "${key}" must contain string "${certificant}".`) - // path is allowed, but is there any WRITE block? Check it out - if (data.wb && (typeof data.wb === 'string' || ((data.wb || {})['#']))) { // "data.wb" = path to the WRITE block - var root = eve.as.root.$.back(-1); - if (typeof data.wb === 'string' && '~' !== data.wb.slice(0, 1)) root = root.get('~' + pub); - return root.get(data.wb).get(certificant).once(value => { // TODO: INTENT TO DEPRECATE. - if (value && (value === 1 || value === true)) return no(`Certificant ${certificant} blocked.`) - return cb(data) - }) - } - return cb(data) - } - } - return no("Certificate verification fail.") - } - }) - return - }; - - if ('pub' === key && '~' + pub === soul) { - if (val === pub) return eve.to.next(msg) // the account MUST match `pub` property that equals the ID of the public key. - return no("Account not same!") - } - - if ((tmp = user.is) && tmp.pub && !raw['*'] && !raw['+'] && (pub === tmp.pub || (pub !== tmp.pub && ((msg._.msg || {}).opt || {}).cert))){ - SEA.opt.pack(msg.put, packed => { - SEA.sign(packed, (user._).sea, async function(data) { - if (u === data) return no(SEA.err || 'Signature fail.') - msg.put[':'] = {':': tmp = SEA.opt.unpack(data.m), '~': data.s}; - msg.put['='] = tmp; - - // if writing to own graph, just allow it - if (pub === user.is.pub) { - if (tmp = link_is(val)) (at.sea.own[tmp] = at.sea.own[tmp] || {})[pub] = 1; - JSON.stringifyAsync(msg.put[':'], function(err,s){ - if(err){ return no(err || "Stringify error.") } - msg.put[':'] = s; - return eve.to.next(msg); - }); - return - } - - // if writing to other's graph, check if cert exists then try to inject cert into put, also inject self pub so that everyone can verify the put - if (pub !== user.is.pub && ((msg._.msg || {}).opt || {}).cert) { - const cert = await S.parse(msg._.msg.opt.cert); - // even if cert exists, we must verify it - if (cert && cert.m && cert.s) - verify(cert, user.is.pub, _ => { - msg.put[':']['+'] = cert; // '+' is a certificate - msg.put[':']['*'] = user.is.pub; // '*' is pub of the user who puts - JSON.stringifyAsync(msg.put[':'], function(err,s){ - if(err){ return no(err || "Stringify error.") } - msg.put[':'] = s; - return eve.to.next(msg); - }); - return - }); - } - }, {raw: 1}); - }); - return; - } - - SEA.opt.pack(msg.put, packed => { - SEA.verify(packed, raw['*'] || pub, function(data){ var tmp; - data = SEA.opt.unpack(data); - if (u === data) return no("Unverified data.") // make sure the signature matches the account it claims to be on. // reject any updates that are signed with a mismatched account. - if ((tmp = link_is(data)) && pub === SEA.opt.pub(tmp)) (at.sea.own[tmp] = at.sea.own[tmp] || {})[pub] = 1; - - // check if cert ('+') and putter's pub ('*') exist - if (raw['+'] && raw['+']['m'] && raw['+']['s'] && raw['*']) - // now verify certificate - verify(raw['+'], raw['*'], _ => { - msg.put['='] = data; - return eve.to.next(msg); - }); - else { - msg.put['='] = data; - return eve.to.next(msg); - } - }); - }); - return - }; - check.any = function(eve, msg, val, key, soul, at, no, user){ if(at.opt.secure){ return no("Soul missing public key at '" + key + "'.") } - // TODO: Ask community if should auto-sign non user-graph data. - at.on('secure', function(msg){ this.off(); - if(!at.opt.secure){ return eve.to.next(msg) } - no("Data cannot be changed."); - }).on.on('secure', msg); - return; - }; - - var valid = Gun.valid, link_is = function(d,l){ return 'string' == typeof (l = valid(d)) && l }; - - var pubcut = /[^\w_-]/; // anything not alphanumeric or _ - - SEA.opt.pub = function(s){ - if(!s){ return } - s = s.split('~'); - if(!s || !(s = s[1])){ return } - s = s.split(pubcut).slice(0,2); - if(!s || 2 != s.length){ return } - if('@' === (s[0]||'')[0]){ return } - s = s.slice(0,2).join('.'); - return s; - }; - SEA.opt.stringy = function(t){ - // TODO: encrypt etc. need to check string primitive. Make as breaking change. - }; - SEA.opt.pack = function(d,cb,k, n,s){ var tmp, f; // pack for verifying - if(SEA.opt.check(d)){ return cb(d) } - if(d && d['#'] && d['.'] && d['>']){ tmp = d[':']; f = 1; } - JSON.parseAsync(f? tmp : d, function(err, meta){ - var sig = ((u !== (meta||'')[':']) && (meta||'')['~']); // or just ~ check? - if(!sig){ cb(d); return } - cb({m: {'#':s||d['#'],'.':k||d['.'],':':(meta||'')[':'],'>':d['>']||Gun.state.is(n, k)}, s: sig}); - }); - }; - var O = SEA.opt; - SEA.opt.unpack = function(d, k, n){ var tmp; - if(u === d){ return } - if(d && (u !== (tmp = d[':']))){ return tmp } - k = k || O.fall_key; if(!n && O.fall_val){ n = {}; n[k] = O.fall_val; } - if(!k || !n){ return } - if(d === n[k]){ return d } - if(!SEA.opt.check(n[k])){ return d } - var soul = (n && n._ && n._['#']) || O.fall_soul, s = Gun.state.is(n, k) || O.fall_state; - if(d && 4 === d.length && soul === d[0] && k === d[1] && fl(s) === fl(d[3])){ - return d[2]; - } - if(s < SEA.opt.shuffle_attack){ - return d; - } - }; - SEA.opt.shuffle_attack = 1546329600000; // Jan 1, 2019 - var fl = Math.floor; // TODO: Still need to fix inconsistent state issue. - // TODO: Potential bug? If pub/priv key starts with `-`? IDK how possible. - - })(USE, './index'); - }()); - }); - - // I don't quite know where this should go yet, so putting it here - // what will probably wind up happening is that minimal AXE logic added to end of gun.js - // and then rest of AXE logic (here) will be moved back to gun/axe.js - // but for now... I gotta rush this out! - var Gun$3 = (typeof window !== "undefined")? window.Gun : gun, u$1; - Gun$3.on('opt', function(at){ start(at); this.to.next(at); }); // make sure to call the "next" middleware adapter. - // TODO: BUG: panic test/panic/1 & test/panic/3 fail when AXE is on. - function start(root){ - if(root.axe){ return } - var opt = root.opt; - if(false === opt.axe){ return } - if((typeof process !== "undefined") && 'false' === ''+(process.env||'').AXE){ return } - Gun$3.log.once("AXE", "AXE relay enabled!"); - var axe = root.axe = {}; - var mesh = opt.mesh = opt.mesh || Gun$3.Mesh(root); // DAM! - var dup = root.dup; - - mesh.way = function(msg){ - if(!msg){ return } - //relayUp(msg); // TEMPORARY!!! - if(msg.get){ return GET(msg) } - if(msg.put){ return } - fall(msg); - }; - - function GET(msg){ - if(!msg){ return } - var via = (msg._||'').via, ref; - if(!via || !via.id){ return fall(msg) } - // SUBSCRIPTION LOGIC MOVED TO GET'S ACK REPLY. - if(!(ref = REF(msg)._)){ return fall(msg) } - ref.asked = +new Date; - GET.turn(msg, ref.route, 0); - } - GET.turn = function(msg, route, turn){ - var tmp = msg['#'], tag = dup.s[tmp], next; - if(!tmp || !tag){ return } // message timed out, GUN may require us to relay, tho AXE does not like that. Rethink? - // TOOD: BUG! Handle edge case where live updates occur while these turn hashes are being checked (they'll never be consistent), but we don't want to degrade to O(N), if we know the via asking peer got an update, then we should do something like cancel these turns asking for data. - // Ideas: Save a random seed that sorts the route, store it and the index. // Or indexing on lowest latency is probably better. - clearTimeout(tag.lack); - if(tag.ack && (tmp = tag['##']) && msg['##'] === tmp){ return } // hashes match, stop asking other peers! - next = (Object.maps(route||opt.peers)).slice(turn = turn || 0); - if(!next.length){ - if(!route){ return } // asked all peers, stop asking! - GET.turn(msg, u$1, 0); // asked all subs, now now ask any peers. (not always the best idea, but stays ) - return; - } - setTimeout.each(next, function(id){ - var peer = opt.peers[id]; turn++; - if(!peer || !peer.wire){ route && route.delete(id); return } // bye! // TODO: CHECK IF 0 OTHER PEERS & UNSUBSCRIBE - if(mesh.say(msg, peer) === false){ return } // was self - if(0 == (turn % 3)){ return 1 } - }, function(){ - tag['##'] = msg['##']; // should probably set this in a more clever manner, do live `in` checks ++ --, etc. but being lazy for now. // TODO: Yes, see `in` TODO, currently this might match against only in-mem cause no other peers reply, which is "fine", but could cause a false positive. - tag.lack = setTimeout(function(){ GET.turn(msg, route, turn); }, 25); - }, 3); - }; - function fall(msg){ mesh.say(msg, opt.peers); } - function REF(msg){ - var ref = '', soul; - if(!msg || !msg.get){ return ref } - if('string' == typeof (soul = msg.get['#'])){ ref = root.$.get(soul); } - return ref; - } - function LEX(lex){ return (lex = lex || '')['='] || lex['*'] || lex['>'] || lex } - - root.on('in', function(msg){ var to = this.to, tmp; - if((tmp = msg['@']) && (tmp = dup.s[tmp])){ - tmp.ack = (tmp.ack || 0) + 1; // count remote ACKs to GET. // TODO: If mismatch, should trigger next asks. - if(tmp.it && tmp.it.get && msg.put){ // WHEN SEEING A PUT REPLY TO A GET... - var get = tmp.it.get||'', ref = REF(tmp.it)._, via = (tmp.it._||'').via||'', sub; - if(via && ref){ // SUBSCRIBE THE PEER WHO ASKED VIA FOR IT: - //console.log("SUBSCRIBING", Object.maps(ref.route||''), "to", LEX(get['#'])); - via.id && (ref.route || (ref.route = new Object.Map)).set(via.id, via); - sub = (via.sub || (via.sub = new Object.Map)); - ref && (sub.get(LEX(get['#'])) || (sub.set(LEX(get['#']), sub = new Object.Map) && sub)).set(LEX(get['.']), 1); // {soul: {'':1, has: 1}} - - via = (msg._||'').via||''; - if(via){ // BIDIRECTIONAL SUBSCRIBE: REPLIER IS NOW SUBSCRIBED. DO WE WANT THIS? - via.id && (ref.route || (ref.route = new Object.Map)).set(via.id, via); - sub = (via.sub || (via.sub = new Object.Map)); - if(ref){ - var soul = LEX(get['#']), sift = sub.get(soul), has = LEX(get['.']); - if(has){ - (sift || (sub.set(soul, sift = new Object.Map) && sift)).set(has, 1); - } else - if(!sift){ - sub.set(soul, sift = new Object.Map); - sift.set('', 1); - } - } - } - } - } - if((tmp = tmp.back)){ // backtrack OKs since AXE splits PUTs up. - setTimeout.each(Object.keys(tmp), function(id){ - to.next({'#': msg['#'], '@': id, ok: msg.ok}); - }); - return; - } - } - to.next(msg); - }); - - root.on('create', function(root){ - this.to.next(root); - root.on('put', function(msg){ - var eve = this, put = msg.put, soul = put['#'], has = put['.'], val = put[':'], state = put['>']; - eve.to.next(msg); - if(msg['@']){ return } // acks send existing data, not updates, so no need to resend to others. - if(!soul || !has){ return } - var ref = root.$.get(soul)._, route = (ref||'').route; - if(!route){ return } - if(ref.skip){ ref.skip.now = msg['#']; return } - (ref.skip = {now: msg['#']}).to = setTimeout(function(){ - setTimeout.each(Object.maps(route), function(pid){ var peer, tmp; - var skip = ref.skip||''; ref.skip = null; - if(!(peer = route.get(pid))){ return } - if(!peer.wire){ route.delete(pid); return } // bye! - var sub = (peer.sub || (peer.sub = new Object.Map)).get(soul); - if(!sub){ return } - if(!sub.get(has) && !sub.get('')){ return } - var put = peer.put || (peer.put = {}); - var node = root.graph[soul], tmp; - if(node && u$1 !== (tmp = node[has])){ - state = state_is(node, has); - val = tmp; - } - put[soul] = state_ify(put[soul], has, state, val, soul); - tmp = dup.track(peer.next = peer.next || String.random(9)); - (tmp.back || (tmp.back = {}))[''+skip.now||msg['#']] = 1; - if(peer.to){ return } - peer.to = setTimeout(function(){ flush(peer); }, opt.gap); - }); }, 9); - }); - }); - - function flush(peer){ - var msg = {'#': peer.next, put: peer.put, ok: {'@': 3, '/': mesh.near}}; // BUG: TODO: sub count! - // TODO: what about DAM's >< dedup? Current thinking is, don't use it, however, you could store first msg# & latest msg#, and if here... latest === first then likely it is the same >< thing, so if(firstMsg['><'][peer.id]){ return } don't send. - peer.next = peer.put = peer.to = null; - mesh.say(msg, peer); - } - var state_ify = Gun$3.state.ify, state_is = Gun$3.state.is; - (function(){ // THIS IS THE UP MODULE; - axe.up = {}; - var hi = mesh.hear['?']; // lower-level integration with DAM! This is abnormal but helps performance. - mesh.hear['?'] = function(msg, peer){ var p; // deduplicate unnecessary connections: - hi(msg, peer); - if(!peer.pid){ return } - if(peer.pid === opt.pid){ mesh.bye(peer); return } // if I connected to myself, drop. - if(p = axe.up[peer.pid]){ // if we both connected to each other... - if(p === peer){ return } // do nothing if no conflict, - if(opt.pid > peer.pid){ // else deterministically sort - p = peer; // so we will wind up choosing the same to keep - peer = axe.up[p.pid]; // and the same to drop. - } - p.url = p.url || peer.url; // copy if not - mesh.bye(peer); // drop - axe.up[p.pid] = p; // update same to be same. - return; - } - if(!peer.url){ return } - axe.up[peer.pid] = peer; - if(axe.stay){ axe.stay(); } - }; - - mesh.hear['opt'] = function(msg, peer){ - if(msg.ok){ return } - var tmp = msg.opt; - if(!tmp){ return } - tmp = tmp.peers; - if(!tmp || 'string' != typeof tmp){ return } - if(99 <= Object.keys(axe.up).length){ return } // 99 TEMPORARILY UNTIL BENCHMARKED! - mesh.hi({id: tmp, url: tmp, retry: 9}); - if(peer){ mesh.say({dam: 'opt', ok: 1, '@': msg['#']}, peer); } - }; - - axe.stay = function(){ - clearTimeout(axe.stay.to); - axe.stay.to = setTimeout(function(tmp, urls){ - if(!(tmp = root.stats && root.stats.stay)){ return } - urls = {}; Object.keys(axe.up||'').forEach(function(p){ - p = (axe.up||'')[p]; if(p.url){ urls[p.url] = {}; } - }); - (tmp.axe = tmp.axe || {}).up = urls; - }, 1000 * 9);//1000 * 60); - }; - setTimeout(function(tmp){ - if(!(tmp = root.stats && root.stats.stay && root.stats.stay.axe)){ return } - if(!(tmp = tmp.up)){ return } - if(!(tmp instanceof Array)){ tmp = Object.keys(tmp); } - setTimeout.each(tmp||[], function(url){ mesh.hear.opt({opt: {peers: url}}); }); - },1000); - }()); - (function(){ // THIS IS THE MOB MODULE; - //return; // WORK IN PROGRESS, TEST FINALIZED, NEED TO MAKE STABLE. - /* - AXE should have a couple of threshold items... - let's pretend there is a variable max peers connected - mob = 10000 - if we get more peers than that... - we should start sending those peers a remote command - that they should connect to this or that other peer - and then once they (or before they do?) drop them from us. - sake of the test... gonna set that peer number to 1. - The mob threshold might be determined by other factors, - like how much RAM or CPU stress we have. - */ - opt.mob = opt.mob || 9900; // should be based on ulimit, some clouds as low as 10K. - - // handle rebalancing a mob of peers: - root.on('hi', function(peer){ - this.to.next(peer); - if(peer.url){ return } // I am assuming that if we are wanting to make an outbound connection to them, that we don't ever want to drop them unless our actual config settings change. - var count = /*Object.keys(opt.peers).length ||*/ mesh.near; // TODO: BUG! This is slow, use .near, but near is buggy right now, fix in DAM. - //console.log("are we mobbed?", opt.mob, Object.keys(opt.peers).length, mesh.near); - if(opt.mob >= count){ return } // TODO: Make dynamic based on RAM/CPU also. Or possibly even weird stuff like opt.mob / axe.up length? - var peers = {};Object.keys(axe.up).forEach(function(p){ p = axe.up[p]; p.url && (peers[p.url]={}); }); - // TODO: BUG!!! Infinite reconnection loop happens if not enough relays, or if some are missing. For instance, :8766 says to connect to :8767 which then says to connect to :8766. To not DDoS when system overload, figure clever way to tell peers to retry later, that network does not have enough capacity? - mesh.say({dam: 'mob', mob: count, peers: peers}, peer); - setTimeout(function(){ mesh.bye(peer); }, 9); // something with better perf? - }); - root.on('bye', function(peer){ - this.to.next(peer); - }); - - }()); - } - (function(){ - var from = Array.from; - Object.maps = function(o){ - if(from && o instanceof Map){ return from(o.keys()) } - if(o instanceof Object.Map){ o = o.s; } - return Object.keys(o); - }; - if(from){ return Object.Map = Map } - (Object.Map = function(){ this.s = {}; }).prototype = {set:function(k,v){this.s[k]=v;return this},get:function(k){return this.s[k]},delete:function(k){delete this.s[k];}}; - }()); - - var axe = createCommonjsModule(function (module) { - (function(){ - - var sT = setTimeout || {}, u; - if(typeof window !== ''+u){ sT.window = window; } - var AXE = (sT.window||'').AXE || function(){}; - if(AXE.window = sT.window){ AXE.window.AXE = AXE; } - - var Gun = (AXE.window||'').GUN || gun; - (Gun.AXE = AXE).GUN = AXE.Gun = Gun; - - Gun.on('opt', function(at){ start(at) ; this.to.next(at); }); // make sure to call the "next" middleware adapter. - - function start(root){ - if(root.axe){ return } - var opt = root.opt, peers = opt.peers; - if(false === opt.axe){ return } - if(!Gun.window){ return } // handled by ^ lib/axe.js - var w = Gun.window, lS = w.localStorage || opt.localStorage || {}, loc = w.location || opt.location || {}, nav = w.navigator || opt.navigator || {}; - var axe = root.axe = {}, tmp, id; - var mesh = opt.mesh = opt.mesh || Gun.Mesh(root); // DAM! - - tmp = peers[id = loc.origin + '/gun'] = peers[id] || {}; - tmp.id = tmp.url = id; tmp.retry = tmp.retry || 0; - tmp = peers[id = 'http://localhost:8765/gun'] = peers[id] || {}; - tmp.id = tmp.url = id; tmp.retry = tmp.retry || 0; - Gun.log.once("AXE", "AXE enabled: Trying to find network via (1) local peer (2) last used peers (3) a URL parameter, and last (4) hard coded peers."); - Gun.log.once("AXEWarn", "Warning: AXE is in alpha, use only for testing!"); - var last = lS.peers || ''; if(last){ last += ' '; } - last += ((loc.search||'').split('peers=')[1]||'').split('&')[0]; - - root.on('bye', function(peer){ - this.to.next(peer); - if(!peer.url){ return } // ignore WebRTC disconnects for now. - if(!nav.onLine){ peer.retry = 1; } - if(peer.retry){ return } - if(axe.fall){ delete axe.fall[peer.url || peer.id]; } - (function next(){ - if(!axe.fall){ setTimeout(next, 9); return } // not found yet - var fall = Object.keys(axe.fall||''), one = fall[(Math.random()*fall.length) >> 0]; - if(!fall.length){ lS.peers = ''; one = 'https://gunjs.herokuapp.com/gun'; } // out of peers - if(peers[one]){ next(); return } // already choose - mesh.hi(one); - }()); - }); - - root.on('hi', function(peer){ // TEMPORARY! Try to connect all peers. - this.to.next(peer); - if(!peer.url){ return } // ignore WebRTC disconnects for now. - return; // DO NOT COMMIT THIS FEATURE YET! KEEP TESTING NETWORK PERFORMANCE FIRST! - }); - - function found(text){ - - axe.fall = {}; - ((text||'').match(/https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)/ig)||[]).forEach(function(url){ - axe.fall[url] = {url: url, id: url, retry: 0}; // RETRY - }); - - return; - } - - if(last){ found(last); return } - try{ fetch(((loc.search||'').split('axe=')[1]||'').split('&')[0] || loc.axe || 'https://raw.githubusercontent.com/wiki/amark/gun/volunteer.dht.md').then(function(res){ - return res.text() - }).then(function(text){ - found(lS.peers = text); - }).catch(function(){ - found(); // nothing - });}catch(e){found();} - } - try{ if('object' != ''+u){ module.exports = AXE; } }catch(e){} - }()); - }); - - var Gun$4 = (typeof window !== "undefined")? window.Gun : gun; - - Gun$4.on('create', function(root){ - this.to.next(root); - var opt = root.opt; - if(false === opt.multicast){ return } - if((typeof process !== "undefined") && 'false' === ''+(process.env||{}).MULTICAST){ return } - //if(true !== opt.multicast){ return } // disable multicast by default for now. - - var udp = opt.multicast = opt.multicast || {}; - udp.address = udp.address || '233.255.255.255'; - udp.pack = udp.pack || 50000; // UDP messages limited to 65KB. - udp.port = udp.port || 8765; - - var noop = function(){}; - var pid = '2'+Math.random().toString().slice(-8); - var mesh = opt.mesh = opt.mesh || Gun$4.Mesh(root); - var dgram$1; - - try{ dgram$1 = dgram; }catch(e){ return } - var socket = dgram$1.createSocket({type: "udp4", reuseAddr: true}); - socket.bind({port: udp.port, exclusive: true}, function(){ - socket.setBroadcast(true); - socket.setMulticastTTL(128); - }); - - socket.on("listening", function(){ - try { socket.addMembership(udp.address); }catch(e){ console.error(e); return; } - udp.peer = {id: udp.address + ':' + udp.port, wire: socket}; - - udp.peer.say = function(raw){ - var buf = Buffer.from(raw, 'utf8'); - if(udp.pack <= buf.length){ // message too big!!! - return; - } - socket.send(buf, 0, buf.length, udp.port, udp.address, noop); - }; - //opt.mesh.hi(udp.peer); - - Gun$4.log.once('multi', 'Multicast on '+udp.peer.id); - return; // below code only needed for when WebSocket connections desired! - }); - - socket.on("message", function(raw, info) { try { - if(!raw){ return } - raw = raw.toString('utf8'); - if('2'===raw[0]){ return check(raw, info) } - opt.mesh.hear(raw, udp.peer); - - return; // below code only needed for when WebSocket connections desired! - var message; - message = JSON.parse(raw.toString('utf8')); - - if(opt.pid === message.id){ return } // ignore self - - var url = 'http://' + info.address + ':' + (port || (opt.web && opt.web.address()||{}).port) + '/gun'; - if(root.opt.peers[url]){ return } - - //console.log('discovered', url, message, info); - root.$.opt(url); - - } catch(e){ - //console.log('multicast error', e, raw); - return; - } }); - - function say(msg){ - this.to.next(msg); - if(!udp.peer){ return } - mesh.say(msg, udp.peer); - } - - function check(id, info){ var tmp; - if(!udp.peer){ return } - if(!id){ - id = check.id = check.id || Buffer.from(pid, 'utf8'); - socket.send(id, 0, id.length, udp.port, udp.address, noop); - return; - } - if((tmp = root.stats) && (tmp = tmp.gap) && info){ (tmp.near || (tmp.near = {}))[info.address] = info.port || 1; } // STATS! - if(check.on || id === pid){ return } - root.on('out', check.on = say); // TODO: MULTICAST NEEDS TO BE CHECKED FOR NEW CODE SYSTEM!!!!!!!!!! // TODO: This approach seems interferes with other relays, below does not but... - //opt.mesh.hi(udp.peer); // IS THIS CORRECT? - } - - setInterval(check, 1000 * 1); - - }); - - var Gun$5 = (typeof window !== "undefined")? window.Gun : gun; - - Gun$5.on('opt', function(root){ - this.to.next(root); - if(root.once){ return } - if(typeof process === 'undefined'){ return } - if(typeof commonjsRequire === 'undefined'){ return } - if(false === root.opt.stats){ return } - var path = path$1 || {}; - var file = root.opt.file ? path.resolve(root.opt.file).split(path.sep).slice(-1)[0] : 'radata'; - var noop = function(){}; - var os$1 = os || {}; - var fs$1 = fs || {}; - fs$1.existsSync = fs$1.existsSync || path.existsSync; - if(!fs$1.existsSync){ return } - if(!process){ return } - process.uptime = process.uptime || noop; - process.cpuUsage = process.cpuUsage || noop; - process.memoryUsage = process.memoryUsage || noop; - os$1.totalmem = os$1.totalmem || noop; - os$1.freemem = os$1.freemem || noop; - os$1.loadavg = os$1.loadavg || noop; - os$1.cpus = os$1.cpus || noop; - var S = +new Date, W; - var obj_ify = function(o){try{o = JSON.parse(o);}catch(e){o={};}return o;}; - setTimeout(function(){ - root.stats = obj_ify((fs$1.existsSync(__dirname+'/../stats.'+file) && fs$1.readFileSync(__dirname+'/../stats.'+file).toString())) || {}; - root.stats.up = root.stats.up || {}; - root.stats.up.start = root.stats.up.start || +(new Date); - root.stats.up.count = (root.stats.up.count || 0) + 1; - root.stats.stay = root.stats.stay || {}; - root.stats.over = +new Date; - },1); - setInterval(function(){ - if(!root.stats){ root.stats = {}; } - if(W){ return } - var stats = root.stats; - stats.over = -(S - (S = +new Date)); - (stats.up||{}).time = process.uptime(); - stats.memory = process.memoryUsage() || {}; - stats.memory.totalmem = os$1.totalmem(); - stats.memory.freemem = os$1.freemem(); - stats.cpu = process.cpuUsage() || {}; - stats.cpu.loadavg = os$1.loadavg(); - stats.cpu.stack = (((setTimeout||'').turn||'').s||'').length; - stats.peers = {}; - - stats.peers.count = console.STAT.peers || Object.keys(root.opt.peers||{}).length; // TODO: .keys( is slow - stats.node = {}; - stats.node.count = Object.keys(root.graph||{}).length; // TODO: .keys( is slow - stats.all = all; - stats.sites = console.STAT.sites; - all = {}; // will this cause missing stats? - var dam = root.opt.mesh; - if(dam){ - stats.dam = {'in': {count: dam.hear.c, done: dam.hear.d}, 'out': {count: dam.say.c, done: dam.say.d}}; - dam.hear.c = dam.hear.d = dam.say.c = dam.say.d = 0; // reset - stats.peers.time = dam.bye.time || 0; - } - var rad = root.opt.store; rad = rad && rad.stats; - if(rad){ - stats.rad = rad; - root.opt.store.stats = {get:{time:{}, count:0}, put: {time:{}, count:0}}; // reset - } - JSON.stringifyAsync(stats, function(err, raw){ if(err){ return } W = true; - fs$1.writeFile(__dirname+'/../stats.'+file, raw, function(err){ W = false; err && console.log(console.STAT.err = err); console.STAT && console.STAT(S, +new Date - S, 'stats stash'); }); - }); - - //exec("top -b -n 1", function(err, out){ out && fs.writeFile(__dirname+'/../stats.top.'+file, out, noop) }); // was it really seriously actually this? - //}, 1000 * 15); - }, 1000 * 5); - }); - - - var log = Gun$5.log, all = {}, max = 1000; - console.STAT = function(a,b,c,d){ - if('number' == typeof a && 'number' == typeof b && 'string' == typeof c){ - var tmp = (all[c] || (all[c] = [])); - if(max < tmp.push([a,b])){ all[c] = []; } // reset - //return; - } - if(!console.LOG || log.off){ return a } - return log.apply(Gun$5, arguments); - }; - - var server = createCommonjsModule(function (module) { - (function(){ - - var Gun = gun, u; - Gun.serve = serve_1; - //process.env.GUN_ENV = process.env.GUN_ENV || 'debug'; - //console.LOG = {}; // only do this for dev. - Gun.on('opt', function(root){ - if(u === root.opt.super){ root.opt.super = true; } - if(u === root.opt.faith){ root.opt.faith = true; } // HNPERF: This should probably be off, but we're testing performance improvements, please audit. - root.opt.log = root.opt.log || Gun.log; - this.to.next(root); - }); - //require('./file'); - //require('./evict'); - - - module.exports = Gun; - }()); - }); - - var gun$1 = server; - - function _regeneratorRuntime() { - _regeneratorRuntime = function () { - return exports; - }; - var exports = {}, - Op = Object.prototype, - hasOwn = Op.hasOwnProperty, - $Symbol = "function" == typeof Symbol ? Symbol : {}, - iteratorSymbol = $Symbol.iterator || "@@iterator", - asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator", - toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag"; - function define(obj, key, value) { - return Object.defineProperty(obj, key, { - value: value, - enumerable: !0, - configurable: !0, - writable: !0 - }), obj[key]; - } - try { - define({}, ""); - } catch (err) { - define = function (obj, key, value) { - return obj[key] = value; - }; - } - function wrap(innerFn, outerFn, self, tryLocsList) { - var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator, - generator = Object.create(protoGenerator.prototype), - context = new Context(tryLocsList || []); - return generator._invoke = function (innerFn, self, context) { - var state = "suspendedStart"; - return function (method, arg) { - if ("executing" === state) throw new Error("Generator is already running"); - if ("completed" === state) { - if ("throw" === method) throw arg; - return doneResult(); - } - for (context.method = method, context.arg = arg;;) { - var delegate = context.delegate; - if (delegate) { - var delegateResult = maybeInvokeDelegate(delegate, context); - if (delegateResult) { - if (delegateResult === ContinueSentinel) continue; - return delegateResult; - } - } - if ("next" === context.method) context.sent = context._sent = context.arg;else if ("throw" === context.method) { - if ("suspendedStart" === state) throw state = "completed", context.arg; - context.dispatchException(context.arg); - } else "return" === context.method && context.abrupt("return", context.arg); - state = "executing"; - var record = tryCatch(innerFn, self, context); - if ("normal" === record.type) { - if (state = context.done ? "completed" : "suspendedYield", record.arg === ContinueSentinel) continue; - return { - value: record.arg, - done: context.done - }; - } - "throw" === record.type && (state = "completed", context.method = "throw", context.arg = record.arg); - } - }; - }(innerFn, self, context), generator; - } - function tryCatch(fn, obj, arg) { - try { - return { - type: "normal", - arg: fn.call(obj, arg) - }; - } catch (err) { - return { - type: "throw", - arg: err - }; - } - } - exports.wrap = wrap; - var ContinueSentinel = {}; - function Generator() {} - function GeneratorFunction() {} - function GeneratorFunctionPrototype() {} - var IteratorPrototype = {}; - define(IteratorPrototype, iteratorSymbol, function () { - return this; - }); - var getProto = Object.getPrototypeOf, - NativeIteratorPrototype = getProto && getProto(getProto(values([]))); - NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol) && (IteratorPrototype = NativeIteratorPrototype); - var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype); - function defineIteratorMethods(prototype) { - ["next", "throw", "return"].forEach(function (method) { - define(prototype, method, function (arg) { - return this._invoke(method, arg); - }); - }); - } - function AsyncIterator(generator, PromiseImpl) { - function invoke(method, arg, resolve, reject) { - var record = tryCatch(generator[method], generator, arg); - if ("throw" !== record.type) { - var result = record.arg, - value = result.value; - return value && "object" == typeof value && hasOwn.call(value, "__await") ? PromiseImpl.resolve(value.__await).then(function (value) { - invoke("next", value, resolve, reject); - }, function (err) { - invoke("throw", err, resolve, reject); - }) : PromiseImpl.resolve(value).then(function (unwrapped) { - result.value = unwrapped, resolve(result); - }, function (error) { - return invoke("throw", error, resolve, reject); - }); - } - reject(record.arg); - } - var previousPromise; - this._invoke = function (method, arg) { - function callInvokeWithMethodAndArg() { - return new PromiseImpl(function (resolve, reject) { - invoke(method, arg, resolve, reject); - }); - } - return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); - }; - } - function maybeInvokeDelegate(delegate, context) { - var method = delegate.iterator[context.method]; - if (undefined === method) { - if (context.delegate = null, "throw" === context.method) { - if (delegate.iterator.return && (context.method = "return", context.arg = undefined, maybeInvokeDelegate(delegate, context), "throw" === context.method)) return ContinueSentinel; - context.method = "throw", context.arg = new TypeError("The iterator does not provide a 'throw' method"); - } - return ContinueSentinel; - } - var record = tryCatch(method, delegate.iterator, context.arg); - if ("throw" === record.type) return context.method = "throw", context.arg = record.arg, context.delegate = null, ContinueSentinel; - var info = record.arg; - return info ? info.done ? (context[delegate.resultName] = info.value, context.next = delegate.nextLoc, "return" !== context.method && (context.method = "next", context.arg = undefined), context.delegate = null, ContinueSentinel) : info : (context.method = "throw", context.arg = new TypeError("iterator result is not an object"), context.delegate = null, ContinueSentinel); - } - function pushTryEntry(locs) { - var entry = { - tryLoc: locs[0] - }; - 1 in locs && (entry.catchLoc = locs[1]), 2 in locs && (entry.finallyLoc = locs[2], entry.afterLoc = locs[3]), this.tryEntries.push(entry); - } - function resetTryEntry(entry) { - var record = entry.completion || {}; - record.type = "normal", delete record.arg, entry.completion = record; - } - function Context(tryLocsList) { - this.tryEntries = [{ - tryLoc: "root" - }], tryLocsList.forEach(pushTryEntry, this), this.reset(!0); - } - function values(iterable) { - if (iterable) { - var iteratorMethod = iterable[iteratorSymbol]; - if (iteratorMethod) return iteratorMethod.call(iterable); - if ("function" == typeof iterable.next) return iterable; - if (!isNaN(iterable.length)) { - var i = -1, - next = function next() { - for (; ++i < iterable.length;) if (hasOwn.call(iterable, i)) return next.value = iterable[i], next.done = !1, next; - return next.value = undefined, next.done = !0, next; - }; - return next.next = next; - } - } - return { - next: doneResult - }; - } - function doneResult() { - return { - value: undefined, - done: !0 - }; - } - return GeneratorFunction.prototype = GeneratorFunctionPrototype, define(Gp, "constructor", GeneratorFunctionPrototype), define(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, "GeneratorFunction"), exports.isGeneratorFunction = function (genFun) { - var ctor = "function" == typeof genFun && genFun.constructor; - return !!ctor && (ctor === GeneratorFunction || "GeneratorFunction" === (ctor.displayName || ctor.name)); - }, exports.mark = function (genFun) { - return Object.setPrototypeOf ? Object.setPrototypeOf(genFun, GeneratorFunctionPrototype) : (genFun.__proto__ = GeneratorFunctionPrototype, define(genFun, toStringTagSymbol, "GeneratorFunction")), genFun.prototype = Object.create(Gp), genFun; - }, exports.awrap = function (arg) { - return { - __await: arg - }; - }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, asyncIteratorSymbol, function () { - return this; - }), exports.AsyncIterator = AsyncIterator, exports.async = function (innerFn, outerFn, self, tryLocsList, PromiseImpl) { - void 0 === PromiseImpl && (PromiseImpl = Promise); - var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl); - return exports.isGeneratorFunction(outerFn) ? iter : iter.next().then(function (result) { - return result.done ? result.value : iter.next(); - }); - }, defineIteratorMethods(Gp), define(Gp, toStringTagSymbol, "Generator"), define(Gp, iteratorSymbol, function () { - return this; - }), define(Gp, "toString", function () { - return "[object Generator]"; - }), exports.keys = function (object) { - var keys = []; - for (var key in object) keys.push(key); - return keys.reverse(), function next() { - for (; keys.length;) { - var key = keys.pop(); - if (key in object) return next.value = key, next.done = !1, next; - } - return next.done = !0, next; - }; - }, exports.values = values, Context.prototype = { - constructor: Context, - reset: function (skipTempReset) { - if (this.prev = 0, this.next = 0, this.sent = this._sent = undefined, this.done = !1, this.delegate = null, this.method = "next", this.arg = undefined, this.tryEntries.forEach(resetTryEntry), !skipTempReset) for (var name in this) "t" === name.charAt(0) && hasOwn.call(this, name) && !isNaN(+name.slice(1)) && (this[name] = undefined); - }, - stop: function () { - this.done = !0; - var rootRecord = this.tryEntries[0].completion; - if ("throw" === rootRecord.type) throw rootRecord.arg; - return this.rval; - }, - dispatchException: function (exception) { - if (this.done) throw exception; - var context = this; - function handle(loc, caught) { - return record.type = "throw", record.arg = exception, context.next = loc, caught && (context.method = "next", context.arg = undefined), !!caught; - } - for (var i = this.tryEntries.length - 1; i >= 0; --i) { - var entry = this.tryEntries[i], - record = entry.completion; - if ("root" === entry.tryLoc) return handle("end"); - if (entry.tryLoc <= this.prev) { - var hasCatch = hasOwn.call(entry, "catchLoc"), - hasFinally = hasOwn.call(entry, "finallyLoc"); - if (hasCatch && hasFinally) { - if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); - if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); - } else if (hasCatch) { - if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); - } else { - if (!hasFinally) throw new Error("try statement without catch or finally"); - if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); - } - } - } - }, - abrupt: function (type, arg) { - for (var i = this.tryEntries.length - 1; i >= 0; --i) { - var entry = this.tryEntries[i]; - if (entry.tryLoc <= this.prev && hasOwn.call(entry, "finallyLoc") && this.prev < entry.finallyLoc) { - var finallyEntry = entry; - break; - } - } - finallyEntry && ("break" === type || "continue" === type) && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc && (finallyEntry = null); - var record = finallyEntry ? finallyEntry.completion : {}; - return record.type = type, record.arg = arg, finallyEntry ? (this.method = "next", this.next = finallyEntry.finallyLoc, ContinueSentinel) : this.complete(record); - }, - complete: function (record, afterLoc) { - if ("throw" === record.type) throw record.arg; - return "break" === record.type || "continue" === record.type ? this.next = record.arg : "return" === record.type ? (this.rval = this.arg = record.arg, this.method = "return", this.next = "end") : "normal" === record.type && afterLoc && (this.next = afterLoc), ContinueSentinel; - }, - finish: function (finallyLoc) { - for (var i = this.tryEntries.length - 1; i >= 0; --i) { - var entry = this.tryEntries[i]; - if (entry.finallyLoc === finallyLoc) return this.complete(entry.completion, entry.afterLoc), resetTryEntry(entry), ContinueSentinel; - } - }, - catch: function (tryLoc) { - for (var i = this.tryEntries.length - 1; i >= 0; --i) { - var entry = this.tryEntries[i]; - if (entry.tryLoc === tryLoc) { - var record = entry.completion; - if ("throw" === record.type) { - var thrown = record.arg; - resetTryEntry(entry); - } - return thrown; - } - } - throw new Error("illegal catch attempt"); - }, - delegateYield: function (iterable, resultName, nextLoc) { - return this.delegate = { - iterator: values(iterable), - resultName: resultName, - nextLoc: nextLoc - }, "next" === this.method && (this.arg = undefined), ContinueSentinel; - } - }, exports; - } - function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { - try { - var info = gen[key](arg); - var value = info.value; - } catch (error) { - reject(error); - return; - } - if (info.done) { - resolve(value); - } else { - Promise.resolve(value).then(_next, _throw); - } - } - function _asyncToGenerator(fn) { - return function () { - var self = this, - args = arguments; - return new Promise(function (resolve, reject) { - var gen = fn.apply(self, args); - function _next(value) { - asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); - } - function _throw(err) { - asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); - } - _next(undefined); - }); - }; - } - function _inheritsLoose(subClass, superClass) { - subClass.prototype = Object.create(superClass.prototype); - subClass.prototype.constructor = subClass; - _setPrototypeOf(subClass, superClass); - } - function _getPrototypeOf(o) { - _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { - return o.__proto__ || Object.getPrototypeOf(o); - }; - return _getPrototypeOf(o); - } - function _setPrototypeOf(o, p) { - _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { - o.__proto__ = p; - return o; - }; - return _setPrototypeOf(o, p); - } - function _isNativeReflectConstruct() { - if (typeof Reflect === "undefined" || !Reflect.construct) return false; - if (Reflect.construct.sham) return false; - if (typeof Proxy === "function") return true; - try { - Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); - return true; - } catch (e) { - return false; - } - } - function _construct(Parent, args, Class) { - if (_isNativeReflectConstruct()) { - _construct = Reflect.construct.bind(); - } else { - _construct = function _construct(Parent, args, Class) { - var a = [null]; - a.push.apply(a, args); - var Constructor = Function.bind.apply(Parent, a); - var instance = new Constructor(); - if (Class) _setPrototypeOf(instance, Class.prototype); - return instance; - }; - } - return _construct.apply(null, arguments); - } - function _isNativeFunction(fn) { - return Function.toString.call(fn).indexOf("[native code]") !== -1; - } - function _wrapNativeSuper(Class) { - var _cache = typeof Map === "function" ? new Map() : undefined; - _wrapNativeSuper = function _wrapNativeSuper(Class) { - if (Class === null || !_isNativeFunction(Class)) return Class; - if (typeof Class !== "function") { - throw new TypeError("Super expression must either be null or a function"); - } - if (typeof _cache !== "undefined") { - if (_cache.has(Class)) return _cache.get(Class); - _cache.set(Class, Wrapper); - } - function Wrapper() { - return _construct(Class, arguments, _getPrototypeOf(this).constructor); - } - Wrapper.prototype = Object.create(Class.prototype, { - constructor: { - value: Wrapper, - enumerable: false, - writable: true, - configurable: true - } - }); - return _setPrototypeOf(Wrapper, Class); - }; - return _wrapNativeSuper(Class); - } - function _unsupportedIterableToArray(o, minLen) { - if (!o) return; - if (typeof o === "string") return _arrayLikeToArray(o, minLen); - var n = Object.prototype.toString.call(o).slice(8, -1); - if (n === "Object" && o.constructor) n = o.constructor.name; - if (n === "Map" || n === "Set") return Array.from(o); - if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); - } - function _arrayLikeToArray(arr, len) { - if (len == null || len > arr.length) len = arr.length; - for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; - return arr2; - } - function _createForOfIteratorHelperLoose(o, allowArrayLike) { - var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; - if (it) return (it = it.call(o)).next.bind(it); - if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { - if (it) o = it; - var i = 0; - return function () { - if (i >= o.length) return { - done: true - }; - return { - done: false, - value: o[i++] - }; - }; - } - throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); - } - - // @ts-nocheck - var _ = { - throttle: function throttle(func, limit) { - var inThrottle; - return function () { - var args = arguments; - var context = this; - if (!inThrottle) { - func.apply(context, args); - inThrottle = true; - setTimeout(function () { - return inThrottle = false; - }, limit); - } - }; - }, - debounce: function debounce(func, limit) { - var inDebounce; - return function () { - var args = arguments; - var context = this; - clearTimeout(inDebounce); - inDebounce = setTimeout(function () { - return func.apply(context, args); - }, limit); - }; - }, - sample: function sample(arr) { - return arr[Math.floor(Math.random() * arr.length)]; - }, - sampleSize: function sampleSize(arr, size) { - var shuffled = arr.slice(0); - var i = arr.length; - var min = i - size; - var temp; - var index; - while (i-- > min) { - index = Math.floor((i + 1) * Math.random()); - temp = shuffled[index]; - shuffled[index] = shuffled[i]; - shuffled[i] = temp; - } - return shuffled.slice(min); - }, - defer: function defer(func) { - return setTimeout(func, 0); - }, - once: function once(func) { - var called = false; - return function () { - if (called) { - return; - } - called = true; - func.apply(this, arguments); - }; - }, - omit: function omit(obj, keys) { - var newObj = {}; - Object.keys(obj).forEach(function (key) { - if (!keys.includes(key)) { - newObj[key] = obj[key]; - } - }); - return newObj; - }, - defaults: function defaults(obj, _defaults) { - Object.keys(_defaults).forEach(function (key) { - if (obj[key] === undefined) { - obj[key] = _defaults[key]; - } - }); - return obj; - }, - pickBy: function pickBy(obj, predicate) { - var newObj = {}; - Object.keys(obj).forEach(function (key) { - if (predicate(obj[key])) { - newObj[key] = obj[key]; - } - }); - return newObj; - } - }; - - // eslint-disable-line no-unused-vars - var isNode = false; - try { - isNode = /*#__PURE__*/Object.prototype.toString.call(global.process) === "[object process]"; - } catch (e) { - } - var userAgent = !isNode && navigator && navigator.userAgent && /*#__PURE__*/navigator.userAgent.toLowerCase(); - var isElectron = userAgent && /*#__PURE__*/userAgent.indexOf(' electron/') > -1; - var isMobile = !isNode && /*#__PURE__*/function () { - if (isElectron) { - return false; - } - var check = false; - (function (a) { - if (/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0, 4))) check = true; - })(navigator.userAgent || navigator.vendor || ''); - return check; - }(); - function gunAsAnotherUser(gun, key, f) { - var gun2 = new gun$1({ - radisk: false, - peers: Object.keys(gun._.opt.peers) - }); // TODO: copy other options too - var user = gun2.user(); - user.auth(key); - setTimeout(function () { - // @ts-ignore - var peers = Object.values(gun2.back('opt.peers')); - peers.forEach(function (peer) { - // @ts-ignore - gun2.on('bye', peer); - }); - }, 20000); - return f(user); - } - function gunOnceDefined(node) { - return new Promise(function (resolve) { - node.on(function (val, _k, _a, eve) { - if (val !== undefined) { - eve.off(); - resolve(val); - } - }); - }); - } - var animals = ['canidae', 'felidae', 'cat', 'cattle', 'dog', 'donkey', 'goat', 'horse', 'pig', 'rabbit', 'aardvark', 'aardwolf', 'albatross', 'alligator', 'alpaca', 'amphibian', 'anaconda', 'angelfish', 'anglerfish', 'ant', 'anteater', 'antelope', 'antlion', 'ape', 'aphid', 'armadillo', 'asp', 'baboon', 'badger', 'bandicoot', 'barnacle', 'barracuda', 'basilisk', 'bass', 'bat', 'bear', 'beaver', 'bedbug', 'bee', 'beetle', 'bird', 'bison', 'blackbird', 'boa', 'boar', 'bobcat', 'bobolink', 'bonobo', 'booby', 'bovid', 'bug', 'butterfly', 'buzzard', 'camel', 'canid', 'capybara', 'cardinal', 'caribou', 'carp', 'cat', 'catshark', 'caterpillar', 'catfish', 'cattle', 'centipede', 'cephalopod', 'chameleon', 'cheetah', 'chickadee', 'chicken', 'chimpanzee', 'chinchilla', 'chipmunk', 'clam', 'clownfish', 'cobra', 'cockroach', 'cod', 'condor', 'constrictor', 'coral', 'cougar', 'cow', 'coyote', 'crab', 'crane', 'crawdad', 'crayfish', 'cricket', 'crocodile', 'crow', 'cuckoo', 'cicada', 'damselfly', 'deer', 'dingo', 'dinosaur', 'dog', 'dolphin', 'donkey', 'dormouse', 'dove', 'dragonfly', 'dragon', 'duck', 'eagle', 'earthworm', 'earwig', 'echidna', 'eel', 'egret', 'elephant', 'elk', 'emu', 'ermine', 'falcon', 'ferret', 'finch', 'firefly', 'fish', 'flamingo', 'flea', 'fly', 'flyingfish', 'fowl', 'fox', 'frog', 'gamefowl', 'galliform', 'gazelle', 'gecko', 'gerbil', 'gibbon', 'giraffe', 'goat', 'goldfish', 'goose', 'gopher', 'gorilla', 'grasshopper', 'grouse', 'guan', 'guanaco', 'guineafowl', 'gull', 'guppy', 'haddock', 'halibut', 'hamster', 'hare', 'harrier', 'hawk', 'hedgehog', 'heron', 'herring', 'hippopotamus', 'hookworm', 'hornet', 'horse', 'hoverfly', 'hummingbird', 'hyena', 'iguana', 'impala', 'jackal', 'jaguar', 'jay', 'jellyfish', 'junglefowl', 'kangaroo', 'kingfisher', 'kite', 'kiwi', 'koala', 'koi', 'krill', 'ladybug', 'lamprey', 'landfowl', 'lark', 'leech', 'lemming', 'lemur', 'leopard', 'leopon', 'limpet', 'lion', 'lizard', 'llama', 'lobster', 'locust', 'loon', 'louse', 'lungfish', 'lynx', 'macaw', 'mackerel', 'magpie', 'mammal', 'manatee', 'mandrill', 'marlin', 'marmoset', 'marmot', 'marsupial', 'marten', 'mastodon', 'meadowlark', 'meerkat', 'mink', 'minnow', 'mite', 'mockingbird', 'mole', 'mollusk', 'mongoose', 'monkey', 'moose', 'mosquito', 'moth', 'mouse', 'mule', 'muskox', 'narwhal', 'newt', 'nightingale', 'ocelot', 'octopus', 'opossum', 'orangutan', 'orca', 'ostrich', 'otter', 'owl', 'ox', 'panda', 'panther', 'parakeet', 'parrot', 'parrotfish', 'partridge', 'peacock', 'peafowl', 'pelican', 'penguin', 'perch', 'pheasant', 'pig', 'pigeon', 'pike', 'pinniped', 'piranha', 'planarian', 'platypus', 'pony', 'porcupine', 'porpoise', 'possum', 'prawn', 'primate', 'ptarmigan', 'puffin', 'puma', 'python', 'quail', 'quelea', 'quokka', 'rabbit', 'raccoon', 'rat', 'rattlesnake', 'raven', 'reindeer', 'reptile', 'rhinoceros', 'roadrunner', 'rodent', 'rook', 'rooster', 'roundworm', 'sailfish', 'salamander', 'salmon', 'sawfish', 'scallop', 'scorpion', 'seahorse', 'shark', 'sheep', 'shrew', 'shrimp', 'silkworm', 'silverfish', 'skink', 'skunk', 'sloth', 'slug', 'smelt', 'snail', 'snake', 'snipe', 'sole', 'sparrow', 'spider', 'spoonbill', 'squid', 'squirrel', 'starfish', 'stingray', 'stoat', 'stork', 'sturgeon', 'swallow', 'swan', 'swift', 'swordfish', 'swordtail', 'tahr', 'takin', 'tapir', 'tarantula', 'tarsier', 'termite', 'tern', 'thrush', 'tick', 'tiger', 'tiglon', 'toad', 'tortoise', 'toucan', 'trout', 'tuna', 'turkey', 'turtle', 'tyrannosaurus', 'urial', 'vicuna', 'viper', 'vole', 'vulture', 'wallaby', 'walrus', 'wasp', 'warbler', 'weasel', 'whale', 'whippet', 'whitefish', 'wildcat', 'wildebeest', 'wildfowl', 'wolf', 'wolverine', 'wombat', 'woodpecker', 'worm', 'wren', 'xerinae', 'yak', 'zebra', 'alpaca', 'cat', 'cattle', 'chicken', 'dog', 'donkey', 'ferret', 'gayal', 'goldfish', 'guppy', 'horse', 'koi', 'llama', 'sheep', 'yak', 'unicorn']; - var adjectives = ['average', 'big', 'colossal', 'fat', 'giant', 'gigantic', 'great', 'huge', 'immense', 'large', 'little', 'long', 'mammoth', 'massive', 'miniature', 'petite', 'puny', 'short', 'small', 'tall', 'tiny', 'boiling', 'breezy', 'broken', 'bumpy', 'chilly', 'cold', 'cool', 'creepy', 'crooked', 'cuddly', 'curly', 'damaged', 'damp', 'dirty', 'dry', 'dusty', 'filthy', 'flaky', 'fluffy', 'wet', 'broad', 'chubby', 'crooked', 'curved', 'deep', 'flat', 'high', 'hollow', 'low', 'narrow', 'round', 'shallow', 'skinny', 'square', 'steep', 'straight', 'wide', 'ancient', 'brief', 'early', 'fast', 'late', 'long', 'modern', 'old', 'quick', 'rapid', 'short', 'slow', 'swift', 'young', 'abundant', 'empty', 'few', 'heavy', 'light', 'many', 'numerous', 'Sound', 'cooing', 'deafening', 'faint', 'harsh', 'hissing', 'hushed', 'husky', 'loud', 'melodic', 'moaning', 'mute', 'noisy', 'purring', 'quiet', 'raspy', 'resonant', 'screeching', 'shrill', 'silent', 'soft', 'squealing', 'thundering', 'voiceless', 'whispering', 'bitter', 'delicious', 'fresh', 'juicy', 'ripe', 'rotten', 'salty', 'sour', 'spicy', 'stale', 'sticky', 'strong', 'sweet', 'tasteless', 'tasty', 'thirsty', 'fluttering', 'fuzzy', 'greasy', 'grubby', 'hard', 'hot', 'icy', 'loose', 'melted', 'plastic', 'prickly', 'rainy', 'rough', 'scattered', 'shaggy', 'shaky', 'sharp', 'shivering', 'silky', 'slimy', 'slippery', 'smooth', 'soft', 'solid', 'steady', 'sticky', 'tender', 'tight', 'uneven', 'weak', 'wet', 'wooden', 'afraid', 'angry', 'annoyed', 'anxious', 'arrogant', 'ashamed', 'awful', 'bad', 'bewildered', 'bored', 'combative', 'condemned', 'confused', 'creepy', 'cruel', 'dangerous', 'defeated', 'defiant', 'depressed', 'disgusted', 'disturbed', 'eerie', 'embarrassed', 'envious', 'evil', 'fierce', 'foolish', 'frantic', 'frightened', 'grieving', 'helpless', 'homeless', 'hungry', 'hurt', 'ill', 'jealous', 'lonely', 'mysterious', 'naughty', 'nervous', 'obnoxious', 'outrageous', 'panicky', 'repulsive', 'scary', 'scornful', 'selfish', 'sore', 'tense', 'terrible', 'thoughtless', 'tired', 'troubled', 'upset', 'uptight', 'weary', 'wicked', 'worried', 'agreeable', 'amused', 'brave', 'calm', 'charming', 'cheerful', 'comfortable', 'cooperative', 'courageous', 'delightful', 'determined', 'eager', 'elated', 'enchanting', 'encouraging', 'energetic', 'enthusiastic', 'excited', 'exuberant', 'fair', 'faithful', 'fantastic', 'fine', 'friendly', 'funny', 'gentle', 'glorious', 'good', 'happy', 'healthy', 'helpful', 'hilarious', 'jolly', 'joyous', 'kind', 'lively', 'lovely', 'lucky', 'obedient', 'perfect', 'pleasant', 'proud', 'relieved', 'silly', 'smiling', 'splendid', 'successful', 'thoughtful', 'victorious', 'vivacious', 'witty', 'wonderful', 'zealous', 'zany', 'other', 'good', 'new', 'old', 'great', 'high', 'small', 'different', 'large', 'local', 'social', 'important', 'long', 'young', 'national', 'british', 'right', 'early', 'possible', 'big', 'little', 'political', 'able', 'late', 'general', 'full', 'far', 'low', 'public', 'available', 'bad', 'main', 'sure', 'clear', 'major', 'economic', 'only', 'likely', 'real', 'black', 'particular', 'international', 'special', 'difficult', 'certain', 'open', 'whole', 'white', 'free', 'short', 'easy', 'strong', 'european', 'central', 'similar', 'human', 'common', 'necessary', 'single', 'personal', 'hard', 'private', 'poor', 'financial', 'wide', 'foreign', 'simple', 'recent', 'concerned', 'american', 'various', 'close', 'fine', 'english', 'wrong', 'present', 'royal', 'natural', 'individual', 'nice', 'french', 'nihilist', 'solipsist', 'materialist', 'surrealist', 'heroic', 'awesome', 'hedonist', 'absurd', 'current', 'modern', 'labour', 'legal', 'happy', 'final', 'red', 'normal', 'serious', 'previous', 'total', 'prime', 'significant', 'industrial', 'sorry', 'dead', 'specific', 'appropriate', 'top', 'soviet', 'basic', 'military', 'original', 'successful', 'aware', 'hon', 'popular', 'heavy', 'professional', 'direct', 'dark', 'cold', 'ready', 'green', 'useful', 'effective', 'western', 'traditional', 'scottish', 'german', 'independent', 'deep', 'interesting', 'considerable', 'involved', 'physical', 'hot', 'existing', 'responsible', 'complete', 'medical', 'blue', 'extra', 'past', 'male', 'interested', 'fair', 'essential', 'beautiful', 'civil', 'primary', 'obvious', 'future', 'environmental', 'positive', 'senior', 'nuclear', 'annual', 'relevant', 'huge', 'rich', 'commercial', 'safe', 'regional', 'practical', 'official', 'separate', 'key', 'chief', 'regular', 'due', 'additional', 'active', 'powerful', 'complex', 'standard', 'impossible', 'light', 'warm', 'middle', 'fresh', 'sexual', 'front', 'domestic', 'actual', 'united', 'technical', 'ordinary', 'cheap', 'strange', 'internal', 'excellent', 'quiet', 'soft', 'potential', 'northern', 'religious', 'quick', 'very', 'famous', 'cultural', 'proper', 'broad', 'joint', 'formal', 'limited', 'conservative', 'lovely', 'usual', 'ltd', 'unable', 'rural', 'initial', 'substantial', 'bright', 'average', 'leading', 'reasonable', 'immediate', 'suitable', 'equal', 'detailed', 'working', 'overall', 'female', 'afraid', 'democratic', 'growing', 'sufficient', 'scientific', 'eastern', 'correct', 'inc', 'irish', 'expensive', 'educational', 'mental', 'dangerous', 'critical', 'increased', 'familiar', 'unlikely', 'double', 'perfect', 'slow', 'tiny', 'dry', 'historical', 'thin', 'daily', 'southern', 'increasing', 'wild', 'alone', 'urban', 'empty', 'married', 'narrow', 'liberal', 'supposed', 'upper', 'apparent', 'tall', 'busy', 'bloody', 'prepared', 'russian', 'moral', 'careful', 'clean', 'attractive', 'japanese', 'vital', 'thick', 'alternative', 'fast', 'ancient', 'elderly', 'rare', 'external', 'capable', 'brief', 'wonderful', 'grand', 'typical', 'entire', 'grey', 'constant', 'vast', 'surprised', 'ideal', 'terrible', 'academic', 'funny', 'minor', 'pleased', 'severe', 'ill', 'corporate', 'negative', 'permanent', 'weak', 'brown', 'fundamental', 'odd', 'crucial', 'inner', 'used', 'criminal', 'contemporary', 'sharp', 'sick', 'near', 'roman', 'massive', 'unique', 'secondary', 'parliamentary', 'african', 'unknown', 'subsequent', 'angry', 'alive', 'guilty', 'lucky', 'enormous', 'well', 'yellow', 'unusual', 'net', 'tough', 'dear', 'extensive', 'glad', 'remaining', 'agricultural', 'alright', 'healthy', 'italian', 'principal', 'tired', 'efficient', 'comfortable', 'chinese', 'relative', 'friendly', 'conventional', 'willing', 'sudden', 'proposed', 'voluntary', 'slight', 'valuable', 'dramatic', 'golden', 'temporary', 'federal', 'keen', 'flat', 'silent', 'indian', 'worried', 'pale', 'statutory', 'welsh', 'dependent', 'firm', 'wet', 'competitive', 'armed', 'radical', 'outside', 'acceptable', 'sensitive', 'living', 'pure', 'global', 'emotional', 'sad', 'secret', 'rapid', 'adequate', 'fixed', 'sweet', 'administrative', 'wooden', 'remarkable', 'comprehensive', 'surprising', 'solid', 'rough', 'mere', 'mass', 'brilliant', 'maximum', 'absolute', 'electronic', 'visual', 'electric', 'cool', 'spanish', 'literary', 'continuing', 'supreme', 'chemical', 'genuine', 'exciting', 'written', 'advanced', 'extreme', 'classical', 'fit', 'favourite', 'widespread', 'confident', 'straight', 'proud', 'numerous', 'opposite', 'distinct', 'mad', 'helpful', 'given', 'disabled', 'consistent', 'anxious', 'nervous', 'awful', 'stable', 'constitutional', 'satisfied', 'conscious', 'developing', 'strategic', 'holy', 'smooth', 'dominant', 'remote', 'theoretical', 'outstanding', 'pink', 'pretty', 'clinical', 'minimum', 'honest', 'impressive', 'related', 'residential', 'extraordinary', 'plain', 'visible', 'accurate', 'distant', 'still', 'greek', 'complicated', 'musical', 'precise', 'gentle', 'broken', 'live', 'silly', 'fat', 'tight', 'monetary', 'round', 'psychological', 'violent', 'unemployed', 'inevitable', 'junior', 'sensible', 'grateful', 'pleasant', 'dirty', 'structural', 'welcome', 'deaf', 'above', 'continuous', 'blind', 'overseas', 'mean', 'entitled', 'delighted', 'loose', 'occasional', 'evident', 'desperate', 'fellow', 'universal', 'square', 'steady', 'classic', 'equivalent', 'intellectual', 'victorian', 'level', 'ultimate', 'creative', 'lost', 'medieval', 'clever', 'linguistic', 'convinced', 'judicial', 'raw', 'sophisticated', 'asleep', 'vulnerable', 'illegal', 'outer', 'revolutionary', 'bitter', 'changing', 'australian', 'native', 'imperial', 'strict', 'wise', 'informal', 'flexible', 'collective', 'frequent', 'experimental', 'spiritual', 'intense', 'rational', 'generous', 'inadequate', 'prominent', 'logical', 'bare', 'historic', 'modest', 'dutch', 'acute', 'electrical', 'valid', 'weekly', 'gross', 'automatic', 'loud', 'reliable', 'mutual', 'liable', 'multiple', 'ruling', 'curious', 'sole', 'managing', 'pregnant', 'latin', 'nearby', 'exact', 'underlying', 'identical', 'satisfactory', 'marginal', 'distinctive', 'electoral', 'urgent', 'presidential', 'controversial', 'everyday', 'encouraging', 'organic', 'continued', 'expected', 'statistical', 'desirable', 'innocent', 'improved', 'exclusive', 'marked', 'experienced', 'unexpected', 'superb', 'sheer', 'disappointed', 'frightened', 'gastric', 'romantic', 'naked', 'reluctant', 'magnificent', 'convenient', 'established', 'closed', 'uncertain', 'artificial', 'diplomatic', 'tremendous', 'marine', 'mechanical', 'retail', 'institutional', 'mixed', 'required', 'biological', 'known', 'functional', 'straightforward', 'superior', 'digital', 'spectacular', 'unhappy', 'confused', 'unfair', 'aggressive', 'spare', 'painful', 'abstract', 'asian', 'associated', 'legislative', 'monthly', 'intelligent', 'hungry', 'explicit', 'nasty', 'just', 'faint', 'coloured', 'ridiculous', 'amazing', 'comparable', 'successive', 'realistic', 'back', 'decent', 'decentralized', 'bitcoin', 'cypherpunk', 'unnecessary', 'flying', 'random', 'influential', 'dull', 'genetic', 'neat', 'marvellous', 'crazy', 'damp', 'giant', 'secure', 'bottom', 'skilled', 'subtle', 'elegant', 'brave', 'lesser', 'parallel', 'steep', 'intensive', 'casual', 'tropical', 'lonely', 'partial', 'preliminary', 'concrete', 'alleged', 'assistant', 'vertical', 'upset', 'delicate', 'mild', 'occupational', 'excessive', 'progressive', 'exceptional', 'integrated', 'striking', 'continental', 'okay', 'harsh', 'combined', 'fierce', 'handsome', 'characteristic', 'chronic', 'compulsory', 'interim', 'objective', 'splendid', 'magic', 'systematic', 'obliged', 'payable', 'fun', 'horrible', 'primitive', 'fascinating', 'ideological', 'metropolitan', 'surrounding', 'estimated', 'peaceful', 'premier', 'operational', 'technological', 'kind', 'advisory', 'hostile', 'precious', 'accessible', 'determined', 'excited', 'impressed', 'provincial', 'smart', 'endless', 'isolated', 'drunk', 'geographical', 'like', 'dynamic', 'boring', 'forthcoming', 'unfortunate', 'definite', 'super', 'notable', 'indirect', 'stiff', 'wealthy', 'awkward', 'lively', 'neutral', 'artistic', 'content', 'mature', 'colonial', 'ambitious', 'evil', 'magnetic', 'verbal', 'legitimate', 'sympathetic', 'empirical', 'head', 'shallow', 'vague', 'naval', 'depressed', 'shared', 'added', 'shocked', 'mid', 'worthwhile', 'qualified', 'missing', 'blank', 'absent', 'favourable', 'polish', 'israeli', 'developed', 'profound', 'representative', 'enthusiastic', 'dreadful', 'rigid', 'reduced', 'cruel', 'coastal', 'peculiar', 'swiss', 'crude', 'extended', 'selected', 'eager', 'canadian', 'bold', 'relaxed', 'corresponding', 'running', 'planned', 'applicable', 'immense', 'allied', 'comparative', 'uncomfortable', 'conservation', 'productive', 'beneficial', 'bored', 'charming', 'minimal', 'mobile', 'turkish', 'orange', 'rear', 'passive', 'suspicious', 'overwhelming', 'fatal', 'resulting', 'symbolic', 'registered', 'neighbouring', 'calm', 'irrelevant', 'patient', 'compact', 'profitable', 'rival', 'loyal', 'moderate', 'distinguished', 'interior', 'noble', 'insufficient', 'eligible', 'mysterious', 'varying', 'managerial', 'molecular', 'olympic', 'linear', 'prospective', 'printed', 'parental', 'diverse', 'elaborate', 'furious', 'fiscal', 'burning', 'useless', 'semantic', 'embarrassed', 'inherent', 'philosophical', 'deliberate', 'awake', 'variable', 'promising', 'unpleasant', 'varied', 'sacred', 'selective', 'inclined', 'tender', 'hidden', 'worthy', 'intermediate', 'sound', 'protective', 'fortunate', 'slim', 'defensive', 'divine', 'stuck', 'driving', 'invisible', 'misleading', 'circular', 'mathematical', 'inappropriate', 'liquid', 'persistent', 'solar', 'doubtful', 'manual', 'architectural', 'intact', 'incredible', 'devoted', 'prior', 'tragic', 'respectable', 'optimistic', 'convincing', 'unacceptable', 'decisive', 'competent', 'spatial', 'respective', 'binding', 'relieved', 'nursing', 'toxic', 'select', 'redundant', 'integral', 'then', 'probable', 'amateur', 'fond', 'passing', 'specified', 'territorial', 'horizontal', 'inland', 'cognitive', 'regulatory', 'miserable', 'resident', 'polite', 'scared', 'gothic', 'civilian', 'instant', 'lengthy', 'adverse', 'korean', 'unconscious', 'anonymous', 'aesthetic', 'orthodox', 'static', 'unaware', 'costly', 'fantastic', 'foolish', 'fashionable', 'causal', 'compatible', 'wee', 'implicit', 'dual', 'ok', 'cheerful', 'subjective', 'forward', 'surviving', 'exotic', 'purple', 'cautious', 'visiting', 'aggregate', 'ethical', 'teenage', 'dying', 'disastrous', 'delicious', 'confidential', 'underground', 'thorough', 'grim', 'autonomous', 'atomic', 'frozen', 'colourful', 'injured', 'uniform', 'ashamed', 'glorious', 'wicked', 'coherent', 'rising', 'shy', 'novel', 'balanced', 'delightful', 'arbitrary', 'adjacent', 'worrying', 'weird', 'unchanged', 'rolling', 'evolutionary', 'intimate', 'sporting', 'disciplinary', 'formidable', 'lexical', 'noisy', 'gradual', 'accused', 'homeless', 'supporting', 'coming', 'renewed', 'excess', 'retired', 'rubber', 'chosen', 'outdoor', 'embarrassing', 'preferred', 'bizarre', 'appalling', 'agreed', 'imaginative', 'governing', 'accepted', 'vocational', 'mighty', 'puzzled', 'worldwide', 'organisational', 'sunny', 'eldest', 'eventual', 'spontaneous', 'vivid', 'rude', 'faithful', 'ministerial', 'innovative', 'controlled', 'conceptual', 'unwilling', 'civic', 'meaningful', 'alive', 'brainy', 'breakable', 'busy', 'careful', 'cautious', 'clever', 'concerned', 'crazy', 'curious', 'dead', 'different', 'difficult', 'doubtful', 'easy', 'famous', 'fragile', 'helpful', 'helpless', 'important', 'impossible', 'innocent', 'inquisitive', 'modern', 'open', 'outstanding', 'poor', 'powerful', 'puzzled', 'real', 'rich', 'shy', 'sleepy', 'super', 'tame', 'uninterested', 'wandering', 'wild', 'wrong', 'adorable', 'alert', 'average', 'beautiful', 'blonde', 'bloody', 'blushing', 'bright', 'clean', 'clear', 'cloudy', 'colorful', 'crowded', 'cute', 'dark', 'drab', 'distinct', 'dull', 'elegant', 'fancy', 'filthy', 'glamorous', 'gleaming', 'graceful', 'grotesque', 'homely', 'light', 'misty', 'motionless', 'muddy', 'plain', 'poised', 'quaint', 'shiny', 'smoggy', 'sparkling', 'spotless', 'stormy', 'strange', 'ugly', 'unsightly', 'unusual', 'bad', 'better', 'beautiful', 'big', 'black', 'blue', 'bright', 'clumsy', 'crazy', 'dizzy', 'dull', 'fat', 'frail', 'friendly', 'funny', 'great', 'green', 'gigantic', 'gorgeous', 'grumpy', 'handsome', 'happy', 'horrible', 'itchy', 'jittery', 'jolly', 'kind', 'long', 'lazy', 'magnificent', 'magenta', 'many', 'mighty', 'mushy', 'nasty', 'new', 'nice', 'nosy', 'nutty', 'nutritious', 'odd', 'orange', 'ordinary', 'pretty', 'precious', 'prickly', 'purple', 'quaint', 'quiet', 'quick', 'quickest', 'rainy', 'rare', 'ratty', 'red', 'roasted', 'robust', 'round', 'sad', 'scary', 'scrawny', 'short', 'silly', 'stingy', 'strange', 'striped', 'spotty', 'tart', 'tall', 'tame', 'tan', 'tender', 'testy', 'tricky', 'tough', 'ugly', 'ugliest', 'vast', 'watery', 'wasteful', 'wonderful', 'yellow', 'yummy', 'zany']; - var util = { - gunOnceDefined: gunOnceDefined, - gunAsAnotherUser: gunAsAnotherUser, - getHash: function getHash(str, format) { - var _this = this; - return _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() { - var hash; - return _regeneratorRuntime().wrap(function _callee$(_context) { - while (1) { - switch (_context.prev = _context.next) { - case 0: - if (format === void 0) { - format = "base64"; - } - if (str) { - _context.next = 3; - break; - } - return _context.abrupt("return", undefined); - case 3: - _context.next = 5; - return gun$1.SEA.work(str, undefined, undefined, { - name: "SHA-256" - }); - case 5: - hash = _context.sent; - if (hash) { - _context.next = 8; - break; - } - throw new Error("Gun.SEA.work failed for " + str); - case 8: - if (!(hash.length > 44)) { - _context.next = 10; - break; - } - throw new Error("Gun.SEA.work returned an invalid SHA-256 hash longer than 44 chars: " + hash + ". This is probably due to a sea.js bug on Safari."); - case 10: - if (!(format === "hex")) { - _context.next = 12; - break; - } - return _context.abrupt("return", _this.base64ToHex(hash)); - case 12: - return _context.abrupt("return", hash); - case 13: - case "end": - return _context.stop(); - } - } - }, _callee); - }))(); - }, - capitalize: function capitalize(s) { - return s.charAt(0).toUpperCase() + s.slice(1); - }, - generateName: function generateName() { - return this.capitalize(_.sample(adjectives)) + " " + this.capitalize(_.sample(animals)); - }, - base64ToHex: function base64ToHex(str) { - var raw = atob(str); - var result = ''; - for (var i = 0; i < raw.length; i++) { - var hex = raw.charCodeAt(i).toString(16); - result += hex.length === 2 ? hex : "0" + hex; - } - return result; - }, - getCaret: function getCaret(el) { - if (el.selectionStart) { - return el.selectionStart; - } else { - // @ts-ignore - if (document.selection) { - el.focus(); - // @ts-ignore - var r = document.selection.createRange(); - if (r === null) { - return 0; - } - // @ts-ignore - var re = el.createTextRange(), - rc = re.duplicate(); - re.moveToBookmark(r.getBookmark()); - rc.setEndPoint('EndToStart', re); - return rc.text.length; - } - } - return 0; - }, - injectCss: function injectCss() { - var elementId = "irisStyle"; - if (document.getElementById(elementId)) { - return; - } - var sheet = document.createElement("style"); - sheet.id = elementId; - sheet.innerHTML = "\n .iris-follow-button .hover {\n display: none;\n }\n\n .iris-follow-button.following:hover .hover {\n display: inline;\n }\n\n .iris-follow-button.following:hover .nonhover {\n display: none;\n }\n\n .iris-identicon * {\n box-sizing: border-box;\n }\n\n .iris-identicon {\n vertical-align: middle;\n border-radius: 50%;\n text-align: center;\n display: inline-block;\n position: relative;\n max-width: 100%;\n }\n\n .iris-distance {\n z-index: 2;\n position: absolute;\n left:0%;\n top:2px;\n width: 100%;\n text-align: right;\n color: #fff;\n text-shadow: 0 0 1px #000;\n font-size: 75%;\n line-height: 75%;\n font-weight: bold;\n }\n\n .iris-pie {\n border-radius: 50%;\n position: absolute;\n top: 0;\n left: 0;\n box-shadow: 0px 0px 0px 0px #82FF84;\n padding-bottom: 100%;\n max-width: 100%;\n -webkit-transition: all 0.2s ease-in-out;\n -moz-transition: all 0.2s ease-in-out;\n transition: all 0.2s ease-in-out;\n }\n\n .iris-card {\n padding: 10px;\n background-color: #f7f7f7;\n color: #777;\n border: 1px solid #ddd;\n display: flex;\n flex-direction: row;\n overflow: hidden;\n }\n\n .iris-card a {\n -webkit-transition: color 150ms;\n transition: color 150ms;\n text-decoration: none;\n color: #337ab7;\n }\n\n .iris-card a:hover, .iris-card a:active {\n text-decoration: underline;\n color: #23527c;\n }\n\n .iris-pos {\n color: #3c763d;\n }\n\n .iris-neg {\n color: #a94442;\n }\n\n .iris-identicon img {\n position: absolute;\n top: 0;\n left: 0;\n max-width: 100%;\n border-radius: 50%;\n border-color: transparent;\n border-style: solid;\n }\n\n .iris-chat-open-button {\n background-color: #1e1e1e;\n color: #fff;\n padding: 15px;\n cursor: pointer;\n user-select: none;\n }\n\n .iris-chat-open-button svg {\n width: 1em;\n }\n\n .iris-chat-open-button, .iris-chat-box {\n position: fixed;\n bottom: 0.5rem;\n right: 0.5rem;\n border-radius: 8px;\n font-family: system-ui;\n font-size: 15px;\n }\n\n .iris-chat-box {\n background-color: #fff;\n max-height: 25rem;\n box-shadow: 2px 2px 20px rgba(0, 0, 0, 0.2);\n height: calc(100% - 44px);\n display: flex;\n flex-direction: column;\n width: 320px;\n color: rgb(38, 38, 38);\n }\n\n .iris-chat-box.minimized {\n height: auto;\n }\n\n .iris-chat-box.minimized .iris-chat-header {\n border-radius: 8px;\n cursor: pointer;\n }\n\n .iris-chat-box.minimized .iris-chat-messages, .iris-chat-box.minimized .iris-typing-indicator, .iris-chat-box.minimized .iris-chat-input-wrapper, .iris-chat-box.minimized .iris-chat-minimize, .iris-chat-box.minimized .iris-chat-close {\n display: none;\n }\n\n .iris-chat-header {\n background-color: #1e1e1e;\n height: 44px;\n color: #fff;\n border-radius: 8px 8px 0 0;\n text-align: center;\n display: flex;\n flex-direction: row;\n justify-content: center;\n align-items: center;\n flex: none;\n white-space: nowrap;\n text-overflow: ellipsis;\n overflow: hidden;\n }\n\n .iris-chat-header-text {\n flex: 1;\n }\n\n .iris-online-indicator {\n color: #bfbfbf;\n margin-right: 5px;\n font-size: 12px;\n user-select: none;\n flex: none;\n }\n\n .iris-online-indicator.yes {\n color: #80bf5f;\n }\n\n .iris-typing-indicator {\n display: none;\n background-color: rgba(255, 255, 255, 0.5);\n font-size: 12px;\n padding: 2px;\n color: #777;\n }\n\n .iris-typing-indicator.yes {\n display: block;\n }\n\n .iris-chat-messages {\n flex: 1;\n padding: 15px;\n overflow-y: scroll;\n }\n\n .iris-chat-input-wrapper {\n flex: none;\n padding: 15px;\n background-color: #efefef;\n display: flex;\n flex-direction: row;\n border-radius: 0 0 8px 8px;\n }\n\n .iris-chat-input-wrapper textarea {\n padding: 15px 8px;\n border-radius: 4px;\n border: 1px solid rgba(0,0,0,0);\n width: auto;\n font-size: 15px;\n resize: none;\n flex: 1;\n }\n\n .iris-chat-input-wrapper textarea:focus {\n outline: none;\n border: 1px solid #6dd0ed;\n }\n\n .iris-chat-input-wrapper button svg {\n display: inline-block;\n font-size: inherit;\n height: 1em;\n width: 1em;\n overflow: visible;\n vertical-align: -0.125em;\n }\n\n .iris-chat-input-wrapper button, .iris-chat-input-wrapper button:hover, .iris-chat-input-wrapper button:active, .iris-chat-input-wrapper button:focus {\n flex: none;\n color: #999;\n background-color: transparent;\n font-size: 30px;\n padding: 5px;\n border: 1px solid rgba(0,0,0,0);\n border-radius: 4px;\n margin-left: 5px;\n }\n\n .iris-chat-input-wrapper button:active, .iris-chat-input-wrapper button:focus {\n outline: none;\n border: 1px solid #6dd0ed;\n }\n\n .iris-chat-message {\n display: flex;\n flex-direction: column;\n margin-bottom: 2px;\n overflow-wrap: break-word;\n }\n\n .iris-msg-content {\n background-color: #efefef;\n padding: 6px 10px;\n border-radius: 8px;\n box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.1);\n flex: none;\n max-width: 75%;\n }\n\n .emoji {\n font-size: 1.3em;\n line-height: 1em;\n }\n\n .iris-chat-message .emoji-only {\n font-size: 3em;\n text-align: center;\n }\n\n .iris-seen {\n color: rgba(0, 0, 0, 0.45);\n user-select: none;\n }\n\n .iris-seen.yes {\n color: #4fc3f7;\n }\n\n .iris-seen svg {\n width: 18px;\n }\n\n .iris-delivered-checkmark {\n display: none;\n }\n\n .delivered .iris-delivered-checkmark {\n display: initial;\n }\n\n .iris-chat-minimize, .iris-chat-close {\n user-select: none;\n cursor: pointer;\n width: 45px;\n line-height: 44px;\n }\n\n .iris-chat-message.their {\n align-items: flex-start;\n }\n\n .iris-chat-message.their + .iris-chat-message.our .iris-msg-content, .day-separator + .iris-chat-message.our .iris-msg-content {\n margin-top: 15px;\n border-radius: 8px 0px 8px 8px;\n }\n\n .iris-chat-message.their:first-of-type .iris-msg-content {\n border-radius: 0px 8px 8px 8px;\n }\n\n .iris-chat-message.our:first-of-type .iris-msg-content {\n border-radius: 8px 0px 8px 8px;\n }\n\n .iris-chat-message.our + .iris-chat-message.their .iris-msg-content, .day-separator + .iris-chat-message.their .iris-msg-content {\n margin-top: 15px;\n border-radius: 0px 8px 8px 8px;\n }\n\n .iris-chat-message.our {\n align-items: flex-end;\n }\n\n .iris-chat-message.our .iris-msg-content {\n background-color: #c5ecf7;\n }\n\n .iris-chat-message .time {\n text-align: right;\n font-size: 12px;\n color: rgba(0, 0, 0, 0.45);\n }\n\n .iris-non-string {\n color: blue;\n }\n\n .day-separator {\n display: inline-block;\n border-radius: 8px;\n background-color: rgba(227, 249, 255, 0.91);\n padding: 6px 10px;\n margin-top: 15px;\n margin-left: auto;\n margin-right: auto;\n text-transform: uppercase;\n font-size: 13px;\n color: rgba(74, 74, 74, 0.88);\n box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.1);\n user-select: none;\n }\n\n .day-separator:first-of-type {\n margin-top: 0;\n }\n\n *[contenteditable=\"true\"]:not(:focus) {\n cursor: pointer;\n }\n\n *[contenteditable=\"true\"] {\n outline: none;\n }\n\n [placeholder]:empty:before {\n content: attr(placeholder);\n color: #999;\n }\n\n [placeholder]:empty:focus {\n cursor: text;\n }\n "; - document.head.prepend(sheet); - }, - getUrlParameter: function getUrlParameter(sParam, sParams) { - var sPageURL = sParams || window.location.search.substring(1); - var sURLVariables = sPageURL.split('&'); - var sParameterName, i; - for (i = 0; i < sURLVariables.length; i++) { - sParameterName = sURLVariables[i].split('='); - if (sParameterName[0] === sParam) { - return sParameterName[1] === undefined ? true : decodeURIComponent(sParameterName[1]); - } - } - return; - }, - formatTime: function formatTime(date) { - // @ts-ignore - var t = date.toLocaleTimeString(undefined, { - timeStyle: 'short' - }); - var s = t.split(':'); - if (s.length === 3) { - // safari tries to display seconds - return s[0] + ":" + s[1] + s[2].slice(2); - } - return t; - }, - formatDate: function formatDate(date) { - var t = date.toLocaleString(undefined, { - dateStyle: 'short', - timeStyle: 'short' - }); - var s = t.split(':'); - if (s.length === 3) { - // safari tries to display seconds - return s[0] + ":" + s[1] + s[2].slice(2); - } - return t; - }, - getDaySeparatorText: function getDaySeparatorText(date, dateStr, now, nowStr) { - if (!now) { - now = new Date(); - // @ts-ignore - nowStr = now.toLocaleDateString({ - dateStyle: 'short' - }); - } - if (dateStr === nowStr) { - return 'today'; - } - var dayDifference = Math.round((now - date) / (1000 * 60 * 60 * 24)); - if (dayDifference === 0) { - return 'today'; - } - if (dayDifference === 1) { - return 'yesterday'; - } - if (dayDifference <= 5) { - return date.toLocaleDateString(undefined, { - weekday: 'long' - }); - } - return dateStr; - }, - getProfileLink: function getProfileLink(pub) { - return window.location.origin + "/#/profile/" + encodeURIComponent(pub); - }, - truncateString: function truncateString(s, length) { - if (length === void 0) { - length = 30; - } - return s.length > length ? s.slice(0, length) + "..." : s; - }, - createElement: function createElement(type, cls, parent) { - var el = document.createElement(type); - if (cls) { - el.setAttribute('class', cls); - } - if (parent) { - parent.appendChild(el); - } - return el; - }, - isNode: isNode, - isElectron: isElectron, - isMobile: isMobile, - throttle: function throttle(func, limit) { - var inThrottle; - return function () { - var args = arguments; - var context = this; - if (!inThrottle) { - func.apply(context, args); - inThrottle = true; - setTimeout(function () { - return inThrottle = false; - }, limit); - } - }; - }, - debounce: function debounce(func, delay) { - var inDebounce; - return function () { - var context = this; - var args = arguments; - clearTimeout(inDebounce); - inDebounce = setTimeout(function () { - return func.apply(context, args); - }, delay); - }; - }, - sample: function sample(arr) { - return arr[Math.floor(Math.random() * arr.length)]; - }, - sampleSize: function sampleSize(arr, size) { - var shuffled = arr.slice(0); - var i = arr.length; - var min = i - size; - var temp; - var index; - while (i-- > min) { - index = Math.floor((i + 1) * Math.random()); - temp = shuffled[index]; - shuffled[index] = shuffled[i]; - shuffled[i] = temp; - } - return shuffled.slice(min); - }, - defer: function defer(func) { - return setTimeout(func, 0); - }, - once: function once(func) { - var called = false; - return function () { - if (called) { - return; - } - called = true; - func.apply(this, arguments); - }; - }, - omit: function omit(obj, keys) { - var newObj = {}; - Object.keys(obj).forEach(function (key) { - if (!keys.includes(key)) { - newObj[key] = obj[key]; - } - }); - return newObj; - } - }; - - var rindexed = createCommonjsModule(function (module) { - (function(){ - /* // from @jabis - if (navigator.storage && navigator.storage.estimate) { - const quota = await navigator.storage.estimate(); - // quota.usage -> Number of bytes used. - // quota.quota -> Maximum number of bytes available. - const percentageUsed = (quota.usage / quota.quota) * 100; - console.log(`You've used ${percentageUsed}% of the available storage.`); - const remaining = quota.quota - quota.usage; - console.log(`You can write up to ${remaining} more bytes.`); - } - */ - function Store(opt){ - opt = opt || {}; - opt.file = String(opt.file || 'radata'); - var store = Store[opt.file], db = null, u; - - if(store){ - console.log("Warning: reusing same IndexedDB store and options as 1st."); - return Store[opt.file]; - } - store = Store[opt.file] = function(){}; - - try{opt.indexedDB = opt.indexedDB || Store.indexedDB || indexedDB;}catch(e){} - try{if(!opt.indexedDB || 'file:' == location.protocol){ - var s = store.d || (store.d = {}); - store.put = function(f, d, cb){ s[f] = d; setTimeout(function(){ cb(null, 1); },250); }; - store.get = function(f, cb){ setTimeout(function(){ cb(null, s[f] || u); },5); }; - console.log('Warning: No indexedDB exists to persist data to!'); - return store; - }}catch(e){} - - - store.start = function(){ - var o = indexedDB.open(opt.file, 1); - o.onupgradeneeded = function(eve){ (eve.target.result).createObjectStore(opt.file); }; - o.onsuccess = function(){ db = o.result; }; - o.onerror = function(eve){ console.log(eve||1); }; - }; store.start(); - - store.put = function(key, data, cb){ - if(!db){ setTimeout(function(){ store.put(key, data, cb); },1); return } - var tx = db.transaction([opt.file], 'readwrite'); - var obj = tx.objectStore(opt.file); - var req = obj.put(data, ''+key); - req.onsuccess = obj.onsuccess = tx.onsuccess = function(){ cb(null, 1); }; - req.onabort = obj.onabort = tx.onabort = function(eve){ cb(eve||'put.tx.abort'); }; - req.onerror = obj.onerror = tx.onerror = function(eve){ cb(eve||'put.tx.error'); }; - }; - - store.get = function(key, cb){ - if(!db){ setTimeout(function(){ store.get(key, cb); },9); return } - var tx = db.transaction([opt.file], 'readonly'); - var obj = tx.objectStore(opt.file); - var req = obj.get(''+key); - req.onsuccess = function(){ cb(null, req.result); }; - req.onabort = function(eve){ cb(eve||4); }; - req.onerror = function(eve){ cb(eve||5); }; - }; - setInterval(function(){ db && db.close(); db = null; store.start(); }, 1000 * 15); // reset webkit bug? - return store; - } - - if(typeof window !== "undefined"){ - (Store.window = window).RindexedDB = Store; - Store.indexedDB = window.indexedDB; // safari bug - } else { - try{ module.exports = Store; }catch(e){} - } - - try{ - var Gun = Store.window.Gun || gun; - Gun.on('create', function(root){ - this.to.next(root); - root.opt.store = root.opt.store || Store(root.opt); - }); - }catch(e){} - - }()); - }); - - var ELECTRON_GUN_URL = 'http://localhost:8767/gun'; - var maxConnectedPeers = 2; - var DEFAULT_PEERS = { - 'https://gun-rs.iris.to/gun': {}, - 'https://gun-us.herokuapp.com/gun': {} - }; - var loc = window.location; - var host = loc.host; - var is_localhost_but_not_dev = /*#__PURE__*/host.startsWith('localhost') && host !== 'localhost:8080'; - if (loc.hostname.endsWith('herokuapp.com') || is_localhost_but_not_dev) { - Object.keys(DEFAULT_PEERS).forEach(function (url) { - return DEFAULT_PEERS[url].enabled = false; - }); - DEFAULT_PEERS[loc.origin + "/gun"] = { - enabled: true - }; - } - var urlRegex = /^(https?:\/\/)?([\da-z.-]+)\.([a-z.]{2,6})([\/\w .-]*)*\/?$/; - /** - * Networking and peer management utilities - */ - var peers = { - known: {}, - /** */add: function add(peer) { - var _this = this; - return _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() { - var url, secret, encryptedUrl, encryptedUrlHash; - return _regeneratorRuntime().wrap(function _callee$(_context) { - while (1) { - switch (_context.prev = _context.next) { - case 0: - if (!(peer.url && !urlRegex.test(peer.url))) { - _context.next = 2; - break; - } - throw new Error("Invalid url " + peer.url); - case 2: - if (peer.from) { - Object.keys(_this.known).forEach(function (k) { - if (_this.known[k].from === peer.from) { - // remove previous peer url from the same user - delete _this.known[k]; - } - }); - } - url = peer.url || ''; - _this.known[url] = _this.known[url] || _.omit(peer, ['url']); - if (!(peer.visibility === 'public')) { - _context.next = 19; - break; - } - _context.next = 8; - return gun$1.SEA.secret(session.getKey().epub, session.getKey()); - case 8: - _context.t0 = _context.sent; - if (_context.t0) { - _context.next = 11; - break; - } - _context.t0 = ''; - case 11: - secret = _context.t0; - _context.next = 14; - return gun$1.SEA.encrypt(peer.url, secret); - case 14: - encryptedUrl = _context.sent; - _context.next = 17; - return gun$1.SEA.work(encryptedUrl, null, null, { - name: 'SHA-256' - }); - case 17: - encryptedUrlHash = _context.sent; - global$2().user().get('peers').get(encryptedUrlHash).put({ - url: peer.url, - lastSeen: new Date().toISOString() - }); - case 19: - if (peer.enabled !== false) { - peer.url && _this.connect(peer.url); // this calls savePeers() - } else { - _this.save(); - } - case 20: - case "end": - return _context.stop(); - } - } - }, _callee); - }))(); - }, - /** */remove: function remove(url) { - delete this.known[url]; - this.save(); - }, - /** */disconnect: function disconnect(peerFromGun) { - global$2().on('bye', peerFromGun); - peerFromGun.url = ''; - }, - save: function save() { - localStorage.setItem('gunPeers', JSON.stringify(this.known)); - }, - getSaved: function getSaved() { - var p = localStorage.getItem('gunPeers'); - if (p && p !== 'undefined') { - p = JSON.parse(p); - } else { - p = DEFAULT_PEERS; - } - if (util.isElectron) { - p[ELECTRON_GUN_URL] = {}; - } - Object.keys(p).forEach(function (k) { - return _.defaults(p[k], { - enabled: true - }); - }); - return p; - }, - /** */reset: function reset() { - localStorage.setItem('gunPeers', ''); - this.known = this.getSaved(); - }, - /** */connect: function connect(url) { - if (this.isMixedContent(url)) { - return; - } - if (this.known[url]) { - this.known[url].enabled = true; - global$2().opt({ - peers: [url] - }); - this.save(); - } else { - this.add({ - url: url - }); - } - }, - /** */disable: function disable(url, peerFromGun) { - this.known[url].enabled = false; - if (peerFromGun) { - this.disconnect(peerFromGun); - } - this.save(); - }, - isMixedContent: function isMixedContent(url) { - return window.location.protocol === 'https:' && url.indexOf('http:') === 0; - }, - random: function random() { - var _this2 = this; - var connectToLocalElectron = util.isElectron && this.known[ELECTRON_GUN_URL] && this.known[ELECTRON_GUN_URL].enabled !== false; - var sampleSize = connectToLocalElectron ? Math.max(maxConnectedPeers - 1, 1) : maxConnectedPeers; - var sample = _.sampleSize(Object.keys(_.pickBy(this.known, function (peer, url) { - return !_this2.isMixedContent(url) && peer.enabled && !(util.isElectron && url === ELECTRON_GUN_URL); - })), sampleSize); - if (sample && connectToLocalElectron) { - sample.push(ELECTRON_GUN_URL); - } - return sample; - }, - checkGunPeerCount: function checkGunPeerCount() { - var _this3 = this; - var peersFromGun = global$2().back('opt.peers'); - var connectedPeers = Object.values(peersFromGun).filter(function (peer) { - if (peer && peer.wire && peer.wire.constructor.name !== 'WebSocket') { - console.log('WebRTC peer', peer); - } - return peer && peer.wire && peer.wire.readyState === 1 && peer.wire.bufferedAmount === 0 && peer.wire.constructor.name === 'WebSocket'; - }); - if (connectedPeers.length < maxConnectedPeers) { - var unconnectedPeers = Object.keys(this.known).filter(function (url) { - var addedToGun = Object.values(peersFromGun).map(function (peer) { - return peer.url; - }).indexOf(url) > -1; - var enabled = _this3.known[url].enabled; - var mixedContent = window.location.protocol === 'https:' && url.indexOf('http:') === 0; - return !mixedContent && enabled && !addedToGun; - }); - if (unconnectedPeers.length) { - var sample = String(_.sample(unconnectedPeers)); - this.connect(sample); - } - } - if (connectedPeers.length > maxConnectedPeers) { - this.disconnect(_.sample(connectedPeers)); - } - }, - init: function init() { - var _this4 = this; - this.known = this.getSaved(); - /* use the default value of 1 for now because of memory issue - local().get('settings').get('maxConnectedPeers').on(n => { - if (n !== undefined) maxConnectedPeers = n; - }); - */ - setInterval(function () { - return _this4.checkGunPeerCount(); - }, 1000); - } - }; - - var global$1; - function global$2 (opts) { - if (opts === void 0) { - opts = {}; - } - if (!global$1) { - var myOpts = Object.assign({ - peers: opts.peers || peers.random(), - localStorage: false, - retry: Infinity - }, opts); - if (opts.peers) { - opts.peers.forEach(function (url) { - return peers.add({ - url: url - }); - }); - } - peers.init(); - global$1 = new gun$1(myOpts); - } - return global$1; - } - - // @ts-nocheck - /*eslint no-useless-escape: "off", camelcase: "off" */ - var UNIQUE_ID_VALIDATORS = { - email: /^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i, - bitcoin: /^[13][a-km-zA-HJ-NP-Z0-9]{26,33}$/, - bitcoin_address: /^[13][a-km-zA-HJ-NP-Z0-9]{26,33}$/, - ip: /^(([1-9]?\d|1\d\d|2[0-5][0-5]|2[0-4]\d)\.){3}([1-9]?\d|1\d\d|2[0-5][0-5]|2[0-4]\d)$/, - ipv6: /^(?:[A-F0-9]{1,4}:){7}[A-F0-9]{1,4}$/, - gpg_fingerprint: null, - gpg_keyid: null, - google_oauth2: null, - tel: /^\d{7,}$/, - phone: /^\d{7,}$/, - keyID: null, - url: /[-a-zA-Z0-9@:%_\+.~#?&//=]{2,256}\.[a-z]{2,4}\b(\/[-a-zA-Z0-9@:%_\+.~#?&//=]*)?/gi, - account: /^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i, - uuid: /[0-9a-f]{8}\-[0-9a-f]{4}\-[0-9a-f]{4}\-[0-9a-f]{4}\-[0-9a-f]{12}/ - }; - // TODO this class could perhaps be removed - var Attribute = /*#__PURE__*/function () { - function Attribute(a, b) { - if (typeof a === "object") { - if (typeof a.value !== "string") { - throw new Error("param1.value must be a string, got " + typeof a.value + ": " + JSON.stringify(a.value)); - } - if (typeof a.type !== "string") { - throw new Error("param1.type must be a string, got " + typeof a.type + ": " + JSON.stringify(a.type)); - } - b = a.value; - a = a.type; - } - if (typeof a !== "string") { - throw new Error("First param must be a string, got " + typeof a + ": " + JSON.stringify(a)); - } - if (!a.length) { - throw new Error("First param string is empty"); - } - if (b) { - if (typeof b !== "string") { - throw new Error("Second parameter must be a string, got " + typeof b + ": " + JSON.stringify(b)); - } - if (!b.length) { - throw new Error("Second param string is empty"); - } - this.type = a; - this.value = b; - } else { - this.value = a; - var t = Attribute.guessTypeOf(this.value); - if (t) { - this.type = t; - } else { - throw new Error("Type of attribute was omitted and could not be guessed"); - } - } - } - Attribute.getUuid = function getUuid() { - var b = function b(a) { - return a ? (a ^ Math.random() * 16 >> a / 4).toString(16) : ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, b); - }; - return new Attribute("uuid", b()); - }; - Attribute.getUniqueIdValidators = function getUniqueIdValidators() { - return UNIQUE_ID_VALIDATORS; - }; - Attribute.isUniqueType = function isUniqueType(type) { - return Object.keys(UNIQUE_ID_VALIDATORS).indexOf(type) > -1; - }; - var _proto = Attribute.prototype; - _proto.isUniqueType = function isUniqueType() { - return Attribute.isUniqueType(this.type); - }; - Attribute.guessTypeOf = function guessTypeOf(value) { - for (var key in UNIQUE_ID_VALIDATORS) { - if (value.match(UNIQUE_ID_VALIDATORS[key])) { - return key; - } - } - }; - Attribute.equals = function equals(a, b) { - return a.equals(b); - }; - _proto.equals = function equals(a) { - return a && this.type === a.type && this.value === a.value; - }; - _proto.uri = function uri() { - return encodeURIComponent(this.value) + ":" + encodeURIComponent(this.type); - }; - return Attribute; - }(); - - var currentUser; - /** - * Get a public space where only the specified user (public key) can write. Others can read. - * @param pub The public key of the user. Defaults to the current user from session. - * @returns {Node} The user space. - */ - function publicState (pub) { - if (!currentUser) { - currentUser = global$2().user(); - currentUser.auth(session.getKey()); - } - return pub ? global$2().user(pub) : currentUser; - } - - // TODO: extract Group channels into their own class - var DEFAULT_PERMISSIONS = { - read: true, - write: true, - admin: false - }; - /** - * Private communication channel between two or more participants ([Gun](https://github.com/amark/gun) public keys). Can be used independently of other Iris stuff. - * - * Used as a core element of [iris-messenger](https://github.com/irislib/iris-messenger). - * - * You can use iris.private(pub) to always use the same Channel object for a given pub. - * - * --- - * - * #### Key-value API - * `channel.put(key, value)` and `channel.on(key, callback)`. - * - * Note that each participant has their own versions of each key-value — they don't overwrite each other. `channel.on()` callback returns them all by default and has a parameter that indicates whose value you got. - * - * While values are encrypted, encryption of keys is not implemented yet. - * - * #### Message API - * `channel.send()` and `channel.getMessages()` for timestamp-indexed chat-style messaging. - * - * Message data is encrypted, but timestamps are public so that peers can return your messages in a sequential order. - * - * --- - * - * You can open a channel with yourself for a private key-value space or a "note to self" type chat with yourself. - * - * **Privacy disclaimer:** Channel ids, data values and messages are encrypted, but message timestamps are unencrypted so that peers can return them to you in a sequential order. By looking at the unencrypted timestamps (or Gun subscriptions), it is possible to guess who are communicating with each other. This could be improved by indexing messages by *day* only, so making the guess would be more difficult, while you could still return them in a semi-sequential order. - * - * @param {Object} options - * @param {string} options.key your keypair - * @param {Object} options.gun [gun](https://github.com/amark/gun) instance - * @param options.participants (optional) string or string array or permissions object ({'pub1':{read:true,write:true,admin:false},'pub2'...}) of participant public keys (your own key is included by default) - * @param {string} options.chatLink (optional) chat link instead of participants list - * @param {string} options.uuid (group channels only) unique channel identifier. Leave out for new channel. - * @param {string} options.name (group channels only) channel name - * @example - * // Copy & paste this to console at https://iris.to or other page that has gun, sea and iris-lib - * // Due to an unsolved bug, someoneElse's messages only start showing up after a reload - * - * var gun1 = new Gun('https://gun-us.herokuapp.com/gun'); - * var gun2 = new Gun('https://gun-us.herokuapp.com/gun'); - * var myKey = await iris.Key.getDefault(); - * var someoneElse = localStorage.getItem('someoneElsesKey'); - * if (someoneElse) { - * someoneElse = JSON.parse(someoneElse); - * } else { - * someoneElse = await iris.Key.generate(); - * localStorage.setItem('someoneElsesKey', JSON.stringify(someoneElse)); - * } - * - * iris.Channel.initUser(gun1, myKey); // saves myKey.epub to gun.user().get('epub') - * iris.Channel.initUser(gun2, someoneElse); - * - * var ourChannel = new iris.Channel({key: myKey, gun: gun1, participants: someoneElse.pub}); - * var theirChannel = new iris.Channel({key: someoneElse, gun: gun2, participants: myKey.pub}); - * - * var myChannels = {}; // you can list them in a user interface - * function printMessage(msg, info) { - * console.log(`[${new Date(msg.time).toLocaleString()}] ${info.from.slice(0,8)}: ${msg.text}`) - * } - * iris.Channel.getChannels(gun1, myKey, channel => { - * var pub = channel.getCurrentParticipants()[0]; - * gun1.user(pub).get('profile').get('name').on(name => channel.name = name); - * myChannels[pub] = channel; - * channel.getMessages(printMessage); - * channel.on('mood', (mood, from) => console.log(from.slice(0,8) + ' is feeling ' + mood)); - * }); - * - * // you can play with these in the console: - * ourChannel.send('message from myKey'); - * theirChannel.send('message from someoneElse'); - * - * ourChannel.put('mood', 'blessed'); - * theirChannel.put('mood', 'happy'); - * - * @example https://github.com/irislib/iris-lib/blob/master/__tests__/Channel.js - */ - var Channel = /*#__PURE__*/function () { - function Channel(options) { - var _this = this; - this.theirSecretUuids = {}; - this.theirGroupSecrets = {}; - this.secrets = {}; - this.ourSecretChannelIds = {}; - this.theirSecretChannelIds = {}; - this.messages = {}; - this.chatLinks = {}; - this.groupSubscriptions = {}; - this.directSubscriptions = {}; - this.getParticipantsCallbacks = {}; - this.myGroupSecret = options.myGroupSecret; - if (options.chatLink) { - this.useChatLink(options); - } - if (typeof options.participants === "string") { - this.addParticipant(options.participants, options.save); - } else if (Array.isArray(options.participants)) { - var o = {}; - options.participants.forEach(function (p) { - return o[p] = Object.assign({}, DEFAULT_PERMISSIONS); - }); - options.participants = o; - } - if (typeof options.participants === "object") { - // it's a group channel - var keys = Object.keys(options.participants); - keys.forEach(function (k) { - if (k !== session.getKey().pub) { - _this.addParticipant(k, options.save, Object.assign({}, DEFAULT_PERMISSIONS, options.participants[k])); - } - }); - options.participants[session.getKey().pub] = options.participants[session.getKey().pub] || Object.assign({}, DEFAULT_PERMISSIONS); - if (options.uuid) { - this.uuid = options.uuid; - this.name = options.name; - } else { - options.uuid = Attribute.getUuid().value; - this.uuid = options.uuid; - options.participants[session.getKey().pub].admin = true; - options.participants[session.getKey().pub].founder = true; - } - this.getChatLinks({ - subscribe: true - }); - } - this.participants = options.participants; - if (options.uuid) { - // It's a group channel - // share secret uuid with other participants. since secret is already non-deterministic, maybe uuid could also be? - // generate channel-specific secret and share it with other participants - // put() keys should be encrypted first? so you could do put(uuid, secret) - // what if you join the channel with 2 unconnected devices? on reconnect, the older secret would be overwritten and messages unreadable. maybe participants should store each others' old keys? or maybe you should store them and re-encrypt old stuff when key changes? return them with map() instead? - this.putDirect("S" + this.uuid, this.getMyGroupSecret()); - this.getMySecretUuid().then(function (s) { - _this.putDirect(_this.uuid, s); // TODO: encrypt keys in put() - }); - - this.onTheirDirect(this.uuid, function (s, k, from) { - _this.theirSecretUuids[from] = s; - }); - this.onTheirDirect("S" + this.uuid, function (s, k, from) { - _this.theirGroupSecrets[from] = s; - }); - // need to make put(), on(), send() and getMessages() behave differently when it's a group and retain the old versions for mutual signaling - } - - this.onTheir("participants", function (participants, k, from) { - var hasAdmin = false; - var keys = Object.keys(_this.participants); - for (var i = 0; i < keys.length; i++) { - if (_this.participants[keys[i]].admin || _this.participants[keys[i]].inviter) { - hasAdmin = true; - break; - } - } - if (!hasAdmin) { - keys.forEach(function (k) { - return _this.participants[k].admin = true; - }); // if no admins, make everyone admin - } - - if (_this.participants[from] && (_this.participants[from].admin || _this.participants[from].inviter)) { - if (typeof participants === "object") { - if (JSON.stringify(_this.participants) === JSON.stringify(participants)) { - return; - } - _this.participants = participants; - delete _this.participants[from].inviter; - Object.keys(participants).forEach(function (k) { - if (k !== session.getKey().pub) { - _this.addParticipant(k, true, Object.assign({}, DEFAULT_PERMISSIONS, participants[k]), true); - } - }); - _this.participantsChanged(); - options.saved = true; - } - } - }); - if (!options.saved && (options.save === undefined || options.save === true)) { - this.save(); - } - } - var _proto = Channel.prototype; - _proto.useChatLink = function useChatLink(options) { - var s = options.chatLink.split('?'); - if (s.length === 2) { - var chatWith = util.getUrlParameter('chatWith', s[1]); - var channelId = util.getUrlParameter('channelId', s[1]); - var inviter = util.getUrlParameter('inviter', s[1]); - var pub = inviter || chatWith; - if (chatWith) { - options.participants = pub; - } else if (channelId && inviter && inviter !== session.getKey().pub) { - // TODO! initializing it twice breaks things - new secret is generated - options.uuid = channelId; - options.participants = {}; - options.participants[inviter] = Object.assign({ - inviter: true - }, DEFAULT_PERMISSIONS); - } - if (pub !== session.getKey().pub) { - var sharedSecret = util.getUrlParameter('s', s[1]); - var linkId = util.getUrlParameter('k', s[1]); - if (sharedSecret && linkId) { - this.save(); // save the channel first so it's there before inviter subscribes to it - options.saved = true; - global$2().user(pub).get('chatLinks').get(linkId).get('encryptedSharedKey').on( /*#__PURE__*/function () { - var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(encrypted) { - var sharedKey, encryptedChatRequest, channelRequestId; - return _regeneratorRuntime().wrap(function _callee$(_context) { - while (1) { - switch (_context.prev = _context.next) { - case 0: - _context.next = 2; - return gun$1.SEA.decrypt(encrypted, sharedSecret); - case 2: - sharedKey = _context.sent; - _context.next = 5; - return gun$1.SEA.encrypt(session.getKey().pub, sharedSecret); - case 5: - encryptedChatRequest = _context.sent; - _context.next = 8; - return util.getHash(encryptedChatRequest); - case 8: - channelRequestId = _context.sent; - util.gunAsAnotherUser(global$2(), sharedKey, function (user) { - user.get('chatRequests').get(channelRequestId.slice(0, 12)).put(encryptedChatRequest); - }); - case 10: - case "end": - return _context.stop(); - } - } - }, _callee); - })); - return function (_x) { - return _ref.apply(this, arguments); - }; - }()); - } - } - } - }; - _proto.getTheirSecretUuid = function getTheirSecretUuid(pub) { - var _this2 = this; - return new Promise(function (resolve) { - if (!_this2.theirSecretUuids[pub]) { - _this2.onTheirDirect(_this2.uuid, function (s) { - _this2.theirSecretUuids[pub] = s; - resolve(_this2.theirSecretUuids[pub]); - }, pub); - } else { - resolve(_this2.theirSecretUuids[pub]); - } - }); - }; - _proto.getTheirGroupSecret = function getTheirGroupSecret(pub) { - var _this3 = this; - if (pub === session.getKey().pub) { - return this.getMyGroupSecret(); - } - return new Promise(function (resolve) { - if (!_this3.theirGroupSecrets[pub]) { - _this3.onTheirDirect("S" + _this3.uuid, function (s) { - _this3.theirGroupSecrets[pub] = s; - resolve(_this3.theirGroupSecrets[pub]); - }, pub); - } else { - resolve(_this3.theirGroupSecrets[pub]); - } - }); - }; - _proto.changeMyGroupSecret = function changeMyGroupSecret() { - this.myGroupSecret = gun$1.SEA.random(32).toString('base64'); - // TODO: secret should be archived and probably messages should include the encryption key id so past messages don't become unreadable - this.putDirect("S" + this.uuid, this.myGroupSecret); - } - /** - * Unsubscribe messages from a channel participants - * - * @param {string} participant public key - */; - _proto.mute = - /*#__PURE__*/ - function () { - var _mute = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(participant) { - return _regeneratorRuntime().wrap(function _callee2$(_context2) { - while (1) { - switch (_context2.prev = _context2.next) { - case 0: - global$2().user(participant).get(this.theirSecretUuids[participant]).off(); - // TODO: persist - case 1: - case "end": - return _context2.stop(); - } - } - }, _callee2, this); - })); - function mute(_x2) { - return _mute.apply(this, arguments); - } - return mute; - }() /** - * Mute user and prevent them from seeing your further (and maybe past) messages - * - * @param {string} participant public key - */; - _proto.block = - /*#__PURE__*/ - function () { - var _block = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3(participant) { - return _regeneratorRuntime().wrap(function _callee3$(_context3) { - while (1) { - switch (_context3.prev = _context3.next) { - case 0: - this.mute(participant); - this.putDirect(this.uuid, null); - this.putDirect("S" + this.uuid, null); - delete this.secrets[participant]; - delete this.ourSecretChannelIds[participant]; - delete this.theirSecretChannelIds[participant]; - this.changeMyGroupSecret(); - case 7: - case "end": - return _context3.stop(); - } - } - }, _callee3, this); - })); - function block(_x3) { - return _block.apply(this, arguments); - } - return block; - }(); - _proto.getMySecretUuid = /*#__PURE__*/function () { - var _getMySecretUuid = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee4() { - var mySecret, mySecretHash; - return _regeneratorRuntime().wrap(function _callee4$(_context4) { - while (1) { - switch (_context4.prev = _context4.next) { - case 0: - if (this.mySecretUuid) { - _context4.next = 10; - break; - } - _context4.next = 3; - return gun$1.SEA.secret(session.getKey().epub, session.getKey()); - case 3: - mySecret = _context4.sent; - _context4.next = 6; - return util.getHash(mySecret); - case 6: - mySecretHash = _context4.sent; - _context4.next = 9; - return util.getHash(mySecretHash + this.uuid); - case 9: - this.mySecretUuid = _context4.sent; - case 10: - return _context4.abrupt("return", this.mySecretUuid); - case 11: - case "end": - return _context4.stop(); - } - } - }, _callee4, this); - })); - function getMySecretUuid() { - return _getMySecretUuid.apply(this, arguments); - } - return getMySecretUuid; - }() /** - * List participants of the channel (other than you) - */; - _proto.getCurrentParticipants = function getCurrentParticipants() { - return Object.keys(this.secrets); - } - /** - * Subscribe to the changing list of participants by channel admins - */; - _proto.getParticipants = function getParticipants(callback) { - if (this.getParticipantsCallbackId) { - this.getParticipantsCallbackId++; - } else { - this.getParticipantsCallbackId = 1; - } - this.getParticipantsCallbacks[this.getParticipantsCallbackId] = callback; - if (this.participants) { - callback(this.participants); - } - }; - _proto.participantsChanged = function participantsChanged() { - var _this4 = this; - Object.keys(this.getParticipantsCallbacks).forEach(function (id) { - _this4.getParticipantsCallbacks[id](_this4.participants); - }); - } - /** - * Returns either the uuid of a group channel or the public key of a direct channel. - */; - _proto.getId = function getId() { - return this.uuid || this.getCurrentParticipants()[0]; - }; - _proto.getSecret = /*#__PURE__*/function () { - var _getSecret = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee5(pub) { - var epub; - return _regeneratorRuntime().wrap(function _callee5$(_context5) { - while (1) { - switch (_context5.prev = _context5.next) { - case 0: - if (this.secrets[pub]) { - _context5.next = 7; - break; - } - _context5.next = 3; - return util.gunOnceDefined(global$2().user(pub).get("epub")); - case 3: - epub = _context5.sent; - _context5.next = 6; - return gun$1.SEA.secret(epub, session.getKey()); - case 6: - this.secrets[pub] = _context5.sent; - case 7: - return _context5.abrupt("return", this.secrets[pub]); - case 8: - case "end": - return _context5.stop(); - } - } - }, _callee5, this); - })); - function getSecret(_x4) { - return _getSecret.apply(this, arguments); - } - return getSecret; - }() /** - * - */; - Channel.getOurSecretChannelId = - /*#__PURE__*/ - function () { - var _getOurSecretChannelId = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee6(pub, pair) { - var epub, secret; - return _regeneratorRuntime().wrap(function _callee6$(_context6) { - while (1) { - switch (_context6.prev = _context6.next) { - case 0: - _context6.next = 2; - return util.gunOnceDefined(global$2().user(pub).get("epub")); - case 2: - epub = _context6.sent; - _context6.next = 5; - return gun$1.SEA.secret(epub, pair); - case 5: - secret = _context6.sent; - return _context6.abrupt("return", util.getHash(secret + pub)); - case 7: - case "end": - return _context6.stop(); - } - } - }, _callee6); - })); - function getOurSecretChannelId(_x5, _x6) { - return _getOurSecretChannelId.apply(this, arguments); - } - return getOurSecretChannelId; - }() /** - * - */; - Channel.getTheirSecretChannelId = - /*#__PURE__*/ - function () { - var _getTheirSecretChannelId = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee7(pub, pair) { - var epub, secret; - return _regeneratorRuntime().wrap(function _callee7$(_context7) { - while (1) { - switch (_context7.prev = _context7.next) { - case 0: - _context7.next = 2; - return util.gunOnceDefined(global$2().user(pub).get("epub")); - case 2: - epub = _context7.sent; - _context7.next = 5; - return gun$1.SEA.secret(epub, pair); - case 5: - secret = _context7.sent; - return _context7.abrupt("return", util.getHash(secret + pair.pub)); - case 7: - case "end": - return _context7.stop(); - } - } - }, _callee7); - })); - function getTheirSecretChannelId(_x7, _x8) { - return _getTheirSecretChannelId.apply(this, arguments); - } - return getTheirSecretChannelId; - }() /** - * Calls back with Channels that you have initiated or written to. - * @param {Object} keypair Gun.SEA keypair that the gun instance is authenticated with - * @param callback callback function that is called for each public key you have a channel with - */; - Channel.getChannels = - /*#__PURE__*/ - function () { - var _getChannels = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee9(callback, listenToChatLinks) { - var keypair, mySecret, seen, handleChannel; - return _regeneratorRuntime().wrap(function _callee9$(_context9) { - while (1) { - switch (_context9.prev = _context9.next) { - case 0: - if (listenToChatLinks === void 0) { - listenToChatLinks = true; - } - keypair = session.getKey(); - _context9.next = 4; - return gun$1.SEA.secret(keypair.epub, keypair); - case 4: - mySecret = _context9.sent; - if (listenToChatLinks) { - Channel.getMyChatLinks(undefined, undefined, true); - } - seen = {}; - handleChannel = /*#__PURE__*/function () { - var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee8(value, ourSecretChannelId) { - var encryptedChatId, chatId; - return _regeneratorRuntime().wrap(function _callee8$(_context8) { - while (1) { - switch (_context8.prev = _context8.next) { - case 0: - if (!(value && !seen[ourSecretChannelId])) { - _context8.next = 14; - break; - } - seen[ourSecretChannelId] = true; - if (!(ourSecretChannelId.length > 44)) { - _context8.next = 5; - break; - } - global$2().user().get("chats").get(ourSecretChannelId).put(null); - return _context8.abrupt("return"); - case 5: - _context8.next = 7; - return util.gunOnceDefined(global$2().user().get("chats").get(ourSecretChannelId).get("pub")); - case 7: - encryptedChatId = _context8.sent; - _context8.next = 10; - return gun$1.SEA.decrypt(encryptedChatId, mySecret); - case 10: - chatId = _context8.sent; - if (chatId) { - _context8.next = 13; - break; - } - return _context8.abrupt("return"); - case 13: - if (chatId.pub || typeof chatId === "string") { - callback(new Channel({ - key: keypair, - participants: chatId.pub || chatId, - save: false - })); - } else if (chatId.uuid && chatId.participants && chatId.myGroupSecret) { - callback(new Channel({ - key: keypair, - participants: chatId.participants, - uuid: chatId.uuid, - myGroupSecret: chatId.myGroupSecret, - save: false - })); - } - case 14: - case "end": - return _context8.stop(); - } - } - }, _callee8); - })); - return function handleChannel(_x11, _x12) { - return _ref2.apply(this, arguments); - }; - }(); - global$2().user().get("chats").map().on(handleChannel); - case 9: - case "end": - return _context9.stop(); - } - } - }, _callee9); - })); - function getChannels(_x9, _x10) { - return _getChannels.apply(this, arguments); - } - return getChannels; - }(); - _proto.getMyGroupSecret = function getMyGroupSecret() { - if (!this.myGroupSecret) { - this.changeMyGroupSecret(); - } - return this.myGroupSecret; - }; - _proto.getOurSecretChannelId = /*#__PURE__*/function () { - var _getOurSecretChannelId2 = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee10(pub) { - var secret; - return _regeneratorRuntime().wrap(function _callee10$(_context10) { - while (1) { - switch (_context10.prev = _context10.next) { - case 0: - if (this.ourSecretChannelIds[pub]) { - _context10.next = 7; - break; - } - _context10.next = 3; - return this.getSecret(pub); - case 3: - secret = _context10.sent; - _context10.next = 6; - return util.getHash(secret + pub); - case 6: - this.ourSecretChannelIds[pub] = _context10.sent; - case 7: - return _context10.abrupt("return", this.ourSecretChannelIds[pub]); - case 8: - case "end": - return _context10.stop(); - } - } - }, _callee10, this); - })); - function getOurSecretChannelId(_x13) { - return _getOurSecretChannelId2.apply(this, arguments); - } - return getOurSecretChannelId; - }(); - _proto.getTheirSecretChannelId = /*#__PURE__*/function () { - var _getTheirSecretChannelId2 = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee11(pub) { - var secret; - return _regeneratorRuntime().wrap(function _callee11$(_context11) { - while (1) { - switch (_context11.prev = _context11.next) { - case 0: - if (this.theirSecretChannelIds[pub]) { - _context11.next = 7; - break; - } - _context11.next = 3; - return this.getSecret(pub); - case 3: - secret = _context11.sent; - _context11.next = 6; - return util.getHash(secret + session.getKey().pub); - case 6: - this.theirSecretChannelIds[pub] = _context11.sent; - case 7: - return _context11.abrupt("return", this.theirSecretChannelIds[pub]); - case 8: - case "end": - return _context11.stop(); - } - } - }, _callee11, this); - })); - function getTheirSecretChannelId(_x14) { - return _getTheirSecretChannelId2.apply(this, arguments); - } - return getTheirSecretChannelId; - }() /** - * Get messages from the channel - */; - _proto.getMessages = - /*#__PURE__*/ - function () { - var _getMessages = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee13(callback) { - var _this5 = this; - var mySecretUuid; - return _regeneratorRuntime().wrap(function _callee13$(_context13) { - while (1) { - switch (_context13.prev = _context13.next) { - case 0: - this.getCurrentParticipants().forEach( /*#__PURE__*/function () { - var _ref3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee12(pub) { - var theirSecretChannelId, ourSecretChannelId; - return _regeneratorRuntime().wrap(function _callee12$(_context12) { - while (1) { - switch (_context12.prev = _context12.next) { - case 0: - if (!(pub !== session.getKey().pub)) { - _context12.next = 11; - break; - } - if (!_this5.uuid) { - _context12.next = 7; - break; - } - _context12.next = 4; - return _this5.getTheirSecretUuid(pub); - case 4: - theirSecretChannelId = _context12.sent; - _context12.next = 10; - break; - case 7: - _context12.next = 9; - return _this5.getTheirSecretChannelId(pub); - case 9: - theirSecretChannelId = _context12.sent; - case 10: - global$2().user(pub).get("chats").get(theirSecretChannelId).get("msgs").map().once(function (data, key) { - _this5.messageReceived(callback, data, _this5.uuid || pub, false, key, pub); - }); - case 11: - if (_this5.uuid) { - _context12.next = 16; - break; - } - _context12.next = 14; - return _this5.getOurSecretChannelId(pub); - case 14: - ourSecretChannelId = _context12.sent; - publicState().get("chats").get(ourSecretChannelId).get("msgs").map().once(function (data, key) { - _this5.messageReceived(callback, data, pub, true, key, session.getKey().pub); - }); - case 16: - case "end": - return _context12.stop(); - } - } - }, _callee12); - })); - return function (_x16) { - return _ref3.apply(this, arguments); - }; - }()); - if (!this.uuid) { - _context13.next = 6; - break; - } - _context13.next = 4; - return this.getMySecretUuid(); - case 4: - mySecretUuid = _context13.sent; - publicState().get("chats").get(mySecretUuid).get("msgs").map().once(function (data, key) { - _this5.messageReceived(callback, data, _this5.uuid, true, key, session.getKey().pub); - }); - case 6: - case "end": - return _context13.stop(); - } - } - }, _callee13, this); - })); - function getMessages(_x15) { - return _getMessages.apply(this, arguments); - } - return getMessages; - }(); - _proto.messageReceived = /*#__PURE__*/function () { - var _messageReceived = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee14(callback, data, channelId, selfAuthored, key, from) { - var secret, decrypted, info; - return _regeneratorRuntime().wrap(function _callee14$(_context14) { - while (1) { - switch (_context14.prev = _context14.next) { - case 0: - if (!(this.messages[key] || !data)) { - _context14.next = 2; - break; - } - return _context14.abrupt("return"); - case 2: - if (!this.uuid) { - _context14.next = 8; - break; - } - _context14.next = 5; - return this.getTheirGroupSecret(from); - case 5: - _context14.t0 = _context14.sent; - _context14.next = 11; - break; - case 8: - _context14.next = 10; - return this.getSecret(channelId); - case 10: - _context14.t0 = _context14.sent; - case 11: - secret = _context14.t0; - _context14.next = 14; - return gun$1.SEA.decrypt(data, secret); - case 14: - decrypted = _context14.sent; - if (!(typeof decrypted !== "object")) { - _context14.next = 17; - break; - } - return _context14.abrupt("return"); - case 17: - info = { - selfAuthored: selfAuthored, - channelId: channelId, - from: from - }; - this.messages[key] = decrypted; - callback(decrypted, info); - case 20: - case "end": - return _context14.stop(); - } - } - }, _callee14, this); - })); - function messageReceived(_x17, _x18, _x19, _x20, _x21, _x22) { - return _messageReceived.apply(this, arguments); - } - return messageReceived; - }() /** - * Get latest message in this channel. Useful for channel listing. - */; - _proto.getLatestMsg = - /*#__PURE__*/ - function () { - var _getLatestMsg = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee16(callback) { - var _this6 = this; - var callbackIfLatest; - return _regeneratorRuntime().wrap(function _callee16$(_context16) { - while (1) { - switch (_context16.prev = _context16.next) { - case 0: - callbackIfLatest = /*#__PURE__*/function () { - var _ref4 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee15(msg, info) { - var t; - return _regeneratorRuntime().wrap(function _callee15$(_context15) { - while (1) { - switch (_context15.prev = _context15.next) { - case 0: - if (!_this6.latest) { - _this6.latest = msg; - callback(msg, info); - } else { - t = typeof _this6.latest.time === "string" ? _this6.latest.time : _this6.latest.time.toISOString(); - if (t < msg.time) { - _this6.latest = msg; - callback(msg, info); - } - } - case 1: - case "end": - return _context15.stop(); - } - } - }, _callee15); - })); - return function callbackIfLatest(_x24, _x25) { - return _ref4.apply(this, arguments); - }; - }(); - this.onMy('latestMsg', function (msg) { - return callbackIfLatest(msg, { - selfAuthored: true, - from: session.getKey().pub - }); - }); - this.onTheir('latestMsg', function (msg, k, from) { - return callbackIfLatest(msg, { - selfAuthored: false, - from: from - }); - }); - case 3: - case "end": - return _context16.stop(); - } - } - }, _callee16, this); - })); - function getLatestMsg(_x23) { - return _getLatestMsg.apply(this, arguments); - } - return getLatestMsg; - }() /** - * Useful for notifications - * @param {integer} time last seen msg time (default: now) - */; - _proto.setMyMsgsLastSeenTime = - /*#__PURE__*/ - function () { - var _setMyMsgsLastSeenTime = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee17(time) { - return _regeneratorRuntime().wrap(function _callee17$(_context17) { - while (1) { - switch (_context17.prev = _context17.next) { - case 0: - time = time || new Date().toISOString(); - return _context17.abrupt("return", this.put("msgsLastSeenTime", time)); - case 2: - case "end": - return _context17.stop(); - } - } - }, _callee17, this); - })); - function setMyMsgsLastSeenTime(_x26) { - return _setMyMsgsLastSeenTime.apply(this, arguments); - } - return setMyMsgsLastSeenTime; - }() /** - * Useful for notifications - */; - _proto.getMyMsgsLastSeenTime = - /*#__PURE__*/ - function () { - var _getMyMsgsLastSeenTime = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee18(callback) { - var _this7 = this; - return _regeneratorRuntime().wrap(function _callee18$(_context18) { - while (1) { - switch (_context18.prev = _context18.next) { - case 0: - this.onMy("msgsLastSeenTime", function (time) { - _this7.myMsgsLastSeenTime = time; - if (callback) { - callback(_this7.myMsgsLastSeenTime); - } - }); - case 1: - case "end": - return _context18.stop(); - } - } - }, _callee18, this); - })); - function getMyMsgsLastSeenTime(_x27) { - return _getMyMsgsLastSeenTime.apply(this, arguments); - } - return getMyMsgsLastSeenTime; - }() /** - * For "seen" status indicator - */; - _proto.getTheirMsgsLastSeenTime = - /*#__PURE__*/ - function () { - var _getTheirMsgsLastSeenTime = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee19(callback) { - var _this8 = this; - return _regeneratorRuntime().wrap(function _callee19$(_context19) { - while (1) { - switch (_context19.prev = _context19.next) { - case 0: - this.onTheir("msgsLastSeenTime", function (time) { - _this8.theirMsgsLastSeenTime = time; - if (callback) { - callback(_this8.theirMsgsLastSeenTime); - } - }); - case 1: - case "end": - return _context19.stop(); - } - } - }, _callee19, this); - })); - function getTheirMsgsLastSeenTime(_x28) { - return _getTheirMsgsLastSeenTime.apply(this, arguments); - } - return getTheirMsgsLastSeenTime; - }(); - _proto.removeParticipant = /*#__PURE__*/function () { - var _removeParticipant = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee20(pub) { - return _regeneratorRuntime().wrap(function _callee20$(_context20) { - while (1) { - switch (_context20.prev = _context20.next) { - case 0: - this.addParticipant(pub, true, { - read: false, - write: false - }); - case 1: - case "end": - return _context20.stop(); - } - } - }, _callee20, this); - })); - function removeParticipant(_x29) { - return _removeParticipant.apply(this, arguments); - } - return removeParticipant; - }() /** - * Add a public key to the channel or update its permissions - * @param {string} pub - */; - _proto.addParticipant = - /*#__PURE__*/ - function () { - var _addParticipant = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee21(pub, save, permissions, subscribe) { - var _this9 = this; - var ourSecretChannelId, mySecret; - return _regeneratorRuntime().wrap(function _callee21$(_context21) { - while (1) { - switch (_context21.prev = _context21.next) { - case 0: - if (save === void 0) { - save = true; - } - if (!this.uuid) { - _context21.next = 3; - break; - } - return _context21.abrupt("return"); - case 3: - if (permissions === undefined) { - permissions = DEFAULT_PERMISSIONS; - } - if (!(this.secrets[pub] && JSON.stringify(this.secrets[pub]) === JSON.stringify(permissions))) { - _context21.next = 6; - break; - } - return _context21.abrupt("return"); - case 6: - this.secrets[pub] = null; - this.getSecret(pub); - _context21.next = 10; - return this.getOurSecretChannelId(pub); - case 10: - ourSecretChannelId = _context21.sent; - if (!save) { - _context21.next = 20; - break; - } - _context21.next = 14; - return gun$1.SEA.secret(session.getKey().epub, session.getKey()); - case 14: - mySecret = _context21.sent; - _context21.t0 = global$2().user().get("chats").get(ourSecretChannelId).get("pub"); - _context21.next = 18; - return gun$1.SEA.encrypt({ - pub: pub - }, mySecret); - case 18: - _context21.t1 = _context21.sent; - _context21.t0.put.call(_context21.t0, _context21.t1); - case 20: - if (this.uuid) { - this.participants[pub] = permissions; - if (save) { - this.putDirect("S" + this.uuid, this.getMyGroupSecret()); - this.getMySecretUuid().then(function (s) { - _this9.putDirect(_this9.uuid, s); // TODO: encrypt keys in put() - }); - - this.onTheirDirect(this.uuid, function (s, k, from) { - _this9.theirSecretUuids[from] = s; - }); - this.onTheirDirect("S" + this.uuid, function (s, k, from) { - _this9.theirGroupSecrets[from] = s; - }); - this.save(); - } - } - if (subscribe) { - Object.values(this.directSubscriptions).forEach(function (arr) { - arr.forEach(function (o) { - if (!o.from || o.from === pub) { - _this9._onTheirDirectFromUser(pub, o.key, o.callback); - } - }); - }); - Object.values(this.groupSubscriptions).forEach(function (arr) { - arr.forEach(function (o) { - if (o.from && o.from !== pub) { - return; - } - if (permissions.write) { - _this9._onTheirGroupFromUser(pub, o.key, o.callback); - } else { - // unsubscribe - o.event && o.event.off(); - } - }); - }); - } - case 22: - case "end": - return _context21.stop(); - } - } - }, _callee21, this); - })); - function addParticipant(_x30, _x31, _x32, _x33) { - return _addParticipant.apply(this, arguments); - } - return addParticipant; - }() /** - * Send a message to the channel - * @param msg string or {time, text, ...} object - */; - _proto.send = - /*#__PURE__*/ - function () { - var _send = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee22(msg) { - var encrypted, mySecretUuid, keys, i, _encrypted, ourSecretChannelId; - return _regeneratorRuntime().wrap(function _callee22$(_context22) { - while (1) { - switch (_context22.prev = _context22.next) { - case 0: - if (!(typeof msg === "string")) { - _context22.next = 7; - break; - } - msg = msg.trim(); - if (!(msg.length === 0)) { - _context22.next = 4; - break; - } - return _context22.abrupt("return"); - case 4: - msg = { - time: new Date().toISOString(), - text: msg - }; - _context22.next = 12; - break; - case 7: - if (!(typeof msg === "object")) { - _context22.next = 11; - break; - } - msg.time = msg.time || new Date().toISOString(); - _context22.next = 12; - break; - case 11: - throw new Error("msg param must be a string or an object"); - case 12: - if (!this.uuid) { - _context22.next = 23; - break; - } - _context22.next = 15; - return gun$1.SEA.encrypt(JSON.stringify(msg), this.getMyGroupSecret()); - case 15: - encrypted = _context22.sent; - _context22.next = 18; - return this.getMySecretUuid(); - case 18: - mySecretUuid = _context22.sent; - publicState().get("chats").get(mySecretUuid).get("msgs").get("" + msg.time).put(encrypted); - publicState().get("chats").get(mySecretUuid).get("latestMsg").put(encrypted); - _context22.next = 42; - break; - case 23: - keys = this.getCurrentParticipants(); - i = 0; - case 25: - if (!(i < keys.length)) { - _context22.next = 42; - break; - } - _context22.t0 = gun$1.SEA; - _context22.t1 = JSON.stringify(msg); - _context22.next = 30; - return this.getSecret(keys[i]); - case 30: - _context22.t2 = _context22.sent; - _context22.next = 33; - return _context22.t0.encrypt.call(_context22.t0, _context22.t1, _context22.t2); - case 33: - _encrypted = _context22.sent; - _context22.next = 36; - return this.getOurSecretChannelId(keys[i]); - case 36: - ourSecretChannelId = _context22.sent; - publicState().get("chats").get(ourSecretChannelId).get("msgs").get("" + msg.time).put(_encrypted); - publicState().get("chats").get(ourSecretChannelId).get("latestMsg").put(_encrypted); - case 39: - i++; - _context22.next = 25; - break; - case 42: - case "end": - return _context22.stop(); - } - } - }, _callee22, this); - })); - function send(_x34) { - return _send.apply(this, arguments); - } - return send; - }() /** - * Save the channel to our channels list without sending a message - */; - _proto.save = - /*#__PURE__*/ - function () { - var _save = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee23() { - var mySecretUuid, mySecret, keys, i, ourSecretChannelId; - return _regeneratorRuntime().wrap(function _callee23$(_context23) { - while (1) { - switch (_context23.prev = _context23.next) { - case 0: - if (!this.uuid) { - _context23.next = 17; - break; - } - _context23.next = 3; - return this.getMySecretUuid(); - case 3: - mySecretUuid = _context23.sent; - publicState().get("chats").get(mySecretUuid).get('msgs').get('a').put(null); - this.put("participants", this.participants); // public participants list - _context23.next = 8; - return gun$1.SEA.secret(session.getKey().epub, session.getKey()); - case 8: - mySecret = _context23.sent; - _context23.t0 = publicState().get("chats").get(mySecretUuid).get("pub"); - _context23.next = 12; - return gun$1.SEA.encrypt({ - uuid: this.uuid, - myGroupSecret: this.getMyGroupSecret(), - participants: this.participants // private participants list - }, mySecret); - case 12: - _context23.t1 = _context23.sent; - _context23.t0.put.call(_context23.t0, _context23.t1); - this.participantsChanged(); - _context23.next = 27; - break; - case 17: - keys = this.getCurrentParticipants(); - i = 0; - case 19: - if (!(i < keys.length)) { - _context23.next = 27; - break; - } - _context23.next = 22; - return this.getOurSecretChannelId(keys[i]); - case 22: - ourSecretChannelId = _context23.sent; - publicState().get("chats").get(ourSecretChannelId).get('msgs').get('a').put(null); - case 24: - i++; - _context23.next = 19; - break; - case 27: - case "end": - return _context23.stop(); - } - } - }, _callee23, this); - })); - function save() { - return _save.apply(this, arguments); - } - return save; - }() /** - * Save a key-value pair, encrypt value. Each participant in the Channel writes to their own version of the key-value pair — they don't overwrite the same one. - * @param {string} key - * @param value - */; - _proto.put = - /*#__PURE__*/ - function () { - var _put = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee24(key, value) { - return _regeneratorRuntime().wrap(function _callee24$(_context24) { - while (1) { - switch (_context24.prev = _context24.next) { - case 0: - return _context24.abrupt("return", (this.uuid ? this.putGroup : this.putDirect).call(this, key, value)); - case 1: - case "end": - return _context24.stop(); - } - } - }, _callee24, this); - })); - function put(_x35, _x36) { - return _put.apply(this, arguments); - } - return put; - }(); - _proto.putGroup = /*#__PURE__*/function () { - var _putGroup = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee25(key, value) { - var encrypted, mySecretUuid; - return _regeneratorRuntime().wrap(function _callee25$(_context25) { - while (1) { - switch (_context25.prev = _context25.next) { - case 0: - if (!(key === "msgs")) { - _context25.next = 2; - break; - } - throw new Error("Sorry, you can't overwrite the msgs field which is used for .send()"); - case 2: - _context25.next = 4; - return gun$1.SEA.encrypt(JSON.stringify(value), this.getMyGroupSecret()); - case 4: - encrypted = _context25.sent; - _context25.next = 7; - return this.getMySecretUuid(); - case 7: - mySecretUuid = _context25.sent; - publicState().get("chats").get(mySecretUuid).get(key).put(encrypted); - case 9: - case "end": - return _context25.stop(); - } - } - }, _callee25, this); - })); - function putGroup(_x37, _x38) { - return _putGroup.apply(this, arguments); - } - return putGroup; - }(); - _proto.putDirect = /*#__PURE__*/function () { - var _putDirect = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee26(key, value) { - var keys, i, encrypted, ourSecretChannelId; - return _regeneratorRuntime().wrap(function _callee26$(_context26) { - while (1) { - switch (_context26.prev = _context26.next) { - case 0: - if (!(key === "msgs")) { - _context26.next = 2; - break; - } - throw new Error("Sorry, you can't overwrite the msgs field which is used for .send()"); - case 2: - keys = this.getCurrentParticipants(); - i = 0; - case 4: - if (!(i < keys.length)) { - _context26.next = 20; - break; - } - _context26.t0 = gun$1.SEA; - _context26.t1 = JSON.stringify(value); - _context26.next = 9; - return this.getSecret(keys[i]); - case 9: - _context26.t2 = _context26.sent; - _context26.next = 12; - return _context26.t0.encrypt.call(_context26.t0, _context26.t1, _context26.t2); - case 12: - encrypted = _context26.sent; - _context26.next = 15; - return this.getOurSecretChannelId(keys[i]); - case 15: - ourSecretChannelId = _context26.sent; - publicState().get("chats").get(ourSecretChannelId).get(key).put(encrypted); - case 17: - i++; - _context26.next = 4; - break; - case 20: - case "end": - return _context26.stop(); - } - } - }, _callee26, this); - })); - function putDirect(_x39, _x40) { - return _putDirect.apply(this, arguments); - } - return putDirect; - }() /** - * Subscribe to a key-value pair. Callback returns every participant's value unless you limit it with *from* param. - * @param {string} key - * @param {function} callback - * @param {string} from public key whose value you want, or *"me"* for your value only, or *"them"* for the value of others only - */; - _proto.on = - /*#__PURE__*/ - function () { - var _on = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee27(key, callback, from) { - return _regeneratorRuntime().wrap(function _callee27$(_context27) { - while (1) { - switch (_context27.prev = _context27.next) { - case 0: - return _context27.abrupt("return", (this.uuid ? this.onGroup : this.onDirect).call(this, key, callback, from)); - case 1: - case "end": - return _context27.stop(); - } - } - }, _callee27, this); - })); - function on(_x41, _x42, _x43) { - return _on.apply(this, arguments); - } - return on; - }(); - _proto.onDirect = /*#__PURE__*/function () { - var _onDirect = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee28(key, callback, from) { - return _regeneratorRuntime().wrap(function _callee28$(_context28) { - while (1) { - switch (_context28.prev = _context28.next) { - case 0: - if (!from || from === "me" || from === session.getKey().pub) { - this.onMy(key, function (val) { - return callback(val, session.getKey().pub); - }); - } - if (!from || from !== "me" && from !== session.getKey().pub) { - this.onTheir(key, function (val, k, pub) { - return callback(val, pub); - }); - } - case 2: - case "end": - return _context28.stop(); - } - } - }, _callee28, this); - })); - function onDirect(_x44, _x45, _x46) { - return _onDirect.apply(this, arguments); - } - return onDirect; - }(); - _proto.onGroup = /*#__PURE__*/function () { - var _onGroup = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee29(key, callback, from) { - return _regeneratorRuntime().wrap(function _callee29$(_context29) { - while (1) { - switch (_context29.prev = _context29.next) { - case 0: - if (!from || from === "me" || from === session.getKey().pub) { - this.onMyGroup(key, function (val) { - return callback(val, session.getKey().pub); - }); - } - if (!from || from !== "me" && from !== session.getKey().pub) { - this.onTheirGroup(key, function (val, k, pub) { - return callback(val, pub); - }); - } - case 2: - case "end": - return _context29.stop(); - } - } - }, _callee29, this); - })); - function onGroup(_x47, _x48, _x49) { - return _onGroup.apply(this, arguments); - } - return onGroup; - }(); - _proto.onMy = /*#__PURE__*/function () { - var _onMy = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee30(key, callback) { - return _regeneratorRuntime().wrap(function _callee30$(_context30) { - while (1) { - switch (_context30.prev = _context30.next) { - case 0: - return _context30.abrupt("return", (this.uuid ? this.onMyGroup : this.onMyDirect).call(this, key, callback)); - case 1: - case "end": - return _context30.stop(); - } - } - }, _callee30, this); - })); - function onMy(_x50, _x51) { - return _onMy.apply(this, arguments); - } - return onMy; - }(); - _proto.onMyDirect = /*#__PURE__*/function () { - var _onMyDirect = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee32(key, callback) { - var _this10 = this; - var keys, _loop, i, _ret; - return _regeneratorRuntime().wrap(function _callee32$(_context33) { - while (1) { - switch (_context33.prev = _context33.next) { - case 0: - if (!(typeof callback !== 'function')) { - _context33.next = 2; - break; - } - throw new Error("onMy callback must be a function, got " + typeof callback); - case 2: - keys = this.getCurrentParticipants(); - _loop = /*#__PURE__*/_regeneratorRuntime().mark(function _loop(i) { - var ourSecretChannelId; - return _regeneratorRuntime().wrap(function _loop$(_context32) { - while (1) { - switch (_context32.prev = _context32.next) { - case 0: - _context32.next = 2; - return _this10.getOurSecretChannelId(keys[i]); - case 2: - ourSecretChannelId = _context32.sent; - global$2().user().get("chats").get(ourSecretChannelId).get(key).on( /*#__PURE__*/function () { - var _ref5 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee31(data) { - var decrypted; - return _regeneratorRuntime().wrap(function _callee31$(_context31) { - while (1) { - switch (_context31.prev = _context31.next) { - case 0: - _context31.t0 = gun$1.SEA; - _context31.t1 = data; - _context31.next = 4; - return _this10.getSecret(keys[i]); - case 4: - _context31.t2 = _context31.sent; - _context31.next = 7; - return _context31.t0.decrypt.call(_context31.t0, _context31.t1, _context31.t2); - case 7: - decrypted = _context31.sent; - if (decrypted) { - callback(typeof decrypted.v !== "undefined" ? decrypted.v : decrypted, key); - } - case 9: - case "end": - return _context31.stop(); - } - } - }, _callee31); - })); - return function (_x54) { - return _ref5.apply(this, arguments); - }; - }()); - return _context32.abrupt("return", "break"); - case 5: - case "end": - return _context32.stop(); - } - } - }, _loop); - }); - i = 0; - case 5: - if (!(i < keys.length)) { - _context33.next = 13; - break; - } - return _context33.delegateYield(_loop(i), "t0", 7); - case 7: - _ret = _context33.t0; - if (!(_ret === "break")) { - _context33.next = 10; - break; - } - return _context33.abrupt("break", 13); - case 10: - i++; - _context33.next = 5; - break; - case 13: - case "end": - return _context33.stop(); - } - } - }, _callee32, this); - })); - function onMyDirect(_x52, _x53) { - return _onMyDirect.apply(this, arguments); - } - return onMyDirect; - }(); - _proto.onMyGroup = /*#__PURE__*/function () { - var _onMyGroup = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee34(key, callback) { - var mySecretUuid, mySecret; - return _regeneratorRuntime().wrap(function _callee34$(_context35) { - while (1) { - switch (_context35.prev = _context35.next) { - case 0: - if (!(typeof callback !== 'function')) { - _context35.next = 2; - break; - } - throw new Error("onMy callback must be a function, got " + typeof callback); - case 2: - _context35.next = 4; - return this.getMySecretUuid(); - case 4: - mySecretUuid = _context35.sent; - _context35.next = 7; - return this.getMyGroupSecret(); - case 7: - mySecret = _context35.sent; - global$2().user().get("chats").get(mySecretUuid).get(key).on( /*#__PURE__*/function () { - var _ref6 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee33(data) { - var decrypted; - return _regeneratorRuntime().wrap(function _callee33$(_context34) { - while (1) { - switch (_context34.prev = _context34.next) { - case 0: - _context34.next = 2; - return gun$1.SEA.decrypt(data, mySecret); - case 2: - decrypted = _context34.sent; - if (decrypted) { - callback(typeof decrypted.v !== "undefined" ? decrypted.v : decrypted, key, session.getKey().pub); - } - case 4: - case "end": - return _context34.stop(); - } - } - }, _callee33); - })); - return function (_x57) { - return _ref6.apply(this, arguments); - }; - }()); - case 9: - case "end": - return _context35.stop(); - } - } - }, _callee34, this); - })); - function onMyGroup(_x55, _x56) { - return _onMyGroup.apply(this, arguments); - } - return onMyGroup; - }(); - _proto.onTheir = /*#__PURE__*/function () { - var _onTheir = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee35(key, callback, from) { - return _regeneratorRuntime().wrap(function _callee35$(_context36) { - while (1) { - switch (_context36.prev = _context36.next) { - case 0: - return _context36.abrupt("return", (this.uuid ? this.onTheirGroup : this.onTheirDirect).call(this, key, callback, from)); - case 1: - case "end": - return _context36.stop(); - } - } - }, _callee35, this); - })); - function onTheir(_x58, _x59, _x60) { - return _onTheir.apply(this, arguments); - } - return onTheir; - }(); - _proto._onTheirDirectFromUser = /*#__PURE__*/function () { - var _onTheirDirectFromUser2 = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee37(key, callback, pub) { - var _this11 = this; - var theirSecretChannelId; - return _regeneratorRuntime().wrap(function _callee37$(_context38) { - while (1) { - switch (_context38.prev = _context38.next) { - case 0: - if (this.hasWritePermission(pub)) { - _context38.next = 2; - break; - } - return _context38.abrupt("return"); - case 2: - _context38.next = 4; - return this.getTheirSecretChannelId(pub); - case 4: - theirSecretChannelId = _context38.sent; - global$2().user(pub).get("chats").get(theirSecretChannelId).get(key).on( /*#__PURE__*/function () { - var _ref7 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee36(data) { - var decrypted; - return _regeneratorRuntime().wrap(function _callee36$(_context37) { - while (1) { - switch (_context37.prev = _context37.next) { - case 0: - if (_this11.hasWritePermission(pub)) { - _context37.next = 2; - break; - } - return _context37.abrupt("return"); - case 2: - _context37.t0 = gun$1.SEA; - _context37.t1 = data; - _context37.next = 6; - return _this11.getSecret(pub); - case 6: - _context37.t2 = _context37.sent; - _context37.next = 9; - return _context37.t0.decrypt.call(_context37.t0, _context37.t1, _context37.t2); - case 9: - decrypted = _context37.sent; - if (decrypted) { - callback(typeof decrypted.v !== "undefined" ? decrypted.v : decrypted, key, pub); - } - case 11: - case "end": - return _context37.stop(); - } - } - }, _callee36); - })); - return function (_x64) { - return _ref7.apply(this, arguments); - }; - }()); - case 6: - case "end": - return _context38.stop(); - } - } - }, _callee37, this); - })); - function _onTheirDirectFromUser(_x61, _x62, _x63) { - return _onTheirDirectFromUser2.apply(this, arguments); - } - return _onTheirDirectFromUser; - }(); - _proto.onTheirDirect = /*#__PURE__*/function () { - var _onTheirDirect = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee39(key, callback, from) { - var _this12 = this; - var participants; - return _regeneratorRuntime().wrap(function _callee39$(_context40) { - while (1) { - switch (_context40.prev = _context40.next) { - case 0: - if (!(typeof callback !== 'function')) { - _context40.next = 2; - break; - } - throw new Error("onTheir callback must be a function, got " + typeof callback); - case 2: - if (!Object.prototype.hasOwnProperty.call(this.directSubscriptions, key)) { - this.directSubscriptions[key] = []; - } - this.directSubscriptions[key].push({ - key: key, - callback: callback, - from: from - }); - participants = this.getCurrentParticipants(); - participants.forEach( /*#__PURE__*/function () { - var _ref8 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee38(pub) { - return _regeneratorRuntime().wrap(function _callee38$(_context39) { - while (1) { - switch (_context39.prev = _context39.next) { - case 0: - if (!(from && pub !== from)) { - _context39.next = 2; - break; - } - return _context39.abrupt("return"); - case 2: - _this12._onTheirDirectFromUser(pub, key, callback); - case 3: - case "end": - return _context39.stop(); - } - } - }, _callee38); - })); - return function (_x68) { - return _ref8.apply(this, arguments); - }; - }()); - case 6: - case "end": - return _context40.stop(); - } - } - }, _callee39, this); - })); - function onTheirDirect(_x65, _x66, _x67) { - return _onTheirDirect.apply(this, arguments); - } - return onTheirDirect; - }(); - _proto.hasWritePermission = function hasWritePermission(pub) { - return !this.uuid || this.participants && this.participants[pub] && this.participants[pub].write; - }; - _proto._onTheirGroupFromUser = /*#__PURE__*/function () { - var _onTheirGroupFromUser2 = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee41(pub, key, callback, subscription) { - var _this13 = this; - var theirSecretUuid; - return _regeneratorRuntime().wrap(function _callee41$(_context42) { - while (1) { - switch (_context42.prev = _context42.next) { - case 0: - if (this.hasWritePermission(pub)) { - _context42.next = 2; - break; - } - return _context42.abrupt("return"); - case 2: - _context42.next = 4; - return this.getTheirSecretUuid(pub); - case 4: - theirSecretUuid = _context42.sent; - global$2().user(pub).get("chats").get(theirSecretUuid).get(key).on( /*#__PURE__*/function () { - var _ref9 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee40(data, _a, _b, e) { - var decrypted; - return _regeneratorRuntime().wrap(function _callee40$(_context41) { - while (1) { - switch (_context41.prev = _context41.next) { - case 0: - if (subscription) { - subscription.event = e; - } - if (_this13.hasWritePermission(pub)) { - _context41.next = 3; - break; - } - return _context41.abrupt("return"); - case 3: - _context41.t0 = gun$1.SEA; - _context41.t1 = data; - _context41.next = 7; - return _this13.getTheirGroupSecret(pub); - case 7: - _context41.t2 = _context41.sent; - _context41.next = 10; - return _context41.t0.decrypt.call(_context41.t0, _context41.t1, _context41.t2); - case 10: - decrypted = _context41.sent; - if (decrypted) { - callback(typeof decrypted.v !== "undefined" ? decrypted.v : decrypted, key, pub); - } - case 12: - case "end": - return _context41.stop(); - } - } - }, _callee40); - })); - return function (_x73, _x74, _x75, _x76) { - return _ref9.apply(this, arguments); - }; - }()); - case 6: - case "end": - return _context42.stop(); - } - } - }, _callee41, this); - })); - function _onTheirGroupFromUser(_x69, _x70, _x71, _x72) { - return _onTheirGroupFromUser2.apply(this, arguments); - } - return _onTheirGroupFromUser; - }(); - _proto.onTheirGroup = /*#__PURE__*/function () { - var _onTheirGroup = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee43(key, callback, from) { - var _this14 = this; - var subscription; - return _regeneratorRuntime().wrap(function _callee43$(_context44) { - while (1) { - switch (_context44.prev = _context44.next) { - case 0: - if (!(typeof callback !== 'function')) { - _context44.next = 2; - break; - } - throw new Error("onTheir callback must be a function, got " + typeof callback); - case 2: - if (!Object.prototype.hasOwnProperty.call(this.groupSubscriptions, key)) { - this.groupSubscriptions[key] = []; - } - subscription = { - key: key, - callback: callback, - from: from - }; - this.groupSubscriptions[key].push(subscription); - this.getParticipants(function (participants) { - Object.keys(participants).forEach( /*#__PURE__*/function () { - var _ref10 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee42(pub) { - return _regeneratorRuntime().wrap(function _callee42$(_context43) { - while (1) { - switch (_context43.prev = _context43.next) { - case 0: - if (!(from && pub !== from)) { - _context43.next = 2; - break; - } - return _context43.abrupt("return"); - case 2: - if (participants[pub] && participants[pub].write) { - _context43.next = 4; - break; - } - return _context43.abrupt("return"); - case 4: - _this14._onTheirGroupFromUser(pub, key, callback, subscription); - case 5: - case "end": - return _context43.stop(); - } - } - }, _callee42); - })); - return function (_x80) { - return _ref10.apply(this, arguments); - }; - }()); - }); - case 6: - case "end": - return _context44.stop(); - } - } - }, _callee43, this); - })); - function onTheirGroup(_x77, _x78, _x79) { - return _onTheirGroup.apply(this, arguments); - } - return onTheirGroup; - }() /** - * Set typing status - */; - _proto.setTyping = function setTyping(isTyping, timeout) { - var _this15 = this; - if (timeout === void 0) { - timeout = 5; - } - isTyping = typeof isTyping === "undefined" ? true : isTyping; - timeout = timeout * 1000; - this.put("typing", isTyping ? new Date().toISOString() : new Date(0).toISOString()); - clearTimeout(this.setTypingTimeout); - this.setTypingTimeout = setTimeout(function () { - return _this15.put("typing", false); - }, timeout); - } - /** - * Get typing status - */; - _proto.getTyping = function getTyping(callback, timeout) { - var _this16 = this; - if (timeout === void 0) { - timeout = 5; - } - timeout = timeout * 1000; - this.onTheir("typing", function (typing, key, pub) { - if (callback) { - var isTyping = typing && new Date() - new Date(typing) <= timeout; - callback(isTyping, pub); - _this16.getTypingTimeouts = _this16.getTypingTimeouts || {}; - clearTimeout(_this16.getTypingTimeouts[pub]); - if (isTyping) { - _this16.getTypingTimeouts[pub] = setTimeout(function () { - return callback(false, pub); - }, timeout); - } - } - }); - } - /** - * Add a chat button to page - * @param options {label, channelOptions} - */; - Channel.addChatButton = function addChatButton(options) { - if (options === void 0) { - options = {}; - } - options = Object.assign({ - label: 'Chat' - }, options); - if (!options.channelOptions) { - throw new Error('addChatButton missing options.channelOptions param'); - } - util.injectCss(); - var channel, box; - var btn = util.createElement('div', 'iris-chat-open-button', document.body); - btn.setAttribute('id', 'iris-chat-open-button'); - btn.innerHTML = " " + options.label; - btn.addEventListener('click', function () { - btn.setAttribute('style', 'display: none'); - if (!channel) { - channel = new Channel(options.channelOptions); - box = channel.getChatBox(); - document.body.appendChild(box); - } else { - box.setAttribute('style', ''); // show - } - }); - } - /** - * Get a simple link that points to the channel. - * - * Direct channel: both users need to give their simple links. Use createChatLink() to get a two-way link that needs to be given by one user only. - * - * Group channel: Works only if the link recipient has been already added onto the channel participants list. - */; - _proto.getSimpleLink = function getSimpleLink(urlRoot) { - if (urlRoot === void 0) { - urlRoot = 'https://iris.to/'; - } - if (this.uuid) { - return urlRoot + "?channelId=" + this.uuid + "&inviter=" + session.getKey().pub; - } - return urlRoot + "?chatWith=" + this.getCurrentParticipants()[0]; - } - /** - * - */; - _proto.getChatLinks = - /*#__PURE__*/ - function () { - var _getChatLinks = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee45(opts) { - var _this17 = this; - var _opts, callback, urlRoot, subscribe, chatLinks, chatLinkSubscriptions; - return _regeneratorRuntime().wrap(function _callee45$(_context46) { - while (1) { - switch (_context46.prev = _context46.next) { - case 0: - if (opts === void 0) { - opts = {}; - } - _opts = opts, callback = _opts.callback, urlRoot = _opts.urlRoot, subscribe = _opts.subscribe; - urlRoot = urlRoot || 'https://iris.to/'; - if (this.uuid) { - _context46.next = 5; - break; - } - throw new Error('Only group channels may have chat links'); - case 5: - chatLinks = []; - chatLinkSubscriptions = {}; - this.on('chatLinks', function (links, from) { - // TODO: check admin permissions - if (!links || typeof links !== 'object') { - return; - } - Object.keys(links).forEach(function (linkId) { - var link = links[linkId]; - if (link === null) { - chatLinkSubscriptions[linkId] && chatLinkSubscriptions[linkId].off(); // unsubscribe removed chat link - delete chatLinkSubscriptions[linkId]; - callback && callback({ - id: linkId, - url: null - }); - return; - } - if (chatLinks.indexOf(linkId) !== -1) { - return; - } - var channels = []; - chatLinks.push(linkId); - var url = Channel.formatChatLink({ - urlRoot: urlRoot, - inviter: from, - channelId: _this17.uuid, - sharedSecret: link.sharedSecret, - linkId: linkId - }); - callback && callback({ - url: url, - id: linkId - }); - if (subscribe) { - global$2().user(link.sharedKey.pub).get('chatRequests').map().on( /*#__PURE__*/function () { - var _ref11 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee44(encPub, requestId, a, e) { - var s, pub; - return _regeneratorRuntime().wrap(function _callee44$(_context45) { - while (1) { - switch (_context45.prev = _context45.next) { - case 0: - if (!(!encPub || typeof encPub !== 'string' || encPub.length < 10)) { - _context45.next = 2; - break; - } - return _context45.abrupt("return"); - case 2: - chatLinkSubscriptions[linkId] = e; - s = JSON.stringify(encPub); - if (!(channels.indexOf(s) === -1)) { - _context45.next = 10; - break; - } - channels.push(s); - _context45.next = 8; - return gun$1.SEA.decrypt(encPub, link.sharedSecret); - case 8: - pub = _context45.sent; - _this17.addParticipant(pub, undefined, undefined, true); - case 10: - case "end": - return _context45.stop(); - } - } - }, _callee44); - })); - return function (_x82, _x83, _x84, _x85) { - return _ref11.apply(this, arguments); - }; - }()); - } - }); - }); - case 8: - case "end": - return _context46.stop(); - } - } - }, _callee45, this); - })); - function getChatLinks(_x81) { - return _getChatLinks.apply(this, arguments); - } - return getChatLinks; - }(); - _proto.createChatLink = /*#__PURE__*/function () { - var _createChatLink = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee46(urlRoot) { - var sharedKey, sharedKeyString, sharedSecret, encryptedSharedKey, ownerSecret, ownerEncryptedSharedKey, linkId; - return _regeneratorRuntime().wrap(function _callee46$(_context47) { - while (1) { - switch (_context47.prev = _context47.next) { - case 0: - if (urlRoot === void 0) { - urlRoot = 'https://iris.to/'; - } - _context47.next = 3; - return gun$1.SEA.pair(); - case 3: - sharedKey = _context47.sent; - sharedKeyString = JSON.stringify(sharedKey); - _context47.next = 7; - return gun$1.SEA.secret(sharedKey.epub, sharedKey); - case 7: - sharedSecret = _context47.sent; - _context47.next = 10; - return gun$1.SEA.encrypt(sharedKeyString, sharedSecret); - case 10: - encryptedSharedKey = _context47.sent; - _context47.next = 13; - return gun$1.SEA.secret(session.getKey().epub, session.getKey()); - case 13: - ownerSecret = _context47.sent; - _context47.next = 16; - return gun$1.SEA.encrypt(sharedKeyString, ownerSecret); - case 16: - ownerEncryptedSharedKey = _context47.sent; - _context47.next = 19; - return util.getHash(encryptedSharedKey); - case 19: - linkId = _context47.sent; - linkId = linkId.slice(0, 12); - // User has to exist, in order for .get(chatRequests).on() to be ever triggered - _context47.next = 23; - return util.gunAsAnotherUser(global$2(), sharedKey, function (user) { - return user.get('chatRequests').put({ - a: 1 - }).then(); - }); - case 23: - this.chatLinks[linkId] = { - sharedKey: sharedKey, - sharedSecret: sharedSecret - }; - this.put('chatLinks', this.chatLinks); - publicState().get('chatLinks').get(linkId).put({ - encryptedSharedKey: encryptedSharedKey, - ownerEncryptedSharedKey: ownerEncryptedSharedKey - }); - return _context47.abrupt("return", Channel.formatChatLink({ - urlRoot: urlRoot, - channelId: this.uuid, - inviter: session.getKey().pub, - sharedSecret: sharedSecret, - linkId: linkId - })); - case 27: - case "end": - return _context47.stop(); - } - } - }, _callee46, this); - })); - function createChatLink(_x86) { - return _createChatLink.apply(this, arguments); - } - return createChatLink; - }() /** - * Get a channel box element that you can add to your page - */; - _proto.getChatBox = function getChatBox() { - var _this18 = this; - util.injectCss(); - var minimized = false; - var chatBox = util.createElement('div', 'iris-chat-box'); - var header = util.createElement('div', 'iris-chat-header', chatBox); - var minimize = util.createElement('span', 'iris-chat-minimize', header); - minimize.innerText = '—'; - minimize.addEventListener('click', function (e) { - e.stopPropagation(); - chatBox.setAttribute('class', 'iris-chat-box minimized'); - minimized = true; - }); - var headerText = util.createElement('div', 'iris-chat-header-text', header); - var onlineIndicator = util.createElement('span', 'iris-online-indicator', headerText); - onlineIndicator.innerHTML = '●'; - var nameEl = util.createElement('span', undefined, headerText); - var close = util.createElement('span', 'iris-chat-close', header); - close.innerHTML = '×'; - close.addEventListener('click', function () { - chatBox.setAttribute('style', 'display: none'); - var openChatBtn = document.getElementById('iris-chat-open-button'); - if (openChatBtn) { - openChatBtn.setAttribute('style', ''); // show - } - }); - - header.addEventListener('click', function () { - if (minimized) { - chatBox.setAttribute('class', 'iris-chat-box'); - minimized = false; - } - }); - var messages = util.createElement('div', 'iris-chat-messages', chatBox); - var typingIndicator = util.createElement('div', 'iris-typing-indicator', chatBox); - typingIndicator.innerText = 'typing...'; - this.getTyping(function (isTyping) { - typingIndicator.setAttribute('class', "iris-typing-indicator" + (isTyping ? ' yes' : '')); - }); - var inputWrapper = util.createElement('div', 'iris-chat-input-wrapper', chatBox); - var textArea = util.createElement('textarea', undefined, inputWrapper); - textArea.setAttribute('rows', '1'); - textArea.setAttribute('placeholder', 'Type a message'); - if (util.isMobile) { - var sendBtn = util.createElement('button', undefined, inputWrapper); - sendBtn.innerHTML = "\n \n "; - sendBtn.addEventListener('click', function () { - _this18.send(textArea.value); - textArea.value = ''; - _this18.setTyping(false); - }); - } - var participants = this.getCurrentParticipants(); - if (participants.length) { - var pub = participants[0]; - global$2().user(pub).get('profile').get('name').on(function (name) { - return nameEl.innerText = name; - }); - Channel.getActivity(global$2(), pub, function (status) { - var cls = "iris-online-indicator" + (status.isActive ? ' yes' : ''); - onlineIndicator.setAttribute('class', cls); - var undelivered = messages.querySelectorAll('.iris-chat-message:not(.delivered)'); - undelivered.forEach(function (msg) { - if (msg.getAttribute('data-time') <= status.lastActive) { - var c = msg.getAttribute('class'); - msg.setAttribute('class', c + " delivered"); - } - }); - }); - } - this.getTheirMsgsLastSeenTime(function (time) { - var unseen = messages.querySelectorAll('.iris-seen:not(.yes)'); - unseen.forEach(function (indicator) { - var msgEl = indicator.parentElement.parentElement.parentElement; - if (msgEl.getAttribute('data-time') <= time) { - var msgClass = msgEl.getAttribute('class'); - if (msgClass.indexOf('delivered') === -1) { - msgEl.setAttribute('class', msgClass + " delivered"); - } - indicator.setAttribute('class', 'iris-seen yes'); - } - }); - }); - this.getMessages(function (msg, info) { - var msgContent = util.createElement('div', 'iris-msg-content'); - msgContent.innerText = msg.text; - var time = util.createElement('div', 'time', msgContent); - time.innerText = util.formatTime(new Date(msg.time)); - if (info.selfAuthored) { - var cls = _this18.theirMsgsLastSeenTime >= msg.time ? 'iris-seen yes' : 'iris-seen'; - var seenIndicator = util.createElement('span', cls, time); - seenIndicator.innerHTML = ' '; - } - msgContent.innerHTML = msgContent.innerHTML.replace(/\n/g, '
\n'); - var msgEl = util.createElement('div', (info.selfAuthored ? 'our' : 'their') + " iris-chat-message"); - msgEl.appendChild(msgContent); - msgEl.setAttribute('data-time', msg.time); - for (var i = messages.children.length; i >= 0; i--) { - if (i === 0) { - messages.insertBefore(msgEl, messages.firstChild); - } else { - var t = messages.children[i - 1].getAttribute('data-time'); - if (t && t < msg.time) { - messages.children[i - 1].insertAdjacentElement('afterend', msgEl); - break; - } - } - } - messages.scrollTop = messages.scrollHeight; - }); - textArea.addEventListener('keyup', function (event) { - Channel.setActivity(global$2(), true); // TODO - _this18.setMyMsgsLastSeenTime(); // TODO - if (event.keyCode === 13) { - event.preventDefault(); - var content = textArea.value; - var caret = util.getCaret(textArea); - if (event.shiftKey) { - textArea.value = content.substring(0, caret - 1) + "\n" + content.substring(caret, content.length); - } else { - textArea.value = content.substring(0, caret - 1) + content.substring(caret, content.length); - _this18.send(textArea.value); - textArea.value = ''; - _this18.setTyping(false); - } - } else { - _this18.setTyping(!!textArea.value.length); - } - }); - return chatBox; - } - /** - * Set the user's online/active status - * @param {string} activity string: set the activity status every 3 seconds, null/false: stop updating - */; - Channel.setActivity = function setActivity(activity) { - if (global$2().irisActivityStatus === activity) { - return; - } - global$2().irisActivityStatus = activity; - clearTimeout(global$2().setActivityTimeout); - var update = function update() { - global$2().user().get("activity").put({ - status: activity, - time: new Date(gun$1.state()).toISOString() - }); - }; - update(); - function timerUpdate() { - update(); - global$2().setActivityTimeout = setTimeout(timerUpdate, 3000); - } - if (activity) { - timerUpdate(); - } - } - /** - * Get the online status of a user. - * - * @param {string} pubKey public key of the user - * @param {boolean} callback receives a boolean each time the user's online status changes - */; - Channel.getActivity = function getActivity(pubKey, callback) { - var timeout; - global$2().user(pubKey).get("activity").on(function (activity) { - if (!activity || !(activity.time && activity.status)) { - return; - } - clearTimeout(timeout); - var now = new Date(gun$1.state()); - var activityDate = new Date(activity.time); - var isActive = activityDate > new Date(now.getTime() - 10 * 1000) && activityDate < new Date(now.getTime() + 30 * 1000); - callback({ - isActive: isActive, - lastActive: activity.time, - status: activity.status - }); - if (isActive) { - timeout = setTimeout(function () { - return callback({ - isOnline: false, - lastActive: activity.time - }); - }, 10000); - } - }); - }; - Channel.formatChatLink = function formatChatLink(_ref12) { - var urlRoot = _ref12.urlRoot, - chatWith = _ref12.chatWith, - channelId = _ref12.channelId, - inviter = _ref12.inviter, - sharedSecret = _ref12.sharedSecret, - linkId = _ref12.linkId; - var enc = encodeURIComponent; - if (channelId && inviter) { - return urlRoot + "?channelId=" + enc(channelId) + "&inviter=" + enc(inviter) + "&s=" + enc(sharedSecret) + "&k=" + enc(linkId); - } - return urlRoot + "?chatWith=" + enc(chatWith) + "&s=" + enc(sharedSecret) + "&k=" + enc(linkId); - } - /** - * Creates a channel link that can be used for two-way communication, i.e. only one link needs to be exchanged. - */; - Channel.createChatLink = - /*#__PURE__*/ - function () { - var _createChatLink2 = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee47(urlRoot) { - var user, key, sharedKey, sharedKeyString, sharedSecret, encryptedSharedKey, ownerSecret, ownerEncryptedSharedKey, linkId; - return _regeneratorRuntime().wrap(function _callee47$(_context48) { - while (1) { - switch (_context48.prev = _context48.next) { - case 0: - if (urlRoot === void 0) { - urlRoot = 'https://iris.to/'; - } - user = global$2().user(); - key = session.getKey(); // We create a new Gun user whose private key is shared with the chat link recipients. - // Chat link recipients can contact you by writing their public key to the shared key's user space. - _context48.next = 5; - return gun$1.SEA.pair(); - case 5: - sharedKey = _context48.sent; - sharedKeyString = JSON.stringify(sharedKey); - _context48.next = 9; - return gun$1.SEA.secret(sharedKey.epub, sharedKey); - case 9: - sharedSecret = _context48.sent; - _context48.next = 12; - return gun$1.SEA.encrypt(sharedKeyString, sharedSecret); - case 12: - encryptedSharedKey = _context48.sent; - _context48.next = 15; - return gun$1.SEA.secret(key.epub, key); - case 15: - ownerSecret = _context48.sent; - _context48.next = 18; - return gun$1.SEA.encrypt(sharedKeyString, ownerSecret); - case 18: - ownerEncryptedSharedKey = _context48.sent; - _context48.next = 21; - return util.getHash(encryptedSharedKey); - case 21: - linkId = _context48.sent; - linkId = linkId.slice(0, 12); - // User has to exist, in order for .get(chatRequests).on() to be ever triggered - util.gunAsAnotherUser(global$2(), sharedKey, function (user) { - user.get('chatRequests').put({ - a: 1 - }); - }); - user.get('chatLinks').get(linkId).put({ - encryptedSharedKey: encryptedSharedKey, - ownerEncryptedSharedKey: ownerEncryptedSharedKey - }); - return _context48.abrupt("return", Channel.formatChatLink({ - urlRoot: urlRoot, - chatWith: key.pub, - sharedSecret: sharedSecret, - linkId: linkId - })); - case 26: - case "end": - return _context48.stop(); - } - } - }, _callee47); - })); - function createChatLink(_x87) { - return _createChatLink2.apply(this, arguments); - } - return createChatLink; - }() /** - * - */; - Channel.getMyChatLinks = - /*#__PURE__*/ - function () { - var _getMyChatLinks = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee50(urlRoot, callback, subscribe) { - var key, user, mySecret, chatLinks; - return _regeneratorRuntime().wrap(function _callee50$(_context51) { - while (1) { - switch (_context51.prev = _context51.next) { - case 0: - if (urlRoot === void 0) { - urlRoot = 'https://iris.to/'; - } - if (subscribe === void 0) { - subscribe = false; - } - key = session.getKey(); - user = global$2().user(); - _context51.next = 6; - return gun$1.SEA.secret(key.epub, key); - case 6: - mySecret = _context51.sent; - chatLinks = []; - user.get('chatLinks').map().on(function (data, linkId) { - if (!data || chatLinks.indexOf(linkId) !== -1) { - return; - } - var channels = []; - user.get('chatLinks').get(linkId).get('ownerEncryptedSharedKey').on( /*#__PURE__*/function () { - var _ref13 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee49(enc) { - var sharedKey, sharedSecret, url; - return _regeneratorRuntime().wrap(function _callee49$(_context50) { - while (1) { - switch (_context50.prev = _context50.next) { - case 0: - if (!(!enc || chatLinks.indexOf(linkId) !== -1)) { - _context50.next = 2; - break; - } - return _context50.abrupt("return"); - case 2: - chatLinks.push(linkId); - _context50.next = 5; - return gun$1.SEA.decrypt(enc, mySecret); - case 5: - sharedKey = _context50.sent; - _context50.next = 8; - return gun$1.SEA.secret(sharedKey.epub, sharedKey); - case 8: - sharedSecret = _context50.sent; - url = Channel.formatChatLink({ - urlRoot: urlRoot, - chatWith: key.pub, - sharedSecret: sharedSecret, - linkId: linkId - }); - if (callback) { - callback({ - url: url, - id: linkId - }); - } - if (subscribe) { - global$2().user(sharedKey.pub).get('chatRequests').map().on( /*#__PURE__*/function () { - var _ref14 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee48(encPub, requestId) { - var s, pub, channel; - return _regeneratorRuntime().wrap(function _callee48$(_context49) { - while (1) { - switch (_context49.prev = _context49.next) { - case 0: - if (encPub) { - _context49.next = 2; - break; - } - return _context49.abrupt("return"); - case 2: - s = JSON.stringify(encPub); - if (!(channels.indexOf(s) === -1)) { - _context49.next = 10; - break; - } - channels.push(s); - _context49.next = 7; - return gun$1.SEA.decrypt(encPub, sharedSecret); - case 7: - pub = _context49.sent; - channel = new Channel({ - key: key, - participants: pub - }); - channel.save(); - case 10: - util.gunAsAnotherUser(global$2(), sharedKey, function (user) { - user.get('chatRequests').get(requestId).put(null); - }); - case 11: - case "end": - return _context49.stop(); - } - } - }, _callee48); - })); - return function (_x92, _x93) { - return _ref14.apply(this, arguments); - }; - }()); - } - case 12: - case "end": - return _context50.stop(); - } - } - }, _callee49); - })); - return function (_x91) { - return _ref13.apply(this, arguments); - }; - }()); - }); - case 9: - case "end": - return _context51.stop(); - } - } - }, _callee50); - })); - function getMyChatLinks(_x88, _x89, _x90) { - return _getMyChatLinks.apply(this, arguments); - } - return getMyChatLinks; - }() /** - * - */; - _proto.removeGroupChatLink = function removeGroupChatLink(linkId) { - this.chatLinks[linkId] = null; - this.put('chatLinks', this.chatLinks); - global$2().user().get('chatLinks').get(linkId).put(null); - } - /** - * - */; - Channel.removePrivateChatLink = function removePrivateChatLink(key, linkId) { - global$2().user().auth(key); - global$2().user().get('chatLinks').get(linkId).put(null); - } - /** - * - */; - Channel.deleteChannel = - /*#__PURE__*/ - function () { - var _deleteChannel = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee51(key, pub) { - var channelId; - return _regeneratorRuntime().wrap(function _callee51$(_context52) { - while (1) { - switch (_context52.prev = _context52.next) { - case 0: - global$2().user().auth(key); - _context52.next = 3; - return Channel.getOurSecretChannelId(pub, key); - case 3: - channelId = _context52.sent; - global$2().user().get('channels').get(channelId).put(null); - global$2().user().get('channels').get(channelId).off(); - case 6: - case "end": - return _context52.stop(); - } - } - }, _callee51); - })); - function deleteChannel(_x94, _x95) { - return _deleteChannel.apply(this, arguments); - } - return deleteChannel; - }() /** - * - */; - Channel.deleteGroup = - /*#__PURE__*/ - function () { - var _deleteGroup = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee52(key, uuid) { - var mySecret, mySecretHash, mySecretUuid; - return _regeneratorRuntime().wrap(function _callee52$(_context53) { - while (1) { - switch (_context53.prev = _context53.next) { - case 0: - _context53.next = 2; - return gun$1.SEA.secret(key.epub, key); - case 2: - mySecret = _context53.sent; - _context53.next = 5; - return util.getHash(mySecret); - case 5: - mySecretHash = _context53.sent; - _context53.next = 8; - return util.getHash(mySecretHash + uuid); - case 8: - mySecretUuid = _context53.sent; - global$2().user().auth(key); - global$2().user().get('channels').get(mySecretUuid).put(null); - global$2().user().get('channels').get(mySecretUuid).off(); - case 12: - case "end": - return _context53.stop(); - } - } - }, _callee52); - })); - function deleteGroup(_x96, _x97) { - return _deleteGroup.apply(this, arguments); - } - return deleteGroup; - }(); - return Channel; - }(); - - var channels = /*#__PURE__*/new Map(); - /** - * Private channel that only you and publicKey can read/write. - * @param publicKey - * @returns {Channel} - */ - function privateState (publicKey, chatLink) { - if (publicKey === void 0) { - publicKey = session.getKey(); - } - var channel = channels.get(publicKey); - if (!channel) { - channel = new Channel({ - participants: publicKey, - chatLink: chatLink - }); - channels.set(publicKey, channel); - } - return channel; - } - - var localforage = createCommonjsModule(function (module, exports) { - /*! - localForage -- Offline Storage, Improved - Version 1.10.0 - https://localforage.github.io/localForage - (c) 2013-2017 Mozilla, Apache License 2.0 - */ - (function(f){{module.exports=f();}})(function(){return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof commonjsRequire=="function"&&commonjsRequire;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw (f.code="MODULE_NOT_FOUND", f)}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r);}return n[o].exports}var i=typeof commonjsRequire=="function"&&commonjsRequire;for(var o=0;o element; its readystatechange event will be fired asynchronously once it is inserted - // into the document. Do so, thus queuing up the task. Remember to clean up once it's been called. - var scriptEl = global.document.createElement('script'); - scriptEl.onreadystatechange = function () { - nextTick(); - - scriptEl.onreadystatechange = null; - scriptEl.parentNode.removeChild(scriptEl); - scriptEl = null; - }; - global.document.documentElement.appendChild(scriptEl); - }; - } else { - scheduleDrain = function () { - setTimeout(nextTick, 0); - }; - } - } - - var draining; - var queue = []; - //named nextTick for less confusing stack traces - function nextTick() { - draining = true; - var i, oldQueue; - var len = queue.length; - while (len) { - oldQueue = queue; - queue = []; - i = -1; - while (++i < len) { - oldQueue[i](); - } - len = queue.length; - } - draining = false; - } - - module.exports = immediate; - function immediate(task) { - if (queue.push(task) === 1 && !draining) { - scheduleDrain(); - } - } - - }).call(this,typeof commonjsGlobal !== "undefined" ? commonjsGlobal : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}); - },{}],2:[function(_dereq_,module,exports){ - var immediate = _dereq_(1); - - /* istanbul ignore next */ - function INTERNAL() {} - - var handlers = {}; - - var REJECTED = ['REJECTED']; - var FULFILLED = ['FULFILLED']; - var PENDING = ['PENDING']; - - module.exports = Promise; - - function Promise(resolver) { - if (typeof resolver !== 'function') { - throw new TypeError('resolver must be a function'); - } - this.state = PENDING; - this.queue = []; - this.outcome = void 0; - if (resolver !== INTERNAL) { - safelyResolveThenable(this, resolver); - } - } - - Promise.prototype["catch"] = function (onRejected) { - return this.then(null, onRejected); - }; - Promise.prototype.then = function (onFulfilled, onRejected) { - if (typeof onFulfilled !== 'function' && this.state === FULFILLED || - typeof onRejected !== 'function' && this.state === REJECTED) { - return this; - } - var promise = new this.constructor(INTERNAL); - if (this.state !== PENDING) { - var resolver = this.state === FULFILLED ? onFulfilled : onRejected; - unwrap(promise, resolver, this.outcome); - } else { - this.queue.push(new QueueItem(promise, onFulfilled, onRejected)); - } - - return promise; - }; - function QueueItem(promise, onFulfilled, onRejected) { - this.promise = promise; - if (typeof onFulfilled === 'function') { - this.onFulfilled = onFulfilled; - this.callFulfilled = this.otherCallFulfilled; - } - if (typeof onRejected === 'function') { - this.onRejected = onRejected; - this.callRejected = this.otherCallRejected; - } - } - QueueItem.prototype.callFulfilled = function (value) { - handlers.resolve(this.promise, value); - }; - QueueItem.prototype.otherCallFulfilled = function (value) { - unwrap(this.promise, this.onFulfilled, value); - }; - QueueItem.prototype.callRejected = function (value) { - handlers.reject(this.promise, value); - }; - QueueItem.prototype.otherCallRejected = function (value) { - unwrap(this.promise, this.onRejected, value); - }; - - function unwrap(promise, func, value) { - immediate(function () { - var returnValue; - try { - returnValue = func(value); - } catch (e) { - return handlers.reject(promise, e); - } - if (returnValue === promise) { - handlers.reject(promise, new TypeError('Cannot resolve promise with itself')); - } else { - handlers.resolve(promise, returnValue); - } - }); - } - - handlers.resolve = function (self, value) { - var result = tryCatch(getThen, value); - if (result.status === 'error') { - return handlers.reject(self, result.value); - } - var thenable = result.value; - - if (thenable) { - safelyResolveThenable(self, thenable); - } else { - self.state = FULFILLED; - self.outcome = value; - var i = -1; - var len = self.queue.length; - while (++i < len) { - self.queue[i].callFulfilled(value); - } - } - return self; - }; - handlers.reject = function (self, error) { - self.state = REJECTED; - self.outcome = error; - var i = -1; - var len = self.queue.length; - while (++i < len) { - self.queue[i].callRejected(error); - } - return self; - }; - - function getThen(obj) { - // Make sure we only access the accessor once as required by the spec - var then = obj && obj.then; - if (obj && (typeof obj === 'object' || typeof obj === 'function') && typeof then === 'function') { - return function appyThen() { - then.apply(obj, arguments); - }; - } - } - - function safelyResolveThenable(self, thenable) { - // Either fulfill, reject or reject with error - var called = false; - function onError(value) { - if (called) { - return; - } - called = true; - handlers.reject(self, value); - } - - function onSuccess(value) { - if (called) { - return; - } - called = true; - handlers.resolve(self, value); - } - - function tryToUnwrap() { - thenable(onSuccess, onError); - } - - var result = tryCatch(tryToUnwrap); - if (result.status === 'error') { - onError(result.value); - } - } - - function tryCatch(func, value) { - var out = {}; - try { - out.value = func(value); - out.status = 'success'; - } catch (e) { - out.status = 'error'; - out.value = e; - } - return out; - } - - Promise.resolve = resolve; - function resolve(value) { - if (value instanceof this) { - return value; - } - return handlers.resolve(new this(INTERNAL), value); - } - - Promise.reject = reject; - function reject(reason) { - var promise = new this(INTERNAL); - return handlers.reject(promise, reason); - } - - Promise.all = all; - function all(iterable) { - var self = this; - if (Object.prototype.toString.call(iterable) !== '[object Array]') { - return this.reject(new TypeError('must be an array')); - } - - var len = iterable.length; - var called = false; - if (!len) { - return this.resolve([]); - } - - var values = new Array(len); - var resolved = 0; - var i = -1; - var promise = new this(INTERNAL); - - while (++i < len) { - allResolver(iterable[i], i); - } - return promise; - function allResolver(value, i) { - self.resolve(value).then(resolveFromAll, function (error) { - if (!called) { - called = true; - handlers.reject(promise, error); - } - }); - function resolveFromAll(outValue) { - values[i] = outValue; - if (++resolved === len && !called) { - called = true; - handlers.resolve(promise, values); - } - } - } - } - - Promise.race = race; - function race(iterable) { - var self = this; - if (Object.prototype.toString.call(iterable) !== '[object Array]') { - return this.reject(new TypeError('must be an array')); - } - - var len = iterable.length; - var called = false; - if (!len) { - return this.resolve([]); - } - - var i = -1; - var promise = new this(INTERNAL); - - while (++i < len) { - resolver(iterable[i]); - } - return promise; - function resolver(value) { - self.resolve(value).then(function (response) { - if (!called) { - called = true; - handlers.resolve(promise, response); - } - }, function (error) { - if (!called) { - called = true; - handlers.reject(promise, error); - } - }); - } - } - - },{"1":1}],3:[function(_dereq_,module,exports){ - (function (global){ - if (typeof global.Promise !== 'function') { - global.Promise = _dereq_(2); - } - - }).call(this,typeof commonjsGlobal !== "undefined" ? commonjsGlobal : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}); - },{"2":2}],4:[function(_dereq_,module,exports){ - - var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; - - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - - function getIDB() { - /* global indexedDB,webkitIndexedDB,mozIndexedDB,OIndexedDB,msIndexedDB */ - try { - if (typeof indexedDB !== 'undefined') { - return indexedDB; - } - if (typeof webkitIndexedDB !== 'undefined') { - return webkitIndexedDB; - } - if (typeof mozIndexedDB !== 'undefined') { - return mozIndexedDB; - } - if (typeof OIndexedDB !== 'undefined') { - return OIndexedDB; - } - if (typeof msIndexedDB !== 'undefined') { - return msIndexedDB; - } - } catch (e) { - return; - } - } - - var idb = getIDB(); - - function isIndexedDBValid() { - try { - // Initialize IndexedDB; fall back to vendor-prefixed versions - // if needed. - if (!idb || !idb.open) { - return false; - } - // We mimic PouchDB here; - // - // We test for openDatabase because IE Mobile identifies itself - // as Safari. Oh the lulz... - var isSafari = typeof openDatabase !== 'undefined' && /(Safari|iPhone|iPad|iPod)/.test(navigator.userAgent) && !/Chrome/.test(navigator.userAgent) && !/BlackBerry/.test(navigator.platform); - - var hasFetch = typeof fetch === 'function' && fetch.toString().indexOf('[native code') !== -1; - - // Safari <10.1 does not meet our requirements for IDB support - // (see: https://github.com/pouchdb/pouchdb/issues/5572). - // Safari 10.1 shipped with fetch, we can use that to detect it. - // Note: this creates issues with `window.fetch` polyfills and - // overrides; see: - // https://github.com/localForage/localForage/issues/856 - return (!isSafari || hasFetch) && typeof indexedDB !== 'undefined' && - // some outdated implementations of IDB that appear on Samsung - // and HTC Android devices <4.4 are missing IDBKeyRange - // See: https://github.com/mozilla/localForage/issues/128 - // See: https://github.com/mozilla/localForage/issues/272 - typeof IDBKeyRange !== 'undefined'; - } catch (e) { - return false; - } - } - - // Abstracts constructing a Blob object, so it also works in older - // browsers that don't support the native Blob constructor. (i.e. - // old QtWebKit versions, at least). - // Abstracts constructing a Blob object, so it also works in older - // browsers that don't support the native Blob constructor. (i.e. - // old QtWebKit versions, at least). - function createBlob(parts, properties) { - /* global BlobBuilder,MSBlobBuilder,MozBlobBuilder,WebKitBlobBuilder */ - parts = parts || []; - properties = properties || {}; - try { - return new Blob(parts, properties); - } catch (e) { - if (e.name !== 'TypeError') { - throw e; - } - var Builder = typeof BlobBuilder !== 'undefined' ? BlobBuilder : typeof MSBlobBuilder !== 'undefined' ? MSBlobBuilder : typeof MozBlobBuilder !== 'undefined' ? MozBlobBuilder : WebKitBlobBuilder; - var builder = new Builder(); - for (var i = 0; i < parts.length; i += 1) { - builder.append(parts[i]); - } - return builder.getBlob(properties.type); - } - } - - // This is CommonJS because lie is an external dependency, so Rollup - // can just ignore it. - if (typeof Promise === 'undefined') { - // In the "nopromises" build this will just throw if you don't have - // a global promise object, but it would throw anyway later. - _dereq_(3); - } - var Promise$1 = Promise; - - function executeCallback(promise, callback) { - if (callback) { - promise.then(function (result) { - callback(null, result); - }, function (error) { - callback(error); - }); - } - } - - function executeTwoCallbacks(promise, callback, errorCallback) { - if (typeof callback === 'function') { - promise.then(callback); - } - - if (typeof errorCallback === 'function') { - promise["catch"](errorCallback); - } - } - - function normalizeKey(key) { - // Cast the key to a string, as that's all we can set as a key. - if (typeof key !== 'string') { - console.warn(key + ' used as a key, but it is not a string.'); - key = String(key); - } - - return key; - } - - function getCallback() { - if (arguments.length && typeof arguments[arguments.length - 1] === 'function') { - return arguments[arguments.length - 1]; - } - } - - // Some code originally from async_storage.js in - // [Gaia](https://github.com/mozilla-b2g/gaia). - - var DETECT_BLOB_SUPPORT_STORE = 'local-forage-detect-blob-support'; - var supportsBlobs = void 0; - var dbContexts = {}; - var toString = Object.prototype.toString; - - // Transaction Modes - var READ_ONLY = 'readonly'; - var READ_WRITE = 'readwrite'; - - // Transform a binary string to an array buffer, because otherwise - // weird stuff happens when you try to work with the binary string directly. - // It is known. - // From http://stackoverflow.com/questions/14967647/ (continues on next line) - // encode-decode-image-with-base64-breaks-image (2013-04-21) - function _binStringToArrayBuffer(bin) { - var length = bin.length; - var buf = new ArrayBuffer(length); - var arr = new Uint8Array(buf); - for (var i = 0; i < length; i++) { - arr[i] = bin.charCodeAt(i); - } - return buf; - } - - // - // Blobs are not supported in all versions of IndexedDB, notably - // Chrome <37 and Android <5. In those versions, storing a blob will throw. - // - // Various other blob bugs exist in Chrome v37-42 (inclusive). - // Detecting them is expensive and confusing to users, and Chrome 37-42 - // is at very low usage worldwide, so we do a hacky userAgent check instead. - // - // content-type bug: https://code.google.com/p/chromium/issues/detail?id=408120 - // 404 bug: https://code.google.com/p/chromium/issues/detail?id=447916 - // FileReader bug: https://code.google.com/p/chromium/issues/detail?id=447836 - // - // Code borrowed from PouchDB. See: - // https://github.com/pouchdb/pouchdb/blob/master/packages/node_modules/pouchdb-adapter-idb/src/blobSupport.js - // - function _checkBlobSupportWithoutCaching(idb) { - return new Promise$1(function (resolve) { - var txn = idb.transaction(DETECT_BLOB_SUPPORT_STORE, READ_WRITE); - var blob = createBlob(['']); - txn.objectStore(DETECT_BLOB_SUPPORT_STORE).put(blob, 'key'); - - txn.onabort = function (e) { - // If the transaction aborts now its due to not being able to - // write to the database, likely due to the disk being full - e.preventDefault(); - e.stopPropagation(); - resolve(false); - }; - - txn.oncomplete = function () { - var matchedChrome = navigator.userAgent.match(/Chrome\/(\d+)/); - var matchedEdge = navigator.userAgent.match(/Edge\//); - // MS Edge pretends to be Chrome 42: - // https://msdn.microsoft.com/en-us/library/hh869301%28v=vs.85%29.aspx - resolve(matchedEdge || !matchedChrome || parseInt(matchedChrome[1], 10) >= 43); - }; - })["catch"](function () { - return false; // error, so assume unsupported - }); - } - - function _checkBlobSupport(idb) { - if (typeof supportsBlobs === 'boolean') { - return Promise$1.resolve(supportsBlobs); - } - return _checkBlobSupportWithoutCaching(idb).then(function (value) { - supportsBlobs = value; - return supportsBlobs; - }); - } - - function _deferReadiness(dbInfo) { - var dbContext = dbContexts[dbInfo.name]; - - // Create a deferred object representing the current database operation. - var deferredOperation = {}; - - deferredOperation.promise = new Promise$1(function (resolve, reject) { - deferredOperation.resolve = resolve; - deferredOperation.reject = reject; - }); - - // Enqueue the deferred operation. - dbContext.deferredOperations.push(deferredOperation); - - // Chain its promise to the database readiness. - if (!dbContext.dbReady) { - dbContext.dbReady = deferredOperation.promise; - } else { - dbContext.dbReady = dbContext.dbReady.then(function () { - return deferredOperation.promise; - }); - } - } - - function _advanceReadiness(dbInfo) { - var dbContext = dbContexts[dbInfo.name]; - - // Dequeue a deferred operation. - var deferredOperation = dbContext.deferredOperations.pop(); - - // Resolve its promise (which is part of the database readiness - // chain of promises). - if (deferredOperation) { - deferredOperation.resolve(); - return deferredOperation.promise; - } - } - - function _rejectReadiness(dbInfo, err) { - var dbContext = dbContexts[dbInfo.name]; - - // Dequeue a deferred operation. - var deferredOperation = dbContext.deferredOperations.pop(); - - // Reject its promise (which is part of the database readiness - // chain of promises). - if (deferredOperation) { - deferredOperation.reject(err); - return deferredOperation.promise; - } - } - - function _getConnection(dbInfo, upgradeNeeded) { - return new Promise$1(function (resolve, reject) { - dbContexts[dbInfo.name] = dbContexts[dbInfo.name] || createDbContext(); - - if (dbInfo.db) { - if (upgradeNeeded) { - _deferReadiness(dbInfo); - dbInfo.db.close(); - } else { - return resolve(dbInfo.db); - } - } - - var dbArgs = [dbInfo.name]; - - if (upgradeNeeded) { - dbArgs.push(dbInfo.version); - } - - var openreq = idb.open.apply(idb, dbArgs); - - if (upgradeNeeded) { - openreq.onupgradeneeded = function (e) { - var db = openreq.result; - try { - db.createObjectStore(dbInfo.storeName); - if (e.oldVersion <= 1) { - // Added when support for blob shims was added - db.createObjectStore(DETECT_BLOB_SUPPORT_STORE); - } - } catch (ex) { - if (ex.name === 'ConstraintError') { - console.warn('The database "' + dbInfo.name + '"' + ' has been upgraded from version ' + e.oldVersion + ' to version ' + e.newVersion + ', but the storage "' + dbInfo.storeName + '" already exists.'); - } else { - throw ex; - } - } - }; - } - - openreq.onerror = function (e) { - e.preventDefault(); - reject(openreq.error); - }; - - openreq.onsuccess = function () { - var db = openreq.result; - db.onversionchange = function (e) { - // Triggered when the database is modified (e.g. adding an objectStore) or - // deleted (even when initiated by other sessions in different tabs). - // Closing the connection here prevents those operations from being blocked. - // If the database is accessed again later by this instance, the connection - // will be reopened or the database recreated as needed. - e.target.close(); - }; - resolve(db); - _advanceReadiness(dbInfo); - }; - }); - } - - function _getOriginalConnection(dbInfo) { - return _getConnection(dbInfo, false); - } - - function _getUpgradedConnection(dbInfo) { - return _getConnection(dbInfo, true); - } - - function _isUpgradeNeeded(dbInfo, defaultVersion) { - if (!dbInfo.db) { - return true; - } - - var isNewStore = !dbInfo.db.objectStoreNames.contains(dbInfo.storeName); - var isDowngrade = dbInfo.version < dbInfo.db.version; - var isUpgrade = dbInfo.version > dbInfo.db.version; - - if (isDowngrade) { - // If the version is not the default one - // then warn for impossible downgrade. - if (dbInfo.version !== defaultVersion) { - console.warn('The database "' + dbInfo.name + '"' + " can't be downgraded from version " + dbInfo.db.version + ' to version ' + dbInfo.version + '.'); - } - // Align the versions to prevent errors. - dbInfo.version = dbInfo.db.version; - } - - if (isUpgrade || isNewStore) { - // If the store is new then increment the version (if needed). - // This will trigger an "upgradeneeded" event which is required - // for creating a store. - if (isNewStore) { - var incVersion = dbInfo.db.version + 1; - if (incVersion > dbInfo.version) { - dbInfo.version = incVersion; - } - } - - return true; - } - - return false; - } - - // encode a blob for indexeddb engines that don't support blobs - function _encodeBlob(blob) { - return new Promise$1(function (resolve, reject) { - var reader = new FileReader(); - reader.onerror = reject; - reader.onloadend = function (e) { - var base64 = btoa(e.target.result || ''); - resolve({ - __local_forage_encoded_blob: true, - data: base64, - type: blob.type - }); - }; - reader.readAsBinaryString(blob); - }); - } - - // decode an encoded blob - function _decodeBlob(encodedBlob) { - var arrayBuff = _binStringToArrayBuffer(atob(encodedBlob.data)); - return createBlob([arrayBuff], { type: encodedBlob.type }); - } - - // is this one of our fancy encoded blobs? - function _isEncodedBlob(value) { - return value && value.__local_forage_encoded_blob; - } - - // Specialize the default `ready()` function by making it dependent - // on the current database operations. Thus, the driver will be actually - // ready when it's been initialized (default) *and* there are no pending - // operations on the database (initiated by some other instances). - function _fullyReady(callback) { - var self = this; - - var promise = self._initReady().then(function () { - var dbContext = dbContexts[self._dbInfo.name]; - - if (dbContext && dbContext.dbReady) { - return dbContext.dbReady; - } - }); - - executeTwoCallbacks(promise, callback, callback); - return promise; - } - - // Try to establish a new db connection to replace the - // current one which is broken (i.e. experiencing - // InvalidStateError while creating a transaction). - function _tryReconnect(dbInfo) { - _deferReadiness(dbInfo); - - var dbContext = dbContexts[dbInfo.name]; - var forages = dbContext.forages; - - for (var i = 0; i < forages.length; i++) { - var forage = forages[i]; - if (forage._dbInfo.db) { - forage._dbInfo.db.close(); - forage._dbInfo.db = null; - } - } - dbInfo.db = null; - - return _getOriginalConnection(dbInfo).then(function (db) { - dbInfo.db = db; - if (_isUpgradeNeeded(dbInfo)) { - // Reopen the database for upgrading. - return _getUpgradedConnection(dbInfo); - } - return db; - }).then(function (db) { - // store the latest db reference - // in case the db was upgraded - dbInfo.db = dbContext.db = db; - for (var i = 0; i < forages.length; i++) { - forages[i]._dbInfo.db = db; - } - })["catch"](function (err) { - _rejectReadiness(dbInfo, err); - throw err; - }); - } - - // FF doesn't like Promises (micro-tasks) and IDDB store operations, - // so we have to do it with callbacks - function createTransaction(dbInfo, mode, callback, retries) { - if (retries === undefined) { - retries = 1; - } - - try { - var tx = dbInfo.db.transaction(dbInfo.storeName, mode); - callback(null, tx); - } catch (err) { - if (retries > 0 && (!dbInfo.db || err.name === 'InvalidStateError' || err.name === 'NotFoundError')) { - return Promise$1.resolve().then(function () { - if (!dbInfo.db || err.name === 'NotFoundError' && !dbInfo.db.objectStoreNames.contains(dbInfo.storeName) && dbInfo.version <= dbInfo.db.version) { - // increase the db version, to create the new ObjectStore - if (dbInfo.db) { - dbInfo.version = dbInfo.db.version + 1; - } - // Reopen the database for upgrading. - return _getUpgradedConnection(dbInfo); - } - }).then(function () { - return _tryReconnect(dbInfo).then(function () { - createTransaction(dbInfo, mode, callback, retries - 1); - }); - })["catch"](callback); - } - - callback(err); - } - } - - function createDbContext() { - return { - // Running localForages sharing a database. - forages: [], - // Shared database. - db: null, - // Database readiness (promise). - dbReady: null, - // Deferred operations on the database. - deferredOperations: [] - }; - } - - // Open the IndexedDB database (automatically creates one if one didn't - // previously exist), using any options set in the config. - function _initStorage(options) { - var self = this; - var dbInfo = { - db: null - }; - - if (options) { - for (var i in options) { - dbInfo[i] = options[i]; - } - } - - // Get the current context of the database; - var dbContext = dbContexts[dbInfo.name]; - - // ...or create a new context. - if (!dbContext) { - dbContext = createDbContext(); - // Register the new context in the global container. - dbContexts[dbInfo.name] = dbContext; - } - - // Register itself as a running localForage in the current context. - dbContext.forages.push(self); - - // Replace the default `ready()` function with the specialized one. - if (!self._initReady) { - self._initReady = self.ready; - self.ready = _fullyReady; - } - - // Create an array of initialization states of the related localForages. - var initPromises = []; - - function ignoreErrors() { - // Don't handle errors here, - // just makes sure related localForages aren't pending. - return Promise$1.resolve(); - } - - for (var j = 0; j < dbContext.forages.length; j++) { - var forage = dbContext.forages[j]; - if (forage !== self) { - // Don't wait for itself... - initPromises.push(forage._initReady()["catch"](ignoreErrors)); - } - } - - // Take a snapshot of the related localForages. - var forages = dbContext.forages.slice(0); - - // Initialize the connection process only when - // all the related localForages aren't pending. - return Promise$1.all(initPromises).then(function () { - dbInfo.db = dbContext.db; - // Get the connection or open a new one without upgrade. - return _getOriginalConnection(dbInfo); - }).then(function (db) { - dbInfo.db = db; - if (_isUpgradeNeeded(dbInfo, self._defaultConfig.version)) { - // Reopen the database for upgrading. - return _getUpgradedConnection(dbInfo); - } - return db; - }).then(function (db) { - dbInfo.db = dbContext.db = db; - self._dbInfo = dbInfo; - // Share the final connection amongst related localForages. - for (var k = 0; k < forages.length; k++) { - var forage = forages[k]; - if (forage !== self) { - // Self is already up-to-date. - forage._dbInfo.db = dbInfo.db; - forage._dbInfo.version = dbInfo.version; - } - } - }); - } - - function getItem(key, callback) { - var self = this; - - key = normalizeKey(key); - - var promise = new Promise$1(function (resolve, reject) { - self.ready().then(function () { - createTransaction(self._dbInfo, READ_ONLY, function (err, transaction) { - if (err) { - return reject(err); - } - - try { - var store = transaction.objectStore(self._dbInfo.storeName); - var req = store.get(key); - - req.onsuccess = function () { - var value = req.result; - if (value === undefined) { - value = null; - } - if (_isEncodedBlob(value)) { - value = _decodeBlob(value); - } - resolve(value); - }; - - req.onerror = function () { - reject(req.error); - }; - } catch (e) { - reject(e); - } - }); - })["catch"](reject); - }); - - executeCallback(promise, callback); - return promise; - } - - // Iterate over all items stored in database. - function iterate(iterator, callback) { - var self = this; - - var promise = new Promise$1(function (resolve, reject) { - self.ready().then(function () { - createTransaction(self._dbInfo, READ_ONLY, function (err, transaction) { - if (err) { - return reject(err); - } - - try { - var store = transaction.objectStore(self._dbInfo.storeName); - var req = store.openCursor(); - var iterationNumber = 1; - - req.onsuccess = function () { - var cursor = req.result; - - if (cursor) { - var value = cursor.value; - if (_isEncodedBlob(value)) { - value = _decodeBlob(value); - } - var result = iterator(value, cursor.key, iterationNumber++); - - // when the iterator callback returns any - // (non-`undefined`) value, then we stop - // the iteration immediately - if (result !== void 0) { - resolve(result); - } else { - cursor["continue"](); - } - } else { - resolve(); - } - }; - - req.onerror = function () { - reject(req.error); - }; - } catch (e) { - reject(e); - } - }); - })["catch"](reject); - }); - - executeCallback(promise, callback); - - return promise; - } - - function setItem(key, value, callback) { - var self = this; - - key = normalizeKey(key); - - var promise = new Promise$1(function (resolve, reject) { - var dbInfo; - self.ready().then(function () { - dbInfo = self._dbInfo; - if (toString.call(value) === '[object Blob]') { - return _checkBlobSupport(dbInfo.db).then(function (blobSupport) { - if (blobSupport) { - return value; - } - return _encodeBlob(value); - }); - } - return value; - }).then(function (value) { - createTransaction(self._dbInfo, READ_WRITE, function (err, transaction) { - if (err) { - return reject(err); - } - - try { - var store = transaction.objectStore(self._dbInfo.storeName); - - // The reason we don't _save_ null is because IE 10 does - // not support saving the `null` type in IndexedDB. How - // ironic, given the bug below! - // See: https://github.com/mozilla/localForage/issues/161 - if (value === null) { - value = undefined; - } - - var req = store.put(value, key); - - transaction.oncomplete = function () { - // Cast to undefined so the value passed to - // callback/promise is the same as what one would get out - // of `getItem()` later. This leads to some weirdness - // (setItem('foo', undefined) will return `null`), but - // it's not my fault localStorage is our baseline and that - // it's weird. - if (value === undefined) { - value = null; - } - - resolve(value); - }; - transaction.onabort = transaction.onerror = function () { - var err = req.error ? req.error : req.transaction.error; - reject(err); - }; - } catch (e) { - reject(e); - } - }); - })["catch"](reject); - }); - - executeCallback(promise, callback); - return promise; - } - - function removeItem(key, callback) { - var self = this; - - key = normalizeKey(key); - - var promise = new Promise$1(function (resolve, reject) { - self.ready().then(function () { - createTransaction(self._dbInfo, READ_WRITE, function (err, transaction) { - if (err) { - return reject(err); - } - - try { - var store = transaction.objectStore(self._dbInfo.storeName); - // We use a Grunt task to make this safe for IE and some - // versions of Android (including those used by Cordova). - // Normally IE won't like `.delete()` and will insist on - // using `['delete']()`, but we have a build step that - // fixes this for us now. - var req = store["delete"](key); - transaction.oncomplete = function () { - resolve(); - }; - - transaction.onerror = function () { - reject(req.error); - }; - - // The request will be also be aborted if we've exceeded our storage - // space. - transaction.onabort = function () { - var err = req.error ? req.error : req.transaction.error; - reject(err); - }; - } catch (e) { - reject(e); - } - }); - })["catch"](reject); - }); - - executeCallback(promise, callback); - return promise; - } - - function clear(callback) { - var self = this; - - var promise = new Promise$1(function (resolve, reject) { - self.ready().then(function () { - createTransaction(self._dbInfo, READ_WRITE, function (err, transaction) { - if (err) { - return reject(err); - } - - try { - var store = transaction.objectStore(self._dbInfo.storeName); - var req = store.clear(); - - transaction.oncomplete = function () { - resolve(); - }; - - transaction.onabort = transaction.onerror = function () { - var err = req.error ? req.error : req.transaction.error; - reject(err); - }; - } catch (e) { - reject(e); - } - }); - })["catch"](reject); - }); - - executeCallback(promise, callback); - return promise; - } - - function length(callback) { - var self = this; - - var promise = new Promise$1(function (resolve, reject) { - self.ready().then(function () { - createTransaction(self._dbInfo, READ_ONLY, function (err, transaction) { - if (err) { - return reject(err); - } - - try { - var store = transaction.objectStore(self._dbInfo.storeName); - var req = store.count(); - - req.onsuccess = function () { - resolve(req.result); - }; - - req.onerror = function () { - reject(req.error); - }; - } catch (e) { - reject(e); - } - }); - })["catch"](reject); - }); - - executeCallback(promise, callback); - return promise; - } - - function key(n, callback) { - var self = this; - - var promise = new Promise$1(function (resolve, reject) { - if (n < 0) { - resolve(null); - - return; - } - - self.ready().then(function () { - createTransaction(self._dbInfo, READ_ONLY, function (err, transaction) { - if (err) { - return reject(err); - } - - try { - var store = transaction.objectStore(self._dbInfo.storeName); - var advanced = false; - var req = store.openKeyCursor(); - - req.onsuccess = function () { - var cursor = req.result; - if (!cursor) { - // this means there weren't enough keys - resolve(null); - - return; - } - - if (n === 0) { - // We have the first key, return it if that's what they - // wanted. - resolve(cursor.key); - } else { - if (!advanced) { - // Otherwise, ask the cursor to skip ahead n - // records. - advanced = true; - cursor.advance(n); - } else { - // When we get here, we've got the nth key. - resolve(cursor.key); - } - } - }; - - req.onerror = function () { - reject(req.error); - }; - } catch (e) { - reject(e); - } - }); - })["catch"](reject); - }); - - executeCallback(promise, callback); - return promise; - } - - function keys(callback) { - var self = this; - - var promise = new Promise$1(function (resolve, reject) { - self.ready().then(function () { - createTransaction(self._dbInfo, READ_ONLY, function (err, transaction) { - if (err) { - return reject(err); - } - - try { - var store = transaction.objectStore(self._dbInfo.storeName); - var req = store.openKeyCursor(); - var keys = []; - - req.onsuccess = function () { - var cursor = req.result; - - if (!cursor) { - resolve(keys); - return; - } - - keys.push(cursor.key); - cursor["continue"](); - }; - - req.onerror = function () { - reject(req.error); - }; - } catch (e) { - reject(e); - } - }); - })["catch"](reject); - }); - - executeCallback(promise, callback); - return promise; - } - - function dropInstance(options, callback) { - callback = getCallback.apply(this, arguments); - - var currentConfig = this.config(); - options = typeof options !== 'function' && options || {}; - if (!options.name) { - options.name = options.name || currentConfig.name; - options.storeName = options.storeName || currentConfig.storeName; - } - - var self = this; - var promise; - if (!options.name) { - promise = Promise$1.reject('Invalid arguments'); - } else { - var isCurrentDb = options.name === currentConfig.name && self._dbInfo.db; - - var dbPromise = isCurrentDb ? Promise$1.resolve(self._dbInfo.db) : _getOriginalConnection(options).then(function (db) { - var dbContext = dbContexts[options.name]; - var forages = dbContext.forages; - dbContext.db = db; - for (var i = 0; i < forages.length; i++) { - forages[i]._dbInfo.db = db; - } - return db; - }); - - if (!options.storeName) { - promise = dbPromise.then(function (db) { - _deferReadiness(options); - - var dbContext = dbContexts[options.name]; - var forages = dbContext.forages; - - db.close(); - for (var i = 0; i < forages.length; i++) { - var forage = forages[i]; - forage._dbInfo.db = null; - } - - var dropDBPromise = new Promise$1(function (resolve, reject) { - var req = idb.deleteDatabase(options.name); - - req.onerror = function () { - var db = req.result; - if (db) { - db.close(); - } - reject(req.error); - }; - - req.onblocked = function () { - // Closing all open connections in onversionchange handler should prevent this situation, but if - // we do get here, it just means the request remains pending - eventually it will succeed or error - console.warn('dropInstance blocked for database "' + options.name + '" until all open connections are closed'); - }; - - req.onsuccess = function () { - var db = req.result; - if (db) { - db.close(); - } - resolve(db); - }; - }); - - return dropDBPromise.then(function (db) { - dbContext.db = db; - for (var i = 0; i < forages.length; i++) { - var _forage = forages[i]; - _advanceReadiness(_forage._dbInfo); - } - })["catch"](function (err) { - (_rejectReadiness(options, err) || Promise$1.resolve())["catch"](function () {}); - throw err; - }); - }); - } else { - promise = dbPromise.then(function (db) { - if (!db.objectStoreNames.contains(options.storeName)) { - return; - } - - var newVersion = db.version + 1; - - _deferReadiness(options); - - var dbContext = dbContexts[options.name]; - var forages = dbContext.forages; - - db.close(); - for (var i = 0; i < forages.length; i++) { - var forage = forages[i]; - forage._dbInfo.db = null; - forage._dbInfo.version = newVersion; - } - - var dropObjectPromise = new Promise$1(function (resolve, reject) { - var req = idb.open(options.name, newVersion); - - req.onerror = function (err) { - var db = req.result; - db.close(); - reject(err); - }; - - req.onupgradeneeded = function () { - var db = req.result; - db.deleteObjectStore(options.storeName); - }; - - req.onsuccess = function () { - var db = req.result; - db.close(); - resolve(db); - }; - }); - - return dropObjectPromise.then(function (db) { - dbContext.db = db; - for (var j = 0; j < forages.length; j++) { - var _forage2 = forages[j]; - _forage2._dbInfo.db = db; - _advanceReadiness(_forage2._dbInfo); - } - })["catch"](function (err) { - (_rejectReadiness(options, err) || Promise$1.resolve())["catch"](function () {}); - throw err; - }); - }); - } - } - - executeCallback(promise, callback); - return promise; - } - - var asyncStorage = { - _driver: 'asyncStorage', - _initStorage: _initStorage, - _support: isIndexedDBValid(), - iterate: iterate, - getItem: getItem, - setItem: setItem, - removeItem: removeItem, - clear: clear, - length: length, - key: key, - keys: keys, - dropInstance: dropInstance - }; - - function isWebSQLValid() { - return typeof openDatabase === 'function'; - } - - // Sadly, the best way to save binary data in WebSQL/localStorage is serializing - // it to Base64, so this is how we store it to prevent very strange errors with less - // verbose ways of binary <-> string data storage. - var BASE_CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; - - var BLOB_TYPE_PREFIX = '~~local_forage_type~'; - var BLOB_TYPE_PREFIX_REGEX = /^~~local_forage_type~([^~]+)~/; - - var SERIALIZED_MARKER = '__lfsc__:'; - var SERIALIZED_MARKER_LENGTH = SERIALIZED_MARKER.length; - - // OMG the serializations! - var TYPE_ARRAYBUFFER = 'arbf'; - var TYPE_BLOB = 'blob'; - var TYPE_INT8ARRAY = 'si08'; - var TYPE_UINT8ARRAY = 'ui08'; - var TYPE_UINT8CLAMPEDARRAY = 'uic8'; - var TYPE_INT16ARRAY = 'si16'; - var TYPE_INT32ARRAY = 'si32'; - var TYPE_UINT16ARRAY = 'ur16'; - var TYPE_UINT32ARRAY = 'ui32'; - var TYPE_FLOAT32ARRAY = 'fl32'; - var TYPE_FLOAT64ARRAY = 'fl64'; - var TYPE_SERIALIZED_MARKER_LENGTH = SERIALIZED_MARKER_LENGTH + TYPE_ARRAYBUFFER.length; - - var toString$1 = Object.prototype.toString; - - function stringToBuffer(serializedString) { - // Fill the string into a ArrayBuffer. - var bufferLength = serializedString.length * 0.75; - var len = serializedString.length; - var i; - var p = 0; - var encoded1, encoded2, encoded3, encoded4; - - if (serializedString[serializedString.length - 1] === '=') { - bufferLength--; - if (serializedString[serializedString.length - 2] === '=') { - bufferLength--; - } - } - - var buffer = new ArrayBuffer(bufferLength); - var bytes = new Uint8Array(buffer); - - for (i = 0; i < len; i += 4) { - encoded1 = BASE_CHARS.indexOf(serializedString[i]); - encoded2 = BASE_CHARS.indexOf(serializedString[i + 1]); - encoded3 = BASE_CHARS.indexOf(serializedString[i + 2]); - encoded4 = BASE_CHARS.indexOf(serializedString[i + 3]); - - /*jslint bitwise: true */ - bytes[p++] = encoded1 << 2 | encoded2 >> 4; - bytes[p++] = (encoded2 & 15) << 4 | encoded3 >> 2; - bytes[p++] = (encoded3 & 3) << 6 | encoded4 & 63; - } - return buffer; - } - - // Converts a buffer to a string to store, serialized, in the backend - // storage library. - function bufferToString(buffer) { - // base64-arraybuffer - var bytes = new Uint8Array(buffer); - var base64String = ''; - var i; - - for (i = 0; i < bytes.length; i += 3) { - /*jslint bitwise: true */ - base64String += BASE_CHARS[bytes[i] >> 2]; - base64String += BASE_CHARS[(bytes[i] & 3) << 4 | bytes[i + 1] >> 4]; - base64String += BASE_CHARS[(bytes[i + 1] & 15) << 2 | bytes[i + 2] >> 6]; - base64String += BASE_CHARS[bytes[i + 2] & 63]; - } - - if (bytes.length % 3 === 2) { - base64String = base64String.substring(0, base64String.length - 1) + '='; - } else if (bytes.length % 3 === 1) { - base64String = base64String.substring(0, base64String.length - 2) + '=='; - } - - return base64String; - } - - // Serialize a value, afterwards executing a callback (which usually - // instructs the `setItem()` callback/promise to be executed). This is how - // we store binary data with localStorage. - function serialize(value, callback) { - var valueType = ''; - if (value) { - valueType = toString$1.call(value); - } - - // Cannot use `value instanceof ArrayBuffer` or such here, as these - // checks fail when running the tests using casper.js... - // - // TODO: See why those tests fail and use a better solution. - if (value && (valueType === '[object ArrayBuffer]' || value.buffer && toString$1.call(value.buffer) === '[object ArrayBuffer]')) { - // Convert binary arrays to a string and prefix the string with - // a special marker. - var buffer; - var marker = SERIALIZED_MARKER; - - if (value instanceof ArrayBuffer) { - buffer = value; - marker += TYPE_ARRAYBUFFER; - } else { - buffer = value.buffer; - - if (valueType === '[object Int8Array]') { - marker += TYPE_INT8ARRAY; - } else if (valueType === '[object Uint8Array]') { - marker += TYPE_UINT8ARRAY; - } else if (valueType === '[object Uint8ClampedArray]') { - marker += TYPE_UINT8CLAMPEDARRAY; - } else if (valueType === '[object Int16Array]') { - marker += TYPE_INT16ARRAY; - } else if (valueType === '[object Uint16Array]') { - marker += TYPE_UINT16ARRAY; - } else if (valueType === '[object Int32Array]') { - marker += TYPE_INT32ARRAY; - } else if (valueType === '[object Uint32Array]') { - marker += TYPE_UINT32ARRAY; - } else if (valueType === '[object Float32Array]') { - marker += TYPE_FLOAT32ARRAY; - } else if (valueType === '[object Float64Array]') { - marker += TYPE_FLOAT64ARRAY; - } else { - callback(new Error('Failed to get type for BinaryArray')); - } - } - - callback(marker + bufferToString(buffer)); - } else if (valueType === '[object Blob]') { - // Conver the blob to a binaryArray and then to a string. - var fileReader = new FileReader(); - - fileReader.onload = function () { - // Backwards-compatible prefix for the blob type. - var str = BLOB_TYPE_PREFIX + value.type + '~' + bufferToString(this.result); - - callback(SERIALIZED_MARKER + TYPE_BLOB + str); - }; - - fileReader.readAsArrayBuffer(value); - } else { - try { - callback(JSON.stringify(value)); - } catch (e) { - console.error("Couldn't convert value into a JSON string: ", value); - - callback(null, e); - } - } - } - - // Deserialize data we've inserted into a value column/field. We place - // special markers into our strings to mark them as encoded; this isn't - // as nice as a meta field, but it's the only sane thing we can do whilst - // keeping localStorage support intact. - // - // Oftentimes this will just deserialize JSON content, but if we have a - // special marker (SERIALIZED_MARKER, defined above), we will extract - // some kind of arraybuffer/binary data/typed array out of the string. - function deserialize(value) { - // If we haven't marked this string as being specially serialized (i.e. - // something other than serialized JSON), we can just return it and be - // done with it. - if (value.substring(0, SERIALIZED_MARKER_LENGTH) !== SERIALIZED_MARKER) { - return JSON.parse(value); - } - - // The following code deals with deserializing some kind of Blob or - // TypedArray. First we separate out the type of data we're dealing - // with from the data itself. - var serializedString = value.substring(TYPE_SERIALIZED_MARKER_LENGTH); - var type = value.substring(SERIALIZED_MARKER_LENGTH, TYPE_SERIALIZED_MARKER_LENGTH); - - var blobType; - // Backwards-compatible blob type serialization strategy. - // DBs created with older versions of localForage will simply not have the blob type. - if (type === TYPE_BLOB && BLOB_TYPE_PREFIX_REGEX.test(serializedString)) { - var matcher = serializedString.match(BLOB_TYPE_PREFIX_REGEX); - blobType = matcher[1]; - serializedString = serializedString.substring(matcher[0].length); - } - var buffer = stringToBuffer(serializedString); - - // Return the right type based on the code/type set during - // serialization. - switch (type) { - case TYPE_ARRAYBUFFER: - return buffer; - case TYPE_BLOB: - return createBlob([buffer], { type: blobType }); - case TYPE_INT8ARRAY: - return new Int8Array(buffer); - case TYPE_UINT8ARRAY: - return new Uint8Array(buffer); - case TYPE_UINT8CLAMPEDARRAY: - return new Uint8ClampedArray(buffer); - case TYPE_INT16ARRAY: - return new Int16Array(buffer); - case TYPE_UINT16ARRAY: - return new Uint16Array(buffer); - case TYPE_INT32ARRAY: - return new Int32Array(buffer); - case TYPE_UINT32ARRAY: - return new Uint32Array(buffer); - case TYPE_FLOAT32ARRAY: - return new Float32Array(buffer); - case TYPE_FLOAT64ARRAY: - return new Float64Array(buffer); - default: - throw new Error('Unkown type: ' + type); - } - } - - var localforageSerializer = { - serialize: serialize, - deserialize: deserialize, - stringToBuffer: stringToBuffer, - bufferToString: bufferToString - }; - - /* - * Includes code from: - * - * base64-arraybuffer - * https://github.com/niklasvh/base64-arraybuffer - * - * Copyright (c) 2012 Niklas von Hertzen - * Licensed under the MIT license. - */ - - function createDbTable(t, dbInfo, callback, errorCallback) { - t.executeSql('CREATE TABLE IF NOT EXISTS ' + dbInfo.storeName + ' ' + '(id INTEGER PRIMARY KEY, key unique, value)', [], callback, errorCallback); - } - - // Open the WebSQL database (automatically creates one if one didn't - // previously exist), using any options set in the config. - function _initStorage$1(options) { - var self = this; - var dbInfo = { - db: null - }; - - if (options) { - for (var i in options) { - dbInfo[i] = typeof options[i] !== 'string' ? options[i].toString() : options[i]; - } - } - - var dbInfoPromise = new Promise$1(function (resolve, reject) { - // Open the database; the openDatabase API will automatically - // create it for us if it doesn't exist. - try { - dbInfo.db = openDatabase(dbInfo.name, String(dbInfo.version), dbInfo.description, dbInfo.size); - } catch (e) { - return reject(e); - } - - // Create our key/value table if it doesn't exist. - dbInfo.db.transaction(function (t) { - createDbTable(t, dbInfo, function () { - self._dbInfo = dbInfo; - resolve(); - }, function (t, error) { - reject(error); - }); - }, reject); - }); - - dbInfo.serializer = localforageSerializer; - return dbInfoPromise; - } - - function tryExecuteSql(t, dbInfo, sqlStatement, args, callback, errorCallback) { - t.executeSql(sqlStatement, args, callback, function (t, error) { - if (error.code === error.SYNTAX_ERR) { - t.executeSql('SELECT name FROM sqlite_master ' + "WHERE type='table' AND name = ?", [dbInfo.storeName], function (t, results) { - if (!results.rows.length) { - // if the table is missing (was deleted) - // re-create it table and retry - createDbTable(t, dbInfo, function () { - t.executeSql(sqlStatement, args, callback, errorCallback); - }, errorCallback); - } else { - errorCallback(t, error); - } - }, errorCallback); - } else { - errorCallback(t, error); - } - }, errorCallback); - } - - function getItem$1(key, callback) { - var self = this; - - key = normalizeKey(key); - - var promise = new Promise$1(function (resolve, reject) { - self.ready().then(function () { - var dbInfo = self._dbInfo; - dbInfo.db.transaction(function (t) { - tryExecuteSql(t, dbInfo, 'SELECT * FROM ' + dbInfo.storeName + ' WHERE key = ? LIMIT 1', [key], function (t, results) { - var result = results.rows.length ? results.rows.item(0).value : null; - - // Check to see if this is serialized content we need to - // unpack. - if (result) { - result = dbInfo.serializer.deserialize(result); - } - - resolve(result); - }, function (t, error) { - reject(error); - }); - }); - })["catch"](reject); - }); - - executeCallback(promise, callback); - return promise; - } - - function iterate$1(iterator, callback) { - var self = this; - - var promise = new Promise$1(function (resolve, reject) { - self.ready().then(function () { - var dbInfo = self._dbInfo; - - dbInfo.db.transaction(function (t) { - tryExecuteSql(t, dbInfo, 'SELECT * FROM ' + dbInfo.storeName, [], function (t, results) { - var rows = results.rows; - var length = rows.length; - - for (var i = 0; i < length; i++) { - var item = rows.item(i); - var result = item.value; - - // Check to see if this is serialized content - // we need to unpack. - if (result) { - result = dbInfo.serializer.deserialize(result); - } - - result = iterator(result, item.key, i + 1); - - // void(0) prevents problems with redefinition - // of `undefined`. - if (result !== void 0) { - resolve(result); - return; - } - } - - resolve(); - }, function (t, error) { - reject(error); - }); - }); - })["catch"](reject); - }); - - executeCallback(promise, callback); - return promise; - } - - function _setItem(key, value, callback, retriesLeft) { - var self = this; - - key = normalizeKey(key); - - var promise = new Promise$1(function (resolve, reject) { - self.ready().then(function () { - // The localStorage API doesn't return undefined values in an - // "expected" way, so undefined is always cast to null in all - // drivers. See: https://github.com/mozilla/localForage/pull/42 - if (value === undefined) { - value = null; - } - - // Save the original value to pass to the callback. - var originalValue = value; - - var dbInfo = self._dbInfo; - dbInfo.serializer.serialize(value, function (value, error) { - if (error) { - reject(error); - } else { - dbInfo.db.transaction(function (t) { - tryExecuteSql(t, dbInfo, 'INSERT OR REPLACE INTO ' + dbInfo.storeName + ' ' + '(key, value) VALUES (?, ?)', [key, value], function () { - resolve(originalValue); - }, function (t, error) { - reject(error); - }); - }, function (sqlError) { - // The transaction failed; check - // to see if it's a quota error. - if (sqlError.code === sqlError.QUOTA_ERR) { - // We reject the callback outright for now, but - // it's worth trying to re-run the transaction. - // Even if the user accepts the prompt to use - // more storage on Safari, this error will - // be called. - // - // Try to re-run the transaction. - if (retriesLeft > 0) { - resolve(_setItem.apply(self, [key, originalValue, callback, retriesLeft - 1])); - return; - } - reject(sqlError); - } - }); - } - }); - })["catch"](reject); - }); - - executeCallback(promise, callback); - return promise; - } - - function setItem$1(key, value, callback) { - return _setItem.apply(this, [key, value, callback, 1]); - } - - function removeItem$1(key, callback) { - var self = this; - - key = normalizeKey(key); - - var promise = new Promise$1(function (resolve, reject) { - self.ready().then(function () { - var dbInfo = self._dbInfo; - dbInfo.db.transaction(function (t) { - tryExecuteSql(t, dbInfo, 'DELETE FROM ' + dbInfo.storeName + ' WHERE key = ?', [key], function () { - resolve(); - }, function (t, error) { - reject(error); - }); - }); - })["catch"](reject); - }); - - executeCallback(promise, callback); - return promise; - } - - // Deletes every item in the table. - // TODO: Find out if this resets the AUTO_INCREMENT number. - function clear$1(callback) { - var self = this; - - var promise = new Promise$1(function (resolve, reject) { - self.ready().then(function () { - var dbInfo = self._dbInfo; - dbInfo.db.transaction(function (t) { - tryExecuteSql(t, dbInfo, 'DELETE FROM ' + dbInfo.storeName, [], function () { - resolve(); - }, function (t, error) { - reject(error); - }); - }); - })["catch"](reject); - }); - - executeCallback(promise, callback); - return promise; - } - - // Does a simple `COUNT(key)` to get the number of items stored in - // localForage. - function length$1(callback) { - var self = this; - - var promise = new Promise$1(function (resolve, reject) { - self.ready().then(function () { - var dbInfo = self._dbInfo; - dbInfo.db.transaction(function (t) { - // Ahhh, SQL makes this one soooooo easy. - tryExecuteSql(t, dbInfo, 'SELECT COUNT(key) as c FROM ' + dbInfo.storeName, [], function (t, results) { - var result = results.rows.item(0).c; - resolve(result); - }, function (t, error) { - reject(error); - }); - }); - })["catch"](reject); - }); - - executeCallback(promise, callback); - return promise; - } - - // Return the key located at key index X; essentially gets the key from a - // `WHERE id = ?`. This is the most efficient way I can think to implement - // this rarely-used (in my experience) part of the API, but it can seem - // inconsistent, because we do `INSERT OR REPLACE INTO` on `setItem()`, so - // the ID of each key will change every time it's updated. Perhaps a stored - // procedure for the `setItem()` SQL would solve this problem? - // TODO: Don't change ID on `setItem()`. - function key$1(n, callback) { - var self = this; - - var promise = new Promise$1(function (resolve, reject) { - self.ready().then(function () { - var dbInfo = self._dbInfo; - dbInfo.db.transaction(function (t) { - tryExecuteSql(t, dbInfo, 'SELECT key FROM ' + dbInfo.storeName + ' WHERE id = ? LIMIT 1', [n + 1], function (t, results) { - var result = results.rows.length ? results.rows.item(0).key : null; - resolve(result); - }, function (t, error) { - reject(error); - }); - }); - })["catch"](reject); - }); - - executeCallback(promise, callback); - return promise; - } - - function keys$1(callback) { - var self = this; - - var promise = new Promise$1(function (resolve, reject) { - self.ready().then(function () { - var dbInfo = self._dbInfo; - dbInfo.db.transaction(function (t) { - tryExecuteSql(t, dbInfo, 'SELECT key FROM ' + dbInfo.storeName, [], function (t, results) { - var keys = []; - - for (var i = 0; i < results.rows.length; i++) { - keys.push(results.rows.item(i).key); - } - - resolve(keys); - }, function (t, error) { - reject(error); - }); - }); - })["catch"](reject); - }); - - executeCallback(promise, callback); - return promise; - } - - // https://www.w3.org/TR/webdatabase/#databases - // > There is no way to enumerate or delete the databases available for an origin from this API. - function getAllStoreNames(db) { - return new Promise$1(function (resolve, reject) { - db.transaction(function (t) { - t.executeSql('SELECT name FROM sqlite_master ' + "WHERE type='table' AND name <> '__WebKitDatabaseInfoTable__'", [], function (t, results) { - var storeNames = []; - - for (var i = 0; i < results.rows.length; i++) { - storeNames.push(results.rows.item(i).name); - } - - resolve({ - db: db, - storeNames: storeNames - }); - }, function (t, error) { - reject(error); - }); - }, function (sqlError) { - reject(sqlError); - }); - }); - } - - function dropInstance$1(options, callback) { - callback = getCallback.apply(this, arguments); - - var currentConfig = this.config(); - options = typeof options !== 'function' && options || {}; - if (!options.name) { - options.name = options.name || currentConfig.name; - options.storeName = options.storeName || currentConfig.storeName; - } - - var self = this; - var promise; - if (!options.name) { - promise = Promise$1.reject('Invalid arguments'); - } else { - promise = new Promise$1(function (resolve) { - var db; - if (options.name === currentConfig.name) { - // use the db reference of the current instance - db = self._dbInfo.db; - } else { - db = openDatabase(options.name, '', '', 0); - } - - if (!options.storeName) { - // drop all database tables - resolve(getAllStoreNames(db)); - } else { - resolve({ - db: db, - storeNames: [options.storeName] - }); - } - }).then(function (operationInfo) { - return new Promise$1(function (resolve, reject) { - operationInfo.db.transaction(function (t) { - function dropTable(storeName) { - return new Promise$1(function (resolve, reject) { - t.executeSql('DROP TABLE IF EXISTS ' + storeName, [], function () { - resolve(); - }, function (t, error) { - reject(error); - }); - }); - } - - var operations = []; - for (var i = 0, len = operationInfo.storeNames.length; i < len; i++) { - operations.push(dropTable(operationInfo.storeNames[i])); - } - - Promise$1.all(operations).then(function () { - resolve(); - })["catch"](function (e) { - reject(e); - }); - }, function (sqlError) { - reject(sqlError); - }); - }); - }); - } - - executeCallback(promise, callback); - return promise; - } - - var webSQLStorage = { - _driver: 'webSQLStorage', - _initStorage: _initStorage$1, - _support: isWebSQLValid(), - iterate: iterate$1, - getItem: getItem$1, - setItem: setItem$1, - removeItem: removeItem$1, - clear: clear$1, - length: length$1, - key: key$1, - keys: keys$1, - dropInstance: dropInstance$1 - }; - - function isLocalStorageValid() { - try { - return typeof localStorage !== 'undefined' && 'setItem' in localStorage && - // in IE8 typeof localStorage.setItem === 'object' - !!localStorage.setItem; - } catch (e) { - return false; - } - } - - function _getKeyPrefix(options, defaultConfig) { - var keyPrefix = options.name + '/'; - - if (options.storeName !== defaultConfig.storeName) { - keyPrefix += options.storeName + '/'; - } - return keyPrefix; - } - - // Check if localStorage throws when saving an item - function checkIfLocalStorageThrows() { - var localStorageTestKey = '_localforage_support_test'; - - try { - localStorage.setItem(localStorageTestKey, true); - localStorage.removeItem(localStorageTestKey); - - return false; - } catch (e) { - return true; - } - } - - // Check if localStorage is usable and allows to save an item - // This method checks if localStorage is usable in Safari Private Browsing - // mode, or in any other case where the available quota for localStorage - // is 0 and there wasn't any saved items yet. - function _isLocalStorageUsable() { - return !checkIfLocalStorageThrows() || localStorage.length > 0; - } - - // Config the localStorage backend, using options set in the config. - function _initStorage$2(options) { - var self = this; - var dbInfo = {}; - if (options) { - for (var i in options) { - dbInfo[i] = options[i]; - } - } - - dbInfo.keyPrefix = _getKeyPrefix(options, self._defaultConfig); - - if (!_isLocalStorageUsable()) { - return Promise$1.reject(); - } - - self._dbInfo = dbInfo; - dbInfo.serializer = localforageSerializer; - - return Promise$1.resolve(); - } - - // Remove all keys from the datastore, effectively destroying all data in - // the app's key/value store! - function clear$2(callback) { - var self = this; - var promise = self.ready().then(function () { - var keyPrefix = self._dbInfo.keyPrefix; - - for (var i = localStorage.length - 1; i >= 0; i--) { - var key = localStorage.key(i); - - if (key.indexOf(keyPrefix) === 0) { - localStorage.removeItem(key); - } - } - }); - - executeCallback(promise, callback); - return promise; - } - - // Retrieve an item from the store. Unlike the original async_storage - // library in Gaia, we don't modify return values at all. If a key's value - // is `undefined`, we pass that value to the callback function. - function getItem$2(key, callback) { - var self = this; - - key = normalizeKey(key); - - var promise = self.ready().then(function () { - var dbInfo = self._dbInfo; - var result = localStorage.getItem(dbInfo.keyPrefix + key); - - // If a result was found, parse it from the serialized - // string into a JS object. If result isn't truthy, the key - // is likely undefined and we'll pass it straight to the - // callback. - if (result) { - result = dbInfo.serializer.deserialize(result); - } - - return result; - }); - - executeCallback(promise, callback); - return promise; - } - - // Iterate over all items in the store. - function iterate$2(iterator, callback) { - var self = this; - - var promise = self.ready().then(function () { - var dbInfo = self._dbInfo; - var keyPrefix = dbInfo.keyPrefix; - var keyPrefixLength = keyPrefix.length; - var length = localStorage.length; - - // We use a dedicated iterator instead of the `i` variable below - // so other keys we fetch in localStorage aren't counted in - // the `iterationNumber` argument passed to the `iterate()` - // callback. - // - // See: github.com/mozilla/localForage/pull/435#discussion_r38061530 - var iterationNumber = 1; - - for (var i = 0; i < length; i++) { - var key = localStorage.key(i); - if (key.indexOf(keyPrefix) !== 0) { - continue; - } - var value = localStorage.getItem(key); - - // If a result was found, parse it from the serialized - // string into a JS object. If result isn't truthy, the - // key is likely undefined and we'll pass it straight - // to the iterator. - if (value) { - value = dbInfo.serializer.deserialize(value); - } - - value = iterator(value, key.substring(keyPrefixLength), iterationNumber++); - - if (value !== void 0) { - return value; - } - } - }); - - executeCallback(promise, callback); - return promise; - } - - // Same as localStorage's key() method, except takes a callback. - function key$2(n, callback) { - var self = this; - var promise = self.ready().then(function () { - var dbInfo = self._dbInfo; - var result; - try { - result = localStorage.key(n); - } catch (error) { - result = null; - } - - // Remove the prefix from the key, if a key is found. - if (result) { - result = result.substring(dbInfo.keyPrefix.length); - } - - return result; - }); - - executeCallback(promise, callback); - return promise; - } - - function keys$2(callback) { - var self = this; - var promise = self.ready().then(function () { - var dbInfo = self._dbInfo; - var length = localStorage.length; - var keys = []; - - for (var i = 0; i < length; i++) { - var itemKey = localStorage.key(i); - if (itemKey.indexOf(dbInfo.keyPrefix) === 0) { - keys.push(itemKey.substring(dbInfo.keyPrefix.length)); - } - } - - return keys; - }); - - executeCallback(promise, callback); - return promise; - } - - // Supply the number of keys in the datastore to the callback function. - function length$2(callback) { - var self = this; - var promise = self.keys().then(function (keys) { - return keys.length; - }); - - executeCallback(promise, callback); - return promise; - } - - // Remove an item from the store, nice and simple. - function removeItem$2(key, callback) { - var self = this; - - key = normalizeKey(key); - - var promise = self.ready().then(function () { - var dbInfo = self._dbInfo; - localStorage.removeItem(dbInfo.keyPrefix + key); - }); - - executeCallback(promise, callback); - return promise; - } - - // Set a key's value and run an optional callback once the value is set. - // Unlike Gaia's implementation, the callback function is passed the value, - // in case you want to operate on that value only after you're sure it - // saved, or something like that. - function setItem$2(key, value, callback) { - var self = this; - - key = normalizeKey(key); - - var promise = self.ready().then(function () { - // Convert undefined values to null. - // https://github.com/mozilla/localForage/pull/42 - if (value === undefined) { - value = null; - } - - // Save the original value to pass to the callback. - var originalValue = value; - - return new Promise$1(function (resolve, reject) { - var dbInfo = self._dbInfo; - dbInfo.serializer.serialize(value, function (value, error) { - if (error) { - reject(error); - } else { - try { - localStorage.setItem(dbInfo.keyPrefix + key, value); - resolve(originalValue); - } catch (e) { - // localStorage capacity exceeded. - // TODO: Make this a specific error/event. - if (e.name === 'QuotaExceededError' || e.name === 'NS_ERROR_DOM_QUOTA_REACHED') { - reject(e); - } - reject(e); - } - } - }); - }); - }); - - executeCallback(promise, callback); - return promise; - } - - function dropInstance$2(options, callback) { - callback = getCallback.apply(this, arguments); - - options = typeof options !== 'function' && options || {}; - if (!options.name) { - var currentConfig = this.config(); - options.name = options.name || currentConfig.name; - options.storeName = options.storeName || currentConfig.storeName; - } - - var self = this; - var promise; - if (!options.name) { - promise = Promise$1.reject('Invalid arguments'); - } else { - promise = new Promise$1(function (resolve) { - if (!options.storeName) { - resolve(options.name + '/'); - } else { - resolve(_getKeyPrefix(options, self._defaultConfig)); - } - }).then(function (keyPrefix) { - for (var i = localStorage.length - 1; i >= 0; i--) { - var key = localStorage.key(i); - - if (key.indexOf(keyPrefix) === 0) { - localStorage.removeItem(key); - } - } - }); - } - - executeCallback(promise, callback); - return promise; - } - - var localStorageWrapper = { - _driver: 'localStorageWrapper', - _initStorage: _initStorage$2, - _support: isLocalStorageValid(), - iterate: iterate$2, - getItem: getItem$2, - setItem: setItem$2, - removeItem: removeItem$2, - clear: clear$2, - length: length$2, - key: key$2, - keys: keys$2, - dropInstance: dropInstance$2 - }; - - var sameValue = function sameValue(x, y) { - return x === y || typeof x === 'number' && typeof y === 'number' && isNaN(x) && isNaN(y); - }; - - var includes = function includes(array, searchElement) { - var len = array.length; - var i = 0; - while (i < len) { - if (sameValue(array[i], searchElement)) { - return true; - } - i++; - } - - return false; - }; - - var isArray = Array.isArray || function (arg) { - return Object.prototype.toString.call(arg) === '[object Array]'; - }; - - // Drivers are stored here when `defineDriver()` is called. - // They are shared across all instances of localForage. - var DefinedDrivers = {}; - - var DriverSupport = {}; - - var DefaultDrivers = { - INDEXEDDB: asyncStorage, - WEBSQL: webSQLStorage, - LOCALSTORAGE: localStorageWrapper - }; - - var DefaultDriverOrder = [DefaultDrivers.INDEXEDDB._driver, DefaultDrivers.WEBSQL._driver, DefaultDrivers.LOCALSTORAGE._driver]; - - var OptionalDriverMethods = ['dropInstance']; - - var LibraryMethods = ['clear', 'getItem', 'iterate', 'key', 'keys', 'length', 'removeItem', 'setItem'].concat(OptionalDriverMethods); - - var DefaultConfig = { - description: '', - driver: DefaultDriverOrder.slice(), - name: 'localforage', - // Default DB size is _JUST UNDER_ 5MB, as it's the highest size - // we can use without a prompt. - size: 4980736, - storeName: 'keyvaluepairs', - version: 1.0 - }; - - function callWhenReady(localForageInstance, libraryMethod) { - localForageInstance[libraryMethod] = function () { - var _args = arguments; - return localForageInstance.ready().then(function () { - return localForageInstance[libraryMethod].apply(localForageInstance, _args); - }); - }; - } - - function extend() { - for (var i = 1; i < arguments.length; i++) { - var arg = arguments[i]; - - if (arg) { - for (var _key in arg) { - if (arg.hasOwnProperty(_key)) { - if (isArray(arg[_key])) { - arguments[0][_key] = arg[_key].slice(); - } else { - arguments[0][_key] = arg[_key]; - } - } - } - } - } - - return arguments[0]; - } - - var LocalForage = function () { - function LocalForage(options) { - _classCallCheck(this, LocalForage); - - for (var driverTypeKey in DefaultDrivers) { - if (DefaultDrivers.hasOwnProperty(driverTypeKey)) { - var driver = DefaultDrivers[driverTypeKey]; - var driverName = driver._driver; - this[driverTypeKey] = driverName; - - if (!DefinedDrivers[driverName]) { - // we don't need to wait for the promise, - // since the default drivers can be defined - // in a blocking manner - this.defineDriver(driver); - } - } - } - - this._defaultConfig = extend({}, DefaultConfig); - this._config = extend({}, this._defaultConfig, options); - this._driverSet = null; - this._initDriver = null; - this._ready = false; - this._dbInfo = null; - - this._wrapLibraryMethodsWithReady(); - this.setDriver(this._config.driver)["catch"](function () {}); - } - - // Set any config values for localForage; can be called anytime before - // the first API call (e.g. `getItem`, `setItem`). - // We loop through options so we don't overwrite existing config - // values. - - - LocalForage.prototype.config = function config(options) { - // If the options argument is an object, we use it to set values. - // Otherwise, we return either a specified config value or all - // config values. - if ((typeof options === 'undefined' ? 'undefined' : _typeof(options)) === 'object') { - // If localforage is ready and fully initialized, we can't set - // any new configuration values. Instead, we return an error. - if (this._ready) { - return new Error("Can't call config() after localforage " + 'has been used.'); - } - - for (var i in options) { - if (i === 'storeName') { - options[i] = options[i].replace(/\W/g, '_'); - } - - if (i === 'version' && typeof options[i] !== 'number') { - return new Error('Database version must be a number.'); - } - - this._config[i] = options[i]; - } - - // after all config options are set and - // the driver option is used, try setting it - if ('driver' in options && options.driver) { - return this.setDriver(this._config.driver); - } - - return true; - } else if (typeof options === 'string') { - return this._config[options]; - } else { - return this._config; - } - }; - - // Used to define a custom driver, shared across all instances of - // localForage. - - - LocalForage.prototype.defineDriver = function defineDriver(driverObject, callback, errorCallback) { - var promise = new Promise$1(function (resolve, reject) { - try { - var driverName = driverObject._driver; - var complianceError = new Error('Custom driver not compliant; see ' + 'https://mozilla.github.io/localForage/#definedriver'); - - // A driver name should be defined and not overlap with the - // library-defined, default drivers. - if (!driverObject._driver) { - reject(complianceError); - return; - } - - var driverMethods = LibraryMethods.concat('_initStorage'); - for (var i = 0, len = driverMethods.length; i < len; i++) { - var driverMethodName = driverMethods[i]; - - // when the property is there, - // it should be a method even when optional - var isRequired = !includes(OptionalDriverMethods, driverMethodName); - if ((isRequired || driverObject[driverMethodName]) && typeof driverObject[driverMethodName] !== 'function') { - reject(complianceError); - return; - } - } - - var configureMissingMethods = function configureMissingMethods() { - var methodNotImplementedFactory = function methodNotImplementedFactory(methodName) { - return function () { - var error = new Error('Method ' + methodName + ' is not implemented by the current driver'); - var promise = Promise$1.reject(error); - executeCallback(promise, arguments[arguments.length - 1]); - return promise; - }; - }; - - for (var _i = 0, _len = OptionalDriverMethods.length; _i < _len; _i++) { - var optionalDriverMethod = OptionalDriverMethods[_i]; - if (!driverObject[optionalDriverMethod]) { - driverObject[optionalDriverMethod] = methodNotImplementedFactory(optionalDriverMethod); - } - } - }; - - configureMissingMethods(); - - var setDriverSupport = function setDriverSupport(support) { - if (DefinedDrivers[driverName]) { - console.info('Redefining LocalForage driver: ' + driverName); - } - DefinedDrivers[driverName] = driverObject; - DriverSupport[driverName] = support; - // don't use a then, so that we can define - // drivers that have simple _support methods - // in a blocking manner - resolve(); - }; - - if ('_support' in driverObject) { - if (driverObject._support && typeof driverObject._support === 'function') { - driverObject._support().then(setDriverSupport, reject); - } else { - setDriverSupport(!!driverObject._support); - } - } else { - setDriverSupport(true); - } - } catch (e) { - reject(e); - } - }); - - executeTwoCallbacks(promise, callback, errorCallback); - return promise; - }; - - LocalForage.prototype.driver = function driver() { - return this._driver || null; - }; - - LocalForage.prototype.getDriver = function getDriver(driverName, callback, errorCallback) { - var getDriverPromise = DefinedDrivers[driverName] ? Promise$1.resolve(DefinedDrivers[driverName]) : Promise$1.reject(new Error('Driver not found.')); - - executeTwoCallbacks(getDriverPromise, callback, errorCallback); - return getDriverPromise; - }; - - LocalForage.prototype.getSerializer = function getSerializer(callback) { - var serializerPromise = Promise$1.resolve(localforageSerializer); - executeTwoCallbacks(serializerPromise, callback); - return serializerPromise; - }; - - LocalForage.prototype.ready = function ready(callback) { - var self = this; - - var promise = self._driverSet.then(function () { - if (self._ready === null) { - self._ready = self._initDriver(); - } - - return self._ready; - }); - - executeTwoCallbacks(promise, callback, callback); - return promise; - }; - - LocalForage.prototype.setDriver = function setDriver(drivers, callback, errorCallback) { - var self = this; - - if (!isArray(drivers)) { - drivers = [drivers]; - } - - var supportedDrivers = this._getSupportedDrivers(drivers); - - function setDriverToConfig() { - self._config.driver = self.driver(); - } - - function extendSelfWithDriver(driver) { - self._extend(driver); - setDriverToConfig(); - - self._ready = self._initStorage(self._config); - return self._ready; - } - - function initDriver(supportedDrivers) { - return function () { - var currentDriverIndex = 0; - - function driverPromiseLoop() { - while (currentDriverIndex < supportedDrivers.length) { - var driverName = supportedDrivers[currentDriverIndex]; - currentDriverIndex++; - - self._dbInfo = null; - self._ready = null; - - return self.getDriver(driverName).then(extendSelfWithDriver)["catch"](driverPromiseLoop); - } - - setDriverToConfig(); - var error = new Error('No available storage method found.'); - self._driverSet = Promise$1.reject(error); - return self._driverSet; - } - - return driverPromiseLoop(); - }; - } - - // There might be a driver initialization in progress - // so wait for it to finish in order to avoid a possible - // race condition to set _dbInfo - var oldDriverSetDone = this._driverSet !== null ? this._driverSet["catch"](function () { - return Promise$1.resolve(); - }) : Promise$1.resolve(); - - this._driverSet = oldDriverSetDone.then(function () { - var driverName = supportedDrivers[0]; - self._dbInfo = null; - self._ready = null; - - return self.getDriver(driverName).then(function (driver) { - self._driver = driver._driver; - setDriverToConfig(); - self._wrapLibraryMethodsWithReady(); - self._initDriver = initDriver(supportedDrivers); - }); - })["catch"](function () { - setDriverToConfig(); - var error = new Error('No available storage method found.'); - self._driverSet = Promise$1.reject(error); - return self._driverSet; - }); - - executeTwoCallbacks(this._driverSet, callback, errorCallback); - return this._driverSet; - }; - - LocalForage.prototype.supports = function supports(driverName) { - return !!DriverSupport[driverName]; - }; - - LocalForage.prototype._extend = function _extend(libraryMethodsAndProperties) { - extend(this, libraryMethodsAndProperties); - }; - - LocalForage.prototype._getSupportedDrivers = function _getSupportedDrivers(drivers) { - var supportedDrivers = []; - for (var i = 0, len = drivers.length; i < len; i++) { - var driverName = drivers[i]; - if (this.supports(driverName)) { - supportedDrivers.push(driverName); - } - } - return supportedDrivers; - }; - - LocalForage.prototype._wrapLibraryMethodsWithReady = function _wrapLibraryMethodsWithReady() { - // Add a stub for each driver API method that delays the call to the - // corresponding driver method until localForage is ready. These stubs - // will be replaced by the driver methods as soon as the driver is - // loaded, so there is no performance impact. - for (var i = 0, len = LibraryMethods.length; i < len; i++) { - callWhenReady(this, LibraryMethods[i]); - } - }; - - LocalForage.prototype.createInstance = function createInstance(options) { - return new LocalForage(options); - }; - - return LocalForage; - }(); - - // The actual localForage object that we expose as a module or via a - // global. It's extended by pulling in one of our other libraries. - - - var localforage_js = new LocalForage(); - - module.exports = localforage_js; - - },{"3":3}]},{},[4])(4) - }); - }); - - // Localforage returns null if an item is not found, so we represent null with this uuid instead. - // not foolproof, but good enough for now. - var LOCALFORAGE_NULL = "c2fc1ad0-f76f-11ec-b939-0242ac120002"; - var notInLocalForage = /*#__PURE__*/new Set(); - localforage.config({ - driver: [localforage.LOCALSTORAGE, localforage.INDEXEDDB, localforage.WEBSQL] - }); - /** - Our very own implementation of the Gun API - */ - var Node = /*#__PURE__*/function () { - /** */ - function Node(id, parent) { - var _this = this; - if (id === void 0) { - id = ''; - } - if (parent === void 0) { - parent = null; - } - this.children = new Map(); - this.on_subscriptions = new Map(); - this.map_subscriptions = new Map(); - this.value = undefined; - this.counter = 0; - this.loaded = false; - this.saveLocalForage = _.throttle( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() { - var children; - return _regeneratorRuntime().wrap(function _callee$(_context) { - while (1) { - switch (_context.prev = _context.next) { - case 0: - if (_this.loaded) { - _context.next = 3; - break; - } - _context.next = 3; - return _this.loadLocalForage(); - case 3: - if (_this.children.size) { - children = Array.from(_this.children.keys()); - localforage.setItem(_this.id, children); - } else if (_this.value === undefined) { - localforage.removeItem(_this.id); - } else { - localforage.setItem(_this.id, _this.value === null ? LOCALFORAGE_NULL : _this.value); - } - case 4: - case "end": - return _context.stop(); - } - } - }, _callee); - })), 500); - this.loadLocalForage = _.throttle( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3() { - var result, newResult; - return _regeneratorRuntime().wrap(function _callee3$(_context3) { - while (1) { - switch (_context3.prev = _context3.next) { - case 0: - if (!notInLocalForage.has(_this.id)) { - _context3.next = 2; - break; - } - return _context3.abrupt("return", undefined); - case 2: - _context3.next = 4; - return localforage.getItem(_this.id); - case 4: - result = _context3.sent; - if (!(result === null)) { - _context3.next = 10; - break; - } - result = undefined; - notInLocalForage.add(_this.id); - _context3.next = 22; - break; - case 10: - if (!(result === LOCALFORAGE_NULL)) { - _context3.next = 14; - break; - } - result = null; - _context3.next = 22; - break; - case 14: - if (!Array.isArray(result)) { - _context3.next = 21; - break; - } - // result is a list of children - newResult = {}; - _context3.next = 18; - return Promise.all(result.map( /*#__PURE__*/function () { - var _ref3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(key) { - return _regeneratorRuntime().wrap(function _callee2$(_context2) { - while (1) { - switch (_context2.prev = _context2.next) { - case 0: - _context2.next = 2; - return _this.get(key).once(); - case 2: - newResult[key] = _context2.sent; - case 3: - case "end": - return _context2.stop(); - } - } - }, _callee2); - })); - return function (_x) { - return _ref3.apply(this, arguments); - }; - }())); - case 18: - result = newResult; - _context3.next = 22; - break; - case 21: - // result is a value - _this.value = result; - case 22: - _this.loaded = true; - return _context3.abrupt("return", result); - case 24: - case "end": - return _context3.stop(); - } - } - }, _callee3); - })), 500); - this.doCallbacks = _.throttle(function () { - var _loop3 = function _loop3() { - var _step$value = _step.value, - id = _step$value[0], - callback = _step$value[1]; - var event = { - off: function off() { - return _this.on_subscriptions["delete"](id); - } - }; - _this.once(callback, event, false); - }; - for (var _iterator = _createForOfIteratorHelperLoose(_this.on_subscriptions), _step; !(_step = _iterator()).done;) { - _loop3(); - } - if (_this.parent) { - var _loop = function _loop() { - var _step2$value = _step2.value, - id = _step2$value[0], - callback = _step2$value[1]; - var event = { - off: function off() { - return _this.parent.on_subscriptions["delete"](id); - } - }; - _this.parent.once(callback, event, false); - }; - for (var _iterator2 = _createForOfIteratorHelperLoose(_this.parent.on_subscriptions), _step2; !(_step2 = _iterator2()).done;) { - _loop(); - } - var _loop2 = function _loop2() { - var _step3$value = _step3.value, - id = _step3$value[0], - callback = _step3$value[1]; - var event = { - off: function off() { - return _this.parent.map_subscriptions["delete"](id); - } - }; - _this.once(callback, event, false); - }; - for (var _iterator3 = _createForOfIteratorHelperLoose(_this.parent.map_subscriptions), _step3; !(_step3 = _iterator3()).done;) { - _loop2(); - } - } - }, 40); - this.id = id; - this.parent = parent; - } - /** - * - * @param key - * @returns {Node} - * @example node.get('users').get('alice').put({name: 'Alice'}) - */ - var _proto = Node.prototype; - _proto.get = function get(key) { - var existing = this.children.get(key); - if (existing) { - return existing; - } - var new_node = new Node(this.id + "/" + key, this); - this.children.set(key, new_node); - this.saveLocalForage(); - return new_node; - } - /** - * Set a value to the node. If the value is an object, it will be converted to child nodes. - * @param value - * @example node.get('users').get('alice').put({name: 'Alice'}) - */; - _proto.put = function put(value) { - var _this2 = this; - if (Array.isArray(value)) { - throw new Error('Sorry, we don\'t deal with arrays'); - } - if (typeof value === 'object' && value !== null) { - this.value = undefined; - for (var key in value) { - this.get(key).put(value[key]); - } - _.defer(function () { - return _this2.doCallbacks(); - }, 100); - return; - } - this.children = new Map(); - this.value = value; - this.doCallbacks(); - this.saveLocalForage(); - } - // protip: the code would be a lot cleaner if you separated the Node API from storage adapters. - /** - * Return a value without subscribing to it - * @param callback - * @param event - * @param returnIfUndefined - * @returns {Promise<*>} - */; - _proto.once = - /*#__PURE__*/ - function () { - var _once = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee5(callback, event, returnIfUndefined) { - var _this3 = this; - var result; - return _regeneratorRuntime().wrap(function _callee5$(_context5) { - while (1) { - switch (_context5.prev = _context5.next) { - case 0: - if (returnIfUndefined === void 0) { - returnIfUndefined = true; - } - if (!this.children.size) { - _context5.next = 7; - break; - } - // return an object containing all children - result = {}; - _context5.next = 5; - return Promise.all(Array.from(this.children.keys()).map( /*#__PURE__*/function () { - var _ref4 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee4(key) { - return _regeneratorRuntime().wrap(function _callee4$(_context4) { - while (1) { - switch (_context4.prev = _context4.next) { - case 0: - _context4.next = 2; - return _this3.get(key).once(undefined, event); - case 2: - result[key] = _context4.sent; - case 3: - case "end": - return _context4.stop(); - } - } - }, _callee4); - })); - return function (_x5) { - return _ref4.apply(this, arguments); - }; - }())); - case 5: - _context5.next = 14; - break; - case 7: - if (!(this.value !== undefined)) { - _context5.next = 11; - break; - } - result = this.value; - _context5.next = 14; - break; - case 11: - _context5.next = 13; - return this.loadLocalForage(); - case 13: - result = _context5.sent; - case 14: - if (!(result !== undefined || returnIfUndefined)) { - _context5.next = 17; - break; - } - callback && callback(result, this.id.slice(this.id.lastIndexOf('/') + 1), null, event); - return _context5.abrupt("return", result); - case 17: - case "end": - return _context5.stop(); - } - } - }, _callee5, this); - })); - function once(_x2, _x3, _x4) { - return _once.apply(this, arguments); - } - return once; - }() /** - * Subscribe to a value - * @param callback - */; - _proto.on = function on(callback) { - var _this4 = this; - var id = this.counter++; - this.on_subscriptions.set(id, callback); - var event = { - off: function off() { - return _this4.on_subscriptions["delete"](id); - } - }; - this.once(callback, event, false); - } - /** - * Subscribe to the children of a node. Callback is called separately for each child. - * @param callback - * @returns {Promise} - */; - _proto.map = - /*#__PURE__*/ - function () { - var _map = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee6(callback) { - var _this5 = this; - var id, event, _iterator4, _step4, child; - return _regeneratorRuntime().wrap(function _callee6$(_context6) { - while (1) { - switch (_context6.prev = _context6.next) { - case 0: - id = this.counter++; - this.map_subscriptions.set(id, callback); - event = { - off: function off() { - return _this5.map_subscriptions["delete"](id); - } - }; - if (this.loaded) { - _context6.next = 6; - break; - } - _context6.next = 6; - return this.loadLocalForage(); - case 6: - for (_iterator4 = _createForOfIteratorHelperLoose(this.children.values()); !(_step4 = _iterator4()).done;) { - child = _step4.value; - child.once(callback, event, false); - } - case 7: - case "end": - return _context6.stop(); - } - } - }, _callee6, this); - })); - function map(_x6) { - return _map.apply(this, arguments); - } - return map; - }(); - return Node; - }(); - - var local; - /** - * Get a state that is only synced in memory and local storage. - * - * Useful for storing things like UI state, local indexes or logged in user. - * @returns {Node} - */ - function local$1 () { - if (!local) { - local = new Node(); - } - return local; - } - - var blockedUsers = {}; - function blockedUsers$1 () { - if (!blockedUsers) { - blockedUsers = {}; - local$1().get('block').map(function (isBlocked, user) { - if (isBlocked === blockedUsers[user]) { - return; - } - if (isBlocked) { - blockedUsers[user] = isBlocked; - local$1().get('groups').map(function (_v, k) { - local$1().get('groups').get(k).get(user).put(false); - }); - } else { - delete blockedUsers[user]; - } - }); - } - return blockedUsers; - } - - var counter = 0; - var cache = /*#__PURE__*/new Map(); - var callbacks = /*#__PURE__*/new Map(); - /** - * Aggregates public data from all users in the group. - * - * For example, the public message feed, message replies and likes are aggregated using this. - * @param groupName - * @returns object - */ - function group (groupName) { - if (groupName === void 0) { - groupName = 'everyone'; - } - return { - get: function get(path, callback) { - var groupNode = local$1().get('groups').get(groupName); - var follows = {}; - requestAnimationFrame(function () { - groupNode.map(function (isFollowing, user) { - if (blockedUsers$1()[user]) { - return; - } // TODO: allow to specifically query blocked users? - if (follows[user] && follows[user] === isFollowing) { - return; - } - follows[user] = isFollowing; - if (isFollowing) { - // TODO: callback on unfollow, for unsubscribe - var node = publicState(user); - if (path && path !== '/') { - node = path.split('/').reduce(function (sum, s) { - return sum.get(decodeURIComponent(s)); - }, node); - } - callback(node, user); - } - }); - }); - }, - _cached_map: function _cached_map(cached, cacheKey, path, myEvent, callback) { - if (!cached) { - var _cached = new Map(); - cache.set(cacheKey, _cached); - this.get(path, function (node, from) { - return node.map(function (value, key, x) { - var item = { - value: value, - key: key, - from: from - }; - _cached.set(key, item); - for (var _iterator = _createForOfIteratorHelperLoose(callbacks.get(cacheKey).values()), _step; !(_step = _iterator()).done;) { - var cb = _step.value; - cb(value, key, x, myEvent, from); - } - }); - }); - } else { - for (var _iterator2 = _createForOfIteratorHelperLoose(cached.values()), _step2; !(_step2 = _iterator2()).done;) { - var item = _step2.value; - callback(item.value, item.key, 0, myEvent, item.from); - } - } - }, - // TODO: this should probably store just the most recent value, not everyone's value - // TODO: for counting of likes etc, use this.count() instead - _cached_on: function _cached_on(cached, cacheKey, path, myEvent, callback) { - if (!cached) { - var _cached2 = new Map(); - cache.set(cacheKey, _cached2); - this.get(path, function (node, from) { - return node.on(function (value, key, x) { - var item = { - value: value, - key: key, - from: from - }; - _cached2.set(from, item); - for (var _iterator3 = _createForOfIteratorHelperLoose(callbacks.get(cacheKey).values()), _step3; !(_step3 = _iterator3()).done;) { - var cb = _step3.value; - cb(value, key, x, myEvent, from); - } - }); - }); - } else { - for (var _iterator4 = _createForOfIteratorHelperLoose(cached.values()), _step4; !(_step4 = _iterator4()).done;) { - var item = _step4.value; - callback(item.value, item.key, 0, myEvent, item.from); - } - } - }, - _cached_count: function _cached_count(cached, cacheKey, path, myEvent, callback) { - if (!cached) { - var _cached3 = new Map(); - cache.set(cacheKey, _cached3); - this.get(path, function (node, from) { - return node.on(function (value, key) { - value ? _cached3.set(from, true) : _cached3["delete"](from); - var count = _cached3.size; - for (var _iterator5 = _createForOfIteratorHelperLoose(callbacks.get(cacheKey).values()), _step5; !(_step5 = _iterator5()).done;) { - var cb = _step5.value; - cb(count, key, null, myEvent, from); - } - }); - }); - } else { - callback(cached.size, path.split('/').pop(), null, myEvent); - } - }, - _cached_fn: function _cached_fn(fn, path, callback) { - var cacheKey = fn + ":" + groupName + ":" + path; - var callbackId = counter++; - if (callbacks.has(cacheKey)) { - callbacks.get(cacheKey).set(callbackId, callback); - } else { - callbacks.set(cacheKey, new Map([[callbackId, callback]])); - } - var myEvent = { - off: function off() { - var myCallbacks = callbacks.get(cacheKey); - myCallbacks && myCallbacks["delete"](callbackId); - } - }; - var cached = cache.get(cacheKey); - switch (fn) { - case 'map': - this._cached_map(cached, cacheKey, path, myEvent, callback); - break; - case 'on': - this._cached_on(cached, cacheKey, path, myEvent, callback); - break; - case 'count': - this._cached_count(cached, cacheKey, path, myEvent, callback); - break; - } - }, - map: function map(path, callback) { - this._cached_fn('map', path, callback); - }, - on: function on(path, callback) { - this._cached_fn('on', path, callback); - }, - count: function count(path, callback) { - this._cached_fn('count', path, callback); - } - }; - } - - var NOTIFICATION_SERVICE_URL = 'https://iris-notifications.herokuapp.com/notify'; - // const notificationSound = new Audio('../../assets/audio/notification.mp3'); // TODO - var loginTime; - var unseenMsgsTotal = 0; - var unseenNotificationCount = 0; - var webPushSubscriptions = {}; - function desktopNotificationsEnabled() { - return window.Notification && Notification.permission === 'granted'; - } - function notifyMsg(msg, info, channelId, onClick) { - function shouldNotify() { - if (msg.timeObj < loginTime) { - return false; - } - if (info.selfAuthored) { - return false; - } - if (document.visibilityState === 'visible') { - return false; - } - var channel = privateState(channelId); - if (channel.notificationSetting === 'nothing') { - return false; - } - if (channel.notificationSetting === 'mentions' && !msg.text.includes(session.getMyName())) { - return false; - } - return true; - } - function shouldDesktopNotify() { - if (!desktopNotificationsEnabled()) { - return false; - } - return shouldNotify(); - } - function shouldAudioNotify() { - return shouldNotify(); - } - if (shouldAudioNotify()) ; - if (shouldDesktopNotify()) { - var body, title; - var channel = privateState(channelId); - if (channel.uuid) { - title = channel.participantProfiles[info.from].name; - body = name + ": " + msg.text; - } else { - title = 'Message'; - body = msg.text; - } - body = util.truncateString(body, 50); - var desktopNotification = new Notification(title, { - icon: '/assets/img/icon128.png', - body: body, - silent: true - }); - desktopNotification.onclick = function () { - changeUnseenNotificationCount(-1); - onClick && onClick(); - window.focus(); - }; - } - } - function changeChatUnseenMsgsCount(chatId, change) { - var chat = privateState(chatId); - if (!chat) return; - var chatNode = local$1().get('channels').get(chatId); - if (change) { - unseenMsgsTotal += change; - chat.unseen += change; - } else { - unseenMsgsTotal = unseenMsgsTotal - (chat.unseen || 0); - chat.unseen = 0; - } - chatNode.get('unseen').put(chat.unseen); - unseenMsgsTotal = unseenMsgsTotal >= 0 ? unseenMsgsTotal : 0; - local$1().get('unseenMsgsTotal').put(unseenMsgsTotal); - } - var publicVapidKey = 'BMqSvZArOIdn7vGkYplSpkZ70-Qt8nhYbey26WVa3LF3SwzblSzm3n3HHycpNkAKVq7MCkrzFuTFs_en7Y_J2MI'; - function urlBase64ToUint8Array(base64String) { - var padding = '='.repeat((4 - base64String.length % 4) % 4); - var base64 = (base64String + padding).replace(/-/g, '+').replace(/_/g, '/'); - var rawData = window.atob(base64); - var outputArray = new Uint8Array(rawData.length); - for (var i = 0; i < rawData.length; ++i) { - outputArray[i] = rawData.charCodeAt(i); - } - return outputArray; - } - function subscribe(_x) { - return _subscribe.apply(this, arguments); - } - function _subscribe() { - _subscribe = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3(reg) { - var subscription; - return _regeneratorRuntime().wrap(function _callee3$(_context3) { - while (1) { - switch (_context3.prev = _context3.next) { - case 0: - _context3.prev = 0; - _context3.next = 3; - return reg.pushManager.subscribe({ - userVisibleOnly: true, - applicationServerKey: urlBase64ToUint8Array(publicVapidKey) - }); - case 3: - subscription = _context3.sent; - addWebPushSubscription(subscription); - _context3.next = 10; - break; - case 7: - _context3.prev = 7; - _context3.t0 = _context3["catch"](0); - console.error('web push subscription error', _context3.t0); - case 10: - case "end": - return _context3.stop(); - } - } - }, _callee3, null, [[0, 7]]); - })); - return _subscribe.apply(this, arguments); - } - function subscribeToWebPush() { - return _subscribeToWebPush.apply(this, arguments); - } - function _subscribeToWebPush() { - _subscribeToWebPush = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee4() { - var reg, sub; - return _regeneratorRuntime().wrap(function _callee4$(_context4) { - while (1) { - switch (_context4.prev = _context4.next) { - case 0: - console.log('subscribing to web push', navigator.serviceWorker); - if (!(!desktopNotificationsEnabled() || !navigator.serviceWorker)) { - _context4.next = 3; - break; - } - return _context4.abrupt("return", false); - case 3: - _context4.next = 5; - return navigator.serviceWorker.ready; - case 5: - _context4.next = 7; - return navigator.serviceWorker.getRegistration(); - case 7: - reg = _context4.sent; - reg.active.postMessage({ - key: session.getKey() - }); - _context4.next = 11; - return reg.pushManager.getSubscription(); - case 11: - sub = _context4.sent; - sub ? addWebPushSubscription(sub) : subscribe(reg); - case 13: - case "end": - return _context4.stop(); - } - } - }, _callee4); - })); - return _subscribeToWebPush.apply(this, arguments); - } - var addWebPushSubscriptionsToChats = /*#__PURE__*/_.debounce(function () { - var arr = Object.values(webPushSubscriptions); - session.channelIds.forEach(function (channelId) { - privateState(channelId).put('webPushSubscriptions', arr); - }); - }, 5000); - function removeSubscription(hash) { - delete webPushSubscriptions[hash]; - global$2().user().get('webPushSubscriptions').get(hash).put(null); - addWebPushSubscriptionsToChats(); - } - function addWebPushSubscription(_x2, _x3) { - return _addWebPushSubscription.apply(this, arguments); - } - function _addWebPushSubscription() { - _addWebPushSubscription = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee5(s, saveToGun) { - var myKey, mySecret, enc, hash; - return _regeneratorRuntime().wrap(function _callee5$(_context5) { - while (1) { - switch (_context5.prev = _context5.next) { - case 0: - if (saveToGun === void 0) { - saveToGun = true; - } - myKey = session.getKey(); - _context5.next = 4; - return gun$1.SEA.secret(myKey.epub, myKey); - case 4: - mySecret = _context5.sent; - _context5.next = 7; - return gun$1.SEA.encrypt(s, mySecret); - case 7: - enc = _context5.sent; - _context5.next = 10; - return util.getHash(JSON.stringify(s)); - case 10: - hash = _context5.sent; - if (saveToGun) { - global$2().user().get('webPushSubscriptions').get(hash).put(enc); - } - webPushSubscriptions[hash] = s; - addWebPushSubscriptionsToChats(); - case 14: - case "end": - return _context5.stop(); - } - } - }, _callee5); - })); - return _addWebPushSubscription.apply(this, arguments); - } - function getWebPushSubscriptions() { - return _getWebPushSubscriptions.apply(this, arguments); - } - function _getWebPushSubscriptions() { - _getWebPushSubscriptions = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee7() { - var myKey, mySecret; - return _regeneratorRuntime().wrap(function _callee7$(_context7) { - while (1) { - switch (_context7.prev = _context7.next) { - case 0: - myKey = session.getKey(); - _context7.next = 3; - return gun$1.SEA.secret(myKey.epub, myKey); - case 3: - mySecret = _context7.sent; - global$2().user().get('webPushSubscriptions').map().on( /*#__PURE__*/function () { - var _ref3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee6(enc) { - var s; - return _regeneratorRuntime().wrap(function _callee6$(_context6) { - while (1) { - switch (_context6.prev = _context6.next) { - case 0: - if (enc) { - _context6.next = 2; - break; - } - return _context6.abrupt("return"); - case 2: - _context6.next = 4; - return gun$1.SEA.decrypt(enc, mySecret); - case 4: - s = _context6.sent; - addWebPushSubscription(s, false); - case 6: - case "end": - return _context6.stop(); - } - } - }, _callee6); - })); - return function (_x18) { - return _ref3.apply(this, arguments); - }; - }()); - case 5: - case "end": - return _context7.stop(); - } - } - }, _callee7); - })); - return _getWebPushSubscriptions.apply(this, arguments); - } - function getEpub(user) { - return new Promise(function (resolve) { - global$2().user(user).get('epub').on( /*#__PURE__*/function () { - var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(epub, k, x, e) { - return _regeneratorRuntime().wrap(function _callee$(_context) { - while (1) { - switch (_context.prev = _context.next) { - case 0: - if (epub) { - e.off(); - resolve(epub); - } - case 1: - case "end": - return _context.stop(); - } - } - }, _callee); - })); - return function (_x4, _x5, _x6, _x7) { - return _ref.apply(this, arguments); - }; - }()); - }); - } - function getNotificationText(_x8) { - return _getNotificationText.apply(this, arguments); - } - function _getNotificationText() { - _getNotificationText = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee8(notification) { - var profile, name, event, eventText; - return _regeneratorRuntime().wrap(function _callee8$(_context8) { - while (1) { - switch (_context8.prev = _context8.next) { - case 0: - _context8.next = 2; - return global$2().user(notification.from).get('profile').once(); - case 2: - profile = _context8.sent; - name = profile && profile.name || 'someone'; - event = notification.event || notification.action; - if (event === 'like') eventText = name + " liked your post";else if (event === 'reply') eventText = name + " replied to your post";else if (event === 'mention') eventText = name + " mentioned you in their post";else if (event === 'follow') eventText = name + " started following you";else eventText = name + " sent you a notification: " + event; - return _context8.abrupt("return", eventText); - case 7: - case "end": - return _context8.stop(); - } - } - }, _callee8); - })); - return _getNotificationText.apply(this, arguments); - } - function subscribeToIrisNotifications(onClick) { - var notificationsSeenTime; - var notificationsShownTime; - global$2().user().get('notificationsSeenTime').on(function (v) { - notificationsSeenTime = v; - console.log(v); - }); - global$2().user().get('notificationsShownTime').on(function (v) { - return notificationsShownTime = v; - }); - var setNotificationsShownTime = _.debounce(function () { - global$2().user().get('notificationsShownTime').put(new Date().toISOString()); - }, 1000); - var alreadyHave = new Set(); - group().on("notifications/" + session.getPubKey(), /*#__PURE__*/function () { - var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(encryptedNotification, k, x, e, from) { - var id, epub, secret, notification, text, desktopNotification; - return _regeneratorRuntime().wrap(function _callee2$(_context2) { - while (1) { - switch (_context2.prev = _context2.next) { - case 0: - id = from.slice(0, 30) + encryptedNotification.slice(0, 30); - if (!alreadyHave.has(id)) { - _context2.next = 3; - break; - } - return _context2.abrupt("return"); - case 3: - alreadyHave.add(id); - _context2.next = 6; - return getEpub(from); - case 6: - epub = _context2.sent; - _context2.next = 9; - return gun$1.SEA.secret(epub, session.getKey()); - case 9: - secret = _context2.sent; - _context2.next = 12; - return gun$1.SEA.decrypt(encryptedNotification, secret); - case 12: - notification = _context2.sent; - if (!(!notification || typeof notification !== 'object')) { - _context2.next = 15; - break; - } - return _context2.abrupt("return"); - case 15: - setNotificationsShownTime(); - notification.from = from; - local$1().get('notifications').get(notification.time).put(notification); - if (!notificationsSeenTime || notificationsSeenTime < notification.time) { - changeUnseenNotificationCount(1); - } - if (!(!notificationsShownTime || notificationsShownTime < notification.time)) { - _context2.next = 26; - break; - } - console.log('was new!'); - _context2.next = 23; - return getNotificationText(notification); - case 23: - text = _context2.sent; - desktopNotification = new Notification(text, { - icon: '/assets/img/icon128.png', - body: text, - silent: true - }); - desktopNotification.onclick = function () { - var link = notification.target ? "/post/" + notification.target : "/profile/" + notification.from; - onClick && onClick(link); - changeUnseenNotificationCount(-1); - window.focus(); - }; - case 26: - case "end": - return _context2.stop(); - } - } - }, _callee2); - })); - return function (_x9, _x10, _x11, _x12, _x13) { - return _ref2.apply(this, arguments); - }; - }()); - } - function changeUnseenNotificationCount(change) { - if (!change) { - unseenNotificationCount = 0; - global$2().user().get('notificationsSeenTime').put(new Date().toISOString()); - } else { - unseenNotificationCount += change; - unseenNotificationCount = Math.max(unseenNotificationCount, 0); - } - local$1().get('unseenNotificationCount').put(unseenNotificationCount); - } - function sendIrisNotification(_x14, _x15) { - return _sendIrisNotification.apply(this, arguments); - } - function _sendIrisNotification() { - _sendIrisNotification = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee9(recipient, notification) { - var epub, secret, enc; - return _regeneratorRuntime().wrap(function _callee9$(_context9) { - while (1) { - switch (_context9.prev = _context9.next) { - case 0: - if (recipient && notification) { - _context9.next = 2; - break; - } - return _context9.abrupt("return"); - case 2: - // TODO: use typescript or sth :D - if (typeof notification === 'object') { - notification.time = new Date().toISOString(); - } - _context9.next = 5; - return getEpub(recipient); - case 5: - epub = _context9.sent; - _context9.next = 8; - return gun$1.SEA.secret(epub, session.getKey()); - case 8: - secret = _context9.sent; - _context9.next = 11; - return gun$1.SEA.encrypt(notification, secret); - case 11: - enc = _context9.sent; - global$2().user().get('notifications').get(recipient).put(enc); - case 13: - case "end": - return _context9.stop(); - } - } - }, _callee9); - })); - return _sendIrisNotification.apply(this, arguments); - } - function sendWebPushNotification(_x16, _x17) { - return _sendWebPushNotification.apply(this, arguments); - } - function _sendWebPushNotification() { - _sendWebPushNotification = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee11(recipient, notification) { - var channel, myKey, shouldWebPush, _ret; - return _regeneratorRuntime().wrap(function _callee11$(_context12) { - while (1) { - switch (_context12.prev = _context12.next) { - case 0: - console.log('sending web push notification to', recipient, notification); - channel = privateState(recipient); - myKey = session.getKey(); - shouldWebPush = recipient === myKey.pub || !(channel.activity && channel.activity.isActive); - if (!(shouldWebPush && channel.webPushSubscriptions)) { - _context12.next = 9; - break; - } - return _context12.delegateYield( /*#__PURE__*/_regeneratorRuntime().mark(function _callee10() { - var subscriptions, participants, _loop, i; - return _regeneratorRuntime().wrap(function _callee10$(_context11) { - while (1) { - switch (_context11.prev = _context11.next) { - case 0: - subscriptions = []; - participants = Object.keys(channel.webPushSubscriptions); - _loop = /*#__PURE__*/_regeneratorRuntime().mark(function _loop(i) { - var participant, secret, payload; - return _regeneratorRuntime().wrap(function _loop$(_context10) { - while (1) { - switch (_context10.prev = _context10.next) { - case 0: - participant = participants[i]; - _context10.next = 3; - return channel.getSecret(participant); - case 3: - secret = _context10.sent; - _context10.next = 6; - return gun$1.SEA.encrypt(notification.title, secret); - case 6: - _context10.t0 = _context10.sent; - _context10.next = 9; - return gun$1.SEA.encrypt(notification.body, secret); - case 9: - _context10.t1 = _context10.sent; - _context10.t2 = { - pub: myKey.pub, - epub: myKey.epub - }; - payload = { - title: _context10.t0, - body: _context10.t1, - from: _context10.t2 - }; - channel.webPushSubscriptions[participant].forEach(function (s) { - if (s && s.endpoint) { - subscriptions.push({ - subscription: s, - payload: payload - }); - } - }); - case 13: - case "end": - return _context10.stop(); - } - } - }, _loop); - }); - i = 0; - case 4: - if (!(i < participants.length)) { - _context11.next = 9; - break; - } - return _context11.delegateYield(_loop(i), "t0", 6); - case 6: - i++; - _context11.next = 4; - break; - case 9: - if (!(subscriptions.length === 0)) { - _context11.next = 11; - break; - } - return _context11.abrupt("return", { - v: void 0 - }); - case 11: - fetch(NOTIFICATION_SERVICE_URL, { - method: 'POST', - body: JSON.stringify({ - subscriptions: subscriptions - }), - headers: { - 'content-type': 'application/json' - } - })["catch"](function () {}); - case 12: - case "end": - return _context11.stop(); - } - } - }, _callee10); - })(), "t0", 6); - case 6: - _ret = _context12.t0; - if (!(typeof _ret === "object")) { - _context12.next = 9; - break; - } - return _context12.abrupt("return", _ret.v); - case 9: - case "end": - return _context12.stop(); - } - } - }, _callee11); - })); - return _sendWebPushNotification.apply(this, arguments); - } - function init() { - loginTime = new Date(); - unseenMsgsTotal = 0; - } - var notifications = { - init: init, - notifyMsg: notifyMsg, - getNotificationText: getNotificationText, - sendWebPushNotification: sendWebPushNotification, - changeUnseenNotificationCount: changeUnseenNotificationCount, - subscribeToIrisNotifications: subscribeToIrisNotifications, - sendIrisNotification: sendIrisNotification, - changeChatUnseenCount: changeChatUnseenMsgsCount, - webPushSubscriptions: webPushSubscriptions, - subscribeToWebPush: subscribeToWebPush, - getWebPushSubscriptions: getWebPushSubscriptions, - removeSubscription: removeSubscription - }; - - /** - * Fuse.js v6.6.2 - Lightweight fuzzy-search (http://fusejs.io) - * - * Copyright (c) 2022 Kiro Risk (http://kiro.me) - * All Rights Reserved. Apache Software License 2.0 - * - * http://www.apache.org/licenses/LICENSE-2.0 - */ - - function isArray(value) { - return !Array.isArray - ? getTag(value) === '[object Array]' - : Array.isArray(value) - } - - // Adapted from: https://github.com/lodash/lodash/blob/master/.internal/baseToString.js - const INFINITY = 1 / 0; - function baseToString(value) { - // Exit early for strings to avoid a performance hit in some environments. - if (typeof value == 'string') { - return value - } - let result = value + ''; - return result == '0' && 1 / value == -INFINITY ? '-0' : result - } - - function toString(value) { - return value == null ? '' : baseToString(value) - } - - function isString(value) { - return typeof value === 'string' - } - - function isNumber(value) { - return typeof value === 'number' - } - - // Adapted from: https://github.com/lodash/lodash/blob/master/isBoolean.js - function isBoolean(value) { - return ( - value === true || - value === false || - (isObjectLike(value) && getTag(value) == '[object Boolean]') - ) - } - - function isObject(value) { - return typeof value === 'object' - } - - // Checks if `value` is object-like. - function isObjectLike(value) { - return isObject(value) && value !== null - } - - function isDefined(value) { - return value !== undefined && value !== null - } - - function isBlank(value) { - return !value.trim().length - } - - // Gets the `toStringTag` of `value`. - // Adapted from: https://github.com/lodash/lodash/blob/master/.internal/getTag.js - function getTag(value) { - return value == null - ? value === undefined - ? '[object Undefined]' - : '[object Null]' - : Object.prototype.toString.call(value) - } - - const EXTENDED_SEARCH_UNAVAILABLE = 'Extended search is not available'; - - const INCORRECT_INDEX_TYPE = "Incorrect 'index' type"; - - const LOGICAL_SEARCH_INVALID_QUERY_FOR_KEY = (key) => - `Invalid value for key ${key}`; - - const PATTERN_LENGTH_TOO_LARGE = (max) => - `Pattern length exceeds max of ${max}.`; - - const MISSING_KEY_PROPERTY = (name) => `Missing ${name} property in key`; - - const INVALID_KEY_WEIGHT_VALUE = (key) => - `Property 'weight' in key '${key}' must be a positive integer`; - - const hasOwn = Object.prototype.hasOwnProperty; - - class KeyStore { - constructor(keys) { - this._keys = []; - this._keyMap = {}; - - let totalWeight = 0; - - keys.forEach((key) => { - let obj = createKey(key); - - totalWeight += obj.weight; - - this._keys.push(obj); - this._keyMap[obj.id] = obj; - - totalWeight += obj.weight; - }); - - // Normalize weights so that their sum is equal to 1 - this._keys.forEach((key) => { - key.weight /= totalWeight; - }); - } - get(keyId) { - return this._keyMap[keyId] - } - keys() { - return this._keys - } - toJSON() { - return JSON.stringify(this._keys) - } - } - - function createKey(key) { - let path = null; - let id = null; - let src = null; - let weight = 1; - let getFn = null; - - if (isString(key) || isArray(key)) { - src = key; - path = createKeyPath(key); - id = createKeyId(key); - } else { - if (!hasOwn.call(key, 'name')) { - throw new Error(MISSING_KEY_PROPERTY('name')) - } - - const name = key.name; - src = name; - - if (hasOwn.call(key, 'weight')) { - weight = key.weight; - - if (weight <= 0) { - throw new Error(INVALID_KEY_WEIGHT_VALUE(name)) - } - } - - path = createKeyPath(name); - id = createKeyId(name); - getFn = key.getFn; - } - - return { path, id, weight, src, getFn } - } - - function createKeyPath(key) { - return isArray(key) ? key : key.split('.') - } - - function createKeyId(key) { - return isArray(key) ? key.join('.') : key - } - - function get(obj, path) { - let list = []; - let arr = false; - - const deepGet = (obj, path, index) => { - if (!isDefined(obj)) { - return - } - if (!path[index]) { - // If there's no path left, we've arrived at the object we care about. - list.push(obj); - } else { - let key = path[index]; - - const value = obj[key]; - - if (!isDefined(value)) { - return - } - - // If we're at the last value in the path, and if it's a string/number/bool, - // add it to the list - if ( - index === path.length - 1 && - (isString(value) || isNumber(value) || isBoolean(value)) - ) { - list.push(toString(value)); - } else if (isArray(value)) { - arr = true; - // Search each item in the array. - for (let i = 0, len = value.length; i < len; i += 1) { - deepGet(value[i], path, index + 1); - } - } else if (path.length) { - // An object. Recurse further. - deepGet(value, path, index + 1); - } - } - }; - - // Backwards compatibility (since path used to be a string) - deepGet(obj, isString(path) ? path.split('.') : path, 0); - - return arr ? list : list[0] - } - - const MatchOptions = { - // Whether the matches should be included in the result set. When `true`, each record in the result - // set will include the indices of the matched characters. - // These can consequently be used for highlighting purposes. - includeMatches: false, - // When `true`, the matching function will continue to the end of a search pattern even if - // a perfect match has already been located in the string. - findAllMatches: false, - // Minimum number of characters that must be matched before a result is considered a match - minMatchCharLength: 1 - }; - - const BasicOptions = { - // When `true`, the algorithm continues searching to the end of the input even if a perfect - // match is found before the end of the same input. - isCaseSensitive: false, - // When true, the matching function will continue to the end of a search pattern even if - includeScore: false, - // List of properties that will be searched. This also supports nested properties. - keys: [], - // Whether to sort the result list, by score - shouldSort: true, - // Default sort function: sort by ascending score, ascending index - sortFn: (a, b) => - a.score === b.score ? (a.idx < b.idx ? -1 : 1) : a.score < b.score ? -1 : 1 - }; - - const FuzzyOptions = { - // Approximately where in the text is the pattern expected to be found? - location: 0, - // At what point does the match algorithm give up. A threshold of '0.0' requires a perfect match - // (of both letters and location), a threshold of '1.0' would match anything. - threshold: 0.6, - // Determines how close the match must be to the fuzzy location (specified above). - // An exact letter match which is 'distance' characters away from the fuzzy location - // would score as a complete mismatch. A distance of '0' requires the match be at - // the exact location specified, a threshold of '1000' would require a perfect match - // to be within 800 characters of the fuzzy location to be found using a 0.8 threshold. - distance: 100 - }; - - const AdvancedOptions = { - // When `true`, it enables the use of unix-like search commands - useExtendedSearch: false, - // The get function to use when fetching an object's properties. - // The default will search nested paths *ie foo.bar.baz* - getFn: get, - // When `true`, search will ignore `location` and `distance`, so it won't matter - // where in the string the pattern appears. - // More info: https://fusejs.io/concepts/scoring-theory.html#fuzziness-score - ignoreLocation: false, - // When `true`, the calculation for the relevance score (used for sorting) will - // ignore the field-length norm. - // More info: https://fusejs.io/concepts/scoring-theory.html#field-length-norm - ignoreFieldNorm: false, - // The weight to determine how much field length norm effects scoring. - fieldNormWeight: 1 - }; - - var Config = { - ...BasicOptions, - ...MatchOptions, - ...FuzzyOptions, - ...AdvancedOptions - }; - - const SPACE = /[^ ]+/g; - - // Field-length norm: the shorter the field, the higher the weight. - // Set to 3 decimals to reduce index size. - function norm(weight = 1, mantissa = 3) { - const cache = new Map(); - const m = Math.pow(10, mantissa); - - return { - get(value) { - const numTokens = value.match(SPACE).length; - - if (cache.has(numTokens)) { - return cache.get(numTokens) - } - - // Default function is 1/sqrt(x), weight makes that variable - const norm = 1 / Math.pow(numTokens, 0.5 * weight); - - // In place of `toFixed(mantissa)`, for faster computation - const n = parseFloat(Math.round(norm * m) / m); - - cache.set(numTokens, n); - - return n - }, - clear() { - cache.clear(); - } - } - } - - class FuseIndex { - constructor({ - getFn = Config.getFn, - fieldNormWeight = Config.fieldNormWeight - } = {}) { - this.norm = norm(fieldNormWeight, 3); - this.getFn = getFn; - this.isCreated = false; - - this.setIndexRecords(); - } - setSources(docs = []) { - this.docs = docs; - } - setIndexRecords(records = []) { - this.records = records; - } - setKeys(keys = []) { - this.keys = keys; - this._keysMap = {}; - keys.forEach((key, idx) => { - this._keysMap[key.id] = idx; - }); - } - create() { - if (this.isCreated || !this.docs.length) { - return - } - - this.isCreated = true; - - // List is Array - if (isString(this.docs[0])) { - this.docs.forEach((doc, docIndex) => { - this._addString(doc, docIndex); - }); - } else { - // List is Array - this.docs.forEach((doc, docIndex) => { - this._addObject(doc, docIndex); - }); - } - - this.norm.clear(); - } - // Adds a doc to the end of the index - add(doc) { - const idx = this.size(); - - if (isString(doc)) { - this._addString(doc, idx); - } else { - this._addObject(doc, idx); - } - } - // Removes the doc at the specified index of the index - removeAt(idx) { - this.records.splice(idx, 1); - - // Change ref index of every subsquent doc - for (let i = idx, len = this.size(); i < len; i += 1) { - this.records[i].i -= 1; - } - } - getValueForItemAtKeyId(item, keyId) { - return item[this._keysMap[keyId]] - } - size() { - return this.records.length - } - _addString(doc, docIndex) { - if (!isDefined(doc) || isBlank(doc)) { - return - } - - let record = { - v: doc, - i: docIndex, - n: this.norm.get(doc) - }; - - this.records.push(record); - } - _addObject(doc, docIndex) { - let record = { i: docIndex, $: {} }; - - // Iterate over every key (i.e, path), and fetch the value at that key - this.keys.forEach((key, keyIndex) => { - let value = key.getFn ? key.getFn(doc) : this.getFn(doc, key.path); - - if (!isDefined(value)) { - return - } - - if (isArray(value)) { - let subRecords = []; - const stack = [{ nestedArrIndex: -1, value }]; - - while (stack.length) { - const { nestedArrIndex, value } = stack.pop(); - - if (!isDefined(value)) { - continue - } - - if (isString(value) && !isBlank(value)) { - let subRecord = { - v: value, - i: nestedArrIndex, - n: this.norm.get(value) - }; - - subRecords.push(subRecord); - } else if (isArray(value)) { - value.forEach((item, k) => { - stack.push({ - nestedArrIndex: k, - value: item - }); - }); - } - } - record.$[keyIndex] = subRecords; - } else if (isString(value) && !isBlank(value)) { - let subRecord = { - v: value, - n: this.norm.get(value) - }; - - record.$[keyIndex] = subRecord; - } - }); - - this.records.push(record); - } - toJSON() { - return { - keys: this.keys, - records: this.records - } - } - } - - function createIndex( - keys, - docs, - { getFn = Config.getFn, fieldNormWeight = Config.fieldNormWeight } = {} - ) { - const myIndex = new FuseIndex({ getFn, fieldNormWeight }); - myIndex.setKeys(keys.map(createKey)); - myIndex.setSources(docs); - myIndex.create(); - return myIndex - } - - function parseIndex( - data, - { getFn = Config.getFn, fieldNormWeight = Config.fieldNormWeight } = {} - ) { - const { keys, records } = data; - const myIndex = new FuseIndex({ getFn, fieldNormWeight }); - myIndex.setKeys(keys); - myIndex.setIndexRecords(records); - return myIndex - } - - function computeScore$1( - pattern, - { - errors = 0, - currentLocation = 0, - expectedLocation = 0, - distance = Config.distance, - ignoreLocation = Config.ignoreLocation - } = {} - ) { - const accuracy = errors / pattern.length; - - if (ignoreLocation) { - return accuracy - } - - const proximity = Math.abs(expectedLocation - currentLocation); - - if (!distance) { - // Dodge divide by zero error. - return proximity ? 1.0 : accuracy - } - - return accuracy + proximity / distance - } - - function convertMaskToIndices( - matchmask = [], - minMatchCharLength = Config.minMatchCharLength - ) { - let indices = []; - let start = -1; - let end = -1; - let i = 0; - - for (let len = matchmask.length; i < len; i += 1) { - let match = matchmask[i]; - if (match && start === -1) { - start = i; - } else if (!match && start !== -1) { - end = i - 1; - if (end - start + 1 >= minMatchCharLength) { - indices.push([start, end]); - } - start = -1; - } - } - - // (i-1 - start) + 1 => i - start - if (matchmask[i - 1] && i - start >= minMatchCharLength) { - indices.push([start, i - 1]); - } - - return indices - } - - // Machine word size - const MAX_BITS = 32; - - function search( - text, - pattern, - patternAlphabet, - { - location = Config.location, - distance = Config.distance, - threshold = Config.threshold, - findAllMatches = Config.findAllMatches, - minMatchCharLength = Config.minMatchCharLength, - includeMatches = Config.includeMatches, - ignoreLocation = Config.ignoreLocation - } = {} - ) { - if (pattern.length > MAX_BITS) { - throw new Error(PATTERN_LENGTH_TOO_LARGE(MAX_BITS)) - } - - const patternLen = pattern.length; - // Set starting location at beginning text and initialize the alphabet. - const textLen = text.length; - // Handle the case when location > text.length - const expectedLocation = Math.max(0, Math.min(location, textLen)); - // Highest score beyond which we give up. - let currentThreshold = threshold; - // Is there a nearby exact match? (speedup) - let bestLocation = expectedLocation; - - // Performance: only computer matches when the minMatchCharLength > 1 - // OR if `includeMatches` is true. - const computeMatches = minMatchCharLength > 1 || includeMatches; - // A mask of the matches, used for building the indices - const matchMask = computeMatches ? Array(textLen) : []; - - let index; - - // Get all exact matches, here for speed up - while ((index = text.indexOf(pattern, bestLocation)) > -1) { - let score = computeScore$1(pattern, { - currentLocation: index, - expectedLocation, - distance, - ignoreLocation - }); - - currentThreshold = Math.min(score, currentThreshold); - bestLocation = index + patternLen; - - if (computeMatches) { - let i = 0; - while (i < patternLen) { - matchMask[index + i] = 1; - i += 1; - } - } - } - - // Reset the best location - bestLocation = -1; - - let lastBitArr = []; - let finalScore = 1; - let binMax = patternLen + textLen; - - const mask = 1 << (patternLen - 1); - - for (let i = 0; i < patternLen; i += 1) { - // Scan for the best match; each iteration allows for one more error. - // Run a binary search to determine how far from the match location we can stray - // at this error level. - let binMin = 0; - let binMid = binMax; - - while (binMin < binMid) { - const score = computeScore$1(pattern, { - errors: i, - currentLocation: expectedLocation + binMid, - expectedLocation, - distance, - ignoreLocation - }); - - if (score <= currentThreshold) { - binMin = binMid; - } else { - binMax = binMid; - } - - binMid = Math.floor((binMax - binMin) / 2 + binMin); - } - - // Use the result from this iteration as the maximum for the next. - binMax = binMid; - - let start = Math.max(1, expectedLocation - binMid + 1); - let finish = findAllMatches - ? textLen - : Math.min(expectedLocation + binMid, textLen) + patternLen; - - // Initialize the bit array - let bitArr = Array(finish + 2); - - bitArr[finish + 1] = (1 << i) - 1; - - for (let j = finish; j >= start; j -= 1) { - let currentLocation = j - 1; - let charMatch = patternAlphabet[text.charAt(currentLocation)]; - - if (computeMatches) { - // Speed up: quick bool to int conversion (i.e, `charMatch ? 1 : 0`) - matchMask[currentLocation] = +!!charMatch; - } - - // First pass: exact match - bitArr[j] = ((bitArr[j + 1] << 1) | 1) & charMatch; - - // Subsequent passes: fuzzy match - if (i) { - bitArr[j] |= - ((lastBitArr[j + 1] | lastBitArr[j]) << 1) | 1 | lastBitArr[j + 1]; - } - - if (bitArr[j] & mask) { - finalScore = computeScore$1(pattern, { - errors: i, - currentLocation, - expectedLocation, - distance, - ignoreLocation - }); - - // This match will almost certainly be better than any existing match. - // But check anyway. - if (finalScore <= currentThreshold) { - // Indeed it is - currentThreshold = finalScore; - bestLocation = currentLocation; - - // Already passed `loc`, downhill from here on in. - if (bestLocation <= expectedLocation) { - break - } - - // When passing `bestLocation`, don't exceed our current distance from `expectedLocation`. - start = Math.max(1, 2 * expectedLocation - bestLocation); - } - } - } - - // No hope for a (better) match at greater error levels. - const score = computeScore$1(pattern, { - errors: i + 1, - currentLocation: expectedLocation, - expectedLocation, - distance, - ignoreLocation - }); - - if (score > currentThreshold) { - break - } - - lastBitArr = bitArr; - } - - const result = { - isMatch: bestLocation >= 0, - // Count exact matches (those with a score of 0) to be "almost" exact - score: Math.max(0.001, finalScore) - }; - - if (computeMatches) { - const indices = convertMaskToIndices(matchMask, minMatchCharLength); - if (!indices.length) { - result.isMatch = false; - } else if (includeMatches) { - result.indices = indices; - } - } - - return result - } - - function createPatternAlphabet(pattern) { - let mask = {}; - - for (let i = 0, len = pattern.length; i < len; i += 1) { - const char = pattern.charAt(i); - mask[char] = (mask[char] || 0) | (1 << (len - i - 1)); - } - - return mask - } - - class BitapSearch { - constructor( - pattern, - { - location = Config.location, - threshold = Config.threshold, - distance = Config.distance, - includeMatches = Config.includeMatches, - findAllMatches = Config.findAllMatches, - minMatchCharLength = Config.minMatchCharLength, - isCaseSensitive = Config.isCaseSensitive, - ignoreLocation = Config.ignoreLocation - } = {} - ) { - this.options = { - location, - threshold, - distance, - includeMatches, - findAllMatches, - minMatchCharLength, - isCaseSensitive, - ignoreLocation - }; - - this.pattern = isCaseSensitive ? pattern : pattern.toLowerCase(); - - this.chunks = []; - - if (!this.pattern.length) { - return - } - - const addChunk = (pattern, startIndex) => { - this.chunks.push({ - pattern, - alphabet: createPatternAlphabet(pattern), - startIndex - }); - }; - - const len = this.pattern.length; - - if (len > MAX_BITS) { - let i = 0; - const remainder = len % MAX_BITS; - const end = len - remainder; - - while (i < end) { - addChunk(this.pattern.substr(i, MAX_BITS), i); - i += MAX_BITS; - } - - if (remainder) { - const startIndex = len - MAX_BITS; - addChunk(this.pattern.substr(startIndex), startIndex); - } - } else { - addChunk(this.pattern, 0); - } - } - - searchIn(text) { - const { isCaseSensitive, includeMatches } = this.options; - - if (!isCaseSensitive) { - text = text.toLowerCase(); - } - - // Exact match - if (this.pattern === text) { - let result = { - isMatch: true, - score: 0 - }; - - if (includeMatches) { - result.indices = [[0, text.length - 1]]; - } - - return result - } - - // Otherwise, use Bitap algorithm - const { - location, - distance, - threshold, - findAllMatches, - minMatchCharLength, - ignoreLocation - } = this.options; - - let allIndices = []; - let totalScore = 0; - let hasMatches = false; - - this.chunks.forEach(({ pattern, alphabet, startIndex }) => { - const { isMatch, score, indices } = search(text, pattern, alphabet, { - location: location + startIndex, - distance, - threshold, - findAllMatches, - minMatchCharLength, - includeMatches, - ignoreLocation - }); - - if (isMatch) { - hasMatches = true; - } - - totalScore += score; - - if (isMatch && indices) { - allIndices = [...allIndices, ...indices]; - } - }); - - let result = { - isMatch: hasMatches, - score: hasMatches ? totalScore / this.chunks.length : 1 - }; - - if (hasMatches && includeMatches) { - result.indices = allIndices; - } - - return result - } - } - - class BaseMatch { - constructor(pattern) { - this.pattern = pattern; - } - static isMultiMatch(pattern) { - return getMatch(pattern, this.multiRegex) - } - static isSingleMatch(pattern) { - return getMatch(pattern, this.singleRegex) - } - search(/*text*/) {} - } - - function getMatch(pattern, exp) { - const matches = pattern.match(exp); - return matches ? matches[1] : null - } - - // Token: 'file - - class ExactMatch extends BaseMatch { - constructor(pattern) { - super(pattern); - } - static get type() { - return 'exact' - } - static get multiRegex() { - return /^="(.*)"$/ - } - static get singleRegex() { - return /^=(.*)$/ - } - search(text) { - const isMatch = text === this.pattern; - - return { - isMatch, - score: isMatch ? 0 : 1, - indices: [0, this.pattern.length - 1] - } - } - } - - // Token: !fire - - class InverseExactMatch extends BaseMatch { - constructor(pattern) { - super(pattern); - } - static get type() { - return 'inverse-exact' - } - static get multiRegex() { - return /^!"(.*)"$/ - } - static get singleRegex() { - return /^!(.*)$/ - } - search(text) { - const index = text.indexOf(this.pattern); - const isMatch = index === -1; - - return { - isMatch, - score: isMatch ? 0 : 1, - indices: [0, text.length - 1] - } - } - } - - // Token: ^file - - class PrefixExactMatch extends BaseMatch { - constructor(pattern) { - super(pattern); - } - static get type() { - return 'prefix-exact' - } - static get multiRegex() { - return /^\^"(.*)"$/ - } - static get singleRegex() { - return /^\^(.*)$/ - } - search(text) { - const isMatch = text.startsWith(this.pattern); - - return { - isMatch, - score: isMatch ? 0 : 1, - indices: [0, this.pattern.length - 1] - } - } - } - - // Token: !^fire - - class InversePrefixExactMatch extends BaseMatch { - constructor(pattern) { - super(pattern); - } - static get type() { - return 'inverse-prefix-exact' - } - static get multiRegex() { - return /^!\^"(.*)"$/ - } - static get singleRegex() { - return /^!\^(.*)$/ - } - search(text) { - const isMatch = !text.startsWith(this.pattern); - - return { - isMatch, - score: isMatch ? 0 : 1, - indices: [0, text.length - 1] - } - } - } - - // Token: .file$ - - class SuffixExactMatch extends BaseMatch { - constructor(pattern) { - super(pattern); - } - static get type() { - return 'suffix-exact' - } - static get multiRegex() { - return /^"(.*)"\$$/ - } - static get singleRegex() { - return /^(.*)\$$/ - } - search(text) { - const isMatch = text.endsWith(this.pattern); - - return { - isMatch, - score: isMatch ? 0 : 1, - indices: [text.length - this.pattern.length, text.length - 1] - } - } - } - - // Token: !.file$ - - class InverseSuffixExactMatch extends BaseMatch { - constructor(pattern) { - super(pattern); - } - static get type() { - return 'inverse-suffix-exact' - } - static get multiRegex() { - return /^!"(.*)"\$$/ - } - static get singleRegex() { - return /^!(.*)\$$/ - } - search(text) { - const isMatch = !text.endsWith(this.pattern); - return { - isMatch, - score: isMatch ? 0 : 1, - indices: [0, text.length - 1] - } - } - } - - class FuzzyMatch extends BaseMatch { - constructor( - pattern, - { - location = Config.location, - threshold = Config.threshold, - distance = Config.distance, - includeMatches = Config.includeMatches, - findAllMatches = Config.findAllMatches, - minMatchCharLength = Config.minMatchCharLength, - isCaseSensitive = Config.isCaseSensitive, - ignoreLocation = Config.ignoreLocation - } = {} - ) { - super(pattern); - this._bitapSearch = new BitapSearch(pattern, { - location, - threshold, - distance, - includeMatches, - findAllMatches, - minMatchCharLength, - isCaseSensitive, - ignoreLocation - }); - } - static get type() { - return 'fuzzy' - } - static get multiRegex() { - return /^"(.*)"$/ - } - static get singleRegex() { - return /^(.*)$/ - } - search(text) { - return this._bitapSearch.searchIn(text) - } - } - - // Token: 'file - - class IncludeMatch extends BaseMatch { - constructor(pattern) { - super(pattern); - } - static get type() { - return 'include' - } - static get multiRegex() { - return /^'"(.*)"$/ - } - static get singleRegex() { - return /^'(.*)$/ - } - search(text) { - let location = 0; - let index; - - const indices = []; - const patternLen = this.pattern.length; - - // Get all exact matches - while ((index = text.indexOf(this.pattern, location)) > -1) { - location = index + patternLen; - indices.push([index, location - 1]); - } - - const isMatch = !!indices.length; - - return { - isMatch, - score: isMatch ? 0 : 1, - indices - } - } - } - - // ❗Order is important. DO NOT CHANGE. - const searchers = [ - ExactMatch, - IncludeMatch, - PrefixExactMatch, - InversePrefixExactMatch, - InverseSuffixExactMatch, - SuffixExactMatch, - InverseExactMatch, - FuzzyMatch - ]; - - const searchersLen = searchers.length; - - // Regex to split by spaces, but keep anything in quotes together - const SPACE_RE = / +(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)/; - const OR_TOKEN = '|'; - - // Return a 2D array representation of the query, for simpler parsing. - // Example: - // "^core go$ | rb$ | py$ xy$" => [["^core", "go$"], ["rb$"], ["py$", "xy$"]] - function parseQuery(pattern, options = {}) { - return pattern.split(OR_TOKEN).map((item) => { - let query = item - .trim() - .split(SPACE_RE) - .filter((item) => item && !!item.trim()); - - let results = []; - for (let i = 0, len = query.length; i < len; i += 1) { - const queryItem = query[i]; - - // 1. Handle multiple query match (i.e, once that are quoted, like `"hello world"`) - let found = false; - let idx = -1; - while (!found && ++idx < searchersLen) { - const searcher = searchers[idx]; - let token = searcher.isMultiMatch(queryItem); - if (token) { - results.push(new searcher(token, options)); - found = true; - } - } - - if (found) { - continue - } - - // 2. Handle single query matches (i.e, once that are *not* quoted) - idx = -1; - while (++idx < searchersLen) { - const searcher = searchers[idx]; - let token = searcher.isSingleMatch(queryItem); - if (token) { - results.push(new searcher(token, options)); - break - } - } - } - - return results - }) - } - - // These extended matchers can return an array of matches, as opposed - // to a singl match - const MultiMatchSet = new Set([FuzzyMatch.type, IncludeMatch.type]); - - /** - * Command-like searching - * ====================== - * - * Given multiple search terms delimited by spaces.e.g. `^jscript .python$ ruby !java`, - * search in a given text. - * - * Search syntax: - * - * | Token | Match type | Description | - * | ----------- | -------------------------- | -------------------------------------- | - * | `jscript` | fuzzy-match | Items that fuzzy match `jscript` | - * | `=scheme` | exact-match | Items that are `scheme` | - * | `'python` | include-match | Items that include `python` | - * | `!ruby` | inverse-exact-match | Items that do not include `ruby` | - * | `^java` | prefix-exact-match | Items that start with `java` | - * | `!^earlang` | inverse-prefix-exact-match | Items that do not start with `earlang` | - * | `.js$` | suffix-exact-match | Items that end with `.js` | - * | `!.go$` | inverse-suffix-exact-match | Items that do not end with `.go` | - * - * A single pipe character acts as an OR operator. For example, the following - * query matches entries that start with `core` and end with either`go`, `rb`, - * or`py`. - * - * ``` - * ^core go$ | rb$ | py$ - * ``` - */ - class ExtendedSearch { - constructor( - pattern, - { - isCaseSensitive = Config.isCaseSensitive, - includeMatches = Config.includeMatches, - minMatchCharLength = Config.minMatchCharLength, - ignoreLocation = Config.ignoreLocation, - findAllMatches = Config.findAllMatches, - location = Config.location, - threshold = Config.threshold, - distance = Config.distance - } = {} - ) { - this.query = null; - this.options = { - isCaseSensitive, - includeMatches, - minMatchCharLength, - findAllMatches, - ignoreLocation, - location, - threshold, - distance - }; - - this.pattern = isCaseSensitive ? pattern : pattern.toLowerCase(); - this.query = parseQuery(this.pattern, this.options); - } - - static condition(_, options) { - return options.useExtendedSearch - } - - searchIn(text) { - const query = this.query; - - if (!query) { - return { - isMatch: false, - score: 1 - } - } - - const { includeMatches, isCaseSensitive } = this.options; - - text = isCaseSensitive ? text : text.toLowerCase(); - - let numMatches = 0; - let allIndices = []; - let totalScore = 0; - - // ORs - for (let i = 0, qLen = query.length; i < qLen; i += 1) { - const searchers = query[i]; - - // Reset indices - allIndices.length = 0; - numMatches = 0; - - // ANDs - for (let j = 0, pLen = searchers.length; j < pLen; j += 1) { - const searcher = searchers[j]; - const { isMatch, indices, score } = searcher.search(text); - - if (isMatch) { - numMatches += 1; - totalScore += score; - if (includeMatches) { - const type = searcher.constructor.type; - if (MultiMatchSet.has(type)) { - allIndices = [...allIndices, ...indices]; - } else { - allIndices.push(indices); - } - } - } else { - totalScore = 0; - numMatches = 0; - allIndices.length = 0; - break - } - } - - // OR condition, so if TRUE, return - if (numMatches) { - let result = { - isMatch: true, - score: totalScore / numMatches - }; - - if (includeMatches) { - result.indices = allIndices; - } - - return result - } - } - - // Nothing was matched - return { - isMatch: false, - score: 1 - } - } - } - - const registeredSearchers = []; - - function register(...args) { - registeredSearchers.push(...args); - } - - function createSearcher(pattern, options) { - for (let i = 0, len = registeredSearchers.length; i < len; i += 1) { - let searcherClass = registeredSearchers[i]; - if (searcherClass.condition(pattern, options)) { - return new searcherClass(pattern, options) - } - } - - return new BitapSearch(pattern, options) - } - - const LogicalOperator = { - AND: '$and', - OR: '$or' - }; - - const KeyType = { - PATH: '$path', - PATTERN: '$val' - }; - - const isExpression = (query) => - !!(query[LogicalOperator.AND] || query[LogicalOperator.OR]); - - const isPath = (query) => !!query[KeyType.PATH]; - - const isLeaf = (query) => - !isArray(query) && isObject(query) && !isExpression(query); - - const convertToExplicit = (query) => ({ - [LogicalOperator.AND]: Object.keys(query).map((key) => ({ - [key]: query[key] - })) - }); - - // When `auto` is `true`, the parse function will infer and initialize and add - // the appropriate `Searcher` instance - function parse$3(query, options, { auto = true } = {}) { - const next = (query) => { - let keys = Object.keys(query); - - const isQueryPath = isPath(query); - - if (!isQueryPath && keys.length > 1 && !isExpression(query)) { - return next(convertToExplicit(query)) - } - - if (isLeaf(query)) { - const key = isQueryPath ? query[KeyType.PATH] : keys[0]; - - const pattern = isQueryPath ? query[KeyType.PATTERN] : query[key]; - - if (!isString(pattern)) { - throw new Error(LOGICAL_SEARCH_INVALID_QUERY_FOR_KEY(key)) - } - - const obj = { - keyId: createKeyId(key), - pattern - }; - - if (auto) { - obj.searcher = createSearcher(pattern, options); - } - - return obj - } - - let node = { - children: [], - operator: keys[0] - }; - - keys.forEach((key) => { - const value = query[key]; - - if (isArray(value)) { - value.forEach((item) => { - node.children.push(next(item)); - }); - } - }); - - return node - }; - - if (!isExpression(query)) { - query = convertToExplicit(query); - } - - return next(query) - } - - // Practical scoring function - function computeScore( - results, - { ignoreFieldNorm = Config.ignoreFieldNorm } - ) { - results.forEach((result) => { - let totalScore = 1; - - result.matches.forEach(({ key, norm, score }) => { - const weight = key ? key.weight : null; - - totalScore *= Math.pow( - score === 0 && weight ? Number.EPSILON : score, - (weight || 1) * (ignoreFieldNorm ? 1 : norm) - ); - }); - - result.score = totalScore; - }); - } - - function transformMatches(result, data) { - const matches = result.matches; - data.matches = []; - - if (!isDefined(matches)) { - return - } - - matches.forEach((match) => { - if (!isDefined(match.indices) || !match.indices.length) { - return - } - - const { indices, value } = match; - - let obj = { - indices, - value - }; - - if (match.key) { - obj.key = match.key.src; - } - - if (match.idx > -1) { - obj.refIndex = match.idx; - } - - data.matches.push(obj); - }); - } - - function transformScore(result, data) { - data.score = result.score; - } - - function format$3( - results, - docs, - { - includeMatches = Config.includeMatches, - includeScore = Config.includeScore - } = {} - ) { - const transformers = []; - - if (includeMatches) transformers.push(transformMatches); - if (includeScore) transformers.push(transformScore); - - return results.map((result) => { - const { idx } = result; - - const data = { - item: docs[idx], - refIndex: idx - }; - - if (transformers.length) { - transformers.forEach((transformer) => { - transformer(result, data); - }); - } - - return data - }) - } - - class Fuse { - constructor(docs, options = {}, index) { - this.options = { ...Config, ...options }; - - if ( - this.options.useExtendedSearch && - !true - ) { - throw new Error(EXTENDED_SEARCH_UNAVAILABLE) - } - - this._keyStore = new KeyStore(this.options.keys); - - this.setCollection(docs, index); - } - - setCollection(docs, index) { - this._docs = docs; - - if (index && !(index instanceof FuseIndex)) { - throw new Error(INCORRECT_INDEX_TYPE) - } - - this._myIndex = - index || - createIndex(this.options.keys, this._docs, { - getFn: this.options.getFn, - fieldNormWeight: this.options.fieldNormWeight - }); - } - - add(doc) { - if (!isDefined(doc)) { - return - } - - this._docs.push(doc); - this._myIndex.add(doc); - } - - remove(predicate = (/* doc, idx */) => false) { - const results = []; - - for (let i = 0, len = this._docs.length; i < len; i += 1) { - const doc = this._docs[i]; - if (predicate(doc, i)) { - this.removeAt(i); - i -= 1; - len -= 1; - - results.push(doc); - } - } - - return results - } - - removeAt(idx) { - this._docs.splice(idx, 1); - this._myIndex.removeAt(idx); - } - - getIndex() { - return this._myIndex - } - - search(query, { limit = -1 } = {}) { - const { - includeMatches, - includeScore, - shouldSort, - sortFn, - ignoreFieldNorm - } = this.options; - - let results = isString(query) - ? isString(this._docs[0]) - ? this._searchStringList(query) - : this._searchObjectList(query) - : this._searchLogical(query); - - computeScore(results, { ignoreFieldNorm }); - - if (shouldSort) { - results.sort(sortFn); - } - - if (isNumber(limit) && limit > -1) { - results = results.slice(0, limit); - } - - return format$3(results, this._docs, { - includeMatches, - includeScore - }) - } - - _searchStringList(query) { - const searcher = createSearcher(query, this.options); - const { records } = this._myIndex; - const results = []; - - // Iterate over every string in the index - records.forEach(({ v: text, i: idx, n: norm }) => { - if (!isDefined(text)) { - return - } - - const { isMatch, score, indices } = searcher.searchIn(text); - - if (isMatch) { - results.push({ - item: text, - idx, - matches: [{ score, value: text, norm, indices }] - }); - } - }); - - return results - } - - _searchLogical(query) { - - const expression = parse$3(query, this.options); - - const evaluate = (node, item, idx) => { - if (!node.children) { - const { keyId, searcher } = node; - - const matches = this._findMatches({ - key: this._keyStore.get(keyId), - value: this._myIndex.getValueForItemAtKeyId(item, keyId), - searcher - }); - - if (matches && matches.length) { - return [ - { - idx, - item, - matches - } - ] - } - - return [] - } - - const res = []; - for (let i = 0, len = node.children.length; i < len; i += 1) { - const child = node.children[i]; - const result = evaluate(child, item, idx); - if (result.length) { - res.push(...result); - } else if (node.operator === LogicalOperator.AND) { - return [] - } - } - return res - }; - - const records = this._myIndex.records; - const resultMap = {}; - const results = []; - - records.forEach(({ $: item, i: idx }) => { - if (isDefined(item)) { - let expResults = evaluate(expression, item, idx); - - if (expResults.length) { - // Dedupe when adding - if (!resultMap[idx]) { - resultMap[idx] = { idx, item, matches: [] }; - results.push(resultMap[idx]); - } - expResults.forEach(({ matches }) => { - resultMap[idx].matches.push(...matches); - }); - } - } - }); - - return results - } - - _searchObjectList(query) { - const searcher = createSearcher(query, this.options); - const { keys, records } = this._myIndex; - const results = []; - - // List is Array - records.forEach(({ $: item, i: idx }) => { - if (!isDefined(item)) { - return - } - - let matches = []; - - // Iterate over every key (i.e, path), and fetch the value at that key - keys.forEach((key, keyIndex) => { - matches.push( - ...this._findMatches({ - key, - value: item[keyIndex], - searcher - }) - ); - }); - - if (matches.length) { - results.push({ - idx, - item, - matches - }); - } - }); - - return results - } - _findMatches({ key, value, searcher }) { - if (!isDefined(value)) { - return [] - } - - let matches = []; - - if (isArray(value)) { - value.forEach(({ v: text, i: idx, n: norm }) => { - if (!isDefined(text)) { - return - } - - const { isMatch, score, indices } = searcher.searchIn(text); - - if (isMatch) { - matches.push({ - score, - key, - value: text, - idx, - norm, - indices - }); - } - }); - } else { - const { v: text, n: norm } = value; - - const { isMatch, score, indices } = searcher.searchIn(text); - - if (isMatch) { - matches.push({ score, key, value: text, norm, indices }); - } - } - - return matches - } - } - - Fuse.version = '6.6.2'; - Fuse.createIndex = createIndex; - Fuse.parseIndex = parseIndex; - Fuse.config = Config; - - { - Fuse.parseQuery = parse$3; - } - - { - register(ExtendedSearch); - } - - var electron = util.isElectron ? /*#__PURE__*/new gun$1({ - peers: ['http://localhost:8768/gun'], - file: 'State.electron', - multicast: false, - localStorage: false - }).get('state') : null; - - var key; - var myName; - var latestChatLink; - var onlineTimeout; - var ourActivity; - var noFollows; - var noFollowers; - var searchIndex; - var initCalled; - var searchableItems = {}; - var getExtendedFollowsCalled = /*#__PURE__*/new Map(); - var DEFAULT_FOLLOW = 'hyECQHwSo7fgr2MVfPyakvayPeixxsaAWVtZ-vbaiSc.TXIp8MnCtrnW6n2MrYquWPcc-DTmZzMBmc2yaGv9gIU'; - var DEFAULT_SETTINGS = { - electron: { - openAtLogin: true, - minimizeOnClose: true - }, - local: { - enableWebtorrent: !util.isMobile, - enablePublicPeerDiscovery: true, - autoplayWebtorrent: true, - maxConnectedPeers: util.isElectron ? 2 : 1 - } - }; - /** - * User session management utilities. - */ - var session = { - /** - * Log in with a key from localStorage. - * - * If no key is found and options.autologin is not false, a new user will be created. - * - * If options.autofollow is not false, the default follow will be added. - * @param options - */init: function init(options) { - var _this = this; - if (options === void 0) { - options = {}; - } - if (initCalled) { - return; - } - initCalled = true; - var localStorageKey = localStorage.getItem('chatKeyPair'); - if (localStorageKey) { - this.login(JSON.parse(localStorageKey)); - } else if (options.autologin !== false) { - this.loginAsNewUser(options); - } else { - this.clearIndexedDB(); - } - setTimeout(function () { - local$1().get('block').map(function () { - _this.updateSearchIndex(); - }); - _this.updateSearchIndex(); - }); - setInterval(function () { - if (_this.taskQueue.length) { - //console.log('this.taskQueue', this.taskQueue.length); - var t = _this.taskQueue.shift(); - t && t(); - } - }, 10); - }, - DEFAULT_SETTINGS: DEFAULT_SETTINGS, - DEFAULT_FOLLOW: DEFAULT_FOLLOW, - taskQueue: [], - updateSearchIndex: /*#__PURE__*/_.throttle(function () { - var options = { - keys: ['name'], - includeScore: true, - includeMatches: true, - threshold: 0.3 - }; - var values = Object.values(_.omit(searchableItems, Object.keys(blockedUsers$1()))); - searchIndex = new Fuse(values, options); - local$1().get('searchIndexUpdated').put(true); - }, 2000, { - leading: true - }), - saveSearchResult: /*#__PURE__*/_.throttle(function (k) { - local$1().get('contacts').get(k).put({ - followDistance: searchableItems[k].followDistance, - followerCount: searchableItems[k].followers.size - }); - }, 1000, { - leading: true - }), - addFollow: function addFollow(callback, k, followDistance, follower) { - if (searchableItems[k]) { - if (searchableItems[k].followDistance > followDistance) { - searchableItems[k].followDistance = followDistance; - } - follower && searchableItems[k].followers.add(follower); - } else { - searchableItems[k] = { - key: k, - followDistance: followDistance, - followers: new Set(follower && [follower]) - }; - this.taskQueue.push(function () { - publicState(k).get('profile').get('name').on(function (name) { - searchableItems[k].name = name; - local$1().get('contacts').get(k).get('name').put(name); - callback && callback(k, searchableItems[k]); - }); - }); - } - this.saveSearchResult(k); - callback && callback(k, searchableItems[k]); - this.updateSearchIndex(); - this.updateNoFollows(); - this.updateNoFollowers(); - }, - removeFollow: function removeFollow(k, followDistance, follower) { - if (followDistance === 1) { - local$1().get('contacts').get(k).put(false); - local$1().get('groups').get('follows').get(k).put(false); - if (searchableItems[k]) { - searchableItems[k].followers["delete"](follower); - this.updateNoFollows(); - this.updateNoFollowers(); - } - } - console.log('removeFollow', k, followDistance, follower); - if (searchableItems[k] && searchableItems[k].followers.size === 0) { - delete searchableItems[k]; - local$1().get('contacts').get(k).put(false); - local$1().get('groups').get('everyone').get(k).put(false); - } - }, - getExtendedFollows: function getExtendedFollows(callback, k, maxDepth, currentDepth) { - var _this2 = this; - if (k === void 0) { - k = key.pub; - } - if (maxDepth === void 0) { - maxDepth = 3; - } - if (currentDepth === void 0) { - currentDepth = 1; - } - var called = getExtendedFollowsCalled.get(k); - if (called && called <= currentDepth) { - return; - } - getExtendedFollowsCalled.set(k, currentDepth); - this.addFollow(callback, k, currentDepth - 1); - publicState(k).get('follow').map().on(function (isFollowing, followedKey) { - if (isFollowing) { - _this2.addFollow(callback, followedKey, currentDepth, k); - if (currentDepth < maxDepth) { - _this2.taskQueue.push(function () { - return _this2.getExtendedFollows(callback, followedKey, maxDepth, currentDepth + 1); - }); - } - } else { - _this2.removeFollow(followedKey, currentDepth, k); - } - }); - return searchableItems; - }, - updateNoFollows: /*#__PURE__*/_.throttle(function () { - var v = Object.keys(searchableItems).length <= 1; - if (v !== noFollows) { - noFollows = v; - local$1().get('noFollows').put(noFollows); - } - }, 1000, { - leading: true - }), - updateNoFollowers: /*#__PURE__*/_.throttle(function () { - var v = !(searchableItems[key.pub] && searchableItems[key.pub].followers.size > 0); - if (v !== noFollowers) { - noFollowers = v; - local$1().get('noFollowers').put(noFollowers); - } - }, 1000, { - leading: true - }), - getSearchIndex: function getSearchIndex() { - return searchIndex; - }, - setOurOnlineStatus: function setOurOnlineStatus() { - var activeRoute = window.location.hash; - Channel.setActivity(ourActivity = 'active'); - var setActive = _.debounce(function () { - var chatId = activeRoute && activeRoute.replace('#/profile/', '').replace('#/chat/', ''); - var chat = privateState(chatId); - if (chat && !ourActivity) { - chat.setMyMsgsLastSeenTime(); - } - Channel.setActivity(ourActivity = 'active'); - clearTimeout(onlineTimeout); - onlineTimeout = setTimeout(function () { - return Channel.setActivity(ourActivity = 'online'); - }, 30000); - }, 1000); - document.addEventListener("touchmove", setActive); - document.addEventListener("mousemove", setActive); - document.addEventListener("keypress", setActive); - document.addEventListener("visibilitychange", function () { - if (document.visibilityState === 'visible') { - Channel.setActivity(ourActivity = 'active'); - var chatId = location.pathname.slice(1).replace('chat/', ''); - var chat = activeRoute && privateState(chatId); - if (chat) { - chat.setMyMsgsLastSeenTime(); - notifications.changeChatUnseenCount(chatId, 0); - } - } else { - Channel.setActivity(ourActivity = 'online'); - } - }); - setActive(); - window.addEventListener("beforeunload", function () { - Channel.setActivity(ourActivity = null); - }); - }, - updateGroups: function updateGroups() { - var _this3 = this; - this.getExtendedFollows(function (k, info) { - if (info.followDistance <= 1) { - local$1().get('groups').get('follows').get(k).put(true); - } - local$1().get('groups').get('everyone').get(k).put(true); - if (k === _this3.getPubKey()) { - _this3.updateNoFollowers(); - } - }); - }, - /** - * Log in with a private key. - * @param key - */login: function login(k) { - var _this4 = this; - var shouldRefresh = !!key; - key = k; - localStorage.setItem('chatKeyPair', JSON.stringify(k)); - publicState().auth(key); - publicState().put({ - epub: key.epub - }); - publicState().get('likes').put({ - a: null - }); // gun bug? - publicState().get('msgs').put({ - a: null - }); // gun bug? - publicState().get('replies').put({ - a: null - }); // gun bug? - notifications.subscribeToWebPush(); - notifications.getWebPushSubscriptions(); - notifications.subscribeToIrisNotifications(); - Channel.getMyChatLinks(undefined, function (chatLink) { - local$1().get('chatLinks').get(chatLink.id).put(chatLink.url); - latestChatLink = chatLink.url; - }); - this.setOurOnlineStatus(); - Channel.getChannels(function (c) { - return _this4.addChannel(c); - }); - publicState().get('profile').get('name').on(function (name) { - if (name && typeof name === 'string') { - myName = name; - } - }); - notifications.init(); - local$1().get('loggedIn').put(true); - local$1().get('settings').once().then(function (settings) { - if (!settings) { - local$1().get('settings').put(DEFAULT_SETTINGS.local); - } else if (settings.enableWebtorrent === undefined || settings.autoplayWebtorrent === undefined) { - local$1().get('settings').get('enableWebtorrent').put(DEFAULT_SETTINGS.local.enableWebtorrent); - local$1().get('settings').get('autoplayWebtorrent').put(DEFAULT_SETTINGS.local.autoplayWebtorrent); - } - }); - publicState().get('block').map().on(function (isBlocked, user) { - local$1().get('block').get(user).put(isBlocked); - if (isBlocked) { - delete searchableItems[user]; - } - }); - this.updateGroups(); - if (shouldRefresh) { - location.reload(); - } - if (electron) { - electron.get('settings').on(function (electron) { - local$1().get('settings').get('electron').put(electron); - }); - electron.get('user').put(key.pub); - } - local$1().get('filters').get('group').once().then(function (v) { - if (!v) { - local$1().get('filters').get('group').put('follows'); - } - }); - }, - /** - * Create a new user account and log in. - * @param options {Object} - Options for the new account. - * @returns {Promise<*>} - */loginAsNewUser: function loginAsNewUser(options) { - var _this5 = this; - if (options === void 0) { - options = {}; - } - var name = options.name || util.generateName(); - console.log('loginAsNewUser name', name); - return gun$1.SEA.pair().then(function (k) { - _this5.login(k); - publicState().get('profile').put({ - a: null - }); - publicState().get('profile').get('name').put(name); - local$1().get('filters').put({ - a: null - }); - local$1().get('filters').get('group').put('follows'); - Channel.createChatLink().then(function (l) { - return latestChatLink = l; - }); - setTimeout(function () { - if (options.autofollow !== false) { - console.log('autofollowing', DEFAULT_FOLLOW); - publicState().get('follow').get(DEFAULT_FOLLOW).put(true); - } - }, 1000); // maybe wait for login return instead - }); - }, - /** - * Log out the current user. - * @returns {Promise} - */logOut: function logOut() { - var _this6 = this; - return _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() { - var reg, _reg$active, sub, hash; - return _regeneratorRuntime().wrap(function _callee$(_context) { - while (1) { - switch (_context.prev = _context.next) { - case 0: - if (electron) { - electron.get('user').put(null); - } - // TODO: remove subscription from your channels - if (!navigator.serviceWorker) { - _context.next = 16; - break; - } - _context.next = 4; - return navigator.serviceWorker.getRegistration(); - case 4: - reg = _context.sent; - if (!(reg && reg.pushManager)) { - _context.next = 16; - break; - } - (_reg$active = reg.active) == null ? void 0 : _reg$active.postMessage({ - key: null - }); - _context.next = 9; - return reg.pushManager.getSubscription(); - case 9: - sub = _context.sent; - if (!sub) { - _context.next = 16; - break; - } - _context.next = 13; - return util.getHash(JSON.stringify(sub)); - case 13: - hash = _context.sent; - notifications.removeSubscription(hash); - sub.unsubscribe && sub.unsubscribe(); - case 16: - _this6.clearIndexedDB(); - localStorage.clear(); // TODO clear only iris data - localforage.clear().then(function () { - window.location.hash = ''; - window.location.href = '/'; - location.reload(); - }); - case 19: - case "end": - return _context.stop(); - } - } - }, _callee); - }))(); - }, - clearIndexedDB: function clearIndexedDB() { - return new Promise(function (resolve) { - var r1 = window.indexedDB.deleteDatabase('local()'); - var r2 = window.indexedDB.deleteDatabase('radata'); - var r1done = false; - var r2done = false; - var check = function check() { - r1done && r2done && resolve(undefined); - }; - r1.onerror = r2.onerror = function (e) { - return console.error(e); - }; - //r1.onblocked = r2.onblocked = e => console.error('blocked', e); - r1.onsuccess = function () { - r1done = true; - check(); - }; - r2.onsuccess = function () { - r2done = true; - check(); - }; - }); - }, - getMyChatLink: function getMyChatLink() { - return latestChatLink || util.getProfileLink(key.pub); - }, - /** - * Get the keypair of the logged in user. - * @returns {*} - */getKey: function getKey() { - return key; - }, - /** - * Get the public key of the logged in user. - * @returns {*} - */getPubKey: function getPubKey() { - return key && key.pub; - }, - /** - * Get the name of the logged in user. - * @returns {*} - */getMyName: function getMyName() { - return myName; - }, - myPeerUrl: function myPeerUrl(ip) { - return "http://" + ip + ":8767/gun"; - }, - shareMyPeerUrl: function shareMyPeerUrl(channel) { - var _this7 = this; - return _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2() { - var myIp; - return _regeneratorRuntime().wrap(function _callee2$(_context2) { - while (1) { - switch (_context2.prev = _context2.next) { - case 0: - _context2.next = 2; - return local$1().get('settings').get('electron').get('publicIp').once(); - case 2: - myIp = _context2.sent; - myIp && channel.put && channel.put('my_peer', _this7.myPeerUrl(myIp)); - case 4: - case "end": - return _context2.stop(); - } - } - }, _callee2); - }))(); - }, - newChannel: function newChannel(pub, chatLink) { - if (!pub || this.channelIds.has(pub)) { - return; - } - var chat = privateState(pub, chatLink); - this.addChannel(chat); - return chat; - }, - addChannel: function addChannel(chat) { - var _this8 = this; - this.taskQueue.push(function () { - var pub = chat.getId(); - if (_this8.channelIds.has(pub)) { - return; - } - _this8.channelIds.add(pub); - var chatNode = local$1().get('channels').get(pub); - chatNode.get('latestTime').on(function (t) { - if (t && (!chat.latestTime || t > chat.latestTime)) { - chat.latestTime = t; - } - }); - chatNode.get('theirMsgsLastSeenTime').on(function (t) { - if (!t) { - return; - } - var d = new Date(t); - if (!chat.theirMsgsLastSeenDate || chat.theirMsgsLastSeenDate < d) { - chat.theirMsgsLastSeenDate = d; - } - }); - chat.getLatestMsg && chat.getLatestMsg(function (latest, info) { - _this8.processMessage(pub, latest, info); - }); - notifications.changeChatUnseenCount(pub, 0); - chat.notificationSetting = 'all'; - chat.onMy('notificationSetting', function (val) { - chat.notificationSetting = val; - }); - //$(".chat-list").append(el); - chat.theirMsgsLastSeenTime = ''; - chat.getTheirMsgsLastSeenTime(function (time) { - if (chat && time && time >= chat.theirMsgsLastSeenTime) { - chat.theirMsgsLastSeenTime = time; - chatNode.get('theirMsgsLastSeenTime').put(time); - } - }); - chat.getMyMsgsLastSeenTime(function (time) { - chat.myLastSeenTime = new Date(time); - if (chat.latest && chat.myLastSeenTime >= chat.latest.time) { - notifications.changeChatUnseenCount(pub, 0); - } - }); - chat.isTyping = false; - chat.getTyping(function (isTyping) { - chat.isTyping = isTyping; - local$1().get('channels').get(pub).get('isTyping').put(isTyping); - }); - chat.online = {}; - Channel.getActivity(pub, function (activity) { - if (chat) { - chatNode.put({ - theirLastActiveTime: activity && activity.lastActive, - activity: activity && activity.isActive && activity.status - }); - chat.activity = activity; - } - }); - if (chat.uuid) { - var isDarkMode = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches; - chat.participantProfiles = {}; - chat.on('name', function (v) { - chat.name = v; - searchableItems[chat.uuid] = { - name: v, - uuid: chat.uuid - }; - local$1().get('channels').get(chat.uuid).get('name').put(v); - }); - chat.on('photo', function (v) { - searchableItems[chat.uuid] = searchableItems[chat.uuid] || {}; - searchableItems[chat.uuid].photo = v; - local$1().get('channels').get(chat.uuid).get('photo').put(v); - }); - chat.on('about', function (v) { - return local$1().get('channels').get(chat.uuid).get('about').put(v); - }); - chat.getParticipants(function (participants) { - delete participants.undefined; // TODO fix where it comes from - if (typeof participants === 'object') { - var keys = Object.keys(participants); - keys.forEach(function (k, i) { - var hue = 360 / Math.max(keys.length, 2) * i; // TODO use css filter brightness - chat.participantProfiles[k] = { - permissions: participants[k], - color: "hsl(" + hue + ", 98%, " + (isDarkMode ? 80 : 33) + "%)" - }; - publicState(k).get('profile').get('name').on(function (name) { - chat.participantProfiles[k].name = name; - }); - }); - } - local$1().get('channels').get(chat.uuid).get('participants').put(participants); - }); - chat.inviteLinks = {}; - chat.getChatLinks({ - callback: function callback(_ref) { - var url = _ref.url, - id = _ref.id; - console.log('got chat link', id, url); - chat.inviteLinks[id] = url; // TODO use State - local$1().get('inviteLinksChanged').put(true); - } - }); - } else { - // TODO do we want this? - publicState(pub).get('profile').get('name').on(function (v) { - return local$1().get('channels').get(pub).get('name').put(v); - }); - } - if (chat.put) { - chat.onTheir('webPushSubscriptions', function (s, k, from) { - if (!Array.isArray(s)) { - return; - } - chat.webPushSubscriptions = chat.webPushSubscriptions || {}; - chat.webPushSubscriptions[from || pub] = s; - }); - var arr = Object.values(notifications.webPushSubscriptions); - setTimeout(function () { - return chat.put('webPushSubscriptions', arr); - }, 5000); - _this8.shareMyPeerUrl(chat); - } - chat.onTheir('call', function (call) { - local$1().get('call').put({ - pub: pub, - call: call - }); - }); - local$1().get('channels').get(pub).put({ - enabled: true - }); - /* Disable private peer discovery, since they're not connecting anyway - if (chat.onTheir) { - chat.onTheir('my_peer', (url, k, from) => { - console.log('Got private peer url', url, 'from', from); - peers.addPeer({url, from}) - }); - } - */ - }); - }, - // TODO: should perhaps be in Channel - processMessage: function processMessage(chatId, msg, info, onClickNotification) { - var chat = privateState(chatId); - chat.messageIds = chat.messageIds || {}; - if (chat.messageIds[msg.time + info.from]) return; - chat.messageIds[msg.time + info.from] = true; - if (info) { - msg = Object.assign(msg, info); - } - if (msg.invite) { - var chatLink = "https://iris.to/?channelId=" + msg.invite.group + "&inviter=" + chatId; - this.newChannel(msg.invite.group, chatLink); - return; - } - msg.selfAuthored = info.selfAuthored; - local$1().get('channels').get(chatId).get('msgs').get(msg.time + (msg.from && msg.from.slice(0, 10))).put(JSON.stringify(msg)); - msg.timeObj = new Date(msg.time); - if (!info.selfAuthored && msg.timeObj > chat.myLastSeenTime) { - if (window.location.hash !== "#/chat/" + chatId || document.visibilityState !== 'visible') { - notifications.changeChatUnseenCount(chatId, 1); - } else if (ourActivity === 'active') { - chat.setMyMsgsLastSeenTime(); - } - } - if (!info.selfAuthored && msg.time > chat.theirMsgsLastSeenTime) { - local$1().get('channels').get(chatId).get('theirMsgsLastSeenTime').put(msg.time); - } - if (!chat.latestTime || msg.time > chat.latestTime) { - local$1().get('channels').get(chatId).put({ - latestTime: msg.time, - latest: { - time: msg.time, - text: msg.text, - selfAuthored: info.selfAuthored - } - }); - } - // TODO: onclickNotification should do route(`/chat/${ pub}`); - notifications.notifyMsg(msg, info, chatId, onClickNotification); - }, - subscribeToMsgs: function subscribeToMsgs(pub) { - var _this9 = this; - var c = privateState(pub); - if (c.subscribed) { - return; - } - c.subscribed = true; - c.getMessages(function (msg, info) { - _this9.processMessage(pub, msg, info); - }); - }, - /** - * Known private channels with other users - */ - channelIds: /*#__PURE__*/new Set() - }; - - /** - * Content-addressed storage - */ - var staticState = { - /** - * Get a file identified by its hash - * @param hash - * @param callback - * @returns {Promise} - */get: function get(hash, callback) { - return new Promise(function (resolve, reject) { - if (!hash) { - reject('No hash provided'); - } - if (typeof hash !== 'string') { - reject('Hash must be a string'); - } - global$2().get('#').get(hash).on(function (v, _k, _x, e) { - if (v) { - e.off(); - callback && callback(v); - resolve(v); - } - }); - }); - }, - /** - * Store a file and return its hash - * @param value - * @returns {Promise} - */put: function put(value) { - return _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() { - var hash; - return _regeneratorRuntime().wrap(function _callee$(_context) { - while (1) { - switch (_context.prev = _context.next) { - case 0: - _context.next = 2; - return util.getHash(value); - case 2: - hash = _context.sent; - global$2().get('#').get(hash).put(value); - return _context.abrupt("return", hash); - case 5: - case "end": - return _context.stop(); - } - } - }, _callee); - }))(); - } - }; - - // eslint-disable-line no-unused-vars - var myKey; - var Key = /*#__PURE__*/function () { - function Key() {} - Key.getActiveKey = /*#__PURE__*/function () { - var _getActiveKey = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(datadir, keyfile, fs) { - var privKeyFile, f, newKey, str, _newKey; - return _regeneratorRuntime().wrap(function _callee$(_context) { - while (1) { - switch (_context.prev = _context.next) { - case 0: - if (datadir === void 0) { - datadir = "."; - } - if (keyfile === void 0) { - keyfile = "iris.key"; - } - if (!myKey) { - _context.next = 4; - break; - } - return _context.abrupt("return", myKey); - case 4: - if (!fs) { - _context.next = 21; - break; - } - privKeyFile = datadir + "/" + keyfile; - if (!fs.existsSync(privKeyFile)) { - _context.next = 11; - break; - } - f = fs.readFileSync(privKeyFile, "utf8"); - myKey = Key.fromString(f); - _context.next = 17; - break; - case 11: - _context.next = 13; - return Key.generate(); - case 13: - newKey = _context.sent; - myKey = myKey || newKey; // eslint-disable-line require-atomic-updates - fs.writeFileSync(privKeyFile, Key.toString(myKey)); - fs.chmodSync(privKeyFile, 400); - case 17: - if (myKey) { - _context.next = 19; - break; - } - throw new Error("loading default key failed - check " + datadir + "/" + keyfile); - case 19: - _context.next = 33; - break; - case 21: - str = window.localStorage.getItem("iris.myKey"); - if (!str) { - _context.next = 26; - break; - } - myKey = Key.fromString(str); - _context.next = 31; - break; - case 26: - _context.next = 28; - return Key.generate(); - case 28: - _newKey = _context.sent; - myKey = myKey || _newKey; // eslint-disable-line require-atomic-updates - window.localStorage.setItem("iris.myKey", Key.toString(myKey)); - case 31: - if (myKey) { - _context.next = 33; - break; - } - throw new Error("loading default key failed - check localStorage iris.myKey"); - case 33: - return _context.abrupt("return", myKey); - case 34: - case "end": - return _context.stop(); - } - } - }, _callee); - })); - function getActiveKey(_x, _x2, _x3) { - return _getActiveKey.apply(this, arguments); - } - return getActiveKey; - }(); - Key.getDefault = function getDefault(datadir, keyfile) { - if (datadir === void 0) { - datadir = "."; - } - if (keyfile === void 0) { - keyfile = "iris.key"; - } - return Key.getActiveKey(datadir, keyfile); - }; - Key.getActivePub = /*#__PURE__*/function () { - var _getActivePub = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(datadir, keyfile) { - var key; - return _regeneratorRuntime().wrap(function _callee2$(_context2) { - while (1) { - switch (_context2.prev = _context2.next) { - case 0: - if (datadir === void 0) { - datadir = "."; - } - if (keyfile === void 0) { - keyfile = "iris.key"; - } - _context2.next = 4; - return Key.getActiveKey(datadir, keyfile); - case 4: - key = _context2.sent; - return _context2.abrupt("return", key.pub); - case 6: - case "end": - return _context2.stop(); - } - } - }, _callee2); - })); - function getActivePub(_x4, _x5) { - return _getActivePub.apply(this, arguments); - } - return getActivePub; - }(); - Key.setActiveKey = function setActiveKey(key, save, datadir, keyfile, fs) { - if (save === void 0) { - save = true; - } - if (datadir === void 0) { - datadir = "."; - } - if (keyfile === void 0) { - keyfile = "iris.key"; - } - myKey = key; - if (!save) return; - if (util.isNode) { - var privKeyFile = datadir + "/" + keyfile; - fs.writeFileSync(privKeyFile, Key.toString(myKey)); - fs.chmodSync(privKeyFile, 400); - } else { - window.localStorage.setItem("iris.myKey", Key.toString(myKey)); - } - }; - Key.toString = function toString(key) { - return JSON.stringify(key); - }; - Key.getId = function getId(key) { - if (!(key && key.pub)) { - throw new Error("missing param"); - } - return key.pub; // hack until GUN supports lookups by keyID - //return util.getHash(key.pub); - }; - Key.fromString = function fromString(str) { - return JSON.parse(str); - }; - Key.generate = function generate() { - return gun$1.SEA.pair(); - }; - Key.sign = /*#__PURE__*/function () { - var _sign = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3(msg, pair) { - var sig; - return _regeneratorRuntime().wrap(function _callee3$(_context3) { - while (1) { - switch (_context3.prev = _context3.next) { - case 0: - _context3.next = 2; - return gun$1.SEA.sign(msg, pair); - case 2: - sig = _context3.sent; - return _context3.abrupt("return", "a" + sig); - case 4: - case "end": - return _context3.stop(); - } - } - }, _callee3); - })); - function sign(_x6, _x7) { - return _sign.apply(this, arguments); - } - return sign; - }(); - Key.verify = function verify(msg, pubKey) { - return gun$1.SEA.verify(msg.slice(1), pubKey); - }; - return Key; - }(); - - var errorMsg = "Invalid message:"; - var ValidationError = /*#__PURE__*/function (_Error) { - _inheritsLoose(ValidationError, _Error); - function ValidationError() { - return _Error.apply(this, arguments) || this; - } - return ValidationError; - }( /*#__PURE__*/_wrapNativeSuper(Error)); /** - * Signed message object. Your friends can index and relay your messages, while others can still verify that they were signed by you. - * - * Fields: signedData, signer (public key) and signature. - * - * signedData has an author, signer, type, time and optionally other fields. - * - * signature covers the utf8 string representation of signedData. Since messages are digitally signed, users only need to care about the message signer and not who relayed it or whose index it was found from. - * - * signer is the entity that verified its origin. In other words: message author and signer can be different entities, and only the signer needs to use Iris. - * - * For example, a crawler can import and sign other people's messages from Twitter. Only the users who trust the crawler will see the messages. - * - * Constructor: creates a message from the param obj.signedData that must contain at least the mandatory fields: author, type and time. - * @param obj - * - * @example - * https://github.com/irislib/iris-lib/blob/master/__tests__/SignedMessage.js - * - * Verification message: - * { - * signedData: { - * author: {name:'Alice', key:'ABCD1234'}, - * recipient: { - * name: 'Bob', - * email: ['bob@example.com', 'bob.saget@example.com'], - * bitcoin: '1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa' - * }, - * type: 'verification' - * }, - * signer: 'ABCD1234', - * signature: '1234ABCD' - * } - */ - var SignedMessage = /*#__PURE__*/function () { - function SignedMessage(obj) { - this.signedData = obj.signedData; - this.pubKey = obj.pubKey; - if (obj.sig) { - if (typeof obj.sig !== "string") { - throw new ValidationError("SignedMessage signature must be a string"); - } - this.sig = obj.sig; - this.getHash(); - } - this._validate(); - } - SignedMessage._getArray = function _getArray(authorOrRecipient) { - var arr = []; - var keys = Object.keys(authorOrRecipient); - for (var i = 0; i < keys.length; i++) { - var type = keys[i]; - var value = authorOrRecipient[keys[i]]; - if (typeof value === "string") { - arr.push(new Attribute(type, value)); - } else { - // array - for (var j = 0; j < value.length; j++) { - var elementValue = value[j]; - arr.push(new Attribute(type, elementValue)); - } - } - } - return arr; - }; - SignedMessage._getIterable = function _getIterable(authorOrRecipient) { - var _ref; - return _ref = {}, _ref[Symbol.iterator] = /*#__PURE__*/_regeneratorRuntime().mark(function _callee() { - var keys, i, type, value, j, elementValue; - return _regeneratorRuntime().wrap(function _callee$(_context) { - while (1) { - switch (_context.prev = _context.next) { - case 0: - keys = Object.keys(authorOrRecipient); - i = 0; - case 2: - if (!(i < keys.length)) { - _context.next = 21; - break; - } - type = keys[i]; - value = authorOrRecipient[keys[i]]; - if (!(typeof value === "string")) { - _context.next = 10; - break; - } - _context.next = 8; - return new Attribute(type, value); - case 8: - _context.next = 18; - break; - case 10: - j = 0; - case 11: - if (!(j < value.length)) { - _context.next = 18; - break; - } - elementValue = value[j]; - _context.next = 15; - return new Attribute(type, elementValue); - case 15: - j++; - _context.next = 11; - break; - case 18: - i++; - _context.next = 2; - break; - case 21: - case "end": - return _context.stop(); - } - } - }, _callee); - }), _ref; - }; - var _proto = SignedMessage.prototype; - _proto.getAuthorIterable = function getAuthorIterable() { - return SignedMessage._getIterable(this.signedData.author); - }; - _proto.getRecipientIterable = function getRecipientIterable() { - return SignedMessage._getIterable(this.signedData.recipient); - }; - _proto.getAuthorArray = function getAuthorArray() { - return SignedMessage._getArray(this.signedData.author); - }; - _proto.getRecipientArray = function getRecipientArray() { - return this.signedData.recipient ? SignedMessage._getArray(this.signedData.recipient) : []; - }; - _proto.getSignerKeyID = function getSignerKeyID() { - return this.pubKey; // hack until gun supports keyID lookups - //return util.getHash(this.pubKey); - }; - _proto._validate = function _validate() { - if (!this.signedData) { - throw new ValidationError(errorMsg + " Missing signedData"); - } - if (typeof this.signedData !== "object") { - throw new ValidationError(errorMsg + " signedData must be an object"); - } - var d = this.signedData; - if (!d.type) { - throw new ValidationError(errorMsg + " Missing type definition"); - } - if (!d.author) { - throw new ValidationError(errorMsg + " Missing author"); - } - if (typeof d.author !== "object") { - throw new ValidationError(errorMsg + " Author must be object"); - } - if (Array.isArray(d.author)) { - throw new ValidationError(errorMsg + " Author must not be an array"); - } - if (Object.keys(d.author).length === 0) { - throw new ValidationError(errorMsg + " Author empty"); - } - if (this.pubKey) { - this.signerKeyHash = this.getSignerKeyID(); - } - for (var attr in d.author) { - var t = typeof d.author[attr]; - if (t !== "string") { - if (Array.isArray(d.author[attr])) { - for (var i = 0; i < d.author[attr].length; i++) { - if (typeof d.author[attr][i] !== "string") { - throw new ValidationError(errorMsg + " Author attribute must be string, got " + attr + ": [" + d.author[attr][i] + "]"); - } - if (d.author[attr][i].length === 0) { - throw new ValidationError(errorMsg + " author " + attr + " in array[" + i + "] is empty"); - } - } - } else { - throw new ValidationError(errorMsg + " Author attribute must be string or array, got " + attr + ": " + d.author[attr]); - } - } - if (attr === "keyID") { - if (t !== "string") { - throw new ValidationError(errorMsg + " Author keyID must be string, got " + t); - } - if (this.signerKeyHash && d.author[attr] !== this.signerKeyHash) { - throw new ValidationError(errorMsg + " If message has a keyID author, it must be signed by the same key"); - } - } - } - if (d.recipient) { - if (typeof d.recipient !== "object") { - throw new ValidationError(errorMsg + " Recipient must be object"); - } - if (Array.isArray(d.recipient)) { - throw new ValidationError(errorMsg + " Recipient must not be an array"); - } - if (Object.keys(d.recipient).length === 0) { - throw new ValidationError(errorMsg + " Recipient empty"); - } - for (var _attr in d.recipient) { - var _t = typeof d.recipient[_attr]; - if (_t !== "string") { - if (Array.isArray(d.recipient[_attr])) { - for (var _i = 0; _i < d.recipient[_attr].length; _i++) { - if (typeof d.recipient[_attr][_i] !== "string") { - throw new ValidationError(errorMsg + " Recipient attribute must be string, got " + _attr + ": [" + d.recipient[_attr][_i] + "]"); - } - if (d.recipient[_attr][_i].length === 0) { - throw new ValidationError(errorMsg + " recipient " + _attr + " in array[" + _i + "] is empty"); - } - } - } else { - throw new ValidationError(errorMsg + " Recipient attribute must be string or array, got " + _attr + ": " + d.recipient[_attr]); - } - } - } - } - if (!(d.time || d.timestamp)) { - throw new ValidationError(errorMsg + " Missing time field"); - } - if (!Date.parse(d.time || d.timestamp)) { - throw new ValidationError(errorMsg + " Invalid time field"); - } - if (d.type === "rating") { - if (isNaN(d.rating)) { - throw new ValidationError(errorMsg + " Invalid rating"); - } - if (isNaN(d.maxRating)) { - throw new ValidationError(errorMsg + " Invalid maxRating"); - } - if (isNaN(d.minRating)) { - throw new ValidationError(errorMsg + " Invalid minRating"); - } - if (d.rating > d.maxRating) { - throw new ValidationError(errorMsg + " Rating is above maxRating"); - } - if (d.rating < d.minRating) { - throw new ValidationError(errorMsg + " Rating is below minRating"); - } - if (typeof d.context !== "string" || !d.context.length) { - throw new ValidationError(errorMsg + " Rating messages must have a context field"); - } - } - if (d.type === "verification" || d.type === "unverification") { - if (d.recipient.length < 2) { - throw new ValidationError(errorMsg + " At least 2 recipient attributes are needed for a connection / disconnection. Got: " + d.recipient); - } - } - return true; - }; - _proto.isPositive = function isPositive() { - return this.signedData.type === "rating" && this.signedData.rating > (this.signedData.maxRating + this.signedData.minRating) / 2; - }; - _proto.isNegative = function isNegative() { - return this.signedData.type === "rating" && this.signedData.rating < (this.signedData.maxRating + this.signedData.minRating) / 2; - }; - _proto.isNeutral = function isNeutral() { - return this.signedData.type === "rating" && this.signedData.rating === (this.signedData.maxRating + this.signedData.minRating) / 2; - } - /** - * @param {Object} key Gun.SEA keypair to sign the message with - */; - _proto.sign = - /*#__PURE__*/ - function () { - var _sign = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(key) { - return _regeneratorRuntime().wrap(function _callee2$(_context2) { - while (1) { - switch (_context2.prev = _context2.next) { - case 0: - _context2.next = 2; - return Key.sign(this.signedData, key); - case 2: - this.sig = _context2.sent; - this.pubKey = key.pub; - _context2.next = 6; - return this.getHash(); - case 6: - return _context2.abrupt("return", true); - case 7: - case "end": - return _context2.stop(); - } - } - }, _callee2, this); - })); - function sign(_x) { - return _sign.apply(this, arguments); - } - return sign; - }() /** - * Create an iris message. SignedMessage time is automatically set. If signingKey is specified and author omitted, signingKey will be used as author. - * @param {Object} signedData message data object including author, recipient and other possible attributes - * @param {Object} signingKey optionally, you can set the key to sign the message with - * @returns {Promise} message - */; - SignedMessage.create = - /*#__PURE__*/ - function () { - var _create = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3(signedData, signingKey) { - var m; - return _regeneratorRuntime().wrap(function _callee3$(_context3) { - while (1) { - switch (_context3.prev = _context3.next) { - case 0: - if (!signedData.author && signingKey) { - signedData.author = { - keyID: Key.getId(signingKey) - }; - } - signedData.time = signedData.time || new Date().toISOString(); - m = new SignedMessage({ - signedData: signedData - }); - if (!signingKey) { - _context3.next = 6; - break; - } - _context3.next = 6; - return m.sign(signingKey); - case 6: - return _context3.abrupt("return", m); - case 7: - case "end": - return _context3.stop(); - } - } - }, _callee3); - })); - function create(_x2, _x3) { - return _create.apply(this, arguments); - } - return create; - }(); - SignedMessage.createVerification = function createVerification(signedData, signingKey) { - signedData.type = "verification"; - return SignedMessage.create(signedData, signingKey); - }; - SignedMessage.createRating = function createRating(signedData, signingKey) { - signedData.type = "rating"; - signedData.context = signedData.context || "iris"; - signedData.maxRating = signedData.maxRating || 10; - signedData.minRating = signedData.minRating || -10; - return SignedMessage.create(signedData, signingKey); - }; - _proto.getAuthor = function getAuthor(index) { - for (var _iterator = _createForOfIteratorHelperLoose(this.getAuthorIterable()), _step; !(_step = _iterator()).done;) { - var a = _step.value; - if (a.isUniqueType()) { - return index.getContacts(a); - } - } - }; - _proto.getRecipient = function getRecipient(index) { - if (!this.signedData.recipient) { - return undefined; - } - for (var _iterator2 = _createForOfIteratorHelperLoose(this.getRecipientIterable()), _step2; !(_step2 = _iterator2()).done;) { - var a = _step2.value; - if (a.isUniqueType()) { - return index.getContacts(a); - } - } - } - /** - * @returns {string} base64 sha256 hash of message - */; - _proto.getHash = - /*#__PURE__*/ - function () { - var _getHash = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee4() { - return _regeneratorRuntime().wrap(function _callee4$(_context4) { - while (1) { - switch (_context4.prev = _context4.next) { - case 0: - if (!(this.sig && !this.hash)) { - _context4.next = 4; - break; - } - _context4.next = 3; - return util.getHash(this.sig); - case 3: - this.hash = _context4.sent; - case 4: - return _context4.abrupt("return", this.hash); - case 5: - case "end": - return _context4.stop(); - } - } - }, _callee4, this); - })); - function getHash() { - return _getHash.apply(this, arguments); - } - return getHash; - }(); - _proto.getId = function getId() { - return this.getHash(); - }; - SignedMessage.fromSig = /*#__PURE__*/function () { - var _fromSig = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee5(obj) { - var signedData, o; - return _regeneratorRuntime().wrap(function _callee5$(_context5) { - while (1) { - switch (_context5.prev = _context5.next) { - case 0: - if (obj.sig) { - _context5.next = 2; - break; - } - throw new Error("Missing signature in object:", obj); - case 2: - if (obj.pubKey) { - _context5.next = 4; - break; - } - throw new Error("Missing pubKey in object:"); - case 4: - //const signedData = await Key.verify(obj.sig, obj.pubKey); // disable sig verification while migrating to new gun :( - signedData = JSON.parse(obj.sig.slice(4)).m; - o = { - signedData: signedData, - sig: obj.sig, - pubKey: obj.pubKey - }; - return _context5.abrupt("return", new SignedMessage(o)); - case 7: - case "end": - return _context5.stop(); - } - } - }, _callee5); - })); - function fromSig(_x4) { - return _fromSig.apply(this, arguments); - } - return fromSig; - }() /** - * @return {boolean} true if message signature is valid. Otherwise throws ValidationError. - */; - _proto.verify = - /*#__PURE__*/ - function () { - var _verify = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee6() { - return _regeneratorRuntime().wrap(function _callee6$(_context6) { - while (1) { - switch (_context6.prev = _context6.next) { - case 0: - if (this.pubKey) { - _context6.next = 2; - break; - } - throw new ValidationError(errorMsg + " SignedMessage has no .pubKey"); - case 2: - if (this.sig) { - _context6.next = 4; - break; - } - throw new ValidationError(errorMsg + " SignedMessage has no .sig"); - case 4: - _context6.next = 6; - return Key.verify(this.sig, this.pubKey); - case 6: - this.signedData = _context6.sent; - if (this.signedData) { - _context6.next = 9; - break; - } - throw new ValidationError(errorMsg + " Invalid signature"); - case 9: - if (!this.hash) { - _context6.next = 18; - break; - } - _context6.t0 = this.hash; - _context6.next = 13; - return util.getHash(this.sig); - case 13: - _context6.t1 = _context6.sent; - if (!(_context6.t0 !== _context6.t1)) { - _context6.next = 16; - break; - } - throw new ValidationError(errorMsg + " Invalid message hash"); - case 16: - _context6.next = 19; - break; - case 18: - this.getHash(); - case 19: - return _context6.abrupt("return", true); - case 20: - case "end": - return _context6.stop(); - } - } - }, _callee6, this); - })); - function verify() { - return _verify.apply(this, arguments); - } - return verify; - }() /** - * @returns {string} - */; - _proto.serialize = function serialize() { - return { - sig: this.sig, - pubKey: this.pubKey - }; - }; - _proto.toString = function toString() { - return JSON.stringify(this.serialize()); - } - /** - * @returns {Promise} - */; - SignedMessage.deserialize = - /*#__PURE__*/ - function () { - var _deserialize = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee7(s) { - return _regeneratorRuntime().wrap(function _callee7$(_context7) { - while (1) { - switch (_context7.prev = _context7.next) { - case 0: - return _context7.abrupt("return", SignedMessage.fromSig(s)); - case 1: - case "end": - return _context7.stop(); - } - } - }, _callee7); - })); - function deserialize(_x5) { - return _deserialize.apply(this, arguments); - } - return deserialize; - }(); - SignedMessage.fromString = /*#__PURE__*/function () { - var _fromString = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee8(s) { - return _regeneratorRuntime().wrap(function _callee8$(_context8) { - while (1) { - switch (_context8.prev = _context8.next) { - case 0: - return _context8.abrupt("return", SignedMessage.fromSig(JSON.parse(s))); - case 1: - case "end": - return _context8.stop(); - } - } - }, _callee8); - })); - function fromString(_x6) { - return _fromString.apply(this, arguments); - } - return fromString; - }(); - SignedMessage.setReaction = /*#__PURE__*/function () { - var _setReaction = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee9(gun, msg, reaction) { - var hash; - return _regeneratorRuntime().wrap(function _callee9$(_context9) { - while (1) { - switch (_context9.prev = _context9.next) { - case 0: - _context9.next = 2; - return msg.getHash(); - case 2: - hash = _context9.sent; - gun.get("reactions").get(hash).put(reaction); - gun.get("reactions").get(hash).put(reaction); - gun.get("messagesByHash").get(hash).get("reactions").get(this.rootContact.value).put(reaction); - gun.get("messagesByHash").get(hash).get("reactions").get(this.rootContact.value).put(reaction); - case 7: - case "end": - return _context9.stop(); - } - } - }, _callee9, this); - })); - function setReaction(_x7, _x8, _x9) { - return _setReaction.apply(this, arguments); - } - return setReaction; - }(); - return SignedMessage; - }(); - - /*eslint no-useless-escape: "off", camelcase: "off" */ - var index = { - local: local$1, - global: global$2, - group: group, - "public": publicState, - "private": privateState, - "static": staticState, - electron: electron, - peers: peers, - session: session, - util: util, - notifications: notifications, - SEA: gun$1.SEA, - Gun: gun$1, - SignedMessage: SignedMessage, - Channel: Channel, - Node: Node - }; - - exports.default = index; - - Object.defineProperty(exports, '__esModule', { value: true }); + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (global = global || self, factory(global.iris = {})); +}(this, (function (exports) { 'use strict'; + + function _regeneratorRuntime() { + _regeneratorRuntime = function () { + return exports; + }; + var exports = {}, + Op = Object.prototype, + hasOwn = Op.hasOwnProperty, + $Symbol = "function" == typeof Symbol ? Symbol : {}, + iteratorSymbol = $Symbol.iterator || "@@iterator", + asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator", + toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag"; + function define(obj, key, value) { + return Object.defineProperty(obj, key, { + value: value, + enumerable: !0, + configurable: !0, + writable: !0 + }), obj[key]; + } + try { + define({}, ""); + } catch (err) { + define = function (obj, key, value) { + return obj[key] = value; + }; + } + function wrap(innerFn, outerFn, self, tryLocsList) { + var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator, + generator = Object.create(protoGenerator.prototype), + context = new Context(tryLocsList || []); + return generator._invoke = function (innerFn, self, context) { + var state = "suspendedStart"; + return function (method, arg) { + if ("executing" === state) throw new Error("Generator is already running"); + if ("completed" === state) { + if ("throw" === method) throw arg; + return doneResult(); + } + for (context.method = method, context.arg = arg;;) { + var delegate = context.delegate; + if (delegate) { + var delegateResult = maybeInvokeDelegate(delegate, context); + if (delegateResult) { + if (delegateResult === ContinueSentinel) continue; + return delegateResult; + } + } + if ("next" === context.method) context.sent = context._sent = context.arg;else if ("throw" === context.method) { + if ("suspendedStart" === state) throw state = "completed", context.arg; + context.dispatchException(context.arg); + } else "return" === context.method && context.abrupt("return", context.arg); + state = "executing"; + var record = tryCatch(innerFn, self, context); + if ("normal" === record.type) { + if (state = context.done ? "completed" : "suspendedYield", record.arg === ContinueSentinel) continue; + return { + value: record.arg, + done: context.done + }; + } + "throw" === record.type && (state = "completed", context.method = "throw", context.arg = record.arg); + } + }; + }(innerFn, self, context), generator; + } + function tryCatch(fn, obj, arg) { + try { + return { + type: "normal", + arg: fn.call(obj, arg) + }; + } catch (err) { + return { + type: "throw", + arg: err + }; + } + } + exports.wrap = wrap; + var ContinueSentinel = {}; + function Generator() {} + function GeneratorFunction() {} + function GeneratorFunctionPrototype() {} + var IteratorPrototype = {}; + define(IteratorPrototype, iteratorSymbol, function () { + return this; + }); + var getProto = Object.getPrototypeOf, + NativeIteratorPrototype = getProto && getProto(getProto(values([]))); + NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol) && (IteratorPrototype = NativeIteratorPrototype); + var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype); + function defineIteratorMethods(prototype) { + ["next", "throw", "return"].forEach(function (method) { + define(prototype, method, function (arg) { + return this._invoke(method, arg); + }); + }); + } + function AsyncIterator(generator, PromiseImpl) { + function invoke(method, arg, resolve, reject) { + var record = tryCatch(generator[method], generator, arg); + if ("throw" !== record.type) { + var result = record.arg, + value = result.value; + return value && "object" == typeof value && hasOwn.call(value, "__await") ? PromiseImpl.resolve(value.__await).then(function (value) { + invoke("next", value, resolve, reject); + }, function (err) { + invoke("throw", err, resolve, reject); + }) : PromiseImpl.resolve(value).then(function (unwrapped) { + result.value = unwrapped, resolve(result); + }, function (error) { + return invoke("throw", error, resolve, reject); + }); + } + reject(record.arg); + } + var previousPromise; + this._invoke = function (method, arg) { + function callInvokeWithMethodAndArg() { + return new PromiseImpl(function (resolve, reject) { + invoke(method, arg, resolve, reject); + }); + } + return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); + }; + } + function maybeInvokeDelegate(delegate, context) { + var method = delegate.iterator[context.method]; + if (undefined === method) { + if (context.delegate = null, "throw" === context.method) { + if (delegate.iterator.return && (context.method = "return", context.arg = undefined, maybeInvokeDelegate(delegate, context), "throw" === context.method)) return ContinueSentinel; + context.method = "throw", context.arg = new TypeError("The iterator does not provide a 'throw' method"); + } + return ContinueSentinel; + } + var record = tryCatch(method, delegate.iterator, context.arg); + if ("throw" === record.type) return context.method = "throw", context.arg = record.arg, context.delegate = null, ContinueSentinel; + var info = record.arg; + return info ? info.done ? (context[delegate.resultName] = info.value, context.next = delegate.nextLoc, "return" !== context.method && (context.method = "next", context.arg = undefined), context.delegate = null, ContinueSentinel) : info : (context.method = "throw", context.arg = new TypeError("iterator result is not an object"), context.delegate = null, ContinueSentinel); + } + function pushTryEntry(locs) { + var entry = { + tryLoc: locs[0] + }; + 1 in locs && (entry.catchLoc = locs[1]), 2 in locs && (entry.finallyLoc = locs[2], entry.afterLoc = locs[3]), this.tryEntries.push(entry); + } + function resetTryEntry(entry) { + var record = entry.completion || {}; + record.type = "normal", delete record.arg, entry.completion = record; + } + function Context(tryLocsList) { + this.tryEntries = [{ + tryLoc: "root" + }], tryLocsList.forEach(pushTryEntry, this), this.reset(!0); + } + function values(iterable) { + if (iterable) { + var iteratorMethod = iterable[iteratorSymbol]; + if (iteratorMethod) return iteratorMethod.call(iterable); + if ("function" == typeof iterable.next) return iterable; + if (!isNaN(iterable.length)) { + var i = -1, + next = function next() { + for (; ++i < iterable.length;) if (hasOwn.call(iterable, i)) return next.value = iterable[i], next.done = !1, next; + return next.value = undefined, next.done = !0, next; + }; + return next.next = next; + } + } + return { + next: doneResult + }; + } + function doneResult() { + return { + value: undefined, + done: !0 + }; + } + return GeneratorFunction.prototype = GeneratorFunctionPrototype, define(Gp, "constructor", GeneratorFunctionPrototype), define(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, "GeneratorFunction"), exports.isGeneratorFunction = function (genFun) { + var ctor = "function" == typeof genFun && genFun.constructor; + return !!ctor && (ctor === GeneratorFunction || "GeneratorFunction" === (ctor.displayName || ctor.name)); + }, exports.mark = function (genFun) { + return Object.setPrototypeOf ? Object.setPrototypeOf(genFun, GeneratorFunctionPrototype) : (genFun.__proto__ = GeneratorFunctionPrototype, define(genFun, toStringTagSymbol, "GeneratorFunction")), genFun.prototype = Object.create(Gp), genFun; + }, exports.awrap = function (arg) { + return { + __await: arg + }; + }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, asyncIteratorSymbol, function () { + return this; + }), exports.AsyncIterator = AsyncIterator, exports.async = function (innerFn, outerFn, self, tryLocsList, PromiseImpl) { + void 0 === PromiseImpl && (PromiseImpl = Promise); + var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl); + return exports.isGeneratorFunction(outerFn) ? iter : iter.next().then(function (result) { + return result.done ? result.value : iter.next(); + }); + }, defineIteratorMethods(Gp), define(Gp, toStringTagSymbol, "Generator"), define(Gp, iteratorSymbol, function () { + return this; + }), define(Gp, "toString", function () { + return "[object Generator]"; + }), exports.keys = function (object) { + var keys = []; + for (var key in object) keys.push(key); + return keys.reverse(), function next() { + for (; keys.length;) { + var key = keys.pop(); + if (key in object) return next.value = key, next.done = !1, next; + } + return next.done = !0, next; + }; + }, exports.values = values, Context.prototype = { + constructor: Context, + reset: function (skipTempReset) { + if (this.prev = 0, this.next = 0, this.sent = this._sent = undefined, this.done = !1, this.delegate = null, this.method = "next", this.arg = undefined, this.tryEntries.forEach(resetTryEntry), !skipTempReset) for (var name in this) "t" === name.charAt(0) && hasOwn.call(this, name) && !isNaN(+name.slice(1)) && (this[name] = undefined); + }, + stop: function () { + this.done = !0; + var rootRecord = this.tryEntries[0].completion; + if ("throw" === rootRecord.type) throw rootRecord.arg; + return this.rval; + }, + dispatchException: function (exception) { + if (this.done) throw exception; + var context = this; + function handle(loc, caught) { + return record.type = "throw", record.arg = exception, context.next = loc, caught && (context.method = "next", context.arg = undefined), !!caught; + } + for (var i = this.tryEntries.length - 1; i >= 0; --i) { + var entry = this.tryEntries[i], + record = entry.completion; + if ("root" === entry.tryLoc) return handle("end"); + if (entry.tryLoc <= this.prev) { + var hasCatch = hasOwn.call(entry, "catchLoc"), + hasFinally = hasOwn.call(entry, "finallyLoc"); + if (hasCatch && hasFinally) { + if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); + if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); + } else if (hasCatch) { + if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0); + } else { + if (!hasFinally) throw new Error("try statement without catch or finally"); + if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc); + } + } + } + }, + abrupt: function (type, arg) { + for (var i = this.tryEntries.length - 1; i >= 0; --i) { + var entry = this.tryEntries[i]; + if (entry.tryLoc <= this.prev && hasOwn.call(entry, "finallyLoc") && this.prev < entry.finallyLoc) { + var finallyEntry = entry; + break; + } + } + finallyEntry && ("break" === type || "continue" === type) && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc && (finallyEntry = null); + var record = finallyEntry ? finallyEntry.completion : {}; + return record.type = type, record.arg = arg, finallyEntry ? (this.method = "next", this.next = finallyEntry.finallyLoc, ContinueSentinel) : this.complete(record); + }, + complete: function (record, afterLoc) { + if ("throw" === record.type) throw record.arg; + return "break" === record.type || "continue" === record.type ? this.next = record.arg : "return" === record.type ? (this.rval = this.arg = record.arg, this.method = "return", this.next = "end") : "normal" === record.type && afterLoc && (this.next = afterLoc), ContinueSentinel; + }, + finish: function (finallyLoc) { + for (var i = this.tryEntries.length - 1; i >= 0; --i) { + var entry = this.tryEntries[i]; + if (entry.finallyLoc === finallyLoc) return this.complete(entry.completion, entry.afterLoc), resetTryEntry(entry), ContinueSentinel; + } + }, + catch: function (tryLoc) { + for (var i = this.tryEntries.length - 1; i >= 0; --i) { + var entry = this.tryEntries[i]; + if (entry.tryLoc === tryLoc) { + var record = entry.completion; + if ("throw" === record.type) { + var thrown = record.arg; + resetTryEntry(entry); + } + return thrown; + } + } + throw new Error("illegal catch attempt"); + }, + delegateYield: function (iterable, resultName, nextLoc) { + return this.delegate = { + iterator: values(iterable), + resultName: resultName, + nextLoc: nextLoc + }, "next" === this.method && (this.arg = undefined), ContinueSentinel; + } + }, exports; + } + function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { + try { + var info = gen[key](arg); + var value = info.value; + } catch (error) { + reject(error); + return; + } + if (info.done) { + resolve(value); + } else { + Promise.resolve(value).then(_next, _throw); + } + } + function _asyncToGenerator(fn) { + return function () { + var self = this, + args = arguments; + return new Promise(function (resolve, reject) { + var gen = fn.apply(self, args); + function _next(value) { + asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); + } + function _throw(err) { + asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); + } + _next(undefined); + }); + }; + } + function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + _setPrototypeOf(subClass, superClass); + } + function _getPrototypeOf(o) { + _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { + return o.__proto__ || Object.getPrototypeOf(o); + }; + return _getPrototypeOf(o); + } + function _setPrototypeOf(o, p) { + _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { + o.__proto__ = p; + return o; + }; + return _setPrototypeOf(o, p); + } + function _isNativeReflectConstruct() { + if (typeof Reflect === "undefined" || !Reflect.construct) return false; + if (Reflect.construct.sham) return false; + if (typeof Proxy === "function") return true; + try { + Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); + return true; + } catch (e) { + return false; + } + } + function _construct(Parent, args, Class) { + if (_isNativeReflectConstruct()) { + _construct = Reflect.construct.bind(); + } else { + _construct = function _construct(Parent, args, Class) { + var a = [null]; + a.push.apply(a, args); + var Constructor = Function.bind.apply(Parent, a); + var instance = new Constructor(); + if (Class) _setPrototypeOf(instance, Class.prototype); + return instance; + }; + } + return _construct.apply(null, arguments); + } + function _isNativeFunction(fn) { + return Function.toString.call(fn).indexOf("[native code]") !== -1; + } + function _wrapNativeSuper(Class) { + var _cache = typeof Map === "function" ? new Map() : undefined; + _wrapNativeSuper = function _wrapNativeSuper(Class) { + if (Class === null || !_isNativeFunction(Class)) return Class; + if (typeof Class !== "function") { + throw new TypeError("Super expression must either be null or a function"); + } + if (typeof _cache !== "undefined") { + if (_cache.has(Class)) return _cache.get(Class); + _cache.set(Class, Wrapper); + } + function Wrapper() { + return _construct(Class, arguments, _getPrototypeOf(this).constructor); + } + Wrapper.prototype = Object.create(Class.prototype, { + constructor: { + value: Wrapper, + enumerable: false, + writable: true, + configurable: true + } + }); + return _setPrototypeOf(Wrapper, Class); + }; + return _wrapNativeSuper(Class); + } + function _assertThisInitialized(self) { + if (self === void 0) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + return self; + } + function _unsupportedIterableToArray(o, minLen) { + if (!o) return; + if (typeof o === "string") return _arrayLikeToArray(o, minLen); + var n = Object.prototype.toString.call(o).slice(8, -1); + if (n === "Object" && o.constructor) n = o.constructor.name; + if (n === "Map" || n === "Set") return Array.from(o); + if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); + } + function _arrayLikeToArray(arr, len) { + if (len == null || len > arr.length) len = arr.length; + for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; + return arr2; + } + function _createForOfIteratorHelperLoose(o, allowArrayLike) { + var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; + if (it) return (it = it.call(o)).next.bind(it); + if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { + if (it) o = it; + var i = 0; + return function () { + if (i >= o.length) return { + done: true + }; + return { + done: false, + value: o[i++] + }; + }; + } + throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); + } + + // @ts-nocheck + var _ = { + throttle: function throttle(func, limit) { + var inThrottle; + return function () { + var args = arguments; + var context = this; + if (!inThrottle) { + func.apply(context, args); + inThrottle = true; + setTimeout(function () { + return inThrottle = false; + }, limit); + } + }; + }, + debounce: function debounce(func, limit) { + var inDebounce; + return function () { + var args = arguments; + var context = this; + clearTimeout(inDebounce); + inDebounce = setTimeout(function () { + return func.apply(context, args); + }, limit); + }; + }, + sample: function sample(arr) { + return arr[Math.floor(Math.random() * arr.length)]; + }, + sampleSize: function sampleSize(arr, size) { + var shuffled = arr.slice(0); + var i = arr.length; + var min = i - size; + var temp; + var index; + while (i-- > min) { + index = Math.floor((i + 1) * Math.random()); + temp = shuffled[index]; + shuffled[index] = shuffled[i]; + shuffled[i] = temp; + } + return shuffled.slice(min); + }, + defer: function defer(func) { + return setTimeout(func, 0); + }, + once: function once(func) { + var called = false; + return function () { + if (called) { + return; + } + called = true; + func.apply(this, arguments); + }; + }, + omit: function omit(obj, keys) { + var newObj = {}; + Object.keys(obj).forEach(function (key) { + if (!keys.includes(key)) { + newObj[key] = obj[key]; + } + }); + return newObj; + }, + defaults: function defaults(obj, _defaults) { + Object.keys(_defaults).forEach(function (key) { + if (obj[key] === undefined) { + obj[key] = _defaults[key]; + } + }); + return obj; + }, + pickBy: function pickBy(obj, predicate) { + var newObj = {}; + Object.keys(obj).forEach(function (key) { + if (predicate(obj[key])) { + newObj[key] = obj[key]; + } + }); + return newObj; + }, + isEqual: function isEqual(a, b) { + if (a === b) { + return true; + } + if (a instanceof Date && b instanceof Date) { + return a.getTime() === b.getTime(); + } + if (!a || !b || typeof a !== 'object' && typeof b !== 'object') { + return a !== a && b !== b; + } + if (a.prototype !== b.prototype) { + return false; + } + var keys = Object.keys(a); + if (keys.length !== Object.keys(b).length) { + return false; + } + return keys.every(function (k) { + return _.isEqual(a[k], b[k]); + }); + }, + uniq: function uniq(arr) { + var set = new Set(arr); + return Array.from(set); + } + }; + + // eslint-disable-line no-unused-vars + var isNode = false; + try { + isNode = /*#__PURE__*/Object.prototype.toString.call(global.process) === "[object process]"; + } catch (e) { + } + var userAgent = !isNode && navigator && navigator.userAgent && /*#__PURE__*/navigator.userAgent.toLowerCase(); + var isElectron = userAgent && /*#__PURE__*/userAgent.indexOf(' electron/') > -1; + var isMobile = !isNode && /*#__PURE__*/function () { + if (isElectron) { + return false; + } + var check = false; + (function (a) { + if (/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0, 4))) check = true; + })(navigator.userAgent || navigator.vendor || ''); + return check; + }(); + function gunOnceDefined(node) { + return new Promise(function (resolve) { + node.on(function (val, _k, _a, eve) { + if (val !== undefined) { + eve.off(); + resolve(val); + } + }); + }); + } + var animals = ['canidae', 'felidae', 'cat', 'cattle', 'dog', 'donkey', 'goat', 'horse', 'pig', 'rabbit', 'aardvark', 'aardwolf', 'albatross', 'alligator', 'alpaca', 'amphibian', 'anaconda', 'angelfish', 'anglerfish', 'ant', 'anteater', 'antelope', 'antlion', 'ape', 'aphid', 'armadillo', 'asp', 'baboon', 'badger', 'bandicoot', 'barnacle', 'barracuda', 'basilisk', 'bass', 'bat', 'bear', 'beaver', 'bedbug', 'bee', 'beetle', 'bird', 'bison', 'blackbird', 'boa', 'boar', 'bobcat', 'bobolink', 'bonobo', 'booby', 'bovid', 'bug', 'butterfly', 'buzzard', 'camel', 'canid', 'capybara', 'cardinal', 'caribou', 'carp', 'cat', 'catshark', 'caterpillar', 'catfish', 'cattle', 'centipede', 'cephalopod', 'chameleon', 'cheetah', 'chickadee', 'chicken', 'chimpanzee', 'chinchilla', 'chipmunk', 'clam', 'clownfish', 'cobra', 'cockroach', 'cod', 'condor', 'constrictor', 'coral', 'cougar', 'cow', 'coyote', 'crab', 'crane', 'crawdad', 'crayfish', 'cricket', 'crocodile', 'crow', 'cuckoo', 'cicada', 'damselfly', 'deer', 'dingo', 'dinosaur', 'dog', 'dolphin', 'donkey', 'dormouse', 'dove', 'dragonfly', 'dragon', 'duck', 'eagle', 'earthworm', 'earwig', 'echidna', 'eel', 'egret', 'elephant', 'elk', 'emu', 'ermine', 'falcon', 'ferret', 'finch', 'firefly', 'fish', 'flamingo', 'flea', 'fly', 'flyingfish', 'fowl', 'fox', 'frog', 'gamefowl', 'galliform', 'gazelle', 'gecko', 'gerbil', 'gibbon', 'giraffe', 'goat', 'goldfish', 'goose', 'gopher', 'gorilla', 'grasshopper', 'grouse', 'guan', 'guanaco', 'guineafowl', 'gull', 'guppy', 'haddock', 'halibut', 'hamster', 'hare', 'harrier', 'hawk', 'hedgehog', 'heron', 'herring', 'hippopotamus', 'hookworm', 'hornet', 'horse', 'hoverfly', 'hummingbird', 'hyena', 'iguana', 'impala', 'jackal', 'jaguar', 'jay', 'jellyfish', 'junglefowl', 'kangaroo', 'kingfisher', 'kite', 'kiwi', 'koala', 'koi', 'krill', 'ladybug', 'lamprey', 'landfowl', 'lark', 'leech', 'lemming', 'lemur', 'leopard', 'leopon', 'limpet', 'lion', 'lizard', 'llama', 'lobster', 'locust', 'loon', 'louse', 'lungfish', 'lynx', 'macaw', 'mackerel', 'magpie', 'mammal', 'manatee', 'mandrill', 'marlin', 'marmoset', 'marmot', 'marsupial', 'marten', 'mastodon', 'meadowlark', 'meerkat', 'mink', 'minnow', 'mite', 'mockingbird', 'mole', 'mollusk', 'mongoose', 'monkey', 'moose', 'mosquito', 'moth', 'mouse', 'mule', 'muskox', 'narwhal', 'newt', 'nightingale', 'ocelot', 'octopus', 'opossum', 'orangutan', 'orca', 'ostrich', 'otter', 'owl', 'ox', 'panda', 'panther', 'parakeet', 'parrot', 'parrotfish', 'partridge', 'peacock', 'peafowl', 'pelican', 'penguin', 'perch', 'pheasant', 'pig', 'pigeon', 'pike', 'pinniped', 'piranha', 'planarian', 'platypus', 'pony', 'porcupine', 'porpoise', 'possum', 'prawn', 'primate', 'ptarmigan', 'puffin', 'puma', 'python', 'quail', 'quelea', 'quokka', 'rabbit', 'raccoon', 'rat', 'rattlesnake', 'raven', 'reindeer', 'reptile', 'rhinoceros', 'roadrunner', 'rodent', 'rook', 'rooster', 'roundworm', 'sailfish', 'salamander', 'salmon', 'sawfish', 'scallop', 'scorpion', 'seahorse', 'shark', 'sheep', 'shrew', 'shrimp', 'silkworm', 'silverfish', 'skink', 'skunk', 'sloth', 'slug', 'smelt', 'snail', 'snake', 'snipe', 'sole', 'sparrow', 'spider', 'spoonbill', 'squid', 'squirrel', 'starfish', 'stingray', 'stoat', 'stork', 'sturgeon', 'swallow', 'swan', 'swift', 'swordfish', 'swordtail', 'tahr', 'takin', 'tapir', 'tarantula', 'tarsier', 'termite', 'tern', 'thrush', 'tick', 'tiger', 'tiglon', 'toad', 'tortoise', 'toucan', 'trout', 'tuna', 'turkey', 'turtle', 'tyrannosaurus', 'urial', 'vicuna', 'viper', 'vole', 'vulture', 'wallaby', 'walrus', 'wasp', 'warbler', 'weasel', 'whale', 'whippet', 'whitefish', 'wildcat', 'wildebeest', 'wildfowl', 'wolf', 'wolverine', 'wombat', 'woodpecker', 'worm', 'wren', 'xerinae', 'yak', 'zebra', 'alpaca', 'cat', 'cattle', 'chicken', 'dog', 'donkey', 'ferret', 'gayal', 'goldfish', 'guppy', 'horse', 'koi', 'llama', 'sheep', 'yak', 'unicorn']; + var adjectives = ['average', 'big', 'colossal', 'fat', 'giant', 'gigantic', 'great', 'huge', 'immense', 'large', 'little', 'long', 'mammoth', 'massive', 'miniature', 'petite', 'puny', 'short', 'small', 'tall', 'tiny', 'boiling', 'breezy', 'broken', 'bumpy', 'chilly', 'cold', 'cool', 'creepy', 'crooked', 'cuddly', 'curly', 'damaged', 'damp', 'dirty', 'dry', 'dusty', 'filthy', 'flaky', 'fluffy', 'wet', 'broad', 'chubby', 'crooked', 'curved', 'deep', 'flat', 'high', 'hollow', 'low', 'narrow', 'round', 'shallow', 'skinny', 'square', 'steep', 'straight', 'wide', 'ancient', 'brief', 'early', 'fast', 'late', 'long', 'modern', 'old', 'quick', 'rapid', 'short', 'slow', 'swift', 'young', 'abundant', 'empty', 'few', 'heavy', 'light', 'many', 'numerous', 'Sound', 'cooing', 'deafening', 'faint', 'harsh', 'hissing', 'hushed', 'husky', 'loud', 'melodic', 'moaning', 'mute', 'noisy', 'purring', 'quiet', 'raspy', 'resonant', 'screeching', 'shrill', 'silent', 'soft', 'squealing', 'thundering', 'voiceless', 'whispering', 'bitter', 'delicious', 'fresh', 'juicy', 'ripe', 'rotten', 'salty', 'sour', 'spicy', 'stale', 'sticky', 'strong', 'sweet', 'tasteless', 'tasty', 'thirsty', 'fluttering', 'fuzzy', 'greasy', 'grubby', 'hard', 'hot', 'icy', 'loose', 'melted', 'plastic', 'prickly', 'rainy', 'rough', 'scattered', 'shaggy', 'shaky', 'sharp', 'shivering', 'silky', 'slimy', 'slippery', 'smooth', 'soft', 'solid', 'steady', 'sticky', 'tender', 'tight', 'uneven', 'weak', 'wet', 'wooden', 'afraid', 'angry', 'annoyed', 'anxious', 'arrogant', 'ashamed', 'awful', 'bad', 'bewildered', 'bored', 'combative', 'condemned', 'confused', 'creepy', 'cruel', 'dangerous', 'defeated', 'defiant', 'depressed', 'disgusted', 'disturbed', 'eerie', 'embarrassed', 'envious', 'evil', 'fierce', 'foolish', 'frantic', 'frightened', 'grieving', 'helpless', 'homeless', 'hungry', 'hurt', 'ill', 'jealous', 'lonely', 'mysterious', 'naughty', 'nervous', 'obnoxious', 'outrageous', 'panicky', 'repulsive', 'scary', 'scornful', 'selfish', 'sore', 'tense', 'terrible', 'thoughtless', 'tired', 'troubled', 'upset', 'uptight', 'weary', 'wicked', 'worried', 'agreeable', 'amused', 'brave', 'calm', 'charming', 'cheerful', 'comfortable', 'cooperative', 'courageous', 'delightful', 'determined', 'eager', 'elated', 'enchanting', 'encouraging', 'energetic', 'enthusiastic', 'excited', 'exuberant', 'fair', 'faithful', 'fantastic', 'fine', 'friendly', 'funny', 'gentle', 'glorious', 'good', 'happy', 'healthy', 'helpful', 'hilarious', 'jolly', 'joyous', 'kind', 'lively', 'lovely', 'lucky', 'obedient', 'perfect', 'pleasant', 'proud', 'relieved', 'silly', 'smiling', 'splendid', 'successful', 'thoughtful', 'victorious', 'vivacious', 'witty', 'wonderful', 'zealous', 'zany', 'other', 'good', 'new', 'old', 'great', 'high', 'small', 'different', 'large', 'local', 'social', 'important', 'long', 'young', 'national', 'british', 'right', 'early', 'possible', 'big', 'little', 'political', 'able', 'late', 'general', 'full', 'far', 'low', 'public', 'available', 'bad', 'main', 'sure', 'clear', 'major', 'economic', 'only', 'likely', 'real', 'black', 'particular', 'international', 'special', 'difficult', 'certain', 'open', 'whole', 'white', 'free', 'short', 'easy', 'strong', 'european', 'central', 'similar', 'human', 'common', 'necessary', 'single', 'personal', 'hard', 'private', 'poor', 'financial', 'wide', 'foreign', 'simple', 'recent', 'concerned', 'american', 'various', 'close', 'fine', 'english', 'wrong', 'present', 'royal', 'natural', 'individual', 'nice', 'french', 'nihilist', 'solipsist', 'materialist', 'surrealist', 'heroic', 'awesome', 'hedonist', 'absurd', 'current', 'modern', 'labour', 'legal', 'happy', 'final', 'red', 'normal', 'serious', 'previous', 'total', 'prime', 'significant', 'industrial', 'sorry', 'dead', 'specific', 'appropriate', 'top', 'soviet', 'basic', 'military', 'original', 'successful', 'aware', 'hon', 'popular', 'heavy', 'professional', 'direct', 'dark', 'cold', 'ready', 'green', 'useful', 'effective', 'western', 'traditional', 'scottish', 'german', 'independent', 'deep', 'interesting', 'considerable', 'involved', 'physical', 'hot', 'existing', 'responsible', 'complete', 'medical', 'blue', 'extra', 'past', 'male', 'interested', 'fair', 'essential', 'beautiful', 'civil', 'primary', 'obvious', 'future', 'environmental', 'positive', 'senior', 'nuclear', 'annual', 'relevant', 'huge', 'rich', 'commercial', 'safe', 'regional', 'practical', 'official', 'separate', 'key', 'chief', 'regular', 'due', 'additional', 'active', 'powerful', 'complex', 'standard', 'impossible', 'light', 'warm', 'middle', 'fresh', 'sexual', 'front', 'domestic', 'actual', 'united', 'technical', 'ordinary', 'cheap', 'strange', 'internal', 'excellent', 'quiet', 'soft', 'potential', 'northern', 'religious', 'quick', 'very', 'famous', 'cultural', 'proper', 'broad', 'joint', 'formal', 'limited', 'conservative', 'lovely', 'usual', 'ltd', 'unable', 'rural', 'initial', 'substantial', 'bright', 'average', 'leading', 'reasonable', 'immediate', 'suitable', 'equal', 'detailed', 'working', 'overall', 'female', 'afraid', 'democratic', 'growing', 'sufficient', 'scientific', 'eastern', 'correct', 'inc', 'irish', 'expensive', 'educational', 'mental', 'dangerous', 'critical', 'increased', 'familiar', 'unlikely', 'double', 'perfect', 'slow', 'tiny', 'dry', 'historical', 'thin', 'daily', 'southern', 'increasing', 'wild', 'alone', 'urban', 'empty', 'married', 'narrow', 'liberal', 'supposed', 'upper', 'apparent', 'tall', 'busy', 'bloody', 'prepared', 'russian', 'moral', 'careful', 'clean', 'attractive', 'japanese', 'vital', 'thick', 'alternative', 'fast', 'ancient', 'elderly', 'rare', 'external', 'capable', 'brief', 'wonderful', 'grand', 'typical', 'entire', 'grey', 'constant', 'vast', 'surprised', 'ideal', 'terrible', 'academic', 'funny', 'minor', 'pleased', 'severe', 'ill', 'corporate', 'negative', 'permanent', 'weak', 'brown', 'fundamental', 'odd', 'crucial', 'inner', 'used', 'criminal', 'contemporary', 'sharp', 'sick', 'near', 'roman', 'massive', 'unique', 'secondary', 'parliamentary', 'african', 'unknown', 'subsequent', 'angry', 'alive', 'guilty', 'lucky', 'enormous', 'well', 'yellow', 'unusual', 'net', 'tough', 'dear', 'extensive', 'glad', 'remaining', 'agricultural', 'alright', 'healthy', 'italian', 'principal', 'tired', 'efficient', 'comfortable', 'chinese', 'relative', 'friendly', 'conventional', 'willing', 'sudden', 'proposed', 'voluntary', 'slight', 'valuable', 'dramatic', 'golden', 'temporary', 'federal', 'keen', 'flat', 'silent', 'indian', 'worried', 'pale', 'statutory', 'welsh', 'dependent', 'firm', 'wet', 'competitive', 'armed', 'radical', 'outside', 'acceptable', 'sensitive', 'living', 'pure', 'global', 'emotional', 'sad', 'secret', 'rapid', 'adequate', 'fixed', 'sweet', 'administrative', 'wooden', 'remarkable', 'comprehensive', 'surprising', 'solid', 'rough', 'mere', 'mass', 'brilliant', 'maximum', 'absolute', 'electronic', 'visual', 'electric', 'cool', 'spanish', 'literary', 'continuing', 'supreme', 'chemical', 'genuine', 'exciting', 'written', 'advanced', 'extreme', 'classical', 'fit', 'favourite', 'widespread', 'confident', 'straight', 'proud', 'numerous', 'opposite', 'distinct', 'mad', 'helpful', 'given', 'disabled', 'consistent', 'anxious', 'nervous', 'awful', 'stable', 'constitutional', 'satisfied', 'conscious', 'developing', 'strategic', 'holy', 'smooth', 'dominant', 'remote', 'theoretical', 'outstanding', 'pink', 'pretty', 'clinical', 'minimum', 'honest', 'impressive', 'related', 'residential', 'extraordinary', 'plain', 'visible', 'accurate', 'distant', 'still', 'greek', 'complicated', 'musical', 'precise', 'gentle', 'broken', 'live', 'silly', 'fat', 'tight', 'monetary', 'round', 'psychological', 'violent', 'unemployed', 'inevitable', 'junior', 'sensible', 'grateful', 'pleasant', 'dirty', 'structural', 'welcome', 'deaf', 'above', 'continuous', 'blind', 'overseas', 'mean', 'entitled', 'delighted', 'loose', 'occasional', 'evident', 'desperate', 'fellow', 'universal', 'square', 'steady', 'classic', 'equivalent', 'intellectual', 'victorian', 'level', 'ultimate', 'creative', 'lost', 'medieval', 'clever', 'linguistic', 'convinced', 'judicial', 'raw', 'sophisticated', 'asleep', 'vulnerable', 'illegal', 'outer', 'revolutionary', 'bitter', 'changing', 'australian', 'native', 'imperial', 'strict', 'wise', 'informal', 'flexible', 'collective', 'frequent', 'experimental', 'spiritual', 'intense', 'rational', 'generous', 'inadequate', 'prominent', 'logical', 'bare', 'historic', 'modest', 'dutch', 'acute', 'electrical', 'valid', 'weekly', 'gross', 'automatic', 'loud', 'reliable', 'mutual', 'liable', 'multiple', 'ruling', 'curious', 'sole', 'managing', 'pregnant', 'latin', 'nearby', 'exact', 'underlying', 'identical', 'satisfactory', 'marginal', 'distinctive', 'electoral', 'urgent', 'presidential', 'controversial', 'everyday', 'encouraging', 'organic', 'continued', 'expected', 'statistical', 'desirable', 'innocent', 'improved', 'exclusive', 'marked', 'experienced', 'unexpected', 'superb', 'sheer', 'disappointed', 'frightened', 'gastric', 'romantic', 'naked', 'reluctant', 'magnificent', 'convenient', 'established', 'closed', 'uncertain', 'artificial', 'diplomatic', 'tremendous', 'marine', 'mechanical', 'retail', 'institutional', 'mixed', 'required', 'biological', 'known', 'functional', 'straightforward', 'superior', 'digital', 'spectacular', 'unhappy', 'confused', 'unfair', 'aggressive', 'spare', 'painful', 'abstract', 'asian', 'associated', 'legislative', 'monthly', 'intelligent', 'hungry', 'explicit', 'nasty', 'just', 'faint', 'coloured', 'ridiculous', 'amazing', 'comparable', 'successive', 'realistic', 'back', 'decent', 'decentralized', 'bitcoin', 'cypherpunk', 'unnecessary', 'flying', 'random', 'influential', 'dull', 'genetic', 'neat', 'marvellous', 'crazy', 'damp', 'giant', 'secure', 'bottom', 'skilled', 'subtle', 'elegant', 'brave', 'lesser', 'parallel', 'steep', 'intensive', 'casual', 'tropical', 'lonely', 'partial', 'preliminary', 'concrete', 'alleged', 'assistant', 'vertical', 'upset', 'delicate', 'mild', 'occupational', 'excessive', 'progressive', 'exceptional', 'integrated', 'striking', 'continental', 'okay', 'harsh', 'combined', 'fierce', 'handsome', 'characteristic', 'chronic', 'compulsory', 'interim', 'objective', 'splendid', 'magic', 'systematic', 'obliged', 'payable', 'fun', 'horrible', 'primitive', 'fascinating', 'ideological', 'metropolitan', 'surrounding', 'estimated', 'peaceful', 'premier', 'operational', 'technological', 'kind', 'advisory', 'hostile', 'precious', 'accessible', 'determined', 'excited', 'impressed', 'provincial', 'smart', 'endless', 'isolated', 'drunk', 'geographical', 'like', 'dynamic', 'boring', 'forthcoming', 'unfortunate', 'definite', 'super', 'notable', 'indirect', 'stiff', 'wealthy', 'awkward', 'lively', 'neutral', 'artistic', 'content', 'mature', 'colonial', 'ambitious', 'evil', 'magnetic', 'verbal', 'legitimate', 'sympathetic', 'empirical', 'head', 'shallow', 'vague', 'naval', 'depressed', 'shared', 'added', 'shocked', 'mid', 'worthwhile', 'qualified', 'missing', 'blank', 'absent', 'favourable', 'polish', 'israeli', 'developed', 'profound', 'representative', 'enthusiastic', 'dreadful', 'rigid', 'reduced', 'cruel', 'coastal', 'peculiar', 'swiss', 'crude', 'extended', 'selected', 'eager', 'canadian', 'bold', 'relaxed', 'corresponding', 'running', 'planned', 'applicable', 'immense', 'allied', 'comparative', 'uncomfortable', 'conservation', 'productive', 'beneficial', 'bored', 'charming', 'minimal', 'mobile', 'turkish', 'orange', 'rear', 'passive', 'suspicious', 'overwhelming', 'fatal', 'resulting', 'symbolic', 'registered', 'neighbouring', 'calm', 'irrelevant', 'patient', 'compact', 'profitable', 'rival', 'loyal', 'moderate', 'distinguished', 'interior', 'noble', 'insufficient', 'eligible', 'mysterious', 'varying', 'managerial', 'molecular', 'olympic', 'linear', 'prospective', 'printed', 'parental', 'diverse', 'elaborate', 'furious', 'fiscal', 'burning', 'useless', 'semantic', 'embarrassed', 'inherent', 'philosophical', 'deliberate', 'awake', 'variable', 'promising', 'unpleasant', 'varied', 'sacred', 'selective', 'inclined', 'tender', 'hidden', 'worthy', 'intermediate', 'sound', 'protective', 'fortunate', 'slim', 'defensive', 'divine', 'stuck', 'driving', 'invisible', 'misleading', 'circular', 'mathematical', 'inappropriate', 'liquid', 'persistent', 'solar', 'doubtful', 'manual', 'architectural', 'intact', 'incredible', 'devoted', 'prior', 'tragic', 'respectable', 'optimistic', 'convincing', 'unacceptable', 'decisive', 'competent', 'spatial', 'respective', 'binding', 'relieved', 'nursing', 'toxic', 'select', 'redundant', 'integral', 'then', 'probable', 'amateur', 'fond', 'passing', 'specified', 'territorial', 'horizontal', 'inland', 'cognitive', 'regulatory', 'miserable', 'resident', 'polite', 'scared', 'gothic', 'civilian', 'instant', 'lengthy', 'adverse', 'korean', 'unconscious', 'anonymous', 'aesthetic', 'orthodox', 'static', 'unaware', 'costly', 'fantastic', 'foolish', 'fashionable', 'causal', 'compatible', 'wee', 'implicit', 'dual', 'ok', 'cheerful', 'subjective', 'forward', 'surviving', 'exotic', 'purple', 'cautious', 'visiting', 'aggregate', 'ethical', 'teenage', 'dying', 'disastrous', 'delicious', 'confidential', 'underground', 'thorough', 'grim', 'autonomous', 'atomic', 'frozen', 'colourful', 'injured', 'uniform', 'ashamed', 'glorious', 'wicked', 'coherent', 'rising', 'shy', 'novel', 'balanced', 'delightful', 'arbitrary', 'adjacent', 'worrying', 'weird', 'unchanged', 'rolling', 'evolutionary', 'intimate', 'sporting', 'disciplinary', 'formidable', 'lexical', 'noisy', 'gradual', 'accused', 'homeless', 'supporting', 'coming', 'renewed', 'excess', 'retired', 'rubber', 'chosen', 'outdoor', 'embarrassing', 'preferred', 'bizarre', 'appalling', 'agreed', 'imaginative', 'governing', 'accepted', 'vocational', 'mighty', 'puzzled', 'worldwide', 'organisational', 'sunny', 'eldest', 'eventual', 'spontaneous', 'vivid', 'rude', 'faithful', 'ministerial', 'innovative', 'controlled', 'conceptual', 'unwilling', 'civic', 'meaningful', 'alive', 'brainy', 'breakable', 'busy', 'careful', 'cautious', 'clever', 'concerned', 'crazy', 'curious', 'dead', 'different', 'difficult', 'doubtful', 'easy', 'famous', 'fragile', 'helpful', 'helpless', 'important', 'impossible', 'innocent', 'inquisitive', 'modern', 'open', 'outstanding', 'poor', 'powerful', 'puzzled', 'real', 'rich', 'shy', 'sleepy', 'super', 'tame', 'uninterested', 'wandering', 'wild', 'wrong', 'adorable', 'alert', 'average', 'beautiful', 'blonde', 'bloody', 'blushing', 'bright', 'clean', 'clear', 'cloudy', 'colorful', 'crowded', 'cute', 'dark', 'drab', 'distinct', 'dull', 'elegant', 'fancy', 'filthy', 'glamorous', 'gleaming', 'graceful', 'grotesque', 'homely', 'light', 'misty', 'motionless', 'muddy', 'plain', 'poised', 'quaint', 'shiny', 'smoggy', 'sparkling', 'spotless', 'stormy', 'strange', 'ugly', 'unsightly', 'unusual', 'bad', 'better', 'beautiful', 'big', 'black', 'blue', 'bright', 'clumsy', 'crazy', 'dizzy', 'dull', 'fat', 'frail', 'friendly', 'funny', 'great', 'green', 'gigantic', 'gorgeous', 'grumpy', 'handsome', 'happy', 'horrible', 'itchy', 'jittery', 'jolly', 'kind', 'long', 'lazy', 'magnificent', 'magenta', 'many', 'mighty', 'mushy', 'nasty', 'new', 'nice', 'nosy', 'nutty', 'nutritious', 'odd', 'orange', 'ordinary', 'pretty', 'precious', 'prickly', 'purple', 'quaint', 'quiet', 'quick', 'quickest', 'rainy', 'rare', 'ratty', 'red', 'roasted', 'robust', 'round', 'sad', 'scary', 'scrawny', 'short', 'silly', 'stingy', 'strange', 'striped', 'spotty', 'tart', 'tall', 'tame', 'tan', 'tender', 'testy', 'tricky', 'tough', 'ugly', 'ugliest', 'vast', 'watery', 'wasteful', 'wonderful', 'yellow', 'yummy', 'zany']; + var util = { + gunOnceDefined: gunOnceDefined, + getHash: function getHash(data, format) { + var _this = this; + return _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() { + var encoder, buffer, hash; + return _regeneratorRuntime().wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + if (format === void 0) { + format = "base64"; + } + if (!(data === undefined)) { + _context.next = 3; + break; + } + throw new Error('getHash data was undefined'); + case 3: + if (typeof data !== 'string') { + data = JSON.stringify(data); + } + encoder = new TextEncoder(); + data = encoder.encode(data); + _context.next = 8; + return crypto.subtle.digest('SHA-256', data); + case 8: + buffer = _context.sent; + if (!(format === 'buffer')) { + _context.next = 11; + break; + } + return _context.abrupt("return", buffer); + case 11: + hash = _this.arrayBufferToBase64(buffer); + if (!(format === "hex")) { + _context.next = 14; + break; + } + return _context.abrupt("return", _this.base64ToHex(hash)); + case 14: + return _context.abrupt("return", hash); + case 15: + case "end": + return _context.stop(); + } + } + }, _callee); + }))(); + }, + capitalize: function capitalize(s) { + return s.charAt(0).toUpperCase() + s.slice(1); + }, + generateName: function generateName() { + return this.capitalize(_.sample(adjectives)) + " " + this.capitalize(_.sample(animals)); + }, + base64ToHex: function base64ToHex(str) { + var raw = atob(str); + var result = ''; + for (var i = 0; i < raw.length; i++) { + var hex = raw.charCodeAt(i).toString(16); + result += hex.length === 2 ? hex : "0" + hex; + } + return result; + }, + arrayBufferToBase64: function arrayBufferToBase64(buffer) { + var binary = ''; + var bytes = new Uint8Array(buffer); + var len = bytes.byteLength; + for (var i = 0; i < len; i++) { + binary += String.fromCharCode(bytes[i]); + } + return window.btoa(binary); + }, + getCaret: function getCaret(el) { + if (el.selectionStart) { + return el.selectionStart; + } else { + // @ts-ignore + if (document.selection) { + el.focus(); + // @ts-ignore + var r = document.selection.createRange(); + if (r === null) { + return 0; + } + // @ts-ignore + var re = el.createTextRange(), + rc = re.duplicate(); + re.moveToBookmark(r.getBookmark()); + rc.setEndPoint('EndToStart', re); + return rc.text.length; + } + } + return 0; + }, + getUrlParameter: function getUrlParameter(sParam, sParams) { + var sPageURL = sParams || window.location.search.substring(1); + var sURLVariables = sPageURL.split('&'); + var sParameterName, i; + for (i = 0; i < sURLVariables.length; i++) { + sParameterName = sURLVariables[i].split('='); + if (sParameterName[0] === sParam) { + return sParameterName[1] === undefined ? true : decodeURIComponent(sParameterName[1]); + } + } + return; + }, + formatTime: function formatTime(date) { + // @ts-ignore + var t = date.toLocaleTimeString(undefined, { + timeStyle: 'short' + }); + var s = t.split(':'); + if (s.length === 3) { + // safari tries to display seconds + return s[0] + ":" + s[1] + s[2].slice(2); + } + return t; + }, + formatDate: function formatDate(date) { + var t = date.toLocaleString(undefined, { + dateStyle: 'short', + timeStyle: 'short' + }); + var s = t.split(':'); + if (s.length === 3) { + // safari tries to display seconds + return s[0] + ":" + s[1] + s[2].slice(2); + } + return t; + }, + getDaySeparatorText: function getDaySeparatorText(date, dateStr, now, nowStr) { + if (!now) { + now = new Date(); + // @ts-ignore + nowStr = now.toLocaleDateString({ + dateStyle: 'short' + }); + } + if (dateStr === nowStr) { + return 'today'; + } + var dayDifference = Math.round((now - date) / (1000 * 60 * 60 * 24)); + if (dayDifference === 0) { + return 'today'; + } + if (dayDifference === 1) { + return 'yesterday'; + } + if (dayDifference <= 5) { + return date.toLocaleDateString(undefined, { + weekday: 'long' + }); + } + return dateStr; + }, + getProfileLink: function getProfileLink(pub) { + return window.location.origin + "/#/profile/" + encodeURIComponent(pub); + }, + truncateString: function truncateString(s, length) { + if (length === void 0) { + length = 30; + } + return s.length > length ? s.slice(0, length) + "..." : s; + }, + createElement: function createElement(type, cls, parent) { + var el = document.createElement(type); + if (cls) { + el.setAttribute('class', cls); + } + if (parent) { + parent.appendChild(el); + } + return el; + }, + isNode: isNode, + isElectron: isElectron, + isMobile: isMobile, + throttle: function throttle(func, limit) { + var inThrottle; + return function () { + var args = arguments; + var context = this; + if (!inThrottle) { + func.apply(context, args); + inThrottle = true; + setTimeout(function () { + return inThrottle = false; + }, limit); + } + }; + }, + debounce: function debounce(func, delay) { + var inDebounce; + return function () { + var context = this; + var args = arguments; + clearTimeout(inDebounce); + inDebounce = setTimeout(function () { + return func.apply(context, args); + }, delay); + }; + }, + sample: function sample(arr) { + return arr[Math.floor(Math.random() * arr.length)]; + }, + sampleSize: function sampleSize(arr, size) { + var shuffled = arr.slice(0); + var i = arr.length; + var min = i - size; + var temp; + var index; + while (i-- > min) { + index = Math.floor((i + 1) * Math.random()); + temp = shuffled[index]; + shuffled[index] = shuffled[i]; + shuffled[i] = temp; + } + return shuffled.slice(min); + }, + defer: function defer(func) { + return setTimeout(func, 0); + }, + once: function once(func) { + var called = false; + return function () { + if (called) { + return; + } + called = true; + func.apply(this, arguments); + }; + }, + omit: function omit(obj, keys) { + var newObj = {}; + Object.keys(obj).forEach(function (key) { + if (!keys.includes(key)) { + newObj[key] = obj[key]; + } + }); + return newObj; + } + }; + + // eslint-disable-line no-unused-vars + var myKey; + var Key = { + getActiveKey: function getActiveKey(datadir, keyfile, fs) { + var _this = this; + return _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() { + var privKeyFile, f, newKey, str, _newKey; + return _regeneratorRuntime().wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + if (datadir === void 0) { + datadir = "."; + } + if (keyfile === void 0) { + keyfile = "iris.key"; + } + if (!myKey) { + _context.next = 4; + break; + } + return _context.abrupt("return", myKey); + case 4: + if (!fs) { + _context.next = 21; + break; + } + privKeyFile = datadir + "/" + keyfile; + if (!fs.existsSync(privKeyFile)) { + _context.next = 11; + break; + } + f = fs.readFileSync(privKeyFile, "utf8"); + myKey = _this.fromString(f); + _context.next = 17; + break; + case 11: + _context.next = 13; + return _this.generate(); + case 13: + newKey = _context.sent; + myKey = myKey || newKey; // eslint-disable-line require-atomic-updates + fs.writeFileSync(privKeyFile, _this.toString(myKey)); + fs.chmodSync(privKeyFile, 400); + case 17: + if (myKey) { + _context.next = 19; + break; + } + throw new Error("loading default key failed - check " + datadir + "/" + keyfile); + case 19: + _context.next = 33; + break; + case 21: + str = window.localStorage.getItem("iris.myKey"); + if (!str) { + _context.next = 26; + break; + } + myKey = _this.fromString(str); + _context.next = 31; + break; + case 26: + _context.next = 28; + return _this.generate(); + case 28: + _newKey = _context.sent; + myKey = myKey || _newKey; // eslint-disable-line require-atomic-updates + window.localStorage.setItem("iris.myKey", _this.toString(myKey)); + case 31: + if (myKey) { + _context.next = 33; + break; + } + throw new Error("loading default key failed - check localStorage iris.myKey"); + case 33: + return _context.abrupt("return", myKey); + case 34: + case "end": + return _context.stop(); + } + } + }, _callee); + }))(); + }, + getDefault: function getDefault(datadir, keyfile) { + if (datadir === void 0) { + datadir = "."; + } + if (keyfile === void 0) { + keyfile = "iris.key"; + } + return this.getActiveKey(datadir, keyfile); + }, + getActivePub: function getActivePub(datadir, keyfile) { + var _this2 = this; + return _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2() { + var key; + return _regeneratorRuntime().wrap(function _callee2$(_context2) { + while (1) { + switch (_context2.prev = _context2.next) { + case 0: + if (datadir === void 0) { + datadir = "."; + } + if (keyfile === void 0) { + keyfile = "iris.key"; + } + _context2.next = 4; + return _this2.getActiveKey(datadir, keyfile); + case 4: + key = _context2.sent; + return _context2.abrupt("return", key.pub); + case 6: + case "end": + return _context2.stop(); + } + } + }, _callee2); + }))(); + }, + setActiveKey: function setActiveKey(key, save, datadir, keyfile, fs) { + if (save === void 0) { + save = true; + } + if (datadir === void 0) { + datadir = "."; + } + if (keyfile === void 0) { + keyfile = "iris.key"; + } + myKey = key; + if (!save) return; + if (util.isNode) { + var privKeyFile = datadir + "/" + keyfile; + fs.writeFileSync(privKeyFile, this.toString(myKey)); + fs.chmodSync(privKeyFile, 400); + } else { + window.localStorage.setItem("iris.myKey", this.toString(myKey)); + } + }, + toString: function toString(key) { + return JSON.stringify(key); + }, + getId: function getId(key) { + if (!(key && key.pub)) { + throw new Error("missing param"); + } + return key.pub; // hack until GUN supports lookups by keyID + //return util.getHash(key.pub); + }, + fromString: function fromString(str) { + return JSON.parse(str); + }, + // copied from Gun.SEA + generate: function generate() { + return _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee5() { + var ecdhSubtle, sa, dh, r; + return _regeneratorRuntime().wrap(function _callee5$(_context5) { + while (1) { + switch (_context5.prev = _context5.next) { + case 0: + _context5.prev = 0; + ecdhSubtle = window.crypto.subtle; // First: ECDSA keys for signing/verifying... + _context5.next = 4; + return ecdhSubtle.generateKey({ + name: 'ECDSA', + namedCurve: 'P-256' + }, true, ['sign', 'verify']).then( /*#__PURE__*/function () { + var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3(keys) { + var key, pub; + return _regeneratorRuntime().wrap(function _callee3$(_context3) { + while (1) { + switch (_context3.prev = _context3.next) { + case 0: + // privateKey scope doesn't leak out from here! + //const { d: priv } = await shim.subtle.exportKey('jwk', keys.privateKey) + key = {}; + _context3.next = 3; + return ecdhSubtle.exportKey('jwk', keys.privateKey); + case 3: + key.priv = _context3.sent.d; + _context3.next = 6; + return ecdhSubtle.exportKey('jwk', keys.publicKey); + case 6: + pub = _context3.sent; + //const pub = Buff.from([ x, y ].join(':')).toString('base64') // old + key.pub = pub.x + '.' + pub.y; // new + // x and y are already base64 + // pub is UTF8 but filename/URL safe (https://www.ietf.org/rfc/rfc3986.txt) + // but split on a non-base64 letter. + return _context3.abrupt("return", key); + case 9: + case "end": + return _context3.stop(); + } + } + }, _callee3); + })); + return function (_x) { + return _ref.apply(this, arguments); + }; + }()); + case 4: + sa = _context5.sent; + _context5.prev = 5; + _context5.next = 8; + return ecdhSubtle.generateKey({ + name: 'ECDH', + namedCurve: 'P-256' + }, true, ['deriveKey']).then( /*#__PURE__*/function () { + var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee4(keys) { + var key, pub; + return _regeneratorRuntime().wrap(function _callee4$(_context4) { + while (1) { + switch (_context4.prev = _context4.next) { + case 0: + // privateKey scope doesn't leak out from here! + key = {}; + _context4.next = 3; + return ecdhSubtle.exportKey('jwk', keys.privateKey); + case 3: + key.epriv = _context4.sent.d; + _context4.next = 6; + return ecdhSubtle.exportKey('jwk', keys.publicKey); + case 6: + pub = _context4.sent; + //const epub = Buff.from([ ex, ey ].join(':')).toString('base64') // old + key.epub = pub.x + '.' + pub.y; // new + // ex and ey are already base64 + // epub is UTF8 but filename/URL safe (https://www.ietf.org/rfc/rfc3986.txt) + // but split on a non-base64 letter. + return _context4.abrupt("return", key); + case 9: + case "end": + return _context4.stop(); + } + } + }, _callee4); + })); + return function (_x2) { + return _ref2.apply(this, arguments); + }; + }()); + case 8: + dh = _context5.sent; + _context5.next = 18; + break; + case 11: + _context5.prev = 11; + _context5.t0 = _context5["catch"](5); + if (!(_context5.t0 == 'Error: ECDH is not a supported algorithm')) { + _context5.next = 17; + break; + } + console.log('Ignoring ECDH...'); + _context5.next = 18; + break; + case 17: + throw _context5.t0; + case 18: + dh = dh || {}; + r = { + pub: sa.pub, + priv: sa.priv, + /* pubId, */epub: dh.epub, + epriv: dh.epriv + }; + return _context5.abrupt("return", r); + case 23: + _context5.prev = 23; + _context5.t1 = _context5["catch"](0); + console.log(_context5.t1); + throw _context5.t1; + case 28: + case "end": + return _context5.stop(); + } + } + }, _callee5, null, [[0, 23], [5, 11]]); + }))(); + }, + keyToJwk: function keyToJwk(key) { + if (typeof key === 'string') { + key = { + pub: key + }; + } + var jwk = { + kty: 'EC', + crv: 'P-256', + x: key.pub.split('.')[0], + y: key.pub.split('.')[1], + ext: true + }; + jwk.key_ops = key.priv ? ['sign'] : ['verify']; + if (key.priv) { + jwk.d = key.priv; + } + return jwk; + }, + sign: function sign(data, pair, cb, opt) { + var _this3 = this; + return _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee6() { + var text, jwk, hash, sig, r; + return _regeneratorRuntime().wrap(function _callee6$(_context6) { + while (1) { + switch (_context6.prev = _context6.next) { + case 0: + if (opt === void 0) { + opt = {}; + } + if (!(undefined === data)) { + _context6.next = 3; + break; + } + throw '`undefined` not allowed.'; + case 3: + text = typeof data === 'string' ? data : JSON.stringify(data); // Gun.SEA doesn't preserve data type: "0" -> 0. Should we change this? + jwk = _this3.keyToJwk(pair); + _context6.next = 7; + return util.getHash(text, 'buffer'); + case 7: + hash = _context6.sent; + _context6.next = 10; + return window.crypto.subtle.importKey('jwk', jwk, { + name: 'ECDSA', + namedCurve: 'P-256' + }, false, ['sign']).then(function (key) { + return window.crypto.subtle.sign({ + name: 'ECDSA', + hash: { + name: 'SHA-256' + } + }, key, hash); + }); + case 10: + sig = _context6.sent; + // privateKey scope doesn't leak out from here! + r = { + m: text, + s: Buffer.from(sig).toString(opt.encode || 'base64') + }; + if (!opt.raw) { + r = 'aSEA' + JSON.stringify(r); + } // "aSEA" was a dumb fix for an earlier bug in Gun.SEA + if (cb) { + try { + cb(r); + } catch (e) { + console.log(e); + } + } + return _context6.abrupt("return", r); + case 15: + case "end": + return _context6.stop(); + } + } + }, _callee6); + }))(); + }, + verify: function verify(data, pair, cb, opt) { + var _this4 = this; + return _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee7() { + var pub, jwk, key, text, hash, buf, sig, isValid, r; + return _regeneratorRuntime().wrap(function _callee7$(_context7) { + while (1) { + switch (_context7.prev = _context7.next) { + case 0: + if (opt === void 0) { + opt = {}; + } + _context7.prev = 1; + if (typeof data === 'string') { + if (data.slice(0, 4) === 'aSEA') { + data = data.slice(4); + } + try { + data = JSON.parse(data); + } catch (e) { + // not JSON + } + } + pub = pair.pub || pair; + jwk = _this4.keyToJwk(pub); + _context7.next = 7; + return crypto.subtle.importKey('jwk', jwk, { + name: 'ECDSA', + namedCurve: 'P-256' + }, false, ['verify']); + case 7: + key = _context7.sent; + text = data.m; + try { + text = JSON.parse(text); + } catch (e) { + // ignore + } + _context7.next = 12; + return util.getHash(text, 'buffer'); + case 12: + hash = _context7.sent; + buf = Buffer.from(data.s, opt.encode || 'base64'); + sig = new Uint8Array(buf); + _context7.next = 17; + return crypto.subtle.verify({ + name: 'ECDSA', + hash: { + name: 'SHA-256' + } + }, key, sig, hash); + case 17: + isValid = _context7.sent; + r = isValid ? JSON.parse(text) : undefined; + if (cb) { + try { + cb(r); + } catch (e) { + console.log(e); + } + } + return _context7.abrupt("return", r); + case 24: + _context7.prev = 24; + _context7.t0 = _context7["catch"](1); + console.log(_context7.t0); + return _context7.abrupt("return", undefined); + case 28: + case "end": + return _context7.stop(); + } + } + }, _callee7, null, [[1, 24]]); + }))(); + }, + secret: function secret(key, pair) { + return _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee9() { + var keysToEcdhJwk, pub, epub, epriv, pubJwk, props, privJwk; + return _regeneratorRuntime().wrap(function _callee9$(_context9) { + while (1) { + switch (_context9.prev = _context9.next) { + case 0: + keysToEcdhJwk = function keysToEcdhJwk(pub, d) { + //var [ x, y ] = shim.Buffer.from(pub, 'base64').toString('utf8').split(':') // old + var _pub$split = pub.split('.'), + x = _pub$split[0], + y = _pub$split[1]; // new + var jwk = Object.assign(d ? { + d: d + } : {}, { + x: x, + y: y, + kty: 'EC', + crv: 'P-256', + ext: true + }); + return jwk; + }; + pub = key.epub || key; + epub = pair.epub; + epriv = pair.epriv; + pubJwk = keysToEcdhJwk(pub); + _context9.t0 = Object; + _context9.next = 8; + return crypto.subtle.importKey('jwk', pubJwk, { + name: 'ECDH', + namedCurve: 'P-256' + }, true, []); + case 8: + _context9.t1 = _context9.sent; + _context9.t2 = { + "public": _context9.t1 + }; + _context9.t3 = { + name: 'ECDH', + namedCurve: 'P-256' + }; + props = _context9.t0.assign.call(_context9.t0, _context9.t2, _context9.t3); + privJwk = keysToEcdhJwk(epub, epriv); + return _context9.abrupt("return", crypto.subtle.importKey('jwk', privJwk, { + name: 'ECDH', + namedCurve: 'P-256' + }, false, ['deriveBits']).then( /*#__PURE__*/function () { + var _ref3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee8(privKey) { + var derivedBits, rawBits, derivedKey; + return _regeneratorRuntime().wrap(function _callee8$(_context8) { + while (1) { + switch (_context8.prev = _context8.next) { + case 0: + _context8.next = 2; + return crypto.subtle.deriveBits(props, privKey, 256); + case 2: + derivedBits = _context8.sent; + rawBits = new Uint8Array(derivedBits); + _context8.next = 6; + return crypto.subtle.importKey('raw', rawBits, { + name: 'AES-GCM', + length: 256 + }, true, ['encrypt', 'decrypt']); + case 6: + derivedKey = _context8.sent; + return _context8.abrupt("return", crypto.subtle.exportKey('jwk', derivedKey).then(function (_ref4) { + var k = _ref4.k; + return k; + })); + case 8: + case "end": + return _context8.stop(); + } + } + }, _callee8); + })); + return function (_x3) { + return _ref3.apply(this, arguments); + }; + }())); + case 14: + case "end": + return _context9.stop(); + } + } + }, _callee9); + }))(); + }, + aeskey: function aeskey(key, salt) { + var _this5 = this; + return _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee10() { + var combo, hash, keyB64, k, jwkKey; + return _regeneratorRuntime().wrap(function _callee10$(_context10) { + while (1) { + switch (_context10.prev = _context10.next) { + case 0: + combo = key + (salt || _this5.random(8)).toString('utf8'); // new + _context10.next = 3; + return crypto.subtle.digest({ + name: 'SHA-256' + }, new TextEncoder().encode(combo)); + case 3: + hash = _context10.sent; + hash = Buffer.from(hash, 'binary'); + keyB64 = hash.toString('base64'); + k = keyB64.replace(/\+/g, '-').replace(/\//g, '_').replace(/\=/g, ''); + jwkKey = { + kty: 'oct', + k: k, + ext: false, + alg: 'A256GCM' + }; + _context10.next = 10; + return crypto.subtle.importKey('jwk', jwkKey, { + name: 'AES-GCM' + }, false, ['encrypt', 'decrypt']); + case 10: + return _context10.abrupt("return", _context10.sent); + case 11: + case "end": + return _context10.stop(); + } + } + }, _callee10); + }))(); + }, + random: function random(len) { + return Buffer.from(crypto.getRandomValues(new Uint8Array(len))); + }, + encrypt: function encrypt(data, pair, cb, opt) { + var _this6 = this; + return _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee11() { + var key, msg, rand, ct, r; + return _regeneratorRuntime().wrap(function _callee11$(_context11) { + while (1) { + switch (_context11.prev = _context11.next) { + case 0: + if (opt === void 0) { + opt = {}; + } + key = pair.epriv || pair; + if (!(undefined === data)) { + _context11.next = 4; + break; + } + throw '`undefined` not allowed.'; + case 4: + msg = typeof data == 'string' ? data : JSON.stringify(data); // Gun.SEA doesn't preserve data type: "0" -> 0. Should we change this? + rand = { + s: _this6.random(9), + iv: _this6.random(15) + }; // consider making this 9 and 15 or 18 or 12 to reduce == padding. + _context11.next = 8; + return _this6.aeskey(key, rand.s).then(function (aes) { + return crypto.subtle.encrypt({ + name: opt.name || 'AES-GCM', + iv: new Uint8Array(rand.iv) + }, aes, new TextEncoder().encode(msg)); + }); + case 8: + ct = _context11.sent; + r = { + // @ts-ignore + ct: Buffer.from(ct, 'binary').toString(opt.encode || 'base64'), + iv: rand.iv.toString(opt.encode || 'base64'), + s: rand.s.toString(opt.encode || 'base64') + }; + if (!opt.raw) { + r = 'SEA' + JSON.stringify(r); + } + if (cb) { + try { + cb(r); + } catch (e) { + console.log(e); + } + } + return _context11.abrupt("return", r); + case 13: + case "end": + return _context11.stop(); + } + } + }, _callee11); + }))(); + }, + decrypt: function decrypt(data, pair, cb, opt) { + var _this7 = this; + return _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee12() { + var key, json, buf, bufiv, bufct, ct, text, r; + return _regeneratorRuntime().wrap(function _callee12$(_context12) { + while (1) { + switch (_context12.prev = _context12.next) { + case 0: + if (opt === void 0) { + opt = {}; + } + key = pair.epriv || pair; + try { + data = JSON.parse(data); + } catch (e) {} + if (data.indexOf('SEA{') === 0) { + json = JSON.parse(data.slice(3)); + } else { + json = JSON.parse(data); + } + if (!(!json.ct || !json.iv || !json.s)) { + _context12.next = 6; + break; + } + throw 'Invalid ciphertext ' + json; + case 6: + buf = Buffer.from(json.s, opt.encode || 'base64'); + bufiv = Buffer.from(json.iv, opt.encode || 'base64'); + bufct = Buffer.from(json.ct, opt.encode || 'base64'); + _context12.next = 11; + return _this7.aeskey(key, buf).then(function (aes) { + return crypto.subtle.decrypt({ + name: opt.name || 'AES-GCM', + iv: new Uint8Array(bufiv), + tagLength: 128 + }, aes, new Uint8Array(bufct)); + }); + case 11: + ct = _context12.sent; + text = new TextDecoder('utf8').decode(ct); + r = text; + try { + r = JSON.parse(text); + } catch (_e) {} + if (cb) { + try { + cb(r); + } catch (e) { + console.log(e); + } + } + return _context12.abrupt("return", r); + case 17: + case "end": + return _context12.stop(); + } + } + }, _callee12); + }))(); + } + }; + + var ELECTRON_GUN_URL = 'http://localhost:8767/gun'; + var maxConnectedPeers = 1; + var DEFAULT_PEERS = { + 'wss://gun-rs.iris.to/gun': {} + }; + if (self.window) { + var loc = window.location; + var host = loc.host; + var is_localhost_but_not_dev = /*#__PURE__*/host.startsWith('localhost') && host !== 'localhost:8080'; + if (loc.hostname.endsWith('herokuapp.com') || is_localhost_but_not_dev) { + Object.keys(DEFAULT_PEERS).forEach(function (url) { + return DEFAULT_PEERS[url].enabled = false; + }); + DEFAULT_PEERS[loc.origin + "/gun"] = { + enabled: true + }; + } + } + /** + * Networking and peer management utilities + */ + var peers = { + known: {}, + /** */add: function add(peer) { + var _this = this; + return _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() { + var url, secret, encryptedUrl, encryptedUrlHash; + return _regeneratorRuntime().wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + if (peer.from) { + Object.keys(_this.known).forEach(function (k) { + if (_this.known[k].from === peer.from) { + // remove previous peer url from the same user + delete _this.known[k]; + } + }); + } + url = peer.url || ''; + _this.known[url] = _this.known[url] || _.omit(peer, ['url']); + if (!(peer.visibility === 'public')) { + _context.next = 17; + break; + } + _context.next = 6; + return Key.secret(session.getKey().epub, session.getKey()); + case 6: + _context.t0 = _context.sent; + if (_context.t0) { + _context.next = 9; + break; + } + _context.t0 = ''; + case 9: + secret = _context.t0; + _context.next = 12; + return Key.encrypt(peer.url, secret); + case 12: + encryptedUrl = _context.sent; + _context.next = 15; + return util.getHash(encryptedUrl); + case 15: + encryptedUrlHash = _context.sent; + global$1().user().get('peers').get(encryptedUrlHash).put({ + url: peer.url, + lastSeen: new Date().toISOString() + }); + case 17: + if (peer.enabled !== false) { + peer.url && _this.connect(peer.url); // this calls savePeers() + } else { + _this.save(); + } + case 18: + case "end": + return _context.stop(); + } + } + }, _callee); + }))(); + }, + /** */remove: function remove(url) { + delete this.known[url]; + this.save(); + }, + /** */disconnect: function disconnect(peerFromGun) { + global$1().on('bye', peerFromGun); + peerFromGun.url = ''; + }, + save: function save() { + // TODO store them in iris.local() instead of localStorage + localStorage.setItem('gunPeers', JSON.stringify(this.known)); + }, + getSaved: function getSaved() { + var p = localStorage.getItem('gunPeers'); + if (p && p !== 'undefined') { + p = JSON.parse(p); + } else { + p = DEFAULT_PEERS; + } + if (util.isElectron) { + p[ELECTRON_GUN_URL] = {}; + } + Object.keys(p).forEach(function (k) { + return _.defaults(p[k], { + enabled: true + }); + }); + return p; + }, + /** */reset: function reset() { + localStorage.setItem('gunPeers', ''); + this.known = this.getSaved(); + }, + /** */connect: function connect(url) { + if (!url) { + return; + } + if (this.isMixedContent(url)) { + return; + } + if (this.known[url]) { + this.known[url].enabled = true; + global$1().opt({ + peers: [url] + }); + this.save(); + } else { + this.add({ + url: url + }); + } + }, + /** */disable: function disable(url, peerFromGun) { + this.known[url].enabled = false; + if (peerFromGun) { + this.disconnect(peerFromGun); + } + this.save(); + }, + isMixedContent: function isMixedContent(url) { + if (!url) { + return false; + } + return window.location.protocol === 'https:' && url.indexOf('http:') === 0; + }, + random: function random() { + var _this2 = this; + var connectToLocalElectron = util.isElectron && this.known[ELECTRON_GUN_URL] && this.known[ELECTRON_GUN_URL].enabled !== false; + var sampleSize = connectToLocalElectron ? Math.max(maxConnectedPeers - 1, 1) : maxConnectedPeers; + var sample = _.sampleSize(Object.keys(_.pickBy(this.known, function (peer, url) { + return !_this2.isMixedContent(url) && peer.enabled && !(util.isElectron && url === ELECTRON_GUN_URL); + })), sampleSize); + if (sample && connectToLocalElectron) { + sample.push(ELECTRON_GUN_URL); + } + console.log('sample', sample, JSON.stringify(this.known)); + return sample; + }, + checkGunPeerCount: function checkGunPeerCount() { + return; + }, + init: function init() { + var _this4 = this; + this.known = this.getSaved(); + /* use the default value of 1 for now because of memory issue + local().get('settings').get('maxConnectedPeers').on(n => { + if (n !== undefined) maxConnectedPeers = n; + }); + */ + setInterval(function () { + return _this4.checkGunPeerCount(); + }, 1000); + } + }; + + function generateUuid() { + return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { + var r = Math.random() * 16 | 0, + v = c == 'x' ? r : r & 0x3 | 0x8; + return v.toString(16); + }); + } + var Actor = /*#__PURE__*/function () { + function Actor(id) { + if (id === void 0) { + id = generateUuid(); + } + this.id = id; + } + var _proto = Actor.prototype; + _proto.handle = function handle(_message) { + throw new Error('not implemented'); + } + // so we can support a similar api as Channels + ; + _proto.postMessage = function postMessage(message) { + this.handle(message); + }; + return Actor; + }(); + + var Message = /*#__PURE__*/function () { + function Message() {} + // When Messages are sent over BroadcastChannel, class name is lost. + Message.fromObject = function fromObject(obj) { + if (obj.type === 'get') { + return Get.fromObject(obj); + } else if (obj.type === 'put') { + return Put.fromObject(obj); + } else { + throw new Error('not implemented'); + } + }; + Message.deserialize = /*#__PURE__*/function () { + var _deserialize = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(str, from) { + var obj; + return _regeneratorRuntime().wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + obj = JSON.parse(str); + if (!obj.get) { + _context.next = 5; + break; + } + return _context.abrupt("return", Get.deserialize(obj, str, from)); + case 5: + if (!obj.put) { + _context.next = 9; + break; + } + return _context.abrupt("return", Put.deserialize(obj, str, from)); + case 9: + if (!(obj.dam && obj.dam === "hi")) { + _context.next = 13; + break; + } + return _context.abrupt("return", Hi.deserialize(obj)); + case 13: + throw new Error('unknown message type'); + case 14: + case "end": + return _context.stop(); + } + } + }, _callee); + })); + function deserialize(_x, _x2) { + return _deserialize.apply(this, arguments); + } + return deserialize; + }(); + var _proto = Message.prototype; + _proto.serialize = function serialize() { + throw new Error('not implemented'); + }; + return Message; + }(); + function generateMsgId() { + return Math.random().toString(36).slice(2, 10); + } + var Get = /*#__PURE__*/function () { + function Get(id, nodeId, from, recipients, childKey, jsonStr, checksum) { + this.type = 'get'; + this.id = id; + this.from = from; + this.nodeId = nodeId; + this.recipients = recipients; + this.childKey = childKey; + this.jsonStr = jsonStr; + this.checksum = checksum; + } + var _proto2 = Get.prototype; + _proto2.serialize = function serialize() { + if (this.jsonStr) { + return this.jsonStr; + } + // TODO remove "global/", replace /^user\// with ~ + var nodeId = this.nodeId.replace(/^global\//, '').replace(/^user\//, '~'); + var obj = { + "#": this.id, + get: { + "#": nodeId, + ".": this.childKey + } + }; + if (this.childKey) { + obj.get['.'] = this.childKey; + } + this.jsonStr = JSON.stringify(obj); + return this.jsonStr; + }; + Get.deserialize = /*#__PURE__*/function () { + var _deserialize2 = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(obj, jsonStr, from) { + var id, nodeId, childKey; + return _regeneratorRuntime().wrap(function _callee2$(_context2) { + while (1) { + switch (_context2.prev = _context2.next) { + case 0: + id = obj['#']; + nodeId = obj.get['#']; // TODO add "global/" prefix, replace /^~/ with "user/" + if (nodeId.startsWith('~')) { + nodeId = 'user/' + nodeId.slice(1); + } + nodeId = 'global/' + nodeId; + childKey = obj.get['.']; + return _context2.abrupt("return", new Get(id, nodeId, from, undefined, childKey, jsonStr)); + case 6: + case "end": + return _context2.stop(); + } + } + }, _callee2); + })); + function deserialize(_x3, _x4, _x5) { + return _deserialize2.apply(this, arguments); + } + return deserialize; + }(); + Get.fromObject = function fromObject(obj) { + return new Get(obj.id, obj.nodeId, obj.from, obj.recipients, obj.childKey, obj.jsonStr, obj.checksum); + }; + Get["new"] = function _new(nodeId, from, recipients, childKey, jsonStr, checksum) { + var id = generateMsgId(); + return new Get(id, nodeId, from, recipients, childKey, jsonStr, checksum); + }; + return Get; + }(); + var Put = /*#__PURE__*/function () { + function Put(id, updatedNodes, from, inResponseTo, recipients, jsonStr, checksum) { + this.type = 'put'; + this.id = id; + this.from = from; + this.updatedNodes = updatedNodes; + this.inResponseTo = inResponseTo; + this.recipients = recipients; + this.jsonStr = jsonStr; + this.checksum = checksum; + } + var _proto3 = Put.prototype; + _proto3.serialize = function serialize() { + var obj = { + "#": this.id, + "put": {} + }; + // iterate over this.updatedNodes + for (var _i = 0, _Object$entries = Object.entries(this.updatedNodes); _i < _Object$entries.length; _i++) { + var _Object$entries$_i = _Object$entries[_i], + nodeId = _Object$entries$_i[0], + children = _Object$entries$_i[1]; + var myNodeId = nodeId.replace(/^global\//, '').replace(/^user\//, '~'); + var node = obj.put[myNodeId] = {}; + for (var _i2 = 0, _Object$entries2 = Object.entries(children); _i2 < _Object$entries2.length; _i2++) { + var _Object$entries2$_i = _Object$entries2[_i2], + childKey = _Object$entries2$_i[0], + childValue = _Object$entries2$_i[1]; + if (!childValue) { + continue; + } + var data = childValue; + node[childKey] = data.value; + node["_"] = node["_"] || {}; + node["_"][">"] = node["_"][">"] || {}; + node["_"][">"][childKey] = data.updatedAt; + } + } + return JSON.stringify(obj); + }; + Put.deserialize = /*#__PURE__*/function () { + var _deserialize3 = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3(obj, jsonStr, from) { + var id, updatedNodes, _i3, _Object$entries3, _Object$entries3$_i, nodeId, c, children, node, isUserSpace, _i4, _Object$entries4, _Object$entries4$_i, childKey, childValue, user, signatureObj, timestamp, value, signedObj, signature, signedStr, updatedAt, myNodeId; + return _regeneratorRuntime().wrap(function _callee3$(_context3) { + while (1) { + switch (_context3.prev = _context3.next) { + case 0: + id = obj['#']; + updatedNodes = {}; + _i3 = 0, _Object$entries3 = Object.entries(obj.put); + case 3: + if (!(_i3 < _Object$entries3.length)) { + _context3.next = 37; + break; + } + _Object$entries3$_i = _Object$entries3[_i3], nodeId = _Object$entries3$_i[0], c = _Object$entries3$_i[1]; + children = c; + node = {}; + isUserSpace = nodeId.startsWith('~'); + _i4 = 0, _Object$entries4 = Object.entries(children); + case 9: + if (!(_i4 < _Object$entries4.length)) { + _context3.next = 32; + break; + } + _Object$entries4$_i = _Object$entries4[_i4], childKey = _Object$entries4$_i[0], childValue = _Object$entries4$_i[1]; + if (!(childKey === '_')) { + _context3.next = 13; + break; + } + return _context3.abrupt("continue", 29); + case 13: + if (!isUserSpace) { + _context3.next = 27; + break; + } + user = nodeId.split('/')[0].slice(1); + signatureObj = JSON.parse(childValue); + timestamp = children['_']['>'][childKey]; + value = signatureObj[':']; + signedObj = { + "#": nodeId, + ".": childKey, + ":": value, + ">": timestamp + }; + signature = signatureObj['~']; + signedStr = JSON.stringify(signedObj); + _context3.next = 23; + return Key.verify({ + s: signature, + m: signedStr + }, user); + case 23: + _context3.t0 = _context3.sent; + _context3.t1 = undefined; + if (!(_context3.t0 === _context3.t1)) { + _context3.next = 27; + break; + } + throw new Error("invalid signature in " + nodeId + " of " + signedStr); + case 27: + // TODO test hash space validity + updatedAt = children['_']['>'][childKey]; + node[childKey] = { + value: childValue, + updatedAt: updatedAt + }; + case 29: + _i4++; + _context3.next = 9; + break; + case 32: + myNodeId = 'global/' + nodeId.replace(/^~/, 'user/'); + updatedNodes[myNodeId] = node; + case 34: + _i3++; + _context3.next = 3; + break; + case 37: + return _context3.abrupt("return", new Put(id, updatedNodes, from, undefined, undefined, jsonStr)); + case 38: + case "end": + return _context3.stop(); + } + } + }, _callee3); + })); + function deserialize(_x6, _x7, _x8) { + return _deserialize3.apply(this, arguments); + } + return deserialize; + }(); + Put.fromObject = function fromObject(obj) { + return new Put(obj.id, obj.updatedNodes, obj.from, obj.inResponseTo, obj.recipients, obj.jsonStr, obj.checksum); + }; + Put["new"] = function _new(updatedNodes, from, inResponseTo, recipients, jsonStr, checksum) { + var id = generateMsgId(); + return new Put(id, updatedNodes, from, inResponseTo, recipients, jsonStr, checksum); + }; + Put.newFromKv = function newFromKv(key, children, from) { + var updatedNodes = {}; + updatedNodes[key] = children; + return Put["new"](updatedNodes, from); + }; + return Put; + }(); + var Hi = /*#__PURE__*/function () { + function Hi(peerId, jsonStr) { + this.type = 'hi'; + this.peerId = peerId; + this.jsonStr = jsonStr; + } + //{"#":"aHHO9Srurq9nh6Q9","dam":"hi"} + var _proto4 = Hi.prototype; + _proto4.serialize = function serialize() { + if (this.jsonStr) { + return this.jsonStr; + } + var obj = { + dam: "hi", + "#": this.peerId + }; + this.jsonStr = JSON.stringify(obj); + return this.jsonStr; + }; + Hi.deserialize = function deserialize(obj) { + var peerId = obj['#']; + return new Hi(peerId); + }; + return Hi; + }(); + + class QuickLRU extends Map { + constructor(options = {}) { + super(); + + if (!(options.maxSize && options.maxSize > 0)) { + throw new TypeError('`maxSize` must be a number greater than 0'); + } + + if (typeof options.maxAge === 'number' && options.maxAge === 0) { + throw new TypeError('`maxAge` must be a number greater than 0'); + } + + // TODO: Use private class fields when ESLint supports them. + this.maxSize = options.maxSize; + this.maxAge = options.maxAge || Number.POSITIVE_INFINITY; + this.onEviction = options.onEviction; + this.cache = new Map(); + this.oldCache = new Map(); + this._size = 0; + } + + // TODO: Use private class methods when targeting Node.js 16. + _emitEvictions(cache) { + if (typeof this.onEviction !== 'function') { + return; + } + + for (const [key, item] of cache) { + this.onEviction(key, item.value); + } + } + + _deleteIfExpired(key, item) { + if (typeof item.expiry === 'number' && item.expiry <= Date.now()) { + if (typeof this.onEviction === 'function') { + this.onEviction(key, item.value); + } + + return this.delete(key); + } + + return false; + } + + _getOrDeleteIfExpired(key, item) { + const deleted = this._deleteIfExpired(key, item); + if (deleted === false) { + return item.value; + } + } + + _getItemValue(key, item) { + return item.expiry ? this._getOrDeleteIfExpired(key, item) : item.value; + } + + _peek(key, cache) { + const item = cache.get(key); + + return this._getItemValue(key, item); + } + + _set(key, value) { + this.cache.set(key, value); + this._size++; + + if (this._size >= this.maxSize) { + this._size = 0; + this._emitEvictions(this.oldCache); + this.oldCache = this.cache; + this.cache = new Map(); + } + } + + _moveToRecent(key, item) { + this.oldCache.delete(key); + this._set(key, item); + } + + * _entriesAscending() { + for (const item of this.oldCache) { + const [key, value] = item; + if (!this.cache.has(key)) { + const deleted = this._deleteIfExpired(key, value); + if (deleted === false) { + yield item; + } + } + } + + for (const item of this.cache) { + const [key, value] = item; + const deleted = this._deleteIfExpired(key, value); + if (deleted === false) { + yield item; + } + } + } + + get(key) { + if (this.cache.has(key)) { + const item = this.cache.get(key); + + return this._getItemValue(key, item); + } + + if (this.oldCache.has(key)) { + const item = this.oldCache.get(key); + if (this._deleteIfExpired(key, item) === false) { + this._moveToRecent(key, item); + return item.value; + } + } + } + + set(key, value, {maxAge = this.maxAge} = {}) { + const expiry = + typeof maxAge === 'number' && maxAge !== Number.POSITIVE_INFINITY ? + Date.now() + maxAge : + undefined; + if (this.cache.has(key)) { + this.cache.set(key, { + value, + expiry + }); + } else { + this._set(key, {value, expiry}); + } + } + + has(key) { + if (this.cache.has(key)) { + return !this._deleteIfExpired(key, this.cache.get(key)); + } + + if (this.oldCache.has(key)) { + return !this._deleteIfExpired(key, this.oldCache.get(key)); + } + + return false; + } + + peek(key) { + if (this.cache.has(key)) { + return this._peek(key, this.cache); + } + + if (this.oldCache.has(key)) { + return this._peek(key, this.oldCache); + } + } + + delete(key) { + const deleted = this.cache.delete(key); + if (deleted) { + this._size--; + } + + return this.oldCache.delete(key) || deleted; + } + + clear() { + this.cache.clear(); + this.oldCache.clear(); + this._size = 0; + } + + resize(newSize) { + if (!(newSize && newSize > 0)) { + throw new TypeError('`maxSize` must be a number greater than 0'); + } + + const items = [...this._entriesAscending()]; + const removeCount = items.length - newSize; + if (removeCount < 0) { + this.cache = new Map(items); + this.oldCache = new Map(); + this._size = items.length; + } else { + if (removeCount > 0) { + this._emitEvictions(items.slice(0, removeCount)); + } + + this.oldCache = new Map(items.slice(removeCount)); + this.cache = new Map(); + this._size = 0; + } + + this.maxSize = newSize; + } + + * keys() { + for (const [key] of this) { + yield key; + } + } + + * values() { + for (const [, value] of this) { + yield value; + } + } + + * [Symbol.iterator]() { + for (const item of this.cache) { + const [key, value] = item; + const deleted = this._deleteIfExpired(key, value); + if (deleted === false) { + yield [key, value.value]; + } + } + + for (const item of this.oldCache) { + const [key, value] = item; + if (!this.cache.has(key)) { + const deleted = this._deleteIfExpired(key, value); + if (deleted === false) { + yield [key, value.value]; + } + } + } + } + + * entriesDescending() { + let items = [...this.cache]; + for (let i = items.length - 1; i >= 0; --i) { + const item = items[i]; + const [key, value] = item; + const deleted = this._deleteIfExpired(key, value); + if (deleted === false) { + yield [key, value.value]; + } + } + + items = [...this.oldCache]; + for (let i = items.length - 1; i >= 0; --i) { + const item = items[i]; + const [key, value] = item; + if (!this.cache.has(key)) { + const deleted = this._deleteIfExpired(key, value); + if (deleted === false) { + yield [key, value.value]; + } + } + } + } + + * entriesAscending() { + for (const [key, value] of this._entriesAscending()) { + yield [key, value.value]; + } + } + + get size() { + if (!this._size) { + return this.oldCache.size; + } + + let oldCacheSize = 0; + for (const key of this.oldCache.keys()) { + if (!this.cache.has(key)) { + oldCacheSize++; + } + } + + return Math.min(this._size + oldCacheSize, this.maxSize); + } + + entries() { + return this.entriesAscending(); + } + + forEach(callbackFunction, thisArgument = this) { + for (const [key, value] of this.entriesAscending()) { + callbackFunction.call(thisArgument, value, key, this); + } + } + + get [Symbol.toStringTag]() { + return JSON.stringify([...this.entriesAscending()]); + } + } + + var Memory = /*#__PURE__*/function (_Actor) { + _inheritsLoose(Memory, _Actor); + function Memory(config) { + var _this; + if (config === void 0) { + config = {}; + } + _this = _Actor.call(this) || this; + _this.config = {}; + _this.store = new QuickLRU({ + maxSize: 10000 + }); + _this.config = config; + return _this; + } + var _proto = Memory.prototype; + _proto.handle = function handle(message) { + if (message instanceof Put) { + this.handlePut(message); + } else if (message instanceof Get) { + this.handleGet(message); + } else { + console.log('Memory got unknown message', message); + } + }; + _proto.handleGet = function handleGet(message) { + if (!message.from) { + console.log('no from in get message'); + return; + } + var children = this.store.get(message.nodeId); + if (children) { + //console.log('have', message.nodeId, children); + var putMessage = Put.newFromKv(message.nodeId, children, this); + putMessage.inResponseTo = message.id; + message.from && message.from.postMessage(putMessage); + } + }; + _proto.mergeAndSave = function mergeAndSave(nodeName, children) { + var existing = this.store.get(nodeName); + // TODO check updatedAt timestamp + if (existing === undefined) { + this.store.set(nodeName, children); + } else { + for (var _i = 0, _Object$entries = Object.entries(children); _i < _Object$entries.length; _i++) { + var _Object$entries$_i = _Object$entries[_i], + key = _Object$entries$_i[0], + value = _Object$entries$_i[1]; + if (existing[key] && existing[key].updatedAt >= value.updatedAt) { + continue; + } + existing[key] = value; + } + this.store.set(nodeName, existing); + } + }; + _proto.handlePut = /*#__PURE__*/function () { + var _handlePut = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(put) { + var _i2, _Object$entries2, _Object$entries2$_i, nodeName, children; + return _regeneratorRuntime().wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + _i2 = 0, _Object$entries2 = Object.entries(put.updatedNodes); + case 1: + if (!(_i2 < _Object$entries2.length)) { + _context.next = 11; + break; + } + _Object$entries2$_i = _Object$entries2[_i2], nodeName = _Object$entries2$_i[0], children = _Object$entries2$_i[1]; + if (children) { + _context.next = 7; + break; + } + console.log('deleting', nodeName); + this.store["delete"](nodeName); + return _context.abrupt("continue", 8); + case 7: + this.mergeAndSave(nodeName, children); + case 8: + _i2++; + _context.next = 1; + break; + case 11: + case "end": + return _context.stop(); + } + } + }, _callee, this); + })); + function handlePut(_x) { + return _handlePut.apply(this, arguments); + } + return handlePut; + }(); + return Memory; + }(Actor); + + /* + * Dexie.js - a minimalistic wrapper for IndexedDB + * =============================================== + * + * By David Fahlander, david.fahlander@gmail.com + * + * Version 3.2.2, Wed Apr 27 2022 + * + * https://dexie.org + * + * Apache License Version 2.0, January 2004, http://www.apache.org/licenses/ + */ + + /*! ***************************************************************************** + Copyright (c) Microsoft Corporation. + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted. + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH + REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, + INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM + LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + PERFORMANCE OF THIS SOFTWARE. + ***************************************************************************** */ + var __assign = function() { + __assign = Object.assign || function __assign(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); + }; + function __spreadArray(to, from, pack) { + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || Array.prototype.slice.call(from)); + } + + var _global = typeof globalThis !== 'undefined' ? globalThis : + typeof self !== 'undefined' ? self : + typeof window !== 'undefined' ? window : + global; + + var keys = Object.keys; + var isArray = Array.isArray; + if (typeof Promise !== 'undefined' && !_global.Promise) { + _global.Promise = Promise; + } + function extend(obj, extension) { + if (typeof extension !== 'object') + return obj; + keys(extension).forEach(function (key) { + obj[key] = extension[key]; + }); + return obj; + } + var getProto = Object.getPrototypeOf; + var _hasOwn = {}.hasOwnProperty; + function hasOwn(obj, prop) { + return _hasOwn.call(obj, prop); + } + function props(proto, extension) { + if (typeof extension === 'function') + extension = extension(getProto(proto)); + (typeof Reflect === "undefined" ? keys : Reflect.ownKeys)(extension).forEach(function (key) { + setProp(proto, key, extension[key]); + }); + } + var defineProperty = Object.defineProperty; + function setProp(obj, prop, functionOrGetSet, options) { + defineProperty(obj, prop, extend(functionOrGetSet && hasOwn(functionOrGetSet, "get") && typeof functionOrGetSet.get === 'function' ? + { get: functionOrGetSet.get, set: functionOrGetSet.set, configurable: true } : + { value: functionOrGetSet, configurable: true, writable: true }, options)); + } + function derive(Child) { + return { + from: function (Parent) { + Child.prototype = Object.create(Parent.prototype); + setProp(Child.prototype, "constructor", Child); + return { + extend: props.bind(null, Child.prototype) + }; + } + }; + } + var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; + function getPropertyDescriptor(obj, prop) { + var pd = getOwnPropertyDescriptor(obj, prop); + var proto; + return pd || (proto = getProto(obj)) && getPropertyDescriptor(proto, prop); + } + var _slice = [].slice; + function slice(args, start, end) { + return _slice.call(args, start, end); + } + function override(origFunc, overridedFactory) { + return overridedFactory(origFunc); + } + function assert(b) { + if (!b) + throw new Error("Assertion Failed"); + } + function asap$1(fn) { + if (_global.setImmediate) + setImmediate(fn); + else + setTimeout(fn, 0); + } + function arrayToObject(array, extractor) { + return array.reduce(function (result, item, i) { + var nameAndValue = extractor(item, i); + if (nameAndValue) + result[nameAndValue[0]] = nameAndValue[1]; + return result; + }, {}); + } + function tryCatch(fn, onerror, args) { + try { + fn.apply(null, args); + } + catch (ex) { + onerror && onerror(ex); + } + } + function getByKeyPath(obj, keyPath) { + if (hasOwn(obj, keyPath)) + return obj[keyPath]; + if (!keyPath) + return obj; + if (typeof keyPath !== 'string') { + var rv = []; + for (var i = 0, l = keyPath.length; i < l; ++i) { + var val = getByKeyPath(obj, keyPath[i]); + rv.push(val); + } + return rv; + } + var period = keyPath.indexOf('.'); + if (period !== -1) { + var innerObj = obj[keyPath.substr(0, period)]; + return innerObj === undefined ? undefined : getByKeyPath(innerObj, keyPath.substr(period + 1)); + } + return undefined; + } + function setByKeyPath(obj, keyPath, value) { + if (!obj || keyPath === undefined) + return; + if ('isFrozen' in Object && Object.isFrozen(obj)) + return; + if (typeof keyPath !== 'string' && 'length' in keyPath) { + assert(typeof value !== 'string' && 'length' in value); + for (var i = 0, l = keyPath.length; i < l; ++i) { + setByKeyPath(obj, keyPath[i], value[i]); + } + } + else { + var period = keyPath.indexOf('.'); + if (period !== -1) { + var currentKeyPath = keyPath.substr(0, period); + var remainingKeyPath = keyPath.substr(period + 1); + if (remainingKeyPath === "") + if (value === undefined) { + if (isArray(obj) && !isNaN(parseInt(currentKeyPath))) + obj.splice(currentKeyPath, 1); + else + delete obj[currentKeyPath]; + } + else + obj[currentKeyPath] = value; + else { + var innerObj = obj[currentKeyPath]; + if (!innerObj || !hasOwn(obj, currentKeyPath)) + innerObj = (obj[currentKeyPath] = {}); + setByKeyPath(innerObj, remainingKeyPath, value); + } + } + else { + if (value === undefined) { + if (isArray(obj) && !isNaN(parseInt(keyPath))) + obj.splice(keyPath, 1); + else + delete obj[keyPath]; + } + else + obj[keyPath] = value; + } + } + } + function delByKeyPath(obj, keyPath) { + if (typeof keyPath === 'string') + setByKeyPath(obj, keyPath, undefined); + else if ('length' in keyPath) + [].map.call(keyPath, function (kp) { + setByKeyPath(obj, kp, undefined); + }); + } + function shallowClone(obj) { + var rv = {}; + for (var m in obj) { + if (hasOwn(obj, m)) + rv[m] = obj[m]; + } + return rv; + } + var concat = [].concat; + function flatten(a) { + return concat.apply([], a); + } + var intrinsicTypeNames = "Boolean,String,Date,RegExp,Blob,File,FileList,FileSystemFileHandle,ArrayBuffer,DataView,Uint8ClampedArray,ImageBitmap,ImageData,Map,Set,CryptoKey" + .split(',').concat(flatten([8, 16, 32, 64].map(function (num) { return ["Int", "Uint", "Float"].map(function (t) { return t + num + "Array"; }); }))).filter(function (t) { return _global[t]; }); + var intrinsicTypes = intrinsicTypeNames.map(function (t) { return _global[t]; }); + arrayToObject(intrinsicTypeNames, function (x) { return [x, true]; }); + var circularRefs = null; + function deepClone(any) { + circularRefs = typeof WeakMap !== 'undefined' && new WeakMap(); + var rv = innerDeepClone(any); + circularRefs = null; + return rv; + } + function innerDeepClone(any) { + if (!any || typeof any !== 'object') + return any; + var rv = circularRefs && circularRefs.get(any); + if (rv) + return rv; + if (isArray(any)) { + rv = []; + circularRefs && circularRefs.set(any, rv); + for (var i = 0, l = any.length; i < l; ++i) { + rv.push(innerDeepClone(any[i])); + } + } + else if (intrinsicTypes.indexOf(any.constructor) >= 0) { + rv = any; + } + else { + var proto = getProto(any); + rv = proto === Object.prototype ? {} : Object.create(proto); + circularRefs && circularRefs.set(any, rv); + for (var prop in any) { + if (hasOwn(any, prop)) { + rv[prop] = innerDeepClone(any[prop]); + } + } + } + return rv; + } + var toString = {}.toString; + function toStringTag(o) { + return toString.call(o).slice(8, -1); + } + var iteratorSymbol = typeof Symbol !== 'undefined' ? + Symbol.iterator : + '@@iterator'; + var getIteratorOf = typeof iteratorSymbol === "symbol" ? function (x) { + var i; + return x != null && (i = x[iteratorSymbol]) && i.apply(x); + } : function () { return null; }; + var NO_CHAR_ARRAY = {}; + function getArrayOf(arrayLike) { + var i, a, x, it; + if (arguments.length === 1) { + if (isArray(arrayLike)) + return arrayLike.slice(); + if (this === NO_CHAR_ARRAY && typeof arrayLike === 'string') + return [arrayLike]; + if ((it = getIteratorOf(arrayLike))) { + a = []; + while ((x = it.next()), !x.done) + a.push(x.value); + return a; + } + if (arrayLike == null) + return [arrayLike]; + i = arrayLike.length; + if (typeof i === 'number') { + a = new Array(i); + while (i--) + a[i] = arrayLike[i]; + return a; + } + return [arrayLike]; + } + i = arguments.length; + a = new Array(i); + while (i--) + a[i] = arguments[i]; + return a; + } + var isAsyncFunction = typeof Symbol !== 'undefined' + ? function (fn) { return fn[Symbol.toStringTag] === 'AsyncFunction'; } + : function () { return false; }; + + var debug = typeof location !== 'undefined' && + /^(http|https):\/\/(localhost|127\.0\.0\.1)/.test(location.href); + function setDebug(value, filter) { + debug = value; + libraryFilter = filter; + } + var libraryFilter = function () { return true; }; + var NEEDS_THROW_FOR_STACK = !new Error("").stack; + function getErrorWithStack() { + if (NEEDS_THROW_FOR_STACK) + try { + getErrorWithStack.arguments; + throw new Error(); + } + catch (e) { + return e; + } + return new Error(); + } + function prettyStack(exception, numIgnoredFrames) { + var stack = exception.stack; + if (!stack) + return ""; + numIgnoredFrames = (numIgnoredFrames || 0); + if (stack.indexOf(exception.name) === 0) + numIgnoredFrames += (exception.name + exception.message).split('\n').length; + return stack.split('\n') + .slice(numIgnoredFrames) + .filter(libraryFilter) + .map(function (frame) { return "\n" + frame; }) + .join(''); + } + + var dexieErrorNames = [ + 'Modify', + 'Bulk', + 'OpenFailed', + 'VersionChange', + 'Schema', + 'Upgrade', + 'InvalidTable', + 'MissingAPI', + 'NoSuchDatabase', + 'InvalidArgument', + 'SubTransaction', + 'Unsupported', + 'Internal', + 'DatabaseClosed', + 'PrematureCommit', + 'ForeignAwait' + ]; + var idbDomErrorNames = [ + 'Unknown', + 'Constraint', + 'Data', + 'TransactionInactive', + 'ReadOnly', + 'Version', + 'NotFound', + 'InvalidState', + 'InvalidAccess', + 'Abort', + 'Timeout', + 'QuotaExceeded', + 'Syntax', + 'DataClone' + ]; + var errorList = dexieErrorNames.concat(idbDomErrorNames); + var defaultTexts = { + VersionChanged: "Database version changed by other database connection", + DatabaseClosed: "Database has been closed", + Abort: "Transaction aborted", + TransactionInactive: "Transaction has already completed or failed", + MissingAPI: "IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb" + }; + function DexieError(name, msg) { + this._e = getErrorWithStack(); + this.name = name; + this.message = msg; + } + derive(DexieError).from(Error).extend({ + stack: { + get: function () { + return this._stack || + (this._stack = this.name + ": " + this.message + prettyStack(this._e, 2)); + } + }, + toString: function () { return this.name + ": " + this.message; } + }); + function getMultiErrorMessage(msg, failures) { + return msg + ". Errors: " + Object.keys(failures) + .map(function (key) { return failures[key].toString(); }) + .filter(function (v, i, s) { return s.indexOf(v) === i; }) + .join('\n'); + } + function ModifyError(msg, failures, successCount, failedKeys) { + this._e = getErrorWithStack(); + this.failures = failures; + this.failedKeys = failedKeys; + this.successCount = successCount; + this.message = getMultiErrorMessage(msg, failures); + } + derive(ModifyError).from(DexieError); + function BulkError(msg, failures) { + this._e = getErrorWithStack(); + this.name = "BulkError"; + this.failures = Object.keys(failures).map(function (pos) { return failures[pos]; }); + this.failuresByPos = failures; + this.message = getMultiErrorMessage(msg, failures); + } + derive(BulkError).from(DexieError); + var errnames = errorList.reduce(function (obj, name) { return (obj[name] = name + "Error", obj); }, {}); + var BaseException = DexieError; + var exceptions = errorList.reduce(function (obj, name) { + var fullName = name + "Error"; + function DexieError(msgOrInner, inner) { + this._e = getErrorWithStack(); + this.name = fullName; + if (!msgOrInner) { + this.message = defaultTexts[name] || fullName; + this.inner = null; + } + else if (typeof msgOrInner === 'string') { + this.message = "" + msgOrInner + (!inner ? '' : '\n ' + inner); + this.inner = inner || null; + } + else if (typeof msgOrInner === 'object') { + this.message = msgOrInner.name + " " + msgOrInner.message; + this.inner = msgOrInner; + } + } + derive(DexieError).from(BaseException); + obj[name] = DexieError; + return obj; + }, {}); + exceptions.Syntax = SyntaxError; + exceptions.Type = TypeError; + exceptions.Range = RangeError; + var exceptionMap = idbDomErrorNames.reduce(function (obj, name) { + obj[name + "Error"] = exceptions[name]; + return obj; + }, {}); + function mapError(domError, message) { + if (!domError || domError instanceof DexieError || domError instanceof TypeError || domError instanceof SyntaxError || !domError.name || !exceptionMap[domError.name]) + return domError; + var rv = new exceptionMap[domError.name](message || domError.message, domError); + if ("stack" in domError) { + setProp(rv, "stack", { get: function () { + return this.inner.stack; + } }); + } + return rv; + } + var fullNameExceptions = errorList.reduce(function (obj, name) { + if (["Syntax", "Type", "Range"].indexOf(name) === -1) + obj[name + "Error"] = exceptions[name]; + return obj; + }, {}); + fullNameExceptions.ModifyError = ModifyError; + fullNameExceptions.DexieError = DexieError; + fullNameExceptions.BulkError = BulkError; + + function nop() { } + function mirror(val) { return val; } + function pureFunctionChain(f1, f2) { + if (f1 == null || f1 === mirror) + return f2; + return function (val) { + return f2(f1(val)); + }; + } + function callBoth(on1, on2) { + return function () { + on1.apply(this, arguments); + on2.apply(this, arguments); + }; + } + function hookCreatingChain(f1, f2) { + if (f1 === nop) + return f2; + return function () { + var res = f1.apply(this, arguments); + if (res !== undefined) + arguments[0] = res; + var onsuccess = this.onsuccess, + onerror = this.onerror; + this.onsuccess = null; + this.onerror = null; + var res2 = f2.apply(this, arguments); + if (onsuccess) + this.onsuccess = this.onsuccess ? callBoth(onsuccess, this.onsuccess) : onsuccess; + if (onerror) + this.onerror = this.onerror ? callBoth(onerror, this.onerror) : onerror; + return res2 !== undefined ? res2 : res; + }; + } + function hookDeletingChain(f1, f2) { + if (f1 === nop) + return f2; + return function () { + f1.apply(this, arguments); + var onsuccess = this.onsuccess, + onerror = this.onerror; + this.onsuccess = this.onerror = null; + f2.apply(this, arguments); + if (onsuccess) + this.onsuccess = this.onsuccess ? callBoth(onsuccess, this.onsuccess) : onsuccess; + if (onerror) + this.onerror = this.onerror ? callBoth(onerror, this.onerror) : onerror; + }; + } + function hookUpdatingChain(f1, f2) { + if (f1 === nop) + return f2; + return function (modifications) { + var res = f1.apply(this, arguments); + extend(modifications, res); + var onsuccess = this.onsuccess, + onerror = this.onerror; + this.onsuccess = null; + this.onerror = null; + var res2 = f2.apply(this, arguments); + if (onsuccess) + this.onsuccess = this.onsuccess ? callBoth(onsuccess, this.onsuccess) : onsuccess; + if (onerror) + this.onerror = this.onerror ? callBoth(onerror, this.onerror) : onerror; + return res === undefined ? + (res2 === undefined ? undefined : res2) : + (extend(res, res2)); + }; + } + function reverseStoppableEventChain(f1, f2) { + if (f1 === nop) + return f2; + return function () { + if (f2.apply(this, arguments) === false) + return false; + return f1.apply(this, arguments); + }; + } + function promisableChain(f1, f2) { + if (f1 === nop) + return f2; + return function () { + var res = f1.apply(this, arguments); + if (res && typeof res.then === 'function') { + var thiz = this, i = arguments.length, args = new Array(i); + while (i--) + args[i] = arguments[i]; + return res.then(function () { + return f2.apply(thiz, args); + }); + } + return f2.apply(this, arguments); + }; + } + + var INTERNAL = {}; + var LONG_STACKS_CLIP_LIMIT = 100, + MAX_LONG_STACKS = 20, ZONE_ECHO_LIMIT = 100, _a$1 = typeof Promise === 'undefined' ? + [] : + (function () { + var globalP = Promise.resolve(); + if (typeof crypto === 'undefined' || !crypto.subtle) + return [globalP, getProto(globalP), globalP]; + var nativeP = crypto.subtle.digest("SHA-512", new Uint8Array([0])); + return [ + nativeP, + getProto(nativeP), + globalP + ]; + })(), resolvedNativePromise = _a$1[0], nativePromiseProto = _a$1[1], resolvedGlobalPromise = _a$1[2], nativePromiseThen = nativePromiseProto && nativePromiseProto.then; + var NativePromise = resolvedNativePromise && resolvedNativePromise.constructor; + var patchGlobalPromise = !!resolvedGlobalPromise; + var stack_being_generated = false; + var schedulePhysicalTick = resolvedGlobalPromise ? + function () { resolvedGlobalPromise.then(physicalTick); } + : + _global.setImmediate ? + setImmediate.bind(null, physicalTick) : + _global.MutationObserver ? + function () { + var hiddenDiv = document.createElement("div"); + (new MutationObserver(function () { + physicalTick(); + hiddenDiv = null; + })).observe(hiddenDiv, { attributes: true }); + hiddenDiv.setAttribute('i', '1'); + } : + function () { setTimeout(physicalTick, 0); }; + var asap = function (callback, args) { + microtickQueue.push([callback, args]); + if (needsNewPhysicalTick) { + schedulePhysicalTick(); + needsNewPhysicalTick = false; + } + }; + var isOutsideMicroTick = true, + needsNewPhysicalTick = true, + unhandledErrors = [], + rejectingErrors = [], + currentFulfiller = null, rejectionMapper = mirror; + var globalPSD = { + id: 'global', + global: true, + ref: 0, + unhandleds: [], + onunhandled: globalError, + pgp: false, + env: {}, + finalize: function () { + this.unhandleds.forEach(function (uh) { + try { + globalError(uh[0], uh[1]); + } + catch (e) { } + }); + } + }; + var PSD = globalPSD; + var microtickQueue = []; + var numScheduledCalls = 0; + var tickFinalizers = []; + function DexiePromise(fn) { + if (typeof this !== 'object') + throw new TypeError('Promises must be constructed via new'); + this._listeners = []; + this.onuncatched = nop; + this._lib = false; + var psd = (this._PSD = PSD); + if (debug) { + this._stackHolder = getErrorWithStack(); + this._prev = null; + this._numPrev = 0; + } + if (typeof fn !== 'function') { + if (fn !== INTERNAL) + throw new TypeError('Not a function'); + this._state = arguments[1]; + this._value = arguments[2]; + if (this._state === false) + handleRejection(this, this._value); + return; + } + this._state = null; + this._value = null; + ++psd.ref; + executePromiseTask(this, fn); + } + var thenProp = { + get: function () { + var psd = PSD, microTaskId = totalEchoes; + function then(onFulfilled, onRejected) { + var _this = this; + var possibleAwait = !psd.global && (psd !== PSD || microTaskId !== totalEchoes); + var cleanup = possibleAwait && !decrementExpectedAwaits(); + var rv = new DexiePromise(function (resolve, reject) { + propagateToListener(_this, new Listener(nativeAwaitCompatibleWrap(onFulfilled, psd, possibleAwait, cleanup), nativeAwaitCompatibleWrap(onRejected, psd, possibleAwait, cleanup), resolve, reject, psd)); + }); + debug && linkToPreviousPromise(rv, this); + return rv; + } + then.prototype = INTERNAL; + return then; + }, + set: function (value) { + setProp(this, 'then', value && value.prototype === INTERNAL ? + thenProp : + { + get: function () { + return value; + }, + set: thenProp.set + }); + } + }; + props(DexiePromise.prototype, { + then: thenProp, + _then: function (onFulfilled, onRejected) { + propagateToListener(this, new Listener(null, null, onFulfilled, onRejected, PSD)); + }, + catch: function (onRejected) { + if (arguments.length === 1) + return this.then(null, onRejected); + var type = arguments[0], handler = arguments[1]; + return typeof type === 'function' ? this.then(null, function (err) { + return err instanceof type ? handler(err) : PromiseReject(err); + }) + : this.then(null, function (err) { + return err && err.name === type ? handler(err) : PromiseReject(err); + }); + }, + finally: function (onFinally) { + return this.then(function (value) { + onFinally(); + return value; + }, function (err) { + onFinally(); + return PromiseReject(err); + }); + }, + stack: { + get: function () { + if (this._stack) + return this._stack; + try { + stack_being_generated = true; + var stacks = getStack(this, [], MAX_LONG_STACKS); + var stack = stacks.join("\nFrom previous: "); + if (this._state !== null) + this._stack = stack; + return stack; + } + finally { + stack_being_generated = false; + } + } + }, + timeout: function (ms, msg) { + var _this = this; + return ms < Infinity ? + new DexiePromise(function (resolve, reject) { + var handle = setTimeout(function () { return reject(new exceptions.Timeout(msg)); }, ms); + _this.then(resolve, reject).finally(clearTimeout.bind(null, handle)); + }) : this; + } + }); + if (typeof Symbol !== 'undefined' && Symbol.toStringTag) + setProp(DexiePromise.prototype, Symbol.toStringTag, 'Dexie.Promise'); + globalPSD.env = snapShot(); + function Listener(onFulfilled, onRejected, resolve, reject, zone) { + this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null; + this.onRejected = typeof onRejected === 'function' ? onRejected : null; + this.resolve = resolve; + this.reject = reject; + this.psd = zone; + } + props(DexiePromise, { + all: function () { + var values = getArrayOf.apply(null, arguments) + .map(onPossibleParallellAsync); + return new DexiePromise(function (resolve, reject) { + if (values.length === 0) + resolve([]); + var remaining = values.length; + values.forEach(function (a, i) { return DexiePromise.resolve(a).then(function (x) { + values[i] = x; + if (!--remaining) + resolve(values); + }, reject); }); + }); + }, + resolve: function (value) { + if (value instanceof DexiePromise) + return value; + if (value && typeof value.then === 'function') + return new DexiePromise(function (resolve, reject) { + value.then(resolve, reject); + }); + var rv = new DexiePromise(INTERNAL, true, value); + linkToPreviousPromise(rv, currentFulfiller); + return rv; + }, + reject: PromiseReject, + race: function () { + var values = getArrayOf.apply(null, arguments).map(onPossibleParallellAsync); + return new DexiePromise(function (resolve, reject) { + values.map(function (value) { return DexiePromise.resolve(value).then(resolve, reject); }); + }); + }, + PSD: { + get: function () { return PSD; }, + set: function (value) { return PSD = value; } + }, + totalEchoes: { get: function () { return totalEchoes; } }, + newPSD: newScope, + usePSD: usePSD, + scheduler: { + get: function () { return asap; }, + set: function (value) { asap = value; } + }, + rejectionMapper: { + get: function () { return rejectionMapper; }, + set: function (value) { rejectionMapper = value; } + }, + follow: function (fn, zoneProps) { + return new DexiePromise(function (resolve, reject) { + return newScope(function (resolve, reject) { + var psd = PSD; + psd.unhandleds = []; + psd.onunhandled = reject; + psd.finalize = callBoth(function () { + var _this = this; + run_at_end_of_this_or_next_physical_tick(function () { + _this.unhandleds.length === 0 ? resolve() : reject(_this.unhandleds[0]); + }); + }, psd.finalize); + fn(); + }, zoneProps, resolve, reject); + }); + } + }); + if (NativePromise) { + if (NativePromise.allSettled) + setProp(DexiePromise, "allSettled", function () { + var possiblePromises = getArrayOf.apply(null, arguments).map(onPossibleParallellAsync); + return new DexiePromise(function (resolve) { + if (possiblePromises.length === 0) + resolve([]); + var remaining = possiblePromises.length; + var results = new Array(remaining); + possiblePromises.forEach(function (p, i) { return DexiePromise.resolve(p).then(function (value) { return results[i] = { status: "fulfilled", value: value }; }, function (reason) { return results[i] = { status: "rejected", reason: reason }; }) + .then(function () { return --remaining || resolve(results); }); }); + }); + }); + if (NativePromise.any && typeof AggregateError !== 'undefined') + setProp(DexiePromise, "any", function () { + var possiblePromises = getArrayOf.apply(null, arguments).map(onPossibleParallellAsync); + return new DexiePromise(function (resolve, reject) { + if (possiblePromises.length === 0) + reject(new AggregateError([])); + var remaining = possiblePromises.length; + var failures = new Array(remaining); + possiblePromises.forEach(function (p, i) { return DexiePromise.resolve(p).then(function (value) { return resolve(value); }, function (failure) { + failures[i] = failure; + if (!--remaining) + reject(new AggregateError(failures)); + }); }); + }); + }); + } + function executePromiseTask(promise, fn) { + try { + fn(function (value) { + if (promise._state !== null) + return; + if (value === promise) + throw new TypeError('A promise cannot be resolved with itself.'); + var shouldExecuteTick = promise._lib && beginMicroTickScope(); + if (value && typeof value.then === 'function') { + executePromiseTask(promise, function (resolve, reject) { + value instanceof DexiePromise ? + value._then(resolve, reject) : + value.then(resolve, reject); + }); + } + else { + promise._state = true; + promise._value = value; + propagateAllListeners(promise); + } + if (shouldExecuteTick) + endMicroTickScope(); + }, handleRejection.bind(null, promise)); + } + catch (ex) { + handleRejection(promise, ex); + } + } + function handleRejection(promise, reason) { + rejectingErrors.push(reason); + if (promise._state !== null) + return; + var shouldExecuteTick = promise._lib && beginMicroTickScope(); + reason = rejectionMapper(reason); + promise._state = false; + promise._value = reason; + debug && reason !== null && typeof reason === 'object' && !reason._promise && tryCatch(function () { + var origProp = getPropertyDescriptor(reason, "stack"); + reason._promise = promise; + setProp(reason, "stack", { + get: function () { + return stack_being_generated ? + origProp && (origProp.get ? + origProp.get.apply(reason) : + origProp.value) : + promise.stack; + } + }); + }); + addPossiblyUnhandledError(promise); + propagateAllListeners(promise); + if (shouldExecuteTick) + endMicroTickScope(); + } + function propagateAllListeners(promise) { + var listeners = promise._listeners; + promise._listeners = []; + for (var i = 0, len = listeners.length; i < len; ++i) { + propagateToListener(promise, listeners[i]); + } + var psd = promise._PSD; + --psd.ref || psd.finalize(); + if (numScheduledCalls === 0) { + ++numScheduledCalls; + asap(function () { + if (--numScheduledCalls === 0) + finalizePhysicalTick(); + }, []); + } + } + function propagateToListener(promise, listener) { + if (promise._state === null) { + promise._listeners.push(listener); + return; + } + var cb = promise._state ? listener.onFulfilled : listener.onRejected; + if (cb === null) { + return (promise._state ? listener.resolve : listener.reject)(promise._value); + } + ++listener.psd.ref; + ++numScheduledCalls; + asap(callListener, [cb, promise, listener]); + } + function callListener(cb, promise, listener) { + try { + currentFulfiller = promise; + var ret, value = promise._value; + if (promise._state) { + ret = cb(value); + } + else { + if (rejectingErrors.length) + rejectingErrors = []; + ret = cb(value); + if (rejectingErrors.indexOf(value) === -1) + markErrorAsHandled(promise); + } + listener.resolve(ret); + } + catch (e) { + listener.reject(e); + } + finally { + currentFulfiller = null; + if (--numScheduledCalls === 0) + finalizePhysicalTick(); + --listener.psd.ref || listener.psd.finalize(); + } + } + function getStack(promise, stacks, limit) { + if (stacks.length === limit) + return stacks; + var stack = ""; + if (promise._state === false) { + var failure = promise._value, errorName, message; + if (failure != null) { + errorName = failure.name || "Error"; + message = failure.message || failure; + stack = prettyStack(failure, 0); + } + else { + errorName = failure; + message = ""; + } + stacks.push(errorName + (message ? ": " + message : "") + stack); + } + if (debug) { + stack = prettyStack(promise._stackHolder, 2); + if (stack && stacks.indexOf(stack) === -1) + stacks.push(stack); + if (promise._prev) + getStack(promise._prev, stacks, limit); + } + return stacks; + } + function linkToPreviousPromise(promise, prev) { + var numPrev = prev ? prev._numPrev + 1 : 0; + if (numPrev < LONG_STACKS_CLIP_LIMIT) { + promise._prev = prev; + promise._numPrev = numPrev; + } + } + function physicalTick() { + beginMicroTickScope() && endMicroTickScope(); + } + function beginMicroTickScope() { + var wasRootExec = isOutsideMicroTick; + isOutsideMicroTick = false; + needsNewPhysicalTick = false; + return wasRootExec; + } + function endMicroTickScope() { + var callbacks, i, l; + do { + while (microtickQueue.length > 0) { + callbacks = microtickQueue; + microtickQueue = []; + l = callbacks.length; + for (i = 0; i < l; ++i) { + var item = callbacks[i]; + item[0].apply(null, item[1]); + } + } + } while (microtickQueue.length > 0); + isOutsideMicroTick = true; + needsNewPhysicalTick = true; + } + function finalizePhysicalTick() { + var unhandledErrs = unhandledErrors; + unhandledErrors = []; + unhandledErrs.forEach(function (p) { + p._PSD.onunhandled.call(null, p._value, p); + }); + var finalizers = tickFinalizers.slice(0); + var i = finalizers.length; + while (i) + finalizers[--i](); + } + function run_at_end_of_this_or_next_physical_tick(fn) { + function finalizer() { + fn(); + tickFinalizers.splice(tickFinalizers.indexOf(finalizer), 1); + } + tickFinalizers.push(finalizer); + ++numScheduledCalls; + asap(function () { + if (--numScheduledCalls === 0) + finalizePhysicalTick(); + }, []); + } + function addPossiblyUnhandledError(promise) { + if (!unhandledErrors.some(function (p) { return p._value === promise._value; })) + unhandledErrors.push(promise); + } + function markErrorAsHandled(promise) { + var i = unhandledErrors.length; + while (i) + if (unhandledErrors[--i]._value === promise._value) { + unhandledErrors.splice(i, 1); + return; + } + } + function PromiseReject(reason) { + return new DexiePromise(INTERNAL, false, reason); + } + function wrap(fn, errorCatcher) { + var psd = PSD; + return function () { + var wasRootExec = beginMicroTickScope(), outerScope = PSD; + try { + switchToZone(psd, true); + return fn.apply(this, arguments); + } + catch (e) { + errorCatcher && errorCatcher(e); + } + finally { + switchToZone(outerScope, false); + if (wasRootExec) + endMicroTickScope(); + } + }; + } + var task = { awaits: 0, echoes: 0, id: 0 }; + var taskCounter = 0; + var zoneStack = []; + var zoneEchoes = 0; + var totalEchoes = 0; + var zone_id_counter = 0; + function newScope(fn, props, a1, a2) { + var parent = PSD, psd = Object.create(parent); + psd.parent = parent; + psd.ref = 0; + psd.global = false; + psd.id = ++zone_id_counter; + var globalEnv = globalPSD.env; + psd.env = patchGlobalPromise ? { + Promise: DexiePromise, + PromiseProp: { value: DexiePromise, configurable: true, writable: true }, + all: DexiePromise.all, + race: DexiePromise.race, + allSettled: DexiePromise.allSettled, + any: DexiePromise.any, + resolve: DexiePromise.resolve, + reject: DexiePromise.reject, + nthen: getPatchedPromiseThen(globalEnv.nthen, psd), + gthen: getPatchedPromiseThen(globalEnv.gthen, psd) + } : {}; + if (props) + extend(psd, props); + ++parent.ref; + psd.finalize = function () { + --this.parent.ref || this.parent.finalize(); + }; + var rv = usePSD(psd, fn, a1, a2); + if (psd.ref === 0) + psd.finalize(); + return rv; + } + function incrementExpectedAwaits() { + if (!task.id) + task.id = ++taskCounter; + ++task.awaits; + task.echoes += ZONE_ECHO_LIMIT; + return task.id; + } + function decrementExpectedAwaits() { + if (!task.awaits) + return false; + if (--task.awaits === 0) + task.id = 0; + task.echoes = task.awaits * ZONE_ECHO_LIMIT; + return true; + } + if (('' + nativePromiseThen).indexOf('[native code]') === -1) { + incrementExpectedAwaits = decrementExpectedAwaits = nop; + } + function onPossibleParallellAsync(possiblePromise) { + if (task.echoes && possiblePromise && possiblePromise.constructor === NativePromise) { + incrementExpectedAwaits(); + return possiblePromise.then(function (x) { + decrementExpectedAwaits(); + return x; + }, function (e) { + decrementExpectedAwaits(); + return rejection(e); + }); + } + return possiblePromise; + } + function zoneEnterEcho(targetZone) { + ++totalEchoes; + if (!task.echoes || --task.echoes === 0) { + task.echoes = task.id = 0; + } + zoneStack.push(PSD); + switchToZone(targetZone, true); + } + function zoneLeaveEcho() { + var zone = zoneStack[zoneStack.length - 1]; + zoneStack.pop(); + switchToZone(zone, false); + } + function switchToZone(targetZone, bEnteringZone) { + var currentZone = PSD; + if (bEnteringZone ? task.echoes && (!zoneEchoes++ || targetZone !== PSD) : zoneEchoes && (!--zoneEchoes || targetZone !== PSD)) { + enqueueNativeMicroTask(bEnteringZone ? zoneEnterEcho.bind(null, targetZone) : zoneLeaveEcho); + } + if (targetZone === PSD) + return; + PSD = targetZone; + if (currentZone === globalPSD) + globalPSD.env = snapShot(); + if (patchGlobalPromise) { + var GlobalPromise_1 = globalPSD.env.Promise; + var targetEnv = targetZone.env; + nativePromiseProto.then = targetEnv.nthen; + GlobalPromise_1.prototype.then = targetEnv.gthen; + if (currentZone.global || targetZone.global) { + Object.defineProperty(_global, 'Promise', targetEnv.PromiseProp); + GlobalPromise_1.all = targetEnv.all; + GlobalPromise_1.race = targetEnv.race; + GlobalPromise_1.resolve = targetEnv.resolve; + GlobalPromise_1.reject = targetEnv.reject; + if (targetEnv.allSettled) + GlobalPromise_1.allSettled = targetEnv.allSettled; + if (targetEnv.any) + GlobalPromise_1.any = targetEnv.any; + } + } + } + function snapShot() { + var GlobalPromise = _global.Promise; + return patchGlobalPromise ? { + Promise: GlobalPromise, + PromiseProp: Object.getOwnPropertyDescriptor(_global, "Promise"), + all: GlobalPromise.all, + race: GlobalPromise.race, + allSettled: GlobalPromise.allSettled, + any: GlobalPromise.any, + resolve: GlobalPromise.resolve, + reject: GlobalPromise.reject, + nthen: nativePromiseProto.then, + gthen: GlobalPromise.prototype.then + } : {}; + } + function usePSD(psd, fn, a1, a2, a3) { + var outerScope = PSD; + try { + switchToZone(psd, true); + return fn(a1, a2, a3); + } + finally { + switchToZone(outerScope, false); + } + } + function enqueueNativeMicroTask(job) { + nativePromiseThen.call(resolvedNativePromise, job); + } + function nativeAwaitCompatibleWrap(fn, zone, possibleAwait, cleanup) { + return typeof fn !== 'function' ? fn : function () { + var outerZone = PSD; + if (possibleAwait) + incrementExpectedAwaits(); + switchToZone(zone, true); + try { + return fn.apply(this, arguments); + } + finally { + switchToZone(outerZone, false); + if (cleanup) + enqueueNativeMicroTask(decrementExpectedAwaits); + } + }; + } + function getPatchedPromiseThen(origThen, zone) { + return function (onResolved, onRejected) { + return origThen.call(this, nativeAwaitCompatibleWrap(onResolved, zone), nativeAwaitCompatibleWrap(onRejected, zone)); + }; + } + var UNHANDLEDREJECTION = "unhandledrejection"; + function globalError(err, promise) { + var rv; + try { + rv = promise.onuncatched(err); + } + catch (e) { } + if (rv !== false) + try { + var event, eventData = { promise: promise, reason: err }; + if (_global.document && document.createEvent) { + event = document.createEvent('Event'); + event.initEvent(UNHANDLEDREJECTION, true, true); + extend(event, eventData); + } + else if (_global.CustomEvent) { + event = new CustomEvent(UNHANDLEDREJECTION, { detail: eventData }); + extend(event, eventData); + } + if (event && _global.dispatchEvent) { + dispatchEvent(event); + if (!_global.PromiseRejectionEvent && _global.onunhandledrejection) + try { + _global.onunhandledrejection(event); + } + catch (_) { } + } + if (debug && event && !event.defaultPrevented) { + console.warn("Unhandled rejection: " + (err.stack || err)); + } + } + catch (e) { } + } + var rejection = DexiePromise.reject; + + function tempTransaction(db, mode, storeNames, fn) { + if (!db.idbdb || (!db._state.openComplete && (!PSD.letThrough && !db._vip))) { + if (db._state.openComplete) { + return rejection(new exceptions.DatabaseClosed(db._state.dbOpenError)); + } + if (!db._state.isBeingOpened) { + if (!db._options.autoOpen) + return rejection(new exceptions.DatabaseClosed()); + db.open().catch(nop); + } + return db._state.dbReadyPromise.then(function () { return tempTransaction(db, mode, storeNames, fn); }); + } + else { + var trans = db._createTransaction(mode, storeNames, db._dbSchema); + try { + trans.create(); + db._state.PR1398_maxLoop = 3; + } + catch (ex) { + if (ex.name === errnames.InvalidState && db.isOpen() && --db._state.PR1398_maxLoop > 0) { + console.warn('Dexie: Need to reopen db'); + db._close(); + return db.open().then(function () { return tempTransaction(db, mode, storeNames, fn); }); + } + return rejection(ex); + } + return trans._promise(mode, function (resolve, reject) { + return newScope(function () { + PSD.trans = trans; + return fn(resolve, reject, trans); + }); + }).then(function (result) { + return trans._completion.then(function () { return result; }); + }); + } + } + + var DEXIE_VERSION = '3.2.2'; + var maxString = String.fromCharCode(65535); + var minKey = -Infinity; + var INVALID_KEY_ARGUMENT = "Invalid key provided. Keys must be of type string, number, Date or Array."; + var STRING_EXPECTED = "String expected."; + var connections = []; + var isIEOrEdge = typeof navigator !== 'undefined' && /(MSIE|Trident|Edge)/.test(navigator.userAgent); + var hasIEDeleteObjectStoreBug = isIEOrEdge; + var hangsOnDeleteLargeKeyRange = isIEOrEdge; + var dexieStackFrameFilter = function (frame) { return !/(dexie\.js|dexie\.min\.js)/.test(frame); }; + var DBNAMES_DB = '__dbnames'; + var READONLY = 'readonly'; + var READWRITE = 'readwrite'; + + function combine(filter1, filter2) { + return filter1 ? + filter2 ? + function () { return filter1.apply(this, arguments) && filter2.apply(this, arguments); } : + filter1 : + filter2; + } + + var AnyRange = { + type: 3 , + lower: -Infinity, + lowerOpen: false, + upper: [[]], + upperOpen: false + }; + + function workaroundForUndefinedPrimKey(keyPath) { + return typeof keyPath === "string" && !/\./.test(keyPath) + ? function (obj) { + if (obj[keyPath] === undefined && (keyPath in obj)) { + obj = deepClone(obj); + delete obj[keyPath]; + } + return obj; + } + : function (obj) { return obj; }; + } + + var Table = (function () { + function Table() { + } + Table.prototype._trans = function (mode, fn, writeLocked) { + var trans = this._tx || PSD.trans; + var tableName = this.name; + function checkTableInTransaction(resolve, reject, trans) { + if (!trans.schema[tableName]) + throw new exceptions.NotFound("Table " + tableName + " not part of transaction"); + return fn(trans.idbtrans, trans); + } + var wasRootExec = beginMicroTickScope(); + try { + return trans && trans.db === this.db ? + trans === PSD.trans ? + trans._promise(mode, checkTableInTransaction, writeLocked) : + newScope(function () { return trans._promise(mode, checkTableInTransaction, writeLocked); }, { trans: trans, transless: PSD.transless || PSD }) : + tempTransaction(this.db, mode, [this.name], checkTableInTransaction); + } + finally { + if (wasRootExec) + endMicroTickScope(); + } + }; + Table.prototype.get = function (keyOrCrit, cb) { + var _this = this; + if (keyOrCrit && keyOrCrit.constructor === Object) + return this.where(keyOrCrit).first(cb); + return this._trans('readonly', function (trans) { + return _this.core.get({ trans: trans, key: keyOrCrit }) + .then(function (res) { return _this.hook.reading.fire(res); }); + }).then(cb); + }; + Table.prototype.where = function (indexOrCrit) { + if (typeof indexOrCrit === 'string') + return new this.db.WhereClause(this, indexOrCrit); + if (isArray(indexOrCrit)) + return new this.db.WhereClause(this, "[" + indexOrCrit.join('+') + "]"); + var keyPaths = keys(indexOrCrit); + if (keyPaths.length === 1) + return this + .where(keyPaths[0]) + .equals(indexOrCrit[keyPaths[0]]); + var compoundIndex = this.schema.indexes.concat(this.schema.primKey).filter(function (ix) { + return ix.compound && + keyPaths.every(function (keyPath) { return ix.keyPath.indexOf(keyPath) >= 0; }) && + ix.keyPath.every(function (keyPath) { return keyPaths.indexOf(keyPath) >= 0; }); + })[0]; + if (compoundIndex && this.db._maxKey !== maxString) + return this + .where(compoundIndex.name) + .equals(compoundIndex.keyPath.map(function (kp) { return indexOrCrit[kp]; })); + if (!compoundIndex && debug) + console.warn("The query " + JSON.stringify(indexOrCrit) + " on " + this.name + " would benefit of a " + + ("compound index [" + keyPaths.join('+') + "]")); + var idxByName = this.schema.idxByName; + var idb = this.db._deps.indexedDB; + function equals(a, b) { + try { + return idb.cmp(a, b) === 0; + } + catch (e) { + return false; + } + } + var _a = keyPaths.reduce(function (_a, keyPath) { + var prevIndex = _a[0], prevFilterFn = _a[1]; + var index = idxByName[keyPath]; + var value = indexOrCrit[keyPath]; + return [ + prevIndex || index, + prevIndex || !index ? + combine(prevFilterFn, index && index.multi ? + function (x) { + var prop = getByKeyPath(x, keyPath); + return isArray(prop) && prop.some(function (item) { return equals(value, item); }); + } : function (x) { return equals(value, getByKeyPath(x, keyPath)); }) + : prevFilterFn + ]; + }, [null, null]), idx = _a[0], filterFunction = _a[1]; + return idx ? + this.where(idx.name).equals(indexOrCrit[idx.keyPath]) + .filter(filterFunction) : + compoundIndex ? + this.filter(filterFunction) : + this.where(keyPaths).equals(''); + }; + Table.prototype.filter = function (filterFunction) { + return this.toCollection().and(filterFunction); + }; + Table.prototype.count = function (thenShortcut) { + return this.toCollection().count(thenShortcut); + }; + Table.prototype.offset = function (offset) { + return this.toCollection().offset(offset); + }; + Table.prototype.limit = function (numRows) { + return this.toCollection().limit(numRows); + }; + Table.prototype.each = function (callback) { + return this.toCollection().each(callback); + }; + Table.prototype.toArray = function (thenShortcut) { + return this.toCollection().toArray(thenShortcut); + }; + Table.prototype.toCollection = function () { + return new this.db.Collection(new this.db.WhereClause(this)); + }; + Table.prototype.orderBy = function (index) { + return new this.db.Collection(new this.db.WhereClause(this, isArray(index) ? + "[" + index.join('+') + "]" : + index)); + }; + Table.prototype.reverse = function () { + return this.toCollection().reverse(); + }; + Table.prototype.mapToClass = function (constructor) { + this.schema.mappedClass = constructor; + var readHook = function (obj) { + if (!obj) + return obj; + var res = Object.create(constructor.prototype); + for (var m in obj) + if (hasOwn(obj, m)) + try { + res[m] = obj[m]; + } + catch (_) { } + return res; + }; + if (this.schema.readHook) { + this.hook.reading.unsubscribe(this.schema.readHook); + } + this.schema.readHook = readHook; + this.hook("reading", readHook); + return constructor; + }; + Table.prototype.defineClass = function () { + function Class(content) { + extend(this, content); + } + return this.mapToClass(Class); + }; + Table.prototype.add = function (obj, key) { + var _this = this; + var _a = this.schema.primKey, auto = _a.auto, keyPath = _a.keyPath; + var objToAdd = obj; + if (keyPath && auto) { + objToAdd = workaroundForUndefinedPrimKey(keyPath)(obj); + } + return this._trans('readwrite', function (trans) { + return _this.core.mutate({ trans: trans, type: 'add', keys: key != null ? [key] : null, values: [objToAdd] }); + }).then(function (res) { return res.numFailures ? DexiePromise.reject(res.failures[0]) : res.lastResult; }) + .then(function (lastResult) { + if (keyPath) { + try { + setByKeyPath(obj, keyPath, lastResult); + } + catch (_) { } + } + return lastResult; + }); + }; + Table.prototype.update = function (keyOrObject, modifications) { + if (typeof keyOrObject === 'object' && !isArray(keyOrObject)) { + var key = getByKeyPath(keyOrObject, this.schema.primKey.keyPath); + if (key === undefined) + return rejection(new exceptions.InvalidArgument("Given object does not contain its primary key")); + try { + if (typeof modifications !== "function") { + keys(modifications).forEach(function (keyPath) { + setByKeyPath(keyOrObject, keyPath, modifications[keyPath]); + }); + } + else { + modifications(keyOrObject, { value: keyOrObject, primKey: key }); + } + } + catch (_a) { + } + return this.where(":id").equals(key).modify(modifications); + } + else { + return this.where(":id").equals(keyOrObject).modify(modifications); + } + }; + Table.prototype.put = function (obj, key) { + var _this = this; + var _a = this.schema.primKey, auto = _a.auto, keyPath = _a.keyPath; + var objToAdd = obj; + if (keyPath && auto) { + objToAdd = workaroundForUndefinedPrimKey(keyPath)(obj); + } + return this._trans('readwrite', function (trans) { return _this.core.mutate({ trans: trans, type: 'put', values: [objToAdd], keys: key != null ? [key] : null }); }) + .then(function (res) { return res.numFailures ? DexiePromise.reject(res.failures[0]) : res.lastResult; }) + .then(function (lastResult) { + if (keyPath) { + try { + setByKeyPath(obj, keyPath, lastResult); + } + catch (_) { } + } + return lastResult; + }); + }; + Table.prototype.delete = function (key) { + var _this = this; + return this._trans('readwrite', function (trans) { return _this.core.mutate({ trans: trans, type: 'delete', keys: [key] }); }) + .then(function (res) { return res.numFailures ? DexiePromise.reject(res.failures[0]) : undefined; }); + }; + Table.prototype.clear = function () { + var _this = this; + return this._trans('readwrite', function (trans) { return _this.core.mutate({ trans: trans, type: 'deleteRange', range: AnyRange }); }) + .then(function (res) { return res.numFailures ? DexiePromise.reject(res.failures[0]) : undefined; }); + }; + Table.prototype.bulkGet = function (keys) { + var _this = this; + return this._trans('readonly', function (trans) { + return _this.core.getMany({ + keys: keys, + trans: trans + }).then(function (result) { return result.map(function (res) { return _this.hook.reading.fire(res); }); }); + }); + }; + Table.prototype.bulkAdd = function (objects, keysOrOptions, options) { + var _this = this; + var keys = Array.isArray(keysOrOptions) ? keysOrOptions : undefined; + options = options || (keys ? undefined : keysOrOptions); + var wantResults = options ? options.allKeys : undefined; + return this._trans('readwrite', function (trans) { + var _a = _this.schema.primKey, auto = _a.auto, keyPath = _a.keyPath; + if (keyPath && keys) + throw new exceptions.InvalidArgument("bulkAdd(): keys argument invalid on tables with inbound keys"); + if (keys && keys.length !== objects.length) + throw new exceptions.InvalidArgument("Arguments objects and keys must have the same length"); + var numObjects = objects.length; + var objectsToAdd = keyPath && auto ? + objects.map(workaroundForUndefinedPrimKey(keyPath)) : + objects; + return _this.core.mutate({ trans: trans, type: 'add', keys: keys, values: objectsToAdd, wantResults: wantResults }) + .then(function (_a) { + var numFailures = _a.numFailures, results = _a.results, lastResult = _a.lastResult, failures = _a.failures; + var result = wantResults ? results : lastResult; + if (numFailures === 0) + return result; + throw new BulkError(_this.name + ".bulkAdd(): " + numFailures + " of " + numObjects + " operations failed", failures); + }); + }); + }; + Table.prototype.bulkPut = function (objects, keysOrOptions, options) { + var _this = this; + var keys = Array.isArray(keysOrOptions) ? keysOrOptions : undefined; + options = options || (keys ? undefined : keysOrOptions); + var wantResults = options ? options.allKeys : undefined; + return this._trans('readwrite', function (trans) { + var _a = _this.schema.primKey, auto = _a.auto, keyPath = _a.keyPath; + if (keyPath && keys) + throw new exceptions.InvalidArgument("bulkPut(): keys argument invalid on tables with inbound keys"); + if (keys && keys.length !== objects.length) + throw new exceptions.InvalidArgument("Arguments objects and keys must have the same length"); + var numObjects = objects.length; + var objectsToPut = keyPath && auto ? + objects.map(workaroundForUndefinedPrimKey(keyPath)) : + objects; + return _this.core.mutate({ trans: trans, type: 'put', keys: keys, values: objectsToPut, wantResults: wantResults }) + .then(function (_a) { + var numFailures = _a.numFailures, results = _a.results, lastResult = _a.lastResult, failures = _a.failures; + var result = wantResults ? results : lastResult; + if (numFailures === 0) + return result; + throw new BulkError(_this.name + ".bulkPut(): " + numFailures + " of " + numObjects + " operations failed", failures); + }); + }); + }; + Table.prototype.bulkDelete = function (keys) { + var _this = this; + var numKeys = keys.length; + return this._trans('readwrite', function (trans) { + return _this.core.mutate({ trans: trans, type: 'delete', keys: keys }); + }).then(function (_a) { + var numFailures = _a.numFailures, lastResult = _a.lastResult, failures = _a.failures; + if (numFailures === 0) + return lastResult; + throw new BulkError(_this.name + ".bulkDelete(): " + numFailures + " of " + numKeys + " operations failed", failures); + }); + }; + return Table; + }()); + + function Events(ctx) { + var evs = {}; + var rv = function (eventName, subscriber) { + if (subscriber) { + var i = arguments.length, args = new Array(i - 1); + while (--i) + args[i - 1] = arguments[i]; + evs[eventName].subscribe.apply(null, args); + return ctx; + } + else if (typeof (eventName) === 'string') { + return evs[eventName]; + } + }; + rv.addEventType = add; + for (var i = 1, l = arguments.length; i < l; ++i) { + add(arguments[i]); + } + return rv; + function add(eventName, chainFunction, defaultFunction) { + if (typeof eventName === 'object') + return addConfiguredEvents(eventName); + if (!chainFunction) + chainFunction = reverseStoppableEventChain; + if (!defaultFunction) + defaultFunction = nop; + var context = { + subscribers: [], + fire: defaultFunction, + subscribe: function (cb) { + if (context.subscribers.indexOf(cb) === -1) { + context.subscribers.push(cb); + context.fire = chainFunction(context.fire, cb); + } + }, + unsubscribe: function (cb) { + context.subscribers = context.subscribers.filter(function (fn) { return fn !== cb; }); + context.fire = context.subscribers.reduce(chainFunction, defaultFunction); + } + }; + evs[eventName] = rv[eventName] = context; + return context; + } + function addConfiguredEvents(cfg) { + keys(cfg).forEach(function (eventName) { + var args = cfg[eventName]; + if (isArray(args)) { + add(eventName, cfg[eventName][0], cfg[eventName][1]); + } + else if (args === 'asap') { + var context = add(eventName, mirror, function fire() { + var i = arguments.length, args = new Array(i); + while (i--) + args[i] = arguments[i]; + context.subscribers.forEach(function (fn) { + asap$1(function fireEvent() { + fn.apply(null, args); + }); + }); + }); + } + else + throw new exceptions.InvalidArgument("Invalid event config"); + }); + } + } + + function makeClassConstructor(prototype, constructor) { + derive(constructor).from({ prototype: prototype }); + return constructor; + } + + function createTableConstructor(db) { + return makeClassConstructor(Table.prototype, function Table(name, tableSchema, trans) { + this.db = db; + this._tx = trans; + this.name = name; + this.schema = tableSchema; + this.hook = db._allTables[name] ? db._allTables[name].hook : Events(null, { + "creating": [hookCreatingChain, nop], + "reading": [pureFunctionChain, mirror], + "updating": [hookUpdatingChain, nop], + "deleting": [hookDeletingChain, nop] + }); + }); + } + + function isPlainKeyRange(ctx, ignoreLimitFilter) { + return !(ctx.filter || ctx.algorithm || ctx.or) && + (ignoreLimitFilter ? ctx.justLimit : !ctx.replayFilter); + } + function addFilter(ctx, fn) { + ctx.filter = combine(ctx.filter, fn); + } + function addReplayFilter(ctx, factory, isLimitFilter) { + var curr = ctx.replayFilter; + ctx.replayFilter = curr ? function () { return combine(curr(), factory()); } : factory; + ctx.justLimit = isLimitFilter && !curr; + } + function addMatchFilter(ctx, fn) { + ctx.isMatch = combine(ctx.isMatch, fn); + } + function getIndexOrStore(ctx, coreSchema) { + if (ctx.isPrimKey) + return coreSchema.primaryKey; + var index = coreSchema.getIndexByKeyPath(ctx.index); + if (!index) + throw new exceptions.Schema("KeyPath " + ctx.index + " on object store " + coreSchema.name + " is not indexed"); + return index; + } + function openCursor(ctx, coreTable, trans) { + var index = getIndexOrStore(ctx, coreTable.schema); + return coreTable.openCursor({ + trans: trans, + values: !ctx.keysOnly, + reverse: ctx.dir === 'prev', + unique: !!ctx.unique, + query: { + index: index, + range: ctx.range + } + }); + } + function iter(ctx, fn, coreTrans, coreTable) { + var filter = ctx.replayFilter ? combine(ctx.filter, ctx.replayFilter()) : ctx.filter; + if (!ctx.or) { + return iterate(openCursor(ctx, coreTable, coreTrans), combine(ctx.algorithm, filter), fn, !ctx.keysOnly && ctx.valueMapper); + } + else { + var set_1 = {}; + var union = function (item, cursor, advance) { + if (!filter || filter(cursor, advance, function (result) { return cursor.stop(result); }, function (err) { return cursor.fail(err); })) { + var primaryKey = cursor.primaryKey; + var key = '' + primaryKey; + if (key === '[object ArrayBuffer]') + key = '' + new Uint8Array(primaryKey); + if (!hasOwn(set_1, key)) { + set_1[key] = true; + fn(item, cursor, advance); + } + } + }; + return Promise.all([ + ctx.or._iterate(union, coreTrans), + iterate(openCursor(ctx, coreTable, coreTrans), ctx.algorithm, union, !ctx.keysOnly && ctx.valueMapper) + ]); + } + } + function iterate(cursorPromise, filter, fn, valueMapper) { + var mappedFn = valueMapper ? function (x, c, a) { return fn(valueMapper(x), c, a); } : fn; + var wrappedFn = wrap(mappedFn); + return cursorPromise.then(function (cursor) { + if (cursor) { + return cursor.start(function () { + var c = function () { return cursor.continue(); }; + if (!filter || filter(cursor, function (advancer) { return c = advancer; }, function (val) { cursor.stop(val); c = nop; }, function (e) { cursor.fail(e); c = nop; })) + wrappedFn(cursor.value, cursor, function (advancer) { return c = advancer; }); + c(); + }); + } + }); + } + + function cmp(a, b) { + try { + var ta = type(a); + var tb = type(b); + if (ta !== tb) { + if (ta === 'Array') + return 1; + if (tb === 'Array') + return -1; + if (ta === 'binary') + return 1; + if (tb === 'binary') + return -1; + if (ta === 'string') + return 1; + if (tb === 'string') + return -1; + if (ta === 'Date') + return 1; + if (tb !== 'Date') + return NaN; + return -1; + } + switch (ta) { + case 'number': + case 'Date': + case 'string': + return a > b ? 1 : a < b ? -1 : 0; + case 'binary': { + return compareUint8Arrays(getUint8Array(a), getUint8Array(b)); + } + case 'Array': + return compareArrays(a, b); + } + } + catch (_a) { } + return NaN; + } + function compareArrays(a, b) { + var al = a.length; + var bl = b.length; + var l = al < bl ? al : bl; + for (var i = 0; i < l; ++i) { + var res = cmp(a[i], b[i]); + if (res !== 0) + return res; + } + return al === bl ? 0 : al < bl ? -1 : 1; + } + function compareUint8Arrays(a, b) { + var al = a.length; + var bl = b.length; + var l = al < bl ? al : bl; + for (var i = 0; i < l; ++i) { + if (a[i] !== b[i]) + return a[i] < b[i] ? -1 : 1; + } + return al === bl ? 0 : al < bl ? -1 : 1; + } + function type(x) { + var t = typeof x; + if (t !== 'object') + return t; + if (ArrayBuffer.isView(x)) + return 'binary'; + var tsTag = toStringTag(x); + return tsTag === 'ArrayBuffer' ? 'binary' : tsTag; + } + function getUint8Array(a) { + if (a instanceof Uint8Array) + return a; + if (ArrayBuffer.isView(a)) + return new Uint8Array(a.buffer, a.byteOffset, a.byteLength); + return new Uint8Array(a); + } + + var Collection = (function () { + function Collection() { + } + Collection.prototype._read = function (fn, cb) { + var ctx = this._ctx; + return ctx.error ? + ctx.table._trans(null, rejection.bind(null, ctx.error)) : + ctx.table._trans('readonly', fn).then(cb); + }; + Collection.prototype._write = function (fn) { + var ctx = this._ctx; + return ctx.error ? + ctx.table._trans(null, rejection.bind(null, ctx.error)) : + ctx.table._trans('readwrite', fn, "locked"); + }; + Collection.prototype._addAlgorithm = function (fn) { + var ctx = this._ctx; + ctx.algorithm = combine(ctx.algorithm, fn); + }; + Collection.prototype._iterate = function (fn, coreTrans) { + return iter(this._ctx, fn, coreTrans, this._ctx.table.core); + }; + Collection.prototype.clone = function (props) { + var rv = Object.create(this.constructor.prototype), ctx = Object.create(this._ctx); + if (props) + extend(ctx, props); + rv._ctx = ctx; + return rv; + }; + Collection.prototype.raw = function () { + this._ctx.valueMapper = null; + return this; + }; + Collection.prototype.each = function (fn) { + var ctx = this._ctx; + return this._read(function (trans) { return iter(ctx, fn, trans, ctx.table.core); }); + }; + Collection.prototype.count = function (cb) { + var _this = this; + return this._read(function (trans) { + var ctx = _this._ctx; + var coreTable = ctx.table.core; + if (isPlainKeyRange(ctx, true)) { + return coreTable.count({ + trans: trans, + query: { + index: getIndexOrStore(ctx, coreTable.schema), + range: ctx.range + } + }).then(function (count) { return Math.min(count, ctx.limit); }); + } + else { + var count = 0; + return iter(ctx, function () { ++count; return false; }, trans, coreTable) + .then(function () { return count; }); + } + }).then(cb); + }; + Collection.prototype.sortBy = function (keyPath, cb) { + var parts = keyPath.split('.').reverse(), lastPart = parts[0], lastIndex = parts.length - 1; + function getval(obj, i) { + if (i) + return getval(obj[parts[i]], i - 1); + return obj[lastPart]; + } + var order = this._ctx.dir === "next" ? 1 : -1; + function sorter(a, b) { + var aVal = getval(a, lastIndex), bVal = getval(b, lastIndex); + return aVal < bVal ? -order : aVal > bVal ? order : 0; + } + return this.toArray(function (a) { + return a.sort(sorter); + }).then(cb); + }; + Collection.prototype.toArray = function (cb) { + var _this = this; + return this._read(function (trans) { + var ctx = _this._ctx; + if (ctx.dir === 'next' && isPlainKeyRange(ctx, true) && ctx.limit > 0) { + var valueMapper_1 = ctx.valueMapper; + var index = getIndexOrStore(ctx, ctx.table.core.schema); + return ctx.table.core.query({ + trans: trans, + limit: ctx.limit, + values: true, + query: { + index: index, + range: ctx.range + } + }).then(function (_a) { + var result = _a.result; + return valueMapper_1 ? result.map(valueMapper_1) : result; + }); + } + else { + var a_1 = []; + return iter(ctx, function (item) { return a_1.push(item); }, trans, ctx.table.core).then(function () { return a_1; }); + } + }, cb); + }; + Collection.prototype.offset = function (offset) { + var ctx = this._ctx; + if (offset <= 0) + return this; + ctx.offset += offset; + if (isPlainKeyRange(ctx)) { + addReplayFilter(ctx, function () { + var offsetLeft = offset; + return function (cursor, advance) { + if (offsetLeft === 0) + return true; + if (offsetLeft === 1) { + --offsetLeft; + return false; + } + advance(function () { + cursor.advance(offsetLeft); + offsetLeft = 0; + }); + return false; + }; + }); + } + else { + addReplayFilter(ctx, function () { + var offsetLeft = offset; + return function () { return (--offsetLeft < 0); }; + }); + } + return this; + }; + Collection.prototype.limit = function (numRows) { + this._ctx.limit = Math.min(this._ctx.limit, numRows); + addReplayFilter(this._ctx, function () { + var rowsLeft = numRows; + return function (cursor, advance, resolve) { + if (--rowsLeft <= 0) + advance(resolve); + return rowsLeft >= 0; + }; + }, true); + return this; + }; + Collection.prototype.until = function (filterFunction, bIncludeStopEntry) { + addFilter(this._ctx, function (cursor, advance, resolve) { + if (filterFunction(cursor.value)) { + advance(resolve); + return bIncludeStopEntry; + } + else { + return true; + } + }); + return this; + }; + Collection.prototype.first = function (cb) { + return this.limit(1).toArray(function (a) { return a[0]; }).then(cb); + }; + Collection.prototype.last = function (cb) { + return this.reverse().first(cb); + }; + Collection.prototype.filter = function (filterFunction) { + addFilter(this._ctx, function (cursor) { + return filterFunction(cursor.value); + }); + addMatchFilter(this._ctx, filterFunction); + return this; + }; + Collection.prototype.and = function (filter) { + return this.filter(filter); + }; + Collection.prototype.or = function (indexName) { + return new this.db.WhereClause(this._ctx.table, indexName, this); + }; + Collection.prototype.reverse = function () { + this._ctx.dir = (this._ctx.dir === "prev" ? "next" : "prev"); + if (this._ondirectionchange) + this._ondirectionchange(this._ctx.dir); + return this; + }; + Collection.prototype.desc = function () { + return this.reverse(); + }; + Collection.prototype.eachKey = function (cb) { + var ctx = this._ctx; + ctx.keysOnly = !ctx.isMatch; + return this.each(function (val, cursor) { cb(cursor.key, cursor); }); + }; + Collection.prototype.eachUniqueKey = function (cb) { + this._ctx.unique = "unique"; + return this.eachKey(cb); + }; + Collection.prototype.eachPrimaryKey = function (cb) { + var ctx = this._ctx; + ctx.keysOnly = !ctx.isMatch; + return this.each(function (val, cursor) { cb(cursor.primaryKey, cursor); }); + }; + Collection.prototype.keys = function (cb) { + var ctx = this._ctx; + ctx.keysOnly = !ctx.isMatch; + var a = []; + return this.each(function (item, cursor) { + a.push(cursor.key); + }).then(function () { + return a; + }).then(cb); + }; + Collection.prototype.primaryKeys = function (cb) { + var ctx = this._ctx; + if (ctx.dir === 'next' && isPlainKeyRange(ctx, true) && ctx.limit > 0) { + return this._read(function (trans) { + var index = getIndexOrStore(ctx, ctx.table.core.schema); + return ctx.table.core.query({ + trans: trans, + values: false, + limit: ctx.limit, + query: { + index: index, + range: ctx.range + } + }); + }).then(function (_a) { + var result = _a.result; + return result; + }).then(cb); + } + ctx.keysOnly = !ctx.isMatch; + var a = []; + return this.each(function (item, cursor) { + a.push(cursor.primaryKey); + }).then(function () { + return a; + }).then(cb); + }; + Collection.prototype.uniqueKeys = function (cb) { + this._ctx.unique = "unique"; + return this.keys(cb); + }; + Collection.prototype.firstKey = function (cb) { + return this.limit(1).keys(function (a) { return a[0]; }).then(cb); + }; + Collection.prototype.lastKey = function (cb) { + return this.reverse().firstKey(cb); + }; + Collection.prototype.distinct = function () { + var ctx = this._ctx, idx = ctx.index && ctx.table.schema.idxByName[ctx.index]; + if (!idx || !idx.multi) + return this; + var set = {}; + addFilter(this._ctx, function (cursor) { + var strKey = cursor.primaryKey.toString(); + var found = hasOwn(set, strKey); + set[strKey] = true; + return !found; + }); + return this; + }; + Collection.prototype.modify = function (changes) { + var _this = this; + var ctx = this._ctx; + return this._write(function (trans) { + var modifyer; + if (typeof changes === 'function') { + modifyer = changes; + } + else { + var keyPaths = keys(changes); + var numKeys = keyPaths.length; + modifyer = function (item) { + var anythingModified = false; + for (var i = 0; i < numKeys; ++i) { + var keyPath = keyPaths[i], val = changes[keyPath]; + if (getByKeyPath(item, keyPath) !== val) { + setByKeyPath(item, keyPath, val); + anythingModified = true; + } + } + return anythingModified; + }; + } + var coreTable = ctx.table.core; + var _a = coreTable.schema.primaryKey, outbound = _a.outbound, extractKey = _a.extractKey; + var limit = _this.db._options.modifyChunkSize || 200; + var totalFailures = []; + var successCount = 0; + var failedKeys = []; + var applyMutateResult = function (expectedCount, res) { + var failures = res.failures, numFailures = res.numFailures; + successCount += expectedCount - numFailures; + for (var _i = 0, _a = keys(failures); _i < _a.length; _i++) { + var pos = _a[_i]; + totalFailures.push(failures[pos]); + } + }; + return _this.clone().primaryKeys().then(function (keys) { + var nextChunk = function (offset) { + var count = Math.min(limit, keys.length - offset); + return coreTable.getMany({ + trans: trans, + keys: keys.slice(offset, offset + count), + cache: "immutable" + }).then(function (values) { + var addValues = []; + var putValues = []; + var putKeys = outbound ? [] : null; + var deleteKeys = []; + for (var i = 0; i < count; ++i) { + var origValue = values[i]; + var ctx_1 = { + value: deepClone(origValue), + primKey: keys[offset + i] + }; + if (modifyer.call(ctx_1, ctx_1.value, ctx_1) !== false) { + if (ctx_1.value == null) { + deleteKeys.push(keys[offset + i]); + } + else if (!outbound && cmp(extractKey(origValue), extractKey(ctx_1.value)) !== 0) { + deleteKeys.push(keys[offset + i]); + addValues.push(ctx_1.value); + } + else { + putValues.push(ctx_1.value); + if (outbound) + putKeys.push(keys[offset + i]); + } + } + } + var criteria = isPlainKeyRange(ctx) && + ctx.limit === Infinity && + (typeof changes !== 'function' || changes === deleteCallback) && { + index: ctx.index, + range: ctx.range + }; + return Promise.resolve(addValues.length > 0 && + coreTable.mutate({ trans: trans, type: 'add', values: addValues }) + .then(function (res) { + for (var pos in res.failures) { + deleteKeys.splice(parseInt(pos), 1); + } + applyMutateResult(addValues.length, res); + })).then(function () { return (putValues.length > 0 || (criteria && typeof changes === 'object')) && + coreTable.mutate({ + trans: trans, + type: 'put', + keys: putKeys, + values: putValues, + criteria: criteria, + changeSpec: typeof changes !== 'function' + && changes + }).then(function (res) { return applyMutateResult(putValues.length, res); }); }).then(function () { return (deleteKeys.length > 0 || (criteria && changes === deleteCallback)) && + coreTable.mutate({ + trans: trans, + type: 'delete', + keys: deleteKeys, + criteria: criteria + }).then(function (res) { return applyMutateResult(deleteKeys.length, res); }); }).then(function () { + return keys.length > offset + count && nextChunk(offset + limit); + }); + }); + }; + return nextChunk(0).then(function () { + if (totalFailures.length > 0) + throw new ModifyError("Error modifying one or more objects", totalFailures, successCount, failedKeys); + return keys.length; + }); + }); + }); + }; + Collection.prototype.delete = function () { + var ctx = this._ctx, range = ctx.range; + if (isPlainKeyRange(ctx) && + ((ctx.isPrimKey && !hangsOnDeleteLargeKeyRange) || range.type === 3 )) + { + return this._write(function (trans) { + var primaryKey = ctx.table.core.schema.primaryKey; + var coreRange = range; + return ctx.table.core.count({ trans: trans, query: { index: primaryKey, range: coreRange } }).then(function (count) { + return ctx.table.core.mutate({ trans: trans, type: 'deleteRange', range: coreRange }) + .then(function (_a) { + var failures = _a.failures; var numFailures = _a.numFailures; + if (numFailures) + throw new ModifyError("Could not delete some values", Object.keys(failures).map(function (pos) { return failures[pos]; }), count - numFailures); + return count - numFailures; + }); + }); + }); + } + return this.modify(deleteCallback); + }; + return Collection; + }()); + var deleteCallback = function (value, ctx) { return ctx.value = null; }; + + function createCollectionConstructor(db) { + return makeClassConstructor(Collection.prototype, function Collection(whereClause, keyRangeGenerator) { + this.db = db; + var keyRange = AnyRange, error = null; + if (keyRangeGenerator) + try { + keyRange = keyRangeGenerator(); + } + catch (ex) { + error = ex; + } + var whereCtx = whereClause._ctx; + var table = whereCtx.table; + var readingHook = table.hook.reading.fire; + this._ctx = { + table: table, + index: whereCtx.index, + isPrimKey: (!whereCtx.index || (table.schema.primKey.keyPath && whereCtx.index === table.schema.primKey.name)), + range: keyRange, + keysOnly: false, + dir: "next", + unique: "", + algorithm: null, + filter: null, + replayFilter: null, + justLimit: true, + isMatch: null, + offset: 0, + limit: Infinity, + error: error, + or: whereCtx.or, + valueMapper: readingHook !== mirror ? readingHook : null + }; + }); + } + + function simpleCompare(a, b) { + return a < b ? -1 : a === b ? 0 : 1; + } + function simpleCompareReverse(a, b) { + return a > b ? -1 : a === b ? 0 : 1; + } + + function fail(collectionOrWhereClause, err, T) { + var collection = collectionOrWhereClause instanceof WhereClause ? + new collectionOrWhereClause.Collection(collectionOrWhereClause) : + collectionOrWhereClause; + collection._ctx.error = T ? new T(err) : new TypeError(err); + return collection; + } + function emptyCollection(whereClause) { + return new whereClause.Collection(whereClause, function () { return rangeEqual(""); }).limit(0); + } + function upperFactory(dir) { + return dir === "next" ? + function (s) { return s.toUpperCase(); } : + function (s) { return s.toLowerCase(); }; + } + function lowerFactory(dir) { + return dir === "next" ? + function (s) { return s.toLowerCase(); } : + function (s) { return s.toUpperCase(); }; + } + function nextCasing(key, lowerKey, upperNeedle, lowerNeedle, cmp, dir) { + var length = Math.min(key.length, lowerNeedle.length); + var llp = -1; + for (var i = 0; i < length; ++i) { + var lwrKeyChar = lowerKey[i]; + if (lwrKeyChar !== lowerNeedle[i]) { + if (cmp(key[i], upperNeedle[i]) < 0) + return key.substr(0, i) + upperNeedle[i] + upperNeedle.substr(i + 1); + if (cmp(key[i], lowerNeedle[i]) < 0) + return key.substr(0, i) + lowerNeedle[i] + upperNeedle.substr(i + 1); + if (llp >= 0) + return key.substr(0, llp) + lowerKey[llp] + upperNeedle.substr(llp + 1); + return null; + } + if (cmp(key[i], lwrKeyChar) < 0) + llp = i; + } + if (length < lowerNeedle.length && dir === "next") + return key + upperNeedle.substr(key.length); + if (length < key.length && dir === "prev") + return key.substr(0, upperNeedle.length); + return (llp < 0 ? null : key.substr(0, llp) + lowerNeedle[llp] + upperNeedle.substr(llp + 1)); + } + function addIgnoreCaseAlgorithm(whereClause, match, needles, suffix) { + var upper, lower, compare, upperNeedles, lowerNeedles, direction, nextKeySuffix, needlesLen = needles.length; + if (!needles.every(function (s) { return typeof s === 'string'; })) { + return fail(whereClause, STRING_EXPECTED); + } + function initDirection(dir) { + upper = upperFactory(dir); + lower = lowerFactory(dir); + compare = (dir === "next" ? simpleCompare : simpleCompareReverse); + var needleBounds = needles.map(function (needle) { + return { lower: lower(needle), upper: upper(needle) }; + }).sort(function (a, b) { + return compare(a.lower, b.lower); + }); + upperNeedles = needleBounds.map(function (nb) { return nb.upper; }); + lowerNeedles = needleBounds.map(function (nb) { return nb.lower; }); + direction = dir; + nextKeySuffix = (dir === "next" ? "" : suffix); + } + initDirection("next"); + var c = new whereClause.Collection(whereClause, function () { return createRange(upperNeedles[0], lowerNeedles[needlesLen - 1] + suffix); }); + c._ondirectionchange = function (direction) { + initDirection(direction); + }; + var firstPossibleNeedle = 0; + c._addAlgorithm(function (cursor, advance, resolve) { + var key = cursor.key; + if (typeof key !== 'string') + return false; + var lowerKey = lower(key); + if (match(lowerKey, lowerNeedles, firstPossibleNeedle)) { + return true; + } + else { + var lowestPossibleCasing = null; + for (var i = firstPossibleNeedle; i < needlesLen; ++i) { + var casing = nextCasing(key, lowerKey, upperNeedles[i], lowerNeedles[i], compare, direction); + if (casing === null && lowestPossibleCasing === null) + firstPossibleNeedle = i + 1; + else if (lowestPossibleCasing === null || compare(lowestPossibleCasing, casing) > 0) { + lowestPossibleCasing = casing; + } + } + if (lowestPossibleCasing !== null) { + advance(function () { cursor.continue(lowestPossibleCasing + nextKeySuffix); }); + } + else { + advance(resolve); + } + return false; + } + }); + return c; + } + function createRange(lower, upper, lowerOpen, upperOpen) { + return { + type: 2 , + lower: lower, + upper: upper, + lowerOpen: lowerOpen, + upperOpen: upperOpen + }; + } + function rangeEqual(value) { + return { + type: 1 , + lower: value, + upper: value + }; + } + + var WhereClause = (function () { + function WhereClause() { + } + Object.defineProperty(WhereClause.prototype, "Collection", { + get: function () { + return this._ctx.table.db.Collection; + }, + enumerable: false, + configurable: true + }); + WhereClause.prototype.between = function (lower, upper, includeLower, includeUpper) { + includeLower = includeLower !== false; + includeUpper = includeUpper === true; + try { + if ((this._cmp(lower, upper) > 0) || + (this._cmp(lower, upper) === 0 && (includeLower || includeUpper) && !(includeLower && includeUpper))) + return emptyCollection(this); + return new this.Collection(this, function () { return createRange(lower, upper, !includeLower, !includeUpper); }); + } + catch (e) { + return fail(this, INVALID_KEY_ARGUMENT); + } + }; + WhereClause.prototype.equals = function (value) { + if (value == null) + return fail(this, INVALID_KEY_ARGUMENT); + return new this.Collection(this, function () { return rangeEqual(value); }); + }; + WhereClause.prototype.above = function (value) { + if (value == null) + return fail(this, INVALID_KEY_ARGUMENT); + return new this.Collection(this, function () { return createRange(value, undefined, true); }); + }; + WhereClause.prototype.aboveOrEqual = function (value) { + if (value == null) + return fail(this, INVALID_KEY_ARGUMENT); + return new this.Collection(this, function () { return createRange(value, undefined, false); }); + }; + WhereClause.prototype.below = function (value) { + if (value == null) + return fail(this, INVALID_KEY_ARGUMENT); + return new this.Collection(this, function () { return createRange(undefined, value, false, true); }); + }; + WhereClause.prototype.belowOrEqual = function (value) { + if (value == null) + return fail(this, INVALID_KEY_ARGUMENT); + return new this.Collection(this, function () { return createRange(undefined, value); }); + }; + WhereClause.prototype.startsWith = function (str) { + if (typeof str !== 'string') + return fail(this, STRING_EXPECTED); + return this.between(str, str + maxString, true, true); + }; + WhereClause.prototype.startsWithIgnoreCase = function (str) { + if (str === "") + return this.startsWith(str); + return addIgnoreCaseAlgorithm(this, function (x, a) { return x.indexOf(a[0]) === 0; }, [str], maxString); + }; + WhereClause.prototype.equalsIgnoreCase = function (str) { + return addIgnoreCaseAlgorithm(this, function (x, a) { return x === a[0]; }, [str], ""); + }; + WhereClause.prototype.anyOfIgnoreCase = function () { + var set = getArrayOf.apply(NO_CHAR_ARRAY, arguments); + if (set.length === 0) + return emptyCollection(this); + return addIgnoreCaseAlgorithm(this, function (x, a) { return a.indexOf(x) !== -1; }, set, ""); + }; + WhereClause.prototype.startsWithAnyOfIgnoreCase = function () { + var set = getArrayOf.apply(NO_CHAR_ARRAY, arguments); + if (set.length === 0) + return emptyCollection(this); + return addIgnoreCaseAlgorithm(this, function (x, a) { return a.some(function (n) { return x.indexOf(n) === 0; }); }, set, maxString); + }; + WhereClause.prototype.anyOf = function () { + var _this = this; + var set = getArrayOf.apply(NO_CHAR_ARRAY, arguments); + var compare = this._cmp; + try { + set.sort(compare); + } + catch (e) { + return fail(this, INVALID_KEY_ARGUMENT); + } + if (set.length === 0) + return emptyCollection(this); + var c = new this.Collection(this, function () { return createRange(set[0], set[set.length - 1]); }); + c._ondirectionchange = function (direction) { + compare = (direction === "next" ? + _this._ascending : + _this._descending); + set.sort(compare); + }; + var i = 0; + c._addAlgorithm(function (cursor, advance, resolve) { + var key = cursor.key; + while (compare(key, set[i]) > 0) { + ++i; + if (i === set.length) { + advance(resolve); + return false; + } + } + if (compare(key, set[i]) === 0) { + return true; + } + else { + advance(function () { cursor.continue(set[i]); }); + return false; + } + }); + return c; + }; + WhereClause.prototype.notEqual = function (value) { + return this.inAnyRange([[minKey, value], [value, this.db._maxKey]], { includeLowers: false, includeUppers: false }); + }; + WhereClause.prototype.noneOf = function () { + var set = getArrayOf.apply(NO_CHAR_ARRAY, arguments); + if (set.length === 0) + return new this.Collection(this); + try { + set.sort(this._ascending); + } + catch (e) { + return fail(this, INVALID_KEY_ARGUMENT); + } + var ranges = set.reduce(function (res, val) { return res ? + res.concat([[res[res.length - 1][1], val]]) : + [[minKey, val]]; }, null); + ranges.push([set[set.length - 1], this.db._maxKey]); + return this.inAnyRange(ranges, { includeLowers: false, includeUppers: false }); + }; + WhereClause.prototype.inAnyRange = function (ranges, options) { + var _this = this; + var cmp = this._cmp, ascending = this._ascending, descending = this._descending, min = this._min, max = this._max; + if (ranges.length === 0) + return emptyCollection(this); + if (!ranges.every(function (range) { + return range[0] !== undefined && + range[1] !== undefined && + ascending(range[0], range[1]) <= 0; + })) { + return fail(this, "First argument to inAnyRange() must be an Array of two-value Arrays [lower,upper] where upper must not be lower than lower", exceptions.InvalidArgument); + } + var includeLowers = !options || options.includeLowers !== false; + var includeUppers = options && options.includeUppers === true; + function addRange(ranges, newRange) { + var i = 0, l = ranges.length; + for (; i < l; ++i) { + var range = ranges[i]; + if (cmp(newRange[0], range[1]) < 0 && cmp(newRange[1], range[0]) > 0) { + range[0] = min(range[0], newRange[0]); + range[1] = max(range[1], newRange[1]); + break; + } + } + if (i === l) + ranges.push(newRange); + return ranges; + } + var sortDirection = ascending; + function rangeSorter(a, b) { return sortDirection(a[0], b[0]); } + var set; + try { + set = ranges.reduce(addRange, []); + set.sort(rangeSorter); + } + catch (ex) { + return fail(this, INVALID_KEY_ARGUMENT); + } + var rangePos = 0; + var keyIsBeyondCurrentEntry = includeUppers ? + function (key) { return ascending(key, set[rangePos][1]) > 0; } : + function (key) { return ascending(key, set[rangePos][1]) >= 0; }; + var keyIsBeforeCurrentEntry = includeLowers ? + function (key) { return descending(key, set[rangePos][0]) > 0; } : + function (key) { return descending(key, set[rangePos][0]) >= 0; }; + function keyWithinCurrentRange(key) { + return !keyIsBeyondCurrentEntry(key) && !keyIsBeforeCurrentEntry(key); + } + var checkKey = keyIsBeyondCurrentEntry; + var c = new this.Collection(this, function () { return createRange(set[0][0], set[set.length - 1][1], !includeLowers, !includeUppers); }); + c._ondirectionchange = function (direction) { + if (direction === "next") { + checkKey = keyIsBeyondCurrentEntry; + sortDirection = ascending; + } + else { + checkKey = keyIsBeforeCurrentEntry; + sortDirection = descending; + } + set.sort(rangeSorter); + }; + c._addAlgorithm(function (cursor, advance, resolve) { + var key = cursor.key; + while (checkKey(key)) { + ++rangePos; + if (rangePos === set.length) { + advance(resolve); + return false; + } + } + if (keyWithinCurrentRange(key)) { + return true; + } + else if (_this._cmp(key, set[rangePos][1]) === 0 || _this._cmp(key, set[rangePos][0]) === 0) { + return false; + } + else { + advance(function () { + if (sortDirection === ascending) + cursor.continue(set[rangePos][0]); + else + cursor.continue(set[rangePos][1]); + }); + return false; + } + }); + return c; + }; + WhereClause.prototype.startsWithAnyOf = function () { + var set = getArrayOf.apply(NO_CHAR_ARRAY, arguments); + if (!set.every(function (s) { return typeof s === 'string'; })) { + return fail(this, "startsWithAnyOf() only works with strings"); + } + if (set.length === 0) + return emptyCollection(this); + return this.inAnyRange(set.map(function (str) { return [str, str + maxString]; })); + }; + return WhereClause; + }()); + + function createWhereClauseConstructor(db) { + return makeClassConstructor(WhereClause.prototype, function WhereClause(table, index, orCollection) { + this.db = db; + this._ctx = { + table: table, + index: index === ":id" ? null : index, + or: orCollection + }; + var indexedDB = db._deps.indexedDB; + if (!indexedDB) + throw new exceptions.MissingAPI(); + this._cmp = this._ascending = indexedDB.cmp.bind(indexedDB); + this._descending = function (a, b) { return indexedDB.cmp(b, a); }; + this._max = function (a, b) { return indexedDB.cmp(a, b) > 0 ? a : b; }; + this._min = function (a, b) { return indexedDB.cmp(a, b) < 0 ? a : b; }; + this._IDBKeyRange = db._deps.IDBKeyRange; + }); + } + + function eventRejectHandler(reject) { + return wrap(function (event) { + preventDefault(event); + reject(event.target.error); + return false; + }); + } + function preventDefault(event) { + if (event.stopPropagation) + event.stopPropagation(); + if (event.preventDefault) + event.preventDefault(); + } + + var DEXIE_STORAGE_MUTATED_EVENT_NAME = 'storagemutated'; + var STORAGE_MUTATED_DOM_EVENT_NAME = 'x-storagemutated-1'; + var globalEvents = Events(null, DEXIE_STORAGE_MUTATED_EVENT_NAME); + + var Transaction = (function () { + function Transaction() { + } + Transaction.prototype._lock = function () { + assert(!PSD.global); + ++this._reculock; + if (this._reculock === 1 && !PSD.global) + PSD.lockOwnerFor = this; + return this; + }; + Transaction.prototype._unlock = function () { + assert(!PSD.global); + if (--this._reculock === 0) { + if (!PSD.global) + PSD.lockOwnerFor = null; + while (this._blockedFuncs.length > 0 && !this._locked()) { + var fnAndPSD = this._blockedFuncs.shift(); + try { + usePSD(fnAndPSD[1], fnAndPSD[0]); + } + catch (e) { } + } + } + return this; + }; + Transaction.prototype._locked = function () { + return this._reculock && PSD.lockOwnerFor !== this; + }; + Transaction.prototype.create = function (idbtrans) { + var _this = this; + if (!this.mode) + return this; + var idbdb = this.db.idbdb; + var dbOpenError = this.db._state.dbOpenError; + assert(!this.idbtrans); + if (!idbtrans && !idbdb) { + switch (dbOpenError && dbOpenError.name) { + case "DatabaseClosedError": + throw new exceptions.DatabaseClosed(dbOpenError); + case "MissingAPIError": + throw new exceptions.MissingAPI(dbOpenError.message, dbOpenError); + default: + throw new exceptions.OpenFailed(dbOpenError); + } + } + if (!this.active) + throw new exceptions.TransactionInactive(); + assert(this._completion._state === null); + idbtrans = this.idbtrans = idbtrans || + (this.db.core + ? this.db.core.transaction(this.storeNames, this.mode, { durability: this.chromeTransactionDurability }) + : idbdb.transaction(this.storeNames, this.mode, { durability: this.chromeTransactionDurability })); + idbtrans.onerror = wrap(function (ev) { + preventDefault(ev); + _this._reject(idbtrans.error); + }); + idbtrans.onabort = wrap(function (ev) { + preventDefault(ev); + _this.active && _this._reject(new exceptions.Abort(idbtrans.error)); + _this.active = false; + _this.on("abort").fire(ev); + }); + idbtrans.oncomplete = wrap(function () { + _this.active = false; + _this._resolve(); + if ('mutatedParts' in idbtrans) { + globalEvents.storagemutated.fire(idbtrans["mutatedParts"]); + } + }); + return this; + }; + Transaction.prototype._promise = function (mode, fn, bWriteLock) { + var _this = this; + if (mode === 'readwrite' && this.mode !== 'readwrite') + return rejection(new exceptions.ReadOnly("Transaction is readonly")); + if (!this.active) + return rejection(new exceptions.TransactionInactive()); + if (this._locked()) { + return new DexiePromise(function (resolve, reject) { + _this._blockedFuncs.push([function () { + _this._promise(mode, fn, bWriteLock).then(resolve, reject); + }, PSD]); + }); + } + else if (bWriteLock) { + return newScope(function () { + var p = new DexiePromise(function (resolve, reject) { + _this._lock(); + var rv = fn(resolve, reject, _this); + if (rv && rv.then) + rv.then(resolve, reject); + }); + p.finally(function () { return _this._unlock(); }); + p._lib = true; + return p; + }); + } + else { + var p = new DexiePromise(function (resolve, reject) { + var rv = fn(resolve, reject, _this); + if (rv && rv.then) + rv.then(resolve, reject); + }); + p._lib = true; + return p; + } + }; + Transaction.prototype._root = function () { + return this.parent ? this.parent._root() : this; + }; + Transaction.prototype.waitFor = function (promiseLike) { + var root = this._root(); + var promise = DexiePromise.resolve(promiseLike); + if (root._waitingFor) { + root._waitingFor = root._waitingFor.then(function () { return promise; }); + } + else { + root._waitingFor = promise; + root._waitingQueue = []; + var store = root.idbtrans.objectStore(root.storeNames[0]); + (function spin() { + ++root._spinCount; + while (root._waitingQueue.length) + (root._waitingQueue.shift())(); + if (root._waitingFor) + store.get(-Infinity).onsuccess = spin; + }()); + } + var currentWaitPromise = root._waitingFor; + return new DexiePromise(function (resolve, reject) { + promise.then(function (res) { return root._waitingQueue.push(wrap(resolve.bind(null, res))); }, function (err) { return root._waitingQueue.push(wrap(reject.bind(null, err))); }).finally(function () { + if (root._waitingFor === currentWaitPromise) { + root._waitingFor = null; + } + }); + }); + }; + Transaction.prototype.abort = function () { + if (this.active) { + this.active = false; + if (this.idbtrans) + this.idbtrans.abort(); + this._reject(new exceptions.Abort()); + } + }; + Transaction.prototype.table = function (tableName) { + var memoizedTables = (this._memoizedTables || (this._memoizedTables = {})); + if (hasOwn(memoizedTables, tableName)) + return memoizedTables[tableName]; + var tableSchema = this.schema[tableName]; + if (!tableSchema) { + throw new exceptions.NotFound("Table " + tableName + " not part of transaction"); + } + var transactionBoundTable = new this.db.Table(tableName, tableSchema, this); + transactionBoundTable.core = this.db.core.table(tableName); + memoizedTables[tableName] = transactionBoundTable; + return transactionBoundTable; + }; + return Transaction; + }()); + + function createTransactionConstructor(db) { + return makeClassConstructor(Transaction.prototype, function Transaction(mode, storeNames, dbschema, chromeTransactionDurability, parent) { + var _this = this; + this.db = db; + this.mode = mode; + this.storeNames = storeNames; + this.schema = dbschema; + this.chromeTransactionDurability = chromeTransactionDurability; + this.idbtrans = null; + this.on = Events(this, "complete", "error", "abort"); + this.parent = parent || null; + this.active = true; + this._reculock = 0; + this._blockedFuncs = []; + this._resolve = null; + this._reject = null; + this._waitingFor = null; + this._waitingQueue = null; + this._spinCount = 0; + this._completion = new DexiePromise(function (resolve, reject) { + _this._resolve = resolve; + _this._reject = reject; + }); + this._completion.then(function () { + _this.active = false; + _this.on.complete.fire(); + }, function (e) { + var wasActive = _this.active; + _this.active = false; + _this.on.error.fire(e); + _this.parent ? + _this.parent._reject(e) : + wasActive && _this.idbtrans && _this.idbtrans.abort(); + return rejection(e); + }); + }); + } + + function createIndexSpec(name, keyPath, unique, multi, auto, compound, isPrimKey) { + return { + name: name, + keyPath: keyPath, + unique: unique, + multi: multi, + auto: auto, + compound: compound, + src: (unique && !isPrimKey ? '&' : '') + (multi ? '*' : '') + (auto ? "++" : "") + nameFromKeyPath(keyPath) + }; + } + function nameFromKeyPath(keyPath) { + return typeof keyPath === 'string' ? + keyPath : + keyPath ? ('[' + [].join.call(keyPath, '+') + ']') : ""; + } + + function createTableSchema(name, primKey, indexes) { + return { + name: name, + primKey: primKey, + indexes: indexes, + mappedClass: null, + idxByName: arrayToObject(indexes, function (index) { return [index.name, index]; }) + }; + } + + function safariMultiStoreFix(storeNames) { + return storeNames.length === 1 ? storeNames[0] : storeNames; + } + var getMaxKey = function (IdbKeyRange) { + try { + IdbKeyRange.only([[]]); + getMaxKey = function () { return [[]]; }; + return [[]]; + } + catch (e) { + getMaxKey = function () { return maxString; }; + return maxString; + } + }; + + function getKeyExtractor(keyPath) { + if (keyPath == null) { + return function () { return undefined; }; + } + else if (typeof keyPath === 'string') { + return getSinglePathKeyExtractor(keyPath); + } + else { + return function (obj) { return getByKeyPath(obj, keyPath); }; + } + } + function getSinglePathKeyExtractor(keyPath) { + var split = keyPath.split('.'); + if (split.length === 1) { + return function (obj) { return obj[keyPath]; }; + } + else { + return function (obj) { return getByKeyPath(obj, keyPath); }; + } + } + + function arrayify(arrayLike) { + return [].slice.call(arrayLike); + } + var _id_counter = 0; + function getKeyPathAlias(keyPath) { + return keyPath == null ? + ":id" : + typeof keyPath === 'string' ? + keyPath : + "[" + keyPath.join('+') + "]"; + } + function createDBCore(db, IdbKeyRange, tmpTrans) { + function extractSchema(db, trans) { + var tables = arrayify(db.objectStoreNames); + return { + schema: { + name: db.name, + tables: tables.map(function (table) { return trans.objectStore(table); }).map(function (store) { + var keyPath = store.keyPath, autoIncrement = store.autoIncrement; + var compound = isArray(keyPath); + var outbound = keyPath == null; + var indexByKeyPath = {}; + var result = { + name: store.name, + primaryKey: { + name: null, + isPrimaryKey: true, + outbound: outbound, + compound: compound, + keyPath: keyPath, + autoIncrement: autoIncrement, + unique: true, + extractKey: getKeyExtractor(keyPath) + }, + indexes: arrayify(store.indexNames).map(function (indexName) { return store.index(indexName); }) + .map(function (index) { + var name = index.name, unique = index.unique, multiEntry = index.multiEntry, keyPath = index.keyPath; + var compound = isArray(keyPath); + var result = { + name: name, + compound: compound, + keyPath: keyPath, + unique: unique, + multiEntry: multiEntry, + extractKey: getKeyExtractor(keyPath) + }; + indexByKeyPath[getKeyPathAlias(keyPath)] = result; + return result; + }), + getIndexByKeyPath: function (keyPath) { return indexByKeyPath[getKeyPathAlias(keyPath)]; } + }; + indexByKeyPath[":id"] = result.primaryKey; + if (keyPath != null) { + indexByKeyPath[getKeyPathAlias(keyPath)] = result.primaryKey; + } + return result; + }) + }, + hasGetAll: tables.length > 0 && ('getAll' in trans.objectStore(tables[0])) && + !(typeof navigator !== 'undefined' && /Safari/.test(navigator.userAgent) && + !/(Chrome\/|Edge\/)/.test(navigator.userAgent) && + [].concat(navigator.userAgent.match(/Safari\/(\d*)/))[1] < 604) + }; + } + function makeIDBKeyRange(range) { + if (range.type === 3 ) + return null; + if (range.type === 4 ) + throw new Error("Cannot convert never type to IDBKeyRange"); + var lower = range.lower, upper = range.upper, lowerOpen = range.lowerOpen, upperOpen = range.upperOpen; + var idbRange = lower === undefined ? + upper === undefined ? + null : + IdbKeyRange.upperBound(upper, !!upperOpen) : + upper === undefined ? + IdbKeyRange.lowerBound(lower, !!lowerOpen) : + IdbKeyRange.bound(lower, upper, !!lowerOpen, !!upperOpen); + return idbRange; + } + function createDbCoreTable(tableSchema) { + var tableName = tableSchema.name; + function mutate(_a) { + var trans = _a.trans, type = _a.type, keys = _a.keys, values = _a.values, range = _a.range; + return new Promise(function (resolve, reject) { + resolve = wrap(resolve); + var store = trans.objectStore(tableName); + var outbound = store.keyPath == null; + var isAddOrPut = type === "put" || type === "add"; + if (!isAddOrPut && type !== 'delete' && type !== 'deleteRange') + throw new Error("Invalid operation type: " + type); + var length = (keys || values || { length: 1 }).length; + if (keys && values && keys.length !== values.length) { + throw new Error("Given keys array must have same length as given values array."); + } + if (length === 0) + return resolve({ numFailures: 0, failures: {}, results: [], lastResult: undefined }); + var req; + var reqs = []; + var failures = []; + var numFailures = 0; + var errorHandler = function (event) { + ++numFailures; + preventDefault(event); + }; + if (type === 'deleteRange') { + if (range.type === 4 ) + return resolve({ numFailures: numFailures, failures: failures, results: [], lastResult: undefined }); + if (range.type === 3 ) + reqs.push(req = store.clear()); + else + reqs.push(req = store.delete(makeIDBKeyRange(range))); + } + else { + var _a = isAddOrPut ? + outbound ? + [values, keys] : + [values, null] : + [keys, null], args1 = _a[0], args2 = _a[1]; + if (isAddOrPut) { + for (var i = 0; i < length; ++i) { + reqs.push(req = (args2 && args2[i] !== undefined ? + store[type](args1[i], args2[i]) : + store[type](args1[i]))); + req.onerror = errorHandler; + } + } + else { + for (var i = 0; i < length; ++i) { + reqs.push(req = store[type](args1[i])); + req.onerror = errorHandler; + } + } + } + var done = function (event) { + var lastResult = event.target.result; + reqs.forEach(function (req, i) { return req.error != null && (failures[i] = req.error); }); + resolve({ + numFailures: numFailures, + failures: failures, + results: type === "delete" ? keys : reqs.map(function (req) { return req.result; }), + lastResult: lastResult + }); + }; + req.onerror = function (event) { + errorHandler(event); + done(event); + }; + req.onsuccess = done; + }); + } + function openCursor(_a) { + var trans = _a.trans, values = _a.values, query = _a.query, reverse = _a.reverse, unique = _a.unique; + return new Promise(function (resolve, reject) { + resolve = wrap(resolve); + var index = query.index, range = query.range; + var store = trans.objectStore(tableName); + var source = index.isPrimaryKey ? + store : + store.index(index.name); + var direction = reverse ? + unique ? + "prevunique" : + "prev" : + unique ? + "nextunique" : + "next"; + var req = values || !('openKeyCursor' in source) ? + source.openCursor(makeIDBKeyRange(range), direction) : + source.openKeyCursor(makeIDBKeyRange(range), direction); + req.onerror = eventRejectHandler(reject); + req.onsuccess = wrap(function (ev) { + var cursor = req.result; + if (!cursor) { + resolve(null); + return; + } + cursor.___id = ++_id_counter; + cursor.done = false; + var _cursorContinue = cursor.continue.bind(cursor); + var _cursorContinuePrimaryKey = cursor.continuePrimaryKey; + if (_cursorContinuePrimaryKey) + _cursorContinuePrimaryKey = _cursorContinuePrimaryKey.bind(cursor); + var _cursorAdvance = cursor.advance.bind(cursor); + var doThrowCursorIsNotStarted = function () { throw new Error("Cursor not started"); }; + var doThrowCursorIsStopped = function () { throw new Error("Cursor not stopped"); }; + cursor.trans = trans; + cursor.stop = cursor.continue = cursor.continuePrimaryKey = cursor.advance = doThrowCursorIsNotStarted; + cursor.fail = wrap(reject); + cursor.next = function () { + var _this = this; + var gotOne = 1; + return this.start(function () { return gotOne-- ? _this.continue() : _this.stop(); }).then(function () { return _this; }); + }; + cursor.start = function (callback) { + var iterationPromise = new Promise(function (resolveIteration, rejectIteration) { + resolveIteration = wrap(resolveIteration); + req.onerror = eventRejectHandler(rejectIteration); + cursor.fail = rejectIteration; + cursor.stop = function (value) { + cursor.stop = cursor.continue = cursor.continuePrimaryKey = cursor.advance = doThrowCursorIsStopped; + resolveIteration(value); + }; + }); + var guardedCallback = function () { + if (req.result) { + try { + callback(); + } + catch (err) { + cursor.fail(err); + } + } + else { + cursor.done = true; + cursor.start = function () { throw new Error("Cursor behind last entry"); }; + cursor.stop(); + } + }; + req.onsuccess = wrap(function (ev) { + req.onsuccess = guardedCallback; + guardedCallback(); + }); + cursor.continue = _cursorContinue; + cursor.continuePrimaryKey = _cursorContinuePrimaryKey; + cursor.advance = _cursorAdvance; + guardedCallback(); + return iterationPromise; + }; + resolve(cursor); + }, reject); + }); + } + function query(hasGetAll) { + return function (request) { + return new Promise(function (resolve, reject) { + resolve = wrap(resolve); + var trans = request.trans, values = request.values, limit = request.limit, query = request.query; + var nonInfinitLimit = limit === Infinity ? undefined : limit; + var index = query.index, range = query.range; + var store = trans.objectStore(tableName); + var source = index.isPrimaryKey ? store : store.index(index.name); + var idbKeyRange = makeIDBKeyRange(range); + if (limit === 0) + return resolve({ result: [] }); + if (hasGetAll) { + var req = values ? + source.getAll(idbKeyRange, nonInfinitLimit) : + source.getAllKeys(idbKeyRange, nonInfinitLimit); + req.onsuccess = function (event) { return resolve({ result: event.target.result }); }; + req.onerror = eventRejectHandler(reject); + } + else { + var count_1 = 0; + var req_1 = values || !('openKeyCursor' in source) ? + source.openCursor(idbKeyRange) : + source.openKeyCursor(idbKeyRange); + var result_1 = []; + req_1.onsuccess = function (event) { + var cursor = req_1.result; + if (!cursor) + return resolve({ result: result_1 }); + result_1.push(values ? cursor.value : cursor.primaryKey); + if (++count_1 === limit) + return resolve({ result: result_1 }); + cursor.continue(); + }; + req_1.onerror = eventRejectHandler(reject); + } + }); + }; + } + return { + name: tableName, + schema: tableSchema, + mutate: mutate, + getMany: function (_a) { + var trans = _a.trans, keys = _a.keys; + return new Promise(function (resolve, reject) { + resolve = wrap(resolve); + var store = trans.objectStore(tableName); + var length = keys.length; + var result = new Array(length); + var keyCount = 0; + var callbackCount = 0; + var req; + var successHandler = function (event) { + var req = event.target; + if ((result[req._pos] = req.result) != null) + ; + if (++callbackCount === keyCount) + resolve(result); + }; + var errorHandler = eventRejectHandler(reject); + for (var i = 0; i < length; ++i) { + var key = keys[i]; + if (key != null) { + req = store.get(keys[i]); + req._pos = i; + req.onsuccess = successHandler; + req.onerror = errorHandler; + ++keyCount; + } + } + if (keyCount === 0) + resolve(result); + }); + }, + get: function (_a) { + var trans = _a.trans, key = _a.key; + return new Promise(function (resolve, reject) { + resolve = wrap(resolve); + var store = trans.objectStore(tableName); + var req = store.get(key); + req.onsuccess = function (event) { return resolve(event.target.result); }; + req.onerror = eventRejectHandler(reject); + }); + }, + query: query(hasGetAll), + openCursor: openCursor, + count: function (_a) { + var query = _a.query, trans = _a.trans; + var index = query.index, range = query.range; + return new Promise(function (resolve, reject) { + var store = trans.objectStore(tableName); + var source = index.isPrimaryKey ? store : store.index(index.name); + var idbKeyRange = makeIDBKeyRange(range); + var req = idbKeyRange ? source.count(idbKeyRange) : source.count(); + req.onsuccess = wrap(function (ev) { return resolve(ev.target.result); }); + req.onerror = eventRejectHandler(reject); + }); + } + }; + } + var _a = extractSchema(db, tmpTrans), schema = _a.schema, hasGetAll = _a.hasGetAll; + var tables = schema.tables.map(function (tableSchema) { return createDbCoreTable(tableSchema); }); + var tableMap = {}; + tables.forEach(function (table) { return tableMap[table.name] = table; }); + return { + stack: "dbcore", + transaction: db.transaction.bind(db), + table: function (name) { + var result = tableMap[name]; + if (!result) + throw new Error("Table '" + name + "' not found"); + return tableMap[name]; + }, + MIN_KEY: -Infinity, + MAX_KEY: getMaxKey(IdbKeyRange), + schema: schema + }; + } + + function createMiddlewareStack(stackImpl, middlewares) { + return middlewares.reduce(function (down, _a) { + var create = _a.create; + return (__assign(__assign({}, down), create(down))); + }, stackImpl); + } + function createMiddlewareStacks(middlewares, idbdb, _a, tmpTrans) { + var IDBKeyRange = _a.IDBKeyRange; var dbcore = createMiddlewareStack(createDBCore(idbdb, IDBKeyRange, tmpTrans), middlewares.dbcore); + return { + dbcore: dbcore + }; + } + function generateMiddlewareStacks(_a, tmpTrans) { + var db = _a._novip; + var idbdb = tmpTrans.db; + var stacks = createMiddlewareStacks(db._middlewares, idbdb, db._deps, tmpTrans); + db.core = stacks.dbcore; + db.tables.forEach(function (table) { + var tableName = table.name; + if (db.core.schema.tables.some(function (tbl) { return tbl.name === tableName; })) { + table.core = db.core.table(tableName); + if (db[tableName] instanceof db.Table) { + db[tableName].core = table.core; + } + } + }); + } + + function setApiOnPlace(_a, objs, tableNames, dbschema) { + var db = _a._novip; + tableNames.forEach(function (tableName) { + var schema = dbschema[tableName]; + objs.forEach(function (obj) { + var propDesc = getPropertyDescriptor(obj, tableName); + if (!propDesc || ("value" in propDesc && propDesc.value === undefined)) { + if (obj === db.Transaction.prototype || obj instanceof db.Transaction) { + setProp(obj, tableName, { + get: function () { return this.table(tableName); }, + set: function (value) { + defineProperty(this, tableName, { value: value, writable: true, configurable: true, enumerable: true }); + } + }); + } + else { + obj[tableName] = new db.Table(tableName, schema); + } + } + }); + }); + } + function removeTablesApi(_a, objs) { + var db = _a._novip; + objs.forEach(function (obj) { + for (var key in obj) { + if (obj[key] instanceof db.Table) + delete obj[key]; + } + }); + } + function lowerVersionFirst(a, b) { + return a._cfg.version - b._cfg.version; + } + function runUpgraders(db, oldVersion, idbUpgradeTrans, reject) { + var globalSchema = db._dbSchema; + var trans = db._createTransaction('readwrite', db._storeNames, globalSchema); + trans.create(idbUpgradeTrans); + trans._completion.catch(reject); + var rejectTransaction = trans._reject.bind(trans); + var transless = PSD.transless || PSD; + newScope(function () { + PSD.trans = trans; + PSD.transless = transless; + if (oldVersion === 0) { + keys(globalSchema).forEach(function (tableName) { + createTable(idbUpgradeTrans, tableName, globalSchema[tableName].primKey, globalSchema[tableName].indexes); + }); + generateMiddlewareStacks(db, idbUpgradeTrans); + DexiePromise.follow(function () { return db.on.populate.fire(trans); }).catch(rejectTransaction); + } + else + updateTablesAndIndexes(db, oldVersion, trans, idbUpgradeTrans).catch(rejectTransaction); + }); + } + function updateTablesAndIndexes(_a, oldVersion, trans, idbUpgradeTrans) { + var db = _a._novip; + var queue = []; + var versions = db._versions; + var globalSchema = db._dbSchema = buildGlobalSchema(db, db.idbdb, idbUpgradeTrans); + var anyContentUpgraderHasRun = false; + var versToRun = versions.filter(function (v) { return v._cfg.version >= oldVersion; }); + versToRun.forEach(function (version) { + queue.push(function () { + var oldSchema = globalSchema; + var newSchema = version._cfg.dbschema; + adjustToExistingIndexNames(db, oldSchema, idbUpgradeTrans); + adjustToExistingIndexNames(db, newSchema, idbUpgradeTrans); + globalSchema = db._dbSchema = newSchema; + var diff = getSchemaDiff(oldSchema, newSchema); + diff.add.forEach(function (tuple) { + createTable(idbUpgradeTrans, tuple[0], tuple[1].primKey, tuple[1].indexes); + }); + diff.change.forEach(function (change) { + if (change.recreate) { + throw new exceptions.Upgrade("Not yet support for changing primary key"); + } + else { + var store_1 = idbUpgradeTrans.objectStore(change.name); + change.add.forEach(function (idx) { return addIndex(store_1, idx); }); + change.change.forEach(function (idx) { + store_1.deleteIndex(idx.name); + addIndex(store_1, idx); + }); + change.del.forEach(function (idxName) { return store_1.deleteIndex(idxName); }); + } + }); + var contentUpgrade = version._cfg.contentUpgrade; + if (contentUpgrade && version._cfg.version > oldVersion) { + generateMiddlewareStacks(db, idbUpgradeTrans); + trans._memoizedTables = {}; + anyContentUpgraderHasRun = true; + var upgradeSchema_1 = shallowClone(newSchema); + diff.del.forEach(function (table) { + upgradeSchema_1[table] = oldSchema[table]; + }); + removeTablesApi(db, [db.Transaction.prototype]); + setApiOnPlace(db, [db.Transaction.prototype], keys(upgradeSchema_1), upgradeSchema_1); + trans.schema = upgradeSchema_1; + var contentUpgradeIsAsync_1 = isAsyncFunction(contentUpgrade); + if (contentUpgradeIsAsync_1) { + incrementExpectedAwaits(); + } + var returnValue_1; + var promiseFollowed = DexiePromise.follow(function () { + returnValue_1 = contentUpgrade(trans); + if (returnValue_1) { + if (contentUpgradeIsAsync_1) { + var decrementor = decrementExpectedAwaits.bind(null, null); + returnValue_1.then(decrementor, decrementor); + } + } + }); + return (returnValue_1 && typeof returnValue_1.then === 'function' ? + DexiePromise.resolve(returnValue_1) : promiseFollowed.then(function () { return returnValue_1; })); + } + }); + queue.push(function (idbtrans) { + if (!anyContentUpgraderHasRun || !hasIEDeleteObjectStoreBug) { + var newSchema = version._cfg.dbschema; + deleteRemovedTables(newSchema, idbtrans); + } + removeTablesApi(db, [db.Transaction.prototype]); + setApiOnPlace(db, [db.Transaction.prototype], db._storeNames, db._dbSchema); + trans.schema = db._dbSchema; + }); + }); + function runQueue() { + return queue.length ? DexiePromise.resolve(queue.shift()(trans.idbtrans)).then(runQueue) : + DexiePromise.resolve(); + } + return runQueue().then(function () { + createMissingTables(globalSchema, idbUpgradeTrans); + }); + } + function getSchemaDiff(oldSchema, newSchema) { + var diff = { + del: [], + add: [], + change: [] + }; + var table; + for (table in oldSchema) { + if (!newSchema[table]) + diff.del.push(table); + } + for (table in newSchema) { + var oldDef = oldSchema[table], newDef = newSchema[table]; + if (!oldDef) { + diff.add.push([table, newDef]); + } + else { + var change = { + name: table, + def: newDef, + recreate: false, + del: [], + add: [], + change: [] + }; + if (( + '' + (oldDef.primKey.keyPath || '')) !== ('' + (newDef.primKey.keyPath || '')) || + (oldDef.primKey.auto !== newDef.primKey.auto && !isIEOrEdge)) + { + change.recreate = true; + diff.change.push(change); + } + else { + var oldIndexes = oldDef.idxByName; + var newIndexes = newDef.idxByName; + var idxName = void 0; + for (idxName in oldIndexes) { + if (!newIndexes[idxName]) + change.del.push(idxName); + } + for (idxName in newIndexes) { + var oldIdx = oldIndexes[idxName], newIdx = newIndexes[idxName]; + if (!oldIdx) + change.add.push(newIdx); + else if (oldIdx.src !== newIdx.src) + change.change.push(newIdx); + } + if (change.del.length > 0 || change.add.length > 0 || change.change.length > 0) { + diff.change.push(change); + } + } + } + } + return diff; + } + function createTable(idbtrans, tableName, primKey, indexes) { + var store = idbtrans.db.createObjectStore(tableName, primKey.keyPath ? + { keyPath: primKey.keyPath, autoIncrement: primKey.auto } : + { autoIncrement: primKey.auto }); + indexes.forEach(function (idx) { return addIndex(store, idx); }); + return store; + } + function createMissingTables(newSchema, idbtrans) { + keys(newSchema).forEach(function (tableName) { + if (!idbtrans.db.objectStoreNames.contains(tableName)) { + createTable(idbtrans, tableName, newSchema[tableName].primKey, newSchema[tableName].indexes); + } + }); + } + function deleteRemovedTables(newSchema, idbtrans) { + [].slice.call(idbtrans.db.objectStoreNames).forEach(function (storeName) { + return newSchema[storeName] == null && idbtrans.db.deleteObjectStore(storeName); + }); + } + function addIndex(store, idx) { + store.createIndex(idx.name, idx.keyPath, { unique: idx.unique, multiEntry: idx.multi }); + } + function buildGlobalSchema(db, idbdb, tmpTrans) { + var globalSchema = {}; + var dbStoreNames = slice(idbdb.objectStoreNames, 0); + dbStoreNames.forEach(function (storeName) { + var store = tmpTrans.objectStore(storeName); + var keyPath = store.keyPath; + var primKey = createIndexSpec(nameFromKeyPath(keyPath), keyPath || "", false, false, !!store.autoIncrement, keyPath && typeof keyPath !== "string", true); + var indexes = []; + for (var j = 0; j < store.indexNames.length; ++j) { + var idbindex = store.index(store.indexNames[j]); + keyPath = idbindex.keyPath; + var index = createIndexSpec(idbindex.name, keyPath, !!idbindex.unique, !!idbindex.multiEntry, false, keyPath && typeof keyPath !== "string", false); + indexes.push(index); + } + globalSchema[storeName] = createTableSchema(storeName, primKey, indexes); + }); + return globalSchema; + } + function readGlobalSchema(_a, idbdb, tmpTrans) { + var db = _a._novip; + db.verno = idbdb.version / 10; + var globalSchema = db._dbSchema = buildGlobalSchema(db, idbdb, tmpTrans); + db._storeNames = slice(idbdb.objectStoreNames, 0); + setApiOnPlace(db, [db._allTables], keys(globalSchema), globalSchema); + } + function verifyInstalledSchema(db, tmpTrans) { + var installedSchema = buildGlobalSchema(db, db.idbdb, tmpTrans); + var diff = getSchemaDiff(installedSchema, db._dbSchema); + return !(diff.add.length || diff.change.some(function (ch) { return ch.add.length || ch.change.length; })); + } + function adjustToExistingIndexNames(_a, schema, idbtrans) { + var db = _a._novip; + var storeNames = idbtrans.db.objectStoreNames; + for (var i = 0; i < storeNames.length; ++i) { + var storeName = storeNames[i]; + var store = idbtrans.objectStore(storeName); + db._hasGetAll = 'getAll' in store; + for (var j = 0; j < store.indexNames.length; ++j) { + var indexName = store.indexNames[j]; + var keyPath = store.index(indexName).keyPath; + var dexieName = typeof keyPath === 'string' ? keyPath : "[" + slice(keyPath).join('+') + "]"; + if (schema[storeName]) { + var indexSpec = schema[storeName].idxByName[dexieName]; + if (indexSpec) { + indexSpec.name = indexName; + delete schema[storeName].idxByName[dexieName]; + schema[storeName].idxByName[indexName] = indexSpec; + } + } + } + } + if (typeof navigator !== 'undefined' && /Safari/.test(navigator.userAgent) && + !/(Chrome\/|Edge\/)/.test(navigator.userAgent) && + _global.WorkerGlobalScope && _global instanceof _global.WorkerGlobalScope && + [].concat(navigator.userAgent.match(/Safari\/(\d*)/))[1] < 604) { + db._hasGetAll = false; + } + } + function parseIndexSyntax(primKeyAndIndexes) { + return primKeyAndIndexes.split(',').map(function (index, indexNum) { + index = index.trim(); + var name = index.replace(/([&*]|\+\+)/g, ""); + var keyPath = /^\[/.test(name) ? name.match(/^\[(.*)\]$/)[1].split('+') : name; + return createIndexSpec(name, keyPath || null, /\&/.test(index), /\*/.test(index), /\+\+/.test(index), isArray(keyPath), indexNum === 0); + }); + } + + var Version = (function () { + function Version() { + } + Version.prototype._parseStoresSpec = function (stores, outSchema) { + keys(stores).forEach(function (tableName) { + if (stores[tableName] !== null) { + var indexes = parseIndexSyntax(stores[tableName]); + var primKey = indexes.shift(); + if (primKey.multi) + throw new exceptions.Schema("Primary key cannot be multi-valued"); + indexes.forEach(function (idx) { + if (idx.auto) + throw new exceptions.Schema("Only primary key can be marked as autoIncrement (++)"); + if (!idx.keyPath) + throw new exceptions.Schema("Index must have a name and cannot be an empty string"); + }); + outSchema[tableName] = createTableSchema(tableName, primKey, indexes); + } + }); + }; + Version.prototype.stores = function (stores) { + var db = this.db; + this._cfg.storesSource = this._cfg.storesSource ? + extend(this._cfg.storesSource, stores) : + stores; + var versions = db._versions; + var storesSpec = {}; + var dbschema = {}; + versions.forEach(function (version) { + extend(storesSpec, version._cfg.storesSource); + dbschema = (version._cfg.dbschema = {}); + version._parseStoresSpec(storesSpec, dbschema); + }); + db._dbSchema = dbschema; + removeTablesApi(db, [db._allTables, db, db.Transaction.prototype]); + setApiOnPlace(db, [db._allTables, db, db.Transaction.prototype, this._cfg.tables], keys(dbschema), dbschema); + db._storeNames = keys(dbschema); + return this; + }; + Version.prototype.upgrade = function (upgradeFunction) { + this._cfg.contentUpgrade = promisableChain(this._cfg.contentUpgrade || nop, upgradeFunction); + return this; + }; + return Version; + }()); + + function createVersionConstructor(db) { + return makeClassConstructor(Version.prototype, function Version(versionNumber) { + this.db = db; + this._cfg = { + version: versionNumber, + storesSource: null, + dbschema: {}, + tables: {}, + contentUpgrade: null + }; + }); + } + + function getDbNamesTable(indexedDB, IDBKeyRange) { + var dbNamesDB = indexedDB["_dbNamesDB"]; + if (!dbNamesDB) { + dbNamesDB = indexedDB["_dbNamesDB"] = new Dexie$1(DBNAMES_DB, { + addons: [], + indexedDB: indexedDB, + IDBKeyRange: IDBKeyRange, + }); + dbNamesDB.version(1).stores({ dbnames: "name" }); + } + return dbNamesDB.table("dbnames"); + } + function hasDatabasesNative(indexedDB) { + return indexedDB && typeof indexedDB.databases === "function"; + } + function getDatabaseNames(_a) { + var indexedDB = _a.indexedDB, IDBKeyRange = _a.IDBKeyRange; + return hasDatabasesNative(indexedDB) + ? Promise.resolve(indexedDB.databases()).then(function (infos) { + return infos + .map(function (info) { return info.name; }) + .filter(function (name) { return name !== DBNAMES_DB; }); + }) + : getDbNamesTable(indexedDB, IDBKeyRange).toCollection().primaryKeys(); + } + function _onDatabaseCreated(_a, name) { + var indexedDB = _a.indexedDB, IDBKeyRange = _a.IDBKeyRange; + !hasDatabasesNative(indexedDB) && + name !== DBNAMES_DB && + getDbNamesTable(indexedDB, IDBKeyRange).put({ name: name }).catch(nop); + } + function _onDatabaseDeleted(_a, name) { + var indexedDB = _a.indexedDB, IDBKeyRange = _a.IDBKeyRange; + !hasDatabasesNative(indexedDB) && + name !== DBNAMES_DB && + getDbNamesTable(indexedDB, IDBKeyRange).delete(name).catch(nop); + } + + function vip(fn) { + return newScope(function () { + PSD.letThrough = true; + return fn(); + }); + } + + function idbReady() { + var isSafari = !navigator.userAgentData && + /Safari\//.test(navigator.userAgent) && + !/Chrom(e|ium)\//.test(navigator.userAgent); + if (!isSafari || !indexedDB.databases) + return Promise.resolve(); + var intervalId; + return new Promise(function (resolve) { + var tryIdb = function () { return indexedDB.databases().finally(resolve); }; + intervalId = setInterval(tryIdb, 100); + tryIdb(); + }).finally(function () { return clearInterval(intervalId); }); + } + + function dexieOpen(db) { + var state = db._state; + var indexedDB = db._deps.indexedDB; + if (state.isBeingOpened || db.idbdb) + return state.dbReadyPromise.then(function () { return state.dbOpenError ? + rejection(state.dbOpenError) : + db; }); + debug && (state.openCanceller._stackHolder = getErrorWithStack()); + state.isBeingOpened = true; + state.dbOpenError = null; + state.openComplete = false; + var openCanceller = state.openCanceller; + function throwIfCancelled() { + if (state.openCanceller !== openCanceller) + throw new exceptions.DatabaseClosed('db.open() was cancelled'); + } + var resolveDbReady = state.dbReadyResolve, + upgradeTransaction = null, wasCreated = false; + return DexiePromise.race([openCanceller, (typeof navigator === 'undefined' ? DexiePromise.resolve() : idbReady()).then(function () { return new DexiePromise(function (resolve, reject) { + throwIfCancelled(); + if (!indexedDB) + throw new exceptions.MissingAPI(); + var dbName = db.name; + var req = state.autoSchema ? + indexedDB.open(dbName) : + indexedDB.open(dbName, Math.round(db.verno * 10)); + if (!req) + throw new exceptions.MissingAPI(); + req.onerror = eventRejectHandler(reject); + req.onblocked = wrap(db._fireOnBlocked); + req.onupgradeneeded = wrap(function (e) { + upgradeTransaction = req.transaction; + if (state.autoSchema && !db._options.allowEmptyDB) { + req.onerror = preventDefault; + upgradeTransaction.abort(); + req.result.close(); + var delreq = indexedDB.deleteDatabase(dbName); + delreq.onsuccess = delreq.onerror = wrap(function () { + reject(new exceptions.NoSuchDatabase("Database " + dbName + " doesnt exist")); + }); + } + else { + upgradeTransaction.onerror = eventRejectHandler(reject); + var oldVer = e.oldVersion > Math.pow(2, 62) ? 0 : e.oldVersion; + wasCreated = oldVer < 1; + db._novip.idbdb = req.result; + runUpgraders(db, oldVer / 10, upgradeTransaction, reject); + } + }, reject); + req.onsuccess = wrap(function () { + upgradeTransaction = null; + var idbdb = db._novip.idbdb = req.result; + var objectStoreNames = slice(idbdb.objectStoreNames); + if (objectStoreNames.length > 0) + try { + var tmpTrans = idbdb.transaction(safariMultiStoreFix(objectStoreNames), 'readonly'); + if (state.autoSchema) + readGlobalSchema(db, idbdb, tmpTrans); + else { + adjustToExistingIndexNames(db, db._dbSchema, tmpTrans); + if (!verifyInstalledSchema(db, tmpTrans)) { + console.warn("Dexie SchemaDiff: Schema was extended without increasing the number passed to db.version(). Some queries may fail."); + } + } + generateMiddlewareStacks(db, tmpTrans); + } + catch (e) { + } + connections.push(db); + idbdb.onversionchange = wrap(function (ev) { + state.vcFired = true; + db.on("versionchange").fire(ev); + }); + idbdb.onclose = wrap(function (ev) { + db.on("close").fire(ev); + }); + if (wasCreated) + _onDatabaseCreated(db._deps, dbName); + resolve(); + }, reject); + }); })]).then(function () { + throwIfCancelled(); + state.onReadyBeingFired = []; + return DexiePromise.resolve(vip(function () { return db.on.ready.fire(db.vip); })).then(function fireRemainders() { + if (state.onReadyBeingFired.length > 0) { + var remainders_1 = state.onReadyBeingFired.reduce(promisableChain, nop); + state.onReadyBeingFired = []; + return DexiePromise.resolve(vip(function () { return remainders_1(db.vip); })).then(fireRemainders); + } + }); + }).finally(function () { + state.onReadyBeingFired = null; + state.isBeingOpened = false; + }).then(function () { + return db; + }).catch(function (err) { + state.dbOpenError = err; + try { + upgradeTransaction && upgradeTransaction.abort(); + } + catch (_a) { } + if (openCanceller === state.openCanceller) { + db._close(); + } + return rejection(err); + }).finally(function () { + state.openComplete = true; + resolveDbReady(); + }); + } + + function awaitIterator(iterator) { + var callNext = function (result) { return iterator.next(result); }, doThrow = function (error) { return iterator.throw(error); }, onSuccess = step(callNext), onError = step(doThrow); + function step(getNext) { + return function (val) { + var next = getNext(val), value = next.value; + return next.done ? value : + (!value || typeof value.then !== 'function' ? + isArray(value) ? Promise.all(value).then(onSuccess, onError) : onSuccess(value) : + value.then(onSuccess, onError)); + }; + } + return step(callNext)(); + } + + function extractTransactionArgs(mode, _tableArgs_, scopeFunc) { + var i = arguments.length; + if (i < 2) + throw new exceptions.InvalidArgument("Too few arguments"); + var args = new Array(i - 1); + while (--i) + args[i - 1] = arguments[i]; + scopeFunc = args.pop(); + var tables = flatten(args); + return [mode, tables, scopeFunc]; + } + function enterTransactionScope(db, mode, storeNames, parentTransaction, scopeFunc) { + return DexiePromise.resolve().then(function () { + var transless = PSD.transless || PSD; + var trans = db._createTransaction(mode, storeNames, db._dbSchema, parentTransaction); + var zoneProps = { + trans: trans, + transless: transless + }; + if (parentTransaction) { + trans.idbtrans = parentTransaction.idbtrans; + } + else { + try { + trans.create(); + db._state.PR1398_maxLoop = 3; + } + catch (ex) { + if (ex.name === errnames.InvalidState && db.isOpen() && --db._state.PR1398_maxLoop > 0) { + console.warn('Dexie: Need to reopen db'); + db._close(); + return db.open().then(function () { return enterTransactionScope(db, mode, storeNames, null, scopeFunc); }); + } + return rejection(ex); + } + } + var scopeFuncIsAsync = isAsyncFunction(scopeFunc); + if (scopeFuncIsAsync) { + incrementExpectedAwaits(); + } + var returnValue; + var promiseFollowed = DexiePromise.follow(function () { + returnValue = scopeFunc.call(trans, trans); + if (returnValue) { + if (scopeFuncIsAsync) { + var decrementor = decrementExpectedAwaits.bind(null, null); + returnValue.then(decrementor, decrementor); + } + else if (typeof returnValue.next === 'function' && typeof returnValue.throw === 'function') { + returnValue = awaitIterator(returnValue); + } + } + }, zoneProps); + return (returnValue && typeof returnValue.then === 'function' ? + DexiePromise.resolve(returnValue).then(function (x) { return trans.active ? + x + : rejection(new exceptions.PrematureCommit("Transaction committed too early. See http://bit.ly/2kdckMn")); }) + : promiseFollowed.then(function () { return returnValue; })).then(function (x) { + if (parentTransaction) + trans._resolve(); + return trans._completion.then(function () { return x; }); + }).catch(function (e) { + trans._reject(e); + return rejection(e); + }); + }); + } + + function pad(a, value, count) { + var result = isArray(a) ? a.slice() : [a]; + for (var i = 0; i < count; ++i) + result.push(value); + return result; + } + function createVirtualIndexMiddleware(down) { + return __assign(__assign({}, down), { table: function (tableName) { + var table = down.table(tableName); + var schema = table.schema; + var indexLookup = {}; + var allVirtualIndexes = []; + function addVirtualIndexes(keyPath, keyTail, lowLevelIndex) { + var keyPathAlias = getKeyPathAlias(keyPath); + var indexList = (indexLookup[keyPathAlias] = indexLookup[keyPathAlias] || []); + var keyLength = keyPath == null ? 0 : typeof keyPath === 'string' ? 1 : keyPath.length; + var isVirtual = keyTail > 0; + var virtualIndex = __assign(__assign({}, lowLevelIndex), { isVirtual: isVirtual, keyTail: keyTail, keyLength: keyLength, extractKey: getKeyExtractor(keyPath), unique: !isVirtual && lowLevelIndex.unique }); + indexList.push(virtualIndex); + if (!virtualIndex.isPrimaryKey) { + allVirtualIndexes.push(virtualIndex); + } + if (keyLength > 1) { + var virtualKeyPath = keyLength === 2 ? + keyPath[0] : + keyPath.slice(0, keyLength - 1); + addVirtualIndexes(virtualKeyPath, keyTail + 1, lowLevelIndex); + } + indexList.sort(function (a, b) { return a.keyTail - b.keyTail; }); + return virtualIndex; + } + var primaryKey = addVirtualIndexes(schema.primaryKey.keyPath, 0, schema.primaryKey); + indexLookup[":id"] = [primaryKey]; + for (var _i = 0, _a = schema.indexes; _i < _a.length; _i++) { + var index = _a[_i]; + addVirtualIndexes(index.keyPath, 0, index); + } + function findBestIndex(keyPath) { + var result = indexLookup[getKeyPathAlias(keyPath)]; + return result && result[0]; + } + function translateRange(range, keyTail) { + return { + type: range.type === 1 ? + 2 : + range.type, + lower: pad(range.lower, range.lowerOpen ? down.MAX_KEY : down.MIN_KEY, keyTail), + lowerOpen: true, + upper: pad(range.upper, range.upperOpen ? down.MIN_KEY : down.MAX_KEY, keyTail), + upperOpen: true + }; + } + function translateRequest(req) { + var index = req.query.index; + return index.isVirtual ? __assign(__assign({}, req), { query: { + index: index, + range: translateRange(req.query.range, index.keyTail) + } }) : req; + } + var result = __assign(__assign({}, table), { schema: __assign(__assign({}, schema), { primaryKey: primaryKey, indexes: allVirtualIndexes, getIndexByKeyPath: findBestIndex }), count: function (req) { + return table.count(translateRequest(req)); + }, query: function (req) { + return table.query(translateRequest(req)); + }, openCursor: function (req) { + var _a = req.query.index, keyTail = _a.keyTail, isVirtual = _a.isVirtual, keyLength = _a.keyLength; + if (!isVirtual) + return table.openCursor(req); + function createVirtualCursor(cursor) { + function _continue(key) { + key != null ? + cursor.continue(pad(key, req.reverse ? down.MAX_KEY : down.MIN_KEY, keyTail)) : + req.unique ? + cursor.continue(cursor.key.slice(0, keyLength) + .concat(req.reverse + ? down.MIN_KEY + : down.MAX_KEY, keyTail)) : + cursor.continue(); + } + var virtualCursor = Object.create(cursor, { + continue: { value: _continue }, + continuePrimaryKey: { + value: function (key, primaryKey) { + cursor.continuePrimaryKey(pad(key, down.MAX_KEY, keyTail), primaryKey); + } + }, + primaryKey: { + get: function () { + return cursor.primaryKey; + } + }, + key: { + get: function () { + var key = cursor.key; + return keyLength === 1 ? + key[0] : + key.slice(0, keyLength); + } + }, + value: { + get: function () { + return cursor.value; + } + } + }); + return virtualCursor; + } + return table.openCursor(translateRequest(req)) + .then(function (cursor) { return cursor && createVirtualCursor(cursor); }); + } }); + return result; + } }); + } + var virtualIndexMiddleware = { + stack: "dbcore", + name: "VirtualIndexMiddleware", + level: 1, + create: createVirtualIndexMiddleware + }; + + function getObjectDiff(a, b, rv, prfx) { + rv = rv || {}; + prfx = prfx || ''; + keys(a).forEach(function (prop) { + if (!hasOwn(b, prop)) { + rv[prfx + prop] = undefined; + } + else { + var ap = a[prop], bp = b[prop]; + if (typeof ap === 'object' && typeof bp === 'object' && ap && bp) { + var apTypeName = toStringTag(ap); + var bpTypeName = toStringTag(bp); + if (apTypeName !== bpTypeName) { + rv[prfx + prop] = b[prop]; + } + else if (apTypeName === 'Object') { + getObjectDiff(ap, bp, rv, prfx + prop + '.'); + } + else if (ap !== bp) { + rv[prfx + prop] = b[prop]; + } + } + else if (ap !== bp) + rv[prfx + prop] = b[prop]; + } + }); + keys(b).forEach(function (prop) { + if (!hasOwn(a, prop)) { + rv[prfx + prop] = b[prop]; + } + }); + return rv; + } + + function getEffectiveKeys(primaryKey, req) { + if (req.type === 'delete') + return req.keys; + return req.keys || req.values.map(primaryKey.extractKey); + } + + var hooksMiddleware = { + stack: "dbcore", + name: "HooksMiddleware", + level: 2, + create: function (downCore) { return (__assign(__assign({}, downCore), { table: function (tableName) { + var downTable = downCore.table(tableName); + var primaryKey = downTable.schema.primaryKey; + var tableMiddleware = __assign(__assign({}, downTable), { mutate: function (req) { + var dxTrans = PSD.trans; + var _a = dxTrans.table(tableName).hook, deleting = _a.deleting, creating = _a.creating, updating = _a.updating; + switch (req.type) { + case 'add': + if (creating.fire === nop) + break; + return dxTrans._promise('readwrite', function () { return addPutOrDelete(req); }, true); + case 'put': + if (creating.fire === nop && updating.fire === nop) + break; + return dxTrans._promise('readwrite', function () { return addPutOrDelete(req); }, true); + case 'delete': + if (deleting.fire === nop) + break; + return dxTrans._promise('readwrite', function () { return addPutOrDelete(req); }, true); + case 'deleteRange': + if (deleting.fire === nop) + break; + return dxTrans._promise('readwrite', function () { return deleteRange(req); }, true); + } + return downTable.mutate(req); + function addPutOrDelete(req) { + var dxTrans = PSD.trans; + var keys = req.keys || getEffectiveKeys(primaryKey, req); + if (!keys) + throw new Error("Keys missing"); + req = req.type === 'add' || req.type === 'put' ? __assign(__assign({}, req), { keys: keys }) : __assign({}, req); + if (req.type !== 'delete') + req.values = __spreadArray([], req.values, true); + if (req.keys) + req.keys = __spreadArray([], req.keys, true); + return getExistingValues(downTable, req, keys).then(function (existingValues) { + var contexts = keys.map(function (key, i) { + var existingValue = existingValues[i]; + var ctx = { onerror: null, onsuccess: null }; + if (req.type === 'delete') { + deleting.fire.call(ctx, key, existingValue, dxTrans); + } + else if (req.type === 'add' || existingValue === undefined) { + var generatedPrimaryKey = creating.fire.call(ctx, key, req.values[i], dxTrans); + if (key == null && generatedPrimaryKey != null) { + key = generatedPrimaryKey; + req.keys[i] = key; + if (!primaryKey.outbound) { + setByKeyPath(req.values[i], primaryKey.keyPath, key); + } + } + } + else { + var objectDiff = getObjectDiff(existingValue, req.values[i]); + var additionalChanges_1 = updating.fire.call(ctx, objectDiff, key, existingValue, dxTrans); + if (additionalChanges_1) { + var requestedValue_1 = req.values[i]; + Object.keys(additionalChanges_1).forEach(function (keyPath) { + if (hasOwn(requestedValue_1, keyPath)) { + requestedValue_1[keyPath] = additionalChanges_1[keyPath]; + } + else { + setByKeyPath(requestedValue_1, keyPath, additionalChanges_1[keyPath]); + } + }); + } + } + return ctx; + }); + return downTable.mutate(req).then(function (_a) { + var failures = _a.failures, results = _a.results, numFailures = _a.numFailures, lastResult = _a.lastResult; + for (var i = 0; i < keys.length; ++i) { + var primKey = results ? results[i] : keys[i]; + var ctx = contexts[i]; + if (primKey == null) { + ctx.onerror && ctx.onerror(failures[i]); + } + else { + ctx.onsuccess && ctx.onsuccess(req.type === 'put' && existingValues[i] ? + req.values[i] : + primKey + ); + } + } + return { failures: failures, results: results, numFailures: numFailures, lastResult: lastResult }; + }).catch(function (error) { + contexts.forEach(function (ctx) { return ctx.onerror && ctx.onerror(error); }); + return Promise.reject(error); + }); + }); + } + function deleteRange(req) { + return deleteNextChunk(req.trans, req.range, 10000); + } + function deleteNextChunk(trans, range, limit) { + return downTable.query({ trans: trans, values: false, query: { index: primaryKey, range: range }, limit: limit }) + .then(function (_a) { + var result = _a.result; + return addPutOrDelete({ type: 'delete', keys: result, trans: trans }).then(function (res) { + if (res.numFailures > 0) + return Promise.reject(res.failures[0]); + if (result.length < limit) { + return { failures: [], numFailures: 0, lastResult: undefined }; + } + else { + return deleteNextChunk(trans, __assign(__assign({}, range), { lower: result[result.length - 1], lowerOpen: true }), limit); + } + }); + }); + } + } }); + return tableMiddleware; + } })); } + }; + function getExistingValues(table, req, effectiveKeys) { + return req.type === "add" + ? Promise.resolve([]) + : table.getMany({ trans: req.trans, keys: effectiveKeys, cache: "immutable" }); + } + + function getFromTransactionCache(keys, cache, clone) { + try { + if (!cache) + return null; + if (cache.keys.length < keys.length) + return null; + var result = []; + for (var i = 0, j = 0; i < cache.keys.length && j < keys.length; ++i) { + if (cmp(cache.keys[i], keys[j]) !== 0) + continue; + result.push(clone ? deepClone(cache.values[i]) : cache.values[i]); + ++j; + } + return result.length === keys.length ? result : null; + } + catch (_a) { + return null; + } + } + var cacheExistingValuesMiddleware = { + stack: "dbcore", + level: -1, + create: function (core) { + return { + table: function (tableName) { + var table = core.table(tableName); + return __assign(__assign({}, table), { getMany: function (req) { + if (!req.cache) { + return table.getMany(req); + } + var cachedResult = getFromTransactionCache(req.keys, req.trans["_cache"], req.cache === "clone"); + if (cachedResult) { + return DexiePromise.resolve(cachedResult); + } + return table.getMany(req).then(function (res) { + req.trans["_cache"] = { + keys: req.keys, + values: req.cache === "clone" ? deepClone(res) : res, + }; + return res; + }); + }, mutate: function (req) { + if (req.type !== "add") + req.trans["_cache"] = null; + return table.mutate(req); + } }); + }, + }; + }, + }; + + var _a; + function isEmptyRange(node) { + return !("from" in node); + } + var RangeSet = function (fromOrTree, to) { + if (this) { + extend(this, arguments.length ? { d: 1, from: fromOrTree, to: arguments.length > 1 ? to : fromOrTree } : { d: 0 }); + } + else { + var rv = new RangeSet(); + if (fromOrTree && ("d" in fromOrTree)) { + extend(rv, fromOrTree); + } + return rv; + } + }; + props(RangeSet.prototype, (_a = { + add: function (rangeSet) { + mergeRanges(this, rangeSet); + return this; + }, + addKey: function (key) { + addRange(this, key, key); + return this; + }, + addKeys: function (keys) { + var _this = this; + keys.forEach(function (key) { return addRange(_this, key, key); }); + return this; + } + }, + _a[iteratorSymbol] = function () { + return getRangeSetIterator(this); + }, + _a)); + function addRange(target, from, to) { + var diff = cmp(from, to); + if (isNaN(diff)) + return; + if (diff > 0) + throw RangeError(); + if (isEmptyRange(target)) + return extend(target, { from: from, to: to, d: 1 }); + var left = target.l; + var right = target.r; + if (cmp(to, target.from) < 0) { + left + ? addRange(left, from, to) + : (target.l = { from: from, to: to, d: 1, l: null, r: null }); + return rebalance(target); + } + if (cmp(from, target.to) > 0) { + right + ? addRange(right, from, to) + : (target.r = { from: from, to: to, d: 1, l: null, r: null }); + return rebalance(target); + } + if (cmp(from, target.from) < 0) { + target.from = from; + target.l = null; + target.d = right ? right.d + 1 : 1; + } + if (cmp(to, target.to) > 0) { + target.to = to; + target.r = null; + target.d = target.l ? target.l.d + 1 : 1; + } + var rightWasCutOff = !target.r; + if (left && !target.l) { + mergeRanges(target, left); + } + if (right && rightWasCutOff) { + mergeRanges(target, right); + } + } + function mergeRanges(target, newSet) { + function _addRangeSet(target, _a) { + var from = _a.from, to = _a.to, l = _a.l, r = _a.r; + addRange(target, from, to); + if (l) + _addRangeSet(target, l); + if (r) + _addRangeSet(target, r); + } + if (!isEmptyRange(newSet)) + _addRangeSet(target, newSet); + } + function rangesOverlap(rangeSet1, rangeSet2) { + var i1 = getRangeSetIterator(rangeSet2); + var nextResult1 = i1.next(); + if (nextResult1.done) + return false; + var a = nextResult1.value; + var i2 = getRangeSetIterator(rangeSet1); + var nextResult2 = i2.next(a.from); + var b = nextResult2.value; + while (!nextResult1.done && !nextResult2.done) { + if (cmp(b.from, a.to) <= 0 && cmp(b.to, a.from) >= 0) + return true; + cmp(a.from, b.from) < 0 + ? (a = (nextResult1 = i1.next(b.from)).value) + : (b = (nextResult2 = i2.next(a.from)).value); + } + return false; + } + function getRangeSetIterator(node) { + var state = isEmptyRange(node) ? null : { s: 0, n: node }; + return { + next: function (key) { + var keyProvided = arguments.length > 0; + while (state) { + switch (state.s) { + case 0: + state.s = 1; + if (keyProvided) { + while (state.n.l && cmp(key, state.n.from) < 0) + state = { up: state, n: state.n.l, s: 1 }; + } + else { + while (state.n.l) + state = { up: state, n: state.n.l, s: 1 }; + } + case 1: + state.s = 2; + if (!keyProvided || cmp(key, state.n.to) <= 0) + return { value: state.n, done: false }; + case 2: + if (state.n.r) { + state.s = 3; + state = { up: state, n: state.n.r, s: 0 }; + continue; + } + case 3: + state = state.up; + } + } + return { done: true }; + }, + }; + } + function rebalance(target) { + var _a, _b; + var diff = (((_a = target.r) === null || _a === void 0 ? void 0 : _a.d) || 0) - (((_b = target.l) === null || _b === void 0 ? void 0 : _b.d) || 0); + var r = diff > 1 ? "r" : diff < -1 ? "l" : ""; + if (r) { + var l = r === "r" ? "l" : "r"; + var rootClone = __assign({}, target); + var oldRootRight = target[r]; + target.from = oldRootRight.from; + target.to = oldRootRight.to; + target[r] = oldRootRight[r]; + rootClone[r] = oldRootRight[l]; + target[l] = rootClone; + rootClone.d = computeDepth(rootClone); + } + target.d = computeDepth(target); + } + function computeDepth(_a) { + var r = _a.r, l = _a.l; + return (r ? (l ? Math.max(r.d, l.d) : r.d) : l ? l.d : 0) + 1; + } + + var observabilityMiddleware = { + stack: "dbcore", + level: 0, + create: function (core) { + var dbName = core.schema.name; + var FULL_RANGE = new RangeSet(core.MIN_KEY, core.MAX_KEY); + return __assign(__assign({}, core), { table: function (tableName) { + var table = core.table(tableName); + var schema = table.schema; + var primaryKey = schema.primaryKey; + var extractKey = primaryKey.extractKey, outbound = primaryKey.outbound; + var tableClone = __assign(__assign({}, table), { mutate: function (req) { + var trans = req.trans; + var mutatedParts = trans.mutatedParts || (trans.mutatedParts = {}); + var getRangeSet = function (indexName) { + var part = "idb://" + dbName + "/" + tableName + "/" + indexName; + return (mutatedParts[part] || + (mutatedParts[part] = new RangeSet())); + }; + var pkRangeSet = getRangeSet(""); + var delsRangeSet = getRangeSet(":dels"); + var type = req.type; + var _a = req.type === "deleteRange" + ? [req.range] + : req.type === "delete" + ? [req.keys] + : req.values.length < 50 + ? [[], req.values] + : [], keys = _a[0], newObjs = _a[1]; + var oldCache = req.trans["_cache"]; + return table.mutate(req).then(function (res) { + if (isArray(keys)) { + if (type !== "delete") + keys = res.results; + pkRangeSet.addKeys(keys); + var oldObjs = getFromTransactionCache(keys, oldCache); + if (!oldObjs && type !== "add") { + delsRangeSet.addKeys(keys); + } + if (oldObjs || newObjs) { + trackAffectedIndexes(getRangeSet, schema, oldObjs, newObjs); + } + } + else if (keys) { + var range = { from: keys.lower, to: keys.upper }; + delsRangeSet.add(range); + pkRangeSet.add(range); + } + else { + pkRangeSet.add(FULL_RANGE); + delsRangeSet.add(FULL_RANGE); + schema.indexes.forEach(function (idx) { return getRangeSet(idx.name).add(FULL_RANGE); }); + } + return res; + }); + } }); + var getRange = function (_a) { + var _b, _c; + var _d = _a.query, index = _d.index, range = _d.range; + return [ + index, + new RangeSet((_b = range.lower) !== null && _b !== void 0 ? _b : core.MIN_KEY, (_c = range.upper) !== null && _c !== void 0 ? _c : core.MAX_KEY), + ]; + }; + var readSubscribers = { + get: function (req) { return [primaryKey, new RangeSet(req.key)]; }, + getMany: function (req) { return [primaryKey, new RangeSet().addKeys(req.keys)]; }, + count: getRange, + query: getRange, + openCursor: getRange, + }; + keys(readSubscribers).forEach(function (method) { + tableClone[method] = function (req) { + var subscr = PSD.subscr; + if (subscr) { + var getRangeSet = function (indexName) { + var part = "idb://" + dbName + "/" + tableName + "/" + indexName; + return (subscr[part] || + (subscr[part] = new RangeSet())); + }; + var pkRangeSet_1 = getRangeSet(""); + var delsRangeSet_1 = getRangeSet(":dels"); + var _a = readSubscribers[method](req), queriedIndex = _a[0], queriedRanges = _a[1]; + getRangeSet(queriedIndex.name || "").add(queriedRanges); + if (!queriedIndex.isPrimaryKey) { + if (method === "count") { + delsRangeSet_1.add(FULL_RANGE); + } + else { + var keysPromise_1 = method === "query" && + outbound && + req.values && + table.query(__assign(__assign({}, req), { values: false })); + return table[method].apply(this, arguments).then(function (res) { + if (method === "query") { + if (outbound && req.values) { + return keysPromise_1.then(function (_a) { + var resultingKeys = _a.result; + pkRangeSet_1.addKeys(resultingKeys); + return res; + }); + } + var pKeys = req.values + ? res.result.map(extractKey) + : res.result; + if (req.values) { + pkRangeSet_1.addKeys(pKeys); + } + else { + delsRangeSet_1.addKeys(pKeys); + } + } + else if (method === "openCursor") { + var cursor_1 = res; + var wantValues_1 = req.values; + return (cursor_1 && + Object.create(cursor_1, { + key: { + get: function () { + delsRangeSet_1.addKey(cursor_1.primaryKey); + return cursor_1.key; + }, + }, + primaryKey: { + get: function () { + var pkey = cursor_1.primaryKey; + delsRangeSet_1.addKey(pkey); + return pkey; + }, + }, + value: { + get: function () { + wantValues_1 && pkRangeSet_1.addKey(cursor_1.primaryKey); + return cursor_1.value; + }, + }, + })); + } + return res; + }); + } + } + } + return table[method].apply(this, arguments); + }; + }); + return tableClone; + } }); + }, + }; + function trackAffectedIndexes(getRangeSet, schema, oldObjs, newObjs) { + function addAffectedIndex(ix) { + var rangeSet = getRangeSet(ix.name || ""); + function extractKey(obj) { + return obj != null ? ix.extractKey(obj) : null; + } + var addKeyOrKeys = function (key) { return ix.multiEntry && isArray(key) + ? key.forEach(function (key) { return rangeSet.addKey(key); }) + : rangeSet.addKey(key); }; + (oldObjs || newObjs).forEach(function (_, i) { + var oldKey = oldObjs && extractKey(oldObjs[i]); + var newKey = newObjs && extractKey(newObjs[i]); + if (cmp(oldKey, newKey) !== 0) { + if (oldKey != null) + addKeyOrKeys(oldKey); + if (newKey != null) + addKeyOrKeys(newKey); + } + }); + } + schema.indexes.forEach(addAffectedIndex); + } + + var Dexie$1 = (function () { + function Dexie(name, options) { + var _this = this; + this._middlewares = {}; + this.verno = 0; + var deps = Dexie.dependencies; + this._options = options = __assign({ + addons: Dexie.addons, autoOpen: true, + indexedDB: deps.indexedDB, IDBKeyRange: deps.IDBKeyRange }, options); + this._deps = { + indexedDB: options.indexedDB, + IDBKeyRange: options.IDBKeyRange + }; + var addons = options.addons; + this._dbSchema = {}; + this._versions = []; + this._storeNames = []; + this._allTables = {}; + this.idbdb = null; + this._novip = this; + var state = { + dbOpenError: null, + isBeingOpened: false, + onReadyBeingFired: null, + openComplete: false, + dbReadyResolve: nop, + dbReadyPromise: null, + cancelOpen: nop, + openCanceller: null, + autoSchema: true, + PR1398_maxLoop: 3 + }; + state.dbReadyPromise = new DexiePromise(function (resolve) { + state.dbReadyResolve = resolve; + }); + state.openCanceller = new DexiePromise(function (_, reject) { + state.cancelOpen = reject; + }); + this._state = state; + this.name = name; + this.on = Events(this, "populate", "blocked", "versionchange", "close", { ready: [promisableChain, nop] }); + this.on.ready.subscribe = override(this.on.ready.subscribe, function (subscribe) { + return function (subscriber, bSticky) { + Dexie.vip(function () { + var state = _this._state; + if (state.openComplete) { + if (!state.dbOpenError) + DexiePromise.resolve().then(subscriber); + if (bSticky) + subscribe(subscriber); + } + else if (state.onReadyBeingFired) { + state.onReadyBeingFired.push(subscriber); + if (bSticky) + subscribe(subscriber); + } + else { + subscribe(subscriber); + var db_1 = _this; + if (!bSticky) + subscribe(function unsubscribe() { + db_1.on.ready.unsubscribe(subscriber); + db_1.on.ready.unsubscribe(unsubscribe); + }); + } + }); + }; + }); + this.Collection = createCollectionConstructor(this); + this.Table = createTableConstructor(this); + this.Transaction = createTransactionConstructor(this); + this.Version = createVersionConstructor(this); + this.WhereClause = createWhereClauseConstructor(this); + this.on("versionchange", function (ev) { + if (ev.newVersion > 0) + console.warn("Another connection wants to upgrade database '" + _this.name + "'. Closing db now to resume the upgrade."); + else + console.warn("Another connection wants to delete database '" + _this.name + "'. Closing db now to resume the delete request."); + _this.close(); + }); + this.on("blocked", function (ev) { + if (!ev.newVersion || ev.newVersion < ev.oldVersion) + console.warn("Dexie.delete('" + _this.name + "') was blocked"); + else + console.warn("Upgrade '" + _this.name + "' blocked by other connection holding version " + ev.oldVersion / 10); + }); + this._maxKey = getMaxKey(options.IDBKeyRange); + this._createTransaction = function (mode, storeNames, dbschema, parentTransaction) { return new _this.Transaction(mode, storeNames, dbschema, _this._options.chromeTransactionDurability, parentTransaction); }; + this._fireOnBlocked = function (ev) { + _this.on("blocked").fire(ev); + connections + .filter(function (c) { return c.name === _this.name && c !== _this && !c._state.vcFired; }) + .map(function (c) { return c.on("versionchange").fire(ev); }); + }; + this.use(virtualIndexMiddleware); + this.use(hooksMiddleware); + this.use(observabilityMiddleware); + this.use(cacheExistingValuesMiddleware); + this.vip = Object.create(this, { _vip: { value: true } }); + addons.forEach(function (addon) { return addon(_this); }); + } + Dexie.prototype.version = function (versionNumber) { + if (isNaN(versionNumber) || versionNumber < 0.1) + throw new exceptions.Type("Given version is not a positive number"); + versionNumber = Math.round(versionNumber * 10) / 10; + if (this.idbdb || this._state.isBeingOpened) + throw new exceptions.Schema("Cannot add version when database is open"); + this.verno = Math.max(this.verno, versionNumber); + var versions = this._versions; + var versionInstance = versions.filter(function (v) { return v._cfg.version === versionNumber; })[0]; + if (versionInstance) + return versionInstance; + versionInstance = new this.Version(versionNumber); + versions.push(versionInstance); + versions.sort(lowerVersionFirst); + versionInstance.stores({}); + this._state.autoSchema = false; + return versionInstance; + }; + Dexie.prototype._whenReady = function (fn) { + var _this = this; + return (this.idbdb && (this._state.openComplete || PSD.letThrough || this._vip)) ? fn() : new DexiePromise(function (resolve, reject) { + if (_this._state.openComplete) { + return reject(new exceptions.DatabaseClosed(_this._state.dbOpenError)); + } + if (!_this._state.isBeingOpened) { + if (!_this._options.autoOpen) { + reject(new exceptions.DatabaseClosed()); + return; + } + _this.open().catch(nop); + } + _this._state.dbReadyPromise.then(resolve, reject); + }).then(fn); + }; + Dexie.prototype.use = function (_a) { + var stack = _a.stack, create = _a.create, level = _a.level, name = _a.name; + if (name) + this.unuse({ stack: stack, name: name }); + var middlewares = this._middlewares[stack] || (this._middlewares[stack] = []); + middlewares.push({ stack: stack, create: create, level: level == null ? 10 : level, name: name }); + middlewares.sort(function (a, b) { return a.level - b.level; }); + return this; + }; + Dexie.prototype.unuse = function (_a) { + var stack = _a.stack, name = _a.name, create = _a.create; + if (stack && this._middlewares[stack]) { + this._middlewares[stack] = this._middlewares[stack].filter(function (mw) { + return create ? mw.create !== create : + name ? mw.name !== name : + false; + }); + } + return this; + }; + Dexie.prototype.open = function () { + return dexieOpen(this); + }; + Dexie.prototype._close = function () { + var state = this._state; + var idx = connections.indexOf(this); + if (idx >= 0) + connections.splice(idx, 1); + if (this.idbdb) { + try { + this.idbdb.close(); + } + catch (e) { } + this._novip.idbdb = null; + } + state.dbReadyPromise = new DexiePromise(function (resolve) { + state.dbReadyResolve = resolve; + }); + state.openCanceller = new DexiePromise(function (_, reject) { + state.cancelOpen = reject; + }); + }; + Dexie.prototype.close = function () { + this._close(); + var state = this._state; + this._options.autoOpen = false; + state.dbOpenError = new exceptions.DatabaseClosed(); + if (state.isBeingOpened) + state.cancelOpen(state.dbOpenError); + }; + Dexie.prototype.delete = function () { + var _this = this; + var hasArguments = arguments.length > 0; + var state = this._state; + return new DexiePromise(function (resolve, reject) { + var doDelete = function () { + _this.close(); + var req = _this._deps.indexedDB.deleteDatabase(_this.name); + req.onsuccess = wrap(function () { + _onDatabaseDeleted(_this._deps, _this.name); + resolve(); + }); + req.onerror = eventRejectHandler(reject); + req.onblocked = _this._fireOnBlocked; + }; + if (hasArguments) + throw new exceptions.InvalidArgument("Arguments not allowed in db.delete()"); + if (state.isBeingOpened) { + state.dbReadyPromise.then(doDelete); + } + else { + doDelete(); + } + }); + }; + Dexie.prototype.backendDB = function () { + return this.idbdb; + }; + Dexie.prototype.isOpen = function () { + return this.idbdb !== null; + }; + Dexie.prototype.hasBeenClosed = function () { + var dbOpenError = this._state.dbOpenError; + return dbOpenError && (dbOpenError.name === 'DatabaseClosed'); + }; + Dexie.prototype.hasFailed = function () { + return this._state.dbOpenError !== null; + }; + Dexie.prototype.dynamicallyOpened = function () { + return this._state.autoSchema; + }; + Object.defineProperty(Dexie.prototype, "tables", { + get: function () { + var _this = this; + return keys(this._allTables).map(function (name) { return _this._allTables[name]; }); + }, + enumerable: false, + configurable: true + }); + Dexie.prototype.transaction = function () { + var args = extractTransactionArgs.apply(this, arguments); + return this._transaction.apply(this, args); + }; + Dexie.prototype._transaction = function (mode, tables, scopeFunc) { + var _this = this; + var parentTransaction = PSD.trans; + if (!parentTransaction || parentTransaction.db !== this || mode.indexOf('!') !== -1) + parentTransaction = null; + var onlyIfCompatible = mode.indexOf('?') !== -1; + mode = mode.replace('!', '').replace('?', ''); + var idbMode, storeNames; + try { + storeNames = tables.map(function (table) { + var storeName = table instanceof _this.Table ? table.name : table; + if (typeof storeName !== 'string') + throw new TypeError("Invalid table argument to Dexie.transaction(). Only Table or String are allowed"); + return storeName; + }); + if (mode == "r" || mode === READONLY) + idbMode = READONLY; + else if (mode == "rw" || mode == READWRITE) + idbMode = READWRITE; + else + throw new exceptions.InvalidArgument("Invalid transaction mode: " + mode); + if (parentTransaction) { + if (parentTransaction.mode === READONLY && idbMode === READWRITE) { + if (onlyIfCompatible) { + parentTransaction = null; + } + else + throw new exceptions.SubTransaction("Cannot enter a sub-transaction with READWRITE mode when parent transaction is READONLY"); + } + if (parentTransaction) { + storeNames.forEach(function (storeName) { + if (parentTransaction && parentTransaction.storeNames.indexOf(storeName) === -1) { + if (onlyIfCompatible) { + parentTransaction = null; + } + else + throw new exceptions.SubTransaction("Table " + storeName + + " not included in parent transaction."); + } + }); + } + if (onlyIfCompatible && parentTransaction && !parentTransaction.active) { + parentTransaction = null; + } + } + } + catch (e) { + return parentTransaction ? + parentTransaction._promise(null, function (_, reject) { reject(e); }) : + rejection(e); + } + var enterTransaction = enterTransactionScope.bind(null, this, idbMode, storeNames, parentTransaction, scopeFunc); + return (parentTransaction ? + parentTransaction._promise(idbMode, enterTransaction, "lock") : + PSD.trans ? + usePSD(PSD.transless, function () { return _this._whenReady(enterTransaction); }) : + this._whenReady(enterTransaction)); + }; + Dexie.prototype.table = function (tableName) { + if (!hasOwn(this._allTables, tableName)) { + throw new exceptions.InvalidTable("Table " + tableName + " does not exist"); + } + return this._allTables[tableName]; + }; + return Dexie; + }()); + + var symbolObservable = typeof Symbol !== "undefined" && "observable" in Symbol + ? Symbol.observable + : "@@observable"; + var Observable = (function () { + function Observable(subscribe) { + this._subscribe = subscribe; + } + Observable.prototype.subscribe = function (x, error, complete) { + return this._subscribe(!x || typeof x === "function" ? { next: x, error: error, complete: complete } : x); + }; + Observable.prototype[symbolObservable] = function () { + return this; + }; + return Observable; + }()); + + function extendObservabilitySet(target, newSet) { + keys(newSet).forEach(function (part) { + var rangeSet = target[part] || (target[part] = new RangeSet()); + mergeRanges(rangeSet, newSet[part]); + }); + return target; + } + + function liveQuery(querier) { + return new Observable(function (observer) { + var scopeFuncIsAsync = isAsyncFunction(querier); + function execute(subscr) { + if (scopeFuncIsAsync) { + incrementExpectedAwaits(); + } + var exec = function () { return newScope(querier, { subscr: subscr, trans: null }); }; + var rv = PSD.trans + ? + usePSD(PSD.transless, exec) + : exec(); + if (scopeFuncIsAsync) { + rv.then(decrementExpectedAwaits, decrementExpectedAwaits); + } + return rv; + } + var closed = false; + var accumMuts = {}; + var currentObs = {}; + var subscription = { + get closed() { + return closed; + }, + unsubscribe: function () { + closed = true; + globalEvents.storagemutated.unsubscribe(mutationListener); + }, + }; + observer.start && observer.start(subscription); + var querying = false, startedListening = false; + function shouldNotify() { + return keys(currentObs).some(function (key) { + return accumMuts[key] && rangesOverlap(accumMuts[key], currentObs[key]); + }); + } + var mutationListener = function (parts) { + extendObservabilitySet(accumMuts, parts); + if (shouldNotify()) { + doQuery(); + } + }; + var doQuery = function () { + if (querying || closed) + return; + accumMuts = {}; + var subscr = {}; + var ret = execute(subscr); + if (!startedListening) { + globalEvents(DEXIE_STORAGE_MUTATED_EVENT_NAME, mutationListener); + startedListening = true; + } + querying = true; + Promise.resolve(ret).then(function (result) { + querying = false; + if (closed) + return; + if (shouldNotify()) { + doQuery(); + } + else { + accumMuts = {}; + currentObs = subscr; + observer.next && observer.next(result); + } + }, function (err) { + querying = false; + observer.error && observer.error(err); + subscription.unsubscribe(); + }); + }; + doQuery(); + return subscription; + }); + } + + var domDeps; + try { + domDeps = { + indexedDB: _global.indexedDB || _global.mozIndexedDB || _global.webkitIndexedDB || _global.msIndexedDB, + IDBKeyRange: _global.IDBKeyRange || _global.webkitIDBKeyRange + }; + } + catch (e) { + domDeps = { indexedDB: null, IDBKeyRange: null }; + } + + var Dexie = Dexie$1; + props(Dexie, __assign(__assign({}, fullNameExceptions), { + delete: function (databaseName) { + var db = new Dexie(databaseName, { addons: [] }); + return db.delete(); + }, + exists: function (name) { + return new Dexie(name, { addons: [] }).open().then(function (db) { + db.close(); + return true; + }).catch('NoSuchDatabaseError', function () { return false; }); + }, + getDatabaseNames: function (cb) { + try { + return getDatabaseNames(Dexie.dependencies).then(cb); + } + catch (_a) { + return rejection(new exceptions.MissingAPI()); + } + }, + defineClass: function () { + function Class(content) { + extend(this, content); + } + return Class; + }, ignoreTransaction: function (scopeFunc) { + return PSD.trans ? + usePSD(PSD.transless, scopeFunc) : + scopeFunc(); + }, vip: vip, async: function (generatorFn) { + return function () { + try { + var rv = awaitIterator(generatorFn.apply(this, arguments)); + if (!rv || typeof rv.then !== 'function') + return DexiePromise.resolve(rv); + return rv; + } + catch (e) { + return rejection(e); + } + }; + }, spawn: function (generatorFn, args, thiz) { + try { + var rv = awaitIterator(generatorFn.apply(thiz, args || [])); + if (!rv || typeof rv.then !== 'function') + return DexiePromise.resolve(rv); + return rv; + } + catch (e) { + return rejection(e); + } + }, + currentTransaction: { + get: function () { return PSD.trans || null; } + }, waitFor: function (promiseOrFunction, optionalTimeout) { + var promise = DexiePromise.resolve(typeof promiseOrFunction === 'function' ? + Dexie.ignoreTransaction(promiseOrFunction) : + promiseOrFunction) + .timeout(optionalTimeout || 60000); + return PSD.trans ? + PSD.trans.waitFor(promise) : + promise; + }, + Promise: DexiePromise, + debug: { + get: function () { return debug; }, + set: function (value) { + setDebug(value, value === 'dexie' ? function () { return true; } : dexieStackFrameFilter); + } + }, + derive: derive, extend: extend, props: props, override: override, + Events: Events, on: globalEvents, liveQuery: liveQuery, extendObservabilitySet: extendObservabilitySet, + getByKeyPath: getByKeyPath, setByKeyPath: setByKeyPath, delByKeyPath: delByKeyPath, shallowClone: shallowClone, deepClone: deepClone, getObjectDiff: getObjectDiff, cmp: cmp, asap: asap$1, + minKey: minKey, + addons: [], + connections: connections, + errnames: errnames, + dependencies: domDeps, + semVer: DEXIE_VERSION, version: DEXIE_VERSION.split('.') + .map(function (n) { return parseInt(n); }) + .reduce(function (p, c, i) { return p + (c / Math.pow(10, i * 2)); }) })); + Dexie.maxKey = getMaxKey(Dexie.dependencies.IDBKeyRange); + + if (typeof dispatchEvent !== 'undefined' && typeof addEventListener !== 'undefined') { + globalEvents(DEXIE_STORAGE_MUTATED_EVENT_NAME, function (updatedParts) { + if (!propagatingLocally) { + var event_1; + if (isIEOrEdge) { + event_1 = document.createEvent('CustomEvent'); + event_1.initCustomEvent(STORAGE_MUTATED_DOM_EVENT_NAME, true, true, updatedParts); + } + else { + event_1 = new CustomEvent(STORAGE_MUTATED_DOM_EVENT_NAME, { + detail: updatedParts + }); + } + propagatingLocally = true; + dispatchEvent(event_1); + propagatingLocally = false; + } + }); + addEventListener(STORAGE_MUTATED_DOM_EVENT_NAME, function (_a) { + var detail = _a.detail; + if (!propagatingLocally) { + propagateLocally(detail); + } + }); + } + function propagateLocally(updateParts) { + var wasMe = propagatingLocally; + try { + propagatingLocally = true; + globalEvents.storagemutated.fire(updateParts); + } + finally { + propagatingLocally = wasMe; + } + } + var propagatingLocally = false; + + if (typeof BroadcastChannel !== 'undefined') { + var bc_1 = new BroadcastChannel(STORAGE_MUTATED_DOM_EVENT_NAME); + globalEvents(DEXIE_STORAGE_MUTATED_EVENT_NAME, function (changedParts) { + if (!propagatingLocally) { + bc_1.postMessage(changedParts); + } + }); + bc_1.onmessage = function (ev) { + if (ev.data) + propagateLocally(ev.data); + }; + } + else if (typeof self !== 'undefined' && typeof navigator !== 'undefined') { + globalEvents(DEXIE_STORAGE_MUTATED_EVENT_NAME, function (changedParts) { + try { + if (!propagatingLocally) { + if (typeof localStorage !== 'undefined') { + localStorage.setItem(STORAGE_MUTATED_DOM_EVENT_NAME, JSON.stringify({ + trig: Math.random(), + changedParts: changedParts, + })); + } + if (typeof self['clients'] === 'object') { + __spreadArray([], self['clients'].matchAll({ includeUncontrolled: true }), true).forEach(function (client) { + return client.postMessage({ + type: STORAGE_MUTATED_DOM_EVENT_NAME, + changedParts: changedParts, + }); + }); + } + } + } + catch (_a) { } + }); + if (typeof addEventListener !== 'undefined') { + addEventListener('storage', function (ev) { + if (ev.key === STORAGE_MUTATED_DOM_EVENT_NAME) { + var data = JSON.parse(ev.newValue); + if (data) + propagateLocally(data.changedParts); + } + }); + } + var swContainer = self.document && navigator.serviceWorker; + if (swContainer) { + swContainer.addEventListener('message', propagateMessageLocally); + } + } + function propagateMessageLocally(_a) { + var data = _a.data; + if (data && data.type === STORAGE_MUTATED_DOM_EVENT_NAME) { + propagateLocally(data.changedParts); + } + } + + DexiePromise.rejectionMapper = mapError; + setDebug(debug, dexieStackFrameFilter); + + // import * as Comlink from "comlink"; + // TODO: add LRU or other eviction policy, clean up least important data when db gets too big + var MyDexie = /*#__PURE__*/function (_Dexie) { + _inheritsLoose(MyDexie, _Dexie); + function MyDexie(dbName) { + var _this; + _this = _Dexie.call(this, dbName) || this; + _this.version(1).stores({ + nodes: ", value, updatedAt" + }); + _this.nodes = _this.table("nodes"); + return _this; + } + return MyDexie; + }(Dexie$1); + var IndexedDB = /*#__PURE__*/function (_Actor) { + _inheritsLoose(IndexedDB, _Actor); + function IndexedDB(config) { + var _this2; + if (config === void 0) { + config = {}; + } + _this2 = _Actor.call(this) || this; + _this2.config = {}; + _this2.notStored = new Set(); + _this2.putQueue = {}; + _this2.getQueue = {}; + _this2.i = 0; + _this2.queue = 0; + _this2.throttledPut = _.throttle(function () { + var keys = Object.keys(_this2.putQueue); + var values = keys.map(function (key) { + _this2.notStored["delete"](key); + return _this2.putQueue[key]; + }); + _this2.db.nodes.bulkPut(values, keys)["catch"](function (err) { + console.error(err); + }); + _this2.putQueue = {}; + }, 500); + _this2.throttledGet = _.throttle(function () { + // clone this.getQueue and clear it + var queue = _this2.getQueue; + var keys = Object.keys(queue); + _this2.db.nodes.bulkGet(keys).then(function (values) { + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + var value = values[i]; + var callbacks = queue[key]; + // console.log('have', key, value); + for (var _iterator = _createForOfIteratorHelperLoose(callbacks), _step; !(_step = _iterator()).done;) { + var callback = _step.value; + callback(value); + } + } + }); + _this2.getQueue = {}; + }, 100); + _this2.config = config; + var dbName = config.dbName || 'iris'; + _this2.db = new MyDexie(dbName); + _this2.db.open()["catch"](function (err) { + console.error(err.stack || err); + }); + return _this2; + } + var _proto = IndexedDB.prototype; + _proto.put = function put(nodeId, value) { + // add puts to a queue and dexie bulk write them once per 500ms + this.putQueue[nodeId] = value; + this.throttledPut(); + }; + _proto.get = function get(path, callback) { + this.getQueue[path] = this.getQueue[path] || []; + this.getQueue[path].push(callback); + this.throttledGet(); + }; + _proto.handle = function handle(message) { + if (message instanceof Put) { + this.handlePut(message); + } else if (message instanceof Get) { + this.handleGet(message); + } else { + console.log('worker got unknown message', message); + } + }; + _proto.handleGet = function handleGet(message) { + var _this3 = this; + if (this.notStored.has(message.nodeId)) { + // TODO message implying that the key is not stored + return; + } + this.get(message.nodeId, function (children) { + // TODO: this takes a long time to return + if (children === undefined) { + _this3.notStored.add(message.nodeId); + // TODO message implying that the key is not stored + } else { + var putMessage = Put.newFromKv(message.nodeId, children, _this3); + putMessage.inResponseTo = message.id; + message.from && message.from.postMessage(putMessage); + } + }); + }; + _proto.mergeAndSave = function mergeAndSave(path, children) { + var _this4 = this; + this.get(path, function (existing) { + // TODO check updatedAt timestamp + if (existing === undefined) { + _this4.put(path, children); + } else { + for (var _i = 0, _Object$entries = Object.entries(children); _i < _Object$entries.length; _i++) { + var _Object$entries$_i = _Object$entries[_i], + key = _Object$entries$_i[0], + value = _Object$entries$_i[1]; + if (existing[key] && existing[key].updatedAt >= value.updatedAt) { + continue; + } + existing[key] = value; + } + _this4.put(path, existing); + } + }); + }; + _proto.savePath = function savePath(path, value) { + if (value === undefined) { + this.db.nodes["delete"](path); + this.notStored.add(path); + } else { + this.notStored["delete"](path); + this.mergeAndSave(path, value); + } + }; + _proto.handlePut = /*#__PURE__*/function () { + var _handlePut = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(put) { + var _i2, _Object$entries2, _Object$entries2$_i, nodeName, children; + return _regeneratorRuntime().wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + _i2 = 0, _Object$entries2 = Object.entries(put.updatedNodes); + case 1: + if (!(_i2 < _Object$entries2.length)) { + _context.next = 10; + break; + } + _Object$entries2$_i = _Object$entries2[_i2], nodeName = _Object$entries2$_i[0], children = _Object$entries2$_i[1]; + if (children) { + _context.next = 6; + break; + } + console.log('deleting', nodeName); + return _context.abrupt("continue", 7); + case 6: + this.mergeAndSave(nodeName, children); + case 7: + _i2++; + _context.next = 1; + break; + case 10: + case "end": + return _context.stop(); + } + } + }, _callee, this); + })); + function handlePut(_x) { + return _handlePut.apply(this, arguments); + } + return handlePut; + }(); + return IndexedDB; + }(Actor); + + //@ts-ignore + var Websocket = /*#__PURE__*/function (_Actor) { + _inheritsLoose(Websocket, _Actor); + function Websocket(url, router) { + var _this; + _this = _Actor.call(this, 'websocket:' + url) || this; + _this.sendQueue = []; + console.log('Websocket', url); + _this.router = router; + _this.ws = new WebSocket(url.replace('http', 'ws')); + _this.ws.onopen = function () { + //this.ws.send(new Hi(this.router.peerId).serialize()); + console.log("Connected to " + url); + _this.sendQueue.forEach(function (message) { + return _this.ws.send(message); + }); + _this.sendQueue = []; + }; + _this.ws.onmessage = /*#__PURE__*/function () { + var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(event) { + var message; + return _regeneratorRuntime().wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + _context.prev = 0; + _context.next = 3; + return Message.deserialize(event.data, _assertThisInitialized(_this)); + case 3: + message = _context.sent; + _this.router.postMessage(message); + _context.next = 9; + break; + case 7: + _context.prev = 7; + _context.t0 = _context["catch"](0); + case 9: + case "end": + return _context.stop(); + } + } + }, _callee, null, [[0, 7]]); + })); + return function (_x) { + return _ref.apply(this, arguments); + }; + }(); + _this.ws.onclose = function () { + console.log("Disconnected from " + url); + }; + _this.ws.onerror = function () { + console.log("Error on " + url); + }; + return _this; + } + var _proto = Websocket.prototype; + _proto.handle = function handle(message) { + if (message instanceof Get || message instanceof Put) { + if (message.from === this) { + return; + } + if (this.ws.readyState === WebSocket.OPEN) { + this.ws.send(message.serialize()); + } else if (this.ws.readyState === WebSocket.CONNECTING) { + this.sendQueue.push(message.serialize()); + } + } + }; + return Websocket; + }(Actor); + + // import * as Comlink from "comlink"; + /* + class SeenGetMessage { + constructor(id, from, lastReplyChecksum) { + this.id = id; + this.from = from; + this.lastReplyChecksum = lastReplyChecksum; + } + } + */ + var Router = /*#__PURE__*/function (_Actor) { + _inheritsLoose(Router, _Actor); + function Router(config) { + var _this; + if (config === void 0) { + config = {}; + } + _this = _Actor.call(this, 'router') || this; + _this.storageAdapters = new Set(); + _this.networkAdapters = new Set(); + _this.serverPeers = new Set(); + _this.seenMessages = new Set(); + _this.seenGetMessages = new Map(); + _this.subscribersByTopic = new Map(); + _this.msgCounter = 0; + // default random id + _this.peerId = config.peerId || Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15); + _this.storageAdapters.add(new Memory(config)); + _this.storageAdapters.add(new IndexedDB(config)); + console.log('config', config); + if (config.peers) { + for (var _iterator = _createForOfIteratorHelperLoose(config.peers), _step; !(_step = _iterator()).done;) { + var peer = _step.value; + if (peer) { + _this.serverPeers.add(new Websocket(peer, _assertThisInitialized(_this))); + } + } + } + return _this; + } + var _proto = Router.prototype; + _proto.handle = function handle(message) { + //console.log('router received', message); + if (message instanceof Put || message instanceof Get) { + if (this.seenMessages.has(message.id)) { + return; + } + this.seenMessages.add(message.id); + if (message instanceof Put) { + this.handlePut(message); + } else if (message instanceof Get) { + this.handleGet(message); + } + } + }; + _proto.handlePut = function handlePut(put) { + var _this2 = this; + var sendTo = new Set(); + Object.keys(put.updatedNodes).forEach(function (path) { + // topic is first 3 nodes of path + var topic = path.split('/').slice(0, 3).join('/'); + var subscribers = _this2.subscribersByTopic.get(topic); + // send to storage adapters + //console.log('put subscribers', subscribers); + for (var _iterator2 = _createForOfIteratorHelperLoose(_this2.storageAdapters), _step2; !(_step2 = _iterator2()).done;) { + var storageAdapter = _step2.value; + if (put.from !== storageAdapter) { + sendTo.add(storageAdapter); + } + } + for (var _iterator3 = _createForOfIteratorHelperLoose(_this2.serverPeers), _step3; !(_step3 = _iterator3()).done;) { + var peer = _step3.value; + if (put.from !== peer) { + sendTo.add(peer); + } + } + if (subscribers) { + for (var _iterator4 = _createForOfIteratorHelperLoose(subscribers), _step4; !(_step4 = _iterator4()).done;) { + var subscriber = _step4.value; + if (subscriber !== put.from) { + sendTo.add(subscriber); + } + } + } + }); + for (var _iterator5 = _createForOfIteratorHelperLoose(sendTo), _step5; !(_step5 = _iterator5()).done;) { + var actor = _step5.value; + actor.postMessage(put); + } + }; + _proto.opt = function opt(opts) { + if (opts.peers) { + for (var _iterator6 = _createForOfIteratorHelperLoose(opts.peers), _step6; !(_step6 = _iterator6()).done;) { + var peer = _step6.value; + if (peer) { + this.serverPeers.add(new Websocket(peer, this)); + } + } + } + }; + _proto.handleGet = function handleGet(get) { + var topic = get.nodeId.split('/')[1]; + var sendTo = new Set(); + for (var _iterator7 = _createForOfIteratorHelperLoose(this.storageAdapters), _step7; !(_step7 = _iterator7()).done;) { + var storageAdapter = _step7.value; + if (get.from !== storageAdapter) { + sendTo.add(storageAdapter); + } + } + for (var _iterator8 = _createForOfIteratorHelperLoose(this.serverPeers), _step8; !(_step8 = _iterator8()).done;) { + var peer = _step8.value; + if (get.from !== peer) { + sendTo.add(peer); + } + } + if (!this.subscribersByTopic.has(topic)) { + this.subscribersByTopic.set(topic, new Set()); + } + var subscribers = this.subscribersByTopic.get(topic); + if (subscribers) { + if (!subscribers.has(get.from)) { + subscribers.add(get.from); + } + } + for (var _iterator9 = _createForOfIteratorHelperLoose(sendTo), _step9; !(_step9 = _iterator9()).done;) { + var actor = _step9.value; + actor.postMessage(get); + } + }; + return Router; + }(Actor); + + var DEFAULT_CONFIG = { + allowPublicSpace: false, + enableStats: true, + localOnly: true + }; + // TODO move memory storage to its own adapter? it would make things simpler here + var Node = /*#__PURE__*/function (_Actor) { + _inheritsLoose(Node, _Actor); + function Node(id, config, parent) { + var _this; + if (id === void 0) { + id = ''; + } + _this = _Actor.call(this, id) || this; + _this.children = new Map(); + _this.once_subscriptions = new Map(); + _this.on_subscriptions = new Map(); + _this.map_subscriptions = new Map(); + _this.counter = 0; + _this.doCallbacks = function (data, key) { + if (typeof data.value === 'string' && data.value.startsWith('{":":')) { + data.value = JSON.parse(data.value)[':']; + } + var _loop2 = function _loop2() { + var _step$value = _step.value, + id = _step$value[0], + callback = _step$value[1]; + var event = { + off: function off() { + return _this.on_subscriptions["delete"](id); + } + }; + callback(data.value, key, null, event); + }; + for (var _iterator = _createForOfIteratorHelperLoose(_this.on_subscriptions), _step; !(_step = _iterator()).done;) { + _loop2(); + } + for (var _iterator2 = _createForOfIteratorHelperLoose(_this.once_subscriptions), _step2; !(_step2 = _iterator2()).done;) { + var _step2$value = _step2.value, + _id = _step2$value[0], + callback = _step2$value[1]; + callback(data.value, key, null, {}); + _this.once_subscriptions["delete"](_id); + } + if (_this.parent) { + (function () { + var parent = _this.parent; + var _loop = function _loop() { + var _step3$value = _step3.value, + id = _step3$value[0], + callback = _step3$value[1]; + var event = { + off: function off() { + return parent.map_subscriptions["delete"](id); + } + }; + callback(data.value, key, null, event); + }; + for (var _iterator3 = _createForOfIteratorHelperLoose(parent.map_subscriptions), _step3; !(_step3 = _iterator3()).done;) { + _loop(); + } + })(); + } + }; + _this.parent = parent; + _this.config = config || parent && parent.config || DEFAULT_CONFIG; + if (parent) { + _this.root = parent.root; + _this.router = parent.router; + } else { + _this.root = _assertThisInitialized(_this); + //@ts-ignore + _this.router = new Router({ + dbName: _this.id + '-idb', + peers: _this.config.webSocketPeers + }); + //console.log('idbWorker', idbWorker); + //const router = Comlink.wrap(routerWorker); + } + return _this; + } + var _proto = Node.prototype; + _proto.getCurrentUser = function getCurrentUser() { + return this.root.currentUser; + }; + _proto.setCurrentUser = function setCurrentUser(key) { + this.root.currentUser = key; + }; + _proto.handle = function handle(message) { + if (message instanceof Put) { + for (var _i = 0, _Object$entries = Object.entries(message.updatedNodes); _i < _Object$entries.length; _i++) { + var _Object$entries$_i = _Object$entries[_i], + key = _Object$entries$_i[0], + children = _Object$entries$_i[1]; + if (!children || typeof children !== 'object') { + continue; + } + if (key === this.id) { + for (var _i2 = 0, _Object$entries2 = Object.entries(children); _i2 < _Object$entries2.length; _i2++) { + var _Object$entries2$_i = _Object$entries2[_i2], + childKey = _Object$entries2$_i[0], + childData = _Object$entries2$_i[1]; + this.get(childKey).doCallbacks(childData, childKey); // TODO children should have proper NodeData + } + } + } + + this.parent && this.parent.handle(message); + } + }; + _proto.get = function get(key) { + var existing = this.children.get(key); + if (existing) { + return existing; + } + var newNode = new Node(this.id + "/" + key, this.config, this); + this.children.set(key, newNode); + return newNode; + }; + _proto.user = function user(pub) { + pub = pub || this.root.currentUser && this.root.currentUser.pub; + if (!pub) { + throw new Error("no public key!"); + } + return this.get('user').get(pub); + }; + _proto.auth = function auth(key) { + // TODO get public key from key + this.root.setCurrentUser(key); + return; + }; + _proto.put = /*#__PURE__*/function () { + var _put = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(value) { + var updatedAt, key, updatedNodes, put; + return _regeneratorRuntime().wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + updatedAt = Date.now(); + if (!Array.isArray(value)) { + _context.next = 3; + break; + } + throw new Error('put() does not support arrays'); + case 3: + if (!(typeof value === 'function')) { + _context.next = 5; + break; + } + throw new Error('put() does not support functions'); + case 5: + if (!(typeof value === 'object' && value !== null)) { + _context.next = 8; + break; + } + // TODO: update the whole path of parent nodes + for (key in value) { + this.get(key).put(value[key]); + } + return _context.abrupt("return"); + case 8: + _context.next = 10; + return this.signIfNeeded(value); + case 10: + value = _context.sent; + this.children = new Map(); + updatedNodes = {}; + _context.next = 15; + return this.addParentNodes(updatedNodes, value, updatedAt); + case 15: + put = Put["new"](updatedNodes, this); + this.handle(put); + this.router.postMessage(put); + case 18: + case "end": + return _context.stop(); + } + } + }, _callee, this); + })); + function put(_x) { + return _put.apply(this, arguments); + } + return put; + }(); + _proto.signIfNeeded = /*#__PURE__*/function () { + var _signIfNeeded = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(value) { + var signed; + return _regeneratorRuntime().wrap(function _callee2$(_context2) { + while (1) { + switch (_context2.prev = _context2.next) { + case 0: + if (!(this.id.indexOf('global/user/') === 0)) { + _context2.next = 10; + break; + } + if (this.getCurrentUser()) { + _context2.next = 3; + break; + } + throw new Error('not authenticated'); + case 3: + if (!(this.id.indexOf('global/user/' + this.getCurrentUser().pub) !== 0)) { + _context2.next = 5; + break; + } + throw new Error('not allowed ' + this.id); + case 5: + _context2.next = 7; + return Key.sign(value, this.getCurrentUser(), undefined, { + raw: true + }); + case 7: + signed = _context2.sent; + value = JSON.stringify({ + ':': signed.m, + '~': signed.s + }); + console.log('saving signed value', value); + case 10: + return _context2.abrupt("return", value); + case 11: + case "end": + return _context2.stop(); + } + } + }, _callee2, this); + })); + function signIfNeeded(_x2) { + return _signIfNeeded.apply(this, arguments); + } + return signIfNeeded; + }(); + _proto.addParentNodes = /*#__PURE__*/function () { + var _addParentNodes = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3(updatedNodes, value, updatedAt) { + var childName, parentId; + return _regeneratorRuntime().wrap(function _callee3$(_context3) { + while (1) { + switch (_context3.prev = _context3.next) { + case 0: + if (!this.parent) { + _context3.next = 7; + break; + } + childName = this.id.split('/').pop(); + parentId = this.parent.id; + updatedNodes[parentId] = updatedNodes[parentId] || {}; + updatedNodes[parentId][childName] = { + value: value, + updatedAt: updatedAt + }; + _context3.next = 7; + return this.parent.addParentNodes(updatedNodes, { + '#': this.parent.id + }, updatedAt); + case 7: + case "end": + return _context3.stop(); + } + } + }, _callee3, this); + })); + function addParentNodes(_x3, _x4, _x5) { + return _addParentNodes.apply(this, arguments); + } + return addParentNodes; + }(); + _proto.request = function request() { + if (this.parent) { + // TODO router should decide whether to re-request from peers + var childKey = this.id.split('/').pop(); + this.router.postMessage(Get["new"](this.parent.id, this, undefined, childKey)); + } + }; + _proto.once = /*#__PURE__*/function () { + var _once = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee4(callback) { + var id; + return _regeneratorRuntime().wrap(function _callee4$(_context4) { + while (1) { + switch (_context4.prev = _context4.next) { + case 0: + id = this.counter++; + callback && this.once_subscriptions.set(id, callback); + this.request(); + case 3: + case "end": + return _context4.stop(); + } + } + }, _callee4, this); + })); + function once(_x6) { + return _once.apply(this, arguments); + } + return once; + }(); + _proto.on = function on(callback) { + var id = this.counter++; + this.on_subscriptions.set(id, callback); + //const event = { off: () => this.on_subscriptions.delete(id) }; + this.request(); + }; + _proto.map = function map(callback) { + var id = this.counter++; + this.map_subscriptions.set(id, callback); + // TODO: child key should probably still be included. But how to handle link responses? + this.router.postMessage(Get["new"](this.id, this, undefined)); + }; + _proto.opt = function opt(opts) { + this.router.opt(opts); + }; + return Node; + }(Actor); + + var globalState; + function global$1 (opts) { + if (opts === void 0) { + opts = {}; + } + if (!globalState) { + peers.init(); + var webSocketPeers = opts.peers || peers.random(); + console.log('webSocketPeers', webSocketPeers); + var myOpts = Object.assign({ + webSocketPeers: webSocketPeers, + localStorage: false, + retry: Infinity + }, opts); + if (opts.peers) { + console.log('adding peers', opts.peers); + opts.peers.forEach(function (url) { + return peers.add({ + url: url + }); + }); + } + globalState = new Node('global', myOpts); + } + return globalState; + } + + // @ts-nocheck + /*eslint no-useless-escape: "off", camelcase: "off" */ + var UNIQUE_ID_VALIDATORS = { + email: /^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i, + bitcoin: /^[13][a-km-zA-HJ-NP-Z0-9]{26,33}$/, + bitcoin_address: /^[13][a-km-zA-HJ-NP-Z0-9]{26,33}$/, + ip: /^(([1-9]?\d|1\d\d|2[0-5][0-5]|2[0-4]\d)\.){3}([1-9]?\d|1\d\d|2[0-5][0-5]|2[0-4]\d)$/, + ipv6: /^(?:[A-F0-9]{1,4}:){7}[A-F0-9]{1,4}$/, + gpg_fingerprint: null, + gpg_keyid: null, + google_oauth2: null, + tel: /^\d{7,}$/, + phone: /^\d{7,}$/, + keyID: null, + url: /[-a-zA-Z0-9@:%_\+.~#?&//=]{2,256}\.[a-z]{2,4}\b(\/[-a-zA-Z0-9@:%_\+.~#?&//=]*)?/gi, + account: /^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i, + uuid: /[0-9a-f]{8}\-[0-9a-f]{4}\-[0-9a-f]{4}\-[0-9a-f]{4}\-[0-9a-f]{12}/ + }; + // TODO this class could perhaps be removed + var Attribute = /*#__PURE__*/function () { + function Attribute(a, b) { + if (typeof a === "object") { + if (typeof a.value !== "string") { + throw new Error("param1.value must be a string, got " + typeof a.value + ": " + JSON.stringify(a.value)); + } + if (typeof a.type !== "string") { + throw new Error("param1.type must be a string, got " + typeof a.type + ": " + JSON.stringify(a.type)); + } + b = a.value; + a = a.type; + } + if (typeof a !== "string") { + throw new Error("First param must be a string, got " + typeof a + ": " + JSON.stringify(a)); + } + if (!a.length) { + throw new Error("First param string is empty"); + } + if (b) { + if (typeof b !== "string") { + throw new Error("Second parameter must be a string, got " + typeof b + ": " + JSON.stringify(b)); + } + if (!b.length) { + throw new Error("Second param string is empty"); + } + this.type = a; + this.value = b; + } else { + this.value = a; + var t = Attribute.guessTypeOf(this.value); + if (t) { + this.type = t; + } else { + throw new Error("Type of attribute was omitted and could not be guessed"); + } + } + } + Attribute.getUuid = function getUuid() { + var b = function b(a) { + return a ? (a ^ Math.random() * 16 >> a / 4).toString(16) : ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, b); + }; + return new Attribute("uuid", b()); + }; + Attribute.getUniqueIdValidators = function getUniqueIdValidators() { + return UNIQUE_ID_VALIDATORS; + }; + Attribute.isUniqueType = function isUniqueType(type) { + return Object.keys(UNIQUE_ID_VALIDATORS).indexOf(type) > -1; + }; + var _proto = Attribute.prototype; + _proto.isUniqueType = function isUniqueType() { + return Attribute.isUniqueType(this.type); + }; + Attribute.guessTypeOf = function guessTypeOf(value) { + for (var key in UNIQUE_ID_VALIDATORS) { + if (value.match(UNIQUE_ID_VALIDATORS[key])) { + return key; + } + } + }; + Attribute.equals = function equals(a, b) { + return a.equals(b); + }; + _proto.equals = function equals(a) { + return a && this.type === a.type && this.value === a.value; + }; + _proto.uri = function uri() { + return encodeURIComponent(this.value) + ":" + encodeURIComponent(this.type); + }; + return Attribute; + }(); + + /** + * Get a public space where only the specified user (public key) can write. Others can read. + * @param pub The public key string or keypair object of the user. Defaults to the current user from session. + * @returns {Node} The user space. + */ + function publicState (pub) { + if (pub === void 0) { + pub = session.getKey(); + } + if (typeof pub === 'string') { + return global$1().user(pub); + } else if (typeof pub === 'object') { + var userSpace = global$1().user(pub.pub); + userSpace.auth(pub); + return userSpace; + } + } + + // TODO: extract Group channels into their own class + var DEFAULT_PERMISSIONS = { + read: true, + write: true, + admin: false + }; + /** + * Private communication channel between two or more participants ([Gun](https://github.com/amark/gun) public keys). Can be used independently of other Iris stuff. + * + * Used as a core element of [iris-messenger](https://github.com/irislib/iris-messenger). + * + * You can use iris.private(pub) to always use the same Channel object for a given pub. + * + * --- + * + * #### Key-value API + * `channel.put(key, value)` and `channel.on(key, callback)`. + * + * Note that each participant has their own versions of each key-value — they don't overwrite each other. `channel.on()` callback returns them all by default and has a parameter that indicates whose value you got. + * + * While values are encrypted, encryption of keys is not implemented yet. + * + * #### Message API + * `channel.send()` and `channel.getMessages()` for timestamp-indexed chat-style messaging. + * + * Message data is encrypted, but timestamps are public so that peers can return your messages in a sequential order. + * + * --- + * + * You can open a channel with yourself for a private key-value space or a "note to self" type chat with yourself. + * + * **Privacy disclaimer:** Channel ids, data values and messages are encrypted, but message timestamps are unencrypted so that peers can return them to you in a sequential order. By looking at the unencrypted timestamps (or Gun subscriptions), it is possible to guess who are communicating with each other. This could be improved by indexing messages by *day* only, so making the guess would be more difficult, while you could still return them in a semi-sequential order. + * + * @param {Object} options + * @param {string} options.key your keypair + * @param {Object} options.gun [gun](https://github.com/amark/gun) instance + * @param options.participants (optional) string or string array or permissions object ({'pub1':{read:true,write:true,admin:false},'pub2'...}) of participant public keys (your own key is included by default) + * @param {string} options.chatLink (optional) chat link instead of participants list + * @param {string} options.uuid (group channels only) unique channel identifier. Leave out for new channel. + * @param {string} options.name (group channels only) channel name + * @example + * // Copy & paste this to console at https://iris.to or other page that has gun, sea and iris-lib + * // Due to an unsolved bug, someoneElse's messages only start showing up after a reload + * + * var gun1 = new Gun('https://gun-us.herokuapp.com/gun'); + * var gun2 = new Gun('https://gun-us.herokuapp.com/gun'); + * var myKey = await Key.getDefault(); + * var someoneElse = localStorage.getItem('someoneElsesKey'); + * if (someoneElse) { + * someoneElse = JSON.parse(someoneElse); + * } else { + * someoneElse = await Key.generate(); + * localStorage.setItem('someoneElsesKey', JSON.stringify(someoneElse)); + * } + * + * iris.Channel.initUser(gun1, myKey); // saves myKey.epub to gun.user().get('epub') + * iris.Channel.initUser(gun2, someoneElse); + * + * var ourChannel = new iris.Channel({key: myKey, gun: gun1, participants: someoneElse.pub}); + * var theirChannel = new iris.Channel({key: someoneElse, gun: gun2, participants: myKey.pub}); + * + * var myChannels = {}; // you can list them in a user interface + * function printMessage(msg, info) { + * console.log(`[${new Date(msg.time).toLocaleString()}] ${info.from.slice(0,8)}: ${msg.text}`) + * } + * iris.Channel.getChannels(gun1, myKey, channel => { + * var pub = channel.getCurrentParticipants()[0]; + * gun1.user(pub).get('profile').get('name').on(name => channel.name = name); + * myChannels[pub] = channel; + * channel.getMessages(printMessage); + * channel.on('mood', (mood, from) => console.log(from.slice(0,8) + ' is feeling ' + mood)); + * }); + * + * // you can play with these in the console: + * ourChannel.send('message from myKey'); + * theirChannel.send('message from someoneElse'); + * + * ourChannel.put('mood', 'blessed'); + * theirChannel.put('mood', 'happy'); + * + * @example https://github.com/irislib/iris-lib/blob/master/__tests__/Channel.js + */ + var Channel = /*#__PURE__*/function () { + function Channel(options) { + var _this = this; + this.theirSecretUuids = {}; + this.theirGroupSecrets = {}; + this.secrets = {}; + this.ourSecretChannelIds = {}; + this.theirSecretChannelIds = {}; + this.messages = {}; + this.chatLinks = {}; + this.groupSubscriptions = {}; + this.directSubscriptions = {}; + this.getParticipantsCallbacks = {}; + this.myGroupSecret = options.myGroupSecret; + if (options.chatLink) { + this.useChatLink(options); + } + if (typeof options.participants === "string") { + this.addParticipant(options.participants, options.save); + } else if (Array.isArray(options.participants)) { + var o = {}; + options.participants.forEach(function (p) { + return o[p] = Object.assign({}, DEFAULT_PERMISSIONS); + }); + options.participants = o; + } + if (typeof options.participants === "object") { + // it's a group channel + var keys = Object.keys(options.participants); + keys.forEach(function (k) { + if (k !== session.getKey().pub) { + _this.addParticipant(k, options.save, Object.assign({}, DEFAULT_PERMISSIONS, options.participants[k])); + } + }); + options.participants[session.getKey().pub] = options.participants[session.getKey().pub] || Object.assign({}, DEFAULT_PERMISSIONS); + if (options.uuid) { + this.uuid = options.uuid; + this.name = options.name; + } else { + options.uuid = Attribute.getUuid().value; + this.uuid = options.uuid; + options.participants[session.getKey().pub].admin = true; + options.participants[session.getKey().pub].founder = true; + } + this.getChatLinks({ + subscribe: true + }); + } + this.participants = options.participants; + if (options.uuid) { + // It's a group channel + // share secret uuid with other participants. since secret is already non-deterministic, maybe uuid could also be? + // generate channel-specific secret and share it with other participants + // put() keys should be encrypted first? so you could do put(uuid, secret) + // what if you join the channel with 2 unconnected devices? on reconnect, the older secret would be overwritten and messages unreadable. maybe participants should store each others' old keys? or maybe you should store them and re-encrypt old stuff when key changes? return them with map() instead? + this.putDirect("S" + this.uuid, this.getMyGroupSecret()); + this.getMySecretUuid().then(function (s) { + _this.putDirect(_this.uuid, s); // TODO: encrypt keys in put() + }); + + this.onTheirDirect(this.uuid, function (s, k, from) { + _this.theirSecretUuids[from] = s; + }); + this.onTheirDirect("S" + this.uuid, function (s, k, from) { + _this.theirGroupSecrets[from] = s; + }); + // need to make put(), on(), send() and getMessages() behave differently when it's a group and retain the old versions for mutual signaling + } + + this.onTheir("participants", function (participants, k, from) { + var hasAdmin = false; + var keys = Object.keys(_this.participants); + for (var i = 0; i < keys.length; i++) { + if (_this.participants[keys[i]].admin || _this.participants[keys[i]].inviter) { + hasAdmin = true; + break; + } + } + if (!hasAdmin) { + keys.forEach(function (k) { + return _this.participants[k].admin = true; + }); // if no admins, make everyone admin + } + + if (_this.participants[from] && (_this.participants[from].admin || _this.participants[from].inviter)) { + if (typeof participants === "object") { + if (JSON.stringify(_this.participants) === JSON.stringify(participants)) { + return; + } + _this.participants = participants; + delete _this.participants[from].inviter; + Object.keys(participants).forEach(function (k) { + if (k !== session.getKey().pub) { + _this.addParticipant(k, true, Object.assign({}, DEFAULT_PERMISSIONS, participants[k]), true); + } + }); + _this.participantsChanged(); + options.saved = true; + } + } + }); + if (!options.saved && (options.save === undefined || options.save === true)) { + this.save(); + } + } + var _proto = Channel.prototype; + _proto.useChatLink = function useChatLink(options) { + var s = options.chatLink.split('?'); + if (s.length === 2) { + var chatWith = util.getUrlParameter('chatWith', s[1]); + var channelId = util.getUrlParameter('channelId', s[1]); + var inviter = util.getUrlParameter('inviter', s[1]); + var pub = inviter || chatWith; + if (chatWith) { + options.participants = pub; + } else if (channelId && inviter && inviter !== session.getKey().pub) { + // TODO! initializing it twice breaks things - new secret is generated + options.uuid = channelId; + options.participants = {}; + options.participants[inviter] = Object.assign({ + inviter: true + }, DEFAULT_PERMISSIONS); + } + if (pub !== session.getKey().pub) { + var sharedSecret = util.getUrlParameter('s', s[1]); + var linkId = util.getUrlParameter('k', s[1]); + if (sharedSecret && linkId) { + this.save(); // save the channel first so it's there before inviter subscribes to it + options.saved = true; + global$1().user(pub).get('chatLinks').get(linkId).get('encryptedSharedKey').on( /*#__PURE__*/function () { + var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(encrypted) { + var sharedKey, encryptedChatRequest, channelRequestId; + return _regeneratorRuntime().wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + _context.next = 2; + return Key.decrypt(encrypted, sharedSecret); + case 2: + sharedKey = _context.sent; + _context.next = 5; + return Key.encrypt(session.getKey().pub, sharedSecret); + case 5: + encryptedChatRequest = _context.sent; + _context.next = 8; + return util.getHash(encryptedChatRequest); + case 8: + channelRequestId = _context.sent; + global$1(sharedKey).get('chatRequests').get(channelRequestId.slice(0, 12)).put(encryptedChatRequest); + case 10: + case "end": + return _context.stop(); + } + } + }, _callee); + })); + return function (_x) { + return _ref.apply(this, arguments); + }; + }()); + } + } + } + }; + _proto.getTheirSecretUuid = function getTheirSecretUuid(pub) { + var _this2 = this; + return new Promise(function (resolve) { + if (!_this2.theirSecretUuids[pub]) { + _this2.onTheirDirect(_this2.uuid, function (s) { + _this2.theirSecretUuids[pub] = s; + resolve(_this2.theirSecretUuids[pub]); + }, pub); + } else { + resolve(_this2.theirSecretUuids[pub]); + } + }); + }; + _proto.getTheirGroupSecret = function getTheirGroupSecret(pub) { + var _this3 = this; + if (pub === session.getKey().pub) { + return this.getMyGroupSecret(); + } + return new Promise(function (resolve) { + if (!_this3.theirGroupSecrets[pub]) { + _this3.onTheirDirect("S" + _this3.uuid, function (s) { + _this3.theirGroupSecrets[pub] = s; + resolve(_this3.theirGroupSecrets[pub]); + }, pub); + } else { + resolve(_this3.theirGroupSecrets[pub]); + } + }); + }; + _proto.changeMyGroupSecret = function changeMyGroupSecret() { + this.myGroupSecret = Key.random(32).toString('base64'); + // TODO: secret should be archived and probably messages should include the encryption key id so past messages don't become unreadable + this.putDirect("S" + this.uuid, this.myGroupSecret); + } + /** + * Unsubscribe messages from a channel participants + * + * @param {string} participant public key + */; + _proto.mute = + /*#__PURE__*/ + function () { + var _mute = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(participant) { + return _regeneratorRuntime().wrap(function _callee2$(_context2) { + while (1) { + switch (_context2.prev = _context2.next) { + case 0: + global$1().user(participant).get(this.theirSecretUuids[participant]).off(); + // TODO: persist + case 1: + case "end": + return _context2.stop(); + } + } + }, _callee2, this); + })); + function mute(_x2) { + return _mute.apply(this, arguments); + } + return mute; + }() /** + * Mute user and prevent them from seeing your further (and maybe past) messages + * + * @param {string} participant public key + */; + _proto.block = + /*#__PURE__*/ + function () { + var _block = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3(participant) { + return _regeneratorRuntime().wrap(function _callee3$(_context3) { + while (1) { + switch (_context3.prev = _context3.next) { + case 0: + this.mute(participant); + this.putDirect(this.uuid, null); + this.putDirect("S" + this.uuid, null); + delete this.secrets[participant]; + delete this.ourSecretChannelIds[participant]; + delete this.theirSecretChannelIds[participant]; + this.changeMyGroupSecret(); + case 7: + case "end": + return _context3.stop(); + } + } + }, _callee3, this); + })); + function block(_x3) { + return _block.apply(this, arguments); + } + return block; + }(); + _proto.getMySecretUuid = /*#__PURE__*/function () { + var _getMySecretUuid = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee4() { + var mySecret, mySecretHash; + return _regeneratorRuntime().wrap(function _callee4$(_context4) { + while (1) { + switch (_context4.prev = _context4.next) { + case 0: + if (this.mySecretUuid) { + _context4.next = 10; + break; + } + _context4.next = 3; + return Key.secret(session.getKey().epub, session.getKey()); + case 3: + mySecret = _context4.sent; + _context4.next = 6; + return util.getHash(mySecret); + case 6: + mySecretHash = _context4.sent; + _context4.next = 9; + return util.getHash(mySecretHash + this.uuid); + case 9: + this.mySecretUuid = _context4.sent; + case 10: + return _context4.abrupt("return", this.mySecretUuid); + case 11: + case "end": + return _context4.stop(); + } + } + }, _callee4, this); + })); + function getMySecretUuid() { + return _getMySecretUuid.apply(this, arguments); + } + return getMySecretUuid; + }() /** + * List participants of the channel (other than you) + */; + _proto.getCurrentParticipants = function getCurrentParticipants() { + return Object.keys(this.secrets); + } + /** + * Subscribe to the changing list of participants by channel admins + */; + _proto.getParticipants = function getParticipants(callback) { + if (this.getParticipantsCallbackId) { + this.getParticipantsCallbackId++; + } else { + this.getParticipantsCallbackId = 1; + } + this.getParticipantsCallbacks[this.getParticipantsCallbackId] = callback; + if (this.participants) { + callback(this.participants); + } + }; + _proto.participantsChanged = function participantsChanged() { + var _this4 = this; + Object.keys(this.getParticipantsCallbacks).forEach(function (id) { + _this4.getParticipantsCallbacks[id](_this4.participants); + }); + } + /** + * Returns either the uuid of a group channel or the public key of a direct channel. + */; + _proto.getId = function getId() { + return this.uuid || this.getCurrentParticipants()[0]; + }; + _proto.getSecret = /*#__PURE__*/function () { + var _getSecret = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee5(pub) { + var epub; + return _regeneratorRuntime().wrap(function _callee5$(_context5) { + while (1) { + switch (_context5.prev = _context5.next) { + case 0: + if (this.secrets[pub]) { + _context5.next = 7; + break; + } + _context5.next = 3; + return util.gunOnceDefined(global$1().user(pub).get("epub")); + case 3: + epub = _context5.sent; + _context5.next = 6; + return Key.secret(epub, session.getKey()); + case 6: + this.secrets[pub] = _context5.sent; + case 7: + return _context5.abrupt("return", this.secrets[pub]); + case 8: + case "end": + return _context5.stop(); + } + } + }, _callee5, this); + })); + function getSecret(_x4) { + return _getSecret.apply(this, arguments); + } + return getSecret; + }() /** + * + */; + Channel.getOurSecretChannelId = + /*#__PURE__*/ + function () { + var _getOurSecretChannelId = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee6(pub, pair) { + var epub, secret; + return _regeneratorRuntime().wrap(function _callee6$(_context6) { + while (1) { + switch (_context6.prev = _context6.next) { + case 0: + _context6.next = 2; + return util.gunOnceDefined(global$1().user(pub).get("epub")); + case 2: + epub = _context6.sent; + _context6.next = 5; + return Key.secret(epub, pair); + case 5: + secret = _context6.sent; + return _context6.abrupt("return", util.getHash(secret + pub)); + case 7: + case "end": + return _context6.stop(); + } + } + }, _callee6); + })); + function getOurSecretChannelId(_x5, _x6) { + return _getOurSecretChannelId.apply(this, arguments); + } + return getOurSecretChannelId; + }() /** + * + */; + Channel.getTheirSecretChannelId = + /*#__PURE__*/ + function () { + var _getTheirSecretChannelId = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee7(pub, pair) { + var epub, secret; + return _regeneratorRuntime().wrap(function _callee7$(_context7) { + while (1) { + switch (_context7.prev = _context7.next) { + case 0: + _context7.next = 2; + return util.gunOnceDefined(global$1().user(pub).get("epub")); + case 2: + epub = _context7.sent; + _context7.next = 5; + return Key.secret(epub, pair); + case 5: + secret = _context7.sent; + return _context7.abrupt("return", util.getHash(secret + pair.pub)); + case 7: + case "end": + return _context7.stop(); + } + } + }, _callee7); + })); + function getTheirSecretChannelId(_x7, _x8) { + return _getTheirSecretChannelId.apply(this, arguments); + } + return getTheirSecretChannelId; + }() /** + * Calls back with Channels that you have initiated or written to. + * @param {Object} keypair Key keypair that the gun instance is authenticated with + * @param callback callback function that is called for each public key you have a channel with + */; + Channel.getChannels = + /*#__PURE__*/ + function () { + var _getChannels = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee9(callback, listenToChatLinks) { + var keypair, mySecret, seen, handleChannel; + return _regeneratorRuntime().wrap(function _callee9$(_context9) { + while (1) { + switch (_context9.prev = _context9.next) { + case 0: + if (listenToChatLinks === void 0) { + listenToChatLinks = true; + } + keypair = session.getKey(); + _context9.next = 4; + return Key.secret(keypair.epub, keypair); + case 4: + mySecret = _context9.sent; + if (listenToChatLinks) { + Channel.getMyChatLinks(undefined, undefined, true); + } + seen = {}; + handleChannel = /*#__PURE__*/function () { + var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee8(value, ourSecretChannelId) { + var encryptedChatId, chatId; + return _regeneratorRuntime().wrap(function _callee8$(_context8) { + while (1) { + switch (_context8.prev = _context8.next) { + case 0: + if (!(value && !seen[ourSecretChannelId])) { + _context8.next = 14; + break; + } + seen[ourSecretChannelId] = true; + if (!(ourSecretChannelId.length > 44)) { + _context8.next = 5; + break; + } + global$1().user().get("chats").get(ourSecretChannelId).put(null); + return _context8.abrupt("return"); + case 5: + _context8.next = 7; + return util.gunOnceDefined(global$1().user().get("chats").get(ourSecretChannelId).get("pub")); + case 7: + encryptedChatId = _context8.sent; + _context8.next = 10; + return Key.decrypt(encryptedChatId, mySecret); + case 10: + chatId = _context8.sent; + if (chatId) { + _context8.next = 13; + break; + } + return _context8.abrupt("return"); + case 13: + if (chatId.pub || typeof chatId === "string") { + callback(new Channel({ + key: keypair, + participants: chatId.pub || chatId, + save: false + })); + } else if (chatId.uuid && chatId.participants && chatId.myGroupSecret) { + callback(new Channel({ + key: keypair, + participants: chatId.participants, + uuid: chatId.uuid, + myGroupSecret: chatId.myGroupSecret, + save: false + })); + } + case 14: + case "end": + return _context8.stop(); + } + } + }, _callee8); + })); + return function handleChannel(_x11, _x12) { + return _ref2.apply(this, arguments); + }; + }(); + global$1().user().get("chats").map(handleChannel); + case 9: + case "end": + return _context9.stop(); + } + } + }, _callee9); + })); + function getChannels(_x9, _x10) { + return _getChannels.apply(this, arguments); + } + return getChannels; + }(); + _proto.getMyGroupSecret = function getMyGroupSecret() { + if (!this.myGroupSecret) { + this.changeMyGroupSecret(); + } + return this.myGroupSecret; + }; + _proto.getOurSecretChannelId = /*#__PURE__*/function () { + var _getOurSecretChannelId2 = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee10(pub) { + var secret; + return _regeneratorRuntime().wrap(function _callee10$(_context10) { + while (1) { + switch (_context10.prev = _context10.next) { + case 0: + if (this.ourSecretChannelIds[pub]) { + _context10.next = 7; + break; + } + _context10.next = 3; + return this.getSecret(pub); + case 3: + secret = _context10.sent; + _context10.next = 6; + return util.getHash(secret + pub); + case 6: + this.ourSecretChannelIds[pub] = _context10.sent; + case 7: + return _context10.abrupt("return", this.ourSecretChannelIds[pub]); + case 8: + case "end": + return _context10.stop(); + } + } + }, _callee10, this); + })); + function getOurSecretChannelId(_x13) { + return _getOurSecretChannelId2.apply(this, arguments); + } + return getOurSecretChannelId; + }(); + _proto.getTheirSecretChannelId = /*#__PURE__*/function () { + var _getTheirSecretChannelId2 = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee11(pub) { + var secret; + return _regeneratorRuntime().wrap(function _callee11$(_context11) { + while (1) { + switch (_context11.prev = _context11.next) { + case 0: + if (this.theirSecretChannelIds[pub]) { + _context11.next = 7; + break; + } + _context11.next = 3; + return this.getSecret(pub); + case 3: + secret = _context11.sent; + _context11.next = 6; + return util.getHash(secret + session.getKey().pub); + case 6: + this.theirSecretChannelIds[pub] = _context11.sent; + case 7: + return _context11.abrupt("return", this.theirSecretChannelIds[pub]); + case 8: + case "end": + return _context11.stop(); + } + } + }, _callee11, this); + })); + function getTheirSecretChannelId(_x14) { + return _getTheirSecretChannelId2.apply(this, arguments); + } + return getTheirSecretChannelId; + }() /** + * Get messages from the channel + */; + _proto.getMessages = + /*#__PURE__*/ + function () { + var _getMessages = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee13(callback) { + var _this5 = this; + var mySecretUuid; + return _regeneratorRuntime().wrap(function _callee13$(_context13) { + while (1) { + switch (_context13.prev = _context13.next) { + case 0: + this.getCurrentParticipants().forEach( /*#__PURE__*/function () { + var _ref3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee12(pub) { + var theirSecretChannelId, ourSecretChannelId; + return _regeneratorRuntime().wrap(function _callee12$(_context12) { + while (1) { + switch (_context12.prev = _context12.next) { + case 0: + if (!(pub !== session.getKey().pub)) { + _context12.next = 11; + break; + } + if (!_this5.uuid) { + _context12.next = 7; + break; + } + _context12.next = 4; + return _this5.getTheirSecretUuid(pub); + case 4: + theirSecretChannelId = _context12.sent; + _context12.next = 10; + break; + case 7: + _context12.next = 9; + return _this5.getTheirSecretChannelId(pub); + case 9: + theirSecretChannelId = _context12.sent; + case 10: + // TODO map().once + global$1().user(pub).get("chats").get(theirSecretChannelId).get("msgs").map(function (data, key) { + _this5.messageReceived(callback, data, _this5.uuid || pub, false, key, pub); + }); + case 11: + if (_this5.uuid) { + _context12.next = 16; + break; + } + _context12.next = 14; + return _this5.getOurSecretChannelId(pub); + case 14: + ourSecretChannelId = _context12.sent; + // TODO map().once + publicState().get("chats").get(ourSecretChannelId).get("msgs").map(function (data, key) { + _this5.messageReceived(callback, data, pub, true, key, session.getKey().pub); + }); + case 16: + case "end": + return _context12.stop(); + } + } + }, _callee12); + })); + return function (_x16) { + return _ref3.apply(this, arguments); + }; + }()); + if (!this.uuid) { + _context13.next = 6; + break; + } + _context13.next = 4; + return this.getMySecretUuid(); + case 4: + mySecretUuid = _context13.sent; + // TODO map().once + publicState().get("chats").get(mySecretUuid).get("msgs").map(function (data, key) { + _this5.messageReceived(callback, data, _this5.uuid, true, key, session.getKey().pub); + }); + case 6: + case "end": + return _context13.stop(); + } + } + }, _callee13, this); + })); + function getMessages(_x15) { + return _getMessages.apply(this, arguments); + } + return getMessages; + }(); + _proto.messageReceived = /*#__PURE__*/function () { + var _messageReceived = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee14(callback, data, channelId, selfAuthored, key, from) { + var secret, decrypted, info; + return _regeneratorRuntime().wrap(function _callee14$(_context14) { + while (1) { + switch (_context14.prev = _context14.next) { + case 0: + if (!(this.messages[key] || !data)) { + _context14.next = 2; + break; + } + return _context14.abrupt("return"); + case 2: + if (!this.uuid) { + _context14.next = 8; + break; + } + _context14.next = 5; + return this.getTheirGroupSecret(from); + case 5: + _context14.t0 = _context14.sent; + _context14.next = 11; + break; + case 8: + _context14.next = 10; + return this.getSecret(channelId); + case 10: + _context14.t0 = _context14.sent; + case 11: + secret = _context14.t0; + _context14.next = 14; + return Key.decrypt(data, secret); + case 14: + decrypted = _context14.sent; + if (!(typeof decrypted !== "object")) { + _context14.next = 17; + break; + } + return _context14.abrupt("return"); + case 17: + info = { + selfAuthored: selfAuthored, + channelId: channelId, + from: from + }; + this.messages[key] = decrypted; + callback(decrypted, info); + case 20: + case "end": + return _context14.stop(); + } + } + }, _callee14, this); + })); + function messageReceived(_x17, _x18, _x19, _x20, _x21, _x22) { + return _messageReceived.apply(this, arguments); + } + return messageReceived; + }() /** + * Get latest message in this channel. Useful for channel listing. + */; + _proto.getLatestMsg = + /*#__PURE__*/ + function () { + var _getLatestMsg = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee16(callback) { + var _this6 = this; + var callbackIfLatest; + return _regeneratorRuntime().wrap(function _callee16$(_context16) { + while (1) { + switch (_context16.prev = _context16.next) { + case 0: + callbackIfLatest = /*#__PURE__*/function () { + var _ref4 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee15(msg, info) { + var t; + return _regeneratorRuntime().wrap(function _callee15$(_context15) { + while (1) { + switch (_context15.prev = _context15.next) { + case 0: + if (!_this6.latest) { + _this6.latest = msg; + callback(msg, info); + } else { + t = typeof _this6.latest.time === "string" ? _this6.latest.time : _this6.latest.time.toISOString(); + if (t < msg.time) { + _this6.latest = msg; + callback(msg, info); + } + } + case 1: + case "end": + return _context15.stop(); + } + } + }, _callee15); + })); + return function callbackIfLatest(_x24, _x25) { + return _ref4.apply(this, arguments); + }; + }(); + this.onMy('latestMsg', function (msg) { + return callbackIfLatest(msg, { + selfAuthored: true, + from: session.getKey().pub + }); + }); + this.onTheir('latestMsg', function (msg, k, from) { + return callbackIfLatest(msg, { + selfAuthored: false, + from: from + }); + }); + case 3: + case "end": + return _context16.stop(); + } + } + }, _callee16, this); + })); + function getLatestMsg(_x23) { + return _getLatestMsg.apply(this, arguments); + } + return getLatestMsg; + }() /** + * Useful for notifications + * @param {integer} time last seen msg time (default: now) + */; + _proto.setMyMsgsLastSeenTime = + /*#__PURE__*/ + function () { + var _setMyMsgsLastSeenTime = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee17(time) { + return _regeneratorRuntime().wrap(function _callee17$(_context17) { + while (1) { + switch (_context17.prev = _context17.next) { + case 0: + time = time || new Date().toISOString(); + return _context17.abrupt("return", this.put("msgsLastSeenTime", time)); + case 2: + case "end": + return _context17.stop(); + } + } + }, _callee17, this); + })); + function setMyMsgsLastSeenTime(_x26) { + return _setMyMsgsLastSeenTime.apply(this, arguments); + } + return setMyMsgsLastSeenTime; + }() /** + * Useful for notifications + */; + _proto.getMyMsgsLastSeenTime = + /*#__PURE__*/ + function () { + var _getMyMsgsLastSeenTime = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee18(callback) { + var _this7 = this; + return _regeneratorRuntime().wrap(function _callee18$(_context18) { + while (1) { + switch (_context18.prev = _context18.next) { + case 0: + this.onMy("msgsLastSeenTime", function (time) { + _this7.myMsgsLastSeenTime = time; + if (callback) { + callback(_this7.myMsgsLastSeenTime); + } + }); + case 1: + case "end": + return _context18.stop(); + } + } + }, _callee18, this); + })); + function getMyMsgsLastSeenTime(_x27) { + return _getMyMsgsLastSeenTime.apply(this, arguments); + } + return getMyMsgsLastSeenTime; + }() /** + * For "seen" status indicator + */; + _proto.getTheirMsgsLastSeenTime = + /*#__PURE__*/ + function () { + var _getTheirMsgsLastSeenTime = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee19(callback) { + var _this8 = this; + return _regeneratorRuntime().wrap(function _callee19$(_context19) { + while (1) { + switch (_context19.prev = _context19.next) { + case 0: + this.onTheir("msgsLastSeenTime", function (time) { + _this8.theirMsgsLastSeenTime = time; + if (callback) { + callback(_this8.theirMsgsLastSeenTime); + } + }); + case 1: + case "end": + return _context19.stop(); + } + } + }, _callee19, this); + })); + function getTheirMsgsLastSeenTime(_x28) { + return _getTheirMsgsLastSeenTime.apply(this, arguments); + } + return getTheirMsgsLastSeenTime; + }(); + _proto.removeParticipant = /*#__PURE__*/function () { + var _removeParticipant = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee20(pub) { + return _regeneratorRuntime().wrap(function _callee20$(_context20) { + while (1) { + switch (_context20.prev = _context20.next) { + case 0: + this.addParticipant(pub, true, { + read: false, + write: false + }); + case 1: + case "end": + return _context20.stop(); + } + } + }, _callee20, this); + })); + function removeParticipant(_x29) { + return _removeParticipant.apply(this, arguments); + } + return removeParticipant; + }() /** + * Add a public key to the channel or update its permissions + * @param {string} pub + */; + _proto.addParticipant = + /*#__PURE__*/ + function () { + var _addParticipant = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee21(pub, save, permissions, subscribe) { + var _this9 = this; + var ourSecretChannelId, mySecret; + return _regeneratorRuntime().wrap(function _callee21$(_context21) { + while (1) { + switch (_context21.prev = _context21.next) { + case 0: + if (save === void 0) { + save = true; + } + if (!this.uuid) { + _context21.next = 3; + break; + } + return _context21.abrupt("return"); + case 3: + if (permissions === undefined) { + permissions = DEFAULT_PERMISSIONS; + } + if (!(this.secrets[pub] && JSON.stringify(this.secrets[pub]) === JSON.stringify(permissions))) { + _context21.next = 6; + break; + } + return _context21.abrupt("return"); + case 6: + this.secrets[pub] = null; + this.getSecret(pub); + _context21.next = 10; + return this.getOurSecretChannelId(pub); + case 10: + ourSecretChannelId = _context21.sent; + if (!save) { + _context21.next = 20; + break; + } + _context21.next = 14; + return Key.secret(session.getKey().epub, session.getKey()); + case 14: + mySecret = _context21.sent; + _context21.t0 = global$1().user().get("chats").get(ourSecretChannelId).get("pub"); + _context21.next = 18; + return Key.encrypt({ + pub: pub + }, mySecret); + case 18: + _context21.t1 = _context21.sent; + _context21.t0.put.call(_context21.t0, _context21.t1); + case 20: + if (this.uuid) { + this.participants[pub] = permissions; + if (save) { + this.putDirect("S" + this.uuid, this.getMyGroupSecret()); + this.getMySecretUuid().then(function (s) { + _this9.putDirect(_this9.uuid, s); // TODO: encrypt keys in put() + }); + + this.onTheirDirect(this.uuid, function (s, k, from) { + _this9.theirSecretUuids[from] = s; + }); + this.onTheirDirect("S" + this.uuid, function (s, k, from) { + _this9.theirGroupSecrets[from] = s; + }); + this.save(); + } + } + if (subscribe) { + Object.values(this.directSubscriptions).forEach(function (arr) { + arr.forEach(function (o) { + if (!o.from || o.from === pub) { + _this9._onTheirDirectFromUser(pub, o.key, o.callback); + } + }); + }); + Object.values(this.groupSubscriptions).forEach(function (arr) { + arr.forEach(function (o) { + if (o.from && o.from !== pub) { + return; + } + if (permissions.write) { + _this9._onTheirGroupFromUser(pub, o.key, o.callback); + } else { + // unsubscribe + o.event && o.event.off(); + } + }); + }); + } + case 22: + case "end": + return _context21.stop(); + } + } + }, _callee21, this); + })); + function addParticipant(_x30, _x31, _x32, _x33) { + return _addParticipant.apply(this, arguments); + } + return addParticipant; + }() /** + * Send a message to the channel + * @param msg string or {time, text, ...} object + */; + _proto.send = + /*#__PURE__*/ + function () { + var _send = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee22(msg) { + var encrypted, mySecretUuid, keys, i, _encrypted, ourSecretChannelId; + return _regeneratorRuntime().wrap(function _callee22$(_context22) { + while (1) { + switch (_context22.prev = _context22.next) { + case 0: + if (!(typeof msg === "string")) { + _context22.next = 7; + break; + } + msg = msg.trim(); + if (!(msg.length === 0)) { + _context22.next = 4; + break; + } + return _context22.abrupt("return"); + case 4: + msg = { + time: new Date().toISOString(), + text: msg + }; + _context22.next = 12; + break; + case 7: + if (!(typeof msg === "object")) { + _context22.next = 11; + break; + } + msg.time = msg.time || new Date().toISOString(); + _context22.next = 12; + break; + case 11: + throw new Error("msg param must be a string or an object"); + case 12: + if (!this.uuid) { + _context22.next = 23; + break; + } + _context22.next = 15; + return Key.encrypt(JSON.stringify(msg), this.getMyGroupSecret()); + case 15: + encrypted = _context22.sent; + _context22.next = 18; + return this.getMySecretUuid(); + case 18: + mySecretUuid = _context22.sent; + publicState().get("chats").get(mySecretUuid).get("msgs").get("" + msg.time).put(encrypted); + publicState().get("chats").get(mySecretUuid).get("latestMsg").put(encrypted); + _context22.next = 42; + break; + case 23: + keys = this.getCurrentParticipants(); + i = 0; + case 25: + if (!(i < keys.length)) { + _context22.next = 42; + break; + } + _context22.t0 = Key; + _context22.t1 = JSON.stringify(msg); + _context22.next = 30; + return this.getSecret(keys[i]); + case 30: + _context22.t2 = _context22.sent; + _context22.next = 33; + return _context22.t0.encrypt.call(_context22.t0, _context22.t1, _context22.t2); + case 33: + _encrypted = _context22.sent; + _context22.next = 36; + return this.getOurSecretChannelId(keys[i]); + case 36: + ourSecretChannelId = _context22.sent; + publicState().get("chats").get(ourSecretChannelId).get("msgs").get("" + msg.time).put(_encrypted); + publicState().get("chats").get(ourSecretChannelId).get("latestMsg").put(_encrypted); + case 39: + i++; + _context22.next = 25; + break; + case 42: + case "end": + return _context22.stop(); + } + } + }, _callee22, this); + })); + function send(_x34) { + return _send.apply(this, arguments); + } + return send; + }() /** + * Save the channel to our channels list without sending a message + */; + _proto.save = + /*#__PURE__*/ + function () { + var _save = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee23() { + var mySecretUuid, mySecret, keys, i, ourSecretChannelId; + return _regeneratorRuntime().wrap(function _callee23$(_context23) { + while (1) { + switch (_context23.prev = _context23.next) { + case 0: + if (!this.uuid) { + _context23.next = 17; + break; + } + _context23.next = 3; + return this.getMySecretUuid(); + case 3: + mySecretUuid = _context23.sent; + publicState().get("chats").get(mySecretUuid).get('msgs').get('a').put(null); + this.put("participants", this.participants); // public participants list + _context23.next = 8; + return Key.secret(session.getKey().epub, session.getKey()); + case 8: + mySecret = _context23.sent; + _context23.t0 = publicState().get("chats").get(mySecretUuid).get("pub"); + _context23.next = 12; + return Key.encrypt({ + uuid: this.uuid, + myGroupSecret: this.getMyGroupSecret(), + participants: this.participants // private participants list + }, mySecret); + case 12: + _context23.t1 = _context23.sent; + _context23.t0.put.call(_context23.t0, _context23.t1); + this.participantsChanged(); + _context23.next = 27; + break; + case 17: + keys = this.getCurrentParticipants(); + i = 0; + case 19: + if (!(i < keys.length)) { + _context23.next = 27; + break; + } + _context23.next = 22; + return this.getOurSecretChannelId(keys[i]); + case 22: + ourSecretChannelId = _context23.sent; + publicState().get("chats").get(ourSecretChannelId).get('msgs').get('a').put(null); + case 24: + i++; + _context23.next = 19; + break; + case 27: + case "end": + return _context23.stop(); + } + } + }, _callee23, this); + })); + function save() { + return _save.apply(this, arguments); + } + return save; + }() /** + * Save a key-value pair, encrypt value. Each participant in the Channel writes to their own version of the key-value pair — they don't overwrite the same one. + * @param {string} key + * @param value + */; + _proto.put = + /*#__PURE__*/ + function () { + var _put = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee24(key, value) { + return _regeneratorRuntime().wrap(function _callee24$(_context24) { + while (1) { + switch (_context24.prev = _context24.next) { + case 0: + return _context24.abrupt("return", (this.uuid ? this.putGroup : this.putDirect).call(this, key, value)); + case 1: + case "end": + return _context24.stop(); + } + } + }, _callee24, this); + })); + function put(_x35, _x36) { + return _put.apply(this, arguments); + } + return put; + }(); + _proto.putGroup = /*#__PURE__*/function () { + var _putGroup = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee25(key, value) { + var encrypted, mySecretUuid; + return _regeneratorRuntime().wrap(function _callee25$(_context25) { + while (1) { + switch (_context25.prev = _context25.next) { + case 0: + if (!(key === "msgs")) { + _context25.next = 2; + break; + } + throw new Error("Sorry, you can't overwrite the msgs field which is used for .send()"); + case 2: + _context25.next = 4; + return Key.encrypt(JSON.stringify(value), this.getMyGroupSecret()); + case 4: + encrypted = _context25.sent; + _context25.next = 7; + return this.getMySecretUuid(); + case 7: + mySecretUuid = _context25.sent; + publicState().get("chats").get(mySecretUuid).get(key).put(encrypted); + case 9: + case "end": + return _context25.stop(); + } + } + }, _callee25, this); + })); + function putGroup(_x37, _x38) { + return _putGroup.apply(this, arguments); + } + return putGroup; + }(); + _proto.putDirect = /*#__PURE__*/function () { + var _putDirect = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee26(key, value) { + var keys, i, encrypted, ourSecretChannelId; + return _regeneratorRuntime().wrap(function _callee26$(_context26) { + while (1) { + switch (_context26.prev = _context26.next) { + case 0: + if (!(key === "msgs")) { + _context26.next = 2; + break; + } + throw new Error("Sorry, you can't overwrite the msgs field which is used for .send()"); + case 2: + keys = this.getCurrentParticipants(); + i = 0; + case 4: + if (!(i < keys.length)) { + _context26.next = 20; + break; + } + _context26.t0 = Key; + _context26.t1 = JSON.stringify(value); + _context26.next = 9; + return this.getSecret(keys[i]); + case 9: + _context26.t2 = _context26.sent; + _context26.next = 12; + return _context26.t0.encrypt.call(_context26.t0, _context26.t1, _context26.t2); + case 12: + encrypted = _context26.sent; + _context26.next = 15; + return this.getOurSecretChannelId(keys[i]); + case 15: + ourSecretChannelId = _context26.sent; + publicState().get("chats").get(ourSecretChannelId).get(key).put(encrypted); + case 17: + i++; + _context26.next = 4; + break; + case 20: + case "end": + return _context26.stop(); + } + } + }, _callee26, this); + })); + function putDirect(_x39, _x40) { + return _putDirect.apply(this, arguments); + } + return putDirect; + }() /** + * Subscribe to a key-value pair. Callback returns every participant's value unless you limit it with *from* param. + * @param {string} key + * @param {function} callback + * @param {string} from public key whose value you want, or *"me"* for your value only, or *"them"* for the value of others only + */; + _proto.on = + /*#__PURE__*/ + function () { + var _on = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee27(key, callback, from) { + return _regeneratorRuntime().wrap(function _callee27$(_context27) { + while (1) { + switch (_context27.prev = _context27.next) { + case 0: + return _context27.abrupt("return", (this.uuid ? this.onGroup : this.onDirect).call(this, key, callback, from)); + case 1: + case "end": + return _context27.stop(); + } + } + }, _callee27, this); + })); + function on(_x41, _x42, _x43) { + return _on.apply(this, arguments); + } + return on; + }(); + _proto.onDirect = /*#__PURE__*/function () { + var _onDirect = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee28(key, callback, from) { + return _regeneratorRuntime().wrap(function _callee28$(_context28) { + while (1) { + switch (_context28.prev = _context28.next) { + case 0: + if (!from || from === "me" || from === session.getKey().pub) { + this.onMy(key, function (val) { + return callback(val, session.getKey().pub); + }); + } + if (!from || from !== "me" && from !== session.getKey().pub) { + this.onTheir(key, function (val, k, pub) { + return callback(val, pub); + }); + } + case 2: + case "end": + return _context28.stop(); + } + } + }, _callee28, this); + })); + function onDirect(_x44, _x45, _x46) { + return _onDirect.apply(this, arguments); + } + return onDirect; + }(); + _proto.onGroup = /*#__PURE__*/function () { + var _onGroup = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee29(key, callback, from) { + return _regeneratorRuntime().wrap(function _callee29$(_context29) { + while (1) { + switch (_context29.prev = _context29.next) { + case 0: + if (!from || from === "me" || from === session.getKey().pub) { + this.onMyGroup(key, function (val) { + return callback(val, session.getKey().pub); + }); + } + if (!from || from !== "me" && from !== session.getKey().pub) { + this.onTheirGroup(key, function (val, k, pub) { + return callback(val, pub); + }); + } + case 2: + case "end": + return _context29.stop(); + } + } + }, _callee29, this); + })); + function onGroup(_x47, _x48, _x49) { + return _onGroup.apply(this, arguments); + } + return onGroup; + }(); + _proto.onMy = /*#__PURE__*/function () { + var _onMy = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee30(key, callback) { + return _regeneratorRuntime().wrap(function _callee30$(_context30) { + while (1) { + switch (_context30.prev = _context30.next) { + case 0: + return _context30.abrupt("return", (this.uuid ? this.onMyGroup : this.onMyDirect).call(this, key, callback)); + case 1: + case "end": + return _context30.stop(); + } + } + }, _callee30, this); + })); + function onMy(_x50, _x51) { + return _onMy.apply(this, arguments); + } + return onMy; + }(); + _proto.onMyDirect = /*#__PURE__*/function () { + var _onMyDirect = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee32(key, callback) { + var _this10 = this; + var keys, _loop, i, _ret; + return _regeneratorRuntime().wrap(function _callee32$(_context33) { + while (1) { + switch (_context33.prev = _context33.next) { + case 0: + if (!(typeof callback !== 'function')) { + _context33.next = 2; + break; + } + throw new Error("onMy callback must be a function, got " + typeof callback); + case 2: + keys = this.getCurrentParticipants(); + _loop = /*#__PURE__*/_regeneratorRuntime().mark(function _loop(i) { + var ourSecretChannelId; + return _regeneratorRuntime().wrap(function _loop$(_context32) { + while (1) { + switch (_context32.prev = _context32.next) { + case 0: + _context32.next = 2; + return _this10.getOurSecretChannelId(keys[i]); + case 2: + ourSecretChannelId = _context32.sent; + global$1().user().get("chats").get(ourSecretChannelId).get(key).on( /*#__PURE__*/function () { + var _ref5 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee31(data) { + var decrypted; + return _regeneratorRuntime().wrap(function _callee31$(_context31) { + while (1) { + switch (_context31.prev = _context31.next) { + case 0: + _context31.t0 = Key; + _context31.t1 = data; + _context31.next = 4; + return _this10.getSecret(keys[i]); + case 4: + _context31.t2 = _context31.sent; + _context31.next = 7; + return _context31.t0.decrypt.call(_context31.t0, _context31.t1, _context31.t2); + case 7: + decrypted = _context31.sent; + if (decrypted) { + callback(typeof decrypted.v !== "undefined" ? decrypted.v : decrypted, key); + } + case 9: + case "end": + return _context31.stop(); + } + } + }, _callee31); + })); + return function (_x54) { + return _ref5.apply(this, arguments); + }; + }()); + return _context32.abrupt("return", "break"); + case 5: + case "end": + return _context32.stop(); + } + } + }, _loop); + }); + i = 0; + case 5: + if (!(i < keys.length)) { + _context33.next = 13; + break; + } + return _context33.delegateYield(_loop(i), "t0", 7); + case 7: + _ret = _context33.t0; + if (!(_ret === "break")) { + _context33.next = 10; + break; + } + return _context33.abrupt("break", 13); + case 10: + i++; + _context33.next = 5; + break; + case 13: + case "end": + return _context33.stop(); + } + } + }, _callee32, this); + })); + function onMyDirect(_x52, _x53) { + return _onMyDirect.apply(this, arguments); + } + return onMyDirect; + }(); + _proto.onMyGroup = /*#__PURE__*/function () { + var _onMyGroup = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee34(key, callback) { + var mySecretUuid, mySecret; + return _regeneratorRuntime().wrap(function _callee34$(_context35) { + while (1) { + switch (_context35.prev = _context35.next) { + case 0: + if (!(typeof callback !== 'function')) { + _context35.next = 2; + break; + } + throw new Error("onMy callback must be a function, got " + typeof callback); + case 2: + _context35.next = 4; + return this.getMySecretUuid(); + case 4: + mySecretUuid = _context35.sent; + _context35.next = 7; + return this.getMyGroupSecret(); + case 7: + mySecret = _context35.sent; + global$1().user().get("chats").get(mySecretUuid).get(key).on( /*#__PURE__*/function () { + var _ref6 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee33(data) { + var decrypted; + return _regeneratorRuntime().wrap(function _callee33$(_context34) { + while (1) { + switch (_context34.prev = _context34.next) { + case 0: + _context34.next = 2; + return Key.decrypt(data, mySecret); + case 2: + decrypted = _context34.sent; + if (decrypted) { + callback(typeof decrypted.v !== "undefined" ? decrypted.v : decrypted, key, session.getKey().pub); + } + case 4: + case "end": + return _context34.stop(); + } + } + }, _callee33); + })); + return function (_x57) { + return _ref6.apply(this, arguments); + }; + }()); + case 9: + case "end": + return _context35.stop(); + } + } + }, _callee34, this); + })); + function onMyGroup(_x55, _x56) { + return _onMyGroup.apply(this, arguments); + } + return onMyGroup; + }(); + _proto.onTheir = /*#__PURE__*/function () { + var _onTheir = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee35(key, callback, from) { + return _regeneratorRuntime().wrap(function _callee35$(_context36) { + while (1) { + switch (_context36.prev = _context36.next) { + case 0: + return _context36.abrupt("return", (this.uuid ? this.onTheirGroup : this.onTheirDirect).call(this, key, callback, from)); + case 1: + case "end": + return _context36.stop(); + } + } + }, _callee35, this); + })); + function onTheir(_x58, _x59, _x60) { + return _onTheir.apply(this, arguments); + } + return onTheir; + }(); + _proto._onTheirDirectFromUser = /*#__PURE__*/function () { + var _onTheirDirectFromUser2 = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee37(key, callback, pub) { + var _this11 = this; + var theirSecretChannelId; + return _regeneratorRuntime().wrap(function _callee37$(_context38) { + while (1) { + switch (_context38.prev = _context38.next) { + case 0: + if (this.hasWritePermission(pub)) { + _context38.next = 2; + break; + } + return _context38.abrupt("return"); + case 2: + _context38.next = 4; + return this.getTheirSecretChannelId(pub); + case 4: + theirSecretChannelId = _context38.sent; + global$1().user(pub).get("chats").get(theirSecretChannelId).get(key).on( /*#__PURE__*/function () { + var _ref7 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee36(data) { + var decrypted; + return _regeneratorRuntime().wrap(function _callee36$(_context37) { + while (1) { + switch (_context37.prev = _context37.next) { + case 0: + if (_this11.hasWritePermission(pub)) { + _context37.next = 2; + break; + } + return _context37.abrupt("return"); + case 2: + _context37.t0 = Key; + _context37.t1 = data; + _context37.next = 6; + return _this11.getSecret(pub); + case 6: + _context37.t2 = _context37.sent; + _context37.next = 9; + return _context37.t0.decrypt.call(_context37.t0, _context37.t1, _context37.t2); + case 9: + decrypted = _context37.sent; + if (decrypted) { + callback(typeof decrypted.v !== "undefined" ? decrypted.v : decrypted, key, pub); + } + case 11: + case "end": + return _context37.stop(); + } + } + }, _callee36); + })); + return function (_x64) { + return _ref7.apply(this, arguments); + }; + }()); + case 6: + case "end": + return _context38.stop(); + } + } + }, _callee37, this); + })); + function _onTheirDirectFromUser(_x61, _x62, _x63) { + return _onTheirDirectFromUser2.apply(this, arguments); + } + return _onTheirDirectFromUser; + }(); + _proto.onTheirDirect = /*#__PURE__*/function () { + var _onTheirDirect = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee39(key, callback, from) { + var _this12 = this; + var participants; + return _regeneratorRuntime().wrap(function _callee39$(_context40) { + while (1) { + switch (_context40.prev = _context40.next) { + case 0: + if (!(typeof callback !== 'function')) { + _context40.next = 2; + break; + } + throw new Error("onTheir callback must be a function, got " + typeof callback); + case 2: + if (!Object.prototype.hasOwnProperty.call(this.directSubscriptions, key)) { + this.directSubscriptions[key] = []; + } + this.directSubscriptions[key].push({ + key: key, + callback: callback, + from: from + }); + participants = this.getCurrentParticipants(); + participants.forEach( /*#__PURE__*/function () { + var _ref8 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee38(pub) { + return _regeneratorRuntime().wrap(function _callee38$(_context39) { + while (1) { + switch (_context39.prev = _context39.next) { + case 0: + if (!(from && pub !== from)) { + _context39.next = 2; + break; + } + return _context39.abrupt("return"); + case 2: + _this12._onTheirDirectFromUser(pub, key, callback); + case 3: + case "end": + return _context39.stop(); + } + } + }, _callee38); + })); + return function (_x68) { + return _ref8.apply(this, arguments); + }; + }()); + case 6: + case "end": + return _context40.stop(); + } + } + }, _callee39, this); + })); + function onTheirDirect(_x65, _x66, _x67) { + return _onTheirDirect.apply(this, arguments); + } + return onTheirDirect; + }(); + _proto.hasWritePermission = function hasWritePermission(pub) { + return !this.uuid || this.participants && this.participants[pub] && this.participants[pub].write; + }; + _proto._onTheirGroupFromUser = /*#__PURE__*/function () { + var _onTheirGroupFromUser2 = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee41(pub, key, callback, subscription) { + var _this13 = this; + var theirSecretUuid; + return _regeneratorRuntime().wrap(function _callee41$(_context42) { + while (1) { + switch (_context42.prev = _context42.next) { + case 0: + if (this.hasWritePermission(pub)) { + _context42.next = 2; + break; + } + return _context42.abrupt("return"); + case 2: + _context42.next = 4; + return this.getTheirSecretUuid(pub); + case 4: + theirSecretUuid = _context42.sent; + global$1().user(pub).get("chats").get(theirSecretUuid).get(key).on( /*#__PURE__*/function () { + var _ref9 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee40(data, _a, _b, e) { + var decrypted; + return _regeneratorRuntime().wrap(function _callee40$(_context41) { + while (1) { + switch (_context41.prev = _context41.next) { + case 0: + if (subscription) { + subscription.event = e; + } + if (_this13.hasWritePermission(pub)) { + _context41.next = 3; + break; + } + return _context41.abrupt("return"); + case 3: + _context41.t0 = Key; + _context41.t1 = data; + _context41.next = 7; + return _this13.getTheirGroupSecret(pub); + case 7: + _context41.t2 = _context41.sent; + _context41.next = 10; + return _context41.t0.decrypt.call(_context41.t0, _context41.t1, _context41.t2); + case 10: + decrypted = _context41.sent; + if (decrypted) { + callback(typeof decrypted.v !== "undefined" ? decrypted.v : decrypted, key, pub); + } + case 12: + case "end": + return _context41.stop(); + } + } + }, _callee40); + })); + return function (_x73, _x74, _x75, _x76) { + return _ref9.apply(this, arguments); + }; + }()); + case 6: + case "end": + return _context42.stop(); + } + } + }, _callee41, this); + })); + function _onTheirGroupFromUser(_x69, _x70, _x71, _x72) { + return _onTheirGroupFromUser2.apply(this, arguments); + } + return _onTheirGroupFromUser; + }(); + _proto.onTheirGroup = /*#__PURE__*/function () { + var _onTheirGroup = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee43(key, callback, from) { + var _this14 = this; + var subscription; + return _regeneratorRuntime().wrap(function _callee43$(_context44) { + while (1) { + switch (_context44.prev = _context44.next) { + case 0: + if (!(typeof callback !== 'function')) { + _context44.next = 2; + break; + } + throw new Error("onTheir callback must be a function, got " + typeof callback); + case 2: + if (!Object.prototype.hasOwnProperty.call(this.groupSubscriptions, key)) { + this.groupSubscriptions[key] = []; + } + subscription = { + key: key, + callback: callback, + from: from + }; + this.groupSubscriptions[key].push(subscription); + this.getParticipants(function (participants) { + Object.keys(participants).forEach( /*#__PURE__*/function () { + var _ref10 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee42(pub) { + return _regeneratorRuntime().wrap(function _callee42$(_context43) { + while (1) { + switch (_context43.prev = _context43.next) { + case 0: + if (!(from && pub !== from)) { + _context43.next = 2; + break; + } + return _context43.abrupt("return"); + case 2: + if (participants[pub] && participants[pub].write) { + _context43.next = 4; + break; + } + return _context43.abrupt("return"); + case 4: + _this14._onTheirGroupFromUser(pub, key, callback, subscription); + case 5: + case "end": + return _context43.stop(); + } + } + }, _callee42); + })); + return function (_x80) { + return _ref10.apply(this, arguments); + }; + }()); + }); + case 6: + case "end": + return _context44.stop(); + } + } + }, _callee43, this); + })); + function onTheirGroup(_x77, _x78, _x79) { + return _onTheirGroup.apply(this, arguments); + } + return onTheirGroup; + }() /** + * Set typing status + */; + _proto.setTyping = function setTyping(isTyping, timeout) { + var _this15 = this; + if (timeout === void 0) { + timeout = 5; + } + isTyping = typeof isTyping === "undefined" ? true : isTyping; + timeout = timeout * 1000; + this.put("typing", isTyping ? new Date().toISOString() : new Date(0).toISOString()); + clearTimeout(this.setTypingTimeout); + this.setTypingTimeout = setTimeout(function () { + return _this15.put("typing", false); + }, timeout); + } + /** + * Get typing status + */; + _proto.getTyping = function getTyping(callback, timeout) { + var _this16 = this; + if (timeout === void 0) { + timeout = 5; + } + timeout = timeout * 1000; + this.onTheir("typing", function (typing, key, pub) { + if (callback) { + var isTyping = typing && new Date() - new Date(typing) <= timeout; + callback(isTyping, pub); + _this16.getTypingTimeouts = _this16.getTypingTimeouts || {}; + clearTimeout(_this16.getTypingTimeouts[pub]); + if (isTyping) { + _this16.getTypingTimeouts[pub] = setTimeout(function () { + return callback(false, pub); + }, timeout); + } + } + }); + } + /** + * Get a simple link that points to the channel. + * + * Direct channel: both users need to give their simple links. Use createChatLink() to get a two-way link that needs to be given by one user only. + * + * Group channel: Works only if the link recipient has been already added onto the channel participants list. + */; + _proto.getSimpleLink = function getSimpleLink(urlRoot) { + if (urlRoot === void 0) { + urlRoot = 'https://iris.to/'; + } + if (this.uuid) { + return urlRoot + "?channelId=" + this.uuid + "&inviter=" + session.getKey().pub; + } + return urlRoot + "?chatWith=" + this.getCurrentParticipants()[0]; + } + /** + * + */; + _proto.getChatLinks = + /*#__PURE__*/ + function () { + var _getChatLinks = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee45(opts) { + var _this17 = this; + var _opts, callback, urlRoot, subscribe, chatLinks, chatLinkSubscriptions; + return _regeneratorRuntime().wrap(function _callee45$(_context46) { + while (1) { + switch (_context46.prev = _context46.next) { + case 0: + if (opts === void 0) { + opts = {}; + } + _opts = opts, callback = _opts.callback, urlRoot = _opts.urlRoot, subscribe = _opts.subscribe; + urlRoot = urlRoot || 'https://iris.to/'; + if (this.uuid) { + _context46.next = 5; + break; + } + throw new Error('Only group channels may have chat links'); + case 5: + chatLinks = []; + chatLinkSubscriptions = {}; + this.on('chatLinks', function (links, from) { + // TODO: check admin permissions + if (!links || typeof links !== 'object') { + return; + } + Object.keys(links).forEach(function (linkId) { + var link = links[linkId]; + if (link === null) { + chatLinkSubscriptions[linkId] && chatLinkSubscriptions[linkId].off(); // unsubscribe removed chat link + delete chatLinkSubscriptions[linkId]; + callback && callback({ + id: linkId, + url: null + }); + return; + } + if (chatLinks.indexOf(linkId) !== -1) { + return; + } + var channels = []; + chatLinks.push(linkId); + var url = Channel.formatChatLink({ + urlRoot: urlRoot, + inviter: from, + channelId: _this17.uuid, + sharedSecret: link.sharedSecret, + linkId: linkId + }); + callback && callback({ + url: url, + id: linkId + }); + if (subscribe) { + global$1().user(link.sharedKey.pub).get('chatRequests').map( /*#__PURE__*/function () { + var _ref11 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee44(encPub, requestId, a, e) { + var s, pub; + return _regeneratorRuntime().wrap(function _callee44$(_context45) { + while (1) { + switch (_context45.prev = _context45.next) { + case 0: + if (!(!encPub || typeof encPub !== 'string' || encPub.length < 10)) { + _context45.next = 2; + break; + } + return _context45.abrupt("return"); + case 2: + chatLinkSubscriptions[linkId] = e; + s = JSON.stringify(encPub); + if (!(channels.indexOf(s) === -1)) { + _context45.next = 10; + break; + } + channels.push(s); + _context45.next = 8; + return Key.decrypt(encPub, link.sharedSecret); + case 8: + pub = _context45.sent; + _this17.addParticipant(pub, undefined, undefined, true); + case 10: + case "end": + return _context45.stop(); + } + } + }, _callee44); + })); + return function (_x82, _x83, _x84, _x85) { + return _ref11.apply(this, arguments); + }; + }()); + } + }); + }); + case 8: + case "end": + return _context46.stop(); + } + } + }, _callee45, this); + })); + function getChatLinks(_x81) { + return _getChatLinks.apply(this, arguments); + } + return getChatLinks; + }(); + _proto.createChatLink = /*#__PURE__*/function () { + var _createChatLink = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee46(urlRoot) { + var sharedKey, sharedKeyString, sharedSecret, encryptedSharedKey, ownerSecret, ownerEncryptedSharedKey, linkId; + return _regeneratorRuntime().wrap(function _callee46$(_context47) { + while (1) { + switch (_context47.prev = _context47.next) { + case 0: + if (urlRoot === void 0) { + urlRoot = 'https://iris.to/'; + } + _context47.next = 3; + return Key.generate(); + case 3: + sharedKey = _context47.sent; + sharedKeyString = JSON.stringify(sharedKey); + _context47.next = 7; + return Key.secret(sharedKey.epub, sharedKey); + case 7: + sharedSecret = _context47.sent; + _context47.next = 10; + return Key.encrypt(sharedKeyString, sharedSecret); + case 10: + encryptedSharedKey = _context47.sent; + _context47.next = 13; + return Key.secret(session.getKey().epub, session.getKey()); + case 13: + ownerSecret = _context47.sent; + _context47.next = 16; + return Key.encrypt(sharedKeyString, ownerSecret); + case 16: + ownerEncryptedSharedKey = _context47.sent; + _context47.next = 19; + return util.getHash(encryptedSharedKey); + case 19: + linkId = _context47.sent; + linkId = linkId.slice(0, 12); + // User has to exist, in order for .get(chatRequests).on() to be ever triggered + global$1(sharedKey).get('chatRequests').put({ + a: 1 + }); + this.chatLinks[linkId] = { + sharedKey: sharedKey, + sharedSecret: sharedSecret + }; + this.put('chatLinks', this.chatLinks); + publicState().get('chatLinks').get(linkId).put({ + encryptedSharedKey: encryptedSharedKey, + ownerEncryptedSharedKey: ownerEncryptedSharedKey + }); + return _context47.abrupt("return", Channel.formatChatLink({ + urlRoot: urlRoot, + channelId: this.uuid, + inviter: session.getKey().pub, + sharedSecret: sharedSecret, + linkId: linkId + })); + case 26: + case "end": + return _context47.stop(); + } + } + }, _callee46, this); + })); + function createChatLink(_x86) { + return _createChatLink.apply(this, arguments); + } + return createChatLink; + }() /** + * Set the user's online/active status + * @param {string} activity string: set the activity status every 3 seconds, null/false: stop updating + */; + Channel.setActivity = function setActivity(activity) { + if (global$1().irisActivityStatus === activity) { + return; + } + global$1().irisActivityStatus = activity; + clearTimeout(global$1().setActivityTimeout); + var update = function update() { + global$1().user().get("activity").put({ + status: activity, + time: new Date().toISOString() + }); + }; + update(); + function timerUpdate() { + update(); + global$1().setActivityTimeout = setTimeout(timerUpdate, 3000); + } + if (activity) { + timerUpdate(); + } + } + /** + * Get the online status of a user. + * + * @param {string} pubKey public key of the user + * @param {boolean} callback receives a boolean each time the user's online status changes + */; + Channel.getActivity = function getActivity(pubKey, callback) { + var timeout; + global$1().user(pubKey).get("activity").on(function (activity) { + if (!activity || !(activity.time && activity.status)) { + return; + } + clearTimeout(timeout); + var now = new Date(); + var activityDate = new Date(activity.time); + var isActive = activityDate > new Date(now.getTime() - 10 * 1000) && activityDate < new Date(now.getTime() + 30 * 1000); + callback({ + isActive: isActive, + lastActive: activity.time, + status: activity.status + }); + if (isActive) { + timeout = setTimeout(function () { + return callback({ + isOnline: false, + lastActive: activity.time + }); + }, 10000); + } + }); + }; + Channel.formatChatLink = function formatChatLink(_ref12) { + var urlRoot = _ref12.urlRoot, + chatWith = _ref12.chatWith, + channelId = _ref12.channelId, + inviter = _ref12.inviter, + sharedSecret = _ref12.sharedSecret, + linkId = _ref12.linkId; + var enc = encodeURIComponent; + if (channelId && inviter) { + return urlRoot + "?channelId=" + enc(channelId) + "&inviter=" + enc(inviter) + "&s=" + enc(sharedSecret) + "&k=" + enc(linkId); + } + return urlRoot + "?chatWith=" + enc(chatWith) + "&s=" + enc(sharedSecret) + "&k=" + enc(linkId); + } + /** + * Creates a channel link that can be used for two-way communication, i.e. only one link needs to be exchanged. + */; + Channel.createChatLink = + /*#__PURE__*/ + function () { + var _createChatLink2 = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee47(urlRoot) { + var user, key, sharedKey, sharedKeyString, sharedSecret, encryptedSharedKey, ownerSecret, ownerEncryptedSharedKey, linkId; + return _regeneratorRuntime().wrap(function _callee47$(_context48) { + while (1) { + switch (_context48.prev = _context48.next) { + case 0: + if (urlRoot === void 0) { + urlRoot = 'https://iris.to/'; + } + user = global$1().user(); + key = session.getKey(); // We create a new Gun user whose private key is shared with the chat link recipients. + // Chat link recipients can contact you by writing their public key to the shared key's user space. + _context48.next = 5; + return Key.generate(); + case 5: + sharedKey = _context48.sent; + sharedKeyString = JSON.stringify(sharedKey); + _context48.next = 9; + return Key.secret(sharedKey.epub, sharedKey); + case 9: + sharedSecret = _context48.sent; + _context48.next = 12; + return Key.encrypt(sharedKeyString, sharedSecret); + case 12: + encryptedSharedKey = _context48.sent; + _context48.next = 15; + return Key.secret(key.epub, key); + case 15: + ownerSecret = _context48.sent; + _context48.next = 18; + return Key.encrypt(sharedKeyString, ownerSecret); + case 18: + ownerEncryptedSharedKey = _context48.sent; + _context48.next = 21; + return util.getHash(encryptedSharedKey); + case 21: + linkId = _context48.sent; + linkId = linkId.slice(0, 12); + // User has to exist, in order for .get(chatRequests).on() to be ever triggered + global$1(sharedKey).get('chatRequests').put({ + a: 1 + }).get('chatRequests').put({ + a: 1 + }); + user.get('chatLinks').get(linkId).put({ + encryptedSharedKey: encryptedSharedKey, + ownerEncryptedSharedKey: ownerEncryptedSharedKey + }); + return _context48.abrupt("return", Channel.formatChatLink({ + urlRoot: urlRoot, + chatWith: key.pub, + sharedSecret: sharedSecret, + linkId: linkId + })); + case 26: + case "end": + return _context48.stop(); + } + } + }, _callee47); + })); + function createChatLink(_x87) { + return _createChatLink2.apply(this, arguments); + } + return createChatLink; + }() /** + * + */; + Channel.getMyChatLinks = + /*#__PURE__*/ + function () { + var _getMyChatLinks = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee50(urlRoot, callback, subscribe) { + var key, user, mySecret, chatLinks; + return _regeneratorRuntime().wrap(function _callee50$(_context51) { + while (1) { + switch (_context51.prev = _context51.next) { + case 0: + if (urlRoot === void 0) { + urlRoot = 'https://iris.to/'; + } + if (subscribe === void 0) { + subscribe = false; + } + key = session.getKey(); + user = global$1().user(); + _context51.next = 6; + return Key.secret(key.epub, key); + case 6: + mySecret = _context51.sent; + chatLinks = []; + user.get('chatLinks').map(function (data, linkId) { + if (!data || chatLinks.indexOf(linkId) !== -1) { + return; + } + var channels = []; + user.get('chatLinks').get(linkId).get('ownerEncryptedSharedKey').on( /*#__PURE__*/function () { + var _ref13 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee49(enc) { + var sharedKey, sharedSecret, url; + return _regeneratorRuntime().wrap(function _callee49$(_context50) { + while (1) { + switch (_context50.prev = _context50.next) { + case 0: + if (!(!enc || chatLinks.indexOf(linkId) !== -1)) { + _context50.next = 2; + break; + } + return _context50.abrupt("return"); + case 2: + chatLinks.push(linkId); + _context50.next = 5; + return Key.decrypt(enc, mySecret); + case 5: + sharedKey = _context50.sent; + _context50.next = 8; + return Key.secret(sharedKey.epub, sharedKey); + case 8: + sharedSecret = _context50.sent; + url = Channel.formatChatLink({ + urlRoot: urlRoot, + chatWith: key.pub, + sharedSecret: sharedSecret, + linkId: linkId + }); + if (callback) { + callback({ + url: url, + id: linkId + }); + } + if (subscribe) { + global$1().user(sharedKey.pub).get('chatRequests').map( /*#__PURE__*/function () { + var _ref14 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee48(encPub, requestId) { + var s, pub, channel; + return _regeneratorRuntime().wrap(function _callee48$(_context49) { + while (1) { + switch (_context49.prev = _context49.next) { + case 0: + if (encPub) { + _context49.next = 2; + break; + } + return _context49.abrupt("return"); + case 2: + s = JSON.stringify(encPub); + if (!(channels.indexOf(s) === -1)) { + _context49.next = 10; + break; + } + channels.push(s); + _context49.next = 7; + return Key.decrypt(encPub, sharedSecret); + case 7: + pub = _context49.sent; + channel = new Channel({ + key: key, + participants: pub + }); + channel.save(); + case 10: + global$1(sharedKey).get('chatRequests').get(requestId).put(null); + case 11: + case "end": + return _context49.stop(); + } + } + }, _callee48); + })); + return function (_x92, _x93) { + return _ref14.apply(this, arguments); + }; + }()); + } + case 12: + case "end": + return _context50.stop(); + } + } + }, _callee49); + })); + return function (_x91) { + return _ref13.apply(this, arguments); + }; + }()); + }); + case 9: + case "end": + return _context51.stop(); + } + } + }, _callee50); + })); + function getMyChatLinks(_x88, _x89, _x90) { + return _getMyChatLinks.apply(this, arguments); + } + return getMyChatLinks; + }() /** + * + */; + _proto.removeGroupChatLink = function removeGroupChatLink(linkId) { + this.chatLinks[linkId] = null; + this.put('chatLinks', this.chatLinks); + global$1().user().get('chatLinks').get(linkId).put(null); + } + /** + * + */; + Channel.removePrivateChatLink = function removePrivateChatLink(key, linkId) { + global$1().user().auth(key); + global$1().user().get('chatLinks').get(linkId).put(null); + } + /** + * + */; + Channel.deleteChannel = + /*#__PURE__*/ + function () { + var _deleteChannel = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee51(key, pub) { + var channelId; + return _regeneratorRuntime().wrap(function _callee51$(_context52) { + while (1) { + switch (_context52.prev = _context52.next) { + case 0: + global$1().user().auth(key); + _context52.next = 3; + return Channel.getOurSecretChannelId(pub, key); + case 3: + channelId = _context52.sent; + global$1().user().get('channels').get(channelId).put(null); + global$1().user().get('channels').get(channelId).off(); + case 6: + case "end": + return _context52.stop(); + } + } + }, _callee51); + })); + function deleteChannel(_x94, _x95) { + return _deleteChannel.apply(this, arguments); + } + return deleteChannel; + }() /** + * + */; + Channel.deleteGroup = + /*#__PURE__*/ + function () { + var _deleteGroup = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee52(key, uuid) { + var mySecret, mySecretHash, mySecretUuid; + return _regeneratorRuntime().wrap(function _callee52$(_context53) { + while (1) { + switch (_context53.prev = _context53.next) { + case 0: + _context53.next = 2; + return Key.secret(key.epub, key); + case 2: + mySecret = _context53.sent; + _context53.next = 5; + return util.getHash(mySecret); + case 5: + mySecretHash = _context53.sent; + _context53.next = 8; + return util.getHash(mySecretHash + uuid); + case 8: + mySecretUuid = _context53.sent; + global$1().user().auth(key); + global$1().user().get('channels').get(mySecretUuid).put(null); + global$1().user().get('channels').get(mySecretUuid).off(); + case 12: + case "end": + return _context53.stop(); + } + } + }, _callee52); + })); + function deleteGroup(_x96, _x97) { + return _deleteGroup.apply(this, arguments); + } + return deleteGroup; + }(); + return Channel; + }(); + + var channels = /*#__PURE__*/new Map(); + /** + * Private channel that only you and publicKey can read/write. + * @param publicKey + * @returns {Channel} + */ + function privateState (publicKey, chatLink) { + if (publicKey === void 0) { + publicKey = session.getKey(); + } + var channel = channels.get(publicKey); + if (!channel) { + channel = new Channel({ + participants: publicKey, + chatLink: chatLink + }); + channels.set(publicKey, channel); + } + return channel; + } + + var local; + /** + * Get a state that is only synced in memory and local storage. + * + * Useful for storing things like UI state, local indexes or logged in user. + * @returns {Node} + */ + function local$1 () { + if (!local) { + local = new Node('local'); + } + return local; + } + + var blockedUsers = {}; + function blockedUsers$1 () { + if (!blockedUsers) { + blockedUsers = {}; + local$1().get('block').map(function (isBlocked, user) { + if (isBlocked === blockedUsers[user]) { + return; + } + if (isBlocked) { + blockedUsers[user] = isBlocked; + local$1().get('groups').map(function (_v, k) { + local$1().get('groups').get(k).get(user).put(false); + }); + } else { + delete blockedUsers[user]; + } + }); + } + return blockedUsers; + } + + var counter = 0; + var cache = /*#__PURE__*/new Map(); + var callbacks = /*#__PURE__*/new Map(); + /** + * Aggregates public data from all users in the group. + * + * For example, the public message feed, message replies and likes are aggregated using this. + * @param groupName + * @returns object + */ + function group (groupName) { + if (groupName === void 0) { + groupName = 'everyone'; + } + return { + get: function get(path, callback) { + var groupNode = local$1().get('groups').get(groupName); + var follows = {}; + requestAnimationFrame(function () { + groupNode.map(function (isFollowing, user) { + if (blockedUsers$1()[user]) { + return; + } // TODO: allow to specifically query blocked users? + if (follows[user] && follows[user] === isFollowing) { + return; + } + follows[user] = isFollowing; + if (isFollowing) { + // TODO: callback on unfollow, for unsubscribe + var node = publicState(user); + if (path && path !== '/') { + node = path.split('/').reduce(function (sum, s) { + return sum.get(decodeURIComponent(s)); + }, node); + } + callback(node, user); + } + }); + }); + }, + _cached_map: function _cached_map(cached, cacheKey, path, myEvent, callback) { + if (!cached) { + var _cached = new Map(); + cache.set(cacheKey, _cached); + this.get(path, function (node, from) { + return node.map(function (value, key, x) { + var item = { + value: value, + key: key, + from: from + }; + _cached.set(key, item); + for (var _iterator = _createForOfIteratorHelperLoose(callbacks.get(cacheKey).values()), _step; !(_step = _iterator()).done;) { + var cb = _step.value; + cb(value, key, x, myEvent, from); + } + }); + }); + } else { + for (var _iterator2 = _createForOfIteratorHelperLoose(cached.values()), _step2; !(_step2 = _iterator2()).done;) { + var item = _step2.value; + callback(item.value, item.key, 0, myEvent, item.from); + } + } + }, + // TODO: this should probably store just the most recent value, not everyone's value + // TODO: for counting of likes etc, use this.count() instead + _cached_on: function _cached_on(cached, cacheKey, path, myEvent, callback) { + if (!cached) { + var _cached2 = new Map(); + cache.set(cacheKey, _cached2); + this.get(path, function (node, from) { + return node.on(function (value, key, x) { + var item = { + value: value, + key: key, + from: from + }; + _cached2.set(from, item); + for (var _iterator3 = _createForOfIteratorHelperLoose(callbacks.get(cacheKey).values()), _step3; !(_step3 = _iterator3()).done;) { + var cb = _step3.value; + cb(value, key, x, myEvent, from); + } + }); + }); + } else { + for (var _iterator4 = _createForOfIteratorHelperLoose(cached.values()), _step4; !(_step4 = _iterator4()).done;) { + var item = _step4.value; + callback(item.value, item.key, 0, myEvent, item.from); + } + } + }, + _cached_count: function _cached_count(cached, cacheKey, path, myEvent, callback) { + if (!cached) { + var _cached3 = new Map(); + cache.set(cacheKey, _cached3); + this.get(path, function (node, from) { + return node.on(function (value, key) { + value ? _cached3.set(from, true) : _cached3["delete"](from); + var count = _cached3.size; + for (var _iterator5 = _createForOfIteratorHelperLoose(callbacks.get(cacheKey).values()), _step5; !(_step5 = _iterator5()).done;) { + var cb = _step5.value; + cb(count, key, null, myEvent, from); + } + }); + }); + } else { + callback(cached.size, path.split('/').pop(), null, myEvent); + } + }, + _cached_fn: function _cached_fn(fn, path, callback) { + var cacheKey = fn + ":" + groupName + ":" + path; + var callbackId = counter++; + if (callbacks.has(cacheKey)) { + callbacks.get(cacheKey).set(callbackId, callback); + } else { + callbacks.set(cacheKey, new Map([[callbackId, callback]])); + } + var myEvent = { + off: function off() { + var myCallbacks = callbacks.get(cacheKey); + myCallbacks && myCallbacks["delete"](callbackId); + } + }; + var cached = cache.get(cacheKey); + switch (fn) { + case 'map': + this._cached_map(cached, cacheKey, path, myEvent, callback); + break; + case 'on': + this._cached_on(cached, cacheKey, path, myEvent, callback); + break; + case 'count': + this._cached_count(cached, cacheKey, path, myEvent, callback); + break; + } + }, + map: function map(path, callback) { + this._cached_fn('map', path, callback); + }, + on: function on(path, callback) { + this._cached_fn('on', path, callback); + }, + count: function count(path, callback) { + this._cached_fn('count', path, callback); + } + }; + } + + var NOTIFICATION_SERVICE_URL = 'https://iris-notifications.herokuapp.com/notify'; + // const notificationSound = new Audio('../../assets/audio/notification.mp3'); // TODO + var loginTime; + var unseenMsgsTotal = 0; + var unseenNotificationCount = 0; + var webPushSubscriptions = {}; + function desktopNotificationsEnabled() { + return window.Notification && Notification.permission === 'granted'; + } + function notifyMsg(msg, info, channelId, onClick) { + function shouldNotify() { + if (msg.timeObj < loginTime) { + return false; + } + if (info.selfAuthored) { + return false; + } + if (document.visibilityState === 'visible') { + return false; + } + var channel = privateState(channelId); + if (channel.notificationSetting === 'nothing') { + return false; + } + if (channel.notificationSetting === 'mentions' && !msg.text.includes(session.getMyName())) { + return false; + } + return true; + } + function shouldDesktopNotify() { + if (!desktopNotificationsEnabled()) { + return false; + } + return shouldNotify(); + } + function shouldAudioNotify() { + return shouldNotify(); + } + if (shouldAudioNotify()) ; + if (shouldDesktopNotify()) { + var body, title; + var channel = privateState(channelId); + if (channel.uuid) { + title = channel.participantProfiles[info.from].name; + body = name + ": " + msg.text; + } else { + title = 'Message'; + body = msg.text; + } + body = util.truncateString(body, 50); + var desktopNotification = new Notification(title, { + icon: '/assets/img/icon128.png', + body: body, + silent: true + }); + desktopNotification.onclick = function () { + changeUnseenNotificationCount(-1); + onClick && onClick(); + window.focus(); + }; + } + } + function changeChatUnseenMsgsCount(chatId, change) { + var chat = privateState(chatId); + if (!chat) return; + var chatNode = local$1().get('channels').get(chatId); + if (change) { + unseenMsgsTotal += change; + chat.unseen += change; + } else { + unseenMsgsTotal = unseenMsgsTotal - (chat.unseen || 0); + chat.unseen = 0; + } + chatNode.get('unseen').put(chat.unseen); + unseenMsgsTotal = unseenMsgsTotal >= 0 ? unseenMsgsTotal : 0; + local$1().get('unseenMsgsTotal').put(unseenMsgsTotal); + } + var publicVapidKey = 'BMqSvZArOIdn7vGkYplSpkZ70-Qt8nhYbey26WVa3LF3SwzblSzm3n3HHycpNkAKVq7MCkrzFuTFs_en7Y_J2MI'; + function urlBase64ToUint8Array(base64String) { + var padding = '='.repeat((4 - base64String.length % 4) % 4); + var base64 = (base64String + padding).replace(/-/g, '+').replace(/_/g, '/'); + var rawData = window.atob(base64); + var outputArray = new Uint8Array(rawData.length); + for (var i = 0; i < rawData.length; ++i) { + outputArray[i] = rawData.charCodeAt(i); + } + return outputArray; + } + function subscribe(_x) { + return _subscribe.apply(this, arguments); + } + function _subscribe() { + _subscribe = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3(reg) { + var subscription; + return _regeneratorRuntime().wrap(function _callee3$(_context3) { + while (1) { + switch (_context3.prev = _context3.next) { + case 0: + _context3.prev = 0; + _context3.next = 3; + return reg.pushManager.subscribe({ + userVisibleOnly: true, + applicationServerKey: urlBase64ToUint8Array(publicVapidKey) + }); + case 3: + subscription = _context3.sent; + addWebPushSubscription(subscription); + _context3.next = 10; + break; + case 7: + _context3.prev = 7; + _context3.t0 = _context3["catch"](0); + console.error('web push subscription error', _context3.t0); + case 10: + case "end": + return _context3.stop(); + } + } + }, _callee3, null, [[0, 7]]); + })); + return _subscribe.apply(this, arguments); + } + function subscribeToWebPush() { + return _subscribeToWebPush.apply(this, arguments); + } + function _subscribeToWebPush() { + _subscribeToWebPush = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee4() { + var reg, sub; + return _regeneratorRuntime().wrap(function _callee4$(_context4) { + while (1) { + switch (_context4.prev = _context4.next) { + case 0: + console.log('subscribing to web push', navigator.serviceWorker); + if (!(!desktopNotificationsEnabled() || !navigator.serviceWorker)) { + _context4.next = 3; + break; + } + return _context4.abrupt("return", false); + case 3: + _context4.next = 5; + return navigator.serviceWorker.ready; + case 5: + _context4.next = 7; + return navigator.serviceWorker.getRegistration(); + case 7: + reg = _context4.sent; + reg.active.postMessage({ + key: session.getKey() + }); + _context4.next = 11; + return reg.pushManager.getSubscription(); + case 11: + sub = _context4.sent; + sub ? addWebPushSubscription(sub) : subscribe(reg); + case 13: + case "end": + return _context4.stop(); + } + } + }, _callee4); + })); + return _subscribeToWebPush.apply(this, arguments); + } + var addWebPushSubscriptionsToChats = /*#__PURE__*/_.debounce(function () { + var arr = Object.values(webPushSubscriptions); + session.channelIds.forEach(function (channelId) { + privateState(channelId).put('webPushSubscriptions', arr); + }); + }, 5000); + function removeSubscription(hash) { + delete webPushSubscriptions[hash]; + global$1().user().get('webPushSubscriptions').get(hash).put(null); + addWebPushSubscriptionsToChats(); + } + function addWebPushSubscription(_x2, _x3) { + return _addWebPushSubscription.apply(this, arguments); + } + function _addWebPushSubscription() { + _addWebPushSubscription = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee5(s, saveToGun) { + var myKey, mySecret, enc, hash; + return _regeneratorRuntime().wrap(function _callee5$(_context5) { + while (1) { + switch (_context5.prev = _context5.next) { + case 0: + if (saveToGun === void 0) { + saveToGun = true; + } + myKey = session.getKey(); + _context5.next = 4; + return Key.secret(myKey.epub, myKey); + case 4: + mySecret = _context5.sent; + _context5.next = 7; + return Key.encrypt(s, mySecret); + case 7: + enc = _context5.sent; + _context5.next = 10; + return util.getHash(JSON.stringify(s)); + case 10: + hash = _context5.sent; + if (saveToGun) { + global$1().user().get('webPushSubscriptions').get(hash).put(enc); + } + webPushSubscriptions[hash] = s; + addWebPushSubscriptionsToChats(); + case 14: + case "end": + return _context5.stop(); + } + } + }, _callee5); + })); + return _addWebPushSubscription.apply(this, arguments); + } + function getWebPushSubscriptions() { + return _getWebPushSubscriptions.apply(this, arguments); + } + function _getWebPushSubscriptions() { + _getWebPushSubscriptions = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee7() { + var myKey, mySecret; + return _regeneratorRuntime().wrap(function _callee7$(_context7) { + while (1) { + switch (_context7.prev = _context7.next) { + case 0: + myKey = session.getKey(); + _context7.next = 3; + return Key.secret(myKey.epub, myKey); + case 3: + mySecret = _context7.sent; + global$1().user().get('webPushSubscriptions').map( /*#__PURE__*/function () { + var _ref3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee6(enc) { + var s; + return _regeneratorRuntime().wrap(function _callee6$(_context6) { + while (1) { + switch (_context6.prev = _context6.next) { + case 0: + if (enc) { + _context6.next = 2; + break; + } + return _context6.abrupt("return"); + case 2: + _context6.next = 4; + return Key.decrypt(enc, mySecret); + case 4: + s = _context6.sent; + addWebPushSubscription(s, false); + case 6: + case "end": + return _context6.stop(); + } + } + }, _callee6); + })); + return function (_x18) { + return _ref3.apply(this, arguments); + }; + }()); + case 5: + case "end": + return _context7.stop(); + } + } + }, _callee7); + })); + return _getWebPushSubscriptions.apply(this, arguments); + } + function getEpub(user) { + return new Promise(function (resolve) { + global$1().user(user).get('epub').on( /*#__PURE__*/function () { + var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(epub, k, x, e) { + return _regeneratorRuntime().wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + if (epub) { + e.off(); + resolve(epub); + } + case 1: + case "end": + return _context.stop(); + } + } + }, _callee); + })); + return function (_x4, _x5, _x6, _x7) { + return _ref.apply(this, arguments); + }; + }()); + }); + } + function getNotificationText(_x8) { + return _getNotificationText.apply(this, arguments); + } + function _getNotificationText() { + _getNotificationText = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee8(notification) { + var profile, name, event, eventText; + return _regeneratorRuntime().wrap(function _callee8$(_context8) { + while (1) { + switch (_context8.prev = _context8.next) { + case 0: + _context8.next = 2; + return global$1().user(notification.from).get('profile').once(); + case 2: + profile = _context8.sent; + name = profile && profile.name || 'someone'; + event = notification.event || notification.action; + if (event === 'like') eventText = name + " liked your post";else if (event === 'reply') eventText = name + " replied to your post";else if (event === 'mention') eventText = name + " mentioned you in their post";else if (event === 'follow') eventText = name + " started following you";else eventText = name + " sent you a notification: " + event; + return _context8.abrupt("return", eventText); + case 7: + case "end": + return _context8.stop(); + } + } + }, _callee8); + })); + return _getNotificationText.apply(this, arguments); + } + function subscribeToIrisNotifications(onClick) { + var notificationsSeenTime; + var notificationsShownTime; + global$1().user().get('notificationsSeenTime').on(function (v) { + notificationsSeenTime = v; + console.log(v); + }); + global$1().user().get('notificationsShownTime').on(function (v) { + return notificationsShownTime = v; + }); + var setNotificationsShownTime = _.debounce(function () { + global$1().user().get('notificationsShownTime').put(new Date().toISOString()); + }, 1000); + var alreadyHave = new Set(); + group().on("notifications/" + session.getPubKey(), /*#__PURE__*/function () { + var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(encryptedNotification, k, x, e, from) { + var id, epub, secret, notification, text, desktopNotification; + return _regeneratorRuntime().wrap(function _callee2$(_context2) { + while (1) { + switch (_context2.prev = _context2.next) { + case 0: + id = from.slice(0, 30) + encryptedNotification.slice(0, 30); + if (!alreadyHave.has(id)) { + _context2.next = 3; + break; + } + return _context2.abrupt("return"); + case 3: + alreadyHave.add(id); + _context2.next = 6; + return getEpub(from); + case 6: + epub = _context2.sent; + _context2.next = 9; + return Key.secret(epub, session.getKey()); + case 9: + secret = _context2.sent; + _context2.next = 12; + return Key.decrypt(encryptedNotification, secret); + case 12: + notification = _context2.sent; + if (!(!notification || typeof notification !== 'object')) { + _context2.next = 15; + break; + } + return _context2.abrupt("return"); + case 15: + setNotificationsShownTime(); + notification.from = from; + local$1().get('notifications').get(notification.time).put(notification); + if (!notificationsSeenTime || notificationsSeenTime < notification.time) { + changeUnseenNotificationCount(1); + } + if (!(!notificationsShownTime || notificationsShownTime < notification.time)) { + _context2.next = 26; + break; + } + console.log('was new!'); + _context2.next = 23; + return getNotificationText(notification); + case 23: + text = _context2.sent; + desktopNotification = new Notification(text, { + icon: '/assets/img/icon128.png', + body: text, + silent: true + }); + desktopNotification.onclick = function () { + var link = notification.target ? "/post/" + notification.target : "/profile/" + notification.from; + onClick && onClick(link); + changeUnseenNotificationCount(-1); + window.focus(); + }; + case 26: + case "end": + return _context2.stop(); + } + } + }, _callee2); + })); + return function (_x9, _x10, _x11, _x12, _x13) { + return _ref2.apply(this, arguments); + }; + }()); + } + function changeUnseenNotificationCount(change) { + if (!change) { + unseenNotificationCount = 0; + global$1().user().get('notificationsSeenTime').put(new Date().toISOString()); + } else { + unseenNotificationCount += change; + unseenNotificationCount = Math.max(unseenNotificationCount, 0); + } + local$1().get('unseenNotificationCount').put(unseenNotificationCount); + } + function sendIrisNotification(_x14, _x15) { + return _sendIrisNotification.apply(this, arguments); + } + function _sendIrisNotification() { + _sendIrisNotification = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee9(recipient, notification) { + var epub, secret, enc; + return _regeneratorRuntime().wrap(function _callee9$(_context9) { + while (1) { + switch (_context9.prev = _context9.next) { + case 0: + if (recipient && notification) { + _context9.next = 2; + break; + } + return _context9.abrupt("return"); + case 2: + // TODO: use typescript or sth :D + if (typeof notification === 'object') { + notification.time = new Date().toISOString(); + } + _context9.next = 5; + return getEpub(recipient); + case 5: + epub = _context9.sent; + _context9.next = 8; + return Key.secret(epub, session.getKey()); + case 8: + secret = _context9.sent; + _context9.next = 11; + return Key.encrypt(notification, secret); + case 11: + enc = _context9.sent; + global$1().user().get('notifications').get(recipient).put(enc); + case 13: + case "end": + return _context9.stop(); + } + } + }, _callee9); + })); + return _sendIrisNotification.apply(this, arguments); + } + function sendWebPushNotification(_x16, _x17) { + return _sendWebPushNotification.apply(this, arguments); + } + function _sendWebPushNotification() { + _sendWebPushNotification = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee11(recipient, notification) { + var channel, myKey, shouldWebPush, _ret; + return _regeneratorRuntime().wrap(function _callee11$(_context12) { + while (1) { + switch (_context12.prev = _context12.next) { + case 0: + console.log('sending web push notification to', recipient, notification); + channel = privateState(recipient); + myKey = session.getKey(); + shouldWebPush = recipient === myKey.pub || !(channel.activity && channel.activity.isActive); + if (!(shouldWebPush && channel.webPushSubscriptions)) { + _context12.next = 9; + break; + } + return _context12.delegateYield( /*#__PURE__*/_regeneratorRuntime().mark(function _callee10() { + var subscriptions, participants, _loop, i; + return _regeneratorRuntime().wrap(function _callee10$(_context11) { + while (1) { + switch (_context11.prev = _context11.next) { + case 0: + subscriptions = []; + participants = Object.keys(channel.webPushSubscriptions); + _loop = /*#__PURE__*/_regeneratorRuntime().mark(function _loop(i) { + var participant, secret, payload; + return _regeneratorRuntime().wrap(function _loop$(_context10) { + while (1) { + switch (_context10.prev = _context10.next) { + case 0: + participant = participants[i]; + _context10.next = 3; + return channel.getSecret(participant); + case 3: + secret = _context10.sent; + _context10.next = 6; + return Key.encrypt(notification.title, secret); + case 6: + _context10.t0 = _context10.sent; + _context10.next = 9; + return Key.encrypt(notification.body, secret); + case 9: + _context10.t1 = _context10.sent; + _context10.t2 = { + pub: myKey.pub, + epub: myKey.epub + }; + payload = { + title: _context10.t0, + body: _context10.t1, + from: _context10.t2 + }; + channel.webPushSubscriptions[participant].forEach(function (s) { + if (s && s.endpoint) { + subscriptions.push({ + subscription: s, + payload: payload + }); + } + }); + case 13: + case "end": + return _context10.stop(); + } + } + }, _loop); + }); + i = 0; + case 4: + if (!(i < participants.length)) { + _context11.next = 9; + break; + } + return _context11.delegateYield(_loop(i), "t0", 6); + case 6: + i++; + _context11.next = 4; + break; + case 9: + if (!(subscriptions.length === 0)) { + _context11.next = 11; + break; + } + return _context11.abrupt("return", { + v: void 0 + }); + case 11: + fetch(NOTIFICATION_SERVICE_URL, { + method: 'POST', + body: JSON.stringify({ + subscriptions: subscriptions + }), + headers: { + 'content-type': 'application/json' + } + })["catch"](function () {}); + case 12: + case "end": + return _context11.stop(); + } + } + }, _callee10); + })(), "t0", 6); + case 6: + _ret = _context12.t0; + if (!(typeof _ret === "object")) { + _context12.next = 9; + break; + } + return _context12.abrupt("return", _ret.v); + case 9: + case "end": + return _context12.stop(); + } + } + }, _callee11); + })); + return _sendWebPushNotification.apply(this, arguments); + } + function init() { + loginTime = new Date(); + unseenMsgsTotal = 0; + } + var notifications = { + init: init, + notifyMsg: notifyMsg, + getNotificationText: getNotificationText, + sendWebPushNotification: sendWebPushNotification, + changeUnseenNotificationCount: changeUnseenNotificationCount, + subscribeToIrisNotifications: subscribeToIrisNotifications, + sendIrisNotification: sendIrisNotification, + changeChatUnseenCount: changeChatUnseenMsgsCount, + webPushSubscriptions: webPushSubscriptions, + subscribeToWebPush: subscribeToWebPush, + getWebPushSubscriptions: getWebPushSubscriptions, + removeSubscription: removeSubscription + }; + + /** + * Fuse.js v6.6.2 - Lightweight fuzzy-search (http://fusejs.io) + * + * Copyright (c) 2022 Kiro Risk (http://kiro.me) + * All Rights Reserved. Apache Software License 2.0 + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + + function isArray$1(value) { + return !Array.isArray + ? getTag(value) === '[object Array]' + : Array.isArray(value) + } + + // Adapted from: https://github.com/lodash/lodash/blob/master/.internal/baseToString.js + const INFINITY = 1 / 0; + function baseToString(value) { + // Exit early for strings to avoid a performance hit in some environments. + if (typeof value == 'string') { + return value + } + let result = value + ''; + return result == '0' && 1 / value == -INFINITY ? '-0' : result + } + + function toString$1(value) { + return value == null ? '' : baseToString(value) + } + + function isString(value) { + return typeof value === 'string' + } + + function isNumber(value) { + return typeof value === 'number' + } + + // Adapted from: https://github.com/lodash/lodash/blob/master/isBoolean.js + function isBoolean(value) { + return ( + value === true || + value === false || + (isObjectLike(value) && getTag(value) == '[object Boolean]') + ) + } + + function isObject(value) { + return typeof value === 'object' + } + + // Checks if `value` is object-like. + function isObjectLike(value) { + return isObject(value) && value !== null + } + + function isDefined(value) { + return value !== undefined && value !== null + } + + function isBlank(value) { + return !value.trim().length + } + + // Gets the `toStringTag` of `value`. + // Adapted from: https://github.com/lodash/lodash/blob/master/.internal/getTag.js + function getTag(value) { + return value == null + ? value === undefined + ? '[object Undefined]' + : '[object Null]' + : Object.prototype.toString.call(value) + } + + const EXTENDED_SEARCH_UNAVAILABLE = 'Extended search is not available'; + + const INCORRECT_INDEX_TYPE = "Incorrect 'index' type"; + + const LOGICAL_SEARCH_INVALID_QUERY_FOR_KEY = (key) => + `Invalid value for key ${key}`; + + const PATTERN_LENGTH_TOO_LARGE = (max) => + `Pattern length exceeds max of ${max}.`; + + const MISSING_KEY_PROPERTY = (name) => `Missing ${name} property in key`; + + const INVALID_KEY_WEIGHT_VALUE = (key) => + `Property 'weight' in key '${key}' must be a positive integer`; + + const hasOwn$1 = Object.prototype.hasOwnProperty; + + class KeyStore { + constructor(keys) { + this._keys = []; + this._keyMap = {}; + + let totalWeight = 0; + + keys.forEach((key) => { + let obj = createKey(key); + + totalWeight += obj.weight; + + this._keys.push(obj); + this._keyMap[obj.id] = obj; + + totalWeight += obj.weight; + }); + + // Normalize weights so that their sum is equal to 1 + this._keys.forEach((key) => { + key.weight /= totalWeight; + }); + } + get(keyId) { + return this._keyMap[keyId] + } + keys() { + return this._keys + } + toJSON() { + return JSON.stringify(this._keys) + } + } + + function createKey(key) { + let path = null; + let id = null; + let src = null; + let weight = 1; + let getFn = null; + + if (isString(key) || isArray$1(key)) { + src = key; + path = createKeyPath(key); + id = createKeyId(key); + } else { + if (!hasOwn$1.call(key, 'name')) { + throw new Error(MISSING_KEY_PROPERTY('name')) + } + + const name = key.name; + src = name; + + if (hasOwn$1.call(key, 'weight')) { + weight = key.weight; + + if (weight <= 0) { + throw new Error(INVALID_KEY_WEIGHT_VALUE(name)) + } + } + + path = createKeyPath(name); + id = createKeyId(name); + getFn = key.getFn; + } + + return { path, id, weight, src, getFn } + } + + function createKeyPath(key) { + return isArray$1(key) ? key : key.split('.') + } + + function createKeyId(key) { + return isArray$1(key) ? key.join('.') : key + } + + function get(obj, path) { + let list = []; + let arr = false; + + const deepGet = (obj, path, index) => { + if (!isDefined(obj)) { + return + } + if (!path[index]) { + // If there's no path left, we've arrived at the object we care about. + list.push(obj); + } else { + let key = path[index]; + + const value = obj[key]; + + if (!isDefined(value)) { + return + } + + // If we're at the last value in the path, and if it's a string/number/bool, + // add it to the list + if ( + index === path.length - 1 && + (isString(value) || isNumber(value) || isBoolean(value)) + ) { + list.push(toString$1(value)); + } else if (isArray$1(value)) { + arr = true; + // Search each item in the array. + for (let i = 0, len = value.length; i < len; i += 1) { + deepGet(value[i], path, index + 1); + } + } else if (path.length) { + // An object. Recurse further. + deepGet(value, path, index + 1); + } + } + }; + + // Backwards compatibility (since path used to be a string) + deepGet(obj, isString(path) ? path.split('.') : path, 0); + + return arr ? list : list[0] + } + + const MatchOptions = { + // Whether the matches should be included in the result set. When `true`, each record in the result + // set will include the indices of the matched characters. + // These can consequently be used for highlighting purposes. + includeMatches: false, + // When `true`, the matching function will continue to the end of a search pattern even if + // a perfect match has already been located in the string. + findAllMatches: false, + // Minimum number of characters that must be matched before a result is considered a match + minMatchCharLength: 1 + }; + + const BasicOptions = { + // When `true`, the algorithm continues searching to the end of the input even if a perfect + // match is found before the end of the same input. + isCaseSensitive: false, + // When true, the matching function will continue to the end of a search pattern even if + includeScore: false, + // List of properties that will be searched. This also supports nested properties. + keys: [], + // Whether to sort the result list, by score + shouldSort: true, + // Default sort function: sort by ascending score, ascending index + sortFn: (a, b) => + a.score === b.score ? (a.idx < b.idx ? -1 : 1) : a.score < b.score ? -1 : 1 + }; + + const FuzzyOptions = { + // Approximately where in the text is the pattern expected to be found? + location: 0, + // At what point does the match algorithm give up. A threshold of '0.0' requires a perfect match + // (of both letters and location), a threshold of '1.0' would match anything. + threshold: 0.6, + // Determines how close the match must be to the fuzzy location (specified above). + // An exact letter match which is 'distance' characters away from the fuzzy location + // would score as a complete mismatch. A distance of '0' requires the match be at + // the exact location specified, a threshold of '1000' would require a perfect match + // to be within 800 characters of the fuzzy location to be found using a 0.8 threshold. + distance: 100 + }; + + const AdvancedOptions = { + // When `true`, it enables the use of unix-like search commands + useExtendedSearch: false, + // The get function to use when fetching an object's properties. + // The default will search nested paths *ie foo.bar.baz* + getFn: get, + // When `true`, search will ignore `location` and `distance`, so it won't matter + // where in the string the pattern appears. + // More info: https://fusejs.io/concepts/scoring-theory.html#fuzziness-score + ignoreLocation: false, + // When `true`, the calculation for the relevance score (used for sorting) will + // ignore the field-length norm. + // More info: https://fusejs.io/concepts/scoring-theory.html#field-length-norm + ignoreFieldNorm: false, + // The weight to determine how much field length norm effects scoring. + fieldNormWeight: 1 + }; + + var Config = { + ...BasicOptions, + ...MatchOptions, + ...FuzzyOptions, + ...AdvancedOptions + }; + + const SPACE = /[^ ]+/g; + + // Field-length norm: the shorter the field, the higher the weight. + // Set to 3 decimals to reduce index size. + function norm(weight = 1, mantissa = 3) { + const cache = new Map(); + const m = Math.pow(10, mantissa); + + return { + get(value) { + const numTokens = value.match(SPACE).length; + + if (cache.has(numTokens)) { + return cache.get(numTokens) + } + + // Default function is 1/sqrt(x), weight makes that variable + const norm = 1 / Math.pow(numTokens, 0.5 * weight); + + // In place of `toFixed(mantissa)`, for faster computation + const n = parseFloat(Math.round(norm * m) / m); + + cache.set(numTokens, n); + + return n + }, + clear() { + cache.clear(); + } + } + } + + class FuseIndex { + constructor({ + getFn = Config.getFn, + fieldNormWeight = Config.fieldNormWeight + } = {}) { + this.norm = norm(fieldNormWeight, 3); + this.getFn = getFn; + this.isCreated = false; + + this.setIndexRecords(); + } + setSources(docs = []) { + this.docs = docs; + } + setIndexRecords(records = []) { + this.records = records; + } + setKeys(keys = []) { + this.keys = keys; + this._keysMap = {}; + keys.forEach((key, idx) => { + this._keysMap[key.id] = idx; + }); + } + create() { + if (this.isCreated || !this.docs.length) { + return + } + + this.isCreated = true; + + // List is Array + if (isString(this.docs[0])) { + this.docs.forEach((doc, docIndex) => { + this._addString(doc, docIndex); + }); + } else { + // List is Array + this.docs.forEach((doc, docIndex) => { + this._addObject(doc, docIndex); + }); + } + + this.norm.clear(); + } + // Adds a doc to the end of the index + add(doc) { + const idx = this.size(); + + if (isString(doc)) { + this._addString(doc, idx); + } else { + this._addObject(doc, idx); + } + } + // Removes the doc at the specified index of the index + removeAt(idx) { + this.records.splice(idx, 1); + + // Change ref index of every subsquent doc + for (let i = idx, len = this.size(); i < len; i += 1) { + this.records[i].i -= 1; + } + } + getValueForItemAtKeyId(item, keyId) { + return item[this._keysMap[keyId]] + } + size() { + return this.records.length + } + _addString(doc, docIndex) { + if (!isDefined(doc) || isBlank(doc)) { + return + } + + let record = { + v: doc, + i: docIndex, + n: this.norm.get(doc) + }; + + this.records.push(record); + } + _addObject(doc, docIndex) { + let record = { i: docIndex, $: {} }; + + // Iterate over every key (i.e, path), and fetch the value at that key + this.keys.forEach((key, keyIndex) => { + let value = key.getFn ? key.getFn(doc) : this.getFn(doc, key.path); + + if (!isDefined(value)) { + return + } + + if (isArray$1(value)) { + let subRecords = []; + const stack = [{ nestedArrIndex: -1, value }]; + + while (stack.length) { + const { nestedArrIndex, value } = stack.pop(); + + if (!isDefined(value)) { + continue + } + + if (isString(value) && !isBlank(value)) { + let subRecord = { + v: value, + i: nestedArrIndex, + n: this.norm.get(value) + }; + + subRecords.push(subRecord); + } else if (isArray$1(value)) { + value.forEach((item, k) => { + stack.push({ + nestedArrIndex: k, + value: item + }); + }); + } + } + record.$[keyIndex] = subRecords; + } else if (isString(value) && !isBlank(value)) { + let subRecord = { + v: value, + n: this.norm.get(value) + }; + + record.$[keyIndex] = subRecord; + } + }); + + this.records.push(record); + } + toJSON() { + return { + keys: this.keys, + records: this.records + } + } + } + + function createIndex( + keys, + docs, + { getFn = Config.getFn, fieldNormWeight = Config.fieldNormWeight } = {} + ) { + const myIndex = new FuseIndex({ getFn, fieldNormWeight }); + myIndex.setKeys(keys.map(createKey)); + myIndex.setSources(docs); + myIndex.create(); + return myIndex + } + + function parseIndex( + data, + { getFn = Config.getFn, fieldNormWeight = Config.fieldNormWeight } = {} + ) { + const { keys, records } = data; + const myIndex = new FuseIndex({ getFn, fieldNormWeight }); + myIndex.setKeys(keys); + myIndex.setIndexRecords(records); + return myIndex + } + + function computeScore$1( + pattern, + { + errors = 0, + currentLocation = 0, + expectedLocation = 0, + distance = Config.distance, + ignoreLocation = Config.ignoreLocation + } = {} + ) { + const accuracy = errors / pattern.length; + + if (ignoreLocation) { + return accuracy + } + + const proximity = Math.abs(expectedLocation - currentLocation); + + if (!distance) { + // Dodge divide by zero error. + return proximity ? 1.0 : accuracy + } + + return accuracy + proximity / distance + } + + function convertMaskToIndices( + matchmask = [], + minMatchCharLength = Config.minMatchCharLength + ) { + let indices = []; + let start = -1; + let end = -1; + let i = 0; + + for (let len = matchmask.length; i < len; i += 1) { + let match = matchmask[i]; + if (match && start === -1) { + start = i; + } else if (!match && start !== -1) { + end = i - 1; + if (end - start + 1 >= minMatchCharLength) { + indices.push([start, end]); + } + start = -1; + } + } + + // (i-1 - start) + 1 => i - start + if (matchmask[i - 1] && i - start >= minMatchCharLength) { + indices.push([start, i - 1]); + } + + return indices + } + + // Machine word size + const MAX_BITS = 32; + + function search( + text, + pattern, + patternAlphabet, + { + location = Config.location, + distance = Config.distance, + threshold = Config.threshold, + findAllMatches = Config.findAllMatches, + minMatchCharLength = Config.minMatchCharLength, + includeMatches = Config.includeMatches, + ignoreLocation = Config.ignoreLocation + } = {} + ) { + if (pattern.length > MAX_BITS) { + throw new Error(PATTERN_LENGTH_TOO_LARGE(MAX_BITS)) + } + + const patternLen = pattern.length; + // Set starting location at beginning text and initialize the alphabet. + const textLen = text.length; + // Handle the case when location > text.length + const expectedLocation = Math.max(0, Math.min(location, textLen)); + // Highest score beyond which we give up. + let currentThreshold = threshold; + // Is there a nearby exact match? (speedup) + let bestLocation = expectedLocation; + + // Performance: only computer matches when the minMatchCharLength > 1 + // OR if `includeMatches` is true. + const computeMatches = minMatchCharLength > 1 || includeMatches; + // A mask of the matches, used for building the indices + const matchMask = computeMatches ? Array(textLen) : []; + + let index; + + // Get all exact matches, here for speed up + while ((index = text.indexOf(pattern, bestLocation)) > -1) { + let score = computeScore$1(pattern, { + currentLocation: index, + expectedLocation, + distance, + ignoreLocation + }); + + currentThreshold = Math.min(score, currentThreshold); + bestLocation = index + patternLen; + + if (computeMatches) { + let i = 0; + while (i < patternLen) { + matchMask[index + i] = 1; + i += 1; + } + } + } + + // Reset the best location + bestLocation = -1; + + let lastBitArr = []; + let finalScore = 1; + let binMax = patternLen + textLen; + + const mask = 1 << (patternLen - 1); + + for (let i = 0; i < patternLen; i += 1) { + // Scan for the best match; each iteration allows for one more error. + // Run a binary search to determine how far from the match location we can stray + // at this error level. + let binMin = 0; + let binMid = binMax; + + while (binMin < binMid) { + const score = computeScore$1(pattern, { + errors: i, + currentLocation: expectedLocation + binMid, + expectedLocation, + distance, + ignoreLocation + }); + + if (score <= currentThreshold) { + binMin = binMid; + } else { + binMax = binMid; + } + + binMid = Math.floor((binMax - binMin) / 2 + binMin); + } + + // Use the result from this iteration as the maximum for the next. + binMax = binMid; + + let start = Math.max(1, expectedLocation - binMid + 1); + let finish = findAllMatches + ? textLen + : Math.min(expectedLocation + binMid, textLen) + patternLen; + + // Initialize the bit array + let bitArr = Array(finish + 2); + + bitArr[finish + 1] = (1 << i) - 1; + + for (let j = finish; j >= start; j -= 1) { + let currentLocation = j - 1; + let charMatch = patternAlphabet[text.charAt(currentLocation)]; + + if (computeMatches) { + // Speed up: quick bool to int conversion (i.e, `charMatch ? 1 : 0`) + matchMask[currentLocation] = +!!charMatch; + } + + // First pass: exact match + bitArr[j] = ((bitArr[j + 1] << 1) | 1) & charMatch; + + // Subsequent passes: fuzzy match + if (i) { + bitArr[j] |= + ((lastBitArr[j + 1] | lastBitArr[j]) << 1) | 1 | lastBitArr[j + 1]; + } + + if (bitArr[j] & mask) { + finalScore = computeScore$1(pattern, { + errors: i, + currentLocation, + expectedLocation, + distance, + ignoreLocation + }); + + // This match will almost certainly be better than any existing match. + // But check anyway. + if (finalScore <= currentThreshold) { + // Indeed it is + currentThreshold = finalScore; + bestLocation = currentLocation; + + // Already passed `loc`, downhill from here on in. + if (bestLocation <= expectedLocation) { + break + } + + // When passing `bestLocation`, don't exceed our current distance from `expectedLocation`. + start = Math.max(1, 2 * expectedLocation - bestLocation); + } + } + } + + // No hope for a (better) match at greater error levels. + const score = computeScore$1(pattern, { + errors: i + 1, + currentLocation: expectedLocation, + expectedLocation, + distance, + ignoreLocation + }); + + if (score > currentThreshold) { + break + } + + lastBitArr = bitArr; + } + + const result = { + isMatch: bestLocation >= 0, + // Count exact matches (those with a score of 0) to be "almost" exact + score: Math.max(0.001, finalScore) + }; + + if (computeMatches) { + const indices = convertMaskToIndices(matchMask, minMatchCharLength); + if (!indices.length) { + result.isMatch = false; + } else if (includeMatches) { + result.indices = indices; + } + } + + return result + } + + function createPatternAlphabet(pattern) { + let mask = {}; + + for (let i = 0, len = pattern.length; i < len; i += 1) { + const char = pattern.charAt(i); + mask[char] = (mask[char] || 0) | (1 << (len - i - 1)); + } + + return mask + } + + class BitapSearch { + constructor( + pattern, + { + location = Config.location, + threshold = Config.threshold, + distance = Config.distance, + includeMatches = Config.includeMatches, + findAllMatches = Config.findAllMatches, + minMatchCharLength = Config.minMatchCharLength, + isCaseSensitive = Config.isCaseSensitive, + ignoreLocation = Config.ignoreLocation + } = {} + ) { + this.options = { + location, + threshold, + distance, + includeMatches, + findAllMatches, + minMatchCharLength, + isCaseSensitive, + ignoreLocation + }; + + this.pattern = isCaseSensitive ? pattern : pattern.toLowerCase(); + + this.chunks = []; + + if (!this.pattern.length) { + return + } + + const addChunk = (pattern, startIndex) => { + this.chunks.push({ + pattern, + alphabet: createPatternAlphabet(pattern), + startIndex + }); + }; + + const len = this.pattern.length; + + if (len > MAX_BITS) { + let i = 0; + const remainder = len % MAX_BITS; + const end = len - remainder; + + while (i < end) { + addChunk(this.pattern.substr(i, MAX_BITS), i); + i += MAX_BITS; + } + + if (remainder) { + const startIndex = len - MAX_BITS; + addChunk(this.pattern.substr(startIndex), startIndex); + } + } else { + addChunk(this.pattern, 0); + } + } + + searchIn(text) { + const { isCaseSensitive, includeMatches } = this.options; + + if (!isCaseSensitive) { + text = text.toLowerCase(); + } + + // Exact match + if (this.pattern === text) { + let result = { + isMatch: true, + score: 0 + }; + + if (includeMatches) { + result.indices = [[0, text.length - 1]]; + } + + return result + } + + // Otherwise, use Bitap algorithm + const { + location, + distance, + threshold, + findAllMatches, + minMatchCharLength, + ignoreLocation + } = this.options; + + let allIndices = []; + let totalScore = 0; + let hasMatches = false; + + this.chunks.forEach(({ pattern, alphabet, startIndex }) => { + const { isMatch, score, indices } = search(text, pattern, alphabet, { + location: location + startIndex, + distance, + threshold, + findAllMatches, + minMatchCharLength, + includeMatches, + ignoreLocation + }); + + if (isMatch) { + hasMatches = true; + } + + totalScore += score; + + if (isMatch && indices) { + allIndices = [...allIndices, ...indices]; + } + }); + + let result = { + isMatch: hasMatches, + score: hasMatches ? totalScore / this.chunks.length : 1 + }; + + if (hasMatches && includeMatches) { + result.indices = allIndices; + } + + return result + } + } + + class BaseMatch { + constructor(pattern) { + this.pattern = pattern; + } + static isMultiMatch(pattern) { + return getMatch(pattern, this.multiRegex) + } + static isSingleMatch(pattern) { + return getMatch(pattern, this.singleRegex) + } + search(/*text*/) {} + } + + function getMatch(pattern, exp) { + const matches = pattern.match(exp); + return matches ? matches[1] : null + } + + // Token: 'file + + class ExactMatch extends BaseMatch { + constructor(pattern) { + super(pattern); + } + static get type() { + return 'exact' + } + static get multiRegex() { + return /^="(.*)"$/ + } + static get singleRegex() { + return /^=(.*)$/ + } + search(text) { + const isMatch = text === this.pattern; + + return { + isMatch, + score: isMatch ? 0 : 1, + indices: [0, this.pattern.length - 1] + } + } + } + + // Token: !fire + + class InverseExactMatch extends BaseMatch { + constructor(pattern) { + super(pattern); + } + static get type() { + return 'inverse-exact' + } + static get multiRegex() { + return /^!"(.*)"$/ + } + static get singleRegex() { + return /^!(.*)$/ + } + search(text) { + const index = text.indexOf(this.pattern); + const isMatch = index === -1; + + return { + isMatch, + score: isMatch ? 0 : 1, + indices: [0, text.length - 1] + } + } + } + + // Token: ^file + + class PrefixExactMatch extends BaseMatch { + constructor(pattern) { + super(pattern); + } + static get type() { + return 'prefix-exact' + } + static get multiRegex() { + return /^\^"(.*)"$/ + } + static get singleRegex() { + return /^\^(.*)$/ + } + search(text) { + const isMatch = text.startsWith(this.pattern); + + return { + isMatch, + score: isMatch ? 0 : 1, + indices: [0, this.pattern.length - 1] + } + } + } + + // Token: !^fire + + class InversePrefixExactMatch extends BaseMatch { + constructor(pattern) { + super(pattern); + } + static get type() { + return 'inverse-prefix-exact' + } + static get multiRegex() { + return /^!\^"(.*)"$/ + } + static get singleRegex() { + return /^!\^(.*)$/ + } + search(text) { + const isMatch = !text.startsWith(this.pattern); + + return { + isMatch, + score: isMatch ? 0 : 1, + indices: [0, text.length - 1] + } + } + } + + // Token: .file$ + + class SuffixExactMatch extends BaseMatch { + constructor(pattern) { + super(pattern); + } + static get type() { + return 'suffix-exact' + } + static get multiRegex() { + return /^"(.*)"\$$/ + } + static get singleRegex() { + return /^(.*)\$$/ + } + search(text) { + const isMatch = text.endsWith(this.pattern); + + return { + isMatch, + score: isMatch ? 0 : 1, + indices: [text.length - this.pattern.length, text.length - 1] + } + } + } + + // Token: !.file$ + + class InverseSuffixExactMatch extends BaseMatch { + constructor(pattern) { + super(pattern); + } + static get type() { + return 'inverse-suffix-exact' + } + static get multiRegex() { + return /^!"(.*)"\$$/ + } + static get singleRegex() { + return /^!(.*)\$$/ + } + search(text) { + const isMatch = !text.endsWith(this.pattern); + return { + isMatch, + score: isMatch ? 0 : 1, + indices: [0, text.length - 1] + } + } + } + + class FuzzyMatch extends BaseMatch { + constructor( + pattern, + { + location = Config.location, + threshold = Config.threshold, + distance = Config.distance, + includeMatches = Config.includeMatches, + findAllMatches = Config.findAllMatches, + minMatchCharLength = Config.minMatchCharLength, + isCaseSensitive = Config.isCaseSensitive, + ignoreLocation = Config.ignoreLocation + } = {} + ) { + super(pattern); + this._bitapSearch = new BitapSearch(pattern, { + location, + threshold, + distance, + includeMatches, + findAllMatches, + minMatchCharLength, + isCaseSensitive, + ignoreLocation + }); + } + static get type() { + return 'fuzzy' + } + static get multiRegex() { + return /^"(.*)"$/ + } + static get singleRegex() { + return /^(.*)$/ + } + search(text) { + return this._bitapSearch.searchIn(text) + } + } + + // Token: 'file + + class IncludeMatch extends BaseMatch { + constructor(pattern) { + super(pattern); + } + static get type() { + return 'include' + } + static get multiRegex() { + return /^'"(.*)"$/ + } + static get singleRegex() { + return /^'(.*)$/ + } + search(text) { + let location = 0; + let index; + + const indices = []; + const patternLen = this.pattern.length; + + // Get all exact matches + while ((index = text.indexOf(this.pattern, location)) > -1) { + location = index + patternLen; + indices.push([index, location - 1]); + } + + const isMatch = !!indices.length; + + return { + isMatch, + score: isMatch ? 0 : 1, + indices + } + } + } + + // ❗Order is important. DO NOT CHANGE. + const searchers = [ + ExactMatch, + IncludeMatch, + PrefixExactMatch, + InversePrefixExactMatch, + InverseSuffixExactMatch, + SuffixExactMatch, + InverseExactMatch, + FuzzyMatch + ]; + + const searchersLen = searchers.length; + + // Regex to split by spaces, but keep anything in quotes together + const SPACE_RE = / +(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)/; + const OR_TOKEN = '|'; + + // Return a 2D array representation of the query, for simpler parsing. + // Example: + // "^core go$ | rb$ | py$ xy$" => [["^core", "go$"], ["rb$"], ["py$", "xy$"]] + function parseQuery(pattern, options = {}) { + return pattern.split(OR_TOKEN).map((item) => { + let query = item + .trim() + .split(SPACE_RE) + .filter((item) => item && !!item.trim()); + + let results = []; + for (let i = 0, len = query.length; i < len; i += 1) { + const queryItem = query[i]; + + // 1. Handle multiple query match (i.e, once that are quoted, like `"hello world"`) + let found = false; + let idx = -1; + while (!found && ++idx < searchersLen) { + const searcher = searchers[idx]; + let token = searcher.isMultiMatch(queryItem); + if (token) { + results.push(new searcher(token, options)); + found = true; + } + } + + if (found) { + continue + } + + // 2. Handle single query matches (i.e, once that are *not* quoted) + idx = -1; + while (++idx < searchersLen) { + const searcher = searchers[idx]; + let token = searcher.isSingleMatch(queryItem); + if (token) { + results.push(new searcher(token, options)); + break + } + } + } + + return results + }) + } + + // These extended matchers can return an array of matches, as opposed + // to a singl match + const MultiMatchSet = new Set([FuzzyMatch.type, IncludeMatch.type]); + + /** + * Command-like searching + * ====================== + * + * Given multiple search terms delimited by spaces.e.g. `^jscript .python$ ruby !java`, + * search in a given text. + * + * Search syntax: + * + * | Token | Match type | Description | + * | ----------- | -------------------------- | -------------------------------------- | + * | `jscript` | fuzzy-match | Items that fuzzy match `jscript` | + * | `=scheme` | exact-match | Items that are `scheme` | + * | `'python` | include-match | Items that include `python` | + * | `!ruby` | inverse-exact-match | Items that do not include `ruby` | + * | `^java` | prefix-exact-match | Items that start with `java` | + * | `!^earlang` | inverse-prefix-exact-match | Items that do not start with `earlang` | + * | `.js$` | suffix-exact-match | Items that end with `.js` | + * | `!.go$` | inverse-suffix-exact-match | Items that do not end with `.go` | + * + * A single pipe character acts as an OR operator. For example, the following + * query matches entries that start with `core` and end with either`go`, `rb`, + * or`py`. + * + * ``` + * ^core go$ | rb$ | py$ + * ``` + */ + class ExtendedSearch { + constructor( + pattern, + { + isCaseSensitive = Config.isCaseSensitive, + includeMatches = Config.includeMatches, + minMatchCharLength = Config.minMatchCharLength, + ignoreLocation = Config.ignoreLocation, + findAllMatches = Config.findAllMatches, + location = Config.location, + threshold = Config.threshold, + distance = Config.distance + } = {} + ) { + this.query = null; + this.options = { + isCaseSensitive, + includeMatches, + minMatchCharLength, + findAllMatches, + ignoreLocation, + location, + threshold, + distance + }; + + this.pattern = isCaseSensitive ? pattern : pattern.toLowerCase(); + this.query = parseQuery(this.pattern, this.options); + } + + static condition(_, options) { + return options.useExtendedSearch + } + + searchIn(text) { + const query = this.query; + + if (!query) { + return { + isMatch: false, + score: 1 + } + } + + const { includeMatches, isCaseSensitive } = this.options; + + text = isCaseSensitive ? text : text.toLowerCase(); + + let numMatches = 0; + let allIndices = []; + let totalScore = 0; + + // ORs + for (let i = 0, qLen = query.length; i < qLen; i += 1) { + const searchers = query[i]; + + // Reset indices + allIndices.length = 0; + numMatches = 0; + + // ANDs + for (let j = 0, pLen = searchers.length; j < pLen; j += 1) { + const searcher = searchers[j]; + const { isMatch, indices, score } = searcher.search(text); + + if (isMatch) { + numMatches += 1; + totalScore += score; + if (includeMatches) { + const type = searcher.constructor.type; + if (MultiMatchSet.has(type)) { + allIndices = [...allIndices, ...indices]; + } else { + allIndices.push(indices); + } + } + } else { + totalScore = 0; + numMatches = 0; + allIndices.length = 0; + break + } + } + + // OR condition, so if TRUE, return + if (numMatches) { + let result = { + isMatch: true, + score: totalScore / numMatches + }; + + if (includeMatches) { + result.indices = allIndices; + } + + return result + } + } + + // Nothing was matched + return { + isMatch: false, + score: 1 + } + } + } + + const registeredSearchers = []; + + function register(...args) { + registeredSearchers.push(...args); + } + + function createSearcher(pattern, options) { + for (let i = 0, len = registeredSearchers.length; i < len; i += 1) { + let searcherClass = registeredSearchers[i]; + if (searcherClass.condition(pattern, options)) { + return new searcherClass(pattern, options) + } + } + + return new BitapSearch(pattern, options) + } + + const LogicalOperator = { + AND: '$and', + OR: '$or' + }; + + const KeyType = { + PATH: '$path', + PATTERN: '$val' + }; + + const isExpression = (query) => + !!(query[LogicalOperator.AND] || query[LogicalOperator.OR]); + + const isPath = (query) => !!query[KeyType.PATH]; + + const isLeaf = (query) => + !isArray$1(query) && isObject(query) && !isExpression(query); + + const convertToExplicit = (query) => ({ + [LogicalOperator.AND]: Object.keys(query).map((key) => ({ + [key]: query[key] + })) + }); + + // When `auto` is `true`, the parse function will infer and initialize and add + // the appropriate `Searcher` instance + function parse(query, options, { auto = true } = {}) { + const next = (query) => { + let keys = Object.keys(query); + + const isQueryPath = isPath(query); + + if (!isQueryPath && keys.length > 1 && !isExpression(query)) { + return next(convertToExplicit(query)) + } + + if (isLeaf(query)) { + const key = isQueryPath ? query[KeyType.PATH] : keys[0]; + + const pattern = isQueryPath ? query[KeyType.PATTERN] : query[key]; + + if (!isString(pattern)) { + throw new Error(LOGICAL_SEARCH_INVALID_QUERY_FOR_KEY(key)) + } + + const obj = { + keyId: createKeyId(key), + pattern + }; + + if (auto) { + obj.searcher = createSearcher(pattern, options); + } + + return obj + } + + let node = { + children: [], + operator: keys[0] + }; + + keys.forEach((key) => { + const value = query[key]; + + if (isArray$1(value)) { + value.forEach((item) => { + node.children.push(next(item)); + }); + } + }); + + return node + }; + + if (!isExpression(query)) { + query = convertToExplicit(query); + } + + return next(query) + } + + // Practical scoring function + function computeScore( + results, + { ignoreFieldNorm = Config.ignoreFieldNorm } + ) { + results.forEach((result) => { + let totalScore = 1; + + result.matches.forEach(({ key, norm, score }) => { + const weight = key ? key.weight : null; + + totalScore *= Math.pow( + score === 0 && weight ? Number.EPSILON : score, + (weight || 1) * (ignoreFieldNorm ? 1 : norm) + ); + }); + + result.score = totalScore; + }); + } + + function transformMatches(result, data) { + const matches = result.matches; + data.matches = []; + + if (!isDefined(matches)) { + return + } + + matches.forEach((match) => { + if (!isDefined(match.indices) || !match.indices.length) { + return + } + + const { indices, value } = match; + + let obj = { + indices, + value + }; + + if (match.key) { + obj.key = match.key.src; + } + + if (match.idx > -1) { + obj.refIndex = match.idx; + } + + data.matches.push(obj); + }); + } + + function transformScore(result, data) { + data.score = result.score; + } + + function format( + results, + docs, + { + includeMatches = Config.includeMatches, + includeScore = Config.includeScore + } = {} + ) { + const transformers = []; + + if (includeMatches) transformers.push(transformMatches); + if (includeScore) transformers.push(transformScore); + + return results.map((result) => { + const { idx } = result; + + const data = { + item: docs[idx], + refIndex: idx + }; + + if (transformers.length) { + transformers.forEach((transformer) => { + transformer(result, data); + }); + } + + return data + }) + } + + class Fuse { + constructor(docs, options = {}, index) { + this.options = { ...Config, ...options }; + + if ( + this.options.useExtendedSearch && + !true + ) { + throw new Error(EXTENDED_SEARCH_UNAVAILABLE) + } + + this._keyStore = new KeyStore(this.options.keys); + + this.setCollection(docs, index); + } + + setCollection(docs, index) { + this._docs = docs; + + if (index && !(index instanceof FuseIndex)) { + throw new Error(INCORRECT_INDEX_TYPE) + } + + this._myIndex = + index || + createIndex(this.options.keys, this._docs, { + getFn: this.options.getFn, + fieldNormWeight: this.options.fieldNormWeight + }); + } + + add(doc) { + if (!isDefined(doc)) { + return + } + + this._docs.push(doc); + this._myIndex.add(doc); + } + + remove(predicate = (/* doc, idx */) => false) { + const results = []; + + for (let i = 0, len = this._docs.length; i < len; i += 1) { + const doc = this._docs[i]; + if (predicate(doc, i)) { + this.removeAt(i); + i -= 1; + len -= 1; + + results.push(doc); + } + } + + return results + } + + removeAt(idx) { + this._docs.splice(idx, 1); + this._myIndex.removeAt(idx); + } + + getIndex() { + return this._myIndex + } + + search(query, { limit = -1 } = {}) { + const { + includeMatches, + includeScore, + shouldSort, + sortFn, + ignoreFieldNorm + } = this.options; + + let results = isString(query) + ? isString(this._docs[0]) + ? this._searchStringList(query) + : this._searchObjectList(query) + : this._searchLogical(query); + + computeScore(results, { ignoreFieldNorm }); + + if (shouldSort) { + results.sort(sortFn); + } + + if (isNumber(limit) && limit > -1) { + results = results.slice(0, limit); + } + + return format(results, this._docs, { + includeMatches, + includeScore + }) + } + + _searchStringList(query) { + const searcher = createSearcher(query, this.options); + const { records } = this._myIndex; + const results = []; + + // Iterate over every string in the index + records.forEach(({ v: text, i: idx, n: norm }) => { + if (!isDefined(text)) { + return + } + + const { isMatch, score, indices } = searcher.searchIn(text); + + if (isMatch) { + results.push({ + item: text, + idx, + matches: [{ score, value: text, norm, indices }] + }); + } + }); + + return results + } + + _searchLogical(query) { + + const expression = parse(query, this.options); + + const evaluate = (node, item, idx) => { + if (!node.children) { + const { keyId, searcher } = node; + + const matches = this._findMatches({ + key: this._keyStore.get(keyId), + value: this._myIndex.getValueForItemAtKeyId(item, keyId), + searcher + }); + + if (matches && matches.length) { + return [ + { + idx, + item, + matches + } + ] + } + + return [] + } + + const res = []; + for (let i = 0, len = node.children.length; i < len; i += 1) { + const child = node.children[i]; + const result = evaluate(child, item, idx); + if (result.length) { + res.push(...result); + } else if (node.operator === LogicalOperator.AND) { + return [] + } + } + return res + }; + + const records = this._myIndex.records; + const resultMap = {}; + const results = []; + + records.forEach(({ $: item, i: idx }) => { + if (isDefined(item)) { + let expResults = evaluate(expression, item, idx); + + if (expResults.length) { + // Dedupe when adding + if (!resultMap[idx]) { + resultMap[idx] = { idx, item, matches: [] }; + results.push(resultMap[idx]); + } + expResults.forEach(({ matches }) => { + resultMap[idx].matches.push(...matches); + }); + } + } + }); + + return results + } + + _searchObjectList(query) { + const searcher = createSearcher(query, this.options); + const { keys, records } = this._myIndex; + const results = []; + + // List is Array + records.forEach(({ $: item, i: idx }) => { + if (!isDefined(item)) { + return + } + + let matches = []; + + // Iterate over every key (i.e, path), and fetch the value at that key + keys.forEach((key, keyIndex) => { + matches.push( + ...this._findMatches({ + key, + value: item[keyIndex], + searcher + }) + ); + }); + + if (matches.length) { + results.push({ + idx, + item, + matches + }); + } + }); + + return results + } + _findMatches({ key, value, searcher }) { + if (!isDefined(value)) { + return [] + } + + let matches = []; + + if (isArray$1(value)) { + value.forEach(({ v: text, i: idx, n: norm }) => { + if (!isDefined(text)) { + return + } + + const { isMatch, score, indices } = searcher.searchIn(text); + + if (isMatch) { + matches.push({ + score, + key, + value: text, + idx, + norm, + indices + }); + } + }); + } else { + const { v: text, n: norm } = value; + + const { isMatch, score, indices } = searcher.searchIn(text); + + if (isMatch) { + matches.push({ score, key, value: text, norm, indices }); + } + } + + return matches + } + } + + Fuse.version = '6.6.2'; + Fuse.createIndex = createIndex; + Fuse.parseIndex = parseIndex; + Fuse.config = Config; + + { + Fuse.parseQuery = parse; + } + + { + register(ExtendedSearch); + } + + // TODO config {peers: ['http://localhost:8768/gun'], file: 'State.electron', multicast:false, localStorage: false} + var electron = util.isElectron ? /*#__PURE__*/new Node('electron').get('state') : null; + + var key; + var myName; + var latestChatLink; + var onlineTimeout; + var ourActivity; + var noFollows; + var noFollowers; + var searchIndex; + var initCalled; + var searchableItems = {}; + var getExtendedFollowsCalled = /*#__PURE__*/new Map(); + var DEFAULT_FOLLOW = 'hyECQHwSo7fgr2MVfPyakvayPeixxsaAWVtZ-vbaiSc.TXIp8MnCtrnW6n2MrYquWPcc-DTmZzMBmc2yaGv9gIU'; + var DEFAULT_SETTINGS = { + electron: { + openAtLogin: true, + minimizeOnClose: true + }, + local: { + enableWebtorrent: !util.isMobile, + enablePublicPeerDiscovery: true, + autoplayWebtorrent: true, + maxConnectedPeers: util.isElectron ? 2 : 1 + } + }; + /** + * User session management utilities. + */ + var session = { + /** + * Log in with a key from localStorage. + * + * If no key is found and options.autologin is not false, a new user will be created. + * + * If options.autofollow is not false, the default follow will be added. + * @param options + */init: function init(options) { + var _this = this; + if (options === void 0) { + options = {}; + } + if (initCalled) { + return; + } + initCalled = true; + var localStorageKey = localStorage.getItem('chatKeyPair'); + console.log('localStorageKey', localStorageKey); + if (localStorageKey) { + this.login(JSON.parse(localStorageKey)); + } else if (options.autologin !== false) { + this.loginAsNewUser(options); + } else { + this.clearIndexedDB(); + } + setTimeout(function () { + local$1().get('block').map(function () { + _this.updateSearchIndex(); + }); + _this.updateSearchIndex(); + }); + setInterval(function () { + if (_this.taskQueue.length) { + //console.log('this.taskQueue', this.taskQueue.length); + var t = _this.taskQueue.shift(); + t && t(); + } + }, 10); + }, + DEFAULT_SETTINGS: DEFAULT_SETTINGS, + DEFAULT_FOLLOW: DEFAULT_FOLLOW, + taskQueue: [], + updateSearchIndex: /*#__PURE__*/_.throttle(function () { + var options = { + keys: ['name'], + includeScore: true, + includeMatches: true, + threshold: 0.3 + }; + var values = Object.values(_.omit(searchableItems, Object.keys(blockedUsers$1()))); + searchIndex = new Fuse(values, options); + local$1().get('searchIndexUpdated').put(true); + }, 2000, { + leading: true + }), + saveSearchResult: /*#__PURE__*/_.throttle(function (k) { + local$1().get('contacts').get(k).put({ + followDistance: searchableItems[k].followDistance, + followerCount: searchableItems[k].followers.size + }); + }, 1000, { + leading: true + }), + addFollow: function addFollow(callback, k, followDistance, follower) { + if (searchableItems[k]) { + if (searchableItems[k].followDistance > followDistance) { + searchableItems[k].followDistance = followDistance; + } + follower && searchableItems[k].followers.add(follower); + } else { + searchableItems[k] = { + key: k, + followDistance: followDistance, + followers: new Set(follower && [follower]) + }; + this.taskQueue.push(function () { + publicState(k).get('profile').get('name').on(function (name) { + searchableItems[k].name = name; + local$1().get('contacts').get(k).get('name').put(name); + callback && callback(k, searchableItems[k]); + }); + }); + } + this.saveSearchResult(k); + callback && callback(k, searchableItems[k]); + this.updateSearchIndex(); + this.updateNoFollows(); + this.updateNoFollowers(); + }, + removeFollow: function removeFollow(k, followDistance, follower) { + if (followDistance === 1) { + local$1().get('contacts').get(k).put(false); + local$1().get('groups').get('follows').get(k).put(false); + if (searchableItems[k]) { + searchableItems[k].followers["delete"](follower); + this.updateNoFollows(); + this.updateNoFollowers(); + } + } + if (searchableItems[k] && searchableItems[k].followers.size === 0) { + delete searchableItems[k]; + local$1().get('contacts').get(k).put(false); + local$1().get('groups').get('everyone').get(k).put(false); + } + }, + getExtendedFollows: function getExtendedFollows(callback, k, maxDepth, currentDepth) { + var _this2 = this; + if (k === void 0) { + k = key.pub; + } + if (maxDepth === void 0) { + maxDepth = 3; + } + if (currentDepth === void 0) { + currentDepth = 1; + } + var called = getExtendedFollowsCalled.get(k); + if (called && called <= currentDepth) { + return; + } + getExtendedFollowsCalled.set(k, currentDepth); + this.addFollow(callback, k, currentDepth - 1); + publicState(k).get('follow').map(function (isFollowing, followedKey) { + if (isFollowing) { + _this2.addFollow(callback, followedKey, currentDepth, k); + if (currentDepth < maxDepth) { + _this2.taskQueue.push(function () { + return _this2.getExtendedFollows(callback, followedKey, maxDepth, currentDepth + 1); + }); + } + } else { + _this2.removeFollow(followedKey, currentDepth, k); + } + }); + return searchableItems; + }, + updateNoFollows: /*#__PURE__*/_.throttle(function () { + var v = Object.keys(searchableItems).length <= 1; + if (v !== noFollows) { + noFollows = v; + local$1().get('noFollows').put(noFollows); + } + }, 1000, { + leading: true + }), + updateNoFollowers: /*#__PURE__*/_.throttle(function () { + var v = !(searchableItems[key.pub] && searchableItems[key.pub].followers.size > 0); + if (v !== noFollowers) { + noFollowers = v; + local$1().get('noFollowers').put(noFollowers); + } + }, 1000, { + leading: true + }), + getSearchIndex: function getSearchIndex() { + return searchIndex; + }, + setOurOnlineStatus: function setOurOnlineStatus() { + var activeRoute = window.location.hash; + Channel.setActivity(ourActivity = 'active'); + var setActive = _.debounce(function () { + var chatId = activeRoute && activeRoute.replace('#/profile/', '').replace('#/chat/', ''); + var chat = privateState(chatId); + if (chat && !ourActivity) { + chat.setMyMsgsLastSeenTime(); + } + Channel.setActivity(ourActivity = 'active'); + clearTimeout(onlineTimeout); + onlineTimeout = setTimeout(function () { + return Channel.setActivity(ourActivity = 'online'); + }, 30000); + }, 1000); + document.addEventListener("touchmove", setActive); + document.addEventListener("mousemove", setActive); + document.addEventListener("keypress", setActive); + document.addEventListener("visibilitychange", function () { + if (document.visibilityState === 'visible') { + Channel.setActivity(ourActivity = 'active'); + var chatId = location.pathname.slice(1).replace('chat/', ''); + var chat = activeRoute && privateState(chatId); + if (chat) { + chat.setMyMsgsLastSeenTime(); + notifications.changeChatUnseenCount(chatId, 0); + } + } else { + Channel.setActivity(ourActivity = 'online'); + } + }); + setActive(); + window.addEventListener("beforeunload", function () { + Channel.setActivity(ourActivity = null); + }); + }, + updateGroups: function updateGroups() { + var _this3 = this; + this.getExtendedFollows(function (k, info) { + if (info.followDistance <= 1) { + local$1().get('groups').get('follows').get(k).put(true); + } + local$1().get('groups').get('everyone').get(k).put(true); + if (k === _this3.getPubKey()) { + _this3.updateNoFollowers(); + } + }); + }, + /** + * Log in with a private key. + * @param key + */login: function login(k) { + var _this4 = this; + console.log('login', k); + var shouldRefresh = !!key; + console.log('shouldRefresh', shouldRefresh, 'key', key); + key = k; + localStorage.setItem('chatKeyPair', JSON.stringify(k)); + publicState().auth(key); + publicState().put({ + epub: key.epub + }); + notifications.subscribeToWebPush(); + notifications.getWebPushSubscriptions(); + //notifications.subscribeToIrisNotifications(); + Channel.getMyChatLinks(undefined, function (chatLink) { + local$1().get('chatLinks').get(chatLink.id).put(chatLink.url); + latestChatLink = chatLink.url; + }); + this.setOurOnlineStatus(); + Channel.getChannels(function (c) { + return _this4.addChannel(c); + }); + publicState().get('profile').get('name').on(function (name) { + if (name && typeof name === 'string') { + myName = name; + } + }); + // a lot of this is iris-messenger stuff + notifications.init(); + local$1().get('loggedIn').put(true); + console.log('local().get(\'loggedIn\').put(true);', local$1()); + local$1().get('settings').once().then(function (settings) { + if (!settings) { + local$1().get('settings').put(DEFAULT_SETTINGS.local); + } else if (settings.enableWebtorrent === undefined || settings.autoplayWebtorrent === undefined) { + local$1().get('settings').get('enableWebtorrent').put(DEFAULT_SETTINGS.local.enableWebtorrent); + local$1().get('settings').get('autoplayWebtorrent').put(DEFAULT_SETTINGS.local.autoplayWebtorrent); + } + }); + publicState().get('block').map(function (isBlocked, user) { + local$1().get('block').get(user).put(isBlocked); + if (isBlocked) { + delete searchableItems[user]; + } + }); + this.updateGroups(); + if (shouldRefresh) { + location.reload(); + } + if (electron) { + electron.get('settings').on(function (electron) { + local$1().get('settings').get('electron').put(electron); + }); + electron.get('user').put(key.pub); + } + local$1().get('filters').get('group').once().then(function (v) { + if (!v) { + local$1().get('filters').get('group').put('follows'); + } + }); + }, + /** + * Create a new user account and log in. + * @param options {Object} - Options for the new account. + * @returns {Promise<*>} + */loginAsNewUser: function loginAsNewUser(options) { + var _this5 = this; + if (options === void 0) { + options = {}; + } + var name = options.name || util.generateName(); + console.log('loginAsNewUser name', name); + return Key.generate().then(function (k) { + _this5.login(k); + publicState().get('profile').put({ + a: null + }); + publicState().get('profile').get('name').put(name); + local$1().get('filters').put({ + a: null + }); + local$1().get('filters').get('group').put('follows'); + Channel.createChatLink().then(function (l) { + return latestChatLink = l; + }); + setTimeout(function () { + if (options.autofollow !== false) { + console.log('autofollowing', DEFAULT_FOLLOW); + publicState().get('follow').get(DEFAULT_FOLLOW).put(true); + } + }, 1000); // maybe wait for login return instead + }); + }, + /** + * Log out the current user. + * @returns {Promise} + */logOut: function logOut() { + var _this6 = this; + return _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() { + var reg, _reg$active, sub, hash; + return _regeneratorRuntime().wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + if (electron) { + electron.get('user').put(null); + } + // TODO: remove subscription from your channels + if (!navigator.serviceWorker) { + _context.next = 16; + break; + } + _context.next = 4; + return navigator.serviceWorker.getRegistration(); + case 4: + reg = _context.sent; + if (!(reg && reg.pushManager)) { + _context.next = 16; + break; + } + (_reg$active = reg.active) == null ? void 0 : _reg$active.postMessage({ + key: null + }); + _context.next = 9; + return reg.pushManager.getSubscription(); + case 9: + sub = _context.sent; + if (!sub) { + _context.next = 16; + break; + } + _context.next = 13; + return util.getHash(JSON.stringify(sub)); + case 13: + hash = _context.sent; + notifications.removeSubscription(hash); + sub.unsubscribe && sub.unsubscribe(); + case 16: + _this6.clearIndexedDB(); + localStorage.clear(); // TODO clear only iris data + window.location.hash = ''; + window.location.href = '/'; + location.reload(); + case 21: + case "end": + return _context.stop(); + } + } + }, _callee); + }))(); + }, + clearIndexedDB: function clearIndexedDB() { + return new Promise(function (resolve) { + var r1 = window.indexedDB.deleteDatabase('local()'); + var r2 = window.indexedDB.deleteDatabase('radata'); + var r1done = false; + var r2done = false; + var check = function check() { + r1done && r2done && resolve(undefined); + }; + r1.onerror = r2.onerror = function (e) { + return console.error(e); + }; + //r1.onblocked = r2.onblocked = e => console.error('blocked', e); + r1.onsuccess = function () { + r1done = true; + check(); + }; + r2.onsuccess = function () { + r2done = true; + check(); + }; + }); + }, + getMyChatLink: function getMyChatLink() { + return latestChatLink || util.getProfileLink(key.pub); + }, + /** + * Get the keypair of the logged in user. + * @returns {*} + */getKey: function getKey() { + return key; + }, + /** + * Get the public key of the logged in user. + * @returns {*} + */getPubKey: function getPubKey() { + return key && key.pub; + }, + /** + * Get the name of the logged in user. + * @returns {*} + */getMyName: function getMyName() { + return myName; + }, + myPeerUrl: function myPeerUrl(ip) { + return "http://" + ip + ":8767/gun"; + }, + shareMyPeerUrl: function shareMyPeerUrl(channel) { + var _this7 = this; + return _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2() { + var myIp; + return _regeneratorRuntime().wrap(function _callee2$(_context2) { + while (1) { + switch (_context2.prev = _context2.next) { + case 0: + _context2.next = 2; + return local$1().get('settings').get('electron').get('publicIp').once(); + case 2: + myIp = _context2.sent; + myIp && channel.put && channel.put('my_peer', _this7.myPeerUrl(myIp)); + case 4: + case "end": + return _context2.stop(); + } + } + }, _callee2); + }))(); + }, + newChannel: function newChannel(pub, chatLink) { + if (!pub || this.channelIds.has(pub)) { + return; + } + var chat = privateState(pub, chatLink); + this.addChannel(chat); + return chat; + }, + addChannel: function addChannel(chat) { + var _this8 = this; + this.taskQueue.push(function () { + var pub = chat.getId(); + if (_this8.channelIds.has(pub)) { + return; + } + _this8.channelIds.add(pub); + var chatNode = local$1().get('channels').get(pub); + chatNode.get('latestTime').on(function (t) { + if (t && (!chat.latestTime || t > chat.latestTime)) { + chat.latestTime = t; + } + }); + chatNode.get('theirMsgsLastSeenTime').on(function (t) { + if (!t) { + return; + } + var d = new Date(t); + if (!chat.theirMsgsLastSeenDate || chat.theirMsgsLastSeenDate < d) { + chat.theirMsgsLastSeenDate = d; + } + }); + chat.getLatestMsg && chat.getLatestMsg(function (latest, info) { + _this8.processMessage(pub, latest, info); + }); + notifications.changeChatUnseenCount(pub, 0); + chat.notificationSetting = 'all'; + chat.onMy('notificationSetting', function (val) { + chat.notificationSetting = val; + }); + //$(".chat-list").append(el); + chat.theirMsgsLastSeenTime = ''; + chat.getTheirMsgsLastSeenTime(function (time) { + if (chat && time && time >= chat.theirMsgsLastSeenTime) { + chat.theirMsgsLastSeenTime = time; + chatNode.get('theirMsgsLastSeenTime').put(time); + } + }); + chat.getMyMsgsLastSeenTime(function (time) { + chat.myLastSeenTime = new Date(time); + if (chat.latest && chat.myLastSeenTime >= chat.latest.time) { + notifications.changeChatUnseenCount(pub, 0); + } + }); + chat.isTyping = false; + chat.getTyping(function (isTyping) { + chat.isTyping = isTyping; + local$1().get('channels').get(pub).get('isTyping').put(isTyping); + }); + chat.online = {}; + Channel.getActivity(pub, function (activity) { + if (chat) { + chatNode.put({ + theirLastActiveTime: activity && activity.lastActive, + activity: activity && activity.isActive && activity.status + }); + chat.activity = activity; + } + }); + if (chat.uuid) { + var isDarkMode = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches; + chat.participantProfiles = {}; + chat.on('name', function (v) { + chat.name = v; + searchableItems[chat.uuid] = { + name: v, + uuid: chat.uuid + }; + local$1().get('channels').get(chat.uuid).get('name').put(v); + }); + chat.on('photo', function (v) { + searchableItems[chat.uuid] = searchableItems[chat.uuid] || {}; + searchableItems[chat.uuid].photo = v; + local$1().get('channels').get(chat.uuid).get('photo').put(v); + }); + chat.on('about', function (v) { + return local$1().get('channels').get(chat.uuid).get('about').put(v); + }); + chat.getParticipants(function (participants) { + delete participants.undefined; // TODO fix where it comes from + if (typeof participants === 'object') { + var keys = Object.keys(participants); + keys.forEach(function (k, i) { + var hue = 360 / Math.max(keys.length, 2) * i; // TODO use css filter brightness + chat.participantProfiles[k] = { + permissions: participants[k], + color: "hsl(" + hue + ", 98%, " + (isDarkMode ? 80 : 33) + "%)" + }; + publicState(k).get('profile').get('name').on(function (name) { + chat.participantProfiles[k].name = name; + }); + }); + } + local$1().get('channels').get(chat.uuid).get('participants').put(participants); + }); + chat.inviteLinks = {}; + chat.getChatLinks({ + callback: function callback(_ref) { + var url = _ref.url, + id = _ref.id; + console.log('got chat link', id, url); + chat.inviteLinks[id] = url; // TODO use State + local$1().get('inviteLinksChanged').put(true); + } + }); + } else { + // TODO do we want this? + publicState(pub).get('profile').get('name').on(function (v) { + return local$1().get('channels').get(pub).get('name').put(v); + }); + } + if (chat.put) { + chat.onTheir('webPushSubscriptions', function (s, k, from) { + if (!Array.isArray(s)) { + return; + } + chat.webPushSubscriptions = chat.webPushSubscriptions || {}; + chat.webPushSubscriptions[from || pub] = s; + }); + var arr = Object.values(notifications.webPushSubscriptions); + setTimeout(function () { + return chat.put('webPushSubscriptions', arr); + }, 5000); + _this8.shareMyPeerUrl(chat); + } + chat.onTheir('call', function (call) { + local$1().get('call').put({ + pub: pub, + call: call + }); + }); + local$1().get('channels').get(pub).put({ + enabled: true + }); + /* Disable private peer discovery, since they're not connecting anyway + if (chat.onTheir) { + chat.onTheir('my_peer', (url, k, from) => { + console.log('Got private peer url', url, 'from', from); + peers.addPeer({url, from}) + }); + } + */ + }); + }, + // TODO: should perhaps be in Channel + processMessage: function processMessage(chatId, msg, info, onClickNotification) { + var chat = privateState(chatId); + chat.messageIds = chat.messageIds || {}; + if (chat.messageIds[msg.time + info.from]) return; + chat.messageIds[msg.time + info.from] = true; + if (info) { + msg = Object.assign(msg, info); + } + if (msg.invite) { + var chatLink = "https://iris.to/?channelId=" + msg.invite.group + "&inviter=" + chatId; + this.newChannel(msg.invite.group, chatLink); + return; + } + msg.selfAuthored = info.selfAuthored; + local$1().get('channels').get(chatId).get('msgs').get(msg.time + (msg.from && msg.from.slice(0, 10))).put(JSON.stringify(msg)); + msg.timeObj = new Date(msg.time); + if (!info.selfAuthored && msg.timeObj > chat.myLastSeenTime) { + if (window.location.hash !== "#/chat/" + chatId || document.visibilityState !== 'visible') { + notifications.changeChatUnseenCount(chatId, 1); + } else if (ourActivity === 'active') { + chat.setMyMsgsLastSeenTime(); + } + } + if (!info.selfAuthored && msg.time > chat.theirMsgsLastSeenTime) { + local$1().get('channels').get(chatId).get('theirMsgsLastSeenTime').put(msg.time); + } + if (!chat.latestTime || msg.time > chat.latestTime) { + local$1().get('channels').get(chatId).put({ + latestTime: msg.time, + latest: { + time: msg.time, + text: msg.text, + selfAuthored: info.selfAuthored + } + }); + } + // TODO: onclickNotification should do route(`/chat/${ pub}`); + notifications.notifyMsg(msg, info, chatId, onClickNotification); + }, + subscribeToMsgs: function subscribeToMsgs(pub) { + var _this9 = this; + var c = privateState(pub); + if (c.subscribed) { + return; + } + c.subscribed = true; + c.getMessages(function (msg, info) { + _this9.processMessage(pub, msg, info); + }); + }, + /** + * Known private channels with other users + */ + channelIds: /*#__PURE__*/new Set() + }; + + /** + * Content-addressed storage + */ + var staticState = { + /** + * Get a file identified by its hash + * @param hash + * @param callback + * @returns {Promise} + */get: function get(hash, callback) { + return new Promise(function (resolve, reject) { + if (!hash) { + reject('No hash provided'); + } + if (typeof hash !== 'string') { + reject('Hash must be a string'); + } + global$1().get('#').get(hash).on(function (v, _k, _x, e) { + if (v) { + e.off(); + callback && callback(v); + resolve(v); + } + }); + }); + }, + /** + * Store a file and return its hash + * @param value + * @returns {Promise} + */put: function put(value) { + return _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() { + var hash; + return _regeneratorRuntime().wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + _context.next = 2; + return util.getHash(value); + case 2: + hash = _context.sent; + global$1().get('#').get(hash).put(value); + return _context.abrupt("return", hash); + case 5: + case "end": + return _context.stop(); + } + } + }, _callee); + }))(); + } + }; + + var errorMsg = "Invalid message:"; + var ValidationError = /*#__PURE__*/function (_Error) { + _inheritsLoose(ValidationError, _Error); + function ValidationError() { + return _Error.apply(this, arguments) || this; + } + return ValidationError; + }( /*#__PURE__*/_wrapNativeSuper(Error)); /** + * Signed message object. Your friends can index and relay your messages, while others can still verify that they were signed by you. + * + * Fields: signedData, signer (public key) and signature. + * + * signedData has an author, signer, type, time and optionally other fields. + * + * signature covers the utf8 string representation of signedData. Since messages are digitally signed, users only need to care about the message signer and not who relayed it or whose index it was found from. + * + * signer is the entity that verified its origin. In other words: message author and signer can be different entities, and only the signer needs to use Iris. + * + * For example, a crawler can import and sign other people's messages from Twitter. Only the users who trust the crawler will see the messages. + * + * Constructor: creates a message from the param obj.signedData that must contain at least the mandatory fields: author, type and time. + * @param obj + * + */ + var SignedMessage = /*#__PURE__*/function () { + function SignedMessage(obj) { + this.signedData = obj.signedData; + this.pubKey = obj.pubKey; + if (obj.sig) { + if (typeof obj.sig !== "string") { + throw new ValidationError("SignedMessage signature must be a string"); + } + this.sig = obj.sig; + this.getHash(); + } + this._validate(); + } + var _proto = SignedMessage.prototype; + _proto.getSignerKeyID = function getSignerKeyID() { + return this.pubKey; // hack until gun supports keyID lookups + //return util.getHash(this.pubKey); + }; + _proto._validate = function _validate() { + if (!this.signedData) { + throw new ValidationError(errorMsg + " Missing signedData"); + } + if (typeof this.signedData !== "object") { + throw new ValidationError(errorMsg + " signedData must be an object"); + } + var d = this.signedData; + if (!d.type) { + throw new ValidationError(errorMsg + " Missing type definition"); + } + if (!d.author) { + throw new ValidationError(errorMsg + " Missing author"); + } + if (typeof d.author !== "object") { + throw new ValidationError(errorMsg + " Author must be object"); + } + if (Array.isArray(d.author)) { + throw new ValidationError(errorMsg + " Author must not be an array"); + } + if (Object.keys(d.author).length === 0) { + throw new ValidationError(errorMsg + " Author empty"); + } + if (this.pubKey) { + this.signerKeyHash = this.getSignerKeyID(); + } + for (var attr in d.author) { + var t = typeof d.author[attr]; + if (t !== "string") { + if (Array.isArray(d.author[attr])) { + for (var i = 0; i < d.author[attr].length; i++) { + if (typeof d.author[attr][i] !== "string") { + throw new ValidationError(errorMsg + " Author attribute must be string, got " + attr + ": [" + d.author[attr][i] + "]"); + } + if (d.author[attr][i].length === 0) { + throw new ValidationError(errorMsg + " author " + attr + " in array[" + i + "] is empty"); + } + } + } else { + throw new ValidationError(errorMsg + " Author attribute must be string or array, got " + attr + ": " + d.author[attr]); + } + } + if (attr === "keyID") { + if (t !== "string") { + throw new ValidationError(errorMsg + " Author keyID must be string, got " + t); + } + if (this.signerKeyHash && d.author[attr] !== this.signerKeyHash) { + throw new ValidationError(errorMsg + " If message has a keyID author, it must be signed by the same key"); + } + } + } + if (d.recipient) { + if (typeof d.recipient !== "object") { + throw new ValidationError(errorMsg + " Recipient must be object"); + } + if (Array.isArray(d.recipient)) { + throw new ValidationError(errorMsg + " Recipient must not be an array"); + } + if (Object.keys(d.recipient).length === 0) { + throw new ValidationError(errorMsg + " Recipient empty"); + } + for (var _attr in d.recipient) { + var _t = typeof d.recipient[_attr]; + if (_t !== "string") { + if (Array.isArray(d.recipient[_attr])) { + for (var _i = 0; _i < d.recipient[_attr].length; _i++) { + if (typeof d.recipient[_attr][_i] !== "string") { + throw new ValidationError(errorMsg + " Recipient attribute must be string, got " + _attr + ": [" + d.recipient[_attr][_i] + "]"); + } + if (d.recipient[_attr][_i].length === 0) { + throw new ValidationError(errorMsg + " recipient " + _attr + " in array[" + _i + "] is empty"); + } + } + } else { + throw new ValidationError(errorMsg + " Recipient attribute must be string or array, got " + _attr + ": " + d.recipient[_attr]); + } + } + } + } + if (!(d.time || d.timestamp)) { + throw new ValidationError(errorMsg + " Missing time field"); + } + if (!Date.parse(d.time || d.timestamp)) { + throw new ValidationError(errorMsg + " Invalid time field"); + } + return true; + } + /** + * @param {Object} key keypair to sign the message with + */; + _proto.sign = + /*#__PURE__*/ + function () { + var _sign = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(key) { + return _regeneratorRuntime().wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + _context.next = 2; + return Key.sign(this.signedData, key); + case 2: + this.sig = _context.sent; + this.pubKey = key.pub; + _context.next = 6; + return this.getHash(); + case 6: + return _context.abrupt("return", true); + case 7: + case "end": + return _context.stop(); + } + } + }, _callee, this); + })); + function sign(_x) { + return _sign.apply(this, arguments); + } + return sign; + }() /** + * Create an iris message. SignedMessage time is automatically set. If signingKey is specified and author omitted, signingKey will be used as author. + * @param {Object} signedData message data object including author, recipient and other possible attributes + * @param {Object} signingKey optionally, you can set the key to sign the message with + * @returns {Promise} message + */; + SignedMessage.create = + /*#__PURE__*/ + function () { + var _create = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(signedData, signingKey) { + var m; + return _regeneratorRuntime().wrap(function _callee2$(_context2) { + while (1) { + switch (_context2.prev = _context2.next) { + case 0: + if (!signedData.author && signingKey) { + signedData.author = { + keyID: Key.getId(signingKey) + }; + } + signedData.time = signedData.time || new Date().toISOString(); + m = new SignedMessage({ + signedData: signedData + }); + if (!signingKey) { + _context2.next = 6; + break; + } + _context2.next = 6; + return m.sign(signingKey); + case 6: + return _context2.abrupt("return", m); + case 7: + case "end": + return _context2.stop(); + } + } + }, _callee2); + })); + function create(_x2, _x3) { + return _create.apply(this, arguments); + } + return create; + }(); + _proto.getAuthor = function getAuthor(index) { + for (var _iterator = _createForOfIteratorHelperLoose(this.getAuthorIterable()), _step; !(_step = _iterator()).done;) { + var a = _step.value; + if (a.isUniqueType()) { + return index.getContacts(a); + } + } + }; + _proto.getRecipient = function getRecipient(index) { + if (!this.signedData.recipient) { + return undefined; + } + for (var _iterator2 = _createForOfIteratorHelperLoose(this.getRecipientIterable()), _step2; !(_step2 = _iterator2()).done;) { + var a = _step2.value; + if (a.isUniqueType()) { + return index.getContacts(a); + } + } + } + /** + * @returns {string} base64 sha256 hash of message + */; + _proto.getHash = + /*#__PURE__*/ + function () { + var _getHash = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3() { + return _regeneratorRuntime().wrap(function _callee3$(_context3) { + while (1) { + switch (_context3.prev = _context3.next) { + case 0: + if (!(this.sig && !this.hash)) { + _context3.next = 4; + break; + } + _context3.next = 3; + return util.getHash(this.sig); + case 3: + this.hash = _context3.sent; + case 4: + return _context3.abrupt("return", this.hash); + case 5: + case "end": + return _context3.stop(); + } + } + }, _callee3, this); + })); + function getHash() { + return _getHash.apply(this, arguments); + } + return getHash; + }(); + _proto.getId = function getId() { + return this.getHash(); + }; + SignedMessage.fromSig = /*#__PURE__*/function () { + var _fromSig = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee4(obj) { + var signedData, o; + return _regeneratorRuntime().wrap(function _callee4$(_context4) { + while (1) { + switch (_context4.prev = _context4.next) { + case 0: + if (obj.sig) { + _context4.next = 2; + break; + } + throw new Error("Missing signature in object:", obj); + case 2: + if (obj.pubKey) { + _context4.next = 4; + break; + } + throw new Error("Missing pubKey in object:"); + case 4: + //const signedData = await Key.verify(obj.sig, obj.pubKey); // disable sig verification while migrating to new gun :( + signedData = JSON.parse(obj.sig.slice(4)).m; + o = { + signedData: signedData, + sig: obj.sig, + pubKey: obj.pubKey + }; + return _context4.abrupt("return", new SignedMessage(o)); + case 7: + case "end": + return _context4.stop(); + } + } + }, _callee4); + })); + function fromSig(_x4) { + return _fromSig.apply(this, arguments); + } + return fromSig; + }() /** + * @return {boolean} true if message signature is valid. Otherwise throws ValidationError. + */; + _proto.verify = + /*#__PURE__*/ + function () { + var _verify = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee5() { + return _regeneratorRuntime().wrap(function _callee5$(_context5) { + while (1) { + switch (_context5.prev = _context5.next) { + case 0: + if (this.pubKey) { + _context5.next = 2; + break; + } + throw new ValidationError(errorMsg + " SignedMessage has no .pubKey"); + case 2: + if (this.sig) { + _context5.next = 4; + break; + } + throw new ValidationError(errorMsg + " SignedMessage has no .sig"); + case 4: + _context5.next = 6; + return Key.verify(this.sig, this.pubKey); + case 6: + this.signedData = _context5.sent; + if (this.signedData) { + _context5.next = 9; + break; + } + throw new ValidationError(errorMsg + " Invalid signature"); + case 9: + if (!this.hash) { + _context5.next = 18; + break; + } + _context5.t0 = this.hash; + _context5.next = 13; + return util.getHash(this.sig); + case 13: + _context5.t1 = _context5.sent; + if (!(_context5.t0 !== _context5.t1)) { + _context5.next = 16; + break; + } + throw new ValidationError(errorMsg + " Invalid message hash"); + case 16: + _context5.next = 19; + break; + case 18: + this.getHash(); + case 19: + return _context5.abrupt("return", true); + case 20: + case "end": + return _context5.stop(); + } + } + }, _callee5, this); + })); + function verify() { + return _verify.apply(this, arguments); + } + return verify; + }() /** + * @returns {string} + */; + _proto.serialize = function serialize() { + return { + sig: this.sig, + pubKey: this.pubKey + }; + }; + _proto.toString = function toString() { + return JSON.stringify(this.serialize()); + } + /** + * @returns {Promise} + */; + SignedMessage.deserialize = + /*#__PURE__*/ + function () { + var _deserialize = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee6(s) { + return _regeneratorRuntime().wrap(function _callee6$(_context6) { + while (1) { + switch (_context6.prev = _context6.next) { + case 0: + return _context6.abrupt("return", SignedMessage.fromSig(s)); + case 1: + case "end": + return _context6.stop(); + } + } + }, _callee6); + })); + function deserialize(_x5) { + return _deserialize.apply(this, arguments); + } + return deserialize; + }(); + SignedMessage.fromString = /*#__PURE__*/function () { + var _fromString = /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee7(s) { + return _regeneratorRuntime().wrap(function _callee7$(_context7) { + while (1) { + switch (_context7.prev = _context7.next) { + case 0: + return _context7.abrupt("return", SignedMessage.fromSig(JSON.parse(s))); + case 1: + case "end": + return _context7.stop(); + } + } + }, _callee7); + })); + function fromString(_x6) { + return _fromString.apply(this, arguments); + } + return fromString; + }(); + return SignedMessage; + }(); + + /*eslint no-useless-escape: "off", camelcase: "off" */ + var index = { + local: local$1, + global: global$1, + group: group, + "public": publicState, + "private": privateState, + "static": staticState, + electron: electron, + peers: peers, + session: session, + util: util, + notifications: notifications, + SignedMessage: SignedMessage, + Channel: Channel, + Node: Node, + Key: Key + }; + + exports.default = index; + + Object.defineProperty(exports, '__esModule', { value: true }); }))); //# sourceMappingURL=iris.umd.development.js.map diff --git a/dist/iris.umd.development.js.map b/dist/iris.umd.development.js.map index 32f192c..39f16b6 100644 --- a/dist/iris.umd.development.js.map +++ b/dist/iris.umd.development.js.map @@ -1 +1 @@ -{"version":3,"file":"iris.umd.development.js","sources":["../node_modules/gun/lib/yson.js","../node_modules/gun/gun.js","../node_modules/gun/lib/serve.js","../node_modules/gun/lib/radix.js","../node_modules/gun/lib/radmigtmp.js","../node_modules/gun/lib/radisk.js","../node_modules/gun/lib/store.js","../node_modules/gun/lib/rfs.js","../node_modules/gun/lib/rfsmix.js","../node_modules/gun/lib/rs3.js","../node_modules/ws/lib/constants.js","../node_modules/ws/lib/buffer-util.js","../node_modules/ws/lib/limiter.js","../node_modules/ws/lib/permessage-deflate.js","../node_modules/ws/lib/validation.js","../node_modules/ws/lib/receiver.js","../node_modules/ws/lib/sender.js","../node_modules/ws/lib/event-target.js","../node_modules/ws/lib/extension.js","../node_modules/ws/lib/websocket.js","../node_modules/ws/lib/stream.js","../node_modules/ws/lib/websocket-server.js","../node_modules/ws/index.js","../node_modules/gun/lib/wire.js","../node_modules/gun/sea.js","../node_modules/gun/lib/axe.js","../node_modules/gun/axe.js","../node_modules/gun/lib/multicast.js","../node_modules/gun/lib/stats.js","../node_modules/gun/lib/server.js","../node_modules/gun/index.js","../src/lodash.ts","../src/util.ts","../node_modules/gun/lib/rindexed.js","../src/peers.ts","../src/global.ts","../src/Attribute.ts","../src/public.ts","../src/Channel.ts","../src/private.ts","../node_modules/localforage/dist/localforage.js","../src/Node.ts","../src/local.ts","../src/blockedUsers.ts","../src/group.ts","../src/notifications.ts","../node_modules/fuse.js/dist/fuse.esm.js","../src/electron.ts","../src/session.ts","../src/static.ts","../src/Key.ts","../src/SignedMessage.ts","../src/index.ts"],"sourcesContent":[";(function(){\n// JSON: JavaScript Object Notation\n// YSON: Yielding javaScript Object Notation\nvar yson = {}, u, sI = setTimeout.turn || (typeof setImmediate != ''+u && setImmediate) || setTimeout;\n\nyson.parseAsync = function(text, done, revive, M){\n\tif('string' != typeof text){ try{ done(u,JSON.parse(text)) }catch(e){ done(e) } return }\n\tvar ctx = {i: 0, text: text, done: done, l: text.length, up: []};\n\t//M = 1024 * 1024 * 100;\n\t//M = M || 1024 * 64;\n\tM = M || 1024 * 32;\n\tparse();\n\tfunction parse(){\n\t\t//var S = +new Date;\n\t\tvar s = ctx.text;\n\t\tvar i = ctx.i, l = ctx.l, j = 0;\n\t\tvar w = ctx.w, b, tmp;\n\t\twhile(j++ < M){\n\t\t\tvar c = s[i++];\n\t\t\tif(i > l){\n\t\t\t\tctx.end = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif(w){\n\t\t\t\ti = s.indexOf('\"', i-1); c = s[i];\n\t\t\t\ttmp = 0; while('\\\\' == s[i-(++tmp)]){}; tmp = !(tmp % 2);//tmp = ('\\\\' == s[i-1]); // json is stupid\n\t\t\t\tb = b || tmp;\n\t\t\t\tif('\"' == c && !tmp){\n\t\t\t\t\tw = u;\n\t\t\t\t\ttmp = ctx.s;\n\t\t\t\t\tif(ctx.a){\n\t\t\t\t\t\ttmp = s.slice(ctx.sl, i);\n\t\t\t\t\t\tif(b || (1+tmp.indexOf('\\\\'))){ tmp = JSON.parse('\"'+tmp+'\"') } // escape + unicode :( handling\n\t\t\t\t\t\tif(ctx.at instanceof Array){\n\t\t\t\t\t\t\tctx.at.push(ctx.s = tmp);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tif(!ctx.at){ ctx.end = j = M; tmp = u }\n\t\t\t\t\t\t\t(ctx.at||{})[ctx.s] = ctx.s = tmp;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tctx.s = u;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tctx.s = s.slice(ctx.sl, i);\n\t\t\t\t\t\tif(b || (1+ctx.s.indexOf('\\\\'))){ ctx.s = JSON.parse('\"'+ctx.s+'\"'); } // escape + unicode :( handling\n\t\t\t\t\t}\n\t\t\t\t\tctx.a = b = u;\n\t\t\t\t}\n\t\t\t\t++i;\n\t\t\t} else {\n\t\t\t\tswitch(c){\n\t\t\t\tcase '\"':\n\t\t\t\t\tctx.sl = i;\n\t\t\t\t\tw = true;\n\t\t\t\t\tbreak;\n\t\t\t\tcase ':':\n\t\t\t\t\tctx.ai = i;\n\t\t\t\t\tctx.a = true;\n\t\t\t\t\tbreak;\n\t\t\t\tcase ',':\n\t\t\t\t\tif(ctx.a || ctx.at instanceof Array){\n\t\t\t\t\t\tif(tmp = s.slice(ctx.ai, i-1)){\n\t\t\t\t\t\t\tif(u !== (tmp = value(tmp))){\n\t\t\t\t\t\t\t\tif(ctx.at instanceof Array){\n\t\t\t\t\t\t\t\t\tctx.at.push(tmp);\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tctx.at[ctx.s] = tmp;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tctx.a = u;\n\t\t\t\t\tif(ctx.at instanceof Array){\n\t\t\t\t\t\tctx.a = true;\n\t\t\t\t\t\tctx.ai = i;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase '{':\n\t\t\t\t\tctx.up.push(ctx.at||(ctx.at = {}));\n\t\t\t\t\tif(ctx.at instanceof Array){\n\t\t\t\t\t\tctx.at.push(ctx.at = {});\n\t\t\t\t\t} else\n\t\t\t\t\tif(u !== (tmp = ctx.s)){\n\t\t\t\t\t\tctx.at[tmp] = ctx.at = {};\n\t\t\t\t\t}\n\t\t\t\t\tctx.a = u;\n\t\t\t\t\tbreak;\n\t\t\t\tcase '}':\n\t\t\t\t\tif(ctx.a){\n\t\t\t\t\t\tif(tmp = s.slice(ctx.ai, i-1)){\n\t\t\t\t\t\t\tif(u !== (tmp = value(tmp))){\n\t\t\t\t\t\t\t\tif(ctx.at instanceof Array){\n\t\t\t\t\t\t\t\t\tctx.at.push(tmp);\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tif(!ctx.at){ ctx.end = j = M; tmp = u }\n\t\t\t\t\t\t\t\t\t(ctx.at||{})[ctx.s] = tmp;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tctx.a = u;\n\t\t\t\t\tctx.at = ctx.up.pop();\n\t\t\t\t\tbreak;\n\t\t\t\tcase '[':\n\t\t\t\t\tif(u !== (tmp = ctx.s)){\n\t\t\t\t\t\tctx.up.push(ctx.at);\n\t\t\t\t\t\tctx.at[tmp] = ctx.at = [];\n\t\t\t\t\t} else\n\t\t\t\t\tif(!ctx.at){\n\t\t\t\t\t\tctx.up.push(ctx.at = []);\n\t\t\t\t\t}\n\t\t\t\t\tctx.a = true;\n\t\t\t\t\tctx.ai = i;\n\t\t\t\t\tbreak;\n\t\t\t\tcase ']':\n\t\t\t\t\tif(ctx.a){\n\t\t\t\t\t\tif(tmp = s.slice(ctx.ai, i-1)){\n\t\t\t\t\t\t\tif(u !== (tmp = value(tmp))){\n\t\t\t\t\t\t\t\tif(ctx.at instanceof Array){\n\t\t\t\t\t\t\t\t\tctx.at.push(tmp);\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tctx.at[ctx.s] = tmp;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tctx.a = u;\n\t\t\t\t\tctx.at = ctx.up.pop();\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tctx.s = u;\n\t\tctx.i = i;\n\t\tctx.w = w;\n\t\tif(ctx.end){\n\t\t\ttmp = ctx.at;\n\t\t\tif(u === tmp){\n\t\t\t\ttry{ tmp = JSON.parse(text)\n\t\t\t\t}catch(e){ return ctx.done(e) }\n\t\t\t}\n\t\t\tctx.done(u, tmp);\n\t\t} else {\n\t\t\tsI(parse);\n\t\t}\n\t}\n}\nfunction value(s){\n\tvar n = parseFloat(s);\n\tif(!isNaN(n)){\n\t\treturn n;\n\t}\n\ts = s.trim();\n\tif('true' == s){\n\t\treturn true;\n\t}\n\tif('false' == s){\n\t\treturn false;\n\t}\n\tif('null' == s){\n\t\treturn null;\n\t}\n}\n\nyson.stringifyAsync = function(data, done, replacer, space, ctx){\n\t//try{done(u, JSON.stringify(data, replacer, space))}catch(e){done(e)}return;\n\tctx = ctx || {};\n\tctx.text = ctx.text || \"\";\n\tctx.up = [ctx.at = {d: data}];\n\tctx.done = done;\n\tctx.i = 0;\n\tvar j = 0;\n\tify();\n\tfunction ify(){\n\t\tvar at = ctx.at, data = at.d, add = '', tmp;\n\t\tif(at.i && (at.i - at.j) > 0){ add += ',' }\n\t\tif(u !== (tmp = at.k)){ add += JSON.stringify(tmp) + ':' } //'\"'+tmp+'\":' } // only if backslash\n\t\tswitch(typeof data){\n\t\tcase 'boolean':\n\t\t\tadd += ''+data;\n\t\t\tbreak;\n\t\tcase 'string':\n\t\t\tadd += JSON.stringify(data); //ctx.text += '\"'+data+'\"';//JSON.stringify(data); // only if backslash\n\t\t\tbreak;\n\t\tcase 'number':\n\t\t\tadd += (isNaN(data)? 'null' : data);\n\t\t\tbreak;\n\t\tcase 'object':\n\t\t\tif(!data){\n\t\t\t\tadd += 'null';\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif(data instanceof Array){\t\n\t\t\t\tadd += '[';\n\t\t\t\tat = {i: -1, as: data, up: at, j: 0};\n\t\t\t\tat.l = data.length;\n\t\t\t\tctx.up.push(ctx.at = at);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif('function' != typeof (data||'').toJSON){\n\t\t\t\tadd += '{';\n\t\t\t\tat = {i: -1, ok: Object.keys(data).sort(), as: data, up: at, j: 0};\n\t\t\t\tat.l = at.ok.length;\n\t\t\t\tctx.up.push(ctx.at = at);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif(tmp = data.toJSON()){\n\t\t\t\tadd += tmp;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t// let this & below pass into default case...\n\t\tcase 'function':\n\t\t\tif(at.as instanceof Array){\n\t\t\t\tadd += 'null';\n\t\t\t\tbreak;\n\t\t\t}\n\t\tdefault: // handle wrongly added leading `,` if previous item not JSON-able.\n\t\t\tadd = '';\n\t\t\tat.j++;\n\t\t}\n\t\tctx.text += add;\n\t\twhile(1+at.i >= at.l){\n\t\t\tctx.text += (at.ok? '}' : ']');\n\t\t\tat = ctx.at = at.up;\n\t\t}\n\t\tif(++at.i < at.l){\n\t\t\tif(tmp = at.ok){\n\t\t\t\tat.d = at.as[at.k = tmp[at.i]];\n\t\t\t} else {\n\t\t\t\tat.d = at.as[at.i];\n\t\t\t}\n\t\t\tif(++j < 9){ return ify() } else { j = 0 }\n\t\t\tsI(ify);\n\t\t\treturn;\n\t\t}\n\t\tctx.done(u, ctx.text);\n\t}\n}\nif(typeof window != ''+u){ window.YSON = yson }\ntry{ if(typeof module != ''+u){ module.exports = yson } }catch(e){}\nif(typeof JSON != ''+u){\n\tJSON.parseAsync = yson.parseAsync;\n\tJSON.stringifyAsync = yson.stringifyAsync;\n}\n\n}());",";(function(){\n\n /* UNBUILD */\n function USE(arg, req){\n return req? require(arg) : arg.slice? USE[R(arg)] : function(mod, path){\n arg(mod = {exports: {}});\n USE[R(path)] = mod.exports;\n }\n function R(p){\n return p.split('/').slice(-1).toString().replace('.js','');\n }\n }\n if(typeof module !== \"undefined\"){ var MODULE = module }\n /* UNBUILD */\n\n\t;USE(function(module){\n\t\t// Shim for generic javascript utilities.\n\t\tString.random = function(l, c){\n\t\t\tvar s = '';\n\t\t\tl = l || 24; // you are not going to make a 0 length random number, so no need to check type\n\t\t\tc = c || '0123456789ABCDEFGHIJKLMNOPQRSTUVWXZabcdefghijklmnopqrstuvwxyz';\n\t\t\twhile(l-- > 0){ s += c.charAt(Math.floor(Math.random() * c.length)) }\n\t\t\treturn s;\n\t\t}\n\t\tString.match = function(t, o){ var tmp, u;\n\t\t\tif('string' !== typeof t){ return false }\n\t\t\tif('string' == typeof o){ o = {'=': o} }\n\t\t\to = o || {};\n\t\t\ttmp = (o['='] || o['*'] || o['>'] || o['<']);\n\t\t\tif(t === tmp){ return true }\n\t\t\tif(u !== o['=']){ return false }\n\t\t\ttmp = (o['*'] || o['>']);\n\t\t\tif(t.slice(0, (tmp||'').length) === tmp){ return true }\n\t\t\tif(u !== o['*']){ return false }\n\t\t\tif(u !== o['>'] && u !== o['<']){\n\t\t\t\treturn (t >= o['>'] && t <= o['<'])? true : false;\n\t\t\t}\n\t\t\tif(u !== o['>'] && t >= o['>']){ return true }\n\t\t\tif(u !== o['<'] && t <= o['<']){ return true }\n\t\t\treturn false;\n\t\t}\n\t\tString.hash = function(s, c){ // via SO\n\t\t\tif(typeof s !== 'string'){ return }\n\t c = c || 0; // CPU schedule hashing by\n\t if(!s.length){ return c }\n\t for(var i=0,l=s.length,n; i= (check.now() - l)) && c++ < 3333){ f(); return }\n\t\t\t\tsI(function(){ l = check.now(); f() },c=0)\n\t\t\t}\n\t\t}());\n\t\t;(function(){ // Too many polls block, this \"threads\" them in turns over a single thread in time.\n\t\t\tvar sT = setTimeout, t = sT.turn = sT.turn || function(f){ 1 == s.push(f) && p(T) }\n\t\t\t, s = t.s = [], p = sT.poll, i = 0, f, T = function(){\n\t\t\t\tif(f = s[i++]){ f() }\n\t\t\t\tif(i == s.length || 99 == i){\n\t\t\t\t\ts = t.s = s.slice(i);\n\t\t\t\t\ti = 0;\n\t\t\t\t}\n\t\t\t\tif(s.length){ p(T) }\n\t\t\t}\n\t\t}());\n\t\t;(function(){\n\t\t\tvar u, sT = setTimeout, T = sT.turn;\n\t\t\t(sT.each = sT.each || function(l,f,e,S){ S = S || 9; (function t(s,L,r){\n\t\t\t if(L = (s = (l||[]).splice(0,S)).length){\n\t\t\t \tfor(var i = 0; i < L; i++){\n\t\t\t \t\tif(u !== (r = f(s[i]))){ break }\n\t\t\t \t}\n\t\t\t \tif(u === r){ T(t); return }\n\t\t\t } e && e(r);\n\t\t\t}())})();\n\t\t}());\n\t})(USE, './shim');\n\n\t;USE(function(module){\n\t\t// On event emitter generic javascript utility.\n\t\tmodule.exports = function onto(tag, arg, as){\n\t\t\tif(!tag){ return {to: onto} }\n\t\t\tvar u, f = 'function' == typeof arg, tag = (this.tag || (this.tag = {}))[tag] || f && (\n\t\t\t\tthis.tag[tag] = {tag: tag, to: onto._ = { next: function(arg){ var tmp;\n\t\t\t\t\tif(tmp = this.to){ tmp.next(arg) }\n\t\t\t}}});\n\t\t\tif(f){\n\t\t\t\tvar be = {\n\t\t\t\t\toff: onto.off ||\n\t\t\t\t\t(onto.off = function(){\n\t\t\t\t\t\tif(this.next === onto._.next){ return !0 }\n\t\t\t\t\t\tif(this === this.the.last){\n\t\t\t\t\t\t\tthis.the.last = this.back;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.to.back = this.back;\n\t\t\t\t\t\tthis.next = onto._.next;\n\t\t\t\t\t\tthis.back.to = this.to;\n\t\t\t\t\t\tif(this.the.last === this.the){\n\t\t\t\t\t\t\tdelete this.on.tag[this.the.tag];\n\t\t\t\t\t\t}\n\t\t\t\t\t}),\n\t\t\t\t\tto: onto._,\n\t\t\t\t\tnext: arg,\n\t\t\t\t\tthe: tag,\n\t\t\t\t\ton: this,\n\t\t\t\t\tas: as,\n\t\t\t\t};\n\t\t\t\t(be.back = tag.last || tag).to = be;\n\t\t\t\treturn tag.last = be;\n\t\t\t}\n\t\t\tif((tag = tag.to) && u !== arg){ tag.next(arg) }\n\t\t\treturn tag;\n\t\t};\n\t})(USE, './onto');\n\n\t;USE(function(module){\n\t\t// Valid values are a subset of JSON: null, binary, number (!Infinity), text,\n\t\t// or a soul relation. Arrays need special algorithms to handle concurrency,\n\t\t// so they are not supported directly. Use an extension that supports them if\n\t\t// needed but research their problems first.\n\t\tmodule.exports = function (v) {\n\t\t // \"deletes\", nulling out keys.\n\t\t return v === null ||\n\t\t\t\"string\" === typeof v ||\n\t\t\t\"boolean\" === typeof v ||\n\t\t\t// we want +/- Infinity to be, but JSON does not support it, sad face.\n\t\t\t// can you guess what v === v checks for? ;)\n\t\t\t(\"number\" === typeof v && v != Infinity && v != -Infinity && v === v) ||\n\t\t\t(!!v && \"string\" == typeof v[\"#\"] && Object.keys(v).length === 1 && v[\"#\"]);\n\t\t}\n\t})(USE, './valid');\n\n\t;USE(function(module){\n\t\tUSE('./shim');\n\t\tfunction State(){\n\t\t\tvar t = +new Date;\n\t\t\tif(last < t){\n\t\t\t\treturn N = 0, last = t + State.drift;\n\t\t\t}\n\t\t\treturn last = t + ((N += 1) / D) + State.drift;\n\t\t}\n\t\tState.drift = 0;\n\t\tvar NI = -Infinity, N = 0, D = 999, last = NI, u; // WARNING! In the future, on machines that are D times faster than 2016AD machines, you will want to increase D by another several orders of magnitude so the processing speed never out paces the decimal resolution (increasing an integer effects the state accuracy).\n\t\tState.is = function(n, k, o){ // convenience function to get the state on a key on a node and return it.\n\t\t\tvar tmp = (k && n && n._ && n._['>']) || o;\n\t\t\tif(!tmp){ return }\n\t\t\treturn ('number' == typeof (tmp = tmp[k]))? tmp : NI;\n\t\t}\n\t\tState.ify = function(n, k, s, v, soul){ // put a key's state on a node.\n\t\t\t(n = n || {})._ = n._ || {}; // safety check or init.\n\t\t\tif(soul){ n._['#'] = soul } // set a soul if specified.\n\t\t\tvar tmp = n._['>'] || (n._['>'] = {}); // grab the states data.\n\t\t\tif(u !== k && k !== '_'){\n\t\t\t\tif('number' == typeof s){ tmp[k] = s } // add the valid state.\n\t\t\t\tif(u !== v){ n[k] = v } // Note: Not its job to check for valid values!\n\t\t\t}\n\t\t\treturn n;\n\t\t}\n\t\tmodule.exports = State;\n\t})(USE, './state');\n\n\t;USE(function(module){\n\t\tUSE('./shim');\n\t\tfunction Dup(opt){\n\t\t\tvar dup = {s:{}}, s = dup.s;\n\t\t\topt = opt || {max: 999, age: 1000 * 9};//*/ 1000 * 9 * 3};\n\t\t\tdup.check = function(id){\n\t\t\t\tif(!s[id]){ return false }\n\t\t\t\treturn dt(id);\n\t\t\t}\n\t\t\tvar dt = dup.track = function(id){\n\t\t\t\tvar it = s[id] || (s[id] = {});\n\t\t\t\tit.was = dup.now = +new Date;\n\t\t\t\tif(!dup.to){ dup.to = setTimeout(dup.drop, opt.age + 9) }\n\t\t\t\tif(dt.ed){ dt.ed(id) }\n\t\t\t\treturn it;\n\t\t\t}\n\t\t\tdup.drop = function(age){\n\t\t\t\tdup.to = null;\n\t\t\t\tdup.now = +new Date;\n\t\t\t\tvar l = Object.keys(s);\n\t\t\t\tconsole.STAT && console.STAT(dup.now, +new Date - dup.now, 'dup drop keys'); // prev ~20% CPU 7% RAM 300MB // now ~25% CPU 7% RAM 500MB\n\t\t\t\tsetTimeout.each(l, function(id){ var it = s[id]; // TODO: .keys( is slow?\n\t\t\t\t\tif(it && (age || opt.age) > (dup.now - it.was)){ return }\n\t\t\t\t\tdelete s[id];\n\t\t\t\t},0,99);\n\t\t\t}\n\t\t\treturn dup;\n\t\t}\n\t\tmodule.exports = Dup;\n\t})(USE, './dup');\n\n\t;USE(function(module){\n\t\t// request / response module, for asking and acking messages.\n\t\tUSE('./onto'); // depends upon onto!\n\t\tmodule.exports = function ask(cb, as){\n\t\t\tif(!this.on){ return }\n\t\t\tvar lack = (this.opt||{}).lack || 9000;\n\t\t\tif(!('function' == typeof cb)){\n\t\t\t\tif(!cb){ return }\n\t\t\t\tvar id = cb['#'] || cb, tmp = (this.tag||'')[id];\n\t\t\t\tif(!tmp){ return }\n\t\t\t\tif(as){\n\t\t\t\t\ttmp = this.on(id, as);\n\t\t\t\t\tclearTimeout(tmp.err);\n\t\t\t\t\ttmp.err = setTimeout(function(){ tmp.off() }, lack);\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tvar id = (as && as['#']) || random(9);\n\t\t\tif(!cb){ return id }\n\t\t\tvar to = this.on(id, cb, as);\n\t\t\tto.err = to.err || setTimeout(function(){ to.off();\n\t\t\t\tto.next({err: \"Error: No ACK yet.\", lack: true});\n\t\t\t}, lack);\n\t\t\treturn id;\n\t\t}\n\t\tvar random = String.random || function(){ return Math.random().toString(36).slice(2) }\n\t})(USE, './ask');\n\n\t;USE(function(module){\n\n\t\tfunction Gun(o){\n\t\t\tif(o instanceof Gun){ return (this._ = {$: this}).$ }\n\t\t\tif(!(this instanceof Gun)){ return new Gun(o) }\n\t\t\treturn Gun.create(this._ = {$: this, opt: o});\n\t\t}\n\n\t\tGun.is = function($){ return ($ instanceof Gun) || ($ && $._ && ($ === $._.$)) || false }\n\n\t\tGun.version = 0.2020;\n\n\t\tGun.chain = Gun.prototype;\n\t\tGun.chain.toJSON = function(){};\n\n\t\tUSE('./shim');\n\t\tGun.valid = USE('./valid');\n\t\tGun.state = USE('./state');\n\t\tGun.on = USE('./onto');\n\t\tGun.dup = USE('./dup');\n\t\tGun.ask = USE('./ask');\n\n\t\t;(function(){\n\t\t\tGun.create = function(at){\n\t\t\t\tat.root = at.root || at;\n\t\t\t\tat.graph = at.graph || {};\n\t\t\t\tat.on = at.on || Gun.on;\n\t\t\t\tat.ask = at.ask || Gun.ask;\n\t\t\t\tat.dup = at.dup || Gun.dup();\n\t\t\t\tvar gun = at.$.opt(at.opt);\n\t\t\t\tif(!at.once){\n\t\t\t\t\tat.on('in', universe, at);\n\t\t\t\t\tat.on('out', universe, at);\n\t\t\t\t\tat.on('put', map, at);\n\t\t\t\t\tGun.on('create', at);\n\t\t\t\t\tat.on('create', at);\n\t\t\t\t}\n\t\t\t\tat.once = 1;\n\t\t\t\treturn gun;\n\t\t\t}\n\t\t\tfunction universe(msg){\n\t\t\t\t// TODO: BUG! msg.out = null being set!\n\t\t\t\t//if(!F){ var eve = this; setTimeout(function(){ universe.call(eve, msg,1) },Math.random() * 100);return; } // ADD F TO PARAMS!\n\t\t\t\tif(!msg){ return }\n\t\t\t\tif(msg.out === universe){ this.to.next(msg); return }\n\t\t\t\tvar eve = this, as = eve.as, at = as.at || as, gun = at.$, dup = at.dup, tmp, DBG = msg.DBG;\n\t\t\t\t(tmp = msg['#']) || (tmp = msg['#'] = text_rand(9));\n\t\t\t\tif(dup.check(tmp)){ return } dup.track(tmp);\n\t\t\t\ttmp = msg._; msg._ = ('function' == typeof tmp)? tmp : function(){};\n\t\t\t\t(msg.$ && (msg.$ === (msg.$._||'').$)) || (msg.$ = gun);\n\t\t\t\tif(msg['@'] && !msg.put){ ack(msg) }\n\t\t\t\tif(!at.ask(msg['@'], msg)){ // is this machine listening for an ack?\n\t\t\t\t\tDBG && (DBG.u = +new Date);\n\t\t\t\t\tif(msg.put){ put(msg); return } else\n\t\t\t\t\tif(msg.get){ Gun.on.get(msg, gun) }\n\t\t\t\t}\n\t\t\t\tDBG && (DBG.uc = +new Date);\n\t\t\t\teve.to.next(msg);\n\t\t\t\tDBG && (DBG.ua = +new Date);\n\t\t\t\tif(msg.nts || msg.NTS){ return } // TODO: This shouldn't be in core, but fast way to prevent NTS spread. Delete this line after all peers have upgraded to newer versions.\n\t\t\t\tmsg.out = universe; at.on('out', msg);\n\t\t\t\tDBG && (DBG.ue = +new Date);\n\t\t\t}\n\t\t\tfunction put(msg){\n\t\t\t\tif(!msg){ return }\n\t\t\t\tvar ctx = msg._||'', root = ctx.root = ((ctx.$ = msg.$||'')._||'').root;\n\t\t\t\tif(msg['@'] && ctx.faith && !ctx.miss){ // TODO: AXE may split/route based on 'put' what should we do here? Detect @ in AXE? I think we don't have to worry, as DAM will route it on @.\n\t\t\t\t\tmsg.out = universe;\n\t\t\t\t\troot.on('out', msg);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tctx.latch = root.hatch; ctx.match = root.hatch = [];\n\t\t\t\tvar put = msg.put;\n\t\t\t\tvar DBG = ctx.DBG = msg.DBG, S = +new Date; CT = CT || S;\n\t\t\t\tif(put['#'] && put['.']){ /*root && root.on('put', msg);*/ return } // TODO: BUG! This needs to call HAM instead.\n\t\t\t\tDBG && (DBG.p = S);\n\t\t\t\tctx['#'] = msg['#'];\n\t\t\t\tctx.msg = msg;\n\t\t\t\tctx.all = 0;\n\t\t\t\tctx.stun = 1;\n\t\t\t\tvar nl = Object.keys(put);//.sort(); // TODO: This is unbounded operation, large graphs will be slower. Write our own CPU scheduled sort? Or somehow do it in below? Keys itself is not O(1) either, create ES5 shim over ?weak map? or custom which is constant.\n\t\t\t\tconsole.STAT && console.STAT(S, ((DBG||ctx).pk = +new Date) - S, 'put sort');\n\t\t\t\tvar ni = 0, nj, kl, soul, node, states, err, tmp;\n\t\t\t\t(function pop(o){\n\t\t\t\t\tif(nj != ni){ nj = ni;\n\t\t\t\t\t\tif(!(soul = nl[ni])){\n\t\t\t\t\t\t\tconsole.STAT && console.STAT(S, ((DBG||ctx).pd = +new Date) - S, 'put');\n\t\t\t\t\t\t\tfire(ctx);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(!(node = put[soul])){ err = ERR+cut(soul)+\"no node.\" } else\n\t\t\t\t\t\tif(!(tmp = node._)){ err = ERR+cut(soul)+\"no meta.\" } else\n\t\t\t\t\t\tif(soul !== tmp['#']){ err = ERR+cut(soul)+\"soul not same.\" } else\n\t\t\t\t\t\tif(!(states = tmp['>'])){ err = ERR+cut(soul)+\"no state.\" }\n\t\t\t\t\t\tkl = Object.keys(node||{}); // TODO: .keys( is slow\n\t\t\t\t\t}\n\t\t\t\t\tif(err){\n\t\t\t\t\t\tmsg.err = ctx.err = err; // invalid data should error and stun the message.\n\t\t\t\t\t\tfire(ctx);\n\t\t\t\t\t\t//console.log(\"handle error!\", err) // handle!\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tvar i = 0, key; o = o || 0;\n\t\t\t\t\twhile(o++ < 9 && (key = kl[i++])){\n\t\t\t\t\t\tif('_' === key){ continue }\n\t\t\t\t\t\tvar val = node[key], state = states[key];\n\t\t\t\t\t\tif(u === state){ err = ERR+cut(key)+\"on\"+cut(soul)+\"no state.\"; break }\n\t\t\t\t\t\tif(!valid(val)){ err = ERR+cut(key)+\"on\"+cut(soul)+\"bad \"+(typeof val)+cut(val); break }\n\t\t\t\t\t\t//ctx.all++; //ctx.ack[soul+key] = '';\n\t\t\t\t\t\tham(val, key, soul, state, msg);\n\t\t\t\t\t\t++C; // courtesy count;\n\t\t\t\t\t}\n\t\t\t\t\tif((kl = kl.slice(i)).length){ turn(pop); return }\n\t\t\t\t\t++ni; kl = null; pop(o);\n\t\t\t\t}());\n\t\t\t} Gun.on.put = put;\n\t\t\t// TODO: MARK!!! clock below, reconnect sync, SEA certify wire merge, User.auth taking multiple times, // msg put, put, say ack, hear loop...\n\t\t\t// WASIS BUG! local peer not ack. .off other people: .open\n\t\t\tfunction ham(val, key, soul, state, msg){\n\t\t\t\tvar ctx = msg._||'', root = ctx.root, graph = root.graph, lot, tmp;\n\t\t\t\tvar vertex = graph[soul] || empty, was = state_is(vertex, key, 1), known = vertex[key];\n\t\t\t\t\n\t\t\t\tvar DBG = ctx.DBG; if(tmp = console.STAT){ if(!graph[soul] || !known){ tmp.has = (tmp.has || 0) + 1 } }\n\n\t\t\t\tvar now = State(), u;\n\t\t\t\tif(state > now){\n\t\t\t\t\tsetTimeout(function(){ ham(val, key, soul, state, msg) }, (tmp = state - now) > MD? MD : tmp); // Max Defer 32bit. :(\n\t\t\t\t\tconsole.STAT && console.STAT(((DBG||ctx).Hf = +new Date), tmp, 'future');\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif(state < was){ /*old;*/ if(true || !ctx.miss){ return } } // but some chains have a cache miss that need to re-fire. // TODO: Improve in future. // for AXE this would reduce rebroadcast, but GUN does it on message forwarding. // TURNS OUT CACHE MISS WAS NOT NEEDED FOR NEW CHAINS ANYMORE!!! DANGER DANGER DANGER, ALWAYS RETURN! (or am I missing something?)\n\t\t\t\tif(!ctx.faith){ // TODO: BUG? Can this be used for cache miss as well? // Yes this was a bug, need to check cache miss for RAD tests, but should we care about the faith check now? Probably not.\n\t\t\t\t\tif(state === was && (val === known || L(val) <= L(known))){ /*console.log(\"same\");*/ /*same;*/ if(!ctx.miss){ return } } // same\n\t\t\t\t}\n\t\t\t\tctx.stun++; // TODO: 'forget' feature in SEA tied to this, bad approach, but hacked in for now. Any changes here must update there.\n\t\t\t\tvar aid = msg['#']+ctx.all++, id = {toString: function(){ return aid }, _: ctx}; id.toJSON = id.toString; // this *trick* makes it compatible between old & new versions.\n\t\t\t\troot.dup.track(id)['#'] = msg['#']; // fixes new OK acks for RPC like RTC.\n\t\t\t\tDBG && (DBG.ph = DBG.ph || +new Date);\n\t\t\t\troot.on('put', {'#': id, '@': msg['@'], put: {'#': soul, '.': key, ':': val, '>': state}, ok: msg.ok, _: ctx});\n\t\t\t}\n\t\t\tfunction map(msg){\n\t\t\t\tvar DBG; if(DBG = (msg._||'').DBG){ DBG.pa = +new Date; DBG.pm = DBG.pm || +new Date}\n \tvar eve = this, root = eve.as, graph = root.graph, ctx = msg._, put = msg.put, soul = put['#'], key = put['.'], val = put[':'], state = put['>'], id = msg['#'], tmp;\n \tif((tmp = ctx.msg) && (tmp = tmp.put) && (tmp = tmp[soul])){ state_ify(tmp, key, state, val, soul) } // necessary! or else out messages do not get SEA transforms.\n \t//var bytes = ((graph[soul]||'')[key]||'').length||1;\n\t\t\t\tgraph[soul] = state_ify(graph[soul], key, state, val, soul);\n\t\t\t\tif(tmp = (root.next||'')[soul]){\n\t\t\t\t\t//tmp.bytes = (tmp.bytes||0) + ((val||'').length||1) - bytes;\n\t\t\t\t\t//if(tmp.bytes > 2**13){ Gun.log.once('byte-limit', \"Note: In the future, GUN peers will enforce a ~4KB query limit. Please see https://gun.eco/docs/Page\") }\n\t\t\t\t\ttmp.on('in', msg)\n\t\t\t\t}\n\t\t\t\tfire(ctx);\n\t\t\t\teve.to.next(msg);\n\t\t\t}\n\t\t\tfunction fire(ctx, msg){ var root;\n\t\t\t\tif(ctx.stop){ return }\n\t\t\t\tif(!ctx.err && 0 < --ctx.stun){ return } // TODO: 'forget' feature in SEA tied to this, bad approach, but hacked in for now. Any changes here must update there.\n\t\t\t\tctx.stop = 1;\n\t\t\t\tif(!(root = ctx.root)){ return }\n\t\t\t\tvar tmp = ctx.match; tmp.end = 1;\n\t\t\t\tif(tmp === root.hatch){ if(!(tmp = ctx.latch) || tmp.end){ delete root.hatch } else { root.hatch = tmp } }\n\t\t\t\tctx.hatch && ctx.hatch(); // TODO: rename/rework how put & this interact.\n\t\t\t\tsetTimeout.each(ctx.match, function(cb){cb && cb()}); \n\t\t\t\tif(!(msg = ctx.msg) || ctx.err || msg.err){ return }\n\t\t\t\tmsg.out = universe;\n\t\t\t\tctx.root.on('out', msg);\n\n\t\t\t\tCF(); // courtesy check;\n\t\t\t}\n\t\t\tfunction ack(msg){ // aggregate ACKs.\n\t\t\t\tvar id = msg['@'] || '', ctx, ok, tmp;\n\t\t\t\tif(!(ctx = id._)){\n\t\t\t\t\tvar dup = (dup = msg.$) && (dup = dup._) && (dup = dup.root) && (dup = dup.dup);\n\t\t\t\t\tif(!(dup = dup.check(id))){ return }\n\t\t\t\t\tmsg['@'] = dup['#'] || msg['@']; // This doesn't do anything anymore, backtrack it to something else?\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tctx.acks = (ctx.acks||0) + 1;\n\t\t\t\tif(ctx.err = msg.err){\n\t\t\t\t\tmsg['@'] = ctx['#'];\n\t\t\t\t\tfire(ctx); // TODO: BUG? How it skips/stops propagation of msg if any 1 item is error, this would assume a whole batch/resync has same malicious intent.\n\t\t\t\t}\n\t\t\t\tctx.ok = msg.ok || ctx.ok;\n\t\t\t\tif(!ctx.stop && !ctx.crack){ ctx.crack = ctx.match && ctx.match.push(function(){back(ctx)}) } // handle synchronous acks. NOTE: If a storage peer ACKs synchronously then the PUT loop has not even counted up how many items need to be processed, so ctx.STOP flags this and adds only 1 callback to the end of the PUT loop.\n\t\t\t\tback(ctx);\n\t\t\t}\n\t\t\tfunction back(ctx){\n\t\t\t\tif(!ctx || !ctx.root){ return }\n\t\t\t\tif(ctx.stun || ctx.acks !== ctx.all){ return }\n\t\t\t\tctx.root.on('in', {'@': ctx['#'], err: ctx.err, ok: ctx.err? u : ctx.ok || {'':1}});\n\t\t\t}\n\n\t\t\tvar ERR = \"Error: Invalid graph!\";\n\t\t\tvar cut = function(s){ return \" '\"+(''+s).slice(0,9)+\"...' \" }\n\t\t\tvar L = JSON.stringify, MD = 2147483647, State = Gun.state;\n\t\t\tvar C = 0, CT, CF = function(){if(C>999 && (C/-(CT - (CT = +new Date))>1)){Gun.window && console.log(\"Warning: You're syncing 1K+ records a second, faster than DOM can update - consider limiting query.\");CF=function(){C=0}}};\n\n\t\t}());\n\n\t\t;(function(){\n\t\t\tGun.on.get = function(msg, gun){\n\t\t\t\tvar root = gun._, get = msg.get, soul = get['#'], node = root.graph[soul], has = get['.'];\n\t\t\t\tvar next = root.next || (root.next = {}), at = next[soul];\n\n\t\t\t\t// TODO: Azarattum bug, what is in graph is not same as what is in next. Fix!\n\n\t\t\t\t// queue concurrent GETs?\n\t\t\t\t// TODO: consider tagging original message into dup for DAM.\n\t\t\t\t// TODO: ^ above? In chat app, 12 messages resulted in same peer asking for `#user.pub` 12 times. (same with #user GET too, yipes!) // DAM note: This also resulted in 12 replies from 1 peer which all had same ##hash but none of them deduped because each get was different.\n\t\t\t\t// TODO: Moving quick hacks fixing these things to axe for now.\n\t\t\t\t// TODO: a lot of GET #foo then GET #foo.\"\" happening, why?\n\t\t\t\t// TODO: DAM's ## hash check, on same get ACK, producing multiple replies still, maybe JSON vs YSON?\n\t\t\t\t// TMP note for now: viMZq1slG was chat LEX query #.\n\t\t\t\t/*if(gun !== (tmp = msg.$) && (tmp = (tmp||'')._)){\n\t\t\t\t\tif(tmp.Q){ tmp.Q[msg['#']] = ''; return } // chain does not need to ask for it again.\n\t\t\t\t\ttmp.Q = {};\n\t\t\t\t}*/\n\t\t\t\t/*if(u === has){\n\t\t\t\t\tif(at.Q){\n\t\t\t\t\t\t//at.Q[msg['#']] = '';\n\t\t\t\t\t\t//return;\n\t\t\t\t\t}\n\t\t\t\t\tat.Q = {};\n\t\t\t\t}*/\n\t\t\t\tvar ctx = msg._||{}, DBG = ctx.DBG = msg.DBG;\n\t\t\t\tDBG && (DBG.g = +new Date);\n\t\t\t\t//console.log(\"GET:\", get, node, has);\n\t\t\t\tif(!node){ return root.on('get', msg) }\n\t\t\t\tif(has){\n\t\t\t\t\tif('string' != typeof has || u === node[has]){\n\t\t\t\t\t\tif(!((at||'').next||'')[has]){ root.on('get', msg); return }\n\t\t\t\t\t}\n\t\t\t\t\tnode = state_ify({}, has, state_is(node, has), node[has], soul);\n\t\t\t\t\t// If we have a key in-memory, do we really need to fetch?\n\t\t\t\t\t// Maybe... in case the in-memory key we have is a local write\n\t\t\t\t\t// we still need to trigger a pull/merge from peers.\n\t\t\t\t}\n\t\t\t\t//Gun.window? Gun.obj.copy(node) : node; // HNPERF: If !browser bump Performance? Is this too dangerous to reference root graph? Copy / shallow copy too expensive for big nodes. Gun.obj.to(node); // 1 layer deep copy // Gun.obj.copy(node); // too slow on big nodes\n\t\t\t\tnode && ack(msg, node);\n\t\t\t\troot.on('get', msg); // send GET to storage adapters.\n\t\t\t}\n\t\t\tfunction ack(msg, node){\n\t\t\t\tvar S = +new Date, ctx = msg._||{}, DBG = ctx.DBG = msg.DBG;\n\t\t\t\tvar to = msg['#'], id = text_rand(9), keys = Object.keys(node||'').sort(), soul = ((node||'')._||'')['#'], kl = keys.length, j = 0, root = msg.$._.root, F = (node === root.graph[soul]);\n\t\t\t\tconsole.STAT && console.STAT(S, ((DBG||ctx).gk = +new Date) - S, 'got keys');\n\t\t\t\t// PERF: Consider commenting this out to force disk-only reads for perf testing? // TODO: .keys( is slow\n\t\t\t\tnode && (function go(){\n\t\t\t\t\tS = +new Date;\n\t\t\t\t\tvar i = 0, k, put = {}, tmp;\n\t\t\t\t\twhile(i < 9 && (k = keys[i++])){\n\t\t\t\t\t\tstate_ify(put, k, state_is(node, k), node[k], soul);\n\t\t\t\t\t}\n\t\t\t\t\tkeys = keys.slice(i);\n\t\t\t\t\t(tmp = {})[soul] = put; put = tmp;\n\t\t\t\t\tvar faith; if(F){ faith = function(){}; faith.ram = faith.faith = true; } // HNPERF: We're testing performance improvement by skipping going through security again, but this should be audited.\n\t\t\t\t\ttmp = keys.length;\n\t\t\t\t\tconsole.STAT && console.STAT(S, -(S - (S = +new Date)), 'got copied some');\n\t\t\t\t\tDBG && (DBG.ga = +new Date);\n\t\t\t\t\troot.on('in', {'@': to, '#': id, put: put, '%': (tmp? (id = text_rand(9)) : u), $: root.$, _: faith, DBG: DBG, FOO: 1});\n\t\t\t\t\tconsole.STAT && console.STAT(S, +new Date - S, 'got in');\n\t\t\t\t\tif(!tmp){ return }\n\t\t\t\t\tsetTimeout.turn(go);\n\t\t\t\t}());\n\t\t\t\tif(!node){ root.on('in', {'@': msg['#']}) } // TODO: I don't think I like this, the default lS adapter uses this but \"not found\" is a sensitive issue, so should probably be handled more carefully/individually.\n\t\t\t} Gun.on.get.ack = ack;\n\t\t}());\n\n\t\t;(function(){\n\t\t\tGun.chain.opt = function(opt){\n\t\t\t\topt = opt || {};\n\t\t\t\tvar gun = this, at = gun._, tmp = opt.peers || opt;\n\t\t\t\tif(!Object.plain(opt)){ opt = {} }\n\t\t\t\tif(!Object.plain(at.opt)){ at.opt = opt }\n\t\t\t\tif('string' == typeof tmp){ tmp = [tmp] }\n\t\t\t\tif(!Object.plain(at.opt.peers)){ at.opt.peers = {}}\n\t\t\t\tif(tmp instanceof Array){\n\t\t\t\t\topt.peers = {};\n\t\t\t\t\ttmp.forEach(function(url){\n\t\t\t\t\t\tvar p = {}; p.id = p.url = url;\n\t\t\t\t\t\topt.peers[url] = at.opt.peers[url] = at.opt.peers[url] || p;\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t\tobj_each(opt, function each(k){ var v = this[k];\n\t\t\t\t\tif((this && this.hasOwnProperty(k)) || 'string' == typeof v || Object.empty(v)){ this[k] = v; return }\n\t\t\t\t\tif(v && v.constructor !== Object && !(v instanceof Array)){ return }\n\t\t\t\t\tobj_each(v, each);\n\t\t\t\t});\n\t\t\t\tat.opt.from = opt;\n\t\t\t\tGun.on('opt', at);\n\t\t\t\tat.opt.uuid = at.opt.uuid || function uuid(l){ return Gun.state().toString(36).replace('.','') + String.random(l||12) }\n\t\t\t\treturn gun;\n\t\t\t}\n\t\t}());\n\n\t\tvar obj_each = function(o,f){ Object.keys(o).forEach(f,o) }, text_rand = String.random, turn = setTimeout.turn, valid = Gun.valid, state_is = Gun.state.is, state_ify = Gun.state.ify, u, empty = {}, C;\n\n\t\tGun.log = function(){ return (!Gun.log.off && C.log.apply(C, arguments)), [].slice.call(arguments).join(' ') };\n\t\tGun.log.once = function(w,s,o){ return (o = Gun.log.once)[w] = o[w] || 0, o[w]++ || Gun.log(s) };\n\n\t\tif(typeof window !== \"undefined\"){ (window.GUN = window.Gun = Gun).window = window }\n\t\ttry{ if(typeof MODULE !== \"undefined\"){ MODULE.exports = Gun } }catch(e){}\n\t\tmodule.exports = Gun;\n\t\t\n\t\t(Gun.window||{}).console = (Gun.window||{}).console || {log: function(){}};\n\t\t(C = console).only = function(i, s){ return (C.only.i && i === C.only.i && C.only.i++) && (C.log.apply(C, arguments) || s) };\n\n\t\t;\"Please do not remove welcome log unless you are paying for a monthly sponsorship, thanks!\";\n\t\tGun.log.once(\"welcome\", \"Hello wonderful person! :) Thanks for using GUN, please ask for help on http://chat.gun.eco if anything takes you longer than 5min to figure out!\");\n\t})(USE, './root');\n\n\t;USE(function(module){\n\t\tvar Gun = USE('./root');\n\t\tGun.chain.back = function(n, opt){ var tmp;\n\t\t\tn = n || 1;\n\t\t\tif(-1 === n || Infinity === n){\n\t\t\t\treturn this._.root.$;\n\t\t\t} else\n\t\t\tif(1 === n){\n\t\t\t\treturn (this._.back || this._).$;\n\t\t\t}\n\t\t\tvar gun = this, at = gun._;\n\t\t\tif(typeof n === 'string'){\n\t\t\t\tn = n.split('.');\n\t\t\t}\n\t\t\tif(n instanceof Array){\n\t\t\t\tvar i = 0, l = n.length, tmp = at;\n\t\t\t\tfor(i; i < l; i++){\n\t\t\t\t\ttmp = (tmp||empty)[n[i]];\n\t\t\t\t}\n\t\t\t\tif(u !== tmp){\n\t\t\t\t\treturn opt? gun : tmp;\n\t\t\t\t} else\n\t\t\t\tif((tmp = at.back)){\n\t\t\t\t\treturn tmp.$.back(n, opt);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif('function' == typeof n){\n\t\t\t\tvar yes, tmp = {back: at};\n\t\t\t\twhile((tmp = tmp.back)\n\t\t\t\t&& u === (yes = n(tmp, opt))){}\n\t\t\t\treturn yes;\n\t\t\t}\n\t\t\tif('number' == typeof n){\n\t\t\t\treturn (at.back || at).$.back(n - 1);\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\tvar empty = {}, u;\n\t})(USE, './back');\n\n\t;USE(function(module){\n\t\t// WARNING: GUN is very simple, but the JavaScript chaining API around GUN\n\t\t// is complicated and was extremely hard to build. If you port GUN to another\n\t\t// language, consider implementing an easier API to build.\n\t\tvar Gun = USE('./root');\n\t\tGun.chain.chain = function(sub){\n\t\t\tvar gun = this, at = gun._, chain = new (sub || gun).constructor(gun), cat = chain._, root;\n\t\t\tcat.root = root = at.root;\n\t\t\tcat.id = ++root.once;\n\t\t\tcat.back = gun._;\n\t\t\tcat.on = Gun.on;\n\t\t\tcat.on('in', Gun.on.in, cat); // For 'in' if I add my own listeners to each then I MUST do it before in gets called. If I listen globally for all incoming data instead though, regardless of individual listeners, I can transform the data there and then as well.\n\t\t\tcat.on('out', Gun.on.out, cat); // However for output, there isn't really the global option. I must listen by adding my own listener individually BEFORE this one is ever called.\n\t\t\treturn chain;\n\t\t}\n\n\t\tfunction output(msg){\n\t\t\tvar put, get, at = this.as, back = at.back, root = at.root, tmp;\n\t\t\tif(!msg.$){ msg.$ = at.$ }\n\t\t\tthis.to.next(msg);\n\t\t\tif(at.err){ at.on('in', {put: at.put = u, $: at.$}); return }\n\t\t\tif(get = msg.get){\n\t\t\t\t/*if(u !== at.put){\n\t\t\t\t\tat.on('in', at);\n\t\t\t\t\treturn;\n\t\t\t\t}*/\n\t\t\t\tif(root.pass){ root.pass[at.id] = at; } // will this make for buggy behavior elsewhere?\n\t\t\t\tif(at.lex){ Object.keys(at.lex).forEach(function(k){ tmp[k] = at.lex[k] }, tmp = msg.get = msg.get || {}) }\n\t\t\t\tif(get['#'] || at.soul){\n\t\t\t\t\tget['#'] = get['#'] || at.soul;\n\t\t\t\t\t//root.graph[get['#']] = root.graph[get['#']] || {_:{'#':get['#'],'>':{}}};\n\t\t\t\t\tmsg['#'] || (msg['#'] = text_rand(9)); // A3120 ?\n\t\t\t\t\tback = (root.$.get(get['#'])._);\n\t\t\t\t\tif(!(get = get['.'])){ // soul\n\t\t\t\t\t\ttmp = back.ask && back.ask['']; // check if we have already asked for the full node\n\t\t\t\t\t\t(back.ask || (back.ask = {}))[''] = back; // add a flag that we are now.\n\t\t\t\t\t\tif(u !== back.put){ // if we already have data,\n\t\t\t\t\t\t\tback.on('in', back); // send what is cached down the chain\n\t\t\t\t\t\t\tif(tmp){ return } // and don't ask for it again.\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmsg.$ = back.$;\n\t\t\t\t\t} else\n\t\t\t\t\tif(obj_has(back.put, get)){ // TODO: support #LEX !\n\t\t\t\t\t\ttmp = back.ask && back.ask[get];\n\t\t\t\t\t\t(back.ask || (back.ask = {}))[get] = back.$.get(get)._;\n\t\t\t\t\t\tback.on('in', {get: get, put: {'#': back.soul, '.': get, ':': back.put[get], '>': state_is(root.graph[back.soul], get)}});\n\t\t\t\t\t\tif(tmp){ return }\n\t\t\t\t\t}\n\t\t\t\t\t\t/*put = (back.$.get(get)._);\n\t\t\t\t\t\tif(!(tmp = put.ack)){ put.ack = -1 }\n\t\t\t\t\t\tback.on('in', {\n\t\t\t\t\t\t\t$: back.$,\n\t\t\t\t\t\t\tput: Gun.state.ify({}, get, Gun.state(back.put, get), back.put[get]),\n\t\t\t\t\t\t\tget: back.get\n\t\t\t\t\t\t});\n\t\t\t\t\t\tif(tmp){ return }\n\t\t\t\t\t} else\n\t\t\t\t\tif('string' != typeof get){\n\t\t\t\t\t\tvar put = {}, meta = (back.put||{})._;\n\t\t\t\t\t\tGun.obj.map(back.put, function(v,k){\n\t\t\t\t\t\t\tif(!Gun.text.match(k, get)){ return }\n\t\t\t\t\t\t\tput[k] = v;\n\t\t\t\t\t\t})\n\t\t\t\t\t\tif(!Gun.obj.empty(put)){\n\t\t\t\t\t\t\tput._ = meta;\n\t\t\t\t\t\t\tback.on('in', {$: back.$, put: put, get: back.get})\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(tmp = at.lex){\n\t\t\t\t\t\t\ttmp = (tmp._) || (tmp._ = function(){});\n\t\t\t\t\t\t\tif(back.ack < tmp.ask){ tmp.ask = back.ack }\n\t\t\t\t\t\t\tif(tmp.ask){ return }\n\t\t\t\t\t\t\ttmp.ask = 1;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t*/\n\t\t\t\t\troot.ask(ack, msg); // A3120 ?\n\t\t\t\t\treturn root.on('in', msg);\n\t\t\t\t}\n\t\t\t\t//if(root.now){ root.now[at.id] = root.now[at.id] || true; at.pass = {} }\n\t\t\t\tif(get['.']){\n\t\t\t\t\tif(at.get){\n\t\t\t\t\t\tmsg = {get: {'.': at.get}, $: at.$};\n\t\t\t\t\t\t(back.ask || (back.ask = {}))[at.get] = msg.$._; // TODO: PERFORMANCE? More elegant way?\n\t\t\t\t\t\treturn back.on('out', msg);\n\t\t\t\t\t}\n\t\t\t\t\tmsg = {get: at.lex? msg.get : {}, $: at.$};\n\t\t\t\t\treturn back.on('out', msg);\n\t\t\t\t}\n\t\t\t\t(at.ask || (at.ask = {}))[''] = at;\t //at.ack = at.ack || -1;\n\t\t\t\tif(at.get){\n\t\t\t\t\tget['.'] = at.get;\n\t\t\t\t\t(back.ask || (back.ask = {}))[at.get] = msg.$._; // TODO: PERFORMANCE? More elegant way?\n\t\t\t\t\treturn back.on('out', msg);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn back.on('out', msg);\n\t\t}; Gun.on.out = output;\n\n\t\tfunction input(msg, cat){ cat = cat || this.as; // TODO: V8 may not be able to optimize functions with different parameter calls, so try to do benchmark to see if there is any actual difference.\n\t\t\tvar root = cat.root, gun = msg.$ || (msg.$ = cat.$), at = (gun||'')._ || empty, tmp = msg.put||'', soul = tmp['#'], key = tmp['.'], change = (u !== tmp['='])? tmp['='] : tmp[':'], state = tmp['>'] || -Infinity, sat; // eve = event, at = data at, cat = chain at, sat = sub at (children chains).\n\t\t\tif(u !== msg.put && (u === tmp['#'] || u === tmp['.'] || (u === tmp[':'] && u === tmp['=']) || u === tmp['>'])){ // convert from old format\n\t\t\t\tif(!valid(tmp)){\n\t\t\t\t\tif(!(soul = ((tmp||'')._||'')['#'])){ console.log(\"chain not yet supported for\", tmp, '...', msg, cat); return; }\n\t\t\t\t\tgun = cat.root.$.get(soul);\n\t\t\t\t\treturn setTimeout.each(Object.keys(tmp).sort(), function(k){ // TODO: .keys( is slow // BUG? ?Some re-in logic may depend on this being sync?\n\t\t\t\t\t\tif('_' == k || u === (state = state_is(tmp, k))){ return }\n\t\t\t\t\t\tcat.on('in', {$: gun, put: {'#': soul, '.': k, '=': tmp[k], '>': state}, VIA: msg});\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tcat.on('in', {$: at.back.$, put: {'#': soul = at.back.soul, '.': key = at.has || at.get, '=': tmp, '>': state_is(at.back.put, key)}, via: msg}); // TODO: This could be buggy! It assumes/approxes data, other stuff could have corrupted it.\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif((msg.seen||'')[cat.id]){ return } (msg.seen || (msg.seen = function(){}))[cat.id] = cat; // help stop some infinite loops\n\n\t\t\tif(cat !== at){ // don't worry about this when first understanding the code, it handles changing contexts on a message. A soul chain will never have a different context.\n\t\t\t\tObject.keys(msg).forEach(function(k){ tmp[k] = msg[k] }, tmp = {}); // make copy of message\n\t\t\t\ttmp.get = cat.get || tmp.get;\n\t\t\t\tif(!cat.soul && !cat.has){ // if we do not recognize the chain type\n\t\t\t\t\ttmp.$$$ = tmp.$$$ || cat.$; // make a reference to wherever it came from.\n\t\t\t\t} else\n\t\t\t\tif(at.soul){ // a has (property) chain will have a different context sometimes if it is linked (to a soul chain). Anything that is not a soul or has chain, will always have different contexts.\n\t\t\t\t\ttmp.$ = cat.$;\n\t\t\t\t\ttmp.$$ = tmp.$$ || at.$;\n\t\t\t\t}\n\t\t\t\tmsg = tmp; // use the message with the new context instead;\n\t\t\t}\n\t\t\tunlink(msg, cat);\n\n\t\t\tif(((cat.soul/* && (cat.ask||'')['']*/) || msg.$$) && state >= state_is(root.graph[soul], key)){ // The root has an in-memory cache of the graph, but if our peer has asked for the data then we want a per deduplicated chain copy of the data that might have local edits on it.\n\t\t\t\t(tmp = root.$.get(soul)._).put = state_ify(tmp.put, key, state, change, soul);\n\t\t\t}\n\t\t\tif(!at.soul /*&& (at.ask||'')['']*/ && state >= state_is(root.graph[soul], key) && (sat = (root.$.get(soul)._.next||'')[key])){ // Same as above here, but for other types of chains. // TODO: Improve perf by preventing echoes recaching.\n\t\t\t\tsat.put = change; // update cache\n\t\t\t\tif('string' == typeof (tmp = valid(change))){\n\t\t\t\t\tsat.put = root.$.get(tmp)._.put || change; // share same cache as what we're linked to.\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.to && this.to.next(msg); // 1st API job is to call all chain listeners.\n\t\t\t// TODO: Make input more reusable by only doing these (some?) calls if we are a chain we recognize? This means each input listener would be responsible for when listeners need to be called, which makes sense, as they might want to filter.\n\t\t\tcat.any && setTimeout.each(Object.keys(cat.any), function(any){ (any = cat.any[any]) && any(msg) },0,99); // 1st API job is to call all chain listeners. // TODO: .keys( is slow // BUG: Some re-in logic may depend on this being sync.\n\t\t\tcat.echo && setTimeout.each(Object.keys(cat.echo), function(lat){ (lat = cat.echo[lat]) && lat.on('in', msg) },0,99); // & linked at chains // TODO: .keys( is slow // BUG: Some re-in logic may depend on this being sync.\n\n\t\t\tif(((msg.$$||'')._||at).soul){ // comments are linear, but this line of code is non-linear, so if I were to comment what it does, you'd have to read 42 other comments first... but you can't read any of those comments until you first read this comment. What!? // shouldn't this match link's check?\n\t\t\t\t// is there cases where it is a $$ that we do NOT want to do the following? \n\t\t\t\tif((sat = cat.next) && (sat = sat[key])){ // TODO: possible trick? Maybe have `ionmap` code set a sat? // TODO: Maybe we should do `cat.ask` instead? I guess does not matter.\n\t\t\t\t\ttmp = {}; Object.keys(msg).forEach(function(k){ tmp[k] = msg[k] });\n\t\t\t\t\ttmp.$ = (msg.$$||msg.$).get(tmp.get = key); delete tmp.$$; delete tmp.$$$;\n\t\t\t\t\tsat.on('in', tmp);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlink(msg, cat);\n\t\t}; Gun.on.in = input;\n\n\t\tfunction link(msg, cat){ cat = cat || this.as || msg.$._;\n\t\t\tif(msg.$$ && this !== Gun.on){ return } // $$ means we came from a link, so we are at the wrong level, thus ignore it unless overruled manually by being called directly.\n\t\t\tif(!msg.put || cat.soul){ return } // But you cannot overrule being linked to nothing, or trying to link a soul chain - that must never happen.\n\t\t\tvar put = msg.put||'', link = put['=']||put[':'], tmp;\n\t\t\tvar root = cat.root, tat = root.$.get(put['#']).get(put['.'])._;\n\t\t\tif('string' != typeof (link = valid(link))){\n\t\t\t\tif(this === Gun.on){ (tat.echo || (tat.echo = {}))[cat.id] = cat } // allow some chain to explicitly force linking to simple data.\n\t\t\t\treturn; // by default do not link to data that is not a link.\n\t\t\t}\n\t\t\tif((tat.echo || (tat.echo = {}))[cat.id] // we've already linked ourselves so we do not need to do it again. Except... (annoying implementation details)\n\t\t\t\t&& !(root.pass||'')[cat.id]){ return } // if a new event listener was added, we need to make a pass through for it. The pass will be on the chain, not always the chain passed down. \n\t\t\tif(tmp = root.pass){ if(tmp[link+cat.id]){ return } tmp[link+cat.id] = 1 } // But the above edge case may \"pass through\" on a circular graph causing infinite passes, so we hackily add a temporary check for that.\n\n\t\t\t(tat.echo||(tat.echo={}))[cat.id] = cat; // set ourself up for the echo! // TODO: BUG? Echo to self no longer causes problems? Confirm.\n\n\t\t\tif(cat.has){ cat.link = link }\n\t\t\tvar sat = root.$.get(tat.link = link)._; // grab what we're linking to.\n\t\t\t(sat.echo || (sat.echo = {}))[tat.id] = tat; // link it.\n\t\t\tvar tmp = cat.ask||''; // ask the chain for what needs to be loaded next!\n\t\t\tif(tmp[''] || cat.lex){ // we might need to load the whole thing // TODO: cat.lex probably has edge case bugs to it, need more test coverage.\n\t\t\t\tsat.on('out', {get: {'#': link}});\n\t\t\t}\n\t\t\tsetTimeout.each(Object.keys(tmp), function(get, sat){ // if sub chains are asking for data. // TODO: .keys( is slow // BUG? ?Some re-in logic may depend on this being sync?\n\t\t\t\tif(!get || !(sat = tmp[get])){ return }\n\t\t\t\tsat.on('out', {get: {'#': link, '.': get}}); // go get it.\n\t\t\t},0,99);\n\t\t}; Gun.on.link = link;\n\n\t\tfunction unlink(msg, cat){ // ugh, so much code for seemingly edge case behavior.\n\t\t\tvar put = msg.put||'', change = (u !== put['='])? put['='] : put[':'], root = cat.root, link, tmp;\n\t\t\tif(u === change){ // 1st edge case: If we have a brand new database, no data will be found.\n\t\t\t\t// TODO: BUG! because emptying cache could be async from below, make sure we are not emptying a newer cache. So maybe pass an Async ID to check against?\n\t\t\t\t// TODO: BUG! What if this is a map? // Warning! Clearing things out needs to be robust against sync/async ops, or else you'll see `map val get put` test catastrophically fail because map attempts to link when parent graph is streamed before child value gets set. Need to differentiate between lack acks and force clearing.\n\t\t\t\tif(cat.soul && u !== cat.put){ return } // data may not be found on a soul, but if a soul already has data, then nothing can clear the soul as a whole.\n\t\t\t\t//if(!cat.has){ return }\n\t\t\t\ttmp = (msg.$$||msg.$||'')._||'';\n\t\t\t\tif(msg['@'] && (u !== tmp.put || u !== cat.put)){ return } // a \"not found\" from other peers should not clear out data if we have already found it.\n\t\t\t\t//if(cat.has && u === cat.put && !(root.pass||'')[cat.id]){ return } // if we are already unlinked, do not call again, unless edge case. // TODO: BUG! This line should be deleted for \"unlink deeply nested\".\n\t\t\t\tif(link = cat.link || msg.linked){\n\t\t\t\t\tdelete (root.$.get(link)._.echo||'')[cat.id];\n\t\t\t\t}\n\t\t\t\tif(cat.has){ // TODO: Empty out links, maps, echos, acks/asks, etc.?\n\t\t\t\t\tcat.link = null;\n\t\t\t\t}\n\t\t\t\tcat.put = u; // empty out the cache if, for example, alice's car's color no longer exists (relative to alice) if alice no longer has a car.\n\t\t\t\t// TODO: BUG! For maps, proxy this so the individual sub is triggered, not all subs.\n\t\t\t\tsetTimeout.each(Object.keys(cat.next||''), function(get, sat){ // empty out all sub chains. // TODO: .keys( is slow // BUG? ?Some re-in logic may depend on this being sync? // TODO: BUG? This will trigger deeper put first, does put logic depend on nested order? // TODO: BUG! For map, this needs to be the isolated child, not all of them.\n\t\t\t\t\tif(!(sat = cat.next[get])){ return }\n\t\t\t\t\t//if(cat.has && u === sat.put && !(root.pass||'')[sat.id]){ return } // if we are already unlinked, do not call again, unless edge case. // TODO: BUG! This line should be deleted for \"unlink deeply nested\".\n\t\t\t\t\tif(link){ delete (root.$.get(link).get(get)._.echo||'')[sat.id] }\n\t\t\t\t\tsat.on('in', {get: get, put: u, $: sat.$}); // TODO: BUG? Add recursive seen check?\n\t\t\t\t},0,99);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif(cat.soul){ return } // a soul cannot unlink itself.\n\t\t\tif(msg.$$){ return } // a linked chain does not do the unlinking, the sub chain does. // TODO: BUG? Will this cancel maps?\n\t\t\tlink = valid(change); // need to unlink anytime we are not the same link, though only do this once per unlink (and not on init).\n\t\t\ttmp = msg.$._||'';\n\t\t\tif(link === tmp.link || (cat.has && !tmp.link)){\n\t\t\t\tif((root.pass||'')[cat.id] && 'string' !== typeof link){\n\n\t\t\t\t} else {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tdelete (tmp.echo||'')[cat.id];\n\t\t\tunlink({get: cat.get, put: u, $: msg.$, linked: msg.linked = msg.linked || tmp.link}, cat); // unlink our sub chains.\n\t\t}; Gun.on.unlink = unlink;\n\n\t\tfunction ack(msg, ev){\n\t\t\t//if(!msg['%'] && (this||'').off){ this.off() } // do NOT memory leak, turn off listeners! Now handled by .ask itself\n\t\t\t// manhattan:\n\t\t\tvar as = this.as, at = as.$._, root = at.root, get = as.get||'', tmp = (msg.put||'')[get['#']]||'';\n\t\t\tif(!msg.put || ('string' == typeof get['.'] && u === tmp[get['.']])){\n\t\t\t\tif(u !== at.put){ return }\n\t\t\t\tif(!at.soul && !at.has){ return } // TODO: BUG? For now, only core-chains will handle not-founds, because bugs creep in if non-core chains are used as $ but we can revisit this later for more powerful extensions.\n\t\t\t\tat.ack = (at.ack || 0) + 1;\n\t\t\t\tat.on('in', {\n\t\t\t\t\tget: at.get,\n\t\t\t\t\tput: at.put = u,\n\t\t\t\t\t$: at.$,\n\t\t\t\t\t'@': msg['@']\n\t\t\t\t});\n\t\t\t\t/*(tmp = at.Q) && setTimeout.each(Object.keys(tmp), function(id){ // TODO: Temporary testing, not integrated or being used, probably delete.\n\t\t\t\t\tObject.keys(msg).forEach(function(k){ tmp[k] = msg[k] }, tmp = {}); tmp['@'] = id; // copy message\n\t\t\t\t\troot.on('in', tmp);\n\t\t\t\t}); delete at.Q;*/\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t(msg._||{}).miss = 1;\n\t\t\tGun.on.put(msg);\n\t\t\treturn; // eom\n\t\t}\n\n\t\tvar empty = {}, u, text_rand = String.random, valid = Gun.valid, obj_has = function(o, k){ return o && Object.prototype.hasOwnProperty.call(o, k) }, state = Gun.state, state_is = state.is, state_ify = state.ify;\n\t})(USE, './chain');\n\n\t;USE(function(module){\n\t\tvar Gun = USE('./root');\n\t\tGun.chain.get = function(key, cb, as){\n\t\t\tvar gun, tmp;\n\t\t\tif(typeof key === 'string'){\n\t\t\t\tif(key.length == 0) {\t\n\t\t\t\t\t(gun = this.chain())._.err = {err: Gun.log('0 length key!', key)};\n\t\t\t\t\tif(cb){ cb.call(gun, gun._.err) }\n\t\t\t\t\treturn gun;\n\t\t\t\t}\n\t\t\t\tvar back = this, cat = back._;\n\t\t\t\tvar next = cat.next || empty;\n\t\t\t\tif(!(gun = next[key])){\n\t\t\t\t\tgun = key && cache(key, back);\n\t\t\t\t}\n\t\t\t\tgun = gun && gun.$;\n\t\t\t} else\n\t\t\tif('function' == typeof key){\n\t\t\t\tif(true === cb){ return soul(this, key, cb, as), this }\n\t\t\t\tgun = this;\n\t\t\t\tvar cat = gun._, opt = cb || {}, root = cat.root, id;\n\t\t\t\topt.at = cat;\n\t\t\t\topt.ok = key;\n\t\t\t\tvar wait = {}; // can we assign this to the at instead, like in once?\n\t\t\t\t//var path = []; cat.$.back(at => { at.get && path.push(at.get.slice(0,9))}); path = path.reverse().join('.');\n\t\t\t\tfunction any(msg, eve, f){\n\t\t\t\t\tif(any.stun){ return }\n\t\t\t\t\tif((tmp = root.pass) && !tmp[id]){ return }\n\t\t\t\t\tvar at = msg.$._, sat = (msg.$$||'')._, data = (sat||at).put, odd = (!at.has && !at.soul), test = {}, link, tmp;\n\t\t\t\t\tif(odd || u === data){ // handles non-core\n\t\t\t\t\t\tdata = (u === ((tmp = msg.put)||'')['='])? (u === (tmp||'')[':'])? tmp : tmp[':'] : tmp['='];\n\t\t\t\t\t}\n\t\t\t\t\tif(link = ('string' == typeof (tmp = Gun.valid(data)))){\n\t\t\t\t\t\tdata = (u === (tmp = root.$.get(tmp)._.put))? opt.not? u : data : tmp;\n\t\t\t\t\t}\n\t\t\t\t\tif(opt.not && u === data){ return }\n\t\t\t\t\tif(u === opt.stun){\n\t\t\t\t\t\tif((tmp = root.stun) && tmp.on){\n\t\t\t\t\t\t\tcat.$.back(function(a){ // our chain stunned?\n\t\t\t\t\t\t\t\ttmp.on(''+a.id, test = {});\n\t\t\t\t\t\t\t\tif((test.run || 0) < any.id){ return test } // if there is an earlier stun on gapless parents/self.\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t!test.run && tmp.on(''+at.id, test = {}); // this node stunned?\n\t\t\t\t\t\t\t!test.run && sat && tmp.on(''+sat.id, test = {}); // linked node stunned?\n\t\t\t\t\t\t\tif(any.id > test.run){\n\t\t\t\t\t\t\t\tif(!test.stun || test.stun.end){\n\t\t\t\t\t\t\t\t\ttest.stun = tmp.on('stun');\n\t\t\t\t\t\t\t\t\ttest.stun = test.stun && test.stun.last;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif(test.stun && !test.stun.end){\n\t\t\t\t\t\t\t\t\t//if(odd && u === data){ return }\n\t\t\t\t\t\t\t\t\t//if(u === msg.put){ return } // \"not found\" acks will be found if there is stun, so ignore these.\n\t\t\t\t\t\t\t\t\t(test.stun.add || (test.stun.add = {}))[id] = function(){ any(msg,eve,1) } // add ourself to the stun callback list that is called at end of the write.\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(/*odd &&*/ u === data){ f = 0 } // if data not found, keep waiting/trying.\n\t\t\t\t\t\t/*if(f && u === data){\n\t\t\t\t\t\t\tcat.on('out', opt.out);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}*/\n\t\t\t\t\t\tif((tmp = root.hatch) && !tmp.end && u === opt.hatch && !f){ // quick hack! // What's going on here? Because data is streamed, we get things one by one, but a lot of developers would rather get a callback after each batch instead, so this does that by creating a wait list per chain id that is then called at the end of the batch by the hatch code in the root put listener.\n\t\t\t\t\t\t\tif(wait[at.$._.id]){ return } wait[at.$._.id] = 1;\n\t\t\t\t\t\t\ttmp.push(function(){any(msg,eve,1)});\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}; wait = {}; // end quick hack.\n\t\t\t\t\t}\n\t\t\t\t\t// call:\n\t\t\t\t\tif(root.pass){ if(root.pass[id+at.id]){ return } root.pass[id+at.id] = 1 }\n\t\t\t\t\tif(opt.on){ opt.ok.call(at.$, data, at.get, msg, eve || any); return } // TODO: Also consider breaking `this` since a lot of people do `=>` these days and `.call(` has slower performance.\n\t\t\t\t\tif(opt.v2020){ opt.ok(msg, eve || any); return }\n\t\t\t\t\tObject.keys(msg).forEach(function(k){ tmp[k] = msg[k] }, tmp = {}); msg = tmp; msg.put = data; // 2019 COMPATIBILITY! TODO: GET RID OF THIS!\n\t\t\t\t\topt.ok.call(opt.as, msg, eve || any); // is this the right\n\t\t\t\t};\n\t\t\t\tany.at = cat;\n\t\t\t\t//(cat.any||(cat.any=function(msg){ setTimeout.each(Object.keys(cat.any||''), function(act){ (act = cat.any[act]) && act(msg) },0,99) }))[id = String.random(7)] = any; // maybe switch to this in future?\n\t\t\t\t(cat.any||(cat.any={}))[id = String.random(7)] = any;\n\t\t\t\tany.off = function(){ any.stun = 1; if(!cat.any){ return } delete cat.any[id] }\n\t\t\t\tany.rid = rid; // logic from old version, can we clean it up now?\n\t\t\t\tany.id = opt.run || ++root.once; // used in callback to check if we are earlier than a write. // will this ever cause an integer overflow?\n\t\t\t\ttmp = root.pass; (root.pass = {})[id] = 1; // Explanation: test trade-offs want to prevent recursion so we add/remove pass flag as it gets fulfilled to not repeat, however map map needs many pass flags - how do we reconcile?\n\t\t\t\topt.out = opt.out || {get: {}};\n\t\t\t\tcat.on('out', opt.out);\n\t\t\t\troot.pass = tmp;\n\t\t\t\treturn gun;\n\t\t\t} else\n\t\t\tif('number' == typeof key){\n\t\t\t\treturn this.get(''+key, cb, as);\n\t\t\t} else\n\t\t\tif('string' == typeof (tmp = valid(key))){\n\t\t\t\treturn this.get(tmp, cb, as);\n\t\t\t} else\n\t\t\tif(tmp = this.get.next){\n\t\t\t\tgun = tmp(this, key);\n\t\t\t}\n\t\t\tif(!gun){\n\t\t\t\t(gun = this.chain())._.err = {err: Gun.log('Invalid get request!', key)}; // CLEAN UP\n\t\t\t\tif(cb){ cb.call(gun, gun._.err) }\n\t\t\t\treturn gun;\n\t\t\t}\n\t\t\tif(cb && 'function' == typeof cb){\n\t\t\t\tgun.get(cb, as);\n\t\t\t}\n\t\t\treturn gun;\n\t\t}\n\t\tfunction cache(key, back){\n\t\t\tvar cat = back._, next = cat.next, gun = back.chain(), at = gun._;\n\t\t\tif(!next){ next = cat.next = {} }\n\t\t\tnext[at.get = key] = at;\n\t\t\tif(back === cat.root.$){\n\t\t\t\tat.soul = key;\n\t\t\t\t//at.put = {};\n\t\t\t} else\n\t\t\tif(cat.soul || cat.has){\n\t\t\t\tat.has = key;\n\t\t\t\t//if(obj_has(cat.put, key)){\n\t\t\t\t\t//at.put = cat.put[key];\n\t\t\t\t//}\n\t\t\t}\n\t\t\treturn at;\n\t\t}\n\t\tfunction soul(gun, cb, opt, as){\n\t\t\tvar cat = gun._, acks = 0, tmp;\n\t\t\tif(tmp = cat.soul || cat.link){ return cb(tmp, as, cat) }\n\t\t\tif(cat.jam){ return cat.jam.push([cb, as]) }\n\t\t\tcat.jam = [[cb,as]];\n\t\t\tgun.get(function go(msg, eve){\n\t\t\t\tif(u === msg.put && !cat.root.opt.super && (tmp = Object.keys(cat.root.opt.peers).length) && ++acks <= tmp){ // TODO: super should not be in core code, bring AXE up into core instead to fix? // TODO: .keys( is slow\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\teve.rid(msg);\n\t\t\t\tvar at = ((at = msg.$) && at._) || {}, i = 0, as;\n\t\t\t\ttmp = cat.jam; delete cat.jam; // tmp = cat.jam.splice(0, 100);\n\t\t\t\t//if(tmp.length){ process.nextTick(function(){ go(msg, eve) }) }\n\t\t\t\twhile(as = tmp[i++]){ //Gun.obj.map(tmp, function(as, cb){\n\t\t\t\t\tvar cb = as[0], id; as = as[1];\n\t\t\t\t\tcb && cb(id = at.link || at.soul || Gun.valid(msg.put) || ((msg.put||{})._||{})['#'], as, msg, eve);\n\t\t\t\t} //);\n\t\t\t}, {out: {get: {'.':true}}});\n\t\t\treturn gun;\n\t\t}\n\t\tfunction rid(at){\n\t\t\tvar cat = this.at || this.on;\n\t\t\tif(!at || cat.soul || cat.has){ return this.off() }\n\t\t\tif(!(at = (at = (at = at.$ || at)._ || at).id)){ return }\n\t\t\tvar map = cat.map, tmp, seen;\n\t\t\t//if(!map || !(tmp = map[at]) || !(tmp = tmp.at)){ return }\n\t\t\tif(tmp = (seen = this.seen || (this.seen = {}))[at]){ return true }\n\t\t\tseen[at] = true;\n\t\t\treturn;\n\t\t\t//tmp.echo[cat.id] = {}; // TODO: Warning: This unsubscribes ALL of this chain's listeners from this link, not just the one callback event.\n\t\t\t//obj.del(map, at); // TODO: Warning: This unsubscribes ALL of this chain's listeners from this link, not just the one callback event.\n\t\t\treturn;\n\t\t}\n\t\tvar empty = {}, valid = Gun.valid, u;\n\t})(USE, './get');\n\n\t;USE(function(module){\n\t\tvar Gun = USE('./root');\n\t\tGun.chain.put = function(data, cb, as){ // I rewrote it :)\n\t\t\tvar gun = this, at = gun._, root = at.root;\n\t\t\tas = as || {};\n\t\t\tas.root = at.root;\n\t\t\tas.run || (as.run = root.once);\n\t\t\tstun(as, at.id); // set a flag for reads to check if this chain is writing.\n\t\t\tas.ack = as.ack || cb;\n\t\t\tas.via = as.via || gun;\n\t\t\tas.data = as.data || data;\n\t\t\tas.soul || (as.soul = at.soul || ('string' == typeof cb && cb));\n\t\t\tvar s = as.state = as.state || Gun.state();\n\t\t\tif('function' == typeof data){ data(function(d){ as.data = d; gun.put(u,u,as) }); return gun }\n\t\t\tif(!as.soul){ return get(as), gun }\n\t\t\tas.$ = root.$.get(as.soul); // TODO: This may not allow user chaining and similar?\n\t\t\tas.todo = [{it: as.data, ref: as.$}];\n\t\t\tas.turn = as.turn || turn;\n\t\t\tas.ran = as.ran || ran;\n\t\t\t//var path = []; as.via.back(at => { at.get && path.push(at.get.slice(0,9)) }); path = path.reverse().join('.');\n\t\t\t// TODO: Perf! We only need to stun chains that are being modified, not necessarily written to.\n\t\t\t(function walk(){\n\t\t\t\tvar to = as.todo, at = to.pop(), d = at.it, cid = at.ref && at.ref._.id, v, k, cat, tmp, g;\n\t\t\t\tstun(as, at.ref);\n\t\t\t\tif(tmp = at.todo){\n\t\t\t\t\tk = tmp.pop(); d = d[k];\n\t\t\t\t\tif(tmp.length){ to.push(at) }\n\t\t\t\t}\n\t\t\t\tk && (to.path || (to.path = [])).push(k);\n\t\t\t\tif(!(v = valid(d)) && !(g = Gun.is(d))){\n\t\t\t\t\tif(!Object.plain(d)){ ran.err(as, \"Invalid data: \"+ check(d) +\" at \" + (as.via.back(function(at){at.get && tmp.push(at.get)}, tmp = []) || tmp.join('.'))+'.'+(to.path||[]).join('.')); return }\n\t\t\t\t\tvar seen = as.seen || (as.seen = []), i = seen.length;\n\t\t\t\t\twhile(i--){ if(d === (tmp = seen[i]).it){ v = d = tmp.link; break } }\n\t\t\t\t}\n\t\t\t\tif(k && v){ at.node = state_ify(at.node, k, s, d) } // handle soul later.\n\t\t\t\telse {\n\t\t\t\t\tif(!as.seen){ ran.err(as, \"Data at root of graph must be a node (an object).\"); return }\n\t\t\t\t\tas.seen.push(cat = {it: d, link: {}, todo: g? [] : Object.keys(d).sort().reverse(), path: (to.path||[]).slice(), up: at}); // Any perf reasons to CPU schedule this .keys( ?\n\t\t\t\t\tat.node = state_ify(at.node, k, s, cat.link);\n\t\t\t\t\t!g && cat.todo.length && to.push(cat);\n\t\t\t\t\t// ---------------\n\t\t\t\t\tvar id = as.seen.length;\n\t\t\t\t\t(as.wait || (as.wait = {}))[id] = '';\n\t\t\t\t\ttmp = (cat.ref = (g? d : k? at.ref.get(k) : at.ref))._;\n\t\t\t\t\t(tmp = (d && (d._||'')['#']) || tmp.soul || tmp.link)? resolve({soul: tmp}) : cat.ref.get(resolve, {run: as.run, /*hatch: 0,*/ v2020:1, out:{get:{'.':' '}}}); // TODO: BUG! This should be resolve ONLY soul to prevent full data from being loaded. // Fixed now?\n\t\t\t\t\t//setTimeout(function(){ if(F){ return } console.log(\"I HAVE NOT BEEN CALLED!\", path, id, cat.ref._.id, k) }, 9000); var F; // MAKE SURE TO ADD F = 1 below!\n\t\t\t\t\tfunction resolve(msg, eve){\n\t\t\t\t\t\tvar end = cat.link['#'];\n\t\t\t\t\t\tif(eve){ eve.off(); eve.rid(msg) } // TODO: Too early! Check all peers ack not found.\n\t\t\t\t\t\t// TODO: BUG maybe? Make sure this does not pick up a link change wipe, that it uses the changign link instead.\n\t\t\t\t\t\tvar soul = end || msg.soul || (tmp = (msg.$$||msg.$)._||'').soul || tmp.link || ((tmp = tmp.put||'')._||'')['#'] || tmp['#'] || (((tmp = msg.put||'') && msg.$$)? tmp['#'] : (tmp['=']||tmp[':']||'')['#']);\n\t\t\t\t\t\t!end && stun(as, msg.$);\n\t\t\t\t\t\tif(!soul && !at.link['#']){ // check soul link above us\n\t\t\t\t\t\t\t(at.wait || (at.wait = [])).push(function(){ resolve(msg, eve) }) // wait\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(!soul){\n\t\t\t\t\t\t\tsoul = [];\n\t\t\t\t\t\t\t(msg.$$||msg.$).back(function(at){\n\t\t\t\t\t\t\t\tif(tmp = at.soul || at.link){ return soul.push(tmp) }\n\t\t\t\t\t\t\t\tsoul.push(at.get);\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tsoul = soul.reverse().join('/');\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcat.link['#'] = soul;\n\t\t\t\t\t\t!g && (((as.graph || (as.graph = {}))[soul] = (cat.node || (cat.node = {_:{}})))._['#'] = soul);\n\t\t\t\t\t\tdelete as.wait[id];\n\t\t\t\t\t\tcat.wait && setTimeout.each(cat.wait, function(cb){ cb && cb() });\n\t\t\t\t\t\tas.ran(as);\n\t\t\t\t\t};\n\t\t\t\t\t// ---------------\n\t\t\t\t}\n\t\t\t\tif(!to.length){ return as.ran(as) }\n\t\t\t\tas.turn(walk);\n\t\t\t}());\n\t\t\treturn gun;\n\t\t}\n\n\t\tfunction stun(as, id){\n\t\t\tif(!id){ return } id = (id._||'').id||id;\n\t\t\tvar run = as.root.stun || (as.root.stun = {on: Gun.on}), test = {}, tmp;\n\t\t\tas.stun || (as.stun = run.on('stun', function(){ }));\n\t\t\tif(tmp = run.on(''+id)){ tmp.the.last.next(test) }\n\t\t\tif(test.run >= as.run){ return }\n\t\t\trun.on(''+id, function(test){\n\t\t\t\tif(as.stun.end){\n\t\t\t\t\tthis.off();\n\t\t\t\t\tthis.to.next(test);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\ttest.run = test.run || as.run;\n\t\t\t\ttest.stun = test.stun || as.stun; return;\n\t\t\t\tif(this.to.to){\n\t\t\t\t\tthis.the.last.next(test);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\ttest.stun = as.stun;\n\t\t\t});\n\t\t}\n\n\t\tfunction ran(as){\n\t\t\tif(as.err){ ran.end(as.stun, as.root); return } // move log handle here.\n\t\t\tif(as.todo.length || as.end || !Object.empty(as.wait)){ return } as.end = 1;\n\t\t\t//(as.retry = function(){ as.acks = 0;\n\t\t\tvar cat = (as.$.back(-1)._), root = cat.root, ask = cat.ask(function(ack){\n\t\t\t\troot.on('ack', ack);\n\t\t\t\tif(ack.err && !ack.lack){ Gun.log(ack) }\n\t\t\t\tif(++acks > (as.acks || 0)){ this.off() } // Adjustable ACKs! Only 1 by default.\n\t\t\t\tif(!as.ack){ return }\n\t\t\t\tas.ack(ack, this);\n\t\t\t}, as.opt), acks = 0, stun = as.stun, tmp;\n\t\t\t(tmp = function(){ // this is not official yet, but quick solution to hack in for now.\n\t\t\t\tif(!stun){ return }\n\t\t\t\tran.end(stun, root);\n\t\t\t\tsetTimeout.each(Object.keys(stun = stun.add||''), function(cb){ if(cb = stun[cb]){cb()} }); // resume the stunned reads // Any perf reasons to CPU schedule this .keys( ?\n\t\t\t}).hatch = tmp; // this is not official yet ^\n\t\t\t//console.log(1, \"PUT\", as.run, as.graph);\n\t\t\tif(as.ack && !as.ok){ as.ok = as.acks || 9 } // TODO: In future! Remove this! This is just old API support.\n\t\t\t(as.via._).on('out', {put: as.out = as.graph, ok: as.ok && {'@': as.ok+1}, opt: as.opt, '#': ask, _: tmp});\n\t\t\t//})();\n\t\t}; ran.end = function(stun,root){\n\t\t\tstun.end = noop; // like with the earlier id, cheaper to make this flag a function so below callbacks do not have to do an extra type check.\n\t\t\tif(stun.the.to === stun && stun === stun.the.last){ delete root.stun }\n\t\t\tstun.off();\n\t\t}; ran.err = function(as, err){\n\t\t\t(as.ack||noop).call(as, as.out = { err: as.err = Gun.log(err) });\n\t\t\tas.ran(as);\n\t\t}\n\n\t\tfunction get(as){\n\t\t\tvar at = as.via._, tmp;\n\t\t\tas.via = as.via.back(function(at){\n\t\t\t\tif(at.soul || !at.get){ return at.$ }\n\t\t\t\ttmp = as.data; (as.data = {})[at.get] = tmp;\n\t\t\t});\n\t\t\tif(!as.via || !as.via._.soul){\n\t\t\t\tas.via = at.root.$.get(((as.data||'')._||'')['#'] || at.$.back('opt.uuid')())\n\t\t\t}\n\t\t\tas.via.put(as.data, as.ack, as);\n\t\t\t\n\n\t\t\treturn;\n\t\t\tif(at.get && at.back.soul){\n\t\t\t\ttmp = as.data;\n\t\t\t\tas.via = at.back.$;\n\t\t\t\t(as.data = {})[at.get] = tmp; \n\t\t\t\tas.via.put(as.data, as.ack, as);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tfunction check(d, tmp){ return ((d && (tmp = d.constructor) && tmp.name) || typeof d) }\n\n\t\tvar u, empty = {}, noop = function(){}, turn = setTimeout.turn, valid = Gun.valid, state_ify = Gun.state.ify;\n\t\tvar iife = function(fn,as){fn.call(as||empty)}\n\t})(USE, './put');\n\n\t;USE(function(module){\n\t\tvar Gun = USE('./root');\n\t\tUSE('./chain');\n\t\tUSE('./back');\n\t\tUSE('./put');\n\t\tUSE('./get');\n\t\tmodule.exports = Gun;\n\t})(USE, './index');\n\n\t;USE(function(module){\n\t\tvar Gun = USE('./index');\n\t\tGun.chain.on = function(tag, arg, eas, as){ // don't rewrite!\n\t\t\tvar gun = this, cat = gun._, root = cat.root, act, off, id, tmp;\n\t\t\tif(typeof tag === 'string'){\n\t\t\t\tif(!arg){ return cat.on(tag) }\n\t\t\t\tact = cat.on(tag, arg, eas || cat, as);\n\t\t\t\tif(eas && eas.$){\n\t\t\t\t\t(eas.subs || (eas.subs = [])).push(act);\n\t\t\t\t}\n\t\t\t\treturn gun;\n\t\t\t}\n\t\t\tvar opt = arg;\n\t\t\t(opt = (true === opt)? {change: true} : opt || {}).not = 1; opt.on = 1;\n\t\t\t//opt.at = cat;\n\t\t\t//opt.ok = tag;\n\t\t\t//opt.last = {};\n\t\t\tvar wait = {}; // can we assign this to the at instead, like in once?\n\t\t\tgun.get(tag, opt);\n\t\t\t/*gun.get(function on(data,key,msg,eve){ var $ = this;\n\t\t\t\tif(tmp = root.hatch){ // quick hack!\n\t\t\t\t\tif(wait[$._.id]){ return } wait[$._.id] = 1;\n\t\t\t\t\ttmp.push(function(){on.call($, data,key,msg,eve)});\n\t\t\t\t\treturn;\n\t\t\t\t}; wait = {}; // end quick hack.\n\t\t\t\ttag.call($, data,key,msg,eve);\n\t\t\t}, opt); // TODO: PERF! Event listener leak!!!?*/\n\t\t\t/*\n\t\t\tfunction one(msg, eve){\n\t\t\t\tif(one.stun){ return }\n\t\t\t\tvar at = msg.$._, data = at.put, tmp;\n\t\t\t\tif(tmp = at.link){ data = root.$.get(tmp)._.put }\n\t\t\t\tif(opt.not===u && u === data){ return }\n\t\t\t\tif(opt.stun===u && (tmp = root.stun) && (tmp = tmp[at.id] || tmp[at.back.id]) && !tmp.end){ // Remember! If you port this into `.get(cb` make sure you allow stun:0 skip option for `.put(`.\n\t\t\t\t\ttmp[id] = function(){one(msg,eve)};\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t//tmp = one.wait || (one.wait = {}); console.log(tmp[at.id] === ''); if(tmp[at.id] !== ''){ tmp[at.id] = tmp[at.id] || setTimeout(function(){tmp[at.id]='';one(msg,eve)},1); return } delete tmp[at.id];\n\t\t\t\t// call:\n\t\t\t\tif(opt.as){\n\t\t\t\t\topt.ok.call(opt.as, msg, eve || one);\n\t\t\t\t} else {\n\t\t\t\t\topt.ok.call(at.$, data, msg.get || at.get, msg, eve || one);\n\t\t\t\t}\n\t\t\t};\n\t\t\tone.at = cat;\n\t\t\t(cat.act||(cat.act={}))[id = String.random(7)] = one;\n\t\t\tone.off = function(){ one.stun = 1; if(!cat.act){ return } delete cat.act[id] }\n\t\t\tcat.on('out', {get: {}});*/\n\t\t\treturn gun;\n\t\t}\n\t\t// Rules:\n\t\t// 1. If cached, should be fast, but not read while write.\n\t\t// 2. Should not retrigger other listeners, should get triggered even if nothing found.\n\t\t// 3. If the same callback passed to many different once chains, each should resolve - an unsubscribe from the same callback should not effect the state of the other resolving chains, if you do want to cancel them all early you should mutate the callback itself with a flag & check for it at top of callback\n\t\tGun.chain.once = function(cb, opt){ opt = opt || {}; // avoid rewriting\n\t\t\tif(!cb){ return none(this,opt) }\n\t\t\tvar gun = this, cat = gun._, root = cat.root, data = cat.put, id = String.random(7), one, tmp;\n\t\t\tgun.get(function(data,key,msg,eve){\n\t\t\t\tvar $ = this, at = $._, one = (at.one||(at.one={}));\n\t\t\t\tif(eve.stun){ return } if('' === one[id]){ return }\n\t\t\t\tif(true === (tmp = Gun.valid(data))){ once(); return }\n\t\t\t\tif('string' == typeof tmp){ return } // TODO: BUG? Will this always load?\n\t\t\t\tclearTimeout((cat.one||'')[id]); // clear \"not found\" since they only get set on cat.\n\t\t\t\tclearTimeout(one[id]); one[id] = setTimeout(once, opt.wait||99); // TODO: Bug? This doesn't handle plural chains.\n\t\t\t\tfunction once(f){\n\t\t\t\t\tif(!at.has && !at.soul){ at = {put: data, get: key} } // handles non-core messages.\n\t\t\t\t\tif(u === (tmp = at.put)){ tmp = ((msg.$$||'')._||'').put }\n\t\t\t\t\tif('string' == typeof Gun.valid(tmp)){\n\t\t\t\t\t\ttmp = root.$.get(tmp)._.put;\n\t\t\t\t\t\tif(tmp === u && !f){\n\t\t\t\t\t\t\tone[id] = setTimeout(function(){ once(1) }, opt.wait||99); // TODO: Quick fix. Maybe use ack count for more predictable control?\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t//console.log(\"AND VANISHED\", data);\n\t\t\t\t\tif(eve.stun){ return } if('' === one[id]){ return } one[id] = '';\n\t\t\t\t\tif(cat.soul || cat.has){ eve.off() } // TODO: Plural chains? // else { ?.off() } // better than one check?\n\t\t\t\t\tcb.call($, tmp, at.get);\n\t\t\t\t\tclearTimeout(one[id]); // clear \"not found\" since they only get set on cat. // TODO: This was hackily added, is it necessary or important? Probably not, in future try removing this. Was added just as a safety for the `&& !f` check.\n\t\t\t\t};\n\t\t\t}, {on: 1});\n\t\t\treturn gun;\n\t\t}\n\t\tfunction none(gun,opt,chain){\n\t\t\tGun.log.once(\"valonce\", \"Chainable val is experimental, its behavior and API may change moving forward. Please play with it and report bugs and ideas on how to improve it.\");\n\t\t\t(chain = gun.chain())._.nix = gun.once(function(data, key){ chain._.on('in', this._) });\n\t\t\tchain._.lex = gun._.lex; // TODO: Better approach in future? This is quick for now.\n\t\t\treturn chain;\n\t\t}\n\n\t\tGun.chain.off = function(){\n\t\t\t// make off more aggressive. Warning, it might backfire!\n\t\t\tvar gun = this, at = gun._, tmp;\n\t\t\tvar cat = at.back;\n\t\t\tif(!cat){ return }\n\t\t\tat.ack = 0; // so can resubscribe.\n\t\t\tif(tmp = cat.next){\n\t\t\t\tif(tmp[at.get]){\n\t\t\t\t\tdelete tmp[at.get];\n\t\t\t\t} else {\n\n\t\t\t\t}\n\t\t\t}\n\t\t\t// TODO: delete cat.one[map.id]?\n\t\t\tif(tmp = cat.ask){\n\t\t\t\tdelete tmp[at.get];\n\t\t\t}\n\t\t\tif(tmp = cat.put){\n\t\t\t\tdelete tmp[at.get];\n\t\t\t}\n\t\t\tif(tmp = at.soul){\n\t\t\t\tdelete cat.root.graph[tmp];\n\t\t\t}\n\t\t\tif(tmp = at.map){\n\t\t\t\tObject.keys(tmp).forEach(function(i,at){ at = tmp[i]; //obj_map(tmp, function(at){\n\t\t\t\t\tif(at.link){\n\t\t\t\t\t\tcat.root.$.get(at.link).off();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\tif(tmp = at.next){\n\t\t\t\tObject.keys(tmp).forEach(function(i,neat){ neat = tmp[i]; //obj_map(tmp, function(neat){\n\t\t\t\t\tneat.$.off();\n\t\t\t\t});\n\t\t\t}\n\t\t\tat.on('off', {});\n\t\t\treturn gun;\n\t\t}\n\t\tvar empty = {}, noop = function(){}, u;\n\t})(USE, './on');\n\n\t;USE(function(module){\n\t\tvar Gun = USE('./index'), next = Gun.chain.get.next;\n\t\tGun.chain.get.next = function(gun, lex){ var tmp;\n\t\t\tif(!Object.plain(lex)){ return (next||noop)(gun, lex) }\n\t\t\tif(tmp = ((tmp = lex['#'])||'')['='] || tmp){ return gun.get(tmp) }\n\t\t\t(tmp = gun.chain()._).lex = lex; // LEX!\n\t\t\tgun.on('in', function(eve){\n\t\t\t\tif(String.match(eve.get|| (eve.put||'')['.'], lex['.'] || lex['#'] || lex)){\n\t\t\t\t\ttmp.on('in', eve);\n\t\t\t\t}\n\t\t\t\tthis.to.next(eve);\n\t\t\t});\n\t\t\treturn tmp.$;\n\t\t}\n\t\tGun.chain.map = function(cb, opt, t){\n\t\t\tvar gun = this, cat = gun._, lex, chain;\n\t\t\tif(Object.plain(cb)){ lex = cb['.']? cb : {'.': cb}; cb = u }\n\t\t\tif(!cb){\n\t\t\t\tif(chain = cat.each){ return chain }\n\t\t\t\t(cat.each = chain = gun.chain())._.lex = lex || chain._.lex || cat.lex;\n\t\t\t\tchain._.nix = gun.back('nix');\n\t\t\t\tgun.on('in', map, chain._);\n\t\t\t\treturn chain;\n\t\t\t}\n\t\t\tGun.log.once(\"mapfn\", \"Map functions are experimental, their behavior and API may change moving forward. Please play with it and report bugs and ideas on how to improve it.\");\n\t\t\tchain = gun.chain();\n\t\t\tgun.map().on(function(data, key, msg, eve){\n\t\t\t\tvar next = (cb||noop).call(this, data, key, msg, eve);\n\t\t\t\tif(u === next){ return }\n\t\t\t\tif(data === next){ return chain._.on('in', msg) }\n\t\t\t\tif(Gun.is(next)){ return chain._.on('in', next._) }\n\t\t\t\tvar tmp = {}; Object.keys(msg.put).forEach(function(k){ tmp[k] = msg.put[k] }, tmp); tmp['='] = next; \n\t\t\t\tchain._.on('in', {get: key, put: tmp});\n\t\t\t});\n\t\t\treturn chain;\n\t\t}\n\t\tfunction map(msg){ this.to.next(msg);\n\t\t\tvar cat = this.as, gun = msg.$, at = gun._, put = msg.put, tmp;\n\t\t\tif(!at.soul && !msg.$$){ return } // this line took hundreds of tries to figure out. It only works if core checks to filter out above chains during link tho. This says \"only bother to map on a node\" for this layer of the chain. If something is not a node, map should not work.\n\t\t\tif((tmp = cat.lex) && !String.match(msg.get|| (put||'')['.'], tmp['.'] || tmp['#'] || tmp)){ return }\n\t\t\tGun.on.link(msg, cat);\n\t\t}\n\t\tvar noop = function(){}, event = {stun: noop, off: noop}, u;\n\t})(USE, './map');\n\n\t;USE(function(module){\n\t\tvar Gun = USE('./index');\n\t\tGun.chain.set = function(item, cb, opt){\n\t\t\tvar gun = this, root = gun.back(-1), soul, tmp;\n\t\t\tcb = cb || function(){};\n\t\t\topt = opt || {}; opt.item = opt.item || item;\n\t\t\tif(soul = ((item||'')._||'')['#']){ (item = {})['#'] = soul } // check if node, make link.\n\t\t\tif('string' == typeof (tmp = Gun.valid(item))){ return gun.get(soul = tmp).put(item, cb, opt) } // check if link\n\t\t\tif(!Gun.is(item)){\n\t\t\t\tif(Object.plain(item)){\n\t\t\t\t\titem = root.get(soul = gun.back('opt.uuid')()).put(item);\n\t\t\t\t}\n\t\t\t\treturn gun.get(soul || root.back('opt.uuid')(7)).put(item, cb, opt);\n\t\t\t}\n\t\t\tgun.put(function(go){\n\t\t\t\titem.get(function(soul, o, msg){ // TODO: BUG! We no longer have this option? & go error not handled?\n\t\t\t\t\tif(!soul){ return cb.call(gun, {err: Gun.log('Only a node can be linked! Not \"' + msg.put + '\"!')}) }\n\t\t\t\t\t(tmp = {})[soul] = {'#': soul}; go(tmp);\n\t\t\t\t},true);\n\t\t\t})\n\t\t\treturn item;\n\t\t}\n\t})(USE, './set');\n\n\t;USE(function(module){\n\t\tUSE('./shim');\n\n\t\tvar noop = function(){}\n\t\tvar parse = JSON.parseAsync || function(t,cb,r){ var u, d = +new Date; try{ cb(u, JSON.parse(t,r), json.sucks(+new Date - d)) }catch(e){ cb(e) } }\n\t\tvar json = JSON.stringifyAsync || function(v,cb,r,s){ var u, d = +new Date; try{ cb(u, JSON.stringify(v,r,s), json.sucks(+new Date - d)) }catch(e){ cb(e) } }\n\t\tjson.sucks = function(d){ if(d > 99){ console.log(\"Warning: JSON blocking CPU detected. Add `gun/lib/yson.js` to fix.\"); json.sucks = noop } }\n\n\t\tfunction Mesh(root){\n\t\t\tvar mesh = function(){};\n\t\t\tvar opt = root.opt || {};\n\t\t\topt.log = opt.log || console.log;\n\t\t\topt.gap = opt.gap || opt.wait || 0;\n\t\t\topt.max = opt.max || (opt.memory? (opt.memory * 999 * 999) : 300000000) * 0.3;\n\t\t\topt.pack = opt.pack || (opt.max * 0.01 * 0.01);\n\t\t\topt.puff = opt.puff || 9; // IDEA: do a start/end benchmark, divide ops/result.\n\t\t\tvar puff = setTimeout.turn || setTimeout;\n\n\t\t\tvar dup = root.dup, dup_check = dup.check, dup_track = dup.track;\n\n\t\t\tvar ST = +new Date, LT = ST;\n\n\t\t\tvar hear = mesh.hear = function(raw, peer){\n\t\t\t\tif(!raw){ return }\n\t\t\t\tif(opt.max <= raw.length){ return mesh.say({dam: '!', err: \"Message too big!\"}, peer) }\n\t\t\t\tif(mesh === this){\n\t\t\t\t\t/*if('string' == typeof raw){ try{\n\t\t\t\t\t\tvar stat = console.STAT || {};\n\t\t\t\t\t\t//console.log('HEAR:', peer.id, (raw||'').slice(0,250), ((raw||'').length / 1024 / 1024).toFixed(4));\n\t\t\t\t\t\t\n\t\t\t\t\t\t//console.log(setTimeout.turn.s.length, 'stacks', parseFloat((-(LT - (LT = +new Date))/1000).toFixed(3)), 'sec', parseFloat(((LT-ST)/1000 / 60).toFixed(1)), 'up', stat.peers||0, 'peers', stat.has||0, 'has', stat.memhused||0, stat.memused||0, stat.memax||0, 'heap mem max');\n\t\t\t\t\t}catch(e){ console.log('DBG err', e) }}*/\n\t\t\t\t\thear.d += raw.length||0 ; ++hear.c } // STATS!\n\t\t\t\tvar S = peer.SH = +new Date;\n\t\t\t\tvar tmp = raw[0], msg;\n\t\t\t\t//raw && raw.slice && console.log(\"hear:\", ((peer.wire||'').headers||'').origin, raw.length, raw.slice && raw.slice(0,50)); //tc-iamunique-tc-package-ds1\n\t\t\t\tif('[' === tmp){\n\t\t\t\t\tparse(raw, function(err, msg){\n\t\t\t\t\t\tif(err || !msg){ return mesh.say({dam: '!', err: \"DAM JSON parse error.\"}, peer) }\n\t\t\t\t\t\tconsole.STAT && console.STAT(+new Date, msg.length, '# on hear batch');\n\t\t\t\t\t\tvar P = opt.puff;\n\t\t\t\t\t\t(function go(){\n\t\t\t\t\t\t\tvar S = +new Date;\n\t\t\t\t\t\t\tvar i = 0, m; while(i < P && (m = msg[i++])){ mesh.hear(m, peer) }\n\t\t\t\t\t\t\tmsg = msg.slice(i); // slicing after is faster than shifting during.\n\t\t\t\t\t\t\tconsole.STAT && console.STAT(S, +new Date - S, 'hear loop');\n\t\t\t\t\t\t\tflush(peer); // force send all synchronously batched acks.\n\t\t\t\t\t\t\tif(!msg.length){ return }\n\t\t\t\t\t\t\tpuff(go, 0);\n\t\t\t\t\t\t}());\n\t\t\t\t\t});\n\t\t\t\t\traw = ''; // \n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif('{' === tmp || ((raw['#'] || Object.plain(raw)) && (msg = raw))){\n\t\t\t\t\tif(msg){ return hear.one(msg, peer, S) }\n\t\t\t\t\tparse(raw, function(err, msg){\n\t\t\t\t\t\tif(err || !msg){ return mesh.say({dam: '!', err: \"DAM JSON parse error.\"}, peer) }\n\t\t\t\t\t\thear.one(msg, peer, S);\n\t\t\t\t\t});\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\thear.one = function(msg, peer, S){ // S here is temporary! Undo.\n\t\t\t\tvar id, hash, tmp, ash, DBG;\n\t\t\t\tif(msg.DBG){ msg.DBG = DBG = {DBG: msg.DBG} }\n\t\t\t\tDBG && (DBG.h = S);\n\t\t\t\tDBG && (DBG.hp = +new Date);\n\t\t\t\tif(!(id = msg['#'])){ id = msg['#'] = String.random(9) }\n\t\t\t\tif(tmp = dup_check(id)){ return }\n\t\t\t\t// DAM logic:\n\t\t\t\tif(!(hash = msg['##']) && false && u !== msg.put){ /*hash = msg['##'] = Type.obj.hash(msg.put)*/ } // disable hashing for now // TODO: impose warning/penalty instead (?)\n\t\t\t\tif(hash && (tmp = msg['@'] || (msg.get && id)) && dup.check(ash = tmp+hash)){ return } // Imagine A <-> B <=> (C & D), C & D reply with same ACK but have different IDs, B can use hash to dedup. Or if a GET has a hash already, we shouldn't ACK if same.\n\t\t\t\t(msg._ = function(){}).via = mesh.leap = peer;\n\t\t\t\tif((tmp = msg['><']) && 'string' == typeof tmp){ tmp.slice(0,99).split(',').forEach(function(k){ this[k] = 1 }, (msg._).yo = {}) } // Peers already sent to, do not resend.\n\t\t\t\t// DAM ^\n\t\t\t\tif(tmp = msg.dam){\n\t\t\t\t\tif(tmp = mesh.hear[tmp]){\n\t\t\t\t\t\ttmp(msg, peer, root);\n\t\t\t\t\t}\n\t\t\t\t\tdup_track(id);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif(tmp = msg.ok){ msg._.near = tmp['/'] }\n\t\t\t\tvar S = +new Date;\n\t\t\t\tDBG && (DBG.is = S); peer.SI = id;\n\t\t\t\tdup_track.ed = function(d){\n\t\t\t\t\tif(id !== d){ return }\n\t\t\t\t\tdup_track.ed = 0;\n\t\t\t\t\tif(!(d = dup.s[id])){ return }\n\t\t\t\t\td.via = peer;\n\t\t\t\t\tif(msg.get){ d.it = msg }\n\t\t\t\t}\n\t\t\t\troot.on('in', mesh.last = msg);\n\t\t\t\tDBG && (DBG.hd = +new Date);\n\t\t\t\tconsole.STAT && console.STAT(S, +new Date - S, msg.get? 'msg get' : msg.put? 'msg put' : 'msg');\n\t\t\t\tdup_track(id); // in case 'in' does not call track.\n\t\t\t\tif(ash){ dup_track(ash) } //dup.track(tmp+hash, true).it = it(msg);\n\t\t\t\tmesh.leap = mesh.last = null; // warning! mesh.leap could be buggy.\n\t\t\t}\n\t\t\tvar tomap = function(k,i,m){m(k,true)};\n\t\t\thear.c = hear.d = 0;\n\n\t\t\t;(function(){\n\t\t\t\tvar SMIA = 0;\n\t\t\t\tvar loop;\n\t\t\t\tmesh.hash = function(msg, peer){ var h, s, t;\n\t\t\t\t\tvar S = +new Date;\n\t\t\t\t\tjson(msg.put, function hash(err, text){\n\t\t\t\t\t\tvar ss = (s || (s = t = text||'')).slice(0, 32768); // 1024 * 32\n\t\t\t\t\t h = String.hash(ss, h); s = s.slice(32768);\n\t\t\t\t\t if(s){ puff(hash, 0); return }\n\t\t\t\t\t\tconsole.STAT && console.STAT(S, +new Date - S, 'say json+hash');\n\t\t\t\t\t msg._.$put = t;\n\t\t\t\t\t msg['##'] = h;\n\t\t\t\t\t mesh.say(msg, peer);\n\t\t\t\t\t delete msg._.$put;\n\t\t\t\t\t}, sort);\n\t\t\t\t}\n\t\t\t\tfunction sort(k, v){ var tmp;\n\t\t\t\t\tif(!(v instanceof Object)){ return v }\n\t\t\t\t\tObject.keys(v).sort().forEach(sorta, {to: tmp = {}, on: v});\n\t\t\t\t\treturn tmp;\n\t\t\t\t} function sorta(k){ this.to[k] = this.on[k] }\n\n\t\t\t\tvar say = mesh.say = function(msg, peer){ var tmp;\n\t\t\t\t\tif((tmp = this) && (tmp = tmp.to) && tmp.next){ tmp.next(msg) } // compatible with middleware adapters.\n\t\t\t\t\tif(!msg){ return false }\n\t\t\t\t\tvar id, hash, raw, ack = msg['@'];\n//if(opt.super && (!ack || !msg.put)){ return } // TODO: MANHATTAN STUB //OBVIOUSLY BUG! But squelch relay. // :( get only is 100%+ CPU usage :(\n\t\t\t\t\tvar meta = msg._||(msg._=function(){});\n\t\t\t\t\tvar DBG = msg.DBG, S = +new Date; meta.y = meta.y || S; if(!peer){ DBG && (DBG.y = S) }\n\t\t\t\t\tif(!(id = msg['#'])){ id = msg['#'] = String.random(9) }\n\t\t\t\t\t!loop && dup_track(id);//.it = it(msg); // track for 9 seconds, default. Earth<->Mars would need more! // always track, maybe move this to the 'after' logic if we split function.\n\t\t\t\t\t//if(msg.put && (msg.err || (dup.s[id]||'').err)){ return false } // TODO: in theory we should not be able to stun a message, but for now going to check if it can help network performance preventing invalid data to relay.\n\t\t\t\t\tif(!(hash = msg['##']) && u !== msg.put && !meta.via && ack){ mesh.hash(msg, peer); return } // TODO: Should broadcasts be hashed?\n\t\t\t\t\tif(!peer && ack){ peer = ((tmp = dup.s[ack]) && (tmp.via || ((tmp = tmp.it) && (tmp = tmp._) && tmp.via))) || ((tmp = mesh.last) && ack === tmp['#'] && mesh.leap) } // warning! mesh.leap could be buggy! mesh last check reduces this. // TODO: CLEAN UP THIS LINE NOW? `.it` should be reliable.\n\t\t\t\t\tif(!peer && ack){ // still no peer, then ack daisy chain 'tunnel' got lost.\n\t\t\t\t\t\tif(dup.s[ack]){ return } // in dups but no peer hints that this was ack to ourself, ignore.\n\t\t\t\t\t\tconsole.STAT && console.STAT(+new Date, ++SMIA, 'total no peer to ack to'); // TODO: Delete this now. Dropping lost ACKs is protocol fine now.\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t} // TODO: Temporary? If ack via trace has been lost, acks will go to all peers, which trashes browser bandwidth. Not relaying the ack will force sender to ask for ack again. Note, this is technically wrong for mesh behavior.\n\t\t\t\t\tif(ack && !msg.put && !hash && ((dup.s[ack]||'').it||'')['##']){ return false } // If we're saying 'not found' but a relay had data, do not bother sending our not found. // Is this correct, return false? // NOTE: ADD PANIC TEST FOR THIS!\n\t\t\t\t\tif(!peer && mesh.way){ return mesh.way(msg) }\n\t\t\t\t\tDBG && (DBG.yh = +new Date);\n\t\t\t\t\tif(!(raw = meta.raw)){ mesh.raw(msg, peer); return }\n\t\t\t\t\tDBG && (DBG.yr = +new Date);\n\t\t\t\t\tif(!peer || !peer.id){\n\t\t\t\t\t\tif(!Object.plain(peer || opt.peers)){ return false }\n\t\t\t\t\t\tvar S = +new Date;\n\t\t\t\t\t\tvar P = opt.puff, ps = opt.peers, pl = Object.keys(peer || opt.peers || {}); // TODO: .keys( is slow\n\t\t\t\t\t\tconsole.STAT && console.STAT(S, +new Date - S, 'peer keys');\n\t\t\t\t\t\t;(function go(){\n\t\t\t\t\t\t\tvar S = +new Date;\n\t\t\t\t\t\t\t//Type.obj.map(peer || opt.peers, each); // in case peer is a peer list.\n\t\t\t\t\t\t\tloop = 1; var wr = meta.raw; meta.raw = raw; // quick perf hack\n\t\t\t\t\t\t\tvar i = 0, p; while(i < 9 && (p = (pl||'')[i++])){\n\t\t\t\t\t\t\t\tif(!(p = ps[p] || (peer||'')[p])){ continue }\n\t\t\t\t\t\t\t\tmesh.say(msg, p);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tmeta.raw = wr; loop = 0;\n\t\t\t\t\t\t\tpl = pl.slice(i); // slicing after is faster than shifting during.\n\t\t\t\t\t\t\tconsole.STAT && console.STAT(S, +new Date - S, 'say loop');\n\t\t\t\t\t\t\tif(!pl.length){ return }\n\t\t\t\t\t\t\tpuff(go, 0);\n\t\t\t\t\t\t\tack && dup_track(ack); // keep for later\n\t\t\t\t\t\t}());\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\t// TODO: PERF: consider splitting function here, so say loops do less work.\n\t\t\t\t\tif(!peer.wire && mesh.wire){ mesh.wire(peer) }\n\t\t\t\t\tif(id === peer.last){ return } peer.last = id; // was it just sent?\n\t\t\t\t\tif(peer === meta.via){ return false } // don't send back to self.\n\t\t\t\t\tif((tmp = meta.yo) && (tmp[peer.url] || tmp[peer.pid] || tmp[peer.id]) /*&& !o*/){ return false }\n\t\t\t\t\tconsole.STAT && console.STAT(S, ((DBG||meta).yp = +new Date) - (meta.y || S), 'say prep');\n\t\t\t\t\t!loop && ack && dup_track(ack); // streaming long responses needs to keep alive the ack.\n\t\t\t\t\tif(peer.batch){\n\t\t\t\t\t\tpeer.tail = (tmp = peer.tail || 0) + raw.length;\n\t\t\t\t\t\tif(peer.tail <= opt.pack){\n\t\t\t\t\t\t\tpeer.batch += (tmp?',':'')+raw;\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tflush(peer);\n\t\t\t\t\t}\n\t\t\t\t\tpeer.batch = '['; // Prevents double JSON!\n\t\t\t\t\tvar ST = +new Date;\n\t\t\t\t\tsetTimeout(function(){\n\t\t\t\t\t\tconsole.STAT && console.STAT(ST, +new Date - ST, '0ms TO');\n\t\t\t\t\t\tflush(peer);\n\t\t\t\t\t}, opt.gap); // TODO: queuing/batching might be bad for low-latency video game performance! Allow opt out?\n\t\t\t\t\tsend(raw, peer);\n\t\t\t\t\tconsole.STAT && (ack === peer.SI) && console.STAT(S, +new Date - peer.SH, 'say ack');\n\t\t\t\t}\n\t\t\t\tmesh.say.c = mesh.say.d = 0;\n\t\t\t\t// TODO: this caused a out-of-memory crash!\n\t\t\t\tmesh.raw = function(msg, peer){ // TODO: Clean this up / delete it / move logic out!\n\t\t\t\t\tif(!msg){ return '' }\n\t\t\t\t\tvar meta = (msg._) || {}, put, tmp;\n\t\t\t\t\tif(tmp = meta.raw){ return tmp }\n\t\t\t\t\tif('string' == typeof msg){ return msg }\n\t\t\t\t\tvar hash = msg['##'], ack = msg['@'];\n\t\t\t\t\tif(hash && ack){\n\t\t\t\t\t\tif(!meta.via && dup_check(ack+hash)){ return false } // for our own out messages, memory & storage may ack the same thing, so dedup that. Tho if via another peer, we already tracked it upon hearing, so this will always trigger false positives, so don't do that!\n\t\t\t\t\t\tif(tmp = (dup.s[ack]||'').it){\n\t\t\t\t\t\t\tif(hash === tmp['##']){ return false } // if ask has a matching hash, acking is optional.\n\t\t\t\t\t\t\tif(!tmp['##']){ tmp['##'] = hash } // if none, add our hash to ask so anyone we relay to can dedup. // NOTE: May only check against 1st ack chunk, 2nd+ won't know and still stream back to relaying peers which may then dedup. Any way to fix this wasted bandwidth? I guess force rate limiting breaking change, that asking peer has to ask for next lexical chunk.\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif(!msg.dam && !msg['@']){\n\t\t\t\t\t\tvar i = 0, to = []; tmp = opt.peers;\n\t\t\t\t\t\tfor(var k in tmp){ var p = tmp[k]; // TODO: Make it up peers instead!\n\t\t\t\t\t\t\tto.push(p.url || p.pid || p.id);\n\t\t\t\t\t\t\tif(++i > 6){ break }\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(i > 1){ msg['><'] = to.join() } // TODO: BUG! This gets set regardless of peers sent to! Detect?\n\t\t\t\t\t}\n\t\t\t\t\tif(msg.put && (tmp = msg.ok)){ msg.ok = {'@':(tmp['@']||1)-1, '/': (tmp['/']==msg._.near)? mesh.near : tmp['/']}; }\n\t\t\t\t\tif(put = meta.$put){\n\t\t\t\t\t\ttmp = {}; Object.keys(msg).forEach(function(k){ tmp[k] = msg[k] });\n\t\t\t\t\t\ttmp.put = ':])([:';\n\t\t\t\t\t\tjson(tmp, function(err, raw){\n\t\t\t\t\t\t\tif(err){ return } // TODO: Handle!!\n\t\t\t\t\t\t\tvar S = +new Date;\n\t\t\t\t\t\t\ttmp = raw.indexOf('\"put\":\":])([:\"');\n\t\t\t\t\t\t\tres(u, raw = raw.slice(0, tmp+6) + put + raw.slice(tmp + 14));\n\t\t\t\t\t\t\tconsole.STAT && console.STAT(S, +new Date - S, 'say slice');\n\t\t\t\t\t\t});\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tjson(msg, res);\n\t\t\t\t\tfunction res(err, raw){\n\t\t\t\t\t\tif(err){ return } // TODO: Handle!!\n\t\t\t\t\t\tmeta.raw = raw; //if(meta && (raw||'').length < (999 * 99)){ meta.raw = raw } // HNPERF: If string too big, don't keep in memory.\n\t\t\t\t\t\tmesh.say(msg, peer);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}());\n\n\t\t\tfunction flush(peer){\n\t\t\t\tvar tmp = peer.batch, t = 'string' == typeof tmp, l;\n\t\t\t\tif(t){ tmp += ']' }// TODO: Prevent double JSON!\n\t\t\t\tpeer.batch = peer.tail = null;\n\t\t\t\tif(!tmp){ return }\n\t\t\t\tif(t? 3 > tmp.length : !tmp.length){ return } // TODO: ^\n\t\t\t\tif(!t){try{tmp = (1 === tmp.length? tmp[0] : JSON.stringify(tmp));\n\t\t\t\t}catch(e){return opt.log('DAM JSON stringify error', e)}}\n\t\t\t\tif(!tmp){ return }\n\t\t\t\tsend(tmp, peer);\n\t\t\t}\n\t\t\t// for now - find better place later.\n\t\t\tfunction send(raw, peer){ try{\n\t\t\t\tvar wire = peer.wire;\n\t\t\t\tif(peer.say){\n\t\t\t\t\tpeer.say(raw);\n\t\t\t\t} else\n\t\t\t\tif(wire.send){\n\t\t\t\t\twire.send(raw);\n\t\t\t\t}\n\t\t\t\tmesh.say.d += raw.length||0; ++mesh.say.c; // STATS!\n\t\t\t}catch(e){\n\t\t\t\t(peer.queue = peer.queue || []).push(raw);\n\t\t\t}}\n\n\t\t\tmesh.near = 0;\n\t\t\tmesh.hi = function(peer){\n\t\t\t\tvar wire = peer.wire, tmp;\n\t\t\t\tif(!wire){ mesh.wire((peer.length && {url: peer, id: peer}) || peer); return }\n\t\t\t\tif(peer.id){\n\t\t\t\t\topt.peers[peer.url || peer.id] = peer;\n\t\t\t\t} else {\n\t\t\t\t\ttmp = peer.id = peer.id || peer.url || String.random(9);\n\t\t\t\t\tmesh.say({dam: '?', pid: root.opt.pid}, opt.peers[tmp] = peer);\n\t\t\t\t\tdelete dup.s[peer.last]; // IMPORTANT: see https://gun.eco/docs/DAM#self\n\t\t\t\t}\n\t\t\t\tif(!peer.met){\n\t\t\t\t\tmesh.near++;\n\t\t\t\t\tpeer.met = +(new Date);\n\t\t\t\t\troot.on('hi', peer)\n\t\t\t\t}\n\t\t\t\t// @rogowski I need this here by default for now to fix go1dfish's bug\n\t\t\t\ttmp = peer.queue; peer.queue = [];\n\t\t\t\tsetTimeout.each(tmp||[],function(msg){\n\t\t\t\t\tsend(msg, peer);\n\t\t\t\t},0,9);\n\t\t\t\t//Type.obj.native && Type.obj.native(); // dirty place to check if other JS polluted.\n\t\t\t}\n\t\t\tmesh.bye = function(peer){\n\t\t\t\tpeer.met && --mesh.near;\n\t\t\t\tdelete peer.met;\n\t\t\t\troot.on('bye', peer);\n\t\t\t\tvar tmp = +(new Date); tmp = (tmp - (peer.met||tmp));\n\t\t\t\tmesh.bye.time = ((mesh.bye.time || tmp) + tmp) / 2;\n\t\t\t}\n\t\t\tmesh.hear['!'] = function(msg, peer){ opt.log('Error:', msg.err) }\n\t\t\tmesh.hear['?'] = function(msg, peer){\n\t\t\t\tif(msg.pid){\n\t\t\t\t\tif(!peer.pid){ peer.pid = msg.pid }\n\t\t\t\t\tif(msg['@']){ return }\n\t\t\t\t}\n\t\t\t\tmesh.say({dam: '?', pid: opt.pid, '@': msg['#']}, peer);\n\t\t\t\tdelete dup.s[peer.last]; // IMPORTANT: see https://gun.eco/docs/DAM#self\n\t\t\t}\n\t\t\tmesh.hear['mob'] = function(msg, peer){ // NOTE: AXE will overload this with better logic.\n\t\t\t\tif(!msg.peers){ return }\n\t\t\t\tvar peers = Object.keys(msg.peers), one = peers[(Math.random()*peers.length) >> 0];\n\t\t\t\tif(!one){ return }\n\t\t\t\tmesh.bye(peer);\n\t\t\t\tmesh.hi(one);\n\t\t\t}\n\n\t\t\troot.on('create', function(root){\n\t\t\t\troot.opt.pid = root.opt.pid || String.random(9);\n\t\t\t\tthis.to.next(root);\n\t\t\t\troot.on('out', mesh.say);\n\t\t\t});\n\n\t\t\troot.on('bye', function(peer, tmp){\n\t\t\t\tpeer = opt.peers[peer.id || peer] || peer;\n\t\t\t\tthis.to.next(peer);\n\t\t\t\tpeer.bye? peer.bye() : (tmp = peer.wire) && tmp.close && tmp.close();\n\t\t\t\tdelete opt.peers[peer.id];\n\t\t\t\tpeer.wire = null;\n\t\t\t});\n\n\t\t\tvar gets = {};\n\t\t\troot.on('bye', function(peer, tmp){ this.to.next(peer);\n\t\t\t\tif(tmp = console.STAT){ tmp.peers = mesh.near; }\n\t\t\t\tif(!(tmp = peer.url)){ return } gets[tmp] = true;\n\t\t\t\tsetTimeout(function(){ delete gets[tmp] },opt.lack || 9000);\n\t\t\t});\n\t\t\troot.on('hi', function(peer, tmp){ this.to.next(peer);\n\t\t\t\tif(tmp = console.STAT){ tmp.peers = mesh.near }\n\t\t\t\tif(opt.super){ return } // temporary (?) until we have better fix/solution?\n\t\t\t\tvar souls = Object.keys(root.next||''); // TODO: .keys( is slow\n\t\t\t\tif(souls.length > 9999 && !console.SUBS){ console.log(console.SUBS = \"Warning: You have more than 10K live GETs, which might use more bandwidth than your screen can show - consider `.off()`.\") }\n\t\t\t\tsetTimeout.each(souls, function(soul){ var node = root.next[soul];\n\t\t\t\t\tif(opt.super || (node.ask||'')['']){ mesh.say({get: {'#': soul}}, peer); return }\n\t\t\t\t\tsetTimeout.each(Object.keys(node.ask||''), function(key){ if(!key){ return }\n\t\t\t\t\t\t// is the lack of ## a !onion hint?\n\t\t\t\t\t\tmesh.say({'##': String.hash((root.graph[soul]||'')[key]), get: {'#': soul, '.': key}}, peer);\n\t\t\t\t\t\t// TODO: Switch this so Book could route?\n\t\t\t\t\t})\n\t\t\t\t});\n\t\t\t});\n\n\t\t\treturn mesh;\n\t\t}\n\t var empty = {}, ok = true, u;\n\n\t try{ module.exports = Mesh }catch(e){}\n\n\t})(USE, './mesh');\n\n\t;USE(function(module){\n\t\tvar Gun = USE('./index');\n\t\tGun.Mesh = USE('./mesh');\n\n\t\t// TODO: resync upon reconnect online/offline\n\t\t//window.ononline = window.onoffline = function(){ console.log('online?', navigator.onLine) }\n\n\t\tGun.on('opt', function(root){\n\t\t\tthis.to.next(root);\n\t\t\tif(root.once){ return }\n\t\t\tvar opt = root.opt;\n\t\t\tif(false === opt.WebSocket){ return }\n\n\t\t\tvar env = Gun.window || {};\n\t\t\tvar websocket = opt.WebSocket || env.WebSocket || env.webkitWebSocket || env.mozWebSocket;\n\t\t\tif(!websocket){ return }\n\t\t\topt.WebSocket = websocket;\n\n\t\t\tvar mesh = opt.mesh = opt.mesh || Gun.Mesh(root);\n\n\t\t\tvar wire = mesh.wire || opt.wire;\n\t\t\tmesh.wire = opt.wire = open;\n\t\t\tfunction open(peer){ try{\n\t\t\t\tif(!peer || !peer.url){ return wire && wire(peer) }\n\t\t\t\tvar url = peer.url.replace(/^http/, 'ws');\n\t\t\t\tvar wire = peer.wire = new opt.WebSocket(url);\n\t\t\t\twire.onclose = function(){\n\t\t\t\t\treconnect(peer);\n\t\t\t\t\topt.mesh.bye(peer);\n\t\t\t\t};\n\t\t\t\twire.onerror = function(err){\n\t\t\t\t\treconnect(peer);\n\t\t\t\t};\n\t\t\t\twire.onopen = function(){\n\t\t\t\t\topt.mesh.hi(peer);\n\t\t\t\t}\n\t\t\t\twire.onmessage = function(msg){\n\t\t\t\t\tif(!msg){ return }\n\t\t\t\t\topt.mesh.hear(msg.data || msg, peer);\n\t\t\t\t};\n\t\t\t\treturn wire;\n\t\t\t}catch(e){ opt.mesh.bye(peer) }}\n\n\t\t\tsetTimeout(function(){ !opt.super && root.on('out', {dam:'hi'}) },1); // it can take a while to open a socket, so maybe no longer lazy load for perf reasons?\n\n\t\t\tvar wait = 2 * 999;\n\t\t\tfunction reconnect(peer){\n\t\t\t\tclearTimeout(peer.defer);\n\t\t\t\tif(!opt.peers[peer.url]){ return }\n\t\t\t\tif(doc && peer.retry <= 0){ return }\n\t\t\t\tpeer.retry = (peer.retry || opt.retry+1 || 60) - ((-peer.tried + (peer.tried = +new Date) < wait*4)?1:0);\n\t\t\t\tpeer.defer = setTimeout(function to(){\n\t\t\t\t\tif(doc && doc.hidden){ return setTimeout(to,wait) }\n\t\t\t\t\topen(peer);\n\t\t\t\t}, wait);\n\t\t\t}\n\t\t\tvar doc = (''+u !== typeof document) && document;\n\t\t});\n\t\tvar noop = function(){}, u;\n\t})(USE, './websocket');\n\n\t;USE(function(module){\n\t\tif(typeof Gun === 'undefined'){ return }\n\n\t\tvar noop = function(){}, store, u;\n\t\ttry{store = (Gun.window||noop).localStorage}catch(e){}\n\t\tif(!store){\n\t\t\tGun.log(\"Warning: No localStorage exists to persist data to!\");\n\t\t\tstore = {setItem: function(k,v){this[k]=v}, removeItem: function(k){delete this[k]}, getItem: function(k){return this[k]}};\n\t\t}\n\n\t\tvar parse = JSON.parseAsync || function(t,cb,r){ var u; try{ cb(u, JSON.parse(t,r)) }catch(e){ cb(e) } }\n\t\tvar json = JSON.stringifyAsync || function(v,cb,r,s){ var u; try{ cb(u, JSON.stringify(v,r,s)) }catch(e){ cb(e) } }\n\n\t\tGun.on('create', function lg(root){\n\t\t\tthis.to.next(root);\n\t\t\tvar opt = root.opt, graph = root.graph, acks = [], disk, to, size, stop;\n\t\t\tif(false === opt.localStorage){ return }\n\t\t\topt.prefix = opt.file || 'gun/';\n\t\t\ttry{ disk = lg[opt.prefix] = lg[opt.prefix] || JSON.parse(size = store.getItem(opt.prefix)) || {}; // TODO: Perf! This will block, should we care, since limited to 5MB anyways?\n\t\t\t}catch(e){ disk = lg[opt.prefix] = {}; }\n\t\t\tsize = (size||'').length;\n\n\t\t\troot.on('get', function(msg){\n\t\t\t\tthis.to.next(msg);\n\t\t\t\tvar lex = msg.get, soul, data, tmp, u;\n\t\t\t\tif(!lex || !(soul = lex['#'])){ return }\n\t\t\t\tdata = disk[soul] || u;\n\t\t\t\tif(data && (tmp = lex['.']) && !Object.plain(tmp)){ // pluck!\n\t\t\t\t\tdata = Gun.state.ify({}, tmp, Gun.state.is(data, tmp), data[tmp], soul);\n\t\t\t\t}\n\t\t\t\t//if(data){ (tmp = {})[soul] = data } // back into a graph.\n\t\t\t\t//setTimeout(function(){\n\t\t\t\tGun.on.get.ack(msg, data); //root.on('in', {'@': msg['#'], put: tmp, lS:1});// || root.$});\n\t\t\t\t//}, Math.random() * 10); // FOR TESTING PURPOSES!\n\t\t\t});\n\n\t\t\troot.on('put', function(msg){\n\t\t\t\tthis.to.next(msg); // remember to call next middleware adapter\n\t\t\t\tvar put = msg.put, soul = put['#'], key = put['.'], id = msg['#'], ok = msg.ok||'', tmp; // pull data off wire envelope\n\t\t\t\tdisk[soul] = Gun.state.ify(disk[soul], key, put['>'], put[':'], soul); // merge into disk object\n\t\t\t\tif(stop && size > (4999880)){ root.on('in', {'@': id, err: \"localStorage max!\"}); return; }\n\t\t\t\t//if(!msg['@']){ acks.push(id) } // then ack any non-ack write. // TODO: use batch id.\n\t\t\t\tif(!msg['@'] && (!msg._.via || Math.random() < (ok['@'] / ok['/']))){ acks.push(id) } // then ack any non-ack write. // TODO: use batch id.\n\t\t\t\tif(to){ return }\n\t\t\t\tto = setTimeout(flush, 9+(size / 333)); // 0.1MB = 0.3s, 5MB = 15s \n\t\t\t});\n\t\t\tfunction flush(){\n\t\t\t\tif(!acks.length && ((setTimeout.turn||'').s||'').length){ setTimeout(flush,99); return; } // defer if \"busy\" && no saves.\n\t\t\t\tvar err, ack = acks; clearTimeout(to); to = false; acks = [];\n\t\t\t\tjson(disk, function(err, tmp){\n\t\t\t\t\ttry{!err && store.setItem(opt.prefix, tmp);\n\t\t\t\t\t}catch(e){ err = stop = e || \"localStorage failure\" }\n\t\t\t\t\tif(err){\n\t\t\t\t\t\tGun.log(err + \" Consider using GUN's IndexedDB plugin for RAD for more storage space, https://gun.eco/docs/RAD#install\");\n\t\t\t\t\t\troot.on('localStorage:error', {err: err, get: opt.prefix, put: disk});\n\t\t\t\t\t}\n\t\t\t\t\tsize = tmp.length;\n\n\t\t\t\t\t//if(!err && !Object.empty(opt.peers)){ return } // only ack if there are no peers. // Switch this to probabilistic mode\n\t\t\t\t\tsetTimeout.each(ack, function(id){\n\t\t\t\t\t\troot.on('in', {'@': id, err: err, ok: 0}); // localStorage isn't reliable, so make its `ok` code be a low number.\n\t\t\t\t\t},0,99);\n\t\t\t\t})\n\t\t\t}\n\t\t\n\t\t});\n\t})(USE, './localStorage');\n\n}());\n\n/* BELOW IS TEMPORARY FOR OLD INTERNAL COMPATIBILITY, THEY ARE IMMEDIATELY DEPRECATED AND WILL BE REMOVED IN NEXT VERSION */\n;(function(){\n\tvar u;\n\tif(''+u == typeof Gun){ return }\n\tvar DEP = function(n){ console.warn(\"Warning! Deprecated internal utility will break in next version:\", n) }\n\t// Generic javascript utilities.\n\tvar Type = Gun;\n\t//Type.fns = Type.fn = {is: function(fn){ return (!!fn && fn instanceof Function) }}\n\tType.fn = Type.fn || {is: function(fn){ DEP('fn'); return (!!fn && 'function' == typeof fn) }}\n\tType.bi = Type.bi || {is: function(b){ DEP('bi');return (b instanceof Boolean || typeof b == 'boolean') }}\n\tType.num = Type.num || {is: function(n){ DEP('num'); return !list_is(n) && ((n - parseFloat(n) + 1) >= 0 || Infinity === n || -Infinity === n) }}\n\tType.text = Type.text || {is: function(t){ DEP('text'); return (typeof t == 'string') }}\n\tType.text.ify = Type.text.ify || function(t){ DEP('text.ify');\n\t\tif(Type.text.is(t)){ return t }\n\t\tif(typeof JSON !== \"undefined\"){ return JSON.stringify(t) }\n\t\treturn (t && t.toString)? t.toString() : t;\n\t}\n\tType.text.random = Type.text.random || function(l, c){ DEP('text.random');\n\t\tvar s = '';\n\t\tl = l || 24; // you are not going to make a 0 length random number, so no need to check type\n\t\tc = c || '0123456789ABCDEFGHIJKLMNOPQRSTUVWXZabcdefghijklmnopqrstuvwxyz';\n\t\twhile(l > 0){ s += c.charAt(Math.floor(Math.random() * c.length)); l-- }\n\t\treturn s;\n\t}\n\tType.text.match = Type.text.match || function(t, o){ var tmp, u; DEP('text.match');\n\t\tif('string' !== typeof t){ return false }\n\t\tif('string' == typeof o){ o = {'=': o} }\n\t\to = o || {};\n\t\ttmp = (o['='] || o['*'] || o['>'] || o['<']);\n\t\tif(t === tmp){ return true }\n\t\tif(u !== o['=']){ return false }\n\t\ttmp = (o['*'] || o['>'] || o['<']);\n\t\tif(t.slice(0, (tmp||'').length) === tmp){ return true }\n\t\tif(u !== o['*']){ return false }\n\t\tif(u !== o['>'] && u !== o['<']){\n\t\t\treturn (t >= o['>'] && t <= o['<'])? true : false;\n\t\t}\n\t\tif(u !== o['>'] && t >= o['>']){ return true }\n\t\tif(u !== o['<'] && t <= o['<']){ return true }\n\t\treturn false;\n\t}\n\tType.text.hash = Type.text.hash || function(s, c){ // via SO\n\t\tDEP('text.hash');\n\t\tif(typeof s !== 'string'){ return }\n\t c = c || 0;\n\t if(!s.length){ return c }\n\t for(var i=0,l=s.length,n; i B){ return 1 }\n\t\t\telse { return 0 }\n\t\t}\n\t}\n\tType.list.map = Type.list.map || function(l, c, _){ DEP('list.map'); return obj_map(l, c, _) }\n\tType.list.index = 1; // change this to 0 if you want non-logical, non-mathematical, non-matrix, non-convenient array notation\n\tType.obj = Type.boj || {is: function(o){ DEP('obj'); return o? (o instanceof Object && o.constructor === Object) || Object.prototype.toString.call(o).match(/^\\[object (\\w+)\\]$/)[1] === 'Object' : false }}\n\tType.obj.put = Type.obj.put || function(o, k, v){ DEP('obj.put'); return (o||{})[k] = v, o }\n\tType.obj.has = Type.obj.has || function(o, k){ DEP('obj.has'); return o && Object.prototype.hasOwnProperty.call(o, k) }\n\tType.obj.del = Type.obj.del || function(o, k){ DEP('obj.del'); \n\t\tif(!o){ return }\n\t\to[k] = null;\n\t\tdelete o[k];\n\t\treturn o;\n\t}\n\tType.obj.as = Type.obj.as || function(o, k, v, u){ DEP('obj.as'); return o[k] = o[k] || (u === v? {} : v) }\n\tType.obj.ify = Type.obj.ify || function(o){ DEP('obj.ify'); \n\t\tif(obj_is(o)){ return o }\n\t\ttry{o = JSON.parse(o);\n\t\t}catch(e){o={}};\n\t\treturn o;\n\t}\n\t;(function(){ var u;\n\t\tfunction map(v,k){\n\t\t\tif(obj_has(this,k) && u !== this[k]){ return }\n\t\t\tthis[k] = v;\n\t\t}\n\t\tType.obj.to = Type.obj.to || function(from, to){ DEP('obj.to'); \n\t\t\tto = to || {};\n\t\t\tobj_map(from, map, to);\n\t\t\treturn to;\n\t\t}\n\t}());\n\tType.obj.copy = Type.obj.copy || function(o){ DEP('obj.copy'); // because http://web.archive.org/web/20140328224025/http://jsperf.com/cloning-an-object/2\n\t\treturn !o? o : JSON.parse(JSON.stringify(o)); // is shockingly faster than anything else, and our data has to be a subset of JSON anyways!\n\t}\n\t;(function(){\n\t\tfunction empty(v,i){ var n = this.n, u;\n\t\t\tif(n && (i === n || (obj_is(n) && obj_has(n, i)))){ return }\n\t\t\tif(u !== i){ return true }\n\t\t}\n\t\tType.obj.empty = Type.obj.empty || function(o, n){ DEP('obj.empty'); \n\t\t\tif(!o){ return true }\n\t\t\treturn obj_map(o,empty,{n:n})? false : true;\n\t\t}\n\t}());\n\t;(function(){\n\t\tfunction t(k,v){\n\t\t\tif(2 === arguments.length){\n\t\t\t\tt.r = t.r || {};\n\t\t\t\tt.r[k] = v;\n\t\t\t\treturn;\n\t\t\t} t.r = t.r || [];\n\t\t\tt.r.push(k);\n\t\t};\n\t\tvar keys = Object.keys, map, u;\n\t\tObject.keys = Object.keys || function(o){ return map(o, function(v,k,t){t(k)}) }\n\t\tType.obj.map = map = Type.obj.map || function(l, c, _){ DEP('obj.map'); \n\t\t\tvar u, i = 0, x, r, ll, lle, f = 'function' == typeof c;\n\t\t\tt.r = u;\n\t\t\tif(keys && obj_is(l)){\n\t\t\t\tll = keys(l); lle = true;\n\t\t\t}\n\t\t\t_ = _ || {};\n\t\t\tif(list_is(l) || ll){\n\t\t\t\tx = (ll || l).length;\n\t\t\t\tfor(;i < x; i++){\n\t\t\t\t\tvar ii = (i + Type.list.index);\n\t\t\t\t\tif(f){\n\t\t\t\t\t\tr = lle? c.call(_, l[ll[i]], ll[i], t) : c.call(_, l[i], ii, t);\n\t\t\t\t\t\tif(r !== u){ return r }\n\t\t\t\t\t} else {\n\t\t\t\t\t\t//if(Type.test.is(c,l[i])){ return ii } // should implement deep equality testing!\n\t\t\t\t\t\tif(c === l[lle? ll[i] : i]){ return ll? ll[i] : ii } // use this for now\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor(i in l){\n\t\t\t\t\tif(f){\n\t\t\t\t\t\tif(obj_has(l,i)){\n\t\t\t\t\t\t\tr = _? c.call(_, l[i], i, t) : c(l[i], i, t);\n\t\t\t\t\t\t\tif(r !== u){ return r }\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\t//if(a.test.is(c,l[i])){ return i } // should implement deep equality testing!\n\t\t\t\t\t\tif(c === l[i]){ return i } // use this for now\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn f? t.r : Type.list.index? 0 : -1;\n\t\t}\n\t}());\n\tType.time = Type.time || {};\n\tType.time.is = Type.time.is || function(t){ DEP('time'); return t? t instanceof Date : (+new Date().getTime()) }\n\n\tvar fn_is = Type.fn.is;\n\tvar list_is = Type.list.is;\n\tvar obj = Type.obj, obj_is = obj.is, obj_has = obj.has, obj_map = obj.map;\n\n\tvar Val = {};\n\tVal.is = function(v){ DEP('val.is'); // Valid values are a subset of JSON: null, binary, number (!Infinity), text, or a soul relation. Arrays need special algorithms to handle concurrency, so they are not supported directly. Use an extension that supports them if needed but research their problems first.\n\t\tif(v === u){ return false }\n\t\tif(v === null){ return true } // \"deletes\", nulling out keys.\n\t\tif(v === Infinity){ return false } // we want this to be, but JSON does not support it, sad face.\n\t\tif(text_is(v) // by \"text\" we mean strings.\n\t\t|| bi_is(v) // by \"binary\" we mean boolean.\n\t\t|| num_is(v)){ // by \"number\" we mean integers or decimals.\n\t\t\treturn true; // simple values are valid.\n\t\t}\n\t\treturn Val.link.is(v) || false; // is the value a soul relation? Then it is valid and return it. If not, everything else remaining is an invalid data type. Custom extensions can be built on top of these primitives to support other types.\n\t}\n\tVal.link = Val.rel = {_: '#'};\n\t;(function(){\n\t\tVal.link.is = function(v){ DEP('val.link.is'); // this defines whether an object is a soul relation or not, they look like this: {'#': 'UUID'}\n\t\t\tif(v && v[rel_] && !v._ && obj_is(v)){ // must be an object.\n\t\t\t\tvar o = {};\n\t\t\t\tobj_map(v, map, o);\n\t\t\t\tif(o.id){ // a valid id was found.\n\t\t\t\t\treturn o.id; // yay! Return it.\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false; // the value was not a valid soul relation.\n\t\t}\n\t\tfunction map(s, k){ var o = this; // map over the object...\n\t\t\tif(o.id){ return o.id = false } // if ID is already defined AND we're still looping through the object, it is considered invalid.\n\t\t\tif(k == rel_ && text_is(s)){ // the key should be '#' and have a text value.\n\t\t\t\to.id = s; // we found the soul!\n\t\t\t} else {\n\t\t\t\treturn o.id = false; // if there exists anything else on the object that isn't the soul, then it is considered invalid.\n\t\t\t}\n\t\t}\n\t}());\n\tVal.link.ify = function(t){ DEP('val.link.ify'); return obj_put({}, rel_, t) } // convert a soul into a relation and return it.\n\tType.obj.has._ = '.';\n\tvar rel_ = Val.link._, u;\n\tvar bi_is = Type.bi.is;\n\tvar num_is = Type.num.is;\n\tvar text_is = Type.text.is;\n\tvar obj = Type.obj, obj_is = obj.is, obj_put = obj.put, obj_map = obj.map;\n\n\tType.val = Type.val || Val;\n\n\tvar Node = {_: '_'};\n\tNode.soul = function(n, o){ DEP('node.soul'); return (n && n._ && n._[o || soul_]) } // convenience function to check to see if there is a soul on a node and return it.\n\tNode.soul.ify = function(n, o){ DEP('node.soul.ify'); // put a soul on an object.\n\t\to = (typeof o === 'string')? {soul: o} : o || {};\n\t\tn = n || {}; // make sure it exists.\n\t\tn._ = n._ || {}; // make sure meta exists.\n\t\tn._[soul_] = o.soul || n._[soul_] || text_random(); // put the soul on it.\n\t\treturn n;\n\t}\n\tNode.soul._ = Val.link._;\n\t;(function(){\n\t\tNode.is = function(n, cb, as){ DEP('node.is'); var s; // checks to see if an object is a valid node.\n\t\t\tif(!obj_is(n)){ return false } // must be an object.\n\t\t\tif(s = Node.soul(n)){ // must have a soul on it.\n\t\t\t\treturn !obj_map(n, map, {as:as,cb:cb,s:s,n:n});\n\t\t\t}\n\t\t\treturn false; // nope! This was not a valid node.\n\t\t}\n\t\tfunction map(v, k){ // we invert this because the way we check for this is via a negation.\n\t\t\tif(k === Node._){ return } // skip over the metadata.\n\t\t\tif(!Val.is(v)){ return true } // it is true that this is an invalid node.\n\t\t\tif(this.cb){ this.cb.call(this.as, v, k, this.n, this.s) } // optionally callback each key/value.\n\t\t}\n\t}());\n\t;(function(){\n\t\tNode.ify = function(obj, o, as){ DEP('node.ify'); // returns a node from a shallow object.\n\t\t\tif(!o){ o = {} }\n\t\t\telse if(typeof o === 'string'){ o = {soul: o} }\n\t\t\telse if('function' == typeof o){ o = {map: o} }\n\t\t\tif(o.map){ o.node = o.map.call(as, obj, u, o.node || {}) }\n\t\t\tif(o.node = Node.soul.ify(o.node || {}, o)){\n\t\t\t\tobj_map(obj, map, {o:o,as:as});\n\t\t\t}\n\t\t\treturn o.node; // This will only be a valid node if the object wasn't already deep!\n\t\t}\n\t\tfunction map(v, k){ var o = this.o, tmp, u; // iterate over each key/value.\n\t\t\tif(o.map){\n\t\t\t\ttmp = o.map.call(this.as, v, ''+k, o.node);\n\t\t\t\tif(u === tmp){\n\t\t\t\t\tobj_del(o.node, k);\n\t\t\t\t} else\n\t\t\t\tif(o.node){ o.node[k] = tmp }\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif(Val.is(v)){\n\t\t\t\to.node[k] = v;\n\t\t\t}\n\t\t}\n\t}());\n\tvar obj = Type.obj, obj_is = obj.is, obj_del = obj.del, obj_map = obj.map;\n\tvar text = Type.text, text_random = text.random;\n\tvar soul_ = Node.soul._;\n\tvar u;\n\tType.node = Type.node || Node;\n\n\tvar State = Type.state;\n\tState.lex = function(){ DEP('state.lex'); return State().toString(36).replace('.','') }\n\tState.to = function(from, k, to){ DEP('state.to'); \n\t\tvar val = (from||{})[k];\n\t\tif(obj_is(val)){\n\t\t\tval = obj_copy(val);\n\t\t}\n\t\treturn State.ify(to, k, State.is(from, k), val, Node.soul(from));\n\t}\n\t;(function(){\n\t\tState.map = function(cb, s, as){ DEP('state.map'); var u; // for use with Node.ify\n\t\t\tvar o = obj_is(o = cb || s)? o : null;\n\t\t\tcb = fn_is(cb = cb || s)? cb : null;\n\t\t\tif(o && !cb){\n\t\t\t\ts = num_is(s)? s : State();\n\t\t\t\to[N_] = o[N_] || {};\n\t\t\t\tobj_map(o, map, {o:o,s:s});\n\t\t\t\treturn o;\n\t\t\t}\n\t\t\tas = as || obj_is(s)? s : u;\n\t\t\ts = num_is(s)? s : State();\n\t\t\treturn function(v, k, o, opt){\n\t\t\t\tif(!cb){\n\t\t\t\t\tmap.call({o: o, s: s}, v,k);\n\t\t\t\t\treturn v;\n\t\t\t\t}\n\t\t\t\tcb.call(as || this || {}, v, k, o, opt);\n\t\t\t\tif(obj_has(o,k) && u === o[k]){ return }\n\t\t\t\tmap.call({o: o, s: s}, v,k);\n\t\t\t}\n\t\t}\n\t\tfunction map(v,k){\n\t\t\tif(N_ === k){ return }\n\t\t\tState.ify(this.o, k, this.s) ;\n\t\t}\n\t}());\n\tvar obj = Type.obj, obj_as = obj.as, obj_has = obj.has, obj_is = obj.is, obj_map = obj.map, obj_copy = obj.copy;\n\tvar num = Type.num, num_is = num.is;\n\tvar fn = Type.fn, fn_is = fn.is;\n\tvar N_ = Node._, u;\n\n\tvar Graph = {};\n\t;(function(){\n\t\tGraph.is = function(g, cb, fn, as){ DEP('graph.is'); // checks to see if an object is a valid graph.\n\t\t\tif(!g || !obj_is(g) || obj_empty(g)){ return false } // must be an object.\n\t\t\treturn !obj_map(g, map, {cb:cb,fn:fn,as:as}); // makes sure it wasn't an empty object.\n\t\t}\n\t\tfunction map(n, s){ // we invert this because the way'? we check for this is via a negation.\n\t\t\tif(!n || s !== Node.soul(n) || !Node.is(n, this.fn, this.as)){ return true } // it is true that this is an invalid graph.\n\t\t\tif(!this.cb){ return }\n\t\t\tnf.n = n; nf.as = this.as; // sequential race conditions aren't races.\n\t\t\tthis.cb.call(nf.as, n, s, nf);\n\t\t}\n\t\tfunction nf(fn){ // optional callback for each node.\n\t\t\tif(fn){ Node.is(nf.n, fn, nf.as) } // where we then have an optional callback for each key/value.\n\t\t}\n\t}());\n\t;(function(){\n\t\tGraph.ify = function(obj, env, as){ DEP('graph.ify'); \n\t\t\tvar at = {path: [], obj: obj};\n\t\t\tif(!env){\n\t\t\t\tenv = {};\n\t\t\t} else\n\t\t\tif(typeof env === 'string'){\n\t\t\t\tenv = {soul: env};\n\t\t\t} else\n\t\t\tif('function' == typeof env){\n\t\t\t\tenv.map = env;\n\t\t\t}\n\t\t\tif(typeof as === 'string'){\n\t\t\t\tenv.soul = env.soul || as;\n\t\t\t\tas = u;\n\t\t\t}\n\t\t\tif(env.soul){\n\t\t\t\tat.link = Val.link.ify(env.soul);\n\t\t\t}\n\t\t\tenv.shell = (as||{}).shell;\n\t\t\tenv.graph = env.graph || {};\n\t\t\tenv.seen = env.seen || [];\n\t\t\tenv.as = env.as || as;\n\t\t\tnode(env, at);\n\t\t\tenv.root = at.node;\n\t\t\treturn env.graph;\n\t\t}\n\t\tfunction node(env, at){ var tmp;\n\t\t\tif(tmp = seen(env, at)){ return tmp }\n\t\t\tat.env = env;\n\t\t\tat.soul = soul;\n\t\t\tif(Node.ify(at.obj, map, at)){\n\t\t\t\tat.link = at.link || Val.link.ify(Node.soul(at.node));\n\t\t\t\tif(at.obj !== env.shell){\n\t\t\t\t\tenv.graph[Val.link.is(at.link)] = at.node;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn at;\n\t\t}\n\t\tfunction map(v,k,n){\n\t\t\tvar at = this, env = at.env, is, tmp;\n\t\t\tif(Node._ === k && obj_has(v,Val.link._)){\n\t\t\t\treturn n._; // TODO: Bug?\n\t\t\t}\n\t\t\tif(!(is = valid(v,k,n, at,env))){ return }\n\t\t\tif(!k){\n\t\t\t\tat.node = at.node || n || {};\n\t\t\t\tif(obj_has(v, Node._) && Node.soul(v)){ // ? for safety ?\n\t\t\t\t\tat.node._ = obj_copy(v._);\n\t\t\t\t}\n\t\t\t\tat.node = Node.soul.ify(at.node, Val.link.is(at.link));\n\t\t\t\tat.link = at.link || Val.link.ify(Node.soul(at.node));\n\t\t\t}\n\t\t\tif(tmp = env.map){\n\t\t\t\ttmp.call(env.as || {}, v,k,n, at);\n\t\t\t\tif(obj_has(n,k)){\n\t\t\t\t\tv = n[k];\n\t\t\t\t\tif(u === v){\n\t\t\t\t\t\tobj_del(n, k);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tif(!(is = valid(v,k,n, at,env))){ return }\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(!k){ return at.node }\n\t\t\tif(true === is){\n\t\t\t\treturn v;\n\t\t\t}\n\t\t\ttmp = node(env, {obj: v, path: at.path.concat(k)});\n\t\t\tif(!tmp.node){ return }\n\t\t\treturn tmp.link; //{'#': Node.soul(tmp.node)};\n\t\t}\n\t\tfunction soul(id){ var at = this;\n\t\t\tvar prev = Val.link.is(at.link), graph = at.env.graph;\n\t\t\tat.link = at.link || Val.link.ify(id);\n\t\t\tat.link[Val.link._] = id;\n\t\t\tif(at.node && at.node[Node._]){\n\t\t\t\tat.node[Node._][Val.link._] = id;\n\t\t\t}\n\t\t\tif(obj_has(graph, prev)){\n\t\t\t\tgraph[id] = graph[prev];\n\t\t\t\tobj_del(graph, prev);\n\t\t\t}\n\t\t}\n\t\tfunction valid(v,k,n, at,env){ var tmp;\n\t\t\tif(Val.is(v)){ return true }\n\t\t\tif(obj_is(v)){ return 1 }\n\t\t\tif(tmp = env.invalid){\n\t\t\t\tv = tmp.call(env.as || {}, v,k,n);\n\t\t\t\treturn valid(v,k,n, at,env);\n\t\t\t}\n\t\t\tenv.err = \"Invalid value at '\" + at.path.concat(k).join('.') + \"'!\";\n\t\t\tif(Type.list.is(v)){ env.err += \" Use `.set(item)` instead of an Array.\" }\n\t\t}\n\t\tfunction seen(env, at){\n\t\t\tvar arr = env.seen, i = arr.length, has;\n\t\t\twhile(i--){ has = arr[i];\n\t\t\t\tif(at.obj === has.obj){ return has }\n\t\t\t}\n\t\t\tarr.push(at);\n\t\t}\n\t}());\n\tGraph.node = function(node){ DEP('graph.node'); \n\t\tvar soul = Node.soul(node);\n\t\tif(!soul){ return }\n\t\treturn obj_put({}, soul, node);\n\t}\n\t;(function(){\n\t\tGraph.to = function(graph, root, opt){ DEP('graph.to'); \n\t\t\tif(!graph){ return }\n\t\t\tvar obj = {};\n\t\t\topt = opt || {seen: {}};\n\t\t\tobj_map(graph[root], map, {obj:obj, graph: graph, opt: opt});\n\t\t\treturn obj;\n\t\t}\n\t\tfunction map(v,k){ var tmp, obj;\n\t\t\tif(Node._ === k){\n\t\t\t\tif(obj_empty(v, Val.link._)){\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tthis.obj[k] = obj_copy(v);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif(!(tmp = Val.link.is(v))){\n\t\t\t\tthis.obj[k] = v;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif(obj = this.opt.seen[tmp]){\n\t\t\t\tthis.obj[k] = obj;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.obj[k] = this.opt.seen[tmp] = Graph.to(this.graph, tmp, this.opt);\n\t\t}\n\t}());\n\tvar fn_is = Type.fn.is;\n\tvar obj = Type.obj, obj_is = obj.is, obj_del = obj.del, obj_has = obj.has, obj_empty = obj.empty, obj_put = obj.put, obj_map = obj.map, obj_copy = obj.copy;\n\tvar u;\n\tType.graph = Type.graph || Graph;\n}());","var fs = require('fs');\nvar path = require('path');\nvar dot = /\\.\\.+/g;\nvar slash = /\\/\\/+/g;\n\nfunction CDN(dir){\n\treturn function(req, res){\n\t\treq.url = (req.url||'').replace(dot,'').replace(slash,'/');\n\t\tif(serve(req, res)){ return } // filters GUN requests!\n\t\tif (req.url.slice(-3) === '.js') {\n\t\t\tres.writeHead(200, {'Content-Type': 'text/javascript'});\n\t\t}\n\t\tfs.createReadStream(path.join(dir, req.url)).on('error',function(tmp){ // static files!\n\t\t\tfs.readFile(path.join(dir, 'index.html'), function(err, tmp){\n\t\t\t\ttry{ res.writeHead(200, {'Content-Type': 'text/html'});\n\t\t\t\tres.end(tmp+''); }catch(e){} // or default to index\n\t\t})}).pipe(res); // stream\n\t}\n}\n\nfunction serve(req, res, next){ var tmp;\n\tif(typeof req === 'string'){\n\t\treturn CDN(req);\n\t}\n\tif(!req || !res){ return false }\n\tnext = next || serve;\n\tif(!req.url){ return next() }\n\tif(res.setHeader){ res.setHeader('Access-Control-Allow-Origin', '*') }\n\tif(0 <= req.url.indexOf('gun.js')){\n\t\tres.writeHead(200, {'Content-Type': 'text/javascript'});\n\t\tres.end(serve.js = serve.js || require('fs').readFileSync(__dirname + '/../gun.js'));\n\t\treturn true;\n\t}\n\tif(0 <= req.url.indexOf('gun/')){\n\t\tvar path = __dirname + '/../' + req.url.split('/').slice(2).join('/');\n\t\tif('/' === path.slice(-1)){\n\t\t\tfs.readdir(path, function(err, dir){ res.end((dir || (err && 404))+'') });\n\t\t\treturn true;\n\t\t}\n\t\tvar S = +new Date;\n\t\tvar rs = fs.createReadStream(path);\n\t\trs.on('open', function(){ console.STAT && console.STAT(S, +new Date - S, 'serve file open'); rs.pipe(res) });\n\t\trs.on('error', function(err){ res.end(404+'') });\n\t\trs.on('end', function(){ console.STAT && console.STAT(S, +new Date - S, 'serve file end') });\n\t\treturn true;\n\t}\n\tif((tmp = req.socket) && (tmp = tmp.server) && (tmp = tmp.route)){ var url;\n\t\tif(tmp = tmp[(((req.url||'').slice(1)).split('/')[0]||'').split('.')[0]]){\n\t\t\ttry{ return tmp(req, res, next) }catch(e){ console.log(req.url+' crashed with '+e) }\n\t\t}\n\t}\n\treturn next();\n}\n\nmodule.exports = serve;\n",";(function(){\n\n\tfunction Radix(){\n\t\tvar radix = function(key, val, t){\n\t\t\tradix.unit = 0;\n\t\t\tif(!t && u !== val){ \n\t\t\t\tradix.last = (''+key < radix.last)? radix.last : ''+key;\n\t\t\t\tdelete (radix.$||{})[_];\n\t\t\t}\n\t\t\tt = t || radix.$ || (radix.$ = {});\n\t\t\tif(!key && Object.keys(t).length){ return t }\n\t\t\tkey = ''+key;\n\t\t\tvar i = 0, l = key.length-1, k = key[i], at, tmp;\n\t\t\twhile(!(at = t[k]) && i < l){\n\t\t\t\tk += key[++i];\n\t\t\t}\n\t\t\tif(!at){\n\t\t\t\tif(!each(t, function(r, s){\n\t\t\t\t\tvar ii = 0, kk = '';\n\t\t\t\t\tif((s||'').length){ while(s[ii] == key[ii]){\n\t\t\t\t\t\tkk += s[ii++];\n\t\t\t\t\t} }\n\t\t\t\t\tif(kk){\n\t\t\t\t\t\tif(u === val){\n\t\t\t\t\t\t\tif(ii <= l){ return }\n\t\t\t\t\t\t\t(tmp || (tmp = {}))[s.slice(ii)] = r;\n\t\t\t\t\t\t\t//(tmp[_] = function $(){ $.sort = Object.keys(tmp).sort(); return $ }()); // get rid of this one, cause it is on read?\n\t\t\t\t\t\t\treturn r;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tvar __ = {};\n\t\t\t\t\t\t__[s.slice(ii)] = r;\n\t\t\t\t\t\tii = key.slice(ii);\n\t\t\t\t\t\t('' === ii)? (__[''] = val) : ((__[ii] = {})[''] = val);\n\t\t\t\t\t\t//(__[_] = function $(){ $.sort = Object.keys(__).sort(); return $ }());\n\t\t\t\t\t\tt[kk] = __;\n\t\t\t\t\t\tif(Radix.debug && 'undefined' === ''+kk){ console.log(0, kk); debugger }\n\t\t\t\t\t\tdelete t[s];\n\t\t\t\t\t\t//(t[_] = function $(){ $.sort = Object.keys(t).sort(); return $ }());\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t})){\n\t\t\t\t\tif(u === val){ return; }\n\t\t\t\t\t(t[k] || (t[k] = {}))[''] = val;\n\t\t\t\t\tif(Radix.debug && 'undefined' === ''+k){ console.log(1, k); debugger }\n\t\t\t\t\t//(t[_] = function $(){ $.sort = Object.keys(t).sort(); return $ }());\n\t\t\t\t}\n\t\t\t\tif(u === val){\n\t\t\t\t\treturn tmp;\n\t\t\t\t}\n\t\t\t} else \n\t\t\tif(i == l){\n\t\t\t\t//if(u === val){ return (u === (tmp = at['']))? at : tmp } // THIS CODE IS CORRECT, below is\n\t\t\t\tif(u === val){ return (u === (tmp = at['']))? at : ((radix.unit = 1) && tmp) } // temporary help??\n\t\t\t\tat[''] = val;\n\t\t\t\t//(at[_] = function $(){ $.sort = Object.keys(at).sort(); return $ }());\n\t\t\t} else {\n\t\t\t\tif(u !== val){ delete at[_] }\n\t\t\t\t//at && (at[_] = function $(){ $.sort = Object.keys(at).sort(); return $ }());\n\t\t\t\treturn radix(key.slice(++i), val, at || (at = {}));\n\t\t\t}\n\t\t}\n\t\treturn radix;\n\t};\n\n\tRadix.map = function rap(radix, cb, opt, pre){\n\t\ttry {\n\t\t\tpre = pre || []; // TODO: BUG: most out-of-memory crashes come from here.\n\t\t\tvar t = ('function' == typeof radix)? radix.$ || {} : radix;\n\t\t\t//!opt && console.log(\"WHAT IS T?\", JSON.stringify(t).length);\n\t\t\tif(!t){ return }\n\t\t\tif('string' == typeof t){ if(Radix.debug){ throw ['BUG:', radix, cb, opt, pre] } return; }\n\t\t\tvar keys = (t[_]||no).sort || (t[_] = function $(){ $.sort = Object.keys(t).sort(); return $ }()).sort, rev; // ONLY 17% of ops are pre-sorted!\n\t\t\t//var keys = Object.keys(t).sort();\n\t\t\topt = (true === opt)? {branch: true} : (opt || {});\n\t\t\tif(rev = opt.reverse){ keys = keys.slice(0).reverse() }\n\t\t\tvar start = opt.start, end = opt.end, END = '\\uffff';\n\t\t\tvar i = 0, l = keys.length;\n\t\t\tfor(;i < l; i++){ var key = keys[i], tree = t[key], tmp, p, pt;\n\t\t\t\tif(!tree || '' === key || _ === key || 'undefined' === key){ continue }\n\t\t\t\tp = pre.slice(0); p.push(key);\n\t\t\t\tpt = p.join('');\n\t\t\t\tif(u !== start && pt < (start||'').slice(0,pt.length)){ continue }\n\t\t\t\tif(u !== end && (end || END) < pt){ continue }\n\t\t\t\tif(rev){ // children must be checked first when going in reverse.\n\t\t\t\t\ttmp = rap(tree, cb, opt, p);\n\t\t\t\t\tif(u !== tmp){ return tmp }\n\t\t\t\t}\n\t\t\t\tif(u !== (tmp = tree[''])){\n\t\t\t\t\tvar yes = 1;\n\t\t\t\t\tif(u !== start && pt < (start||'')){ yes = 0 }\n\t\t\t\t\tif(u !== end && pt > (end || END)){ yes = 0 }\n\t\t\t\t\tif(yes){\n\t\t\t\t\t\ttmp = cb(tmp, pt, key, pre);\n\t\t\t\t\t\tif(u !== tmp){ return tmp }\n\t\t\t\t\t}\n\t\t\t\t} else\n\t\t\t\tif(opt.branch){\n\t\t\t\t\ttmp = cb(u, pt, key, pre);\n\t\t\t\t\tif(u !== tmp){ return tmp }\n\t\t\t\t}\n\t\t\t\tpre = p;\n\t\t\t\tif(!rev){\n\t\t\t\t\ttmp = rap(tree, cb, opt, pre);\n\t\t\t\t\tif(u !== tmp){ return tmp }\n\t\t\t\t}\n\t\t\t\tpre.pop();\n\t\t\t}\n\t\t} catch (e) { console.error(e); }\n\t};\n\n\tif(typeof window !== \"undefined\"){\n\t window.Radix = Radix;\n\t} else { \n\t\ttry{ module.exports = Radix }catch(e){}\n\t}\n\tvar each = Radix.object = function(o, f, r){\n\t\tfor(var k in o){\n\t\t\tif(!o.hasOwnProperty(k)){ continue }\n\t\t\tif((r = f(o[k], k)) !== u){ return r }\n\t\t}\n\t}, no = {}, u;\n\tvar _ = String.fromCharCode(24);\n\t\n}());\n","module.exports = function(r){\n\tvar Radix = require('./radix');\n\tr.find('a', function(){\n\t\tvar l = [];\n\t\tRadix.map(r.list, function(v,f){\n\t\t\tif(!(f.indexOf('%1B') + 1)){ return }\n\t\t\tif(!v){ return }\n\t\t\tl.push([f,v]);\n\t\t});\n\t\tif(l.length){\n\t\t\tconsole.log(\"\\n! ! ! WARNING ! ! !\\nRAD v0.2020.x has detected OLD v0.2019.x data & automatically migrating. Automatic migration will be turned OFF in future versions! If you are just developing/testing, we recommend you reset your data. Please contact us if you have any concerns.\\nThis message should only log once.\")\n\t\t}\n\t\tvar f, v;\n\t\tl.forEach(function(a){\n\t\t\tf = a[0]; v = a[1];\n\t\t\tr.list(decodeURIComponent(f), v);\n\t\t\tr.list(f, 0);\n\t\t});\n\t\tif(!f){ return }\n\t\tr.find.bad(f);\n\t})\n};",";(function(){\n\n\tfunction Radisk(opt){\n\n\t\topt = opt || {};\n\t\topt.log = opt.log || console.log;\n\t\topt.file = String(opt.file || 'radata');\n\t\tvar has = (Radisk.has || (Radisk.has = {}))[opt.file];\n\t\tif(has){ return has }\n\n\t\topt.max = opt.max || (opt.memory? (opt.memory * 999 * 999) : 300000000) * 0.3;\n\t\topt.until = opt.until || opt.wait || 250;\n\t\topt.batch = opt.batch || (10 * 1000);\n\t\topt.chunk = opt.chunk || (1024 * 1024 * 1); // 1MB\n\t\topt.code = opt.code || {};\n\t\topt.code.from = opt.code.from || '!';\n\t\topt.jsonify = true;\n\n\n\t\tfunction ename(t){ return encodeURIComponent(t).replace(/\\*/g, '%2A') } // TODO: Hash this also, but allow migration!\n\t\tfunction atomic(v){ return u !== v && (!v || 'object' != typeof v) }\n\t\tvar timediate = (''+u === typeof setImmediate)? setTimeout : setImmediate;\n\t\tvar puff = setTimeout.turn || timediate, u;\n\t\tvar map = Radix.object;\n\t\tvar ST = 0;\n\n\t\tif(!opt.store){\n\t\t\treturn opt.log(\"ERROR: Radisk needs `opt.store` interface with `{get: fn, put: fn (, list: fn)}`!\");\n\t\t}\n\t\tif(!opt.store.put){\n\t\t\treturn opt.log(\"ERROR: Radisk needs `store.put` interface with `(file, data, cb)`!\");\n\t\t}\n\t\tif(!opt.store.get){\n\t\t\treturn opt.log(\"ERROR: Radisk needs `store.get` interface with `(file, cb)`!\");\n\t\t}\n\t\tif(!opt.store.list){\n\t\t\t//opt.log(\"WARNING: `store.list` interface might be needed!\");\n\t\t}\n\n\t\tif(''+u != typeof require){ require('./yson') }\n\t\tvar parse = JSON.parseAsync || function(t,cb,r){ var u; try{ cb(u, JSON.parse(t,r)) }catch(e){ cb(e) } }\n\t\tvar json = JSON.stringifyAsync || function(v,cb,r,s){ var u; try{ cb(u, JSON.stringify(v,r,s)) }catch(e){ cb(e) } }\n\t\t/*\n\t\t\tAny and all storage adapters should...\n\t\t\t1. Because writing to disk takes time, we should batch data to disk. This improves performance, and reduces potential disk corruption.\n\t\t\t2. If a batch exceeds a certain number of writes, we should immediately write to disk when physically possible. This caps total performance, but reduces potential loss.\n\t\t*/\n\t\tvar r = function(key, data, cb, tag, DBG){\n\t\t\tif('function' === typeof data){\n\t\t\t\tvar o = cb || {};\n\t\t\t\tcb = data;\n\t\t\t\tr.read(key, cb, o, DBG || tag);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t//var tmp = (tmp = r.batch = r.batch || {})[key] = tmp[key] || {};\n\t\t\t//var tmp = (tmp = r.batch = r.batch || {})[key] = data;\n\t\t\tr.save(key, data, cb, tag, DBG);\n\t\t}\n\t\tr.save = function(key, data, cb, tag, DBG){\n\t\t\tvar s = {key: key}, tags, f, d, q;\n\t\t\ts.find = function(file){ var tmp;\n\t\t\t\ts.file = file || (file = opt.code.from);\n\t\t\t\tDBG && (DBG = DBG[file] = DBG[file] || {});\n\t\t\t\tDBG && (DBG.sf = DBG.sf || +new Date);\n\t\t\t\t//console.only.i && console.log('found', file);\n\t\t\t\tif(tmp = r.disk[file]){ s.mix(u, tmp); return }\n\t\t\t\tr.parse(file, s.mix, u, DBG);\n\t\t\t}\n\t\t\ts.mix = function(err, disk){\n\t\t\t\tDBG && (DBG.sml = +new Date);\n\t\t\t\tDBG && (DBG.sm = DBG.sm || +new Date);\n\t\t\t\tif(s.err = err || s.err){ cb(err); return } // TODO: HANDLE BATCH EMIT\n\t\t\t\tvar file = s.file = (disk||'').file || s.file, tmp;\n\t\t\t\tif(!disk && file !== opt.code.from){ // corrupt file?\n\t\t\t\t\tr.find.bad(file); // remove from dir list\n\t\t\t\t\tr.save(key, data, cb, tag); // try again\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t(disk = r.disk[file] || (r.disk[file] = disk || Radix())).file || (disk.file = file);\n\t\t\t\tif(opt.compare){\n\t\t\t\t\tdata = opt.compare(disk(key), data, key, file);\n\t\t\t\t\tif(u === data){ cb(err, -1); return } // TODO: HANDLE BATCH EMIT\n\t\t\t\t}\n\t\t\t\t(s.disk = disk)(key, data);\n\t\t\t\tif(tag){\n\t\t\t\t\t(tmp = (tmp = disk.tags || (disk.tags = {}))[tag] || (tmp[tag] = r.tags[tag] || (r.tags[tag] = {})))[file] || (tmp[file] = r.one[tag] || (r.one[tag] = cb));\n\t\t\t\t\tcb = null;\n\t\t\t\t}\n\t\t\t\tDBG && (DBG.st = DBG.st || +new Date);\n\t\t\t\t//console.only.i && console.log('mix', disk.Q);\n\t\t\t\tif(disk.Q){ cb && disk.Q.push(cb); return } disk.Q = (cb? [cb] : []);\n\t\t\t\tdisk.to = setTimeout(s.write, opt.until);\n\t\t\t}\n\t\t\ts.write = function(){\n\t\t\t\tDBG && (DBG.sto = DBG.sto || +new Date);\n\t\t\t\tvar file = f = s.file, disk = d = s.disk;\n\t\t\t\tq = s.q = disk.Q;\n\t\t\t\ttags = s.tags = disk.tags;\n\t\t\t\tdelete disk.Q;\n\t\t\t\tdelete r.disk[file];\n\t\t\t\tdelete disk.tags;\n\t\t\t\t//console.only.i && console.log('write', file, disk, 'was saving:', key, data);\n\t\t\t\tr.write(file, disk, s.ack, u, DBG);\n\t\t\t}\n\t\t\ts.ack = function(err, ok){\n\t\t\t\tDBG && (DBG.sa = DBG.sa || +new Date);\n\t\t\t\tDBG && (DBG.sal = q.length);\n\t\t\t\tvar ack, tmp;\n\t\t\t\t// TODO!!!! CHANGE THIS INTO PUFF!!!!!!!!!!!!!!!!\n\t\t\t\tfor(var id in r.tags){\n\t\t\t\t\tif(!r.tags.hasOwnProperty(id)){ continue } var tag = r.tags[id];\n\t\t\t\t\tif((tmp = r.disk[f]) && (tmp = tmp.tags) && tmp[tag]){ continue }\n\t\t\t\t\tack = tag[f];\n\t\t\t\t\tdelete tag[f];\n\t\t\t\t\tvar ne; for(var k in tag){ if(tag.hasOwnProperty(k)){ ne = true; break } } // is not empty?\n\t\t\t\t\tif(ne){ continue } //if(!obj_empty(tag)){ continue }\n\t\t\t\t\tdelete r.tags[tag];\n\t\t\t\t\tack && ack(err, ok);\n\t\t\t\t}\n\t\t\t\t!q && (q = '');\n\t\t\t\tvar l = q.length, i = 0;\n\t\t\t\t// TODO: PERF: Why is acks so slow, what work do they do??? CHECK THIS!!\n\t\t\t\t// TODO: PERF: Why is acks so slow, what work do they do??? CHECK THIS!!\n\t\t\t\t// TODO: PERF: Why is acks so slow, what work do they do??? CHECK THIS!!\n\t\t\t\t// TODO: PERF: Why is acks so slow, what work do they do??? CHECK THIS!!\n\t\t\t\t// TODO: PERF: Why is acks so slow, what work do they do??? CHECK THIS!!\n\t\t\t\t// TODO: PERF: Why is acks so slow, what work do they do??? CHECK THIS!!\n\t\t\t\t// TODO: PERF: Why is acks so slow, what work do they do??? CHECK THIS!!\n\t\t\t\tvar S = +new Date;\n\t\t\t\tfor(;i < l; i++){ (ack = q[i]) && ack(err, ok) }\n\t\t\t\tconsole.STAT && console.STAT(S, +new Date - S, 'rad acks', ename(s.file));\n\t\t\t\tconsole.STAT && console.STAT(S, q.length, 'rad acks #', ename(s.file));\n\t\t\t}\n\t\t\tcb || (cb = function(err, ok){ // test delete!\n\t\t\t\tif(!err){ return }\n\t\t\t});\n\t\t\t//console.only.i && console.log('save', key);\n\t\t\tr.find(key, s.find);\n }\n r.disk = {};\n r.one = {};\n r.tags = {};\n\n\t\t/*\n\t\t\tAny storage engine at some point will have to do a read in order to write.\n\t\t\tThis is true of even systems that use an append only log, if they support updates.\n\t\t\tTherefore it is unavoidable that a read will have to happen,\n\t\t\tthe question is just how long you delay it.\n\t\t*/\n\t\tvar RWC = 0;\n\t\tr.write = function(file, rad, cb, o, DBG){\n\t\t\tif(!rad){ cb('No radix!'); return }\n\t\t\to = ('object' == typeof o)? o : {force: o};\n\t\t\tvar f = function Fractal(){}, a, b;\n\t\t\tf.text = '';\n\t\t\tf.file = file = rad.file || (rad.file = file);\n\t\t\tif(!file){ cb('What file?'); return }\n\t\t\tf.write = function(){\n\t\t\t\tvar text = rad.raw = f.text;\n\t\t\t\tr.disk[file = rad.file || f.file || file] = rad;\n\t\t\t\tvar S = +new Date;\n\t\t\t\tDBG && (DBG.wd = S);\n\t\t\t\t//console.only.i && console.log('add', file);\n\t\t\t\tr.find.add(file, function add(err){\n\t\t\t\t\tDBG && (DBG.wa = +new Date);\n\t\t\t\t\tif(err){ cb(err); return }\n\t\t\t\t\t//console.only.i && console.log('disk', file, text);\n\t\t\t\t\topt.store.put(ename(file), text, function safe(err, ok){\n\t\t\t\t\t\tDBG && (DBG.wp = +new Date);\n\t\t\t\t\t\tconsole.STAT && console.STAT(S, ST = +new Date - S, \"wrote disk\", JSON.stringify(file), ++RWC, 'total all writes.');\n\t\t\t\t\t\t//console.only.i && console.log('done', err, ok || 1, cb);\n\t\t\t\t\t\tcb(err, ok || 1);\n\t\t\t\t\t\tif(!rad.Q){ delete r.disk[file] } // VERY IMPORTANT! Clean up memory, but not if there is already queued writes on it!\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t}\n\t\t\tf.split = function(){\n\t\t\t\tvar S = +new Date;\n\t\t\t\tDBG && (DBG.wf = S);\n\t\t\t\tf.text = '';\n\t\t\t\tif(!f.count){ f.count = 0;\n\t\t\t\t\tRadix.map(rad, function count(){ f.count++ }); // TODO: Perf? Any faster way to get total length?\n\t\t\t\t}\n\t\t\t\tDBG && (DBG.wfc = f.count);\n\t\t\t\tf.limit = Math.ceil(f.count/2);\n\t\t\t\tvar SC = f.count;\n\t\t\t\tf.count = 0;\n\t\t\t\tDBG && (DBG.wf1 = +new Date);\n\t\t\t\tf.sub = Radix();\n\t\t\t\tRadix.map(rad, f.slice, {reverse: 1}); // IMPORTANT: DO THIS IN REVERSE, SO LAST HALF OF DATA MOVED TO NEW FILE BEFORE DROPPING FROM CURRENT FILE.\n\t\t\t\tDBG && (DBG.wf2 = +new Date);\n\t\t\t\tr.write(f.end, f.sub, f.both, o);\n\t\t\t\tDBG && (DBG.wf3 = +new Date);\n\t\t\t\tf.hub = Radix();\n\t\t\t\tRadix.map(rad, f.stop);\n\t\t\t\tDBG && (DBG.wf4 = +new Date);\n\t\t\t\tr.write(rad.file, f.hub, f.both, o);\n\t\t\t\tDBG && (DBG.wf5 = +new Date);\n\t\t\t\tconsole.STAT && console.STAT(S, +new Date - S, \"rad split\", ename(rad.file), SC);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tf.slice = function(val, key){\n\t\t\t\tf.sub(f.end = key, val);\n\t\t\t\tif(f.limit <= (++f.count)){ return true }\n\t\t\t}\n\t\t\tf.stop = function(val, key){\n\t\t\t\tif(key >= f.end){ return true }\n\t\t\t\tf.hub(key, val);\n\t\t\t}\n\t\t\tf.both = function(err, ok){\n\t\t\t\tDBG && (DBG.wfd = +new Date);\n\t\t\t\tif(b){ cb(err || b); return }\n\t\t\t\tif(a){ cb(err, ok); return }\n\t\t\t\ta = true;\n\t\t\t\tb = err;\n\t\t\t}\n\t\t\tf.each = function(val, key, k, pre){\n\t\t\t\tif(u !== val){ f.count++ }\n\t\t\t\tif(opt.max <= (val||'').length){ return cb(\"Data too big!\"), true }\n\t\t\t\tvar enc = Radisk.encode(pre.length) +'#'+ Radisk.encode(k) + (u === val? '' : ':'+ Radisk.encode(val)) +'\\n';\n\t\t\t\tif((opt.chunk < f.text.length + enc.length) && (1 < f.count) && !o.force){\n\t\t\t\t\treturn f.split();\n\t\t\t\t}\n\t\t\t\tf.text += enc;\n\t\t\t}\n\t\t\t//console.only.i && console.log('writing');\n\t\t\tif(opt.jsonify){ r.write.jsonify(f, rad, cb, o, DBG); return } // temporary testing idea\n\t\t\tif(!Radix.map(rad, f.each, true)){ f.write() }\n\t\t}\n\n\t\tr.write.jsonify = function(f, rad, cb, o, DBG){\n\t\t\tvar raw;\n\t\t\tvar S = +new Date;\n\t\t\tDBG && (DBG.w = S);\n\t\t\ttry{raw = JSON.stringify(rad.$);\n\t\t\t}catch(e){ cb(\"Cannot radisk!\"); return }\n\t\t\tDBG && (DBG.ws = +new Date);\n\t\t\tconsole.STAT && console.STAT(S, +new Date - S, \"rad stringified JSON\");\n\t\t\tif(opt.chunk < raw.length && !o.force){\n\t\t\t\tvar c = 0;\n\t\t\t\tRadix.map(rad, function(){\n\t\t\t\t\tif(c++){ return true } // more than 1 item\n\t\t\t\t});\n\t\t\t\tif(c > 1){\n\t\t\t\t\treturn f.split();\n\t\t\t\t}\n\t\t\t}\n\t\t\tf.text = raw;\n\t\t\tf.write();\n\t\t}\n\n\t\tr.range = function(tree, o){\n\t\t\tif(!tree || !o){ return }\n\t\t\tif(u === o.start && u === o.end){ return tree }\n\t\t\tif(atomic(tree)){ return tree }\n\t\t\tvar sub = Radix();\n\t\t\tRadix.map(tree, function(v,k){ sub(k,v) }, o); // ONLY PLACE THAT TAKES TREE, maybe reduce API for better perf?\n\t\t\treturn sub('');\n\t\t}\n\n\t\t;(function(){\n\t\t\tr.read = function(key, cb, o, DBG){\n\t\t\t\to = o || {};\n\t\t\t\tvar g = {key: key};\n\t\t\t\tg.find = function(file){ var tmp;\n\t\t\t\t\tg.file = file || (file = opt.code.from);\n\t\t\t\t\tDBG && (DBG = DBG[file] = DBG[file] || {});\n\t\t\t\t\tDBG && (DBG.rf = DBG.rf || +new Date);\n\t\t\t\t\tif(tmp = r.disk[g.file = file]){ g.check(u, tmp); return }\n\t\t\t\t\tr.parse(file, g.check, u, DBG);\n\t\t\t\t}\n\t\t\t\tg.get = function(err, disk, info){\n\t\t\t\t\tDBG && (DBG.rgl = +new Date);\n\t\t\t\t\tDBG && (DBG.rg = DBG.rg || +new Date);\n\t\t\t\t\tif(g.err = err || g.err){ cb(err); return }\n\t\t\t\t\tvar file = g.file = (disk||'').file || g.file;\n\t\t\t\t\tif(!disk && file !== opt.code.from){ // corrupt file?\n\t\t\t\t\t\tr.find.bad(file); // remove from dir list\n\t\t\t\t\t\tr.read(key, cb, o); // try again\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tdisk = r.disk[file] || (r.disk[file] = disk);\n\t\t\t\t\tif(!disk){ cb(file === opt.code.from? u : \"No file!\"); return }\n\t\t\t\t\tdisk.file || (disk.file = file);\n\t\t\t\t\tvar data = r.range(disk(key), o);\n\t\t\t\t\tDBG && (DBG.rr = +new Date);\n\t\t\t\t\to.unit = disk.unit;\n\t\t\t\t\to.chunks = (o.chunks || 0) + 1;\n\t\t\t\t\to.parsed = (o.parsed || 0) + ((info||'').parsed||(o.chunks*opt.chunk));\n\t\t\t\t\to.more = 1;\n\t\t\t\t\to.next = u;\n\t\t\t\t\tRadix.map(r.list, function next(v,f){\n\t\t\t\t\t\tif(!v || file === f){ return }\n\t\t\t\t\t\to.next = f;\n\t\t\t\t\t\treturn 1;\n\t\t\t\t\t}, o.reverse? {reverse: 1, end: file} : {start: file});\n\t\t\t\t\tDBG && (DBG.rl = +new Date);\n\t\t\t\t\tif(!o.next){ o.more = 0 }\n\t\t\t\t\tif(o.next){\n\t\t\t\t\t\tif(!o.reverse && ((key < o.next && 0 != o.next.indexOf(key)) || (u !== o.end && (o.end || '\\uffff') < o.next))){ o.more = 0 }\n\t\t\t\t\t\tif(o.reverse && ((key > o.next && 0 != key.indexOf(o.next)) || ((u !== o.start && (o.start || '') > o.next && file <= o.start)))){ o.more = 0 }\n\t\t\t\t\t}\n\t\t\t\t\t//console.log(5, process.memoryUsage().heapUsed);\n\t\t\t\t\tif(!o.more){ cb(g.err, data, o); return }\n\t\t\t\t\tif(data){ cb(g.err, data, o) }\n\t\t\t\t\tif(o.parsed >= o.limit){ return }\n\t\t\t\t\tvar S = +new Date;\n\t\t\t\t\tDBG && (DBG.rm = S);\n\t\t\t\t\tvar next = o.next;\n\t\t\t\t\ttimediate(function(){\n\t\t\t\t\t\tconsole.STAT && console.STAT(S, +new Date - S, 'rad more');\n\t\t\t\t\t\tr.parse(next, g.check);\n\t\t\t\t\t},0);\n\t\t\t\t}\n\t\t\t\tg.check = function(err, disk, info){\n\t\t\t\t\t//console.log(4, process.memoryUsage().heapUsed);\n\t\t\t\t\tg.get(err, disk, info);\n\t\t\t\t\tif(!disk || disk.check){ return } disk.check = 1;\n\t\t\t\t\tvar S = +new Date;\n\t\t\t\t\t(info || (info = {})).file || (info.file = g.file);\n\t\t\t\t\tRadix.map(disk, function(val, key){\n\t\t\t\t\t\t// assume in memory for now, since both write/read already call r.find which will init it.\n\t\t\t\t\t\tr.find(key, function(file){\n\t\t\t\t\t\t\tif((file || (file = opt.code.from)) === info.file){ return }\n\t\t\t\t\t\t\tvar id = (''+Math.random()).slice(-3);\n\t\t\t\t\t\t\tpuff(function(){\n\t\t\t\t\t\t\tr.save(key, val, function ack(err, ok){\n\t\t\t\t\t\t\t\tif(err){ r.save(key, val, ack); return } // ad infinitum???\n\t\t\t\t\t\t\t\t// TODO: NOTE!!! Mislocated data could be because of a synchronous `put` from the `g.get(` other than perf shouldn't we do the check first before acking?\n\t\t\t\t\t\t\t\tconsole.STAT && console.STAT(\"MISLOCATED DATA CORRECTED\", id, ename(key), ename(info.file), ename(file));\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t},0);\n\t\t\t\t\t\t})\n\t\t\t\t\t});\n\t\t\t\t\tconsole.STAT && console.STAT(S, +new Date - S, \"rad check\");\n\t\t\t\t}\n\t\t\t\tr.find(key || (o.reverse? (o.end||'') : (o.start||'')), g.find); \n\t\t\t}\n\t\t\tfunction rev(a,b){ return b }\n\t\t\tvar revo = {reverse: true};\n\t\t}());\n\n\t\t;(function(){\n\t\t\t/*\n\t\t\t\tLet us start by assuming we are the only process that is\n\t\t\t\tchanging the directory or bucket. Not because we do not want\n\t\t\t\tto be multi-process/machine, but because we want to experiment\n\t\t\t\twith how much performance and scale we can get out of only one.\n\t\t\t\tThen we can work on the harder problem of being multi-process.\n\t\t\t*/\n\t\t\tvar RPC = 0;\n\t\t\tvar Q = {}, s = String.fromCharCode(31);\n\t\t\tr.parse = function(file, cb, raw, DBG){ var q;\n\t\t\t\tif(!file){ return cb(); }\n\t\t\t\tif(q = Q[file]){ q.push(cb); return } q = Q[file] = [cb];\n\t\t\t\tvar p = function Parse(){}, info = {file: file};\n\t\t\t\t(p.disk = Radix()).file = file;\n\t\t\t\tp.read = function(err, data){ var tmp;\n\t\t\t\t\tDBG && (DBG.rpg = +new Date);\n\t\t\t\t\tconsole.STAT && console.STAT(S, +new Date - S, 'read disk', JSON.stringify(file), ++RPC, 'total all parses.');\n\t\t\t\t\t//console.log(2, process.memoryUsage().heapUsed);\n\t\t\t\t\tif((p.err = err) || (p.not = !data)){\n\t\t\t\t\t\tdelete Q[file];\n\t\t\t\t\t\tp.map(q, p.ack);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tif('string' !== typeof data){\n\t\t\t\t\t\ttry{\n\t\t\t\t\t\t\tif(opt.max <= data.length){\n\t\t\t\t\t\t\t\tp.err = \"Chunk too big!\";\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tdata = data.toString(); // If it crashes, it crashes here. How!?? We check size first!\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}catch(e){ p.err = e }\n\t\t\t\t\t\tif(p.err){\n\t\t\t\t\t\t\tdelete Q[file];\n\t\t\t\t\t\t\tp.map(q, p.ack);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tinfo.parsed = data.length;\n\t\t\t\t\tDBG && (DBG.rpl = info.parsed);\n\t\t\t\t\tDBG && (DBG.rpa = q.length);\n\t\t\t\t\tS = +new Date;\n\t\t\t\t\tif(!(opt.jsonify || '{' === data[0])){\n\t\t\t\t\t\tp.radec(err, data);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tparse(data, function(err, tree){\n\t\t\t\t\t\t//console.log(3, process.memoryUsage().heapUsed);\n\t\t\t\t\t\tif(!err){\n\t\t\t\t\t\t\tdelete Q[file];\n\t\t\t\t\t\t\tp.disk.$ = tree;\n\t\t\t\t\t\t\tconsole.STAT && (ST = +new Date - S) > 9 && console.STAT(S, ST, 'rad parsed JSON');\n\t\t\t\t\t\t\tDBG && (DBG.rpd = +new Date);\n\t\t\t\t\t\t\tp.map(q, p.ack); // hmmm, v8 profiler can't see into this cause of try/catch?\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif('{' === data[0]){\n\t\t\t\t\t\t\tdelete Q[file];\n\t\t\t\t\t\t\tp.err = tmp || \"JSON error!\";\n\t\t\t\t\t\t\tp.map(q, p.ack);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tp.radec(err, data);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tp.map = function(){ // switch to setTimeout.each now?\n\t\t\t\t\tif(!q || !q.length){ return }\n\t\t\t\t\t//var i = 0, l = q.length, ack;\n\t\t\t\t\tvar S = +new Date;\n\t\t\t\t\tvar err = p.err, data = p.not? u : p.disk;\n\t\t\t\t\tvar i = 0, ack; while(i < 9 && (ack = q[i++])){ ack(err, data, info) } // too much?\n\t\t\t\t\tconsole.STAT && console.STAT(S, +new Date - S, 'rad packs', ename(file));\n\t\t\t\t\tconsole.STAT && console.STAT(S, i, 'rad packs #', ename(file)); \n\t\t\t\t\tif(!(q = q.slice(i)).length){ return }\n\t\t\t\t\tpuff(p.map, 0);\n\t\t\t\t}\n\t\t\t\tp.ack = function(cb){\n\t\t\t\t\tif(!cb){ return }\n\t\t\t\t\tif(p.err || p.not){\n\t\t\t\t\t\tcb(p.err, u, info);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tcb(u, p.disk, info);\n\t\t\t\t}\n\t\t\t\tp.radec = function(err, data){\n\t\t\t\t\tdelete Q[file];\n\t\t\t\t\tS = +new Date;\n\t\t\t\t\tvar tmp = p.split(data), pre = [], i, k, v;\n\t\t\t\t\tif(!tmp || 0 !== tmp[1]){\n\t\t\t\t\t\tp.err = \"File '\"+file+\"' does not have root radix! \";\n\t\t\t\t\t\tp.map(q, p.ack);\n\t\t\t\t\t\treturn; \n\t\t\t\t\t}\n\t\t\t\t\twhile(tmp){\n\t\t\t\t\t\tk = v = u;\n\t\t\t\t\t\ti = tmp[1];\n\t\t\t\t\t\ttmp = p.split(tmp[2])||'';\n\t\t\t\t\t\tif('#' == tmp[0]){\n\t\t\t\t\t\t\tk = tmp[1];\n\t\t\t\t\t\t\tpre = pre.slice(0,i);\n\t\t\t\t\t\t\tif(i <= pre.length){\n\t\t\t\t\t\t\t\tpre.push(k);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttmp = p.split(tmp[2])||'';\n\t\t\t\t\t\tif('\\n' == tmp[0]){ continue }\n\t\t\t\t\t\tif('=' == tmp[0] || ':' == tmp[0]){ v = tmp[1] }\n\t\t\t\t\t\tif(u !== k && u !== v){ p.disk(pre.join(''), v) }\n\t\t\t\t\t\ttmp = p.split(tmp[2]);\n\t\t\t\t\t}\n\t\t\t\t\tconsole.STAT && console.STAT(S, +new Date - S, 'parsed RAD');\n\t\t\t\t\tp.map(q, p.ack);\n\t\t\t\t};\n\t\t\t\tp.split = function(t){\n\t\t\t\t\tif(!t){ return }\n\t\t\t\t\tvar l = [], o = {}, i = -1, a = '', b, c;\n\t\t\t\t\ti = t.indexOf(s);\n\t\t\t\t\tif(!t[i]){ return }\n\t\t\t\t\ta = t.slice(0, i);\n\t\t\t\t\tl[0] = a;\n\t\t\t\t\tl[1] = b = Radisk.decode(t.slice(i), o);\n\t\t\t\t\tl[2] = t.slice(i + o.i);\n\t\t\t\t\treturn l;\n\t\t\t\t}\n\t\t\t\tif(r.disk){ raw || (raw = (r.disk[file]||'').raw) }\n\t\t\t\tvar S = +new Date, SM, SL;\n\t\t\t\tDBG && (DBG.rp = S);\n\t\t\t\tif(raw){ return puff(function(){ p.read(u, raw) }, 0) }\n\t\t\t\topt.store.get(ename(file), p.read);\n\t\t\t\t// TODO: What if memory disk gets filled with updates, and we get an old one back?\n\t\t\t}\n\t\t}());\n\n\t\t;(function(){\n\t\t\tvar dir, f = String.fromCharCode(28), Q;\n\t\t\tr.find = function(key, cb){\n\t\t\t\tif(!dir){\n\t\t\t\t\tif(Q){ Q.push([key, cb]); return } Q = [[key, cb]];\n\t\t\t\t\tr.parse(f, init);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tRadix.map(r.list = dir, function(val, key){\n\t\t\t\t\tif(!val){ return }\n\t\t\t\t\treturn cb(key) || true;\n\t\t\t\t}, {reverse: 1, end: key}) || cb(opt.code.from);\n\t\t\t}\n\t\t\tr.find.add = function(file, cb){\n\t\t\t\tvar has = dir(file);\n\t\t\t\tif(has || file === f){ cb(u, 1); return }\n\t\t\t\tdir(file, 1);\n\t\t\t\tcb.found = (cb.found || 0) + 1;\n\t\t\t\tr.write(f, dir, function(err, ok){\n\t\t\t\t\tif(err){ cb(err); return }\n\t\t\t\t\tcb.found = (cb.found || 0) - 1;\n\t\t\t\t\tif(0 !== cb.found){ return }\n\t\t\t\t\tcb(u, 1);\n\t\t\t\t}, true);\n\t\t\t}\n\t\t\tr.find.bad = function(file, cb){\n\t\t\t\tdir(file, 0);\n\t\t\t\tr.write(f, dir, cb||noop);\n\t\t\t}\n\t\t\tfunction init(err, disk){\n\t\t\t\tif(err){\n\t\t\t\t\topt.log('list', err);\n\t\t\t\t\tsetTimeout(function(){ r.parse(f, init) }, 1000);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif(disk){ drain(disk); return }\n\t\t\t\tdir = dir || disk || Radix();\n\t\t\t\tif(!opt.store.list){ drain(dir); return }\n\t\t\t\t// import directory.\n\t\t\t\topt.store.list(function(file){\n\t\t\t\t\tif(!file){ drain(dir); return }\n\t\t\t\t\tr.find.add(file, noop);\n\t\t\t\t});\n\t\t\t}\n\t\t\tfunction drain(rad, tmp){\n\t\t\t\tdir = dir || rad;\n\t\t\t\tdir.file = f;\n\t\t\t\ttmp = Q; Q = null;\n\t\t\t\tmap(tmp, function(arg){\n\t\t\t\t\tr.find(arg[0], arg[1]);\n\t\t\t\t});\n\t\t\t}\n\t\t}());\n\n\t\ttry{ !Gun.window && require('./radmigtmp')(r) }catch(e){}\n\n\t\tvar noop = function(){}, RAD, u;\n\t\tRadisk.has[opt.file] = r;\n\t\treturn r;\n\t}\n\n\t;(function(){\n\t\tvar _ = String.fromCharCode(31), u;\n\t\tRadisk.encode = function(d, o, s){ s = s || _;\n\t\t\tvar t = s, tmp;\n\t\t\tif(typeof d == 'string'){\n\t\t\t\tvar i = d.indexOf(s);\n\t\t\t\twhile(i != -1){ t += s; i = d.indexOf(s, i+1) }\n\t\t\t\treturn t + '\"' + d + s;\n\t\t\t} else\n\t\t\tif(d && d['#'] && 1 == Object.keys(d).length){\n\t\t\t\treturn t + '#' + tmp + t;\n\t\t\t} else\n\t\t\tif('number' == typeof d){\n\t\t\t\treturn t + '+' + (d||0) + t;\n\t\t\t} else\n\t\t\tif(null === d){\n\t\t\t\treturn t + ' ' + t;\n\t\t\t} else\n\t\t\tif(true === d){\n\t\t\t\treturn t + '+' + t;\n\t\t\t} else\n\t\t\tif(false === d){\n\t\t\t\treturn t + '-' + t;\n\t\t\t}// else\n\t\t\t//if(binary){}\n\t\t}\n\t\tRadisk.decode = function(t, o, s){ s = s || _;\n\t\t\tvar d = '', i = -1, n = 0, c, p;\n\t\t\tif(s !== t[0]){ return }\n\t\t\twhile(s === t[++i]){ ++n }\n\t\t\tp = t[c = n] || true;\n\t\t\twhile(--n >= 0){ i = t.indexOf(s, i+1) }\n\t\t\tif(i == -1){ i = t.length }\n\t\t\td = t.slice(c+1, i);\n\t\t\tif(o){ o.i = i+1 }\n\t\t\tif('\"' === p){\n\t\t\t\treturn d;\n\t\t\t} else\n\t\t\tif('#' === p){\n\t\t\t\treturn {'#':d};\n\t\t\t} else\n\t\t\tif('+' === p){\n\t\t\t\tif(0 === d.length){\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn parseFloat(d);\n\t\t\t} else\n\t\t\tif(' ' === p){\n\t\t\t\treturn null;\n\t\t\t} else\n\t\t\tif('-' === p){\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}());\n\n\tif(typeof window !== \"undefined\"){\n\t var Gun = window.Gun;\n\t var Radix = window.Radix;\n\t window.Radisk = Radisk;\n\t} else { \n\t var Gun = require('../gun');\n\t\tvar Radix = require('./radix');\n\t\t//var Radix = require('./radix2'); Radisk = require('./radisk2');\n\t\ttry{ module.exports = Radisk }catch(e){}\n\t}\n\n\tRadisk.Radix = Radix;\n\n}());","var Gun = (typeof window !== \"undefined\")? window.Gun : require('../gun');\n\nGun.on('create', function(root){\n if(Gun.TESTING){ root.opt.file = 'radatatest' }\n this.to.next(root);\n var opt = root.opt, empty = {}, u;\n if(false === opt.rad || false === opt.radisk){ return }\n if((u+'' != typeof process) && 'false' === ''+(process.env||'').RAD){ return }\n var Radisk = (Gun.window && Gun.window.Radisk) || require('./radisk');\n var Radix = Radisk.Radix;\n var dare = Radisk(opt), esc = String.fromCharCode(27);\n var ST = 0;\n \n root.on('put', function(msg){\n this.to.next(msg);\n if((msg._||'').rad){ return } // don't save what just came from a read.\n //if(msg['@']){ return } // WHY DID I NOT ADD THIS?\n var id = msg['#'], put = msg.put, soul = put['#'], key = put['.'], val = put[':'], state = put['>'], tmp;\n var DBG = (msg._||'').DBG; DBG && (DBG.sp = DBG.sp || +new Date);\n //var lot = (msg._||'').lot||''; count[id] = (count[id] || 0) + 1; \n var S = (msg._||'').RPS || ((msg._||'').RPS = +new Date);\n //console.log(\"PUT ------->>>\", soul,key, val, state);\n //dare(soul+esc+key, {':': val, '>': state}, dare.one[id] || function(err, ok){\n dare(soul+esc+key, {':': val, '>': state}, function(err, ok){\n //console.log(\"<<<------- PAT\", soul,key, val, state, 'in', +new Date - S);\n DBG && (DBG.spd = DBG.spd || +new Date);\n console.STAT && console.STAT(S, +new Date - S, 'put');\n //if(!err && count[id] !== lot.s){ console.log(err = \"Disk count not same as ram count.\"); console.STAT && console.STAT(+new Date, lot.s - count[id], 'put ack != count') } delete count[id];\n if(err){ root.on('in', {'@': id, err: err, DBG: DBG}); return }\n root.on('in', {'@': id, ok: ok, DBG: DBG});\n //}, id, DBG && (DBG.r = DBG.r || {}));\n }, false && id, DBG && (DBG.r = DBG.r || {}));\n DBG && (DBG.sps = DBG.sps || +new Date);\n });\n var count = {}, obj_empty = Object.empty;\n \n root.on('get', function(msg){\n this.to.next(msg);\n var ctx = msg._||'', DBG = ctx.DBG = msg.DBG; DBG && (DBG.sg = +new Date);\n var id = msg['#'], get = msg.get, soul = msg.get['#'], has = msg.get['.']||'', o = {}, graph, lex, key, tmp, force;\n if('string' == typeof soul){\n key = soul;\n } else \n if(soul){\n if(u !== (tmp = soul['*'])){ o.limit = force = 1 }\n if(u !== soul['>']){ o.start = soul['>'] }\n if(u !== soul['<']){ o.end = soul['<'] }\n key = force? (''+tmp) : tmp || soul['='];\n force = null;\n }\n if(key && !o.limit){ // a soul.has must be on a soul, and not during soul*\n if('string' == typeof has){\n key = key+esc+(o.atom = has);\n } else \n if(has){\n if(u !== has['>']){ o.start = has['>']; o.limit = 1 }\n if(u !== has['<']){ o.end = has['<']; o.limit = 1 }\n if(u !== (tmp = has['*'])){ o.limit = force = 1 }\n if(key){ key = key+esc + (force? (''+(tmp||'')) : tmp || (o.atom = has['='] || '')) }\n }\n }\n if((tmp = get['%']) || o.limit){\n o.limit = (tmp <= (o.pack || (1000 * 100)))? tmp : 1;\n }\n if(has['-'] || (soul||{})['-'] || get['-']){ o.reverse = true }\n if((tmp = (root.next||'')[soul]) && tmp.put){\n if(o.atom){\n tmp = (tmp.next||'')[o.atom] ;\n if(tmp && tmp.rad){ return }\n } else\n if(tmp && tmp.rad){ return }\n }\n var now = Gun.state();\n var S = (+new Date), C = 0, SPT = 0; // STATS!\n DBG && (DBG.sgm = S);\n //var GID = String.random(3); console.log(\"GET ------->>>\", GID, key, o, '?', get);\n dare(key||'', function(err, data, info){\n //console.log(\"<<<------- GOT\", GID, +new Date - S, err, data);\n DBG && (DBG.sgr = +new Date);\n DBG && (DBG.sgi = info);\n try{opt.store.stats.get.time[statg % 50] = (+new Date) - S; ++statg;\n opt.store.stats.get.count++;\n if(err){ opt.store.stats.get.err = err }\n }catch(e){} // STATS!\n //if(u === data && info.chunks > 1){ return } // if we already sent a chunk, ignore ending empty responses. // this causes tests to fail.\n console.STAT && console.STAT(S, +new Date - S, 'got', JSON.stringify(key)); S = +new Date;\n info = info || '';\n var va, ve;\n if(info.unit && data && u !== (va = data[':']) && u !== (ve = data['>'])){ // new format\n var tmp = key.split(esc), so = tmp[0], ha = tmp[1];\n (graph = graph || {})[so] = Gun.state.ify(graph[so], ha, ve, va, so);\n root.$.get(so).get(ha)._.rad = now;\n // REMEMBER TO ADD _rad TO NODE/SOUL QUERY!\n } else\n if(data){ // old code path\n if(typeof data !== 'string'){\n if(o.atom){\n data = u;\n } else {\n Radix.map(data, each, o); // IS A RADIX TREE, NOT FUNCTION!\n }\n }\n if(!graph && data){ each(data, '') }\n // TODO: !has what about soul lookups?\n if(!o.atom && !has & 'string' == typeof soul && !o.limit && !o.more){\n root.$.get(soul)._.rad = now;\n }\n }\n DBG && (DBG.sgp = +new Date);\n // TODO: PERF NOTES! This is like 0.2s, but for each ack, or all? Can you cache these preps?\n // TODO: PERF NOTES! This is like 0.2s, but for each ack, or all? Can you cache these preps?\n // TODO: PERF NOTES! This is like 0.2s, but for each ack, or all? Can you cache these preps?\n // TODO: PERF NOTES! This is like 0.2s, but for each ack, or all? Can you cache these preps?\n // TODO: PERF NOTES! This is like 0.2s, but for each ack, or all? Can you cache these preps?\n // Or benchmark by reusing first start date.\n if(console.STAT && (ST = +new Date - S) > 9){ console.STAT(S, ST, 'got prep time'); console.STAT(S, C, 'got prep #') } SPT += ST; C = 0; S = +new Date;\n var faith = function(){}; faith.faith = true; faith.rad = get; // HNPERF: We're testing performance improvement by skipping going through security again, but this should be audited.\n root.on('in', {'@': id, put: graph, '%': info.more? 1 : u, err: err? err : u, _: faith, DBG: DBG});\n console.STAT && (ST = +new Date - S) > 9 && console.STAT(S, ST, 'got emit', Object.keys(graph||{}).length);\n graph = u; // each is outside our scope, we have to reset graph to nothing!\n }, o, DBG && (DBG.r = DBG.r || {}));\n DBG && (DBG.sgd = +new Date);\n console.STAT && (ST = +new Date - S) > 9 && console.STAT(S, ST, 'get call'); // TODO: Perf: this was half a second??????\n function each(val, has, a,b){ // TODO: THIS CODE NEEDS TO BE FASTER!!!!\n C++;\n if(!val){ return }\n has = (key+has).split(esc);\n var soul = has.slice(0,1)[0];\n has = has.slice(-1)[0];\n if(o.limit && o.limit <= o.count){ return true }\n var va, ve, so = soul, ha = has;\n //if(u !== (va = val[':']) && u !== (ve = val['>'])){ // THIS HANDLES NEW CODE!\n if('string' != typeof val){ // THIS HANDLES NEW CODE!\n va = val[':']; ve = val['>'];\n (graph = graph || {})[so] = Gun.state.ify(graph[so], ha, ve, va, so);\n //root.$.get(so).get(ha)._.rad = now;\n o.count = (o.count || 0) + ((va||'').length || 9);\n return;\n }\n o.count = (o.count || 0) + val.length;\n var tmp = val.lastIndexOf('>');\n var state = Radisk.decode(val.slice(tmp+1), null, esc);\n val = Radisk.decode(val.slice(0,tmp), null, esc);\n (graph = graph || {})[soul] = Gun.state.ify(graph[soul], has, state, val, soul);\n }\n });\n var val_is = Gun.valid;\n (opt.store||{}).stats = {get:{time:{}, count:0}, put: {time:{}, count:0}}; // STATS!\n var statg = 0, statp = 0; // STATS!\n});","function Store(opt){\n\topt = opt || {};\n\topt.log = opt.log || console.log;\n\topt.file = String(opt.file || 'radata');\n\tvar fs = require('fs'), u;\n\n\tvar store = function Store(){};\n\tif(Store[opt.file]){\n\t\tconsole.log(\"Warning: reusing same fs store and options as 1st.\");\n\t\treturn Store[opt.file];\n\t}\n\tStore[opt.file] = store;\n\tvar puts = {};\n\n\t// TODO!!! ADD ZLIB INFLATE / DEFLATE COMPRESSION!\n\tstore.put = function(file, data, cb){\n\t\tvar random = Math.random().toString(36).slice(-3);\n\t\tputs[file] = {id: random, data: data};\n\t\tvar tmp = opt.file+'-'+file+'-'+random+'.tmp';\n\t\tfs.writeFile(tmp, data, function(err, ok){\n\t\t\tif(err){\n\t\t\t\tif(random === (puts[file]||'').id){ delete puts[file] }\n\t\t\t\treturn cb(err);\n\t\t\t}\n\t\t\tmove(tmp, opt.file+'/'+file, function(err, ok){\n\t\t\t\tif(random === (puts[file]||'').id){ delete puts[file] }\n\t\t\t\tcb(err, ok || !err);\n\t\t\t});\n\t\t});\n\t};\n\tstore.get = function(file, cb){ var tmp; // this took 3s+?\n\t\tif(tmp = puts[file]){ cb(u, tmp.data); return }\n\t\tfs.readFile(opt.file+'/'+file, function(err, data){\n\t\t\tif(err){\n\t\t\t\tif('ENOENT' === (err.code||'').toUpperCase()){\n\t\t\t\t\treturn cb();\n\t\t\t\t}\n\t\t\t\topt.log(\"ERROR:\", err);\n\t\t\t}\n\t\t\tcb(err, data);\n\t\t});\n\t};\n\n\tif(!fs.existsSync(opt.file)){ fs.mkdirSync(opt.file) }\n\n\tfunction move(oldPath, newPath, cb) {\n\t\tfs.rename(oldPath, newPath, function (err) {\n\t\t\tif (err) {\n\t\t\t\tif (err.code === 'EXDEV') {\n\t\t\t\t\tvar readStream = fs.createReadStream(oldPath);\n\t\t\t\t\tvar writeStream = fs.createWriteStream(newPath);\n\n\t\t\t\t\treadStream.on('error', cb);\n\t\t\t\t\twriteStream.on('error', cb);\n\n\t\t\t\t\treadStream.on('close', function () {\n\t\t\t\t\t\tfs.unlink(oldPath, cb);\n\t\t\t\t\t});\n\n\t\t\t\t\treadStream.pipe(writeStream);\n\t\t\t\t} else {\n\t\t\t\t\tcb(err);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcb();\n\t\t\t}\n\t\t});\n\t};\n\n\tstore.list = function(cb, match, params, cbs){\n\t\tvar dir = fs.readdirSync(opt.file);\n\t\tdir.forEach(function(file){\n\t\t\tcb(file);\n\t\t})\n\t\tcb();\n\t};\n\t\n\treturn store;\n}\n\nvar Gun = (typeof window !== \"undefined\")? window.Gun : require('../gun');\nGun.on('create', function(root){\n\tthis.to.next(root);\n\tvar opt = root.opt;\n\tif(opt.rfs === false){ return }\n\topt.store = opt.store || (!Gun.window && Store(opt));\n});\n\nmodule.exports = Store;","module.exports = function(opt, store){\n\tvar rfs = require('./rfs')(opt);\n\tvar p = store.put;\n\tvar g = store.get;\n\tstore.put = function(file, data, cb){\n\t\tvar a, b, c = function(err, ok){\n\t\t\tif(b){ return cb(err || b) }\n\t\t\tif(a){ return cb(err, ok) }\n\t\t\ta = true;\n\t\t\tb = err;\n\t\t}\n\t\tp(file, data, c); // parallel\n\t\trfs.put(file, data, c); // parallel\n\t}\n\tstore.get = function(file, cb){\n\t\trfs.get(file, function(err, data){\n\t\t\t//console.log(\"rfs3 hijacked\", file);\n\t\t\tif(data){ return cb(err, data) }\n\t\t\tg(file, cb);\n\t\t});\n\t}\n\treturn store;\n}","var Gun = require('../gun');\nvar Radisk = require('./radisk');\nvar fs = require('fs');\nvar Radix = Radisk.Radix;\nvar u, AWS;\n\nGun.on('create', function(root){\n\tthis.to.next(root);\n\tvar opt = root.opt;\n\tif(!opt.s3 && !process.env.AWS_S3_BUCKET){ return }\n\t//opt.batch = opt.batch || (1000 * 10);\n\t//opt.until = opt.until || (1000 * 3); // ignoring these now, cause perf > cost\n\t//opt.chunk = opt.chunk || (1024 * 1024 * 10); // 10MB // when cost only cents\n\n\ttry{AWS = require('aws-sdk');\n\t}catch(e){\n\t\tconsole.log(\"Please `npm install aws-sdk` or add it to your package.json !\");\n\t\tAWS_SDK_NOT_INSTALLED;\n\t}\n\n\tvar opts = opt.s3 || (opt.s3 = {});\n\topts.bucket = opts.bucket || process.env.AWS_S3_BUCKET;\n\topts.region = opts.region || process.env.AWS_REGION || \"us-east-1\";\n\topts.accessKeyId = opts.key = opts.key || opts.accessKeyId || process.env.AWS_ACCESS_KEY_ID;\n\topts.secretAccessKey = opts.secret = opts.secret || opts.secretAccessKey || process.env.AWS_SECRET_ACCESS_KEY;\n\n\tif(opt.fakes3 = opt.fakes3 || process.env.fakes3){\n\t\topts.endpoint = opt.fakes3;\n\t\topts.sslEnabled = false;\n\t\topts.bucket = opts.bucket.replace('.','p');\n\t}\n\n\topts.config = new AWS.Config(opts);\n\topts.s3 = opts.s3 || new AWS.S3(opts.config);\n\n\topt.store = Object.keys(opts.s3).length === 0 ? opt.store : Store(opt);\n});\n\nfunction Store(opt){\n\topt = opt || {};\n\topt.file = String(opt.file || 'radata');\n\tvar opts = opt.s3, s3 = opts.s3;\n\tvar c = {p: {}, g: {}, l: {}};\n\t\n\tvar store = function Store(){};\n\tif(Store[opt.file]){\n\t\tconsole.log(\"Warning: reusing same S3 store and options as 1st.\");\n\t\treturn Store[opt.file];\n\t}\n\tStore[opt.file] = store;\n\n\tstore.put = function(file, data, cb){\n\t\tvar params = {Bucket: opts.bucket, Key: file, Body: data};\n\t\t//console.log(\"RS3 PUT ---->\", (data||\"\").slice(0,20));\n\t\tc.p[file] = data;\n\t\tdelete c.g[file];//Gun.obj.del(c.g, file);\n\t\tdelete c.l[1];//Gun.obj.del(c.l, 1);\n s3.putObject(params, function(err, ok){\n \tdelete c.p[file];\n \tcb(err, 's3');\n });\n\t};\n\tstore.get = function(file, cb){ var tmp;\n\t\tif(tmp = c.p[file]){ cb(u, tmp); return }\n\t\tif(tmp = c.g[file]){ tmp.push(cb); return }\n\t\tvar cbs = c.g[file] = [cb];\n\t\tvar params = {Bucket: opts.bucket, Key: file||''};\n\t\t//console.log(\"RS3 GET ---->\", file);\n\t\ts3.getObject(params, function got(err, ack){\n\t\t\tif(err && 'NoSuchKey' === err.code){ err = u }\n\t\t\t//console.log(\"RS3 GOT <----\", err, file, cbs.length, ((ack||{}).Body||'').length);//.toString().slice(0,20));\n\t\t\tdelete c.g[file];//Gun.obj.del(c.g, file);\n\t\t\tvar data, data = (ack||'').Body;\n\t\t\t//console.log(1, process.memoryUsage().heapUsed);\n\t\t\tvar i = 0, cba; while(cba = cbs[i++]){ cba && cba(err, data) }//Gun.obj.map(cbs, cbe);\n\t\t});\n\t};\n\tstore.list = function(cb, match, params, cbs){\n\t\tif(!cbs){\n\t\t\tif(c.l[1]){ return c.l[1].push(cb) }\n\t\t\tcbs = c.l[1] = [cb];\n\t\t}\n\t\tparams = params || {Bucket: opts.bucket};\n\t\t//console.log(\"RS3 LIST --->\");\n\t\ts3.listObjectsV2(params, function(err, data){\n\t\t\t//console.log(\"RS3 LIST <---\", err, data, cbs.length);\n\t\t\tif(err){ return Gun.log(err, err.stack) }\n\t\t\tvar IT = data.IsTruncated, cbe = function(cb){\n\t\t\t\tif(cb.end){ return }\n\t\t\t\tif(Gun.obj.map(data.Contents, function(content){\n\t\t\t\t\treturn cb(content.Key);\n\t\t\t\t})){ cb.end = true; return }\n\t\t\t\tif(IT){ return }\n\t\t\t\t// Stream interface requires a final call to know when to be done.\n\t\t\t\tcb.end = true; cb();\n\t\t\t}\n\t\t\t// Gun.obj.map(cbs, cbe); // lets see if fixes heroku\n\t\t\tif(!IT){ delete c.l[1]; return }\n\t params.ContinuationToken = data.NextContinuationToken;\n\t \tstore.list(cb, match, params, cbs);\n });\n\t};\n\t//store.list(function(){ return true });\n\tif(false !== opt.rfs){ require('./rfsmix')(opt, store) } // ugly, but gotta move fast for now.\n\treturn store;\n}\n\nmodule.exports = Store;\n","'use strict';\n\nmodule.exports = {\n BINARY_TYPES: ['nodebuffer', 'arraybuffer', 'fragments'],\n GUID: '258EAFA5-E914-47DA-95CA-C5AB0DC85B11',\n kStatusCode: Symbol('status-code'),\n kWebSocket: Symbol('websocket'),\n EMPTY_BUFFER: Buffer.alloc(0),\n NOOP: () => {}\n};\n","'use strict';\n\nconst { EMPTY_BUFFER } = require('./constants');\n\n/**\n * Merges an array of buffers into a new buffer.\n *\n * @param {Buffer[]} list The array of buffers to concat\n * @param {Number} totalLength The total length of buffers in the list\n * @return {Buffer} The resulting buffer\n * @public\n */\nfunction concat(list, totalLength) {\n if (list.length === 0) return EMPTY_BUFFER;\n if (list.length === 1) return list[0];\n\n const target = Buffer.allocUnsafe(totalLength);\n let offset = 0;\n\n for (let i = 0; i < list.length; i++) {\n const buf = list[i];\n target.set(buf, offset);\n offset += buf.length;\n }\n\n if (offset < totalLength) return target.slice(0, offset);\n\n return target;\n}\n\n/**\n * Masks a buffer using the given mask.\n *\n * @param {Buffer} source The buffer to mask\n * @param {Buffer} mask The mask to use\n * @param {Buffer} output The buffer where to store the result\n * @param {Number} offset The offset at which to start writing\n * @param {Number} length The number of bytes to mask.\n * @public\n */\nfunction _mask(source, mask, output, offset, length) {\n for (let i = 0; i < length; i++) {\n output[offset + i] = source[i] ^ mask[i & 3];\n }\n}\n\n/**\n * Unmasks a buffer using the given mask.\n *\n * @param {Buffer} buffer The buffer to unmask\n * @param {Buffer} mask The mask to use\n * @public\n */\nfunction _unmask(buffer, mask) {\n // Required until https://github.com/nodejs/node/issues/9006 is resolved.\n const length = buffer.length;\n for (let i = 0; i < length; i++) {\n buffer[i] ^= mask[i & 3];\n }\n}\n\n/**\n * Converts a buffer to an `ArrayBuffer`.\n *\n * @param {Buffer} buf The buffer to convert\n * @return {ArrayBuffer} Converted buffer\n * @public\n */\nfunction toArrayBuffer(buf) {\n if (buf.byteLength === buf.buffer.byteLength) {\n return buf.buffer;\n }\n\n return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength);\n}\n\n/**\n * Converts `data` to a `Buffer`.\n *\n * @param {*} data The data to convert\n * @return {Buffer} The buffer\n * @throws {TypeError}\n * @public\n */\nfunction toBuffer(data) {\n toBuffer.readOnly = true;\n\n if (Buffer.isBuffer(data)) return data;\n\n let buf;\n\n if (data instanceof ArrayBuffer) {\n buf = Buffer.from(data);\n } else if (ArrayBuffer.isView(data)) {\n buf = Buffer.from(data.buffer, data.byteOffset, data.byteLength);\n } else {\n buf = Buffer.from(data);\n toBuffer.readOnly = false;\n }\n\n return buf;\n}\n\ntry {\n const bufferUtil = require('bufferutil');\n const bu = bufferUtil.BufferUtil || bufferUtil;\n\n module.exports = {\n concat,\n mask(source, mask, output, offset, length) {\n if (length < 48) _mask(source, mask, output, offset, length);\n else bu.mask(source, mask, output, offset, length);\n },\n toArrayBuffer,\n toBuffer,\n unmask(buffer, mask) {\n if (buffer.length < 32) _unmask(buffer, mask);\n else bu.unmask(buffer, mask);\n }\n };\n} catch (e) /* istanbul ignore next */ {\n module.exports = {\n concat,\n mask: _mask,\n toArrayBuffer,\n toBuffer,\n unmask: _unmask\n };\n}\n","'use strict';\n\nconst kDone = Symbol('kDone');\nconst kRun = Symbol('kRun');\n\n/**\n * A very simple job queue with adjustable concurrency. Adapted from\n * https://github.com/STRML/async-limiter\n */\nclass Limiter {\n /**\n * Creates a new `Limiter`.\n *\n * @param {Number} [concurrency=Infinity] The maximum number of jobs allowed\n * to run concurrently\n */\n constructor(concurrency) {\n this[kDone] = () => {\n this.pending--;\n this[kRun]();\n };\n this.concurrency = concurrency || Infinity;\n this.jobs = [];\n this.pending = 0;\n }\n\n /**\n * Adds a job to the queue.\n *\n * @param {Function} job The job to run\n * @public\n */\n add(job) {\n this.jobs.push(job);\n this[kRun]();\n }\n\n /**\n * Removes a job from the queue and runs it if possible.\n *\n * @private\n */\n [kRun]() {\n if (this.pending === this.concurrency) return;\n\n if (this.jobs.length) {\n const job = this.jobs.shift();\n\n this.pending++;\n job(this[kDone]);\n }\n }\n}\n\nmodule.exports = Limiter;\n","'use strict';\n\nconst zlib = require('zlib');\n\nconst bufferUtil = require('./buffer-util');\nconst Limiter = require('./limiter');\nconst { kStatusCode, NOOP } = require('./constants');\n\nconst TRAILER = Buffer.from([0x00, 0x00, 0xff, 0xff]);\nconst kPerMessageDeflate = Symbol('permessage-deflate');\nconst kTotalLength = Symbol('total-length');\nconst kCallback = Symbol('callback');\nconst kBuffers = Symbol('buffers');\nconst kError = Symbol('error');\n\n//\n// We limit zlib concurrency, which prevents severe memory fragmentation\n// as documented in https://github.com/nodejs/node/issues/8871#issuecomment-250915913\n// and https://github.com/websockets/ws/issues/1202\n//\n// Intentionally global; it's the global thread pool that's an issue.\n//\nlet zlibLimiter;\n\n/**\n * permessage-deflate implementation.\n */\nclass PerMessageDeflate {\n /**\n * Creates a PerMessageDeflate instance.\n *\n * @param {Object} [options] Configuration options\n * @param {Boolean} [options.serverNoContextTakeover=false] Request/accept\n * disabling of server context takeover\n * @param {Boolean} [options.clientNoContextTakeover=false] Advertise/\n * acknowledge disabling of client context takeover\n * @param {(Boolean|Number)} [options.serverMaxWindowBits] Request/confirm the\n * use of a custom server window size\n * @param {(Boolean|Number)} [options.clientMaxWindowBits] Advertise support\n * for, or request, a custom client window size\n * @param {Object} [options.zlibDeflateOptions] Options to pass to zlib on\n * deflate\n * @param {Object} [options.zlibInflateOptions] Options to pass to zlib on\n * inflate\n * @param {Number} [options.threshold=1024] Size (in bytes) below which\n * messages should not be compressed\n * @param {Number} [options.concurrencyLimit=10] The number of concurrent\n * calls to zlib\n * @param {Boolean} [isServer=false] Create the instance in either server or\n * client mode\n * @param {Number} [maxPayload=0] The maximum allowed message length\n */\n constructor(options, isServer, maxPayload) {\n this._maxPayload = maxPayload | 0;\n this._options = options || {};\n this._threshold =\n this._options.threshold !== undefined ? this._options.threshold : 1024;\n this._isServer = !!isServer;\n this._deflate = null;\n this._inflate = null;\n\n this.params = null;\n\n if (!zlibLimiter) {\n const concurrency =\n this._options.concurrencyLimit !== undefined\n ? this._options.concurrencyLimit\n : 10;\n zlibLimiter = new Limiter(concurrency);\n }\n }\n\n /**\n * @type {String}\n */\n static get extensionName() {\n return 'permessage-deflate';\n }\n\n /**\n * Create an extension negotiation offer.\n *\n * @return {Object} Extension parameters\n * @public\n */\n offer() {\n const params = {};\n\n if (this._options.serverNoContextTakeover) {\n params.server_no_context_takeover = true;\n }\n if (this._options.clientNoContextTakeover) {\n params.client_no_context_takeover = true;\n }\n if (this._options.serverMaxWindowBits) {\n params.server_max_window_bits = this._options.serverMaxWindowBits;\n }\n if (this._options.clientMaxWindowBits) {\n params.client_max_window_bits = this._options.clientMaxWindowBits;\n } else if (this._options.clientMaxWindowBits == null) {\n params.client_max_window_bits = true;\n }\n\n return params;\n }\n\n /**\n * Accept an extension negotiation offer/response.\n *\n * @param {Array} configurations The extension negotiation offers/reponse\n * @return {Object} Accepted configuration\n * @public\n */\n accept(configurations) {\n configurations = this.normalizeParams(configurations);\n\n this.params = this._isServer\n ? this.acceptAsServer(configurations)\n : this.acceptAsClient(configurations);\n\n return this.params;\n }\n\n /**\n * Releases all resources used by the extension.\n *\n * @public\n */\n cleanup() {\n if (this._inflate) {\n this._inflate.close();\n this._inflate = null;\n }\n\n if (this._deflate) {\n const callback = this._deflate[kCallback];\n\n this._deflate.close();\n this._deflate = null;\n\n if (callback) {\n callback(\n new Error(\n 'The deflate stream was closed while data was being processed'\n )\n );\n }\n }\n }\n\n /**\n * Accept an extension negotiation offer.\n *\n * @param {Array} offers The extension negotiation offers\n * @return {Object} Accepted configuration\n * @private\n */\n acceptAsServer(offers) {\n const opts = this._options;\n const accepted = offers.find((params) => {\n if (\n (opts.serverNoContextTakeover === false &&\n params.server_no_context_takeover) ||\n (params.server_max_window_bits &&\n (opts.serverMaxWindowBits === false ||\n (typeof opts.serverMaxWindowBits === 'number' &&\n opts.serverMaxWindowBits > params.server_max_window_bits))) ||\n (typeof opts.clientMaxWindowBits === 'number' &&\n !params.client_max_window_bits)\n ) {\n return false;\n }\n\n return true;\n });\n\n if (!accepted) {\n throw new Error('None of the extension offers can be accepted');\n }\n\n if (opts.serverNoContextTakeover) {\n accepted.server_no_context_takeover = true;\n }\n if (opts.clientNoContextTakeover) {\n accepted.client_no_context_takeover = true;\n }\n if (typeof opts.serverMaxWindowBits === 'number') {\n accepted.server_max_window_bits = opts.serverMaxWindowBits;\n }\n if (typeof opts.clientMaxWindowBits === 'number') {\n accepted.client_max_window_bits = opts.clientMaxWindowBits;\n } else if (\n accepted.client_max_window_bits === true ||\n opts.clientMaxWindowBits === false\n ) {\n delete accepted.client_max_window_bits;\n }\n\n return accepted;\n }\n\n /**\n * Accept the extension negotiation response.\n *\n * @param {Array} response The extension negotiation response\n * @return {Object} Accepted configuration\n * @private\n */\n acceptAsClient(response) {\n const params = response[0];\n\n if (\n this._options.clientNoContextTakeover === false &&\n params.client_no_context_takeover\n ) {\n throw new Error('Unexpected parameter \"client_no_context_takeover\"');\n }\n\n if (!params.client_max_window_bits) {\n if (typeof this._options.clientMaxWindowBits === 'number') {\n params.client_max_window_bits = this._options.clientMaxWindowBits;\n }\n } else if (\n this._options.clientMaxWindowBits === false ||\n (typeof this._options.clientMaxWindowBits === 'number' &&\n params.client_max_window_bits > this._options.clientMaxWindowBits)\n ) {\n throw new Error(\n 'Unexpected or invalid parameter \"client_max_window_bits\"'\n );\n }\n\n return params;\n }\n\n /**\n * Normalize parameters.\n *\n * @param {Array} configurations The extension negotiation offers/reponse\n * @return {Array} The offers/response with normalized parameters\n * @private\n */\n normalizeParams(configurations) {\n configurations.forEach((params) => {\n Object.keys(params).forEach((key) => {\n let value = params[key];\n\n if (value.length > 1) {\n throw new Error(`Parameter \"${key}\" must have only a single value`);\n }\n\n value = value[0];\n\n if (key === 'client_max_window_bits') {\n if (value !== true) {\n const num = +value;\n if (!Number.isInteger(num) || num < 8 || num > 15) {\n throw new TypeError(\n `Invalid value for parameter \"${key}\": ${value}`\n );\n }\n value = num;\n } else if (!this._isServer) {\n throw new TypeError(\n `Invalid value for parameter \"${key}\": ${value}`\n );\n }\n } else if (key === 'server_max_window_bits') {\n const num = +value;\n if (!Number.isInteger(num) || num < 8 || num > 15) {\n throw new TypeError(\n `Invalid value for parameter \"${key}\": ${value}`\n );\n }\n value = num;\n } else if (\n key === 'client_no_context_takeover' ||\n key === 'server_no_context_takeover'\n ) {\n if (value !== true) {\n throw new TypeError(\n `Invalid value for parameter \"${key}\": ${value}`\n );\n }\n } else {\n throw new Error(`Unknown parameter \"${key}\"`);\n }\n\n params[key] = value;\n });\n });\n\n return configurations;\n }\n\n /**\n * Decompress data. Concurrency limited.\n *\n * @param {Buffer} data Compressed data\n * @param {Boolean} fin Specifies whether or not this is the last fragment\n * @param {Function} callback Callback\n * @public\n */\n decompress(data, fin, callback) {\n zlibLimiter.add((done) => {\n this._decompress(data, fin, (err, result) => {\n done();\n callback(err, result);\n });\n });\n }\n\n /**\n * Compress data. Concurrency limited.\n *\n * @param {Buffer} data Data to compress\n * @param {Boolean} fin Specifies whether or not this is the last fragment\n * @param {Function} callback Callback\n * @public\n */\n compress(data, fin, callback) {\n zlibLimiter.add((done) => {\n this._compress(data, fin, (err, result) => {\n done();\n callback(err, result);\n });\n });\n }\n\n /**\n * Decompress data.\n *\n * @param {Buffer} data Compressed data\n * @param {Boolean} fin Specifies whether or not this is the last fragment\n * @param {Function} callback Callback\n * @private\n */\n _decompress(data, fin, callback) {\n const endpoint = this._isServer ? 'client' : 'server';\n\n if (!this._inflate) {\n const key = `${endpoint}_max_window_bits`;\n const windowBits =\n typeof this.params[key] !== 'number'\n ? zlib.Z_DEFAULT_WINDOWBITS\n : this.params[key];\n\n this._inflate = zlib.createInflateRaw({\n ...this._options.zlibInflateOptions,\n windowBits\n });\n this._inflate[kPerMessageDeflate] = this;\n this._inflate[kTotalLength] = 0;\n this._inflate[kBuffers] = [];\n this._inflate.on('error', inflateOnError);\n this._inflate.on('data', inflateOnData);\n }\n\n this._inflate[kCallback] = callback;\n\n this._inflate.write(data);\n if (fin) this._inflate.write(TRAILER);\n\n this._inflate.flush(() => {\n const err = this._inflate[kError];\n\n if (err) {\n this._inflate.close();\n this._inflate = null;\n callback(err);\n return;\n }\n\n const data = bufferUtil.concat(\n this._inflate[kBuffers],\n this._inflate[kTotalLength]\n );\n\n if (this._inflate._readableState.endEmitted) {\n this._inflate.close();\n this._inflate = null;\n } else {\n this._inflate[kTotalLength] = 0;\n this._inflate[kBuffers] = [];\n\n if (fin && this.params[`${endpoint}_no_context_takeover`]) {\n this._inflate.reset();\n }\n }\n\n callback(null, data);\n });\n }\n\n /**\n * Compress data.\n *\n * @param {Buffer} data Data to compress\n * @param {Boolean} fin Specifies whether or not this is the last fragment\n * @param {Function} callback Callback\n * @private\n */\n _compress(data, fin, callback) {\n const endpoint = this._isServer ? 'server' : 'client';\n\n if (!this._deflate) {\n const key = `${endpoint}_max_window_bits`;\n const windowBits =\n typeof this.params[key] !== 'number'\n ? zlib.Z_DEFAULT_WINDOWBITS\n : this.params[key];\n\n this._deflate = zlib.createDeflateRaw({\n ...this._options.zlibDeflateOptions,\n windowBits\n });\n\n this._deflate[kTotalLength] = 0;\n this._deflate[kBuffers] = [];\n\n //\n // An `'error'` event is emitted, only on Node.js < 10.0.0, if the\n // `zlib.DeflateRaw` instance is closed while data is being processed.\n // This can happen if `PerMessageDeflate#cleanup()` is called at the wrong\n // time due to an abnormal WebSocket closure.\n //\n this._deflate.on('error', NOOP);\n this._deflate.on('data', deflateOnData);\n }\n\n this._deflate[kCallback] = callback;\n\n this._deflate.write(data);\n this._deflate.flush(zlib.Z_SYNC_FLUSH, () => {\n if (!this._deflate) {\n //\n // The deflate stream was closed while data was being processed.\n //\n return;\n }\n\n let data = bufferUtil.concat(\n this._deflate[kBuffers],\n this._deflate[kTotalLength]\n );\n\n if (fin) data = data.slice(0, data.length - 4);\n\n //\n // Ensure that the callback will not be called again in\n // `PerMessageDeflate#cleanup()`.\n //\n this._deflate[kCallback] = null;\n\n this._deflate[kTotalLength] = 0;\n this._deflate[kBuffers] = [];\n\n if (fin && this.params[`${endpoint}_no_context_takeover`]) {\n this._deflate.reset();\n }\n\n callback(null, data);\n });\n }\n}\n\nmodule.exports = PerMessageDeflate;\n\n/**\n * The listener of the `zlib.DeflateRaw` stream `'data'` event.\n *\n * @param {Buffer} chunk A chunk of data\n * @private\n */\nfunction deflateOnData(chunk) {\n this[kBuffers].push(chunk);\n this[kTotalLength] += chunk.length;\n}\n\n/**\n * The listener of the `zlib.InflateRaw` stream `'data'` event.\n *\n * @param {Buffer} chunk A chunk of data\n * @private\n */\nfunction inflateOnData(chunk) {\n this[kTotalLength] += chunk.length;\n\n if (\n this[kPerMessageDeflate]._maxPayload < 1 ||\n this[kTotalLength] <= this[kPerMessageDeflate]._maxPayload\n ) {\n this[kBuffers].push(chunk);\n return;\n }\n\n this[kError] = new RangeError('Max payload size exceeded');\n this[kError].code = 'WS_ERR_UNSUPPORTED_MESSAGE_LENGTH';\n this[kError][kStatusCode] = 1009;\n this.removeListener('data', inflateOnData);\n this.reset();\n}\n\n/**\n * The listener of the `zlib.InflateRaw` stream `'error'` event.\n *\n * @param {Error} err The emitted error\n * @private\n */\nfunction inflateOnError(err) {\n //\n // There is no need to call `Zlib#close()` as the handle is automatically\n // closed when an error is emitted.\n //\n this[kPerMessageDeflate]._inflate = null;\n err[kStatusCode] = 1007;\n this[kCallback](err);\n}\n","'use strict';\n\n/**\n * Checks if a status code is allowed in a close frame.\n *\n * @param {Number} code The status code\n * @return {Boolean} `true` if the status code is valid, else `false`\n * @public\n */\nfunction isValidStatusCode(code) {\n return (\n (code >= 1000 &&\n code <= 1014 &&\n code !== 1004 &&\n code !== 1005 &&\n code !== 1006) ||\n (code >= 3000 && code <= 4999)\n );\n}\n\n/**\n * Checks if a given buffer contains only correct UTF-8.\n * Ported from https://www.cl.cam.ac.uk/%7Emgk25/ucs/utf8_check.c by\n * Markus Kuhn.\n *\n * @param {Buffer} buf The buffer to check\n * @return {Boolean} `true` if `buf` contains only correct UTF-8, else `false`\n * @public\n */\nfunction _isValidUTF8(buf) {\n const len = buf.length;\n let i = 0;\n\n while (i < len) {\n if ((buf[i] & 0x80) === 0) {\n // 0xxxxxxx\n i++;\n } else if ((buf[i] & 0xe0) === 0xc0) {\n // 110xxxxx 10xxxxxx\n if (\n i + 1 === len ||\n (buf[i + 1] & 0xc0) !== 0x80 ||\n (buf[i] & 0xfe) === 0xc0 // Overlong\n ) {\n return false;\n }\n\n i += 2;\n } else if ((buf[i] & 0xf0) === 0xe0) {\n // 1110xxxx 10xxxxxx 10xxxxxx\n if (\n i + 2 >= len ||\n (buf[i + 1] & 0xc0) !== 0x80 ||\n (buf[i + 2] & 0xc0) !== 0x80 ||\n (buf[i] === 0xe0 && (buf[i + 1] & 0xe0) === 0x80) || // Overlong\n (buf[i] === 0xed && (buf[i + 1] & 0xe0) === 0xa0) // Surrogate (U+D800 - U+DFFF)\n ) {\n return false;\n }\n\n i += 3;\n } else if ((buf[i] & 0xf8) === 0xf0) {\n // 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx\n if (\n i + 3 >= len ||\n (buf[i + 1] & 0xc0) !== 0x80 ||\n (buf[i + 2] & 0xc0) !== 0x80 ||\n (buf[i + 3] & 0xc0) !== 0x80 ||\n (buf[i] === 0xf0 && (buf[i + 1] & 0xf0) === 0x80) || // Overlong\n (buf[i] === 0xf4 && buf[i + 1] > 0x8f) ||\n buf[i] > 0xf4 // > U+10FFFF\n ) {\n return false;\n }\n\n i += 4;\n } else {\n return false;\n }\n }\n\n return true;\n}\n\ntry {\n let isValidUTF8 = require('utf-8-validate');\n\n /* istanbul ignore if */\n if (typeof isValidUTF8 === 'object') {\n isValidUTF8 = isValidUTF8.Validation.isValidUTF8; // utf-8-validate@<3.0.0\n }\n\n module.exports = {\n isValidStatusCode,\n isValidUTF8(buf) {\n return buf.length < 150 ? _isValidUTF8(buf) : isValidUTF8(buf);\n }\n };\n} catch (e) /* istanbul ignore next */ {\n module.exports = {\n isValidStatusCode,\n isValidUTF8: _isValidUTF8\n };\n}\n","'use strict';\n\nconst { Writable } = require('stream');\n\nconst PerMessageDeflate = require('./permessage-deflate');\nconst {\n BINARY_TYPES,\n EMPTY_BUFFER,\n kStatusCode,\n kWebSocket\n} = require('./constants');\nconst { concat, toArrayBuffer, unmask } = require('./buffer-util');\nconst { isValidStatusCode, isValidUTF8 } = require('./validation');\n\nconst GET_INFO = 0;\nconst GET_PAYLOAD_LENGTH_16 = 1;\nconst GET_PAYLOAD_LENGTH_64 = 2;\nconst GET_MASK = 3;\nconst GET_DATA = 4;\nconst INFLATING = 5;\n\n/**\n * HyBi Receiver implementation.\n *\n * @extends Writable\n */\nclass Receiver extends Writable {\n /**\n * Creates a Receiver instance.\n *\n * @param {String} [binaryType=nodebuffer] The type for binary data\n * @param {Object} [extensions] An object containing the negotiated extensions\n * @param {Boolean} [isServer=false] Specifies whether to operate in client or\n * server mode\n * @param {Number} [maxPayload=0] The maximum allowed message length\n */\n constructor(binaryType, extensions, isServer, maxPayload) {\n super();\n\n this._binaryType = binaryType || BINARY_TYPES[0];\n this[kWebSocket] = undefined;\n this._extensions = extensions || {};\n this._isServer = !!isServer;\n this._maxPayload = maxPayload | 0;\n\n this._bufferedBytes = 0;\n this._buffers = [];\n\n this._compressed = false;\n this._payloadLength = 0;\n this._mask = undefined;\n this._fragmented = 0;\n this._masked = false;\n this._fin = false;\n this._opcode = 0;\n\n this._totalPayloadLength = 0;\n this._messageLength = 0;\n this._fragments = [];\n\n this._state = GET_INFO;\n this._loop = false;\n }\n\n /**\n * Implements `Writable.prototype._write()`.\n *\n * @param {Buffer} chunk The chunk of data to write\n * @param {String} encoding The character encoding of `chunk`\n * @param {Function} cb Callback\n * @private\n */\n _write(chunk, encoding, cb) {\n if (this._opcode === 0x08 && this._state == GET_INFO) return cb();\n\n this._bufferedBytes += chunk.length;\n this._buffers.push(chunk);\n this.startLoop(cb);\n }\n\n /**\n * Consumes `n` bytes from the buffered data.\n *\n * @param {Number} n The number of bytes to consume\n * @return {Buffer} The consumed bytes\n * @private\n */\n consume(n) {\n this._bufferedBytes -= n;\n\n if (n === this._buffers[0].length) return this._buffers.shift();\n\n if (n < this._buffers[0].length) {\n const buf = this._buffers[0];\n this._buffers[0] = buf.slice(n);\n return buf.slice(0, n);\n }\n\n const dst = Buffer.allocUnsafe(n);\n\n do {\n const buf = this._buffers[0];\n const offset = dst.length - n;\n\n if (n >= buf.length) {\n dst.set(this._buffers.shift(), offset);\n } else {\n dst.set(new Uint8Array(buf.buffer, buf.byteOffset, n), offset);\n this._buffers[0] = buf.slice(n);\n }\n\n n -= buf.length;\n } while (n > 0);\n\n return dst;\n }\n\n /**\n * Starts the parsing loop.\n *\n * @param {Function} cb Callback\n * @private\n */\n startLoop(cb) {\n let err;\n this._loop = true;\n\n do {\n switch (this._state) {\n case GET_INFO:\n err = this.getInfo();\n break;\n case GET_PAYLOAD_LENGTH_16:\n err = this.getPayloadLength16();\n break;\n case GET_PAYLOAD_LENGTH_64:\n err = this.getPayloadLength64();\n break;\n case GET_MASK:\n this.getMask();\n break;\n case GET_DATA:\n err = this.getData(cb);\n break;\n default:\n // `INFLATING`\n this._loop = false;\n return;\n }\n } while (this._loop);\n\n cb(err);\n }\n\n /**\n * Reads the first two bytes of a frame.\n *\n * @return {(RangeError|undefined)} A possible error\n * @private\n */\n getInfo() {\n if (this._bufferedBytes < 2) {\n this._loop = false;\n return;\n }\n\n const buf = this.consume(2);\n\n if ((buf[0] & 0x30) !== 0x00) {\n this._loop = false;\n return error(\n RangeError,\n 'RSV2 and RSV3 must be clear',\n true,\n 1002,\n 'WS_ERR_UNEXPECTED_RSV_2_3'\n );\n }\n\n const compressed = (buf[0] & 0x40) === 0x40;\n\n if (compressed && !this._extensions[PerMessageDeflate.extensionName]) {\n this._loop = false;\n return error(\n RangeError,\n 'RSV1 must be clear',\n true,\n 1002,\n 'WS_ERR_UNEXPECTED_RSV_1'\n );\n }\n\n this._fin = (buf[0] & 0x80) === 0x80;\n this._opcode = buf[0] & 0x0f;\n this._payloadLength = buf[1] & 0x7f;\n\n if (this._opcode === 0x00) {\n if (compressed) {\n this._loop = false;\n return error(\n RangeError,\n 'RSV1 must be clear',\n true,\n 1002,\n 'WS_ERR_UNEXPECTED_RSV_1'\n );\n }\n\n if (!this._fragmented) {\n this._loop = false;\n return error(\n RangeError,\n 'invalid opcode 0',\n true,\n 1002,\n 'WS_ERR_INVALID_OPCODE'\n );\n }\n\n this._opcode = this._fragmented;\n } else if (this._opcode === 0x01 || this._opcode === 0x02) {\n if (this._fragmented) {\n this._loop = false;\n return error(\n RangeError,\n `invalid opcode ${this._opcode}`,\n true,\n 1002,\n 'WS_ERR_INVALID_OPCODE'\n );\n }\n\n this._compressed = compressed;\n } else if (this._opcode > 0x07 && this._opcode < 0x0b) {\n if (!this._fin) {\n this._loop = false;\n return error(\n RangeError,\n 'FIN must be set',\n true,\n 1002,\n 'WS_ERR_EXPECTED_FIN'\n );\n }\n\n if (compressed) {\n this._loop = false;\n return error(\n RangeError,\n 'RSV1 must be clear',\n true,\n 1002,\n 'WS_ERR_UNEXPECTED_RSV_1'\n );\n }\n\n if (this._payloadLength > 0x7d) {\n this._loop = false;\n return error(\n RangeError,\n `invalid payload length ${this._payloadLength}`,\n true,\n 1002,\n 'WS_ERR_INVALID_CONTROL_PAYLOAD_LENGTH'\n );\n }\n } else {\n this._loop = false;\n return error(\n RangeError,\n `invalid opcode ${this._opcode}`,\n true,\n 1002,\n 'WS_ERR_INVALID_OPCODE'\n );\n }\n\n if (!this._fin && !this._fragmented) this._fragmented = this._opcode;\n this._masked = (buf[1] & 0x80) === 0x80;\n\n if (this._isServer) {\n if (!this._masked) {\n this._loop = false;\n return error(\n RangeError,\n 'MASK must be set',\n true,\n 1002,\n 'WS_ERR_EXPECTED_MASK'\n );\n }\n } else if (this._masked) {\n this._loop = false;\n return error(\n RangeError,\n 'MASK must be clear',\n true,\n 1002,\n 'WS_ERR_UNEXPECTED_MASK'\n );\n }\n\n if (this._payloadLength === 126) this._state = GET_PAYLOAD_LENGTH_16;\n else if (this._payloadLength === 127) this._state = GET_PAYLOAD_LENGTH_64;\n else return this.haveLength();\n }\n\n /**\n * Gets extended payload length (7+16).\n *\n * @return {(RangeError|undefined)} A possible error\n * @private\n */\n getPayloadLength16() {\n if (this._bufferedBytes < 2) {\n this._loop = false;\n return;\n }\n\n this._payloadLength = this.consume(2).readUInt16BE(0);\n return this.haveLength();\n }\n\n /**\n * Gets extended payload length (7+64).\n *\n * @return {(RangeError|undefined)} A possible error\n * @private\n */\n getPayloadLength64() {\n if (this._bufferedBytes < 8) {\n this._loop = false;\n return;\n }\n\n const buf = this.consume(8);\n const num = buf.readUInt32BE(0);\n\n //\n // The maximum safe integer in JavaScript is 2^53 - 1. An error is returned\n // if payload length is greater than this number.\n //\n if (num > Math.pow(2, 53 - 32) - 1) {\n this._loop = false;\n return error(\n RangeError,\n 'Unsupported WebSocket frame: payload length > 2^53 - 1',\n false,\n 1009,\n 'WS_ERR_UNSUPPORTED_DATA_PAYLOAD_LENGTH'\n );\n }\n\n this._payloadLength = num * Math.pow(2, 32) + buf.readUInt32BE(4);\n return this.haveLength();\n }\n\n /**\n * Payload length has been read.\n *\n * @return {(RangeError|undefined)} A possible error\n * @private\n */\n haveLength() {\n if (this._payloadLength && this._opcode < 0x08) {\n this._totalPayloadLength += this._payloadLength;\n if (this._totalPayloadLength > this._maxPayload && this._maxPayload > 0) {\n this._loop = false;\n return error(\n RangeError,\n 'Max payload size exceeded',\n false,\n 1009,\n 'WS_ERR_UNSUPPORTED_MESSAGE_LENGTH'\n );\n }\n }\n\n if (this._masked) this._state = GET_MASK;\n else this._state = GET_DATA;\n }\n\n /**\n * Reads mask bytes.\n *\n * @private\n */\n getMask() {\n if (this._bufferedBytes < 4) {\n this._loop = false;\n return;\n }\n\n this._mask = this.consume(4);\n this._state = GET_DATA;\n }\n\n /**\n * Reads data bytes.\n *\n * @param {Function} cb Callback\n * @return {(Error|RangeError|undefined)} A possible error\n * @private\n */\n getData(cb) {\n let data = EMPTY_BUFFER;\n\n if (this._payloadLength) {\n if (this._bufferedBytes < this._payloadLength) {\n this._loop = false;\n return;\n }\n\n data = this.consume(this._payloadLength);\n if (this._masked) unmask(data, this._mask);\n }\n\n if (this._opcode > 0x07) return this.controlMessage(data);\n\n if (this._compressed) {\n this._state = INFLATING;\n this.decompress(data, cb);\n return;\n }\n\n if (data.length) {\n //\n // This message is not compressed so its lenght is the sum of the payload\n // length of all fragments.\n //\n this._messageLength = this._totalPayloadLength;\n this._fragments.push(data);\n }\n\n return this.dataMessage();\n }\n\n /**\n * Decompresses data.\n *\n * @param {Buffer} data Compressed data\n * @param {Function} cb Callback\n * @private\n */\n decompress(data, cb) {\n const perMessageDeflate = this._extensions[PerMessageDeflate.extensionName];\n\n perMessageDeflate.decompress(data, this._fin, (err, buf) => {\n if (err) return cb(err);\n\n if (buf.length) {\n this._messageLength += buf.length;\n if (this._messageLength > this._maxPayload && this._maxPayload > 0) {\n return cb(\n error(\n RangeError,\n 'Max payload size exceeded',\n false,\n 1009,\n 'WS_ERR_UNSUPPORTED_MESSAGE_LENGTH'\n )\n );\n }\n\n this._fragments.push(buf);\n }\n\n const er = this.dataMessage();\n if (er) return cb(er);\n\n this.startLoop(cb);\n });\n }\n\n /**\n * Handles a data message.\n *\n * @return {(Error|undefined)} A possible error\n * @private\n */\n dataMessage() {\n if (this._fin) {\n const messageLength = this._messageLength;\n const fragments = this._fragments;\n\n this._totalPayloadLength = 0;\n this._messageLength = 0;\n this._fragmented = 0;\n this._fragments = [];\n\n if (this._opcode === 2) {\n let data;\n\n if (this._binaryType === 'nodebuffer') {\n data = concat(fragments, messageLength);\n } else if (this._binaryType === 'arraybuffer') {\n data = toArrayBuffer(concat(fragments, messageLength));\n } else {\n data = fragments;\n }\n\n this.emit('message', data);\n } else {\n const buf = concat(fragments, messageLength);\n\n if (!isValidUTF8(buf)) {\n this._loop = false;\n return error(\n Error,\n 'invalid UTF-8 sequence',\n true,\n 1007,\n 'WS_ERR_INVALID_UTF8'\n );\n }\n\n this.emit('message', buf.toString());\n }\n }\n\n this._state = GET_INFO;\n }\n\n /**\n * Handles a control message.\n *\n * @param {Buffer} data Data to handle\n * @return {(Error|RangeError|undefined)} A possible error\n * @private\n */\n controlMessage(data) {\n if (this._opcode === 0x08) {\n this._loop = false;\n\n if (data.length === 0) {\n this.emit('conclude', 1005, '');\n this.end();\n } else if (data.length === 1) {\n return error(\n RangeError,\n 'invalid payload length 1',\n true,\n 1002,\n 'WS_ERR_INVALID_CONTROL_PAYLOAD_LENGTH'\n );\n } else {\n const code = data.readUInt16BE(0);\n\n if (!isValidStatusCode(code)) {\n return error(\n RangeError,\n `invalid status code ${code}`,\n true,\n 1002,\n 'WS_ERR_INVALID_CLOSE_CODE'\n );\n }\n\n const buf = data.slice(2);\n\n if (!isValidUTF8(buf)) {\n return error(\n Error,\n 'invalid UTF-8 sequence',\n true,\n 1007,\n 'WS_ERR_INVALID_UTF8'\n );\n }\n\n this.emit('conclude', code, buf.toString());\n this.end();\n }\n } else if (this._opcode === 0x09) {\n this.emit('ping', data);\n } else {\n this.emit('pong', data);\n }\n\n this._state = GET_INFO;\n }\n}\n\nmodule.exports = Receiver;\n\n/**\n * Builds an error object.\n *\n * @param {function(new:Error|RangeError)} ErrorCtor The error constructor\n * @param {String} message The error message\n * @param {Boolean} prefix Specifies whether or not to add a default prefix to\n * `message`\n * @param {Number} statusCode The status code\n * @param {String} errorCode The exposed error code\n * @return {(Error|RangeError)} The error\n * @private\n */\nfunction error(ErrorCtor, message, prefix, statusCode, errorCode) {\n const err = new ErrorCtor(\n prefix ? `Invalid WebSocket frame: ${message}` : message\n );\n\n Error.captureStackTrace(err, error);\n err.code = errorCode;\n err[kStatusCode] = statusCode;\n return err;\n}\n","/* eslint no-unused-vars: [\"error\", { \"varsIgnorePattern\": \"^net|tls$\" }] */\n\n'use strict';\n\nconst net = require('net');\nconst tls = require('tls');\nconst { randomFillSync } = require('crypto');\n\nconst PerMessageDeflate = require('./permessage-deflate');\nconst { EMPTY_BUFFER } = require('./constants');\nconst { isValidStatusCode } = require('./validation');\nconst { mask: applyMask, toBuffer } = require('./buffer-util');\n\nconst mask = Buffer.alloc(4);\n\n/**\n * HyBi Sender implementation.\n */\nclass Sender {\n /**\n * Creates a Sender instance.\n *\n * @param {(net.Socket|tls.Socket)} socket The connection socket\n * @param {Object} [extensions] An object containing the negotiated extensions\n */\n constructor(socket, extensions) {\n this._extensions = extensions || {};\n this._socket = socket;\n\n this._firstFragment = true;\n this._compress = false;\n\n this._bufferedBytes = 0;\n this._deflating = false;\n this._queue = [];\n }\n\n /**\n * Frames a piece of data according to the HyBi WebSocket protocol.\n *\n * @param {Buffer} data The data to frame\n * @param {Object} options Options object\n * @param {Number} options.opcode The opcode\n * @param {Boolean} [options.readOnly=false] Specifies whether `data` can be\n * modified\n * @param {Boolean} [options.fin=false] Specifies whether or not to set the\n * FIN bit\n * @param {Boolean} [options.mask=false] Specifies whether or not to mask\n * `data`\n * @param {Boolean} [options.rsv1=false] Specifies whether or not to set the\n * RSV1 bit\n * @return {Buffer[]} The framed data as a list of `Buffer` instances\n * @public\n */\n static frame(data, options) {\n const merge = options.mask && options.readOnly;\n let offset = options.mask ? 6 : 2;\n let payloadLength = data.length;\n\n if (data.length >= 65536) {\n offset += 8;\n payloadLength = 127;\n } else if (data.length > 125) {\n offset += 2;\n payloadLength = 126;\n }\n\n const target = Buffer.allocUnsafe(merge ? data.length + offset : offset);\n\n target[0] = options.fin ? options.opcode | 0x80 : options.opcode;\n if (options.rsv1) target[0] |= 0x40;\n\n target[1] = payloadLength;\n\n if (payloadLength === 126) {\n target.writeUInt16BE(data.length, 2);\n } else if (payloadLength === 127) {\n target.writeUInt32BE(0, 2);\n target.writeUInt32BE(data.length, 6);\n }\n\n if (!options.mask) return [target, data];\n\n randomFillSync(mask, 0, 4);\n\n target[1] |= 0x80;\n target[offset - 4] = mask[0];\n target[offset - 3] = mask[1];\n target[offset - 2] = mask[2];\n target[offset - 1] = mask[3];\n\n if (merge) {\n applyMask(data, mask, target, offset, data.length);\n return [target];\n }\n\n applyMask(data, mask, data, 0, data.length);\n return [target, data];\n }\n\n /**\n * Sends a close message to the other peer.\n *\n * @param {Number} [code] The status code component of the body\n * @param {String} [data] The message component of the body\n * @param {Boolean} [mask=false] Specifies whether or not to mask the message\n * @param {Function} [cb] Callback\n * @public\n */\n close(code, data, mask, cb) {\n let buf;\n\n if (code === undefined) {\n buf = EMPTY_BUFFER;\n } else if (typeof code !== 'number' || !isValidStatusCode(code)) {\n throw new TypeError('First argument must be a valid error code number');\n } else if (data === undefined || data === '') {\n buf = Buffer.allocUnsafe(2);\n buf.writeUInt16BE(code, 0);\n } else {\n const length = Buffer.byteLength(data);\n\n if (length > 123) {\n throw new RangeError('The message must not be greater than 123 bytes');\n }\n\n buf = Buffer.allocUnsafe(2 + length);\n buf.writeUInt16BE(code, 0);\n buf.write(data, 2);\n }\n\n if (this._deflating) {\n this.enqueue([this.doClose, buf, mask, cb]);\n } else {\n this.doClose(buf, mask, cb);\n }\n }\n\n /**\n * Frames and sends a close message.\n *\n * @param {Buffer} data The message to send\n * @param {Boolean} [mask=false] Specifies whether or not to mask `data`\n * @param {Function} [cb] Callback\n * @private\n */\n doClose(data, mask, cb) {\n this.sendFrame(\n Sender.frame(data, {\n fin: true,\n rsv1: false,\n opcode: 0x08,\n mask,\n readOnly: false\n }),\n cb\n );\n }\n\n /**\n * Sends a ping message to the other peer.\n *\n * @param {*} data The message to send\n * @param {Boolean} [mask=false] Specifies whether or not to mask `data`\n * @param {Function} [cb] Callback\n * @public\n */\n ping(data, mask, cb) {\n const buf = toBuffer(data);\n\n if (buf.length > 125) {\n throw new RangeError('The data size must not be greater than 125 bytes');\n }\n\n if (this._deflating) {\n this.enqueue([this.doPing, buf, mask, toBuffer.readOnly, cb]);\n } else {\n this.doPing(buf, mask, toBuffer.readOnly, cb);\n }\n }\n\n /**\n * Frames and sends a ping message.\n *\n * @param {Buffer} data The message to send\n * @param {Boolean} [mask=false] Specifies whether or not to mask `data`\n * @param {Boolean} [readOnly=false] Specifies whether `data` can be modified\n * @param {Function} [cb] Callback\n * @private\n */\n doPing(data, mask, readOnly, cb) {\n this.sendFrame(\n Sender.frame(data, {\n fin: true,\n rsv1: false,\n opcode: 0x09,\n mask,\n readOnly\n }),\n cb\n );\n }\n\n /**\n * Sends a pong message to the other peer.\n *\n * @param {*} data The message to send\n * @param {Boolean} [mask=false] Specifies whether or not to mask `data`\n * @param {Function} [cb] Callback\n * @public\n */\n pong(data, mask, cb) {\n const buf = toBuffer(data);\n\n if (buf.length > 125) {\n throw new RangeError('The data size must not be greater than 125 bytes');\n }\n\n if (this._deflating) {\n this.enqueue([this.doPong, buf, mask, toBuffer.readOnly, cb]);\n } else {\n this.doPong(buf, mask, toBuffer.readOnly, cb);\n }\n }\n\n /**\n * Frames and sends a pong message.\n *\n * @param {Buffer} data The message to send\n * @param {Boolean} [mask=false] Specifies whether or not to mask `data`\n * @param {Boolean} [readOnly=false] Specifies whether `data` can be modified\n * @param {Function} [cb] Callback\n * @private\n */\n doPong(data, mask, readOnly, cb) {\n this.sendFrame(\n Sender.frame(data, {\n fin: true,\n rsv1: false,\n opcode: 0x0a,\n mask,\n readOnly\n }),\n cb\n );\n }\n\n /**\n * Sends a data message to the other peer.\n *\n * @param {*} data The message to send\n * @param {Object} options Options object\n * @param {Boolean} [options.compress=false] Specifies whether or not to\n * compress `data`\n * @param {Boolean} [options.binary=false] Specifies whether `data` is binary\n * or text\n * @param {Boolean} [options.fin=false] Specifies whether the fragment is the\n * last one\n * @param {Boolean} [options.mask=false] Specifies whether or not to mask\n * `data`\n * @param {Function} [cb] Callback\n * @public\n */\n send(data, options, cb) {\n const buf = toBuffer(data);\n const perMessageDeflate = this._extensions[PerMessageDeflate.extensionName];\n let opcode = options.binary ? 2 : 1;\n let rsv1 = options.compress;\n\n if (this._firstFragment) {\n this._firstFragment = false;\n if (rsv1 && perMessageDeflate) {\n rsv1 = buf.length >= perMessageDeflate._threshold;\n }\n this._compress = rsv1;\n } else {\n rsv1 = false;\n opcode = 0;\n }\n\n if (options.fin) this._firstFragment = true;\n\n if (perMessageDeflate) {\n const opts = {\n fin: options.fin,\n rsv1,\n opcode,\n mask: options.mask,\n readOnly: toBuffer.readOnly\n };\n\n if (this._deflating) {\n this.enqueue([this.dispatch, buf, this._compress, opts, cb]);\n } else {\n this.dispatch(buf, this._compress, opts, cb);\n }\n } else {\n this.sendFrame(\n Sender.frame(buf, {\n fin: options.fin,\n rsv1: false,\n opcode,\n mask: options.mask,\n readOnly: toBuffer.readOnly\n }),\n cb\n );\n }\n }\n\n /**\n * Dispatches a data message.\n *\n * @param {Buffer} data The message to send\n * @param {Boolean} [compress=false] Specifies whether or not to compress\n * `data`\n * @param {Object} options Options object\n * @param {Number} options.opcode The opcode\n * @param {Boolean} [options.readOnly=false] Specifies whether `data` can be\n * modified\n * @param {Boolean} [options.fin=false] Specifies whether or not to set the\n * FIN bit\n * @param {Boolean} [options.mask=false] Specifies whether or not to mask\n * `data`\n * @param {Boolean} [options.rsv1=false] Specifies whether or not to set the\n * RSV1 bit\n * @param {Function} [cb] Callback\n * @private\n */\n dispatch(data, compress, options, cb) {\n if (!compress) {\n this.sendFrame(Sender.frame(data, options), cb);\n return;\n }\n\n const perMessageDeflate = this._extensions[PerMessageDeflate.extensionName];\n\n this._bufferedBytes += data.length;\n this._deflating = true;\n perMessageDeflate.compress(data, options.fin, (_, buf) => {\n if (this._socket.destroyed) {\n const err = new Error(\n 'The socket was closed while data was being compressed'\n );\n\n if (typeof cb === 'function') cb(err);\n\n for (let i = 0; i < this._queue.length; i++) {\n const callback = this._queue[i][4];\n\n if (typeof callback === 'function') callback(err);\n }\n\n return;\n }\n\n this._bufferedBytes -= data.length;\n this._deflating = false;\n options.readOnly = false;\n this.sendFrame(Sender.frame(buf, options), cb);\n this.dequeue();\n });\n }\n\n /**\n * Executes queued send operations.\n *\n * @private\n */\n dequeue() {\n while (!this._deflating && this._queue.length) {\n const params = this._queue.shift();\n\n this._bufferedBytes -= params[1].length;\n Reflect.apply(params[0], this, params.slice(1));\n }\n }\n\n /**\n * Enqueues a send operation.\n *\n * @param {Array} params Send operation parameters.\n * @private\n */\n enqueue(params) {\n this._bufferedBytes += params[1].length;\n this._queue.push(params);\n }\n\n /**\n * Sends a frame.\n *\n * @param {Buffer[]} list The frame to send\n * @param {Function} [cb] Callback\n * @private\n */\n sendFrame(list, cb) {\n if (list.length === 2) {\n this._socket.cork();\n this._socket.write(list[0]);\n this._socket.write(list[1], cb);\n this._socket.uncork();\n } else {\n this._socket.write(list[0], cb);\n }\n }\n}\n\nmodule.exports = Sender;\n","'use strict';\n\n/**\n * Class representing an event.\n *\n * @private\n */\nclass Event {\n /**\n * Create a new `Event`.\n *\n * @param {String} type The name of the event\n * @param {Object} target A reference to the target to which the event was\n * dispatched\n */\n constructor(type, target) {\n this.target = target;\n this.type = type;\n }\n}\n\n/**\n * Class representing a message event.\n *\n * @extends Event\n * @private\n */\nclass MessageEvent extends Event {\n /**\n * Create a new `MessageEvent`.\n *\n * @param {(String|Buffer|ArrayBuffer|Buffer[])} data The received data\n * @param {WebSocket} target A reference to the target to which the event was\n * dispatched\n */\n constructor(data, target) {\n super('message', target);\n\n this.data = data;\n }\n}\n\n/**\n * Class representing a close event.\n *\n * @extends Event\n * @private\n */\nclass CloseEvent extends Event {\n /**\n * Create a new `CloseEvent`.\n *\n * @param {Number} code The status code explaining why the connection is being\n * closed\n * @param {String} reason A human-readable string explaining why the\n * connection is closing\n * @param {WebSocket} target A reference to the target to which the event was\n * dispatched\n */\n constructor(code, reason, target) {\n super('close', target);\n\n this.wasClean = target._closeFrameReceived && target._closeFrameSent;\n this.reason = reason;\n this.code = code;\n }\n}\n\n/**\n * Class representing an open event.\n *\n * @extends Event\n * @private\n */\nclass OpenEvent extends Event {\n /**\n * Create a new `OpenEvent`.\n *\n * @param {WebSocket} target A reference to the target to which the event was\n * dispatched\n */\n constructor(target) {\n super('open', target);\n }\n}\n\n/**\n * Class representing an error event.\n *\n * @extends Event\n * @private\n */\nclass ErrorEvent extends Event {\n /**\n * Create a new `ErrorEvent`.\n *\n * @param {Object} error The error that generated this event\n * @param {WebSocket} target A reference to the target to which the event was\n * dispatched\n */\n constructor(error, target) {\n super('error', target);\n\n this.message = error.message;\n this.error = error;\n }\n}\n\n/**\n * This provides methods for emulating the `EventTarget` interface. It's not\n * meant to be used directly.\n *\n * @mixin\n */\nconst EventTarget = {\n /**\n * Register an event listener.\n *\n * @param {String} type A string representing the event type to listen for\n * @param {Function} listener The listener to add\n * @param {Object} [options] An options object specifies characteristics about\n * the event listener\n * @param {Boolean} [options.once=false] A `Boolean`` indicating that the\n * listener should be invoked at most once after being added. If `true`,\n * the listener would be automatically removed when invoked.\n * @public\n */\n addEventListener(type, listener, options) {\n if (typeof listener !== 'function') return;\n\n function onMessage(data) {\n listener.call(this, new MessageEvent(data, this));\n }\n\n function onClose(code, message) {\n listener.call(this, new CloseEvent(code, message, this));\n }\n\n function onError(error) {\n listener.call(this, new ErrorEvent(error, this));\n }\n\n function onOpen() {\n listener.call(this, new OpenEvent(this));\n }\n\n const method = options && options.once ? 'once' : 'on';\n\n if (type === 'message') {\n onMessage._listener = listener;\n this[method](type, onMessage);\n } else if (type === 'close') {\n onClose._listener = listener;\n this[method](type, onClose);\n } else if (type === 'error') {\n onError._listener = listener;\n this[method](type, onError);\n } else if (type === 'open') {\n onOpen._listener = listener;\n this[method](type, onOpen);\n } else {\n this[method](type, listener);\n }\n },\n\n /**\n * Remove an event listener.\n *\n * @param {String} type A string representing the event type to remove\n * @param {Function} listener The listener to remove\n * @public\n */\n removeEventListener(type, listener) {\n const listeners = this.listeners(type);\n\n for (let i = 0; i < listeners.length; i++) {\n if (listeners[i] === listener || listeners[i]._listener === listener) {\n this.removeListener(type, listeners[i]);\n }\n }\n }\n};\n\nmodule.exports = EventTarget;\n","'use strict';\n\n//\n// Allowed token characters:\n//\n// '!', '#', '$', '%', '&', ''', '*', '+', '-',\n// '.', 0-9, A-Z, '^', '_', '`', a-z, '|', '~'\n//\n// tokenChars[32] === 0 // ' '\n// tokenChars[33] === 1 // '!'\n// tokenChars[34] === 0 // '\"'\n// ...\n//\n// prettier-ignore\nconst tokenChars = [\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0 - 15\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 16 - 31\n 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, // 32 - 47\n 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, // 48 - 63\n 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 64 - 79\n 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, // 80 - 95\n 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 96 - 111\n 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0 // 112 - 127\n];\n\n/**\n * Adds an offer to the map of extension offers or a parameter to the map of\n * parameters.\n *\n * @param {Object} dest The map of extension offers or parameters\n * @param {String} name The extension or parameter name\n * @param {(Object|Boolean|String)} elem The extension parameters or the\n * parameter value\n * @private\n */\nfunction push(dest, name, elem) {\n if (dest[name] === undefined) dest[name] = [elem];\n else dest[name].push(elem);\n}\n\n/**\n * Parses the `Sec-WebSocket-Extensions` header into an object.\n *\n * @param {String} header The field value of the header\n * @return {Object} The parsed object\n * @public\n */\nfunction parse(header) {\n const offers = Object.create(null);\n\n if (header === undefined || header === '') return offers;\n\n let params = Object.create(null);\n let mustUnescape = false;\n let isEscaping = false;\n let inQuotes = false;\n let extensionName;\n let paramName;\n let start = -1;\n let end = -1;\n let i = 0;\n\n for (; i < header.length; i++) {\n const code = header.charCodeAt(i);\n\n if (extensionName === undefined) {\n if (end === -1 && tokenChars[code] === 1) {\n if (start === -1) start = i;\n } else if (code === 0x20 /* ' ' */ || code === 0x09 /* '\\t' */) {\n if (end === -1 && start !== -1) end = i;\n } else if (code === 0x3b /* ';' */ || code === 0x2c /* ',' */) {\n if (start === -1) {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n\n if (end === -1) end = i;\n const name = header.slice(start, end);\n if (code === 0x2c) {\n push(offers, name, params);\n params = Object.create(null);\n } else {\n extensionName = name;\n }\n\n start = end = -1;\n } else {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n } else if (paramName === undefined) {\n if (end === -1 && tokenChars[code] === 1) {\n if (start === -1) start = i;\n } else if (code === 0x20 || code === 0x09) {\n if (end === -1 && start !== -1) end = i;\n } else if (code === 0x3b || code === 0x2c) {\n if (start === -1) {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n\n if (end === -1) end = i;\n push(params, header.slice(start, end), true);\n if (code === 0x2c) {\n push(offers, extensionName, params);\n params = Object.create(null);\n extensionName = undefined;\n }\n\n start = end = -1;\n } else if (code === 0x3d /* '=' */ && start !== -1 && end === -1) {\n paramName = header.slice(start, i);\n start = end = -1;\n } else {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n } else {\n //\n // The value of a quoted-string after unescaping must conform to the\n // token ABNF, so only token characters are valid.\n // Ref: https://tools.ietf.org/html/rfc6455#section-9.1\n //\n if (isEscaping) {\n if (tokenChars[code] !== 1) {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n if (start === -1) start = i;\n else if (!mustUnescape) mustUnescape = true;\n isEscaping = false;\n } else if (inQuotes) {\n if (tokenChars[code] === 1) {\n if (start === -1) start = i;\n } else if (code === 0x22 /* '\"' */ && start !== -1) {\n inQuotes = false;\n end = i;\n } else if (code === 0x5c /* '\\' */) {\n isEscaping = true;\n } else {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n } else if (code === 0x22 && header.charCodeAt(i - 1) === 0x3d) {\n inQuotes = true;\n } else if (end === -1 && tokenChars[code] === 1) {\n if (start === -1) start = i;\n } else if (start !== -1 && (code === 0x20 || code === 0x09)) {\n if (end === -1) end = i;\n } else if (code === 0x3b || code === 0x2c) {\n if (start === -1) {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n\n if (end === -1) end = i;\n let value = header.slice(start, end);\n if (mustUnescape) {\n value = value.replace(/\\\\/g, '');\n mustUnescape = false;\n }\n push(params, paramName, value);\n if (code === 0x2c) {\n push(offers, extensionName, params);\n params = Object.create(null);\n extensionName = undefined;\n }\n\n paramName = undefined;\n start = end = -1;\n } else {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n }\n }\n\n if (start === -1 || inQuotes) {\n throw new SyntaxError('Unexpected end of input');\n }\n\n if (end === -1) end = i;\n const token = header.slice(start, end);\n if (extensionName === undefined) {\n push(offers, token, params);\n } else {\n if (paramName === undefined) {\n push(params, token, true);\n } else if (mustUnescape) {\n push(params, paramName, token.replace(/\\\\/g, ''));\n } else {\n push(params, paramName, token);\n }\n push(offers, extensionName, params);\n }\n\n return offers;\n}\n\n/**\n * Builds the `Sec-WebSocket-Extensions` header field value.\n *\n * @param {Object} extensions The map of extensions and parameters to format\n * @return {String} A string representing the given object\n * @public\n */\nfunction format(extensions) {\n return Object.keys(extensions)\n .map((extension) => {\n let configurations = extensions[extension];\n if (!Array.isArray(configurations)) configurations = [configurations];\n return configurations\n .map((params) => {\n return [extension]\n .concat(\n Object.keys(params).map((k) => {\n let values = params[k];\n if (!Array.isArray(values)) values = [values];\n return values\n .map((v) => (v === true ? k : `${k}=${v}`))\n .join('; ');\n })\n )\n .join('; ');\n })\n .join(', ');\n })\n .join(', ');\n}\n\nmodule.exports = { format, parse };\n","/* eslint no-unused-vars: [\"error\", { \"varsIgnorePattern\": \"^Readable$\" }] */\n\n'use strict';\n\nconst EventEmitter = require('events');\nconst https = require('https');\nconst http = require('http');\nconst net = require('net');\nconst tls = require('tls');\nconst { randomBytes, createHash } = require('crypto');\nconst { Readable } = require('stream');\nconst { URL } = require('url');\n\nconst PerMessageDeflate = require('./permessage-deflate');\nconst Receiver = require('./receiver');\nconst Sender = require('./sender');\nconst {\n BINARY_TYPES,\n EMPTY_BUFFER,\n GUID,\n kStatusCode,\n kWebSocket,\n NOOP\n} = require('./constants');\nconst { addEventListener, removeEventListener } = require('./event-target');\nconst { format, parse } = require('./extension');\nconst { toBuffer } = require('./buffer-util');\n\nconst readyStates = ['CONNECTING', 'OPEN', 'CLOSING', 'CLOSED'];\nconst protocolVersions = [8, 13];\nconst closeTimeout = 30 * 1000;\n\n/**\n * Class representing a WebSocket.\n *\n * @extends EventEmitter\n */\nclass WebSocket extends EventEmitter {\n /**\n * Create a new `WebSocket`.\n *\n * @param {(String|URL)} address The URL to which to connect\n * @param {(String|String[])} [protocols] The subprotocols\n * @param {Object} [options] Connection options\n */\n constructor(address, protocols, options) {\n super();\n\n this._binaryType = BINARY_TYPES[0];\n this._closeCode = 1006;\n this._closeFrameReceived = false;\n this._closeFrameSent = false;\n this._closeMessage = '';\n this._closeTimer = null;\n this._extensions = {};\n this._protocol = '';\n this._readyState = WebSocket.CONNECTING;\n this._receiver = null;\n this._sender = null;\n this._socket = null;\n\n if (address !== null) {\n this._bufferedAmount = 0;\n this._isServer = false;\n this._redirects = 0;\n\n if (Array.isArray(protocols)) {\n protocols = protocols.join(', ');\n } else if (typeof protocols === 'object' && protocols !== null) {\n options = protocols;\n protocols = undefined;\n }\n\n initAsClient(this, address, protocols, options);\n } else {\n this._isServer = true;\n }\n }\n\n /**\n * This deviates from the WHATWG interface since ws doesn't support the\n * required default \"blob\" type (instead we define a custom \"nodebuffer\"\n * type).\n *\n * @type {String}\n */\n get binaryType() {\n return this._binaryType;\n }\n\n set binaryType(type) {\n if (!BINARY_TYPES.includes(type)) return;\n\n this._binaryType = type;\n\n //\n // Allow to change `binaryType` on the fly.\n //\n if (this._receiver) this._receiver._binaryType = type;\n }\n\n /**\n * @type {Number}\n */\n get bufferedAmount() {\n if (!this._socket) return this._bufferedAmount;\n\n return this._socket._writableState.length + this._sender._bufferedBytes;\n }\n\n /**\n * @type {String}\n */\n get extensions() {\n return Object.keys(this._extensions).join();\n }\n\n /**\n * @type {Function}\n */\n /* istanbul ignore next */\n get onclose() {\n return undefined;\n }\n\n /* istanbul ignore next */\n set onclose(listener) {}\n\n /**\n * @type {Function}\n */\n /* istanbul ignore next */\n get onerror() {\n return undefined;\n }\n\n /* istanbul ignore next */\n set onerror(listener) {}\n\n /**\n * @type {Function}\n */\n /* istanbul ignore next */\n get onopen() {\n return undefined;\n }\n\n /* istanbul ignore next */\n set onopen(listener) {}\n\n /**\n * @type {Function}\n */\n /* istanbul ignore next */\n get onmessage() {\n return undefined;\n }\n\n /* istanbul ignore next */\n set onmessage(listener) {}\n\n /**\n * @type {String}\n */\n get protocol() {\n return this._protocol;\n }\n\n /**\n * @type {Number}\n */\n get readyState() {\n return this._readyState;\n }\n\n /**\n * @type {String}\n */\n get url() {\n return this._url;\n }\n\n /**\n * Set up the socket and the internal resources.\n *\n * @param {(net.Socket|tls.Socket)} socket The network socket between the\n * server and client\n * @param {Buffer} head The first packet of the upgraded stream\n * @param {Number} [maxPayload=0] The maximum allowed message size\n * @private\n */\n setSocket(socket, head, maxPayload) {\n const receiver = new Receiver(\n this.binaryType,\n this._extensions,\n this._isServer,\n maxPayload\n );\n\n this._sender = new Sender(socket, this._extensions);\n this._receiver = receiver;\n this._socket = socket;\n\n receiver[kWebSocket] = this;\n socket[kWebSocket] = this;\n\n receiver.on('conclude', receiverOnConclude);\n receiver.on('drain', receiverOnDrain);\n receiver.on('error', receiverOnError);\n receiver.on('message', receiverOnMessage);\n receiver.on('ping', receiverOnPing);\n receiver.on('pong', receiverOnPong);\n\n socket.setTimeout(0);\n socket.setNoDelay();\n\n if (head.length > 0) socket.unshift(head);\n\n socket.on('close', socketOnClose);\n socket.on('data', socketOnData);\n socket.on('end', socketOnEnd);\n socket.on('error', socketOnError);\n\n this._readyState = WebSocket.OPEN;\n this.emit('open');\n }\n\n /**\n * Emit the `'close'` event.\n *\n * @private\n */\n emitClose() {\n if (!this._socket) {\n this._readyState = WebSocket.CLOSED;\n this.emit('close', this._closeCode, this._closeMessage);\n return;\n }\n\n if (this._extensions[PerMessageDeflate.extensionName]) {\n this._extensions[PerMessageDeflate.extensionName].cleanup();\n }\n\n this._receiver.removeAllListeners();\n this._readyState = WebSocket.CLOSED;\n this.emit('close', this._closeCode, this._closeMessage);\n }\n\n /**\n * Start a closing handshake.\n *\n * +----------+ +-----------+ +----------+\n * - - -|ws.close()|-->|close frame|-->|ws.close()|- - -\n * | +----------+ +-----------+ +----------+ |\n * +----------+ +-----------+ |\n * CLOSING |ws.close()|<--|close frame|<--+-----+ CLOSING\n * +----------+ +-----------+ |\n * | | | +---+ |\n * +------------------------+-->|fin| - - - -\n * | +---+ | +---+\n * - - - - -|fin|<---------------------+\n * +---+\n *\n * @param {Number} [code] Status code explaining why the connection is closing\n * @param {String} [data] A string explaining why the connection is closing\n * @public\n */\n close(code, data) {\n if (this.readyState === WebSocket.CLOSED) return;\n if (this.readyState === WebSocket.CONNECTING) {\n const msg = 'WebSocket was closed before the connection was established';\n return abortHandshake(this, this._req, msg);\n }\n\n if (this.readyState === WebSocket.CLOSING) {\n if (\n this._closeFrameSent &&\n (this._closeFrameReceived || this._receiver._writableState.errorEmitted)\n ) {\n this._socket.end();\n }\n\n return;\n }\n\n this._readyState = WebSocket.CLOSING;\n this._sender.close(code, data, !this._isServer, (err) => {\n //\n // This error is handled by the `'error'` listener on the socket. We only\n // want to know if the close frame has been sent here.\n //\n if (err) return;\n\n this._closeFrameSent = true;\n\n if (\n this._closeFrameReceived ||\n this._receiver._writableState.errorEmitted\n ) {\n this._socket.end();\n }\n });\n\n //\n // Specify a timeout for the closing handshake to complete.\n //\n this._closeTimer = setTimeout(\n this._socket.destroy.bind(this._socket),\n closeTimeout\n );\n }\n\n /**\n * Send a ping.\n *\n * @param {*} [data] The data to send\n * @param {Boolean} [mask] Indicates whether or not to mask `data`\n * @param {Function} [cb] Callback which is executed when the ping is sent\n * @public\n */\n ping(data, mask, cb) {\n if (this.readyState === WebSocket.CONNECTING) {\n throw new Error('WebSocket is not open: readyState 0 (CONNECTING)');\n }\n\n if (typeof data === 'function') {\n cb = data;\n data = mask = undefined;\n } else if (typeof mask === 'function') {\n cb = mask;\n mask = undefined;\n }\n\n if (typeof data === 'number') data = data.toString();\n\n if (this.readyState !== WebSocket.OPEN) {\n sendAfterClose(this, data, cb);\n return;\n }\n\n if (mask === undefined) mask = !this._isServer;\n this._sender.ping(data || EMPTY_BUFFER, mask, cb);\n }\n\n /**\n * Send a pong.\n *\n * @param {*} [data] The data to send\n * @param {Boolean} [mask] Indicates whether or not to mask `data`\n * @param {Function} [cb] Callback which is executed when the pong is sent\n * @public\n */\n pong(data, mask, cb) {\n if (this.readyState === WebSocket.CONNECTING) {\n throw new Error('WebSocket is not open: readyState 0 (CONNECTING)');\n }\n\n if (typeof data === 'function') {\n cb = data;\n data = mask = undefined;\n } else if (typeof mask === 'function') {\n cb = mask;\n mask = undefined;\n }\n\n if (typeof data === 'number') data = data.toString();\n\n if (this.readyState !== WebSocket.OPEN) {\n sendAfterClose(this, data, cb);\n return;\n }\n\n if (mask === undefined) mask = !this._isServer;\n this._sender.pong(data || EMPTY_BUFFER, mask, cb);\n }\n\n /**\n * Send a data message.\n *\n * @param {*} data The message to send\n * @param {Object} [options] Options object\n * @param {Boolean} [options.compress] Specifies whether or not to compress\n * `data`\n * @param {Boolean} [options.binary] Specifies whether `data` is binary or\n * text\n * @param {Boolean} [options.fin=true] Specifies whether the fragment is the\n * last one\n * @param {Boolean} [options.mask] Specifies whether or not to mask `data`\n * @param {Function} [cb] Callback which is executed when data is written out\n * @public\n */\n send(data, options, cb) {\n if (this.readyState === WebSocket.CONNECTING) {\n throw new Error('WebSocket is not open: readyState 0 (CONNECTING)');\n }\n\n if (typeof options === 'function') {\n cb = options;\n options = {};\n }\n\n if (typeof data === 'number') data = data.toString();\n\n if (this.readyState !== WebSocket.OPEN) {\n sendAfterClose(this, data, cb);\n return;\n }\n\n const opts = {\n binary: typeof data !== 'string',\n mask: !this._isServer,\n compress: true,\n fin: true,\n ...options\n };\n\n if (!this._extensions[PerMessageDeflate.extensionName]) {\n opts.compress = false;\n }\n\n this._sender.send(data || EMPTY_BUFFER, opts, cb);\n }\n\n /**\n * Forcibly close the connection.\n *\n * @public\n */\n terminate() {\n if (this.readyState === WebSocket.CLOSED) return;\n if (this.readyState === WebSocket.CONNECTING) {\n const msg = 'WebSocket was closed before the connection was established';\n return abortHandshake(this, this._req, msg);\n }\n\n if (this._socket) {\n this._readyState = WebSocket.CLOSING;\n this._socket.destroy();\n }\n }\n}\n\n/**\n * @constant {Number} CONNECTING\n * @memberof WebSocket\n */\nObject.defineProperty(WebSocket, 'CONNECTING', {\n enumerable: true,\n value: readyStates.indexOf('CONNECTING')\n});\n\n/**\n * @constant {Number} CONNECTING\n * @memberof WebSocket.prototype\n */\nObject.defineProperty(WebSocket.prototype, 'CONNECTING', {\n enumerable: true,\n value: readyStates.indexOf('CONNECTING')\n});\n\n/**\n * @constant {Number} OPEN\n * @memberof WebSocket\n */\nObject.defineProperty(WebSocket, 'OPEN', {\n enumerable: true,\n value: readyStates.indexOf('OPEN')\n});\n\n/**\n * @constant {Number} OPEN\n * @memberof WebSocket.prototype\n */\nObject.defineProperty(WebSocket.prototype, 'OPEN', {\n enumerable: true,\n value: readyStates.indexOf('OPEN')\n});\n\n/**\n * @constant {Number} CLOSING\n * @memberof WebSocket\n */\nObject.defineProperty(WebSocket, 'CLOSING', {\n enumerable: true,\n value: readyStates.indexOf('CLOSING')\n});\n\n/**\n * @constant {Number} CLOSING\n * @memberof WebSocket.prototype\n */\nObject.defineProperty(WebSocket.prototype, 'CLOSING', {\n enumerable: true,\n value: readyStates.indexOf('CLOSING')\n});\n\n/**\n * @constant {Number} CLOSED\n * @memberof WebSocket\n */\nObject.defineProperty(WebSocket, 'CLOSED', {\n enumerable: true,\n value: readyStates.indexOf('CLOSED')\n});\n\n/**\n * @constant {Number} CLOSED\n * @memberof WebSocket.prototype\n */\nObject.defineProperty(WebSocket.prototype, 'CLOSED', {\n enumerable: true,\n value: readyStates.indexOf('CLOSED')\n});\n\n[\n 'binaryType',\n 'bufferedAmount',\n 'extensions',\n 'protocol',\n 'readyState',\n 'url'\n].forEach((property) => {\n Object.defineProperty(WebSocket.prototype, property, { enumerable: true });\n});\n\n//\n// Add the `onopen`, `onerror`, `onclose`, and `onmessage` attributes.\n// See https://html.spec.whatwg.org/multipage/comms.html#the-websocket-interface\n//\n['open', 'error', 'close', 'message'].forEach((method) => {\n Object.defineProperty(WebSocket.prototype, `on${method}`, {\n enumerable: true,\n get() {\n const listeners = this.listeners(method);\n for (let i = 0; i < listeners.length; i++) {\n if (listeners[i]._listener) return listeners[i]._listener;\n }\n\n return undefined;\n },\n set(listener) {\n const listeners = this.listeners(method);\n for (let i = 0; i < listeners.length; i++) {\n //\n // Remove only the listeners added via `addEventListener`.\n //\n if (listeners[i]._listener) this.removeListener(method, listeners[i]);\n }\n this.addEventListener(method, listener);\n }\n });\n});\n\nWebSocket.prototype.addEventListener = addEventListener;\nWebSocket.prototype.removeEventListener = removeEventListener;\n\nmodule.exports = WebSocket;\n\n/**\n * Initialize a WebSocket client.\n *\n * @param {WebSocket} websocket The client to initialize\n * @param {(String|URL)} address The URL to which to connect\n * @param {String} [protocols] The subprotocols\n * @param {Object} [options] Connection options\n * @param {(Boolean|Object)} [options.perMessageDeflate=true] Enable/disable\n * permessage-deflate\n * @param {Number} [options.handshakeTimeout] Timeout in milliseconds for the\n * handshake request\n * @param {Number} [options.protocolVersion=13] Value of the\n * `Sec-WebSocket-Version` header\n * @param {String} [options.origin] Value of the `Origin` or\n * `Sec-WebSocket-Origin` header\n * @param {Number} [options.maxPayload=104857600] The maximum allowed message\n * size\n * @param {Boolean} [options.followRedirects=false] Whether or not to follow\n * redirects\n * @param {Number} [options.maxRedirects=10] The maximum number of redirects\n * allowed\n * @private\n */\nfunction initAsClient(websocket, address, protocols, options) {\n const opts = {\n protocolVersion: protocolVersions[1],\n maxPayload: 100 * 1024 * 1024,\n perMessageDeflate: true,\n followRedirects: false,\n maxRedirects: 10,\n ...options,\n createConnection: undefined,\n socketPath: undefined,\n hostname: undefined,\n protocol: undefined,\n timeout: undefined,\n method: undefined,\n host: undefined,\n path: undefined,\n port: undefined\n };\n\n if (!protocolVersions.includes(opts.protocolVersion)) {\n throw new RangeError(\n `Unsupported protocol version: ${opts.protocolVersion} ` +\n `(supported versions: ${protocolVersions.join(', ')})`\n );\n }\n\n let parsedUrl;\n\n if (address instanceof URL) {\n parsedUrl = address;\n websocket._url = address.href;\n } else {\n parsedUrl = new URL(address);\n websocket._url = address;\n }\n\n const isUnixSocket = parsedUrl.protocol === 'ws+unix:';\n\n if (!parsedUrl.host && (!isUnixSocket || !parsedUrl.pathname)) {\n const err = new Error(`Invalid URL: ${websocket.url}`);\n\n if (websocket._redirects === 0) {\n throw err;\n } else {\n emitErrorAndClose(websocket, err);\n return;\n }\n }\n\n const isSecure =\n parsedUrl.protocol === 'wss:' || parsedUrl.protocol === 'https:';\n const defaultPort = isSecure ? 443 : 80;\n const key = randomBytes(16).toString('base64');\n const get = isSecure ? https.get : http.get;\n let perMessageDeflate;\n\n opts.createConnection = isSecure ? tlsConnect : netConnect;\n opts.defaultPort = opts.defaultPort || defaultPort;\n opts.port = parsedUrl.port || defaultPort;\n opts.host = parsedUrl.hostname.startsWith('[')\n ? parsedUrl.hostname.slice(1, -1)\n : parsedUrl.hostname;\n opts.headers = {\n 'Sec-WebSocket-Version': opts.protocolVersion,\n 'Sec-WebSocket-Key': key,\n Connection: 'Upgrade',\n Upgrade: 'websocket',\n ...opts.headers\n };\n opts.path = parsedUrl.pathname + parsedUrl.search;\n opts.timeout = opts.handshakeTimeout;\n\n if (opts.perMessageDeflate) {\n perMessageDeflate = new PerMessageDeflate(\n opts.perMessageDeflate !== true ? opts.perMessageDeflate : {},\n false,\n opts.maxPayload\n );\n opts.headers['Sec-WebSocket-Extensions'] = format({\n [PerMessageDeflate.extensionName]: perMessageDeflate.offer()\n });\n }\n if (protocols) {\n opts.headers['Sec-WebSocket-Protocol'] = protocols;\n }\n if (opts.origin) {\n if (opts.protocolVersion < 13) {\n opts.headers['Sec-WebSocket-Origin'] = opts.origin;\n } else {\n opts.headers.Origin = opts.origin;\n }\n }\n if (parsedUrl.username || parsedUrl.password) {\n opts.auth = `${parsedUrl.username}:${parsedUrl.password}`;\n }\n\n if (isUnixSocket) {\n const parts = opts.path.split(':');\n\n opts.socketPath = parts[0];\n opts.path = parts[1];\n }\n\n if (opts.followRedirects) {\n if (websocket._redirects === 0) {\n websocket._originalUnixSocket = isUnixSocket;\n websocket._originalSecure = isSecure;\n websocket._originalHostOrSocketPath = isUnixSocket\n ? opts.socketPath\n : parsedUrl.host;\n\n const headers = options && options.headers;\n\n //\n // Shallow copy the user provided options so that headers can be changed\n // without mutating the original object.\n //\n options = { ...options, headers: {} };\n\n if (headers) {\n for (const [key, value] of Object.entries(headers)) {\n options.headers[key.toLowerCase()] = value;\n }\n }\n } else {\n const isSameHost = isUnixSocket\n ? websocket._originalUnixSocket\n ? opts.socketPath === websocket._originalHostOrSocketPath\n : false\n : websocket._originalUnixSocket\n ? false\n : parsedUrl.host === websocket._originalHostOrSocketPath;\n\n if (!isSameHost || (websocket._originalSecure && !isSecure)) {\n //\n // Match curl 7.77.0 behavior and drop the following headers. These\n // headers are also dropped when following a redirect to a subdomain.\n //\n delete opts.headers.authorization;\n delete opts.headers.cookie;\n\n if (!isSameHost) delete opts.headers.host;\n\n opts.auth = undefined;\n }\n }\n\n //\n // Match curl 7.77.0 behavior and make the first `Authorization` header win.\n // If the `Authorization` header is set, then there is nothing to do as it\n // will take precedence.\n //\n if (opts.auth && !options.headers.authorization) {\n options.headers.authorization =\n 'Basic ' + Buffer.from(opts.auth).toString('base64');\n }\n }\n\n let req = (websocket._req = get(opts));\n\n if (opts.timeout) {\n req.on('timeout', () => {\n abortHandshake(websocket, req, 'Opening handshake has timed out');\n });\n }\n\n req.on('error', (err) => {\n if (req === null || req.aborted) return;\n\n req = websocket._req = null;\n emitErrorAndClose(websocket, err);\n });\n\n req.on('response', (res) => {\n const location = res.headers.location;\n const statusCode = res.statusCode;\n\n if (\n location &&\n opts.followRedirects &&\n statusCode >= 300 &&\n statusCode < 400\n ) {\n if (++websocket._redirects > opts.maxRedirects) {\n abortHandshake(websocket, req, 'Maximum redirects exceeded');\n return;\n }\n\n req.abort();\n\n let addr;\n\n try {\n addr = new URL(location, address);\n } catch (err) {\n emitErrorAndClose(websocket, err);\n return;\n }\n\n initAsClient(websocket, addr, protocols, options);\n } else if (!websocket.emit('unexpected-response', req, res)) {\n abortHandshake(\n websocket,\n req,\n `Unexpected server response: ${res.statusCode}`\n );\n }\n });\n\n req.on('upgrade', (res, socket, head) => {\n websocket.emit('upgrade', res);\n\n //\n // The user may have closed the connection from a listener of the `upgrade`\n // event.\n //\n if (websocket.readyState !== WebSocket.CONNECTING) return;\n\n req = websocket._req = null;\n\n if (res.headers.upgrade.toLowerCase() !== 'websocket') {\n abortHandshake(websocket, socket, 'Invalid Upgrade header');\n return;\n }\n\n const digest = createHash('sha1')\n .update(key + GUID)\n .digest('base64');\n\n if (res.headers['sec-websocket-accept'] !== digest) {\n abortHandshake(websocket, socket, 'Invalid Sec-WebSocket-Accept header');\n return;\n }\n\n const serverProt = res.headers['sec-websocket-protocol'];\n const protList = (protocols || '').split(/, */);\n let protError;\n\n if (!protocols && serverProt) {\n protError = 'Server sent a subprotocol but none was requested';\n } else if (protocols && !serverProt) {\n protError = 'Server sent no subprotocol';\n } else if (serverProt && !protList.includes(serverProt)) {\n protError = 'Server sent an invalid subprotocol';\n }\n\n if (protError) {\n abortHandshake(websocket, socket, protError);\n return;\n }\n\n if (serverProt) websocket._protocol = serverProt;\n\n const secWebSocketExtensions = res.headers['sec-websocket-extensions'];\n\n if (secWebSocketExtensions !== undefined) {\n if (!perMessageDeflate) {\n const message =\n 'Server sent a Sec-WebSocket-Extensions header but no extension ' +\n 'was requested';\n abortHandshake(websocket, socket, message);\n return;\n }\n\n let extensions;\n\n try {\n extensions = parse(secWebSocketExtensions);\n } catch (err) {\n const message = 'Invalid Sec-WebSocket-Extensions header';\n abortHandshake(websocket, socket, message);\n return;\n }\n\n const extensionNames = Object.keys(extensions);\n\n if (extensionNames.length) {\n if (\n extensionNames.length !== 1 ||\n extensionNames[0] !== PerMessageDeflate.extensionName\n ) {\n const message =\n 'Server indicated an extension that was not requested';\n abortHandshake(websocket, socket, message);\n return;\n }\n\n try {\n perMessageDeflate.accept(extensions[PerMessageDeflate.extensionName]);\n } catch (err) {\n const message = 'Invalid Sec-WebSocket-Extensions header';\n abortHandshake(websocket, socket, message);\n return;\n }\n\n websocket._extensions[PerMessageDeflate.extensionName] =\n perMessageDeflate;\n }\n }\n\n websocket.setSocket(socket, head, opts.maxPayload);\n });\n}\n\n/**\n * Emit the `'error'` and `'close'` event.\n *\n * @param {WebSocket} websocket The WebSocket instance\n * @param {Error} The error to emit\n * @private\n */\nfunction emitErrorAndClose(websocket, err) {\n websocket._readyState = WebSocket.CLOSING;\n websocket.emit('error', err);\n websocket.emitClose();\n}\n\n/**\n * Create a `net.Socket` and initiate a connection.\n *\n * @param {Object} options Connection options\n * @return {net.Socket} The newly created socket used to start the connection\n * @private\n */\nfunction netConnect(options) {\n options.path = options.socketPath;\n return net.connect(options);\n}\n\n/**\n * Create a `tls.TLSSocket` and initiate a connection.\n *\n * @param {Object} options Connection options\n * @return {tls.TLSSocket} The newly created socket used to start the connection\n * @private\n */\nfunction tlsConnect(options) {\n options.path = undefined;\n\n if (!options.servername && options.servername !== '') {\n options.servername = net.isIP(options.host) ? '' : options.host;\n }\n\n return tls.connect(options);\n}\n\n/**\n * Abort the handshake and emit an error.\n *\n * @param {WebSocket} websocket The WebSocket instance\n * @param {(http.ClientRequest|net.Socket|tls.Socket)} stream The request to\n * abort or the socket to destroy\n * @param {String} message The error message\n * @private\n */\nfunction abortHandshake(websocket, stream, message) {\n websocket._readyState = WebSocket.CLOSING;\n\n const err = new Error(message);\n Error.captureStackTrace(err, abortHandshake);\n\n if (stream.setHeader) {\n stream.abort();\n\n if (stream.socket && !stream.socket.destroyed) {\n //\n // On Node.js >= 14.3.0 `request.abort()` does not destroy the socket if\n // called after the request completed. See\n // https://github.com/websockets/ws/issues/1869.\n //\n stream.socket.destroy();\n }\n\n stream.once('abort', websocket.emitClose.bind(websocket));\n websocket.emit('error', err);\n } else {\n stream.destroy(err);\n stream.once('error', websocket.emit.bind(websocket, 'error'));\n stream.once('close', websocket.emitClose.bind(websocket));\n }\n}\n\n/**\n * Handle cases where the `ping()`, `pong()`, or `send()` methods are called\n * when the `readyState` attribute is `CLOSING` or `CLOSED`.\n *\n * @param {WebSocket} websocket The WebSocket instance\n * @param {*} [data] The data to send\n * @param {Function} [cb] Callback\n * @private\n */\nfunction sendAfterClose(websocket, data, cb) {\n if (data) {\n const length = toBuffer(data).length;\n\n //\n // The `_bufferedAmount` property is used only when the peer is a client and\n // the opening handshake fails. Under these circumstances, in fact, the\n // `setSocket()` method is not called, so the `_socket` and `_sender`\n // properties are set to `null`.\n //\n if (websocket._socket) websocket._sender._bufferedBytes += length;\n else websocket._bufferedAmount += length;\n }\n\n if (cb) {\n const err = new Error(\n `WebSocket is not open: readyState ${websocket.readyState} ` +\n `(${readyStates[websocket.readyState]})`\n );\n cb(err);\n }\n}\n\n/**\n * The listener of the `Receiver` `'conclude'` event.\n *\n * @param {Number} code The status code\n * @param {String} reason The reason for closing\n * @private\n */\nfunction receiverOnConclude(code, reason) {\n const websocket = this[kWebSocket];\n\n websocket._closeFrameReceived = true;\n websocket._closeMessage = reason;\n websocket._closeCode = code;\n\n if (websocket._socket[kWebSocket] === undefined) return;\n\n websocket._socket.removeListener('data', socketOnData);\n process.nextTick(resume, websocket._socket);\n\n if (code === 1005) websocket.close();\n else websocket.close(code, reason);\n}\n\n/**\n * The listener of the `Receiver` `'drain'` event.\n *\n * @private\n */\nfunction receiverOnDrain() {\n this[kWebSocket]._socket.resume();\n}\n\n/**\n * The listener of the `Receiver` `'error'` event.\n *\n * @param {(RangeError|Error)} err The emitted error\n * @private\n */\nfunction receiverOnError(err) {\n const websocket = this[kWebSocket];\n\n if (websocket._socket[kWebSocket] !== undefined) {\n websocket._socket.removeListener('data', socketOnData);\n\n //\n // On Node.js < 14.0.0 the `'error'` event is emitted synchronously. See\n // https://github.com/websockets/ws/issues/1940.\n //\n process.nextTick(resume, websocket._socket);\n\n websocket.close(err[kStatusCode]);\n }\n\n websocket.emit('error', err);\n}\n\n/**\n * The listener of the `Receiver` `'finish'` event.\n *\n * @private\n */\nfunction receiverOnFinish() {\n this[kWebSocket].emitClose();\n}\n\n/**\n * The listener of the `Receiver` `'message'` event.\n *\n * @param {(String|Buffer|ArrayBuffer|Buffer[])} data The message\n * @private\n */\nfunction receiverOnMessage(data) {\n this[kWebSocket].emit('message', data);\n}\n\n/**\n * The listener of the `Receiver` `'ping'` event.\n *\n * @param {Buffer} data The data included in the ping frame\n * @private\n */\nfunction receiverOnPing(data) {\n const websocket = this[kWebSocket];\n\n websocket.pong(data, !websocket._isServer, NOOP);\n websocket.emit('ping', data);\n}\n\n/**\n * The listener of the `Receiver` `'pong'` event.\n *\n * @param {Buffer} data The data included in the pong frame\n * @private\n */\nfunction receiverOnPong(data) {\n this[kWebSocket].emit('pong', data);\n}\n\n/**\n * Resume a readable stream\n *\n * @param {Readable} stream The readable stream\n * @private\n */\nfunction resume(stream) {\n stream.resume();\n}\n\n/**\n * The listener of the `net.Socket` `'close'` event.\n *\n * @private\n */\nfunction socketOnClose() {\n const websocket = this[kWebSocket];\n\n this.removeListener('close', socketOnClose);\n this.removeListener('data', socketOnData);\n this.removeListener('end', socketOnEnd);\n\n websocket._readyState = WebSocket.CLOSING;\n\n let chunk;\n\n //\n // The close frame might not have been received or the `'end'` event emitted,\n // for example, if the socket was destroyed due to an error. Ensure that the\n // `receiver` stream is closed after writing any remaining buffered data to\n // it. If the readable side of the socket is in flowing mode then there is no\n // buffered data as everything has been already written and `readable.read()`\n // will return `null`. If instead, the socket is paused, any possible buffered\n // data will be read as a single chunk.\n //\n if (\n !this._readableState.endEmitted &&\n !websocket._closeFrameReceived &&\n !websocket._receiver._writableState.errorEmitted &&\n (chunk = websocket._socket.read()) !== null\n ) {\n websocket._receiver.write(chunk);\n }\n\n websocket._receiver.end();\n\n this[kWebSocket] = undefined;\n\n clearTimeout(websocket._closeTimer);\n\n if (\n websocket._receiver._writableState.finished ||\n websocket._receiver._writableState.errorEmitted\n ) {\n websocket.emitClose();\n } else {\n websocket._receiver.on('error', receiverOnFinish);\n websocket._receiver.on('finish', receiverOnFinish);\n }\n}\n\n/**\n * The listener of the `net.Socket` `'data'` event.\n *\n * @param {Buffer} chunk A chunk of data\n * @private\n */\nfunction socketOnData(chunk) {\n if (!this[kWebSocket]._receiver.write(chunk)) {\n this.pause();\n }\n}\n\n/**\n * The listener of the `net.Socket` `'end'` event.\n *\n * @private\n */\nfunction socketOnEnd() {\n const websocket = this[kWebSocket];\n\n websocket._readyState = WebSocket.CLOSING;\n websocket._receiver.end();\n this.end();\n}\n\n/**\n * The listener of the `net.Socket` `'error'` event.\n *\n * @private\n */\nfunction socketOnError() {\n const websocket = this[kWebSocket];\n\n this.removeListener('error', socketOnError);\n this.on('error', NOOP);\n\n if (websocket) {\n websocket._readyState = WebSocket.CLOSING;\n this.destroy();\n }\n}\n","'use strict';\n\nconst { Duplex } = require('stream');\n\n/**\n * Emits the `'close'` event on a stream.\n *\n * @param {Duplex} stream The stream.\n * @private\n */\nfunction emitClose(stream) {\n stream.emit('close');\n}\n\n/**\n * The listener of the `'end'` event.\n *\n * @private\n */\nfunction duplexOnEnd() {\n if (!this.destroyed && this._writableState.finished) {\n this.destroy();\n }\n}\n\n/**\n * The listener of the `'error'` event.\n *\n * @param {Error} err The error\n * @private\n */\nfunction duplexOnError(err) {\n this.removeListener('error', duplexOnError);\n this.destroy();\n if (this.listenerCount('error') === 0) {\n // Do not suppress the throwing behavior.\n this.emit('error', err);\n }\n}\n\n/**\n * Wraps a `WebSocket` in a duplex stream.\n *\n * @param {WebSocket} ws The `WebSocket` to wrap\n * @param {Object} [options] The options for the `Duplex` constructor\n * @return {Duplex} The duplex stream\n * @public\n */\nfunction createWebSocketStream(ws, options) {\n let resumeOnReceiverDrain = true;\n let terminateOnDestroy = true;\n\n function receiverOnDrain() {\n if (resumeOnReceiverDrain) ws._socket.resume();\n }\n\n if (ws.readyState === ws.CONNECTING) {\n ws.once('open', function open() {\n ws._receiver.removeAllListeners('drain');\n ws._receiver.on('drain', receiverOnDrain);\n });\n } else {\n ws._receiver.removeAllListeners('drain');\n ws._receiver.on('drain', receiverOnDrain);\n }\n\n const duplex = new Duplex({\n ...options,\n autoDestroy: false,\n emitClose: false,\n objectMode: false,\n writableObjectMode: false\n });\n\n ws.on('message', function message(msg) {\n if (!duplex.push(msg)) {\n resumeOnReceiverDrain = false;\n ws._socket.pause();\n }\n });\n\n ws.once('error', function error(err) {\n if (duplex.destroyed) return;\n\n // Prevent `ws.terminate()` from being called by `duplex._destroy()`.\n //\n // - If the `'error'` event is emitted before the `'open'` event, then\n // `ws.terminate()` is a noop as no socket is assigned.\n // - Otherwise, the error is re-emitted by the listener of the `'error'`\n // event of the `Receiver` object. The listener already closes the\n // connection by calling `ws.close()`. This allows a close frame to be\n // sent to the other peer. If `ws.terminate()` is called right after this,\n // then the close frame might not be sent.\n terminateOnDestroy = false;\n duplex.destroy(err);\n });\n\n ws.once('close', function close() {\n if (duplex.destroyed) return;\n\n duplex.push(null);\n });\n\n duplex._destroy = function (err, callback) {\n if (ws.readyState === ws.CLOSED) {\n callback(err);\n process.nextTick(emitClose, duplex);\n return;\n }\n\n let called = false;\n\n ws.once('error', function error(err) {\n called = true;\n callback(err);\n });\n\n ws.once('close', function close() {\n if (!called) callback(err);\n process.nextTick(emitClose, duplex);\n });\n\n if (terminateOnDestroy) ws.terminate();\n };\n\n duplex._final = function (callback) {\n if (ws.readyState === ws.CONNECTING) {\n ws.once('open', function open() {\n duplex._final(callback);\n });\n return;\n }\n\n // If the value of the `_socket` property is `null` it means that `ws` is a\n // client websocket and the handshake failed. In fact, when this happens, a\n // socket is never assigned to the websocket. Wait for the `'error'` event\n // that will be emitted by the websocket.\n if (ws._socket === null) return;\n\n if (ws._socket._writableState.finished) {\n callback();\n if (duplex._readableState.endEmitted) duplex.destroy();\n } else {\n ws._socket.once('finish', function finish() {\n // `duplex` is not destroyed here because the `'end'` event will be\n // emitted on `duplex` after this `'finish'` event. The EOF signaling\n // `null` chunk is, in fact, pushed when the websocket emits `'close'`.\n callback();\n });\n ws.close();\n }\n };\n\n duplex._read = function () {\n if (\n (ws.readyState === ws.OPEN || ws.readyState === ws.CLOSING) &&\n !resumeOnReceiverDrain\n ) {\n resumeOnReceiverDrain = true;\n if (!ws._receiver._writableState.needDrain) ws._socket.resume();\n }\n };\n\n duplex._write = function (chunk, encoding, callback) {\n if (ws.readyState === ws.CONNECTING) {\n ws.once('open', function open() {\n duplex._write(chunk, encoding, callback);\n });\n return;\n }\n\n ws.send(chunk, callback);\n };\n\n duplex.on('end', duplexOnEnd);\n duplex.on('error', duplexOnError);\n return duplex;\n}\n\nmodule.exports = createWebSocketStream;\n","/* eslint no-unused-vars: [\"error\", { \"varsIgnorePattern\": \"^net|tls|https$\" }] */\n\n'use strict';\n\nconst EventEmitter = require('events');\nconst http = require('http');\nconst https = require('https');\nconst net = require('net');\nconst tls = require('tls');\nconst { createHash } = require('crypto');\n\nconst PerMessageDeflate = require('./permessage-deflate');\nconst WebSocket = require('./websocket');\nconst { format, parse } = require('./extension');\nconst { GUID, kWebSocket } = require('./constants');\n\nconst keyRegex = /^[+/0-9A-Za-z]{22}==$/;\n\nconst RUNNING = 0;\nconst CLOSING = 1;\nconst CLOSED = 2;\n\n/**\n * Class representing a WebSocket server.\n *\n * @extends EventEmitter\n */\nclass WebSocketServer extends EventEmitter {\n /**\n * Create a `WebSocketServer` instance.\n *\n * @param {Object} options Configuration options\n * @param {Number} [options.backlog=511] The maximum length of the queue of\n * pending connections\n * @param {Boolean} [options.clientTracking=true] Specifies whether or not to\n * track clients\n * @param {Function} [options.handleProtocols] A hook to handle protocols\n * @param {String} [options.host] The hostname where to bind the server\n * @param {Number} [options.maxPayload=104857600] The maximum allowed message\n * size\n * @param {Boolean} [options.noServer=false] Enable no server mode\n * @param {String} [options.path] Accept only connections matching this path\n * @param {(Boolean|Object)} [options.perMessageDeflate=false] Enable/disable\n * permessage-deflate\n * @param {Number} [options.port] The port where to bind the server\n * @param {(http.Server|https.Server)} [options.server] A pre-created HTTP/S\n * server to use\n * @param {Function} [options.verifyClient] A hook to reject connections\n * @param {Function} [callback] A listener for the `listening` event\n */\n constructor(options, callback) {\n super();\n\n options = {\n maxPayload: 100 * 1024 * 1024,\n perMessageDeflate: false,\n handleProtocols: null,\n clientTracking: true,\n verifyClient: null,\n noServer: false,\n backlog: null, // use default (511 as implemented in net.js)\n server: null,\n host: null,\n path: null,\n port: null,\n ...options\n };\n\n if (\n (options.port == null && !options.server && !options.noServer) ||\n (options.port != null && (options.server || options.noServer)) ||\n (options.server && options.noServer)\n ) {\n throw new TypeError(\n 'One and only one of the \"port\", \"server\", or \"noServer\" options ' +\n 'must be specified'\n );\n }\n\n if (options.port != null) {\n this._server = http.createServer((req, res) => {\n const body = http.STATUS_CODES[426];\n\n res.writeHead(426, {\n 'Content-Length': body.length,\n 'Content-Type': 'text/plain'\n });\n res.end(body);\n });\n this._server.listen(\n options.port,\n options.host,\n options.backlog,\n callback\n );\n } else if (options.server) {\n this._server = options.server;\n }\n\n if (this._server) {\n const emitConnection = this.emit.bind(this, 'connection');\n\n this._removeListeners = addListeners(this._server, {\n listening: this.emit.bind(this, 'listening'),\n error: this.emit.bind(this, 'error'),\n upgrade: (req, socket, head) => {\n this.handleUpgrade(req, socket, head, emitConnection);\n }\n });\n }\n\n if (options.perMessageDeflate === true) options.perMessageDeflate = {};\n if (options.clientTracking) this.clients = new Set();\n this.options = options;\n this._state = RUNNING;\n }\n\n /**\n * Returns the bound address, the address family name, and port of the server\n * as reported by the operating system if listening on an IP socket.\n * If the server is listening on a pipe or UNIX domain socket, the name is\n * returned as a string.\n *\n * @return {(Object|String|null)} The address of the server\n * @public\n */\n address() {\n if (this.options.noServer) {\n throw new Error('The server is operating in \"noServer\" mode');\n }\n\n if (!this._server) return null;\n return this._server.address();\n }\n\n /**\n * Close the server.\n *\n * @param {Function} [cb] Callback\n * @public\n */\n close(cb) {\n if (cb) this.once('close', cb);\n\n if (this._state === CLOSED) {\n process.nextTick(emitClose, this);\n return;\n }\n\n if (this._state === CLOSING) return;\n this._state = CLOSING;\n\n //\n // Terminate all associated clients.\n //\n if (this.clients) {\n for (const client of this.clients) client.terminate();\n }\n\n const server = this._server;\n\n if (server) {\n this._removeListeners();\n this._removeListeners = this._server = null;\n\n //\n // Close the http server if it was internally created.\n //\n if (this.options.port != null) {\n server.close(emitClose.bind(undefined, this));\n return;\n }\n }\n\n process.nextTick(emitClose, this);\n }\n\n /**\n * See if a given request should be handled by this server instance.\n *\n * @param {http.IncomingMessage} req Request object to inspect\n * @return {Boolean} `true` if the request is valid, else `false`\n * @public\n */\n shouldHandle(req) {\n if (this.options.path) {\n const index = req.url.indexOf('?');\n const pathname = index !== -1 ? req.url.slice(0, index) : req.url;\n\n if (pathname !== this.options.path) return false;\n }\n\n return true;\n }\n\n /**\n * Handle a HTTP Upgrade request.\n *\n * @param {http.IncomingMessage} req The request object\n * @param {(net.Socket|tls.Socket)} socket The network socket between the\n * server and client\n * @param {Buffer} head The first packet of the upgraded stream\n * @param {Function} cb Callback\n * @public\n */\n handleUpgrade(req, socket, head, cb) {\n socket.on('error', socketOnError);\n\n const key =\n req.headers['sec-websocket-key'] !== undefined\n ? req.headers['sec-websocket-key'].trim()\n : false;\n const version = +req.headers['sec-websocket-version'];\n const extensions = {};\n\n if (\n req.method !== 'GET' ||\n req.headers.upgrade.toLowerCase() !== 'websocket' ||\n !key ||\n !keyRegex.test(key) ||\n (version !== 8 && version !== 13) ||\n !this.shouldHandle(req)\n ) {\n return abortHandshake(socket, 400);\n }\n\n if (this.options.perMessageDeflate) {\n const perMessageDeflate = new PerMessageDeflate(\n this.options.perMessageDeflate,\n true,\n this.options.maxPayload\n );\n\n try {\n const offers = parse(req.headers['sec-websocket-extensions']);\n\n if (offers[PerMessageDeflate.extensionName]) {\n perMessageDeflate.accept(offers[PerMessageDeflate.extensionName]);\n extensions[PerMessageDeflate.extensionName] = perMessageDeflate;\n }\n } catch (err) {\n return abortHandshake(socket, 400);\n }\n }\n\n //\n // Optionally call external client verification handler.\n //\n if (this.options.verifyClient) {\n const info = {\n origin:\n req.headers[`${version === 8 ? 'sec-websocket-origin' : 'origin'}`],\n secure: !!(req.socket.authorized || req.socket.encrypted),\n req\n };\n\n if (this.options.verifyClient.length === 2) {\n this.options.verifyClient(info, (verified, code, message, headers) => {\n if (!verified) {\n return abortHandshake(socket, code || 401, message, headers);\n }\n\n this.completeUpgrade(key, extensions, req, socket, head, cb);\n });\n return;\n }\n\n if (!this.options.verifyClient(info)) return abortHandshake(socket, 401);\n }\n\n this.completeUpgrade(key, extensions, req, socket, head, cb);\n }\n\n /**\n * Upgrade the connection to WebSocket.\n *\n * @param {String} key The value of the `Sec-WebSocket-Key` header\n * @param {Object} extensions The accepted extensions\n * @param {http.IncomingMessage} req The request object\n * @param {(net.Socket|tls.Socket)} socket The network socket between the\n * server and client\n * @param {Buffer} head The first packet of the upgraded stream\n * @param {Function} cb Callback\n * @throws {Error} If called more than once with the same socket\n * @private\n */\n completeUpgrade(key, extensions, req, socket, head, cb) {\n //\n // Destroy the socket if the client has already sent a FIN packet.\n //\n if (!socket.readable || !socket.writable) return socket.destroy();\n\n if (socket[kWebSocket]) {\n throw new Error(\n 'server.handleUpgrade() was called more than once with the same ' +\n 'socket, possibly due to a misconfiguration'\n );\n }\n\n if (this._state > RUNNING) return abortHandshake(socket, 503);\n\n const digest = createHash('sha1')\n .update(key + GUID)\n .digest('base64');\n\n const headers = [\n 'HTTP/1.1 101 Switching Protocols',\n 'Upgrade: websocket',\n 'Connection: Upgrade',\n `Sec-WebSocket-Accept: ${digest}`\n ];\n\n const ws = new WebSocket(null);\n let protocol = req.headers['sec-websocket-protocol'];\n\n if (protocol) {\n protocol = protocol.split(',').map(trim);\n\n //\n // Optionally call external protocol selection handler.\n //\n if (this.options.handleProtocols) {\n protocol = this.options.handleProtocols(protocol, req);\n } else {\n protocol = protocol[0];\n }\n\n if (protocol) {\n headers.push(`Sec-WebSocket-Protocol: ${protocol}`);\n ws._protocol = protocol;\n }\n }\n\n if (extensions[PerMessageDeflate.extensionName]) {\n const params = extensions[PerMessageDeflate.extensionName].params;\n const value = format({\n [PerMessageDeflate.extensionName]: [params]\n });\n headers.push(`Sec-WebSocket-Extensions: ${value}`);\n ws._extensions = extensions;\n }\n\n //\n // Allow external modification/inspection of handshake headers.\n //\n this.emit('headers', headers, req);\n\n socket.write(headers.concat('\\r\\n').join('\\r\\n'));\n socket.removeListener('error', socketOnError);\n\n ws.setSocket(socket, head, this.options.maxPayload);\n\n if (this.clients) {\n this.clients.add(ws);\n ws.on('close', () => this.clients.delete(ws));\n }\n\n cb(ws, req);\n }\n}\n\nmodule.exports = WebSocketServer;\n\n/**\n * Add event listeners on an `EventEmitter` using a map of \n * pairs.\n *\n * @param {EventEmitter} server The event emitter\n * @param {Object.} map The listeners to add\n * @return {Function} A function that will remove the added listeners when\n * called\n * @private\n */\nfunction addListeners(server, map) {\n for (const event of Object.keys(map)) server.on(event, map[event]);\n\n return function removeListeners() {\n for (const event of Object.keys(map)) {\n server.removeListener(event, map[event]);\n }\n };\n}\n\n/**\n * Emit a `'close'` event on an `EventEmitter`.\n *\n * @param {EventEmitter} server The event emitter\n * @private\n */\nfunction emitClose(server) {\n server._state = CLOSED;\n server.emit('close');\n}\n\n/**\n * Handle premature socket errors.\n *\n * @private\n */\nfunction socketOnError() {\n this.destroy();\n}\n\n/**\n * Close the connection when preconditions are not fulfilled.\n *\n * @param {(net.Socket|tls.Socket)} socket The socket of the upgrade request\n * @param {Number} code The HTTP response status code\n * @param {String} [message] The HTTP response body\n * @param {Object} [headers] Additional HTTP response headers\n * @private\n */\nfunction abortHandshake(socket, code, message, headers) {\n if (socket.writable) {\n message = message || http.STATUS_CODES[code];\n headers = {\n Connection: 'close',\n 'Content-Type': 'text/html',\n 'Content-Length': Buffer.byteLength(message),\n ...headers\n };\n\n socket.write(\n `HTTP/1.1 ${code} ${http.STATUS_CODES[code]}\\r\\n` +\n Object.keys(headers)\n .map((h) => `${h}: ${headers[h]}`)\n .join('\\r\\n') +\n '\\r\\n\\r\\n' +\n message\n );\n }\n\n socket.removeListener('error', socketOnError);\n socket.destroy();\n}\n\n/**\n * Remove whitespace characters from both ends of a string.\n *\n * @param {String} str The string\n * @return {String} A new string representing `str` stripped of whitespace\n * characters from both its beginning and end\n * @private\n */\nfunction trim(str) {\n return str.trim();\n}\n","'use strict';\n\nconst WebSocket = require('./lib/websocket');\n\nWebSocket.createWebSocketStream = require('./lib/stream');\nWebSocket.Server = require('./lib/websocket-server');\nWebSocket.Receiver = require('./lib/receiver');\nWebSocket.Sender = require('./lib/sender');\n\nmodule.exports = WebSocket;\n","var Gun = require('../gun');\n\n/*\n\tAn Ad-Hoc Mesh-Network Daisy-Chain\n\tshould work even if humans are\n\tcommunicating with each other blind.\n\n\tTo prevent infinite broadcast loops,\n\twe use a deduplication process\n\tbased on the message's identifier.\n\tThis is currently implemented in core.\n\n\tHowever, because this still creates a\n\tN*2 (where N is the number of connections)\n\tflood, it is not scalable for traditional\n\tservices that have a hub network topology.\n\n\tDoes this mean we have to abandon mesh\n\talgorithms? No, we can simply layer more\n\tefficient optimizations in based on constraints.\n\tIf these constraints exist, it automatically\n\tupgrades, but if not, it falls back to the\n\tbrute-force mesh based robust algorithm.\n\tA simple example is to limit peer connections\n\tand rely upon daisy chaining to relay messages.\n\n\tAnother example, is if peers are willing to\n\tidentify themselves, then we can improve the\n\tefficiency of the network by having each peer\n\tinclude the names of peers it is connected in\n\teach message. Then each subsequent peer will\n\tnot relay it to them, since it is unnecessary.\n\tThis should create N (where N is the number of\n\tpeers) messages (or possibly N+ if there is a\n\tcommon peer of uncommon peers that receives it\n\tand relays at exact latency timings), which is\n\toptimal.\n\n\tSince computer networks aren't actually blind,\n\twe will implement the above method to improve\n\tthe performance of the ad-hoc mesh network.\n\n\tBut why not have every message contain the\n\twhole history of peers that it relayed through?\n\tBecause in sufficiently large enough networks,\n\twith extensive daisy chaining, this will cause\n\tthe message to become prohibitively slow and\n\tincrease indefinitely in size.\n\n*/\n\nGun.on('opt', function(root){\n\tvar opt = root.opt;\n\tif(false === opt.ws || opt.once){\n\t\tthis.to.next(root);\n\t\treturn;\n\t}\t\n\n\tvar url = require('url');\n\topt.mesh = opt.mesh || Gun.Mesh(root);\n\topt.WebSocket = opt.WebSocket || require('ws');\n\tvar ws = opt.ws = opt.ws || {};\n\tws.path = ws.path || '/gun';\n\t// if we DO need an HTTP server, then choose ws specific one or GUN default one.\n\tif(!ws.noServer){\n\t\tws.server = ws.server || opt.web;\n\t\tif(!ws.server){ this.to.next(root); return } // ugh, bug fix for @jamierez & unstoppable ryan.\n\t}\n\tws.web = ws.web || new opt.WebSocket.Server(ws); // we still need a WS server.\n\tws.web.on('connection', function(wire, req){ var peer;\n\t\twire.headers = wire.headers || (req||'').headers || '';\n\t\tconsole.STAT && ((console.STAT.sites || (console.STAT.sites = {}))[wire.headers.origin] = 1);\n\t\topt.mesh.hi(peer = {wire: wire});\n\t\twire.on('message', function(msg){\n\t\t\topt.mesh.hear(msg.data || msg, peer);\n\t\t});\n\t\twire.on('close', function(){\n\t\t\topt.mesh.bye(peer);\n\t\t});\n\t\twire.on('error', function(e){});\n\t\tsetTimeout(function heart(){ if(!opt.peers[peer.id]){ return } try{ wire.send(\"[]\") }catch(e){} ;setTimeout(heart, 1000 * 20) }, 1000 * 20); // Some systems, like Heroku, require heartbeats to not time out. // TODO: Make this configurable? // TODO: PERF: Find better approach than try/timeouts?\n\t});\n\tthis.to.next(root);\n});",";(function(){\n\n var window = this || self || window;\n\n /* UNBUILD */\n function USE(arg, req){\n return req? require(arg) : arg.slice? USE[R(arg)] : function(mod, path){\n arg(mod = {exports: {}});\n USE[R(path)] = mod.exports;\n }\n function R(p){\n return p.split('/').slice(-1).toString().replace('.js','');\n }\n }\n if(typeof module !== \"undefined\"){ var MODULE = module }\n /* UNBUILD */\n\n ;USE(function(module){\n // Security, Encryption, and Authorization: SEA.js\n // MANDATORY READING: https://gun.eco/explainers/data/security.html\n // IT IS IMPLEMENTED IN A POLYFILL/SHIM APPROACH.\n // THIS IS AN EARLY ALPHA!\n\n if(typeof window !== \"undefined\"){ module.window = window }\n\n var tmp = module.window || module, u;\n var SEA = tmp.SEA || {};\n\n if(SEA.window = module.window){ SEA.window.SEA = SEA }\n\n try{ if(u+'' !== typeof MODULE){ MODULE.exports = SEA } }catch(e){}\n module.exports = SEA;\n })(USE, './root');\n\n ;USE(function(module){\n var SEA = USE('./root');\n try{ if(SEA.window){\n if(location.protocol.indexOf('s') < 0\n && location.host.indexOf('localhost') < 0\n && ! /^127\\.\\d+\\.\\d+\\.\\d+$/.test(location.hostname)\n && location.protocol.indexOf('file:') < 0){\n console.warn('HTTPS needed for WebCrypto in SEA, redirecting...');\n location.protocol = 'https:'; // WebCrypto does NOT work without HTTPS!\n }\n } }catch(e){}\n })(USE, './https');\n\n ;USE(function(module){\n var u;\n if(u+''== typeof btoa){\n if(u+'' == typeof Buffer){\n try{ global.Buffer = USE(\"buffer\", 1).Buffer }catch(e){ console.log(\"Please `npm install buffer` or add it to your package.json !\") }\n }\n global.btoa = function(data){ return Buffer.from(data, \"binary\").toString(\"base64\") };\n global.atob = function(data){ return Buffer.from(data, \"base64\").toString(\"binary\") };\n }\n })(USE, './base64');\n\n ;USE(function(module){\n USE('./base64');\n // This is Array extended to have .toString(['utf8'|'hex'|'base64'])\n function SeaArray() {}\n Object.assign(SeaArray, { from: Array.from })\n SeaArray.prototype = Object.create(Array.prototype)\n SeaArray.prototype.toString = function(enc, start, end) { enc = enc || 'utf8'; start = start || 0;\n const length = this.length\n if (enc === 'hex') {\n const buf = new Uint8Array(this)\n return [ ...Array(((end && (end + 1)) || length) - start).keys()]\n .map((i) => buf[ i + start ].toString(16).padStart(2, '0')).join('')\n }\n if (enc === 'utf8') {\n return Array.from(\n { length: (end || length) - start },\n (_, i) => String.fromCharCode(this[ i + start])\n ).join('')\n }\n if (enc === 'base64') {\n return btoa(this)\n }\n }\n module.exports = SeaArray;\n })(USE, './array');\n\n ;USE(function(module){\n USE('./base64');\n // This is Buffer implementation used in SEA. Functionality is mostly\n // compatible with NodeJS 'safe-buffer' and is used for encoding conversions\n // between binary and 'hex' | 'utf8' | 'base64'\n // See documentation and validation for safe implementation in:\n // https://github.com/feross/safe-buffer#update\n var SeaArray = USE('./array');\n function SafeBuffer(...props) {\n console.warn('new SafeBuffer() is depreciated, please use SafeBuffer.from()')\n return SafeBuffer.from(...props)\n }\n SafeBuffer.prototype = Object.create(Array.prototype)\n Object.assign(SafeBuffer, {\n // (data, enc) where typeof data === 'string' then enc === 'utf8'|'hex'|'base64'\n from() {\n if (!Object.keys(arguments).length || arguments[0]==null) {\n throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.')\n }\n const input = arguments[0]\n let buf\n if (typeof input === 'string') {\n const enc = arguments[1] || 'utf8'\n if (enc === 'hex') {\n const bytes = input.match(/([\\da-fA-F]{2})/g)\n .map((byte) => parseInt(byte, 16))\n if (!bytes || !bytes.length) {\n throw new TypeError('Invalid first argument for type \\'hex\\'.')\n }\n buf = SeaArray.from(bytes)\n } else if (enc === 'utf8' || 'binary' === enc) { // EDIT BY MARK: I think this is safe, tested it against a couple \"binary\" strings. This lets SafeBuffer match NodeJS Buffer behavior more where it safely btoas regular strings.\n const length = input.length\n const words = new Uint16Array(length)\n Array.from({ length: length }, (_, i) => words[i] = input.charCodeAt(i))\n buf = SeaArray.from(words)\n } else if (enc === 'base64') {\n const dec = atob(input)\n const length = dec.length\n const bytes = new Uint8Array(length)\n Array.from({ length: length }, (_, i) => bytes[i] = dec.charCodeAt(i))\n buf = SeaArray.from(bytes)\n } else if (enc === 'binary') { // deprecated by above comment\n buf = SeaArray.from(input) // some btoas were mishandled.\n } else {\n console.info('SafeBuffer.from unknown encoding: '+enc)\n }\n return buf\n }\n const byteLength = input.byteLength // what is going on here? FOR MARTTI\n const length = input.byteLength ? input.byteLength : input.length\n if (length) {\n let buf\n if (input instanceof ArrayBuffer) {\n buf = new Uint8Array(input)\n }\n return SeaArray.from(buf || input)\n }\n },\n // This is 'safe-buffer.alloc' sans encoding support\n alloc(length, fill = 0 /*, enc*/ ) {\n return SeaArray.from(new Uint8Array(Array.from({ length: length }, () => fill)))\n },\n // This is normal UNSAFE 'buffer.alloc' or 'new Buffer(length)' - don't use!\n allocUnsafe(length) {\n return SeaArray.from(new Uint8Array(Array.from({ length : length })))\n },\n // This puts together array of array like members\n concat(arr) { // octet array\n if (!Array.isArray(arr)) {\n throw new TypeError('First argument must be Array containing ArrayBuffer or Uint8Array instances.')\n }\n return SeaArray.from(arr.reduce((ret, item) => ret.concat(Array.from(item)), []))\n }\n })\n SafeBuffer.prototype.from = SafeBuffer.from\n SafeBuffer.prototype.toString = SeaArray.prototype.toString\n\n module.exports = SafeBuffer;\n })(USE, './buffer');\n\n ;USE(function(module){\n const SEA = USE('./root')\n const api = {Buffer: USE('./buffer')}\n var o = {}, u;\n\n // ideally we can move away from JSON entirely? unlikely due to compatibility issues... oh well.\n JSON.parseAsync = JSON.parseAsync || function(t,cb,r){ var u; try{ cb(u, JSON.parse(t,r)) }catch(e){ cb(e) } }\n JSON.stringifyAsync = JSON.stringifyAsync || function(v,cb,r,s){ var u; try{ cb(u, JSON.stringify(v,r,s)) }catch(e){ cb(e) } }\n\n api.parse = function(t,r){ return new Promise(function(res, rej){\n JSON.parseAsync(t,function(err, raw){ err? rej(err) : res(raw) },r);\n })}\n api.stringify = function(v,r,s){ return new Promise(function(res, rej){\n JSON.stringifyAsync(v,function(err, raw){ err? rej(err) : res(raw) },r,s);\n })}\n\n if(SEA.window){\n api.crypto = window.crypto || window.msCrypto\n api.subtle = (api.crypto||o).subtle || (api.crypto||o).webkitSubtle;\n api.TextEncoder = window.TextEncoder;\n api.TextDecoder = window.TextDecoder;\n api.random = (len) => api.Buffer.from(api.crypto.getRandomValues(new Uint8Array(api.Buffer.alloc(len))));\n }\n if(!api.TextDecoder)\n {\n const { TextEncoder, TextDecoder } = USE((u+'' == typeof MODULE?'.':'')+'./lib/text-encoding', 1);\n api.TextDecoder = TextDecoder;\n api.TextEncoder = TextEncoder;\n }\n if(!api.crypto)\n {\n try\n {\n var crypto = USE('crypto', 1);\n Object.assign(api, {\n crypto,\n random: (len) => api.Buffer.from(crypto.randomBytes(len))\n }); \n const { Crypto: WebCrypto } = USE('@peculiar/webcrypto', 1);\n api.ossl = api.subtle = new WebCrypto({directory: 'ossl'}).subtle // ECDH\n }\n catch(e){\n console.log(\"Please `npm install @peculiar/webcrypto` or add it to your package.json !\");\n }}\n\n module.exports = api\n })(USE, './shim');\n\n ;USE(function(module){\n var SEA = USE('./root');\n var shim = USE('./shim');\n var s = {};\n s.pbkdf2 = {hash: {name : 'SHA-256'}, iter: 100000, ks: 64};\n s.ecdsa = {\n pair: {name: 'ECDSA', namedCurve: 'P-256'},\n sign: {name: 'ECDSA', hash: {name: 'SHA-256'}}\n };\n s.ecdh = {name: 'ECDH', namedCurve: 'P-256'};\n\n // This creates Web Cryptography API compliant JWK for sign/verify purposes\n s.jwk = function(pub, d){ // d === priv\n pub = pub.split('.');\n var x = pub[0], y = pub[1];\n var jwk = {kty: \"EC\", crv: \"P-256\", x: x, y: y, ext: true};\n jwk.key_ops = d ? ['sign'] : ['verify'];\n if(d){ jwk.d = d }\n return jwk;\n };\n \n s.keyToJwk = function(keyBytes) {\n const keyB64 = keyBytes.toString('base64');\n const k = keyB64.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/\\=/g, '');\n return { kty: 'oct', k: k, ext: false, alg: 'A256GCM' };\n }\n\n s.recall = {\n validity: 12 * 60 * 60, // internally in seconds : 12 hours\n hook: function(props){ return props } // { iat, exp, alias, remember } // or return new Promise((resolve, reject) => resolve(props)\n };\n\n s.check = function(t){ return (typeof t == 'string') && ('SEA{' === t.slice(0,4)) }\n s.parse = async function p(t){ try {\n var yes = (typeof t == 'string');\n if(yes && 'SEA{' === t.slice(0,4)){ t = t.slice(3) }\n return yes ? await shim.parse(t) : t;\n } catch (e) {}\n return t;\n }\n\n SEA.opt = s;\n module.exports = s\n })(USE, './settings');\n\n ;USE(function(module){\n var shim = USE('./shim');\n module.exports = async function(d, o){\n var t = (typeof d == 'string')? d : await shim.stringify(d);\n var hash = await shim.subtle.digest({name: o||'SHA-256'}, new shim.TextEncoder().encode(t));\n return shim.Buffer.from(hash);\n }\n })(USE, './sha256');\n\n ;USE(function(module){\n // This internal func returns SHA-1 hashed data for KeyID generation\n const __shim = USE('./shim')\n const subtle = __shim.subtle\n const ossl = __shim.ossl ? __shim.ossl : subtle\n const sha1hash = (b) => ossl.digest({name: 'SHA-1'}, new ArrayBuffer(b))\n module.exports = sha1hash\n })(USE, './sha1');\n\n ;USE(function(module){\n var SEA = USE('./root');\n var shim = USE('./shim');\n var S = USE('./settings');\n var sha = USE('./sha256');\n var u;\n\n SEA.work = SEA.work || (async (data, pair, cb, opt) => { try { // used to be named `proof`\n var salt = (pair||{}).epub || pair; // epub not recommended, salt should be random!\n opt = opt || {};\n if(salt instanceof Function){\n cb = salt;\n salt = u;\n }\n data = (typeof data == 'string')? data : await shim.stringify(data);\n if('sha' === (opt.name||'').toLowerCase().slice(0,3)){\n var rsha = shim.Buffer.from(await sha(data, opt.name), 'binary').toString(opt.encode || 'base64')\n if(cb){ try{ cb(rsha) }catch(e){console.log(e)} }\n return rsha;\n }\n salt = salt || shim.random(9);\n var key = await (shim.ossl || shim.subtle).importKey('raw', new shim.TextEncoder().encode(data), {name: opt.name || 'PBKDF2'}, false, ['deriveBits']);\n var work = await (shim.ossl || shim.subtle).deriveBits({\n name: opt.name || 'PBKDF2',\n iterations: opt.iterations || S.pbkdf2.iter,\n salt: new shim.TextEncoder().encode(opt.salt || salt),\n hash: opt.hash || S.pbkdf2.hash,\n }, key, opt.length || (S.pbkdf2.ks * 8))\n data = shim.random(data.length) // Erase data in case of passphrase\n var r = shim.Buffer.from(work, 'binary').toString(opt.encode || 'base64')\n if(cb){ try{ cb(r) }catch(e){console.log(e)} }\n return r;\n } catch(e) { \n console.log(e);\n SEA.err = e;\n if(SEA.throw){ throw e }\n if(cb){ cb() }\n return;\n }});\n\n module.exports = SEA.work;\n })(USE, './work');\n\n ;USE(function(module){\n var SEA = USE('./root');\n var shim = USE('./shim');\n var S = USE('./settings');\n\n SEA.name = SEA.name || (async (cb, opt) => { try {\n if(cb){ try{ cb() }catch(e){console.log(e)} }\n return;\n } catch(e) {\n console.log(e);\n SEA.err = e;\n if(SEA.throw){ throw e }\n if(cb){ cb() }\n return;\n }});\n\n //SEA.pair = async (data, proof, cb) => { try {\n SEA.pair = SEA.pair || (async (cb, opt) => { try {\n\n var ecdhSubtle = shim.ossl || shim.subtle;\n // First: ECDSA keys for signing/verifying...\n var sa = await shim.subtle.generateKey({name: 'ECDSA', namedCurve: 'P-256'}, true, [ 'sign', 'verify' ])\n .then(async (keys) => {\n // privateKey scope doesn't leak out from here!\n //const { d: priv } = await shim.subtle.exportKey('jwk', keys.privateKey)\n var key = {};\n key.priv = (await shim.subtle.exportKey('jwk', keys.privateKey)).d;\n var pub = await shim.subtle.exportKey('jwk', keys.publicKey);\n //const pub = Buff.from([ x, y ].join(':')).toString('base64') // old\n key.pub = pub.x+'.'+pub.y; // new\n // x and y are already base64\n // pub is UTF8 but filename/URL safe (https://www.ietf.org/rfc/rfc3986.txt)\n // but split on a non-base64 letter.\n return key;\n })\n \n // To include PGPv4 kind of keyId:\n // const pubId = await SEA.keyid(keys.pub)\n // Next: ECDH keys for encryption/decryption...\n\n try{\n var dh = await ecdhSubtle.generateKey({name: 'ECDH', namedCurve: 'P-256'}, true, ['deriveKey'])\n .then(async (keys) => {\n // privateKey scope doesn't leak out from here!\n var key = {};\n key.epriv = (await ecdhSubtle.exportKey('jwk', keys.privateKey)).d;\n var pub = await ecdhSubtle.exportKey('jwk', keys.publicKey);\n //const epub = Buff.from([ ex, ey ].join(':')).toString('base64') // old\n key.epub = pub.x+'.'+pub.y; // new\n // ex and ey are already base64\n // epub is UTF8 but filename/URL safe (https://www.ietf.org/rfc/rfc3986.txt)\n // but split on a non-base64 letter.\n return key;\n })\n }catch(e){\n if(SEA.window){ throw e }\n if(e == 'Error: ECDH is not a supported algorithm'){ console.log('Ignoring ECDH...') }\n else { throw e }\n } dh = dh || {};\n\n var r = { pub: sa.pub, priv: sa.priv, /* pubId, */ epub: dh.epub, epriv: dh.epriv }\n if(cb){ try{ cb(r) }catch(e){console.log(e)} }\n return r;\n } catch(e) {\n console.log(e);\n SEA.err = e;\n if(SEA.throw){ throw e }\n if(cb){ cb() }\n return;\n }});\n\n module.exports = SEA.pair;\n })(USE, './pair');\n\n ;USE(function(module){\n var SEA = USE('./root');\n var shim = USE('./shim');\n var S = USE('./settings');\n var sha = USE('./sha256');\n var u;\n\n SEA.sign = SEA.sign || (async (data, pair, cb, opt) => { try {\n opt = opt || {};\n if(!(pair||opt).priv){\n if(!SEA.I){ throw 'No signing key.' }\n pair = await SEA.I(null, {what: data, how: 'sign', why: opt.why});\n }\n if(u === data){ throw '`undefined` not allowed.' }\n var json = await S.parse(data);\n var check = opt.check = opt.check || json;\n if(SEA.verify && (SEA.opt.check(check) || (check && check.s && check.m))\n && u !== await SEA.verify(check, pair)){ // don't sign if we already signed it.\n var r = await S.parse(check);\n if(!opt.raw){ r = 'SEA' + await shim.stringify(r) }\n if(cb){ try{ cb(r) }catch(e){console.log(e)} }\n return r;\n }\n var pub = pair.pub;\n var priv = pair.priv;\n var jwk = S.jwk(pub, priv);\n var hash = await sha(json);\n var sig = await (shim.ossl || shim.subtle).importKey('jwk', jwk, {name: 'ECDSA', namedCurve: 'P-256'}, false, ['sign'])\n .then((key) => (shim.ossl || shim.subtle).sign({name: 'ECDSA', hash: {name: 'SHA-256'}}, key, new Uint8Array(hash))) // privateKey scope doesn't leak out from here!\n var r = {m: json, s: shim.Buffer.from(sig, 'binary').toString(opt.encode || 'base64')}\n if(!opt.raw){ r = 'SEA' + await shim.stringify(r) }\n\n if(cb){ try{ cb(r) }catch(e){console.log(e)} }\n return r;\n } catch(e) {\n console.log(e);\n SEA.err = e;\n if(SEA.throw){ throw e }\n if(cb){ cb() }\n return;\n }});\n\n module.exports = SEA.sign;\n })(USE, './sign');\n\n ;USE(function(module){\n var SEA = USE('./root');\n var shim = USE('./shim');\n var S = USE('./settings');\n var sha = USE('./sha256');\n var u;\n\n SEA.verify = SEA.verify || (async (data, pair, cb, opt) => { try {\n var json = await S.parse(data);\n if(false === pair){ // don't verify!\n var raw = await S.parse(json.m);\n if(cb){ try{ cb(raw) }catch(e){console.log(e)} }\n return raw;\n }\n opt = opt || {};\n // SEA.I // verify is free! Requires no user permission.\n var pub = pair.pub || pair;\n var key = SEA.opt.slow_leak? await SEA.opt.slow_leak(pub) : await (shim.ossl || shim.subtle).importKey('jwk', S.jwk(pub), {name: 'ECDSA', namedCurve: 'P-256'}, false, ['verify']);\n var hash = await sha(json.m);\n var buf, sig, check, tmp; try{\n buf = shim.Buffer.from(json.s, opt.encode || 'base64'); // NEW DEFAULT!\n sig = new Uint8Array(buf);\n check = await (shim.ossl || shim.subtle).verify({name: 'ECDSA', hash: {name: 'SHA-256'}}, key, sig, new Uint8Array(hash));\n if(!check){ throw \"Signature did not match.\" }\n }catch(e){\n if(SEA.opt.fallback){\n return await SEA.opt.fall_verify(data, pair, cb, opt);\n }\n }\n var r = check? await S.parse(json.m) : u;\n\n if(cb){ try{ cb(r) }catch(e){console.log(e)} }\n return r;\n } catch(e) {\n console.log(e); // mismatched owner FOR MARTTI\n SEA.err = e;\n if(SEA.throw){ throw e }\n if(cb){ cb() }\n return;\n }});\n\n module.exports = SEA.verify;\n // legacy & ossl memory leak mitigation:\n\n var knownKeys = {};\n var keyForPair = SEA.opt.slow_leak = pair => {\n if (knownKeys[pair]) return knownKeys[pair];\n var jwk = S.jwk(pair);\n knownKeys[pair] = (shim.ossl || shim.subtle).importKey(\"jwk\", jwk, {name: 'ECDSA', namedCurve: 'P-256'}, false, [\"verify\"]);\n return knownKeys[pair];\n };\n\n var O = SEA.opt;\n SEA.opt.fall_verify = async function(data, pair, cb, opt, f){\n if(f === SEA.opt.fallback){ throw \"Signature did not match\" } f = f || 1;\n var tmp = data||'';\n data = SEA.opt.unpack(data) || data;\n var json = await S.parse(data), pub = pair.pub || pair, key = await SEA.opt.slow_leak(pub);\n var hash = (f <= SEA.opt.fallback)? shim.Buffer.from(await shim.subtle.digest({name: 'SHA-256'}, new shim.TextEncoder().encode(await S.parse(json.m)))) : await sha(json.m); // this line is old bad buggy code but necessary for old compatibility.\n var buf; var sig; var check; try{\n buf = shim.Buffer.from(json.s, opt.encode || 'base64') // NEW DEFAULT!\n sig = new Uint8Array(buf)\n check = await (shim.ossl || shim.subtle).verify({name: 'ECDSA', hash: {name: 'SHA-256'}}, key, sig, new Uint8Array(hash))\n if(!check){ throw \"Signature did not match.\" }\n }catch(e){ try{\n buf = shim.Buffer.from(json.s, 'utf8') // AUTO BACKWARD OLD UTF8 DATA!\n sig = new Uint8Array(buf)\n check = await (shim.ossl || shim.subtle).verify({name: 'ECDSA', hash: {name: 'SHA-256'}}, key, sig, new Uint8Array(hash))\n }catch(e){\n if(!check){ throw \"Signature did not match.\" }\n }\n }\n var r = check? await S.parse(json.m) : u;\n O.fall_soul = tmp['#']; O.fall_key = tmp['.']; O.fall_val = data; O.fall_state = tmp['>'];\n if(cb){ try{ cb(r) }catch(e){console.log(e)} }\n return r;\n }\n SEA.opt.fallback = 2;\n\n })(USE, './verify');\n\n ;USE(function(module){\n var shim = USE('./shim');\n var S = USE('./settings');\n var sha256hash = USE('./sha256');\n\n const importGen = async (key, salt, opt) => {\n //const combo = shim.Buffer.concat([shim.Buffer.from(key, 'utf8'), salt || shim.random(8)]).toString('utf8') // old\n opt = opt || {};\n const combo = key + (salt || shim.random(8)).toString('utf8'); // new\n const hash = shim.Buffer.from(await sha256hash(combo), 'binary')\n \n const jwkKey = S.keyToJwk(hash) \n return await shim.subtle.importKey('jwk', jwkKey, {name:'AES-GCM'}, false, ['encrypt', 'decrypt'])\n }\n module.exports = importGen;\n })(USE, './aeskey');\n\n ;USE(function(module){\n var SEA = USE('./root');\n var shim = USE('./shim');\n var S = USE('./settings');\n var aeskey = USE('./aeskey');\n var u;\n\n SEA.encrypt = SEA.encrypt || (async (data, pair, cb, opt) => { try {\n opt = opt || {};\n var key = (pair||opt).epriv || pair;\n if(u === data){ throw '`undefined` not allowed.' }\n if(!key){\n if(!SEA.I){ throw 'No encryption key.' }\n pair = await SEA.I(null, {what: data, how: 'encrypt', why: opt.why});\n key = pair.epriv || pair;\n }\n var msg = (typeof data == 'string')? data : await shim.stringify(data);\n var rand = {s: shim.random(9), iv: shim.random(15)}; // consider making this 9 and 15 or 18 or 12 to reduce == padding.\n var ct = await aeskey(key, rand.s, opt).then((aes) => (/*shim.ossl ||*/ shim.subtle).encrypt({ // Keeping the AES key scope as private as possible...\n name: opt.name || 'AES-GCM', iv: new Uint8Array(rand.iv)\n }, aes, new shim.TextEncoder().encode(msg)));\n var r = {\n ct: shim.Buffer.from(ct, 'binary').toString(opt.encode || 'base64'),\n iv: rand.iv.toString(opt.encode || 'base64'),\n s: rand.s.toString(opt.encode || 'base64')\n }\n if(!opt.raw){ r = 'SEA' + await shim.stringify(r) }\n\n if(cb){ try{ cb(r) }catch(e){console.log(e)} }\n return r;\n } catch(e) { \n console.log(e);\n SEA.err = e;\n if(SEA.throw){ throw e }\n if(cb){ cb() }\n return;\n }});\n\n module.exports = SEA.encrypt;\n })(USE, './encrypt');\n\n ;USE(function(module){\n var SEA = USE('./root');\n var shim = USE('./shim');\n var S = USE('./settings');\n var aeskey = USE('./aeskey');\n\n SEA.decrypt = SEA.decrypt || (async (data, pair, cb, opt) => { try {\n opt = opt || {};\n var key = (pair||opt).epriv || pair;\n if(!key){\n if(!SEA.I){ throw 'No decryption key.' }\n pair = await SEA.I(null, {what: data, how: 'decrypt', why: opt.why});\n key = pair.epriv || pair;\n }\n var json = await S.parse(data);\n var buf, bufiv, bufct; try{\n buf = shim.Buffer.from(json.s, opt.encode || 'base64');\n bufiv = shim.Buffer.from(json.iv, opt.encode || 'base64');\n bufct = shim.Buffer.from(json.ct, opt.encode || 'base64');\n var ct = await aeskey(key, buf, opt).then((aes) => (/*shim.ossl ||*/ shim.subtle).decrypt({ // Keeping aesKey scope as private as possible...\n name: opt.name || 'AES-GCM', iv: new Uint8Array(bufiv), tagLength: 128\n }, aes, new Uint8Array(bufct)));\n }catch(e){\n if('utf8' === opt.encode){ throw \"Could not decrypt\" }\n if(SEA.opt.fallback){\n opt.encode = 'utf8';\n return await SEA.decrypt(data, pair, cb, opt);\n }\n }\n var r = await S.parse(new shim.TextDecoder('utf8').decode(ct));\n if(cb){ try{ cb(r) }catch(e){console.log(e)} }\n return r;\n } catch(e) { \n console.log(e);\n SEA.err = e;\n if(SEA.throw){ throw e }\n if(cb){ cb() }\n return;\n }});\n\n module.exports = SEA.decrypt;\n })(USE, './decrypt');\n\n ;USE(function(module){\n var SEA = USE('./root');\n var shim = USE('./shim');\n var S = USE('./settings');\n // Derive shared secret from other's pub and my epub/epriv \n SEA.secret = SEA.secret || (async (key, pair, cb, opt) => { try {\n opt = opt || {};\n if(!pair || !pair.epriv || !pair.epub){\n if(!SEA.I){ throw 'No secret mix.' }\n pair = await SEA.I(null, {what: key, how: 'secret', why: opt.why});\n }\n var pub = key.epub || key;\n var epub = pair.epub;\n var epriv = pair.epriv;\n var ecdhSubtle = shim.ossl || shim.subtle;\n var pubKeyData = keysToEcdhJwk(pub);\n var props = Object.assign({ public: await ecdhSubtle.importKey(...pubKeyData, true, []) },{name: 'ECDH', namedCurve: 'P-256'}); // Thanks to @sirpy !\n var privKeyData = keysToEcdhJwk(epub, epriv);\n var derived = await ecdhSubtle.importKey(...privKeyData, false, ['deriveBits']).then(async (privKey) => {\n // privateKey scope doesn't leak out from here!\n var derivedBits = await ecdhSubtle.deriveBits(props, privKey, 256);\n var rawBits = new Uint8Array(derivedBits);\n var derivedKey = await ecdhSubtle.importKey('raw', rawBits,{ name: 'AES-GCM', length: 256 }, true, [ 'encrypt', 'decrypt' ]);\n return ecdhSubtle.exportKey('jwk', derivedKey).then(({ k }) => k);\n })\n var r = derived;\n if(cb){ try{ cb(r) }catch(e){console.log(e)} }\n return r;\n } catch(e) {\n console.log(e);\n SEA.err = e;\n if(SEA.throw){ throw e }\n if(cb){ cb() }\n return;\n }});\n\n // can this be replaced with settings.jwk?\n var keysToEcdhJwk = (pub, d) => { // d === priv\n //var [ x, y ] = shim.Buffer.from(pub, 'base64').toString('utf8').split(':') // old\n var [ x, y ] = pub.split('.') // new\n var jwk = d ? { d: d } : {}\n return [ // Use with spread returned value...\n 'jwk',\n Object.assign(\n jwk,\n { x: x, y: y, kty: 'EC', crv: 'P-256', ext: true }\n ), // ??? refactor\n {name: 'ECDH', namedCurve: 'P-256'}\n ]\n }\n\n module.exports = SEA.secret;\n })(USE, './secret');\n\n ;USE(function(module){\n var SEA = USE('./root');\n // This is to certify that a group of \"certificants\" can \"put\" anything at a group of matched \"paths\" to the certificate authority's graph\n SEA.certify = SEA.certify || (async (certificants, policy = {}, authority, cb, opt = {}) => { try {\n /*\n The Certify Protocol was made out of love by a Vietnamese code enthusiast. Vietnamese people around the world deserve respect!\n IMPORTANT: A Certificate is like a Signature. No one knows who (authority) created/signed a cert until you put it into their graph.\n \"certificants\": '*' or a String (Bob.pub) || an Object that contains \"pub\" as a key || an array of [object || string]. These people will have the rights.\n \"policy\": A string ('inbox'), or a RAD/LEX object {'*': 'inbox'}, or an Array of RAD/LEX objects or strings. RAD/LEX object can contain key \"?\" with indexOf(\"*\") > -1 to force key equals certificant pub. This rule is used to check against soul+'/'+key using Gun.text.match or String.match.\n \"authority\": Key pair or priv of the certificate authority.\n \"cb\": A callback function after all things are done.\n \"opt\": If opt.expiry (a timestamp) is set, SEA won't sync data after opt.expiry. If opt.block is set, SEA will look for block before syncing.\n */\n console.log('SEA.certify() is an early experimental community supported method that may change API behavior without warning in any future version.')\n\n certificants = (() => {\n var data = []\n if (certificants) {\n if ((typeof certificants === 'string' || Array.isArray(certificants)) && certificants.indexOf('*') > -1) return '*'\n if (typeof certificants === 'string') return certificants\n if (Array.isArray(certificants)) {\n if (certificants.length === 1 && certificants[0]) return typeof certificants[0] === 'object' && certificants[0].pub ? certificants[0].pub : typeof certificants[0] === 'string' ? certificants[0] : null\n certificants.map(certificant => {\n if (typeof certificant ==='string') data.push(certificant)\n else if (typeof certificant === 'object' && certificant.pub) data.push(certificant.pub)\n })\n }\n\n if (typeof certificants === 'object' && certificants.pub) return certificants.pub\n return data.length > 0 ? data : null\n }\n return\n })()\n\n if (!certificants) return console.log(\"No certificant found.\")\n\n const expiry = opt.expiry && (typeof opt.expiry === 'number' || typeof opt.expiry === 'string') ? parseFloat(opt.expiry) : null\n const readPolicy = (policy || {}).read ? policy.read : null\n const writePolicy = (policy || {}).write ? policy.write : typeof policy === 'string' || Array.isArray(policy) || policy[\"+\"] || policy[\"#\"] || policy[\".\"] || policy[\"=\"] || policy[\"*\"] || policy[\">\"] || policy[\"<\"] ? policy : null\n // The \"blacklist\" feature is now renamed to \"block\". Why ? BECAUSE BLACK LIVES MATTER!\n // We can now use 3 keys: block, blacklist, ban\n const block = (opt || {}).block || (opt || {}).blacklist || (opt || {}).ban || {}\n const readBlock = block.read && (typeof block.read === 'string' || (block.read || {})['#']) ? block.read : null\n const writeBlock = typeof block === 'string' ? block : block.write && (typeof block.write === 'string' || block.write['#']) ? block.write : null\n\n if (!readPolicy && !writePolicy) return console.log(\"No policy found.\")\n\n // reserved keys: c, e, r, w, rb, wb\n const data = JSON.stringify({\n c: certificants,\n ...(expiry ? {e: expiry} : {}), // inject expiry if possible\n ...(readPolicy ? {r: readPolicy } : {}), // \"r\" stands for read, which means read permission.\n ...(writePolicy ? {w: writePolicy} : {}), // \"w\" stands for write, which means write permission.\n ...(readBlock ? {rb: readBlock} : {}), // inject READ block if possible\n ...(writeBlock ? {wb: writeBlock} : {}), // inject WRITE block if possible\n })\n\n const certificate = await SEA.sign(data, authority, null, {raw:1})\n\n var r = certificate\n if(!opt.raw){ r = 'SEA'+JSON.stringify(r) }\n if(cb){ try{ cb(r) }catch(e){console.log(e)} }\n return r;\n } catch(e) {\n SEA.err = e;\n if(SEA.throw){ throw e }\n if(cb){ cb() }\n return;\n }});\n\n module.exports = SEA.certify;\n })(USE, './certify');\n\n ;USE(function(module){\n var shim = USE('./shim');\n // Practical examples about usage found in tests.\n var SEA = USE('./root');\n SEA.work = USE('./work');\n SEA.sign = USE('./sign');\n SEA.verify = USE('./verify');\n SEA.encrypt = USE('./encrypt');\n SEA.decrypt = USE('./decrypt');\n SEA.certify = USE('./certify');\n //SEA.opt.aeskey = USE('./aeskey'); // not official! // this causes problems in latest WebCrypto.\n\n SEA.random = SEA.random || shim.random;\n\n // This is Buffer used in SEA and usable from Gun/SEA application also.\n // For documentation see https://nodejs.org/api/buffer.html\n SEA.Buffer = SEA.Buffer || USE('./buffer');\n\n // These SEA functions support now ony Promises or\n // async/await (compatible) code, use those like Promises.\n //\n // Creates a wrapper library around Web Crypto API\n // for various AES, ECDSA, PBKDF2 functions we called above.\n // Calculate public key KeyID aka PGPv4 (result: 8 bytes as hex string)\n SEA.keyid = SEA.keyid || (async (pub) => {\n try {\n // base64('base64(x):base64(y)') => shim.Buffer(xy)\n const pb = shim.Buffer.concat(\n pub.replace(/-/g, '+').replace(/_/g, '/').split('.')\n .map((t) => shim.Buffer.from(t, 'base64'))\n )\n // id is PGPv4 compliant raw key\n const id = shim.Buffer.concat([\n shim.Buffer.from([0x99, pb.length / 0x100, pb.length % 0x100]), pb\n ])\n const sha1 = await sha1hash(id)\n const hash = shim.Buffer.from(sha1, 'binary')\n return hash.toString('hex', hash.length - 8) // 16-bit ID as hex\n } catch (e) {\n console.log(e)\n throw e\n }\n });\n // all done!\n // Obviously it is missing MANY necessary features. This is only an alpha release.\n // Please experiment with it, audit what I've done so far, and complain about what needs to be added.\n // SEA should be a full suite that is easy and seamless to use.\n // Again, scroll naer the top, where I provide an EXAMPLE of how to create a user and sign in.\n // Once logged in, the rest of the code you just read handled automatically signing/validating data.\n // But all other behavior needs to be equally easy, like opinionated ways of\n // Adding friends (trusted public keys), sending private messages, etc.\n // Cheers! Tell me what you think.\n ((SEA.window||{}).GUN||{}).SEA = SEA;\n\n module.exports = SEA\n // -------------- END SEA MODULES --------------------\n // -- BEGIN SEA+GUN MODULES: BUNDLED BY DEFAULT UNTIL OTHERS USE SEA ON OWN -------\n })(USE, './sea');\n\n ;USE(function(module){\n var SEA = USE('./sea'), Gun, u;\n if(SEA.window){\n Gun = SEA.window.GUN || {chain:{}};\n } else {\n Gun = USE((u+'' == typeof MODULE?'.':'')+'./gun', 1);\n }\n SEA.GUN = Gun;\n\n function User(root){ \n this._ = {$: this};\n }\n User.prototype = (function(){ function F(){}; F.prototype = Gun.chain; return new F() }()) // Object.create polyfill\n User.prototype.constructor = User;\n\n // let's extend the gun chain with a `user` function.\n // only one user can be logged in at a time, per gun instance.\n Gun.chain.user = function(pub){\n var gun = this, root = gun.back(-1), user;\n if(pub){\n pub = SEA.opt.pub((pub._||'')['#']) || pub;\n return root.get('~'+pub);\n }\n if(user = root.back('user')){ return user }\n var root = (root._), at = root, uuid = at.opt.uuid || lex;\n (at = (user = at.user = gun.chain(new User))._).opt = {};\n at.opt.uuid = function(cb){\n var id = uuid(), pub = root.user;\n if(!pub || !(pub = pub.is) || !(pub = pub.pub)){ return id }\n id = '~' + pub + '/' + id;\n if(cb && cb.call){ cb(null, id) }\n return id;\n }\n return user;\n }\n function lex(){ return Gun.state().toString(36).replace('.','') }\n Gun.User = User;\n User.GUN = Gun;\n User.SEA = Gun.SEA = SEA;\n module.exports = User;\n })(USE, './user');\n\n ;USE(function(module){\n var u, Gun = (''+u != typeof window)? (window.Gun||{chain:{}}) : USE((''+u === typeof MODULE?'.':'')+'./gun', 1);\n Gun.chain.then = function(cb, opt){\n var gun = this, p = (new Promise(function(res, rej){\n gun.once(res, opt);\n }));\n return cb? p.then(cb) : p;\n }\n })(USE, './then');\n\n ;USE(function(module){\n var User = USE('./user'), SEA = User.SEA, Gun = User.GUN, noop = function(){};\n\n // Well first we have to actually create a user. That is what this function does.\n User.prototype.create = function(...args){\n var pair = typeof args[0] === 'object' && (args[0].pub || args[0].epub) ? args[0] : typeof args[1] === 'object' && (args[1].pub || args[1].epub) ? args[1] : null;\n var alias = pair && (pair.pub || pair.epub) ? pair.pub : typeof args[0] === 'string' ? args[0] : null;\n var pass = pair && (pair.pub || pair.epub) ? pair : alias && typeof args[1] === 'string' ? args[1] : null;\n var cb = args.filter(arg => typeof arg === 'function')[0] || null; // cb now can stand anywhere, after alias/pass or pair\n var opt = args && args.length > 1 && typeof args[args.length-1] === 'object' ? args[args.length-1] : {}; // opt is always the last parameter which typeof === 'object' and stands after cb\n \n var gun = this, cat = (gun._), root = gun.back(-1);\n cb = cb || noop;\n opt = opt || {};\n if(false !== opt.check){\n var err;\n if(!alias){ err = \"No user.\" }\n if((pass||'').length < 8){ err = \"Password too short!\" }\n if(err){\n cb({err: Gun.log(err)});\n return gun;\n }\n }\n if(cat.ing){\n (cb || noop)({err: Gun.log(\"User is already being created or authenticated!\"), wait: true});\n return gun;\n }\n cat.ing = true;\n var act = {}, u;\n act.a = function(pubs){\n act.pubs = pubs;\n if(pubs && !opt.already){\n // If we can enforce that a user name is already taken, it might be nice to try, but this is not guaranteed.\n var ack = {err: Gun.log('User already created!')};\n cat.ing = false;\n (cb || noop)(ack);\n gun.leave();\n return;\n }\n act.salt = String.random(64); // pseudo-randomly create a salt, then use PBKDF2 function to extend the password with it.\n SEA.work(pass, act.salt, act.b); // this will take some short amount of time to produce a proof, which slows brute force attacks.\n }\n act.b = function(proof){\n act.proof = proof;\n pair ? act.c(pair) : SEA.pair(act.c) // generate a brand new key pair or use the existing.\n }\n act.c = function(pair){\n var tmp\n act.pair = pair || {};\n if(tmp = cat.root.user){\n tmp._.sea = pair;\n tmp.is = {pub: pair.pub, epub: pair.epub, alias: alias};\n }\n // the user's public key doesn't need to be signed. But everything else needs to be signed with it! // we have now automated it! clean up these extra steps now!\n act.data = {pub: pair.pub};\n act.d();\n }\n act.d = function(){\n act.data.alias = alias;\n act.e();\n }\n act.e = function(){\n act.data.epub = act.pair.epub; \n SEA.encrypt({priv: act.pair.priv, epriv: act.pair.epriv}, act.proof, act.f, {raw:1}); // to keep the private key safe, we AES encrypt it with the proof of work!\n }\n act.f = function(auth){\n act.data.auth = JSON.stringify({ek: auth, s: act.salt}); \n act.g(act.data.auth);\n }\n act.g = function(auth){ var tmp;\n act.data.auth = act.data.auth || auth;\n root.get(tmp = '~'+act.pair.pub).put(act.data).on(act.h); // awesome, now we can actually save the user with their public key as their ID.\n var link = {}; link[tmp] = {'#': tmp}; root.get('~@'+alias).put(link).get(tmp).on(act.i); // next up, we want to associate the alias with the public key. So we add it to the alias list.\n }\n act.h = function(data, key, msg, eve){\n eve.off(); act.h.ok = 1; act.i();\n }\n act.i = function(data, key, msg, eve){\n if(eve){ act.i.ok = 1; eve.off() }\n if(!act.h.ok || !act.i.ok){ return }\n cat.ing = false;\n cb({ok: 0, pub: act.pair.pub}); // callback that the user has been created. (Note: ok = 0 because we didn't wait for disk to ack)\n if(noop === cb){ pair ? gun.auth(pair) : gun.auth(alias, pass) } // if no callback is passed, auto-login after signing up.\n }\n root.get('~@'+alias).once(act.a);\n return gun;\n }\n User.prototype.leave = function(opt, cb){\n var gun = this, user = (gun.back(-1)._).user;\n if(user){\n delete user.is;\n delete user._.is;\n delete user._.sea;\n }\n if(SEA.window){\n try{var sS = {};\n sS = window.sessionStorage;\n delete sS.recall;\n delete sS.pair;\n }catch(e){};\n }\n return gun;\n }\n })(USE, './create');\n\n ;USE(function(module){\n var User = USE('./user'), SEA = User.SEA, Gun = User.GUN, noop = function(){};\n // now that we have created a user, we want to authenticate them!\n User.prototype.auth = function(...args){ // TODO: this PR with arguments need to be cleaned up / refactored.\n var pair = typeof args[0] === 'object' && (args[0].pub || args[0].epub) ? args[0] : typeof args[1] === 'object' && (args[1].pub || args[1].epub) ? args[1] : null;\n var alias = !pair && typeof args[0] === 'string' ? args[0] : null;\n var pass = (alias || (pair && !(pair.priv && pair.epriv))) && typeof args[1] === 'string' ? args[1] : null;\n var cb = args.filter(arg => typeof arg === 'function')[0] || null; // cb now can stand anywhere, after alias/pass or pair\n var opt = args && args.length > 1 && typeof args[args.length-1] === 'object' ? args[args.length-1] : {}; // opt is always the last parameter which typeof === 'object' and stands after cb\n \n var gun = this, cat = (gun._), root = gun.back(-1);\n \n if(cat.ing){\n (cb || noop)({err: Gun.log(\"User is already being created or authenticated!\"), wait: true});\n return gun;\n }\n cat.ing = true;\n \n var act = {}, u, tries = 9;\n act.a = function(data){\n if(!data){ return act.b() }\n if(!data.pub){\n var tmp = []; Object.keys(data).forEach(function(k){ if('_'==k){ return } tmp.push(data[k]) })\n return act.b(tmp);\n }\n if(act.name){ return act.f(data) }\n act.c((act.data = data).auth);\n }\n act.b = function(list){\n var get = (act.list = (act.list||[]).concat(list||[])).shift();\n if(u === get){\n if(act.name){ return act.err('Your user account is not published for dApps to access, please consider syncing it online, or allowing local access by adding your device as a peer.') }\n if(alias && tries--){\n root.get('~@'+alias).once(act.a);\n return;\n }\n return act.err('Wrong user or password.') \n }\n root.get(get).once(act.a);\n }\n act.c = function(auth){\n if(u === auth){ return act.b() }\n if('string' == typeof auth){ return act.c(obj_ify(auth)) } // in case of legacy\n SEA.work(pass, (act.auth = auth).s, act.d, act.enc); // the proof of work is evidence that we've spent some time/effort trying to log in, this slows brute force.\n }\n act.d = function(proof){\n SEA.decrypt(act.auth.ek, proof, act.e, act.enc);\n }\n act.e = function(half){\n if(u === half){\n if(!act.enc){ // try old format\n act.enc = {encode: 'utf8'};\n return act.c(act.auth);\n } act.enc = null; // end backwards\n return act.b();\n }\n act.half = half;\n act.f(act.data);\n }\n act.f = function(pair){\n var half = act.half || {}, data = act.data || {};\n act.g(act.lol = {pub: pair.pub || data.pub, epub: pair.epub || data.epub, priv: pair.priv || half.priv, epriv: pair.epriv || half.epriv});\n }\n act.g = function(pair){\n if(!pair || !pair.pub || !pair.epub){ return act.b() }\n act.pair = pair;\n var user = (root._).user, at = (user._);\n var tmp = at.tag;\n var upt = at.opt;\n at = user._ = root.get('~'+pair.pub)._;\n at.opt = upt;\n // add our credentials in-memory only to our root user instance\n user.is = {pub: pair.pub, epub: pair.epub, alias: alias || pair.pub};\n at.sea = act.pair;\n cat.ing = false;\n try{if(pass && u == (obj_ify(cat.root.graph['~'+pair.pub].auth)||'')[':']){ opt.shuffle = opt.change = pass; } }catch(e){} // migrate UTF8 & Shuffle!\n opt.change? act.z() : (cb || noop)(at);\n if(SEA.window && ((gun.back('user')._).opt||opt).remember){\n // TODO: this needs to be modular.\n try{var sS = {};\n sS = window.sessionStorage; // TODO: FIX BUG putting on `.is`!\n sS.recall = true;\n sS.pair = JSON.stringify(pair); // auth using pair is more reliable than alias/pass\n }catch(e){}\n }\n try{\n if(root._.tag.auth){ // auth handle might not be registered yet\n (root._).on('auth', at) // TODO: Deprecate this, emit on user instead! Update docs when you do.\n } else { setTimeout(function(){ (root._).on('auth', at) },1) } // if not, hackily add a timeout.\n //at.on('auth', at) // Arrgh, this doesn't work without event \"merge\" code, but \"merge\" code causes stack overflow and crashes after logging in & trying to write data.\n }catch(e){\n Gun.log(\"Your 'auth' callback crashed with:\", e);\n }\n }\n act.h = function(data){\n if(!data){ return act.b() }\n alias = data.alias\n if(!alias)\n alias = data.alias = \"~\" + pair.pub \n if(!data.auth){\n return act.g(pair);\n }\n pair = null;\n act.c((act.data = data).auth);\n }\n act.z = function(){\n // password update so encrypt private key using new pwd + salt\n act.salt = String.random(64); // pseudo-random\n SEA.work(opt.change, act.salt, act.y);\n }\n act.y = function(proof){\n SEA.encrypt({priv: act.pair.priv, epriv: act.pair.epriv}, proof, act.x, {raw:1});\n }\n act.x = function(auth){\n act.w(JSON.stringify({ek: auth, s: act.salt}));\n }\n act.w = function(auth){\n if(opt.shuffle){ // delete in future!\n console.log('migrate core account from UTF8 & shuffle');\n var tmp = {}; Object.keys(act.data).forEach(function(k){ tmp[k] = act.data[k] });\n delete tmp._;\n tmp.auth = auth;\n root.get('~'+act.pair.pub).put(tmp);\n } // end delete\n root.get('~'+act.pair.pub).get('auth').put(auth, cb || noop);\n }\n act.err = function(e){\n var ack = {err: Gun.log(e || 'User cannot be found!')};\n cat.ing = false;\n (cb || noop)(ack);\n }\n act.plugin = function(name){\n if(!(act.name = name)){ return act.err() }\n var tmp = [name];\n if('~' !== name[0]){\n tmp[1] = '~'+name;\n tmp[2] = '~@'+name;\n }\n act.b(tmp);\n }\n if(pair){\n if(pair.priv && pair.epriv)\n act.g(pair);\n else\n root.get('~'+pair.pub).once(act.h);\n } else\n if(alias){\n root.get('~@'+alias).once(act.a);\n } else\n if(!alias && !pass){\n SEA.name(act.plugin);\n }\n return gun;\n }\n function obj_ify(o){\n if('string' != typeof o){ return o }\n try{o = JSON.parse(o);\n }catch(e){o={}};\n return o;\n }\n })(USE, './auth');\n\n ;USE(function(module){\n var User = USE('./user'), SEA = User.SEA, Gun = User.GUN;\n User.prototype.recall = function(opt, cb){\n var gun = this, root = gun.back(-1), tmp;\n opt = opt || {};\n if(opt && opt.sessionStorage){\n if(SEA.window){\n try{\n var sS = {};\n sS = window.sessionStorage; // TODO: FIX BUG putting on `.is`!\n if(sS){\n (root._).opt.remember = true;\n ((gun.back('user')._).opt||opt).remember = true;\n if(sS.recall || sS.pair) root.user().auth(JSON.parse(sS.pair), cb); // pair is more reliable than alias/pass\n }\n }catch(e){}\n }\n return gun;\n }\n /*\n TODO: copy mhelander's expiry code back in.\n Although, we should check with community,\n should expiry be core or a plugin?\n */\n return gun;\n }\n })(USE, './recall');\n\n ;USE(function(module){\n var User = USE('./user'), SEA = User.SEA, Gun = User.GUN, noop = function(){};\n User.prototype.pair = function(){\n var user = this, proxy; // undeprecated, hiding with proxies.\n try{ proxy = new Proxy({DANGER:'\\u2620'}, {get: function(t,p,r){\n if(!user.is || !(user._||'').sea){ return }\n return user._.sea[p];\n }})}catch(e){}\n return proxy;\n }\n // If authenticated user wants to delete his/her account, let's support it!\n User.prototype.delete = async function(alias, pass, cb){\n console.log(\"user.delete() IS DEPRECATED AND WILL BE MOVED TO A MODULE!!!\");\n var gun = this, root = gun.back(-1), user = gun.back('user');\n try {\n user.auth(alias, pass, function(ack){\n var pub = (user.is||{}).pub;\n // Delete user data\n user.map().once(function(){ this.put(null) });\n // Wipe user data from memory\n user.leave();\n (cb || noop)({ok: 0});\n });\n } catch (e) {\n Gun.log('User.delete failed! Error:', e);\n }\n return gun;\n }\n User.prototype.alive = async function(){\n console.log(\"user.alive() IS DEPRECATED!!!\");\n const gunRoot = this.back(-1)\n try {\n // All is good. Should we do something more with actual recalled data?\n await authRecall(gunRoot)\n return gunRoot._.user._\n } catch (e) {\n const err = 'No session!'\n Gun.log(err)\n throw { err }\n }\n }\n User.prototype.trust = async function(user){\n console.log(\"`.trust` API MAY BE DELETED OR CHANGED OR RENAMED, DO NOT USE!\");\n // TODO: BUG!!! SEA `node` read listener needs to be async, which means core needs to be async too.\n //gun.get('alice').get('age').trust(bob);\n if (Gun.is(user)) {\n user.get('pub').get((ctx, ev) => {\n console.log(ctx, ev)\n })\n }\n user.get('trust').get(path).put(theirPubkey);\n\n // do a lookup on this gun chain directly (that gets bob's copy of the data)\n // do a lookup on the metadata trust table for this path (that gets all the pubkeys allowed to write on this path)\n // do a lookup on each of those pubKeys ON the path (to get the collab data \"layers\")\n // THEN you perform Jachen's mix operation\n // and return the result of that to...\n }\n User.prototype.grant = function(to, cb){\n console.log(\"`.grant` API MAY BE DELETED OR CHANGED OR RENAMED, DO NOT USE!\");\n var gun = this, user = gun.back(-1).user(), pair = user._.sea, path = '';\n gun.back(function(at){ if(at.is){ return } path += (at.get||'') });\n (async function(){\n var enc, sec = await user.get('grant').get(pair.pub).get(path).then();\n sec = await SEA.decrypt(sec, pair);\n if(!sec){\n sec = SEA.random(16).toString();\n enc = await SEA.encrypt(sec, pair);\n user.get('grant').get(pair.pub).get(path).put(enc);\n }\n var pub = to.get('pub').then();\n var epub = to.get('epub').then();\n pub = await pub; epub = await epub;\n var dh = await SEA.secret(epub, pair);\n enc = await SEA.encrypt(sec, dh);\n user.get('grant').get(pub).get(path).put(enc, cb);\n }());\n return gun;\n }\n User.prototype.secret = function(data, cb){\n console.log(\"`.secret` API MAY BE DELETED OR CHANGED OR RENAMED, DO NOT USE!\");\n var gun = this, user = gun.back(-1).user(), pair = user.pair(), path = '';\n gun.back(function(at){ if(at.is){ return } path += (at.get||'') });\n (async function(){\n var enc, sec = await user.get('trust').get(pair.pub).get(path).then();\n sec = await SEA.decrypt(sec, pair);\n if(!sec){\n sec = SEA.random(16).toString();\n enc = await SEA.encrypt(sec, pair);\n user.get('trust').get(pair.pub).get(path).put(enc);\n }\n enc = await SEA.encrypt(data, sec);\n gun.put(enc, cb);\n }());\n return gun;\n }\n\n /**\n * returns the decrypted value, encrypted by secret\n * @returns {Promise}\n // Mark needs to review 1st before officially supported\n User.prototype.decrypt = function(cb) {\n let gun = this,\n path = ''\n gun.back(function(at) {\n if (at.is) {\n return\n }\n path += at.get || ''\n })\n return gun\n .then(async data => {\n if (data == null) {\n return\n }\n const user = gun.back(-1).user()\n const pair = user.pair()\n let sec = await user\n .get('trust')\n .get(pair.pub)\n .get(path)\n sec = await SEA.decrypt(sec, pair)\n if (!sec) {\n return data\n }\n let decrypted = await SEA.decrypt(data, sec)\n return decrypted\n })\n .then(res => {\n cb && cb(res)\n return res\n })\n }\n */\n module.exports = User\n })(USE, './share');\n\n ;USE(function(module){\n var SEA = USE('./sea'), S = USE('./settings'), noop = function() {}, u;\n var Gun = (''+u != typeof window)? (window.Gun||{on:noop}) : USE((''+u === typeof MODULE?'.':'')+'./gun', 1);\n // After we have a GUN extension to make user registration/login easy, we then need to handle everything else.\n\n // We do this with a GUN adapter, we first listen to when a gun instance is created (and when its options change)\n Gun.on('opt', function(at){\n if(!at.sea){ // only add SEA once per instance, on the \"at\" context.\n at.sea = {own: {}};\n at.on('put', check, at); // SEA now runs its firewall on HAM diffs, not all i/o.\n }\n this.to.next(at); // make sure to call the \"next\" middleware adapter.\n });\n\n // Alright, this next adapter gets run at the per node level in the graph database.\n // correction: 2020 it gets run on each key/value pair in a node upon a HAM diff.\n // This will let us verify that every property on a node has a value signed by a public key we trust.\n // If the signature does not match, the data is just `undefined` so it doesn't get passed on.\n // If it does match, then we transform the in-memory \"view\" of the data into its plain value (without the signature).\n // Now NOTE! Some data is \"system\" data, not user data. Example: List of public keys, aliases, etc.\n // This data is self-enforced (the value can only match its ID), but that is handled in the `security` function.\n // From the self-enforced data, we can see all the edges in the graph that belong to a public key.\n // Example: ~ASDF is the ID of a node with ASDF as its public key, signed alias and salt, and\n // its encrypted private key, but it might also have other signed values on it like `profile = ` edge.\n // Using that directed edge's ID, we can then track (in memory) which IDs belong to which keys.\n // Here is a problem: Multiple public keys can \"claim\" any node's ID, so this is dangerous!\n // This means we should ONLY trust our \"friends\" (our key ring) public keys, not any ones.\n // I have not yet added that to SEA yet in this alpha release. That is coming soon, but beware in the meanwhile!\n\n function check(msg){ // REVISE / IMPROVE, NO NEED TO PASS MSG/EVE EACH SUB?\n var eve = this, at = eve.as, put = msg.put, soul = put['#'], key = put['.'], val = put[':'], state = put['>'], id = msg['#'], tmp;\n if(!soul || !key){ return }\n if((msg._||'').faith && (at.opt||'').faith && 'function' == typeof msg._){\n SEA.opt.pack(put, function(raw){\n SEA.verify(raw, false, function(data){ // this is synchronous if false\n put['='] = SEA.opt.unpack(data);\n eve.to.next(msg);\n })})\n return \n }\n var no = function(why){ at.on('in', {'@': id, err: msg.err = why}) }; // exploit internal relay stun for now, maybe violates spec, but testing for now. // Note: this may be only the sharded message, not original batch.\n //var no = function(why){ msg.ack(why) };\n (msg._||'').DBG && ((msg._||'').DBG.c = +new Date);\n if(0 <= soul.indexOf(' {\n if (certificate.m && certificate.s && certificant && pub)\n // now verify certificate\n return SEA.verify(certificate, pub, data => { // check if \"pub\" (of the graph owner) really issued this cert\n if (u !== data && u !== data.e && msg.put['>'] && msg.put['>'] > parseFloat(data.e)) return no(\"Certificate expired.\") // certificate expired\n // \"data.c\" = a list of certificants/certified users\n // \"data.w\" = lex WRITE permission, in the future, there will be \"data.r\" which means lex READ permission\n if (u !== data && data.c && data.w && (data.c === certificant || data.c.indexOf('*' || certificant) > -1)) {\n // ok, now \"certificant\" is in the \"certificants\" list, but is \"path\" allowed? Check path\n let path = soul.indexOf('/') > -1 ? soul.replace(soul.substring(0, soul.indexOf('/') + 1), '') : ''\n String.match = String.match || Gun.text.match\n const w = Array.isArray(data.w) ? data.w : typeof data.w === 'object' || typeof data.w === 'string' ? [data.w] : []\n for (const lex of w) {\n if ((String.match(path, lex['#']) && String.match(key, lex['.'])) || (!lex['.'] && String.match(path, lex['#'])) || (!lex['#'] && String.match(key, lex['.'])) || String.match((path ? path + '/' + key : key), lex['#'] || lex)) {\n // is Certificant forced to present in Path\n if (lex['+'] && lex['+'].indexOf('*') > -1 && path && path.indexOf(certificant) == -1 && key.indexOf(certificant) == -1) return no(`Path \"${path}\" or key \"${key}\" must contain string \"${certificant}\".`)\n // path is allowed, but is there any WRITE block? Check it out\n if (data.wb && (typeof data.wb === 'string' || ((data.wb || {})['#']))) { // \"data.wb\" = path to the WRITE block\n var root = eve.as.root.$.back(-1)\n if (typeof data.wb === 'string' && '~' !== data.wb.slice(0, 1)) root = root.get('~' + pub)\n return root.get(data.wb).get(certificant).once(value => { // TODO: INTENT TO DEPRECATE.\n if (value && (value === 1 || value === true)) return no(`Certificant ${certificant} blocked.`)\n return cb(data)\n })\n }\n return cb(data)\n }\n }\n return no(\"Certificate verification fail.\")\n }\n })\n return\n }\n \n if ('pub' === key && '~' + pub === soul) {\n if (val === pub) return eve.to.next(msg) // the account MUST match `pub` property that equals the ID of the public key.\n return no(\"Account not same!\")\n }\n\n if ((tmp = user.is) && tmp.pub && !raw['*'] && !raw['+'] && (pub === tmp.pub || (pub !== tmp.pub && ((msg._.msg || {}).opt || {}).cert))){\n SEA.opt.pack(msg.put, packed => {\n SEA.sign(packed, (user._).sea, async function(data) {\n if (u === data) return no(SEA.err || 'Signature fail.')\n msg.put[':'] = {':': tmp = SEA.opt.unpack(data.m), '~': data.s}\n msg.put['='] = tmp\n \n // if writing to own graph, just allow it\n if (pub === user.is.pub) {\n if (tmp = link_is(val)) (at.sea.own[tmp] = at.sea.own[tmp] || {})[pub] = 1\n JSON.stringifyAsync(msg.put[':'], function(err,s){\n if(err){ return no(err || \"Stringify error.\") }\n msg.put[':'] = s;\n return eve.to.next(msg);\n })\n return\n }\n \n // if writing to other's graph, check if cert exists then try to inject cert into put, also inject self pub so that everyone can verify the put\n if (pub !== user.is.pub && ((msg._.msg || {}).opt || {}).cert) {\n const cert = await S.parse(msg._.msg.opt.cert)\n // even if cert exists, we must verify it\n if (cert && cert.m && cert.s)\n verify(cert, user.is.pub, _ => {\n msg.put[':']['+'] = cert // '+' is a certificate\n msg.put[':']['*'] = user.is.pub // '*' is pub of the user who puts\n JSON.stringifyAsync(msg.put[':'], function(err,s){\n if(err){ return no(err || \"Stringify error.\") }\n msg.put[':'] = s;\n return eve.to.next(msg);\n })\n return\n })\n }\n }, {raw: 1})\n })\n return;\n }\n\n SEA.opt.pack(msg.put, packed => {\n SEA.verify(packed, raw['*'] || pub, function(data){ var tmp;\n data = SEA.opt.unpack(data);\n if (u === data) return no(\"Unverified data.\") // make sure the signature matches the account it claims to be on. // reject any updates that are signed with a mismatched account.\n if ((tmp = link_is(data)) && pub === SEA.opt.pub(tmp)) (at.sea.own[tmp] = at.sea.own[tmp] || {})[pub] = 1\n \n // check if cert ('+') and putter's pub ('*') exist\n if (raw['+'] && raw['+']['m'] && raw['+']['s'] && raw['*'])\n // now verify certificate\n verify(raw['+'], raw['*'], _ => {\n msg.put['='] = data;\n return eve.to.next(msg);\n })\n else {\n msg.put['='] = data;\n return eve.to.next(msg);\n }\n });\n })\n return\n };\n check.any = function(eve, msg, val, key, soul, at, no, user){ var tmp, pub;\n if(at.opt.secure){ return no(\"Soul missing public key at '\" + key + \"'.\") }\n // TODO: Ask community if should auto-sign non user-graph data.\n at.on('secure', function(msg){ this.off();\n if(!at.opt.secure){ return eve.to.next(msg) }\n no(\"Data cannot be changed.\");\n }).on.on('secure', msg);\n return;\n }\n\n var valid = Gun.valid, link_is = function(d,l){ return 'string' == typeof (l = valid(d)) && l }, state_ify = (Gun.state||'').ify;\n\n var pubcut = /[^\\w_-]/; // anything not alphanumeric or _ -\n SEA.opt.pub = function(s){\n if(!s){ return }\n s = s.split('~');\n if(!s || !(s = s[1])){ return }\n s = s.split(pubcut).slice(0,2);\n if(!s || 2 != s.length){ return }\n if('@' === (s[0]||'')[0]){ return }\n s = s.slice(0,2).join('.');\n return s;\n }\n SEA.opt.stringy = function(t){\n // TODO: encrypt etc. need to check string primitive. Make as breaking change.\n }\n SEA.opt.pack = function(d,cb,k, n,s){ var tmp, f; // pack for verifying\n if(SEA.opt.check(d)){ return cb(d) }\n if(d && d['#'] && d['.'] && d['>']){ tmp = d[':']; f = 1 }\n JSON.parseAsync(f? tmp : d, function(err, meta){\n var sig = ((u !== (meta||'')[':']) && (meta||'')['~']); // or just ~ check?\n if(!sig){ cb(d); return }\n cb({m: {'#':s||d['#'],'.':k||d['.'],':':(meta||'')[':'],'>':d['>']||Gun.state.is(n, k)}, s: sig});\n });\n }\n var O = SEA.opt;\n SEA.opt.unpack = function(d, k, n){ var tmp;\n if(u === d){ return }\n if(d && (u !== (tmp = d[':']))){ return tmp }\n k = k || O.fall_key; if(!n && O.fall_val){ n = {}; n[k] = O.fall_val }\n if(!k || !n){ return }\n if(d === n[k]){ return d }\n if(!SEA.opt.check(n[k])){ return d }\n var soul = (n && n._ && n._['#']) || O.fall_soul, s = Gun.state.is(n, k) || O.fall_state;\n if(d && 4 === d.length && soul === d[0] && k === d[1] && fl(s) === fl(d[3])){\n return d[2];\n }\n if(s < SEA.opt.shuffle_attack){\n return d;\n }\n }\n SEA.opt.shuffle_attack = 1546329600000; // Jan 1, 2019\n var fl = Math.floor; // TODO: Still need to fix inconsistent state issue.\n // TODO: Potential bug? If pub/priv key starts with `-`? IDK how possible.\n\n })(USE, './index');\n}());\n","// I don't quite know where this should go yet, so putting it here\n// what will probably wind up happening is that minimal AXE logic added to end of gun.js\n// and then rest of AXE logic (here) will be moved back to gun/axe.js\n// but for now... I gotta rush this out!\nvar Gun = (typeof window !== \"undefined\")? window.Gun : require('../gun'), u;\nGun.on('opt', function(at){ start(at); this.to.next(at) }); // make sure to call the \"next\" middleware adapter.\n// TODO: BUG: panic test/panic/1 & test/panic/3 fail when AXE is on.\nfunction start(root){\n\tif(root.axe){ return }\n\tvar opt = root.opt, peers = opt.peers;\n\tif(false === opt.axe){ return }\n\tif((typeof process !== \"undefined\") && 'false' === ''+(process.env||'').AXE){ return }\n\tGun.log.once(\"AXE\", \"AXE relay enabled!\");\n\tvar axe = root.axe = {}, tmp, id;\n\tvar mesh = opt.mesh = opt.mesh || Gun.Mesh(root); // DAM!\n\tvar dup = root.dup;\n\n\tmesh.way = function(msg){\n\t\tif(!msg){ return }\n\t\t//relayUp(msg); // TEMPORARY!!!\n\t\tif(msg.get){ return GET(msg) }\n\t\tif(msg.put){ return }\n\t\tfall(msg);\n\t}\n\n\tfunction GET(msg){\n\t\tif(!msg){ return }\n\t\tvar via = (msg._||'').via, soul, has, tmp, ref;\n\t\tif(!via || !via.id){ return fall(msg) }\n\t\t// SUBSCRIPTION LOGIC MOVED TO GET'S ACK REPLY.\n\t\tif(!(ref = REF(msg)._)){ return fall(msg) }\n\t\tref.asked = +new Date;\n\t\tGET.turn(msg, ref.route, 0);\n\t}\n\tGET.turn = function(msg, route, turn){\n\t\tvar tmp = msg['#'], tag = dup.s[tmp], next; \n\t\tif(!tmp || !tag){ return } // message timed out, GUN may require us to relay, tho AXE does not like that. Rethink?\n\t\t// TOOD: BUG! Handle edge case where live updates occur while these turn hashes are being checked (they'll never be consistent), but we don't want to degrade to O(N), if we know the via asking peer got an update, then we should do something like cancel these turns asking for data.\n\t\t// Ideas: Save a random seed that sorts the route, store it and the index. // Or indexing on lowest latency is probably better.\n\t\tclearTimeout(tag.lack);\n\t\tif(tag.ack && (tmp = tag['##']) && msg['##'] === tmp){ return } // hashes match, stop asking other peers!\n\t\tnext = (Object.maps(route||opt.peers)).slice(turn = turn || 0);\n\t\tif(!next.length){\n\t\t\tif(!route){ return } // asked all peers, stop asking!\n\t\t\tGET.turn(msg, u, 0); // asked all subs, now now ask any peers. (not always the best idea, but stays )\n\t\t\treturn;\n\t\t}\n\t\tsetTimeout.each(next, function(id){\n\t\t\tvar peer = opt.peers[id]; turn++;\n\t\t\tif(!peer || !peer.wire){ route && route.delete(id); return } // bye! // TODO: CHECK IF 0 OTHER PEERS & UNSUBSCRIBE\n\t\t\tif(mesh.say(msg, peer) === false){ return } // was self\n\t\t\tif(0 == (turn % 3)){ return 1 }\n\t\t}, function(){\n\t\t\ttag['##'] = msg['##']; // should probably set this in a more clever manner, do live `in` checks ++ --, etc. but being lazy for now. // TODO: Yes, see `in` TODO, currently this might match against only in-mem cause no other peers reply, which is \"fine\", but could cause a false positive.\n\t\t\ttag.lack = setTimeout(function(){ GET.turn(msg, route, turn) }, 25);\n\t\t}, 3);\n\t}\n\tfunction fall(msg){ mesh.say(msg, opt.peers) }\n\tfunction REF(msg){\n\t\tvar ref = '', soul, has, tmp;\n\t\tif(!msg || !msg.get){ return ref }\n\t\tif('string' == typeof (soul = msg.get['#'])){ ref = root.$.get(soul) }\n\t\tif('string' == typeof (tmp = msg.get['.'])){ has = tmp } else { has = '' }\n\t\treturn ref;\n\t}\n\tfunction LEX(lex){ return (lex = lex || '')['='] || lex['*'] || lex['>'] || lex }\n\t\n\troot.on('in', function(msg){ var to = this.to, tmp;\n\t\tif((tmp = msg['@']) && (tmp = dup.s[tmp])){\n\t\t\ttmp.ack = (tmp.ack || 0) + 1; // count remote ACKs to GET. // TODO: If mismatch, should trigger next asks.\n\t\t\tif(tmp.it && tmp.it.get && msg.put){ // WHEN SEEING A PUT REPLY TO A GET...\n\t\t\t\tvar get = tmp.it.get||'', ref = REF(tmp.it)._, via = (tmp.it._||'').via||'', sub;\n\t\t\t\tif(via && ref){ // SUBSCRIBE THE PEER WHO ASKED VIA FOR IT:\n\t\t\t\t\t//console.log(\"SUBSCRIBING\", Object.maps(ref.route||''), \"to\", LEX(get['#']));\n\t\t\t\t\tvia.id && (ref.route || (ref.route = new Object.Map)).set(via.id, via);\n\t\t\t\t\tsub = (via.sub || (via.sub = new Object.Map));\n\t\t\t\t\tref && (sub.get(LEX(get['#'])) || (sub.set(LEX(get['#']), sub = new Object.Map) && sub)).set(LEX(get['.']), 1); // {soul: {'':1, has: 1}}\n\n\t\t\t\t\tvia = (msg._||'').via||'';\n\t\t\t\t\tif(via){ // BIDIRECTIONAL SUBSCRIBE: REPLIER IS NOW SUBSCRIBED. DO WE WANT THIS?\n\t\t\t\t\t\tvia.id && (ref.route || (ref.route = new Object.Map)).set(via.id, via);\n\t\t\t\t\t\tsub = (via.sub || (via.sub = new Object.Map));\n\t\t\t\t\t\tif(ref){\n\t\t\t\t\t\t\tvar soul = LEX(get['#']), sift = sub.get(soul), has = LEX(get['.']);\n\t\t\t\t\t\t\tif(has){\n\t\t\t\t\t\t\t\t(sift || (sub.set(soul, sift = new Object.Map) && sift)).set(has, 1);\n\t\t\t\t\t\t\t} else\n\t\t\t\t\t\t\tif(!sift){\n\t\t\t\t\t\t\t\tsub.set(soul, sift = new Object.Map);\n\t\t\t\t\t\t\t\tsift.set('', 1);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif((tmp = tmp.back)){ // backtrack OKs since AXE splits PUTs up.\n\t\t\t\tsetTimeout.each(Object.keys(tmp), function(id){\n\t\t\t\t\tto.next({'#': msg['#'], '@': id, ok: msg.ok});\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tto.next(msg);\n\t});\n\n\troot.on('create', function(root){\n\t\tthis.to.next(root);\n\t\tvar Q = {};\n\t\troot.on('put', function(msg){\n\t\t\tvar eve = this, at = eve.as, put = msg.put, soul = put['#'], has = put['.'], val = put[':'], state = put['>'], q, tmp;\n\t\t\teve.to.next(msg);\n\t\t\tif(msg['@']){ return } // acks send existing data, not updates, so no need to resend to others.\n\t\t\tif(!soul || !has){ return }\n\t\t\tvar ref = root.$.get(soul)._, route = (ref||'').route;\n\t\t\tif(!route){ return }\n\t\t\tif(ref.skip){ ref.skip.now = msg['#']; return }\n\t\t\t(ref.skip = {now: msg['#']}).to = setTimeout(function(){\n\t\t\tsetTimeout.each(Object.maps(route), function(pid){ var peer, tmp;\n\t\t\t\tvar skip = ref.skip||''; ref.skip = null;\n\t\t\t\tif(!(peer = route.get(pid))){ return }\n\t\t\t\tif(!peer.wire){ route.delete(pid); return } // bye!\n\t\t\t\tvar sub = (peer.sub || (peer.sub = new Object.Map)).get(soul);\n\t\t\t\tif(!sub){ return }\n\t\t\t\tif(!sub.get(has) && !sub.get('')){ return }\n\t\t\t\tvar put = peer.put || (peer.put = {});\n\t\t\t\tvar node = root.graph[soul], tmp;\n\t\t\t\tif(node && u !== (tmp = node[has])){\n\t\t\t\t\tstate = state_is(node, has);\n\t\t\t\t\tval = tmp;\n\t\t\t\t}\n\t\t\t\tput[soul] = state_ify(put[soul], has, state, val, soul);\n\t\t\t\ttmp = dup.track(peer.next = peer.next || String.random(9));\n\t\t\t\t(tmp.back || (tmp.back = {}))[''+skip.now||msg['#']] = 1;\n\t\t\t\tif(peer.to){ return }\n\t\t\t\tpeer.to = setTimeout(function(){ flush(peer) }, opt.gap);\n\t\t\t}) }, 9);\n\t\t});\n\t});\n\n\tfunction flush(peer){\n\t\tvar msg = {'#': peer.next, put: peer.put, ok: {'@': 3, '/': mesh.near}}; // BUG: TODO: sub count!\n\t\t// TODO: what about DAM's >< dedup? Current thinking is, don't use it, however, you could store first msg# & latest msg#, and if here... latest === first then likely it is the same >< thing, so if(firstMsg['><'][peer.id]){ return } don't send.\n\t\tpeer.next = peer.put = peer.to = null;\n\t\tmesh.say(msg, peer);\n\t}\n\tvar state_ify = Gun.state.ify, state_is = Gun.state.is;\n\n\tfunction relayUp(msg){\n\t\tmesh.say(msg, axe.up);\n\t}\n\n\t;(function(){ // THIS IS THE UP MODULE;\n\t\taxe.up = {};\n\t\tvar hi = mesh.hear['?']; // lower-level integration with DAM! This is abnormal but helps performance.\n\t\tmesh.hear['?'] = function(msg, peer){ var p; // deduplicate unnecessary connections:\n\t\t\thi(msg, peer);\n\t\t\tif(!peer.pid){ return }\n\t\t\tif(peer.pid === opt.pid){ mesh.bye(peer); return } // if I connected to myself, drop.\n\t\t\tif(p = axe.up[peer.pid]){ // if we both connected to each other...\n\t\t\t\tif(p === peer){ return } // do nothing if no conflict,\n\t\t\t\tif(opt.pid > peer.pid){ // else deterministically sort\n\t\t\t\t\tp = peer; // so we will wind up choosing the same to keep\n\t\t\t\t\tpeer = axe.up[p.pid]; // and the same to drop.\n\t\t\t\t}\n\t\t\t\tp.url = p.url || peer.url; // copy if not\n\t\t\t\tmesh.bye(peer); // drop\n\t\t\t\taxe.up[p.pid] = p; // update same to be same.\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif(!peer.url){ return }\n\t\t\taxe.up[peer.pid] = peer;\n\t\t\tif(axe.stay){ axe.stay() }\n\t\t};\n\n\t\tmesh.hear['opt'] = function(msg, peer){\n\t\t\tif(msg.ok){ return }\n\t\t\tvar tmp = msg.opt;\n\t\t\tif(!tmp){ return }\n\t\t\ttmp = tmp.peers;\n\t\t\tif(!tmp || 'string' != typeof tmp){ return }\n\t\t\tif(99 <= Object.keys(axe.up).length){ return } // 99 TEMPORARILY UNTIL BENCHMARKED!\n\t\t\tmesh.hi({id: tmp, url: tmp, retry: 9});\n\t\t\tif(peer){ mesh.say({dam: 'opt', ok: 1, '@': msg['#']}, peer) }\n\t\t}\n\n\t\taxe.stay = function(){\n\t\t\tclearTimeout(axe.stay.to);\n\t\t\taxe.stay.to = setTimeout(function(tmp, urls){\n\t\t\t\tif(!(tmp = root.stats && root.stats.stay)){ return }\n\t\t\t\turls = {}; Object.keys(axe.up||'').forEach(function(p){\n\t\t\t\t\tp = (axe.up||'')[p]; if(p.url){ urls[p.url] = {} }\n\t\t\t\t});\n\t\t\t\t(tmp.axe = tmp.axe || {}).up = urls;\n\t\t\t}, 1000 * 9);//1000 * 60);\n\t\t};\n\t\tsetTimeout(function(tmp){\n\t\t\tif(!(tmp = root.stats && root.stats.stay && root.stats.stay.axe)){ return }\n\t\t\tif(!(tmp = tmp.up)){ return }\n\t\t\tif(!(tmp instanceof Array)){ tmp = Object.keys(tmp) }\n\t\t\tsetTimeout.each(tmp||[], function(url){ mesh.hear.opt({opt: {peers: url}}) });\n\t\t},1000);\n\t}());\n\n\t;(function(){ // THIS IS THE MOB MODULE;\n\t\t//return; // WORK IN PROGRESS, TEST FINALIZED, NEED TO MAKE STABLE.\n\t\t/*\n\t\t\tAXE should have a couple of threshold items...\n\t\t\tlet's pretend there is a variable max peers connected\n\t\t\tmob = 10000\n\t\t\tif we get more peers than that...\n\t\t\twe should start sending those peers a remote command\n\t\t\tthat they should connect to this or that other peer\n\t\t\tand then once they (or before they do?) drop them from us.\n\t\t\tsake of the test... gonna set that peer number to 1.\n\t\t\tThe mob threshold might be determined by other factors,\n\t\t\tlike how much RAM or CPU stress we have.\n\t\t*/\n\t\topt.mob = opt.mob || 9900; // should be based on ulimit, some clouds as low as 10K.\n\n\t\t// handle rebalancing a mob of peers:\n\t\troot.on('hi', function(peer){\n\t\t\tthis.to.next(peer);\n\t\t\tif(peer.url){ return } // I am assuming that if we are wanting to make an outbound connection to them, that we don't ever want to drop them unless our actual config settings change.\n\t\t\tvar count = /*Object.keys(opt.peers).length ||*/ mesh.near; // TODO: BUG! This is slow, use .near, but near is buggy right now, fix in DAM.\n\t\t\t//console.log(\"are we mobbed?\", opt.mob, Object.keys(opt.peers).length, mesh.near);\n\t\t\tif(opt.mob >= count){ return } // TODO: Make dynamic based on RAM/CPU also. Or possibly even weird stuff like opt.mob / axe.up length?\n\t\t\tvar peers = {};Object.keys(axe.up).forEach(function(p){ p = axe.up[p]; p.url && (peers[p.url]={}) });\n\t\t\t// TODO: BUG!!! Infinite reconnection loop happens if not enough relays, or if some are missing. For instance, :8766 says to connect to :8767 which then says to connect to :8766. To not DDoS when system overload, figure clever way to tell peers to retry later, that network does not have enough capacity?\n\t\t\tmesh.say({dam: 'mob', mob: count, peers: peers}, peer);\n\t\t\tsetTimeout(function(){ mesh.bye(peer) }, 9); // something with better perf?\n\t\t});\n\t\troot.on('bye', function(peer){\n\t\t\tthis.to.next(peer);\n\t\t});\n\n\t}());\n}\n\n;(function(){\n\tvar from = Array.from;\n\tObject.maps = function(o){\n\t\tif(from && o instanceof Map){ return from(o.keys()) }\n\t\tif(o instanceof Object.Map){ o = o.s }\n\t\treturn Object.keys(o);\n\t}\n\tif(from){ return Object.Map = Map }\n\t(Object.Map = function(){ this.s = {} }).prototype = {set:function(k,v){this.s[k]=v;return this},get:function(k){return this.s[k]},delete:function(k){delete this.s[k]}};\n}());\n",";(function(){\n\n\tvar sT = setTimeout || {}, u;\n if(typeof window !== ''+u){ sT.window = window }\n\tvar AXE = (sT.window||'').AXE || function(){};\n if(AXE.window = sT.window){ AXE.window.AXE = AXE }\n\n\tvar Gun = (AXE.window||'').GUN || require('./gun');\n\t(Gun.AXE = AXE).GUN = AXE.Gun = Gun;\n\n //if(!Gun.window){ try{ require('./lib/axe') }catch(e){} }\n if(!Gun.window){ require('./lib/axe') }\n\n\tGun.on('opt', function(at){ start(at) ; this.to.next(at) }); // make sure to call the \"next\" middleware adapter.\n\n\tfunction start(root){\n\t\tif(root.axe){ return }\n\t\tvar opt = root.opt, peers = opt.peers;\n\t\tif(false === opt.axe){ return }\n\t\tif(!Gun.window){ return } // handled by ^ lib/axe.js\n\t\tvar w = Gun.window, lS = w.localStorage || opt.localStorage || {}, loc = w.location || opt.location || {}, nav = w.navigator || opt.navigator || {};\n\t\tvar axe = root.axe = {}, tmp, id;\n\t\tvar mesh = opt.mesh = opt.mesh || Gun.Mesh(root); // DAM!\n\n\t\ttmp = peers[id = loc.origin + '/gun'] = peers[id] || {};\n\t\ttmp.id = tmp.url = id; tmp.retry = tmp.retry || 0;\n\t\ttmp = peers[id = 'http://localhost:8765/gun'] = peers[id] || {};\n\t\ttmp.id = tmp.url = id; tmp.retry = tmp.retry || 0;\n\t\tGun.log.once(\"AXE\", \"AXE enabled: Trying to find network via (1) local peer (2) last used peers (3) a URL parameter, and last (4) hard coded peers.\");\n\t\tGun.log.once(\"AXEWarn\", \"Warning: AXE is in alpha, use only for testing!\");\n\t\tvar last = lS.peers || ''; if(last){ last += ' ' }\n\t\tlast += ((loc.search||'').split('peers=')[1]||'').split('&')[0];\n\n\t\troot.on('bye', function(peer){\n\t\t\tthis.to.next(peer);\n\t\t\tif(!peer.url){ return } // ignore WebRTC disconnects for now.\n\t\t\tif(!nav.onLine){ peer.retry = 1 }\n\t\t\tif(peer.retry){ return }\n\t\t\tif(axe.fall){ delete axe.fall[peer.url || peer.id] }\n\t\t\t(function next(){\n\t\t\t\tif(!axe.fall){ setTimeout(next, 9); return } // not found yet\n\t\t\t\tvar fall = Object.keys(axe.fall||''), one = fall[(Math.random()*fall.length) >> 0];\n\t\t\t\tif(!fall.length){ lS.peers = ''; one = 'https://gunjs.herokuapp.com/gun' } // out of peers\n\t\t\t\tif(peers[one]){ next(); return } // already choose\n\t\t\t\tmesh.hi(one);\n\t\t\t}());\n\t\t});\n\n\t\troot.on('hi', function(peer){ // TEMPORARY! Try to connect all peers.\n\t\t\tthis.to.next(peer);\n\t\t\tif(!peer.url){ return } // ignore WebRTC disconnects for now.\n\t\t\treturn; // DO NOT COMMIT THIS FEATURE YET! KEEP TESTING NETWORK PERFORMANCE FIRST!\n\t\t\t(function next(){\n\t\t\t\tif(!peer.wire){ return }\n\t\t\t\tif(!axe.fall){ setTimeout(next, 9); return } // not found yet\n\t\t\t\tvar one = (next.fall = next.fall || Object.keys(axe.fall||'')).pop();\n\t\t\t\tif(!one){ return }\n\t\t\t\tsetTimeout(next, 99);\n\t\t\t\tmesh.say({dam: 'opt', opt: {peers: one}}, peer);\n\t\t\t}());\n\t\t});\n\n\t\tfunction found(text){\n\n\t\t\taxe.fall = {};\n\t\t\t((text||'').match(/https?:\\/\\/(www\\.)?[-a-zA-Z0-9@:%._\\+~#=]{1,256}\\.[a-zA-Z0-9()]{1,6}\\b([-a-zA-Z0-9()@:%_\\+.~#?&//=]*)/ig)||[]).forEach(function(url){\n\t\t\t\taxe.fall[url] = {url: url, id: url, retry: 0}; // RETRY\n\t\t\t});\n\t\t\t\n\t\t\treturn;\n\n\t\t\t// TODO: Finish porting below? Maybe not.\n\n\t\t\tObject.keys(last.peers||'').forEach(function(key){\n\t\t\t\ttmp = peers[id = key] = peers[id] || {};\n\t\t\t\ttmp.id = tmp.url = id;\n\t\t\t});\n\t\t\ttmp = peers[id = 'https://guntest.herokuapp.com/gun'] = peers[id] || {};\n\t\t\ttmp.id = tmp.url = id;\n\n\t\t\tvar mesh = opt.mesh = opt.mesh || Gun.Mesh(root); // DAM!\n\t\t\tmesh.way = function(msg){\n\t\t\t\tif(root.$ === msg.$ || (msg._||'').via){\n\t\t\t\t\tmesh.say(msg, opt.peers);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tvar at = (msg.$||'')._;\n\t\t\t\tif(!at){ mesh.say(msg, opt.peers); return }\n\t\t\t\tif(msg.get){\n\t\t\t\t\tif(at.axe){ return } // don't ask for it again!\n\t\t\t\t\tat.axe = {};\n\t\t\t\t}\n\t\t\t\tmesh.say(msg, opt.peers);\n\t\t\t}\n\t\t}\n\n\t\tif(last){ found(last); return }\n\t\ttry{ fetch(((loc.search||'').split('axe=')[1]||'').split('&')[0] || loc.axe || 'https://raw.githubusercontent.com/wiki/amark/gun/volunteer.dht.md').then(function(res){\n\t \treturn res.text()\n\t }).then(function(text){\n\t \tfound(lS.peers = text);\n\t }).catch(function(){\n\t \tfound(); // nothing\n\t })}catch(e){found()}\n\t}\n\n\tvar empty = {}, yes = true;\n try{ if(typeof module != ''+u){ module.exports = AXE } }catch(e){}\n}());","var Gun = (typeof window !== \"undefined\")? window.Gun : require('../gun');\n\nGun.on('create', function(root){\n\tthis.to.next(root);\n\tvar opt = root.opt;\n if(false === opt.multicast){ return }\n if((typeof process !== \"undefined\") && 'false' === ''+(process.env||{}).MULTICAST){ return }\n\t//if(true !== opt.multicast){ return } // disable multicast by default for now.\n\n var udp = opt.multicast = opt.multicast || {};\n udp.address = udp.address || '233.255.255.255';\n udp.pack = udp.pack || 50000; // UDP messages limited to 65KB.\n udp.port = udp.port || 8765;\n\n var noop = function(){}, u;\n var pid = '2'+Math.random().toString().slice(-8);\n var mesh = opt.mesh = opt.mesh || Gun.Mesh(root);\n var dgram;\n\n try{ dgram = require(\"dgram\") }catch(e){ return }\n var socket = dgram.createSocket({type: \"udp4\", reuseAddr: true});\n socket.bind({port: udp.port, exclusive: true}, function(){\n socket.setBroadcast(true);\n socket.setMulticastTTL(128);\n });\n\n socket.on(\"listening\", function(){\n try { socket.addMembership(udp.address) }catch(e){ console.error(e); return; }\n udp.peer = {id: udp.address + ':' + udp.port, wire: socket};\n\n udp.peer.say = function(raw){\n var buf = Buffer.from(raw, 'utf8');\n if(udp.pack <= buf.length){ // message too big!!!\n return;\n }\n socket.send(buf, 0, buf.length, udp.port, udp.address, noop);\n }\n //opt.mesh.hi(udp.peer);\n\n Gun.log.once('multi', 'Multicast on '+udp.peer.id);\n return; // below code only needed for when WebSocket connections desired!\n setInterval(function broadcast(){\n port = port || (opt.web && opt.web.address()||{}).port;\n if(!port){ return }\n udp.peer.say(JSON.stringify({id: opt.pid || (opt.pid = Math.random().toString(36).slice(2)), port: port}));\n }, 1000);\n });\n\n socket.on(\"message\", function(raw, info) { try {\n if(!raw){ return }\n raw = raw.toString('utf8');\n if('2'===raw[0]){ return check(raw, info) }\n opt.mesh.hear(raw, udp.peer);\n\n return; // below code only needed for when WebSocket connections desired!\n var message;\n message = JSON.parse(raw.toString('utf8'));\n\n if(opt.pid === message.id){ return } // ignore self\n\n var url = 'http://' + info.address + ':' + (port || (opt.web && opt.web.address()||{}).port) + '/gun';\n if(root.opt.peers[url]){ return }\n\n //console.log('discovered', url, message, info);\n root.$.opt(url);\n\n } catch(e){\n //console.log('multicast error', e, raw);\n return;\n } });\n\n function say(msg){\n this.to.next(msg);\n if(!udp.peer){ return }\n mesh.say(msg, udp.peer);\n }\n\n function check(id, info){ var tmp;\n if(!udp.peer){ return }\n if(!id){\n id = check.id = check.id || Buffer.from(pid, 'utf8');\n socket.send(id, 0, id.length, udp.port, udp.address, noop);\n return;\n }\n if((tmp = root.stats) && (tmp = tmp.gap) && info){ (tmp.near || (tmp.near = {}))[info.address] = info.port || 1 } // STATS!\n if(check.on || id === pid){ return }\n root.on('out', check.on = say); // TODO: MULTICAST NEEDS TO BE CHECKED FOR NEW CODE SYSTEM!!!!!!!!!! // TODO: This approach seems interferes with other relays, below does not but...\n //opt.mesh.hi(udp.peer); // IS THIS CORRECT?\n }\n\n setInterval(check, 1000 * 1);\n\n});\n","var Gun = (typeof window !== \"undefined\")? window.Gun : require('../gun');\n\nGun.on('opt', function(root){\n\tthis.to.next(root);\n\tif(root.once){ return }\n\tif(typeof process === 'undefined'){ return }\n\tif(typeof require === 'undefined'){ return }\n\tif(false === root.opt.stats){ return }\n\tvar path = require('path') || {};\n\tvar file = root.opt.file ? path.resolve(root.opt.file).split(path.sep).slice(-1)[0] : 'radata';\n\tvar noop = function(){};\n\tvar os = require('os') || {};\n\tvar fs = require('fs') || {};\n\tfs.existsSync = fs.existsSync || path.existsSync;\n\tif(!fs.existsSync){ return }\n\tif(!process){ return }\n\tprocess.uptime = process.uptime || noop;\n\tprocess.cpuUsage = process.cpuUsage || noop;\n\tprocess.memoryUsage = process.memoryUsage || noop;\n\tos.totalmem = os.totalmem || noop;\n\tos.freemem = os.freemem || noop;\n\tos.loadavg = os.loadavg || noop;\n\tos.cpus = os.cpus || noop;\n\tvar S = +new Date, W;\n\tvar obj_ify = function(o){try{o = JSON.parse(o)}catch(e){o={}};return o;}\n\tsetTimeout(function(){\n\t\troot.stats = obj_ify((fs.existsSync(__dirname+'/../stats.'+file) && fs.readFileSync(__dirname+'/../stats.'+file).toString())) || {};\n\t\troot.stats.up = root.stats.up || {};\n\t\troot.stats.up.start = root.stats.up.start || +(new Date);\n\t\troot.stats.up.count = (root.stats.up.count || 0) + 1;\n\t\troot.stats.stay = root.stats.stay || {};\n\t\troot.stats.over = +new Date;\n\t},1);\n\tsetInterval(function(){\n\t\tif(!root.stats){ root.stats = {} }\n\t\tif(W){ return }\n\t\tvar stats = root.stats, tmp;\n\t\tstats.over = -(S - (S = +new Date));\n\t\t(stats.up||{}).time = process.uptime();\n\t\tstats.memory = process.memoryUsage() || {};\n\t\tstats.memory.totalmem = os.totalmem();\n\t\tstats.memory.freemem = os.freemem();\n\t\tstats.cpu = process.cpuUsage() || {};\n\t\tstats.cpu.loadavg = os.loadavg();\n\t\tstats.cpu.stack = (((setTimeout||'').turn||'').s||'').length;\n\t\tstats.peers = {};\n\n\t\tstats.peers.count = console.STAT.peers || Object.keys(root.opt.peers||{}).length; // TODO: .keys( is slow\n\t\tstats.node = {};\n\t\tstats.node.count = Object.keys(root.graph||{}).length; // TODO: .keys( is slow\n\t\tstats.all = all;\n\t\tstats.sites = console.STAT.sites;\n\t\tall = {}; // will this cause missing stats?\n\t\tvar dam = root.opt.mesh;\n\t\tif(dam){\n\t\t\tstats.dam = {'in': {count: dam.hear.c, done: dam.hear.d}, 'out': {count: dam.say.c, done: dam.say.d}};\n\t\t\tdam.hear.c = dam.hear.d = dam.say.c = dam.say.d = 0; // reset\n\t\t\tstats.peers.time = dam.bye.time || 0;\n\t\t}\n\t\tvar rad = root.opt.store; rad = rad && rad.stats;\n\t\tif(rad){\n\t\t\tstats.rad = rad;\n\t\t\troot.opt.store.stats = {get:{time:{}, count:0}, put: {time:{}, count:0}}; // reset\n\t\t}\n\t\tJSON.stringifyAsync(stats, function(err, raw){ if(err){ return } W = true;\n\t\t\tfs.writeFile(__dirname+'/../stats.'+file, raw, function(err){ W = false; err && console.log(console.STAT.err = err); console.STAT && console.STAT(S, +new Date - S, 'stats stash') });\n\t\t});\n\n\t\t//exec(\"top -b -n 1\", function(err, out){ out && fs.writeFile(__dirname+'/../stats.top.'+file, out, noop) }); // was it really seriously actually this?\n\t//}, 1000 * 15);\n\t}, 1000 * 5);\n});\n\nvar exec = require(\"child_process\").exec, noop = function(){};\nrequire('./yson');\n\nvar log = Gun.log, all = {}, max = 1000;\nconsole.STAT = function(a,b,c,d){\n\tif('number' == typeof a && 'number' == typeof b && 'string' == typeof c){\n\t\tvar tmp = (all[c] || (all[c] = []));\n\t\tif(max < tmp.push([a,b])){ all[c] = [] } // reset\n\t\t//return;\n\t}\n\tif(!console.LOG || log.off){ return a }\n\treturn log.apply(Gun, arguments);\n}",";(function(){\n\trequire('./yson');\n\tvar Gun = require('../gun'), u;\n\tGun.serve = require('./serve');\n\t//process.env.GUN_ENV = process.env.GUN_ENV || 'debug';\n\t//console.LOG = {}; // only do this for dev.\n\tGun.on('opt', function(root){\n\t\tif(u === root.opt.super){ root.opt.super = true }\n\t\tif(u === root.opt.faith){ root.opt.faith = true } // HNPERF: This should probably be off, but we're testing performance improvements, please audit.\n\t\troot.opt.log = root.opt.log || Gun.log;\n\t\tthis.to.next(root);\n\t})\n\t//require('../nts');\n\trequire('./store');\n\trequire('./rfs');\n\trequire('./rs3');\n\trequire('./wire');\n\n\ttry{require('../sea');}catch(e){}\n\ttry{require('../axe');}catch(e){}\n\t//require('./file');\n\t//require('./evict');\n\trequire('./multicast');\n\trequire('./stats');\n\tmodule.exports = Gun;\n}());\n","module.exports = require('./lib/server');","// @ts-nocheck\nexport default {\n throttle: (func: Function, limit: number) => {\n let inThrottle: boolean;\n return function() {\n const args = arguments;\n const context = this;\n if (!inThrottle) {\n func.apply(context, args);\n inThrottle = true;\n setTimeout(() => inThrottle = false, limit);\n }\n };\n },\n debounce: (func: Function, limit: number) => {\n let inDebounce: boolean;\n return function() {\n const args = arguments;\n const context = this;\n clearTimeout(inDebounce);\n inDebounce = setTimeout(() => func.apply(context, args), limit);\n };\n },\n sample: (arr: any[]) => arr[Math.floor(Math.random() * arr.length)],\n sampleSize: (arr: any[], size: number) => {\n const shuffled = arr.slice(0);\n let i = arr.length;\n let min = i - size;\n let temp;\n let index;\n while (i-- > min) {\n index = Math.floor((i + 1) * Math.random());\n temp = shuffled[index];\n shuffled[index] = shuffled[i];\n shuffled[i] = temp;\n }\n return shuffled.slice(min);\n },\n defer: (func: Function) => setTimeout(func, 0),\n once: (func: Function) => {\n let called = false;\n return function() {\n if (called) {\n return;\n }\n called = true;\n func.apply(this, arguments);\n };\n },\n omit: (obj: any, keys: string[]) => {\n const newObj = {};\n Object.keys(obj).forEach(key => {\n if (!keys.includes(key)) {\n newObj[key] = obj[key];\n }\n });\n return newObj;\n },\n defaults: (obj: any, defaults: any) => {\n Object.keys(defaults).forEach(key => {\n if (obj[key] === undefined) {\n obj[key] = defaults[key];\n }\n });\n return obj;\n },\n pickBy: (obj: any, predicate: Function) => {\n const newObj = {};\n Object.keys(obj).forEach(key => {\n if (predicate(obj[key])) {\n newObj[key] = obj[key];\n }\n });\n return newObj;\n }\n}","// @ts-nocheck\n/* eslint no-useless-escape: \"off\", camelcase: \"off\" */\n\nimport Gun from 'gun'; // eslint-disable-line no-unused-vars\nimport 'gun/sea';\nimport _ from './lodash';\n\n// eslint-disable-line no-unused-vars\n\nlet isNode = false;\ntry {\n isNode = Object.prototype.toString.call(global.process) === `[object process]`;\n} catch (e) { null; }\n\nconst userAgent = !isNode && navigator && navigator.userAgent && navigator.userAgent.toLowerCase();\nconst isElectron = (userAgent && userAgent.indexOf(' electron/') > -1);\n\nconst isMobile = !isNode && (function() {\n if (isElectron) { return false; }\n let check = false;\n (function(a) {if (/(android|bb\\d+|meego).+mobile|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\\-(n|u)|c55\\/|capi|ccwa|cdm\\-|cell|chtm|cldc|cmd\\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\\-s|devi|dica|dmob|do(c|p)o|ds(12|\\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\\-|_)|g1 u|g560|gene|gf\\-5|g\\-mo|go(\\.w|od)|gr(ad|un)|haie|hcit|hd\\-(m|p|t)|hei\\-|hi(pt|ta)|hp( i|ip)|hs\\-c|ht(c(\\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\\-(20|go|ma)|i230|iac( |\\-|\\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\\/)|klon|kpt |kwc\\-|kyo(c|k)|le(no|xi)|lg( g|\\/(k|l|u)|50|54|\\-[a-w])|libw|lynx|m1\\-w|m3ga|m50\\/|ma(te|ui|xo)|mc(01|21|ca)|m\\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\\-2|po(ck|rt|se)|prox|psio|pt\\-g|qa\\-a|qc(07|12|21|32|60|\\-[2-7]|i\\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\\-|oo|p\\-)|sdk\\/|se(c(\\-|0|1)|47|mc|nd|ri)|sgh\\-|shar|sie(\\-|m)|sk\\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\\-|v\\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\\-|tdg\\-|tel(i|m)|tim\\-|t\\-mo|to(pl|sh)|ts(70|m\\-|m3|m5)|tx\\-9|up(\\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\\-|your|zeto|zte\\-/i.test(a.substr(0, 4))) check = true;})(navigator.userAgent || navigator.vendor || '');\n return check;\n})();\n\nfunction gunAsAnotherUser(gun: any, key: any, f: Function) { // Hacky way to use multiple users with gun\n const gun2 = new Gun({radisk: false, peers: Object.keys(gun._.opt.peers)}); // TODO: copy other options too\n const user = gun2.user();\n user.auth(key);\n setTimeout(() => {\n // @ts-ignore\n const peers = Object.values(gun2.back('opt.peers'));\n peers.forEach(peer => {\n // @ts-ignore\n gun2.on('bye', peer);\n });\n }, 20000);\n return f(user);\n}\n\nfunction gunOnceDefined(node: any) {\n return new Promise(resolve => {\n node.on((val: any, _k: any, _a: any, eve: any) => {\n if (val !== undefined) {\n eve.off();\n resolve(val);\n }\n });\n });\n}\n\nconst animals = [\n 'canidae',\n 'felidae',\n 'cat',\n 'cattle',\n 'dog',\n 'donkey',\n 'goat',\n 'horse',\n 'pig',\n 'rabbit',\n 'aardvark',\n 'aardwolf',\n 'albatross',\n 'alligator',\n 'alpaca',\n 'amphibian',\n 'anaconda',\n 'angelfish',\n 'anglerfish',\n 'ant',\n 'anteater',\n 'antelope',\n 'antlion',\n 'ape',\n 'aphid',\n 'armadillo',\n 'asp',\n 'baboon',\n 'badger',\n 'bandicoot',\n 'barnacle',\n 'barracuda',\n 'basilisk',\n 'bass',\n 'bat',\n 'bear',\n 'beaver',\n 'bedbug',\n 'bee',\n 'beetle',\n 'bird',\n 'bison',\n 'blackbird',\n 'boa',\n 'boar',\n 'bobcat',\n 'bobolink',\n 'bonobo',\n 'booby',\n 'bovid',\n 'bug',\n 'butterfly',\n 'buzzard',\n 'camel',\n 'canid',\n 'capybara',\n 'cardinal',\n 'caribou',\n 'carp',\n 'cat',\n 'catshark',\n 'caterpillar',\n 'catfish',\n 'cattle',\n 'centipede',\n 'cephalopod',\n 'chameleon',\n 'cheetah',\n 'chickadee',\n 'chicken',\n 'chimpanzee',\n 'chinchilla',\n 'chipmunk',\n 'clam',\n 'clownfish',\n 'cobra',\n 'cockroach',\n 'cod',\n 'condor',\n 'constrictor',\n 'coral',\n 'cougar',\n 'cow',\n 'coyote',\n 'crab',\n 'crane',\n 'crawdad',\n 'crayfish',\n 'cricket',\n 'crocodile',\n 'crow',\n 'cuckoo',\n 'cicada',\n 'damselfly',\n 'deer',\n 'dingo',\n 'dinosaur',\n 'dog',\n 'dolphin',\n 'donkey',\n 'dormouse',\n 'dove',\n 'dragonfly',\n 'dragon',\n 'duck',\n 'eagle',\n 'earthworm',\n 'earwig',\n 'echidna',\n 'eel',\n 'egret',\n 'elephant',\n 'elk',\n 'emu',\n 'ermine',\n 'falcon',\n 'ferret',\n 'finch',\n 'firefly',\n 'fish',\n 'flamingo',\n 'flea',\n 'fly',\n 'flyingfish',\n 'fowl',\n 'fox',\n 'frog',\n 'gamefowl',\n 'galliform',\n 'gazelle',\n 'gecko',\n 'gerbil',\n 'gibbon',\n 'giraffe',\n 'goat',\n 'goldfish',\n 'goose',\n 'gopher',\n 'gorilla',\n 'grasshopper',\n 'grouse',\n 'guan',\n 'guanaco',\n 'guineafowl',\n 'gull',\n 'guppy',\n 'haddock',\n 'halibut',\n 'hamster',\n 'hare',\n 'harrier',\n 'hawk',\n 'hedgehog',\n 'heron',\n 'herring',\n 'hippopotamus',\n 'hookworm',\n 'hornet',\n 'horse',\n 'hoverfly',\n 'hummingbird',\n 'hyena',\n 'iguana',\n 'impala',\n 'jackal',\n 'jaguar',\n 'jay',\n 'jellyfish',\n 'junglefowl',\n 'kangaroo',\n 'kingfisher',\n 'kite',\n 'kiwi',\n 'koala',\n 'koi',\n 'krill',\n 'ladybug',\n 'lamprey',\n 'landfowl',\n 'lark',\n 'leech',\n 'lemming',\n 'lemur',\n 'leopard',\n 'leopon',\n 'limpet',\n 'lion',\n 'lizard',\n 'llama',\n 'lobster',\n 'locust',\n 'loon',\n 'louse',\n 'lungfish',\n 'lynx',\n 'macaw',\n 'mackerel',\n 'magpie',\n 'mammal',\n 'manatee',\n 'mandrill',\n 'marlin',\n 'marmoset',\n 'marmot',\n 'marsupial',\n 'marten',\n 'mastodon',\n 'meadowlark',\n 'meerkat',\n 'mink',\n 'minnow',\n 'mite',\n 'mockingbird',\n 'mole',\n 'mollusk',\n 'mongoose',\n 'monkey',\n 'moose',\n 'mosquito',\n 'moth',\n 'mouse',\n 'mule',\n 'muskox',\n 'narwhal',\n 'newt',\n 'nightingale',\n 'ocelot',\n 'octopus',\n 'opossum',\n 'orangutan',\n 'orca',\n 'ostrich',\n 'otter',\n 'owl',\n 'ox',\n 'panda',\n 'panther',\n 'parakeet',\n 'parrot',\n 'parrotfish',\n 'partridge',\n 'peacock',\n 'peafowl',\n 'pelican',\n 'penguin',\n 'perch',\n 'pheasant',\n 'pig',\n 'pigeon',\n 'pike',\n 'pinniped',\n 'piranha',\n 'planarian',\n 'platypus',\n 'pony',\n 'porcupine',\n 'porpoise',\n 'possum',\n 'prawn',\n 'primate',\n 'ptarmigan',\n 'puffin',\n 'puma',\n 'python',\n 'quail',\n 'quelea',\n 'quokka',\n 'rabbit',\n 'raccoon',\n 'rat',\n 'rattlesnake',\n 'raven',\n 'reindeer',\n 'reptile',\n 'rhinoceros',\n 'roadrunner',\n 'rodent',\n 'rook',\n 'rooster',\n 'roundworm',\n 'sailfish',\n 'salamander',\n 'salmon',\n 'sawfish',\n 'scallop',\n 'scorpion',\n 'seahorse',\n 'shark',\n 'sheep',\n 'shrew',\n 'shrimp',\n 'silkworm',\n 'silverfish',\n 'skink',\n 'skunk',\n 'sloth',\n 'slug',\n 'smelt',\n 'snail',\n 'snake',\n 'snipe',\n 'sole',\n 'sparrow',\n 'spider',\n 'spoonbill',\n 'squid',\n 'squirrel',\n 'starfish',\n 'stingray',\n 'stoat',\n 'stork',\n 'sturgeon',\n 'swallow',\n 'swan',\n 'swift',\n 'swordfish',\n 'swordtail',\n 'tahr',\n 'takin',\n 'tapir',\n 'tarantula',\n 'tarsier',\n 'termite',\n 'tern',\n 'thrush',\n 'tick',\n 'tiger',\n 'tiglon',\n 'toad',\n 'tortoise',\n 'toucan',\n 'trout',\n 'tuna',\n 'turkey',\n 'turtle',\n 'tyrannosaurus',\n 'urial',\n 'vicuna',\n 'viper',\n 'vole',\n 'vulture',\n 'wallaby',\n 'walrus',\n 'wasp',\n 'warbler',\n 'weasel',\n 'whale',\n 'whippet',\n 'whitefish',\n 'wildcat',\n 'wildebeest',\n 'wildfowl',\n 'wolf',\n 'wolverine',\n 'wombat',\n 'woodpecker',\n 'worm',\n 'wren',\n 'xerinae',\n 'yak',\n 'zebra',\n 'alpaca',\n 'cat',\n 'cattle',\n 'chicken',\n 'dog',\n 'donkey',\n 'ferret',\n 'gayal',\n 'goldfish',\n 'guppy',\n 'horse',\n 'koi',\n 'llama',\n 'sheep',\n 'yak',\n 'unicorn',\n];\n\nconst adjectives = [\n 'average',\n 'big',\n 'colossal',\n 'fat',\n 'giant',\n 'gigantic',\n 'great',\n 'huge',\n 'immense',\n 'large',\n 'little',\n 'long',\n 'mammoth',\n 'massive',\n 'miniature',\n 'petite',\n 'puny',\n 'short',\n 'small',\n 'tall',\n 'tiny',\n 'boiling',\n 'breezy',\n 'broken',\n 'bumpy',\n 'chilly',\n 'cold',\n 'cool',\n 'creepy',\n 'crooked',\n 'cuddly',\n 'curly',\n 'damaged',\n 'damp',\n 'dirty',\n 'dry',\n 'dusty',\n 'filthy',\n 'flaky',\n 'fluffy',\n 'wet',\n 'broad',\n 'chubby',\n 'crooked',\n 'curved',\n 'deep',\n 'flat',\n 'high',\n 'hollow',\n 'low',\n 'narrow',\n 'round',\n 'shallow',\n 'skinny',\n 'square',\n 'steep',\n 'straight',\n 'wide',\n 'ancient',\n 'brief',\n 'early',\n 'fast',\n 'late',\n 'long',\n 'modern',\n 'old',\n 'quick',\n 'rapid',\n 'short',\n 'slow',\n 'swift',\n 'young',\n 'abundant',\n 'empty',\n 'few',\n 'heavy',\n 'light',\n 'many',\n 'numerous',\n 'Sound',\n 'cooing',\n 'deafening',\n 'faint',\n 'harsh',\n 'hissing',\n 'hushed',\n 'husky',\n 'loud',\n 'melodic',\n 'moaning',\n 'mute',\n 'noisy',\n 'purring',\n 'quiet',\n 'raspy',\n 'resonant',\n 'screeching',\n 'shrill',\n 'silent',\n 'soft',\n 'squealing',\n 'thundering',\n 'voiceless',\n 'whispering',\n 'bitter',\n 'delicious',\n 'fresh',\n 'juicy',\n 'ripe',\n 'rotten',\n 'salty',\n 'sour',\n 'spicy',\n 'stale',\n 'sticky',\n 'strong',\n 'sweet',\n 'tasteless',\n 'tasty',\n 'thirsty',\n 'fluttering',\n 'fuzzy',\n 'greasy',\n 'grubby',\n 'hard',\n 'hot',\n 'icy',\n 'loose',\n 'melted',\n 'plastic',\n 'prickly',\n 'rainy',\n 'rough',\n 'scattered',\n 'shaggy',\n 'shaky',\n 'sharp',\n 'shivering',\n 'silky',\n 'slimy',\n 'slippery',\n 'smooth',\n 'soft',\n 'solid',\n 'steady',\n 'sticky',\n 'tender',\n 'tight',\n 'uneven',\n 'weak',\n 'wet',\n 'wooden',\n 'afraid',\n 'angry',\n 'annoyed',\n 'anxious',\n 'arrogant',\n 'ashamed',\n 'awful',\n 'bad',\n 'bewildered',\n 'bored',\n 'combative',\n 'condemned',\n 'confused',\n 'creepy',\n 'cruel',\n 'dangerous',\n 'defeated',\n 'defiant',\n 'depressed',\n 'disgusted',\n 'disturbed',\n 'eerie',\n 'embarrassed',\n 'envious',\n 'evil',\n 'fierce',\n 'foolish',\n 'frantic',\n 'frightened',\n 'grieving',\n 'helpless',\n 'homeless',\n 'hungry',\n 'hurt',\n 'ill',\n 'jealous',\n 'lonely',\n 'mysterious',\n 'naughty',\n 'nervous',\n 'obnoxious',\n 'outrageous',\n 'panicky',\n 'repulsive',\n 'scary',\n 'scornful',\n 'selfish',\n 'sore',\n 'tense',\n 'terrible',\n 'thoughtless',\n 'tired',\n 'troubled',\n 'upset',\n 'uptight',\n 'weary',\n 'wicked',\n 'worried',\n 'agreeable',\n 'amused',\n 'brave',\n 'calm',\n 'charming',\n 'cheerful',\n 'comfortable',\n 'cooperative',\n 'courageous',\n 'delightful',\n 'determined',\n 'eager',\n 'elated',\n 'enchanting',\n 'encouraging',\n 'energetic',\n 'enthusiastic',\n 'excited',\n 'exuberant',\n 'fair',\n 'faithful',\n 'fantastic',\n 'fine',\n 'friendly',\n 'funny',\n 'gentle',\n 'glorious',\n 'good',\n 'happy',\n 'healthy',\n 'helpful',\n 'hilarious',\n 'jolly',\n 'joyous',\n 'kind',\n 'lively',\n 'lovely',\n 'lucky',\n 'obedient',\n 'perfect',\n 'pleasant',\n 'proud',\n 'relieved',\n 'silly',\n 'smiling',\n 'splendid',\n 'successful',\n 'thoughtful',\n 'victorious',\n 'vivacious',\n 'witty',\n 'wonderful',\n 'zealous',\n 'zany',\n 'other',\n 'good',\n 'new',\n 'old',\n 'great',\n 'high',\n 'small',\n 'different',\n 'large',\n 'local',\n 'social',\n 'important',\n 'long',\n 'young',\n 'national',\n 'british',\n 'right',\n 'early',\n 'possible',\n 'big',\n 'little',\n 'political',\n 'able',\n 'late',\n 'general',\n 'full',\n 'far',\n 'low',\n 'public',\n 'available',\n 'bad',\n 'main',\n 'sure',\n 'clear',\n 'major',\n 'economic',\n 'only',\n 'likely',\n 'real',\n 'black',\n 'particular',\n 'international',\n 'special',\n 'difficult',\n 'certain',\n 'open',\n 'whole',\n 'white',\n 'free',\n 'short',\n 'easy',\n 'strong',\n 'european',\n 'central',\n 'similar',\n 'human',\n 'common',\n 'necessary',\n 'single',\n 'personal',\n 'hard',\n 'private',\n 'poor',\n 'financial',\n 'wide',\n 'foreign',\n 'simple',\n 'recent',\n 'concerned',\n 'american',\n 'various',\n 'close',\n 'fine',\n 'english',\n 'wrong',\n 'present',\n 'royal',\n 'natural',\n 'individual',\n 'nice',\n 'french',\n 'nihilist',\n 'solipsist',\n 'materialist',\n 'surrealist',\n 'heroic',\n 'awesome',\n 'hedonist',\n 'absurd',\n 'current',\n 'modern',\n 'labour',\n 'legal',\n 'happy',\n 'final',\n 'red',\n 'normal',\n 'serious',\n 'previous',\n 'total',\n 'prime',\n 'significant',\n 'industrial',\n 'sorry',\n 'dead',\n 'specific',\n 'appropriate',\n 'top',\n 'soviet',\n 'basic',\n 'military',\n 'original',\n 'successful',\n 'aware',\n 'hon',\n 'popular',\n 'heavy',\n 'professional',\n 'direct',\n 'dark',\n 'cold',\n 'ready',\n 'green',\n 'useful',\n 'effective',\n 'western',\n 'traditional',\n 'scottish',\n 'german',\n 'independent',\n 'deep',\n 'interesting',\n 'considerable',\n 'involved',\n 'physical',\n 'hot',\n 'existing',\n 'responsible',\n 'complete',\n 'medical',\n 'blue',\n 'extra',\n 'past',\n 'male',\n 'interested',\n 'fair',\n 'essential',\n 'beautiful',\n 'civil',\n 'primary',\n 'obvious',\n 'future',\n 'environmental',\n 'positive',\n 'senior',\n 'nuclear',\n 'annual',\n 'relevant',\n 'huge',\n 'rich',\n 'commercial',\n 'safe',\n 'regional',\n 'practical',\n 'official',\n 'separate',\n 'key',\n 'chief',\n 'regular',\n 'due',\n 'additional',\n 'active',\n 'powerful',\n 'complex',\n 'standard',\n 'impossible',\n 'light',\n 'warm',\n 'middle',\n 'fresh',\n 'sexual',\n 'front',\n 'domestic',\n 'actual',\n 'united',\n 'technical',\n 'ordinary',\n 'cheap',\n 'strange',\n 'internal',\n 'excellent',\n 'quiet',\n 'soft',\n 'potential',\n 'northern',\n 'religious',\n 'quick',\n 'very',\n 'famous',\n 'cultural',\n 'proper',\n 'broad',\n 'joint',\n 'formal',\n 'limited',\n 'conservative',\n 'lovely',\n 'usual',\n 'ltd',\n 'unable',\n 'rural',\n 'initial',\n 'substantial',\n 'bright',\n 'average',\n 'leading',\n 'reasonable',\n 'immediate',\n 'suitable',\n 'equal',\n 'detailed',\n 'working',\n 'overall',\n 'female',\n 'afraid',\n 'democratic',\n 'growing',\n 'sufficient',\n 'scientific',\n 'eastern',\n 'correct',\n 'inc',\n 'irish',\n 'expensive',\n 'educational',\n 'mental',\n 'dangerous',\n 'critical',\n 'increased',\n 'familiar',\n 'unlikely',\n 'double',\n 'perfect',\n 'slow',\n 'tiny',\n 'dry',\n 'historical',\n 'thin',\n 'daily',\n 'southern',\n 'increasing',\n 'wild',\n 'alone',\n 'urban',\n 'empty',\n 'married',\n 'narrow',\n 'liberal',\n 'supposed',\n 'upper',\n 'apparent',\n 'tall',\n 'busy',\n 'bloody',\n 'prepared',\n 'russian',\n 'moral',\n 'careful',\n 'clean',\n 'attractive',\n 'japanese',\n 'vital',\n 'thick',\n 'alternative',\n 'fast',\n 'ancient',\n 'elderly',\n 'rare',\n 'external',\n 'capable',\n 'brief',\n 'wonderful',\n 'grand',\n 'typical',\n 'entire',\n 'grey',\n 'constant',\n 'vast',\n 'surprised',\n 'ideal',\n 'terrible',\n 'academic',\n 'funny',\n 'minor',\n 'pleased',\n 'severe',\n 'ill',\n 'corporate',\n 'negative',\n 'permanent',\n 'weak',\n 'brown',\n 'fundamental',\n 'odd',\n 'crucial',\n 'inner',\n 'used',\n 'criminal',\n 'contemporary',\n 'sharp',\n 'sick',\n 'near',\n 'roman',\n 'massive',\n 'unique',\n 'secondary',\n 'parliamentary',\n 'african',\n 'unknown',\n 'subsequent',\n 'angry',\n 'alive',\n 'guilty',\n 'lucky',\n 'enormous',\n 'well',\n 'yellow',\n 'unusual',\n 'net',\n 'tough',\n 'dear',\n 'extensive',\n 'glad',\n 'remaining',\n 'agricultural',\n 'alright',\n 'healthy',\n 'italian',\n 'principal',\n 'tired',\n 'efficient',\n 'comfortable',\n 'chinese',\n 'relative',\n 'friendly',\n 'conventional',\n 'willing',\n 'sudden',\n 'proposed',\n 'voluntary',\n 'slight',\n 'valuable',\n 'dramatic',\n 'golden',\n 'temporary',\n 'federal',\n 'keen',\n 'flat',\n 'silent',\n 'indian',\n 'worried',\n 'pale',\n 'statutory',\n 'welsh',\n 'dependent',\n 'firm',\n 'wet',\n 'competitive',\n 'armed',\n 'radical',\n 'outside',\n 'acceptable',\n 'sensitive',\n 'living',\n 'pure',\n 'global',\n 'emotional',\n 'sad',\n 'secret',\n 'rapid',\n 'adequate',\n 'fixed',\n 'sweet',\n 'administrative',\n 'wooden',\n 'remarkable',\n 'comprehensive',\n 'surprising',\n 'solid',\n 'rough',\n 'mere',\n 'mass',\n 'brilliant',\n 'maximum',\n 'absolute',\n 'electronic',\n 'visual',\n 'electric',\n 'cool',\n 'spanish',\n 'literary',\n 'continuing',\n 'supreme',\n 'chemical',\n 'genuine',\n 'exciting',\n 'written',\n 'advanced',\n 'extreme',\n 'classical',\n 'fit',\n 'favourite',\n 'widespread',\n 'confident',\n 'straight',\n 'proud',\n 'numerous',\n 'opposite',\n 'distinct',\n 'mad',\n 'helpful',\n 'given',\n 'disabled',\n 'consistent',\n 'anxious',\n 'nervous',\n 'awful',\n 'stable',\n 'constitutional',\n 'satisfied',\n 'conscious',\n 'developing',\n 'strategic',\n 'holy',\n 'smooth',\n 'dominant',\n 'remote',\n 'theoretical',\n 'outstanding',\n 'pink',\n 'pretty',\n 'clinical',\n 'minimum',\n 'honest',\n 'impressive',\n 'related',\n 'residential',\n 'extraordinary',\n 'plain',\n 'visible',\n 'accurate',\n 'distant',\n 'still',\n 'greek',\n 'complicated',\n 'musical',\n 'precise',\n 'gentle',\n 'broken',\n 'live',\n 'silly',\n 'fat',\n 'tight',\n 'monetary',\n 'round',\n 'psychological',\n 'violent',\n 'unemployed',\n 'inevitable',\n 'junior',\n 'sensible',\n 'grateful',\n 'pleasant',\n 'dirty',\n 'structural',\n 'welcome',\n 'deaf',\n 'above',\n 'continuous',\n 'blind',\n 'overseas',\n 'mean',\n 'entitled',\n 'delighted',\n 'loose',\n 'occasional',\n 'evident',\n 'desperate',\n 'fellow',\n 'universal',\n 'square',\n 'steady',\n 'classic',\n 'equivalent',\n 'intellectual',\n 'victorian',\n 'level',\n 'ultimate',\n 'creative',\n 'lost',\n 'medieval',\n 'clever',\n 'linguistic',\n 'convinced',\n 'judicial',\n 'raw',\n 'sophisticated',\n 'asleep',\n 'vulnerable',\n 'illegal',\n 'outer',\n 'revolutionary',\n 'bitter',\n 'changing',\n 'australian',\n 'native',\n 'imperial',\n 'strict',\n 'wise',\n 'informal',\n 'flexible',\n 'collective',\n 'frequent',\n 'experimental',\n 'spiritual',\n 'intense',\n 'rational',\n 'generous',\n 'inadequate',\n 'prominent',\n 'logical',\n 'bare',\n 'historic',\n 'modest',\n 'dutch',\n 'acute',\n 'electrical',\n 'valid',\n 'weekly',\n 'gross',\n 'automatic',\n 'loud',\n 'reliable',\n 'mutual',\n 'liable',\n 'multiple',\n 'ruling',\n 'curious',\n 'sole',\n 'managing',\n 'pregnant',\n 'latin',\n 'nearby',\n 'exact',\n 'underlying',\n 'identical',\n 'satisfactory',\n 'marginal',\n 'distinctive',\n 'electoral',\n 'urgent',\n 'presidential',\n 'controversial',\n 'everyday',\n 'encouraging',\n 'organic',\n 'continued',\n 'expected',\n 'statistical',\n 'desirable',\n 'innocent',\n 'improved',\n 'exclusive',\n 'marked',\n 'experienced',\n 'unexpected',\n 'superb',\n 'sheer',\n 'disappointed',\n 'frightened',\n 'gastric',\n 'romantic',\n 'naked',\n 'reluctant',\n 'magnificent',\n 'convenient',\n 'established',\n 'closed',\n 'uncertain',\n 'artificial',\n 'diplomatic',\n 'tremendous',\n 'marine',\n 'mechanical',\n 'retail',\n 'institutional',\n 'mixed',\n 'required',\n 'biological',\n 'known',\n 'functional',\n 'straightforward',\n 'superior',\n 'digital',\n 'spectacular',\n 'unhappy',\n 'confused',\n 'unfair',\n 'aggressive',\n 'spare',\n 'painful',\n 'abstract',\n 'asian',\n 'associated',\n 'legislative',\n 'monthly',\n 'intelligent',\n 'hungry',\n 'explicit',\n 'nasty',\n 'just',\n 'faint',\n 'coloured',\n 'ridiculous',\n 'amazing',\n 'comparable',\n 'successive',\n 'realistic',\n 'back',\n 'decent',\n 'decentralized',\n 'bitcoin',\n 'cypherpunk',\n 'unnecessary',\n 'flying',\n 'random',\n 'influential',\n 'dull',\n 'genetic',\n 'neat',\n 'marvellous',\n 'crazy',\n 'damp',\n 'giant',\n 'secure',\n 'bottom',\n 'skilled',\n 'subtle',\n 'elegant',\n 'brave',\n 'lesser',\n 'parallel',\n 'steep',\n 'intensive',\n 'casual',\n 'tropical',\n 'lonely',\n 'partial',\n 'preliminary',\n 'concrete',\n 'alleged',\n 'assistant',\n 'vertical',\n 'upset',\n 'delicate',\n 'mild',\n 'occupational',\n 'excessive',\n 'progressive',\n 'exceptional',\n 'integrated',\n 'striking',\n 'continental',\n 'okay',\n 'harsh',\n 'combined',\n 'fierce',\n 'handsome',\n 'characteristic',\n 'chronic',\n 'compulsory',\n 'interim',\n 'objective',\n 'splendid',\n 'magic',\n 'systematic',\n 'obliged',\n 'payable',\n 'fun',\n 'horrible',\n 'primitive',\n 'fascinating',\n 'ideological',\n 'metropolitan',\n 'surrounding',\n 'estimated',\n 'peaceful',\n 'premier',\n 'operational',\n 'technological',\n 'kind',\n 'advisory',\n 'hostile',\n 'precious',\n 'accessible',\n 'determined',\n 'excited',\n 'impressed',\n 'provincial',\n 'smart',\n 'endless',\n 'isolated',\n 'drunk',\n 'geographical',\n 'like',\n 'dynamic',\n 'boring',\n 'forthcoming',\n 'unfortunate',\n 'definite',\n 'super',\n 'notable',\n 'indirect',\n 'stiff',\n 'wealthy',\n 'awkward',\n 'lively',\n 'neutral',\n 'artistic',\n 'content',\n 'mature',\n 'colonial',\n 'ambitious',\n 'evil',\n 'magnetic',\n 'verbal',\n 'legitimate',\n 'sympathetic',\n 'empirical',\n 'head',\n 'shallow',\n 'vague',\n 'naval',\n 'depressed',\n 'shared',\n 'added',\n 'shocked',\n 'mid',\n 'worthwhile',\n 'qualified',\n 'missing',\n 'blank',\n 'absent',\n 'favourable',\n 'polish',\n 'israeli',\n 'developed',\n 'profound',\n 'representative',\n 'enthusiastic',\n 'dreadful',\n 'rigid',\n 'reduced',\n 'cruel',\n 'coastal',\n 'peculiar',\n 'swiss',\n 'crude',\n 'extended',\n 'selected',\n 'eager',\n 'canadian',\n 'bold',\n 'relaxed',\n 'corresponding',\n 'running',\n 'planned',\n 'applicable',\n 'immense',\n 'allied',\n 'comparative',\n 'uncomfortable',\n 'conservation',\n 'productive',\n 'beneficial',\n 'bored',\n 'charming',\n 'minimal',\n 'mobile',\n 'turkish',\n 'orange',\n 'rear',\n 'passive',\n 'suspicious',\n 'overwhelming',\n 'fatal',\n 'resulting',\n 'symbolic',\n 'registered',\n 'neighbouring',\n 'calm',\n 'irrelevant',\n 'patient',\n 'compact',\n 'profitable',\n 'rival',\n 'loyal',\n 'moderate',\n 'distinguished',\n 'interior',\n 'noble',\n 'insufficient',\n 'eligible',\n 'mysterious',\n 'varying',\n 'managerial',\n 'molecular',\n 'olympic',\n 'linear',\n 'prospective',\n 'printed',\n 'parental',\n 'diverse',\n 'elaborate',\n 'furious',\n 'fiscal',\n 'burning',\n 'useless',\n 'semantic',\n 'embarrassed',\n 'inherent',\n 'philosophical',\n 'deliberate',\n 'awake',\n 'variable',\n 'promising',\n 'unpleasant',\n 'varied',\n 'sacred',\n 'selective',\n 'inclined',\n 'tender',\n 'hidden',\n 'worthy',\n 'intermediate',\n 'sound',\n 'protective',\n 'fortunate',\n 'slim',\n 'defensive',\n 'divine',\n 'stuck',\n 'driving',\n 'invisible',\n 'misleading',\n 'circular',\n 'mathematical',\n 'inappropriate',\n 'liquid',\n 'persistent',\n 'solar',\n 'doubtful',\n 'manual',\n 'architectural',\n 'intact',\n 'incredible',\n 'devoted',\n 'prior',\n 'tragic',\n 'respectable',\n 'optimistic',\n 'convincing',\n 'unacceptable',\n 'decisive',\n 'competent',\n 'spatial',\n 'respective',\n 'binding',\n 'relieved',\n 'nursing',\n 'toxic',\n 'select',\n 'redundant',\n 'integral',\n 'then',\n 'probable',\n 'amateur',\n 'fond',\n 'passing',\n 'specified',\n 'territorial',\n 'horizontal',\n 'inland',\n 'cognitive',\n 'regulatory',\n 'miserable',\n 'resident',\n 'polite',\n 'scared',\n 'gothic',\n 'civilian',\n 'instant',\n 'lengthy',\n 'adverse',\n 'korean',\n 'unconscious',\n 'anonymous',\n 'aesthetic',\n 'orthodox',\n 'static',\n 'unaware',\n 'costly',\n 'fantastic',\n 'foolish',\n 'fashionable',\n 'causal',\n 'compatible',\n 'wee',\n 'implicit',\n 'dual',\n 'ok',\n 'cheerful',\n 'subjective',\n 'forward',\n 'surviving',\n 'exotic',\n 'purple',\n 'cautious',\n 'visiting',\n 'aggregate',\n 'ethical',\n 'teenage',\n 'dying',\n 'disastrous',\n 'delicious',\n 'confidential',\n 'underground',\n 'thorough',\n 'grim',\n 'autonomous',\n 'atomic',\n 'frozen',\n 'colourful',\n 'injured',\n 'uniform',\n 'ashamed',\n 'glorious',\n 'wicked',\n 'coherent',\n 'rising',\n 'shy',\n 'novel',\n 'balanced',\n 'delightful',\n 'arbitrary',\n 'adjacent',\n 'worrying',\n 'weird',\n 'unchanged',\n 'rolling',\n 'evolutionary',\n 'intimate',\n 'sporting',\n 'disciplinary',\n 'formidable',\n 'lexical',\n 'noisy',\n 'gradual',\n 'accused',\n 'homeless',\n 'supporting',\n 'coming',\n 'renewed',\n 'excess',\n 'retired',\n 'rubber',\n 'chosen',\n 'outdoor',\n 'embarrassing',\n 'preferred',\n 'bizarre',\n 'appalling',\n 'agreed',\n 'imaginative',\n 'governing',\n 'accepted',\n 'vocational',\n 'mighty',\n 'puzzled',\n 'worldwide',\n 'organisational',\n 'sunny',\n 'eldest',\n 'eventual',\n 'spontaneous',\n 'vivid',\n 'rude',\n 'faithful',\n 'ministerial',\n 'innovative',\n 'controlled',\n 'conceptual',\n 'unwilling',\n 'civic',\n 'meaningful',\n 'alive',\n 'brainy',\n 'breakable',\n 'busy',\n 'careful',\n 'cautious',\n 'clever',\n 'concerned',\n 'crazy',\n 'curious',\n 'dead',\n 'different',\n 'difficult',\n 'doubtful',\n 'easy',\n 'famous',\n 'fragile',\n 'helpful',\n 'helpless',\n 'important',\n 'impossible',\n 'innocent',\n 'inquisitive',\n 'modern',\n 'open',\n 'outstanding',\n 'poor',\n 'powerful',\n 'puzzled',\n 'real',\n 'rich',\n 'shy',\n 'sleepy',\n 'super',\n 'tame',\n 'uninterested',\n 'wandering',\n 'wild',\n 'wrong',\n 'adorable',\n 'alert',\n 'average',\n 'beautiful',\n 'blonde',\n 'bloody',\n 'blushing',\n 'bright',\n 'clean',\n 'clear',\n 'cloudy',\n 'colorful',\n 'crowded',\n 'cute',\n 'dark',\n 'drab',\n 'distinct',\n 'dull',\n 'elegant',\n 'fancy',\n 'filthy',\n 'glamorous',\n 'gleaming',\n 'graceful',\n 'grotesque',\n 'homely',\n 'light',\n 'misty',\n 'motionless',\n 'muddy',\n 'plain',\n 'poised',\n 'quaint',\n 'shiny',\n 'smoggy',\n 'sparkling',\n 'spotless',\n 'stormy',\n 'strange',\n 'ugly',\n 'unsightly',\n 'unusual',\n 'bad',\n 'better',\n 'beautiful',\n 'big',\n 'black',\n 'blue',\n 'bright',\n 'clumsy',\n 'crazy',\n 'dizzy',\n 'dull',\n 'fat',\n 'frail',\n 'friendly',\n 'funny',\n 'great',\n 'green',\n 'gigantic',\n 'gorgeous',\n 'grumpy',\n 'handsome',\n 'happy',\n 'horrible',\n 'itchy',\n 'jittery',\n 'jolly',\n 'kind',\n 'long',\n 'lazy',\n 'magnificent',\n 'magenta',\n 'many',\n 'mighty',\n 'mushy',\n 'nasty',\n 'new',\n 'nice',\n 'nosy',\n 'nutty',\n 'nutritious',\n 'odd',\n 'orange',\n 'ordinary',\n 'pretty',\n 'precious',\n 'prickly',\n 'purple',\n 'quaint',\n 'quiet',\n 'quick',\n 'quickest',\n 'rainy',\n 'rare',\n 'ratty',\n 'red',\n 'roasted',\n 'robust',\n 'round',\n 'sad',\n 'scary',\n 'scrawny',\n 'short',\n 'silly',\n 'stingy',\n 'strange',\n 'striped',\n 'spotty',\n 'tart',\n 'tall',\n 'tame',\n 'tan',\n 'tender',\n 'testy',\n 'tricky',\n 'tough',\n 'ugly',\n 'ugliest',\n 'vast',\n 'watery',\n 'wasteful',\n 'wonderful',\n 'yellow',\n 'yummy',\n 'zany',\n];\n\nexport default {\n gunOnceDefined,\n gunAsAnotherUser,\n async getHash (str: string, format = `base64`) {\n if (!str) {\n return undefined;\n }\n const hash = await Gun.SEA.work(str, undefined, undefined, {name: `SHA-256`});\n if (!hash) {\n throw new Error(`Gun.SEA.work failed for ${str}`);\n }\n if (hash.length > 44) {\n throw new Error(`Gun.SEA.work returned an invalid SHA-256 hash longer than 44 chars: ${hash}. This is probably due to a sea.js bug on Safari.`);\n }\n if (format === `hex`) {\n return this.base64ToHex(hash);\n }\n return hash;\n },\n\n capitalize(s: string) {\n return s.charAt(0).toUpperCase() + s.slice(1)\n },\n\n generateName() {\n return `${this.capitalize(_.sample(adjectives)!)} ${this.capitalize(_.sample(animals)!)}`;\n },\n\n base64ToHex(str: string) {\n const raw = atob(str);\n let result = '';\n for (let i = 0; i < raw.length; i++) {\n const hex = raw.charCodeAt(i).toString(16);\n result += (hex.length === 2 ? hex : `0${ hex}`);\n }\n return result;\n },\n\n getCaret(el: HTMLInputElement) {\n if (el.selectionStart) {\n return el.selectionStart;\n } else { // @ts-ignore\n if (document.selection) {\n el.focus();\n // @ts-ignore\n const r = document.selection.createRange();\n if (r === null) {\n return 0;\n }\n // @ts-ignore\n const re = el.createTextRange(), rc = re.duplicate();\n re.moveToBookmark(r.getBookmark());\n rc.setEndPoint('EndToStart', re);\n return rc.text.length;\n }\n }\n return 0;\n },\n\n injectCss() {\n const elementId = `irisStyle`;\n if (document.getElementById(elementId)) {\n return;\n }\n const sheet = document.createElement(`style`);\n sheet.id = elementId;\n sheet.innerHTML = `\n .iris-follow-button .hover {\n display: none;\n }\n\n .iris-follow-button.following:hover .hover {\n display: inline;\n }\n\n .iris-follow-button.following:hover .nonhover {\n display: none;\n }\n\n .iris-identicon * {\n box-sizing: border-box;\n }\n\n .iris-identicon {\n vertical-align: middle;\n border-radius: 50%;\n text-align: center;\n display: inline-block;\n position: relative;\n max-width: 100%;\n }\n\n .iris-distance {\n z-index: 2;\n position: absolute;\n left:0%;\n top:2px;\n width: 100%;\n text-align: right;\n color: #fff;\n text-shadow: 0 0 1px #000;\n font-size: 75%;\n line-height: 75%;\n font-weight: bold;\n }\n\n .iris-pie {\n border-radius: 50%;\n position: absolute;\n top: 0;\n left: 0;\n box-shadow: 0px 0px 0px 0px #82FF84;\n padding-bottom: 100%;\n max-width: 100%;\n -webkit-transition: all 0.2s ease-in-out;\n -moz-transition: all 0.2s ease-in-out;\n transition: all 0.2s ease-in-out;\n }\n\n .iris-card {\n padding: 10px;\n background-color: #f7f7f7;\n color: #777;\n border: 1px solid #ddd;\n display: flex;\n flex-direction: row;\n overflow: hidden;\n }\n\n .iris-card a {\n -webkit-transition: color 150ms;\n transition: color 150ms;\n text-decoration: none;\n color: #337ab7;\n }\n\n .iris-card a:hover, .iris-card a:active {\n text-decoration: underline;\n color: #23527c;\n }\n\n .iris-pos {\n color: #3c763d;\n }\n\n .iris-neg {\n color: #a94442;\n }\n\n .iris-identicon img {\n position: absolute;\n top: 0;\n left: 0;\n max-width: 100%;\n border-radius: 50%;\n border-color: transparent;\n border-style: solid;\n }\n\n .iris-chat-open-button {\n background-color: #1e1e1e;\n color: #fff;\n padding: 15px;\n cursor: pointer;\n user-select: none;\n }\n\n .iris-chat-open-button svg {\n width: 1em;\n }\n\n .iris-chat-open-button, .iris-chat-box {\n position: fixed;\n bottom: 0.5rem;\n right: 0.5rem;\n border-radius: 8px;\n font-family: system-ui;\n font-size: 15px;\n }\n\n .iris-chat-box {\n background-color: #fff;\n max-height: 25rem;\n box-shadow: 2px 2px 20px rgba(0, 0, 0, 0.2);\n height: calc(100% - 44px);\n display: flex;\n flex-direction: column;\n width: 320px;\n color: rgb(38, 38, 38);\n }\n\n .iris-chat-box.minimized {\n height: auto;\n }\n\n .iris-chat-box.minimized .iris-chat-header {\n border-radius: 8px;\n cursor: pointer;\n }\n\n .iris-chat-box.minimized .iris-chat-messages, .iris-chat-box.minimized .iris-typing-indicator, .iris-chat-box.minimized .iris-chat-input-wrapper, .iris-chat-box.minimized .iris-chat-minimize, .iris-chat-box.minimized .iris-chat-close {\n display: none;\n }\n\n .iris-chat-header {\n background-color: #1e1e1e;\n height: 44px;\n color: #fff;\n border-radius: 8px 8px 0 0;\n text-align: center;\n display: flex;\n flex-direction: row;\n justify-content: center;\n align-items: center;\n flex: none;\n white-space: nowrap;\n text-overflow: ellipsis;\n overflow: hidden;\n }\n\n .iris-chat-header-text {\n flex: 1;\n }\n\n .iris-online-indicator {\n color: #bfbfbf;\n margin-right: 5px;\n font-size: 12px;\n user-select: none;\n flex: none;\n }\n\n .iris-online-indicator.yes {\n color: #80bf5f;\n }\n\n .iris-typing-indicator {\n display: none;\n background-color: rgba(255, 255, 255, 0.5);\n font-size: 12px;\n padding: 2px;\n color: #777;\n }\n\n .iris-typing-indicator.yes {\n display: block;\n }\n\n .iris-chat-messages {\n flex: 1;\n padding: 15px;\n overflow-y: scroll;\n }\n\n .iris-chat-input-wrapper {\n flex: none;\n padding: 15px;\n background-color: #efefef;\n display: flex;\n flex-direction: row;\n border-radius: 0 0 8px 8px;\n }\n\n .iris-chat-input-wrapper textarea {\n padding: 15px 8px;\n border-radius: 4px;\n border: 1px solid rgba(0,0,0,0);\n width: auto;\n font-size: 15px;\n resize: none;\n flex: 1;\n }\n\n .iris-chat-input-wrapper textarea:focus {\n outline: none;\n border: 1px solid #6dd0ed;\n }\n\n .iris-chat-input-wrapper button svg {\n display: inline-block;\n font-size: inherit;\n height: 1em;\n width: 1em;\n overflow: visible;\n vertical-align: -0.125em;\n }\n\n .iris-chat-input-wrapper button, .iris-chat-input-wrapper button:hover, .iris-chat-input-wrapper button:active, .iris-chat-input-wrapper button:focus {\n flex: none;\n color: #999;\n background-color: transparent;\n font-size: 30px;\n padding: 5px;\n border: 1px solid rgba(0,0,0,0);\n border-radius: 4px;\n margin-left: 5px;\n }\n\n .iris-chat-input-wrapper button:active, .iris-chat-input-wrapper button:focus {\n outline: none;\n border: 1px solid #6dd0ed;\n }\n\n .iris-chat-message {\n display: flex;\n flex-direction: column;\n margin-bottom: 2px;\n overflow-wrap: break-word;\n }\n\n .iris-msg-content {\n background-color: #efefef;\n padding: 6px 10px;\n border-radius: 8px;\n box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.1);\n flex: none;\n max-width: 75%;\n }\n\n .emoji {\n font-size: 1.3em;\n line-height: 1em;\n }\n\n .iris-chat-message .emoji-only {\n font-size: 3em;\n text-align: center;\n }\n\n .iris-seen {\n color: rgba(0, 0, 0, 0.45);\n user-select: none;\n }\n\n .iris-seen.yes {\n color: #4fc3f7;\n }\n\n .iris-seen svg {\n width: 18px;\n }\n\n .iris-delivered-checkmark {\n display: none;\n }\n\n .delivered .iris-delivered-checkmark {\n display: initial;\n }\n\n .iris-chat-minimize, .iris-chat-close {\n user-select: none;\n cursor: pointer;\n width: 45px;\n line-height: 44px;\n }\n\n .iris-chat-message.their {\n align-items: flex-start;\n }\n\n .iris-chat-message.their + .iris-chat-message.our .iris-msg-content, .day-separator + .iris-chat-message.our .iris-msg-content {\n margin-top: 15px;\n border-radius: 8px 0px 8px 8px;\n }\n\n .iris-chat-message.their:first-of-type .iris-msg-content {\n border-radius: 0px 8px 8px 8px;\n }\n\n .iris-chat-message.our:first-of-type .iris-msg-content {\n border-radius: 8px 0px 8px 8px;\n }\n\n .iris-chat-message.our + .iris-chat-message.their .iris-msg-content, .day-separator + .iris-chat-message.their .iris-msg-content {\n margin-top: 15px;\n border-radius: 0px 8px 8px 8px;\n }\n\n .iris-chat-message.our {\n align-items: flex-end;\n }\n\n .iris-chat-message.our .iris-msg-content {\n background-color: #c5ecf7;\n }\n\n .iris-chat-message .time {\n text-align: right;\n font-size: 12px;\n color: rgba(0, 0, 0, 0.45);\n }\n\n .iris-non-string {\n color: blue;\n }\n\n .day-separator {\n display: inline-block;\n border-radius: 8px;\n background-color: rgba(227, 249, 255, 0.91);\n padding: 6px 10px;\n margin-top: 15px;\n margin-left: auto;\n margin-right: auto;\n text-transform: uppercase;\n font-size: 13px;\n color: rgba(74, 74, 74, 0.88);\n box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.1);\n user-select: none;\n }\n\n .day-separator:first-of-type {\n margin-top: 0;\n }\n\n *[contenteditable=\"true\"]:not(:focus) {\n cursor: pointer;\n }\n\n *[contenteditable=\"true\"] {\n outline: none;\n }\n\n [placeholder]:empty:before {\n content: attr(placeholder);\n color: #999;\n }\n\n [placeholder]:empty:focus {\n cursor: text;\n }\n `;\n document.head.prepend(sheet);\n },\n\n getUrlParameter(sParam: string, sParams: string) {\n const sPageURL = sParams || window.location.search.substring(1);\n const sURLVariables = sPageURL.split('&');\n let sParameterName, i;\n\n for (i = 0; i < sURLVariables.length; i++) {\n sParameterName = sURLVariables[i].split('=');\n if (sParameterName[0] === sParam) {\n return sParameterName[1] === undefined ? true : decodeURIComponent(sParameterName[1]);\n }\n }\n return;\n },\n\n formatTime(date: Date) {\n // @ts-ignore\n const t: any = date.toLocaleTimeString(undefined, {timeStyle: 'short'});\n const s = t.split(':');\n if (s.length === 3) { // safari tries to display seconds\n return `${s[0] }:${ s[1] }${s[2].slice(2)}`;\n }\n return t;\n },\n\n formatDate(date: Date) {\n const t = date.toLocaleString(undefined, {dateStyle: 'short', timeStyle: 'short'});\n const s = t.split(':');\n if (s.length === 3) { // safari tries to display seconds\n return `${s[0] }:${ s[1] }${s[2].slice(2)}`;\n }\n return t;\n },\n\n getDaySeparatorText(date: Date, dateStr: string, now?: Date, nowStr?: string) {\n if (!now) {\n now = new Date();\n // @ts-ignore\n nowStr = now.toLocaleDateString({dateStyle: 'short'});\n }\n if (dateStr === nowStr) {\n return 'today';\n }\n const dayDifference = Math.round((now - date) / (1000 * 60 * 60 * 24));\n if (dayDifference === 0) {\n return 'today';\n }\n if (dayDifference === 1) {\n return 'yesterday';\n }\n if (dayDifference <= 5) {\n return date.toLocaleDateString(undefined, {weekday: 'long'});\n }\n return dateStr;\n },\n\n getProfileLink(pub: string) {\n return `${window.location.origin}/#/profile/${encodeURIComponent(pub)}`;\n },\n\n truncateString(s: string, length = 30) {\n return s.length > length ? `${s.slice(0, length)}...` : s;\n },\n\n createElement(type: string, cls?: string, parent?: HTMLElement) {\n const el = document.createElement(type);\n if (cls) {\n el.setAttribute('class', cls);\n }\n if (parent) {\n parent.appendChild(el);\n }\n return el;\n },\n\n isNode,\n isElectron,\n isMobile,\n\n throttle: (func: Function, limit: number) => {\n let inThrottle: boolean;\n return function() {\n const args = arguments;\n const context = this;\n if (!inThrottle) {\n func.apply(context, args);\n inThrottle = true;\n setTimeout(() => inThrottle = false, limit);\n }\n };\n },\n debounce: (func: Function, delay: number) => {\n let inDebounce: boolean;\n return function() {\n const context = this;\n const args = arguments;\n clearTimeout(inDebounce);\n inDebounce = setTimeout(() => func.apply(context, args), delay);\n };\n },\n sample: (arr: any[]) => arr[Math.floor(Math.random() * arr.length)],\n sampleSize: (arr: any[], size: number) => {\n const shuffled = arr.slice(0);\n let i = arr.length;\n let min = i - size;\n let temp;\n let index;\n while (i-- > min) {\n index = Math.floor((i + 1) * Math.random());\n temp = shuffled[index];\n shuffled[index] = shuffled[i];\n shuffled[i] = temp;\n }\n return shuffled.slice(min);\n },\n defer: (func: Function) => setTimeout(func, 0),\n once: (func: Function) => {\n let called = false;\n return function() {\n if (called) {\n return;\n }\n called = true;\n func.apply(this, arguments);\n };\n },\n omit: (obj: any, keys: string[]) => {\n const newObj = {};\n Object.keys(obj).forEach(key => {\n if (!keys.includes(key)) {\n newObj[key] = obj[key];\n }\n });\n return newObj;\n }\n};\n",";(function(){\n/* // from @jabis\nif (navigator.storage && navigator.storage.estimate) {\n const quota = await navigator.storage.estimate();\n // quota.usage -> Number of bytes used.\n // quota.quota -> Maximum number of bytes available.\n const percentageUsed = (quota.usage / quota.quota) * 100;\n console.log(`You've used ${percentageUsed}% of the available storage.`);\n const remaining = quota.quota - quota.usage;\n console.log(`You can write up to ${remaining} more bytes.`);\n}\n*/\n function Store(opt){\n opt = opt || {};\n opt.file = String(opt.file || 'radata');\n var store = Store[opt.file], db = null, u;\n\n if(store){\n console.log(\"Warning: reusing same IndexedDB store and options as 1st.\");\n return Store[opt.file];\n }\n store = Store[opt.file] = function(){};\n\n try{opt.indexedDB = opt.indexedDB || Store.indexedDB || indexedDB}catch(e){}\n try{if(!opt.indexedDB || 'file:' == location.protocol){\n var s = store.d || (store.d = {});\n store.put = function(f, d, cb){ s[f] = d; setTimeout(function(){ cb(null, 1) },250) };\n store.get = function(f, cb){ setTimeout(function(){ cb(null, s[f] || u) },5) };\n console.log('Warning: No indexedDB exists to persist data to!');\n return store;\n }}catch(e){}\n \n\n store.start = function(){\n var o = indexedDB.open(opt.file, 1);\n o.onupgradeneeded = function(eve){ (eve.target.result).createObjectStore(opt.file) }\n o.onsuccess = function(){ db = o.result }\n o.onerror = function(eve){ console.log(eve||1); }\n }; store.start();\n\n store.put = function(key, data, cb){\n if(!db){ setTimeout(function(){ store.put(key, data, cb) },1); return }\n var tx = db.transaction([opt.file], 'readwrite');\n var obj = tx.objectStore(opt.file);\n var req = obj.put(data, ''+key);\n req.onsuccess = obj.onsuccess = tx.onsuccess = function(){ cb(null, 1) }\n req.onabort = obj.onabort = tx.onabort = function(eve){ cb(eve||'put.tx.abort') }\n req.onerror = obj.onerror = tx.onerror = function(eve){ cb(eve||'put.tx.error') }\n }\n\n store.get = function(key, cb){\n if(!db){ setTimeout(function(){ store.get(key, cb) },9); return }\n var tx = db.transaction([opt.file], 'readonly');\n var obj = tx.objectStore(opt.file);\n var req = obj.get(''+key);\n req.onsuccess = function(){ cb(null, req.result) }\n req.onabort = function(eve){ cb(eve||4) }\n req.onerror = function(eve){ cb(eve||5) }\n }\n setInterval(function(){ db && db.close(); db = null; store.start() }, 1000 * 15); // reset webkit bug?\n return store;\n }\n\n if(typeof window !== \"undefined\"){\n (Store.window = window).RindexedDB = Store;\n Store.indexedDB = window.indexedDB; // safari bug\n } else {\n try{ module.exports = Store }catch(e){}\n }\n\n try{\n var Gun = Store.window.Gun || require('../gun');\n Gun.on('create', function(root){\n this.to.next(root);\n root.opt.store = root.opt.store || Store(root.opt);\n });\n }catch(e){}\n\n}());","import session from './session';\nimport _ from './lodash';\nimport Gun from 'gun';\nimport util from './util';\nimport publicState from './global';\n\nconst ELECTRON_GUN_URL = 'http://localhost:8767/gun';\nlet maxConnectedPeers = 2;\n\ntype Peer = {\n url?: string;\n enabled?: boolean;\n from?: string;\n visibility?: string;\n}\n\ntype Peers = {\n [key: string]: Peer\n}\n\nconst DEFAULT_PEERS: Peers = {\n 'https://gun-rs.iris.to/gun': {},\n 'https://gun-us.herokuapp.com/gun': {},\n};\n\nconst loc = window.location;\nconst host = loc.host;\nconst is_localhost_but_not_dev = host.startsWith('localhost') && host !== 'localhost:8080';\nif (loc.hostname.endsWith('herokuapp.com') || is_localhost_but_not_dev) {\n Object.keys(DEFAULT_PEERS).forEach(url => DEFAULT_PEERS[url].enabled = false);\n DEFAULT_PEERS[`${loc.origin}/gun`] = {enabled: true};\n}\n\nconst urlRegex = /^(https?:\\/\\/)?([\\da-z.-]+)\\.([a-z.]{2,6})([\\/\\w .-]*)*\\/?$/;\n\n/**\n * Networking and peer management utilities\n */\nexport default {\n known: {} as Peers,\n\n /** */\n async add(peer: Peer) {\n if (peer.url && !urlRegex.test(peer.url)) {\n throw new Error(`Invalid url ${peer.url}`);\n }\n\n if (peer.from) {\n Object.keys(this.known).forEach(k => {\n if (this.known[k].from === peer.from) { // remove previous peer url from the same user\n delete this.known[k];\n }\n });\n }\n const url = peer.url || '';\n this.known[url] = this.known[url] || _.omit(peer, ['url']);\n if (peer.visibility === 'public') {\n // rolling some crypto operations to obfuscate actual url in case we want to remove it\n let secret = await Gun.SEA.secret(session.getKey().epub, session.getKey()) || '';\n let encryptedUrl = await Gun.SEA.encrypt(peer.url, secret);\n let encryptedUrlHash = await Gun.SEA.work(encryptedUrl, null, null, {name: 'SHA-256'});\n publicState().user().get('peers').get(encryptedUrlHash).put({url: peer.url, lastSeen: new Date().toISOString()});\n }\n if (peer.enabled !== false) {\n peer.url && this.connect(peer.url); // this calls savePeers()\n } else {\n this.save();\n }\n },\n\n /** */\n remove(url: string) {\n delete this.known[url];\n this.save();\n },\n\n /** */\n disconnect(peerFromGun: any) {\n publicState().on('bye', peerFromGun);\n peerFromGun.url = '';\n },\n\n save() {\n localStorage.setItem('gunPeers', JSON.stringify(this.known));\n },\n\n getSaved() {\n let p: any = localStorage.getItem('gunPeers');\n if (p && p !== 'undefined') {\n p = JSON.parse(p);\n } else {\n p = DEFAULT_PEERS;\n }\n if (util.isElectron) {\n p[ELECTRON_GUN_URL] = {};\n }\n Object.keys(p).forEach(k => _.defaults(p[k], {enabled: true}));\n return p;\n },\n\n /** */\n reset() {\n localStorage.setItem('gunPeers', '');\n this.known = this.getSaved();\n },\n\n /** */\n connect(url: string) {\n if (this.isMixedContent(url)) { return; }\n if (this.known[url]) {\n this.known[url].enabled = true;\n publicState().opt({peers: [url]});\n this.save();\n } else {\n this.add({url});\n }\n },\n\n /** */\n disable(url: string, peerFromGun: any) {\n this.known[url].enabled = false;\n if (peerFromGun) {\n this.disconnect(peerFromGun);\n }\n this.save();\n },\n\n isMixedContent(url: string) {\n return window.location.protocol === 'https:' && (url.indexOf('http:') === 0);\n },\n\n random() {\n const connectToLocalElectron = util.isElectron && this.known[ELECTRON_GUN_URL] && this.known[ELECTRON_GUN_URL].enabled !== false;\n const sampleSize = connectToLocalElectron ? Math.max(maxConnectedPeers - 1, 1) : maxConnectedPeers;\n const sample = _.sampleSize(\n Object.keys(\n _.pickBy(this.known, (peer: any, url: string) => {\n return !this.isMixedContent(url) && peer.enabled && !(util.isElectron && url === ELECTRON_GUN_URL);\n })\n ), sampleSize\n );\n if (sample && connectToLocalElectron) {\n sample.push(ELECTRON_GUN_URL);\n }\n return sample;\n },\n\n checkGunPeerCount() {\n let peersFromGun = publicState().back('opt.peers');\n let connectedPeers = Object.values(peersFromGun).filter((peer: any) => {\n if (peer && peer.wire && peer.wire.constructor.name !== 'WebSocket') {\n console.log('WebRTC peer', peer);\n }\n return peer && peer.wire && peer.wire.readyState === 1 && peer.wire.bufferedAmount === 0 && peer.wire.constructor.name === 'WebSocket';\n });\n if (connectedPeers.length < maxConnectedPeers) {\n let unconnectedPeers = Object.keys(this.known).filter(url => {\n let addedToGun = Object.values(peersFromGun).map((peer:any) => peer.url).indexOf(url) > -1;\n let enabled = this.known[url].enabled;\n const mixedContent = (window.location.protocol === 'https:' && (url.indexOf('http:') === 0));\n return !mixedContent && enabled && !addedToGun;\n });\n if (unconnectedPeers.length) {\n const sample = String(_.sample(unconnectedPeers));\n this.connect(sample);\n }\n }\n if (connectedPeers.length > maxConnectedPeers) {\n this.disconnect(_.sample(connectedPeers));\n }\n },\n\n init() {\n this.known = this.getSaved();\n /* use the default value of 1 for now because of memory issue\n local().get('settings').get('maxConnectedPeers').on(n => {\n if (n !== undefined) maxConnectedPeers = n;\n });\n */\n setInterval(() => this.checkGunPeerCount(), 1000);\n }\n};\n","import Gun from 'gun';\nimport 'gun/sea';\nimport 'gun/lib/yson';\nimport 'gun/lib/radix';\nimport 'gun/lib/radisk';\nimport 'gun/lib/store';\nimport 'gun/lib/rindexed';\nimport peers from \"./peers\";\n\nlet global: any;\n\nexport default function(opts: any = {}) {\n if (!global) {\n const myOpts = Object.assign({ peers: (opts.peers || peers.random()), localStorage: false, retry:Infinity }, opts);\n if (opts.peers) {\n opts.peers.forEach((url: string) => peers.add({url}));\n }\n peers.init();\n global = new Gun(myOpts);\n }\n return global;\n}","// @ts-nocheck\n\n/*eslint no-useless-escape: \"off\", camelcase: \"off\" */\n\nconst UNIQUE_ID_VALIDATORS = {\n email: /^([\\w-]+(?:\\.[\\w-]+)*)@((?:[\\w-]+\\.)*\\w[\\w-]{0,66})\\.([a-z]{2,6}(?:\\.[a-z]{2})?)$/i,\n bitcoin: /^[13][a-km-zA-HJ-NP-Z0-9]{26,33}$/,\n bitcoin_address: /^[13][a-km-zA-HJ-NP-Z0-9]{26,33}$/,\n ip: /^(([1-9]?\\d|1\\d\\d|2[0-5][0-5]|2[0-4]\\d)\\.){3}([1-9]?\\d|1\\d\\d|2[0-5][0-5]|2[0-4]\\d)$/,\n ipv6: /^(?:[A-F0-9]{1,4}:){7}[A-F0-9]{1,4}$/,\n gpg_fingerprint: null,\n gpg_keyid: null,\n google_oauth2: null,\n tel: /^\\d{7,}$/,\n phone: /^\\d{7,}$/,\n keyID: null,\n url: /[-a-zA-Z0-9@:%_\\+.~#?&//=]{2,256}\\.[a-z]{2,4}\\b(\\/[-a-zA-Z0-9@:%_\\+.~#?&//=]*)?/gi,\n account: /^([\\w-]+(?:\\.[\\w-]+)*)@((?:[\\w-]+\\.)*\\w[\\w-]{0,66})\\.([a-z]{2,6}(?:\\.[a-z]{2})?)$/i,\n uuid: /[0-9a-f]{8}\\-[0-9a-f]{4}\\-[0-9a-f]{4}\\-[0-9a-f]{4}\\-[0-9a-f]{12}/\n};\n\n// TODO this class could perhaps be removed\n\nclass Attribute {\n constructor(a, b) {\n if (typeof a === `object`) {\n if (typeof a.value !== `string`) { throw new Error(`param1.value must be a string, got ${typeof a.value}: ${JSON.stringify(a.value)}`); }\n if (typeof a.type !== `string`) { throw new Error(`param1.type must be a string, got ${typeof a.type}: ${JSON.stringify(a.type)}`); }\n b = a.value;\n a = a.type;\n }\n if (typeof a !== `string`) { throw new Error(`First param must be a string, got ${typeof a}: ${JSON.stringify(a)}`); }\n if (!a.length) { throw new Error(`First param string is empty`); }\n if (b) {\n if (typeof b !== `string`) { throw new Error(`Second parameter must be a string, got ${typeof b}: ${JSON.stringify(b)}`); }\n if (!b.length) { throw new Error(`Second param string is empty`); }\n this.type = a;\n this.value = b;\n } else {\n this.value = a;\n const t = Attribute.guessTypeOf(this.value);\n if (t) {\n this.type = t;\n } else {\n throw new Error(`Type of attribute was omitted and could not be guessed`);\n }\n }\n }\n\n static getUuid() {\n const b = a => a ? (a ^ Math.random() * 16 >> a / 4).toString(16) : ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, b);\n return new Attribute(`uuid`, b());\n }\n\n static getUniqueIdValidators() {\n return UNIQUE_ID_VALIDATORS;\n }\n\n static isUniqueType(type) {\n return Object.keys(UNIQUE_ID_VALIDATORS).indexOf(type) > -1;\n }\n\n isUniqueType() {\n return Attribute.isUniqueType(this.type);\n }\n\n static guessTypeOf(value) {\n for (const key in UNIQUE_ID_VALIDATORS) {\n if (value.match(UNIQUE_ID_VALIDATORS[key])) {\n return key;\n }\n }\n }\n\n static equals(a, b) {\n return a.equals(b);\n }\n\n equals(a) {\n return a && this.type === a.type && this.value === a.value;\n }\n\n uri() {\n return `${encodeURIComponent(this.value)}:${encodeURIComponent(this.type)}`;\n }\n}\n\nexport default Attribute;\n","import publicState from './global';\nimport session from './session';\n\nlet currentUser: any;\n\n/**\n * Get a public space where only the specified user (public key) can write. Others can read.\n * @param pub The public key of the user. Defaults to the current user from session.\n * @returns {Node} The user space.\n */\nexport default function(pub?: string) {\n if (!currentUser) {\n currentUser = publicState().user();\n currentUser.auth(session.getKey());\n }\n return pub ? publicState().user(pub) : currentUser;\n}\n","// @ts-nocheck\n\nimport Gun from 'gun';\nimport 'gun/sea';\nimport util from './util';\nimport Attribute from './Attribute';\nimport session from './session';\nimport publicState from './global';\nimport userState from './public';\n\n// TODO: extract Group channels into their own class\n\nconst DEFAULT_PERMISSIONS = {read: true, write: true, admin: false};\n\n/**\n* Private communication channel between two or more participants ([Gun](https://github.com/amark/gun) public keys). Can be used independently of other Iris stuff.\n*\n* Used as a core element of [iris-messenger](https://github.com/irislib/iris-messenger).\n*\n* You can use iris.private(pub) to always use the same Channel object for a given pub.\n*\n* ---\n*\n* #### Key-value API\n* `channel.put(key, value)` and `channel.on(key, callback)`.\n*\n* Note that each participant has their own versions of each key-value — they don't overwrite each other. `channel.on()` callback returns them all by default and has a parameter that indicates whose value you got.\n*\n* While values are encrypted, encryption of keys is not implemented yet.\n*\n* #### Message API\n* `channel.send()` and `channel.getMessages()` for timestamp-indexed chat-style messaging.\n*\n* Message data is encrypted, but timestamps are public so that peers can return your messages in a sequential order.\n*\n* ---\n*\n* You can open a channel with yourself for a private key-value space or a \"note to self\" type chat with yourself.\n*\n* **Privacy disclaimer:** Channel ids, data values and messages are encrypted, but message timestamps are unencrypted so that peers can return them to you in a sequential order. By looking at the unencrypted timestamps (or Gun subscriptions), it is possible to guess who are communicating with each other. This could be improved by indexing messages by *day* only, so making the guess would be more difficult, while you could still return them in a semi-sequential order.\n*\n* @param {Object} options\n* @param {string} options.key your keypair\n* @param {Object} options.gun [gun](https://github.com/amark/gun) instance\n* @param options.participants (optional) string or string array or permissions object ({'pub1':{read:true,write:true,admin:false},'pub2'...}) of participant public keys (your own key is included by default)\n* @param {string} options.chatLink (optional) chat link instead of participants list\n* @param {string} options.uuid (group channels only) unique channel identifier. Leave out for new channel.\n* @param {string} options.name (group channels only) channel name\n* @example\n* // Copy & paste this to console at https://iris.to or other page that has gun, sea and iris-lib\n* // Due to an unsolved bug, someoneElse's messages only start showing up after a reload\n*\n* var gun1 = new Gun('https://gun-us.herokuapp.com/gun');\n* var gun2 = new Gun('https://gun-us.herokuapp.com/gun');\n* var myKey = await iris.Key.getDefault();\n* var someoneElse = localStorage.getItem('someoneElsesKey');\n* if (someoneElse) {\n* someoneElse = JSON.parse(someoneElse);\n* } else {\n* someoneElse = await iris.Key.generate();\n* localStorage.setItem('someoneElsesKey', JSON.stringify(someoneElse));\n* }\n*\n* iris.Channel.initUser(gun1, myKey); // saves myKey.epub to gun.user().get('epub')\n* iris.Channel.initUser(gun2, someoneElse);\n*\n* var ourChannel = new iris.Channel({key: myKey, gun: gun1, participants: someoneElse.pub});\n* var theirChannel = new iris.Channel({key: someoneElse, gun: gun2, participants: myKey.pub});\n*\n* var myChannels = {}; // you can list them in a user interface\n* function printMessage(msg, info) {\n* console.log(`[${new Date(msg.time).toLocaleString()}] ${info.from.slice(0,8)}: ${msg.text}`)\n* }\n* iris.Channel.getChannels(gun1, myKey, channel => {\n* var pub = channel.getCurrentParticipants()[0];\n* gun1.user(pub).get('profile').get('name').on(name => channel.name = name);\n* myChannels[pub] = channel;\n* channel.getMessages(printMessage);\n* channel.on('mood', (mood, from) => console.log(from.slice(0,8) + ' is feeling ' + mood));\n* });\n*\n* // you can play with these in the console:\n* ourChannel.send('message from myKey');\n* theirChannel.send('message from someoneElse');\n*\n* ourChannel.put('mood', 'blessed');\n* theirChannel.put('mood', 'happy');\n*\n* @example https://github.com/irislib/iris-lib/blob/master/__tests__/Channel.js\n*/\nclass Channel {\n // TODO: these should be done in a cleaner way\n latestTime: any;\n theirMsgsLastSeenDate: any;\n myLastSeenTime: any;\n theirMsgsLastSeenTime: any;\n notificationSetting: any;\n messageIds: any; // this is used from session.processMessage\n latest: any;\n uuid: any;\n name: any;\n attachments: any;\n\n theirSecretUuids = {};\n theirGroupSecrets = {};\n secrets = {};\n ourSecretChannelIds = {};\n theirSecretChannelIds = {};\n messages = {};\n chatLinks = {};\n groupSubscriptions = {};\n directSubscriptions = {};\n getParticipantsCallbacks = {};\n myGroupSecret: any;\n participants: any;\n\n constructor(options: any) {\n this.myGroupSecret = options.myGroupSecret;\n\n if (options.chatLink) {\n this.useChatLink(options);\n }\n\n if (typeof options.participants === `string`) {\n this.addParticipant(options.participants, options.save);\n } else if (Array.isArray(options.participants)) {\n const o = {};\n options.participants.forEach(p => o[p] = Object.assign({}, DEFAULT_PERMISSIONS));\n options.participants = o;\n }\n if (typeof options.participants === `object`) { // it's a group channel\n const keys = Object.keys(options.participants);\n keys.forEach(k => {\n if (k !== session.getKey().pub) {\n this.addParticipant(k, options.save, Object.assign({}, DEFAULT_PERMISSIONS, options.participants[k]));\n }\n });\n options.participants[session.getKey().pub] = options.participants[session.getKey().pub] || Object.assign({}, DEFAULT_PERMISSIONS);\n if (options.uuid) {\n this.uuid = options.uuid;\n this.name = options.name;\n } else {\n options.uuid = Attribute.getUuid().value;\n this.uuid = options.uuid;\n options.participants[session.getKey().pub].admin = true;\n options.participants[session.getKey().pub].founder = true;\n }\n this.getChatLinks({subscribe: true});\n }\n this.participants = options.participants;\n if (options.uuid) { // It's a group channel\n // share secret uuid with other participants. since secret is already non-deterministic, maybe uuid could also be?\n // generate channel-specific secret and share it with other participants\n // put() keys should be encrypted first? so you could do put(uuid, secret)\n // what if you join the channel with 2 unconnected devices? on reconnect, the older secret would be overwritten and messages unreadable. maybe participants should store each others' old keys? or maybe you should store them and re-encrypt old stuff when key changes? return them with map() instead?\n this.putDirect(`S${this.uuid}`, this.getMyGroupSecret());\n this.getMySecretUuid().then(s => {\n this.putDirect(this.uuid, s); // TODO: encrypt keys in put()\n });\n this.onTheirDirect(this.uuid, (s, k, from) => {\n this.theirSecretUuids[from] = s;\n });\n this.onTheirDirect(`S${this.uuid}`, (s, k, from) => {\n this.theirGroupSecrets[from] = s;\n });\n // need to make put(), on(), send() and getMessages() behave differently when it's a group and retain the old versions for mutual signaling\n }\n this.onTheir(`participants`, (participants, k, from) => {\n let hasAdmin = false;\n const keys = Object.keys(this.participants);\n for (let i = 0; i < keys.length; i++) {\n if (this.participants[keys[i]].admin || this.participants[keys[i]].inviter) {\n hasAdmin = true;\n break;\n }\n }\n if (!hasAdmin) {\n keys.forEach(k => this.participants[k].admin = true); // if no admins, make everyone admin\n }\n if (this.participants[from] && (this.participants[from].admin || this.participants[from].inviter)) {\n if (typeof participants === `object`) {\n if (JSON.stringify(this.participants) === JSON.stringify(participants)) { return; }\n this.participants = participants;\n delete this.participants[from].inviter;\n Object.keys(participants).forEach(k => {\n if (k !== session.getKey().pub) {\n this.addParticipant(k, true, Object.assign({}, DEFAULT_PERMISSIONS, participants[k]), true);\n }\n });\n this.participantsChanged();\n options.saved = true;\n }\n }\n });\n if (!options.saved && (options.save === undefined || options.save === true)) {\n this.save();\n }\n }\n\n useChatLink(options) {\n const s = options.chatLink.split('?');\n if (s.length === 2) {\n const chatWith = util.getUrlParameter('chatWith', s[1]);\n const channelId = util.getUrlParameter('channelId', s[1]);\n const inviter = util.getUrlParameter('inviter', s[1]);\n const pub = inviter || chatWith;\n if (chatWith) {\n options.participants = pub;\n } else if (channelId && inviter && inviter !== session.getKey().pub) { // TODO! initializing it twice breaks things - new secret is generated\n options.uuid = channelId;\n options.participants = {};\n options.participants[inviter] = Object.assign({inviter: true}, DEFAULT_PERMISSIONS);\n }\n if (pub !== session.getKey().pub) {\n const sharedSecret = util.getUrlParameter('s', s[1]);\n const linkId = util.getUrlParameter('k', s[1]);\n if (sharedSecret && linkId) {\n this.save(); // save the channel first so it's there before inviter subscribes to it\n options.saved = true;\n publicState().user(pub).get('chatLinks').get(linkId).get('encryptedSharedKey').on(async encrypted => {\n const sharedKey = await Gun.SEA.decrypt(encrypted, sharedSecret);\n const encryptedChatRequest = await Gun.SEA.encrypt(session.getKey().pub, sharedSecret); // TODO encrypt is not deterministic, it uses salt\n const channelRequestId = await util.getHash(encryptedChatRequest);\n util.gunAsAnotherUser(publicState(), sharedKey, user => {\n user.get('chatRequests').get(channelRequestId.slice(0, 12)).put(encryptedChatRequest);\n });\n });\n }\n }\n }\n }\n\n getTheirSecretUuid(pub) {\n return new Promise(resolve => {\n if (!this.theirSecretUuids[pub]) {\n this.onTheirDirect(this.uuid, s => {\n this.theirSecretUuids[pub] = s;\n resolve(this.theirSecretUuids[pub]);\n }, pub);\n } else {\n resolve(this.theirSecretUuids[pub]);\n }\n });\n }\n\n getTheirGroupSecret(pub) {\n if (pub === session.getKey().pub) { return this.getMyGroupSecret(); }\n return new Promise(resolve => {\n if (!this.theirGroupSecrets[pub]) {\n this.onTheirDirect(`S${this.uuid}`, s => {\n this.theirGroupSecrets[pub] = s;\n resolve(this.theirGroupSecrets[pub]);\n }, pub);\n } else {\n resolve(this.theirGroupSecrets[pub]);\n }\n });\n }\n\n changeMyGroupSecret() {\n this.myGroupSecret = Gun.SEA.random(32).toString('base64');\n // TODO: secret should be archived and probably messages should include the encryption key id so past messages don't become unreadable\n this.putDirect(`S${this.uuid}`, this.myGroupSecret);\n }\n\n /**\n * Unsubscribe messages from a channel participants\n *\n * @param {string} participant public key\n */\n async mute(participant) {\n publicState().user(participant).get(this.theirSecretUuids[participant]).off();\n // TODO: persist\n }\n\n /**\n * Mute user and prevent them from seeing your further (and maybe past) messages\n *\n * @param {string} participant public key\n */\n async block(participant) {\n this.mute(participant);\n this.putDirect(this.uuid, null);\n this.putDirect(`S${this.uuid}`, null);\n delete this.secrets[participant];\n delete this.ourSecretChannelIds[participant];\n delete this.theirSecretChannelIds[participant];\n this.changeMyGroupSecret();\n }\n\n async getMySecretUuid() {\n if (!this.mySecretUuid) {\n const mySecret = await Gun.SEA.secret(session.getKey().epub, session.getKey());\n const mySecretHash = await util.getHash(mySecret);\n this.mySecretUuid = await util.getHash(mySecretHash + this.uuid);\n }\n return this.mySecretUuid;\n }\n\n /**\n * List participants of the channel (other than you)\n */\n getCurrentParticipants() {\n return Object.keys(this.secrets);\n }\n\n /**\n * Subscribe to the changing list of participants by channel admins\n */\n getParticipants(callback) {\n if (this.getParticipantsCallbackId) {\n this.getParticipantsCallbackId++;\n } else {\n this.getParticipantsCallbackId = 1;\n }\n this.getParticipantsCallbacks[this.getParticipantsCallbackId] = callback;\n if (this.participants) {\n callback(this.participants);\n }\n }\n\n participantsChanged() {\n Object.keys(this.getParticipantsCallbacks).forEach(id => {\n this.getParticipantsCallbacks[id](this.participants);\n });\n }\n\n /**\n * Returns either the uuid of a group channel or the public key of a direct channel.\n */\n getId() {\n return this.uuid || this.getCurrentParticipants()[0];\n }\n\n async getSecret(pub) {\n if (!this.secrets[pub]) {\n const epub = await util.gunOnceDefined(publicState().user(pub).get(`epub`));\n this.secrets[pub] = await Gun.SEA.secret(epub, session.getKey());\n }\n return this.secrets[pub];\n }\n\n /**\n *\n */\n static async getOurSecretChannelId(pub, pair) {\n const epub = await util.gunOnceDefined(publicState().user(pub).get(`epub`));\n const secret = await Gun.SEA.secret(epub, pair);\n return util.getHash(secret + pub);\n }\n\n /**\n *\n */\n static async getTheirSecretChannelId(pub, pair) {\n const epub = await util.gunOnceDefined(publicState().user(pub).get(`epub`));\n const secret = await Gun.SEA.secret(epub, pair);\n return util.getHash(secret + pair.pub);\n }\n\n /**\n * Calls back with Channels that you have initiated or written to.\n * @param {Object} keypair Gun.SEA keypair that the gun instance is authenticated with\n * @param callback callback function that is called for each public key you have a channel with\n */\n static async getChannels(callback, listenToChatLinks = true) {\n const keypair = session.getKey();\n const mySecret = await Gun.SEA.secret(keypair.epub, keypair);\n if (listenToChatLinks) {\n Channel.getMyChatLinks( undefined, undefined, true);\n }\n const seen = {};\n\n const handleChannel = async (value, ourSecretChannelId) => {\n if (value && !seen[ourSecretChannelId]) {\n seen[ourSecretChannelId] = true;\n if (ourSecretChannelId.length > 44) {\n publicState().user().get(`chats`).get(ourSecretChannelId).put(null);\n return;\n }\n const encryptedChatId = await util.gunOnceDefined(publicState().user().get(`chats`).get(ourSecretChannelId).get(`pub`));\n const chatId = await Gun.SEA.decrypt(encryptedChatId, mySecret);\n if (!chatId) {\n return;\n }\n if (chatId.pub || typeof chatId === `string`) {\n callback(new Channel({\n key: keypair,\n participants: chatId.pub || chatId,\n save: false\n }));\n } else if (chatId.uuid && chatId.participants && chatId.myGroupSecret) {\n callback(new Channel({\n key: keypair,\n participants: chatId.participants,\n uuid: chatId.uuid,\n myGroupSecret: chatId.myGroupSecret,\n save: false\n }));\n }\n }\n };\n\n publicState().user().get(`chats`).map().on(handleChannel);\n }\n\n getMyGroupSecret() { // group secret could be deterministic: hash(encryptToSelf(uuid + iterator))\n if (!this.myGroupSecret) {\n this.changeMyGroupSecret();\n }\n return this.myGroupSecret;\n }\n\n async getOurSecretChannelId(pub) {\n if (!this.ourSecretChannelIds[pub]) {\n const secret = await this.getSecret(pub);\n this.ourSecretChannelIds[pub] = await util.getHash(secret + pub);\n }\n return this.ourSecretChannelIds[pub];\n }\n\n async getTheirSecretChannelId(pub) {\n if (!this.theirSecretChannelIds[pub]) {\n const secret = await this.getSecret(pub);\n this.theirSecretChannelIds[pub] = await util.getHash(secret + session.getKey().pub);\n }\n return this.theirSecretChannelIds[pub];\n }\n\n /**\n * Get messages from the channel\n */\n async getMessages(callback) { // TODO: save callback and apply it when new participants are added to channel\n this.getCurrentParticipants().forEach(async pub => {\n if (pub !== session.getKey().pub) {\n // Subscribe to their messages\n let theirSecretChannelId;\n if (this.uuid) {\n theirSecretChannelId = await this.getTheirSecretUuid(pub);\n } else {\n theirSecretChannelId = await this.getTheirSecretChannelId(pub);\n }\n publicState().user(pub).get(`chats`).get(theirSecretChannelId).get(`msgs`).map().once((data, key) => {this.messageReceived(callback, data, this.uuid || pub, false, key, pub);});\n }\n if (!this.uuid) {\n // Subscribe to our messages\n const ourSecretChannelId = await this.getOurSecretChannelId(pub);\n userState().get(`chats`).get(ourSecretChannelId).get(`msgs`).map().once((data, key) => {this.messageReceived(callback, data, pub, true, key, session.getKey().pub);});\n }\n });\n if (this.uuid) {\n // Subscribe to our messages\n const mySecretUuid = await this.getMySecretUuid();\n userState().get(`chats`).get(mySecretUuid).get(`msgs`).map().once((data, key) => {this.messageReceived(callback, data, this.uuid, true, key, session.getKey().pub);});\n }\n }\n\n async messageReceived(callback, data, channelId, selfAuthored, key, from) {\n if (this.messages[key] || !data) {\n return;\n }\n const secret = this.uuid ? (await this.getTheirGroupSecret(from)) : (await this.getSecret(channelId));\n const decrypted = await Gun.SEA.decrypt(data, secret);\n if (typeof decrypted !== `object`) {\n return;\n }\n const info = {selfAuthored, channelId, from};\n this.messages[key] = decrypted;\n callback(decrypted, info);\n }\n\n /**\n * Get latest message in this channel. Useful for channel listing.\n */\n async getLatestMsg(callback) {\n const callbackIfLatest = async (msg, info) => {\n if (!this.latest) {\n this.latest = msg;\n callback(msg, info);\n } else {\n const t = (typeof this.latest.time === `string` ? this.latest.time : this.latest.time.toISOString());\n if (t < msg.time) {\n this.latest = msg;\n callback(msg, info);\n }\n }\n };\n this.onMy('latestMsg', msg => callbackIfLatest(msg, {selfAuthored: true, from: session.getKey().pub}));\n this.onTheir('latestMsg', (msg, k, from) => callbackIfLatest(msg, {selfAuthored: false, from}));\n }\n\n /**\n * Useful for notifications\n * @param {integer} time last seen msg time (default: now)\n */\n async setMyMsgsLastSeenTime(time?: string) {\n time = time || new Date().toISOString();\n return this.put(`msgsLastSeenTime`, time);\n }\n\n /**\n * Useful for notifications\n */\n async getMyMsgsLastSeenTime(callback) {\n this.onMy(`msgsLastSeenTime`, time => {\n this.myMsgsLastSeenTime = time;\n if (callback) {\n callback(this.myMsgsLastSeenTime);\n }\n });\n }\n\n /**\n * For \"seen\" status indicator\n */\n async getTheirMsgsLastSeenTime(callback) {\n this.onTheir(`msgsLastSeenTime`, time => {\n this.theirMsgsLastSeenTime = time;\n if (callback) {\n callback(this.theirMsgsLastSeenTime);\n }\n });\n }\n\n async removeParticipant(pub) {\n this.addParticipant(pub, true, {read: false, write: false});\n }\n\n /**\n * Add a public key to the channel or update its permissions\n * @param {string} pub\n */\n async addParticipant(pub: string, save = true, permissions?: any, subscribe?: boolean) {\n if (this.uuid) {\n return;\n }\n if (permissions === undefined) {\n permissions = DEFAULT_PERMISSIONS;\n }\n if (this.secrets[pub] && JSON.stringify(this.secrets[pub]) === JSON.stringify(permissions)) { // TODO: should be this.participants[pub]\n return;\n }\n this.secrets[pub] = null;\n this.getSecret(pub);\n const ourSecretChannelId = await this.getOurSecretChannelId(pub);\n if (save) {\n // Save their public key in encrypted format, so in channel listing we know who we are channeling with\n const mySecret = await Gun.SEA.secret(session.getKey().epub, session.getKey());\n publicState().user().get(`chats`).get(ourSecretChannelId).get(`pub`).put(await Gun.SEA.encrypt({pub}, mySecret));\n }\n if (this.uuid) {\n this.participants[pub] = permissions;\n if (save) {\n this.putDirect(`S${this.uuid}`, this.getMyGroupSecret());\n this.getMySecretUuid().then(s => {\n this.putDirect(this.uuid, s); // TODO: encrypt keys in put()\n });\n this.onTheirDirect(this.uuid, (s, k, from) => {\n this.theirSecretUuids[from] = s;\n });\n this.onTheirDirect(`S${this.uuid}`, (s, k, from) => {\n this.theirGroupSecrets[from] = s;\n });\n this.save();\n }\n }\n if (subscribe) {\n Object.values(this.directSubscriptions).forEach(arr => {\n arr.forEach(o => {\n if (!o.from || o.from === pub) {\n this._onTheirDirectFromUser(pub, o.key, o.callback);\n }\n });\n });\n Object.values(this.groupSubscriptions).forEach(arr => {\n arr.forEach(o => {\n if (o.from && o.from !== pub) { return; }\n if (permissions.write) {\n this._onTheirGroupFromUser(pub, o.key, o.callback);\n } else { // unsubscribe\n o.event && o.event.off();\n }\n });\n });\n }\n }\n\n /**\n * Send a message to the channel\n * @param msg string or {time, text, ...} object\n */\n async send(msg) {\n if (typeof msg === `string`) {\n msg = msg.trim();\n if (msg.length === 0) {\n return;\n }\n msg = {\n time: (new Date()).toISOString(),\n text: msg\n };\n } else if (typeof msg === `object`) {\n msg.time = msg.time || (new Date()).toISOString();\n } else {\n throw new Error(`msg param must be a string or an object`);\n }\n //publicState().user().get('message').set(temp);\n if (this.uuid) {\n const encrypted = await Gun.SEA.encrypt(JSON.stringify(msg), this.getMyGroupSecret());\n const mySecretUuid = await this.getMySecretUuid();\n userState().get(`chats`).get(mySecretUuid).get(`msgs`).get(`${msg.time}`).put(encrypted);\n userState().get(`chats`).get(mySecretUuid).get(`latestMsg`).put(encrypted);\n } else {\n const keys = this.getCurrentParticipants();\n for (let i = 0;i < keys.length;i++) {\n const encrypted = await Gun.SEA.encrypt(JSON.stringify(msg), (await this.getSecret(keys[i])));\n const ourSecretChannelId = await this.getOurSecretChannelId(keys[i]);\n userState().get(`chats`).get(ourSecretChannelId).get(`msgs`).get(`${msg.time}`).put(encrypted);\n userState().get(`chats`).get(ourSecretChannelId).get(`latestMsg`).put(encrypted);\n }\n }\n }\n\n /**\n * Save the channel to our channels list without sending a message\n */\n async save() {\n if (this.uuid) {\n const mySecretUuid = await this.getMySecretUuid();\n userState().get(`chats`).get(mySecretUuid).get('msgs').get('a').put(null);\n this.put(`participants`, this.participants); // public participants list\n const mySecret = await Gun.SEA.secret(session.getKey().epub, session.getKey());\n userState().get(`chats`).get(mySecretUuid).get(`pub`).put(await Gun.SEA.encrypt({\n uuid: this.uuid,\n myGroupSecret: this.getMyGroupSecret(),\n participants: this.participants // private participants list\n }, mySecret));\n this.participantsChanged();\n } else {\n const keys = this.getCurrentParticipants();\n for (let i = 0;i < keys.length;i++) {\n const ourSecretChannelId = await this.getOurSecretChannelId(keys[i]);\n userState().get(`chats`).get(ourSecretChannelId).get('msgs').get('a').put(null);\n }\n }\n }\n\n /**\n * Save a key-value pair, encrypt value. Each participant in the Channel writes to their own version of the key-value pair — they don't overwrite the same one.\n * @param {string} key\n * @param value\n */\n async put(key, value) {\n return (this.uuid ? this.putGroup : this.putDirect).call(this, key, value);\n }\n\n async putGroup(key, value) {\n if (key === `msgs`) { throw new Error(`Sorry, you can't overwrite the msgs field which is used for .send()`); }\n const encrypted = await Gun.SEA.encrypt(JSON.stringify(value), this.getMyGroupSecret());\n const mySecretUuid = await this.getMySecretUuid();\n userState().get(`chats`).get(mySecretUuid).get(key).put(encrypted);\n }\n\n async putDirect(key, value) {\n if (key === `msgs`) { throw new Error(`Sorry, you can't overwrite the msgs field which is used for .send()`); }\n const keys = this.getCurrentParticipants();\n for (let i = 0;i < keys.length;i++) {\n const encrypted = await Gun.SEA.encrypt(JSON.stringify(value), (await this.getSecret(keys[i])));\n const ourSecretChannelId = await this.getOurSecretChannelId(keys[i]);\n userState().get(`chats`).get(ourSecretChannelId).get(key).put(encrypted);\n }\n }\n\n /**\n * Subscribe to a key-value pair. Callback returns every participant's value unless you limit it with *from* param.\n * @param {string} key\n * @param {function} callback\n * @param {string} from public key whose value you want, or *\"me\"* for your value only, or *\"them\"* for the value of others only\n */\n async on(key: string, callback: Function, from?: string) {\n return (this.uuid ? this.onGroup : this.onDirect).call(this, key, callback, from);\n }\n\n async onDirect(key: string, callback: Function, from?: string) {\n if (!from || from === `me` || from === session.getKey().pub) {\n this.onMy(key, (val: any) => callback(val, session.getKey().pub));\n }\n if (!from || (from !== `me` && from !== session.getKey().pub)) {\n this.onTheir(key, (val: any, k: string, pub: string) => callback(val, pub));\n }\n }\n\n async onGroup(key: string, callback: Function, from?: string) {\n if (!from || from === `me` || from === session.getKey().pub) {\n this.onMyGroup(key, val => callback(val, session.getKey().pub));\n }\n if (!from || (from !== `me` && from !== session.getKey().pub)) {\n this.onTheirGroup(key, (val, k, pub) => callback(val, pub));\n }\n }\n\n async onMy(key: string, callback: Function) {\n return (this.uuid ? this.onMyGroup : this.onMyDirect).call(this, key, callback);\n }\n\n async onMyDirect(key: string, callback: Function) {\n if (typeof callback !== 'function') {\n throw new Error(`onMy callback must be a function, got ${typeof callback}`);\n }\n const keys = this.getCurrentParticipants();\n for (let i = 0;i < keys.length;i++) {\n const ourSecretChannelId = await this.getOurSecretChannelId(keys[i]);\n publicState().user().get(`chats`).get(ourSecretChannelId).get(key).on(async (data: any) => {\n const decrypted = await Gun.SEA.decrypt(data, (await this.getSecret(keys[i])));\n if (decrypted) {\n callback(typeof decrypted.v !== `undefined` ? decrypted.v : decrypted, key);\n }\n });\n break;\n }\n }\n\n async onMyGroup(key, callback) {\n if (typeof callback !== 'function') {\n throw new Error(`onMy callback must be a function, got ${typeof callback}`);\n }\n const mySecretUuid = await this.getMySecretUuid();\n const mySecret = await this.getMyGroupSecret();\n publicState().user().get(`chats`).get(mySecretUuid).get(key).on(async data => {\n const decrypted = await Gun.SEA.decrypt(data, mySecret);\n if (decrypted) {\n callback(typeof decrypted.v !== `undefined` ? decrypted.v : decrypted, key, session.getKey().pub);\n }\n });\n }\n\n async onTheir(key: string, callback: Function, from: string) {\n return (this.uuid ? this.onTheirGroup : this.onTheirDirect).call(this, key, callback, from);\n }\n\n async _onTheirDirectFromUser(key: string, callback: Function, pub: string) {\n if (!this.hasWritePermission(pub)) { return; }\n const theirSecretChannelId = await this.getTheirSecretChannelId(pub);\n publicState().user(pub).get(`chats`).get(theirSecretChannelId).get(key).on(async (data: any) => {\n if (!this.hasWritePermission(pub)) { return; }\n const decrypted = await Gun.SEA.decrypt(data, (await this.getSecret(pub)));\n if (decrypted) {\n callback(typeof decrypted.v !== `undefined` ? decrypted.v : decrypted, key, pub);\n }\n });\n }\n\n async onTheirDirect(key: string, callback: Function, from: string) { // TODO: subscribe to new channel participants\n if (typeof callback !== 'function') {\n throw new Error(`onTheir callback must be a function, got ${typeof callback}`);\n }\n if (!Object.prototype.hasOwnProperty.call(this.directSubscriptions, key)) {\n this.directSubscriptions[key] = [];\n }\n this.directSubscriptions[key].push({key, callback, from});\n const participants = this.getCurrentParticipants();\n participants.forEach(async pub => {\n if (from && pub !== from) { return; }\n this._onTheirDirectFromUser(pub, key, callback);\n });\n }\n\n hasWritePermission(pub) {\n return !this.uuid || (this.participants && this.participants[pub] && this.participants[pub].write);\n }\n\n async _onTheirGroupFromUser(pub: string, key: string, callback: Function, subscription: any) {\n if (!this.hasWritePermission(pub)) { return; }\n const theirSecretUuid = await this.getTheirSecretUuid(pub);\n publicState().user(pub).get(`chats`).get(theirSecretUuid).get(key).on(async (data: any, _a: any, _b: any, e: Event) => {\n if (subscription) { subscription.event = e; }\n if (!this.hasWritePermission(pub)) { return; }\n const decrypted = await Gun.SEA.decrypt(data, (await this.getTheirGroupSecret(pub)));\n if (decrypted) {\n callback(typeof decrypted.v !== `undefined` ? decrypted.v : decrypted, key, pub);\n }\n });\n }\n\n async onTheirGroup(key, callback, from) {\n if (typeof callback !== 'function') {\n throw new Error(`onTheir callback must be a function, got ${typeof callback}`);\n }\n if (!Object.prototype.hasOwnProperty.call(this.groupSubscriptions, key)) {\n this.groupSubscriptions[key] = [];\n }\n const subscription = {key, callback, from};\n this.groupSubscriptions[key].push(subscription);\n\n this.getParticipants(participants => {\n Object.keys(participants).forEach(async pub => {\n if (from && pub !== from) { return; }\n if (!(participants[pub] && participants[pub].write)) { return; }\n this._onTheirGroupFromUser(pub, key, callback, subscription);\n });\n });\n }\n\n /**\n * Set typing status\n */\n setTyping(isTyping, timeout = 5) {\n isTyping = typeof isTyping === `undefined` ? true : isTyping;\n timeout = timeout * 1000;\n this.put(`typing`, isTyping ? new Date().toISOString() : new Date(0).toISOString());\n clearTimeout(this.setTypingTimeout);\n this.setTypingTimeout = setTimeout(() => this.put(`typing`, false), timeout);\n }\n\n /**\n * Get typing status\n */\n getTyping(callback, timeout = 5) { // TODO callback not called on setTyping(false), at least for self chat\n timeout = timeout * 1000;\n this.onTheir(`typing`, (typing, key, pub) => {\n if (callback) {\n const isTyping = typing && new Date() - new Date(typing) <= timeout;\n callback(isTyping, pub);\n this.getTypingTimeouts = this.getTypingTimeouts || {};\n clearTimeout(this.getTypingTimeouts[pub]);\n if (isTyping) {\n this.getTypingTimeouts[pub] = setTimeout(() => callback(false, pub), timeout);\n }\n }\n });\n }\n\n /**\n * Add a chat button to page\n * @param options {label, channelOptions}\n */\n static addChatButton(options = {}) {\n options = Object.assign({label: 'Chat'}, options);\n if (!options.channelOptions) {\n throw new Error('addChatButton missing options.channelOptions param');\n }\n util.injectCss();\n let channel, box;\n const btn = util.createElement('div', 'iris-chat-open-button', document.body);\n btn.setAttribute('id', 'iris-chat-open-button');\n btn.innerHTML = ` ${options.label}`;\n btn.addEventListener('click', () => {\n btn.setAttribute('style', 'display: none');\n if (!channel) {\n channel = new Channel(options.channelOptions);\n box = channel.getChatBox();\n document.body.appendChild(box);\n } else {\n box.setAttribute('style', ''); // show\n }\n });\n }\n\n /**\n * Get a simple link that points to the channel.\n *\n * Direct channel: both users need to give their simple links. Use createChatLink() to get a two-way link that needs to be given by one user only.\n *\n * Group channel: Works only if the link recipient has been already added onto the channel participants list.\n */\n getSimpleLink(urlRoot = 'https://iris.to/') {\n if (this.uuid) {\n return `${urlRoot}?channelId=${this.uuid}&inviter=${session.getKey().pub}`;\n }\n return `${urlRoot}?chatWith=${this.getCurrentParticipants()[0]}`;\n }\n\n /**\n *\n */\n async getChatLinks(opts: any = {}) {\n let {callback, urlRoot, subscribe} = opts;\n urlRoot = urlRoot || 'https://iris.to/';\n if (!this.uuid) { throw new Error('Only group channels may have chat links'); }\n const chatLinks: any[] = [];\n const chatLinkSubscriptions = {};\n this.on('chatLinks', (links: any, from: string) => {\n // TODO: check admin permissions\n if (!links || typeof links !== 'object') { return; }\n Object.keys(links).forEach(linkId => {\n const link = links[linkId];\n if (link === null) {\n chatLinkSubscriptions[linkId] && chatLinkSubscriptions[linkId].off(); // unsubscribe removed chat link\n delete chatLinkSubscriptions[linkId];\n callback && callback({id: linkId, url: null});\n return;\n }\n if (chatLinks.indexOf(linkId) !== -1) { return; }\n const channels = [];\n chatLinks.push(linkId);\n const url = Channel.formatChatLink({urlRoot, inviter: from, channelId: this.uuid, sharedSecret: link.sharedSecret, linkId});\n callback && callback({url, id: linkId});\n if (subscribe) {\n publicState().user(link.sharedKey.pub).get('chatRequests').map().on(async (encPub, requestId, a, e) => {\n if (!encPub || typeof encPub !== 'string' || encPub.length < 10) { return; }\n chatLinkSubscriptions[linkId] = e;\n const s = JSON.stringify(encPub);\n if (channels.indexOf(s) === -1) {\n channels.push(s);\n const pub = await Gun.SEA.decrypt(encPub, link.sharedSecret);\n this.addParticipant(pub, undefined, undefined, true);\n }\n });\n }\n });\n });\n }\n\n async createChatLink(urlRoot = 'https://iris.to/') {\n const sharedKey = await Gun.SEA.pair();\n const sharedKeyString = JSON.stringify(sharedKey);\n const sharedSecret = await Gun.SEA.secret(sharedKey.epub, sharedKey);\n const encryptedSharedKey = await Gun.SEA.encrypt(sharedKeyString, sharedSecret);\n const ownerSecret = await Gun.SEA.secret(session.getKey().epub, session.getKey());\n const ownerEncryptedSharedKey = await Gun.SEA.encrypt(sharedKeyString, ownerSecret);\n let linkId = await util.getHash(encryptedSharedKey);\n linkId = linkId.slice(0, 12);\n\n // User has to exist, in order for .get(chatRequests).on() to be ever triggered\n await util.gunAsAnotherUser(publicState(), sharedKey, user => {\n return user.get('chatRequests').put({a: 1}).then();\n });\n\n this.chatLinks[linkId] = {sharedKey, sharedSecret};\n this.put('chatLinks', this.chatLinks);\n userState().get('chatLinks').get(linkId).put({encryptedSharedKey, ownerEncryptedSharedKey});\n\n return Channel.formatChatLink({urlRoot, channelId: this.uuid, inviter: session.getKey().pub, sharedSecret, linkId});\n }\n\n /**\n * Get a channel box element that you can add to your page\n */\n getChatBox() {\n util.injectCss();\n let minimized = false;\n\n const chatBox = util.createElement('div', 'iris-chat-box');\n const header = util.createElement('div', 'iris-chat-header', chatBox);\n const minimize = util.createElement('span', 'iris-chat-minimize', header);\n minimize.innerText = '—';\n minimize.addEventListener('click', e => {\n e.stopPropagation();\n chatBox.setAttribute('class', 'iris-chat-box minimized');\n minimized = true;\n });\n const headerText = util.createElement('div', 'iris-chat-header-text', header);\n const onlineIndicator = util.createElement('span', 'iris-online-indicator', headerText);\n onlineIndicator.innerHTML = '●';\n const nameEl = util.createElement('span', undefined, headerText);\n const close = util.createElement('span', 'iris-chat-close', header);\n close.innerHTML = '×';\n close.addEventListener('click', () => {\n chatBox.setAttribute('style', 'display: none');\n const openChatBtn = document.getElementById('iris-chat-open-button');\n if (openChatBtn) {\n openChatBtn.setAttribute('style', ''); // show\n }\n });\n header.addEventListener('click', () => {\n if (minimized) {\n chatBox.setAttribute('class', 'iris-chat-box');\n minimized = false;\n }\n });\n\n const messages = util.createElement('div', 'iris-chat-messages', chatBox);\n\n const typingIndicator = util.createElement('div', 'iris-typing-indicator', chatBox);\n typingIndicator.innerText = 'typing...';\n this.getTyping(isTyping => {\n typingIndicator.setAttribute('class', `iris-typing-indicator${ isTyping ? ' yes' : ''}`);\n });\n\n const inputWrapper = util.createElement('div', 'iris-chat-input-wrapper', chatBox);\n const textArea = util.createElement('textarea', undefined, inputWrapper);\n textArea.setAttribute('rows', '1');\n textArea.setAttribute('placeholder', 'Type a message');\n if (util.isMobile) {\n const sendBtn = util.createElement('button', undefined, inputWrapper);\n sendBtn.innerHTML = `\n \n `;\n sendBtn.addEventListener('click', () => {\n this.send(textArea.value);\n textArea.value = '';\n this.setTyping(false);\n });\n }\n\n const participants = this.getCurrentParticipants();\n if (participants.length) {\n const pub = participants[0];\n publicState().user(pub).get('profile').get('name').on(name => nameEl.innerText = name);\n Channel.getActivity(publicState(), pub, status => {\n const cls = `iris-online-indicator${ status.isActive ? ' yes' : ''}`;\n onlineIndicator.setAttribute('class', cls);\n const undelivered = messages.querySelectorAll('.iris-chat-message:not(.delivered)');\n undelivered.forEach(msg => {\n if (msg.getAttribute('data-time') <= status.lastActive) {\n const c = msg.getAttribute('class');\n msg.setAttribute('class', `${c } delivered`);\n }\n });\n });\n }\n\n this.getTheirMsgsLastSeenTime(time => {\n const unseen = messages.querySelectorAll('.iris-seen:not(.yes)');\n unseen.forEach(indicator => {\n const msgEl = indicator.parentElement.parentElement.parentElement;\n if (msgEl.getAttribute('data-time') <= time) {\n const msgClass = msgEl.getAttribute('class');\n if (msgClass.indexOf('delivered') === -1) {\n msgEl.setAttribute('class', `${msgClass } delivered`);\n }\n indicator.setAttribute('class', 'iris-seen yes');\n }\n });\n });\n\n this.getMessages((msg, info) => {\n const msgContent = util.createElement('div', 'iris-msg-content');\n msgContent.innerText = msg.text;\n const time = util.createElement('div', 'time', msgContent);\n time.innerText = util.formatTime(new Date(msg.time));\n if (info.selfAuthored) {\n const cls = this.theirMsgsLastSeenTime >= msg.time ? 'iris-seen yes' : 'iris-seen';\n const seenIndicator = util.createElement('span', cls, time);\n seenIndicator.innerHTML = ' ';\n }\n msgContent.innerHTML = msgContent.innerHTML.replace(/\\n/g, '
\\n');\n\n const msgEl = util.createElement('div', `${info.selfAuthored ? 'our' : 'their'} iris-chat-message`);\n msgEl.appendChild(msgContent);\n msgEl.setAttribute('data-time', msg.time);\n for (let i = messages.children.length; i >= 0; i--) {\n if (i === 0) {\n messages.insertBefore(msgEl, messages.firstChild);\n } else {\n const t = messages.children[i - 1].getAttribute('data-time');\n if (t && t < msg.time) {\n messages.children[i - 1].insertAdjacentElement('afterend', msgEl);\n break;\n }\n }\n }\n messages.scrollTop = messages.scrollHeight;\n });\n\n textArea.addEventListener('keyup', event => {\n Channel.setActivity(publicState(), true); // TODO\n this.setMyMsgsLastSeenTime(); // TODO\n if (event.keyCode === 13) {\n event.preventDefault();\n const content = textArea.value;\n const caret = util.getCaret(textArea);\n if (event.shiftKey) {\n textArea.value = `${content.substring(0, caret - 1) }\\n${ content.substring(caret, content.length)}`;\n } else {\n textArea.value = content.substring(0, caret - 1) + content.substring(caret, content.length);\n this.send(textArea.value);\n textArea.value = '';\n this.setTyping(false);\n }\n } else {\n this.setTyping(!!textArea.value.length);\n }\n });\n\n return chatBox;\n }\n\n /**\n * Set the user's online/active status\n * @param {string} activity string: set the activity status every 3 seconds, null/false: stop updating\n */\n static setActivity(activity) {\n if (publicState().irisActivityStatus === activity) { return; }\n publicState().irisActivityStatus = activity;\n clearTimeout(publicState().setActivityTimeout);\n const update = () => {\n publicState().user().get(`activity`).put({status: activity, time: new Date(Gun.state()).toISOString()});\n };\n update();\n function timerUpdate() {\n update();\n publicState().setActivityTimeout = setTimeout(timerUpdate, 3000);\n }\n if (activity) {\n timerUpdate();\n }\n }\n\n /**\n * Get the online status of a user.\n *\n * @param {string} pubKey public key of the user\n * @param {boolean} callback receives a boolean each time the user's online status changes\n */\n static getActivity(pubKey, callback) {\n let timeout;\n publicState().user(pubKey).get(`activity`).on(activity => {\n if (!activity || !(activity.time && activity.status)) { return; }\n clearTimeout(timeout);\n const now = new Date(Gun.state());\n const activityDate = new Date(activity.time);\n const isActive = activityDate > new Date(now.getTime() - 10 * 1000) && activityDate < new Date(now.getTime() + 30 * 1000);\n callback({isActive, lastActive: activity.time, status: activity.status});\n if (isActive) {\n timeout = setTimeout(() => callback({isOnline: false, lastActive: activity.time}), 10000);\n }\n });\n }\n\n static formatChatLink({urlRoot, chatWith, channelId, inviter, sharedSecret, linkId}) {\n const enc = encodeURIComponent;\n if (channelId && inviter) {\n return `${urlRoot}?channelId=${enc(channelId)}&inviter=${enc(inviter)}&s=${enc(sharedSecret)}&k=${enc(linkId)}`;\n }\n return `${urlRoot}?chatWith=${enc(chatWith)}&s=${enc(sharedSecret)}&k=${enc(linkId)}`;\n }\n\n /**\n * Creates a channel link that can be used for two-way communication, i.e. only one link needs to be exchanged.\n */\n static async createChatLink(urlRoot = 'https://iris.to/') {\n const user = publicState().user();\n const key = session.getKey();\n\n // We create a new Gun user whose private key is shared with the chat link recipients.\n // Chat link recipients can contact you by writing their public key to the shared key's user space.\n const sharedKey = await Gun.SEA.pair();\n const sharedKeyString = JSON.stringify(sharedKey);\n const sharedSecret = await Gun.SEA.secret(sharedKey.epub, sharedKey);\n const encryptedSharedKey = await Gun.SEA.encrypt(sharedKeyString, sharedSecret);\n const ownerSecret = await Gun.SEA.secret(key.epub, key);\n const ownerEncryptedSharedKey = await Gun.SEA.encrypt(sharedKeyString, ownerSecret);\n let linkId = await util.getHash(encryptedSharedKey);\n linkId = linkId.slice(0, 12);\n\n // User has to exist, in order for .get(chatRequests).on() to be ever triggered\n util.gunAsAnotherUser(publicState(), sharedKey, user => {\n user.get('chatRequests').put({a: 1});\n });\n\n user.get('chatLinks').get(linkId).put({encryptedSharedKey, ownerEncryptedSharedKey});\n\n return Channel.formatChatLink({urlRoot, chatWith: key.pub, sharedSecret, linkId});\n }\n\n /**\n *\n */\n static async getMyChatLinks(urlRoot = 'https://iris.to/', callback: Function, subscribe = false) {\n const key = session.getKey();\n const user = publicState().user();\n const mySecret = await Gun.SEA.secret(key.epub, key);\n const chatLinks = [];\n user.get('chatLinks').map().on((data, linkId) => {\n if (!data || chatLinks.indexOf(linkId) !== -1) { return; }\n const channels = [];\n user.get('chatLinks').get(linkId).get('ownerEncryptedSharedKey').on(async enc => {\n if (!enc || chatLinks.indexOf(linkId) !== -1) { return; }\n chatLinks.push(linkId);\n const sharedKey = await Gun.SEA.decrypt(enc, mySecret);\n const sharedSecret = await Gun.SEA.secret(sharedKey.epub, sharedKey);\n const url = Channel.formatChatLink({urlRoot, chatWith: key.pub, sharedSecret, linkId});\n if (callback) {\n callback({url, id: linkId});\n }\n if (subscribe) {\n publicState().user(sharedKey.pub).get('chatRequests').map().on(async (encPub, requestId) => {\n if (!encPub) { return; }\n const s = JSON.stringify(encPub);\n if (channels.indexOf(s) === -1) {\n channels.push(s);\n const pub = await Gun.SEA.decrypt(encPub, sharedSecret);\n const channel = new Channel({key, participants: pub});\n channel.save();\n }\n util.gunAsAnotherUser(publicState(), sharedKey, user => { // remove the channel request after reading\n user.get('chatRequests').get(requestId).put(null);\n });\n });\n }\n });\n });\n }\n\n /**\n *\n */\n removeGroupChatLink(linkId) {\n this.chatLinks[linkId] = null;\n this.put('chatLinks', this.chatLinks);\n publicState().user().get('chatLinks').get(linkId).put(null);\n }\n\n /**\n *\n */\n static removePrivateChatLink(key, linkId) {\n publicState().user().auth(key);\n publicState().user().get('chatLinks').get(linkId).put(null);\n }\n\n /**\n *\n */\n static async deleteChannel(key, pub) {\n publicState().user().auth(key);\n const channelId = await Channel.getOurSecretChannelId(pub, key);\n publicState().user().get('channels').get(channelId).put(null);\n publicState().user().get('channels').get(channelId).off();\n }\n\n /**\n *\n */\n static async deleteGroup(key, uuid) {\n const mySecret = await Gun.SEA.secret(key.epub, key);\n const mySecretHash = await util.getHash(mySecret);\n const mySecretUuid = await util.getHash(mySecretHash + uuid);\n publicState().user().auth(key);\n publicState().user().get('channels').get(mySecretUuid).put(null);\n publicState().user().get('channels').get(mySecretUuid).off();\n }\n}\n\nexport default Channel;\n","import Channel from './Channel';\nimport session from './session';\n\nconst channels = new Map();\n\n/**\n * Private channel that only you and publicKey can read/write.\n * @param publicKey\n * @returns {Channel}\n */\nexport default function(publicKey = session.getKey(), chatLink?: string): Channel {\n let channel = channels.get(publicKey);\n if (!channel) {\n channel = new Channel({participants: publicKey, chatLink})\n channels.set(publicKey, channel);\n }\n return channel;\n}","/*!\n localForage -- Offline Storage, Improved\n Version 1.10.0\n https://localforage.github.io/localForage\n (c) 2013-2017 Mozilla, Apache License 2.0\n*/\n(function(f){if(typeof exports===\"object\"&&typeof module!==\"undefined\"){module.exports=f()}else if(typeof define===\"function\"&&define.amd){define([],f)}else{var g;if(typeof window!==\"undefined\"){g=window}else if(typeof global!==\"undefined\"){g=global}else if(typeof self!==\"undefined\"){g=self}else{g=this}g.localforage = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw (f.code=\"MODULE_NOT_FOUND\", f)}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o element; its readystatechange event will be fired asynchronously once it is inserted\n // into the document. Do so, thus queuing up the task. Remember to clean up once it's been called.\n var scriptEl = global.document.createElement('script');\n scriptEl.onreadystatechange = function () {\n nextTick();\n\n scriptEl.onreadystatechange = null;\n scriptEl.parentNode.removeChild(scriptEl);\n scriptEl = null;\n };\n global.document.documentElement.appendChild(scriptEl);\n };\n } else {\n scheduleDrain = function () {\n setTimeout(nextTick, 0);\n };\n }\n}\n\nvar draining;\nvar queue = [];\n//named nextTick for less confusing stack traces\nfunction nextTick() {\n draining = true;\n var i, oldQueue;\n var len = queue.length;\n while (len) {\n oldQueue = queue;\n queue = [];\n i = -1;\n while (++i < len) {\n oldQueue[i]();\n }\n len = queue.length;\n }\n draining = false;\n}\n\nmodule.exports = immediate;\nfunction immediate(task) {\n if (queue.push(task) === 1 && !draining) {\n scheduleDrain();\n }\n}\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{}],2:[function(_dereq_,module,exports){\n'use strict';\nvar immediate = _dereq_(1);\n\n/* istanbul ignore next */\nfunction INTERNAL() {}\n\nvar handlers = {};\n\nvar REJECTED = ['REJECTED'];\nvar FULFILLED = ['FULFILLED'];\nvar PENDING = ['PENDING'];\n\nmodule.exports = Promise;\n\nfunction Promise(resolver) {\n if (typeof resolver !== 'function') {\n throw new TypeError('resolver must be a function');\n }\n this.state = PENDING;\n this.queue = [];\n this.outcome = void 0;\n if (resolver !== INTERNAL) {\n safelyResolveThenable(this, resolver);\n }\n}\n\nPromise.prototype[\"catch\"] = function (onRejected) {\n return this.then(null, onRejected);\n};\nPromise.prototype.then = function (onFulfilled, onRejected) {\n if (typeof onFulfilled !== 'function' && this.state === FULFILLED ||\n typeof onRejected !== 'function' && this.state === REJECTED) {\n return this;\n }\n var promise = new this.constructor(INTERNAL);\n if (this.state !== PENDING) {\n var resolver = this.state === FULFILLED ? onFulfilled : onRejected;\n unwrap(promise, resolver, this.outcome);\n } else {\n this.queue.push(new QueueItem(promise, onFulfilled, onRejected));\n }\n\n return promise;\n};\nfunction QueueItem(promise, onFulfilled, onRejected) {\n this.promise = promise;\n if (typeof onFulfilled === 'function') {\n this.onFulfilled = onFulfilled;\n this.callFulfilled = this.otherCallFulfilled;\n }\n if (typeof onRejected === 'function') {\n this.onRejected = onRejected;\n this.callRejected = this.otherCallRejected;\n }\n}\nQueueItem.prototype.callFulfilled = function (value) {\n handlers.resolve(this.promise, value);\n};\nQueueItem.prototype.otherCallFulfilled = function (value) {\n unwrap(this.promise, this.onFulfilled, value);\n};\nQueueItem.prototype.callRejected = function (value) {\n handlers.reject(this.promise, value);\n};\nQueueItem.prototype.otherCallRejected = function (value) {\n unwrap(this.promise, this.onRejected, value);\n};\n\nfunction unwrap(promise, func, value) {\n immediate(function () {\n var returnValue;\n try {\n returnValue = func(value);\n } catch (e) {\n return handlers.reject(promise, e);\n }\n if (returnValue === promise) {\n handlers.reject(promise, new TypeError('Cannot resolve promise with itself'));\n } else {\n handlers.resolve(promise, returnValue);\n }\n });\n}\n\nhandlers.resolve = function (self, value) {\n var result = tryCatch(getThen, value);\n if (result.status === 'error') {\n return handlers.reject(self, result.value);\n }\n var thenable = result.value;\n\n if (thenable) {\n safelyResolveThenable(self, thenable);\n } else {\n self.state = FULFILLED;\n self.outcome = value;\n var i = -1;\n var len = self.queue.length;\n while (++i < len) {\n self.queue[i].callFulfilled(value);\n }\n }\n return self;\n};\nhandlers.reject = function (self, error) {\n self.state = REJECTED;\n self.outcome = error;\n var i = -1;\n var len = self.queue.length;\n while (++i < len) {\n self.queue[i].callRejected(error);\n }\n return self;\n};\n\nfunction getThen(obj) {\n // Make sure we only access the accessor once as required by the spec\n var then = obj && obj.then;\n if (obj && (typeof obj === 'object' || typeof obj === 'function') && typeof then === 'function') {\n return function appyThen() {\n then.apply(obj, arguments);\n };\n }\n}\n\nfunction safelyResolveThenable(self, thenable) {\n // Either fulfill, reject or reject with error\n var called = false;\n function onError(value) {\n if (called) {\n return;\n }\n called = true;\n handlers.reject(self, value);\n }\n\n function onSuccess(value) {\n if (called) {\n return;\n }\n called = true;\n handlers.resolve(self, value);\n }\n\n function tryToUnwrap() {\n thenable(onSuccess, onError);\n }\n\n var result = tryCatch(tryToUnwrap);\n if (result.status === 'error') {\n onError(result.value);\n }\n}\n\nfunction tryCatch(func, value) {\n var out = {};\n try {\n out.value = func(value);\n out.status = 'success';\n } catch (e) {\n out.status = 'error';\n out.value = e;\n }\n return out;\n}\n\nPromise.resolve = resolve;\nfunction resolve(value) {\n if (value instanceof this) {\n return value;\n }\n return handlers.resolve(new this(INTERNAL), value);\n}\n\nPromise.reject = reject;\nfunction reject(reason) {\n var promise = new this(INTERNAL);\n return handlers.reject(promise, reason);\n}\n\nPromise.all = all;\nfunction all(iterable) {\n var self = this;\n if (Object.prototype.toString.call(iterable) !== '[object Array]') {\n return this.reject(new TypeError('must be an array'));\n }\n\n var len = iterable.length;\n var called = false;\n if (!len) {\n return this.resolve([]);\n }\n\n var values = new Array(len);\n var resolved = 0;\n var i = -1;\n var promise = new this(INTERNAL);\n\n while (++i < len) {\n allResolver(iterable[i], i);\n }\n return promise;\n function allResolver(value, i) {\n self.resolve(value).then(resolveFromAll, function (error) {\n if (!called) {\n called = true;\n handlers.reject(promise, error);\n }\n });\n function resolveFromAll(outValue) {\n values[i] = outValue;\n if (++resolved === len && !called) {\n called = true;\n handlers.resolve(promise, values);\n }\n }\n }\n}\n\nPromise.race = race;\nfunction race(iterable) {\n var self = this;\n if (Object.prototype.toString.call(iterable) !== '[object Array]') {\n return this.reject(new TypeError('must be an array'));\n }\n\n var len = iterable.length;\n var called = false;\n if (!len) {\n return this.resolve([]);\n }\n\n var i = -1;\n var promise = new this(INTERNAL);\n\n while (++i < len) {\n resolver(iterable[i]);\n }\n return promise;\n function resolver(value) {\n self.resolve(value).then(function (response) {\n if (!called) {\n called = true;\n handlers.resolve(promise, response);\n }\n }, function (error) {\n if (!called) {\n called = true;\n handlers.reject(promise, error);\n }\n });\n }\n}\n\n},{\"1\":1}],3:[function(_dereq_,module,exports){\n(function (global){\n'use strict';\nif (typeof global.Promise !== 'function') {\n global.Promise = _dereq_(2);\n}\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{\"2\":2}],4:[function(_dereq_,module,exports){\n'use strict';\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction getIDB() {\n /* global indexedDB,webkitIndexedDB,mozIndexedDB,OIndexedDB,msIndexedDB */\n try {\n if (typeof indexedDB !== 'undefined') {\n return indexedDB;\n }\n if (typeof webkitIndexedDB !== 'undefined') {\n return webkitIndexedDB;\n }\n if (typeof mozIndexedDB !== 'undefined') {\n return mozIndexedDB;\n }\n if (typeof OIndexedDB !== 'undefined') {\n return OIndexedDB;\n }\n if (typeof msIndexedDB !== 'undefined') {\n return msIndexedDB;\n }\n } catch (e) {\n return;\n }\n}\n\nvar idb = getIDB();\n\nfunction isIndexedDBValid() {\n try {\n // Initialize IndexedDB; fall back to vendor-prefixed versions\n // if needed.\n if (!idb || !idb.open) {\n return false;\n }\n // We mimic PouchDB here;\n //\n // We test for openDatabase because IE Mobile identifies itself\n // as Safari. Oh the lulz...\n var isSafari = typeof openDatabase !== 'undefined' && /(Safari|iPhone|iPad|iPod)/.test(navigator.userAgent) && !/Chrome/.test(navigator.userAgent) && !/BlackBerry/.test(navigator.platform);\n\n var hasFetch = typeof fetch === 'function' && fetch.toString().indexOf('[native code') !== -1;\n\n // Safari <10.1 does not meet our requirements for IDB support\n // (see: https://github.com/pouchdb/pouchdb/issues/5572).\n // Safari 10.1 shipped with fetch, we can use that to detect it.\n // Note: this creates issues with `window.fetch` polyfills and\n // overrides; see:\n // https://github.com/localForage/localForage/issues/856\n return (!isSafari || hasFetch) && typeof indexedDB !== 'undefined' &&\n // some outdated implementations of IDB that appear on Samsung\n // and HTC Android devices <4.4 are missing IDBKeyRange\n // See: https://github.com/mozilla/localForage/issues/128\n // See: https://github.com/mozilla/localForage/issues/272\n typeof IDBKeyRange !== 'undefined';\n } catch (e) {\n return false;\n }\n}\n\n// Abstracts constructing a Blob object, so it also works in older\n// browsers that don't support the native Blob constructor. (i.e.\n// old QtWebKit versions, at least).\n// Abstracts constructing a Blob object, so it also works in older\n// browsers that don't support the native Blob constructor. (i.e.\n// old QtWebKit versions, at least).\nfunction createBlob(parts, properties) {\n /* global BlobBuilder,MSBlobBuilder,MozBlobBuilder,WebKitBlobBuilder */\n parts = parts || [];\n properties = properties || {};\n try {\n return new Blob(parts, properties);\n } catch (e) {\n if (e.name !== 'TypeError') {\n throw e;\n }\n var Builder = typeof BlobBuilder !== 'undefined' ? BlobBuilder : typeof MSBlobBuilder !== 'undefined' ? MSBlobBuilder : typeof MozBlobBuilder !== 'undefined' ? MozBlobBuilder : WebKitBlobBuilder;\n var builder = new Builder();\n for (var i = 0; i < parts.length; i += 1) {\n builder.append(parts[i]);\n }\n return builder.getBlob(properties.type);\n }\n}\n\n// This is CommonJS because lie is an external dependency, so Rollup\n// can just ignore it.\nif (typeof Promise === 'undefined') {\n // In the \"nopromises\" build this will just throw if you don't have\n // a global promise object, but it would throw anyway later.\n _dereq_(3);\n}\nvar Promise$1 = Promise;\n\nfunction executeCallback(promise, callback) {\n if (callback) {\n promise.then(function (result) {\n callback(null, result);\n }, function (error) {\n callback(error);\n });\n }\n}\n\nfunction executeTwoCallbacks(promise, callback, errorCallback) {\n if (typeof callback === 'function') {\n promise.then(callback);\n }\n\n if (typeof errorCallback === 'function') {\n promise[\"catch\"](errorCallback);\n }\n}\n\nfunction normalizeKey(key) {\n // Cast the key to a string, as that's all we can set as a key.\n if (typeof key !== 'string') {\n console.warn(key + ' used as a key, but it is not a string.');\n key = String(key);\n }\n\n return key;\n}\n\nfunction getCallback() {\n if (arguments.length && typeof arguments[arguments.length - 1] === 'function') {\n return arguments[arguments.length - 1];\n }\n}\n\n// Some code originally from async_storage.js in\n// [Gaia](https://github.com/mozilla-b2g/gaia).\n\nvar DETECT_BLOB_SUPPORT_STORE = 'local-forage-detect-blob-support';\nvar supportsBlobs = void 0;\nvar dbContexts = {};\nvar toString = Object.prototype.toString;\n\n// Transaction Modes\nvar READ_ONLY = 'readonly';\nvar READ_WRITE = 'readwrite';\n\n// Transform a binary string to an array buffer, because otherwise\n// weird stuff happens when you try to work with the binary string directly.\n// It is known.\n// From http://stackoverflow.com/questions/14967647/ (continues on next line)\n// encode-decode-image-with-base64-breaks-image (2013-04-21)\nfunction _binStringToArrayBuffer(bin) {\n var length = bin.length;\n var buf = new ArrayBuffer(length);\n var arr = new Uint8Array(buf);\n for (var i = 0; i < length; i++) {\n arr[i] = bin.charCodeAt(i);\n }\n return buf;\n}\n\n//\n// Blobs are not supported in all versions of IndexedDB, notably\n// Chrome <37 and Android <5. In those versions, storing a blob will throw.\n//\n// Various other blob bugs exist in Chrome v37-42 (inclusive).\n// Detecting them is expensive and confusing to users, and Chrome 37-42\n// is at very low usage worldwide, so we do a hacky userAgent check instead.\n//\n// content-type bug: https://code.google.com/p/chromium/issues/detail?id=408120\n// 404 bug: https://code.google.com/p/chromium/issues/detail?id=447916\n// FileReader bug: https://code.google.com/p/chromium/issues/detail?id=447836\n//\n// Code borrowed from PouchDB. See:\n// https://github.com/pouchdb/pouchdb/blob/master/packages/node_modules/pouchdb-adapter-idb/src/blobSupport.js\n//\nfunction _checkBlobSupportWithoutCaching(idb) {\n return new Promise$1(function (resolve) {\n var txn = idb.transaction(DETECT_BLOB_SUPPORT_STORE, READ_WRITE);\n var blob = createBlob(['']);\n txn.objectStore(DETECT_BLOB_SUPPORT_STORE).put(blob, 'key');\n\n txn.onabort = function (e) {\n // If the transaction aborts now its due to not being able to\n // write to the database, likely due to the disk being full\n e.preventDefault();\n e.stopPropagation();\n resolve(false);\n };\n\n txn.oncomplete = function () {\n var matchedChrome = navigator.userAgent.match(/Chrome\\/(\\d+)/);\n var matchedEdge = navigator.userAgent.match(/Edge\\//);\n // MS Edge pretends to be Chrome 42:\n // https://msdn.microsoft.com/en-us/library/hh869301%28v=vs.85%29.aspx\n resolve(matchedEdge || !matchedChrome || parseInt(matchedChrome[1], 10) >= 43);\n };\n })[\"catch\"](function () {\n return false; // error, so assume unsupported\n });\n}\n\nfunction _checkBlobSupport(idb) {\n if (typeof supportsBlobs === 'boolean') {\n return Promise$1.resolve(supportsBlobs);\n }\n return _checkBlobSupportWithoutCaching(idb).then(function (value) {\n supportsBlobs = value;\n return supportsBlobs;\n });\n}\n\nfunction _deferReadiness(dbInfo) {\n var dbContext = dbContexts[dbInfo.name];\n\n // Create a deferred object representing the current database operation.\n var deferredOperation = {};\n\n deferredOperation.promise = new Promise$1(function (resolve, reject) {\n deferredOperation.resolve = resolve;\n deferredOperation.reject = reject;\n });\n\n // Enqueue the deferred operation.\n dbContext.deferredOperations.push(deferredOperation);\n\n // Chain its promise to the database readiness.\n if (!dbContext.dbReady) {\n dbContext.dbReady = deferredOperation.promise;\n } else {\n dbContext.dbReady = dbContext.dbReady.then(function () {\n return deferredOperation.promise;\n });\n }\n}\n\nfunction _advanceReadiness(dbInfo) {\n var dbContext = dbContexts[dbInfo.name];\n\n // Dequeue a deferred operation.\n var deferredOperation = dbContext.deferredOperations.pop();\n\n // Resolve its promise (which is part of the database readiness\n // chain of promises).\n if (deferredOperation) {\n deferredOperation.resolve();\n return deferredOperation.promise;\n }\n}\n\nfunction _rejectReadiness(dbInfo, err) {\n var dbContext = dbContexts[dbInfo.name];\n\n // Dequeue a deferred operation.\n var deferredOperation = dbContext.deferredOperations.pop();\n\n // Reject its promise (which is part of the database readiness\n // chain of promises).\n if (deferredOperation) {\n deferredOperation.reject(err);\n return deferredOperation.promise;\n }\n}\n\nfunction _getConnection(dbInfo, upgradeNeeded) {\n return new Promise$1(function (resolve, reject) {\n dbContexts[dbInfo.name] = dbContexts[dbInfo.name] || createDbContext();\n\n if (dbInfo.db) {\n if (upgradeNeeded) {\n _deferReadiness(dbInfo);\n dbInfo.db.close();\n } else {\n return resolve(dbInfo.db);\n }\n }\n\n var dbArgs = [dbInfo.name];\n\n if (upgradeNeeded) {\n dbArgs.push(dbInfo.version);\n }\n\n var openreq = idb.open.apply(idb, dbArgs);\n\n if (upgradeNeeded) {\n openreq.onupgradeneeded = function (e) {\n var db = openreq.result;\n try {\n db.createObjectStore(dbInfo.storeName);\n if (e.oldVersion <= 1) {\n // Added when support for blob shims was added\n db.createObjectStore(DETECT_BLOB_SUPPORT_STORE);\n }\n } catch (ex) {\n if (ex.name === 'ConstraintError') {\n console.warn('The database \"' + dbInfo.name + '\"' + ' has been upgraded from version ' + e.oldVersion + ' to version ' + e.newVersion + ', but the storage \"' + dbInfo.storeName + '\" already exists.');\n } else {\n throw ex;\n }\n }\n };\n }\n\n openreq.onerror = function (e) {\n e.preventDefault();\n reject(openreq.error);\n };\n\n openreq.onsuccess = function () {\n var db = openreq.result;\n db.onversionchange = function (e) {\n // Triggered when the database is modified (e.g. adding an objectStore) or\n // deleted (even when initiated by other sessions in different tabs).\n // Closing the connection here prevents those operations from being blocked.\n // If the database is accessed again later by this instance, the connection\n // will be reopened or the database recreated as needed.\n e.target.close();\n };\n resolve(db);\n _advanceReadiness(dbInfo);\n };\n });\n}\n\nfunction _getOriginalConnection(dbInfo) {\n return _getConnection(dbInfo, false);\n}\n\nfunction _getUpgradedConnection(dbInfo) {\n return _getConnection(dbInfo, true);\n}\n\nfunction _isUpgradeNeeded(dbInfo, defaultVersion) {\n if (!dbInfo.db) {\n return true;\n }\n\n var isNewStore = !dbInfo.db.objectStoreNames.contains(dbInfo.storeName);\n var isDowngrade = dbInfo.version < dbInfo.db.version;\n var isUpgrade = dbInfo.version > dbInfo.db.version;\n\n if (isDowngrade) {\n // If the version is not the default one\n // then warn for impossible downgrade.\n if (dbInfo.version !== defaultVersion) {\n console.warn('The database \"' + dbInfo.name + '\"' + \" can't be downgraded from version \" + dbInfo.db.version + ' to version ' + dbInfo.version + '.');\n }\n // Align the versions to prevent errors.\n dbInfo.version = dbInfo.db.version;\n }\n\n if (isUpgrade || isNewStore) {\n // If the store is new then increment the version (if needed).\n // This will trigger an \"upgradeneeded\" event which is required\n // for creating a store.\n if (isNewStore) {\n var incVersion = dbInfo.db.version + 1;\n if (incVersion > dbInfo.version) {\n dbInfo.version = incVersion;\n }\n }\n\n return true;\n }\n\n return false;\n}\n\n// encode a blob for indexeddb engines that don't support blobs\nfunction _encodeBlob(blob) {\n return new Promise$1(function (resolve, reject) {\n var reader = new FileReader();\n reader.onerror = reject;\n reader.onloadend = function (e) {\n var base64 = btoa(e.target.result || '');\n resolve({\n __local_forage_encoded_blob: true,\n data: base64,\n type: blob.type\n });\n };\n reader.readAsBinaryString(blob);\n });\n}\n\n// decode an encoded blob\nfunction _decodeBlob(encodedBlob) {\n var arrayBuff = _binStringToArrayBuffer(atob(encodedBlob.data));\n return createBlob([arrayBuff], { type: encodedBlob.type });\n}\n\n// is this one of our fancy encoded blobs?\nfunction _isEncodedBlob(value) {\n return value && value.__local_forage_encoded_blob;\n}\n\n// Specialize the default `ready()` function by making it dependent\n// on the current database operations. Thus, the driver will be actually\n// ready when it's been initialized (default) *and* there are no pending\n// operations on the database (initiated by some other instances).\nfunction _fullyReady(callback) {\n var self = this;\n\n var promise = self._initReady().then(function () {\n var dbContext = dbContexts[self._dbInfo.name];\n\n if (dbContext && dbContext.dbReady) {\n return dbContext.dbReady;\n }\n });\n\n executeTwoCallbacks(promise, callback, callback);\n return promise;\n}\n\n// Try to establish a new db connection to replace the\n// current one which is broken (i.e. experiencing\n// InvalidStateError while creating a transaction).\nfunction _tryReconnect(dbInfo) {\n _deferReadiness(dbInfo);\n\n var dbContext = dbContexts[dbInfo.name];\n var forages = dbContext.forages;\n\n for (var i = 0; i < forages.length; i++) {\n var forage = forages[i];\n if (forage._dbInfo.db) {\n forage._dbInfo.db.close();\n forage._dbInfo.db = null;\n }\n }\n dbInfo.db = null;\n\n return _getOriginalConnection(dbInfo).then(function (db) {\n dbInfo.db = db;\n if (_isUpgradeNeeded(dbInfo)) {\n // Reopen the database for upgrading.\n return _getUpgradedConnection(dbInfo);\n }\n return db;\n }).then(function (db) {\n // store the latest db reference\n // in case the db was upgraded\n dbInfo.db = dbContext.db = db;\n for (var i = 0; i < forages.length; i++) {\n forages[i]._dbInfo.db = db;\n }\n })[\"catch\"](function (err) {\n _rejectReadiness(dbInfo, err);\n throw err;\n });\n}\n\n// FF doesn't like Promises (micro-tasks) and IDDB store operations,\n// so we have to do it with callbacks\nfunction createTransaction(dbInfo, mode, callback, retries) {\n if (retries === undefined) {\n retries = 1;\n }\n\n try {\n var tx = dbInfo.db.transaction(dbInfo.storeName, mode);\n callback(null, tx);\n } catch (err) {\n if (retries > 0 && (!dbInfo.db || err.name === 'InvalidStateError' || err.name === 'NotFoundError')) {\n return Promise$1.resolve().then(function () {\n if (!dbInfo.db || err.name === 'NotFoundError' && !dbInfo.db.objectStoreNames.contains(dbInfo.storeName) && dbInfo.version <= dbInfo.db.version) {\n // increase the db version, to create the new ObjectStore\n if (dbInfo.db) {\n dbInfo.version = dbInfo.db.version + 1;\n }\n // Reopen the database for upgrading.\n return _getUpgradedConnection(dbInfo);\n }\n }).then(function () {\n return _tryReconnect(dbInfo).then(function () {\n createTransaction(dbInfo, mode, callback, retries - 1);\n });\n })[\"catch\"](callback);\n }\n\n callback(err);\n }\n}\n\nfunction createDbContext() {\n return {\n // Running localForages sharing a database.\n forages: [],\n // Shared database.\n db: null,\n // Database readiness (promise).\n dbReady: null,\n // Deferred operations on the database.\n deferredOperations: []\n };\n}\n\n// Open the IndexedDB database (automatically creates one if one didn't\n// previously exist), using any options set in the config.\nfunction _initStorage(options) {\n var self = this;\n var dbInfo = {\n db: null\n };\n\n if (options) {\n for (var i in options) {\n dbInfo[i] = options[i];\n }\n }\n\n // Get the current context of the database;\n var dbContext = dbContexts[dbInfo.name];\n\n // ...or create a new context.\n if (!dbContext) {\n dbContext = createDbContext();\n // Register the new context in the global container.\n dbContexts[dbInfo.name] = dbContext;\n }\n\n // Register itself as a running localForage in the current context.\n dbContext.forages.push(self);\n\n // Replace the default `ready()` function with the specialized one.\n if (!self._initReady) {\n self._initReady = self.ready;\n self.ready = _fullyReady;\n }\n\n // Create an array of initialization states of the related localForages.\n var initPromises = [];\n\n function ignoreErrors() {\n // Don't handle errors here,\n // just makes sure related localForages aren't pending.\n return Promise$1.resolve();\n }\n\n for (var j = 0; j < dbContext.forages.length; j++) {\n var forage = dbContext.forages[j];\n if (forage !== self) {\n // Don't wait for itself...\n initPromises.push(forage._initReady()[\"catch\"](ignoreErrors));\n }\n }\n\n // Take a snapshot of the related localForages.\n var forages = dbContext.forages.slice(0);\n\n // Initialize the connection process only when\n // all the related localForages aren't pending.\n return Promise$1.all(initPromises).then(function () {\n dbInfo.db = dbContext.db;\n // Get the connection or open a new one without upgrade.\n return _getOriginalConnection(dbInfo);\n }).then(function (db) {\n dbInfo.db = db;\n if (_isUpgradeNeeded(dbInfo, self._defaultConfig.version)) {\n // Reopen the database for upgrading.\n return _getUpgradedConnection(dbInfo);\n }\n return db;\n }).then(function (db) {\n dbInfo.db = dbContext.db = db;\n self._dbInfo = dbInfo;\n // Share the final connection amongst related localForages.\n for (var k = 0; k < forages.length; k++) {\n var forage = forages[k];\n if (forage !== self) {\n // Self is already up-to-date.\n forage._dbInfo.db = dbInfo.db;\n forage._dbInfo.version = dbInfo.version;\n }\n }\n });\n}\n\nfunction getItem(key, callback) {\n var self = this;\n\n key = normalizeKey(key);\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n createTransaction(self._dbInfo, READ_ONLY, function (err, transaction) {\n if (err) {\n return reject(err);\n }\n\n try {\n var store = transaction.objectStore(self._dbInfo.storeName);\n var req = store.get(key);\n\n req.onsuccess = function () {\n var value = req.result;\n if (value === undefined) {\n value = null;\n }\n if (_isEncodedBlob(value)) {\n value = _decodeBlob(value);\n }\n resolve(value);\n };\n\n req.onerror = function () {\n reject(req.error);\n };\n } catch (e) {\n reject(e);\n }\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\n// Iterate over all items stored in database.\nfunction iterate(iterator, callback) {\n var self = this;\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n createTransaction(self._dbInfo, READ_ONLY, function (err, transaction) {\n if (err) {\n return reject(err);\n }\n\n try {\n var store = transaction.objectStore(self._dbInfo.storeName);\n var req = store.openCursor();\n var iterationNumber = 1;\n\n req.onsuccess = function () {\n var cursor = req.result;\n\n if (cursor) {\n var value = cursor.value;\n if (_isEncodedBlob(value)) {\n value = _decodeBlob(value);\n }\n var result = iterator(value, cursor.key, iterationNumber++);\n\n // when the iterator callback returns any\n // (non-`undefined`) value, then we stop\n // the iteration immediately\n if (result !== void 0) {\n resolve(result);\n } else {\n cursor[\"continue\"]();\n }\n } else {\n resolve();\n }\n };\n\n req.onerror = function () {\n reject(req.error);\n };\n } catch (e) {\n reject(e);\n }\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n\n return promise;\n}\n\nfunction setItem(key, value, callback) {\n var self = this;\n\n key = normalizeKey(key);\n\n var promise = new Promise$1(function (resolve, reject) {\n var dbInfo;\n self.ready().then(function () {\n dbInfo = self._dbInfo;\n if (toString.call(value) === '[object Blob]') {\n return _checkBlobSupport(dbInfo.db).then(function (blobSupport) {\n if (blobSupport) {\n return value;\n }\n return _encodeBlob(value);\n });\n }\n return value;\n }).then(function (value) {\n createTransaction(self._dbInfo, READ_WRITE, function (err, transaction) {\n if (err) {\n return reject(err);\n }\n\n try {\n var store = transaction.objectStore(self._dbInfo.storeName);\n\n // The reason we don't _save_ null is because IE 10 does\n // not support saving the `null` type in IndexedDB. How\n // ironic, given the bug below!\n // See: https://github.com/mozilla/localForage/issues/161\n if (value === null) {\n value = undefined;\n }\n\n var req = store.put(value, key);\n\n transaction.oncomplete = function () {\n // Cast to undefined so the value passed to\n // callback/promise is the same as what one would get out\n // of `getItem()` later. This leads to some weirdness\n // (setItem('foo', undefined) will return `null`), but\n // it's not my fault localStorage is our baseline and that\n // it's weird.\n if (value === undefined) {\n value = null;\n }\n\n resolve(value);\n };\n transaction.onabort = transaction.onerror = function () {\n var err = req.error ? req.error : req.transaction.error;\n reject(err);\n };\n } catch (e) {\n reject(e);\n }\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nfunction removeItem(key, callback) {\n var self = this;\n\n key = normalizeKey(key);\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n createTransaction(self._dbInfo, READ_WRITE, function (err, transaction) {\n if (err) {\n return reject(err);\n }\n\n try {\n var store = transaction.objectStore(self._dbInfo.storeName);\n // We use a Grunt task to make this safe for IE and some\n // versions of Android (including those used by Cordova).\n // Normally IE won't like `.delete()` and will insist on\n // using `['delete']()`, but we have a build step that\n // fixes this for us now.\n var req = store[\"delete\"](key);\n transaction.oncomplete = function () {\n resolve();\n };\n\n transaction.onerror = function () {\n reject(req.error);\n };\n\n // The request will be also be aborted if we've exceeded our storage\n // space.\n transaction.onabort = function () {\n var err = req.error ? req.error : req.transaction.error;\n reject(err);\n };\n } catch (e) {\n reject(e);\n }\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nfunction clear(callback) {\n var self = this;\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n createTransaction(self._dbInfo, READ_WRITE, function (err, transaction) {\n if (err) {\n return reject(err);\n }\n\n try {\n var store = transaction.objectStore(self._dbInfo.storeName);\n var req = store.clear();\n\n transaction.oncomplete = function () {\n resolve();\n };\n\n transaction.onabort = transaction.onerror = function () {\n var err = req.error ? req.error : req.transaction.error;\n reject(err);\n };\n } catch (e) {\n reject(e);\n }\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nfunction length(callback) {\n var self = this;\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n createTransaction(self._dbInfo, READ_ONLY, function (err, transaction) {\n if (err) {\n return reject(err);\n }\n\n try {\n var store = transaction.objectStore(self._dbInfo.storeName);\n var req = store.count();\n\n req.onsuccess = function () {\n resolve(req.result);\n };\n\n req.onerror = function () {\n reject(req.error);\n };\n } catch (e) {\n reject(e);\n }\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nfunction key(n, callback) {\n var self = this;\n\n var promise = new Promise$1(function (resolve, reject) {\n if (n < 0) {\n resolve(null);\n\n return;\n }\n\n self.ready().then(function () {\n createTransaction(self._dbInfo, READ_ONLY, function (err, transaction) {\n if (err) {\n return reject(err);\n }\n\n try {\n var store = transaction.objectStore(self._dbInfo.storeName);\n var advanced = false;\n var req = store.openKeyCursor();\n\n req.onsuccess = function () {\n var cursor = req.result;\n if (!cursor) {\n // this means there weren't enough keys\n resolve(null);\n\n return;\n }\n\n if (n === 0) {\n // We have the first key, return it if that's what they\n // wanted.\n resolve(cursor.key);\n } else {\n if (!advanced) {\n // Otherwise, ask the cursor to skip ahead n\n // records.\n advanced = true;\n cursor.advance(n);\n } else {\n // When we get here, we've got the nth key.\n resolve(cursor.key);\n }\n }\n };\n\n req.onerror = function () {\n reject(req.error);\n };\n } catch (e) {\n reject(e);\n }\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nfunction keys(callback) {\n var self = this;\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n createTransaction(self._dbInfo, READ_ONLY, function (err, transaction) {\n if (err) {\n return reject(err);\n }\n\n try {\n var store = transaction.objectStore(self._dbInfo.storeName);\n var req = store.openKeyCursor();\n var keys = [];\n\n req.onsuccess = function () {\n var cursor = req.result;\n\n if (!cursor) {\n resolve(keys);\n return;\n }\n\n keys.push(cursor.key);\n cursor[\"continue\"]();\n };\n\n req.onerror = function () {\n reject(req.error);\n };\n } catch (e) {\n reject(e);\n }\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nfunction dropInstance(options, callback) {\n callback = getCallback.apply(this, arguments);\n\n var currentConfig = this.config();\n options = typeof options !== 'function' && options || {};\n if (!options.name) {\n options.name = options.name || currentConfig.name;\n options.storeName = options.storeName || currentConfig.storeName;\n }\n\n var self = this;\n var promise;\n if (!options.name) {\n promise = Promise$1.reject('Invalid arguments');\n } else {\n var isCurrentDb = options.name === currentConfig.name && self._dbInfo.db;\n\n var dbPromise = isCurrentDb ? Promise$1.resolve(self._dbInfo.db) : _getOriginalConnection(options).then(function (db) {\n var dbContext = dbContexts[options.name];\n var forages = dbContext.forages;\n dbContext.db = db;\n for (var i = 0; i < forages.length; i++) {\n forages[i]._dbInfo.db = db;\n }\n return db;\n });\n\n if (!options.storeName) {\n promise = dbPromise.then(function (db) {\n _deferReadiness(options);\n\n var dbContext = dbContexts[options.name];\n var forages = dbContext.forages;\n\n db.close();\n for (var i = 0; i < forages.length; i++) {\n var forage = forages[i];\n forage._dbInfo.db = null;\n }\n\n var dropDBPromise = new Promise$1(function (resolve, reject) {\n var req = idb.deleteDatabase(options.name);\n\n req.onerror = function () {\n var db = req.result;\n if (db) {\n db.close();\n }\n reject(req.error);\n };\n\n req.onblocked = function () {\n // Closing all open connections in onversionchange handler should prevent this situation, but if\n // we do get here, it just means the request remains pending - eventually it will succeed or error\n console.warn('dropInstance blocked for database \"' + options.name + '\" until all open connections are closed');\n };\n\n req.onsuccess = function () {\n var db = req.result;\n if (db) {\n db.close();\n }\n resolve(db);\n };\n });\n\n return dropDBPromise.then(function (db) {\n dbContext.db = db;\n for (var i = 0; i < forages.length; i++) {\n var _forage = forages[i];\n _advanceReadiness(_forage._dbInfo);\n }\n })[\"catch\"](function (err) {\n (_rejectReadiness(options, err) || Promise$1.resolve())[\"catch\"](function () {});\n throw err;\n });\n });\n } else {\n promise = dbPromise.then(function (db) {\n if (!db.objectStoreNames.contains(options.storeName)) {\n return;\n }\n\n var newVersion = db.version + 1;\n\n _deferReadiness(options);\n\n var dbContext = dbContexts[options.name];\n var forages = dbContext.forages;\n\n db.close();\n for (var i = 0; i < forages.length; i++) {\n var forage = forages[i];\n forage._dbInfo.db = null;\n forage._dbInfo.version = newVersion;\n }\n\n var dropObjectPromise = new Promise$1(function (resolve, reject) {\n var req = idb.open(options.name, newVersion);\n\n req.onerror = function (err) {\n var db = req.result;\n db.close();\n reject(err);\n };\n\n req.onupgradeneeded = function () {\n var db = req.result;\n db.deleteObjectStore(options.storeName);\n };\n\n req.onsuccess = function () {\n var db = req.result;\n db.close();\n resolve(db);\n };\n });\n\n return dropObjectPromise.then(function (db) {\n dbContext.db = db;\n for (var j = 0; j < forages.length; j++) {\n var _forage2 = forages[j];\n _forage2._dbInfo.db = db;\n _advanceReadiness(_forage2._dbInfo);\n }\n })[\"catch\"](function (err) {\n (_rejectReadiness(options, err) || Promise$1.resolve())[\"catch\"](function () {});\n throw err;\n });\n });\n }\n }\n\n executeCallback(promise, callback);\n return promise;\n}\n\nvar asyncStorage = {\n _driver: 'asyncStorage',\n _initStorage: _initStorage,\n _support: isIndexedDBValid(),\n iterate: iterate,\n getItem: getItem,\n setItem: setItem,\n removeItem: removeItem,\n clear: clear,\n length: length,\n key: key,\n keys: keys,\n dropInstance: dropInstance\n};\n\nfunction isWebSQLValid() {\n return typeof openDatabase === 'function';\n}\n\n// Sadly, the best way to save binary data in WebSQL/localStorage is serializing\n// it to Base64, so this is how we store it to prevent very strange errors with less\n// verbose ways of binary <-> string data storage.\nvar BASE_CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n\nvar BLOB_TYPE_PREFIX = '~~local_forage_type~';\nvar BLOB_TYPE_PREFIX_REGEX = /^~~local_forage_type~([^~]+)~/;\n\nvar SERIALIZED_MARKER = '__lfsc__:';\nvar SERIALIZED_MARKER_LENGTH = SERIALIZED_MARKER.length;\n\n// OMG the serializations!\nvar TYPE_ARRAYBUFFER = 'arbf';\nvar TYPE_BLOB = 'blob';\nvar TYPE_INT8ARRAY = 'si08';\nvar TYPE_UINT8ARRAY = 'ui08';\nvar TYPE_UINT8CLAMPEDARRAY = 'uic8';\nvar TYPE_INT16ARRAY = 'si16';\nvar TYPE_INT32ARRAY = 'si32';\nvar TYPE_UINT16ARRAY = 'ur16';\nvar TYPE_UINT32ARRAY = 'ui32';\nvar TYPE_FLOAT32ARRAY = 'fl32';\nvar TYPE_FLOAT64ARRAY = 'fl64';\nvar TYPE_SERIALIZED_MARKER_LENGTH = SERIALIZED_MARKER_LENGTH + TYPE_ARRAYBUFFER.length;\n\nvar toString$1 = Object.prototype.toString;\n\nfunction stringToBuffer(serializedString) {\n // Fill the string into a ArrayBuffer.\n var bufferLength = serializedString.length * 0.75;\n var len = serializedString.length;\n var i;\n var p = 0;\n var encoded1, encoded2, encoded3, encoded4;\n\n if (serializedString[serializedString.length - 1] === '=') {\n bufferLength--;\n if (serializedString[serializedString.length - 2] === '=') {\n bufferLength--;\n }\n }\n\n var buffer = new ArrayBuffer(bufferLength);\n var bytes = new Uint8Array(buffer);\n\n for (i = 0; i < len; i += 4) {\n encoded1 = BASE_CHARS.indexOf(serializedString[i]);\n encoded2 = BASE_CHARS.indexOf(serializedString[i + 1]);\n encoded3 = BASE_CHARS.indexOf(serializedString[i + 2]);\n encoded4 = BASE_CHARS.indexOf(serializedString[i + 3]);\n\n /*jslint bitwise: true */\n bytes[p++] = encoded1 << 2 | encoded2 >> 4;\n bytes[p++] = (encoded2 & 15) << 4 | encoded3 >> 2;\n bytes[p++] = (encoded3 & 3) << 6 | encoded4 & 63;\n }\n return buffer;\n}\n\n// Converts a buffer to a string to store, serialized, in the backend\n// storage library.\nfunction bufferToString(buffer) {\n // base64-arraybuffer\n var bytes = new Uint8Array(buffer);\n var base64String = '';\n var i;\n\n for (i = 0; i < bytes.length; i += 3) {\n /*jslint bitwise: true */\n base64String += BASE_CHARS[bytes[i] >> 2];\n base64String += BASE_CHARS[(bytes[i] & 3) << 4 | bytes[i + 1] >> 4];\n base64String += BASE_CHARS[(bytes[i + 1] & 15) << 2 | bytes[i + 2] >> 6];\n base64String += BASE_CHARS[bytes[i + 2] & 63];\n }\n\n if (bytes.length % 3 === 2) {\n base64String = base64String.substring(0, base64String.length - 1) + '=';\n } else if (bytes.length % 3 === 1) {\n base64String = base64String.substring(0, base64String.length - 2) + '==';\n }\n\n return base64String;\n}\n\n// Serialize a value, afterwards executing a callback (which usually\n// instructs the `setItem()` callback/promise to be executed). This is how\n// we store binary data with localStorage.\nfunction serialize(value, callback) {\n var valueType = '';\n if (value) {\n valueType = toString$1.call(value);\n }\n\n // Cannot use `value instanceof ArrayBuffer` or such here, as these\n // checks fail when running the tests using casper.js...\n //\n // TODO: See why those tests fail and use a better solution.\n if (value && (valueType === '[object ArrayBuffer]' || value.buffer && toString$1.call(value.buffer) === '[object ArrayBuffer]')) {\n // Convert binary arrays to a string and prefix the string with\n // a special marker.\n var buffer;\n var marker = SERIALIZED_MARKER;\n\n if (value instanceof ArrayBuffer) {\n buffer = value;\n marker += TYPE_ARRAYBUFFER;\n } else {\n buffer = value.buffer;\n\n if (valueType === '[object Int8Array]') {\n marker += TYPE_INT8ARRAY;\n } else if (valueType === '[object Uint8Array]') {\n marker += TYPE_UINT8ARRAY;\n } else if (valueType === '[object Uint8ClampedArray]') {\n marker += TYPE_UINT8CLAMPEDARRAY;\n } else if (valueType === '[object Int16Array]') {\n marker += TYPE_INT16ARRAY;\n } else if (valueType === '[object Uint16Array]') {\n marker += TYPE_UINT16ARRAY;\n } else if (valueType === '[object Int32Array]') {\n marker += TYPE_INT32ARRAY;\n } else if (valueType === '[object Uint32Array]') {\n marker += TYPE_UINT32ARRAY;\n } else if (valueType === '[object Float32Array]') {\n marker += TYPE_FLOAT32ARRAY;\n } else if (valueType === '[object Float64Array]') {\n marker += TYPE_FLOAT64ARRAY;\n } else {\n callback(new Error('Failed to get type for BinaryArray'));\n }\n }\n\n callback(marker + bufferToString(buffer));\n } else if (valueType === '[object Blob]') {\n // Conver the blob to a binaryArray and then to a string.\n var fileReader = new FileReader();\n\n fileReader.onload = function () {\n // Backwards-compatible prefix for the blob type.\n var str = BLOB_TYPE_PREFIX + value.type + '~' + bufferToString(this.result);\n\n callback(SERIALIZED_MARKER + TYPE_BLOB + str);\n };\n\n fileReader.readAsArrayBuffer(value);\n } else {\n try {\n callback(JSON.stringify(value));\n } catch (e) {\n console.error(\"Couldn't convert value into a JSON string: \", value);\n\n callback(null, e);\n }\n }\n}\n\n// Deserialize data we've inserted into a value column/field. We place\n// special markers into our strings to mark them as encoded; this isn't\n// as nice as a meta field, but it's the only sane thing we can do whilst\n// keeping localStorage support intact.\n//\n// Oftentimes this will just deserialize JSON content, but if we have a\n// special marker (SERIALIZED_MARKER, defined above), we will extract\n// some kind of arraybuffer/binary data/typed array out of the string.\nfunction deserialize(value) {\n // If we haven't marked this string as being specially serialized (i.e.\n // something other than serialized JSON), we can just return it and be\n // done with it.\n if (value.substring(0, SERIALIZED_MARKER_LENGTH) !== SERIALIZED_MARKER) {\n return JSON.parse(value);\n }\n\n // The following code deals with deserializing some kind of Blob or\n // TypedArray. First we separate out the type of data we're dealing\n // with from the data itself.\n var serializedString = value.substring(TYPE_SERIALIZED_MARKER_LENGTH);\n var type = value.substring(SERIALIZED_MARKER_LENGTH, TYPE_SERIALIZED_MARKER_LENGTH);\n\n var blobType;\n // Backwards-compatible blob type serialization strategy.\n // DBs created with older versions of localForage will simply not have the blob type.\n if (type === TYPE_BLOB && BLOB_TYPE_PREFIX_REGEX.test(serializedString)) {\n var matcher = serializedString.match(BLOB_TYPE_PREFIX_REGEX);\n blobType = matcher[1];\n serializedString = serializedString.substring(matcher[0].length);\n }\n var buffer = stringToBuffer(serializedString);\n\n // Return the right type based on the code/type set during\n // serialization.\n switch (type) {\n case TYPE_ARRAYBUFFER:\n return buffer;\n case TYPE_BLOB:\n return createBlob([buffer], { type: blobType });\n case TYPE_INT8ARRAY:\n return new Int8Array(buffer);\n case TYPE_UINT8ARRAY:\n return new Uint8Array(buffer);\n case TYPE_UINT8CLAMPEDARRAY:\n return new Uint8ClampedArray(buffer);\n case TYPE_INT16ARRAY:\n return new Int16Array(buffer);\n case TYPE_UINT16ARRAY:\n return new Uint16Array(buffer);\n case TYPE_INT32ARRAY:\n return new Int32Array(buffer);\n case TYPE_UINT32ARRAY:\n return new Uint32Array(buffer);\n case TYPE_FLOAT32ARRAY:\n return new Float32Array(buffer);\n case TYPE_FLOAT64ARRAY:\n return new Float64Array(buffer);\n default:\n throw new Error('Unkown type: ' + type);\n }\n}\n\nvar localforageSerializer = {\n serialize: serialize,\n deserialize: deserialize,\n stringToBuffer: stringToBuffer,\n bufferToString: bufferToString\n};\n\n/*\n * Includes code from:\n *\n * base64-arraybuffer\n * https://github.com/niklasvh/base64-arraybuffer\n *\n * Copyright (c) 2012 Niklas von Hertzen\n * Licensed under the MIT license.\n */\n\nfunction createDbTable(t, dbInfo, callback, errorCallback) {\n t.executeSql('CREATE TABLE IF NOT EXISTS ' + dbInfo.storeName + ' ' + '(id INTEGER PRIMARY KEY, key unique, value)', [], callback, errorCallback);\n}\n\n// Open the WebSQL database (automatically creates one if one didn't\n// previously exist), using any options set in the config.\nfunction _initStorage$1(options) {\n var self = this;\n var dbInfo = {\n db: null\n };\n\n if (options) {\n for (var i in options) {\n dbInfo[i] = typeof options[i] !== 'string' ? options[i].toString() : options[i];\n }\n }\n\n var dbInfoPromise = new Promise$1(function (resolve, reject) {\n // Open the database; the openDatabase API will automatically\n // create it for us if it doesn't exist.\n try {\n dbInfo.db = openDatabase(dbInfo.name, String(dbInfo.version), dbInfo.description, dbInfo.size);\n } catch (e) {\n return reject(e);\n }\n\n // Create our key/value table if it doesn't exist.\n dbInfo.db.transaction(function (t) {\n createDbTable(t, dbInfo, function () {\n self._dbInfo = dbInfo;\n resolve();\n }, function (t, error) {\n reject(error);\n });\n }, reject);\n });\n\n dbInfo.serializer = localforageSerializer;\n return dbInfoPromise;\n}\n\nfunction tryExecuteSql(t, dbInfo, sqlStatement, args, callback, errorCallback) {\n t.executeSql(sqlStatement, args, callback, function (t, error) {\n if (error.code === error.SYNTAX_ERR) {\n t.executeSql('SELECT name FROM sqlite_master ' + \"WHERE type='table' AND name = ?\", [dbInfo.storeName], function (t, results) {\n if (!results.rows.length) {\n // if the table is missing (was deleted)\n // re-create it table and retry\n createDbTable(t, dbInfo, function () {\n t.executeSql(sqlStatement, args, callback, errorCallback);\n }, errorCallback);\n } else {\n errorCallback(t, error);\n }\n }, errorCallback);\n } else {\n errorCallback(t, error);\n }\n }, errorCallback);\n}\n\nfunction getItem$1(key, callback) {\n var self = this;\n\n key = normalizeKey(key);\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n var dbInfo = self._dbInfo;\n dbInfo.db.transaction(function (t) {\n tryExecuteSql(t, dbInfo, 'SELECT * FROM ' + dbInfo.storeName + ' WHERE key = ? LIMIT 1', [key], function (t, results) {\n var result = results.rows.length ? results.rows.item(0).value : null;\n\n // Check to see if this is serialized content we need to\n // unpack.\n if (result) {\n result = dbInfo.serializer.deserialize(result);\n }\n\n resolve(result);\n }, function (t, error) {\n reject(error);\n });\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nfunction iterate$1(iterator, callback) {\n var self = this;\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n var dbInfo = self._dbInfo;\n\n dbInfo.db.transaction(function (t) {\n tryExecuteSql(t, dbInfo, 'SELECT * FROM ' + dbInfo.storeName, [], function (t, results) {\n var rows = results.rows;\n var length = rows.length;\n\n for (var i = 0; i < length; i++) {\n var item = rows.item(i);\n var result = item.value;\n\n // Check to see if this is serialized content\n // we need to unpack.\n if (result) {\n result = dbInfo.serializer.deserialize(result);\n }\n\n result = iterator(result, item.key, i + 1);\n\n // void(0) prevents problems with redefinition\n // of `undefined`.\n if (result !== void 0) {\n resolve(result);\n return;\n }\n }\n\n resolve();\n }, function (t, error) {\n reject(error);\n });\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nfunction _setItem(key, value, callback, retriesLeft) {\n var self = this;\n\n key = normalizeKey(key);\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n // The localStorage API doesn't return undefined values in an\n // \"expected\" way, so undefined is always cast to null in all\n // drivers. See: https://github.com/mozilla/localForage/pull/42\n if (value === undefined) {\n value = null;\n }\n\n // Save the original value to pass to the callback.\n var originalValue = value;\n\n var dbInfo = self._dbInfo;\n dbInfo.serializer.serialize(value, function (value, error) {\n if (error) {\n reject(error);\n } else {\n dbInfo.db.transaction(function (t) {\n tryExecuteSql(t, dbInfo, 'INSERT OR REPLACE INTO ' + dbInfo.storeName + ' ' + '(key, value) VALUES (?, ?)', [key, value], function () {\n resolve(originalValue);\n }, function (t, error) {\n reject(error);\n });\n }, function (sqlError) {\n // The transaction failed; check\n // to see if it's a quota error.\n if (sqlError.code === sqlError.QUOTA_ERR) {\n // We reject the callback outright for now, but\n // it's worth trying to re-run the transaction.\n // Even if the user accepts the prompt to use\n // more storage on Safari, this error will\n // be called.\n //\n // Try to re-run the transaction.\n if (retriesLeft > 0) {\n resolve(_setItem.apply(self, [key, originalValue, callback, retriesLeft - 1]));\n return;\n }\n reject(sqlError);\n }\n });\n }\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nfunction setItem$1(key, value, callback) {\n return _setItem.apply(this, [key, value, callback, 1]);\n}\n\nfunction removeItem$1(key, callback) {\n var self = this;\n\n key = normalizeKey(key);\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n var dbInfo = self._dbInfo;\n dbInfo.db.transaction(function (t) {\n tryExecuteSql(t, dbInfo, 'DELETE FROM ' + dbInfo.storeName + ' WHERE key = ?', [key], function () {\n resolve();\n }, function (t, error) {\n reject(error);\n });\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\n// Deletes every item in the table.\n// TODO: Find out if this resets the AUTO_INCREMENT number.\nfunction clear$1(callback) {\n var self = this;\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n var dbInfo = self._dbInfo;\n dbInfo.db.transaction(function (t) {\n tryExecuteSql(t, dbInfo, 'DELETE FROM ' + dbInfo.storeName, [], function () {\n resolve();\n }, function (t, error) {\n reject(error);\n });\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\n// Does a simple `COUNT(key)` to get the number of items stored in\n// localForage.\nfunction length$1(callback) {\n var self = this;\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n var dbInfo = self._dbInfo;\n dbInfo.db.transaction(function (t) {\n // Ahhh, SQL makes this one soooooo easy.\n tryExecuteSql(t, dbInfo, 'SELECT COUNT(key) as c FROM ' + dbInfo.storeName, [], function (t, results) {\n var result = results.rows.item(0).c;\n resolve(result);\n }, function (t, error) {\n reject(error);\n });\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\n// Return the key located at key index X; essentially gets the key from a\n// `WHERE id = ?`. This is the most efficient way I can think to implement\n// this rarely-used (in my experience) part of the API, but it can seem\n// inconsistent, because we do `INSERT OR REPLACE INTO` on `setItem()`, so\n// the ID of each key will change every time it's updated. Perhaps a stored\n// procedure for the `setItem()` SQL would solve this problem?\n// TODO: Don't change ID on `setItem()`.\nfunction key$1(n, callback) {\n var self = this;\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n var dbInfo = self._dbInfo;\n dbInfo.db.transaction(function (t) {\n tryExecuteSql(t, dbInfo, 'SELECT key FROM ' + dbInfo.storeName + ' WHERE id = ? LIMIT 1', [n + 1], function (t, results) {\n var result = results.rows.length ? results.rows.item(0).key : null;\n resolve(result);\n }, function (t, error) {\n reject(error);\n });\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nfunction keys$1(callback) {\n var self = this;\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n var dbInfo = self._dbInfo;\n dbInfo.db.transaction(function (t) {\n tryExecuteSql(t, dbInfo, 'SELECT key FROM ' + dbInfo.storeName, [], function (t, results) {\n var keys = [];\n\n for (var i = 0; i < results.rows.length; i++) {\n keys.push(results.rows.item(i).key);\n }\n\n resolve(keys);\n }, function (t, error) {\n reject(error);\n });\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\n// https://www.w3.org/TR/webdatabase/#databases\n// > There is no way to enumerate or delete the databases available for an origin from this API.\nfunction getAllStoreNames(db) {\n return new Promise$1(function (resolve, reject) {\n db.transaction(function (t) {\n t.executeSql('SELECT name FROM sqlite_master ' + \"WHERE type='table' AND name <> '__WebKitDatabaseInfoTable__'\", [], function (t, results) {\n var storeNames = [];\n\n for (var i = 0; i < results.rows.length; i++) {\n storeNames.push(results.rows.item(i).name);\n }\n\n resolve({\n db: db,\n storeNames: storeNames\n });\n }, function (t, error) {\n reject(error);\n });\n }, function (sqlError) {\n reject(sqlError);\n });\n });\n}\n\nfunction dropInstance$1(options, callback) {\n callback = getCallback.apply(this, arguments);\n\n var currentConfig = this.config();\n options = typeof options !== 'function' && options || {};\n if (!options.name) {\n options.name = options.name || currentConfig.name;\n options.storeName = options.storeName || currentConfig.storeName;\n }\n\n var self = this;\n var promise;\n if (!options.name) {\n promise = Promise$1.reject('Invalid arguments');\n } else {\n promise = new Promise$1(function (resolve) {\n var db;\n if (options.name === currentConfig.name) {\n // use the db reference of the current instance\n db = self._dbInfo.db;\n } else {\n db = openDatabase(options.name, '', '', 0);\n }\n\n if (!options.storeName) {\n // drop all database tables\n resolve(getAllStoreNames(db));\n } else {\n resolve({\n db: db,\n storeNames: [options.storeName]\n });\n }\n }).then(function (operationInfo) {\n return new Promise$1(function (resolve, reject) {\n operationInfo.db.transaction(function (t) {\n function dropTable(storeName) {\n return new Promise$1(function (resolve, reject) {\n t.executeSql('DROP TABLE IF EXISTS ' + storeName, [], function () {\n resolve();\n }, function (t, error) {\n reject(error);\n });\n });\n }\n\n var operations = [];\n for (var i = 0, len = operationInfo.storeNames.length; i < len; i++) {\n operations.push(dropTable(operationInfo.storeNames[i]));\n }\n\n Promise$1.all(operations).then(function () {\n resolve();\n })[\"catch\"](function (e) {\n reject(e);\n });\n }, function (sqlError) {\n reject(sqlError);\n });\n });\n });\n }\n\n executeCallback(promise, callback);\n return promise;\n}\n\nvar webSQLStorage = {\n _driver: 'webSQLStorage',\n _initStorage: _initStorage$1,\n _support: isWebSQLValid(),\n iterate: iterate$1,\n getItem: getItem$1,\n setItem: setItem$1,\n removeItem: removeItem$1,\n clear: clear$1,\n length: length$1,\n key: key$1,\n keys: keys$1,\n dropInstance: dropInstance$1\n};\n\nfunction isLocalStorageValid() {\n try {\n return typeof localStorage !== 'undefined' && 'setItem' in localStorage &&\n // in IE8 typeof localStorage.setItem === 'object'\n !!localStorage.setItem;\n } catch (e) {\n return false;\n }\n}\n\nfunction _getKeyPrefix(options, defaultConfig) {\n var keyPrefix = options.name + '/';\n\n if (options.storeName !== defaultConfig.storeName) {\n keyPrefix += options.storeName + '/';\n }\n return keyPrefix;\n}\n\n// Check if localStorage throws when saving an item\nfunction checkIfLocalStorageThrows() {\n var localStorageTestKey = '_localforage_support_test';\n\n try {\n localStorage.setItem(localStorageTestKey, true);\n localStorage.removeItem(localStorageTestKey);\n\n return false;\n } catch (e) {\n return true;\n }\n}\n\n// Check if localStorage is usable and allows to save an item\n// This method checks if localStorage is usable in Safari Private Browsing\n// mode, or in any other case where the available quota for localStorage\n// is 0 and there wasn't any saved items yet.\nfunction _isLocalStorageUsable() {\n return !checkIfLocalStorageThrows() || localStorage.length > 0;\n}\n\n// Config the localStorage backend, using options set in the config.\nfunction _initStorage$2(options) {\n var self = this;\n var dbInfo = {};\n if (options) {\n for (var i in options) {\n dbInfo[i] = options[i];\n }\n }\n\n dbInfo.keyPrefix = _getKeyPrefix(options, self._defaultConfig);\n\n if (!_isLocalStorageUsable()) {\n return Promise$1.reject();\n }\n\n self._dbInfo = dbInfo;\n dbInfo.serializer = localforageSerializer;\n\n return Promise$1.resolve();\n}\n\n// Remove all keys from the datastore, effectively destroying all data in\n// the app's key/value store!\nfunction clear$2(callback) {\n var self = this;\n var promise = self.ready().then(function () {\n var keyPrefix = self._dbInfo.keyPrefix;\n\n for (var i = localStorage.length - 1; i >= 0; i--) {\n var key = localStorage.key(i);\n\n if (key.indexOf(keyPrefix) === 0) {\n localStorage.removeItem(key);\n }\n }\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\n// Retrieve an item from the store. Unlike the original async_storage\n// library in Gaia, we don't modify return values at all. If a key's value\n// is `undefined`, we pass that value to the callback function.\nfunction getItem$2(key, callback) {\n var self = this;\n\n key = normalizeKey(key);\n\n var promise = self.ready().then(function () {\n var dbInfo = self._dbInfo;\n var result = localStorage.getItem(dbInfo.keyPrefix + key);\n\n // If a result was found, parse it from the serialized\n // string into a JS object. If result isn't truthy, the key\n // is likely undefined and we'll pass it straight to the\n // callback.\n if (result) {\n result = dbInfo.serializer.deserialize(result);\n }\n\n return result;\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\n// Iterate over all items in the store.\nfunction iterate$2(iterator, callback) {\n var self = this;\n\n var promise = self.ready().then(function () {\n var dbInfo = self._dbInfo;\n var keyPrefix = dbInfo.keyPrefix;\n var keyPrefixLength = keyPrefix.length;\n var length = localStorage.length;\n\n // We use a dedicated iterator instead of the `i` variable below\n // so other keys we fetch in localStorage aren't counted in\n // the `iterationNumber` argument passed to the `iterate()`\n // callback.\n //\n // See: github.com/mozilla/localForage/pull/435#discussion_r38061530\n var iterationNumber = 1;\n\n for (var i = 0; i < length; i++) {\n var key = localStorage.key(i);\n if (key.indexOf(keyPrefix) !== 0) {\n continue;\n }\n var value = localStorage.getItem(key);\n\n // If a result was found, parse it from the serialized\n // string into a JS object. If result isn't truthy, the\n // key is likely undefined and we'll pass it straight\n // to the iterator.\n if (value) {\n value = dbInfo.serializer.deserialize(value);\n }\n\n value = iterator(value, key.substring(keyPrefixLength), iterationNumber++);\n\n if (value !== void 0) {\n return value;\n }\n }\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\n// Same as localStorage's key() method, except takes a callback.\nfunction key$2(n, callback) {\n var self = this;\n var promise = self.ready().then(function () {\n var dbInfo = self._dbInfo;\n var result;\n try {\n result = localStorage.key(n);\n } catch (error) {\n result = null;\n }\n\n // Remove the prefix from the key, if a key is found.\n if (result) {\n result = result.substring(dbInfo.keyPrefix.length);\n }\n\n return result;\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nfunction keys$2(callback) {\n var self = this;\n var promise = self.ready().then(function () {\n var dbInfo = self._dbInfo;\n var length = localStorage.length;\n var keys = [];\n\n for (var i = 0; i < length; i++) {\n var itemKey = localStorage.key(i);\n if (itemKey.indexOf(dbInfo.keyPrefix) === 0) {\n keys.push(itemKey.substring(dbInfo.keyPrefix.length));\n }\n }\n\n return keys;\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\n// Supply the number of keys in the datastore to the callback function.\nfunction length$2(callback) {\n var self = this;\n var promise = self.keys().then(function (keys) {\n return keys.length;\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\n// Remove an item from the store, nice and simple.\nfunction removeItem$2(key, callback) {\n var self = this;\n\n key = normalizeKey(key);\n\n var promise = self.ready().then(function () {\n var dbInfo = self._dbInfo;\n localStorage.removeItem(dbInfo.keyPrefix + key);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\n// Set a key's value and run an optional callback once the value is set.\n// Unlike Gaia's implementation, the callback function is passed the value,\n// in case you want to operate on that value only after you're sure it\n// saved, or something like that.\nfunction setItem$2(key, value, callback) {\n var self = this;\n\n key = normalizeKey(key);\n\n var promise = self.ready().then(function () {\n // Convert undefined values to null.\n // https://github.com/mozilla/localForage/pull/42\n if (value === undefined) {\n value = null;\n }\n\n // Save the original value to pass to the callback.\n var originalValue = value;\n\n return new Promise$1(function (resolve, reject) {\n var dbInfo = self._dbInfo;\n dbInfo.serializer.serialize(value, function (value, error) {\n if (error) {\n reject(error);\n } else {\n try {\n localStorage.setItem(dbInfo.keyPrefix + key, value);\n resolve(originalValue);\n } catch (e) {\n // localStorage capacity exceeded.\n // TODO: Make this a specific error/event.\n if (e.name === 'QuotaExceededError' || e.name === 'NS_ERROR_DOM_QUOTA_REACHED') {\n reject(e);\n }\n reject(e);\n }\n }\n });\n });\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nfunction dropInstance$2(options, callback) {\n callback = getCallback.apply(this, arguments);\n\n options = typeof options !== 'function' && options || {};\n if (!options.name) {\n var currentConfig = this.config();\n options.name = options.name || currentConfig.name;\n options.storeName = options.storeName || currentConfig.storeName;\n }\n\n var self = this;\n var promise;\n if (!options.name) {\n promise = Promise$1.reject('Invalid arguments');\n } else {\n promise = new Promise$1(function (resolve) {\n if (!options.storeName) {\n resolve(options.name + '/');\n } else {\n resolve(_getKeyPrefix(options, self._defaultConfig));\n }\n }).then(function (keyPrefix) {\n for (var i = localStorage.length - 1; i >= 0; i--) {\n var key = localStorage.key(i);\n\n if (key.indexOf(keyPrefix) === 0) {\n localStorage.removeItem(key);\n }\n }\n });\n }\n\n executeCallback(promise, callback);\n return promise;\n}\n\nvar localStorageWrapper = {\n _driver: 'localStorageWrapper',\n _initStorage: _initStorage$2,\n _support: isLocalStorageValid(),\n iterate: iterate$2,\n getItem: getItem$2,\n setItem: setItem$2,\n removeItem: removeItem$2,\n clear: clear$2,\n length: length$2,\n key: key$2,\n keys: keys$2,\n dropInstance: dropInstance$2\n};\n\nvar sameValue = function sameValue(x, y) {\n return x === y || typeof x === 'number' && typeof y === 'number' && isNaN(x) && isNaN(y);\n};\n\nvar includes = function includes(array, searchElement) {\n var len = array.length;\n var i = 0;\n while (i < len) {\n if (sameValue(array[i], searchElement)) {\n return true;\n }\n i++;\n }\n\n return false;\n};\n\nvar isArray = Array.isArray || function (arg) {\n return Object.prototype.toString.call(arg) === '[object Array]';\n};\n\n// Drivers are stored here when `defineDriver()` is called.\n// They are shared across all instances of localForage.\nvar DefinedDrivers = {};\n\nvar DriverSupport = {};\n\nvar DefaultDrivers = {\n INDEXEDDB: asyncStorage,\n WEBSQL: webSQLStorage,\n LOCALSTORAGE: localStorageWrapper\n};\n\nvar DefaultDriverOrder = [DefaultDrivers.INDEXEDDB._driver, DefaultDrivers.WEBSQL._driver, DefaultDrivers.LOCALSTORAGE._driver];\n\nvar OptionalDriverMethods = ['dropInstance'];\n\nvar LibraryMethods = ['clear', 'getItem', 'iterate', 'key', 'keys', 'length', 'removeItem', 'setItem'].concat(OptionalDriverMethods);\n\nvar DefaultConfig = {\n description: '',\n driver: DefaultDriverOrder.slice(),\n name: 'localforage',\n // Default DB size is _JUST UNDER_ 5MB, as it's the highest size\n // we can use without a prompt.\n size: 4980736,\n storeName: 'keyvaluepairs',\n version: 1.0\n};\n\nfunction callWhenReady(localForageInstance, libraryMethod) {\n localForageInstance[libraryMethod] = function () {\n var _args = arguments;\n return localForageInstance.ready().then(function () {\n return localForageInstance[libraryMethod].apply(localForageInstance, _args);\n });\n };\n}\n\nfunction extend() {\n for (var i = 1; i < arguments.length; i++) {\n var arg = arguments[i];\n\n if (arg) {\n for (var _key in arg) {\n if (arg.hasOwnProperty(_key)) {\n if (isArray(arg[_key])) {\n arguments[0][_key] = arg[_key].slice();\n } else {\n arguments[0][_key] = arg[_key];\n }\n }\n }\n }\n }\n\n return arguments[0];\n}\n\nvar LocalForage = function () {\n function LocalForage(options) {\n _classCallCheck(this, LocalForage);\n\n for (var driverTypeKey in DefaultDrivers) {\n if (DefaultDrivers.hasOwnProperty(driverTypeKey)) {\n var driver = DefaultDrivers[driverTypeKey];\n var driverName = driver._driver;\n this[driverTypeKey] = driverName;\n\n if (!DefinedDrivers[driverName]) {\n // we don't need to wait for the promise,\n // since the default drivers can be defined\n // in a blocking manner\n this.defineDriver(driver);\n }\n }\n }\n\n this._defaultConfig = extend({}, DefaultConfig);\n this._config = extend({}, this._defaultConfig, options);\n this._driverSet = null;\n this._initDriver = null;\n this._ready = false;\n this._dbInfo = null;\n\n this._wrapLibraryMethodsWithReady();\n this.setDriver(this._config.driver)[\"catch\"](function () {});\n }\n\n // Set any config values for localForage; can be called anytime before\n // the first API call (e.g. `getItem`, `setItem`).\n // We loop through options so we don't overwrite existing config\n // values.\n\n\n LocalForage.prototype.config = function config(options) {\n // If the options argument is an object, we use it to set values.\n // Otherwise, we return either a specified config value or all\n // config values.\n if ((typeof options === 'undefined' ? 'undefined' : _typeof(options)) === 'object') {\n // If localforage is ready and fully initialized, we can't set\n // any new configuration values. Instead, we return an error.\n if (this._ready) {\n return new Error(\"Can't call config() after localforage \" + 'has been used.');\n }\n\n for (var i in options) {\n if (i === 'storeName') {\n options[i] = options[i].replace(/\\W/g, '_');\n }\n\n if (i === 'version' && typeof options[i] !== 'number') {\n return new Error('Database version must be a number.');\n }\n\n this._config[i] = options[i];\n }\n\n // after all config options are set and\n // the driver option is used, try setting it\n if ('driver' in options && options.driver) {\n return this.setDriver(this._config.driver);\n }\n\n return true;\n } else if (typeof options === 'string') {\n return this._config[options];\n } else {\n return this._config;\n }\n };\n\n // Used to define a custom driver, shared across all instances of\n // localForage.\n\n\n LocalForage.prototype.defineDriver = function defineDriver(driverObject, callback, errorCallback) {\n var promise = new Promise$1(function (resolve, reject) {\n try {\n var driverName = driverObject._driver;\n var complianceError = new Error('Custom driver not compliant; see ' + 'https://mozilla.github.io/localForage/#definedriver');\n\n // A driver name should be defined and not overlap with the\n // library-defined, default drivers.\n if (!driverObject._driver) {\n reject(complianceError);\n return;\n }\n\n var driverMethods = LibraryMethods.concat('_initStorage');\n for (var i = 0, len = driverMethods.length; i < len; i++) {\n var driverMethodName = driverMethods[i];\n\n // when the property is there,\n // it should be a method even when optional\n var isRequired = !includes(OptionalDriverMethods, driverMethodName);\n if ((isRequired || driverObject[driverMethodName]) && typeof driverObject[driverMethodName] !== 'function') {\n reject(complianceError);\n return;\n }\n }\n\n var configureMissingMethods = function configureMissingMethods() {\n var methodNotImplementedFactory = function methodNotImplementedFactory(methodName) {\n return function () {\n var error = new Error('Method ' + methodName + ' is not implemented by the current driver');\n var promise = Promise$1.reject(error);\n executeCallback(promise, arguments[arguments.length - 1]);\n return promise;\n };\n };\n\n for (var _i = 0, _len = OptionalDriverMethods.length; _i < _len; _i++) {\n var optionalDriverMethod = OptionalDriverMethods[_i];\n if (!driverObject[optionalDriverMethod]) {\n driverObject[optionalDriverMethod] = methodNotImplementedFactory(optionalDriverMethod);\n }\n }\n };\n\n configureMissingMethods();\n\n var setDriverSupport = function setDriverSupport(support) {\n if (DefinedDrivers[driverName]) {\n console.info('Redefining LocalForage driver: ' + driverName);\n }\n DefinedDrivers[driverName] = driverObject;\n DriverSupport[driverName] = support;\n // don't use a then, so that we can define\n // drivers that have simple _support methods\n // in a blocking manner\n resolve();\n };\n\n if ('_support' in driverObject) {\n if (driverObject._support && typeof driverObject._support === 'function') {\n driverObject._support().then(setDriverSupport, reject);\n } else {\n setDriverSupport(!!driverObject._support);\n }\n } else {\n setDriverSupport(true);\n }\n } catch (e) {\n reject(e);\n }\n });\n\n executeTwoCallbacks(promise, callback, errorCallback);\n return promise;\n };\n\n LocalForage.prototype.driver = function driver() {\n return this._driver || null;\n };\n\n LocalForage.prototype.getDriver = function getDriver(driverName, callback, errorCallback) {\n var getDriverPromise = DefinedDrivers[driverName] ? Promise$1.resolve(DefinedDrivers[driverName]) : Promise$1.reject(new Error('Driver not found.'));\n\n executeTwoCallbacks(getDriverPromise, callback, errorCallback);\n return getDriverPromise;\n };\n\n LocalForage.prototype.getSerializer = function getSerializer(callback) {\n var serializerPromise = Promise$1.resolve(localforageSerializer);\n executeTwoCallbacks(serializerPromise, callback);\n return serializerPromise;\n };\n\n LocalForage.prototype.ready = function ready(callback) {\n var self = this;\n\n var promise = self._driverSet.then(function () {\n if (self._ready === null) {\n self._ready = self._initDriver();\n }\n\n return self._ready;\n });\n\n executeTwoCallbacks(promise, callback, callback);\n return promise;\n };\n\n LocalForage.prototype.setDriver = function setDriver(drivers, callback, errorCallback) {\n var self = this;\n\n if (!isArray(drivers)) {\n drivers = [drivers];\n }\n\n var supportedDrivers = this._getSupportedDrivers(drivers);\n\n function setDriverToConfig() {\n self._config.driver = self.driver();\n }\n\n function extendSelfWithDriver(driver) {\n self._extend(driver);\n setDriverToConfig();\n\n self._ready = self._initStorage(self._config);\n return self._ready;\n }\n\n function initDriver(supportedDrivers) {\n return function () {\n var currentDriverIndex = 0;\n\n function driverPromiseLoop() {\n while (currentDriverIndex < supportedDrivers.length) {\n var driverName = supportedDrivers[currentDriverIndex];\n currentDriverIndex++;\n\n self._dbInfo = null;\n self._ready = null;\n\n return self.getDriver(driverName).then(extendSelfWithDriver)[\"catch\"](driverPromiseLoop);\n }\n\n setDriverToConfig();\n var error = new Error('No available storage method found.');\n self._driverSet = Promise$1.reject(error);\n return self._driverSet;\n }\n\n return driverPromiseLoop();\n };\n }\n\n // There might be a driver initialization in progress\n // so wait for it to finish in order to avoid a possible\n // race condition to set _dbInfo\n var oldDriverSetDone = this._driverSet !== null ? this._driverSet[\"catch\"](function () {\n return Promise$1.resolve();\n }) : Promise$1.resolve();\n\n this._driverSet = oldDriverSetDone.then(function () {\n var driverName = supportedDrivers[0];\n self._dbInfo = null;\n self._ready = null;\n\n return self.getDriver(driverName).then(function (driver) {\n self._driver = driver._driver;\n setDriverToConfig();\n self._wrapLibraryMethodsWithReady();\n self._initDriver = initDriver(supportedDrivers);\n });\n })[\"catch\"](function () {\n setDriverToConfig();\n var error = new Error('No available storage method found.');\n self._driverSet = Promise$1.reject(error);\n return self._driverSet;\n });\n\n executeTwoCallbacks(this._driverSet, callback, errorCallback);\n return this._driverSet;\n };\n\n LocalForage.prototype.supports = function supports(driverName) {\n return !!DriverSupport[driverName];\n };\n\n LocalForage.prototype._extend = function _extend(libraryMethodsAndProperties) {\n extend(this, libraryMethodsAndProperties);\n };\n\n LocalForage.prototype._getSupportedDrivers = function _getSupportedDrivers(drivers) {\n var supportedDrivers = [];\n for (var i = 0, len = drivers.length; i < len; i++) {\n var driverName = drivers[i];\n if (this.supports(driverName)) {\n supportedDrivers.push(driverName);\n }\n }\n return supportedDrivers;\n };\n\n LocalForage.prototype._wrapLibraryMethodsWithReady = function _wrapLibraryMethodsWithReady() {\n // Add a stub for each driver API method that delays the call to the\n // corresponding driver method until localForage is ready. These stubs\n // will be replaced by the driver methods as soon as the driver is\n // loaded, so there is no performance impact.\n for (var i = 0, len = LibraryMethods.length; i < len; i++) {\n callWhenReady(this, LibraryMethods[i]);\n }\n };\n\n LocalForage.prototype.createInstance = function createInstance(options) {\n return new LocalForage(options);\n };\n\n return LocalForage;\n}();\n\n// The actual localForage object that we expose as a module or via a\n// global. It's extended by pulling in one of our other libraries.\n\n\nvar localforage_js = new LocalForage();\n\nmodule.exports = localforage_js;\n\n},{\"3\":3}]},{},[4])(4)\n});\n","// @ts-nocheck\n\nimport localForage from 'localforage';\nimport _ from './lodash';\n\ntype MyEventListener = {\n off: Function\n};\n\n// Localforage returns null if an item is not found, so we represent null with this uuid instead.\n// not foolproof, but good enough for now.\nconst LOCALFORAGE_NULL = \"c2fc1ad0-f76f-11ec-b939-0242ac120002\";\nconst notInLocalForage = new Set();\n\nlocalForage.config({\n driver: [localForage.LOCALSTORAGE, localForage.INDEXEDDB, localForage.WEBSQL]\n})\n\n/**\n Our very own implementation of the Gun API\n */\nexport default class Node {\n id: string;\n parent: Node | null;\n children = new Map();\n on_subscriptions = new Map();\n map_subscriptions = new Map();\n value: any = undefined;\n counter = 0;\n loaded = false;\n\n /** */\n constructor(id: string = '', parent: Node|null = null) {\n this.id = id;\n this.parent = parent;\n }\n\n saveLocalForage = _.throttle(async () => {\n if (!this.loaded) {\n await this.loadLocalForage();\n }\n if (this.children.size) {\n const children = Array.from(this.children.keys());\n localForage.setItem(this.id, children);\n } else if (this.value === undefined) {\n localForage.removeItem(this.id);\n } else {\n localForage.setItem(this.id, this.value === null ? LOCALFORAGE_NULL : this.value);\n }\n }, 500);\n\n loadLocalForage = _.throttle(async () => {\n if (notInLocalForage.has(this.id)) {\n return undefined;\n }\n // try to get the value from localforage\n let result = await localForage.getItem(this.id);\n // getItem returns null if not found\n if (result === null) {\n result = undefined;\n notInLocalForage.add(this.id);\n } else if (result === LOCALFORAGE_NULL) {\n result = null;\n } else if (Array.isArray(result)) {\n // result is a list of children\n const newResult = {};\n await Promise.all(result.map(async key => {\n newResult[key] = await this.get(key).once();\n }));\n result = newResult;\n } else {\n // result is a value\n this.value = result;\n }\n this.loaded = true;\n return result;\n }, 500);\n\n doCallbacks = _.throttle(() => {\n for (const [id, callback] of this.on_subscriptions) {\n const event = { off: () => this.on_subscriptions.delete(id) };\n this.once(callback, event, false);\n }\n if (this.parent) {\n for (const [id, callback] of this.parent.on_subscriptions) {\n const event = { off: () => this.parent.on_subscriptions.delete(id) };\n this.parent.once(callback, event, false);\n }\n for (const [id, callback] of this.parent.map_subscriptions) {\n const event = { off: () => this.parent.map_subscriptions.delete(id) };\n this.once(callback, event, false);\n }\n }\n }, 40);\n\n /**\n *\n * @param key\n * @returns {Node}\n * @example node.get('users').get('alice').put({name: 'Alice'})\n */\n get(key) {\n const existing = this.children.get(key);\n if (existing) {\n return existing;\n }\n const new_node = new Node(`${this.id}/${key}`, this);\n this.children.set(key, new_node);\n this.saveLocalForage();\n return new_node;\n }\n\n /**\n * Set a value to the node. If the value is an object, it will be converted to child nodes.\n * @param value\n * @example node.get('users').get('alice').put({name: 'Alice'})\n */\n put(value) {\n if (Array.isArray(value)) {\n throw new Error('Sorry, we don\\'t deal with arrays');\n }\n if (typeof value === 'object' && value !== null) {\n this.value = undefined;\n for (const key in value) {\n this.get(key).put(value[key]);\n }\n _.defer(() => this.doCallbacks(), 100);\n return;\n }\n this.children = new Map();\n this.value = value;\n this.doCallbacks();\n this.saveLocalForage();\n }\n\n // protip: the code would be a lot cleaner if you separated the Node API from storage adapters.\n /**\n * Return a value without subscribing to it\n * @param callback\n * @param event\n * @param returnIfUndefined\n * @returns {Promise<*>}\n */\n async once(callback?: Function, event?: MyEventListener, returnIfUndefined = true): Promise {\n let result: any;\n if (this.children.size) {\n // return an object containing all children\n result = {};\n await Promise.all(Array.from(this.children.keys()).map(async key => {\n result[key] = await this.get(key).once(undefined, event);\n }));\n } else if (this.value !== undefined) {\n result = this.value;\n } else {\n result = await this.loadLocalForage();\n }\n if (result !== undefined || returnIfUndefined) {\n callback && callback(result, this.id.slice(this.id.lastIndexOf('/') + 1), null, event);\n return result;\n }\n }\n\n /**\n * Subscribe to a value\n * @param callback\n */\n on(callback: Function): void {\n const id = this.counter++;\n this.on_subscriptions.set(id, callback);\n const event = { off: () => this.on_subscriptions.delete(id) };\n this.once(callback, event, false);\n }\n\n /**\n * Subscribe to the children of a node. Callback is called separately for each child.\n * @param callback\n * @returns {Promise}\n */\n async map(callback: Function) {\n const id = this.counter++;\n this.map_subscriptions.set(id, callback);\n const event = { off: () => this.map_subscriptions.delete(id) };\n if (!this.loaded) {\n // ensure that the list of children is loaded\n await this.loadLocalForage();\n }\n for (const child of this.children.values()) {\n child.once(callback, event, false);\n }\n }\n}","import Node from './Node';\n\nlet local: Node;\n\n/**\n * Get a state that is only synced in memory and local storage.\n *\n * Useful for storing things like UI state, local indexes or logged in user.\n * @returns {Node}\n */\nexport default function() {\n if (!local) {\n local = new Node();\n }\n return local;\n}","import local from './local';\n\nlet blockedUsers: { [key: string]: boolean } = {};\n\nexport default function() {\n if (!blockedUsers) {\n blockedUsers = {};\n local().get('block').map((isBlocked: boolean, user: string) => {\n if (isBlocked === blockedUsers[user]) { return; }\n if (isBlocked) {\n blockedUsers[user] = isBlocked;\n local().get('groups').map((_v: any, k: string) => {\n local().get('groups').get(k).get(user).put(false);\n });\n } else {\n delete blockedUsers[user];\n }\n });\n }\n return blockedUsers;\n}","import local from \"./local\";\nimport userSpace from './public';\nimport blockedUsers from './blockedUsers';\n\nlet counter = 0;\nconst cache = new Map>();\nconst callbacks = new Map();\n\ntype Event = {\n off: () => void;\n}\n\n/**\n * Aggregates public data from all users in the group.\n *\n * For example, the public message feed, message replies and likes are aggregated using this.\n * @param groupName\n * @returns object\n */\nexport default function(groupName = 'everyone') {\n return {\n get(path: string, callback: any) {\n const groupNode = local().get('groups').get(groupName);\n const follows: { [key: string]: boolean; } = {};\n requestAnimationFrame(() => {\n groupNode.map((isFollowing: any, user: string) => {\n if (blockedUsers()[user]) { return; } // TODO: allow to specifically query blocked users?\n if (follows[user] && follows[user] === isFollowing) { return; }\n follows[user] = isFollowing;\n if (isFollowing) { // TODO: callback on unfollow, for unsubscribe\n let node = userSpace(user);\n if (path && path !== '/') {\n node = path.split('/').reduce((sum:any, s:string) => sum.get(decodeURIComponent(s)), node);\n }\n callback(node, user);\n }\n });\n });\n },\n\n _cached_map(cached: Map | undefined, cacheKey: string, path: string, myEvent: Event, callback: Function) {\n if (!cached) {\n const cached = new Map();\n cache.set(cacheKey, cached);\n this.get(path, (node: any, from: string) => node.map((value: any, key: string, x: any) => {\n const item = {value, key, from};\n cached.set(key, item);\n for (let cb of callbacks.get(cacheKey).values()) {\n cb(value, key, x, myEvent, from);\n }\n }));\n } else {\n for (let item of cached.values()) {\n callback(item.value, item.key, 0, myEvent, item.from);\n }\n }\n },\n\n // TODO: this should probably store just the most recent value, not everyone's value\n // TODO: for counting of likes etc, use this.count() instead\n _cached_on(cached: Map | undefined, cacheKey: string, path: string, myEvent: Event, callback: Function) {\n if (!cached) {\n const cached = new Map();\n cache.set(cacheKey, cached);\n this.get(path, (node: any, from: string) => node.on((value: any, key: string, x: any) => {\n const item = {value, key, from};\n cached.set(from, item);\n for (let cb of callbacks.get(cacheKey).values()) {\n cb(value, key, x, myEvent, from);\n }\n }));\n } else {\n for (let item of cached.values()) {\n callback(item.value, item.key, 0, myEvent, item.from);\n }\n }\n },\n\n _cached_count(cached: Map | undefined, cacheKey: string, path: string, myEvent: Event, callback: Function) {\n if (!cached) {\n const cached = new Map();\n cache.set(cacheKey, cached);\n this.get(path, (node: any, from: string) => node.on((value: any, key: string) => {\n value ? cached.set(from, true) : cached.delete(from);\n const count = cached.size;\n for (let cb of callbacks.get(cacheKey).values()) {\n cb(count, key, null, myEvent, from);\n }\n }));\n } else {\n callback(cached.size, path.split('/').pop(), null, myEvent);\n }\n },\n\n _cached_fn(fn: string, path: string, callback: Function) {\n const cacheKey = `${fn}:${groupName}:${path}`;\n\n let callbackId = counter++;\n if (callbacks.has(cacheKey)) {\n callbacks.get(cacheKey).set(callbackId, callback);\n } else {\n callbacks.set(cacheKey, new Map([[callbackId, callback]]));\n }\n\n const myEvent = {off: () => {\n let myCallbacks = callbacks.get(cacheKey);\n myCallbacks && myCallbacks.delete(callbackId);\n }};\n\n const cached = cache.get(cacheKey);\n\n switch (fn) {\n case 'map':\n this._cached_map(cached, cacheKey, path, myEvent, callback);\n break;\n case 'on':\n this._cached_on(cached, cacheKey, path, myEvent, callback);\n break;\n case 'count':\n this._cached_count(cached, cacheKey, path, myEvent, callback);\n break;\n }\n },\n\n map(path: string, callback: Function) { // group queries are slow, so we cache them\n this._cached_fn('map', path, callback);\n },\n\n on(path: string, callback: Function) {\n this._cached_fn('on', path, callback);\n },\n\n count(path: string, callback: Function) {\n this._cached_fn('count', path, callback);\n }\n }\n}","// @ts-nocheck\n\nimport _ from './lodash';\nimport Gun from 'gun';\n\nimport session from './session';\nimport util from './util';\nimport publicState from './global';\nimport privateState from './private';\nimport local from './local';\nimport group from './group';\n\nconst NOTIFICATION_SERVICE_URL = 'https://iris-notifications.herokuapp.com/notify';\n// const notificationSound = new Audio('../../assets/audio/notification.mp3'); // TODO\nlet loginTime;\nlet unseenMsgsTotal = 0;\nlet unseenNotificationCount = 0;\nconst webPushSubscriptions = {};\n\nfunction desktopNotificationsEnabled() {\n return window.Notification && Notification.permission === 'granted';\n}\n\nfunction notifyMsg(msg, info, channelId, onClick) {\n function shouldNotify() {\n if (msg.timeObj < loginTime) { return false; }\n if (info.selfAuthored) { return false; }\n if (document.visibilityState === 'visible') { return false; }\n const channel = privateState(channelId);\n if (channel.notificationSetting === 'nothing') { return false; }\n if (channel.notificationSetting === 'mentions' && !msg.text.includes(session.getMyName())) { return false; }\n return true;\n }\n function shouldDesktopNotify() {\n if (!desktopNotificationsEnabled()) { return false; }\n return shouldNotify();\n }\n function shouldAudioNotify() {\n return shouldNotify();\n }\n if (shouldAudioNotify()) {\n //notificationSound.play(); // TODO\n }\n if (shouldDesktopNotify()) {\n let body, title;\n const channel = privateState(channelId);\n if (channel.uuid) {\n title = channel.participantProfiles[info.from].name;\n body = `${name}: ${msg.text}`;\n } else {\n title = 'Message'\n body = msg.text;\n }\n body = util.truncateString(body, 50);\n let desktopNotification = new Notification(title, { // TODO: replace with actual name\n icon: '/assets/img/icon128.png',\n body,\n silent: true\n });\n desktopNotification.onclick = function() {\n changeUnseenNotificationCount(-1);\n onClick && onClick();\n window.focus();\n };\n }\n}\n\nfunction changeChatUnseenMsgsCount(chatId, change) {\n const chat = privateState(chatId);\n if (!chat) return;\n const chatNode = local().get('channels').get(chatId);\n if (change) {\n unseenMsgsTotal += change;\n chat.unseen += change;\n } else {\n unseenMsgsTotal = unseenMsgsTotal - (chat.unseen || 0);\n chat.unseen = 0;\n }\n chatNode.get('unseen').put(chat.unseen);\n unseenMsgsTotal = unseenMsgsTotal >= 0 ? unseenMsgsTotal : 0;\n local().get('unseenMsgsTotal').put(unseenMsgsTotal);\n}\n\nconst publicVapidKey = 'BMqSvZArOIdn7vGkYplSpkZ70-Qt8nhYbey26WVa3LF3SwzblSzm3n3HHycpNkAKVq7MCkrzFuTFs_en7Y_J2MI';\n\nfunction urlBase64ToUint8Array(base64String) {\n const padding = '='.repeat((4 - base64String.length % 4) % 4);\n const base64 = (base64String + padding)\n .replace(/-/g, '+')\n .replace(/_/g, '/');\n\n const rawData = window.atob(base64);\n const outputArray = new Uint8Array(rawData.length);\n\n for (let i = 0; i < rawData.length; ++i) {\n outputArray[i] = rawData.charCodeAt(i);\n }\n return outputArray;\n}\n\nasync function subscribe(reg) {\n try {\n const subscription = await reg.pushManager.subscribe({\n userVisibleOnly: true,\n applicationServerKey: urlBase64ToUint8Array(publicVapidKey)\n });\n addWebPushSubscription(subscription);\n } catch (e) {\n console.error('web push subscription error', e);\n }\n}\n\nasync function subscribeToWebPush() {\n console.log('subscribing to web push', navigator.serviceWorker);\n if (!desktopNotificationsEnabled() || !navigator.serviceWorker) { return false; }\n await navigator.serviceWorker.ready;\n const reg = await navigator.serviceWorker.getRegistration();\n reg.active.postMessage({key: session.getKey()});\n const sub = await reg.pushManager.getSubscription();\n sub ? addWebPushSubscription(sub) : subscribe(reg);\n}\n\nconst addWebPushSubscriptionsToChats = _.debounce(() => {\n const arr = Object.values(webPushSubscriptions);\n session.channelIds.forEach(channelId => {\n privateState(channelId).put('webPushSubscriptions', arr);\n });\n}, 5000);\n\nfunction removeSubscription(hash) {\n delete webPushSubscriptions[hash];\n publicState().user().get('webPushSubscriptions').get(hash).put(null);\n addWebPushSubscriptionsToChats();\n}\n\nasync function addWebPushSubscription(s, saveToGun = true) {\n const myKey = session.getKey();\n const mySecret = await Gun.SEA.secret(myKey.epub, myKey);\n const enc = await Gun.SEA.encrypt(s, mySecret);\n const hash = await util.getHash(JSON.stringify(s));\n if (saveToGun) {\n publicState().user().get('webPushSubscriptions').get(hash).put(enc);\n }\n webPushSubscriptions[hash] = s;\n addWebPushSubscriptionsToChats();\n}\n\nasync function getWebPushSubscriptions() {\n const myKey = session.getKey();\n const mySecret = await Gun.SEA.secret(myKey.epub, myKey);\n publicState().user().get('webPushSubscriptions').map().on(async enc => {\n if (!enc) { return; }\n const s = await Gun.SEA.decrypt(enc, mySecret);\n addWebPushSubscription(s, false);\n });\n}\n\nfunction getEpub(user) {\n return new Promise(resolve => {\n publicState().user(user).get('epub').on(async (epub,k,x,e) => {\n if (epub) {\n e.off();\n resolve(epub);\n }\n });\n });\n}\n\nasync function getNotificationText(notification) {\n const profile = await publicState().user(notification.from).get('profile').once();\n const name = (profile && profile.name) || 'someone';\n const event = notification.event || notification.action;\n let eventText;\n if (event === 'like') eventText = `${name} liked your post`;\n else if (event === 'reply') eventText = `${name} replied to your post`;\n else if (event === 'mention') eventText = `${name} mentioned you in their post`;\n else if (event === 'follow') eventText = `${name} started following you`;\n else eventText = `${name} sent you a notification: ${event}`;\n return eventText;\n}\n\nfunction subscribeToIrisNotifications(onClick?: Function) {\n let notificationsSeenTime: any;\n let notificationsShownTime: any;\n publicState().user().get('notificationsSeenTime').on(v => {\n notificationsSeenTime = v;\n console.log(v);\n });\n publicState().user().get('notificationsShownTime').on(v => notificationsShownTime = v);\n const setNotificationsShownTime = _.debounce(() => {\n publicState().user().get('notificationsShownTime').put(new Date().toISOString());\n }, 1000);\n const alreadyHave = new Set();\n group().on(`notifications/${session.getPubKey()}`, async (encryptedNotification, k, x, e, from) => {\n const id = from.slice(0,30) + encryptedNotification.slice(0,30);\n if (alreadyHave.has(id)) { return; }\n alreadyHave.add(id);\n const epub = await getEpub(from);\n const secret = await Gun.SEA.secret(epub, session.getKey());\n const notification = await Gun.SEA.decrypt(encryptedNotification, secret);\n if (!notification || typeof notification !== 'object') { return; }\n setNotificationsShownTime();\n notification.from = from;\n local().get('notifications').get(notification.time).put(notification);\n if (!notificationsSeenTime || (notificationsSeenTime < notification.time)) {\n changeUnseenNotificationCount(1);\n }\n if (!notificationsShownTime || notificationsShownTime < notification.time) {\n console.log('was new!');\n const text = await getNotificationText(notification);\n let desktopNotification = new Notification(text, {\n icon: '/assets/img/icon128.png',\n body: text,\n silent: true\n });\n desktopNotification.onclick = function() {\n const link = notification.target ? `/post/${notification.target}` : `/profile/${notification.from}`;\n onClick && onClick(link);\n changeUnseenNotificationCount(-1);\n window.focus();\n };\n }\n });\n}\n\nfunction changeUnseenNotificationCount(change) {\n if (!change) {\n unseenNotificationCount = 0;\n publicState().user().get('notificationsSeenTime').put(new Date().toISOString());\n } else {\n unseenNotificationCount += change;\n unseenNotificationCount = Math.max(unseenNotificationCount, 0);\n }\n local().get('unseenNotificationCount').put(unseenNotificationCount);\n}\n\nasync function sendIrisNotification(recipient, notification) {\n if (!(recipient && notification)) { return; } // TODO: use typescript or sth :D\n if (typeof notification === 'object') { notification.time = new Date().toISOString() }\n const epub = await getEpub(recipient);\n const secret = await Gun.SEA.secret(epub, session.getKey());\n const enc = await Gun.SEA.encrypt(notification, secret);\n publicState().user().get('notifications').get(recipient).put(enc);\n}\n\nasync function sendWebPushNotification(recipient, notification) {\n console.log('sending web push notification to', recipient, notification);\n const channel = privateState(recipient);\n const myKey = session.getKey();\n const shouldWebPush = (recipient === myKey.pub) || !(channel.activity && channel.activity.isActive);\n if (shouldWebPush && channel.webPushSubscriptions) {\n const subscriptions = [];\n const participants = Object.keys(channel.webPushSubscriptions);\n for (let i = 0; i < participants.length; i++) {\n const participant = participants[i];\n const secret = await channel.getSecret(participant);\n const payload = {\n title: await Gun.SEA.encrypt(notification.title, secret),\n body: await Gun.SEA.encrypt(notification.body, secret),\n from:{pub: myKey.pub, epub: myKey.epub}\n };\n channel.webPushSubscriptions[participant].forEach(s => {\n if (s && s.endpoint) {\n subscriptions.push({subscription: s, payload});\n }\n });\n }\n if (subscriptions.length === 0) {return;}\n fetch(NOTIFICATION_SERVICE_URL, {\n method: 'POST',\n body: JSON.stringify({subscriptions}),\n headers: {\n 'content-type': 'application/json'\n }\n }).catch(() => {});\n }\n}\n\nfunction init() {\n loginTime = new Date();\n unseenMsgsTotal = 0;\n}\n\nexport default {init, notifyMsg, getNotificationText, sendWebPushNotification, changeUnseenNotificationCount, subscribeToIrisNotifications, sendIrisNotification, changeChatUnseenCount: changeChatUnseenMsgsCount, webPushSubscriptions, subscribeToWebPush, getWebPushSubscriptions, removeSubscription};\n","/**\n * Fuse.js v6.6.2 - Lightweight fuzzy-search (http://fusejs.io)\n *\n * Copyright (c) 2022 Kiro Risk (http://kiro.me)\n * All Rights Reserved. Apache Software License 2.0\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nfunction isArray(value) {\n return !Array.isArray\n ? getTag(value) === '[object Array]'\n : Array.isArray(value)\n}\n\n// Adapted from: https://github.com/lodash/lodash/blob/master/.internal/baseToString.js\nconst INFINITY = 1 / 0;\nfunction baseToString(value) {\n // Exit early for strings to avoid a performance hit in some environments.\n if (typeof value == 'string') {\n return value\n }\n let result = value + '';\n return result == '0' && 1 / value == -INFINITY ? '-0' : result\n}\n\nfunction toString(value) {\n return value == null ? '' : baseToString(value)\n}\n\nfunction isString(value) {\n return typeof value === 'string'\n}\n\nfunction isNumber(value) {\n return typeof value === 'number'\n}\n\n// Adapted from: https://github.com/lodash/lodash/blob/master/isBoolean.js\nfunction isBoolean(value) {\n return (\n value === true ||\n value === false ||\n (isObjectLike(value) && getTag(value) == '[object Boolean]')\n )\n}\n\nfunction isObject(value) {\n return typeof value === 'object'\n}\n\n// Checks if `value` is object-like.\nfunction isObjectLike(value) {\n return isObject(value) && value !== null\n}\n\nfunction isDefined(value) {\n return value !== undefined && value !== null\n}\n\nfunction isBlank(value) {\n return !value.trim().length\n}\n\n// Gets the `toStringTag` of `value`.\n// Adapted from: https://github.com/lodash/lodash/blob/master/.internal/getTag.js\nfunction getTag(value) {\n return value == null\n ? value === undefined\n ? '[object Undefined]'\n : '[object Null]'\n : Object.prototype.toString.call(value)\n}\n\nconst EXTENDED_SEARCH_UNAVAILABLE = 'Extended search is not available';\n\nconst INCORRECT_INDEX_TYPE = \"Incorrect 'index' type\";\n\nconst LOGICAL_SEARCH_INVALID_QUERY_FOR_KEY = (key) =>\n `Invalid value for key ${key}`;\n\nconst PATTERN_LENGTH_TOO_LARGE = (max) =>\n `Pattern length exceeds max of ${max}.`;\n\nconst MISSING_KEY_PROPERTY = (name) => `Missing ${name} property in key`;\n\nconst INVALID_KEY_WEIGHT_VALUE = (key) =>\n `Property 'weight' in key '${key}' must be a positive integer`;\n\nconst hasOwn = Object.prototype.hasOwnProperty;\n\nclass KeyStore {\n constructor(keys) {\n this._keys = [];\n this._keyMap = {};\n\n let totalWeight = 0;\n\n keys.forEach((key) => {\n let obj = createKey(key);\n\n totalWeight += obj.weight;\n\n this._keys.push(obj);\n this._keyMap[obj.id] = obj;\n\n totalWeight += obj.weight;\n });\n\n // Normalize weights so that their sum is equal to 1\n this._keys.forEach((key) => {\n key.weight /= totalWeight;\n });\n }\n get(keyId) {\n return this._keyMap[keyId]\n }\n keys() {\n return this._keys\n }\n toJSON() {\n return JSON.stringify(this._keys)\n }\n}\n\nfunction createKey(key) {\n let path = null;\n let id = null;\n let src = null;\n let weight = 1;\n let getFn = null;\n\n if (isString(key) || isArray(key)) {\n src = key;\n path = createKeyPath(key);\n id = createKeyId(key);\n } else {\n if (!hasOwn.call(key, 'name')) {\n throw new Error(MISSING_KEY_PROPERTY('name'))\n }\n\n const name = key.name;\n src = name;\n\n if (hasOwn.call(key, 'weight')) {\n weight = key.weight;\n\n if (weight <= 0) {\n throw new Error(INVALID_KEY_WEIGHT_VALUE(name))\n }\n }\n\n path = createKeyPath(name);\n id = createKeyId(name);\n getFn = key.getFn;\n }\n\n return { path, id, weight, src, getFn }\n}\n\nfunction createKeyPath(key) {\n return isArray(key) ? key : key.split('.')\n}\n\nfunction createKeyId(key) {\n return isArray(key) ? key.join('.') : key\n}\n\nfunction get(obj, path) {\n let list = [];\n let arr = false;\n\n const deepGet = (obj, path, index) => {\n if (!isDefined(obj)) {\n return\n }\n if (!path[index]) {\n // If there's no path left, we've arrived at the object we care about.\n list.push(obj);\n } else {\n let key = path[index];\n\n const value = obj[key];\n\n if (!isDefined(value)) {\n return\n }\n\n // If we're at the last value in the path, and if it's a string/number/bool,\n // add it to the list\n if (\n index === path.length - 1 &&\n (isString(value) || isNumber(value) || isBoolean(value))\n ) {\n list.push(toString(value));\n } else if (isArray(value)) {\n arr = true;\n // Search each item in the array.\n for (let i = 0, len = value.length; i < len; i += 1) {\n deepGet(value[i], path, index + 1);\n }\n } else if (path.length) {\n // An object. Recurse further.\n deepGet(value, path, index + 1);\n }\n }\n };\n\n // Backwards compatibility (since path used to be a string)\n deepGet(obj, isString(path) ? path.split('.') : path, 0);\n\n return arr ? list : list[0]\n}\n\nconst MatchOptions = {\n // Whether the matches should be included in the result set. When `true`, each record in the result\n // set will include the indices of the matched characters.\n // These can consequently be used for highlighting purposes.\n includeMatches: false,\n // When `true`, the matching function will continue to the end of a search pattern even if\n // a perfect match has already been located in the string.\n findAllMatches: false,\n // Minimum number of characters that must be matched before a result is considered a match\n minMatchCharLength: 1\n};\n\nconst BasicOptions = {\n // When `true`, the algorithm continues searching to the end of the input even if a perfect\n // match is found before the end of the same input.\n isCaseSensitive: false,\n // When true, the matching function will continue to the end of a search pattern even if\n includeScore: false,\n // List of properties that will be searched. This also supports nested properties.\n keys: [],\n // Whether to sort the result list, by score\n shouldSort: true,\n // Default sort function: sort by ascending score, ascending index\n sortFn: (a, b) =>\n a.score === b.score ? (a.idx < b.idx ? -1 : 1) : a.score < b.score ? -1 : 1\n};\n\nconst FuzzyOptions = {\n // Approximately where in the text is the pattern expected to be found?\n location: 0,\n // At what point does the match algorithm give up. A threshold of '0.0' requires a perfect match\n // (of both letters and location), a threshold of '1.0' would match anything.\n threshold: 0.6,\n // Determines how close the match must be to the fuzzy location (specified above).\n // An exact letter match which is 'distance' characters away from the fuzzy location\n // would score as a complete mismatch. A distance of '0' requires the match be at\n // the exact location specified, a threshold of '1000' would require a perfect match\n // to be within 800 characters of the fuzzy location to be found using a 0.8 threshold.\n distance: 100\n};\n\nconst AdvancedOptions = {\n // When `true`, it enables the use of unix-like search commands\n useExtendedSearch: false,\n // The get function to use when fetching an object's properties.\n // The default will search nested paths *ie foo.bar.baz*\n getFn: get,\n // When `true`, search will ignore `location` and `distance`, so it won't matter\n // where in the string the pattern appears.\n // More info: https://fusejs.io/concepts/scoring-theory.html#fuzziness-score\n ignoreLocation: false,\n // When `true`, the calculation for the relevance score (used for sorting) will\n // ignore the field-length norm.\n // More info: https://fusejs.io/concepts/scoring-theory.html#field-length-norm\n ignoreFieldNorm: false,\n // The weight to determine how much field length norm effects scoring.\n fieldNormWeight: 1\n};\n\nvar Config = {\n ...BasicOptions,\n ...MatchOptions,\n ...FuzzyOptions,\n ...AdvancedOptions\n};\n\nconst SPACE = /[^ ]+/g;\n\n// Field-length norm: the shorter the field, the higher the weight.\n// Set to 3 decimals to reduce index size.\nfunction norm(weight = 1, mantissa = 3) {\n const cache = new Map();\n const m = Math.pow(10, mantissa);\n\n return {\n get(value) {\n const numTokens = value.match(SPACE).length;\n\n if (cache.has(numTokens)) {\n return cache.get(numTokens)\n }\n\n // Default function is 1/sqrt(x), weight makes that variable\n const norm = 1 / Math.pow(numTokens, 0.5 * weight);\n\n // In place of `toFixed(mantissa)`, for faster computation\n const n = parseFloat(Math.round(norm * m) / m);\n\n cache.set(numTokens, n);\n\n return n\n },\n clear() {\n cache.clear();\n }\n }\n}\n\nclass FuseIndex {\n constructor({\n getFn = Config.getFn,\n fieldNormWeight = Config.fieldNormWeight\n } = {}) {\n this.norm = norm(fieldNormWeight, 3);\n this.getFn = getFn;\n this.isCreated = false;\n\n this.setIndexRecords();\n }\n setSources(docs = []) {\n this.docs = docs;\n }\n setIndexRecords(records = []) {\n this.records = records;\n }\n setKeys(keys = []) {\n this.keys = keys;\n this._keysMap = {};\n keys.forEach((key, idx) => {\n this._keysMap[key.id] = idx;\n });\n }\n create() {\n if (this.isCreated || !this.docs.length) {\n return\n }\n\n this.isCreated = true;\n\n // List is Array\n if (isString(this.docs[0])) {\n this.docs.forEach((doc, docIndex) => {\n this._addString(doc, docIndex);\n });\n } else {\n // List is Array\n this.docs.forEach((doc, docIndex) => {\n this._addObject(doc, docIndex);\n });\n }\n\n this.norm.clear();\n }\n // Adds a doc to the end of the index\n add(doc) {\n const idx = this.size();\n\n if (isString(doc)) {\n this._addString(doc, idx);\n } else {\n this._addObject(doc, idx);\n }\n }\n // Removes the doc at the specified index of the index\n removeAt(idx) {\n this.records.splice(idx, 1);\n\n // Change ref index of every subsquent doc\n for (let i = idx, len = this.size(); i < len; i += 1) {\n this.records[i].i -= 1;\n }\n }\n getValueForItemAtKeyId(item, keyId) {\n return item[this._keysMap[keyId]]\n }\n size() {\n return this.records.length\n }\n _addString(doc, docIndex) {\n if (!isDefined(doc) || isBlank(doc)) {\n return\n }\n\n let record = {\n v: doc,\n i: docIndex,\n n: this.norm.get(doc)\n };\n\n this.records.push(record);\n }\n _addObject(doc, docIndex) {\n let record = { i: docIndex, $: {} };\n\n // Iterate over every key (i.e, path), and fetch the value at that key\n this.keys.forEach((key, keyIndex) => {\n let value = key.getFn ? key.getFn(doc) : this.getFn(doc, key.path);\n\n if (!isDefined(value)) {\n return\n }\n\n if (isArray(value)) {\n let subRecords = [];\n const stack = [{ nestedArrIndex: -1, value }];\n\n while (stack.length) {\n const { nestedArrIndex, value } = stack.pop();\n\n if (!isDefined(value)) {\n continue\n }\n\n if (isString(value) && !isBlank(value)) {\n let subRecord = {\n v: value,\n i: nestedArrIndex,\n n: this.norm.get(value)\n };\n\n subRecords.push(subRecord);\n } else if (isArray(value)) {\n value.forEach((item, k) => {\n stack.push({\n nestedArrIndex: k,\n value: item\n });\n });\n } else ;\n }\n record.$[keyIndex] = subRecords;\n } else if (isString(value) && !isBlank(value)) {\n let subRecord = {\n v: value,\n n: this.norm.get(value)\n };\n\n record.$[keyIndex] = subRecord;\n }\n });\n\n this.records.push(record);\n }\n toJSON() {\n return {\n keys: this.keys,\n records: this.records\n }\n }\n}\n\nfunction createIndex(\n keys,\n docs,\n { getFn = Config.getFn, fieldNormWeight = Config.fieldNormWeight } = {}\n) {\n const myIndex = new FuseIndex({ getFn, fieldNormWeight });\n myIndex.setKeys(keys.map(createKey));\n myIndex.setSources(docs);\n myIndex.create();\n return myIndex\n}\n\nfunction parseIndex(\n data,\n { getFn = Config.getFn, fieldNormWeight = Config.fieldNormWeight } = {}\n) {\n const { keys, records } = data;\n const myIndex = new FuseIndex({ getFn, fieldNormWeight });\n myIndex.setKeys(keys);\n myIndex.setIndexRecords(records);\n return myIndex\n}\n\nfunction computeScore$1(\n pattern,\n {\n errors = 0,\n currentLocation = 0,\n expectedLocation = 0,\n distance = Config.distance,\n ignoreLocation = Config.ignoreLocation\n } = {}\n) {\n const accuracy = errors / pattern.length;\n\n if (ignoreLocation) {\n return accuracy\n }\n\n const proximity = Math.abs(expectedLocation - currentLocation);\n\n if (!distance) {\n // Dodge divide by zero error.\n return proximity ? 1.0 : accuracy\n }\n\n return accuracy + proximity / distance\n}\n\nfunction convertMaskToIndices(\n matchmask = [],\n minMatchCharLength = Config.minMatchCharLength\n) {\n let indices = [];\n let start = -1;\n let end = -1;\n let i = 0;\n\n for (let len = matchmask.length; i < len; i += 1) {\n let match = matchmask[i];\n if (match && start === -1) {\n start = i;\n } else if (!match && start !== -1) {\n end = i - 1;\n if (end - start + 1 >= minMatchCharLength) {\n indices.push([start, end]);\n }\n start = -1;\n }\n }\n\n // (i-1 - start) + 1 => i - start\n if (matchmask[i - 1] && i - start >= minMatchCharLength) {\n indices.push([start, i - 1]);\n }\n\n return indices\n}\n\n// Machine word size\nconst MAX_BITS = 32;\n\nfunction search(\n text,\n pattern,\n patternAlphabet,\n {\n location = Config.location,\n distance = Config.distance,\n threshold = Config.threshold,\n findAllMatches = Config.findAllMatches,\n minMatchCharLength = Config.minMatchCharLength,\n includeMatches = Config.includeMatches,\n ignoreLocation = Config.ignoreLocation\n } = {}\n) {\n if (pattern.length > MAX_BITS) {\n throw new Error(PATTERN_LENGTH_TOO_LARGE(MAX_BITS))\n }\n\n const patternLen = pattern.length;\n // Set starting location at beginning text and initialize the alphabet.\n const textLen = text.length;\n // Handle the case when location > text.length\n const expectedLocation = Math.max(0, Math.min(location, textLen));\n // Highest score beyond which we give up.\n let currentThreshold = threshold;\n // Is there a nearby exact match? (speedup)\n let bestLocation = expectedLocation;\n\n // Performance: only computer matches when the minMatchCharLength > 1\n // OR if `includeMatches` is true.\n const computeMatches = minMatchCharLength > 1 || includeMatches;\n // A mask of the matches, used for building the indices\n const matchMask = computeMatches ? Array(textLen) : [];\n\n let index;\n\n // Get all exact matches, here for speed up\n while ((index = text.indexOf(pattern, bestLocation)) > -1) {\n let score = computeScore$1(pattern, {\n currentLocation: index,\n expectedLocation,\n distance,\n ignoreLocation\n });\n\n currentThreshold = Math.min(score, currentThreshold);\n bestLocation = index + patternLen;\n\n if (computeMatches) {\n let i = 0;\n while (i < patternLen) {\n matchMask[index + i] = 1;\n i += 1;\n }\n }\n }\n\n // Reset the best location\n bestLocation = -1;\n\n let lastBitArr = [];\n let finalScore = 1;\n let binMax = patternLen + textLen;\n\n const mask = 1 << (patternLen - 1);\n\n for (let i = 0; i < patternLen; i += 1) {\n // Scan for the best match; each iteration allows for one more error.\n // Run a binary search to determine how far from the match location we can stray\n // at this error level.\n let binMin = 0;\n let binMid = binMax;\n\n while (binMin < binMid) {\n const score = computeScore$1(pattern, {\n errors: i,\n currentLocation: expectedLocation + binMid,\n expectedLocation,\n distance,\n ignoreLocation\n });\n\n if (score <= currentThreshold) {\n binMin = binMid;\n } else {\n binMax = binMid;\n }\n\n binMid = Math.floor((binMax - binMin) / 2 + binMin);\n }\n\n // Use the result from this iteration as the maximum for the next.\n binMax = binMid;\n\n let start = Math.max(1, expectedLocation - binMid + 1);\n let finish = findAllMatches\n ? textLen\n : Math.min(expectedLocation + binMid, textLen) + patternLen;\n\n // Initialize the bit array\n let bitArr = Array(finish + 2);\n\n bitArr[finish + 1] = (1 << i) - 1;\n\n for (let j = finish; j >= start; j -= 1) {\n let currentLocation = j - 1;\n let charMatch = patternAlphabet[text.charAt(currentLocation)];\n\n if (computeMatches) {\n // Speed up: quick bool to int conversion (i.e, `charMatch ? 1 : 0`)\n matchMask[currentLocation] = +!!charMatch;\n }\n\n // First pass: exact match\n bitArr[j] = ((bitArr[j + 1] << 1) | 1) & charMatch;\n\n // Subsequent passes: fuzzy match\n if (i) {\n bitArr[j] |=\n ((lastBitArr[j + 1] | lastBitArr[j]) << 1) | 1 | lastBitArr[j + 1];\n }\n\n if (bitArr[j] & mask) {\n finalScore = computeScore$1(pattern, {\n errors: i,\n currentLocation,\n expectedLocation,\n distance,\n ignoreLocation\n });\n\n // This match will almost certainly be better than any existing match.\n // But check anyway.\n if (finalScore <= currentThreshold) {\n // Indeed it is\n currentThreshold = finalScore;\n bestLocation = currentLocation;\n\n // Already passed `loc`, downhill from here on in.\n if (bestLocation <= expectedLocation) {\n break\n }\n\n // When passing `bestLocation`, don't exceed our current distance from `expectedLocation`.\n start = Math.max(1, 2 * expectedLocation - bestLocation);\n }\n }\n }\n\n // No hope for a (better) match at greater error levels.\n const score = computeScore$1(pattern, {\n errors: i + 1,\n currentLocation: expectedLocation,\n expectedLocation,\n distance,\n ignoreLocation\n });\n\n if (score > currentThreshold) {\n break\n }\n\n lastBitArr = bitArr;\n }\n\n const result = {\n isMatch: bestLocation >= 0,\n // Count exact matches (those with a score of 0) to be \"almost\" exact\n score: Math.max(0.001, finalScore)\n };\n\n if (computeMatches) {\n const indices = convertMaskToIndices(matchMask, minMatchCharLength);\n if (!indices.length) {\n result.isMatch = false;\n } else if (includeMatches) {\n result.indices = indices;\n }\n }\n\n return result\n}\n\nfunction createPatternAlphabet(pattern) {\n let mask = {};\n\n for (let i = 0, len = pattern.length; i < len; i += 1) {\n const char = pattern.charAt(i);\n mask[char] = (mask[char] || 0) | (1 << (len - i - 1));\n }\n\n return mask\n}\n\nclass BitapSearch {\n constructor(\n pattern,\n {\n location = Config.location,\n threshold = Config.threshold,\n distance = Config.distance,\n includeMatches = Config.includeMatches,\n findAllMatches = Config.findAllMatches,\n minMatchCharLength = Config.minMatchCharLength,\n isCaseSensitive = Config.isCaseSensitive,\n ignoreLocation = Config.ignoreLocation\n } = {}\n ) {\n this.options = {\n location,\n threshold,\n distance,\n includeMatches,\n findAllMatches,\n minMatchCharLength,\n isCaseSensitive,\n ignoreLocation\n };\n\n this.pattern = isCaseSensitive ? pattern : pattern.toLowerCase();\n\n this.chunks = [];\n\n if (!this.pattern.length) {\n return\n }\n\n const addChunk = (pattern, startIndex) => {\n this.chunks.push({\n pattern,\n alphabet: createPatternAlphabet(pattern),\n startIndex\n });\n };\n\n const len = this.pattern.length;\n\n if (len > MAX_BITS) {\n let i = 0;\n const remainder = len % MAX_BITS;\n const end = len - remainder;\n\n while (i < end) {\n addChunk(this.pattern.substr(i, MAX_BITS), i);\n i += MAX_BITS;\n }\n\n if (remainder) {\n const startIndex = len - MAX_BITS;\n addChunk(this.pattern.substr(startIndex), startIndex);\n }\n } else {\n addChunk(this.pattern, 0);\n }\n }\n\n searchIn(text) {\n const { isCaseSensitive, includeMatches } = this.options;\n\n if (!isCaseSensitive) {\n text = text.toLowerCase();\n }\n\n // Exact match\n if (this.pattern === text) {\n let result = {\n isMatch: true,\n score: 0\n };\n\n if (includeMatches) {\n result.indices = [[0, text.length - 1]];\n }\n\n return result\n }\n\n // Otherwise, use Bitap algorithm\n const {\n location,\n distance,\n threshold,\n findAllMatches,\n minMatchCharLength,\n ignoreLocation\n } = this.options;\n\n let allIndices = [];\n let totalScore = 0;\n let hasMatches = false;\n\n this.chunks.forEach(({ pattern, alphabet, startIndex }) => {\n const { isMatch, score, indices } = search(text, pattern, alphabet, {\n location: location + startIndex,\n distance,\n threshold,\n findAllMatches,\n minMatchCharLength,\n includeMatches,\n ignoreLocation\n });\n\n if (isMatch) {\n hasMatches = true;\n }\n\n totalScore += score;\n\n if (isMatch && indices) {\n allIndices = [...allIndices, ...indices];\n }\n });\n\n let result = {\n isMatch: hasMatches,\n score: hasMatches ? totalScore / this.chunks.length : 1\n };\n\n if (hasMatches && includeMatches) {\n result.indices = allIndices;\n }\n\n return result\n }\n}\n\nclass BaseMatch {\n constructor(pattern) {\n this.pattern = pattern;\n }\n static isMultiMatch(pattern) {\n return getMatch(pattern, this.multiRegex)\n }\n static isSingleMatch(pattern) {\n return getMatch(pattern, this.singleRegex)\n }\n search(/*text*/) {}\n}\n\nfunction getMatch(pattern, exp) {\n const matches = pattern.match(exp);\n return matches ? matches[1] : null\n}\n\n// Token: 'file\n\nclass ExactMatch extends BaseMatch {\n constructor(pattern) {\n super(pattern);\n }\n static get type() {\n return 'exact'\n }\n static get multiRegex() {\n return /^=\"(.*)\"$/\n }\n static get singleRegex() {\n return /^=(.*)$/\n }\n search(text) {\n const isMatch = text === this.pattern;\n\n return {\n isMatch,\n score: isMatch ? 0 : 1,\n indices: [0, this.pattern.length - 1]\n }\n }\n}\n\n// Token: !fire\n\nclass InverseExactMatch extends BaseMatch {\n constructor(pattern) {\n super(pattern);\n }\n static get type() {\n return 'inverse-exact'\n }\n static get multiRegex() {\n return /^!\"(.*)\"$/\n }\n static get singleRegex() {\n return /^!(.*)$/\n }\n search(text) {\n const index = text.indexOf(this.pattern);\n const isMatch = index === -1;\n\n return {\n isMatch,\n score: isMatch ? 0 : 1,\n indices: [0, text.length - 1]\n }\n }\n}\n\n// Token: ^file\n\nclass PrefixExactMatch extends BaseMatch {\n constructor(pattern) {\n super(pattern);\n }\n static get type() {\n return 'prefix-exact'\n }\n static get multiRegex() {\n return /^\\^\"(.*)\"$/\n }\n static get singleRegex() {\n return /^\\^(.*)$/\n }\n search(text) {\n const isMatch = text.startsWith(this.pattern);\n\n return {\n isMatch,\n score: isMatch ? 0 : 1,\n indices: [0, this.pattern.length - 1]\n }\n }\n}\n\n// Token: !^fire\n\nclass InversePrefixExactMatch extends BaseMatch {\n constructor(pattern) {\n super(pattern);\n }\n static get type() {\n return 'inverse-prefix-exact'\n }\n static get multiRegex() {\n return /^!\\^\"(.*)\"$/\n }\n static get singleRegex() {\n return /^!\\^(.*)$/\n }\n search(text) {\n const isMatch = !text.startsWith(this.pattern);\n\n return {\n isMatch,\n score: isMatch ? 0 : 1,\n indices: [0, text.length - 1]\n }\n }\n}\n\n// Token: .file$\n\nclass SuffixExactMatch extends BaseMatch {\n constructor(pattern) {\n super(pattern);\n }\n static get type() {\n return 'suffix-exact'\n }\n static get multiRegex() {\n return /^\"(.*)\"\\$$/\n }\n static get singleRegex() {\n return /^(.*)\\$$/\n }\n search(text) {\n const isMatch = text.endsWith(this.pattern);\n\n return {\n isMatch,\n score: isMatch ? 0 : 1,\n indices: [text.length - this.pattern.length, text.length - 1]\n }\n }\n}\n\n// Token: !.file$\n\nclass InverseSuffixExactMatch extends BaseMatch {\n constructor(pattern) {\n super(pattern);\n }\n static get type() {\n return 'inverse-suffix-exact'\n }\n static get multiRegex() {\n return /^!\"(.*)\"\\$$/\n }\n static get singleRegex() {\n return /^!(.*)\\$$/\n }\n search(text) {\n const isMatch = !text.endsWith(this.pattern);\n return {\n isMatch,\n score: isMatch ? 0 : 1,\n indices: [0, text.length - 1]\n }\n }\n}\n\nclass FuzzyMatch extends BaseMatch {\n constructor(\n pattern,\n {\n location = Config.location,\n threshold = Config.threshold,\n distance = Config.distance,\n includeMatches = Config.includeMatches,\n findAllMatches = Config.findAllMatches,\n minMatchCharLength = Config.minMatchCharLength,\n isCaseSensitive = Config.isCaseSensitive,\n ignoreLocation = Config.ignoreLocation\n } = {}\n ) {\n super(pattern);\n this._bitapSearch = new BitapSearch(pattern, {\n location,\n threshold,\n distance,\n includeMatches,\n findAllMatches,\n minMatchCharLength,\n isCaseSensitive,\n ignoreLocation\n });\n }\n static get type() {\n return 'fuzzy'\n }\n static get multiRegex() {\n return /^\"(.*)\"$/\n }\n static get singleRegex() {\n return /^(.*)$/\n }\n search(text) {\n return this._bitapSearch.searchIn(text)\n }\n}\n\n// Token: 'file\n\nclass IncludeMatch extends BaseMatch {\n constructor(pattern) {\n super(pattern);\n }\n static get type() {\n return 'include'\n }\n static get multiRegex() {\n return /^'\"(.*)\"$/\n }\n static get singleRegex() {\n return /^'(.*)$/\n }\n search(text) {\n let location = 0;\n let index;\n\n const indices = [];\n const patternLen = this.pattern.length;\n\n // Get all exact matches\n while ((index = text.indexOf(this.pattern, location)) > -1) {\n location = index + patternLen;\n indices.push([index, location - 1]);\n }\n\n const isMatch = !!indices.length;\n\n return {\n isMatch,\n score: isMatch ? 0 : 1,\n indices\n }\n }\n}\n\n// ❗Order is important. DO NOT CHANGE.\nconst searchers = [\n ExactMatch,\n IncludeMatch,\n PrefixExactMatch,\n InversePrefixExactMatch,\n InverseSuffixExactMatch,\n SuffixExactMatch,\n InverseExactMatch,\n FuzzyMatch\n];\n\nconst searchersLen = searchers.length;\n\n// Regex to split by spaces, but keep anything in quotes together\nconst SPACE_RE = / +(?=(?:[^\\\"]*\\\"[^\\\"]*\\\")*[^\\\"]*$)/;\nconst OR_TOKEN = '|';\n\n// Return a 2D array representation of the query, for simpler parsing.\n// Example:\n// \"^core go$ | rb$ | py$ xy$\" => [[\"^core\", \"go$\"], [\"rb$\"], [\"py$\", \"xy$\"]]\nfunction parseQuery(pattern, options = {}) {\n return pattern.split(OR_TOKEN).map((item) => {\n let query = item\n .trim()\n .split(SPACE_RE)\n .filter((item) => item && !!item.trim());\n\n let results = [];\n for (let i = 0, len = query.length; i < len; i += 1) {\n const queryItem = query[i];\n\n // 1. Handle multiple query match (i.e, once that are quoted, like `\"hello world\"`)\n let found = false;\n let idx = -1;\n while (!found && ++idx < searchersLen) {\n const searcher = searchers[idx];\n let token = searcher.isMultiMatch(queryItem);\n if (token) {\n results.push(new searcher(token, options));\n found = true;\n }\n }\n\n if (found) {\n continue\n }\n\n // 2. Handle single query matches (i.e, once that are *not* quoted)\n idx = -1;\n while (++idx < searchersLen) {\n const searcher = searchers[idx];\n let token = searcher.isSingleMatch(queryItem);\n if (token) {\n results.push(new searcher(token, options));\n break\n }\n }\n }\n\n return results\n })\n}\n\n// These extended matchers can return an array of matches, as opposed\n// to a singl match\nconst MultiMatchSet = new Set([FuzzyMatch.type, IncludeMatch.type]);\n\n/**\n * Command-like searching\n * ======================\n *\n * Given multiple search terms delimited by spaces.e.g. `^jscript .python$ ruby !java`,\n * search in a given text.\n *\n * Search syntax:\n *\n * | Token | Match type | Description |\n * | ----------- | -------------------------- | -------------------------------------- |\n * | `jscript` | fuzzy-match | Items that fuzzy match `jscript` |\n * | `=scheme` | exact-match | Items that are `scheme` |\n * | `'python` | include-match | Items that include `python` |\n * | `!ruby` | inverse-exact-match | Items that do not include `ruby` |\n * | `^java` | prefix-exact-match | Items that start with `java` |\n * | `!^earlang` | inverse-prefix-exact-match | Items that do not start with `earlang` |\n * | `.js$` | suffix-exact-match | Items that end with `.js` |\n * | `!.go$` | inverse-suffix-exact-match | Items that do not end with `.go` |\n *\n * A single pipe character acts as an OR operator. For example, the following\n * query matches entries that start with `core` and end with either`go`, `rb`,\n * or`py`.\n *\n * ```\n * ^core go$ | rb$ | py$\n * ```\n */\nclass ExtendedSearch {\n constructor(\n pattern,\n {\n isCaseSensitive = Config.isCaseSensitive,\n includeMatches = Config.includeMatches,\n minMatchCharLength = Config.minMatchCharLength,\n ignoreLocation = Config.ignoreLocation,\n findAllMatches = Config.findAllMatches,\n location = Config.location,\n threshold = Config.threshold,\n distance = Config.distance\n } = {}\n ) {\n this.query = null;\n this.options = {\n isCaseSensitive,\n includeMatches,\n minMatchCharLength,\n findAllMatches,\n ignoreLocation,\n location,\n threshold,\n distance\n };\n\n this.pattern = isCaseSensitive ? pattern : pattern.toLowerCase();\n this.query = parseQuery(this.pattern, this.options);\n }\n\n static condition(_, options) {\n return options.useExtendedSearch\n }\n\n searchIn(text) {\n const query = this.query;\n\n if (!query) {\n return {\n isMatch: false,\n score: 1\n }\n }\n\n const { includeMatches, isCaseSensitive } = this.options;\n\n text = isCaseSensitive ? text : text.toLowerCase();\n\n let numMatches = 0;\n let allIndices = [];\n let totalScore = 0;\n\n // ORs\n for (let i = 0, qLen = query.length; i < qLen; i += 1) {\n const searchers = query[i];\n\n // Reset indices\n allIndices.length = 0;\n numMatches = 0;\n\n // ANDs\n for (let j = 0, pLen = searchers.length; j < pLen; j += 1) {\n const searcher = searchers[j];\n const { isMatch, indices, score } = searcher.search(text);\n\n if (isMatch) {\n numMatches += 1;\n totalScore += score;\n if (includeMatches) {\n const type = searcher.constructor.type;\n if (MultiMatchSet.has(type)) {\n allIndices = [...allIndices, ...indices];\n } else {\n allIndices.push(indices);\n }\n }\n } else {\n totalScore = 0;\n numMatches = 0;\n allIndices.length = 0;\n break\n }\n }\n\n // OR condition, so if TRUE, return\n if (numMatches) {\n let result = {\n isMatch: true,\n score: totalScore / numMatches\n };\n\n if (includeMatches) {\n result.indices = allIndices;\n }\n\n return result\n }\n }\n\n // Nothing was matched\n return {\n isMatch: false,\n score: 1\n }\n }\n}\n\nconst registeredSearchers = [];\n\nfunction register(...args) {\n registeredSearchers.push(...args);\n}\n\nfunction createSearcher(pattern, options) {\n for (let i = 0, len = registeredSearchers.length; i < len; i += 1) {\n let searcherClass = registeredSearchers[i];\n if (searcherClass.condition(pattern, options)) {\n return new searcherClass(pattern, options)\n }\n }\n\n return new BitapSearch(pattern, options)\n}\n\nconst LogicalOperator = {\n AND: '$and',\n OR: '$or'\n};\n\nconst KeyType = {\n PATH: '$path',\n PATTERN: '$val'\n};\n\nconst isExpression = (query) =>\n !!(query[LogicalOperator.AND] || query[LogicalOperator.OR]);\n\nconst isPath = (query) => !!query[KeyType.PATH];\n\nconst isLeaf = (query) =>\n !isArray(query) && isObject(query) && !isExpression(query);\n\nconst convertToExplicit = (query) => ({\n [LogicalOperator.AND]: Object.keys(query).map((key) => ({\n [key]: query[key]\n }))\n});\n\n// When `auto` is `true`, the parse function will infer and initialize and add\n// the appropriate `Searcher` instance\nfunction parse(query, options, { auto = true } = {}) {\n const next = (query) => {\n let keys = Object.keys(query);\n\n const isQueryPath = isPath(query);\n\n if (!isQueryPath && keys.length > 1 && !isExpression(query)) {\n return next(convertToExplicit(query))\n }\n\n if (isLeaf(query)) {\n const key = isQueryPath ? query[KeyType.PATH] : keys[0];\n\n const pattern = isQueryPath ? query[KeyType.PATTERN] : query[key];\n\n if (!isString(pattern)) {\n throw new Error(LOGICAL_SEARCH_INVALID_QUERY_FOR_KEY(key))\n }\n\n const obj = {\n keyId: createKeyId(key),\n pattern\n };\n\n if (auto) {\n obj.searcher = createSearcher(pattern, options);\n }\n\n return obj\n }\n\n let node = {\n children: [],\n operator: keys[0]\n };\n\n keys.forEach((key) => {\n const value = query[key];\n\n if (isArray(value)) {\n value.forEach((item) => {\n node.children.push(next(item));\n });\n }\n });\n\n return node\n };\n\n if (!isExpression(query)) {\n query = convertToExplicit(query);\n }\n\n return next(query)\n}\n\n// Practical scoring function\nfunction computeScore(\n results,\n { ignoreFieldNorm = Config.ignoreFieldNorm }\n) {\n results.forEach((result) => {\n let totalScore = 1;\n\n result.matches.forEach(({ key, norm, score }) => {\n const weight = key ? key.weight : null;\n\n totalScore *= Math.pow(\n score === 0 && weight ? Number.EPSILON : score,\n (weight || 1) * (ignoreFieldNorm ? 1 : norm)\n );\n });\n\n result.score = totalScore;\n });\n}\n\nfunction transformMatches(result, data) {\n const matches = result.matches;\n data.matches = [];\n\n if (!isDefined(matches)) {\n return\n }\n\n matches.forEach((match) => {\n if (!isDefined(match.indices) || !match.indices.length) {\n return\n }\n\n const { indices, value } = match;\n\n let obj = {\n indices,\n value\n };\n\n if (match.key) {\n obj.key = match.key.src;\n }\n\n if (match.idx > -1) {\n obj.refIndex = match.idx;\n }\n\n data.matches.push(obj);\n });\n}\n\nfunction transformScore(result, data) {\n data.score = result.score;\n}\n\nfunction format(\n results,\n docs,\n {\n includeMatches = Config.includeMatches,\n includeScore = Config.includeScore\n } = {}\n) {\n const transformers = [];\n\n if (includeMatches) transformers.push(transformMatches);\n if (includeScore) transformers.push(transformScore);\n\n return results.map((result) => {\n const { idx } = result;\n\n const data = {\n item: docs[idx],\n refIndex: idx\n };\n\n if (transformers.length) {\n transformers.forEach((transformer) => {\n transformer(result, data);\n });\n }\n\n return data\n })\n}\n\nclass Fuse {\n constructor(docs, options = {}, index) {\n this.options = { ...Config, ...options };\n\n if (\n this.options.useExtendedSearch &&\n !true\n ) {\n throw new Error(EXTENDED_SEARCH_UNAVAILABLE)\n }\n\n this._keyStore = new KeyStore(this.options.keys);\n\n this.setCollection(docs, index);\n }\n\n setCollection(docs, index) {\n this._docs = docs;\n\n if (index && !(index instanceof FuseIndex)) {\n throw new Error(INCORRECT_INDEX_TYPE)\n }\n\n this._myIndex =\n index ||\n createIndex(this.options.keys, this._docs, {\n getFn: this.options.getFn,\n fieldNormWeight: this.options.fieldNormWeight\n });\n }\n\n add(doc) {\n if (!isDefined(doc)) {\n return\n }\n\n this._docs.push(doc);\n this._myIndex.add(doc);\n }\n\n remove(predicate = (/* doc, idx */) => false) {\n const results = [];\n\n for (let i = 0, len = this._docs.length; i < len; i += 1) {\n const doc = this._docs[i];\n if (predicate(doc, i)) {\n this.removeAt(i);\n i -= 1;\n len -= 1;\n\n results.push(doc);\n }\n }\n\n return results\n }\n\n removeAt(idx) {\n this._docs.splice(idx, 1);\n this._myIndex.removeAt(idx);\n }\n\n getIndex() {\n return this._myIndex\n }\n\n search(query, { limit = -1 } = {}) {\n const {\n includeMatches,\n includeScore,\n shouldSort,\n sortFn,\n ignoreFieldNorm\n } = this.options;\n\n let results = isString(query)\n ? isString(this._docs[0])\n ? this._searchStringList(query)\n : this._searchObjectList(query)\n : this._searchLogical(query);\n\n computeScore(results, { ignoreFieldNorm });\n\n if (shouldSort) {\n results.sort(sortFn);\n }\n\n if (isNumber(limit) && limit > -1) {\n results = results.slice(0, limit);\n }\n\n return format(results, this._docs, {\n includeMatches,\n includeScore\n })\n }\n\n _searchStringList(query) {\n const searcher = createSearcher(query, this.options);\n const { records } = this._myIndex;\n const results = [];\n\n // Iterate over every string in the index\n records.forEach(({ v: text, i: idx, n: norm }) => {\n if (!isDefined(text)) {\n return\n }\n\n const { isMatch, score, indices } = searcher.searchIn(text);\n\n if (isMatch) {\n results.push({\n item: text,\n idx,\n matches: [{ score, value: text, norm, indices }]\n });\n }\n });\n\n return results\n }\n\n _searchLogical(query) {\n\n const expression = parse(query, this.options);\n\n const evaluate = (node, item, idx) => {\n if (!node.children) {\n const { keyId, searcher } = node;\n\n const matches = this._findMatches({\n key: this._keyStore.get(keyId),\n value: this._myIndex.getValueForItemAtKeyId(item, keyId),\n searcher\n });\n\n if (matches && matches.length) {\n return [\n {\n idx,\n item,\n matches\n }\n ]\n }\n\n return []\n }\n\n const res = [];\n for (let i = 0, len = node.children.length; i < len; i += 1) {\n const child = node.children[i];\n const result = evaluate(child, item, idx);\n if (result.length) {\n res.push(...result);\n } else if (node.operator === LogicalOperator.AND) {\n return []\n }\n }\n return res\n };\n\n const records = this._myIndex.records;\n const resultMap = {};\n const results = [];\n\n records.forEach(({ $: item, i: idx }) => {\n if (isDefined(item)) {\n let expResults = evaluate(expression, item, idx);\n\n if (expResults.length) {\n // Dedupe when adding\n if (!resultMap[idx]) {\n resultMap[idx] = { idx, item, matches: [] };\n results.push(resultMap[idx]);\n }\n expResults.forEach(({ matches }) => {\n resultMap[idx].matches.push(...matches);\n });\n }\n }\n });\n\n return results\n }\n\n _searchObjectList(query) {\n const searcher = createSearcher(query, this.options);\n const { keys, records } = this._myIndex;\n const results = [];\n\n // List is Array\n records.forEach(({ $: item, i: idx }) => {\n if (!isDefined(item)) {\n return\n }\n\n let matches = [];\n\n // Iterate over every key (i.e, path), and fetch the value at that key\n keys.forEach((key, keyIndex) => {\n matches.push(\n ...this._findMatches({\n key,\n value: item[keyIndex],\n searcher\n })\n );\n });\n\n if (matches.length) {\n results.push({\n idx,\n item,\n matches\n });\n }\n });\n\n return results\n }\n _findMatches({ key, value, searcher }) {\n if (!isDefined(value)) {\n return []\n }\n\n let matches = [];\n\n if (isArray(value)) {\n value.forEach(({ v: text, i: idx, n: norm }) => {\n if (!isDefined(text)) {\n return\n }\n\n const { isMatch, score, indices } = searcher.searchIn(text);\n\n if (isMatch) {\n matches.push({\n score,\n key,\n value: text,\n idx,\n norm,\n indices\n });\n }\n });\n } else {\n const { v: text, n: norm } = value;\n\n const { isMatch, score, indices } = searcher.searchIn(text);\n\n if (isMatch) {\n matches.push({ score, key, value: text, norm, indices });\n }\n }\n\n return matches\n }\n}\n\nFuse.version = '6.6.2';\nFuse.createIndex = createIndex;\nFuse.parseIndex = parseIndex;\nFuse.config = Config;\n\n{\n Fuse.parseQuery = parse;\n}\n\n{\n register(ExtendedSearch);\n}\n\nexport { Fuse as default };\n","import util from \"./util\";\nimport Gun from \"gun\";\n\nconst electron = util.isElectron ? new Gun({peers: ['http://localhost:8768/gun'], file: 'State.electron', multicast:false, localStorage: false}).get('state') : null;\n\nexport default electron;","// @ts-nocheck\nimport Gun from 'gun';\nimport notifications from './notifications';\nimport Channel from './Channel';\nimport util from './util';\nimport _ from './lodash';\nimport Fuse from \"fuse.js\";\nimport localforage from 'localforage';\nimport local from './local';\nimport electron from './electron';\nimport user from './public';\nimport privateState from './private';\nimport blockedUsers from './blockedUsers';\n\nlet key: any;\nlet myName: string;\nlet latestChatLink: string;\nlet onlineTimeout: any;\nlet ourActivity: any;\nlet noFollows: boolean;\nlet noFollowers: boolean;\nlet searchIndex: any;\nlet initCalled: boolean;\nconst searchableItems: any = {};\nconst getExtendedFollowsCalled = new Map();\n\nconst DEFAULT_FOLLOW = 'hyECQHwSo7fgr2MVfPyakvayPeixxsaAWVtZ-vbaiSc.TXIp8MnCtrnW6n2MrYquWPcc-DTmZzMBmc2yaGv9gIU';\n\nconst DEFAULT_SETTINGS = {\n electron: {\n openAtLogin: true,\n minimizeOnClose: true\n },\n local: {\n enableWebtorrent: !util.isMobile,\n enablePublicPeerDiscovery: true,\n autoplayWebtorrent: true,\n maxConnectedPeers: util.isElectron ? 2 : 1\n }\n}\n\n/**\n * User session management utilities.\n */\nexport default {\n /**\n * Log in with a key from localStorage.\n *\n * If no key is found and options.autologin is not false, a new user will be created.\n *\n * If options.autofollow is not false, the default follow will be added.\n * @param options\n */\n init(options: any = {}) {\n if (initCalled) { return; }\n initCalled = true;\n let localStorageKey = localStorage.getItem('chatKeyPair');\n if (localStorageKey) {\n this.login(JSON.parse(localStorageKey));\n } else if (options.autologin !== false) {\n this.loginAsNewUser(options);\n } else {\n this.clearIndexedDB();\n }\n setTimeout(() => {\n local().get('block').map(() => {\n this.updateSearchIndex();\n });\n this.updateSearchIndex();\n });\n setInterval(() => {\n if (this.taskQueue.length) {\n //console.log('this.taskQueue', this.taskQueue.length);\n const t = this.taskQueue.shift();\n t && t();\n }\n }, 10);\n },\n\n DEFAULT_SETTINGS,\n DEFAULT_FOLLOW,\n\n taskQueue: [] as any[],\n\n updateSearchIndex: _.throttle(() => {\n const options = {keys: ['name'], includeScore: true, includeMatches: true, threshold: 0.3};\n const values = Object.values(_.omit(searchableItems, Object.keys(blockedUsers())));\n searchIndex = new Fuse(values, options);\n local().get('searchIndexUpdated').put(true);\n }, 2000, {leading:true}),\n\n saveSearchResult: _.throttle(k => {\n local().get('contacts').get(k).put({followDistance: searchableItems[k].followDistance,followerCount: searchableItems[k].followers.size});\n }, 1000, {leading:true}),\n\n addFollow(callback: Function, k: string, followDistance: number, follower?: string) {\n if (searchableItems[k]) {\n if (searchableItems[k].followDistance > followDistance) {\n searchableItems[k].followDistance = followDistance;\n }\n follower && searchableItems[k].followers.add(follower);\n } else {\n searchableItems[k] = {key: k, followDistance, followers: new Set(follower && [follower])};\n this.taskQueue.push(() => {\n user(k).get('profile').get('name').on((name: string) => {\n searchableItems[k].name = name;\n local().get('contacts').get(k).get('name').put(name);\n callback && callback(k, searchableItems[k]);\n });\n });\n }\n this.saveSearchResult(k);\n callback && callback(k, searchableItems[k]);\n this.updateSearchIndex();\n this.updateNoFollows();\n this.updateNoFollowers();\n },\n\n removeFollow(k: string, followDistance: number, follower: string) {\n if (followDistance === 1) {\n local().get('contacts').get(k).put(false);\n local().get('groups').get('follows').get(k).put(false);\n if (searchableItems[k]) {\n searchableItems[k].followers.delete(follower);\n this.updateNoFollows();\n this.updateNoFollowers();\n }\n }\n console.log('removeFollow', k, followDistance, follower);\n if (searchableItems[k] && searchableItems[k].followers.size === 0) {\n delete searchableItems[k];\n local().get('contacts').get(k).put(false);\n local().get('groups').get('everyone').get(k).put(false);\n }\n },\n\n getExtendedFollows(callback: Function, k = key.pub, maxDepth = 3, currentDepth = 1) {\n const called = getExtendedFollowsCalled.get(k);\n if (called && called <= currentDepth) {\n return;\n }\n getExtendedFollowsCalled.set(k, currentDepth);\n\n this.addFollow(callback, k, currentDepth - 1);\n\n user(k).get('follow').map().on((isFollowing: boolean, followedKey: string) => { // TODO: unfollow\n if (isFollowing) {\n this.addFollow(callback, followedKey, currentDepth, k);\n if (currentDepth < maxDepth) {\n this.taskQueue.push(() => this.getExtendedFollows(callback, followedKey, maxDepth, currentDepth + 1));\n }\n } else {\n this.removeFollow(followedKey, currentDepth, k);\n }\n });\n\n return searchableItems;\n },\n\n updateNoFollows: _.throttle(() => {\n const v = Object.keys(searchableItems).length <= 1;\n if (v !== noFollows) {\n noFollows = v;\n local().get('noFollows').put(noFollows);\n }\n }, 1000, {leading:true}),\n\n updateNoFollowers: _.throttle(() => {\n const v = !(searchableItems[key.pub] && (searchableItems[key.pub].followers.size > 0));\n if (v !== noFollowers) {\n noFollowers = v;\n local().get('noFollowers').put(noFollowers);\n }\n }, 1000, {leading:true}),\n\n getSearchIndex() {\n return searchIndex;\n },\n\n setOurOnlineStatus() {\n const activeRoute = window.location.hash;\n Channel.setActivity(ourActivity = 'active');\n const setActive = _.debounce(() => {\n const chatId = activeRoute && activeRoute.replace('#/profile/','').replace('#/chat/','');\n const chat = privateState(chatId);\n if (chat && !ourActivity) {\n chat.setMyMsgsLastSeenTime();\n }\n Channel.setActivity(ourActivity = 'active');\n clearTimeout(onlineTimeout);\n onlineTimeout = setTimeout(() => Channel.setActivity(ourActivity = 'online'), 30000);\n }, 1000);\n document.addEventListener(\"touchmove\", setActive);\n document.addEventListener(\"mousemove\", setActive);\n document.addEventListener(\"keypress\", setActive);\n document.addEventListener(\"visibilitychange\", () => {\n if (document.visibilityState === 'visible') {\n Channel.setActivity(ourActivity = 'active');\n const chatId = location.pathname.slice(1).replace('chat/','');\n const chat = activeRoute && privateState(chatId);\n if (chat) {\n chat.setMyMsgsLastSeenTime();\n notifications.changeChatUnseenCount(chatId, 0);\n }\n } else {\n Channel.setActivity(ourActivity = 'online');\n }\n });\n setActive();\n window.addEventListener(\"beforeunload\", () => {\n Channel.setActivity(ourActivity = null);\n });\n },\n\n updateGroups() {\n this.getExtendedFollows((k: string, info: any) => {\n if (info.followDistance <= 1) {\n local().get('groups').get('follows').get(k).put(true);\n }\n local().get('groups').get('everyone').get(k).put(true);\n if (k === this.getPubKey()) {\n this.updateNoFollowers();\n }\n });\n },\n\n /**\n * Log in with a private key.\n * @param key\n */\n login(k: any) {\n const shouldRefresh = !!key;\n key = k;\n localStorage.setItem('chatKeyPair', JSON.stringify(k));\n user().auth(key);\n user().put({epub: key.epub});\n user().get('likes').put({a:null}); // gun bug?\n user().get('msgs').put({a:null}); // gun bug?\n user().get('replies').put({a:null}); // gun bug?\n notifications.subscribeToWebPush();\n notifications.getWebPushSubscriptions();\n notifications.subscribeToIrisNotifications();\n Channel.getMyChatLinks( undefined, (chatLink: any) => {\n local().get('chatLinks').get(chatLink.id).put(chatLink.url);\n latestChatLink = chatLink.url;\n });\n this.setOurOnlineStatus();\n Channel.getChannels( (c: Channel) => this.addChannel(c));\n user().get('profile').get('name').on((name: any) => {\n if (name && typeof name === 'string') {\n myName = name;\n }\n });\n notifications.init();\n local().get('loggedIn').put(true);\n local().get('settings').once().then(settings => {\n if (!settings) {\n local().get('settings').put(DEFAULT_SETTINGS.local);\n } else if (settings.enableWebtorrent === undefined || settings.autoplayWebtorrent === undefined) {\n local().get('settings').get('enableWebtorrent').put(DEFAULT_SETTINGS.local.enableWebtorrent);\n local().get('settings').get('autoplayWebtorrent').put(DEFAULT_SETTINGS.local.autoplayWebtorrent);\n }\n });\n user().get('block').map().on((isBlocked: boolean, user: string) => {\n local().get('block').get(user).put(isBlocked);\n if (isBlocked) {\n delete searchableItems[user];\n }\n });\n this.updateGroups();\n if (shouldRefresh) {\n location.reload();\n }\n if (electron) {\n electron.get('settings').on(electron => {\n local().get('settings').get('electron').put(electron);\n });\n electron.get('user').put(key.pub);\n }\n local().get('filters').get('group').once().then(v => {\n if (!v) {\n local().get('filters').get('group').put('follows');\n }\n });\n },\n\n /**\n * Create a new user account and log in.\n * @param options {Object} - Options for the new account.\n * @returns {Promise<*>}\n */\n loginAsNewUser(options: any = {}) {\n const name = options.name || util.generateName();\n console.log('loginAsNewUser name', name);\n return Gun.SEA.pair().then(k => {\n this.login(k);\n user().get('profile').put({a:null});\n user().get('profile').get('name').put(name);\n local().get('filters').put({a:null});\n local().get('filters').get('group').put('follows');\n Channel.createChatLink().then(l => latestChatLink = l);\n setTimeout(() => {\n if (options.autofollow !== false) {\n console.log('autofollowing', DEFAULT_FOLLOW);\n user().get('follow').get(DEFAULT_FOLLOW).put(true);\n }\n }, 1000); // maybe wait for login return instead\n });\n },\n\n /**\n * Log out the current user.\n * @returns {Promise}\n */\n async logOut() {\n if (electron) {\n electron.get('user').put(null);\n }\n // TODO: remove subscription from your channels\n if (navigator.serviceWorker) {\n const reg = await navigator.serviceWorker.getRegistration();\n if (reg && reg.pushManager) {\n reg.active?.postMessage({key: null});\n const sub = await reg.pushManager.getSubscription();\n if (sub) {\n const hash = await util.getHash(JSON.stringify(sub));\n notifications.removeSubscription(hash);\n sub.unsubscribe && sub.unsubscribe();\n }\n }\n }\n this.clearIndexedDB();\n localStorage.clear(); // TODO clear only iris data\n localforage.clear().then(() => {\n window.location.hash = '';\n window.location.href = '/';\n location.reload();\n });\n },\n\n clearIndexedDB() {\n return new Promise(resolve => {\n const r1 = window.indexedDB.deleteDatabase('local()');\n const r2 = window.indexedDB.deleteDatabase('radata');\n let r1done = false;\n let r2done = false;\n const check = () => {\n r1done && r2done && resolve(undefined);\n }\n r1.onerror = r2.onerror = e => console.error(e);\n //r1.onblocked = r2.onblocked = e => console.error('blocked', e);\n r1.onsuccess = () => {\n r1done = true;\n check();\n }\n r2.onsuccess = () => {\n r2done = true;\n check();\n }\n });\n },\n\n getMyChatLink() {\n return latestChatLink || util.getProfileLink(key.pub);\n },\n\n /**\n * Get the keypair of the logged in user.\n * @returns {*}\n */\n getKey() { return key; },\n\n /**\n * Get the public key of the logged in user.\n * @returns {*}\n */\n getPubKey() {\n return key && key.pub;\n },\n\n /**\n * Get the name of the logged in user.\n * @returns {*}\n */\n getMyName() { return myName; }, // TODO maybe remove and use iris.user().get('profile').get('name') instead?\n\n myPeerUrl: (ip: string) => `http://${ip}:8767/gun`,\n\n async shareMyPeerUrl(channel: Channel) {\n const myIp = await local().get('settings').get('electron').get('publicIp').once();\n myIp && channel.put && channel.put('my_peer', this.myPeerUrl(myIp));\n },\n\n newChannel(pub: string, chatLink?: string) {\n if (!pub || this.channelIds.has(pub)) {\n return;\n }\n const chat = privateState(pub, chatLink);\n this.addChannel(chat);\n return chat;\n },\n\n addChannel(chat: Channel) {\n this.taskQueue.push(() => {\n let pub = chat.getId();\n if (this.channelIds.has(pub)) { return; }\n this.channelIds.add(pub);\n const chatNode = local().get('channels').get(pub);\n chatNode.get('latestTime').on((t: string) => {\n if (t && (!chat.latestTime || t > chat.latestTime)) {\n chat.latestTime = t;\n } else {\n // chatNode.get('latestTime').put(chat.latestTime); // omg recursion\n }\n });\n chatNode.get('theirMsgsLastSeenTime').on((t: string) => {\n if (!t) { return; }\n const d = new Date(t);\n if (!chat.theirMsgsLastSeenDate || chat.theirMsgsLastSeenDate < d) {\n chat.theirMsgsLastSeenDate = d;\n }\n });\n chat.getLatestMsg && chat.getLatestMsg((latest: any, info: any) => {\n this.processMessage(pub, latest, info);\n });\n notifications.changeChatUnseenCount(pub, 0);\n chat.notificationSetting = 'all';\n chat.onMy('notificationSetting', (val: any) => {\n chat.notificationSetting = val;\n });\n //$(\".chat-list\").append(el);\n chat.theirMsgsLastSeenTime = '';\n chat.getTheirMsgsLastSeenTime((time: any) => {\n if (chat && time && time >= chat.theirMsgsLastSeenTime) {\n chat.theirMsgsLastSeenTime = time;\n chatNode.get('theirMsgsLastSeenTime').put(time);\n }\n });\n chat.getMyMsgsLastSeenTime((time: any) => {\n chat.myLastSeenTime = new Date(time);\n if (chat.latest && chat.myLastSeenTime >= chat.latest.time) {\n notifications.changeChatUnseenCount(pub, 0);\n }\n });\n chat.isTyping = false;\n chat.getTyping(isTyping => {\n chat.isTyping = isTyping;\n local().get('channels').get(pub).get('isTyping').put(isTyping);\n });\n chat.online = {};\n Channel.getActivity(pub, (activity) => {\n if (chat) {\n chatNode.put({theirLastActiveTime: activity && activity.lastActive, activity: activity && activity.isActive && activity.status});\n chat.activity = activity;\n }\n });\n if (chat.uuid) {\n let isDarkMode = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches;\n chat.participantProfiles = {};\n chat.on('name', v => {\n chat.name = v;\n searchableItems[chat.uuid] = {name: v, uuid: chat.uuid};\n local().get('channels').get(chat.uuid).get('name').put(v);\n });\n chat.on('photo', v => {\n searchableItems[chat.uuid] = searchableItems[chat.uuid] || {};\n searchableItems[chat.uuid].photo = v;\n local().get('channels').get(chat.uuid).get('photo').put(v)\n });\n chat.on('about', v => local().get('channels').get(chat.uuid).get('about').put(v));\n chat.getParticipants(participants => {\n delete participants.undefined; // TODO fix where it comes from\n if (typeof participants === 'object') {\n let keys = Object.keys(participants);\n keys.forEach((k, i) => {\n let hue = 360 / Math.max(keys.length, 2) * i; // TODO use css filter brightness\n chat.participantProfiles[k] = {permissions: participants[k], color: `hsl(${hue}, 98%, ${isDarkMode ? 80 : 33}%)`};\n user(k).get('profile').get('name').on(name => {\n chat.participantProfiles[k].name = name;\n });\n });\n }\n local().get('channels').get(chat.uuid).get('participants').put(participants);\n });\n chat.inviteLinks = {};\n chat.getChatLinks({callback: ({url, id}) => {\n console.log('got chat link', id, url);\n chat.inviteLinks[id] = url; // TODO use State\n local().get('inviteLinksChanged').put(true);\n }});\n } else {\n // TODO do we want this?\n user(pub).get('profile').get('name').on(v => local().get('channels').get(pub).get('name').put(v))\n }\n if (chat.put) {\n chat.onTheir('webPushSubscriptions', (s, k, from) => {\n if (!Array.isArray(s)) { return; }\n chat.webPushSubscriptions = chat.webPushSubscriptions || {};\n chat.webPushSubscriptions[from || pub] = s;\n });\n const arr = Object.values(notifications.webPushSubscriptions);\n setTimeout(() => chat.put('webPushSubscriptions', arr), 5000);\n this.shareMyPeerUrl(chat);\n }\n chat.onTheir('call', call => {\n local().get('call').put({pub, call});\n });\n local().get('channels').get(pub).put({enabled:true});\n /* Disable private peer discovery, since they're not connecting anyway\n if (chat.onTheir) {\n chat.onTheir('my_peer', (url, k, from) => {\n console.log('Got private peer url', url, 'from', from);\n peers.addPeer({url, from})\n });\n }\n */\n\n });\n },\n\n // TODO: should perhaps be in Channel\n processMessage(chatId: string, msg: any, info: any, onClickNotification?: Function) {\n const chat = privateState(chatId);\n chat.messageIds = chat.messageIds || {};\n if (chat.messageIds[msg.time + info.from]) return;\n chat.messageIds[msg.time + info.from] = true;\n if (info) {\n msg = Object.assign(msg, info);\n }\n if (msg.invite) {\n const chatLink = `https://iris.to/?channelId=${msg.invite.group}&inviter=${chatId}`;\n this.newChannel(msg.invite.group, chatLink);\n return;\n }\n msg.selfAuthored = info.selfAuthored;\n local().get('channels').get(chatId).get('msgs').get(msg.time + (msg.from && msg.from.slice(0, 10))).put(JSON.stringify(msg));\n msg.timeObj = new Date(msg.time);\n if (!info.selfAuthored && msg.timeObj > chat.myLastSeenTime) {\n if (window.location.hash !== `#/chat/${ chatId}` || document.visibilityState !== 'visible') {\n notifications.changeChatUnseenCount(chatId, 1);\n } else if (ourActivity === 'active') {\n chat.setMyMsgsLastSeenTime();\n }\n }\n if (!info.selfAuthored && msg.time > chat.theirMsgsLastSeenTime) {\n local().get('channels').get(chatId).get('theirMsgsLastSeenTime').put(msg.time);\n }\n if (!chat.latestTime || (msg.time > chat.latestTime)) {\n local().get('channels').get(chatId).put({\n latestTime: msg.time,\n latest: {time: msg.time, text: msg.text, selfAuthored: info.selfAuthored}\n });\n }\n // TODO: onclickNotification should do route(`/chat/${ pub}`);\n notifications.notifyMsg(msg, info, chatId, onClickNotification);\n },\n\n subscribeToMsgs(pub) {\n const c = privateState(pub);\n if (c.subscribed) { return; }\n c.subscribed = true;\n c.getMessages((msg, info) => {\n this.processMessage(pub, msg, info);\n });\n },\n\n /**\n * Known private channels with other users\n */\n channelIds: new Set(),\n};\n","import publicSpace from './global';\nimport util from './util';\n\n/**\n * Content-addressed storage\n */\nexport default {\n /**\n * Get a file identified by its hash\n * @param hash\n * @param callback\n * @returns {Promise}\n */\n get(hash: string, callback: Function) {\n return new Promise((resolve, reject) => {\n if (!hash) {\n reject('No hash provided');\n }\n if (typeof hash !== 'string') {\n reject('Hash must be a string');\n }\n publicSpace().get('#').get(hash).on((v: any, _k: string, _x: any, e: any) => {\n if (v) {\n e.off();\n callback && callback(v);\n resolve(v);\n }\n });\n });\n },\n\n /**\n * Store a file and return its hash\n * @param value\n * @returns {Promise}\n */\n async put(value: any) {\n const hash = await util.getHash(value);\n publicSpace().get('#').get(hash).put(value);\n return hash;\n }\n}","/*eslint no-useless-escape: \"off\", camelcase: \"off\" */\n\nimport util from './util';\nimport Gun from 'gun'; // eslint-disable-line no-unused-vars\nimport 'gun/sea';\n// eslint-disable-line no-unused-vars\n\nlet myKey: any;\n\nclass Key {\n static async getActiveKey(datadir = `.`, keyfile = `iris.key`, fs?: any) {\n if (myKey) {\n return myKey;\n }\n if (fs) {\n const privKeyFile = `${datadir}/${keyfile}`;\n if (fs.existsSync(privKeyFile)) {\n const f = fs.readFileSync(privKeyFile, `utf8`);\n myKey = Key.fromString(f);\n } else {\n const newKey = await Key.generate();\n myKey = myKey || newKey; // eslint-disable-line require-atomic-updates\n fs.writeFileSync(privKeyFile, Key.toString(myKey));\n fs.chmodSync(privKeyFile, 400);\n }\n if (!myKey) {\n throw new Error(`loading default key failed - check ${datadir}/${keyfile}`);\n }\n } else {\n const str = window.localStorage.getItem(`iris.myKey`);\n if (str) {\n myKey = Key.fromString(str);\n } else {\n const newKey = await Key.generate();\n myKey = myKey || newKey; // eslint-disable-line require-atomic-updates\n window.localStorage.setItem(`iris.myKey`, Key.toString(myKey));\n }\n if (!myKey) {\n throw new Error(`loading default key failed - check localStorage iris.myKey`);\n }\n }\n return myKey;\n }\n\n static getDefault(datadir = `.`, keyfile = `iris.key`) {\n return Key.getActiveKey(datadir, keyfile);\n }\n\n static async getActivePub(datadir = `.`, keyfile = `iris.key`) {\n const key = await Key.getActiveKey(datadir, keyfile);\n return key.pub;\n }\n\n static setActiveKey(key: any, save = true, datadir = `.`, keyfile = `iris.key`, fs: any) {\n myKey = key;\n if (!save) return;\n if (util.isNode) {\n const privKeyFile = `${datadir}/${keyfile}`;\n fs.writeFileSync(privKeyFile, Key.toString(myKey));\n fs.chmodSync(privKeyFile, 400);\n } else {\n window.localStorage.setItem(`iris.myKey`, Key.toString(myKey));\n }\n }\n\n static toString(key: any) {\n return JSON.stringify(key);\n }\n\n static getId(key: any) {\n if (!(key && key.pub)) {\n throw new Error(`missing param`);\n }\n return key.pub; // hack until GUN supports lookups by keyID\n //return util.getHash(key.pub);\n }\n\n static fromString(str: string) {\n return JSON.parse(str);\n }\n\n static generate() {\n return Gun.SEA.pair();\n }\n\n static async sign(msg: any, pair: any) {\n const sig = await Gun.SEA.sign(msg, pair);\n return `a${sig}`;\n }\n\n static verify(msg: any, pubKey: any) {\n return Gun.SEA.verify(msg.slice(1), pubKey);\n }\n}\n\nexport default Key;\n","// @ts-nocheck\n\n/*jshint unused: false */\n`use strict`;\nimport util from './util';\nimport Attribute from './Attribute';\nimport Key from './Key';\n\nconst errorMsg = `Invalid message:`;\n\nclass ValidationError extends Error {}\n\n/**\n* Signed message object. Your friends can index and relay your messages, while others can still verify that they were signed by you.\n*\n* Fields: signedData, signer (public key) and signature.\n*\n* signedData has an author, signer, type, time and optionally other fields.\n*\n* signature covers the utf8 string representation of signedData. Since messages are digitally signed, users only need to care about the message signer and not who relayed it or whose index it was found from.\n*\n* signer is the entity that verified its origin. In other words: message author and signer can be different entities, and only the signer needs to use Iris.\n*\n* For example, a crawler can import and sign other people's messages from Twitter. Only the users who trust the crawler will see the messages.\n*\n* Constructor: creates a message from the param obj.signedData that must contain at least the mandatory fields: author, type and time.\n* @param obj\n*\n* @example\n* https://github.com/irislib/iris-lib/blob/master/__tests__/SignedMessage.js\n*\n* Verification message:\n* {\n* signedData: {\n* author: {name:'Alice', key:'ABCD1234'},\n* recipient: {\n* name: 'Bob',\n* email: ['bob@example.com', 'bob.saget@example.com'],\n* bitcoin: '1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa'\n* },\n* type: 'verification'\n* },\n* signer: 'ABCD1234',\n* signature: '1234ABCD'\n* }\n*/\nclass SignedMessage {\n signedData: any;\n pubKey: any;\n sig: any;\n\n constructor(obj: any) {\n this.signedData = obj.signedData;\n this.pubKey = obj.pubKey;\n if (obj.sig) {\n if (typeof obj.sig !== `string`) {\n throw new ValidationError(`SignedMessage signature must be a string`);\n }\n this.sig = obj.sig;\n this.getHash();\n }\n this._validate();\n }\n\n static _getArray(authorOrRecipient) {\n const arr = [];\n const keys = Object.keys(authorOrRecipient);\n for (let i = 0;i < keys.length;i++) {\n const type = keys[i];\n const value = authorOrRecipient[keys[i]];\n if (typeof value === `string`) {\n arr.push(new Attribute(type, value));\n } else { // array\n for (let j = 0;j < value.length;j++) {\n const elementValue = value[j];\n arr.push(new Attribute(type, elementValue));\n }\n }\n }\n return arr;\n }\n\n static _getIterable(authorOrRecipient) {\n return {\n *[Symbol.iterator]() {\n const keys = Object.keys(authorOrRecipient);\n for (let i = 0;i < keys.length;i++) {\n const type = keys[i];\n const value = authorOrRecipient[keys[i]];\n if (typeof value === `string`) {\n yield new Attribute(type, value);\n } else { // array\n for (let j = 0;j < value.length;j++) {\n const elementValue = value[j];\n yield new Attribute(type, elementValue);\n }\n }\n }\n }\n };\n }\n\n getAuthorIterable() {\n return SignedMessage._getIterable(this.signedData.author);\n }\n\n getRecipientIterable() {\n return SignedMessage._getIterable(this.signedData.recipient);\n }\n\n getAuthorArray() {\n return SignedMessage._getArray(this.signedData.author);\n }\n\n getRecipientArray() {\n return this.signedData.recipient ? SignedMessage._getArray(this.signedData.recipient) : [];\n }\n\n getSignerKeyID() {\n return this.pubKey; // hack until gun supports keyID lookups\n //return util.getHash(this.pubKey);\n }\n\n _validate() {\n if (!this.signedData) {throw new ValidationError(`${errorMsg} Missing signedData`);}\n if (typeof this.signedData !== `object`) {throw new ValidationError(`${errorMsg} signedData must be an object`);}\n const d = this.signedData;\n\n if (!d.type) {throw new ValidationError(`${errorMsg} Missing type definition`);}\n if (!d.author) {throw new ValidationError(`${errorMsg} Missing author`);}\n if (typeof d.author !== `object`) {throw new ValidationError(`${errorMsg} Author must be object`);}\n if (Array.isArray(d.author)) {throw new ValidationError(`${errorMsg} Author must not be an array`);}\n if (Object.keys(d.author).length === 0) {throw new ValidationError(`${errorMsg} Author empty`);}\n if (this.pubKey) {\n this.signerKeyHash = this.getSignerKeyID();\n }\n for (const attr in d.author) {\n const t = typeof d.author[attr];\n if (t !== `string`) {\n if (Array.isArray(d.author[attr])) {\n for (let i = 0;i < d.author[attr].length;i++) {\n if (typeof d.author[attr][i] !== `string`) {throw new ValidationError(`${errorMsg} Author attribute must be string, got ${attr}: [${d.author[attr][i]}]`);}\n if (d.author[attr][i].length === 0) {\n throw new ValidationError(`${errorMsg} author ${attr} in array[${i}] is empty`);\n }\n }\n } else {\n throw new ValidationError(`${errorMsg} Author attribute must be string or array, got ${attr}: ${d.author[attr]}`);\n }\n }\n if (attr === `keyID`) {\n if (t !== `string`) {throw new ValidationError(`${errorMsg} Author keyID must be string, got ${t}`);}\n if (this.signerKeyHash && d.author[attr] !== this.signerKeyHash) {throw new ValidationError(`${errorMsg} If message has a keyID author, it must be signed by the same key`);}\n }\n }\n if (d.recipient) {\n if (typeof d.recipient !== `object`) {throw new ValidationError(`${errorMsg} Recipient must be object`);}\n if (Array.isArray(d.recipient)) {throw new ValidationError(`${errorMsg} Recipient must not be an array`);}\n if (Object.keys(d.recipient).length === 0) {throw new ValidationError(`${errorMsg} Recipient empty`);}\n for (const attr in d.recipient) {\n const t = typeof d.recipient[attr];\n if (t !== `string`) {\n if (Array.isArray(d.recipient[attr])) {\n for (let i = 0;i < d.recipient[attr].length;i++) {\n if (typeof d.recipient[attr][i] !== `string`) {throw new ValidationError(`${errorMsg} Recipient attribute must be string, got ${attr}: [${d.recipient[attr][i]}]`);}\n if (d.recipient[attr][i].length === 0) {\n throw new ValidationError(`${errorMsg} recipient ${attr} in array[${i}] is empty`);\n }\n }\n } else {\n throw new ValidationError(`${errorMsg} Recipient attribute must be string or array, got ${attr}: ${d.recipient[attr]}`);\n }\n }\n }\n }\n if (!(d.time || d.timestamp)) {throw new ValidationError(`${errorMsg} Missing time field`);}\n\n if (!Date.parse(d.time || d.timestamp)) {throw new ValidationError(`${errorMsg} Invalid time field`);}\n\n if (d.type === `rating`) {\n if (isNaN(d.rating)) {throw new ValidationError(`${errorMsg} Invalid rating`);}\n if (isNaN(d.maxRating)) {throw new ValidationError(`${errorMsg} Invalid maxRating`);}\n if (isNaN(d.minRating)) {throw new ValidationError(`${errorMsg} Invalid minRating`);}\n if (d.rating > d.maxRating) {throw new ValidationError(`${errorMsg} Rating is above maxRating`);}\n if (d.rating < d.minRating) {throw new ValidationError(`${errorMsg} Rating is below minRating`);}\n if (typeof d.context !== `string` || !d.context.length) {throw new ValidationError(`${errorMsg} Rating messages must have a context field`);}\n }\n\n if (d.type === `verification` || d.type === `unverification`) {\n if (d.recipient.length < 2) {throw new ValidationError(`${errorMsg} At least 2 recipient attributes are needed for a connection / disconnection. Got: ${d.recipient}`);}\n }\n\n return true;\n }\n\n isPositive() {\n return this.signedData.type === `rating` && this.signedData.rating > (this.signedData.maxRating + this.signedData.minRating) / 2;\n }\n\n isNegative() {\n return this.signedData.type === `rating` && this.signedData.rating < (this.signedData.maxRating + this.signedData.minRating) / 2;\n }\n\n isNeutral() {\n return this.signedData.type === `rating` && this.signedData.rating === (this.signedData.maxRating + this.signedData.minRating) / 2;\n }\n\n /**\n * @param {Object} key Gun.SEA keypair to sign the message with\n */\n async sign(key) {\n this.sig = await Key.sign(this.signedData, key);\n this.pubKey = key.pub;\n await this.getHash();\n return true;\n }\n\n /**\n * Create an iris message. SignedMessage time is automatically set. If signingKey is specified and author omitted, signingKey will be used as author.\n * @param {Object} signedData message data object including author, recipient and other possible attributes\n * @param {Object} signingKey optionally, you can set the key to sign the message with\n * @returns {Promise} message\n */\n static async create(signedData, signingKey) {\n if (!signedData.author && signingKey) {\n signedData.author = {keyID: Key.getId(signingKey)};\n }\n signedData.time = signedData.time || (new Date()).toISOString();\n const m = new SignedMessage({signedData});\n if (signingKey) {\n await m.sign(signingKey);\n }\n return m;\n }\n\n static createVerification(signedData, signingKey) {\n signedData.type = `verification`;\n return SignedMessage.create(signedData, signingKey);\n }\n\n static createRating(signedData, signingKey) {\n signedData.type = `rating`;\n signedData.context = signedData.context || `iris`;\n signedData.maxRating = signedData.maxRating || 10;\n signedData.minRating = signedData.minRating || -10;\n return SignedMessage.create(signedData, signingKey);\n }\n\n getAuthor(index) {\n for (const a of this.getAuthorIterable()) {\n if (a.isUniqueType()) {\n return index.getContacts(a);\n }\n }\n }\n\n getRecipient(index) {\n if (!this.signedData.recipient) {\n return undefined;\n }\n for (const a of this.getRecipientIterable()) {\n if (a.isUniqueType()) {\n return index.getContacts(a);\n }\n }\n }\n\n /**\n * @returns {string} base64 sha256 hash of message\n */\n async getHash() {\n if (this.sig && !this.hash) {\n this.hash = await util.getHash(this.sig);\n }\n return this.hash;\n }\n\n getId() {\n return this.getHash();\n }\n\n static async fromSig(obj) {\n if (!obj.sig) {\n throw new Error(`Missing signature in object:`, obj);\n }\n if (!obj.pubKey) {\n throw new Error(`Missing pubKey in object:`);\n }\n //const signedData = await Key.verify(obj.sig, obj.pubKey); // disable sig verification while migrating to new gun :(\n const signedData = JSON.parse(obj.sig.slice(4)).m;\n const o = {signedData, sig: obj.sig, pubKey: obj.pubKey};\n return new SignedMessage(o);\n }\n\n /**\n * @return {boolean} true if message signature is valid. Otherwise throws ValidationError.\n */\n async verify() {\n if (!this.pubKey) {\n throw new ValidationError(`${errorMsg} SignedMessage has no .pubKey`);\n }\n if (!this.sig) {\n throw new ValidationError(`${errorMsg} SignedMessage has no .sig`);\n }\n this.signedData = await Key.verify(this.sig, this.pubKey);\n if (!this.signedData) {\n throw new ValidationError(`${errorMsg} Invalid signature`);\n }\n if (this.hash) {\n if (this.hash !== (await util.getHash(this.sig))) {\n throw new ValidationError(`${errorMsg} Invalid message hash`);\n }\n } else {\n this.getHash();\n }\n return true;\n }\n\n /**\n * @returns {string}\n */\n serialize() {\n return {sig: this.sig, pubKey: this.pubKey};\n }\n\n toString() {\n return JSON.stringify(this.serialize());\n }\n\n /**\n * @returns {Promise}\n */\n static async deserialize(s) {\n return SignedMessage.fromSig(s);\n }\n\n static async fromString(s) {\n return SignedMessage.fromSig(JSON.parse(s));\n }\n\n static async setReaction(gun, msg, reaction) {\n const hash = await msg.getHash();\n gun.get(`reactions`).get(hash).put(reaction);\n gun.get(`reactions`).get(hash).put(reaction);\n gun.get(`messagesByHash`).get(hash).get(`reactions`).get(this.rootContact.value).put(reaction);\n gun.get(`messagesByHash`).get(hash).get(`reactions`).get(this.rootContact.value).put(reaction);\n }\n}\n\nexport default SignedMessage;\n","/*eslint no-useless-escape: \"off\", camelcase: \"off\" */\n\nimport Gun from 'gun';\nimport 'gun/sea';\n\nimport session from './session';\nimport peers from './peers';\nimport util from './util';\nimport local from './local';\nimport global from './global';\nimport publicState from './public';\nimport group from './group';\nimport electron from './electron';\nimport privateState from './private';\nimport staticState from './static';\nimport notifications from './notifications';\n\nimport SignedMessage from './SignedMessage';\nimport Channel from './Channel';\nimport Node from './Node';\n\nexport default {\n local,\n global,\n\n group,\n public: publicState,\n private: privateState,\n static: staticState,\n electron,\n peers,\n session,\n util,\n notifications,\n\n SEA: Gun.SEA,\n Gun,\n SignedMessage,\n Channel,\n Node,\n};"],"names":["require","path","require$$0","require$$1","require$$2","require$$3","Gun","fs","rfs","Store","Limiter","kStatusCode","PerMessageDeflate","EMPTY_BUFFER","isValidStatusCode","BINARY_TYPES","kWebSocket","NOOP","require$$4","format","parse","require$$5","toBuffer","require$$6","EventEmitter","receiver","Receiver","Sender","createHash","GUID","emitClose","socketOnError","abortHandshake","WebSocket","ws","global","u","dgram","os","throttle","func","limit","inThrottle","args","arguments","context","apply","setTimeout","debounce","inDebounce","clearTimeout","sample","arr","Math","floor","random","length","sampleSize","size","shuffled","slice","i","min","temp","index","defer","once","called","omit","obj","keys","newObj","Object","forEach","key","includes","defaults","undefined","pickBy","predicate","isNode","prototype","toString","call","process","e","userAgent","navigator","toLowerCase","isElectron","indexOf","isMobile","check","a","test","substr","vendor","gunAsAnotherUser","gun","f","gun2","radisk","peers","_","opt","user","auth","values","back","peer","on","gunOnceDefined","node","Promise","resolve","val","_k","_a","eve","off","animals","adjectives","getHash","str","SEA","work","name","hash","Error","base64ToHex","capitalize","s","charAt","toUpperCase","generateName","raw","atob","result","hex","charCodeAt","getCaret","el","selectionStart","document","selection","focus","r","createRange","re","createTextRange","rc","duplicate","moveToBookmark","getBookmark","setEndPoint","text","injectCss","elementId","getElementById","sheet","createElement","id","innerHTML","head","prepend","getUrlParameter","sParam","sParams","sPageURL","window","location","search","substring","sURLVariables","split","sParameterName","decodeURIComponent","formatTime","date","t","toLocaleTimeString","timeStyle","formatDate","toLocaleString","dateStyle","getDaySeparatorText","dateStr","now","nowStr","Date","toLocaleDateString","dayDifference","round","weekday","getProfileLink","pub","origin","encodeURIComponent","truncateString","type","cls","parent","setAttribute","appendChild","delay","ELECTRON_GUN_URL","maxConnectedPeers","DEFAULT_PEERS","loc","host","is_localhost_but_not_dev","startsWith","hostname","endsWith","url","enabled","urlRegex","known","add","from","k","visibility","secret","session","getKey","epub","encrypt","encryptedUrl","encryptedUrlHash","publicState","get","put","lastSeen","toISOString","connect","save","remove","disconnect","peerFromGun","localStorage","setItem","JSON","stringify","getSaved","p","getItem","util","reset","isMixedContent","disable","protocol","connectToLocalElectron","max","push","checkGunPeerCount","peersFromGun","connectedPeers","filter","wire","constructor","console","log","readyState","bufferedAmount","unconnectedPeers","addedToGun","map","mixedContent","String","init","setInterval","opts","myOpts","assign","retry","Infinity","UNIQUE_ID_VALIDATORS","email","bitcoin","bitcoin_address","ip","ipv6","gpg_fingerprint","gpg_keyid","google_oauth2","tel","phone","keyID","account","uuid","Attribute","b","value","guessTypeOf","getUuid","replace","getUniqueIdValidators","isUniqueType","match","equals","uri","currentUser","DEFAULT_PERMISSIONS","read","write","admin","Channel","options","myGroupSecret","chatLink","useChatLink","participants","addParticipant","Array","isArray","o","founder","getChatLinks","subscribe","putDirect","getMyGroupSecret","getMySecretUuid","then","onTheirDirect","theirSecretUuids","theirGroupSecrets","onTheir","hasAdmin","inviter","participantsChanged","saved","chatWith","channelId","sharedSecret","linkId","encrypted","decrypt","sharedKey","encryptedChatRequest","channelRequestId","getTheirSecretUuid","getTheirGroupSecret","changeMyGroupSecret","mute","participant","block","secrets","ourSecretChannelIds","theirSecretChannelIds","mySecretUuid","mySecret","mySecretHash","getCurrentParticipants","getParticipants","callback","getParticipantsCallbackId","getParticipantsCallbacks","getId","getSecret","getOurSecretChannelId","pair","getTheirSecretChannelId","getChannels","listenToChatLinks","keypair","getMyChatLinks","seen","handleChannel","ourSecretChannelId","encryptedChatId","chatId","getMessages","theirSecretChannelId","data","messageReceived","userState","selfAuthored","messages","decrypted","info","getLatestMsg","callbackIfLatest","msg","latest","time","onMy","setMyMsgsLastSeenTime","getMyMsgsLastSeenTime","myMsgsLastSeenTime","getTheirMsgsLastSeenTime","theirMsgsLastSeenTime","removeParticipant","permissions","directSubscriptions","_onTheirDirectFromUser","groupSubscriptions","_onTheirGroupFromUser","event","send","trim","putGroup","onGroup","onDirect","onMyGroup","onTheirGroup","onMyDirect","v","hasWritePermission","hasOwnProperty","subscription","theirSecretUuid","_b","setTyping","isTyping","timeout","setTypingTimeout","getTyping","typing","getTypingTimeouts","addChatButton","label","channelOptions","channel","box","btn","body","addEventListener","getChatBox","getSimpleLink","urlRoot","chatLinks","chatLinkSubscriptions","links","link","channels","formatChatLink","encPub","requestId","createChatLink","sharedKeyString","encryptedSharedKey","ownerSecret","ownerEncryptedSharedKey","minimized","chatBox","header","minimize","innerText","stopPropagation","headerText","onlineIndicator","nameEl","close","openChatBtn","typingIndicator","inputWrapper","textArea","sendBtn","getActivity","status","isActive","undelivered","querySelectorAll","getAttribute","lastActive","c","unseen","indicator","msgEl","parentElement","msgClass","msgContent","seenIndicator","children","insertBefore","firstChild","insertAdjacentElement","scrollTop","scrollHeight","setActivity","keyCode","preventDefault","content","caret","shiftKey","activity","irisActivityStatus","setActivityTimeout","update","state","timerUpdate","pubKey","activityDate","getTime","isOnline","enc","removeGroupChatLink","removePrivateChatLink","deleteChannel","deleteGroup","Map","publicKey","set","LOCALFORAGE_NULL","notInLocalForage","Set","localForage","config","driver","LOCALSTORAGE","INDEXEDDB","WEBSQL","Node","loaded","loadLocalForage","removeItem","has","newResult","all","on_subscriptions","map_subscriptions","existing","new_node","saveLocalForage","doCallbacks","returnIfUndefined","lastIndexOf","counter","child","local","blockedUsers","isBlocked","_v","cache","callbacks","groupName","groupNode","follows","requestAnimationFrame","isFollowing","userSpace","reduce","sum","_cached_map","cached","cacheKey","myEvent","x","item","cb","_cached_on","_cached_count","count","pop","_cached_fn","fn","callbackId","myCallbacks","NOTIFICATION_SERVICE_URL","loginTime","unseenMsgsTotal","unseenNotificationCount","webPushSubscriptions","desktopNotificationsEnabled","Notification","permission","notifyMsg","onClick","shouldNotify","timeObj","visibilityState","privateState","notificationSetting","getMyName","shouldDesktopNotify","shouldAudioNotify","title","participantProfiles","desktopNotification","icon","silent","onclick","changeUnseenNotificationCount","changeChatUnseenMsgsCount","change","chat","chatNode","publicVapidKey","urlBase64ToUint8Array","base64String","padding","repeat","base64","rawData","outputArray","Uint8Array","reg","pushManager","userVisibleOnly","applicationServerKey","addWebPushSubscription","error","subscribeToWebPush","serviceWorker","ready","getRegistration","active","postMessage","getSubscription","sub","addWebPushSubscriptionsToChats","channelIds","removeSubscription","saveToGun","myKey","getWebPushSubscriptions","getEpub","getNotificationText","notification","profile","action","eventText","subscribeToIrisNotifications","notificationsSeenTime","notificationsShownTime","setNotificationsShownTime","alreadyHave","group","getPubKey","encryptedNotification","target","sendIrisNotification","recipient","sendWebPushNotification","shouldWebPush","subscriptions","payload","endpoint","fetch","method","headers","changeChatUnseenCount","electron","file","multicast","myName","latestChatLink","onlineTimeout","ourActivity","noFollows","noFollowers","searchIndex","initCalled","searchableItems","getExtendedFollowsCalled","DEFAULT_FOLLOW","DEFAULT_SETTINGS","openAtLogin","minimizeOnClose","enableWebtorrent","enablePublicPeerDiscovery","autoplayWebtorrent","localStorageKey","login","autologin","loginAsNewUser","clearIndexedDB","updateSearchIndex","taskQueue","shift","includeScore","includeMatches","threshold","Fuse","leading","saveSearchResult","followDistance","followerCount","followers","addFollow","follower","updateNoFollows","updateNoFollowers","removeFollow","getExtendedFollows","maxDepth","currentDepth","followedKey","getSearchIndex","setOurOnlineStatus","activeRoute","setActive","pathname","notifications","updateGroups","shouldRefresh","addChannel","settings","reload","l","autofollow","logOut","unsubscribe","clear","localforage","href","r1","indexedDB","deleteDatabase","r2","r1done","r2done","onerror","onsuccess","getMyChatLink","myPeerUrl","shareMyPeerUrl","myIp","newChannel","latestTime","d","theirMsgsLastSeenDate","processMessage","myLastSeenTime","online","theirLastActiveTime","isDarkMode","matchMedia","matches","photo","hue","color","inviteLinks","onClickNotification","messageIds","invite","subscribeToMsgs","subscribed","reject","publicSpace","_x","Key","getActiveKey","datadir","keyfile","privKeyFile","existsSync","readFileSync","fromString","generate","newKey","writeFileSync","chmodSync","getDefault","getActivePub","setActiveKey","sign","sig","verify","errorMsg","ValidationError","SignedMessage","signedData","_validate","_getArray","authorOrRecipient","j","elementValue","_getIterable","Symbol","iterator","getAuthorIterable","author","getRecipientIterable","getAuthorArray","getRecipientArray","getSignerKeyID","signerKeyHash","attr","timestamp","isNaN","rating","maxRating","minRating","isPositive","isNegative","isNeutral","create","signingKey","m","createVerification","createRating","getAuthor","getContacts","getRecipient","fromSig","serialize","deserialize","setReaction","reaction","rootContact","staticState"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"iris.umd.development.js","sources":["../src/lodash.ts","../src/util.ts","../src/Key.ts","../src/peers.ts","../src/db/Actor.ts","../src/db/Message.ts","../node_modules/quick-lru/index.js","../src/db/adapters/Memory.ts","../node_modules/dexie/node_modules/tslib/tslib.es6.js","../node_modules/dexie/src/globals/global.ts","../node_modules/dexie/src/functions/utils.ts","../node_modules/dexie/src/helpers/debug.ts","../node_modules/dexie/src/errors/errors.js","../node_modules/dexie/src/functions/chaining-functions.js","../node_modules/dexie/src/helpers/promise.js","../node_modules/dexie/src/functions/temp-transaction.ts","../node_modules/dexie/src/globals/constants.ts","../node_modules/dexie/src/functions/combine.ts","../node_modules/dexie/src/dbcore/keyrange.ts","../node_modules/dexie/src/functions/workaround-undefined-primkey.ts","../node_modules/dexie/src/classes/table/table.ts","../node_modules/dexie/src/helpers/Events.js","../node_modules/dexie/src/functions/make-class-constructor.ts","../node_modules/dexie/src/classes/table/table-constructor.ts","../node_modules/dexie/src/classes/collection/collection-helpers.ts","../node_modules/dexie/src/functions/cmp.ts","../node_modules/dexie/src/classes/collection/collection.ts","../node_modules/dexie/src/classes/collection/collection-constructor.ts","../node_modules/dexie/src/functions/compare-functions.ts","../node_modules/dexie/src/classes/where-clause/where-clause-helpers.ts","../node_modules/dexie/src/classes/where-clause/where-clause.ts","../node_modules/dexie/src/classes/where-clause/where-clause-constructor.ts","../node_modules/dexie/src/functions/event-wrappers.ts","../node_modules/dexie/src/globals/global-events.ts","../node_modules/dexie/src/classes/transaction/transaction.ts","../node_modules/dexie/src/classes/transaction/transaction-constructor.ts","../node_modules/dexie/src/helpers/index-spec.ts","../node_modules/dexie/src/helpers/table-schema.ts","../node_modules/dexie/src/functions/quirks.ts","../node_modules/dexie/src/dbcore/get-key-extractor.ts","../node_modules/dexie/src/dbcore/dbcore-indexeddb.ts","../node_modules/dexie/src/classes/dexie/generate-middleware-stacks.ts","../node_modules/dexie/src/classes/version/schema-helpers.ts","../node_modules/dexie/src/classes/version/version.ts","../node_modules/dexie/src/classes/version/version-constructor.ts","../node_modules/dexie/src/helpers/database-enumerator.ts","../node_modules/dexie/src/classes/dexie/vip.ts","../node_modules/dexie/node_modules/safari-14-idb-fix/dist/index.js","../node_modules/dexie/src/classes/dexie/dexie-open.ts","../node_modules/dexie/src/helpers/yield-support.ts","../node_modules/dexie/src/classes/dexie/transaction-helpers.ts","../node_modules/dexie/src/dbcore/virtual-index-middleware.ts","../node_modules/dexie/src/functions/get-object-diff.ts","../node_modules/dexie/src/dbcore/get-effective-keys.ts","../node_modules/dexie/src/hooks/hooks-middleware.ts","../node_modules/dexie/src/dbcore/cache-existing-values-middleware.ts","../node_modules/dexie/src/helpers/rangeset.ts","../node_modules/dexie/src/live-query/observability-middleware.ts","../node_modules/dexie/src/classes/dexie/dexie.ts","../node_modules/dexie/src/classes/observable/observable.ts","../node_modules/dexie/src/live-query/extend-observability-set.ts","../node_modules/dexie/src/live-query/live-query.ts","../node_modules/dexie/src/classes/dexie/dexie-dom-dependencies.ts","../node_modules/dexie/src/classes/dexie/dexie-static-props.ts","../node_modules/dexie/src/live-query/propagate-locally.ts","../node_modules/dexie/src/live-query/enable-broadcast.ts","../node_modules/dexie/src/index.ts","../src/db/adapters/IndexedDB.ts","../src/db/adapters/Websocket.ts","../src/db/Router.ts","../src/db/Node.ts","../src/global.ts","../src/Attribute.ts","../src/public.ts","../src/Channel.ts","../src/private.ts","../src/local.ts","../src/blockedUsers.ts","../src/group.ts","../src/notifications.ts","../node_modules/fuse.js/dist/fuse.esm.js","../src/electron.ts","../src/session.ts","../src/static.ts","../src/SignedMessage.ts","../src/index.ts"],"sourcesContent":["// @ts-nocheck\nconst _ = {\n throttle: (func: Function, limit: number) => {\n let inThrottle: boolean;\n return function() {\n const args = arguments;\n const context = this;\n if (!inThrottle) {\n func.apply(context, args);\n inThrottle = true;\n setTimeout(() => inThrottle = false, limit);\n }\n };\n },\n debounce: (func: Function, limit: number) => {\n let inDebounce: boolean;\n return function() {\n const args = arguments;\n const context = this;\n clearTimeout(inDebounce);\n inDebounce = setTimeout(() => func.apply(context, args), limit);\n };\n },\n sample: (arr: any[]) => arr[Math.floor(Math.random() * arr.length)],\n sampleSize: (arr: any[], size: number) => {\n const shuffled = arr.slice(0);\n let i = arr.length;\n let min = i - size;\n let temp;\n let index;\n while (i-- > min) {\n index = Math.floor((i + 1) * Math.random());\n temp = shuffled[index];\n shuffled[index] = shuffled[i];\n shuffled[i] = temp;\n }\n return shuffled.slice(min);\n },\n defer: (func: Function) => setTimeout(func, 0),\n once: (func: Function) => {\n let called = false;\n return function() {\n if (called) {\n return;\n }\n called = true;\n func.apply(this, arguments);\n };\n },\n omit: (obj: any, keys: string[]) => {\n const newObj = {};\n Object.keys(obj).forEach(key => {\n if (!keys.includes(key)) {\n newObj[key] = obj[key];\n }\n });\n return newObj;\n },\n defaults: (obj: any, defaults: any) => {\n Object.keys(defaults).forEach(key => {\n if (obj[key] === undefined) {\n obj[key] = defaults[key];\n }\n });\n return obj;\n },\n pickBy: (obj: any, predicate: Function) => {\n const newObj = {};\n Object.keys(obj).forEach(key => {\n if (predicate(obj[key])) {\n newObj[key] = obj[key];\n }\n });\n return newObj;\n },\n isEqual: (a: any, b: any) => {\n if (a === b) {\n return true;\n }\n if (a instanceof Date && b instanceof Date) {\n return a.getTime() === b.getTime();\n }\n if (!a || !b || (typeof a !== 'object' && typeof b !== 'object')) {\n return a !== a && b !== b;\n }\n if (a.prototype !== b.prototype) {\n return false;\n }\n const keys = Object.keys(a);\n if (keys.length !== Object.keys(b).length) {\n return false;\n }\n return keys.every(k => _.isEqual(a[k], b[k]));\n },\n uniq: (arr: any[]) => {\n const set = new Set(arr);\n return Array.from(set);\n }\n};\n\nexport default _;","// @ts-nocheck\n/* eslint no-useless-escape: \"off\", camelcase: \"off\" */\n\nimport _ from './lodash';\n\n// eslint-disable-line no-unused-vars\n\nlet isNode = false;\ntry {\n isNode = Object.prototype.toString.call(global.process) === `[object process]`;\n} catch (e) { null; }\n\nconst userAgent = !isNode && navigator && navigator.userAgent && navigator.userAgent.toLowerCase();\nconst isElectron = (userAgent && userAgent.indexOf(' electron/') > -1);\n\nconst isMobile = !isNode && (function() {\n if (isElectron) { return false; }\n let check = false;\n (function(a) {if (/(android|bb\\d+|meego).+mobile|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\\-(n|u)|c55\\/|capi|ccwa|cdm\\-|cell|chtm|cldc|cmd\\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\\-s|devi|dica|dmob|do(c|p)o|ds(12|\\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\\-|_)|g1 u|g560|gene|gf\\-5|g\\-mo|go(\\.w|od)|gr(ad|un)|haie|hcit|hd\\-(m|p|t)|hei\\-|hi(pt|ta)|hp( i|ip)|hs\\-c|ht(c(\\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\\-(20|go|ma)|i230|iac( |\\-|\\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\\/)|klon|kpt |kwc\\-|kyo(c|k)|le(no|xi)|lg( g|\\/(k|l|u)|50|54|\\-[a-w])|libw|lynx|m1\\-w|m3ga|m50\\/|ma(te|ui|xo)|mc(01|21|ca)|m\\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\\-2|po(ck|rt|se)|prox|psio|pt\\-g|qa\\-a|qc(07|12|21|32|60|\\-[2-7]|i\\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\\-|oo|p\\-)|sdk\\/|se(c(\\-|0|1)|47|mc|nd|ri)|sgh\\-|shar|sie(\\-|m)|sk\\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\\-|v\\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\\-|tdg\\-|tel(i|m)|tim\\-|t\\-mo|to(pl|sh)|ts(70|m\\-|m3|m5)|tx\\-9|up(\\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\\-|your|zeto|zte\\-/i.test(a.substr(0, 4))) check = true;})(navigator.userAgent || navigator.vendor || '');\n return check;\n})();\n\nfunction gunOnceDefined(node: any) {\n return new Promise(resolve => {\n node.on((val: any, _k: any, _a: any, eve: any) => {\n if (val !== undefined) {\n eve.off();\n resolve(val);\n }\n });\n });\n}\n\nconst animals = [\n 'canidae',\n 'felidae',\n 'cat',\n 'cattle',\n 'dog',\n 'donkey',\n 'goat',\n 'horse',\n 'pig',\n 'rabbit',\n 'aardvark',\n 'aardwolf',\n 'albatross',\n 'alligator',\n 'alpaca',\n 'amphibian',\n 'anaconda',\n 'angelfish',\n 'anglerfish',\n 'ant',\n 'anteater',\n 'antelope',\n 'antlion',\n 'ape',\n 'aphid',\n 'armadillo',\n 'asp',\n 'baboon',\n 'badger',\n 'bandicoot',\n 'barnacle',\n 'barracuda',\n 'basilisk',\n 'bass',\n 'bat',\n 'bear',\n 'beaver',\n 'bedbug',\n 'bee',\n 'beetle',\n 'bird',\n 'bison',\n 'blackbird',\n 'boa',\n 'boar',\n 'bobcat',\n 'bobolink',\n 'bonobo',\n 'booby',\n 'bovid',\n 'bug',\n 'butterfly',\n 'buzzard',\n 'camel',\n 'canid',\n 'capybara',\n 'cardinal',\n 'caribou',\n 'carp',\n 'cat',\n 'catshark',\n 'caterpillar',\n 'catfish',\n 'cattle',\n 'centipede',\n 'cephalopod',\n 'chameleon',\n 'cheetah',\n 'chickadee',\n 'chicken',\n 'chimpanzee',\n 'chinchilla',\n 'chipmunk',\n 'clam',\n 'clownfish',\n 'cobra',\n 'cockroach',\n 'cod',\n 'condor',\n 'constrictor',\n 'coral',\n 'cougar',\n 'cow',\n 'coyote',\n 'crab',\n 'crane',\n 'crawdad',\n 'crayfish',\n 'cricket',\n 'crocodile',\n 'crow',\n 'cuckoo',\n 'cicada',\n 'damselfly',\n 'deer',\n 'dingo',\n 'dinosaur',\n 'dog',\n 'dolphin',\n 'donkey',\n 'dormouse',\n 'dove',\n 'dragonfly',\n 'dragon',\n 'duck',\n 'eagle',\n 'earthworm',\n 'earwig',\n 'echidna',\n 'eel',\n 'egret',\n 'elephant',\n 'elk',\n 'emu',\n 'ermine',\n 'falcon',\n 'ferret',\n 'finch',\n 'firefly',\n 'fish',\n 'flamingo',\n 'flea',\n 'fly',\n 'flyingfish',\n 'fowl',\n 'fox',\n 'frog',\n 'gamefowl',\n 'galliform',\n 'gazelle',\n 'gecko',\n 'gerbil',\n 'gibbon',\n 'giraffe',\n 'goat',\n 'goldfish',\n 'goose',\n 'gopher',\n 'gorilla',\n 'grasshopper',\n 'grouse',\n 'guan',\n 'guanaco',\n 'guineafowl',\n 'gull',\n 'guppy',\n 'haddock',\n 'halibut',\n 'hamster',\n 'hare',\n 'harrier',\n 'hawk',\n 'hedgehog',\n 'heron',\n 'herring',\n 'hippopotamus',\n 'hookworm',\n 'hornet',\n 'horse',\n 'hoverfly',\n 'hummingbird',\n 'hyena',\n 'iguana',\n 'impala',\n 'jackal',\n 'jaguar',\n 'jay',\n 'jellyfish',\n 'junglefowl',\n 'kangaroo',\n 'kingfisher',\n 'kite',\n 'kiwi',\n 'koala',\n 'koi',\n 'krill',\n 'ladybug',\n 'lamprey',\n 'landfowl',\n 'lark',\n 'leech',\n 'lemming',\n 'lemur',\n 'leopard',\n 'leopon',\n 'limpet',\n 'lion',\n 'lizard',\n 'llama',\n 'lobster',\n 'locust',\n 'loon',\n 'louse',\n 'lungfish',\n 'lynx',\n 'macaw',\n 'mackerel',\n 'magpie',\n 'mammal',\n 'manatee',\n 'mandrill',\n 'marlin',\n 'marmoset',\n 'marmot',\n 'marsupial',\n 'marten',\n 'mastodon',\n 'meadowlark',\n 'meerkat',\n 'mink',\n 'minnow',\n 'mite',\n 'mockingbird',\n 'mole',\n 'mollusk',\n 'mongoose',\n 'monkey',\n 'moose',\n 'mosquito',\n 'moth',\n 'mouse',\n 'mule',\n 'muskox',\n 'narwhal',\n 'newt',\n 'nightingale',\n 'ocelot',\n 'octopus',\n 'opossum',\n 'orangutan',\n 'orca',\n 'ostrich',\n 'otter',\n 'owl',\n 'ox',\n 'panda',\n 'panther',\n 'parakeet',\n 'parrot',\n 'parrotfish',\n 'partridge',\n 'peacock',\n 'peafowl',\n 'pelican',\n 'penguin',\n 'perch',\n 'pheasant',\n 'pig',\n 'pigeon',\n 'pike',\n 'pinniped',\n 'piranha',\n 'planarian',\n 'platypus',\n 'pony',\n 'porcupine',\n 'porpoise',\n 'possum',\n 'prawn',\n 'primate',\n 'ptarmigan',\n 'puffin',\n 'puma',\n 'python',\n 'quail',\n 'quelea',\n 'quokka',\n 'rabbit',\n 'raccoon',\n 'rat',\n 'rattlesnake',\n 'raven',\n 'reindeer',\n 'reptile',\n 'rhinoceros',\n 'roadrunner',\n 'rodent',\n 'rook',\n 'rooster',\n 'roundworm',\n 'sailfish',\n 'salamander',\n 'salmon',\n 'sawfish',\n 'scallop',\n 'scorpion',\n 'seahorse',\n 'shark',\n 'sheep',\n 'shrew',\n 'shrimp',\n 'silkworm',\n 'silverfish',\n 'skink',\n 'skunk',\n 'sloth',\n 'slug',\n 'smelt',\n 'snail',\n 'snake',\n 'snipe',\n 'sole',\n 'sparrow',\n 'spider',\n 'spoonbill',\n 'squid',\n 'squirrel',\n 'starfish',\n 'stingray',\n 'stoat',\n 'stork',\n 'sturgeon',\n 'swallow',\n 'swan',\n 'swift',\n 'swordfish',\n 'swordtail',\n 'tahr',\n 'takin',\n 'tapir',\n 'tarantula',\n 'tarsier',\n 'termite',\n 'tern',\n 'thrush',\n 'tick',\n 'tiger',\n 'tiglon',\n 'toad',\n 'tortoise',\n 'toucan',\n 'trout',\n 'tuna',\n 'turkey',\n 'turtle',\n 'tyrannosaurus',\n 'urial',\n 'vicuna',\n 'viper',\n 'vole',\n 'vulture',\n 'wallaby',\n 'walrus',\n 'wasp',\n 'warbler',\n 'weasel',\n 'whale',\n 'whippet',\n 'whitefish',\n 'wildcat',\n 'wildebeest',\n 'wildfowl',\n 'wolf',\n 'wolverine',\n 'wombat',\n 'woodpecker',\n 'worm',\n 'wren',\n 'xerinae',\n 'yak',\n 'zebra',\n 'alpaca',\n 'cat',\n 'cattle',\n 'chicken',\n 'dog',\n 'donkey',\n 'ferret',\n 'gayal',\n 'goldfish',\n 'guppy',\n 'horse',\n 'koi',\n 'llama',\n 'sheep',\n 'yak',\n 'unicorn',\n];\n\nconst adjectives = [\n 'average',\n 'big',\n 'colossal',\n 'fat',\n 'giant',\n 'gigantic',\n 'great',\n 'huge',\n 'immense',\n 'large',\n 'little',\n 'long',\n 'mammoth',\n 'massive',\n 'miniature',\n 'petite',\n 'puny',\n 'short',\n 'small',\n 'tall',\n 'tiny',\n 'boiling',\n 'breezy',\n 'broken',\n 'bumpy',\n 'chilly',\n 'cold',\n 'cool',\n 'creepy',\n 'crooked',\n 'cuddly',\n 'curly',\n 'damaged',\n 'damp',\n 'dirty',\n 'dry',\n 'dusty',\n 'filthy',\n 'flaky',\n 'fluffy',\n 'wet',\n 'broad',\n 'chubby',\n 'crooked',\n 'curved',\n 'deep',\n 'flat',\n 'high',\n 'hollow',\n 'low',\n 'narrow',\n 'round',\n 'shallow',\n 'skinny',\n 'square',\n 'steep',\n 'straight',\n 'wide',\n 'ancient',\n 'brief',\n 'early',\n 'fast',\n 'late',\n 'long',\n 'modern',\n 'old',\n 'quick',\n 'rapid',\n 'short',\n 'slow',\n 'swift',\n 'young',\n 'abundant',\n 'empty',\n 'few',\n 'heavy',\n 'light',\n 'many',\n 'numerous',\n 'Sound',\n 'cooing',\n 'deafening',\n 'faint',\n 'harsh',\n 'hissing',\n 'hushed',\n 'husky',\n 'loud',\n 'melodic',\n 'moaning',\n 'mute',\n 'noisy',\n 'purring',\n 'quiet',\n 'raspy',\n 'resonant',\n 'screeching',\n 'shrill',\n 'silent',\n 'soft',\n 'squealing',\n 'thundering',\n 'voiceless',\n 'whispering',\n 'bitter',\n 'delicious',\n 'fresh',\n 'juicy',\n 'ripe',\n 'rotten',\n 'salty',\n 'sour',\n 'spicy',\n 'stale',\n 'sticky',\n 'strong',\n 'sweet',\n 'tasteless',\n 'tasty',\n 'thirsty',\n 'fluttering',\n 'fuzzy',\n 'greasy',\n 'grubby',\n 'hard',\n 'hot',\n 'icy',\n 'loose',\n 'melted',\n 'plastic',\n 'prickly',\n 'rainy',\n 'rough',\n 'scattered',\n 'shaggy',\n 'shaky',\n 'sharp',\n 'shivering',\n 'silky',\n 'slimy',\n 'slippery',\n 'smooth',\n 'soft',\n 'solid',\n 'steady',\n 'sticky',\n 'tender',\n 'tight',\n 'uneven',\n 'weak',\n 'wet',\n 'wooden',\n 'afraid',\n 'angry',\n 'annoyed',\n 'anxious',\n 'arrogant',\n 'ashamed',\n 'awful',\n 'bad',\n 'bewildered',\n 'bored',\n 'combative',\n 'condemned',\n 'confused',\n 'creepy',\n 'cruel',\n 'dangerous',\n 'defeated',\n 'defiant',\n 'depressed',\n 'disgusted',\n 'disturbed',\n 'eerie',\n 'embarrassed',\n 'envious',\n 'evil',\n 'fierce',\n 'foolish',\n 'frantic',\n 'frightened',\n 'grieving',\n 'helpless',\n 'homeless',\n 'hungry',\n 'hurt',\n 'ill',\n 'jealous',\n 'lonely',\n 'mysterious',\n 'naughty',\n 'nervous',\n 'obnoxious',\n 'outrageous',\n 'panicky',\n 'repulsive',\n 'scary',\n 'scornful',\n 'selfish',\n 'sore',\n 'tense',\n 'terrible',\n 'thoughtless',\n 'tired',\n 'troubled',\n 'upset',\n 'uptight',\n 'weary',\n 'wicked',\n 'worried',\n 'agreeable',\n 'amused',\n 'brave',\n 'calm',\n 'charming',\n 'cheerful',\n 'comfortable',\n 'cooperative',\n 'courageous',\n 'delightful',\n 'determined',\n 'eager',\n 'elated',\n 'enchanting',\n 'encouraging',\n 'energetic',\n 'enthusiastic',\n 'excited',\n 'exuberant',\n 'fair',\n 'faithful',\n 'fantastic',\n 'fine',\n 'friendly',\n 'funny',\n 'gentle',\n 'glorious',\n 'good',\n 'happy',\n 'healthy',\n 'helpful',\n 'hilarious',\n 'jolly',\n 'joyous',\n 'kind',\n 'lively',\n 'lovely',\n 'lucky',\n 'obedient',\n 'perfect',\n 'pleasant',\n 'proud',\n 'relieved',\n 'silly',\n 'smiling',\n 'splendid',\n 'successful',\n 'thoughtful',\n 'victorious',\n 'vivacious',\n 'witty',\n 'wonderful',\n 'zealous',\n 'zany',\n 'other',\n 'good',\n 'new',\n 'old',\n 'great',\n 'high',\n 'small',\n 'different',\n 'large',\n 'local',\n 'social',\n 'important',\n 'long',\n 'young',\n 'national',\n 'british',\n 'right',\n 'early',\n 'possible',\n 'big',\n 'little',\n 'political',\n 'able',\n 'late',\n 'general',\n 'full',\n 'far',\n 'low',\n 'public',\n 'available',\n 'bad',\n 'main',\n 'sure',\n 'clear',\n 'major',\n 'economic',\n 'only',\n 'likely',\n 'real',\n 'black',\n 'particular',\n 'international',\n 'special',\n 'difficult',\n 'certain',\n 'open',\n 'whole',\n 'white',\n 'free',\n 'short',\n 'easy',\n 'strong',\n 'european',\n 'central',\n 'similar',\n 'human',\n 'common',\n 'necessary',\n 'single',\n 'personal',\n 'hard',\n 'private',\n 'poor',\n 'financial',\n 'wide',\n 'foreign',\n 'simple',\n 'recent',\n 'concerned',\n 'american',\n 'various',\n 'close',\n 'fine',\n 'english',\n 'wrong',\n 'present',\n 'royal',\n 'natural',\n 'individual',\n 'nice',\n 'french',\n 'nihilist',\n 'solipsist',\n 'materialist',\n 'surrealist',\n 'heroic',\n 'awesome',\n 'hedonist',\n 'absurd',\n 'current',\n 'modern',\n 'labour',\n 'legal',\n 'happy',\n 'final',\n 'red',\n 'normal',\n 'serious',\n 'previous',\n 'total',\n 'prime',\n 'significant',\n 'industrial',\n 'sorry',\n 'dead',\n 'specific',\n 'appropriate',\n 'top',\n 'soviet',\n 'basic',\n 'military',\n 'original',\n 'successful',\n 'aware',\n 'hon',\n 'popular',\n 'heavy',\n 'professional',\n 'direct',\n 'dark',\n 'cold',\n 'ready',\n 'green',\n 'useful',\n 'effective',\n 'western',\n 'traditional',\n 'scottish',\n 'german',\n 'independent',\n 'deep',\n 'interesting',\n 'considerable',\n 'involved',\n 'physical',\n 'hot',\n 'existing',\n 'responsible',\n 'complete',\n 'medical',\n 'blue',\n 'extra',\n 'past',\n 'male',\n 'interested',\n 'fair',\n 'essential',\n 'beautiful',\n 'civil',\n 'primary',\n 'obvious',\n 'future',\n 'environmental',\n 'positive',\n 'senior',\n 'nuclear',\n 'annual',\n 'relevant',\n 'huge',\n 'rich',\n 'commercial',\n 'safe',\n 'regional',\n 'practical',\n 'official',\n 'separate',\n 'key',\n 'chief',\n 'regular',\n 'due',\n 'additional',\n 'active',\n 'powerful',\n 'complex',\n 'standard',\n 'impossible',\n 'light',\n 'warm',\n 'middle',\n 'fresh',\n 'sexual',\n 'front',\n 'domestic',\n 'actual',\n 'united',\n 'technical',\n 'ordinary',\n 'cheap',\n 'strange',\n 'internal',\n 'excellent',\n 'quiet',\n 'soft',\n 'potential',\n 'northern',\n 'religious',\n 'quick',\n 'very',\n 'famous',\n 'cultural',\n 'proper',\n 'broad',\n 'joint',\n 'formal',\n 'limited',\n 'conservative',\n 'lovely',\n 'usual',\n 'ltd',\n 'unable',\n 'rural',\n 'initial',\n 'substantial',\n 'bright',\n 'average',\n 'leading',\n 'reasonable',\n 'immediate',\n 'suitable',\n 'equal',\n 'detailed',\n 'working',\n 'overall',\n 'female',\n 'afraid',\n 'democratic',\n 'growing',\n 'sufficient',\n 'scientific',\n 'eastern',\n 'correct',\n 'inc',\n 'irish',\n 'expensive',\n 'educational',\n 'mental',\n 'dangerous',\n 'critical',\n 'increased',\n 'familiar',\n 'unlikely',\n 'double',\n 'perfect',\n 'slow',\n 'tiny',\n 'dry',\n 'historical',\n 'thin',\n 'daily',\n 'southern',\n 'increasing',\n 'wild',\n 'alone',\n 'urban',\n 'empty',\n 'married',\n 'narrow',\n 'liberal',\n 'supposed',\n 'upper',\n 'apparent',\n 'tall',\n 'busy',\n 'bloody',\n 'prepared',\n 'russian',\n 'moral',\n 'careful',\n 'clean',\n 'attractive',\n 'japanese',\n 'vital',\n 'thick',\n 'alternative',\n 'fast',\n 'ancient',\n 'elderly',\n 'rare',\n 'external',\n 'capable',\n 'brief',\n 'wonderful',\n 'grand',\n 'typical',\n 'entire',\n 'grey',\n 'constant',\n 'vast',\n 'surprised',\n 'ideal',\n 'terrible',\n 'academic',\n 'funny',\n 'minor',\n 'pleased',\n 'severe',\n 'ill',\n 'corporate',\n 'negative',\n 'permanent',\n 'weak',\n 'brown',\n 'fundamental',\n 'odd',\n 'crucial',\n 'inner',\n 'used',\n 'criminal',\n 'contemporary',\n 'sharp',\n 'sick',\n 'near',\n 'roman',\n 'massive',\n 'unique',\n 'secondary',\n 'parliamentary',\n 'african',\n 'unknown',\n 'subsequent',\n 'angry',\n 'alive',\n 'guilty',\n 'lucky',\n 'enormous',\n 'well',\n 'yellow',\n 'unusual',\n 'net',\n 'tough',\n 'dear',\n 'extensive',\n 'glad',\n 'remaining',\n 'agricultural',\n 'alright',\n 'healthy',\n 'italian',\n 'principal',\n 'tired',\n 'efficient',\n 'comfortable',\n 'chinese',\n 'relative',\n 'friendly',\n 'conventional',\n 'willing',\n 'sudden',\n 'proposed',\n 'voluntary',\n 'slight',\n 'valuable',\n 'dramatic',\n 'golden',\n 'temporary',\n 'federal',\n 'keen',\n 'flat',\n 'silent',\n 'indian',\n 'worried',\n 'pale',\n 'statutory',\n 'welsh',\n 'dependent',\n 'firm',\n 'wet',\n 'competitive',\n 'armed',\n 'radical',\n 'outside',\n 'acceptable',\n 'sensitive',\n 'living',\n 'pure',\n 'global',\n 'emotional',\n 'sad',\n 'secret',\n 'rapid',\n 'adequate',\n 'fixed',\n 'sweet',\n 'administrative',\n 'wooden',\n 'remarkable',\n 'comprehensive',\n 'surprising',\n 'solid',\n 'rough',\n 'mere',\n 'mass',\n 'brilliant',\n 'maximum',\n 'absolute',\n 'electronic',\n 'visual',\n 'electric',\n 'cool',\n 'spanish',\n 'literary',\n 'continuing',\n 'supreme',\n 'chemical',\n 'genuine',\n 'exciting',\n 'written',\n 'advanced',\n 'extreme',\n 'classical',\n 'fit',\n 'favourite',\n 'widespread',\n 'confident',\n 'straight',\n 'proud',\n 'numerous',\n 'opposite',\n 'distinct',\n 'mad',\n 'helpful',\n 'given',\n 'disabled',\n 'consistent',\n 'anxious',\n 'nervous',\n 'awful',\n 'stable',\n 'constitutional',\n 'satisfied',\n 'conscious',\n 'developing',\n 'strategic',\n 'holy',\n 'smooth',\n 'dominant',\n 'remote',\n 'theoretical',\n 'outstanding',\n 'pink',\n 'pretty',\n 'clinical',\n 'minimum',\n 'honest',\n 'impressive',\n 'related',\n 'residential',\n 'extraordinary',\n 'plain',\n 'visible',\n 'accurate',\n 'distant',\n 'still',\n 'greek',\n 'complicated',\n 'musical',\n 'precise',\n 'gentle',\n 'broken',\n 'live',\n 'silly',\n 'fat',\n 'tight',\n 'monetary',\n 'round',\n 'psychological',\n 'violent',\n 'unemployed',\n 'inevitable',\n 'junior',\n 'sensible',\n 'grateful',\n 'pleasant',\n 'dirty',\n 'structural',\n 'welcome',\n 'deaf',\n 'above',\n 'continuous',\n 'blind',\n 'overseas',\n 'mean',\n 'entitled',\n 'delighted',\n 'loose',\n 'occasional',\n 'evident',\n 'desperate',\n 'fellow',\n 'universal',\n 'square',\n 'steady',\n 'classic',\n 'equivalent',\n 'intellectual',\n 'victorian',\n 'level',\n 'ultimate',\n 'creative',\n 'lost',\n 'medieval',\n 'clever',\n 'linguistic',\n 'convinced',\n 'judicial',\n 'raw',\n 'sophisticated',\n 'asleep',\n 'vulnerable',\n 'illegal',\n 'outer',\n 'revolutionary',\n 'bitter',\n 'changing',\n 'australian',\n 'native',\n 'imperial',\n 'strict',\n 'wise',\n 'informal',\n 'flexible',\n 'collective',\n 'frequent',\n 'experimental',\n 'spiritual',\n 'intense',\n 'rational',\n 'generous',\n 'inadequate',\n 'prominent',\n 'logical',\n 'bare',\n 'historic',\n 'modest',\n 'dutch',\n 'acute',\n 'electrical',\n 'valid',\n 'weekly',\n 'gross',\n 'automatic',\n 'loud',\n 'reliable',\n 'mutual',\n 'liable',\n 'multiple',\n 'ruling',\n 'curious',\n 'sole',\n 'managing',\n 'pregnant',\n 'latin',\n 'nearby',\n 'exact',\n 'underlying',\n 'identical',\n 'satisfactory',\n 'marginal',\n 'distinctive',\n 'electoral',\n 'urgent',\n 'presidential',\n 'controversial',\n 'everyday',\n 'encouraging',\n 'organic',\n 'continued',\n 'expected',\n 'statistical',\n 'desirable',\n 'innocent',\n 'improved',\n 'exclusive',\n 'marked',\n 'experienced',\n 'unexpected',\n 'superb',\n 'sheer',\n 'disappointed',\n 'frightened',\n 'gastric',\n 'romantic',\n 'naked',\n 'reluctant',\n 'magnificent',\n 'convenient',\n 'established',\n 'closed',\n 'uncertain',\n 'artificial',\n 'diplomatic',\n 'tremendous',\n 'marine',\n 'mechanical',\n 'retail',\n 'institutional',\n 'mixed',\n 'required',\n 'biological',\n 'known',\n 'functional',\n 'straightforward',\n 'superior',\n 'digital',\n 'spectacular',\n 'unhappy',\n 'confused',\n 'unfair',\n 'aggressive',\n 'spare',\n 'painful',\n 'abstract',\n 'asian',\n 'associated',\n 'legislative',\n 'monthly',\n 'intelligent',\n 'hungry',\n 'explicit',\n 'nasty',\n 'just',\n 'faint',\n 'coloured',\n 'ridiculous',\n 'amazing',\n 'comparable',\n 'successive',\n 'realistic',\n 'back',\n 'decent',\n 'decentralized',\n 'bitcoin',\n 'cypherpunk',\n 'unnecessary',\n 'flying',\n 'random',\n 'influential',\n 'dull',\n 'genetic',\n 'neat',\n 'marvellous',\n 'crazy',\n 'damp',\n 'giant',\n 'secure',\n 'bottom',\n 'skilled',\n 'subtle',\n 'elegant',\n 'brave',\n 'lesser',\n 'parallel',\n 'steep',\n 'intensive',\n 'casual',\n 'tropical',\n 'lonely',\n 'partial',\n 'preliminary',\n 'concrete',\n 'alleged',\n 'assistant',\n 'vertical',\n 'upset',\n 'delicate',\n 'mild',\n 'occupational',\n 'excessive',\n 'progressive',\n 'exceptional',\n 'integrated',\n 'striking',\n 'continental',\n 'okay',\n 'harsh',\n 'combined',\n 'fierce',\n 'handsome',\n 'characteristic',\n 'chronic',\n 'compulsory',\n 'interim',\n 'objective',\n 'splendid',\n 'magic',\n 'systematic',\n 'obliged',\n 'payable',\n 'fun',\n 'horrible',\n 'primitive',\n 'fascinating',\n 'ideological',\n 'metropolitan',\n 'surrounding',\n 'estimated',\n 'peaceful',\n 'premier',\n 'operational',\n 'technological',\n 'kind',\n 'advisory',\n 'hostile',\n 'precious',\n 'accessible',\n 'determined',\n 'excited',\n 'impressed',\n 'provincial',\n 'smart',\n 'endless',\n 'isolated',\n 'drunk',\n 'geographical',\n 'like',\n 'dynamic',\n 'boring',\n 'forthcoming',\n 'unfortunate',\n 'definite',\n 'super',\n 'notable',\n 'indirect',\n 'stiff',\n 'wealthy',\n 'awkward',\n 'lively',\n 'neutral',\n 'artistic',\n 'content',\n 'mature',\n 'colonial',\n 'ambitious',\n 'evil',\n 'magnetic',\n 'verbal',\n 'legitimate',\n 'sympathetic',\n 'empirical',\n 'head',\n 'shallow',\n 'vague',\n 'naval',\n 'depressed',\n 'shared',\n 'added',\n 'shocked',\n 'mid',\n 'worthwhile',\n 'qualified',\n 'missing',\n 'blank',\n 'absent',\n 'favourable',\n 'polish',\n 'israeli',\n 'developed',\n 'profound',\n 'representative',\n 'enthusiastic',\n 'dreadful',\n 'rigid',\n 'reduced',\n 'cruel',\n 'coastal',\n 'peculiar',\n 'swiss',\n 'crude',\n 'extended',\n 'selected',\n 'eager',\n 'canadian',\n 'bold',\n 'relaxed',\n 'corresponding',\n 'running',\n 'planned',\n 'applicable',\n 'immense',\n 'allied',\n 'comparative',\n 'uncomfortable',\n 'conservation',\n 'productive',\n 'beneficial',\n 'bored',\n 'charming',\n 'minimal',\n 'mobile',\n 'turkish',\n 'orange',\n 'rear',\n 'passive',\n 'suspicious',\n 'overwhelming',\n 'fatal',\n 'resulting',\n 'symbolic',\n 'registered',\n 'neighbouring',\n 'calm',\n 'irrelevant',\n 'patient',\n 'compact',\n 'profitable',\n 'rival',\n 'loyal',\n 'moderate',\n 'distinguished',\n 'interior',\n 'noble',\n 'insufficient',\n 'eligible',\n 'mysterious',\n 'varying',\n 'managerial',\n 'molecular',\n 'olympic',\n 'linear',\n 'prospective',\n 'printed',\n 'parental',\n 'diverse',\n 'elaborate',\n 'furious',\n 'fiscal',\n 'burning',\n 'useless',\n 'semantic',\n 'embarrassed',\n 'inherent',\n 'philosophical',\n 'deliberate',\n 'awake',\n 'variable',\n 'promising',\n 'unpleasant',\n 'varied',\n 'sacred',\n 'selective',\n 'inclined',\n 'tender',\n 'hidden',\n 'worthy',\n 'intermediate',\n 'sound',\n 'protective',\n 'fortunate',\n 'slim',\n 'defensive',\n 'divine',\n 'stuck',\n 'driving',\n 'invisible',\n 'misleading',\n 'circular',\n 'mathematical',\n 'inappropriate',\n 'liquid',\n 'persistent',\n 'solar',\n 'doubtful',\n 'manual',\n 'architectural',\n 'intact',\n 'incredible',\n 'devoted',\n 'prior',\n 'tragic',\n 'respectable',\n 'optimistic',\n 'convincing',\n 'unacceptable',\n 'decisive',\n 'competent',\n 'spatial',\n 'respective',\n 'binding',\n 'relieved',\n 'nursing',\n 'toxic',\n 'select',\n 'redundant',\n 'integral',\n 'then',\n 'probable',\n 'amateur',\n 'fond',\n 'passing',\n 'specified',\n 'territorial',\n 'horizontal',\n 'inland',\n 'cognitive',\n 'regulatory',\n 'miserable',\n 'resident',\n 'polite',\n 'scared',\n 'gothic',\n 'civilian',\n 'instant',\n 'lengthy',\n 'adverse',\n 'korean',\n 'unconscious',\n 'anonymous',\n 'aesthetic',\n 'orthodox',\n 'static',\n 'unaware',\n 'costly',\n 'fantastic',\n 'foolish',\n 'fashionable',\n 'causal',\n 'compatible',\n 'wee',\n 'implicit',\n 'dual',\n 'ok',\n 'cheerful',\n 'subjective',\n 'forward',\n 'surviving',\n 'exotic',\n 'purple',\n 'cautious',\n 'visiting',\n 'aggregate',\n 'ethical',\n 'teenage',\n 'dying',\n 'disastrous',\n 'delicious',\n 'confidential',\n 'underground',\n 'thorough',\n 'grim',\n 'autonomous',\n 'atomic',\n 'frozen',\n 'colourful',\n 'injured',\n 'uniform',\n 'ashamed',\n 'glorious',\n 'wicked',\n 'coherent',\n 'rising',\n 'shy',\n 'novel',\n 'balanced',\n 'delightful',\n 'arbitrary',\n 'adjacent',\n 'worrying',\n 'weird',\n 'unchanged',\n 'rolling',\n 'evolutionary',\n 'intimate',\n 'sporting',\n 'disciplinary',\n 'formidable',\n 'lexical',\n 'noisy',\n 'gradual',\n 'accused',\n 'homeless',\n 'supporting',\n 'coming',\n 'renewed',\n 'excess',\n 'retired',\n 'rubber',\n 'chosen',\n 'outdoor',\n 'embarrassing',\n 'preferred',\n 'bizarre',\n 'appalling',\n 'agreed',\n 'imaginative',\n 'governing',\n 'accepted',\n 'vocational',\n 'mighty',\n 'puzzled',\n 'worldwide',\n 'organisational',\n 'sunny',\n 'eldest',\n 'eventual',\n 'spontaneous',\n 'vivid',\n 'rude',\n 'faithful',\n 'ministerial',\n 'innovative',\n 'controlled',\n 'conceptual',\n 'unwilling',\n 'civic',\n 'meaningful',\n 'alive',\n 'brainy',\n 'breakable',\n 'busy',\n 'careful',\n 'cautious',\n 'clever',\n 'concerned',\n 'crazy',\n 'curious',\n 'dead',\n 'different',\n 'difficult',\n 'doubtful',\n 'easy',\n 'famous',\n 'fragile',\n 'helpful',\n 'helpless',\n 'important',\n 'impossible',\n 'innocent',\n 'inquisitive',\n 'modern',\n 'open',\n 'outstanding',\n 'poor',\n 'powerful',\n 'puzzled',\n 'real',\n 'rich',\n 'shy',\n 'sleepy',\n 'super',\n 'tame',\n 'uninterested',\n 'wandering',\n 'wild',\n 'wrong',\n 'adorable',\n 'alert',\n 'average',\n 'beautiful',\n 'blonde',\n 'bloody',\n 'blushing',\n 'bright',\n 'clean',\n 'clear',\n 'cloudy',\n 'colorful',\n 'crowded',\n 'cute',\n 'dark',\n 'drab',\n 'distinct',\n 'dull',\n 'elegant',\n 'fancy',\n 'filthy',\n 'glamorous',\n 'gleaming',\n 'graceful',\n 'grotesque',\n 'homely',\n 'light',\n 'misty',\n 'motionless',\n 'muddy',\n 'plain',\n 'poised',\n 'quaint',\n 'shiny',\n 'smoggy',\n 'sparkling',\n 'spotless',\n 'stormy',\n 'strange',\n 'ugly',\n 'unsightly',\n 'unusual',\n 'bad',\n 'better',\n 'beautiful',\n 'big',\n 'black',\n 'blue',\n 'bright',\n 'clumsy',\n 'crazy',\n 'dizzy',\n 'dull',\n 'fat',\n 'frail',\n 'friendly',\n 'funny',\n 'great',\n 'green',\n 'gigantic',\n 'gorgeous',\n 'grumpy',\n 'handsome',\n 'happy',\n 'horrible',\n 'itchy',\n 'jittery',\n 'jolly',\n 'kind',\n 'long',\n 'lazy',\n 'magnificent',\n 'magenta',\n 'many',\n 'mighty',\n 'mushy',\n 'nasty',\n 'new',\n 'nice',\n 'nosy',\n 'nutty',\n 'nutritious',\n 'odd',\n 'orange',\n 'ordinary',\n 'pretty',\n 'precious',\n 'prickly',\n 'purple',\n 'quaint',\n 'quiet',\n 'quick',\n 'quickest',\n 'rainy',\n 'rare',\n 'ratty',\n 'red',\n 'roasted',\n 'robust',\n 'round',\n 'sad',\n 'scary',\n 'scrawny',\n 'short',\n 'silly',\n 'stingy',\n 'strange',\n 'striped',\n 'spotty',\n 'tart',\n 'tall',\n 'tame',\n 'tan',\n 'tender',\n 'testy',\n 'tricky',\n 'tough',\n 'ugly',\n 'ugliest',\n 'vast',\n 'watery',\n 'wasteful',\n 'wonderful',\n 'yellow',\n 'yummy',\n 'zany',\n];\n\nexport default {\n gunOnceDefined,\n async getHash (data: any, format = `base64`) {\n if (data === undefined) {\n throw new Error('getHash data was undefined');\n }\n if (typeof data !== 'string') {\n data = JSON.stringify(data);\n }\n\n const encoder = new TextEncoder();\n data = encoder.encode(data);\n const buffer = await crypto.subtle.digest('SHA-256', data);\n\n if (format === 'buffer') {\n return buffer;\n }\n\n const hash = this.arrayBufferToBase64(buffer);\n if (format === `hex`) {\n return this.base64ToHex(hash);\n }\n return hash;\n },\n\n capitalize(s: string) {\n return s.charAt(0).toUpperCase() + s.slice(1)\n },\n\n generateName() {\n return `${this.capitalize(_.sample(adjectives)!)} ${this.capitalize(_.sample(animals)!)}`;\n },\n\n base64ToHex(str: string) {\n const raw = atob(str);\n let result = '';\n for (let i = 0; i < raw.length; i++) {\n const hex = raw.charCodeAt(i).toString(16);\n result += (hex.length === 2 ? hex : `0${ hex}`);\n }\n return result;\n },\n\n arrayBufferToBase64( buffer ) {\n var binary = '';\n var bytes = new Uint8Array( buffer );\n var len = bytes.byteLength;\n for (var i = 0; i < len; i++) {\n binary += String.fromCharCode( bytes[ i ] );\n }\n return window.btoa( binary );\n },\n\n getCaret(el: HTMLInputElement) {\n if (el.selectionStart) {\n return el.selectionStart;\n } else { // @ts-ignore\n if (document.selection) {\n el.focus();\n // @ts-ignore\n const r = document.selection.createRange();\n if (r === null) {\n return 0;\n }\n // @ts-ignore\n const re = el.createTextRange(), rc = re.duplicate();\n re.moveToBookmark(r.getBookmark());\n rc.setEndPoint('EndToStart', re);\n return rc.text.length;\n }\n }\n return 0;\n },\n\n getUrlParameter(sParam: string, sParams: string) {\n const sPageURL = sParams || window.location.search.substring(1);\n const sURLVariables = sPageURL.split('&');\n let sParameterName, i;\n\n for (i = 0; i < sURLVariables.length; i++) {\n sParameterName = sURLVariables[i].split('=');\n if (sParameterName[0] === sParam) {\n return sParameterName[1] === undefined ? true : decodeURIComponent(sParameterName[1]);\n }\n }\n return;\n },\n\n formatTime(date: Date) {\n // @ts-ignore\n const t: any = date.toLocaleTimeString(undefined, {timeStyle: 'short'});\n const s = t.split(':');\n if (s.length === 3) { // safari tries to display seconds\n return `${s[0] }:${ s[1] }${s[2].slice(2)}`;\n }\n return t;\n },\n\n formatDate(date: Date) {\n const t = date.toLocaleString(undefined, {dateStyle: 'short', timeStyle: 'short'});\n const s = t.split(':');\n if (s.length === 3) { // safari tries to display seconds\n return `${s[0] }:${ s[1] }${s[2].slice(2)}`;\n }\n return t;\n },\n\n getDaySeparatorText(date: Date, dateStr: string, now?: Date, nowStr?: string) {\n if (!now) {\n now = new Date();\n // @ts-ignore\n nowStr = now.toLocaleDateString({dateStyle: 'short'});\n }\n if (dateStr === nowStr) {\n return 'today';\n }\n const dayDifference = Math.round((now - date) / (1000 * 60 * 60 * 24));\n if (dayDifference === 0) {\n return 'today';\n }\n if (dayDifference === 1) {\n return 'yesterday';\n }\n if (dayDifference <= 5) {\n return date.toLocaleDateString(undefined, {weekday: 'long'});\n }\n return dateStr;\n },\n\n getProfileLink(pub: string) {\n return `${window.location.origin}/#/profile/${encodeURIComponent(pub)}`;\n },\n\n truncateString(s: string, length = 30) {\n return s.length > length ? `${s.slice(0, length)}...` : s;\n },\n\n createElement(type: string, cls?: string, parent?: HTMLElement) {\n const el = document.createElement(type);\n if (cls) {\n el.setAttribute('class', cls);\n }\n if (parent) {\n parent.appendChild(el);\n }\n return el;\n },\n\n isNode,\n isElectron,\n isMobile,\n\n throttle: (func: Function, limit: number) => {\n let inThrottle: boolean;\n return function() {\n const args = arguments;\n const context = this;\n if (!inThrottle) {\n func.apply(context, args);\n inThrottle = true;\n setTimeout(() => inThrottle = false, limit);\n }\n };\n },\n debounce: (func: Function, delay: number) => {\n let inDebounce: boolean;\n return function() {\n const context = this;\n const args = arguments;\n clearTimeout(inDebounce);\n inDebounce = setTimeout(() => func.apply(context, args), delay);\n };\n },\n sample: (arr: any[]) => arr[Math.floor(Math.random() * arr.length)],\n sampleSize: (arr: any[], size: number) => {\n const shuffled = arr.slice(0);\n let i = arr.length;\n let min = i - size;\n let temp;\n let index;\n while (i-- > min) {\n index = Math.floor((i + 1) * Math.random());\n temp = shuffled[index];\n shuffled[index] = shuffled[i];\n shuffled[i] = temp;\n }\n return shuffled.slice(min);\n },\n defer: (func: Function) => setTimeout(func, 0),\n once: (func: Function) => {\n let called = false;\n return function() {\n if (called) {\n return;\n }\n called = true;\n func.apply(this, arguments);\n };\n },\n omit: (obj: any, keys: string[]) => {\n const newObj = {};\n Object.keys(obj).forEach(key => {\n if (!keys.includes(key)) {\n newObj[key] = obj[key];\n }\n });\n return newObj;\n }\n};\n","/*eslint no-useless-escape: \"off\", camelcase: \"off\" */\n\nimport util from './util';\n// eslint-disable-line no-unused-vars\n\nlet myKey: any;\n\nexport default {\n async getActiveKey(datadir = `.`, keyfile = `iris.key`, fs?: any) {\n if (myKey) {\n return myKey;\n }\n if (fs) {\n const privKeyFile = `${datadir}/${keyfile}`;\n if (fs.existsSync(privKeyFile)) {\n const f = fs.readFileSync(privKeyFile, `utf8`);\n myKey = this.fromString(f);\n } else {\n const newKey = await this.generate();\n myKey = myKey || newKey; // eslint-disable-line require-atomic-updates\n fs.writeFileSync(privKeyFile, this.toString(myKey));\n fs.chmodSync(privKeyFile, 400);\n }\n if (!myKey) {\n throw new Error(`loading default key failed - check ${datadir}/${keyfile}`);\n }\n } else {\n const str = window.localStorage.getItem(`iris.myKey`);\n if (str) {\n myKey = this.fromString(str);\n } else {\n const newKey = await this.generate();\n myKey = myKey || newKey; // eslint-disable-line require-atomic-updates\n window.localStorage.setItem(`iris.myKey`, this.toString(myKey));\n }\n if (!myKey) {\n throw new Error(`loading default key failed - check localStorage iris.myKey`);\n }\n }\n return myKey;\n },\n\n getDefault(datadir = `.`, keyfile = `iris.key`) {\n return this.getActiveKey(datadir, keyfile);\n },\n\n async getActivePub(datadir = `.`, keyfile = `iris.key`) {\n const key = await this.getActiveKey(datadir, keyfile);\n return key.pub;\n },\n\n setActiveKey(key: any, save = true, datadir = `.`, keyfile = `iris.key`, fs: any) {\n myKey = key;\n if (!save) return;\n if (util.isNode) {\n const privKeyFile = `${datadir}/${keyfile}`;\n fs.writeFileSync(privKeyFile, this.toString(myKey));\n fs.chmodSync(privKeyFile, 400);\n } else {\n window.localStorage.setItem(`iris.myKey`, this.toString(myKey));\n }\n },\n\n toString(key: any) {\n return JSON.stringify(key);\n },\n\n getId(key: any) {\n if (!(key && key.pub)) {\n throw new Error(`missing param`);\n }\n return key.pub; // hack until GUN supports lookups by keyID\n //return util.getHash(key.pub);\n },\n\n fromString(str: string) {\n return JSON.parse(str);\n },\n\n // copied from Gun.SEA\n async generate() {\n try {\n var ecdhSubtle = window.crypto.subtle;\n // First: ECDSA keys for signing/verifying...\n var sa = await ecdhSubtle.generateKey({name: 'ECDSA', namedCurve: 'P-256'}, true, ['sign', 'verify'])\n .then(async (keys) => {\n // privateKey scope doesn't leak out from here!\n //const { d: priv } = await shim.subtle.exportKey('jwk', keys.privateKey)\n var key: any = {};\n key.priv = (await ecdhSubtle.exportKey('jwk', keys.privateKey)).d;\n var pub = await ecdhSubtle.exportKey('jwk', keys.publicKey);\n //const pub = Buff.from([ x, y ].join(':')).toString('base64') // old\n key.pub = pub.x + '.' + pub.y; // new\n // x and y are already base64\n // pub is UTF8 but filename/URL safe (https://www.ietf.org/rfc/rfc3986.txt)\n // but split on a non-base64 letter.\n return key;\n })\n\n // To include PGPv4 kind of keyId:\n // const pubId = await SEA.keyid(keys.pub)\n // Next: ECDH keys for encryption/decryption...\n\n try {\n var dh = await ecdhSubtle.generateKey({name: 'ECDH', namedCurve: 'P-256'}, true, ['deriveKey'])\n .then(async (keys) => {\n // privateKey scope doesn't leak out from here!\n var key: any = {};\n key.epriv = (await ecdhSubtle.exportKey('jwk', keys.privateKey)).d;\n var pub = await ecdhSubtle.exportKey('jwk', keys.publicKey);\n //const epub = Buff.from([ ex, ey ].join(':')).toString('base64') // old\n key.epub = pub.x + '.' + pub.y; // new\n // ex and ey are already base64\n // epub is UTF8 but filename/URL safe (https://www.ietf.org/rfc/rfc3986.txt)\n // but split on a non-base64 letter.\n return key;\n })\n } catch (e) {\n if (e == 'Error: ECDH is not a supported algorithm') {\n console.log('Ignoring ECDH...')\n } else {\n throw e\n }\n }\n dh = dh || {};\n\n var r = {pub: sa.pub, priv: sa.priv, /* pubId, */ epub: dh.epub, epriv: dh.epriv}\n return r;\n } catch (e) {\n console.log(e);\n throw e;\n return;\n }\n },\n\n keyToJwk(key: any): JsonWebKey {\n if (typeof key === 'string') {\n key = { pub: key };\n }\n const jwk: JsonWebKey = {\n kty: 'EC',\n crv: 'P-256',\n x: key.pub.split('.')[0],\n y: key.pub.split('.')[1],\n ext: true,\n };\n jwk.key_ops = key.priv ? ['sign'] : ['verify'];\n if (key.priv) {\n jwk.d = key.priv\n }\n return jwk;\n },\n\n async sign(data: any, pair: any, cb?: Function, opt: any = {}) {\n if(undefined === data){ throw '`undefined` not allowed.' }\n const text = typeof data === 'string' ? data : JSON.stringify(data); // Gun.SEA doesn't preserve data type: \"0\" -> 0. Should we change this?\n var jwk = this.keyToJwk(pair);\n var hash = await util.getHash(text, 'buffer') as Buffer;\n var sig = await window.crypto.subtle.importKey('jwk', jwk, {name: 'ECDSA', namedCurve: 'P-256'}, false, ['sign'])\n .then((key) =>\n window.crypto.subtle.sign({name: 'ECDSA', hash: {name: 'SHA-256'}}, key, hash)\n ) // privateKey scope doesn't leak out from here!\n var r: any = {m: text, s: Buffer.from(sig).toString(opt.encode || 'base64')}\n if(!opt.raw){ r = 'aSEA' + JSON.stringify(r) } // \"aSEA\" was a dumb fix for an earlier bug in Gun.SEA\n\n if(cb){ try{ cb(r) }catch(e){console.log(e)} }\n return r;\n },\n\n async verify(data: any, pair: any, cb?: Function, opt: any = {}) {\n try {\n if (typeof data === 'string') {\n if (data.slice(0, 4) === 'aSEA') {\n data = data.slice(4)\n }\n try {\n data = JSON.parse(data);\n } catch (e) {\n // not JSON\n }\n }\n var pub = pair.pub || pair;\n var jwk = this.keyToJwk(pub);\n var key = await crypto.subtle.importKey('jwk', jwk, {name: 'ECDSA', namedCurve: 'P-256'}, false, ['verify']);\n\n let text = data.m;\n try {\n text = JSON.parse(text);\n } catch (e) {\n // ignore\n }\n\n let hash = await util.getHash(text, 'buffer') as Buffer;\n var buf, sig, isValid;\n buf = Buffer.from(data.s, opt.encode || 'base64');\n sig = new Uint8Array(buf);\n isValid = await crypto.subtle.verify({name: 'ECDSA', hash: {name: 'SHA-256'}}, key, sig, hash);\n var r = isValid? JSON.parse(text) : undefined;\n if (r === undefined) {\n //console.log('invalid', data, pair, hash);\n }\n\n if(cb){ try{ cb(r) }catch(e){console.log(e)} }\n return r;\n } catch (e) {\n console.log(e);\n return undefined;\n }\n },\n\n async secret(key: any, pair: any) {\n var keysToEcdhJwk = (pub: any, d?: any): any => { // d === priv\n //var [ x, y ] = shim.Buffer.from(pub, 'base64').toString('utf8').split(':') // old\n var [ x, y ] = pub.split('.') // new\n const jwk: JsonWebKey = Object.assign(\n d ? { d } : {},\n { x: x, y: y, kty: 'EC', crv: 'P-256', ext: true }\n );\n return jwk;\n }\n\n var pub = key.epub || key;\n var epub = pair.epub;\n var epriv = pair.epriv;\n var pubJwk = keysToEcdhJwk(pub);\n var props = Object.assign({\n public: await crypto.subtle.importKey('jwk', pubJwk, {name: 'ECDH', namedCurve: 'P-256'}, true, [])\n },{name: 'ECDH', namedCurve: 'P-256'});\n var privJwk = keysToEcdhJwk(epub, epriv);\n return crypto.subtle.importKey('jwk', privJwk, {name: 'ECDH', namedCurve: 'P-256'}, false, ['deriveBits'])\n .then(async (privKey) => {\n var derivedBits = await crypto.subtle.deriveBits(props, privKey, 256);\n var rawBits = new Uint8Array(derivedBits);\n var derivedKey = await crypto.subtle.importKey('raw', rawBits,{ name: 'AES-GCM', length: 256 }, true, [ 'encrypt', 'decrypt' ]);\n return crypto.subtle.exportKey('jwk', derivedKey).then(({ k }) => k);\n });\n },\n\n async aeskey(key: any, salt?: Buffer) {\n const combo = key + (salt || this.random(8)).toString('utf8'); // new\n let hash: any = await crypto.subtle.digest({name: 'SHA-256'}, new TextEncoder().encode(combo));\n hash = Buffer.from(hash, 'binary');\n\n const keyB64 = hash.toString('base64');\n const k = keyB64.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/\\=/g, '');\n\n const jwkKey = { kty: 'oct', k: k, ext: false, alg: 'A256GCM' };\n return await crypto.subtle.importKey('jwk', jwkKey, {name:'AES-GCM'}, false, ['encrypt', 'decrypt'])\n },\n\n random(len: number) {\n return Buffer.from(crypto.getRandomValues(new Uint8Array(len)));\n },\n\n async encrypt(data: any, pair: any, cb?: Function, opt: any = {}) {\n var key = pair.epriv || pair;\n if(undefined === data){ throw '`undefined` not allowed.' }\n var msg = (typeof data == 'string')? data : JSON.stringify(data); // Gun.SEA doesn't preserve data type: \"0\" -> 0. Should we change this?\n var rand = {s: this.random(9), iv: this.random(15)}; // consider making this 9 and 15 or 18 or 12 to reduce == padding.\n var ct = await this.aeskey(key, rand.s).then((aes) => crypto.subtle.encrypt({ // Keeping the AES key scope as private as possible...\n name: opt.name || 'AES-GCM', iv: new Uint8Array(rand.iv)\n }, aes, new TextEncoder().encode(msg)));\n var r: any = {\n // @ts-ignore\n ct: Buffer.from(ct, 'binary').toString(opt.encode || 'base64'),\n iv: rand.iv.toString(opt.encode || 'base64'),\n s: rand.s.toString(opt.encode || 'base64')\n }\n if(!opt.raw){ r = 'SEA' + JSON.stringify(r) }\n\n if(cb){ try{ cb(r) }catch(e){console.log(e)} }\n return r;\n },\n\n async decrypt(data: any, pair: any, cb?: Function, opt: any = {}) {\n var key = pair.epriv || pair;\n let json;\n try { data = JSON.parse(data); } catch (e) {}\n if (data.indexOf('SEA{') === 0) {\n json = JSON.parse(data.slice(3));\n } else {\n json = JSON.parse(data);\n }\n if (!json.ct || !json.iv || !json.s) {\n throw 'Invalid ciphertext ' + json;\n }\n var buf: Buffer, bufiv: Buffer, bufct: Buffer;\n buf = Buffer.from(json.s, opt.encode || 'base64');\n bufiv = Buffer.from(json.iv, opt.encode || 'base64');\n bufct = Buffer.from(json.ct, opt.encode || 'base64');\n var ct = await this.aeskey(key, buf).then((aes) => crypto.subtle.decrypt({ // Keeping aesKey scope as private as possible...\n name: opt.name || 'AES-GCM', iv: new Uint8Array(bufiv), tagLength: 128\n }, aes, new Uint8Array(bufct)));\n const text = new TextDecoder('utf8').decode(ct);\n var r = text;\n try { r = JSON.parse(text); } catch (_e) {}\n if(cb){ try{ cb(r) }catch(e){console.log(e)} }\n return r;\n }\n}","import session from './session';\nimport _ from './lodash';\nimport util from './util';\nimport publicState from './global';\nimport Key from './Key';\n\nconst ELECTRON_GUN_URL = 'http://localhost:8767/gun';\nlet maxConnectedPeers = 1;\n\ntype Peer = {\n url?: string;\n enabled?: boolean;\n from?: string;\n visibility?: string;\n}\n\ntype Peers = {\n [key: string]: Peer\n}\n\nconst DEFAULT_PEERS: Peers = {\n 'wss://gun-rs.iris.to/gun': {},\n// 'wss://gun-us.herokuapp.com/gun': {},\n};\n\nif (self.window) {\n const loc = window.location;\n const host = loc.host;\n const is_localhost_but_not_dev = host.startsWith('localhost') && host !== 'localhost:8080';\n if (loc.hostname.endsWith('herokuapp.com') || is_localhost_but_not_dev) {\n Object.keys(DEFAULT_PEERS).forEach(url => DEFAULT_PEERS[url].enabled = false);\n DEFAULT_PEERS[`${loc.origin}/gun`] = {enabled: true};\n }\n}\n\n/**\n * Networking and peer management utilities\n */\nexport default {\n known: {} as Peers,\n\n /** */\n async add(peer: Peer) {\n if (peer.from) {\n Object.keys(this.known).forEach(k => {\n if (this.known[k].from === peer.from) { // remove previous peer url from the same user\n delete this.known[k];\n }\n });\n }\n const url = peer.url || '';\n this.known[url] = this.known[url] || _.omit(peer, ['url']);\n if (peer.visibility === 'public') {\n // rolling some crypto operations to obfuscate actual url in case we want to remove it\n let secret = await Key.secret(session.getKey().epub, session.getKey()) || '';\n let encryptedUrl = await Key.encrypt(peer.url, secret);\n let encryptedUrlHash = await util.getHash(encryptedUrl);\n publicState().user().get('peers').get(encryptedUrlHash).put({url: peer.url, lastSeen: new Date().toISOString()});\n }\n if (peer.enabled !== false) {\n peer.url && this.connect(peer.url); // this calls savePeers()\n } else {\n this.save();\n }\n },\n\n /** */\n remove(url: string) {\n delete this.known[url];\n this.save();\n },\n\n /** */\n disconnect(peerFromGun: any) {\n publicState().on('bye', peerFromGun);\n peerFromGun.url = '';\n },\n\n save() {\n // TODO store them in iris.local() instead of localStorage\n localStorage.setItem('gunPeers', JSON.stringify(this.known));\n },\n\n getSaved() {\n let p: any = localStorage.getItem('gunPeers');\n if (p && p !== 'undefined') {\n p = JSON.parse(p);\n } else {\n p = DEFAULT_PEERS;\n }\n if (util.isElectron) {\n p[ELECTRON_GUN_URL] = {};\n }\n Object.keys(p).forEach(k => _.defaults(p[k], {enabled: true}));\n return p;\n },\n\n /** */\n reset() {\n localStorage.setItem('gunPeers', '');\n this.known = this.getSaved();\n },\n\n /** */\n connect(url: string) {\n if (!url) {\n return;\n }\n if (this.isMixedContent(url)) { return; }\n if (this.known[url]) {\n this.known[url].enabled = true;\n publicState().opt({peers: [url]});\n this.save();\n } else {\n this.add({url});\n }\n },\n\n /** */\n disable(url: string, peerFromGun: any) {\n this.known[url].enabled = false;\n if (peerFromGun) {\n this.disconnect(peerFromGun);\n }\n this.save();\n },\n\n isMixedContent(url: string) {\n if (!url) { return false; }\n return window.location.protocol === 'https:' && (url.indexOf('http:') === 0);\n },\n\n random() {\n const connectToLocalElectron = util.isElectron && this.known[ELECTRON_GUN_URL] && this.known[ELECTRON_GUN_URL].enabled !== false;\n const sampleSize = connectToLocalElectron ? Math.max(maxConnectedPeers - 1, 1) : maxConnectedPeers;\n const sample = _.sampleSize(\n Object.keys(\n _.pickBy(this.known, (peer: any, url: string) => {\n return !this.isMixedContent(url) && peer.enabled && !(util.isElectron && url === ELECTRON_GUN_URL);\n })\n ), sampleSize\n );\n if (sample && connectToLocalElectron) {\n sample.push(ELECTRON_GUN_URL);\n }\n console.log('sample', sample, JSON.stringify(this.known));\n return sample;\n },\n\n checkGunPeerCount() {\n return;\n let peersFromGun = publicState().back('opt.peers');\n let connectedPeers = Object.values(peersFromGun).filter((peer: any) => {\n if (peer && peer.wire && peer.wire.constructor.name !== 'WebSocket') {\n console.log('WebRTC peer', peer);\n }\n return peer && peer.wire && peer.wire.readyState === 1 && peer.wire.bufferedAmount === 0 && peer.wire.constructor.name === 'WebSocket';\n });\n if (connectedPeers.length < maxConnectedPeers) {\n let unconnectedPeers = Object.keys(this.known).filter(url => {\n let addedToGun = Object.values(peersFromGun).map((peer:any) => peer.url).indexOf(url) > -1;\n let enabled = this.known[url].enabled;\n const mixedContent = (window.location.protocol === 'https:' && (url.indexOf('http:') === 0));\n return !mixedContent && enabled && !addedToGun;\n });\n if (unconnectedPeers.length) {\n const sample = String(_.sample(unconnectedPeers));\n this.connect(sample);\n }\n }\n if (connectedPeers.length > maxConnectedPeers) {\n this.disconnect(_.sample(connectedPeers));\n }\n },\n\n init() {\n this.known = this.getSaved();\n /* use the default value of 1 for now because of memory issue\n local().get('settings').get('maxConnectedPeers').on(n => {\n if (n !== undefined) maxConnectedPeers = n;\n });\n */\n setInterval(() => this.checkGunPeerCount(), 1000);\n }\n};\n","import {Message} from './Message';\n\nexport function generateUuid() {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\n const r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8);\n return v.toString(16);\n });\n}\n\nexport class Actor {\n id: string;\n\n handle(_message: Message) {\n throw new Error('not implemented');\n }\n\n // so we can support a similar api as Channels\n postMessage(message: Message) {\n this.handle(message);\n }\n\n constructor(id = generateUuid()) {\n this.id = id;\n }\n}","import {Actor} from './Actor';\nimport {Children} from \"./Node\";\nimport Key from \"../Key\";\n\nexport class Message {\n // When Messages are sent over BroadcastChannel, class name is lost.\n static fromObject(obj: any): Message {\n if (obj.type === 'get') {\n return Get.fromObject(obj);\n } else if (obj.type === 'put') {\n return Put.fromObject(obj);\n } else {\n throw new Error('not implemented');\n }\n }\n\n static async deserialize(str: string, from: Actor): Promise {\n const obj = JSON.parse(str);\n if (obj.get) {\n return Get.deserialize(obj, str, from);\n } else if (obj.put) {\n return Put.deserialize(obj, str, from);\n } else if (obj.dam && obj.dam === \"hi\") {\n return Hi.deserialize(obj);\n } else {\n throw new Error('unknown message type');\n }\n }\n\n serialize(): string {\n throw new Error('not implemented');\n }\n}\n\nfunction generateMsgId(): string {\n return Math.random().toString(36).slice(2, 10);\n}\n\nexport class Get implements Message {\n type: string = 'get';\n id: string;\n nodeId: string;\n from: Actor;\n recipients?: string[];\n childKey?: string;\n jsonStr?: string;\n checksum?: string;\n\n serialize(): string {\n if (this.jsonStr) {\n return this.jsonStr;\n }\n\n // TODO remove \"global/\", replace /^user\\// with ~\n let nodeId = this.nodeId.replace(/^global\\//, '').replace(/^user\\//, '~');\n const obj: any = {\n \"#\": this.id,\n get: {\n \"#\": nodeId,\n \".\": this.childKey\n },\n };\n\n if (this.childKey) {\n obj.get['.'] = this.childKey;\n }\n this.jsonStr = JSON.stringify(obj);\n return this.jsonStr;\n }\n\n static async deserialize(obj: any, jsonStr: string, from: Actor): Promise {\n const id = obj['#'];\n let nodeId = obj.get['#']; // TODO add \"global/\" prefix, replace /^~/ with \"user/\"\n if (nodeId.startsWith('~')) {\n nodeId = 'user/' + nodeId.slice(1);\n }\n nodeId = 'global/' + nodeId;\n const childKey = obj.get['.'];\n return new Get(id, nodeId, from, undefined, childKey, jsonStr);\n }\n\n static fromObject(obj: any): Get {\n return new Get(obj.id, obj.nodeId, obj.from, obj.recipients, obj.childKey, obj.jsonStr, obj.checksum);\n }\n\n static new(nodeId: string, from: Actor, recipients?: string[], childKey?: string, jsonStr?: string, checksum?: string): Get {\n const id = generateMsgId();\n return new Get(id, nodeId, from, recipients, childKey, jsonStr, checksum);\n }\n\n constructor(id: string, nodeId: string, from: Actor, recipients?: string[], childKey?: string, jsonStr?: string, checksum?: string) {\n this.id = id;\n this.from = from;\n this.nodeId = nodeId;\n this.recipients = recipients;\n this.childKey = childKey;\n this.jsonStr = jsonStr;\n this.checksum = checksum;\n }\n}\n\nexport type UpdatedNodes = {\n [key: string]: Children;\n};\n\nexport class Put implements Message {\n type: string = 'put';\n id: string;\n from: Actor;\n updatedNodes: UpdatedNodes;\n inResponseTo?: string;\n recipients?: string[];\n jsonStr?: string;\n checksum?: string;\n\n serialize(): string {\n const obj = {\n \"#\" : this.id,\n \"put\": {} as any\n };\n\n // iterate over this.updatedNodes\n for (const [nodeId, children] of Object.entries(this.updatedNodes)) {\n let myNodeId = nodeId.replace(/^global\\//, '').replace(/^user\\//, '~');\n const node: any = obj.put[myNodeId] = {};\n for (const [childKey, childValue] of Object.entries(children)) {\n if (!childValue) {\n continue;\n }\n const data = childValue;\n node[childKey] = data.value;\n node[\"_\"] = node[\"_\"] || {};\n node[\"_\"][\">\"] = node[\"_\"][\">\"] || {};\n node[\"_\"][\">\"][childKey] = data.updatedAt;\n }\n }\n return JSON.stringify(obj);\n }\n\n static async deserialize(obj: any, jsonStr: string, from: Actor): Promise {\n const id = obj['#'];\n const updatedNodes: UpdatedNodes = {};\n type SerializedChildren = {\n [key: string]: any;\n }\n for (const [nodeId, c] of Object.entries(obj.put)) {\n const children = c as SerializedChildren;\n const node: any = {};\n const isUserSpace = nodeId.startsWith('~');\n for (const [childKey, childValue] of Object.entries(children)) {\n if (childKey === '_') {\n continue;\n }\n if (isUserSpace) {\n const user = nodeId.split('/')[0].slice(1);\n const signatureObj = JSON.parse(childValue);\n const timestamp = children['_']['>'][childKey];\n const value = signatureObj[':'];\n const signedObj = {\n \"#\": nodeId,\n \".\": childKey,\n \":\": value,\n \">\": timestamp\n };\n const signature = signatureObj['~'];\n const signedStr = JSON.stringify(signedObj);\n if (await Key.verify({s: signature, m: signedStr}, user) === undefined) {\n throw new Error(`invalid signature in ${nodeId} of ${signedStr}`);\n }\n }\n // TODO test hash space validity\n const updatedAt = children['_']['>'][childKey];\n node[childKey] = {\n value: childValue,\n updatedAt,\n };\n }\n const myNodeId = 'global/' + nodeId.replace(/^~/, 'user/');\n updatedNodes[myNodeId] = node;\n }\n return new Put(id, updatedNodes, from, undefined, undefined, jsonStr);\n }\n\n static fromObject(obj: any): Put {\n return new Put(obj.id, obj.updatedNodes, obj.from, obj.inResponseTo, obj.recipients, obj.jsonStr, obj.checksum);\n }\n\n static new(updatedNodes: UpdatedNodes, from: Actor, inResponseTo?: string, recipients?: string[], jsonStr?: string, checksum?: string): Put {\n const id = generateMsgId();\n return new Put(id, updatedNodes, from, inResponseTo, recipients, jsonStr, checksum);\n }\n\n static newFromKv(key: string, children: Children, from:Actor) {\n const updatedNodes: UpdatedNodes = {};\n updatedNodes[key] = children;\n return Put.new(updatedNodes, from);\n }\n\n constructor(id: string, updatedNodes: UpdatedNodes, from: Actor, inResponseTo?: string, recipients?: string[], jsonStr?: string, checksum?: string) {\n this.id = id;\n this.from = from;\n this.updatedNodes = updatedNodes;\n this.inResponseTo = inResponseTo;\n this.recipients = recipients;\n this.jsonStr = jsonStr;\n this.checksum = checksum;\n }\n}\n\nexport class Hi implements Message {\n type: string = 'hi';\n peerId: string;\n jsonStr?: string;\n\n //{\"#\":\"aHHO9Srurq9nh6Q9\",\"dam\":\"hi\"}\n\n\n serialize(): string {\n if (this.jsonStr) {\n return this.jsonStr;\n }\n\n const obj: any = {\n dam: \"hi\",\n \"#\": this.peerId,\n };\n\n this.jsonStr = JSON.stringify(obj);\n return this.jsonStr;\n }\n\n static deserialize(obj: any): Hi {\n const peerId = obj['#'];\n return new Hi(peerId);\n }\n\n constructor(peerId: string, jsonStr?: string) {\n this.peerId = peerId;\n this.jsonStr = jsonStr;\n }\n}\n\nconst parseGet = (get: any, from: Actor): Get => {\n return new Get(get.id, get.nodeId, from, get.recipients, get.childKey, get.jsonStr, get.checksum);\n}\n\nconst parsePut = (put: any, from: Actor): Put => {\n return new Put(put.id, put.updatedNodes, from, put.inResponseTo, put.recipients, put.jsonStr, put.checksum);\n}\n\nexport function messageFromJsonString(jsonStr: string, from: Actor): Message {\n const obj = JSON.parse(jsonStr);\n if (obj.get) {\n return parseGet(obj.get, from);\n } else if (obj.put) {\n return parsePut(obj.put, from);\n } else {\n throw new Error('Unknown message type');\n }\n}","export default class QuickLRU extends Map {\n\tconstructor(options = {}) {\n\t\tsuper();\n\n\t\tif (!(options.maxSize && options.maxSize > 0)) {\n\t\t\tthrow new TypeError('`maxSize` must be a number greater than 0');\n\t\t}\n\n\t\tif (typeof options.maxAge === 'number' && options.maxAge === 0) {\n\t\t\tthrow new TypeError('`maxAge` must be a number greater than 0');\n\t\t}\n\n\t\t// TODO: Use private class fields when ESLint supports them.\n\t\tthis.maxSize = options.maxSize;\n\t\tthis.maxAge = options.maxAge || Number.POSITIVE_INFINITY;\n\t\tthis.onEviction = options.onEviction;\n\t\tthis.cache = new Map();\n\t\tthis.oldCache = new Map();\n\t\tthis._size = 0;\n\t}\n\n\t// TODO: Use private class methods when targeting Node.js 16.\n\t_emitEvictions(cache) {\n\t\tif (typeof this.onEviction !== 'function') {\n\t\t\treturn;\n\t\t}\n\n\t\tfor (const [key, item] of cache) {\n\t\t\tthis.onEviction(key, item.value);\n\t\t}\n\t}\n\n\t_deleteIfExpired(key, item) {\n\t\tif (typeof item.expiry === 'number' && item.expiry <= Date.now()) {\n\t\t\tif (typeof this.onEviction === 'function') {\n\t\t\t\tthis.onEviction(key, item.value);\n\t\t\t}\n\n\t\t\treturn this.delete(key);\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t_getOrDeleteIfExpired(key, item) {\n\t\tconst deleted = this._deleteIfExpired(key, item);\n\t\tif (deleted === false) {\n\t\t\treturn item.value;\n\t\t}\n\t}\n\n\t_getItemValue(key, item) {\n\t\treturn item.expiry ? this._getOrDeleteIfExpired(key, item) : item.value;\n\t}\n\n\t_peek(key, cache) {\n\t\tconst item = cache.get(key);\n\n\t\treturn this._getItemValue(key, item);\n\t}\n\n\t_set(key, value) {\n\t\tthis.cache.set(key, value);\n\t\tthis._size++;\n\n\t\tif (this._size >= this.maxSize) {\n\t\t\tthis._size = 0;\n\t\t\tthis._emitEvictions(this.oldCache);\n\t\t\tthis.oldCache = this.cache;\n\t\t\tthis.cache = new Map();\n\t\t}\n\t}\n\n\t_moveToRecent(key, item) {\n\t\tthis.oldCache.delete(key);\n\t\tthis._set(key, item);\n\t}\n\n\t* _entriesAscending() {\n\t\tfor (const item of this.oldCache) {\n\t\t\tconst [key, value] = item;\n\t\t\tif (!this.cache.has(key)) {\n\t\t\t\tconst deleted = this._deleteIfExpired(key, value);\n\t\t\t\tif (deleted === false) {\n\t\t\t\t\tyield item;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (const item of this.cache) {\n\t\t\tconst [key, value] = item;\n\t\t\tconst deleted = this._deleteIfExpired(key, value);\n\t\t\tif (deleted === false) {\n\t\t\t\tyield item;\n\t\t\t}\n\t\t}\n\t}\n\n\tget(key) {\n\t\tif (this.cache.has(key)) {\n\t\t\tconst item = this.cache.get(key);\n\n\t\t\treturn this._getItemValue(key, item);\n\t\t}\n\n\t\tif (this.oldCache.has(key)) {\n\t\t\tconst item = this.oldCache.get(key);\n\t\t\tif (this._deleteIfExpired(key, item) === false) {\n\t\t\t\tthis._moveToRecent(key, item);\n\t\t\t\treturn item.value;\n\t\t\t}\n\t\t}\n\t}\n\n\tset(key, value, {maxAge = this.maxAge} = {}) {\n\t\tconst expiry =\n\t\t\ttypeof maxAge === 'number' && maxAge !== Number.POSITIVE_INFINITY ?\n\t\t\t\tDate.now() + maxAge :\n\t\t\t\tundefined;\n\t\tif (this.cache.has(key)) {\n\t\t\tthis.cache.set(key, {\n\t\t\t\tvalue,\n\t\t\t\texpiry\n\t\t\t});\n\t\t} else {\n\t\t\tthis._set(key, {value, expiry});\n\t\t}\n\t}\n\n\thas(key) {\n\t\tif (this.cache.has(key)) {\n\t\t\treturn !this._deleteIfExpired(key, this.cache.get(key));\n\t\t}\n\n\t\tif (this.oldCache.has(key)) {\n\t\t\treturn !this._deleteIfExpired(key, this.oldCache.get(key));\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tpeek(key) {\n\t\tif (this.cache.has(key)) {\n\t\t\treturn this._peek(key, this.cache);\n\t\t}\n\n\t\tif (this.oldCache.has(key)) {\n\t\t\treturn this._peek(key, this.oldCache);\n\t\t}\n\t}\n\n\tdelete(key) {\n\t\tconst deleted = this.cache.delete(key);\n\t\tif (deleted) {\n\t\t\tthis._size--;\n\t\t}\n\n\t\treturn this.oldCache.delete(key) || deleted;\n\t}\n\n\tclear() {\n\t\tthis.cache.clear();\n\t\tthis.oldCache.clear();\n\t\tthis._size = 0;\n\t}\n\n\tresize(newSize) {\n\t\tif (!(newSize && newSize > 0)) {\n\t\t\tthrow new TypeError('`maxSize` must be a number greater than 0');\n\t\t}\n\n\t\tconst items = [...this._entriesAscending()];\n\t\tconst removeCount = items.length - newSize;\n\t\tif (removeCount < 0) {\n\t\t\tthis.cache = new Map(items);\n\t\t\tthis.oldCache = new Map();\n\t\t\tthis._size = items.length;\n\t\t} else {\n\t\t\tif (removeCount > 0) {\n\t\t\t\tthis._emitEvictions(items.slice(0, removeCount));\n\t\t\t}\n\n\t\t\tthis.oldCache = new Map(items.slice(removeCount));\n\t\t\tthis.cache = new Map();\n\t\t\tthis._size = 0;\n\t\t}\n\n\t\tthis.maxSize = newSize;\n\t}\n\n\t* keys() {\n\t\tfor (const [key] of this) {\n\t\t\tyield key;\n\t\t}\n\t}\n\n\t* values() {\n\t\tfor (const [, value] of this) {\n\t\t\tyield value;\n\t\t}\n\t}\n\n\t* [Symbol.iterator]() {\n\t\tfor (const item of this.cache) {\n\t\t\tconst [key, value] = item;\n\t\t\tconst deleted = this._deleteIfExpired(key, value);\n\t\t\tif (deleted === false) {\n\t\t\t\tyield [key, value.value];\n\t\t\t}\n\t\t}\n\n\t\tfor (const item of this.oldCache) {\n\t\t\tconst [key, value] = item;\n\t\t\tif (!this.cache.has(key)) {\n\t\t\t\tconst deleted = this._deleteIfExpired(key, value);\n\t\t\t\tif (deleted === false) {\n\t\t\t\t\tyield [key, value.value];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t* entriesDescending() {\n\t\tlet items = [...this.cache];\n\t\tfor (let i = items.length - 1; i >= 0; --i) {\n\t\t\tconst item = items[i];\n\t\t\tconst [key, value] = item;\n\t\t\tconst deleted = this._deleteIfExpired(key, value);\n\t\t\tif (deleted === false) {\n\t\t\t\tyield [key, value.value];\n\t\t\t}\n\t\t}\n\n\t\titems = [...this.oldCache];\n\t\tfor (let i = items.length - 1; i >= 0; --i) {\n\t\t\tconst item = items[i];\n\t\t\tconst [key, value] = item;\n\t\t\tif (!this.cache.has(key)) {\n\t\t\t\tconst deleted = this._deleteIfExpired(key, value);\n\t\t\t\tif (deleted === false) {\n\t\t\t\t\tyield [key, value.value];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t* entriesAscending() {\n\t\tfor (const [key, value] of this._entriesAscending()) {\n\t\t\tyield [key, value.value];\n\t\t}\n\t}\n\n\tget size() {\n\t\tif (!this._size) {\n\t\t\treturn this.oldCache.size;\n\t\t}\n\n\t\tlet oldCacheSize = 0;\n\t\tfor (const key of this.oldCache.keys()) {\n\t\t\tif (!this.cache.has(key)) {\n\t\t\t\toldCacheSize++;\n\t\t\t}\n\t\t}\n\n\t\treturn Math.min(this._size + oldCacheSize, this.maxSize);\n\t}\n\n\tentries() {\n\t\treturn this.entriesAscending();\n\t}\n\n\tforEach(callbackFunction, thisArgument = this) {\n\t\tfor (const [key, value] of this.entriesAscending()) {\n\t\t\tcallbackFunction.call(thisArgument, value, key, this);\n\t\t}\n\t}\n\n\tget [Symbol.toStringTag]() {\n\t\treturn JSON.stringify([...this.entriesAscending()]);\n\t}\n}\n","import {Put, Get, Message} from '../Message'\nimport { Actor } from '../Actor';\nimport QuickLRU from 'quick-lru';\nimport {Children} from \"../Node\";\n//import {NodeData} from \"../Node\";\n// import * as Comlink from \"comlink\";\nimport _ from '../../lodash';\n\nexport default class Memory extends Actor {\n config = {};\n store: QuickLRU = new QuickLRU({ maxSize: 10000 });\n\n constructor(config: any = {}) {\n super();\n this.config = config;\n }\n\n handle(message: Message) {\n if (message instanceof Put) {\n this.handlePut(message);\n } else if (message instanceof Get) {\n this.handleGet(message);\n } else {\n console.log('Memory got unknown message', message);\n }\n }\n\n handleGet(message: Get) {\n if (!message.from) {\n console.log('no from in get message');\n return;\n }\n let children = this.store.get(message.nodeId);\n if (children) {\n //console.log('have', message.nodeId, children);\n const putMessage = Put.newFromKv(message.nodeId, children, this);\n putMessage.inResponseTo = message.id;\n message.from && message.from.postMessage(putMessage);\n } else {\n //console.log('dont have', message.nodeId);\n }\n }\n\n mergeAndSave(nodeName: string, children: Children) {\n const existing = this.store.get(nodeName);\n\n // TODO check updatedAt timestamp\n if (existing === undefined) {\n this.store.set(nodeName, children);\n } else {\n for (const [key, value] of Object.entries(children)) {\n if (existing[key] && existing[key].updatedAt >= value.updatedAt) {\n continue;\n }\n existing[key] = value;\n }\n this.store.set(nodeName, existing);\n }\n }\n\n async handlePut(put: Put) {\n for (const [nodeName, children] of Object.entries(put.updatedNodes)) {\n if (!children) {\n console.log('deleting', nodeName);\n this.store.delete(nodeName);\n continue;\n }\n this.mergeAndSave(nodeName, children);\n }\n }\n}\n\n/*\nlet actor;\nglobal.onconnect = () => {\n if (actor) {\n console.log ('worker already exists');\n } else {\n console.log('starting worker');\n actor = actor || new IndexedDB();\n }\n}\n */\n\n// self.onconnect = (e) => Comlink.expose(actor, e.ports[0]);","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n","declare var global;\nexport const _global: any =\n typeof globalThis !== 'undefined' ? globalThis :\n typeof self !== 'undefined' ? self :\n typeof window !== 'undefined' ? window :\n global;\n","import { _global } from \"../globals/global\";\nexport const keys = Object.keys;\nexport const isArray = Array.isArray;\nif (typeof Promise !== 'undefined' && !_global.Promise){\n // In jsdom, this it can be the case that Promise is not put on the global object.\n // If so, we need to patch the global object for the rest of the code to work as expected.\n // Other dexie code expects Promise to be on the global object (like normal browser environments)\n _global.Promise = Promise;\n}\nexport { _global }\n\nexport function extend(obj: T, extension: X): T & X {\n if (typeof extension !== 'object') return obj as T & X;\n keys(extension).forEach(function (key) {\n obj[key] = extension[key];\n });\n return obj as T & X;\n}\n\nexport const getProto = Object.getPrototypeOf;\nexport const _hasOwn = {}.hasOwnProperty;\nexport function hasOwn(obj, prop) {\n return _hasOwn.call(obj, prop);\n}\n\nexport function props (proto, extension) {\n if (typeof extension === 'function') extension = extension(getProto(proto));\n (typeof Reflect === \"undefined\" ? keys : Reflect.ownKeys)(extension).forEach(key => {\n setProp(proto, key, extension[key]);\n });\n}\n\nexport const defineProperty = Object.defineProperty;\n\nexport function setProp(obj, prop, functionOrGetSet, options?) {\n defineProperty(obj, prop, extend(functionOrGetSet && hasOwn(functionOrGetSet, \"get\") && typeof functionOrGetSet.get === 'function' ?\n {get: functionOrGetSet.get, set: functionOrGetSet.set, configurable: true} :\n {value: functionOrGetSet, configurable: true, writable: true}, options));\n}\n\nexport function derive(Child) {\n return {\n from: function (Parent) {\n Child.prototype = Object.create(Parent.prototype);\n setProp(Child.prototype, \"constructor\", Child);\n return {\n extend: props.bind(null, Child.prototype)\n };\n }\n };\n}\n\nexport const getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\nexport function getPropertyDescriptor(obj, prop) {\n const pd = getOwnPropertyDescriptor(obj, prop);\n let proto;\n return pd || (proto = getProto(obj)) && getPropertyDescriptor (proto, prop);\n}\n\nconst _slice = [].slice;\nexport function slice(args, start?, end?) {\n return _slice.call(args, start, end);\n}\n\nexport function override(origFunc, overridedFactory) {\n return overridedFactory(origFunc);\n}\n\nexport function assert (b) {\n if (!b) throw new Error(\"Assertion Failed\");\n}\n\nexport function asap(fn) {\n // @ts-ignore\n if (_global.setImmediate) setImmediate(fn); else setTimeout(fn, 0);\n}\n\nexport function getUniqueArray(a) {\n return a.filter((value, index, self) => self.indexOf(value) === index);\n}\n\n/** Generate an object (hash map) based on given array.\n * @param extractor Function taking an array item and its index and returning an array of 2 items ([key, value]) to\n * instert on the resulting object for each item in the array. If this function returns a falsy value, the\n * current item wont affect the resulting object.\n */\nexport function arrayToObject (array: T[], extractor: (x:T, idx: number)=>[string, R]): {[name: string]: R} {\n return array.reduce((result, item, i) => {\n var nameAndValue = extractor(item, i);\n if (nameAndValue) result[nameAndValue[0]] = nameAndValue[1];\n return result;\n }, {});\n}\n\nexport function trycatcher(fn, reject) {\n return function () {\n try {\n fn.apply(this, arguments);\n } catch (e) {\n reject(e);\n }\n };\n}\n\nexport function tryCatch(fn: (...args: any[])=>void, onerror, args?) : void {\n try {\n fn.apply(null, args);\n } catch (ex) {\n onerror && onerror(ex);\n }\n}\n\nexport function getByKeyPath(obj, keyPath) {\n // http://www.w3.org/TR/IndexedDB/#steps-for-extracting-a-key-from-a-value-using-a-key-path\n if (hasOwn(obj, keyPath)) return obj[keyPath]; // This line is moved from last to first for optimization purpose.\n if (!keyPath) return obj;\n if (typeof keyPath !== 'string') {\n var rv = [];\n for (var i = 0, l = keyPath.length; i < l; ++i) {\n var val = getByKeyPath(obj, keyPath[i]);\n rv.push(val);\n }\n return rv;\n }\n var period = keyPath.indexOf('.');\n if (period !== -1) {\n var innerObj = obj[keyPath.substr(0, period)];\n return innerObj === undefined ? undefined : getByKeyPath(innerObj, keyPath.substr(period + 1));\n }\n return undefined;\n}\n\nexport function setByKeyPath(obj, keyPath, value) {\n if (!obj || keyPath === undefined) return;\n if ('isFrozen' in Object && Object.isFrozen(obj)) return;\n if (typeof keyPath !== 'string' && 'length' in keyPath) {\n assert(typeof value !== 'string' && 'length' in value);\n for (var i = 0, l = keyPath.length; i < l; ++i) {\n setByKeyPath(obj, keyPath[i], value[i]);\n }\n } else {\n var period = keyPath.indexOf('.');\n if (period !== -1) {\n var currentKeyPath = keyPath.substr(0, period);\n var remainingKeyPath = keyPath.substr(period + 1);\n if (remainingKeyPath === \"\")\n if (value === undefined) {\n if (isArray(obj) && !isNaN(parseInt(currentKeyPath))) obj.splice(currentKeyPath, 1);\n else delete obj[currentKeyPath];\n } else obj[currentKeyPath] = value;\n else {\n var innerObj = obj[currentKeyPath];\n if (!innerObj || !hasOwn(obj, currentKeyPath)) innerObj = (obj[currentKeyPath] = {});\n setByKeyPath(innerObj, remainingKeyPath, value);\n }\n } else {\n if (value === undefined) {\n if (isArray(obj) && !isNaN(parseInt(keyPath))) obj.splice(keyPath, 1);\n else delete obj[keyPath];\n } else obj[keyPath] = value;\n }\n }\n}\n\nexport function delByKeyPath(obj, keyPath) {\n if (typeof keyPath === 'string')\n setByKeyPath(obj, keyPath, undefined);\n else if ('length' in keyPath)\n [].map.call(keyPath, function(kp) {\n setByKeyPath(obj, kp, undefined);\n });\n}\n\nexport function shallowClone(obj) {\n var rv = {};\n for (var m in obj) {\n if (hasOwn(obj, m)) rv[m] = obj[m];\n }\n return rv;\n}\n\nconst concat = [].concat;\nexport function flatten (a: (T | T[])[]) : T[] {\n return concat.apply([], a);\n}\n\n//https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Structured_clone_algorithm\nconst intrinsicTypeNames =\n \"Boolean,String,Date,RegExp,Blob,File,FileList,FileSystemFileHandle,ArrayBuffer,DataView,Uint8ClampedArray,ImageBitmap,ImageData,Map,Set,CryptoKey\"\n .split(',').concat(\n flatten([8,16,32,64].map(num=>[\"Int\",\"Uint\",\"Float\"].map(t=>t+num+\"Array\")))\n ).filter(t=>_global[t]);\nconst intrinsicTypes = intrinsicTypeNames.map(t=>_global[t]);\nexport const intrinsicTypeNameSet = arrayToObject(intrinsicTypeNames, x=>[x,true]);\n\nlet circularRefs: null | WeakMap = null;\nexport function deepClone(any: T): T {\n circularRefs = typeof WeakMap !== 'undefined' && new WeakMap();\n const rv = innerDeepClone(any);\n circularRefs = null;\n return rv;\n}\n\nfunction innerDeepClone(any: T): T {\n if (!any || typeof any !== 'object') return any;\n let rv = circularRefs && circularRefs.get(any); // Resolve circular references\n if (rv) return rv;\n if (isArray(any)) {\n rv = [];\n circularRefs && circularRefs.set(any, rv);\n for (var i = 0, l = any.length; i < l; ++i) {\n rv.push(innerDeepClone(any[i]));\n }\n } else if (intrinsicTypes.indexOf(any.constructor) >= 0) {\n rv = any;\n } else {\n const proto = getProto(any);\n rv = proto === Object.prototype ? {} : Object.create(proto);\n circularRefs && circularRefs.set(any, rv);\n for (var prop in any) {\n if (hasOwn(any, prop)) {\n rv[prop] = innerDeepClone(any[prop]);\n }\n }\n }\n return rv;\n}\n\nconst {toString} = {};\nexport function toStringTag(o: Object) {\n return toString.call(o).slice(8, -1);\n}\n\n// If first argument is iterable or array-like, return it as an array\nexport const iteratorSymbol = typeof Symbol !== 'undefined' ?\n Symbol.iterator :\n '@@iterator';\nexport const getIteratorOf = typeof iteratorSymbol === \"symbol\" ? function(x) {\n var i;\n return x != null && (i = x[iteratorSymbol]) && i.apply(x);\n} : function () { return null; };\nexport const asyncIteratorSymbol = typeof Symbol !== 'undefined'\n ? Symbol.asyncIterator || Symbol.for(\"Symbol.asyncIterator\")\n : '@asyncIterator';\n\nexport const NO_CHAR_ARRAY = {};\n// Takes one or several arguments and returns an array based on the following criteras:\n// * If several arguments provided, return arguments converted to an array in a way that\n// still allows javascript engine to optimize the code.\n// * If single argument is an array, return a clone of it.\n// * If this-pointer equals NO_CHAR_ARRAY, don't accept strings as valid iterables as a special\n// case to the two bullets below.\n// * If single argument is an iterable, convert it to an array and return the resulting array.\n// * If single argument is array-like (has length of type number), convert it to an array.\nexport function getArrayOf (arrayLike) {\n var i, a, x, it;\n if (arguments.length === 1) {\n if (isArray(arrayLike)) return arrayLike.slice();\n if (this === NO_CHAR_ARRAY && typeof arrayLike === 'string') return [arrayLike];\n if ((it = getIteratorOf(arrayLike))) {\n a = [];\n while ((x = it.next()), !x.done) a.push(x.value);\n return a;\n }\n if (arrayLike == null) return [arrayLike];\n i = arrayLike.length;\n if (typeof i === 'number') {\n a = new Array(i);\n while (i--) a[i] = arrayLike[i];\n return a;\n }\n return [arrayLike];\n }\n i = arguments.length;\n a = new Array(i);\n while (i--) a[i] = arguments[i];\n return a;\n}\nexport const isAsyncFunction = typeof Symbol !== 'undefined'\n ? (fn: Function) => fn[Symbol.toStringTag] === 'AsyncFunction'\n : ()=>false;\n","// By default, debug will be true only if platform is a web platform and its page is served from localhost.\n// When debug = true, error's stacks will contain asyncronic long stacks.\nexport var debug = typeof location !== 'undefined' &&\n // By default, use debug mode if served from localhost.\n /^(http|https):\\/\\/(localhost|127\\.0\\.0\\.1)/.test(location.href);\n\nexport function setDebug(value, filter) {\n debug = value;\n libraryFilter = filter;\n}\n\nexport var libraryFilter = () => true;\n\nexport const NEEDS_THROW_FOR_STACK = !new Error(\"\").stack;\n\nexport function getErrorWithStack() {\n \"use strict\";\n if (NEEDS_THROW_FOR_STACK) try {\n // Doing something naughty in strict mode here to trigger a specific error\n // that can be explicitely ignored in debugger's exception settings.\n // If we'd just throw new Error() here, IE's debugger's exception settings\n // will just consider it as \"exception thrown by javascript code\" which is\n // something you wouldn't want it to ignore.\n getErrorWithStack.arguments;\n throw new Error(); // Fallback if above line don't throw.\n } catch(e) {\n return e;\n }\n return new Error();\n}\n\nexport function prettyStack(exception, numIgnoredFrames) {\n var stack = exception.stack;\n if (!stack) return \"\";\n numIgnoredFrames = (numIgnoredFrames || 0);\n if (stack.indexOf(exception.name) === 0)\n numIgnoredFrames += (exception.name + exception.message).split('\\n').length;\n return stack.split('\\n')\n .slice(numIgnoredFrames)\n .filter(libraryFilter)\n .map(frame => \"\\n\" + frame)\n .join('');\n}\n\n// TODO: Replace this in favor of a decorator instead.\nexport function deprecated (what: string, fn: (...args)=>T) {\n return function () {\n console.warn(`${what} is deprecated. See https://dexie.org/docs/Deprecations. ${prettyStack(getErrorWithStack(), 1)}`);\n return fn.apply(this, arguments);\n } as (...args)=>T\n}\n","import { derive, setProp } from '../functions/utils';\nimport { getErrorWithStack, prettyStack } from '../helpers/debug';\n\nvar dexieErrorNames = [\n 'Modify',\n 'Bulk',\n 'OpenFailed',\n 'VersionChange',\n 'Schema',\n 'Upgrade',\n 'InvalidTable',\n 'MissingAPI',\n 'NoSuchDatabase',\n 'InvalidArgument',\n 'SubTransaction',\n 'Unsupported',\n 'Internal',\n 'DatabaseClosed',\n 'PrematureCommit',\n 'ForeignAwait'\n];\n\nvar idbDomErrorNames = [\n 'Unknown',\n 'Constraint',\n 'Data',\n 'TransactionInactive',\n 'ReadOnly',\n 'Version',\n 'NotFound',\n 'InvalidState',\n 'InvalidAccess',\n 'Abort',\n 'Timeout',\n 'QuotaExceeded',\n 'Syntax',\n 'DataClone'\n];\n\nvar errorList = dexieErrorNames.concat(idbDomErrorNames);\n\nvar defaultTexts = {\n VersionChanged: \"Database version changed by other database connection\",\n DatabaseClosed: \"Database has been closed\",\n Abort: \"Transaction aborted\",\n TransactionInactive: \"Transaction has already completed or failed\",\n MissingAPI: \"IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb\"\n};\n\n//\n// DexieError - base class of all out exceptions.\n//\nexport function DexieError (name, msg) {\n // Reason we don't use ES6 classes is because:\n // 1. It bloats transpiled code and increases size of minified code.\n // 2. It doesn't give us much in this case.\n // 3. It would require sub classes to call super(), which\n // is not needed when deriving from Error.\n this._e = getErrorWithStack();\n this.name = name;\n this.message = msg;\n}\n\nderive(DexieError).from(Error).extend({\n stack: {\n get: function() {\n return this._stack ||\n (this._stack = this.name + \": \" + this.message + prettyStack(this._e, 2));\n }\n },\n toString: function(){ return this.name + \": \" + this.message; }\n});\n\nfunction getMultiErrorMessage (msg, failures) {\n return msg + \". Errors: \" + Object.keys(failures)\n .map(key=>failures[key].toString())\n .filter((v,i,s)=>s.indexOf(v) === i) // Only unique error strings\n .join('\\n');\n}\n\n//\n// ModifyError - thrown in Collection.modify()\n// Specific constructor because it contains members failures and failedKeys.\n//\nexport function ModifyError (msg, failures, successCount, failedKeys) {\n this._e = getErrorWithStack();\n this.failures = failures;\n this.failedKeys = failedKeys;\n this.successCount = successCount;\n this.message = getMultiErrorMessage(msg, failures);\n}\nderive(ModifyError).from(DexieError);\n\nexport function BulkError (msg, failures) {\n this._e = getErrorWithStack();\n this.name = \"BulkError\";\n this.failures = Object.keys(failures).map(pos => failures[pos]);\n this.failuresByPos = failures;\n this.message = getMultiErrorMessage(msg, failures);\n}\nderive(BulkError).from(DexieError);\n\n//\n//\n// Dynamically generate error names and exception classes based\n// on the names in errorList.\n//\n//\n\n// Map of {ErrorName -> ErrorName + \"Error\"}\nexport var errnames = errorList.reduce((obj,name)=>(obj[name]=name+\"Error\",obj),{});\n\n// Need an alias for DexieError because we're gonna create subclasses with the same name.\nconst BaseException = DexieError;\n// Map of {ErrorName -> exception constructor}\nexport var exceptions = errorList.reduce((obj,name)=>{\n // Let the name be \"DexieError\" because this name may\n // be shown in call stack and when debugging. DexieError is\n // the most true name because it derives from DexieError,\n // and we cannot change Function.name programatically without\n // dynamically create a Function object, which would be considered\n // 'eval-evil'.\n var fullName = name + \"Error\";\n function DexieError (msgOrInner, inner){\n this._e = getErrorWithStack();\n this.name = fullName;\n if (!msgOrInner) {\n this.message = defaultTexts[name] || fullName;\n this.inner = null;\n } else if (typeof msgOrInner === 'string') {\n this.message = `${msgOrInner}${!inner ? '' : '\\n ' + inner}`;\n this.inner = inner || null;\n } else if (typeof msgOrInner === 'object') {\n this.message = `${msgOrInner.name} ${msgOrInner.message}`;\n this.inner = msgOrInner;\n }\n }\n derive(DexieError).from(BaseException);\n obj[name]=DexieError;\n return obj;\n},{});\n\n// Use ECMASCRIPT standard exceptions where applicable:\nexceptions.Syntax = SyntaxError;\nexceptions.Type = TypeError;\nexceptions.Range = RangeError;\n\nexport var exceptionMap = idbDomErrorNames.reduce((obj, name)=>{\n obj[name + \"Error\"] = exceptions[name];\n return obj;\n}, {});\n\nexport function mapError (domError, message) {\n if (!domError || domError instanceof DexieError || domError instanceof TypeError || domError instanceof SyntaxError || !domError.name || !exceptionMap[domError.name])\n return domError;\n var rv = new exceptionMap[domError.name](message || domError.message, domError);\n if (\"stack\" in domError) {\n // Derive stack from inner exception if it has a stack\n setProp(rv, \"stack\", {get: function(){\n return this.inner.stack;\n }});\n }\n return rv;\n}\n\nexport var fullNameExceptions = errorList.reduce((obj, name)=>{\n if ([\"Syntax\",\"Type\",\"Range\"].indexOf(name) === -1)\n obj[name + \"Error\"] = exceptions[name];\n return obj;\n}, {});\n\nfullNameExceptions.ModifyError = ModifyError;\nfullNameExceptions.DexieError = DexieError;\nfullNameExceptions.BulkError = BulkError;\n","import {extend} from './utils';\n\nexport function nop() { }\nexport function mirror(val) { return val; }\nexport function pureFunctionChain(f1, f2) {\n // Enables chained events that takes ONE argument and returns it to the next function in chain.\n // This pattern is used in the hook(\"reading\") event.\n if (f1 == null || f1 === mirror) return f2;\n return function (val) {\n return f2(f1(val));\n };\n}\n\nexport function callBoth(on1, on2) {\n return function () {\n on1.apply(this, arguments);\n on2.apply(this, arguments);\n };\n}\n\nexport function hookCreatingChain(f1, f2) {\n // Enables chained events that takes several arguments and may modify first argument by making a modification and then returning the same instance.\n // This pattern is used in the hook(\"creating\") event.\n if (f1 === nop) return f2;\n return function () {\n var res = f1.apply(this, arguments);\n if (res !== undefined) arguments[0] = res;\n var onsuccess = this.onsuccess, // In case event listener has set this.onsuccess\n onerror = this.onerror; // In case event listener has set this.onerror\n this.onsuccess = null;\n this.onerror = null;\n var res2 = f2.apply(this, arguments);\n if (onsuccess) this.onsuccess = this.onsuccess ? callBoth(onsuccess, this.onsuccess) : onsuccess;\n if (onerror) this.onerror = this.onerror ? callBoth(onerror, this.onerror) : onerror;\n return res2 !== undefined ? res2 : res;\n };\n}\n\nexport function hookDeletingChain(f1, f2) {\n if (f1 === nop) return f2;\n return function () {\n f1.apply(this, arguments);\n var onsuccess = this.onsuccess, // In case event listener has set this.onsuccess\n onerror = this.onerror; // In case event listener has set this.onerror\n this.onsuccess = this.onerror = null;\n f2.apply(this, arguments);\n if (onsuccess) this.onsuccess = this.onsuccess ? callBoth(onsuccess, this.onsuccess) : onsuccess;\n if (onerror) this.onerror = this.onerror ? callBoth(onerror, this.onerror) : onerror;\n };\n}\n\nexport function hookUpdatingChain(f1, f2) {\n if (f1 === nop) return f2;\n return function (modifications) {\n var res = f1.apply(this, arguments);\n extend(modifications, res); // If f1 returns new modifications, extend caller's modifications with the result before calling next in chain.\n var onsuccess = this.onsuccess, // In case event listener has set this.onsuccess\n onerror = this.onerror; // In case event listener has set this.onerror\n this.onsuccess = null;\n this.onerror = null;\n var res2 = f2.apply(this, arguments);\n if (onsuccess) this.onsuccess = this.onsuccess ? callBoth(onsuccess, this.onsuccess) : onsuccess;\n if (onerror) this.onerror = this.onerror ? callBoth(onerror, this.onerror) : onerror;\n return res === undefined ?\n (res2 === undefined ? undefined : res2) :\n (extend(res, res2));\n };\n}\n\nexport function reverseStoppableEventChain(f1, f2) {\n if (f1 === nop) return f2;\n return function () {\n if (f2.apply(this, arguments) === false) return false;\n return f1.apply(this, arguments);\n };\n}\n\nexport function nonStoppableEventChain(f1, f2) {\n if (f1 === nop) return f2;\n return function () {\n f1.apply(this, arguments);\n f2.apply(this, arguments);\n };\n}\n\nexport function promisableChain(f1, f2) {\n if (f1 === nop) return f2;\n return function () {\n var res = f1.apply(this, arguments);\n if (res && typeof res.then === 'function') {\n var thiz = this,\n i = arguments.length,\n args = new Array(i);\n while (i--) args[i] = arguments[i];\n return res.then(function () {\n return f2.apply(thiz, args);\n });\n }\n return f2.apply(this, arguments);\n };\n}\n","/*\n * Copyright (c) 2014-2017 David Fahlander\n * Apache License Version 2.0, January 2004, http://www.apache.org/licenses/LICENSE-2.0\n */\nimport { _global } from '../globals/global';\nimport {tryCatch, props, setProp, _global,\n getPropertyDescriptor, getArrayOf, extend, getProto} from '../functions/utils';\nimport {nop, callBoth, mirror} from '../functions/chaining-functions';\nimport {debug, prettyStack, getErrorWithStack} from './debug';\nimport {exceptions} from '../errors';\n\n//\n// Promise and Zone (PSD) for Dexie library\n//\n// I started out writing this Promise class by copying promise-light (https://github.com/taylorhakes/promise-light) by\n// https://github.com/taylorhakes - an A+ and ECMASCRIPT 6 compliant Promise implementation.\n//\n// In previous versions this was fixed by not calling setTimeout when knowing that the resolve() or reject() came from another\n// tick. In Dexie v1.4.0, I've rewritten the Promise class entirely. Just some fragments of promise-light is left. I use\n// another strategy now that simplifies everything a lot: to always execute callbacks in a new micro-task, but have an own micro-task\n// engine that is indexedDB compliant across all browsers.\n// Promise class has also been optimized a lot with inspiration from bluebird - to avoid closures as much as possible.\n// Also with inspiration from bluebird, asyncronic stacks in debug mode.\n//\n// Specific non-standard features of this Promise class:\n// * Custom zone support (a.k.a. PSD) with ability to keep zones also when using native promises as well as\n// native async / await.\n// * Promise.follow() method built upon the custom zone engine, that allows user to track all promises created from current stack frame\n// and below + all promises that those promises creates or awaits.\n// * Detect any unhandled promise in a PSD-scope (PSD.onunhandled). \n//\n// David Fahlander, https://github.com/dfahlander\n//\n\n// Just a pointer that only this module knows about.\n// Used in Promise constructor to emulate a private constructor.\nvar INTERNAL = {};\n\n// Async stacks (long stacks) must not grow infinitely.\nconst\n LONG_STACKS_CLIP_LIMIT = 100,\n // When calling error.stack or promise.stack, limit the number of asyncronic stacks to print out. \n MAX_LONG_STACKS = 20,\n ZONE_ECHO_LIMIT = 100,\n [resolvedNativePromise, nativePromiseProto, resolvedGlobalPromise] = typeof Promise === 'undefined' ?\n [] :\n (()=>{\n let globalP = Promise.resolve();\n if (typeof crypto === 'undefined' || !crypto.subtle)\n return [globalP, getProto(globalP), globalP];\n // Generate a native promise (as window.Promise may have been patched)\n const nativeP = crypto.subtle.digest(\"SHA-512\", new Uint8Array([0]));\n return [\n nativeP,\n getProto(nativeP),\n globalP\n ];\n })(),\n nativePromiseThen = nativePromiseProto && nativePromiseProto.then;\n\nexport const NativePromise = resolvedNativePromise && resolvedNativePromise.constructor;\nconst patchGlobalPromise = !!resolvedGlobalPromise;\n\nvar stack_being_generated = false;\n\n/* The default function used only for the very first promise in a promise chain.\n As soon as then promise is resolved or rejected, all next tasks will be executed in micro ticks\n emulated in this module. For indexedDB compatibility, this means that every method needs to \n execute at least one promise before doing an indexedDB operation. Dexie will always call \n db.ready().then() for every operation to make sure the indexedDB event is started in an\n indexedDB-compatible emulated micro task loop.\n*/\nvar schedulePhysicalTick = resolvedGlobalPromise ?\n () => {resolvedGlobalPromise.then(physicalTick);}\n :\n _global.setImmediate ? \n // setImmediate supported. Those modern platforms also supports Function.bind().\n setImmediate.bind(null, physicalTick) :\n _global.MutationObserver ?\n // MutationObserver supported\n () => {\n var hiddenDiv = document.createElement(\"div\");\n (new MutationObserver(() => {\n physicalTick();\n hiddenDiv = null;\n })).observe(hiddenDiv, { attributes: true });\n hiddenDiv.setAttribute('i', '1');\n } :\n // No support for setImmediate or MutationObserver. No worry, setTimeout is only called\n // once time. Every tick that follows will be our emulated micro tick.\n // Could have uses setTimeout.bind(null, 0, physicalTick) if it wasnt for that FF13 and below has a bug \n ()=>{setTimeout(physicalTick,0);};\n\n// Configurable through Promise.scheduler.\n// Don't export because it would be unsafe to let unknown\n// code call it unless they do try..catch within their callback.\n// This function can be retrieved through getter of Promise.scheduler though,\n// but users must not do Promise.scheduler = myFuncThatThrowsException\nvar asap = function (callback, args) {\n microtickQueue.push([callback, args]);\n if (needsNewPhysicalTick) {\n schedulePhysicalTick();\n needsNewPhysicalTick = false;\n }\n};\n\nvar isOutsideMicroTick = true, // True when NOT in a virtual microTick.\n needsNewPhysicalTick = true, // True when a push to microtickQueue must also schedulePhysicalTick()\n unhandledErrors = [], // Rejected promises that has occured. Used for triggering 'unhandledrejection'.\n rejectingErrors = [], // Tracks if errors are being re-rejected during onRejected callback.\n currentFulfiller = null,\n rejectionMapper = mirror; // Remove in next major when removing error mapping of DOMErrors and DOMExceptions\n \nexport var globalPSD = {\n id: 'global',\n global: true,\n ref: 0,\n unhandleds: [],\n onunhandled: globalError,\n pgp: false,\n env: {},\n finalize: function () {\n this.unhandleds.forEach(uh => {\n try {\n globalError(uh[0], uh[1]);\n } catch (e) {}\n });\n }\n};\n\nexport var PSD = globalPSD;\n\nexport var microtickQueue = []; // Callbacks to call in this or next physical tick.\nexport var numScheduledCalls = 0; // Number of listener-calls left to do in this physical tick.\nexport var tickFinalizers = []; // Finalizers to call when there are no more async calls scheduled within current physical tick.\n\nexport default function DexiePromise(fn) {\n if (typeof this !== 'object') throw new TypeError('Promises must be constructed via new'); \n this._listeners = [];\n this.onuncatched = nop; // Deprecate in next major. Not needed. Better to use global error handler.\n \n // A library may set `promise._lib = true;` after promise is created to make resolve() or reject()\n // execute the microtask engine implicitely within the call to resolve() or reject().\n // To remain A+ compliant, a library must only set `_lib=true` if it can guarantee that the stack\n // only contains library code when calling resolve() or reject().\n // RULE OF THUMB: ONLY set _lib = true for promises explicitely resolving/rejecting directly from\n // global scope (event handler, timer etc)!\n this._lib = false;\n // Current async scope\n var psd = (this._PSD = PSD);\n\n if (debug) {\n this._stackHolder = getErrorWithStack();\n this._prev = null;\n this._numPrev = 0; // Number of previous promises (for long stacks)\n }\n \n if (typeof fn !== 'function') {\n if (fn !== INTERNAL) throw new TypeError('Not a function');\n // Private constructor (INTERNAL, state, value).\n // Used internally by Promise.resolve() and Promise.reject().\n this._state = arguments[1];\n this._value = arguments[2];\n if (this._state === false)\n handleRejection(this, this._value); // Map error, set stack and addPossiblyUnhandledError().\n return;\n }\n \n this._state = null; // null (=pending), false (=rejected) or true (=resolved)\n this._value = null; // error or result\n ++psd.ref; // Refcounting current scope\n executePromiseTask(this, fn);\n}\n\n// Prepare a property descriptor to put onto Promise.prototype.then\nconst thenProp = {\n get: function() {\n var psd = PSD, microTaskId = totalEchoes;\n\n function then (onFulfilled, onRejected) {\n var possibleAwait = !psd.global && (psd !== PSD || microTaskId !== totalEchoes);\n const cleanup = possibleAwait && !decrementExpectedAwaits();\n var rv = new DexiePromise((resolve, reject) => {\n propagateToListener(this, new Listener(\n nativeAwaitCompatibleWrap(onFulfilled, psd, possibleAwait, cleanup),\n nativeAwaitCompatibleWrap(onRejected, psd, possibleAwait, cleanup),\n resolve,\n reject,\n psd));\n });\n debug && linkToPreviousPromise(rv, this);\n return rv;\n }\n\n then.prototype = INTERNAL; // For idempotense, see setter below.\n\n return then;\n },\n // Be idempotent and allow another framework (such as zone.js or another instance of a Dexie.Promise module) to replace Promise.prototype.then\n // and when that framework wants to restore the original property, we must identify that and restore the original property descriptor.\n set: function (value) {\n setProp (this, 'then', value && value.prototype === INTERNAL ?\n thenProp : // Restore to original property descriptor.\n {\n get: function(){\n return value; // Getter returning provided value (behaves like value is just changed)\n },\n set: thenProp.set // Keep a setter that is prepared to restore original.\n }\n );\n }\n};\n\nprops(DexiePromise.prototype, {\n then: thenProp, // Defined above.\n _then: function (onFulfilled, onRejected) {\n // A little tinier version of then() that don't have to create a resulting promise.\n propagateToListener(this, new Listener(null, null, onFulfilled, onRejected, PSD)); \n },\n\n catch: function (onRejected) {\n if (arguments.length === 1) return this.then(null, onRejected);\n // First argument is the Error type to catch\n var type = arguments[0],\n handler = arguments[1];\n return typeof type === 'function' ? this.then(null, err =>\n // Catching errors by its constructor type (similar to java / c++ / c#)\n // Sample: promise.catch(TypeError, function (e) { ... });\n err instanceof type ? handler(err) : PromiseReject(err))\n : this.then(null, err =>\n // Catching errors by the error.name property. Makes sense for indexedDB where error type\n // is always DOMError but where e.name tells the actual error type.\n // Sample: promise.catch('ConstraintError', function (e) { ... });\n err && err.name === type ? handler(err) : PromiseReject(err));\n },\n\n finally: function (onFinally) {\n return this.then(value => {\n onFinally();\n return value;\n }, err => {\n onFinally();\n return PromiseReject(err);\n });\n },\n \n stack: {\n get: function() {\n if (this._stack) return this._stack;\n try {\n stack_being_generated = true;\n var stacks = getStack (this, [], MAX_LONG_STACKS);\n var stack = stacks.join(\"\\nFrom previous: \");\n if (this._state !== null) this._stack = stack; // Stack may be updated on reject.\n return stack;\n } finally {\n stack_being_generated = false;\n }\n }\n },\n\n timeout: function (ms, msg) {\n return ms < Infinity ?\n new DexiePromise((resolve, reject) => {\n var handle = setTimeout(() => reject(new exceptions.Timeout(msg)), ms);\n this.then(resolve, reject).finally(clearTimeout.bind(null, handle));\n }) : this;\n }\n});\n\nif (typeof Symbol !== 'undefined' && Symbol.toStringTag)\n setProp(DexiePromise.prototype, Symbol.toStringTag, 'Dexie.Promise');\n\n// Now that Promise.prototype is defined, we have all it takes to set globalPSD.env.\n// Environment globals snapshotted on leaving global zone\nglobalPSD.env = snapShot();\n\nfunction Listener(onFulfilled, onRejected, resolve, reject, zone) {\n this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null;\n this.onRejected = typeof onRejected === 'function' ? onRejected : null;\n this.resolve = resolve;\n this.reject = reject;\n this.psd = zone;\n}\n\n// Promise Static Properties\nprops (DexiePromise, {\n all: function () {\n var values = getArrayOf.apply(null, arguments) // Supports iterables, implicit arguments and array-like.\n .map(onPossibleParallellAsync); // Handle parallell async/awaits \n return new DexiePromise(function (resolve, reject) {\n if (values.length === 0) resolve([]);\n var remaining = values.length;\n values.forEach((a,i) => DexiePromise.resolve(a).then(x => {\n values[i] = x;\n if (!--remaining) resolve(values);\n }, reject));\n });\n },\n \n resolve: value => {\n if (value instanceof DexiePromise) return value;\n if (value && typeof value.then === 'function') return new DexiePromise((resolve, reject)=>{\n value.then(resolve, reject);\n });\n var rv = new DexiePromise(INTERNAL, true, value);\n linkToPreviousPromise(rv, currentFulfiller);\n return rv;\n },\n \n reject: PromiseReject,\n \n race: function () {\n var values = getArrayOf.apply(null, arguments).map(onPossibleParallellAsync);\n return new DexiePromise((resolve, reject) => {\n values.map(value => DexiePromise.resolve(value).then(resolve, reject));\n });\n },\n\n PSD: {\n get: ()=>PSD,\n set: value => PSD = value\n },\n\n totalEchoes: {get: ()=>totalEchoes},\n\n //task: {get: ()=>task},\n \n newPSD: newScope,\n \n usePSD: usePSD,\n \n scheduler: {\n get: () => asap,\n set: value => {asap = value}\n },\n \n rejectionMapper: {\n get: () => rejectionMapper,\n set: value => {rejectionMapper = value;} // Map reject failures\n },\n \n follow: (fn, zoneProps) => {\n return new DexiePromise((resolve, reject) => {\n return newScope((resolve, reject) => {\n var psd = PSD;\n psd.unhandleds = []; // For unhandled standard- or 3rd party Promises. Checked at psd.finalize()\n psd.onunhandled = reject; // Triggered directly on unhandled promises of this library.\n psd.finalize = callBoth(function () {\n // Unhandled standard or 3rd part promises are put in PSD.unhandleds and\n // examined upon scope completion while unhandled rejections in this Promise\n // will trigger directly through psd.onunhandled\n run_at_end_of_this_or_next_physical_tick(()=>{\n this.unhandleds.length === 0 ? resolve() : reject(this.unhandleds[0]);\n });\n }, psd.finalize);\n fn();\n }, zoneProps, resolve, reject);\n });\n }\n});\n\nif (NativePromise) {\n if (NativePromise.allSettled) setProp (DexiePromise, \"allSettled\", function() {\n const possiblePromises = getArrayOf.apply(null, arguments).map(onPossibleParallellAsync);\n return new DexiePromise(resolve => {\n if (possiblePromises.length === 0) resolve([]);\n let remaining = possiblePromises.length;\n const results = new Array(remaining);\n possiblePromises.forEach((p, i) => DexiePromise.resolve(p).then(\n value => results[i] = {status: \"fulfilled\", value},\n reason => results[i] = {status: \"rejected\", reason})\n .then(()=>--remaining || resolve(results)));\n });\n });\n if (NativePromise.any && typeof AggregateError !== 'undefined') setProp(DexiePromise, \"any\", function() {\n const possiblePromises = getArrayOf.apply(null, arguments).map(onPossibleParallellAsync);\n return new DexiePromise((resolve, reject) => {\n if (possiblePromises.length === 0) reject(new AggregateError([]));\n let remaining = possiblePromises.length;\n const failures = new Array(remaining);\n possiblePromises.forEach((p, i) => DexiePromise.resolve(p).then(\n value => resolve(value),\n failure => {\n failures[i] = failure;\n if (!--remaining) reject(new AggregateError(failures));\n }));\n });\n });\n}\n\n/**\n* Take a potentially misbehaving resolver function and make sure\n* onFulfilled and onRejected are only called once.\n*\n* Makes no guarantees about asynchrony.\n*/\nfunction executePromiseTask (promise, fn) {\n // Promise Resolution Procedure:\n // https://github.com/promises-aplus/promises-spec#the-promise-resolution-procedure\n try {\n fn(value => {\n if (promise._state !== null) return; // Already settled\n if (value === promise) throw new TypeError('A promise cannot be resolved with itself.');\n var shouldExecuteTick = promise._lib && beginMicroTickScope();\n if (value && typeof value.then === 'function') {\n executePromiseTask(promise, (resolve, reject) => {\n value instanceof DexiePromise ?\n value._then(resolve, reject) :\n value.then(resolve, reject);\n });\n } else {\n promise._state = true;\n promise._value = value;\n propagateAllListeners(promise);\n }\n if (shouldExecuteTick) endMicroTickScope();\n }, handleRejection.bind(null, promise)); // If Function.bind is not supported. Exception is handled in catch below\n } catch (ex) {\n handleRejection(promise, ex);\n }\n}\n\nfunction handleRejection (promise, reason) {\n rejectingErrors.push(reason);\n if (promise._state !== null) return;\n var shouldExecuteTick = promise._lib && beginMicroTickScope();\n reason = rejectionMapper(reason);\n promise._state = false;\n promise._value = reason;\n debug && reason !== null && typeof reason === 'object' && !reason._promise && tryCatch(()=>{\n var origProp = getPropertyDescriptor(reason, \"stack\"); \n reason._promise = promise; \n setProp(reason, \"stack\", {\n get: () =>\n stack_being_generated ?\n origProp && (origProp.get ?\n origProp.get.apply(reason) :\n origProp.value) :\n promise.stack\n });\n });\n // Add the failure to a list of possibly uncaught errors\n addPossiblyUnhandledError(promise);\n propagateAllListeners(promise);\n if (shouldExecuteTick) endMicroTickScope();\n}\n\nfunction propagateAllListeners (promise) {\n //debug && linkToPreviousPromise(promise);\n var listeners = promise._listeners;\n promise._listeners = [];\n for (var i = 0, len = listeners.length; i < len; ++i) {\n propagateToListener(promise, listeners[i]);\n }\n var psd = promise._PSD;\n --psd.ref || psd.finalize(); // if psd.ref reaches zero, call psd.finalize();\n if (numScheduledCalls === 0) {\n // If numScheduledCalls is 0, it means that our stack is not in a callback of a scheduled call,\n // and that no deferreds where listening to this rejection or success.\n // Since there is a risk that our stack can contain application code that may\n // do stuff after this code is finished that may generate new calls, we cannot\n // call finalizers here.\n ++numScheduledCalls;\n asap(()=>{\n if (--numScheduledCalls === 0) finalizePhysicalTick(); // Will detect unhandled errors\n }, []);\n }\n}\n\nfunction propagateToListener(promise, listener) {\n if (promise._state === null) {\n promise._listeners.push(listener);\n return;\n }\n\n var cb = promise._state ? listener.onFulfilled : listener.onRejected;\n if (cb === null) {\n // This Listener doesnt have a listener for the event being triggered (onFulfilled or onReject) so lets forward the event to any eventual listeners on the Promise instance returned by then() or catch()\n return (promise._state ? listener.resolve : listener.reject) (promise._value);\n }\n ++listener.psd.ref;\n ++numScheduledCalls;\n asap (callListener, [cb, promise, listener]);\n}\n\nfunction callListener (cb, promise, listener) {\n try {\n // Set static variable currentFulfiller to the promise that is being fullfilled,\n // so that we connect the chain of promises (for long stacks support)\n currentFulfiller = promise;\n \n // Call callback and resolve our listener with it's return value.\n var ret, value = promise._value;\n \n if (promise._state) {\n // cb is onResolved\n ret = cb (value);\n } else {\n // cb is onRejected\n if (rejectingErrors.length) rejectingErrors = [];\n ret = cb(value);\n if (rejectingErrors.indexOf(value) === -1)\n markErrorAsHandled(promise); // Callback didnt do Promise.reject(err) nor reject(err) onto another promise.\n }\n listener.resolve(ret);\n } catch (e) {\n // Exception thrown in callback. Reject our listener.\n listener.reject(e);\n } finally {\n // Restore env and currentFulfiller.\n currentFulfiller = null;\n if (--numScheduledCalls === 0) finalizePhysicalTick();\n --listener.psd.ref || listener.psd.finalize();\n }\n}\n\nfunction getStack (promise, stacks, limit) {\n if (stacks.length === limit) return stacks;\n var stack = \"\";\n if (promise._state === false) {\n var failure = promise._value,\n errorName,\n message;\n \n if (failure != null) {\n errorName = failure.name || \"Error\";\n message = failure.message || failure;\n stack = prettyStack(failure, 0);\n } else {\n errorName = failure; // If error is undefined or null, show that.\n message = \"\";\n }\n stacks.push(errorName + (message ? \": \" + message : \"\") + stack);\n }\n if (debug) {\n stack = prettyStack(promise._stackHolder, 2);\n if (stack && stacks.indexOf(stack) === -1) stacks.push(stack);\n if (promise._prev) getStack(promise._prev, stacks, limit);\n }\n return stacks;\n}\n\nfunction linkToPreviousPromise(promise, prev) {\n // Support long stacks by linking to previous completed promise.\n var numPrev = prev ? prev._numPrev + 1 : 0;\n if (numPrev < LONG_STACKS_CLIP_LIMIT) { // Prohibit infinite Promise loops to get an infinite long memory consuming \"tail\".\n promise._prev = prev;\n promise._numPrev = numPrev;\n }\n}\n\n/* The callback to schedule with setImmediate() or setTimeout().\n It runs a virtual microtick and executes any callback registered in microtickQueue.\n */\nfunction physicalTick() {\n beginMicroTickScope() && endMicroTickScope();\n}\n\nexport function beginMicroTickScope() {\n var wasRootExec = isOutsideMicroTick;\n isOutsideMicroTick = false;\n needsNewPhysicalTick = false;\n return wasRootExec;\n}\n\n/* Executes micro-ticks without doing try..catch.\n This can be possible because we only use this internally and\n the registered functions are exception-safe (they do try..catch\n internally before calling any external method). If registering\n functions in the microtickQueue that are not exception-safe, this\n would destroy the framework and make it instable. So we don't export\n our asap method.\n*/\nexport function endMicroTickScope() {\n var callbacks, i, l;\n do {\n while (microtickQueue.length > 0) {\n callbacks = microtickQueue;\n microtickQueue = [];\n l = callbacks.length;\n for (i = 0; i < l; ++i) {\n var item = callbacks[i];\n item[0].apply(null, item[1]);\n }\n }\n } while (microtickQueue.length > 0);\n isOutsideMicroTick = true;\n needsNewPhysicalTick = true;\n}\n\nfunction finalizePhysicalTick() {\n var unhandledErrs = unhandledErrors;\n unhandledErrors = [];\n unhandledErrs.forEach(p => {\n p._PSD.onunhandled.call(null, p._value, p);\n });\n var finalizers = tickFinalizers.slice(0); // Clone first because finalizer may remove itself from list.\n var i = finalizers.length;\n while (i) finalizers[--i](); \n}\n\nfunction run_at_end_of_this_or_next_physical_tick (fn) {\n function finalizer() {\n fn();\n tickFinalizers.splice(tickFinalizers.indexOf(finalizer), 1);\n }\n tickFinalizers.push(finalizer);\n ++numScheduledCalls;\n asap(()=>{\n if (--numScheduledCalls === 0) finalizePhysicalTick();\n }, []);\n}\n\nfunction addPossiblyUnhandledError(promise) {\n // Only add to unhandledErrors if not already there. The first one to add to this list\n // will be upon the first rejection so that the root cause (first promise in the\n // rejection chain) is the one listed.\n if (!unhandledErrors.some(p => p._value === promise._value))\n unhandledErrors.push(promise);\n}\n\nfunction markErrorAsHandled(promise) {\n // Called when a reject handled is actually being called.\n // Search in unhandledErrors for any promise whos _value is this promise_value (list\n // contains only rejected promises, and only one item per error)\n var i = unhandledErrors.length;\n while (i) if (unhandledErrors[--i]._value === promise._value) {\n // Found a promise that failed with this same error object pointer,\n // Remove that since there is a listener that actually takes care of it.\n unhandledErrors.splice(i, 1);\n return;\n }\n}\n\nfunction PromiseReject (reason) {\n return new DexiePromise(INTERNAL, false, reason);\n}\n\nexport function wrap (fn, errorCatcher) {\n var psd = PSD;\n return function() {\n var wasRootExec = beginMicroTickScope(),\n outerScope = PSD;\n\n try {\n switchToZone(psd, true);\n return fn.apply(this, arguments);\n } catch (e) {\n errorCatcher && errorCatcher(e);\n } finally {\n switchToZone(outerScope, false);\n if (wasRootExec) endMicroTickScope();\n }\n };\n}\n\n\n//\n// variables used for native await support\n//\nconst task = { awaits: 0, echoes: 0, id: 0}; // The ongoing macro-task when using zone-echoing.\nvar taskCounter = 0; // ID counter for macro tasks.\nvar zoneStack = []; // Stack of left zones to restore asynchronically.\nvar zoneEchoes = 0; // zoneEchoes is a must in order to persist zones between native await expressions.\nvar totalEchoes = 0; // ID counter for micro-tasks. Used to detect possible native await in our Promise.prototype.then.\n\n\nvar zone_id_counter = 0;\nexport function newScope (fn, props, a1, a2) {\n var parent = PSD,\n psd = Object.create(parent);\n psd.parent = parent;\n psd.ref = 0;\n psd.global = false;\n psd.id = ++zone_id_counter;\n // Prepare for promise patching (done in usePSD):\n var globalEnv = globalPSD.env;\n psd.env = patchGlobalPromise ? {\n Promise: DexiePromise, // Changing window.Promise could be omitted for Chrome and Edge, where IDB+Promise plays well!\n PromiseProp: {value: DexiePromise, configurable: true, writable: true},\n all: DexiePromise.all,\n race: DexiePromise.race,\n allSettled: DexiePromise.allSettled,\n any: DexiePromise.any,\n resolve: DexiePromise.resolve,\n reject: DexiePromise.reject,\n nthen: getPatchedPromiseThen (globalEnv.nthen, psd), // native then\n gthen: getPatchedPromiseThen (globalEnv.gthen, psd) // global then\n } : {};\n if (props) extend(psd, props);\n \n // unhandleds and onunhandled should not be specifically set here.\n // Leave them on parent prototype.\n // unhandleds.push(err) will push to parent's prototype\n // onunhandled() will call parents onunhandled (with this scope's this-pointer though!)\n ++parent.ref;\n psd.finalize = function () {\n --this.parent.ref || this.parent.finalize();\n }\n var rv = usePSD (psd, fn, a1, a2);\n if (psd.ref === 0) psd.finalize();\n return rv;\n}\n\n// Function to call if scopeFunc returns NativePromise\n// Also for each NativePromise in the arguments to Promise.all()\nexport function incrementExpectedAwaits() {\n if (!task.id) task.id = ++taskCounter;\n ++task.awaits;\n task.echoes += ZONE_ECHO_LIMIT;\n return task.id;\n}\n\n// Function to call when 'then' calls back on a native promise where onAwaitExpected() had been called.\n// Also call this when a native await calls then method on a promise. In that case, don't supply\n// sourceTaskId because we already know it refers to current task.\nexport function decrementExpectedAwaits() {\n if (!task.awaits) return false;\n if (--task.awaits === 0) task.id = 0;\n task.echoes = task.awaits * ZONE_ECHO_LIMIT; // Will reset echoes to 0 if awaits is 0.\n return true;\n}\n\nif ((''+nativePromiseThen).indexOf('[native code]') === -1) {\n // If the native promise' prototype is patched, we cannot rely on zone echoing.\n // Disable that here:\n incrementExpectedAwaits = decrementExpectedAwaits = nop;\n}\n\n// Call from Promise.all() and Promise.race()\nexport function onPossibleParallellAsync (possiblePromise) {\n if (task.echoes && possiblePromise && possiblePromise.constructor === NativePromise) {\n incrementExpectedAwaits(); \n return possiblePromise.then(x => {\n decrementExpectedAwaits();\n return x;\n }, e => {\n decrementExpectedAwaits();\n return rejection(e);\n });\n }\n return possiblePromise;\n}\n\nfunction zoneEnterEcho(targetZone) {\n ++totalEchoes;\n //console.log(\"Total echoes \", totalEchoes);\n if (!task.echoes || --task.echoes === 0) {\n task.echoes = task.id = 0; // Cancel zone echoing.\n }\n\n zoneStack.push(PSD);\n switchToZone(targetZone, true);\n}\n\nfunction zoneLeaveEcho() {\n var zone = zoneStack[zoneStack.length-1];\n zoneStack.pop();\n switchToZone(zone, false);\n}\n\nfunction switchToZone (targetZone, bEnteringZone) {\n var currentZone = PSD;\n if (bEnteringZone ? task.echoes && (!zoneEchoes++ || targetZone !== PSD) : zoneEchoes && (!--zoneEchoes || targetZone !== PSD)) {\n // Enter or leave zone asynchronically as well, so that tasks initiated during current tick\n // will be surrounded by the zone when they are invoked.\n enqueueNativeMicroTask(bEnteringZone ? zoneEnterEcho.bind(null, targetZone) : zoneLeaveEcho);\n }\n if (targetZone === PSD) return;\n\n PSD = targetZone; // The actual zone switch occurs at this line.\n\n // Snapshot on every leave from global zone.\n if (currentZone === globalPSD) globalPSD.env = snapShot();\n\n if (patchGlobalPromise) {\n // Let's patch the global and native Promises (may be same or may be different)\n var GlobalPromise = globalPSD.env.Promise;\n // Swich environments (may be PSD-zone or the global zone. Both apply.)\n var targetEnv = targetZone.env;\n\n // Change Promise.prototype.then for native and global Promise (they MAY differ on polyfilled environments, but both can be accessed)\n // Must be done on each zone change because the patched method contains targetZone in its closure.\n nativePromiseProto.then = targetEnv.nthen;\n GlobalPromise.prototype.then = targetEnv.gthen;\n\n if (currentZone.global || targetZone.global) {\n // Leaving or entering global zone. It's time to patch / restore global Promise.\n\n // Set this Promise to window.Promise so that transiled async functions will work on Firefox, Safari and IE, as well as with Zonejs and angular.\n Object.defineProperty(_global, 'Promise', targetEnv.PromiseProp);\n\n // Support Promise.all() etc to work indexedDB-safe also when people are including es6-promise as a module (they might\n // not be accessing global.Promise but a local reference to it)\n GlobalPromise.all = targetEnv.all;\n GlobalPromise.race = targetEnv.race;\n GlobalPromise.resolve = targetEnv.resolve;\n GlobalPromise.reject = targetEnv.reject;\n if (targetEnv.allSettled) GlobalPromise.allSettled = targetEnv.allSettled;\n if (targetEnv.any) GlobalPromise.any = targetEnv.any;\n }\n }\n}\n\nfunction snapShot () {\n var GlobalPromise = _global.Promise;\n return patchGlobalPromise ? {\n Promise: GlobalPromise,\n PromiseProp: Object.getOwnPropertyDescriptor(_global, \"Promise\"),\n all: GlobalPromise.all,\n race: GlobalPromise.race,\n allSettled: GlobalPromise.allSettled,\n any: GlobalPromise.any,\n resolve: GlobalPromise.resolve,\n reject: GlobalPromise.reject,\n nthen: nativePromiseProto.then,\n gthen: GlobalPromise.prototype.then\n } : {};\n}\n\nexport function usePSD (psd, fn, a1, a2, a3) {\n var outerScope = PSD;\n try {\n switchToZone(psd, true);\n return fn(a1, a2, a3);\n } finally {\n switchToZone(outerScope, false);\n }\n}\n\nfunction enqueueNativeMicroTask (job) {\n //\n // Precondition: nativePromiseThen !== undefined\n //\n nativePromiseThen.call(resolvedNativePromise, job);\n}\n\nfunction nativeAwaitCompatibleWrap(fn, zone, possibleAwait, cleanup) {\n return typeof fn !== 'function' ? fn : function () {\n var outerZone = PSD;\n if (possibleAwait) incrementExpectedAwaits();\n switchToZone(zone, true);\n try {\n return fn.apply(this, arguments);\n } finally {\n switchToZone(outerZone, false);\n if (cleanup) enqueueNativeMicroTask(decrementExpectedAwaits);\n }\n };\n}\n\nfunction getPatchedPromiseThen (origThen, zone) {\n return function (onResolved, onRejected) {\n return origThen.call(this,\n nativeAwaitCompatibleWrap(onResolved, zone),\n nativeAwaitCompatibleWrap(onRejected, zone));\n };\n}\n\nconst UNHANDLEDREJECTION = \"unhandledrejection\";\n\nfunction globalError(err, promise) {\n var rv;\n try {\n rv = promise.onuncatched(err);\n } catch (e) {}\n if (rv !== false) try {\n var event, eventData = {promise: promise, reason: err};\n if (_global.document && document.createEvent) {\n event = document.createEvent('Event');\n event.initEvent(UNHANDLEDREJECTION, true, true);\n extend(event, eventData);\n } else if (_global.CustomEvent) {\n event = new CustomEvent(UNHANDLEDREJECTION, {detail: eventData});\n extend(event, eventData);\n }\n if (event && _global.dispatchEvent) {\n dispatchEvent(event);\n if (!_global.PromiseRejectionEvent && _global.onunhandledrejection)\n // No native support for PromiseRejectionEvent but user has set window.onunhandledrejection. Manually call it.\n try {_global.onunhandledrejection(event);} catch (_) {}\n }\n if (debug && event && !event.defaultPrevented) {\n console.warn(`Unhandled rejection: ${err.stack || err}`);\n }\n } catch (e) {}\n}\n\nexport var rejection = DexiePromise.reject;\n\nexport {DexiePromise};\n","import { PSD, rejection, newScope } from \"../helpers/promise\";\nimport { DexieOptions } from \"../public/types/dexie-constructor\";\nimport { errnames, exceptions } from \"../errors\";\nimport { nop } from \"./chaining-functions\";\nimport { Transaction } from \"../classes/transaction\";\nimport { Dexie } from '../classes/dexie';\n\n/* Generate a temporary transaction when db operations are done outside a transaction scope.\n*/\nexport function tempTransaction (\n db: Dexie,\n mode: IDBTransactionMode,\n storeNames: string[],\n fn: (resolve, reject, trans: Transaction) => any)\n // Last argument is \"writeLocked\". But this doesnt apply to oneshot direct db operations, so we ignore it.\n{\n if (!db.idbdb || (!db._state.openComplete && (!PSD.letThrough && !db._vip))) {\n if (db._state.openComplete) {\n // db.idbdb is falsy but openComplete is true. Must have been an exception durin open.\n // Don't wait for openComplete as it would lead to infinite loop.\n return rejection(new exceptions.DatabaseClosed(db._state.dbOpenError));\n }\n if (!db._state.isBeingOpened) {\n if (!db._options.autoOpen)\n return rejection(new exceptions.DatabaseClosed());\n db.open().catch(nop); // Open in background. If if fails, it will be catched by the final promise anyway.\n }\n return db._state.dbReadyPromise.then(() => tempTransaction(db, mode, storeNames, fn));\n } else {\n var trans = db._createTransaction(mode, storeNames, db._dbSchema);\n try {\n trans.create();\n db._state.PR1398_maxLoop = 3;\n } catch (ex) {\n if (ex.name === errnames.InvalidState && db.isOpen() && --db._state.PR1398_maxLoop > 0) {\n console.warn('Dexie: Need to reopen db');\n db._close();\n return db.open().then(()=>tempTransaction(db, mode, storeNames, fn));\n }\n return rejection(ex);\n }\n return trans._promise(mode, (resolve, reject) => {\n return newScope(() => { // OPTIMIZATION POSSIBLE? newScope() not needed because it's already done in _promise.\n PSD.trans = trans;\n return fn(resolve, reject, trans);\n });\n }).then(result => {\n // Instead of resolving value directly, wait with resolving it until transaction has completed.\n // Otherwise the data would not be in the DB if requesting it in the then() operation.\n // Specifically, to ensure that the following expression will work:\n //\n // db.friends.put({name: \"Arne\"}).then(function () {\n // db.friends.where(\"name\").equals(\"Arne\").count(function(count) {\n // assert (count === 1);\n // });\n // });\n //\n return trans._completion.then(() => result);\n });/*.catch(err => { // Don't do this as of now. If would affect bulk- and modify methods in a way that could be more intuitive. But wait! Maybe change in next major.\n trans._reject(err);\n return rejection(err);\n });*/\n }\n}\n","import { Dexie } from \"../classes/dexie\";\n\nexport const DEXIE_VERSION = '{version}'; // Replaced by build-script.\nexport const maxString = String.fromCharCode(65535);\nexport const minKey = -Infinity; // minKey can be constant. maxKey must be a prop of Dexie (_maxKey)\nexport const INVALID_KEY_ARGUMENT =\n \"Invalid key provided. Keys must be of type string, number, Date or Array.\";\nexport const STRING_EXPECTED = \"String expected.\";\nexport const connections: Dexie[] = [];\nexport const isIEOrEdge =\n typeof navigator !== 'undefined' && /(MSIE|Trident|Edge)/.test(navigator.userAgent);\nexport const hasIEDeleteObjectStoreBug = isIEOrEdge;\nexport const hangsOnDeleteLargeKeyRange = isIEOrEdge;\nexport const dexieStackFrameFilter = frame => !/(dexie\\.js|dexie\\.min\\.js)/.test(frame);\nexport const DBNAMES_DB = '__dbnames';\nexport const READONLY = 'readonly';\nexport const READWRITE = 'readwrite';\n","export function combine(filter1, filter2) {\n return filter1 ?\n filter2 ?\n function () { return filter1.apply(this, arguments) && filter2.apply(this, arguments); } :\n filter1 :\n filter2;\n}\n","import { DBCoreKeyRange, DBCoreRangeType } from '../public/types/dbcore';\n\nexport const AnyRange: DBCoreKeyRange = {\n type: DBCoreRangeType.Any,\n lower: -Infinity,\n lowerOpen: false,\n upper: [[]],\n upperOpen: false\n}\n\nexport const NeverRange: DBCoreKeyRange = {\n type: DBCoreRangeType.Never,\n lower: -Infinity,\n lowerOpen: true,\n upper: -Infinity,\n upperOpen: true\n}\n","import { deepClone, delByKeyPath, getByKeyPath } from './utils';\n\n// This workaround is needed since obj could be a custom-class instance with an\n// uninitialized keyPath. See the following comment for more context:\n// https://github.com/dfahlander/Dexie.js/issues/1280#issuecomment-823557881\nexport function workaroundForUndefinedPrimKey(keyPath: string | ArrayLike) {\n // Workaround only needed for plain non-dotted keyPaths\n return typeof keyPath === \"string\" && !/\\./.test(keyPath) \n ? (obj: object) => {\n if (obj[keyPath] === undefined && (keyPath in obj)) {\n // property exists but is undefined. This will not be liked by Indexeddb.\n // Need to remove the property before adding it but we need to clone it before\n // doing that to not be intrusive.\n obj = deepClone(obj);\n delete obj[keyPath];\n }\n return obj;\n }\n : (obj: object) => obj;\n}","import { BulkError, exceptions } from '../../errors';\nimport { Table as ITable } from '../../public/types/table';\nimport { TableSchema } from '../../public/types/table-schema';\nimport { TableHooks } from '../../public/types/table-hooks';\nimport { DexiePromise as Promise, PSD, newScope, wrap, rejection, beginMicroTickScope, endMicroTickScope } from '../../helpers/promise';\nimport { Transaction } from '../transaction';\nimport { Dexie } from '../dexie';\nimport { tempTransaction } from '../../functions/temp-transaction';\nimport { Collection } from '../collection';\nimport { isArray, keys, getByKeyPath, hasOwn, setByKeyPath, deepClone, tryCatch, arrayToObject, extend } from '../../functions/utils';\nimport { maxString } from '../../globals/constants';\nimport { combine } from '../../functions/combine';\nimport { PromiseExtended } from \"../../public/types/promise-extended\";\nimport { IndexableType } from '../../public/types/indexable-type';\nimport { debug } from '../../helpers/debug';\nimport { DBCoreTable } from '../../public/types/dbcore';\nimport { AnyRange } from '../../dbcore/keyrange';\nimport { workaroundForUndefinedPrimKey } from '../../functions/workaround-undefined-primkey';\n\n/** class Table\n * \n * https://dexie.org/docs/Table/Table\n */\nexport class Table implements ITable {\n db: Dexie;\n _tx?: Transaction;\n name: string;\n schema: TableSchema;\n hook: TableHooks;\n core: DBCoreTable;\n\n _trans(\n mode: IDBTransactionMode,\n fn: (idbtrans: IDBTransaction, dxTrans: Transaction) => PromiseLike | void,\n writeLocked?: boolean | string) : PromiseExtended\n {\n const trans: Transaction = this._tx || PSD.trans;\n const tableName = this.name;\n \n function checkTableInTransaction(resolve, reject, trans: Transaction) {\n if (!trans.schema[tableName])\n throw new exceptions.NotFound(\"Table \" + tableName + \" not part of transaction\");\n return fn(trans.idbtrans, trans);\n }\n // Surround all in a microtick scope.\n // Reason: Browsers (modern Safari + older others)\n // still as of 2018-10-10 has problems keeping a transaction\n // alive between micro ticks. Safari because if transaction\n // is created but not used in same microtick, it will go\n // away. That specific issue could be solved in DBCore\n // by opening the transaction just before using it instead.\n // But older Firefoxes and IE11 (with Promise polyfills)\n // will still have probs.\n // The beginMicrotickScope()/endMicrotickScope() works\n // in cooperation with Dexie.Promise to orchestrate\n // the micro-ticks in endMicrotickScope() rather than\n // in native engine.\n const wasRootExec = beginMicroTickScope();\n try {\n return trans && trans.db === this.db ?\n trans === PSD.trans ?\n trans._promise(mode, checkTableInTransaction, writeLocked) :\n newScope(() => trans._promise(mode, checkTableInTransaction, writeLocked), { trans: trans, transless: PSD.transless || PSD }) :\n tempTransaction(this.db, mode, [this.name], checkTableInTransaction);\n } finally {\n if (wasRootExec) endMicroTickScope();\n }\n }\n\n /** Table.get()\n * \n * https://dexie.org/docs/Table/Table.get()\n * \n **/\n get(keyOrCrit, cb?) {\n if (keyOrCrit && keyOrCrit.constructor === Object)\n return this.where(keyOrCrit as { [key: string]: IndexableType }).first(cb);\n\n return this._trans('readonly', (trans) => {\n return this.core.get({trans, key: keyOrCrit})\n .then(res => this.hook.reading.fire(res));\n }).then(cb);\n }\n\n /** Table.where()\n * \n * https://dexie.org/docs/Table/Table.where()\n * \n **/\n where(indexOrCrit: string | string[] | { [key: string]: IndexableType }) {\n if (typeof indexOrCrit === 'string')\n return new this.db.WhereClause(this, indexOrCrit);\n if (isArray(indexOrCrit))\n return new this.db.WhereClause(this, `[${indexOrCrit.join('+')}]`);\n // indexOrCrit is an object map of {[keyPath]:value} \n const keyPaths = keys(indexOrCrit);\n if (keyPaths.length === 1)\n // Only one critera. This was the easy case:\n return this\n .where(keyPaths[0])\n .equals(indexOrCrit[keyPaths[0]]);\n\n // Multiple criterias.\n // Let's try finding a compound index that matches all keyPaths in\n // arbritary order:\n const compoundIndex = this.schema.indexes.concat(this.schema.primKey).filter(ix =>\n ix.compound &&\n keyPaths.every(keyPath => ix.keyPath.indexOf(keyPath) >= 0) &&\n (ix.keyPath as string[]).every(keyPath => keyPaths.indexOf(keyPath) >= 0))[0];\n\n if (compoundIndex && this.db._maxKey !== maxString)\n // Cool! We found such compound index\n // and this browser supports compound indexes (maxKey !== maxString)!\n return this\n .where(compoundIndex.name)\n .equals((compoundIndex.keyPath as string[]).map(kp => indexOrCrit[kp]));\n\n if (!compoundIndex && debug) console.warn(\n `The query ${JSON.stringify(indexOrCrit)} on ${this.name} would benefit of a ` +\n `compound index [${keyPaths.join('+')}]`);\n\n // Ok, now let's fallback to finding at least one matching index\n // and filter the rest.\n const { idxByName } = this.schema;\n const idb = this.db._deps.indexedDB;\n\n function equals (a, b) {\n try {\n return idb.cmp(a,b) === 0; // Works with all indexable types including binary keys.\n } catch (e) {\n return false;\n }\n }\n\n const [idx, filterFunction] = keyPaths.reduce(([prevIndex, prevFilterFn], keyPath) => {\n const index = idxByName[keyPath];\n const value = indexOrCrit[keyPath];\n return [\n prevIndex || index, // idx::=Pick index of first matching keypath\n prevIndex || !index ? // filter::=null if not needed, otherwise combine function filter\n combine(\n prevFilterFn,\n index && index.multi ?\n x => {\n const prop = getByKeyPath(x, keyPath);\n return isArray(prop) && prop.some(item => equals(value, item));\n } : x => equals(value, getByKeyPath(x, keyPath)))\n : prevFilterFn\n ];\n }, [null, null]);\n\n return idx ?\n this.where(idx.name).equals(indexOrCrit[idx.keyPath])\n .filter(filterFunction) :\n compoundIndex ?\n this.filter(filterFunction) : // Has compound but browser bad. Allow filter.\n this.where(keyPaths).equals(''); // No index at all. Fail lazily with \"[a+b+c] is not indexed\"\n }\n\n /** Table.filter()\n * \n * https://dexie.org/docs/Table/Table.filter()\n * \n **/\n filter(filterFunction: (obj: any) => boolean) {\n return this.toCollection().and(filterFunction);\n }\n\n /** Table.count()\n * \n * https://dexie.org/docs/Table/Table.count()\n * \n **/\n count(thenShortcut?: any) {\n return this.toCollection().count(thenShortcut);\n }\n\n /** Table.offset()\n * \n * https://dexie.org/docs/Table/Table.offset()\n * \n **/\n offset(offset: number) {\n return this.toCollection().offset(offset);\n }\n\n /** Table.limit()\n * \n * https://dexie.org/docs/Table/Table.limit()\n * \n **/\n limit(numRows: number) {\n return this.toCollection().limit(numRows);\n }\n\n /** Table.each()\n * \n * https://dexie.org/docs/Table/Table.each()\n * \n **/\n each(callback: (obj: any, cursor: { key: IndexableType, primaryKey: IndexableType }) => any) {\n return this.toCollection().each(callback);\n }\n\n /** Table.toArray()\n * \n * https://dexie.org/docs/Table/Table.toArray()\n * \n **/\n toArray(thenShortcut?: any) {\n return this.toCollection().toArray(thenShortcut);\n }\n\n /** Table.toCollection()\n * \n * https://dexie.org/docs/Table/Table.toCollection()\n * \n **/\n toCollection() {\n return new this.db.Collection(new this.db.WhereClause(this));\n }\n\n /** Table.orderBy()\n * \n * https://dexie.org/docs/Table/Table.orderBy()\n * \n **/\n orderBy(index: string | string[]) {\n return new this.db.Collection(\n new this.db.WhereClause(this, isArray(index) ?\n `[${index.join('+')}]` :\n index));\n }\n\n /** Table.reverse()\n * \n * https://dexie.org/docs/Table/Table.reverse()\n * \n **/\n reverse(): Collection {\n return this.toCollection().reverse();\n }\n\n /** Table.mapToClass()\n * \n * https://dexie.org/docs/Table/Table.mapToClass()\n * \n **/\n mapToClass(constructor: Function) {\n this.schema.mappedClass = constructor;\n // Now, subscribe to the when(\"reading\") event to make all objects that come out from this table inherit from given class\n // no matter which method to use for reading (Table.get() or Table.where(...)... )\n const readHook = obj => {\n if (!obj) return obj; // No valid object. (Value is null). Return as is.\n // Create a new object that derives from constructor:\n const res = Object.create(constructor.prototype);\n // Clone members:\n for (var m in obj) if (hasOwn(obj, m)) try { res[m] = obj[m]; } catch (_) { }\n return res;\n };\n\n if (this.schema.readHook) {\n this.hook.reading.unsubscribe(this.schema.readHook);\n }\n this.schema.readHook = readHook;\n this.hook(\"reading\", readHook);\n return constructor;\n }\n\n /** @deprecated */\n defineClass() {\n function Class (content){\n extend(this, content);\n };\n return this.mapToClass(Class);\n }\n\n /** Table.add()\n * \n * https://dexie.org/docs/Table/Table.add()\n * \n **/\n add(obj, key?: IndexableType): PromiseExtended {\n const {auto, keyPath} = this.schema.primKey;\n let objToAdd = obj;\n if (keyPath && auto) {\n objToAdd = workaroundForUndefinedPrimKey(keyPath)(obj);\n }\n return this._trans('readwrite', trans => {\n return this.core.mutate({trans, type: 'add', keys: key != null ? [key] : null, values: [objToAdd]});\n }).then(res => res.numFailures ? Promise.reject(res.failures[0]) : res.lastResult)\n .then(lastResult => {\n if (keyPath) {\n // This part should be here for backward compatibility.\n // If ever feeling too bad about this, please wait to a new major before removing it,\n // and document the change thoroughly.\n try{setByKeyPath(obj, keyPath, lastResult);}catch(_){};\n }\n return lastResult;\n });\n }\n\n /** Table.update()\n * \n * https://dexie.org/docs/Table/Table.update()\n * \n **/\n update(keyOrObject, modifications: { [keyPath: string]: any; } | ((obj: any, ctx:{value: any, primKey: IndexableType}) => void | boolean)): PromiseExtended {\n if (typeof keyOrObject === 'object' && !isArray(keyOrObject)) {\n const key = getByKeyPath(keyOrObject, this.schema.primKey.keyPath);\n if (key === undefined) return rejection(new exceptions.InvalidArgument(\n \"Given object does not contain its primary key\"));\n // object to modify. Also modify given object with the modifications:\n // This part should be here for backward compatibility.\n // If ever feeling too bad about mutating given object, please wait to a new major before removing it,\n // and document the change thoroughly.\n try {\n if (typeof modifications !== \"function\") {\n keys(modifications).forEach(keyPath => {\n setByKeyPath(keyOrObject, keyPath, modifications[keyPath]);\n });\n } else {\n // Now since we support function argument, we should have a similar behavior here as well\n // (as long as we do this mutability stuff on the given object)\n modifications(keyOrObject, {value: keyOrObject, primKey: key});\n }\n } catch {\n // Maybe given object was frozen.\n // This part is not essential. Just move on as nothing happened...\n }\n return this.where(\":id\").equals(key).modify(modifications);\n } else {\n // key to modify\n return this.where(\":id\").equals(keyOrObject).modify(modifications);\n }\n }\n\n /** Table.put()\n * \n * https://dexie.org/docs/Table/Table.put()\n * \n **/\n put(obj, key?: IndexableType): PromiseExtended {\n const {auto, keyPath} = this.schema.primKey;\n let objToAdd = obj;\n if (keyPath && auto) {\n objToAdd = workaroundForUndefinedPrimKey(keyPath)(obj);\n }\n return this._trans(\n 'readwrite',\n trans => this.core.mutate({trans, type: 'put', values: [objToAdd], keys: key != null ? [key] : null}))\n .then(res => res.numFailures ? Promise.reject(res.failures[0]) : res.lastResult)\n .then(lastResult => {\n if (keyPath) {\n // This part should be here for backward compatibility.\n // If ever feeling too bad about this, please wait to a new major before removing it,\n // and document the change thoroughly.\n try{setByKeyPath(obj, keyPath, lastResult);}catch(_){};\n }\n return lastResult;\n });\n }\n\n /** Table.delete()\n * \n * https://dexie.org/docs/Table/Table.delete()\n * \n **/\n delete(key: IndexableType): PromiseExtended {\n return this._trans('readwrite',\n trans => this.core.mutate({trans, type: 'delete', keys: [key]}))\n .then(res => res.numFailures ? Promise.reject(res.failures[0]) : undefined);\n }\n\n /** Table.clear()\n * \n * https://dexie.org/docs/Table/Table.clear()\n * \n **/\n clear() {\n return this._trans('readwrite',\n trans => this.core.mutate({trans, type: 'deleteRange', range: AnyRange}))\n .then(res => res.numFailures ? Promise.reject(res.failures[0]) : undefined);\n }\n\n /** Table.bulkGet()\n * \n * https://dexie.org/docs/Table/Table.bulkGet()\n * \n * @param keys \n */\n bulkGet(keys: IndexableType[]) {\n return this._trans('readonly', trans => {\n return this.core.getMany({\n keys,\n trans\n }).then(result => result.map(res => this.hook.reading.fire(res)));\n });\n }\n\n /** Table.bulkAdd()\n * \n * https://dexie.org/docs/Table/Table.bulkAdd()\n * \n **/\n bulkAdd(\n objects: any[],\n keysOrOptions?: ReadonlyArray | { allKeys?: boolean },\n options?: { allKeys?: boolean }\n ) { \n const keys = Array.isArray(keysOrOptions) ? keysOrOptions : undefined;\n options = options || (keys ? undefined : keysOrOptions as { allKeys?: boolean });\n const wantResults = options ? options.allKeys : undefined;\n\n return this._trans('readwrite', trans => {\n const {auto, keyPath} = this.schema.primKey;\n if (keyPath && keys)\n throw new exceptions.InvalidArgument(\"bulkAdd(): keys argument invalid on tables with inbound keys\");\n if (keys && keys.length !== objects.length)\n throw new exceptions.InvalidArgument(\"Arguments objects and keys must have the same length\");\n\n const numObjects = objects.length; // Pick length here to allow garbage collection of objects later\n let objectsToAdd = keyPath && auto ?\n objects.map(workaroundForUndefinedPrimKey(keyPath)) :\n objects;\n return this.core.mutate(\n {trans, type: 'add', keys: keys as IndexableType[], values: objectsToAdd, wantResults}\n )\n .then(({numFailures, results,lastResult, failures}) => {\n const result = wantResults ? results : lastResult;\n if (numFailures === 0) return result;\n throw new BulkError(\n `${this.name}.bulkAdd(): ${numFailures} of ${numObjects} operations failed`, failures);\n });\n });\n }\n\n /** Table.bulkPut()\n * \n * https://dexie.org/docs/Table/Table.bulkPut()\n * \n **/\n bulkPut(\n objects: any[],\n keysOrOptions?: ReadonlyArray | { allKeys?: boolean },\n options?: { allKeys?: boolean }\n ) { \n const keys = Array.isArray(keysOrOptions) ? keysOrOptions : undefined;\n options = options || (keys ? undefined : keysOrOptions as { allKeys?: boolean });\n const wantResults = options ? options.allKeys : undefined;\n\n return this._trans('readwrite', trans => {\n const {auto, keyPath} = this.schema.primKey;\n if (keyPath && keys)\n throw new exceptions.InvalidArgument(\"bulkPut(): keys argument invalid on tables with inbound keys\");\n if (keys && keys.length !== objects.length)\n throw new exceptions.InvalidArgument(\"Arguments objects and keys must have the same length\");\n\n const numObjects = objects.length; // Pick length here to allow garbage collection of objects later\n let objectsToPut = keyPath && auto ?\n objects.map(workaroundForUndefinedPrimKey(keyPath)) :\n objects;\n\n return this.core.mutate(\n {trans, type: 'put', keys: keys as IndexableType[], values: objectsToPut, wantResults}\n )\n .then(({numFailures, results, lastResult, failures}) => {\n const result = wantResults ? results : lastResult;\n if (numFailures === 0) return result;\n throw new BulkError(\n `${this.name}.bulkPut(): ${numFailures} of ${numObjects} operations failed`, failures);\n });\n });\n }\n\n /** Table.bulkDelete()\n * \n * https://dexie.org/docs/Table/Table.bulkDelete()\n * \n **/\n bulkDelete(keys: ReadonlyArray): PromiseExtended {\n const numKeys = keys.length;\n return this._trans('readwrite', trans => {\n return this.core.mutate({trans, type: 'delete', keys: keys as IndexableType[]});\n }).then(({numFailures, lastResult, failures}) => {\n if (numFailures === 0) return lastResult;\n throw new BulkError(\n `${this.name}.bulkDelete(): ${numFailures} of ${numKeys} operations failed`, failures);\n });\n }\n}\n","import {keys, isArray, asap} from '../functions/utils';\nimport {nop, mirror, reverseStoppableEventChain} from '../functions/chaining-functions';\nimport {exceptions} from '../errors';\n\nexport default function Events(ctx) {\n var evs = {};\n var rv = function (eventName, subscriber) {\n if (subscriber) {\n // Subscribe. If additional arguments than just the subscriber was provided, forward them as well.\n var i = arguments.length, args = new Array(i - 1);\n while (--i) args[i - 1] = arguments[i];\n evs[eventName].subscribe.apply(null, args);\n return ctx;\n } else if (typeof (eventName) === 'string') {\n // Return interface allowing to fire or unsubscribe from event\n return evs[eventName];\n }\n };\n rv.addEventType = add;\n \n for (var i = 1, l = arguments.length; i < l; ++i) {\n add(arguments[i]);\n }\n \n return rv;\n\n function add(eventName, chainFunction, defaultFunction) {\n if (typeof eventName === 'object') return addConfiguredEvents(eventName);\n if (!chainFunction) chainFunction = reverseStoppableEventChain;\n if (!defaultFunction) defaultFunction = nop;\n\n var context = {\n subscribers: [],\n fire: defaultFunction,\n subscribe: function (cb) {\n if (context.subscribers.indexOf(cb) === -1) {\n context.subscribers.push(cb);\n context.fire = chainFunction(context.fire, cb);\n }\n },\n unsubscribe: function (cb) {\n context.subscribers = context.subscribers.filter(function (fn) { return fn !== cb; });\n context.fire = context.subscribers.reduce(chainFunction, defaultFunction);\n }\n };\n evs[eventName] = rv[eventName] = context;\n return context;\n }\n\n function addConfiguredEvents(cfg) {\n // events(this, {reading: [functionChain, nop]});\n keys(cfg).forEach(function (eventName) {\n var args = cfg[eventName];\n if (isArray(args)) {\n add(eventName, cfg[eventName][0], cfg[eventName][1]);\n } else if (args === 'asap') {\n // Rather than approaching event subscription using a functional approach, we here do it in a for-loop where subscriber is executed in its own stack\n // enabling that any exception that occur wont disturb the initiator and also not nescessary be catched and forgotten.\n var context = add(eventName, mirror, function fire() {\n // Optimazation-safe cloning of arguments into args.\n var i = arguments.length, args = new Array(i);\n while (i--) args[i] = arguments[i];\n // All each subscriber:\n context.subscribers.forEach(function (fn) {\n asap(function fireEvent() {\n fn.apply(null, args);\n });\n });\n });\n } else throw new exceptions.InvalidArgument(\"Invalid event config\");\n });\n }\n}\n","import { arrayToObject, derive } from './utils';\n\n\nexport function makeClassConstructor (prototype: Object, constructor: Function) {\n /*const propertyDescriptorMap = arrayToObject(\n Object.getOwnPropertyNames(prototype),\n propKey => [propKey, Object.getOwnPropertyDescriptor(prototype, propKey)]);\n\n // Both derive and clone the prototype.\n // derive: So that x instanceof T returns true when T is the class template.\n // clone: Optimizes method access a bit (but actually not nescessary)\n const derivedPrototypeClone = Object.create(prototype, propertyDescriptorMap);\n derivedPrototypeClone.constructor = constructor;\n constructor.prototype = derivedPrototypeClone;\n return constructor as any as TConstructor;*/\n\n // Keep the above code in case we want to clone AND derive the parent prototype.\n // Reason would be optimization of property access.\n // The code below will only create a prototypal inheritance from given constructor function\n // to given prototype.\n derive(constructor).from({prototype});\n return constructor as any as TConstructor; \n}\n","import { Dexie } from '../dexie';\nimport { TableSchema } from '../../public/types/table-schema';\nimport { Transaction } from '../transaction/transaction';\nimport { hookCreatingChain, pureFunctionChain, nop, mirror, hookUpdatingChain, hookDeletingChain } from '../../functions/chaining-functions';\nimport { TableHooks } from '../../public/types/table-hooks';\nimport { Table } from './table';\nimport Events from '../../helpers/Events';\nimport { makeClassConstructor } from '../../functions/make-class-constructor';\n\nexport interface TableConstructor {\n new (name: string, tableSchema: TableSchema, optionalTrans?: Transaction) : Table;\n prototype: Table;\n}\n\n/** Generates a Table constructor bound to given Dexie instance.\n * \n * The purpose of having dynamically created constructors, is to allow\n * addons to extend classes for a certain Dexie instance without affecting\n * other db instances.\n */\nexport function createTableConstructor (db: Dexie) {\n return makeClassConstructor(\n Table.prototype,\n\n function Table (this: Table, name: string, tableSchema: TableSchema, trans?: Transaction) {\n this.db = db;\n this._tx = trans;\n this.name = name;\n this.schema = tableSchema;\n this.hook = db._allTables[name] ? db._allTables[name].hook : Events(null, {\n \"creating\": [hookCreatingChain, nop],\n \"reading\": [pureFunctionChain, mirror],\n \"updating\": [hookUpdatingChain, nop],\n \"deleting\": [hookDeletingChain, nop]\n }) as TableHooks;\n }\n\n );\n}\n","import { combine } from \"../../functions/combine\";\nimport { exceptions } from \"../../errors\";\nimport { hasOwn } from \"../../functions/utils\";\nimport { wrap } from \"../../helpers/promise\";\nimport { Collection } from './';\nimport { DBCoreCursor, DBCoreTable, DBCoreTransaction, DBCoreTableSchema, DBCoreRangeType } from '../../public/types/dbcore';\nimport { nop } from '../../functions/chaining-functions';\n\ntype CollectionContext = Collection[\"_ctx\"];\n\nexport function isPlainKeyRange (ctx: CollectionContext, ignoreLimitFilter?: boolean) {\n return !(ctx.filter || ctx.algorithm || ctx.or) &&\n (ignoreLimitFilter ? ctx.justLimit : !ctx.replayFilter);\n} \n\nexport function addFilter(ctx: CollectionContext, fn: Function) {\n ctx.filter = combine(ctx.filter, fn);\n}\n\nexport function addReplayFilter (ctx: CollectionContext, factory, isLimitFilter?) {\n var curr = ctx.replayFilter;\n ctx.replayFilter = curr ? ()=>combine(curr(), factory()) : factory;\n ctx.justLimit = isLimitFilter && !curr;\n}\n\nexport function addMatchFilter(ctx: CollectionContext, fn) {\n ctx.isMatch = combine(ctx.isMatch, fn);\n}\n\nexport function getIndexOrStore(ctx: CollectionContext, coreSchema: DBCoreTableSchema) {\n // TODO: Rewrite this. No need to know ctx.isPrimKey. ctx.index should hold the keypath.\n // Still, throw if not found!\n if (ctx.isPrimKey) return coreSchema.primaryKey;\n const index = coreSchema.getIndexByKeyPath(ctx.index);\n if (!index) throw new exceptions.Schema(\"KeyPath \" + ctx.index + \" on object store \" + coreSchema.name + \" is not indexed\");\n return index;\n}\n\nexport function openCursor(ctx: CollectionContext, coreTable: DBCoreTable, trans: DBCoreTransaction) {\n const index = getIndexOrStore(ctx, coreTable.schema);\n return coreTable.openCursor({\n trans,\n values: !ctx.keysOnly,\n reverse: ctx.dir === 'prev',\n unique: !!ctx.unique,\n query: {\n index, \n range: ctx.range\n }\n });\n}\n\nexport function iter (\n ctx: CollectionContext, \n fn: (item, cursor: DBCoreCursor, advance: Function)=>void,\n coreTrans: DBCoreTransaction,\n coreTable: DBCoreTable): Promise\n{\n const filter = ctx.replayFilter ? combine(ctx.filter, ctx.replayFilter()) : ctx.filter;\n if (!ctx.or) {\n return iterate(\n openCursor(ctx, coreTable, coreTrans),\n combine(ctx.algorithm, filter), fn, !ctx.keysOnly && ctx.valueMapper);\n } else {\n const set = {};\n\n const union = (item: any, cursor: DBCoreCursor, advance) => {\n if (!filter || filter(cursor, advance, result=>cursor.stop(result), err => cursor.fail(err))) {\n var primaryKey = cursor.primaryKey;\n var key = '' + primaryKey;\n if (key === '[object ArrayBuffer]') key = '' + new Uint8Array(primaryKey);\n if (!hasOwn(set, key)) {\n set[key] = true;\n fn(item, cursor, advance);\n }\n }\n }\n\n return Promise.all([\n ctx.or._iterate(union, coreTrans),\n iterate(openCursor(ctx, coreTable, coreTrans), ctx.algorithm, union, !ctx.keysOnly && ctx.valueMapper)\n ]);\n }\n}\n\nfunction iterate(cursorPromise: Promise, filter, fn, valueMapper): Promise {\n \n // Apply valueMapper (hook('reading') or mappped class)\n var mappedFn = valueMapper ? (x,c,a) => fn(valueMapper(x),c,a) : fn;\n // Wrap fn with PSD and microtick stuff from Promise.\n var wrappedFn = wrap(mappedFn);\n \n return cursorPromise.then(cursor => {\n if (cursor) {\n return cursor.start(()=>{\n var c = ()=>cursor.continue();\n if (!filter || filter(cursor, advancer => c = advancer, val=>{cursor.stop(val);c=nop}, e => {cursor.fail(e);c = nop;}))\n wrappedFn(cursor.value, cursor, advancer => c = advancer);\n c();\n });\n }\n });\n}\n","// Implementation of https://www.w3.org/TR/IndexedDB-3/#compare-two-keys\n\nimport { toStringTag } from './utils';\n\n// ... with the adjustment to return NaN instead of throwing.\nexport function cmp(a: any, b: any): number {\n try {\n const ta = type(a);\n const tb = type(b);\n if (ta !== tb) {\n if (ta === 'Array') return 1;\n if (tb === 'Array') return -1;\n if (ta === 'binary') return 1;\n if (tb === 'binary') return -1;\n if (ta === 'string') return 1;\n if (tb === 'string') return -1;\n if (ta === 'Date') return 1;\n if (tb !== 'Date') return NaN;\n return -1;\n }\n switch (ta) {\n case 'number':\n case 'Date':\n case 'string':\n return a > b ? 1 : a < b ? -1 : 0;\n case 'binary': {\n return compareUint8Arrays(getUint8Array(a), getUint8Array(b));\n }\n case 'Array':\n return compareArrays(a, b);\n }\n } catch {}\n return NaN; // Return value if any given args are valid keys.\n}\n\nexport function compareArrays(a: any[], b: any[]): number {\n const al = a.length;\n const bl = b.length;\n const l = al < bl ? al : bl;\n for (let i = 0; i < l; ++i) {\n const res = cmp(a[i], b[i]);\n if (res !== 0) return res;\n }\n return al === bl ? 0 : al < bl ? -1 : 1;\n}\n\nexport function compareUint8Arrays(\n a: Uint8Array,\n b: Uint8Array\n) {\n const al = a.length;\n const bl = b.length;\n const l = al < bl ? al : bl;\n for (let i = 0; i < l; ++i) {\n if (a[i] !== b[i]) return a[i] < b[i] ? -1 : 1;\n }\n return al === bl ? 0 : al < bl ? -1 : 1;\n}\n\n// Implementation of https://www.w3.org/TR/IndexedDB-3/#key-type\nfunction type(x: any) {\n const t = typeof x;\n if (t !== 'object') return t;\n if (ArrayBuffer.isView(x)) return 'binary';\n const tsTag = toStringTag(x); // Cannot use instanceof in Safari\n return tsTag === 'ArrayBuffer' ? 'binary' : (tsTag as 'Array' | 'Date');\n}\n\ntype BinaryType =\n | ArrayBuffer\n | DataView\n | Uint8ClampedArray\n | ArrayBufferView\n | Uint8Array\n | Int8Array\n | Uint16Array\n | Int16Array\n | Uint32Array\n | Int32Array\n | Float32Array\n | Float64Array;\n\nfunction getUint8Array(a: BinaryType): Uint8Array {\n if (a instanceof Uint8Array) return a;\n if (ArrayBuffer.isView(a))\n // TypedArray or DataView\n return new Uint8Array(a.buffer, a.byteOffset, a.byteLength);\n return new Uint8Array(a); // ArrayBuffer\n}\n","import { Collection as ICollection } from \"../../public/types/collection\";\nimport { Dexie } from \"../dexie\";\nimport { Table } from \"../table\";\nimport { IndexableType, IndexableTypeArrayReadonly } from \"../../public/types/indexable-type\";\nimport { PromiseExtended } from \"../../public/types/promise-extended\";\nimport { iter, isPlainKeyRange, getIndexOrStore, addReplayFilter, addFilter, addMatchFilter } from \"./collection-helpers\";\nimport { rejection } from \"../../helpers/promise\";\nimport { combine } from \"../../functions/combine\";\nimport { extend, hasOwn, deepClone, keys, setByKeyPath, getByKeyPath } from \"../../functions/utils\";\nimport { ModifyError } from \"../../errors\";\nimport { hangsOnDeleteLargeKeyRange } from \"../../globals/constants\";\nimport { ThenShortcut } from \"../../public/types/then-shortcut\";\nimport { Transaction } from '../transaction';\nimport { DBCoreCursor, DBCoreTransaction, DBCoreRangeType, DBCoreMutateResponse, DBCoreKeyRange } from '../../public/types/dbcore';\nimport { cmp } from \"../../functions/cmp\";\n\n/** class Collection\n * \n * https://dexie.org/docs/Collection/Collection\n */\nexport class Collection implements ICollection {\n db: Dexie;\n _ctx: {\n table: Table;\n index?: string | null;\n isPrimKey?: boolean;\n range: DBCoreKeyRange;\n keysOnly: boolean;\n dir: \"next\" | \"prev\";\n unique: \"\" | \"unique\";\n algorithm?: Function | null;\n filter?: Function | null;\n replayFilter: Function | null;\n justLimit: boolean; // True if a replayFilter is just a filter that performs a \"limit\" operation (or none at all)\n isMatch: Function | null;\n offset: number,\n limit: number,\n error: any, // If set, any promise must be rejected with this error\n or: Collection,\n valueMapper: (any) => any\n }\n \n _ondirectionchange?: Function;\n\n _read(fn: (idbtrans: IDBTransaction, dxTrans: Transaction) => PromiseLike, cb?): PromiseExtended {\n var ctx = this._ctx;\n return ctx.error ?\n ctx.table._trans(null, rejection.bind(null, ctx.error)) :\n ctx.table._trans('readonly', fn).then(cb);\n }\n\n _write(fn: (idbtrans: IDBTransaction, dxTrans: Transaction) => PromiseLike): PromiseExtended {\n var ctx = this._ctx;\n return ctx.error ?\n ctx.table._trans(null, rejection.bind(null, ctx.error)) :\n ctx.table._trans('readwrite', fn, \"locked\"); // When doing write operations on collections, always lock the operation so that upcoming operations gets queued.\n }\n\n _addAlgorithm(fn) {\n var ctx = this._ctx;\n ctx.algorithm = combine(ctx.algorithm, fn);\n }\n\n _iterate(\n fn: (item, cursor: DBCoreCursor, advance: Function) => void,\n coreTrans: DBCoreTransaction) : Promise\n {\n return iter(this._ctx, fn, coreTrans, this._ctx.table.core);\n }\n\n /** Collection.clone()\n * \n * https://dexie.org/docs/Collection/Collection.clone()\n * \n **/\n clone(props?) {\n var rv = Object.create(this.constructor.prototype),\n ctx = Object.create(this._ctx);\n if (props) extend(ctx, props);\n rv._ctx = ctx;\n return rv;\n }\n\n /** Collection.raw()\n * \n * https://dexie.org/docs/Collection/Collection.raw()\n * \n **/\n raw() {\n this._ctx.valueMapper = null;\n return this;\n }\n\n /** Collection.each()\n * \n * https://dexie.org/docs/Collection/Collection.each()\n * \n **/\n each(fn: (obj, cursor: DBCoreCursor) => any): PromiseExtended {\n var ctx = this._ctx;\n\n return this._read(trans => iter(ctx, fn, trans, ctx.table.core));\n }\n\n /** Collection.count()\n * \n * https://dexie.org/docs/Collection/Collection.count()\n * \n **/\n count(cb?) {\n return this._read(trans => {\n const ctx = this._ctx;\n const coreTable = ctx.table.core;\n if (isPlainKeyRange(ctx, true)) {\n // This is a plain key range. We can use the count() method if the index.\n return coreTable.count({\n trans,\n query: {\n index: getIndexOrStore(ctx, coreTable.schema),\n range: ctx.range\n }\n }).then(count => Math.min(count, ctx.limit));\n } else {\n // Algorithms, filters or expressions are applied. Need to count manually.\n var count = 0;\n return iter(ctx, () => { ++count; return false; }, trans, coreTable)\n .then(()=>count);\n }\n }).then(cb);\n }\n\n /** Collection.sortBy()\n * \n * https://dexie.org/docs/Collection/Collection.sortBy()\n * \n **/\n sortBy(keyPath: string): PromiseExtended;\n sortBy(keyPath: string, thenShortcut: ThenShortcut) : PromiseExtended;\n sortBy(keyPath: string, cb?: ThenShortcut) {\n const parts = keyPath.split('.').reverse(),\n lastPart = parts[0],\n lastIndex = parts.length - 1;\n function getval(obj, i) {\n if (i) return getval(obj[parts[i]], i - 1);\n return obj[lastPart];\n }\n var order = this._ctx.dir === \"next\" ? 1 : -1;\n\n function sorter(a, b) {\n var aVal = getval(a, lastIndex),\n bVal = getval(b, lastIndex);\n return aVal < bVal ? -order : aVal > bVal ? order : 0;\n }\n return this.toArray(function (a) {\n return a.sort(sorter);\n }).then(cb);\n }\n\n /** Collection.toArray()\n * \n * https://dexie.org/docs/Collection/Collection.toArray()\n * \n **/\n toArray(cb?): PromiseExtended {\n return this._read(trans => {\n var ctx = this._ctx;\n if (ctx.dir === 'next' && isPlainKeyRange(ctx, true) && ctx.limit > 0) {\n // Special optimation if we could use IDBObjectStore.getAll() or\n // IDBKeyRange.getAll():\n const {valueMapper} = ctx;\n const index = getIndexOrStore(ctx, ctx.table.core.schema);\n return ctx.table.core.query({\n trans,\n limit: ctx.limit,\n values: true,\n query: {\n index,\n range: ctx.range\n }\n }).then(({result}) => valueMapper ? result.map(valueMapper) : result);\n } else {\n // Getting array through a cursor.\n const a = [];\n return iter(ctx, item => a.push(item), trans, ctx.table.core).then(()=>a);\n }\n }, cb);\n }\n\n /** Collection.offset()\n * \n * https://dexie.org/docs/Collection/Collection.offset()\n * \n **/\n offset(offset: number) : Collection{\n var ctx = this._ctx;\n if (offset <= 0) return this;\n ctx.offset += offset; // For count()\n if (isPlainKeyRange(ctx)) {\n addReplayFilter(ctx, () => {\n var offsetLeft = offset;\n return (cursor, advance) => {\n if (offsetLeft === 0) return true;\n if (offsetLeft === 1) { --offsetLeft; return false; }\n advance(() => {\n cursor.advance(offsetLeft);\n offsetLeft = 0;\n });\n return false;\n };\n });\n } else {\n addReplayFilter(ctx, () => {\n var offsetLeft = offset;\n return () => (--offsetLeft < 0);\n });\n }\n return this;\n }\n\n /** Collection.limit()\n * \n * https://dexie.org/docs/Collection/Collection.limit()\n * \n **/\n limit(numRows: number) : Collection {\n this._ctx.limit = Math.min(this._ctx.limit, numRows); // For count()\n addReplayFilter(this._ctx, () => {\n var rowsLeft = numRows;\n return function (cursor, advance, resolve) {\n if (--rowsLeft <= 0) advance(resolve); // Stop after this item has been included\n return rowsLeft >= 0; // If numRows is already below 0, return false because then 0 was passed to numRows initially. Otherwise we wouldnt come here.\n };\n }, true);\n return this;\n }\n\n /** Collection.until()\n * \n * https://dexie.org/docs/Collection/Collection.until()\n * \n **/\n until(filterFunction: (x) => boolean, bIncludeStopEntry?) {\n addFilter(this._ctx, function (cursor, advance, resolve) {\n if (filterFunction(cursor.value)) {\n advance(resolve);\n return bIncludeStopEntry;\n } else {\n return true;\n }\n });\n return this;\n }\n\n /** Collection.first()\n * \n * https://dexie.org/docs/Collection/Collection.first()\n * \n **/\n first(cb?) {\n return this.limit(1).toArray(function (a) { return a[0]; }).then(cb);\n }\n\n /** Collection.last()\n * \n * https://dexie.org/docs/Collection/Collection.last()\n * \n **/\n last(cb?) {\n return this.reverse().first(cb);\n }\n\n /** Collection.filter()\n * \n * https://dexie.org/docs/Collection/Collection.filter()\n * \n **/\n filter(filterFunction: (x) => boolean): Collection {\n /// function(val){return true/false}\n addFilter(this._ctx, function (cursor) {\n return filterFunction(cursor.value);\n });\n // match filters not used in Dexie.js but can be used by 3rd part libraries to test a\n // collection for a match without querying DB. Used by Dexie.Observable.\n addMatchFilter(this._ctx, filterFunction);\n return this;\n }\n\n /** Collection.and()\n * \n * https://dexie.org/docs/Collection/Collection.and()\n * \n **/\n and(filter: (x) => boolean) {\n return this.filter(filter);\n }\n\n /** Collection.or()\n * \n * https://dexie.org/docs/Collection/Collection.or()\n * \n **/\n or(indexName: string) {\n return new this.db.WhereClause(this._ctx.table, indexName, this);\n }\n\n /** Collection.reverse()\n * \n * https://dexie.org/docs/Collection/Collection.reverse()\n * \n **/\n reverse() {\n this._ctx.dir = (this._ctx.dir === \"prev\" ? \"next\" : \"prev\");\n if (this._ondirectionchange) this._ondirectionchange(this._ctx.dir);\n return this;\n }\n\n /** Collection.desc()\n * \n * https://dexie.org/docs/Collection/Collection.desc()\n * \n **/\n desc() {\n return this.reverse();\n }\n\n /** Collection.eachKey()\n * \n * https://dexie.org/docs/Collection/Collection.eachKey()\n * \n **/\n eachKey(cb?) {\n var ctx = this._ctx;\n ctx.keysOnly = !ctx.isMatch;\n return this.each(function (val, cursor) { cb(cursor.key, cursor); });\n }\n\n /** Collection.eachUniqueKey()\n * \n * https://dexie.org/docs/Collection/Collection.eachUniqueKey()\n * \n **/\n eachUniqueKey(cb?) {\n this._ctx.unique = \"unique\";\n return this.eachKey(cb);\n }\n\n /** Collection.eachPrimaryKey()\n * \n * https://dexie.org/docs/Collection/Collection.eachPrimaryKey()\n * \n **/\n eachPrimaryKey(cb?) {\n var ctx = this._ctx;\n ctx.keysOnly = !ctx.isMatch;\n return this.each(function (val, cursor) { cb(cursor.primaryKey, cursor); });\n }\n\n /** Collection.keys()\n * \n * https://dexie.org/docs/Collection/Collection.keys()\n * \n **/\n keys(cb?) {\n var ctx = this._ctx;\n ctx.keysOnly = !ctx.isMatch;\n var a = [];\n return this.each(function (item, cursor) {\n a.push(cursor.key);\n }).then(function () {\n return a;\n }).then(cb);\n }\n\n /** Collection.primaryKeys()\n * \n * https://dexie.org/docs/Collection/Collection.primaryKeys()\n * \n **/\n primaryKeys(cb?) : PromiseExtended {\n var ctx = this._ctx;\n if (ctx.dir === 'next' && isPlainKeyRange(ctx, true) && ctx.limit > 0) {\n // Special optimation if we could use IDBObjectStore.getAllKeys() or\n // IDBKeyRange.getAllKeys():\n return this._read(trans => {\n var index = getIndexOrStore(ctx, ctx.table.core.schema);\n return ctx.table.core.query({\n trans,\n values: false,\n limit: ctx.limit,\n query: {\n index,\n range: ctx.range\n }});\n }).then(({result})=>result).then(cb);\n }\n ctx.keysOnly = !ctx.isMatch;\n var a = [];\n return this.each(function (item, cursor) {\n a.push(cursor.primaryKey);\n }).then(function () {\n return a;\n }).then(cb);\n }\n\n /** Collection.uniqueKeys()\n * \n * https://dexie.org/docs/Collection/Collection.uniqueKeys()\n * \n **/\n uniqueKeys(cb?) {\n this._ctx.unique = \"unique\";\n return this.keys(cb);\n }\n\n /** Collection.firstKey()\n * \n * https://dexie.org/docs/Collection/Collection.firstKey()\n * \n **/\n firstKey(cb?) {\n return this.limit(1).keys(function (a) { return a[0]; }).then(cb);\n }\n\n /** Collection.lastKey()\n * \n * https://dexie.org/docs/Collection/Collection.lastKey()\n * \n **/\n lastKey(cb?) {\n return this.reverse().firstKey(cb);\n }\n\n /** Collection.distinct()\n * \n * https://dexie.org/docs/Collection/Collection.distinct()\n * \n **/\n distinct() {\n var ctx = this._ctx,\n idx = ctx.index && ctx.table.schema.idxByName[ctx.index];\n if (!idx || !idx.multi) return this; // distinct() only makes differencies on multiEntry indexes.\n var set = {};\n addFilter(this._ctx, function (cursor: DBCoreCursor) {\n var strKey = cursor.primaryKey.toString(); // Converts any Date to String, String to String, Number to String and Array to comma-separated string\n var found = hasOwn(set, strKey);\n set[strKey] = true;\n return !found;\n });\n return this;\n }\n\n //\n // Methods that mutate storage\n //\n\n /** Collection.modify()\n * \n * https://dexie.org/docs/Collection/Collection.modify()\n * \n **/\n modify(changes: { [keyPath: string]: any }) : PromiseExtended\n modify(changes: (obj: any, ctx:{value: any, primKey: IndexableType}) => void | boolean): PromiseExtended {\n var ctx = this._ctx;\n return this._write(trans => {\n var modifyer: (obj: any, ctx:{value: any, primKey: IndexableType}) => void | boolean\n if (typeof changes === 'function') {\n // Changes is a function that may update, add or delete propterties or even require a deletion the object itself (delete this.item)\n modifyer = changes;\n } else {\n // changes is a set of {keyPath: value} and no one is listening to the updating hook.\n var keyPaths = keys(changes);\n var numKeys = keyPaths.length;\n modifyer = function (item) {\n var anythingModified = false;\n for (var i = 0; i < numKeys; ++i) {\n var keyPath = keyPaths[i], val = changes[keyPath];\n if (getByKeyPath(item, keyPath) !== val) {\n setByKeyPath(item, keyPath, val); // Adding {keyPath: undefined} means that the keyPath should be deleted. Handled by setByKeyPath\n anythingModified = true;\n }\n }\n return anythingModified;\n };\n }\n\n const coreTable = ctx.table.core;\n const {outbound, extractKey} = coreTable.schema.primaryKey;\n const limit = this.db._options.modifyChunkSize || 200;\n const totalFailures = [];\n let successCount = 0;\n const failedKeys: IndexableType[] = [];\n const applyMutateResult = (expectedCount: number, res: DBCoreMutateResponse) => {\n const {failures, numFailures} = res;\n successCount += expectedCount - numFailures;\n for (let pos of keys(failures)) {\n totalFailures.push(failures[pos]);\n }\n }\n return this.clone().primaryKeys().then(keys => {\n\n const nextChunk = (offset: number) => {\n const count = Math.min(limit, keys.length - offset);\n return coreTable.getMany({\n trans,\n keys: keys.slice(offset, offset + count),\n cache: \"immutable\" // Optimize for 2 things:\n // 1) observability-middleware can track changes better.\n // 2) hooks middleware don't have to query the existing values again when tracking changes.\n // We can use \"immutable\" because we promise to not touch the values we retrieve here!\n }).then(values => {\n const addValues = [];\n const putValues = [];\n const putKeys = outbound ? [] : null;\n const deleteKeys = [];\n for (let i=0; i 0 &&\n coreTable.mutate({trans, type: 'add', values: addValues})\n .then(res => {\n for (let pos in res.failures) {\n // Remove from deleteKeys the key of the object that failed to change its primary key\n deleteKeys.splice(parseInt(pos), 1);\n }\n applyMutateResult(addValues.length, res);\n })\n ).then(()=>(putValues.length > 0 || (criteria && typeof changes === 'object')) &&\n coreTable.mutate({\n trans,\n type: 'put',\n keys: putKeys,\n values: putValues,\n criteria,\n changeSpec: typeof changes !== 'function'\n && changes\n }).then(res=>applyMutateResult(putValues.length, res))\n ).then(()=>(deleteKeys.length > 0 || (criteria && changes === deleteCallback)) &&\n coreTable.mutate({\n trans,\n type: 'delete',\n keys: deleteKeys,\n criteria\n }).then(res=>applyMutateResult(deleteKeys.length, res))\n ).then(()=>{\n return keys.length > offset + count && nextChunk(offset + limit);\n });\n });\n }\n\n return nextChunk(0).then(()=>{\n if (totalFailures.length > 0)\n throw new ModifyError(\"Error modifying one or more objects\", totalFailures, successCount, failedKeys as IndexableTypeArrayReadonly);\n\n return keys.length;\n });\n });\n\n });\n }\n\n /** Collection.delete()\n * \n * https://dexie.org/docs/Collection/Collection.delete()\n * \n **/\n delete() : PromiseExtended {\n var ctx = this._ctx,\n range = ctx.range;\n //deletingHook = ctx.table.hook.deleting.fire,\n //hasDeleteHook = deletingHook !== nop;\n if (isPlainKeyRange(ctx) &&\n ((ctx.isPrimKey && !hangsOnDeleteLargeKeyRange) || range.type === DBCoreRangeType.Any)) // if no range, we'll use clear().\n {\n // May use IDBObjectStore.delete(IDBKeyRange) in this case (Issue #208)\n // For chromium, this is the way most optimized version.\n // For IE/Edge, this could hang the indexedDB engine and make operating system instable\n // (https://gist.github.com/dfahlander/5a39328f029de18222cf2125d56c38f7)\n return this._write(trans => {\n // Our API contract is to return a count of deleted items, so we have to count() before delete().\n const {primaryKey} = ctx.table.core.schema;\n const coreRange = range;\n return ctx.table.core.count({trans, query: {index: primaryKey, range: coreRange}}).then(count => {\n return ctx.table.core.mutate({trans, type: 'deleteRange', range: coreRange})\n .then(({failures, lastResult, results, numFailures}) => {\n if (numFailures) throw new ModifyError(\"Could not delete some values\",\n Object.keys(failures).map(pos => failures[pos]),\n count - numFailures);\n return count - numFailures;\n });\n });\n });\n }\n\n return this.modify(deleteCallback);\n }\n}\n\nconst deleteCallback = (value, ctx) => ctx.value = null;\n","import { Dexie } from '../../classes/dexie';\nimport { makeClassConstructor } from '../../functions/make-class-constructor';\nimport { Collection } from './collection';\nimport { WhereClause } from '../where-clause/where-clause';\nimport { AnyRange } from '../../dbcore/keyrange';\nimport { DBCoreKeyRange } from '../../public/types/dbcore';\nimport { mirror } from '../../functions/chaining-functions';\n\n/** Constructs a Collection instance. */\nexport interface CollectionConstructor {\n new(whereClause?: WhereClause | null, keyRangeGenerator?: () => DBCoreKeyRange): Collection;\n prototype: Collection;\n}\n\n/** Generates a Collection constructor bound to given Dexie instance.\n * \n * The purpose of having dynamically created constructors, is to allow\n * addons to extend classes for a certain Dexie instance without affecting\n * other db instances.\n */\nexport function createCollectionConstructor(db: Dexie) {\n return makeClassConstructor(\n Collection.prototype,\n\n function Collection(\n this: Collection,\n whereClause?: WhereClause | null,\n keyRangeGenerator?: () => DBCoreKeyRange)\n {\n this.db = db;\n let keyRange = AnyRange, error = null;\n if (keyRangeGenerator) try {\n keyRange = keyRangeGenerator();\n } catch (ex) {\n error = ex;\n }\n\n const whereCtx = whereClause._ctx;\n const table = whereCtx.table;\n const readingHook = table.hook.reading.fire;\n this._ctx = {\n table: table,\n index: whereCtx.index,\n isPrimKey: (!whereCtx.index || (table.schema.primKey.keyPath && whereCtx.index === table.schema.primKey.name)),\n range: keyRange,\n keysOnly: false,\n dir: \"next\",\n unique: \"\",\n algorithm: null,\n filter: null,\n replayFilter: null,\n justLimit: true, // True if a replayFilter is just a filter that performs a \"limit\" operation (or none at all)\n isMatch: null,\n offset: 0,\n limit: Infinity,\n error: error, // If set, any promise must be rejected with this error\n or: whereCtx.or,\n valueMapper: readingHook !== mirror ? readingHook : null\n };\n }\n );\n}\n","import { IndexableType } from '../public/types/indexable-type';\n\nexport function simpleCompare(a, b) {\n return a < b ? -1 : a === b ? 0 : 1;\n}\n\nexport function simpleCompareReverse(a, b) {\n return a > b ? -1 : a === b ? 0 : 1;\n}\n","import { WhereClause } from './where-clause';\nimport { Collection } from '../collection';\nimport { STRING_EXPECTED } from '../../globals/constants';\nimport { simpleCompare, simpleCompareReverse } from '../../functions/compare-functions';\nimport { IndexableType } from '../../public';\nimport { DBCoreKeyRange, DBCoreRangeType } from '../../public/types/dbcore';\n\nexport function fail(collectionOrWhereClause: Collection | WhereClause, err, T?) {\n var collection = collectionOrWhereClause instanceof WhereClause ?\n new collectionOrWhereClause.Collection (collectionOrWhereClause) :\n collectionOrWhereClause;\n \n collection._ctx.error = T ? new T(err) : new TypeError(err);\n return collection;\n}\n\nexport function emptyCollection(whereClause: WhereClause) {\n return new whereClause.Collection (whereClause, () => rangeEqual(\"\")).limit(0);\n}\n\nexport function upperFactory(dir: 'next' | 'prev') {\n return dir === \"next\" ?\n (s: string) => s.toUpperCase() :\n (s: string) => s.toLowerCase();\n}\n\nexport function lowerFactory(dir: 'next' | 'prev') {\n return dir === \"next\" ?\n (s: string) => s.toLowerCase() :\n (s: string) => s.toUpperCase();\n}\n\nexport function nextCasing(key, lowerKey, upperNeedle, lowerNeedle, cmp, dir) {\n var length = Math.min(key.length, lowerNeedle.length);\n var llp = -1;\n for (var i = 0; i < length; ++i) {\n var lwrKeyChar = lowerKey[i];\n if (lwrKeyChar !== lowerNeedle[i]) {\n if (cmp(key[i], upperNeedle[i]) < 0) return key.substr(0, i) + upperNeedle[i] + upperNeedle.substr(i + 1);\n if (cmp(key[i], lowerNeedle[i]) < 0) return key.substr(0, i) + lowerNeedle[i] + upperNeedle.substr(i + 1);\n if (llp >= 0) return key.substr(0, llp) + lowerKey[llp] + upperNeedle.substr(llp + 1);\n return null;\n }\n if (cmp(key[i], lwrKeyChar) < 0) llp = i;\n }\n if (length < lowerNeedle.length && dir === \"next\") return key + upperNeedle.substr(key.length);\n if (length < key.length && dir === \"prev\") return key.substr(0, upperNeedle.length);\n return (llp < 0 ? null : key.substr(0, llp) + lowerNeedle[llp] + upperNeedle.substr(llp + 1));\n}\n\nexport function addIgnoreCaseAlgorithm(whereClause: WhereClause, match, needles, suffix) {\n /// \n var upper, lower, compare, upperNeedles, lowerNeedles, direction, nextKeySuffix,\n needlesLen = needles.length;\n if (!needles.every(s => typeof s === 'string')) {\n return fail(whereClause, STRING_EXPECTED);\n }\n function initDirection(dir) {\n upper = upperFactory(dir);\n lower = lowerFactory(dir);\n compare = (dir === \"next\" ? simpleCompare : simpleCompareReverse);\n var needleBounds = needles.map(function (needle){\n return {lower: lower(needle), upper: upper(needle)};\n }).sort(function(a,b) {\n return compare(a.lower, b.lower);\n });\n upperNeedles = needleBounds.map(function (nb){ return nb.upper; });\n lowerNeedles = needleBounds.map(function (nb){ return nb.lower; });\n direction = dir;\n nextKeySuffix = (dir === \"next\" ? \"\" : suffix);\n }\n initDirection(\"next\");\n\n var c = new whereClause.Collection (\n whereClause,\n ()=>createRange(upperNeedles[0], lowerNeedles[needlesLen-1] + suffix)\n );\n\n c._ondirectionchange = function (direction) {\n // This event onlys occur before filter is called the first time.\n initDirection(direction);\n };\n\n var firstPossibleNeedle = 0;\n\n c._addAlgorithm(function (cursor, advance, resolve) {\n /// \n /// \n /// \n var key = cursor.key;\n if (typeof key !== 'string') return false;\n var lowerKey = lower(key);\n if (match(lowerKey, lowerNeedles, firstPossibleNeedle)) {\n return true;\n } else {\n var lowestPossibleCasing = null;\n for (var i=firstPossibleNeedle; i 0) {\n lowestPossibleCasing = casing;\n }\n }\n if (lowestPossibleCasing !== null) {\n advance(function () { cursor.continue(lowestPossibleCasing + nextKeySuffix); });\n } else {\n advance(resolve);\n }\n return false;\n }\n });\n return c;\n}\n\nexport function createRange (lower: IndexableType, upper: IndexableType, lowerOpen?: boolean, upperOpen?: boolean): DBCoreKeyRange {\n return {\n type: DBCoreRangeType.Range,\n lower,\n upper,\n lowerOpen,\n upperOpen\n };\n}\n\nexport function rangeEqual (value: IndexableType) : DBCoreKeyRange {\n return {\n type: DBCoreRangeType.Equal,\n lower: value,\n upper: value\n };\n}\n","import { WhereClause as IWhereClause } from \"../../public/types/where-clause\";\nimport { Collection } from \"../collection\";\nimport { Table } from \"../table\";\nimport { IndexableType } from \"../../public/types/indexable-type\";\nimport { emptyCollection, fail, addIgnoreCaseAlgorithm, createRange, rangeEqual } from './where-clause-helpers';\nimport { INVALID_KEY_ARGUMENT, STRING_EXPECTED, maxString, minKey } from '../../globals/constants';\nimport { getArrayOf, NO_CHAR_ARRAY } from '../../functions/utils';\nimport { exceptions } from '../../errors';\nimport { Dexie } from '../dexie';\nimport { Collection as ICollection} from \"../../public/types/collection\";\n\n/** class WhereClause\n * \n * https://dexie.org/docs/WhereClause/WhereClause\n */\nexport class WhereClause implements IWhereClause {\n db: Dexie;\n _IDBKeyRange: typeof IDBKeyRange;\n _ctx: {\n table: Table;\n index: string;\n or: Collection;\n }\n _cmp: (a: IndexableType, b: IndexableType) => number;\n _ascending: (a: IndexableType, b: IndexableType) => number;\n _descending: (a: IndexableType, b: IndexableType) => number;\n _min: (a: IndexableType, b: IndexableType) => IndexableType;\n _max: (a: IndexableType, b: IndexableType) => IndexableType;\n\n get Collection() {\n return this._ctx.table.db.Collection;\n }\n\n /** WhereClause.between()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.between()\n * \n **/\n between(lower: IndexableType, upper: IndexableType, includeLower?: boolean, includeUpper?: boolean) {\n includeLower = includeLower !== false; // Default to true\n includeUpper = includeUpper === true; // Default to false\n try {\n if ((this._cmp(lower, upper) > 0) ||\n (this._cmp(lower, upper) === 0 && (includeLower || includeUpper) && !(includeLower && includeUpper)))\n return emptyCollection(this); // Workaround for idiotic W3C Specification that DataError must be thrown if lower > upper. The natural result would be to return an empty collection.\n return new this.Collection(this, ()=>createRange(lower, upper, !includeLower, !includeUpper));\n } catch (e) {\n return fail(this, INVALID_KEY_ARGUMENT);\n }\n }\n\n /** WhereClause.equals()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.equals()\n * \n **/\n equals(value: IndexableType) {\n if (value == null) return fail(this, INVALID_KEY_ARGUMENT);\n return new this.Collection(this, () => rangeEqual(value)) as ICollection;\n }\n\n /** WhereClause.above()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.above()\n * \n **/\n above(value: IndexableType) {\n if (value == null) return fail(this, INVALID_KEY_ARGUMENT);\n return new this.Collection(this, () => createRange(value, undefined, true));\n }\n\n /** WhereClause.aboveOrEqual()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.aboveOrEqual()\n * \n **/\n aboveOrEqual(value: IndexableType) {\n if (value == null) return fail(this, INVALID_KEY_ARGUMENT);\n return new this.Collection(this, () => createRange(value, undefined, false));\n }\n\n /** WhereClause.below()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.below()\n * \n **/\n below(value: IndexableType) {\n if (value == null) return fail(this, INVALID_KEY_ARGUMENT);\n return new this.Collection(this, () => createRange(undefined, value, false, true));\n }\n\n /** WhereClause.belowOrEqual()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.belowOrEqual()\n * \n **/\n belowOrEqual(value: IndexableType) {\n if (value == null) return fail(this, INVALID_KEY_ARGUMENT);\n return new this.Collection(this, () => createRange(undefined, value));\n }\n\n /** WhereClause.startsWith()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.startsWith()\n * \n **/\n startsWith(str: string) {\n if (typeof str !== 'string') return fail(this, STRING_EXPECTED);\n return this.between(str, str + maxString, true, true);\n }\n\n /** WhereClause.startsWithIgnoreCase()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.startsWithIgnoreCase()\n * \n **/\n startsWithIgnoreCase(str: string) {\n if (str === \"\") return this.startsWith(str);\n return addIgnoreCaseAlgorithm(this, (x, a) => x.indexOf(a[0]) === 0, [str], maxString);\n }\n\n /** WhereClause.equalsIgnoreCase()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.equalsIgnoreCase()\n * \n **/\n equalsIgnoreCase(str: string) {\n return addIgnoreCaseAlgorithm(this, (x, a) => x === a[0], [str], \"\");\n }\n\n /** WhereClause.anyOfIgnoreCase()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.anyOfIgnoreCase()\n * \n **/\n anyOfIgnoreCase(...values: string[]): Collection;\n anyOfIgnoreCase(values: string[]): Collection;\n anyOfIgnoreCase() {\n var set = getArrayOf.apply(NO_CHAR_ARRAY, arguments);\n if (set.length === 0) return emptyCollection(this);\n return addIgnoreCaseAlgorithm(this, (x, a) => a.indexOf(x) !== -1, set, \"\");\n }\n\n /** WhereClause.startsWithAnyOfIgnoreCase()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.startsWithAnyOfIgnoreCase()\n * \n **/\n startsWithAnyOfIgnoreCase(...values: string[]): Collection;\n startsWithAnyOfIgnoreCase(values: string[]): Collection;\n startsWithAnyOfIgnoreCase() {\n var set = getArrayOf.apply(NO_CHAR_ARRAY, arguments);\n if (set.length === 0) return emptyCollection(this);\n return addIgnoreCaseAlgorithm(this, (x, a) => a.some(n => x.indexOf(n) === 0), set, maxString);\n }\n\n /** WhereClause.anyOf()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.anyOf()\n * \n **/\n anyOf(...values: string[]): Collection;\n anyOf(values: string[]): Collection;\n anyOf() {\n const set = getArrayOf.apply(NO_CHAR_ARRAY, arguments);\n let compare = this._cmp;\n try { set.sort(compare); } catch (e) { return fail(this, INVALID_KEY_ARGUMENT); }\n if (set.length === 0) return emptyCollection(this);\n const c = new this.Collection(this, () => createRange(set[0], set[set.length - 1]));\n\n c._ondirectionchange = direction => {\n compare = (direction === \"next\" ?\n this._ascending :\n this._descending);\n set.sort(compare);\n };\n\n let i = 0;\n c._addAlgorithm((cursor, advance, resolve) => {\n const key = cursor.key;\n while (compare(key, set[i]) > 0) {\n // The cursor has passed beyond this key. Check next.\n ++i;\n if (i === set.length) {\n // There is no next. Stop searching.\n advance(resolve);\n return false;\n }\n }\n if (compare(key, set[i]) === 0) {\n // The current cursor value should be included and we should continue a single step in case next item has the same key or possibly our next key in set.\n return true;\n } else {\n // cursor.key not yet at set[i]. Forward cursor to the next key to hunt for.\n advance(() => { cursor.continue(set[i]); });\n return false;\n }\n });\n return c;\n }\n\n /** WhereClause.notEqual()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.notEqual()\n * \n **/\n notEqual(value: IndexableType) {\n return this.inAnyRange([[minKey, value], [value, this.db._maxKey]], { includeLowers: false, includeUppers: false });\n }\n\n /** WhereClause.noneOf()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.noneOf()\n * \n **/\n noneOf(...values: string[]): Collection;\n noneOf(values: string[]): Collection;\n noneOf() {\n const set = getArrayOf.apply(NO_CHAR_ARRAY, arguments);\n if (set.length === 0) return new this.Collection(this); // Return entire collection.\n try { set.sort(this._ascending); } catch (e) { return fail(this, INVALID_KEY_ARGUMENT); }\n // Transform [\"a\",\"b\",\"c\"] to a set of ranges for between/above/below: [[minKey,\"a\"], [\"a\",\"b\"], [\"b\",\"c\"], [\"c\",maxKey]]\n const ranges = set.reduce(\n (res, val) => res ?\n res.concat([[res[res.length - 1][1], val]]) :\n [[minKey, val]],\n null);\n ranges.push([set[set.length - 1], this.db._maxKey]);\n return this.inAnyRange(ranges, { includeLowers: false, includeUppers: false });\n }\n\n /** WhereClause.inAnyRange()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.inAnyRange()\n * \n **/\n inAnyRange(\n ranges: ReadonlyArray<{ 0: IndexableType, 1: IndexableType }>,\n options?: { includeLowers?: boolean, includeUppers?: boolean })\n {\n const cmp = this._cmp,\n ascending = this._ascending,\n descending = this._descending,\n min = this._min,\n max = this._max;\n\n if (ranges.length === 0) return emptyCollection(this);\n if (!ranges.every(range =>\n range[0] !== undefined &&\n range[1] !== undefined &&\n ascending(range[0], range[1]) <= 0)) {\n return fail(\n this,\n \"First argument to inAnyRange() must be an Array of two-value Arrays [lower,upper] where upper must not be lower than lower\",\n exceptions.InvalidArgument);\n }\n const includeLowers = !options || options.includeLowers !== false; // Default to true\n const includeUppers = options && options.includeUppers === true; // Default to false\n\n function addRange(ranges, newRange) {\n let i = 0, l = ranges.length;\n for (; i < l; ++i) {\n const range = ranges[i];\n if (cmp(newRange[0], range[1]) < 0 && cmp(newRange[1], range[0]) > 0) {\n range[0] = min(range[0], newRange[0]);\n range[1] = max(range[1], newRange[1]);\n break;\n }\n }\n if (i === l)\n ranges.push(newRange);\n return ranges;\n }\n\n let sortDirection = ascending;\n function rangeSorter(a, b) { return sortDirection(a[0], b[0]); }\n\n // Join overlapping ranges\n let set;\n try {\n set = ranges.reduce(addRange, []);\n set.sort(rangeSorter);\n } catch (ex) {\n return fail(this, INVALID_KEY_ARGUMENT);\n }\n\n let rangePos = 0;\n const keyIsBeyondCurrentEntry = includeUppers ?\n key => ascending(key, set[rangePos][1]) > 0 :\n key => ascending(key, set[rangePos][1]) >= 0;\n\n const keyIsBeforeCurrentEntry = includeLowers ?\n key => descending(key, set[rangePos][0]) > 0 :\n key => descending(key, set[rangePos][0]) >= 0;\n\n function keyWithinCurrentRange(key) {\n return !keyIsBeyondCurrentEntry(key) && !keyIsBeforeCurrentEntry(key);\n }\n\n let checkKey = keyIsBeyondCurrentEntry;\n\n const c = new this.Collection(\n this,\n () => createRange(set[0][0], set[set.length - 1][1], !includeLowers, !includeUppers));\n\n c._ondirectionchange = direction => {\n if (direction === \"next\") {\n checkKey = keyIsBeyondCurrentEntry;\n sortDirection = ascending;\n } else {\n checkKey = keyIsBeforeCurrentEntry;\n sortDirection = descending;\n }\n set.sort(rangeSorter);\n };\n\n c._addAlgorithm((cursor, advance, resolve) => {\n var key = cursor.key;\n while (checkKey(key)) {\n // The cursor has passed beyond this key. Check next.\n ++rangePos;\n if (rangePos === set.length) {\n // There is no next. Stop searching.\n advance(resolve);\n return false;\n }\n }\n if (keyWithinCurrentRange(key)) {\n // The current cursor value should be included and we should continue a single step in case next item has the same key or possibly our next key in set.\n return true;\n } else if (this._cmp(key, set[rangePos][1]) === 0 || this._cmp(key, set[rangePos][0]) === 0) {\n // includeUpper or includeLower is false so keyWithinCurrentRange() returns false even though we are at range border.\n // Continue to next key but don't include this one.\n return false;\n } else {\n // cursor.key not yet at set[i]. Forward cursor to the next key to hunt for.\n advance(() => {\n if (sortDirection === ascending) cursor.continue(set[rangePos][0]);\n else cursor.continue(set[rangePos][1]);\n });\n return false;\n }\n });\n return c;\n }\n\n /** WhereClause.startsWithAnyOf()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.startsWithAnyOf()\n * \n **/\n startsWithAnyOf(...prefixes: string[]): Collection;\n startsWithAnyOf(prefixes: string[]): Collection;\n startsWithAnyOf() {\n const set = getArrayOf.apply(NO_CHAR_ARRAY, arguments);\n\n if (!set.every(s => typeof s === 'string')) {\n return fail(this, \"startsWithAnyOf() only works with strings\");\n }\n if (set.length === 0) return emptyCollection(this);\n\n return this.inAnyRange(set.map((str: string) => [str, str + maxString]));\n }\n\n}\n","import { Dexie } from '../dexie';\nimport { makeClassConstructor } from '../../functions/make-class-constructor';\nimport { WhereClause } from './where-clause';\nimport { Table } from '../table';\nimport { Collection } from '../collection';\nimport { exceptions } from '../../errors';\n\nexport interface WhereClauseConstructor {\n new(table: Table, index?: string, orCollection?: Collection): WhereClause;\n prototype: WhereClause;\n}\n\n/** Generates a WhereClause constructor.\n * \n * The purpose of having dynamically created constructors, is to allow\n * addons to extend classes for a certain Dexie instance without affecting\n * other db instances.\n */\nexport function createWhereClauseConstructor(db: Dexie) {\n return makeClassConstructor(\n WhereClause.prototype,\n\n function WhereClause(this: WhereClause, table: Table, index?: string, orCollection?: Collection) {\n this.db = db;\n this._ctx = {\n table: table,\n index: index === \":id\" ? null : index,\n or: orCollection\n };\n const indexedDB = db._deps.indexedDB;\n if (!indexedDB) throw new exceptions.MissingAPI();\n this._cmp = this._ascending = indexedDB.cmp.bind(indexedDB);\n this._descending = (a, b) => indexedDB.cmp(b, a);\n this._max = (a, b) => indexedDB.cmp(a,b) > 0 ? a : b;\n this._min = (a, b) => indexedDB.cmp(a,b) < 0 ? a : b;\n this._IDBKeyRange = db._deps.IDBKeyRange;\n }\n );\n}\n","import { wrap } from \"../helpers/promise\";\n\nexport function eventRejectHandler(reject) {\n return wrap(function (event) {\n preventDefault(event);\n reject (event.target.error);\n return false;\n });\n}\n\nexport function eventSuccessHandler (resolve) {\n return wrap(function (event){\n resolve(event.target.result);\n });\n}\n\nexport function hookedEventRejectHandler (reject) {\n return wrap(function (event) {\n // See comment on hookedEventSuccessHandler() why wrap() is needed only when supporting hooks.\n \n var req = event.target,\n err = req.error,\n ctx = req._hookCtx,// Contains the hook error handler. Put here instead of closure to boost performance.\n hookErrorHandler = ctx && ctx.onerror;\n hookErrorHandler && hookErrorHandler(err);\n preventDefault(event);\n reject (err);\n return false;\n });\n}\n\nexport function hookedEventSuccessHandler(resolve) {\n // wrap() is needed when calling hooks because the rare scenario of:\n // * hook does a db operation that fails immediately (IDB throws exception)\n // For calling db operations on correct transaction, wrap makes sure to set PSD correctly.\n // wrap() will also execute in a virtual tick.\n // * If not wrapped in a virtual tick, direct exception will launch a new physical tick.\n // * If this was the last event in the bulk, the promise will resolve after a physical tick\n // and the transaction will have committed already.\n // If no hook, the virtual tick will be executed in the reject()/resolve of the final promise,\n // because it is always marked with _lib = true when created using Transaction._promise().\n return wrap(function(event) {\n var req = event.target,\n ctx = req._hookCtx,// Contains the hook error handler. Put here instead of closure to boost performance.\n result = ctx.value || req.result, // Pass the object value on updates. The result from IDB is the primary key.\n hookSuccessHandler = ctx && ctx.onsuccess;\n hookSuccessHandler && hookSuccessHandler(result);\n resolve && resolve(result);\n }, resolve);\n}\n\n\nexport function preventDefault(event) {\n if (event.stopPropagation) // IndexedDBShim doesnt support this on Safari 8 and below.\n event.stopPropagation();\n if (event.preventDefault) // IndexedDBShim doesnt support this on Safari 8 and below.\n event.preventDefault();\n}\n\nexport function BulkErrorHandlerCatchAll(errorList, done?, supportHooks?) {\n return (supportHooks ? hookedEventRejectHandler : eventRejectHandler)(e => {\n errorList.push(e);\n done && done();\n });\n}\n\n","import Events from '../helpers/Events';\nimport { GlobalDexieEvents } from '../public/types/db-events';\n\nexport const DEXIE_STORAGE_MUTATED_EVENT_NAME = 'storagemutated' as 'storagemutated';\n\n// Name of the global event fired using DOM dispatchEvent (if not in node).\n// Reason for propagating this as a DOM event is for getting reactivity across\n// multiple versions of Dexie within the same app (as long as they are\n// compatible with regards to the event data).\n// If the ObservabilitySet protocol change in a way that would not be backward\n// compatible, make sure also update the event name to a new number at the end\n// so that two Dexie instances of different versions continue to work together\n// - maybe not able to communicate but won't fail due to unexpected data in\n// the detail property of the CustomEvent. If so, also make sure to udpate\n// docs and explain at which Dexie version the new name and format of the event\n// is being used.\nexport const STORAGE_MUTATED_DOM_EVENT_NAME = 'x-storagemutated-1';\n\nexport const globalEvents = Events(null, DEXIE_STORAGE_MUTATED_EVENT_NAME) as GlobalDexieEvents;\n","import { Transaction as ITransaction } from '../../public/types/transaction';\nimport { DexiePromise, wrap, rejection } from \"../../helpers/promise\";\nimport { DbSchema } from '../../public/types/db-schema';\nimport { assert, hasOwn } from '../../functions/utils';\nimport { PSD, usePSD } from '../../helpers/promise';\nimport { Dexie } from '../dexie';\nimport { exceptions } from '../../errors';\nimport { safariMultiStoreFix } from '../../functions/quirks';\nimport { preventDefault } from '../../functions/event-wrappers';\nimport { newScope } from '../../helpers/promise';\nimport * as Debug from '../../helpers/debug';\nimport { Table } from '../table';\nimport { globalEvents } from '../../globals/global-events';\n\n/** Transaction\n * \n * https://dexie.org/docs/Transaction/Transaction\n * \n **/\nexport class Transaction implements ITransaction {\n db: Dexie;\n active: boolean;\n mode: IDBTransactionMode;\n chromeTransactionDurability: ChromeTransactionDurability;\n idbtrans: IDBTransaction;\n storeNames: string[];\n on: any;\n parent?: Transaction;\n schema: DbSchema;\n _memoizedTables: {[tableName: string]: Table};\n\n _reculock: number;\n _blockedFuncs: { 0: () => any, 1: any }[];\n _resolve: () => void;\n _reject: (Error) => void;\n _waitingFor: DexiePromise; // for waitFor()\n _waitingQueue: Function[]; // for waitFor()\n _spinCount: number; // Just for debugging waitFor()\n _completion: DexiePromise;\n\n //\n // Transaction internal methods (not required by API users, but needed internally and eventually by dexie extensions)\n //\n\n /** Transaction._lock()\n * \n * Internal method.\n */\n _lock() {\n assert(!PSD.global); // Locking and unlocking reuires to be within a PSD scope.\n // Temporary set all requests into a pending queue if they are called before database is ready.\n ++this._reculock; // Recursive read/write lock pattern using PSD (Promise Specific Data) instead of TLS (Thread Local Storage)\n if (this._reculock === 1 && !PSD.global) PSD.lockOwnerFor = this;\n return this;\n }\n\n /** Transaction._unlock()\n * \n * Internal method.\n */\n _unlock() {\n assert(!PSD.global); // Locking and unlocking reuires to be within a PSD scope.\n if (--this._reculock === 0) {\n if (!PSD.global) PSD.lockOwnerFor = null;\n while (this._blockedFuncs.length > 0 && !this._locked()) {\n var fnAndPSD = this._blockedFuncs.shift();\n try { usePSD(fnAndPSD[1], fnAndPSD[0]); } catch (e) { }\n }\n }\n return this;\n }\n\n /** Transaction._lock()\n * \n * Internal method.\n */\n _locked() {\n // Checks if any write-lock is applied on this transaction.\n // To simplify the Dexie API for extension implementations, we support recursive locks.\n // This is accomplished by using \"Promise Specific Data\" (PSD).\n // PSD data is bound to a Promise and any child Promise emitted through then() or resolve( new Promise() ).\n // PSD is local to code executing on top of the call stacks of any of any code executed by Promise():\n // * callback given to the Promise() constructor (function (resolve, reject){...})\n // * callbacks given to then()/catch()/finally() methods (function (value){...})\n // If creating a new independant Promise instance from within a Promise call stack, the new Promise will derive the PSD from the call stack of the parent Promise.\n // Derivation is done so that the inner PSD __proto__ points to the outer PSD.\n // PSD.lockOwnerFor will point to current transaction object if the currently executing PSD scope owns the lock.\n return this._reculock && PSD.lockOwnerFor !== this;\n }\n\n /** Transaction.create()\n * \n * Internal method.\n * \n */\n create(idbtrans?: IDBTransaction) {\n if (!this.mode) return this;\n const idbdb = this.db.idbdb;\n const dbOpenError = this.db._state.dbOpenError;\n assert(!this.idbtrans);\n if (!idbtrans && !idbdb) {\n switch (dbOpenError && dbOpenError.name) {\n case \"DatabaseClosedError\":\n // Errors where it is no difference whether it was caused by the user operation or an earlier call to db.open()\n throw new exceptions.DatabaseClosed(dbOpenError);\n case \"MissingAPIError\":\n // Errors where it is no difference whether it was caused by the user operation or an earlier call to db.open()\n throw new exceptions.MissingAPI(dbOpenError.message, dbOpenError);\n default:\n // Make it clear that the user operation was not what caused the error - the error had occurred earlier on db.open()!\n throw new exceptions.OpenFailed(dbOpenError);\n }\n }\n if (!this.active) throw new exceptions.TransactionInactive();\n assert(this._completion._state === null); // Completion Promise must still be pending.\n\n idbtrans = this.idbtrans = idbtrans ||\n (this.db.core \n ? this.db.core.transaction(this.storeNames, this.mode as 'readwrite' | 'readonly', { durability: this.chromeTransactionDurability })\n : idbdb.transaction(this.storeNames, this.mode, { durability: this.chromeTransactionDurability })\n ) as IDBTransaction;\n\n idbtrans.onerror = wrap(ev => {\n preventDefault(ev);// Prohibit default bubbling to window.error\n this._reject(idbtrans.error);\n });\n idbtrans.onabort = wrap(ev => {\n preventDefault(ev);\n this.active && this._reject(new exceptions.Abort(idbtrans.error));\n this.active = false;\n this.on(\"abort\").fire(ev);\n });\n idbtrans.oncomplete = wrap(() => {\n this.active = false;\n this._resolve();\n if ('mutatedParts' in idbtrans) {\n globalEvents.storagemutated.fire(idbtrans[\"mutatedParts\"]);\n }\n });\n return this;\n }\n\n /** Transaction._promise()\n * \n * Internal method.\n */\n _promise(\n mode: IDBTransactionMode,\n fn: (resolve, reject, trans: Transaction) => PromiseLike | void,\n bWriteLock?: string | boolean): DexiePromise\n {\n if (mode === 'readwrite' && this.mode !== 'readwrite')\n return rejection(new exceptions.ReadOnly(\"Transaction is readonly\"));\n\n if (!this.active)\n return rejection(new exceptions.TransactionInactive());\n\n if (this._locked()) {\n return new DexiePromise((resolve, reject) => {\n this._blockedFuncs.push([() => {\n this._promise(mode, fn, bWriteLock).then(resolve, reject);\n }, PSD]);\n });\n\n } else if (bWriteLock) {\n return newScope(() => {\n var p = new DexiePromise((resolve, reject) => {\n this._lock();\n const rv = fn(resolve, reject, this);\n if (rv && rv.then) rv.then(resolve, reject);\n });\n p.finally(() => this._unlock());\n p._lib = true;\n return p;\n });\n\n } else {\n var p = new DexiePromise((resolve, reject) => {\n var rv = fn(resolve, reject, this);\n if (rv && rv.then) rv.then(resolve, reject);\n });\n p._lib = true;\n return p;\n }\n }\n\n /** Transaction._root()\n * \n * Internal method. Retrieves the root transaction in the tree of sub transactions.\n */\n _root() {\n return this.parent ? this.parent._root() : this;\n }\n\n /** Transaction.waitFor()\n * \n * Internal method. Can be accessed from the public API through\n * Dexie.waitFor(): https://dexie.org/docs/Dexie/Dexie.waitFor()\n * \n **/\n waitFor(promiseLike: PromiseLike) {\n // Always operate on the root transaction (in case this is a sub stransaction)\n var root = this._root();\n // For stability reasons, convert parameter to promise no matter what type is passed to waitFor().\n // (We must be able to call .then() on it.)\n const promise = DexiePromise.resolve(promiseLike);\n if (root._waitingFor) {\n // Already called waitFor(). Wait for both to complete.\n root._waitingFor = root._waitingFor.then(() => promise);\n } else {\n // We're not in waiting state. Start waiting state.\n root._waitingFor = promise;\n root._waitingQueue = [];\n // Start interacting with indexedDB until promise completes:\n var store = root.idbtrans.objectStore(root.storeNames[0]);\n (function spin() {\n ++root._spinCount; // For debugging only\n while (root._waitingQueue.length) (root._waitingQueue.shift())();\n if (root._waitingFor) store.get(-Infinity).onsuccess = spin;\n }());\n }\n var currentWaitPromise = root._waitingFor;\n return new DexiePromise((resolve, reject) => {\n promise.then(\n res => root._waitingQueue.push(wrap(resolve.bind(null, res))),\n err => root._waitingQueue.push(wrap(reject.bind(null, err)))\n ).finally(() => {\n if (root._waitingFor === currentWaitPromise) {\n // No one added a wait after us. Safe to stop the spinning.\n root._waitingFor = null;\n }\n });\n });\n } \n\n /** Transaction.abort()\n * \n * https://dexie.org/docs/Transaction/Transaction.abort()\n */\n abort() {\n if (this.active) {\n this.active = false;\n if (this.idbtrans) this.idbtrans.abort();\n this._reject(new exceptions.Abort());\n }\n }\n\n /** Transaction.table()\n * \n * https://dexie.org/docs/Transaction/Transaction.table()\n */\n table(tableName: string) {\n const memoizedTables = (this._memoizedTables || (this._memoizedTables = {}));\n if (hasOwn(memoizedTables, tableName))\n return memoizedTables[tableName];\n const tableSchema = this.schema[tableName];\n if (!tableSchema) {\n throw new exceptions.NotFound(\"Table \" + tableName + \" not part of transaction\"); \n }\n\n const transactionBoundTable = new this.db.Table(tableName, tableSchema, this);\n transactionBoundTable.core = this.db.core.table(tableName);\n memoizedTables[tableName] = transactionBoundTable;\n return transactionBoundTable;\n }\n}\n","import { Dexie } from '../dexie';\nimport { makeClassConstructor } from '../../functions/make-class-constructor';\nimport { Transaction } from './transaction';\nimport { DbSchema } from '../../public/types/db-schema';\nimport Events from '../../helpers/Events';\nimport Promise, { rejection } from '../../helpers/promise';\n\nexport interface TransactionConstructor {\n new (\n mode: IDBTransactionMode,\n storeNames: string[],\n dbschema: DbSchema,\n chromeTransactionDurability: ChromeTransactionDurability,\n parent?: Transaction) : T;\n prototype: T;\n}\n\n/** Generates a Transaction constructor bound to given Dexie instance.\n * \n * The purpose of having dynamically created constructors, is to allow\n * addons to extend classes for a certain Dexie instance without affecting\n * other db instances.\n */\nexport function createTransactionConstructor(db: Dexie) {\n return makeClassConstructor>(\n Transaction.prototype,\n function Transaction (\n this: Transaction,\n mode: IDBTransactionMode,\n storeNames: string[],\n dbschema: DbSchema,\n chromeTransactionDurability: ChromeTransactionDurability,\n parent?: Transaction)\n {\n this.db = db;\n this.mode = mode;\n this.storeNames = storeNames;\n this.schema = dbschema;\n this.chromeTransactionDurability = chromeTransactionDurability;\n this.idbtrans = null;\n this.on = Events(this, \"complete\", \"error\", \"abort\");\n this.parent = parent || null;\n this.active = true;\n this._reculock = 0;\n this._blockedFuncs = [];\n this._resolve = null;\n this._reject = null;\n this._waitingFor = null;\n this._waitingQueue = null;\n this._spinCount = 0; // Just for debugging waitFor()\n this._completion = new Promise ((resolve, reject) => {\n this._resolve = resolve;\n this._reject = reject;\n });\n \n this._completion.then(\n ()=> {\n this.active = false;\n this.on.complete.fire();\n },\n e => {\n var wasActive = this.active;\n this.active = false;\n this.on.error.fire(e);\n this.parent ?\n this.parent._reject(e) :\n wasActive && this.idbtrans && this.idbtrans.abort();\n return rejection(e); // Indicate we actually DO NOT catch this error.\n });\n \n });\n}\n","import { IndexSpec } from '../public/types/index-spec';\n\nexport function createIndexSpec(\n name: string,\n keyPath: string | string[],\n unique: boolean,\n multi: boolean,\n auto: boolean,\n compound: boolean,\n isPrimKey: boolean\n): IndexSpec {\n return {\n name,\n keyPath,\n unique,\n multi,\n auto,\n compound,\n src: (unique && !isPrimKey ? '&' : '') + (multi ? '*' : '') + (auto ? \"++\" : \"\") + nameFromKeyPath(keyPath)\n }\n}\n\nexport function nameFromKeyPath (keyPath?: string | string[]): string {\n return typeof keyPath === 'string' ?\n keyPath :\n keyPath ? ('[' + [].join.call(keyPath, '+') + ']') : \"\";\n}\n","import { IndexSpec } from '../public/types/index-spec';\nimport { TableSchema } from '../public/types/table-schema';\nimport { createIndexSpec } from './index-spec';\nimport { arrayToObject } from '../functions/utils';\n\nexport function createTableSchema (\n name: string,\n primKey: IndexSpec,\n indexes: IndexSpec[]\n): TableSchema {\n return {\n name,\n primKey,\n indexes,\n mappedClass: null,\n idxByName: arrayToObject(indexes, index => [index.name, index])\n };\n}\n","import { maxString } from '../globals/constants';\n\nexport function safariMultiStoreFix(storeNames: string[]) {\n return storeNames.length === 1 ? storeNames[0] : storeNames;\n}\n\nexport function getNativeGetDatabaseNamesFn(indexedDB) {\n var fn = indexedDB && (indexedDB.getDatabaseNames || indexedDB.webkitGetDatabaseNames);\n return fn && fn.bind(indexedDB);\n}\n\nexport let getMaxKey = (IdbKeyRange: typeof IDBKeyRange) => {\n try {\n IdbKeyRange.only([[]]);\n getMaxKey = () => [[]];\n return [[]];\n } catch (e) {\n getMaxKey = () => maxString;\n return maxString;\n }\n}\n","import { getByKeyPath } from '../functions/utils';\n\nexport function getKeyExtractor (keyPath: null | string | string[]) : (a: any) => any {\n if (keyPath == null) {\n return () => undefined;\n } else if (typeof keyPath === 'string') {\n return getSinglePathKeyExtractor(keyPath);\n } else {\n return obj => getByKeyPath(obj, keyPath);\n }\n}\n\nexport function getSinglePathKeyExtractor(keyPath: string) {\n const split = keyPath.split('.');\n if (split.length === 1) {\n return obj => obj[keyPath];\n } else {\n return obj => getByKeyPath(obj, keyPath);\n }\n}\n","import {\n DBCore,\n DBCoreCursor,\n DBCoreOpenCursorRequest,\n DBCoreQueryRequest,\n DBCoreIndex,\n DBCoreKeyRange,\n DBCoreQueryResponse,\n DBCoreRangeType,\n DBCoreSchema,\n DBCoreTableSchema,\n DBCoreTable,\n DBCoreMutateResponse,\n} from \"../public/types/dbcore\";\nimport { isArray } from '../functions/utils';\nimport { eventRejectHandler, preventDefault } from '../functions/event-wrappers';\nimport { wrap } from '../helpers/promise';\nimport { getMaxKey } from '../functions/quirks';\nimport { getKeyExtractor } from './get-key-extractor';\n\nexport function arrayify(arrayLike: {length: number, [index: number]: T}): T[] {\n return [].slice.call(arrayLike);\n}\nexport function pick(obj: T, props: Prop[]): Pick {\n const result = {} as Pick;\n props.forEach(prop => result[prop] = obj[prop]);\n return result;\n}\n\nlet _id_counter = 0;\n\nexport function getKeyPathAlias(keyPath: null | string | string[]) {\n return keyPath == null ?\n \":id\" :\n typeof keyPath === 'string' ?\n keyPath :\n `[${keyPath.join('+')}]`;\n}\n\nexport function createDBCore (\n db: IDBDatabase,\n IdbKeyRange: typeof IDBKeyRange,\n tmpTrans: IDBTransaction) : DBCore\n{\n function extractSchema(db: IDBDatabase, trans: IDBTransaction) : {schema: DBCoreSchema, hasGetAll: boolean} {\n const tables = arrayify(db.objectStoreNames);\n return {\n schema: {\n name: db.name,\n tables: tables.map(table => trans.objectStore(table)).map(store => {\n const {keyPath, autoIncrement} = store;\n const compound = isArray(keyPath);\n const outbound = keyPath == null;\n const indexByKeyPath: {[keyPathAlias: string]: DBCoreIndex} = {};\n const result = {\n name: store.name,\n primaryKey: {\n name: null,\n isPrimaryKey: true,\n outbound,\n compound,\n keyPath,\n autoIncrement,\n unique: true,\n extractKey: getKeyExtractor(keyPath)\n } as DBCoreIndex,\n indexes: arrayify(store.indexNames).map(indexName => store.index(indexName))\n .map(index => {\n const {name, unique, multiEntry, keyPath} = index;\n const compound = isArray(keyPath);\n const result: DBCoreIndex = {\n name,\n compound,\n keyPath,\n unique,\n multiEntry,\n extractKey: getKeyExtractor(keyPath)\n };\n indexByKeyPath[getKeyPathAlias(keyPath)] = result;\n return result;\n }),\n getIndexByKeyPath: (keyPath: null | string | string[]) => indexByKeyPath[getKeyPathAlias(keyPath)]\n };\n indexByKeyPath[\":id\"] = result.primaryKey;\n if (keyPath != null) {\n indexByKeyPath[getKeyPathAlias(keyPath)] = result.primaryKey;\n }\n return result;\n })\n },\n hasGetAll: tables.length > 0 && ('getAll' in trans.objectStore(tables[0])) &&\n !(typeof navigator !== 'undefined' && /Safari/.test(navigator.userAgent) &&\n !/(Chrome\\/|Edge\\/)/.test(navigator.userAgent) &&\n [].concat(navigator.userAgent.match(/Safari\\/(\\d*)/))[1] < 604) // Bug with getAll() on Safari ver<604. See discussion following PR #579\n };\n }\n\n function makeIDBKeyRange (range: DBCoreKeyRange) : IDBKeyRange | null {\n if (range.type === DBCoreRangeType.Any) return null;\n if (range.type === DBCoreRangeType.Never) throw new Error(\"Cannot convert never type to IDBKeyRange\");\n const {lower, upper, lowerOpen, upperOpen} = range;\n const idbRange = lower === undefined ?\n upper === undefined ?\n null : //IDBKeyRange.lowerBound(-Infinity, false) : // Any range (TODO: Should we return null instead?)\n IdbKeyRange.upperBound(upper, !!upperOpen) : // below\n upper === undefined ?\n IdbKeyRange.lowerBound(lower, !!lowerOpen) : // above\n IdbKeyRange.bound(lower, upper, !!lowerOpen, !!upperOpen);\n return idbRange;\n }\n\n function createDbCoreTable(tableSchema: DBCoreTableSchema): DBCoreTable {\n const tableName = tableSchema.name;\n\n function mutate ({trans, type, keys, values, range}) {\n return new Promise((resolve, reject) => {\n resolve = wrap(resolve);\n const store = (trans as IDBTransaction).objectStore(tableName);\n const outbound = store.keyPath == null;\n const isAddOrPut = type === \"put\" || type === \"add\";\n if (!isAddOrPut && type !== 'delete' && type !== 'deleteRange')\n throw new Error (\"Invalid operation type: \" + type);\n\n const {length} = keys || values || {length: 1}; // keys.length if keys. values.length if values. 1 if range.\n if (keys && values && keys.length !== values.length) {\n throw new Error(\"Given keys array must have same length as given values array.\");\n }\n if (length === 0)\n // No items to write. Don't even bother!\n return resolve({numFailures: 0, failures: {}, results: [], lastResult: undefined});\n\n let req: IDBRequest;\n const reqs: IDBRequest[] = [];\n \n const failures: {[operationNumber: number]: Error} = [];\n let numFailures = 0;\n const errorHandler = \n event => {\n ++numFailures;\n preventDefault(event);\n };\n \n if (type === 'deleteRange') {\n // Here the argument is the range\n if (range.type === DBCoreRangeType.Never)\n return resolve({numFailures, failures, results: [], lastResult: undefined}); // Deleting the Never range shoulnt do anything.\n if (range.type === DBCoreRangeType.Any)\n reqs.push(req = store.clear()); // Deleting the Any range is equivalent to store.clear()\n else\n reqs.push(req = store.delete(makeIDBKeyRange(range)));\n } else {\n // No matter add, put or delete - find out arrays of first and second arguments to it.\n const [args1, args2] = isAddOrPut ?\n outbound ?\n [values, keys] :\n [values, null] :\n [keys, null];\n\n if (isAddOrPut) {\n for (let i=0; i {\n const lastResult = event.target.result;\n reqs.forEach((req, i) => req.error != null && (failures[i] = req.error));\n resolve({\n numFailures,\n failures,\n results: type === \"delete\" ? keys : reqs.map(req => req.result),\n lastResult\n });\n };\n \n req.onerror = event => { // wrap() not needed. All paths calling outside will wrap!\n errorHandler(event);\n done(event);\n };\n \n req.onsuccess = done;\n });\n }\n \n function openCursor ({trans, values, query, reverse, unique}: DBCoreOpenCursorRequest): Promise\n {\n return new Promise((resolve, reject) => {\n resolve = wrap(resolve);\n const {index, range} = query;\n const store = (trans as IDBTransaction).objectStore(tableName);\n // source\n const source = index.isPrimaryKey ?\n store :\n store.index(index.name);\n // direction\n const direction = reverse ?\n unique ?\n \"prevunique\" :\n \"prev\" :\n unique ?\n \"nextunique\" :\n \"next\";\n // request\n const req = values || !('openKeyCursor' in source) ?\n source.openCursor(makeIDBKeyRange(range), direction) :\n source.openKeyCursor(makeIDBKeyRange(range), direction);\n \n // iteration\n req.onerror = eventRejectHandler(reject);\n req.onsuccess = wrap(ev => {\n\n const cursor = req.result as unknown as DBCoreCursor;\n if (!cursor) {\n resolve(null);\n return;\n }\n (cursor as any).___id = ++_id_counter;\n (cursor as any).done = false;\n const _cursorContinue = cursor.continue.bind(cursor);\n let _cursorContinuePrimaryKey = cursor.continuePrimaryKey;\n if (_cursorContinuePrimaryKey) _cursorContinuePrimaryKey = _cursorContinuePrimaryKey.bind(cursor);\n const _cursorAdvance = cursor.advance.bind(cursor);\n const doThrowCursorIsNotStarted = ()=>{throw new Error(\"Cursor not started\");}\n const doThrowCursorIsStopped = ()=>{throw new Error(\"Cursor not stopped\");}\n (cursor as any).trans = trans;\n cursor.stop = cursor.continue = cursor.continuePrimaryKey = cursor.advance = doThrowCursorIsNotStarted;\n cursor.fail = wrap(reject);\n cursor.next = function (this: DBCoreCursor) {\n // next() must work with \"this\" pointer in order to function correctly for ProxyCursors (derived objects)\n // without having to re-define next() on each child.\n let gotOne = 1;\n return this.start(() => gotOne-- ? this.continue() : this.stop()).then(() => this);\n };\n cursor.start = (callback) => {\n //console.log(\"Starting cursor\", (cursor as any).___id);\n const iterationPromise = new Promise((resolveIteration, rejectIteration) =>{\n resolveIteration = wrap(resolveIteration);\n req.onerror = eventRejectHandler(rejectIteration);\n cursor.fail = rejectIteration;\n cursor.stop = value => {\n //console.log(\"Cursor stop\", cursor);\n cursor.stop = cursor.continue = cursor.continuePrimaryKey = cursor.advance = doThrowCursorIsStopped;\n resolveIteration(value);\n };\n });\n // Now change req.onsuccess to a callback that doesn't call initCursor but just observer.next()\n const guardedCallback = () => {\n if (req.result) {\n //console.log(\"Next result\", cursor);\n try {\n callback();\n } catch (err) {\n cursor.fail(err);\n }\n } else {\n (cursor as any).done = true;\n cursor.start = ()=>{throw new Error(\"Cursor behind last entry\");}\n cursor.stop();\n }\n }\n req.onsuccess = wrap(ev => {\n //cursor.continue = _cursorContinue;\n //cursor.continuePrimaryKey = _cursorContinuePrimaryKey;\n //cursor.advance = _cursorAdvance;\n req.onsuccess = guardedCallback;\n guardedCallback();\n });\n cursor.continue = _cursorContinue;\n cursor.continuePrimaryKey = _cursorContinuePrimaryKey;\n cursor.advance = _cursorAdvance;\n guardedCallback();\n return iterationPromise;\n };\n resolve(cursor);\n }, reject); \n });\n }\n \n function query (hasGetAll: boolean) {\n return (request: DBCoreQueryRequest) => {\n return new Promise((resolve, reject) => {\n resolve = wrap(resolve);\n const {trans, values, limit, query} = request;\n const nonInfinitLimit = limit === Infinity ? undefined : limit;\n const {index, range} = query;\n const store = (trans as IDBTransaction).objectStore(tableName);\n const source = index.isPrimaryKey ? store : store.index(index.name);\n const idbKeyRange = makeIDBKeyRange(range);\n if (limit === 0) return resolve({result: []});\n if (hasGetAll) {\n const req = values ?\n (source as any).getAll(idbKeyRange, nonInfinitLimit) :\n (source as any).getAllKeys(idbKeyRange, nonInfinitLimit);\n req.onsuccess = event => resolve({result: event.target.result});\n req.onerror = eventRejectHandler(reject);\n } else {\n let count = 0;\n const req = values || !('openKeyCursor' in source) ?\n source.openCursor(idbKeyRange) :\n source.openKeyCursor(idbKeyRange)\n const result = [];\n req.onsuccess = event => {\n const cursor = req.result as IDBCursorWithValue;\n if (!cursor) return resolve({result});\n result.push(values ? cursor.value : cursor.primaryKey);\n if (++count === limit) return resolve({result});\n cursor.continue();\n };\n req.onerror = eventRejectHandler(reject);\n }\n });\n };\n }\n \n return {\n name: tableName,\n schema: tableSchema,\n \n mutate,\n\n getMany ({trans, keys}) {\n return new Promise((resolve, reject) => {\n resolve = wrap(resolve);\n const store = (trans as IDBTransaction).objectStore(tableName);\n const length = keys.length;\n const result = new Array(length);\n let keyCount = 0;\n let callbackCount = 0;\n let valueCount = 0;\n let req: IDBRequest & {_pos?: number};\n \n const successHandler = event => {\n const req = event.target;\n if ((result[req._pos] = req.result) != null) ++valueCount;\n if (++callbackCount === keyCount) resolve(result);\n };\n const errorHandler = eventRejectHandler(reject);\n \n for (let i=0; i((resolve, reject) => {\n resolve = wrap (resolve);\n const store = (trans as IDBTransaction).objectStore(tableName);\n const req = store.get(key);\n req.onsuccess = event => resolve((event.target as any).result);\n req.onerror = eventRejectHandler(reject);\n });\n },\n\n query: query(hasGetAll),\n \n openCursor,\n\n count ({query, trans}) {\n const {index, range} = query;\n return new Promise((resolve, reject) => {\n const store = (trans as IDBTransaction).objectStore(tableName);\n const source = index.isPrimaryKey ? store : store.index(index.name);\n const idbKeyRange = makeIDBKeyRange(range);\n const req = idbKeyRange ? source.count(idbKeyRange) : source.count();\n req.onsuccess = wrap(ev => resolve((ev.target as IDBRequest).result));\n req.onerror = eventRejectHandler(reject);\n });\n }\n };\n }\n\n const {schema, hasGetAll} = extractSchema(db, tmpTrans);\n const tables = schema.tables.map(tableSchema => createDbCoreTable(tableSchema));\n const tableMap: {[name: string]: DBCoreTable} = {};\n tables.forEach(table => tableMap[table.name] = table);\n return {\n stack: \"dbcore\",\n \n transaction: db.transaction.bind(db),\n\n table(name: string) {\n const result = tableMap[name];\n if (!result) throw new Error(`Table '${name}' not found`);\n return tableMap[name];\n },\n\n MIN_KEY: -Infinity,\n\n MAX_KEY: getMaxKey(IdbKeyRange),\n\n schema\n\n };\n}\n","import { Dexie } from './';\nimport { createDBCore } from '../../dbcore/dbcore-indexeddb';\nimport { DBCore } from '../../public/types/dbcore';\nimport { DexieDOMDependencies } from '../../public/types/dexie-dom-dependencies';\nimport { DexieStacks, Middleware } from '../../public/types/middleware';\nimport { exceptions } from '../../errors';\n\nfunction createMiddlewareStack(\n stackImpl: {stack: string},\n middlewares: Middleware<{stack: string}>[]): TStack {\n return middlewares.reduce((down, {create}) => ({...down, ...create(down)}), stackImpl) as TStack;\n} \n\nfunction createMiddlewareStacks(\n middlewares: {[StackName in keyof DexieStacks]?: Middleware[]},\n idbdb: IDBDatabase,\n {IDBKeyRange, indexedDB}: DexieDOMDependencies,\n tmpTrans: IDBTransaction): {[StackName in keyof DexieStacks]?: DexieStacks[StackName]}\n{\n const dbcore = createMiddlewareStack(\n createDBCore(idbdb, IDBKeyRange, tmpTrans),\n middlewares.dbcore);\n \n // TODO: Create other stacks the same way as above. They might be dependant on the result\n // of creating dbcore stack.\n\n return {\n dbcore\n };\n}\n\nexport function generateMiddlewareStacks({_novip: db}: Dexie, tmpTrans: IDBTransaction) {\n const idbdb = tmpTrans.db;\n const stacks = createMiddlewareStacks(db._middlewares, idbdb, db._deps, tmpTrans);\n db.core = stacks.dbcore!;\n db.tables.forEach(table => {\n const tableName = table.name;\n if (db.core.schema.tables.some(tbl => tbl.name === tableName)) {\n table.core = db.core.table(tableName);\n if (db[tableName] instanceof db.Table) {\n db[tableName].core = table.core;\n }\n }\n });\n}\n","import { Dexie } from '../dexie';\nimport { DbSchema } from '../../public/types/db-schema';\nimport { _global } from \"../../globals/global\";\nimport { setProp, keys, slice, isArray, shallowClone, isAsyncFunction, defineProperty, getPropertyDescriptor } from '../../functions/utils';\nimport { Transaction } from '../transaction';\nimport { Version } from './version';\nimport Promise, { PSD, newScope, NativePromise, decrementExpectedAwaits, incrementExpectedAwaits } from '../../helpers/promise';\nimport { exceptions } from '../../errors';\nimport { TableSchema } from '../../public/types/table-schema';\nimport { IndexSpec } from '../../public/types/index-spec';\nimport { hasIEDeleteObjectStoreBug, isIEOrEdge } from '../../globals/constants';\nimport { safariMultiStoreFix } from '../../functions/quirks';\nimport { createIndexSpec, nameFromKeyPath } from '../../helpers/index-spec';\nimport { createTableSchema } from '../../helpers/table-schema';\nimport { generateMiddlewareStacks } from '../dexie/generate-middleware-stacks';\n\nexport function setApiOnPlace({_novip: db}: Dexie, objs: Object[], tableNames: string[], dbschema: DbSchema) {\n tableNames.forEach(tableName => {\n const schema = dbschema[tableName];\n objs.forEach(obj => {\n const propDesc = getPropertyDescriptor(obj, tableName);\n if (!propDesc || (\"value\" in propDesc && propDesc.value === undefined)) {\n // Either the prop is not declared, or it is initialized to undefined.\n if (obj === db.Transaction.prototype || obj instanceof db.Transaction) {\n // obj is a Transaction prototype (or prototype of a subclass to Transaction)\n // Make the API a getter that returns this.table(tableName)\n setProp(obj, tableName, {\n get(this: Transaction) { return this.table(tableName); },\n set(value: any) {\n // Issue #1039\n // Let \"this.schema = dbschema;\" and other props in transaction constructor work even if there's a name collision with the table name.\n defineProperty(this, tableName, {value, writable: true, configurable: true, enumerable: true});\n }\n });\n } else {\n // Table will not be bound to a transaction (will use Dexie.currentTransaction)\n obj[tableName] = new db.Table(tableName, schema);\n }\n }\n });\n });\n}\n\nexport function removeTablesApi({_novip: db}: Dexie, objs: Object[]) {\n objs.forEach(obj => {\n for (let key in obj) {\n if (obj[key] instanceof db.Table) delete obj[key];\n }\n });\n}\n\nexport function lowerVersionFirst(a: Version, b: Version) {\n return a._cfg.version - b._cfg.version;\n}\n\nexport function runUpgraders(db: Dexie, oldVersion: number, idbUpgradeTrans: IDBTransaction, reject) {\n const globalSchema = db._dbSchema;\n const trans = db._createTransaction('readwrite', db._storeNames, globalSchema);\n trans.create(idbUpgradeTrans);\n trans._completion.catch(reject);\n const rejectTransaction = trans._reject.bind(trans);\n const transless = PSD.transless || PSD;\n newScope(() => {\n PSD.trans = trans;\n PSD.transless = transless;\n if (oldVersion === 0) {\n // Create tables:\n keys(globalSchema).forEach(tableName => {\n createTable(idbUpgradeTrans, tableName, globalSchema[tableName].primKey, globalSchema[tableName].indexes);\n });\n generateMiddlewareStacks(db, idbUpgradeTrans);\n Promise.follow(() => db.on.populate.fire(trans)).catch(rejectTransaction);\n } else\n updateTablesAndIndexes(db, oldVersion, trans, idbUpgradeTrans).catch(rejectTransaction);\n });\n}\n\nexport type UpgradeQueueItem = (idbtrans: IDBTransaction) => PromiseLike | void;\n\nexport function updateTablesAndIndexes(\n {_novip: db}: Dexie,\n oldVersion: number,\n trans: Transaction,\n idbUpgradeTrans: IDBTransaction)\n{\n // Upgrade version to version, step-by-step from oldest to newest version.\n // Each transaction object will contain the table set that was current in that version (but also not-yet-deleted tables from its previous version)\n const queue: UpgradeQueueItem[] = [];\n const versions = db._versions;\n let globalSchema = db._dbSchema = buildGlobalSchema(db, db.idbdb, idbUpgradeTrans);\n let anyContentUpgraderHasRun = false;\n\n const versToRun = versions.filter(v => v._cfg.version >= oldVersion);\n versToRun.forEach(version => {\n queue.push(() => {\n const oldSchema = globalSchema;\n const newSchema = version._cfg.dbschema;\n adjustToExistingIndexNames(db, oldSchema, idbUpgradeTrans);\n adjustToExistingIndexNames(db, newSchema, idbUpgradeTrans);\n\n globalSchema = db._dbSchema = newSchema;\n\n const diff = getSchemaDiff(oldSchema, newSchema);\n // Add tables \n diff.add.forEach(tuple => {\n createTable(idbUpgradeTrans, tuple[0], tuple[1].primKey, tuple[1].indexes);\n });\n // Change tables\n diff.change.forEach(change => {\n if (change.recreate) {\n throw new exceptions.Upgrade(\"Not yet support for changing primary key\");\n } else {\n const store = idbUpgradeTrans.objectStore(change.name);\n // Add indexes\n change.add.forEach(idx => addIndex(store, idx));\n // Update indexes\n change.change.forEach(idx => {\n store.deleteIndex(idx.name);\n addIndex(store, idx);\n });\n // Delete indexes\n change.del.forEach(idxName => store.deleteIndex(idxName));\n }\n });\n\n const contentUpgrade = version._cfg.contentUpgrade;\n\n if (contentUpgrade && version._cfg.version > oldVersion) {\n // Update db.core with new tables and indexes:\n generateMiddlewareStacks(db, idbUpgradeTrans);\n trans._memoizedTables = {}; // Invalidate memoization as transaction shape may change between versions.\n\n anyContentUpgraderHasRun = true;\n\n // Add to-be-deleted tables to contentUpgrade transaction\n let upgradeSchema = shallowClone(newSchema);\n diff.del.forEach(table => {\n upgradeSchema[table] = oldSchema[table];\n });\n\n // Safe to affect Transaction.prototype globally in this moment,\n // because when this code runs, there may not be any other code\n // that can access any transaction instance, else than this particular\n // upgrader function.\n removeTablesApi(db, [db.Transaction.prototype]);\n setApiOnPlace(db, [db.Transaction.prototype], keys(upgradeSchema), upgradeSchema);\n trans.schema = upgradeSchema;\n\n // Support for native async await.\n const contentUpgradeIsAsync = isAsyncFunction(contentUpgrade);\n if (contentUpgradeIsAsync) {\n incrementExpectedAwaits();\n }\n \n let returnValue: any;\n const promiseFollowed = Promise.follow(() => {\n // Finally, call the scope function with our table and transaction arguments.\n returnValue = contentUpgrade(trans);\n if (returnValue) {\n if (contentUpgradeIsAsync) {\n // contentUpgrade is a native async function - we know for sure returnValue is native promise.\n var decrementor = decrementExpectedAwaits.bind(null, null);\n returnValue.then(decrementor, decrementor);\n }\n }\n });\n return (returnValue && typeof returnValue.then === 'function' ?\n Promise.resolve(returnValue) : promiseFollowed.then(()=>returnValue));\n }\n });\n queue.push(idbtrans => {\n if (!anyContentUpgraderHasRun || !hasIEDeleteObjectStoreBug) { // Dont delete old tables if ieBug is present and a content upgrader has run. Let tables be left in DB so far. This needs to be taken care of.\n const newSchema = version._cfg.dbschema;\n // Delete old tables\n deleteRemovedTables(newSchema, idbtrans);\n }\n // Restore the final API\n removeTablesApi(db, [db.Transaction.prototype]);\n setApiOnPlace(db, [db.Transaction.prototype], db._storeNames, db._dbSchema);\n trans.schema = db._dbSchema;\n });\n });\n\n // Now, create a queue execution engine\n function runQueue() {\n return queue.length ? Promise.resolve(queue.shift()(trans.idbtrans)).then(runQueue) :\n Promise.resolve();\n }\n\n return runQueue().then(() => {\n createMissingTables(globalSchema, idbUpgradeTrans); // At last, make sure to create any missing tables. (Needed by addons that add stores to DB without specifying version)\n });\n}\n\nexport interface SchemaDiff {\n del: string[],\n add: [string, TableSchema][];\n change: TableSchemaDiff[];\n}\n\nexport interface TableSchemaDiff {\n name: string,\n recreate: boolean,\n del: string[],\n add: IndexSpec[],\n change: IndexSpec[]\n}\n\nexport function getSchemaDiff(oldSchema: DbSchema, newSchema: DbSchema): SchemaDiff {\n const diff: SchemaDiff = {\n del: [], // Array of table names\n add: [], // Array of [tableName, newDefinition]\n change: [] // Array of {name: tableName, recreate: newDefinition, del: delIndexNames, add: newIndexDefs, change: changedIndexDefs}\n };\n let table: string;\n for (table in oldSchema) {\n if (!newSchema[table]) diff.del.push(table);\n }\n for (table in newSchema) {\n const oldDef = oldSchema[table],\n newDef = newSchema[table];\n if (!oldDef) {\n diff.add.push([table, newDef]);\n } else {\n const change = {\n name: table,\n def: newDef,\n recreate: false,\n del: [],\n add: [],\n change: []\n };\n if (\n (\n // compare keyPaths no matter if string or string[]\n // compare falsy keypaths same no matter if they are null or empty string.\n ''+(oldDef.primKey.keyPath||'')\n ) !== (\n ''+(newDef.primKey.keyPath||'')\n ) ||\n // Compare the autoIncrement flag also\n (oldDef.primKey.auto !== newDef.primKey.auto && !isIEOrEdge)) // IE has bug reading autoIncrement prop.\n {\n // Primary key has changed. Remove and re-add table.\n change.recreate = true;\n diff.change.push(change);\n } else {\n // Same primary key. Just find out what differs:\n const oldIndexes = oldDef.idxByName;\n const newIndexes = newDef.idxByName;\n let idxName: string;\n for (idxName in oldIndexes) {\n if (!newIndexes[idxName]) change.del.push(idxName);\n }\n for (idxName in newIndexes) {\n const oldIdx = oldIndexes[idxName],\n newIdx = newIndexes[idxName];\n if (!oldIdx) change.add.push(newIdx);\n else if (oldIdx.src !== newIdx.src) change.change.push(newIdx);\n }\n if (change.del.length > 0 || change.add.length > 0 || change.change.length > 0) {\n diff.change.push(change);\n }\n }\n }\n }\n return diff;\n}\n\nexport function createTable(\n idbtrans: IDBTransaction,\n tableName: string,\n primKey: IndexSpec,\n indexes: IndexSpec[]\n) {\n const store = idbtrans.db.createObjectStore(\n tableName,\n primKey.keyPath ?\n { keyPath: primKey.keyPath, autoIncrement: primKey.auto } :\n { autoIncrement: primKey.auto }\n );\n indexes.forEach(idx => addIndex(store, idx));\n return store;\n}\n\nexport function createMissingTables(newSchema: DbSchema, idbtrans: IDBTransaction) {\n keys(newSchema).forEach(tableName => {\n if (!idbtrans.db.objectStoreNames.contains(tableName)) {\n createTable(idbtrans, tableName, newSchema[tableName].primKey, newSchema[tableName].indexes);\n }\n });\n}\n\nexport function deleteRemovedTables(newSchema: DbSchema, idbtrans: IDBTransaction) {\n [].slice.call(idbtrans.db.objectStoreNames).forEach(storeName =>\n newSchema[storeName] == null && idbtrans.db.deleteObjectStore(storeName));\n}\n\nexport function addIndex(store: IDBObjectStore, idx: IndexSpec) {\n store.createIndex(idx.name, idx.keyPath, { unique: idx.unique, multiEntry: idx.multi });\n}\n\nfunction buildGlobalSchema(\n db: Dexie,\n idbdb: IDBDatabase,\n tmpTrans: IDBTransaction\n) {\n const globalSchema = {};\n const dbStoreNames = slice(idbdb.objectStoreNames, 0);\n dbStoreNames.forEach(storeName => {\n const store = tmpTrans.objectStore(storeName);\n let keyPath = store.keyPath;\n const primKey = createIndexSpec(\n nameFromKeyPath(keyPath),\n keyPath || \"\",\n false,\n false,\n !!store.autoIncrement,\n keyPath && typeof keyPath !== \"string\",\n true\n );\n const indexes: IndexSpec[] = [];\n for (let j = 0; j < store.indexNames.length; ++j) {\n const idbindex = store.index(store.indexNames[j]);\n keyPath = idbindex.keyPath;\n var index = createIndexSpec(\n idbindex.name,\n keyPath,\n !!idbindex.unique,\n !!idbindex.multiEntry,\n false,\n keyPath && typeof keyPath !== \"string\",\n false\n );\n indexes.push(index);\n }\n globalSchema[storeName] = createTableSchema(storeName, primKey, indexes);\n });\n return globalSchema;\n}\n\nexport function readGlobalSchema({_novip: db}: Dexie, idbdb: IDBDatabase, tmpTrans: IDBTransaction) {\n db.verno = idbdb.version / 10;\n const globalSchema = db._dbSchema = buildGlobalSchema(db, idbdb, tmpTrans);\n db._storeNames = slice(idbdb.objectStoreNames, 0);\n setApiOnPlace(db, [db._allTables], keys(globalSchema), globalSchema);\n}\n\nexport function verifyInstalledSchema(db: Dexie, tmpTrans: IDBTransaction): boolean {\n const installedSchema = buildGlobalSchema(db, db.idbdb, tmpTrans);\n const diff = getSchemaDiff(installedSchema, db._dbSchema);\n return !(diff.add.length || diff.change.some(ch => ch.add.length || ch.change.length));\n}\n\nexport function adjustToExistingIndexNames({_novip: db}: Dexie, schema: DbSchema, idbtrans: IDBTransaction) {\n // Issue #30 Problem with existing db - adjust to existing index names when migrating from non-dexie db\n const storeNames = idbtrans.db.objectStoreNames;\n\n for (let i = 0; i < storeNames.length; ++i) {\n const storeName = storeNames[i];\n const store = idbtrans.objectStore(storeName);\n db._hasGetAll = 'getAll' in store;\n\n for (let j = 0; j < store.indexNames.length; ++j) {\n const indexName = store.indexNames[j];\n const keyPath = store.index(indexName).keyPath;\n const dexieName = typeof keyPath === 'string' ? keyPath : \"[\" + slice(keyPath).join('+') + \"]\";\n if (schema[storeName]) {\n const indexSpec = schema[storeName].idxByName[dexieName];\n if (indexSpec) {\n indexSpec.name = indexName;\n delete schema[storeName].idxByName[dexieName];\n schema[storeName].idxByName[indexName] = indexSpec;\n }\n }\n }\n }\n\n // Bug with getAll() on Safari ver<604 on Workers only, see discussion following PR #579\n if (typeof navigator !== 'undefined' && /Safari/.test(navigator.userAgent) &&\n !/(Chrome\\/|Edge\\/)/.test(navigator.userAgent) &&\n _global.WorkerGlobalScope && _global instanceof _global.WorkerGlobalScope &&\n [].concat(navigator.userAgent.match(/Safari\\/(\\d*)/))[1] < 604)\n {\n db._hasGetAll = false;\n }\n}\n\nexport function parseIndexSyntax(primKeyAndIndexes: string): IndexSpec[] {\n return primKeyAndIndexes.split(',').map((index, indexNum) => {\n index = index.trim();\n const name = index.replace(/([&*]|\\+\\+)/g, \"\"); // Remove \"&\", \"++\" and \"*\"\n // Let keyPath of \"[a+b]\" be [\"a\",\"b\"]:\n const keyPath = /^\\[/.test(name) ? name.match(/^\\[(.*)\\]$/)[1].split('+') : name;\n\n return createIndexSpec(\n name,\n keyPath || null,\n /\\&/.test(index),\n /\\*/.test(index),\n /\\+\\+/.test(index),\n isArray(keyPath),\n indexNum === 0\n );\n });\n}\n","import { Version as IVersion } from '../../public/types/version';\nimport { DbSchema } from '../../public/types/db-schema';\nimport { extend, keys } from '../../functions/utils';\nimport { Dexie } from '../dexie';\nimport { Transaction } from '../transaction';\nimport { removeTablesApi, setApiOnPlace, parseIndexSyntax } from './schema-helpers';\nimport { exceptions } from '../../errors';\nimport { createTableSchema } from '../../helpers/table-schema';\nimport { nop, promisableChain } from '../../functions/chaining-functions';\n\n/** class Version\n *\n * https://dexie.org/docs/Version/Version\n */\nexport class Version implements IVersion {\n db: Dexie;\n _cfg: {\n version: number,\n storesSource: { [tableName: string]: string | null },\n dbschema: DbSchema,\n tables: {},\n contentUpgrade: Function | null\n }\n\n _parseStoresSpec(stores: { [tableName: string]: string | null }, outSchema: DbSchema): any {\n keys(stores).forEach(tableName => {\n if (stores[tableName] !== null) {\n var indexes = parseIndexSyntax(stores[tableName]);\n var primKey = indexes.shift();\n if (primKey.multi) throw new exceptions.Schema(\"Primary key cannot be multi-valued\");\n indexes.forEach(idx => {\n if (idx.auto) throw new exceptions.Schema(\"Only primary key can be marked as autoIncrement (++)\");\n if (!idx.keyPath) throw new exceptions.Schema(\"Index must have a name and cannot be an empty string\");\n });\n outSchema[tableName] = createTableSchema(tableName, primKey, indexes);\n }\n });\n }\n\n stores(stores: { [key: string]: string | null; }): IVersion {\n const db = this.db;\n this._cfg.storesSource = this._cfg.storesSource ?\n extend(this._cfg.storesSource, stores) :\n stores;\n const versions = db._versions;\n\n // Derive stores from earlier versions if they are not explicitely specified as null or a new syntax.\n const storesSpec: { [key: string]: string; } = {};\n let dbschema = {};\n versions.forEach(version => { // 'versions' is always sorted by lowest version first.\n extend(storesSpec, version._cfg.storesSource);\n dbschema = (version._cfg.dbschema = {});\n version._parseStoresSpec(storesSpec, dbschema);\n });\n // Update the latest schema to this version\n db._dbSchema = dbschema;\n // Update APIs\n removeTablesApi(db, [db._allTables, db, db.Transaction.prototype]);\n setApiOnPlace(db, [db._allTables, db, db.Transaction.prototype, this._cfg.tables], keys(dbschema), dbschema);\n db._storeNames = keys(dbschema);\n return this;\n }\n\n upgrade(upgradeFunction: (trans: Transaction) => PromiseLike | void): Version {\n this._cfg.contentUpgrade = promisableChain(this._cfg.contentUpgrade || nop, upgradeFunction);\n return this;\n }\n}\n","import { Dexie } from '../dexie';\nimport { makeClassConstructor } from '../../functions/make-class-constructor';\nimport { Version } from './version';\n\nexport interface VersionConstructor {\n new(versionNumber: number): Version;\n prototype: Version;\n}\n\n/** Generates a Version constructor bound to given Dexie instance.\n * \n * The purpose of having dynamically created constructors, is to allow\n * addons to extend classes for a certain Dexie instance without affecting\n * other db instances.\n */\nexport function createVersionConstructor(db: Dexie) {\n return makeClassConstructor(\n Version.prototype,\n\n function Version(this: Version, versionNumber: number) {\n this.db = db;\n this._cfg = {\n version: versionNumber,\n storesSource: null,\n dbschema: {},\n tables: {},\n contentUpgrade: null\n };\n });\n\n}\n","import { Dexie } from \"../classes/dexie/dexie\";\nimport { Table } from \"../public/types/table\";\nimport { DBNAMES_DB } from \"../globals/constants\";\nimport { DexieDOMDependencies } from \"../public/types/dexie-dom-dependencies\";\nimport { nop } from \"../functions/chaining-functions\";\n\ntype IDBKeyNamesVar = typeof IDBKeyRange;\n\nfunction getDbNamesTable(indexedDB: IDBFactory, IDBKeyRange: IDBKeyNamesVar) {\n let dbNamesDB = indexedDB[\"_dbNamesDB\"];\n if (!dbNamesDB) {\n dbNamesDB = indexedDB[\"_dbNamesDB\"] = new Dexie(DBNAMES_DB, {\n addons: [],\n indexedDB,\n IDBKeyRange,\n });\n dbNamesDB.version(1).stores({ dbnames: \"name\" });\n }\n return dbNamesDB.table(\"dbnames\") as Table<{ name: string }, string>;\n}\n\nfunction hasDatabasesNative(indexedDB: IDBFactory) {\n return indexedDB && typeof indexedDB.databases === \"function\";\n}\n\nexport function getDatabaseNames({\n indexedDB,\n IDBKeyRange,\n}: DexieDOMDependencies) {\n return hasDatabasesNative(indexedDB)\n ? Promise.resolve(indexedDB.databases()).then((infos) =>\n infos\n // Select name prop of infos:\n .map((info) => info.name)\n // Filter out DBNAMES_DB as previous Dexie or browser version would not have included it in the result.\n .filter((name) => name !== DBNAMES_DB)\n )\n : getDbNamesTable(indexedDB, IDBKeyRange).toCollection().primaryKeys();\n}\n\nexport function _onDatabaseCreated(\n { indexedDB, IDBKeyRange }: DexieDOMDependencies,\n name: string\n) {\n !hasDatabasesNative(indexedDB) &&\n name !== DBNAMES_DB &&\n getDbNamesTable(indexedDB, IDBKeyRange).put({name}).catch(nop);\n}\n\nexport function _onDatabaseDeleted(\n { indexedDB, IDBKeyRange }: DexieDOMDependencies,\n name: string\n) {\n !hasDatabasesNative(indexedDB) &&\n name !== DBNAMES_DB &&\n getDbNamesTable(indexedDB, IDBKeyRange).delete(name).catch(nop);\n}\n","import { newScope } from '../../helpers/promise';\nimport { PSD } from '../../helpers/promise';\n\nexport function vip (fn) {\n // To be used by subscribers to the on('ready') event.\n // This will let caller through to access DB even when it is blocked while the db.ready() subscribers are firing.\n // This would have worked automatically if we were certain that the Provider was using Dexie.Promise for all asyncronic operations. The promise PSD\n // from the provider.connect() call would then be derived all the way to when provider would call localDatabase.applyChanges(). But since\n // the provider more likely is using non-promise async APIs or other thenable implementations, we cannot assume that.\n // Note that this method is only useful for on('ready') subscribers that is returning a Promise from the event. If not using vip()\n // the database could deadlock since it wont open until the returned Promise is resolved, and any non-VIPed operation started by\n // the caller will not resolve until database is opened.\n return newScope(function () {\n PSD.letThrough = true; // Make sure we are let through if still blocking db due to onready is firing.\n return fn();\n });\n}\n\n","/**\n * Work around Safari 14 IndexedDB open bug.\n *\n * Safari has a horrible bug where IDB requests can hang while the browser is starting up. https://bugs.webkit.org/show_bug.cgi?id=226547\n * The only solution is to keep nudging it until it's awake.\n */\nfunction idbReady() {\n var isSafari = !navigator.userAgentData &&\n /Safari\\//.test(navigator.userAgent) &&\n !/Chrom(e|ium)\\//.test(navigator.userAgent);\n // No point putting other browsers or older versions of Safari through this mess.\n if (!isSafari || !indexedDB.databases)\n return Promise.resolve();\n var intervalId;\n return new Promise(function (resolve) {\n var tryIdb = function () { return indexedDB.databases().finally(resolve); };\n intervalId = setInterval(tryIdb, 100);\n tryIdb();\n }).finally(function () { return clearInterval(intervalId); });\n}\n\nexport default idbReady;\n","import { Dexie } from './dexie';\nimport * as Debug from '../../helpers/debug';\nimport { rejection } from '../../helpers/promise';\nimport { exceptions } from '../../errors';\nimport { eventRejectHandler, preventDefault } from '../../functions/event-wrappers';\nimport Promise, { wrap } from '../../helpers/promise';\nimport { connections } from '../../globals/constants';\nimport { runUpgraders, readGlobalSchema, adjustToExistingIndexNames, verifyInstalledSchema } from '../version/schema-helpers';\nimport { safariMultiStoreFix } from '../../functions/quirks';\nimport { _onDatabaseCreated } from '../../helpers/database-enumerator';\nimport { vip } from './vip';\nimport { promisableChain, nop } from '../../functions/chaining-functions';\nimport { generateMiddlewareStacks } from './generate-middleware-stacks';\nimport { slice } from '../../functions/utils';\nimport safari14Workaround from 'safari-14-idb-fix';\n\nexport function dexieOpen (db: Dexie) {\n const state = db._state;\n const {indexedDB} = db._deps;\n if (state.isBeingOpened || db.idbdb)\n return state.dbReadyPromise.then(() => state.dbOpenError ?\n rejection (state.dbOpenError) :\n db);\n Debug.debug && (state.openCanceller._stackHolder = Debug.getErrorWithStack()); // Let stacks point to when open() was called rather than where new Dexie() was called.\n state.isBeingOpened = true;\n state.dbOpenError = null;\n state.openComplete = false;\n const openCanceller = state.openCanceller;\n\n function throwIfCancelled() {\n // If state.openCanceller object reference is replaced, it means db.close() has been called,\n // meaning this open flow should be cancelled.\n if (state.openCanceller !== openCanceller) throw new exceptions.DatabaseClosed('db.open() was cancelled');\n }\n \n // Function pointers to call when the core opening process completes.\n let resolveDbReady = state.dbReadyResolve,\n // upgradeTransaction to abort on failure.\n upgradeTransaction: (IDBTransaction | null) = null,\n wasCreated = false;\n \n // safari14Workaround = Workaround by jakearchibald for new nasty bug in safari 14.\n return Promise.race([openCanceller, (typeof navigator === 'undefined' ? Promise.resolve() : safari14Workaround()).then(() => new Promise((resolve, reject) => {\n // Multiply db.verno with 10 will be needed to workaround upgrading bug in IE:\n // IE fails when deleting objectStore after reading from it.\n // A future version of Dexie.js will stopover an intermediate version to workaround this.\n // At that point, we want to be backward compatible. Could have been multiplied with 2, but by using 10, it is easier to map the number to the real version number.\n \n throwIfCancelled();\n // If no API, throw!\n if (!indexedDB) throw new exceptions.MissingAPI();\n const dbName = db.name;\n \n const req = state.autoSchema ?\n indexedDB.open(dbName) :\n indexedDB.open(dbName, Math.round(db.verno * 10));\n if (!req) throw new exceptions.MissingAPI(); // May happen in Safari private mode, see https://github.com/dfahlander/Dexie.js/issues/134\n req.onerror = eventRejectHandler(reject);\n req.onblocked = wrap(db._fireOnBlocked);\n req.onupgradeneeded = wrap (e => {\n upgradeTransaction = req.transaction;\n if (state.autoSchema && !db._options.allowEmptyDB) { // Unless an addon has specified db._allowEmptyDB, lets make the call fail.\n // Caller did not specify a version or schema. Doing that is only acceptable for opening alread existing databases.\n // If onupgradeneeded is called it means database did not exist. Reject the open() promise and make sure that we\n // do not create a new database by accident here.\n req.onerror = preventDefault; // Prohibit onabort error from firing before we're done!\n upgradeTransaction.abort(); // Abort transaction (would hope that this would make DB disappear but it doesnt.)\n // Close database and delete it.\n req.result.close();\n const delreq = indexedDB.deleteDatabase(dbName); // The upgrade transaction is atomic, and javascript is single threaded - meaning that there is no risk that we delete someone elses database here!\n delreq.onsuccess = delreq.onerror = wrap(() => {\n reject (new exceptions.NoSuchDatabase(`Database ${dbName} doesnt exist`));\n });\n } else {\n upgradeTransaction.onerror = eventRejectHandler(reject);\n var oldVer = e.oldVersion > Math.pow(2, 62) ? 0 : e.oldVersion; // Safari 8 fix.\n wasCreated = oldVer < 1;\n db._novip.idbdb = req.result;// db._novip is because db can be an Object.create(origDb).\n runUpgraders(db, oldVer / 10, upgradeTransaction, reject);\n }\n }, reject);\n \n req.onsuccess = wrap (() => {\n // Core opening procedure complete. Now let's just record some stuff.\n upgradeTransaction = null;\n const idbdb = db._novip.idbdb = req.result; // db._novip is because db can be an Object.create(origDb).\n\n const objectStoreNames = slice(idbdb.objectStoreNames);\n if (objectStoreNames.length > 0) try {\n const tmpTrans = idbdb.transaction(safariMultiStoreFix(objectStoreNames), 'readonly');\n if (state.autoSchema) readGlobalSchema(db, idbdb, tmpTrans);\n else {\n adjustToExistingIndexNames(db, db._dbSchema, tmpTrans);\n if (!verifyInstalledSchema(db, tmpTrans)) {\n console.warn(`Dexie SchemaDiff: Schema was extended without increasing the number passed to db.version(). Some queries may fail.`);\n }\n }\n generateMiddlewareStacks(db, tmpTrans);\n } catch (e) {\n // Safari 8 may bail out if > 1 store names. However, this shouldnt be a showstopper. Issue #120.\n // BUGBUG: It will bail out anyway as of Dexie 3.\n // Should we support Safari 8 anymore? Believe all\n // Dexie users use the shim for that platform anyway?!\n // If removing Safari 8 support, go ahead and remove the safariMultiStoreFix() function\n // as well as absurd upgrade version quirk for Safari.\n }\n \n connections.push(db); // Used for emulating versionchange event on IE/Edge/Safari.\n \n idbdb.onversionchange = wrap(ev => {\n state.vcFired = true; // detect implementations that not support versionchange (IE/Edge/Safari)\n db.on(\"versionchange\").fire(ev);\n });\n \n idbdb.onclose = wrap(ev => {\n db.on(\"close\").fire(ev);\n });\n\n if (wasCreated) _onDatabaseCreated(db._deps, dbName);\n\n resolve();\n\n }, reject);\n }))]).then(() => {\n // Before finally resolving the dbReadyPromise and this promise,\n // call and await all on('ready') subscribers:\n // Dexie.vip() makes subscribers able to use the database while being opened.\n // This is a must since these subscribers take part of the opening procedure.\n throwIfCancelled();\n state.onReadyBeingFired = [];\n return Promise.resolve(vip(()=>db.on.ready.fire(db.vip))).then(function fireRemainders() {\n if (state.onReadyBeingFired.length > 0) {\n // In case additional subscribers to db.on('ready') were added during the time db.on.ready.fire was executed.\n let remainders = state.onReadyBeingFired.reduce(promisableChain, nop);\n state.onReadyBeingFired = [];\n return Promise.resolve(vip(()=>remainders(db.vip))).then(fireRemainders)\n }\n });\n }).finally(()=>{\n state.onReadyBeingFired = null;\n state.isBeingOpened = false;\n }).then(()=>{\n // Resolve the db.open() with the db instance.\n return db;\n }).catch(err => {\n state.dbOpenError = err; // Record the error. It will be used to reject further promises of db operations.\n try {\n // Did we fail within onupgradeneeded? Make sure to abort the upgrade transaction so it doesnt commit.\n upgradeTransaction && upgradeTransaction.abort();\n } catch { }\n if (openCanceller === state.openCanceller) {\n // Still in the same open flow - The error reason was not due to external call to db.close().\n // Make sure to call db.close() to finalize resources.\n db._close(); // Closes and resets idbdb, removes connections, resets dbReadyPromise and openCanceller so that a later db.open() is fresh.\n }\n return rejection (err);\n }).finally(()=>{\n state.openComplete = true;\n resolveDbReady(); // dbReadyPromise is resolved no matter if open() rejects or resolved. It's just to wake up waiters.\n });\n}\n","import { isArray } from '../functions/utils';\n\nexport function awaitIterator (iterator: Iterator) {\n var callNext = result => iterator.next(result),\n doThrow = error => iterator.throw(error),\n onSuccess = step(callNext),\n onError = step(doThrow);\n\n function step(getNext: (any)=>any) {\n return (val?) => {\n var next = getNext(val),\n value = next.value;\n\n return next.done ? value :\n (!value || typeof value.then !== 'function' ?\n isArray(value) ? Promise.all(value).then(onSuccess, onError) : onSuccess(value) :\n value.then(onSuccess, onError));\n };\n }\n\n return step(callNext)();\n}\n","import { TransactionMode } from '../../public/types/transaction-mode';\nimport { errnames, exceptions } from '../../errors';\nimport { flatten, isAsyncFunction } from '../../functions/utils';\nimport { Dexie } from './dexie';\nimport { Transaction } from '../transaction';\nimport { awaitIterator } from '../../helpers/yield-support';\nimport Promise, {\n PSD,\n NativePromise,\n decrementExpectedAwaits,\n rejection,\n incrementExpectedAwaits\n} from '../../helpers/promise';\n\nexport function extractTransactionArgs(mode: TransactionMode, _tableArgs_, scopeFunc) {\n // Let table arguments be all arguments between mode and last argument.\n var i = arguments.length;\n if (i < 2) throw new exceptions.InvalidArgument(\"Too few arguments\");\n // Prevent optimzation killer (https://github.com/petkaantonov/bluebird/wiki/Optimization-killers#32-leaking-arguments)\n // and clone arguments except the first one into local var 'args'.\n var args = new Array(i - 1);\n while (--i) args[i - 1] = arguments[i];\n // Let scopeFunc be the last argument and pop it so that args now only contain the table arguments.\n scopeFunc = args.pop();\n var tables = flatten(args); // Support using array as middle argument, or a mix of arrays and non-arrays.\n return [mode, tables, scopeFunc];\n}\n\nexport function enterTransactionScope(\n db: Dexie,\n mode: IDBTransactionMode,\n storeNames: string[],\n parentTransaction: Transaction | undefined,\n scopeFunc: ()=>PromiseLike | any\n) {\n return Promise.resolve().then(() => {\n // Keep a pointer to last non-transactional PSD to use if someone calls Dexie.ignoreTransaction().\n const transless = PSD.transless || PSD;\n // Our transaction.\n //return new Promise((resolve, reject) => {\n const trans = db._createTransaction(mode, storeNames, db._dbSchema, parentTransaction);\n // Let the transaction instance be part of a Promise-specific data (PSD) value.\n const zoneProps = {\n trans: trans,\n transless: transless\n };\n\n if (parentTransaction) {\n // Emulate transaction commit awareness for inner transaction (must 'commit' when the inner transaction has no more operations ongoing)\n trans.idbtrans = parentTransaction.idbtrans;\n } else {\n try {\n trans.create(); // Create the native transaction so that complete() or error() will trigger even if no operation is made upon it.\n db._state.PR1398_maxLoop = 3;\n } catch (ex) {\n if (ex.name === errnames.InvalidState && db.isOpen() && --db._state.PR1398_maxLoop > 0) {\n console.warn('Dexie: Need to reopen db');\n db._close();\n return db.open().then(() => enterTransactionScope(\n db,\n mode,\n storeNames,\n null,\n scopeFunc\n ));\n }\n return rejection(ex);\n }\n }\n\n // Support for native async await.\n const scopeFuncIsAsync = isAsyncFunction(scopeFunc);\n if (scopeFuncIsAsync) {\n incrementExpectedAwaits();\n }\n\n let returnValue;\n const promiseFollowed = Promise.follow(() => {\n // Finally, call the scope function with our table and transaction arguments.\n returnValue = scopeFunc.call(trans, trans);\n if (returnValue) {\n if (scopeFuncIsAsync) {\n // scopeFunc is a native async function - we know for sure returnValue is native promise.\n var decrementor = decrementExpectedAwaits.bind(null, null);\n returnValue.then(decrementor, decrementor);\n } else if (typeof returnValue.next === 'function' && typeof returnValue.throw === 'function') {\n // scopeFunc returned an iterator with throw-support. Handle yield as await.\n returnValue = awaitIterator(returnValue);\n }\n }\n }, zoneProps);\n return (returnValue && typeof returnValue.then === 'function' ?\n // Promise returned. User uses promise-style transactions.\n Promise.resolve(returnValue).then(x => trans.active ?\n x // Transaction still active. Continue.\n : rejection(new exceptions.PrematureCommit(\n \"Transaction committed too early. See http://bit.ly/2kdckMn\")))\n // No promise returned. Wait for all outstanding promises before continuing. \n : promiseFollowed.then(() => returnValue)\n ).then(x => {\n // sub transactions don't react to idbtrans.oncomplete. We must trigger a completion:\n if (parentTransaction) trans._resolve();\n // wait for trans._completion\n // (if root transaction, this means 'complete' event. If sub-transaction, we've just fired it ourselves)\n return trans._completion.then(() => x);\n }).catch(e => {\n trans._reject(e); // Yes, above then-handler were maybe not called because of an unhandled rejection in scopeFunc!\n return rejection(e);\n });\n });\n}\n","import {\n DBCore,\n DBCoreIndex,\n DBCoreKeyRange,\n DBCoreQueryRequest,\n DBCoreRangeType,\n DBCoreOpenCursorRequest,\n DBCoreCountRequest,\n DBCoreCursor,\n DBCoreTable,\n} from \"../public/types/dbcore\";\nimport { isArray } from '../functions/utils';\nimport { getKeyExtractor } from './get-key-extractor';\nimport { getKeyPathAlias } from './dbcore-indexeddb';\nimport { Middleware } from '../public/types/middleware';\n\ninterface VirtualIndex extends DBCoreIndex {\n /** True if this index is virtual, i.e. represents a compound index internally,\n * but makes it act as as having a subset of its keyPaths.\n */\n isVirtual: boolean;\n\n /** Number of keypaths that this index comprises. Can be 0..N.\n * Note: This is the length of the *virtual index*, not the real index.\n */\n keyLength: number;\n\n /** Number of popped keypaths from the real index.\n */\n keyTail: number;\n}\n\n// Move into some util:\nexport function pad (a: any | any[], value: any, count: number) {\n const result = isArray(a) ? a.slice() : [a];\n for (let i=0; i 0;\n const virtualIndex = {\n ...lowLevelIndex,\n isVirtual,\n keyTail,\n keyLength,\n extractKey: getKeyExtractor(keyPath),\n unique: !isVirtual && lowLevelIndex.unique\n };\n indexList.push(virtualIndex);\n if (!virtualIndex.isPrimaryKey) {\n allVirtualIndexes.push(virtualIndex);\n }\n if (keyLength > 1) {\n const virtualKeyPath = keyLength === 2 ?\n keyPath[0] : // This is a compound [a, b]. Add a virtual normal index a.\n keyPath.slice(0, keyLength - 1); // This is compound [a,b,c]. Add virtual compound [a,b].\n addVirtualIndexes(virtualKeyPath, keyTail + 1, lowLevelIndex);\n }\n indexList.sort((a,b) => a.keyTail - b.keyTail); // Shortest keyTail is the best one (represents real index)\n return virtualIndex;\n }\n \n const primaryKey = addVirtualIndexes(schema.primaryKey.keyPath, 0, schema.primaryKey);\n indexLookup[\":id\"] = [primaryKey];\n for (const index of schema.indexes) {\n addVirtualIndexes(index.keyPath, 0, index);\n }\n \n function findBestIndex(keyPath: null | string | string[]): VirtualIndex {\n const result = indexLookup[getKeyPathAlias(keyPath)];\n return result && result[0];\n }\n \n function translateRange (range: DBCoreKeyRange, keyTail: number): DBCoreKeyRange {\n return {\n type: range.type === DBCoreRangeType.Equal ?\n DBCoreRangeType.Range :\n range.type,\n lower: pad(range.lower, range.lowerOpen ? down.MAX_KEY : down.MIN_KEY, keyTail),\n lowerOpen: true, // doesn't matter true or false\n upper: pad(range.upper, range.upperOpen ? down.MIN_KEY : down.MAX_KEY, keyTail),\n upperOpen: true // doesn't matter true or false\n };\n }\n \n function translateRequest (req: DBCoreQueryRequest): DBCoreQueryRequest;\n function translateRequest (req: DBCoreOpenCursorRequest): DBCoreOpenCursorRequest;\n function translateRequest (req: DBCoreCountRequest): DBCoreCountRequest {\n const index = req.query.index as VirtualIndex;\n return index.isVirtual ? {\n ...req,\n query: {\n index,\n range: translateRange(req.query.range, index.keyTail)\n }\n } : req;\n }\n \n const result: DBCoreTable = {\n ...table,\n schema: {\n ...schema,\n primaryKey,\n indexes: allVirtualIndexes,\n getIndexByKeyPath: findBestIndex\n },\n\n count(req) {\n return table.count(translateRequest(req));\n }, \n \n query(req) {\n return table.query(translateRequest(req));\n },\n \n openCursor(req) {\n const {keyTail, isVirtual, keyLength} = (req.query.index as VirtualIndex);\n if (!isVirtual) return table.openCursor(req);\n \n function createVirtualCursor(cursor: DBCoreCursor) : DBCoreCursor {\n function _continue (key?: any) {\n key != null ?\n cursor.continue(pad(key, req.reverse ? down.MAX_KEY : down.MIN_KEY, keyTail)) :\n req.unique ?\n cursor.continue(\n cursor.key.slice(0, keyLength)\n .concat(req.reverse\n ? down.MIN_KEY\n : down.MAX_KEY, keyTail)\n ) :\n cursor.continue()\n }\n const virtualCursor = Object.create(cursor, {\n continue: {value: _continue},\n continuePrimaryKey: {\n value(key: any, primaryKey: any) {\n cursor.continuePrimaryKey(pad(key, down.MAX_KEY, keyTail), primaryKey);\n }\n },\n primaryKey: {\n get() {\n return cursor.primaryKey;\n }\n },\n key: {\n get() {\n const key = cursor.key as any[]; // A virtual cursor always operates on compound key\n return keyLength === 1 ?\n key[0] : // Cursor.key should not be an array.\n key.slice(0, keyLength); // Cursor.key should be first part of array.\n }\n },\n value: {\n get() {\n return cursor.value;\n }\n }\n });\n return virtualCursor;\n }\n \n return table.openCursor(translateRequest(req))\n .then(cursor => cursor && createVirtualCursor(cursor));\n }\n };\n return result;\n }\n }\n}\n\nexport const virtualIndexMiddleware : Middleware = {\n stack: \"dbcore\",\n name: \"VirtualIndexMiddleware\",\n level: 1,\n create: createVirtualIndexMiddleware\n};\n\n","import { keys, hasOwn, toStringTag } from './utils';\n\nexport function getObjectDiff(a: any, b: any, rv?: any, prfx?: string) {\n // Compares objects a and b and produces a diff object.\n rv = rv || {};\n prfx = prfx || '';\n keys(a).forEach((prop) => {\n if (!hasOwn(b, prop)) {\n // Property removed\n rv[prfx + prop] = undefined;\n } else {\n var ap = a[prop],\n bp = b[prop];\n if (typeof ap === 'object' && typeof bp === 'object' && ap && bp) {\n const apTypeName = toStringTag(ap);\n const bpTypeName = toStringTag(bp);\n\n if (apTypeName !== bpTypeName) {\n rv[prfx + prop] = b[prop]; // Property changed to other type\n } else if (apTypeName === 'Object') {\n // Pojo objects (not Date, ArrayBuffer, Array etc). Go deep.\n getObjectDiff(ap, bp, rv, prfx + prop + '.');\n } else if (ap !== bp) {\n // Values differ.\n // Could have checked if Date, arrays or binary types have same\n // content here but I think that would be a suboptimation.\n // Prefer simplicity.\n rv[prfx + prop] = b[prop];\n }\n } else if (ap !== bp) rv[prfx + prop] = b[prop]; // Primitive value changed\n }\n });\n keys(b).forEach((prop) => {\n if (!hasOwn(a, prop)) {\n rv[prfx + prop] = b[prop]; // Property added\n }\n });\n return rv;\n}\n","import {\n DBCoreAddRequest,\n DBCorePutRequest,\n DBCoreDeleteRequest,\n DBCoreIndex,\n DBCoreTable,\n} from \"../public/types/dbcore\";\n\nexport function getEffectiveKeys (\n primaryKey: DBCoreIndex,\n req: (Pick & {keys?: any[]}) | Pick)\n{\n //const {outbound} = primaryKey;\n if (req.type === 'delete') return req.keys;\n return req.keys || req.values.map(primaryKey.extractKey)\n}\n","import {\n DBCore,\n DBCoreTable,\n DBCoreMutateResponse,\n DBCoreDeleteRangeRequest,\n DBCoreAddRequest,\n DBCorePutRequest,\n DBCoreDeleteRequest,\n DBCoreTransaction,\n DBCoreKeyRange\n} from \"../public/types/dbcore\";\nimport { nop } from '../functions/chaining-functions';\nimport { hasOwn, setByKeyPath } from '../functions/utils';\nimport { getObjectDiff } from \"../functions/get-object-diff\";\nimport { PSD } from '../helpers/promise';\n//import { LockableTableMiddleware } from '../dbcore/lockable-table-middleware';\nimport { getEffectiveKeys } from '../dbcore/get-effective-keys';\nimport { Middleware } from '../public/types/middleware';\nimport { Transaction } from '../classes/transaction';\n\nexport const hooksMiddleware: Middleware = {\n stack: \"dbcore\",\n name: \"HooksMiddleware\",\n level: 2,\n create: (downCore: DBCore) => ({\n ...downCore,\n table(tableName: string) {\n const downTable = downCore.table(tableName);\n const {primaryKey} = downTable.schema;\n \n const tableMiddleware: DBCoreTable = {\n ...downTable,\n mutate(req):Promise {\n const dxTrans = PSD.trans as Transaction;\n // Hooks can be transaction-bound. Need to grab them from transaction.table and not\n // db.table!\n const {deleting, creating, updating} = dxTrans.table(tableName).hook;\n switch (req.type) {\n case 'add':\n if (creating.fire === nop) break;\n return dxTrans._promise('readwrite', ()=>addPutOrDelete(req), true);\n case 'put':\n if (creating.fire === nop && updating.fire === nop) break;\n return dxTrans._promise('readwrite', ()=>addPutOrDelete(req), true);\n case 'delete':\n if (deleting.fire === nop) break;\n return dxTrans._promise('readwrite', ()=>addPutOrDelete(req), true);\n case 'deleteRange':\n if (deleting.fire === nop) break;\n return dxTrans._promise('readwrite', ()=>deleteRange(req), true);\n }\n // Any of the breaks above happened (no hooks) - do the default:\n return downTable.mutate(req);\n\n\n function addPutOrDelete(req: DBCoreAddRequest | DBCorePutRequest | DBCoreDeleteRequest): Promise {\n const dxTrans = PSD.trans;\n const keys = req.keys || getEffectiveKeys(primaryKey, req);\n if (!keys) throw new Error(\"Keys missing\");\n // Clone Request and set keys arg\n req = req.type === 'add' || req.type === 'put' ?\n {...req, keys} :\n {...req};\n if (req.type !== 'delete') req.values = [...req.values];\n if (req.keys) req.keys = [...req.keys];\n \n return getExistingValues(downTable, req, keys).then (existingValues => {\n const contexts = keys.map((key, i) => {\n const existingValue = existingValues[i];\n const ctx = { onerror: null, onsuccess: null };\n if (req.type === 'delete') {\n // delete operation\n deleting.fire.call(ctx, key, existingValue, dxTrans);\n } else if (req.type === 'add' || existingValue === undefined) {\n // The add() or put() resulted in a create\n const generatedPrimaryKey = creating.fire.call(ctx, key, req.values[i], dxTrans);\n if (key == null && generatedPrimaryKey != null) {\n key = generatedPrimaryKey;\n req.keys[i] = key;\n if (!primaryKey.outbound) {\n setByKeyPath(req.values[i], primaryKey.keyPath, key);\n }\n }\n } else {\n // The put() operation resulted in an update\n const objectDiff = getObjectDiff(existingValue, req.values[i]);\n const additionalChanges = updating.fire.call(ctx, objectDiff, key, existingValue, dxTrans);\n if (additionalChanges) {\n const requestedValue = req.values[i];\n Object.keys(additionalChanges).forEach(keyPath => {\n if (hasOwn(requestedValue, keyPath)) {\n // keyPath is already present as a literal property of the object\n requestedValue[keyPath] = additionalChanges[keyPath];\n } else {\n // keyPath represents a new or existing path into the object\n setByKeyPath(requestedValue, keyPath, additionalChanges[keyPath]);\n }\n });\n }\n }\n return ctx;\n });\n return downTable.mutate(req).then(({failures, results, numFailures, lastResult}) => {\n for (let i=0; i {\n contexts.forEach(ctx => ctx.onerror && ctx.onerror(error));\n return Promise.reject(error);\n });\n });\n }\n \n function deleteRange(req: DBCoreDeleteRangeRequest): Promise {\n return deleteNextChunk(req.trans, req.range, 10000);\n }\n \n function deleteNextChunk(trans: DBCoreTransaction, range: DBCoreKeyRange, limit: number) {\n // Query what keys in the DB within the given range\n return downTable.query({trans, values: false, query: {index: primaryKey, range}, limit})\n .then(({result}) => {\n // Given a set of keys, bulk delete those using the same procedure as in addPutOrDelete().\n // This will make sure that deleting hook is called.\n return addPutOrDelete({type: 'delete', keys: result, trans}).then(res => {\n if (res.numFailures > 0) return Promise.reject(res.failures[0]);\n if (result.length < limit) {\n return {failures: [], numFailures: 0, lastResult: undefined} as DBCoreMutateResponse;\n } else {\n return deleteNextChunk(trans, {...range, lower: result[result.length - 1], lowerOpen: true}, limit);\n }\n });\n })\n }\n }\n };\n //const {lock, lockableMiddleware} = LockableTableMiddleware(tableMiddleware);\n\n return tableMiddleware;\n },\n }) as DBCore\n};\n\nfunction getExistingValues(\n table: DBCoreTable,\n req: DBCoreAddRequest | DBCorePutRequest | DBCoreDeleteRequest,\n effectiveKeys: any[]\n) {\n return req.type === \"add\"\n ? Promise.resolve([])\n : table.getMany({ trans: req.trans, keys: effectiveKeys, cache: \"immutable\" });\n}\n","import { deepClone } from \"../functions/utils\";\nimport { DBCore } from \"../public/types/dbcore\";\nimport { Middleware } from \"../public/types/middleware\";\nimport Promise from \"../helpers/promise\";\nimport { cmp } from '../functions/cmp';\n\nexport function getFromTransactionCache(\n keys: any[],\n cache: { keys: any[]; values: any[] } | undefined | null,\n clone?: boolean\n) {\n try {\n if (!cache) return null;\n if (cache.keys.length < keys.length) return null;\n const result: any[] = [];\n // Compare if the exact same order of keys was retrieved in same transaction:\n // Allow some cached keys to be omitted from provided set of keys\n // Use case: 1. getMany(keys) 2. update a subset of those 3. call put with the updated ones ==> middlewares should be able to find old values\n for (let i = 0, j = 0; i < cache.keys.length && j < keys.length; ++i) {\n if (cmp(cache.keys[i], keys[j]) !== 0) continue;\n result.push(clone ? deepClone(cache.values[i]) : cache.values[i]);\n ++j;\n }\n // If got all keys caller was looking for, return result.\n return result.length === keys.length ? result : null;\n } catch {\n return null;\n }\n}\n\nexport const cacheExistingValuesMiddleware: Middleware = {\n stack: \"dbcore\",\n level: -1,\n create: (core) => {\n return {\n table: (tableName) => {\n const table = core.table(tableName);\n return {\n ...table,\n getMany: (req) => {\n if (!req.cache) {\n return table.getMany(req);\n }\n const cachedResult = getFromTransactionCache(\n req.keys,\n req.trans[\"_cache\"],\n req.cache === \"clone\"\n );\n if (cachedResult) {\n return Promise.resolve(cachedResult);\n }\n return table.getMany(req).then((res) => {\n req.trans[\"_cache\"] = {\n keys: req.keys,\n values: req.cache === \"clone\" ? deepClone(res) : res,\n };\n return res;\n });\n },\n mutate: (req) => {\n // Invalidate cache on any mutate except \"add\" which can't change existing values:\n if (req.type !== \"add\") req.trans[\"_cache\"] = null;\n return table.mutate(req);\n },\n };\n },\n };\n },\n};\n","import { cmp } from \"../functions/cmp\";\nimport { extend, iteratorSymbol, props } from '../functions/utils';\nimport { IndexableType } from '../public';\nimport {\n EmptyRange,\n IntervalTree,\n IntervalTreeNode,\n RangeSetConstructor,\n RangeSetPrototype,\n} from \"../public/types/rangeset\";\n\n/* An interval tree implementation to efficiently detect overlapping ranges of queried indexes.\n *\n * https://en.wikipedia.org/wiki/Interval_tree\n * \n */\n\nfunction isEmptyRange(node: IntervalTree | {from: IndexableType, to: IndexableType}): node is EmptyRange {\n return !(\"from\" in node);\n}\n\nexport type RangeSet = RangeSetPrototype & IntervalTree;\n\nexport const RangeSet = function(fromOrTree: any, to?: any) {\n if (this) {\n // Called with new()\n extend(this, arguments.length ? {d:1, from: fromOrTree, to: arguments.length > 1 ? to : fromOrTree} : {d:0});\n } else {\n // Called without new()\n const rv = new RangeSet();\n if (fromOrTree && (\"d\" in fromOrTree)) {\n extend(rv, fromOrTree);\n }\n return rv;\n }\n} as RangeSetConstructor;\n\nprops(RangeSet.prototype, {\n add(rangeSet: IntervalTree | {from: IndexableType, to: IndexableType}) {\n mergeRanges(this, rangeSet);\n return this;\n },\n addKey(key: IndexableType) {\n addRange(this, key, key);\n return this;\n },\n addKeys(keys: IndexableType[]) {\n keys.forEach(key => addRange(this, key, key));\n return this;\n },\n\n [iteratorSymbol](): Iterator {\n return getRangeSetIterator(this);\n }\n});\n\nfunction addRange(target: IntervalTree, from: IndexableType, to: IndexableType) {\n const diff = cmp(from, to);\n // cmp() returns NaN if one of the args are IDB-invalid keys.\n // Avoid storing invalid keys in rangeset:\n if (isNaN(diff)) return;\n\n // Caller is trying to add a range where from is greater than to:\n if (diff > 0) throw RangeError();\n \n if (isEmptyRange(target)) return extend(target, { from, to, d: 1 });\n const left = target.l;\n const right = target.r;\n if (cmp(to, target.from) < 0) {\n left\n ? addRange(left, from, to)\n : (target.l = { from, to, d: 1, l: null, r: null });\n return rebalance(target);\n }\n if (cmp(from, target.to) > 0) {\n right\n ? addRange(right, from, to)\n : (target.r = { from, to, d: 1, l: null, r: null });\n return rebalance(target);\n }\n // Now we have some kind of overlap. We will be able to merge the new range into the node or let it be swallowed.\n\n // Grow left?\n if (cmp(from, target.from) < 0) {\n target.from = from;\n target.l = null; // Cut off for now. Re-add later.\n target.d = right ? right.d + 1 : 1;\n }\n // Grow right?\n if (cmp(to, target.to) > 0) {\n target.to = to;\n target.r = null; // Cut off for now. Re-add later.\n target.d = target.l ? target.l.d + 1 : 1;\n }\n const rightWasCutOff = !target.r;\n // Re-add left?\n if (left && !target.l) {\n //Ranges to the left may be swallowed. Cut it of and re-add all.\n //Could probably be done more efficiently!\n mergeRanges(target, left);\n }\n // Re-add right?\n if (right && rightWasCutOff) {\n //Ranges to the right may be swallowed. Cut it of and re-add all.\n //Could probably be done more efficiently!\n mergeRanges(target, right);\n }\n}\n\nexport function mergeRanges(target: IntervalTree, newSet: IntervalTree | {from: IndexableType, to: IndexableType}) {\n function _addRangeSet(\n target: IntervalTree,\n { from, to, l, r }: IntervalTreeNode | {from: IndexableType, to: IndexableType, l?: undefined, r?: undefined}\n ) {\n addRange(target, from, to);\n if (l) _addRangeSet(target, l);\n if (r) _addRangeSet(target, r);\n }\n\n if(!isEmptyRange(newSet)) _addRangeSet(target, newSet);\n}\n\nexport function rangesOverlap(\n rangeSet1: IntervalTree,\n rangeSet2: IntervalTree\n): boolean {\n // Start iterating other from scratch.\n const i1 = getRangeSetIterator(rangeSet2);\n let nextResult1 = i1.next();\n if (nextResult1.done) return false;\n let a = nextResult1.value;\n\n // Start iterating this from start of other\n const i2 = getRangeSetIterator(rangeSet1);\n let nextResult2 = i2.next(a.from); // Start from beginning of other range\n let b = nextResult2.value;\n\n while (!nextResult1.done && !nextResult2.done) {\n if (cmp(b!.from, a.to) <= 0 && cmp(b!.to, a.from) >= 0) return true;\n cmp(a.from, b!.from) < 0\n ? (a = (nextResult1 = i1.next(b!.from)).value!) // a is behind. forward it to beginning of next b-range\n : (b = (nextResult2 = i2.next(a.from)).value); // b is behind. forward it to beginning of next a-range\n }\n return false;\n}\n\ntype RangeSetIteratorState =\n | {\n up?: RangeSetIteratorState;\n n: IntervalTreeNode;\n s: 0 | 1 | 2 | 3;\n }\n | undefined\n | null;\nexport function getRangeSetIterator(\n node: EmptyRange | IntervalTreeNode\n): Generator {\n let state: RangeSetIteratorState = isEmptyRange(node) ? null : { s: 0, n: node };\n\n return {\n next(key?) {\n const keyProvided = arguments.length > 0;\n while (state) {\n switch (state.s) {\n case 0:\n // Initial state for node.\n // Fast forward to leftmost node.\n state.s = 1;\n if (keyProvided) {\n while (state.n.l && cmp(key, state.n.from) < 0)\n state = { up: state, n: state.n.l, s: 1 };\n } else {\n while (state.n.l) state = { up: state, n: state.n.l, s: 1 };\n }\n // intentionally fall into case 1:\n case 1:\n // We're on a node where it's left part is already handled or does not exist.\n state.s = 2;\n if (!keyProvided || cmp(key, state.n.to) <= 0)\n return { value: state.n, done: false };\n case 2:\n // We've emitted our node and should continue with the right part or let parent take over from it's state 1\n if (state.n.r) {\n state.s = 3; // So when child is done, we know we're done.\n state = { up: state, n: state.n.r, s: 0 };\n continue; // Will fall in to case 0 with fast forward to left leaf of this subtree.\n }\n // intentionally fall into case 3:\n case 3:\n state = state.up;\n }\n }\n return { done: true };\n },\n } as Generator;\n}\n\nfunction rebalance(target: IntervalTreeNode) {\n const diff = (target.r?.d || 0) - (target.l?.d || 0);\n const r = diff > 1 ? \"r\" : diff < -1 ? \"l\" : \"\";\n if (r) {\n\n // Rotate (https://en.wikipedia.org/wiki/Tree_rotation)\n //\n // \n // [OLDROOT]\n // [OLDROOT.L] [NEWROOT]\n // [NEWROOT.L] [NEWROOT.R]\n //\n // Is going to become:\n //\n // \n // [NEWROOT]\n // [OLDROOT] [NEWROOT.R]\n // [OLDROOT.L] [NEWROOT.L] \n\n // * clone now has the props of OLDROOT\n // Plan:\n // * target must be given the props of NEWROOT\n // * target[l] must point to a new OLDROOT\n // * target[r] must point to NEWROOT.R\n // * OLDROOT[r] must point to NEWROOT.L\n const l = r === \"r\" ? \"l\" : \"r\"; // Support both left/right rotation\n const rootClone = { ...target };\n // We're gonna copy props from target's right node into target so that target will\n // have same range as old target[r] (instead of changing pointers, we copy values.\n // that way we do not need to adjust pointers in parents).\n const oldRootRight = target[r]; \n target.from = oldRootRight.from;\n target.to = oldRootRight.to;\n target[r] = oldRootRight[r];\n rootClone[r] = oldRootRight[l];\n target[l] = rootClone;\n rootClone.d = computeDepth(rootClone);\n }\n target.d = computeDepth(target);\n}\n\nfunction computeDepth({ r, l }: Pick) {\n return (r ? (l ? Math.max(r.d, l.d) : r.d) : l ? l.d : 0) + 1;\n}\n","import { getFromTransactionCache } from \"../dbcore/cache-existing-values-middleware\";\nimport { cmp } from \"../functions/cmp\";\nimport { isArray, keys } from \"../functions/utils\";\nimport { PSD } from \"../helpers/promise\";\nimport { RangeSet } from \"../helpers/rangeset\";\nimport { ObservabilitySet } from \"../public/types/db-events\";\nimport {\n DBCore,\n DBCoreCountRequest,\n DBCoreCursor,\n DBCoreGetManyRequest,\n DBCoreGetRequest,\n DBCoreIndex,\n DBCoreOpenCursorRequest,\n DBCoreQueryRequest,\n DBCoreQueryResponse,\n DBCoreTable,\n DBCoreTableSchema,\n DBCoreTransaction,\n} from \"../public/types/dbcore\";\nimport { Middleware } from \"../public/types/middleware\";\n\nexport const observabilityMiddleware: Middleware = {\n stack: \"dbcore\",\n level: 0,\n create: (core) => {\n const dbName = core.schema.name;\n const FULL_RANGE = new RangeSet(core.MIN_KEY, core.MAX_KEY);\n\n return {\n ...core,\n table: (tableName) => {\n const table = core.table(tableName);\n const { schema } = table;\n const { primaryKey } = schema;\n const { extractKey, outbound } = primaryKey;\n const tableClone: DBCoreTable = {\n ...table,\n mutate: (req) => {\n const trans = req.trans as DBCoreTransaction & {\n mutatedParts?: ObservabilitySet;\n };\n const mutatedParts =\n trans.mutatedParts || (trans.mutatedParts = {});\n const getRangeSet = (indexName: string) => {\n const part = `idb://${dbName}/${tableName}/${indexName}`;\n return (mutatedParts[part] ||\n (mutatedParts[part] = new RangeSet())) as RangeSet;\n };\n const pkRangeSet = getRangeSet(\"\");\n const delsRangeSet = getRangeSet(\":dels\");\n\n const { type } = req;\n let [keys, newObjs] =\n req.type === \"deleteRange\"\n ? [req.range] // keys will be an DBCoreKeyRange object - transformed later on to a [from,to]-style range.\n : req.type === \"delete\"\n ? [req.keys] // keys known already here. newObjs will be undefined.\n : req.values.length < 50\n ? [[], req.values] // keys = empty array - will be resolved in mutate().then(...).\n : []; // keys and newObjs will both be undefined - changeSpec will become true (changed for entire table)\n const oldCache = req.trans[\"_cache\"];\n return table.mutate(req).then((res) => {\n // Add the mutated table and optionally keys to the mutatedTables set on the transaction.\n // Used by subscribers to txcommit event and for Collection.prototype.subscribe().\n if (isArray(keys)) {\n // keys is an array - delete, add or put of less than 50 rows.\n if (type !== \"delete\") keys = res.results;\n // individual keys (add put or delete)\n pkRangeSet.addKeys(keys);\n // Only get oldObjs if they have been cached recently\n // (This applies to Collection.modify() only, but also if updating/deleting hooks have subscribers)\n const oldObjs = getFromTransactionCache(keys, oldCache);\n\n // Supply detailed values per index for both old and new objects:\n if (!oldObjs && type !== \"add\") {\n // delete or put and we don't know old values.\n // Indicate this in the \":dels\" part, for the sake of count() queries only!\n delsRangeSet.addKeys(keys);\n }\n if (oldObjs || newObjs) {\n // No matter if knowning oldObjs or not, track the indices if it's a put, add or delete.\n trackAffectedIndexes(getRangeSet, schema, oldObjs, newObjs);\n }\n } else if (keys) {\n // As we can't know deleted index ranges, mark index-based subscriptions must trigger.\n const range = { from: keys.lower, to: keys.upper };\n delsRangeSet.add(range);\n // deleteRange. keys is a DBCoreKeyRange objects. Transform it to [from,to]-style range.\n pkRangeSet.add(range);\n } else {\n // Too many requests to record the details without slowing down write performance.\n // Let's just record a generic large range on primary key, the virtual :dels index and\n // all secondary indices:\n pkRangeSet.add(FULL_RANGE);\n delsRangeSet.add(FULL_RANGE);\n schema.indexes.forEach(idx => getRangeSet(idx.name).add(FULL_RANGE));\n }\n return res;\n });\n },\n };\n\n const getRange: (req: any) => [DBCoreIndex, RangeSet] = ({\n query: { index, range },\n }:\n | DBCoreQueryRequest\n | DBCoreCountRequest\n | DBCoreOpenCursorRequest) => [\n index,\n new RangeSet(range.lower ?? core.MIN_KEY, range.upper ?? core.MAX_KEY),\n ];\n\n const readSubscribers: {[method in\n Exclude]: \n (req: any) => [DBCoreIndex, RangeSet]\n } = {\n get: (req) => [primaryKey, new RangeSet(req.key)],\n getMany: (req) => [primaryKey, new RangeSet().addKeys(req.keys)],\n count: getRange,\n query: getRange,\n openCursor: getRange,\n }\n\n keys(readSubscribers).forEach(method => {\n tableClone[method] = function (\n req:\n | DBCoreGetRequest\n | DBCoreGetManyRequest\n | DBCoreQueryRequest\n | DBCoreCountRequest\n | DBCoreOpenCursorRequest\n ) {\n const { subscr } = PSD;\n if (subscr) {\n // Current zone want's to track all queries so they can be subscribed to.\n // (The query is executed within a \"liveQuery\" zone)\n // Check whether the query applies to a certain set of ranges:\n // Track what we should be observing:\n const getRangeSet = (indexName: string) => {\n const part = `idb://${dbName}/${tableName}/${indexName}`;\n return (subscr[part] ||\n (subscr[part] = new RangeSet())) as RangeSet;\n };\n const pkRangeSet = getRangeSet(\"\");\n const delsRangeSet = getRangeSet(\":dels\");\n const [queriedIndex, queriedRanges] = readSubscribers[method](req);\n // A generic rule here: queried ranges should always be subscribed to.\n getRangeSet(queriedIndex.name || \"\").add(queriedRanges);\n if (!queriedIndex.isPrimaryKey) {\n // Only count(), query() and openCursor() operates on secondary indices.\n // Since put(), delete() and deleteRange() mutations may happen without knowing oldObjs,\n // the mutate() method will be missing what secondary indices that are being deleted from\n // the subscribed range. We are working around this issue by recording all the resulting\n // primary keys from the queries. This only works for those kinds of queries where we can\n // derive the primary key from the result.\n // In this block we are accomplishing this using various strategies depending on the properties\n // of the query result.\n\n if (method === \"count\") {\n // We've got a problem! Delete and put mutations happen without known the oldObjs.\n // Those mutation could change the count.\n // Solution: Dedicated \":dels\" url represends a subscription to all mutations without oldObjs\n // (specially triggered in the mutators put(), delete() and deleteRange() when they don't know oldObject)\n delsRangeSet.add(FULL_RANGE);\n } else {\n // openCursor() or query()\n\n // Prepare a keysPromise in case the we're doing an IDBIndex.getAll() on a store with outbound keys.\n const keysPromise =\n method === \"query\" &&\n outbound &&\n (req as DBCoreQueryRequest).values &&\n table.query({\n ...(req as DBCoreQueryRequest),\n values: false,\n });\n\n return table[method].apply(this, arguments).then((res) => {\n if (method === \"query\") {\n if (outbound && (req as DBCoreQueryRequest).values) {\n // If keys are outbound, we can't use extractKey to map what keys to observe.\n // We've queried an index (like 'dateTime') on an outbound table\n // and retrieve a list of objects\n // from who we cannot know their primary keys.\n // \"Luckily\" though, we've prepared the keysPromise to assist us in exact this condition.\n return keysPromise.then(\n ({ result: resultingKeys }: DBCoreQueryResponse) => {\n pkRangeSet.addKeys(resultingKeys);\n return res;\n }\n );\n }\n // query() inbound values, keys or outbound keys. Secondary indexes only since\n // for primary keys we would only add results within the already registered range.\n const pKeys = (req as DBCoreQueryRequest).values\n ? (res as DBCoreQueryResponse).result.map(extractKey)\n : (res as DBCoreQueryResponse).result;\n if ((req as DBCoreQueryRequest).values) {\n // Subscribe to any mutation made on the returned keys,\n // so that we detect both deletions and updated properties.\n pkRangeSet.addKeys(pKeys);\n } else {\n // Subscribe only to mutations on the returned keys\n // in case the mutator was unable to know oldObjs.\n // If it has oldObj, the mutator won't put anything in \":dels\" because\n // it can more fine-grained put the exact removed and added index value in the correct\n // index range that we subscribe to in the queried range sets.\n // We don't load values so a change on a property outside our index will not\n // require us to re-execute the query.\n delsRangeSet.addKeys(pKeys);\n }\n } else if (method === \"openCursor\") {\n // Caller requests a cursor.\n // For the same reason as when method===\"query\", we only need to observe\n // those keys whose values are possibly used or rendered - which could\n // only happen on keys where they get the cursor's key, primaryKey or value.\n const cursor: DBCoreCursor | null = res;\n const wantValues = (req as DBCoreOpenCursorRequest).values;\n return (\n cursor &&\n Object.create(cursor, {\n key: {\n get() {\n delsRangeSet.addKey(cursor.primaryKey);\n return cursor.key;\n },\n },\n primaryKey: {\n get() {\n const pkey = cursor.primaryKey;\n delsRangeSet.addKey(pkey);\n return pkey;\n },\n },\n value: {\n get() {\n wantValues && pkRangeSet.addKey(cursor.primaryKey);\n return cursor.value;\n },\n },\n })\n );\n }\n return res;\n });\n }\n }\n }\n return table[method].apply(this, arguments);\n };\n });\n return tableClone;\n },\n };\n },\n};\n\nfunction trackAffectedIndexes(\n getRangeSet: (index: string) => RangeSet,\n schema: DBCoreTableSchema,\n oldObjs: any[] | undefined,\n newObjs: any[] | undefined\n) {\n function addAffectedIndex(ix: DBCoreIndex) {\n const rangeSet = getRangeSet(ix.name || \"\");\n function extractKey(obj: any) {\n return obj != null ? ix.extractKey(obj) : null;\n }\n const addKeyOrKeys = (key: any) => ix.multiEntry && isArray(key)\n // multiEntry and the old property was an array - add each array entry to the rangeSet:\n ? key.forEach(key => rangeSet.addKey(key))\n // Not multiEntry or the old property was not an array - add each array entry to the rangeSet:\n : rangeSet.addKey(key);\n\n (oldObjs || newObjs).forEach((_, i) => {\n const oldKey = oldObjs && extractKey(oldObjs[i]);\n const newKey = newObjs && extractKey(newObjs[i]);\n if (cmp(oldKey, newKey) !== 0) {\n // The index has changed. Add both old and new value of the index.\n if (oldKey != null) addKeyOrKeys(oldKey); // If oldKey is invalid key, addKey() will be a noop.\n if (newKey != null) addKeyOrKeys(newKey); // If newKey is invalid key, addKey() will be a noop.\n }\n });\n }\n schema.indexes.forEach(addAffectedIndex);\n}\n","// Import types from the public API\nimport { Dexie as IDexie } from \"../../public/types/dexie\";\nimport { DexieOptions, DexieConstructor } from \"../../public/types/dexie-constructor\";\nimport { DbEvents } from \"../../public/types/db-events\";\n//import { PromiseExtended, PromiseExtendedConstructor } from '../../public/types/promise-extended';\nimport { Table as ITable } from '../../public/types/table';\nimport { TableSchema } from \"../../public/types/table-schema\";\nimport { DbSchema } from '../../public/types/db-schema';\n\n// Internal imports\nimport { Table, TableConstructor, createTableConstructor } from \"../table\";\nimport { Collection, CollectionConstructor, createCollectionConstructor } from '../collection';\nimport { WhereClause } from '../where-clause/where-clause';\nimport { WhereClauseConstructor, createWhereClauseConstructor } from '../where-clause/where-clause-constructor';\nimport { Transaction } from '../transaction';\nimport { TransactionConstructor, createTransactionConstructor } from '../transaction/transaction-constructor';\nimport { Version } from \"../version/version\";\nimport { VersionConstructor, createVersionConstructor } from '../version/version-constructor';\n\n// Other imports...\nimport { DexieEventSet } from '../../public/types/dexie-event-set';\nimport { DexieExceptionClasses } from '../../public/types/errors';\nimport { DexieDOMDependencies } from '../../public/types/dexie-dom-dependencies';\nimport { nop, promisableChain } from '../../functions/chaining-functions';\nimport Promise, { PSD } from '../../helpers/promise';\nimport { extend, override, keys, hasOwn } from '../../functions/utils';\nimport Events from '../../helpers/Events';\nimport { maxString, connections, READONLY, READWRITE } from '../../globals/constants';\nimport { getMaxKey } from '../../functions/quirks';\nimport { exceptions } from '../../errors';\nimport { lowerVersionFirst } from '../version/schema-helpers';\nimport { dexieOpen } from './dexie-open';\nimport { wrap } from '../../helpers/promise';\nimport { _onDatabaseDeleted } from '../../helpers/database-enumerator';\nimport { eventRejectHandler } from '../../functions/event-wrappers';\nimport { extractTransactionArgs, enterTransactionScope } from './transaction-helpers';\nimport { TransactionMode } from '../../public/types/transaction-mode';\nimport { rejection } from '../../helpers/promise';\nimport { usePSD } from '../../helpers/promise';\nimport { DBCore } from '../../public/types/dbcore';\nimport { Middleware, DexieStacks } from '../../public/types/middleware';\nimport { virtualIndexMiddleware } from '../../dbcore/virtual-index-middleware';\nimport { hooksMiddleware } from '../../hooks/hooks-middleware';\nimport { IndexableType } from '../../public';\nimport { observabilityMiddleware } from '../../live-query/observability-middleware';\nimport { cacheExistingValuesMiddleware } from '../../dbcore/cache-existing-values-middleware';\n\nexport interface DbReadyState {\n dbOpenError: any;\n isBeingOpened: boolean;\n onReadyBeingFired: undefined | Function[];\n openComplete: boolean;\n dbReadyResolve: () => void;\n dbReadyPromise: Promise;\n cancelOpen: (reason?: Error) => void;\n openCanceller: Promise & { _stackHolder?: Error };\n autoSchema: boolean;\n vcFired?: boolean;\n PR1398_maxLoop?: number;\n}\n\nexport class Dexie implements IDexie {\n _options: DexieOptions;\n _state: DbReadyState;\n _versions: Version[];\n _storeNames: string[];\n _deps: DexieDOMDependencies;\n _allTables: { [name: string]: Table; };\n _createTransaction: (this: Dexie, mode: IDBTransactionMode, storeNames: ArrayLike, dbschema: { [tableName: string]: TableSchema; }, parentTransaction?: Transaction) => Transaction;\n _dbSchema: { [tableName: string]: TableSchema; };\n _hasGetAll?: boolean;\n _maxKey: IndexableType;\n _fireOnBlocked: (ev: Event) => void;\n _middlewares: {[StackName in keyof DexieStacks]?: Middleware[]} = {};\n _vip?: boolean;\n _novip?: Dexie;// db._novip is to escape to orig db from db.vip.\n core: DBCore;\n\n name: string;\n verno: number = 0;\n idbdb: IDBDatabase | null;\n vip: Dexie;\n on: DbEvents;\n\n Table: TableConstructor;\n WhereClause: WhereClauseConstructor;\n Collection: CollectionConstructor;\n Version: VersionConstructor;\n Transaction: TransactionConstructor;\n\n constructor(name: string, options?: DexieOptions) {\n const deps = (Dexie as any as DexieConstructor).dependencies;\n this._options = options = {\n // Default Options\n addons: (Dexie as any as DexieConstructor).addons, // Pick statically registered addons by default\n autoOpen: true, // Don't require db.open() explicitely.\n // Default DOM dependency implementations from static prop.\n indexedDB: deps.indexedDB, // Backend IndexedDB api. Default to browser env.\n IDBKeyRange: deps.IDBKeyRange, // Backend IDBKeyRange api. Default to browser env.\n ...options\n };\n this._deps = {\n indexedDB: options.indexedDB as IDBFactory,\n IDBKeyRange: options.IDBKeyRange as typeof IDBKeyRange\n };\n const {\n addons,\n } = options;\n this._dbSchema = {};\n this._versions = [];\n this._storeNames = [];\n this._allTables = {};\n this.idbdb = null;\n this._novip = this;\n const state: DbReadyState = {\n dbOpenError: null,\n isBeingOpened: false,\n onReadyBeingFired: null,\n openComplete: false,\n dbReadyResolve: nop,\n dbReadyPromise: null as Promise,\n cancelOpen: nop,\n openCanceller: null as Promise,\n autoSchema: true,\n PR1398_maxLoop: 3\n };\n state.dbReadyPromise = new Promise(resolve => {\n state.dbReadyResolve = resolve;\n });\n state.openCanceller = new Promise((_, reject) => {\n state.cancelOpen = reject;\n });\n this._state = state;\n this.name = name;\n this.on = Events(this, \"populate\", \"blocked\", \"versionchange\", \"close\", { ready: [promisableChain, nop] }) as DbEvents;\n this.on.ready.subscribe = override(this.on.ready.subscribe, subscribe => {\n return (subscriber, bSticky) => {\n (Dexie as any as DexieConstructor).vip(() => {\n const state = this._state;\n if (state.openComplete) {\n // Database already open. Call subscriber asap.\n if (!state.dbOpenError) Promise.resolve().then(subscriber);\n // bSticky: Also subscribe to future open sucesses (after close / reopen) \n if (bSticky) subscribe(subscriber);\n } else if (state.onReadyBeingFired) {\n // db.on('ready') subscribers are currently being executed and have not yet resolved or rejected\n state.onReadyBeingFired.push(subscriber);\n if (bSticky) subscribe(subscriber);\n } else {\n // Database not yet open. Subscribe to it.\n subscribe(subscriber);\n // If bSticky is falsy, make sure to unsubscribe subscriber when fired once.\n const db = this;\n if (!bSticky) subscribe(function unsubscribe() {\n db.on.ready.unsubscribe(subscriber);\n db.on.ready.unsubscribe(unsubscribe);\n });\n }\n });\n }\n });\n\n // Create derived classes bound to this instance of Dexie:\n this.Collection = createCollectionConstructor(this);\n this.Table = createTableConstructor(this);\n this.Transaction = createTransactionConstructor(this);\n this.Version = createVersionConstructor(this);\n this.WhereClause = createWhereClauseConstructor(this);\n\n // Default subscribers to \"versionchange\" and \"blocked\".\n // Can be overridden by custom handlers. If custom handlers return false, these default\n // behaviours will be prevented.\n this.on(\"versionchange\", ev => {\n // Default behavior for versionchange event is to close database connection.\n // Caller can override this behavior by doing db.on(\"versionchange\", function(){ return false; });\n // Let's not block the other window from making it's delete() or open() call.\n // NOTE! This event is never fired in IE,Edge or Safari.\n if (ev.newVersion > 0)\n console.warn(`Another connection wants to upgrade database '${this.name}'. Closing db now to resume the upgrade.`);\n else\n console.warn(`Another connection wants to delete database '${this.name}'. Closing db now to resume the delete request.`);\n this.close();\n // In many web applications, it would be recommended to force window.reload()\n // when this event occurs. To do that, subscribe to the versionchange event\n // and call window.location.reload(true) if ev.newVersion > 0 (not a deletion)\n // The reason for this is that your current web app obviously has old schema code that needs\n // to be updated. Another window got a newer version of the app and needs to upgrade DB but\n // your window is blocking it unless we close it here.\n });\n this.on(\"blocked\", ev => {\n if (!ev.newVersion || ev.newVersion < ev.oldVersion)\n console.warn(`Dexie.delete('${this.name}') was blocked`);\n else\n console.warn(`Upgrade '${this.name}' blocked by other connection holding version ${ev.oldVersion / 10}`);\n });\n\n this._maxKey = getMaxKey(options.IDBKeyRange as typeof IDBKeyRange);\n\n this._createTransaction = (\n mode: IDBTransactionMode,\n storeNames: string[],\n dbschema: DbSchema,\n parentTransaction?: Transaction) => new this.Transaction(mode, storeNames, dbschema, this._options.chromeTransactionDurability, parentTransaction);\n\n this._fireOnBlocked = ev => {\n this.on(\"blocked\").fire(ev);\n // Workaround (not fully*) for missing \"versionchange\" event in IE,Edge and Safari:\n connections\n .filter(c => c.name === this.name && c !== this && !c._state.vcFired)\n .map(c => c.on(\"versionchange\").fire(ev));\n }\n\n // Default middlewares:\n this.use(virtualIndexMiddleware);\n this.use(hooksMiddleware);\n this.use(observabilityMiddleware);\n this.use(cacheExistingValuesMiddleware);\n\n this.vip = Object.create(this, {_vip: {value: true}}) as Dexie;\n\n // Call each addon:\n addons.forEach(addon => addon(this));\n }\n\n version(versionNumber: number): Version {\n if (isNaN(versionNumber) || versionNumber < 0.1) throw new exceptions.Type(`Given version is not a positive number`);\n versionNumber = Math.round(versionNumber * 10) / 10;\n if (this.idbdb || this._state.isBeingOpened)\n throw new exceptions.Schema(\"Cannot add version when database is open\");\n this.verno = Math.max(this.verno, versionNumber);\n const versions = this._versions;\n var versionInstance = versions.filter(\n v => v._cfg.version === versionNumber)[0];\n if (versionInstance) return versionInstance;\n versionInstance = new this.Version(versionNumber);\n versions.push(versionInstance);\n versions.sort(lowerVersionFirst);\n versionInstance.stores({}); // Derive earlier schemas by default.\n // Disable autoschema mode, as at least one version is specified.\n this._state.autoSchema = false;\n return versionInstance;\n }\n\n _whenReady(fn: () => Promise): Promise {\n return (this.idbdb && (this._state.openComplete || PSD.letThrough || this._vip)) ? fn() : new Promise((resolve, reject) => {\n if (this._state.openComplete) {\n // idbdb is falsy but openComplete is true. Must have been an exception durin open.\n // Don't wait for openComplete as it would lead to infinite loop.\n return reject(new exceptions.DatabaseClosed(this._state.dbOpenError));\n }\n if (!this._state.isBeingOpened) {\n if (!this._options.autoOpen) {\n reject(new exceptions.DatabaseClosed());\n return;\n }\n this.open().catch(nop); // Open in background. If if fails, it will be catched by the final promise anyway.\n }\n this._state.dbReadyPromise.then(resolve, reject);\n }).then(fn);\n }\n\n use({stack, create, level, name}: Middleware): this {\n if (name) this.unuse({stack, name}); // Be able to replace existing middleware.\n const middlewares = this._middlewares[stack] || (this._middlewares[stack] = []);\n middlewares.push({stack, create, level: level == null ? 10 : level, name});\n middlewares.sort((a, b) => a.level - b.level);\n // Todo update db.core and db.tables...core ? Or should be expect this to have effect\n // only after next open()?\n return this;\n }\n\n unuse({stack, create}: Middleware<{stack: keyof DexieStacks}>): this;\n unuse({stack, name}: {stack: keyof DexieStacks, name: string}): this;\n unuse({stack, name, create}: {stack: keyof DexieStacks, name?: string, create?: Function}) {\n if (stack && this._middlewares[stack]) {\n this._middlewares[stack] = this._middlewares[stack].filter(mw =>\n create ? mw.create !== create : // Given middleware has a create method. Match that exactly.\n name ? mw.name !== name : // Given middleware spec \n false);\n }\n return this;\n }\n\n open() {\n return dexieOpen(this);\n }\n\n _close(): void {\n const state = this._state;\n const idx = connections.indexOf(this);\n if (idx >= 0) connections.splice(idx, 1);\n if (this.idbdb) {\n try { this.idbdb.close(); } catch (e) { }\n this._novip.idbdb = null; // db._novip is because db can be an Object.create(origDb).\n } \n // Reset dbReadyPromise promise:\n state.dbReadyPromise = new Promise(resolve => {\n state.dbReadyResolve = resolve;\n });\n state.openCanceller = new Promise((_, reject) => {\n state.cancelOpen = reject;\n });\n }\n\n close(): void {\n this._close();\n const state = this._state;\n this._options.autoOpen = false;\n state.dbOpenError = new exceptions.DatabaseClosed();\n if (state.isBeingOpened)\n state.cancelOpen(state.dbOpenError);\n }\n\n delete(): Promise {\n const hasArguments = arguments.length > 0;\n const state = this._state;\n return new Promise((resolve, reject) => {\n const doDelete = () => {\n this.close();\n var req = this._deps.indexedDB.deleteDatabase(this.name);\n req.onsuccess = wrap(() => {\n _onDatabaseDeleted(this._deps, this.name);\n resolve();\n });\n req.onerror = eventRejectHandler(reject);\n req.onblocked = this._fireOnBlocked;\n }\n\n if (hasArguments) throw new exceptions.InvalidArgument(\"Arguments not allowed in db.delete()\");\n if (state.isBeingOpened) {\n state.dbReadyPromise.then(doDelete);\n } else {\n doDelete();\n }\n });\n }\n\n backendDB() {\n return this.idbdb;\n }\n\n isOpen() {\n return this.idbdb !== null;\n }\n\n hasBeenClosed() {\n const dbOpenError = this._state.dbOpenError;\n return dbOpenError && (dbOpenError.name === 'DatabaseClosed');\n }\n\n hasFailed() {\n return this._state.dbOpenError !== null;\n }\n\n dynamicallyOpened() {\n return this._state.autoSchema;\n }\n\n get tables () {\n return keys(this._allTables).map(name => this._allTables[name]);\n }\n\n transaction(): Promise {\n const args = extractTransactionArgs.apply(this, arguments);\n return this._transaction.apply(this, args);\n }\n\n _transaction(mode: TransactionMode, tables: Array, scopeFunc: Function) {\n let parentTransaction = PSD.trans as Transaction | undefined;\n // Check if parent transactions is bound to this db instance, and if caller wants to reuse it\n if (!parentTransaction || parentTransaction.db !== this || mode.indexOf('!') !== -1) parentTransaction = null;\n const onlyIfCompatible = mode.indexOf('?') !== -1;\n mode = mode.replace('!', '').replace('?', '') as TransactionMode; // Ok. Will change arguments[0] as well but we wont touch arguments henceforth.\n let idbMode: IDBTransactionMode,\n storeNames;\n\n try {\n //\n // Get storeNames from arguments. Either through given table instances, or through given table names.\n //\n storeNames = tables.map(table => {\n var storeName = table instanceof this.Table ? table.name : table;\n if (typeof storeName !== 'string') throw new TypeError(\"Invalid table argument to Dexie.transaction(). Only Table or String are allowed\");\n return storeName;\n });\n\n //\n // Resolve mode. Allow shortcuts \"r\" and \"rw\".\n //\n if (mode == \"r\" || mode === READONLY)\n idbMode = READONLY;\n else if (mode == \"rw\" || mode == READWRITE)\n idbMode = READWRITE;\n else\n throw new exceptions.InvalidArgument(\"Invalid transaction mode: \" + mode);\n\n if (parentTransaction) {\n // Basic checks\n if (parentTransaction.mode === READONLY && idbMode === READWRITE) {\n if (onlyIfCompatible) {\n // Spawn new transaction instead.\n parentTransaction = null; \n }\n else throw new exceptions.SubTransaction(\"Cannot enter a sub-transaction with READWRITE mode when parent transaction is READONLY\");\n }\n if (parentTransaction) {\n storeNames.forEach(storeName => {\n if (parentTransaction && parentTransaction.storeNames.indexOf(storeName) === -1) {\n if (onlyIfCompatible) {\n // Spawn new transaction instead.\n parentTransaction = null; \n }\n else throw new exceptions.SubTransaction(\"Table \" + storeName +\n \" not included in parent transaction.\");\n }\n });\n }\n if (onlyIfCompatible && parentTransaction && !parentTransaction.active) {\n // '?' mode should not keep using an inactive transaction.\n parentTransaction = null;\n }\n }\n } catch (e) {\n return parentTransaction ?\n parentTransaction._promise(null, (_, reject) => {reject(e);}) :\n rejection (e);\n }\n // If this is a sub-transaction, lock the parent and then launch the sub-transaction.\n const enterTransaction = enterTransactionScope.bind(null, this, idbMode, storeNames, parentTransaction, scopeFunc);\n return (parentTransaction ?\n parentTransaction._promise(idbMode, enterTransaction, \"lock\") :\n PSD.trans ?\n // no parent transaction despite PSD.trans exists. Make sure also\n // that the zone we create is not a sub-zone of current, because\n // Promise.follow() should not wait for it if so.\n usePSD(PSD.transless, ()=>this._whenReady(enterTransaction)) :\n this._whenReady (enterTransaction));\n }\n\n table(tableName: string): Table;\n table(tableName: string): ITable;\n table(tableName: string): Table {\n if (!hasOwn(this._allTables, tableName)) {\n throw new exceptions.InvalidTable(`Table ${tableName} does not exist`); }\n return this._allTables[tableName];\n }\n}\n","import {\n Observable as IObservable,\n Observer,\n Subscription,\n} from \"../../public/types/observable\";\n\nconst symbolObservable: typeof Symbol.observable =\n typeof Symbol !== \"undefined\" && \"observable\" in Symbol\n ? Symbol.observable\n : \"@@observable\" as any;\n\nexport class Observable implements IObservable {\n private _subscribe: (observer: Observer) => Subscription;\n constructor(subscribe: (observer: Observer) => Subscription) {\n this._subscribe = subscribe;\n }\n\n subscribe(\n onNext?: ((value: T) => void) | null,\n onError?: ((error: any) => void) | null,\n onComplete?: (() => void) | null\n ): Subscription;\n subscribe(observer?: Observer | null): Subscription;\n subscribe(x?: any, error?: any, complete?: any): Subscription {\n return this._subscribe(\n !x || typeof x === \"function\" ? { next: x, error, complete } : x\n );\n }\n\n [symbolObservable]() {\n return this;\n }\n}\n","import { deepClone, keys } from \"../functions/utils\";\nimport { mergeRanges, RangeSet } from \"../helpers/rangeset\";\nimport { ObservabilitySet } from \"../public/types/db-events\";\n\nexport function extendObservabilitySet(\n target: ObservabilitySet,\n newSet: ObservabilitySet\n): ObservabilitySet {\n keys(newSet).forEach(part => {\n const rangeSet = target[part] || (target[part] = new RangeSet());\n mergeRanges(rangeSet, newSet[part]);\n });\n return target;\n}\n","import { isAsyncFunction, keys } from \"../functions/utils\";\nimport { globalEvents, DEXIE_STORAGE_MUTATED_EVENT_NAME } from \"../globals/global-events\";\nimport {\n decrementExpectedAwaits,\n incrementExpectedAwaits,\n newScope,\n PSD,\n usePSD,\n} from \"../helpers/promise\";\nimport { ObservabilitySet } from \"../public/types/db-events\";\nimport {\n Observable as IObservable,\n Subscription,\n} from \"../public/types/observable\";\nimport { Observable } from \"../classes/observable/observable\";\nimport { extendObservabilitySet } from \"./extend-observability-set\";\nimport { rangesOverlap } from \"../helpers/rangeset\";\n\nexport function liveQuery(querier: () => T | Promise): IObservable {\n return new Observable((observer) => {\n const scopeFuncIsAsync = isAsyncFunction(querier);\n function execute(subscr: ObservabilitySet) {\n if (scopeFuncIsAsync) {\n incrementExpectedAwaits();\n }\n const exec = () => newScope(querier, { subscr, trans: null });\n const rv = PSD.trans\n ? // Ignore current transaction if active when calling subscribe().\n usePSD(PSD.transless, exec)\n : exec();\n if (scopeFuncIsAsync) {\n (rv as Promise).then(\n decrementExpectedAwaits,\n decrementExpectedAwaits\n );\n }\n return rv;\n }\n\n let closed = false;\n\n let accumMuts: ObservabilitySet = {};\n let currentObs: ObservabilitySet = {};\n\n const subscription: Subscription = {\n get closed() {\n return closed;\n },\n unsubscribe: () => {\n closed = true;\n globalEvents.storagemutated.unsubscribe(mutationListener);\n },\n };\n\n observer.start && observer.start(subscription); // https://github.com/tc39/proposal-observable\n\n let querying = false,\n startedListening = false;\n\n function shouldNotify() {\n return keys(currentObs).some(\n (key) =>\n accumMuts[key] && rangesOverlap(accumMuts[key], currentObs[key])\n );\n }\n\n const mutationListener = (parts: ObservabilitySet) => {\n extendObservabilitySet(accumMuts, parts);\n if (shouldNotify()) {\n doQuery();\n }\n };\n\n const doQuery = () => {\n if (querying || closed) return;\n accumMuts = {};\n const subscr: ObservabilitySet = {};\n const ret = execute(subscr);\n if (!startedListening) {\n globalEvents(DEXIE_STORAGE_MUTATED_EVENT_NAME, mutationListener);\n startedListening = true;\n }\n querying = true;\n Promise.resolve(ret).then(\n (result) => {\n querying = false;\n if (closed) return;\n if (shouldNotify()) {\n // Mutations has happened while we were querying. Redo query.\n doQuery();\n } else {\n accumMuts = {};\n // Update what we are subscribing for based on this last run:\n currentObs = subscr;\n observer.next && observer.next(result);\n }\n },\n (err) => {\n querying = false;\n observer.error && observer.error(err);\n subscription.unsubscribe();\n }\n );\n };\n\n doQuery();\n return subscription;\n });\n}\n","import { _global } from '../../globals/global';\nimport { DexieDOMDependencies } from '../../public/types/dexie-dom-dependencies';\n\nexport let domDeps: DexieDOMDependencies\n\ntry {\n domDeps = {\n // Required:\n indexedDB: _global.indexedDB || _global.mozIndexedDB || _global.webkitIndexedDB || _global.msIndexedDB,\n IDBKeyRange: _global.IDBKeyRange || _global.webkitIDBKeyRange\n };\n} catch (e) {\n domDeps = { indexedDB: null, IDBKeyRange: null };\n}\n","import { Dexie as _Dexie } from './dexie';\nimport { _global } from '../../globals/global';\nimport { props, derive, extend, override, getByKeyPath, setByKeyPath, delByKeyPath, shallowClone, deepClone, asap } from '../../functions/utils';\nimport { getObjectDiff } from \"../../functions/get-object-diff\";\nimport { fullNameExceptions } from '../../errors';\nimport { DexieConstructor } from '../../public/types/dexie-constructor';\nimport { getDatabaseNames } from '../../helpers/database-enumerator';\nimport { PSD } from '../../helpers/promise';\nimport { usePSD } from '../../helpers/promise';\nimport { newScope } from '../../helpers/promise';\nimport { rejection } from '../../helpers/promise';\nimport { awaitIterator } from '../../helpers/yield-support';\nimport Promise from '../../helpers/promise';\nimport * as Debug from '../../helpers/debug';\nimport { dexieStackFrameFilter, minKey, connections, DEXIE_VERSION } from '../../globals/constants';\nimport Events from '../../helpers/Events';\nimport { exceptions } from '../../errors';\nimport { errnames } from '../../errors';\nimport { getMaxKey } from '../../functions/quirks';\nimport { vip } from './vip';\nimport { globalEvents } from '../../globals/global-events';\nimport { liveQuery } from '../../live-query/live-query';\nimport { extendObservabilitySet } from '../../live-query/extend-observability-set';\nimport { domDeps } from './dexie-dom-dependencies';\nimport { cmp } from '../../functions/cmp';\n\n/* (Dexie) is an instance of DexieConstructor, as defined in public/types/dexie-constructor.d.ts\n* (new Dexie()) is an instance of Dexie, as defined in public/types/dexie.d.ts\n* \n* Why we're doing this?\n\n* Because we've choosen to define the public Dexie API using a DexieConstructor interface\n* rather than declaring a class. On that interface, all static props are defined.\n* In practice, class Dexie's constructor implements DexieConstructor and all member props\n* are defined in interface Dexie. We could say, it's a typescript limitation of not being\n* able to define a static interface that forces us to do the cast below.\n*/\nconst Dexie = _Dexie as any as DexieConstructor;\n\n//\n// Set all static methods and properties onto Dexie:\n// \nprops(Dexie, {\n\n // Dexie.BulkError = class BulkError {...};\n // Dexie.XXXError = class XXXError {...};\n ...fullNameExceptions,\n\n //\n // Static delete() method.\n //\n delete(databaseName: string) {\n const db = new Dexie(databaseName, {addons: []});\n return db.delete();\n },\n\n //\n // Static exists() method.\n //\n exists(name: string) {\n return new Dexie(name, { addons: [] }).open().then(db => {\n db.close();\n return true;\n }).catch('NoSuchDatabaseError', () => false);\n },\n\n //\n // Static method for retrieving a list of all existing databases at current host.\n //\n getDatabaseNames(cb) {\n try {\n return getDatabaseNames(Dexie.dependencies).then(cb);\n } catch {\n return rejection(new exceptions.MissingAPI());\n }\n },\n\n /** @deprecated */\n defineClass() {\n function Class(content) {\n extend(this, content);\n }\n return Class;\n },\n\n ignoreTransaction(scopeFunc) {\n // In case caller is within a transaction but needs to create a separate transaction.\n // Example of usage:\n //\n // Let's say we have a logger function in our app. Other application-logic should be unaware of the\n // logger function and not need to include the 'logentries' table in all transaction it performs.\n // The logging should always be done in a separate transaction and not be dependant on the current\n // running transaction context. Then you could use Dexie.ignoreTransaction() to run code that starts a new transaction.\n //\n // Dexie.ignoreTransaction(function() {\n // db.logentries.add(newLogEntry);\n // });\n //\n // Unless using Dexie.ignoreTransaction(), the above example would try to reuse the current transaction\n // in current Promise-scope.\n //\n // An alternative to Dexie.ignoreTransaction() would be setImmediate() or setTimeout(). The reason we still provide an\n // API for this because\n // 1) The intention of writing the statement could be unclear if using setImmediate() or setTimeout().\n // 2) setTimeout() would wait unnescessary until firing. This is however not the case with setImmediate().\n // 3) setImmediate() is not supported in the ES standard.\n // 4) You might want to keep other PSD state that was set in a parent PSD, such as PSD.letThrough.\n return PSD.trans ?\n usePSD(PSD.transless, scopeFunc) : // Use the closest parent that was non-transactional.\n scopeFunc(); // No need to change scope because there is no ongoing transaction.\n },\n\n vip,\n\n async: function (generatorFn: Function) {\n return function () {\n try {\n var rv = awaitIterator(generatorFn.apply(this, arguments));\n if (!rv || typeof rv.then !== 'function')\n return Promise.resolve(rv);\n return rv;\n } catch (e) {\n return rejection(e);\n }\n };\n },\n\n spawn: function (generatorFn, args, thiz) {\n try {\n var rv = awaitIterator(generatorFn.apply(thiz, args || []));\n if (!rv || typeof rv.then !== 'function')\n return Promise.resolve(rv);\n return rv;\n } catch (e) {\n return rejection(e);\n }\n },\n\n // Dexie.currentTransaction property\n currentTransaction: {\n get: () => PSD.trans || null\n },\n\n waitFor: function (promiseOrFunction, optionalTimeout) {\n // If a function is provided, invoke it and pass the returning value to Transaction.waitFor()\n const promise = Promise.resolve(\n typeof promiseOrFunction === 'function' ?\n Dexie.ignoreTransaction(promiseOrFunction) :\n promiseOrFunction)\n .timeout(optionalTimeout || 60000); // Default the timeout to one minute. Caller may specify Infinity if required. \n\n // Run given promise on current transaction. If no current transaction, just return a Dexie promise based\n // on given value.\n return PSD.trans ?\n PSD.trans.waitFor(promise) :\n promise;\n },\n\n // Export our Promise implementation since it can be handy as a standalone Promise implementation\n Promise: Promise,\n\n // Dexie.debug proptery:\n // Dexie.debug = false\n // Dexie.debug = true\n // Dexie.debug = \"dexie\" - don't hide dexie's stack frames.\n debug: {\n get: () => Debug.debug,\n set: value => {\n Debug.setDebug(value, value === 'dexie' ? () => true : dexieStackFrameFilter);\n }\n },\n\n // Export our derive/extend/override methodology\n derive: derive, // Deprecate?\n extend: extend, // Deprecate?\n props: props,\n override: override, // Deprecate?\n // Export our Events() function - can be handy as a toolkit\n Events: Events,\n on: globalEvents,\n liveQuery,\n extendObservabilitySet,\n // Utilities\n getByKeyPath: getByKeyPath,\n setByKeyPath: setByKeyPath,\n delByKeyPath: delByKeyPath,\n shallowClone: shallowClone,\n deepClone: deepClone,\n getObjectDiff: getObjectDiff,\n cmp,\n asap: asap,\n //maxKey: new Dexie('',{addons:[]})._maxKey,\n minKey: minKey,\n // Addon registry\n addons: [],\n // Global DB connection list\n connections: connections,\n\n //MultiModifyError: exceptions.Modify, // Obsolete!\n errnames: errnames,\n\n // Export other static classes\n //IndexSpec: IndexSpec, Obsolete!\n //TableSchema: TableSchema, Obsolete!\n\n //\n // Dependencies\n //\n // These will automatically work in browsers with indexedDB support, or where an indexedDB polyfill has been included.\n //\n // In node.js, however, these properties must be set \"manually\" before instansiating a new Dexie().\n // For node.js, you need to require indexeddb-js or similar and then set these deps.\n //\n dependencies: domDeps,\n\n // API Version Number: Type Number, make sure to always set a version number that can be comparable correctly. Example: 0.9, 0.91, 0.92, 1.0, 1.01, 1.1, 1.2, 1.21, etc.\n semVer: DEXIE_VERSION,\n version: DEXIE_VERSION.split('.')\n .map(n => parseInt(n))\n .reduce((p, c, i) => p + (c / Math.pow(10, i * 2))),\n\n // https://github.com/dfahlander/Dexie.js/issues/186\n // typescript compiler tsc in mode ts-->es5 & commonJS, will expect require() to return\n // x.default. Workaround: Set Dexie.default = Dexie.\n // default: Dexie, // Commented because solved in index-umd.ts instead.\n // Make it possible to import {Dexie} (non-default import)\n // Reason 1: May switch to that in future.\n // Reason 2: We declare it both default and named exported in d.ts to make it possible\n // to let addons extend the Dexie interface with Typescript 2.1 (works only when explicitely\n // exporting the symbol, not just default exporting)\n // Dexie: Dexie // Commented because solved in index-umd.ts instead.\n});\n\nDexie.maxKey = getMaxKey(Dexie.dependencies.IDBKeyRange);\n","import { isIEOrEdge } from '../globals/constants';\nimport { globalEvents, DEXIE_STORAGE_MUTATED_EVENT_NAME, STORAGE_MUTATED_DOM_EVENT_NAME } from '../globals/global-events';\nimport { ObservabilitySet } from \"../public/types/db-events\";\n\nif (typeof dispatchEvent !== 'undefined' && typeof addEventListener !== 'undefined') {\n globalEvents(DEXIE_STORAGE_MUTATED_EVENT_NAME, updatedParts => {\n if (!propagatingLocally) {\n let event: CustomEvent;\n if (isIEOrEdge) {\n event = document.createEvent('CustomEvent');\n event.initCustomEvent(STORAGE_MUTATED_DOM_EVENT_NAME, true, true, updatedParts);\n } else {\n event = new CustomEvent(STORAGE_MUTATED_DOM_EVENT_NAME, {\n detail: updatedParts\n });\n }\n propagatingLocally = true;\n dispatchEvent(event);\n propagatingLocally = false;\n }\n });\n addEventListener(STORAGE_MUTATED_DOM_EVENT_NAME, ({detail}: CustomEvent) => {\n if (!propagatingLocally) {\n propagateLocally(detail);\n }\n });\n}\n\nexport function propagateLocally(updateParts: ObservabilitySet) {\n let wasMe = propagatingLocally;\n try {\n propagatingLocally = true;\n globalEvents.storagemutated.fire(updateParts);\n } finally {\n propagatingLocally = wasMe;\n }\n}\n\nexport let propagatingLocally = false;\n","import {\n globalEvents,\n STORAGE_MUTATED_DOM_EVENT_NAME,\n DEXIE_STORAGE_MUTATED_EVENT_NAME,\n} from '../globals/global-events';\nimport { propagateLocally, propagatingLocally } from './propagate-locally';\n\nif (typeof BroadcastChannel !== 'undefined') {\n const bc = new BroadcastChannel(STORAGE_MUTATED_DOM_EVENT_NAME);\n\n //\n // Propagate local changes to remote tabs, windows and workers via BroadcastChannel\n //\n globalEvents(DEXIE_STORAGE_MUTATED_EVENT_NAME, (changedParts) => {\n if (!propagatingLocally) {\n bc.postMessage(changedParts);\n }\n });\n\n //\n // Propagate remote changes locally via storage event:\n //\n bc.onmessage = (ev) => {\n if (ev.data) propagateLocally(ev.data);\n };\n} else if (typeof self !== 'undefined' && typeof navigator !== 'undefined') {\n // DOM verified - when typeof self !== \"undefined\", we are a window or worker. Not a Node process.\n\n //\n // Propagate local changes to remote tabs/windows via storage event and service worker\n // via messages. We have this code here because of https://bugs.webkit.org/show_bug.cgi?id=161472.\n //\n globalEvents(DEXIE_STORAGE_MUTATED_EVENT_NAME, (changedParts) => {\n try {\n if (!propagatingLocally) {\n if (typeof localStorage !== 'undefined') {\n // We're a browsing window or tab. Propagate to other windows/tabs via storage event:\n localStorage.setItem(\n STORAGE_MUTATED_DOM_EVENT_NAME,\n JSON.stringify({\n trig: Math.random(),\n changedParts,\n })\n );\n }\n if (typeof self['clients'] === 'object') {\n // We're a service worker. Propagate to our browser clients.\n [...self['clients'].matchAll({ includeUncontrolled: true })].forEach(\n (client) =>\n client.postMessage({\n type: STORAGE_MUTATED_DOM_EVENT_NAME,\n changedParts,\n })\n );\n }\n }\n } catch {}\n });\n\n //\n // Propagate remote changes locally via storage event:\n //\n if (typeof addEventListener !== 'undefined') {\n addEventListener('storage', (ev: StorageEvent) => {\n if (ev.key === STORAGE_MUTATED_DOM_EVENT_NAME) {\n const data = JSON.parse(ev.newValue);\n if (data) propagateLocally(data.changedParts);\n }\n });\n }\n\n //\n // Propagate messages from service worker\n //\n const swContainer = self.document && navigator.serviceWorker; // self.document is to verify we're not the SW ourself\n if (swContainer) {\n // We're a browser window and want to propagate message from the SW:\n swContainer.addEventListener('message', propagateMessageLocally);\n }\n}\n\nfunction propagateMessageLocally({ data }: MessageEvent) {\n if (data && data.type === STORAGE_MUTATED_DOM_EVENT_NAME) {\n propagateLocally(data.changedParts);\n }\n}\n","import { Dexie } from './classes/dexie';\nimport { DexieConstructor } from './public/types/dexie-constructor';\nimport { DexiePromise } from './helpers/promise';\nimport { mapError } from './errors';\nimport * as Debug from './helpers/debug';\nimport { dexieStackFrameFilter } from './globals/constants';\n\n// Generate all static properties such as Dexie.maxKey etc\n// (implement interface DexieConstructor):\nimport './classes/dexie/dexie-static-props';\nimport './live-query/enable-broadcast';\nimport { liveQuery } from './live-query/live-query';\n\n// Set rejectionMapper of DexiePromise so that it generally tries to map\n// DOMErrors and DOMExceptions to a DexieError instance with same name but with\n// async stack support and with a prototypal inheritance from DexieError and Error.\n// of Map DOMErrors and DOMExceptions to corresponding Dexie errors.\nDexiePromise.rejectionMapper = mapError;\n\n// Let the async stack filter focus on app code and filter away frames from dexie.min.js:\nDebug.setDebug(Debug.debug, dexieStackFrameFilter);\n\nexport { RangeSet, mergeRanges, rangesOverlap } from \"./helpers/rangeset\";\nexport { Dexie, liveQuery }; // Comply with public/index.d.ts.\nexport default Dexie;\n","import {Put, Get, Message} from '../Message'\nimport { Actor } from '../Actor';\nimport _ from \"../../lodash\";\nimport Dexie from 'dexie';\nimport {Children, NodeData} from \"../Node\";\n// import * as Comlink from \"comlink\";\n\n// TODO: add LRU or other eviction policy, clean up least important data when db gets too big\nclass MyDexie extends Dexie {\n nodes: Dexie.Table;\n constructor(dbName: string) {\n super(dbName);\n this.version(1).stores({\n nodes: \", value, updatedAt\"\n });\n this.nodes = this.table(\"nodes\");\n }\n}\n\nexport default class IndexedDB extends Actor {\n config = {};\n notStored = new Set();\n putQueue: any = {};\n getQueue: any = {};\n i = 0;\n queue = 0;\n db: MyDexie;\n\n constructor(config: any = {}) {\n super();\n this.config = config;\n const dbName = (config.dbName || 'iris');\n this.db = new MyDexie(dbName);\n this.db.open().catch((err) => {\n console.error(err.stack || err);\n });\n }\n\n put(nodeId: string, value: any) {\n // add puts to a queue and dexie bulk write them once per 500ms\n this.putQueue[nodeId] = value;\n this.throttledPut();\n }\n\n throttledPut = _.throttle(() => {\n const keys = Object.keys(this.putQueue);\n const values = keys.map(key => {\n this.notStored.delete(key);\n return this.putQueue[key];\n });\n this.db.nodes.bulkPut(values, keys).catch((err) => {\n console.error(err);\n });\n this.putQueue = {};\n }, 500);\n\n get(path: string, callback: Function) {\n this.getQueue[path] = this.getQueue[path] || [];\n this.getQueue[path].push(callback);\n this.throttledGet();\n }\n\n throttledGet = _.throttle(() => {\n // clone this.getQueue and clear it\n const queue = this.getQueue;\n const keys = Object.keys(queue);\n this.db.nodes.bulkGet(keys).then((values: (any | undefined)[]) => {\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n const value = values[i];\n const callbacks = queue[key];\n // console.log('have', key, value);\n for (const callback of callbacks) {\n callback(value);\n }\n }\n });\n this.getQueue = {};\n }, 100);\n\n handle(message: Message) {\n if (message instanceof Put) {\n this.handlePut(message);\n } else if (message instanceof Get) {\n this.handleGet(message);\n } else {\n console.log('worker got unknown message', message);\n }\n }\n\n handleGet(message: Get) {\n if (this.notStored.has(message.nodeId)) {\n // TODO message implying that the key is not stored\n return;\n }\n this.get(message.nodeId, (children: any) => {\n // TODO: this takes a long time to return\n if (children === undefined) {\n this.notStored.add(message.nodeId);\n // TODO message implying that the key is not stored\n } else {\n const putMessage = Put.newFromKv(message.nodeId, children, this);\n putMessage.inResponseTo = message.id;\n message.from && message.from.postMessage(putMessage);\n }\n });\n }\n\n mergeAndSave(path: string, children: Children) {\n this.get(path, (existing: any) => {\n // TODO check updatedAt timestamp\n if (existing === undefined) {\n this.put(path, children);\n } else {\n for (const [key, value] of Object.entries(children)) {\n if (existing[key] && existing[key].updatedAt >= value.updatedAt) {\n continue;\n }\n existing[key] = value;\n }\n this.put(path, existing);\n }\n });\n }\n\n savePath(path: string, value: any) {\n if (value === undefined) {\n this.db.nodes.delete(path);\n this.notStored.add(path);\n } else {\n this.notStored.delete(path);\n this.mergeAndSave(path, value);\n }\n }\n\n async handlePut(put: Put) {\n for (const [nodeName, children] of Object.entries(put.updatedNodes)) {\n if (!children) {\n console.log('deleting', nodeName);\n continue;\n }\n this.mergeAndSave(nodeName, children);\n }\n }\n}\n\n/*\nlet actor;\nglobal.onconnect = () => {\n if (actor) {\n console.log ('worker already exists');\n } else {\n console.log('starting worker');\n actor = actor || new IndexedDB();\n }\n}\n */\n\n// self.onconnect = (e) => Comlink.expose(actor, e.ports[0]);","import {Get, Message, Put} from \"../Message\";\nimport {Actor} from \"../Actor\";\n//@ts-ignore\n\nexport default class Websocket extends Actor {\n ws: WebSocket;\n router: Actor;\n sendQueue: string[] = [];\n\n constructor(url: string, router: Actor) {\n super('websocket:' + url);\n console.log('Websocket', url);\n this.router = router;\n this.ws = new WebSocket(url.replace('http', 'ws'));\n this.ws.onopen = () => {\n //this.ws.send(new Hi(this.router.peerId).serialize());\n console.log(`Connected to ${url}`);\n this.sendQueue.forEach((message) => this.ws.send(message));\n this.sendQueue = [];\n }\n this.ws.onmessage = async (event) => {\n try {\n const message = await Message.deserialize(event.data, this);\n this.router.postMessage(message);\n } catch (e) {\n //console.log('Failed to deserialize message', event.data, e);\n }\n }\n this.ws.onclose = () => {\n console.log(`Disconnected from ${url}`);\n }\n this.ws.onerror = () => {\n console.log(`Error on ${url}`);\n }\n }\n\n handle(message: Message): void {\n if (message instanceof Get || message instanceof Put) {\n if (message.from === this) {\n return;\n }\n if (this.ws.readyState === WebSocket.OPEN) {\n this.ws.send(message.serialize());\n } else if (this.ws.readyState === WebSocket.CONNECTING) {\n this.sendQueue.push(message.serialize());\n }\n }\n }\n}\n\n\n","import {Actor} from \"./Actor\";\nimport Memory from \"./adapters/Memory\";\nimport IndexedDB from \"./adapters/IndexedDB\";\nimport Websocket from \"./adapters/Websocket\";\nimport {Put, Get, Message} from \"./Message\";\n// import * as Comlink from \"comlink\";\n\n/*\nclass SeenGetMessage {\n constructor(id, from, lastReplyChecksum) {\n this.id = id;\n this.from = from;\n this.lastReplyChecksum = lastReplyChecksum;\n }\n}\n*/\n\nexport default class Router extends Actor {\n storageAdapters: Set = new Set();\n networkAdapters: Set = new Set();\n serverPeers: Set = new Set();\n seenMessages: Set = new Set();\n seenGetMessages: Map = new Map();\n subscribersByTopic: Map> = new Map();\n msgCounter = 0;\n peerId: string;\n\n constructor(config: any = {}) {\n super('router');\n // default random id\n this.peerId = config.peerId || Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15);\n this.storageAdapters.add(new Memory(config));\n this.storageAdapters.add(new IndexedDB(config));\n console.log('config', config);\n if (config.peers) {\n for (const peer of config.peers) {\n if (peer) {\n this.serverPeers.add(new Websocket(peer, this));\n }\n }\n }\n }\n\n handle(message: Message) {\n //console.log('router received', message);\n if (message instanceof Put || message instanceof Get) {\n if (this.seenMessages.has(message.id)) {\n return;\n }\n this.seenMessages.add(message.id);\n if (message instanceof Put) {\n this.handlePut(message);\n } else if (message instanceof Get) {\n this.handleGet(message);\n }\n }\n }\n\n handlePut(put: Put) {\n const sendTo: Set = new Set();\n Object.keys(put.updatedNodes).forEach(path => {\n // topic is first 3 nodes of path\n const topic = path.split('/').slice(0, 3).join('/');\n const subscribers = this.subscribersByTopic.get(topic);\n // send to storage adapters\n //console.log('put subscribers', subscribers);\n for (const storageAdapter of this.storageAdapters) {\n if (put.from !== storageAdapter) {\n sendTo.add(storageAdapter);\n }\n }\n\n for (const peer of this.serverPeers) {\n if (put.from !== peer) {\n sendTo.add(peer);\n }\n }\n\n if (subscribers) {\n for (const subscriber of subscribers) {\n if (subscriber !== put.from) {\n sendTo.add(subscriber);\n }\n }\n }\n });\n for (const actor of sendTo) {\n actor.postMessage(put);\n }\n }\n\n opt(opts: any) {\n if (opts.peers) {\n for (const peer of opts.peers) {\n if (peer) {\n this.serverPeers.add(new Websocket(peer, this));\n }\n }\n }\n }\n\n handleGet(get: Get) {\n const topic = get.nodeId.split('/')[1];\n const sendTo: Set = new Set();\n for (const storageAdapter of this.storageAdapters) {\n if (get.from !== storageAdapter) {\n sendTo.add(storageAdapter);\n }\n }\n for (const peer of this.serverPeers) {\n if (get.from !== peer) {\n sendTo.add(peer);\n }\n }\n if (!this.subscribersByTopic.has(topic)) {\n this.subscribersByTopic.set(topic, new Set());\n }\n const subscribers = this.subscribersByTopic.get(topic);\n if (subscribers) {\n if (!subscribers.has(get.from)) {\n subscribers.add(get.from);\n }\n }\n for (const actor of sendTo) {\n actor.postMessage(get);\n }\n }\n}\n\n/*\nlet actor: Actor;\nself.onconnect = () => {\n console.log('router shared worker connected');\n actor = actor || new Router();\n}\n*/\n\n// self.onconnect = (e) => Comlink.expose(actor, e.ports[0]);","import _ from '../lodash';\nimport {Actor} from './Actor';\nimport {Message, Put, Get, UpdatedNodes} from './Message';\n\n// @ts-ignore\nimport Router from './Router';\nimport Key from \"../Key\";\n//import * as Comlink from \"comlink\";\n\nexport type NodeData = {\n value: any;\n updatedAt: number;\n};\n\nexport type Children = {\n [key: string]: NodeData;\n}\n\nexport type Config = {\n peerId?: string;\n allowPublicSpace: boolean;\n myPublicKey?: string;\n enableStats: boolean;\n webSocketPeers?: string[];\n localOnly: boolean;\n}\n\nexport const DEFAULT_CONFIG: Config = {\n allowPublicSpace: false,\n enableStats: true,\n localOnly: true\n}\n\n// TODO move memory storage to its own adapter? it would make things simpler here\nexport default class Node extends Actor {\n root: Node;\n parent?: Node;\n children = new Map();\n once_subscriptions = new Map();\n on_subscriptions = new Map();\n map_subscriptions = new Map();\n counter = 0;\n config: Config;\n currentUser: any;\n router: Router;\n\n constructor(id = '', config?: Config, parent?: Node) {\n super(id);\n this.parent = parent;\n this.config = config || (parent && parent.config) || DEFAULT_CONFIG;\n if (parent) {\n this.root = parent.root;\n this.router = parent.router;\n } else {\n this.root = this;\n //@ts-ignore\n this.router = new Router({dbName: this.id + '-idb', peers: this.config.webSocketPeers});\n //console.log('idbWorker', idbWorker);\n //const router = Comlink.wrap(routerWorker);\n }\n }\n\n getCurrentUser(): any {\n return this.root.currentUser;\n }\n\n setCurrentUser(key: any) {\n this.root.currentUser = key;\n }\n\n handle(message: Message): void {\n if (message instanceof Put) {\n for (const [key, children] of Object.entries(message.updatedNodes)) {\n if (!children || typeof children !== 'object') {\n continue;\n }\n if (key === this.id) {\n for (const [childKey, childData] of Object.entries(children)) {\n this.get(childKey).doCallbacks(childData, childKey); // TODO children should have proper NodeData\n }\n }\n }\n this.parent && this.parent.handle(message);\n }\n };\n\n get(key: string): Node {\n const existing = this.children.get(key);\n if (existing) {\n return existing;\n }\n const newNode = new Node(`${this.id}/${key}`, this.config, this);\n this.children.set(key, newNode);\n return newNode;\n }\n\n user(pub: string | undefined): Node {\n pub = pub || (this.root.currentUser && this.root.currentUser.pub);\n if (!pub) {\n throw new Error(\"no public key!\");\n }\n return this.get('user').get(pub as string);\n }\n\n auth(key: any) {\n // TODO get public key from key\n this.root.setCurrentUser(key);\n return;\n }\n\n doCallbacks = (data: NodeData, key: string) => {\n if (typeof data.value === 'string' && data.value.startsWith('{\":\":')) {\n data.value = JSON.parse(data.value)[':'];\n }\n for (const [id, callback] of this.on_subscriptions) {\n const event = { off: () => this.on_subscriptions.delete(id) };\n callback(data.value, key, null, event);\n }\n for (const [id, callback] of this.once_subscriptions) {\n callback(data.value, key, null, {});\n this.once_subscriptions.delete(id);\n }\n if (this.parent) {\n const parent = this.parent;\n for (const [id, callback] of parent.map_subscriptions) {\n const event = { off: () => parent.map_subscriptions.delete(id) };\n callback(data.value, key, null, event);\n }\n }\n };\n\n async put(value: any): Promise {\n const updatedAt = Date.now();\n if (Array.isArray(value)) {\n throw new Error('put() does not support arrays');\n }\n if (typeof value === 'function') {\n throw new Error('put() does not support functions');\n }\n if (typeof value === 'object' && value !== null) {\n // TODO: update the whole path of parent nodes\n for (const key in value) {\n this.get(key).put(value[key]);\n }\n return;\n }\n value = await this.signIfNeeded(value);\n this.children = new Map();\n const updatedNodes: UpdatedNodes = {};\n await this.addParentNodes(updatedNodes, value, updatedAt);\n const put = Put.new(updatedNodes, this);\n this.handle(put);\n this.router.postMessage(put);\n }\n\n private async signIfNeeded(value: any) {\n if (this.id.indexOf('global/user/') === 0) {\n if (!this.getCurrentUser()) {\n throw new Error('not authenticated');\n }\n if (this.id.indexOf('global/user/' + this.getCurrentUser().pub) !== 0) {\n throw new Error('not allowed ' + this.id);\n }\n const signed = await Key.sign(value, this.getCurrentUser(), undefined, {raw: true});\n value = JSON.stringify({':': signed.m, '~': signed.s});\n console.log('saving signed value', value);\n }\n return value;\n }\n\n private async addParentNodes(updatedNodes: UpdatedNodes, value: any, updatedAt: number) {\n // TODO sign\n if (this.parent) {\n const childName = this.id.split('/').pop() as string;\n const parentId = this.parent.id;\n updatedNodes[parentId] = updatedNodes[parentId] || {};\n updatedNodes[parentId][childName] = {value, updatedAt};\n await this.parent.addParentNodes(updatedNodes, {'#': this.parent.id }, updatedAt);\n }\n }\n\n private request() {\n if (this.parent) { // TODO router should decide whether to re-request from peers\n const childKey = this.id.split('/').pop();\n this.router.postMessage(Get.new(this.parent.id, this, undefined, childKey));\n }\n }\n\n async once(callback?: Function | null): Promise {\n const id = this.counter++;\n callback && this.once_subscriptions.set(id, callback);\n this.request();\n }\n\n on(callback: Function): void {\n const id = this.counter++;\n this.on_subscriptions.set(id, callback);\n //const event = { off: () => this.on_subscriptions.delete(id) };\n this.request();\n }\n\n map(callback: Function): void {\n const id = this.counter++;\n this.map_subscriptions.set(id, callback);\n // TODO: child key should probably still be included. But how to handle link responses?\n this.router.postMessage(Get.new(this.id, this, undefined));\n }\n\n opt(opts: any) {\n this.router.opt(opts);\n }\n}","import peers from \"./peers\";\nimport Node from \"./db/Node\";\n\nlet globalState: any;\n\nexport default function(opts: any = {}) {\n if (!globalState) {\n peers.init();\n const webSocketPeers = (opts.peers || peers.random());\n console.log('webSocketPeers', webSocketPeers);\n const myOpts = Object.assign({ webSocketPeers, localStorage: false, retry:Infinity }, opts);\n if (opts.peers) {\n console.log('adding peers', opts.peers);\n opts.peers.forEach((url: string) => peers.add({url}));\n }\n globalState = new Node('global', myOpts);\n }\n return globalState;\n}","// @ts-nocheck\n\n/*eslint no-useless-escape: \"off\", camelcase: \"off\" */\n\nconst UNIQUE_ID_VALIDATORS = {\n email: /^([\\w-]+(?:\\.[\\w-]+)*)@((?:[\\w-]+\\.)*\\w[\\w-]{0,66})\\.([a-z]{2,6}(?:\\.[a-z]{2})?)$/i,\n bitcoin: /^[13][a-km-zA-HJ-NP-Z0-9]{26,33}$/,\n bitcoin_address: /^[13][a-km-zA-HJ-NP-Z0-9]{26,33}$/,\n ip: /^(([1-9]?\\d|1\\d\\d|2[0-5][0-5]|2[0-4]\\d)\\.){3}([1-9]?\\d|1\\d\\d|2[0-5][0-5]|2[0-4]\\d)$/,\n ipv6: /^(?:[A-F0-9]{1,4}:){7}[A-F0-9]{1,4}$/,\n gpg_fingerprint: null,\n gpg_keyid: null,\n google_oauth2: null,\n tel: /^\\d{7,}$/,\n phone: /^\\d{7,}$/,\n keyID: null,\n url: /[-a-zA-Z0-9@:%_\\+.~#?&//=]{2,256}\\.[a-z]{2,4}\\b(\\/[-a-zA-Z0-9@:%_\\+.~#?&//=]*)?/gi,\n account: /^([\\w-]+(?:\\.[\\w-]+)*)@((?:[\\w-]+\\.)*\\w[\\w-]{0,66})\\.([a-z]{2,6}(?:\\.[a-z]{2})?)$/i,\n uuid: /[0-9a-f]{8}\\-[0-9a-f]{4}\\-[0-9a-f]{4}\\-[0-9a-f]{4}\\-[0-9a-f]{12}/\n};\n\n// TODO this class could perhaps be removed\n\nclass Attribute {\n constructor(a, b) {\n if (typeof a === `object`) {\n if (typeof a.value !== `string`) { throw new Error(`param1.value must be a string, got ${typeof a.value}: ${JSON.stringify(a.value)}`); }\n if (typeof a.type !== `string`) { throw new Error(`param1.type must be a string, got ${typeof a.type}: ${JSON.stringify(a.type)}`); }\n b = a.value;\n a = a.type;\n }\n if (typeof a !== `string`) { throw new Error(`First param must be a string, got ${typeof a}: ${JSON.stringify(a)}`); }\n if (!a.length) { throw new Error(`First param string is empty`); }\n if (b) {\n if (typeof b !== `string`) { throw new Error(`Second parameter must be a string, got ${typeof b}: ${JSON.stringify(b)}`); }\n if (!b.length) { throw new Error(`Second param string is empty`); }\n this.type = a;\n this.value = b;\n } else {\n this.value = a;\n const t = Attribute.guessTypeOf(this.value);\n if (t) {\n this.type = t;\n } else {\n throw new Error(`Type of attribute was omitted and could not be guessed`);\n }\n }\n }\n\n static getUuid() {\n const b = a => a ? (a ^ Math.random() * 16 >> a / 4).toString(16) : ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, b);\n return new Attribute(`uuid`, b());\n }\n\n static getUniqueIdValidators() {\n return UNIQUE_ID_VALIDATORS;\n }\n\n static isUniqueType(type) {\n return Object.keys(UNIQUE_ID_VALIDATORS).indexOf(type) > -1;\n }\n\n isUniqueType() {\n return Attribute.isUniqueType(this.type);\n }\n\n static guessTypeOf(value) {\n for (const key in UNIQUE_ID_VALIDATORS) {\n if (value.match(UNIQUE_ID_VALIDATORS[key])) {\n return key;\n }\n }\n }\n\n static equals(a, b) {\n return a.equals(b);\n }\n\n equals(a) {\n return a && this.type === a.type && this.value === a.value;\n }\n\n uri() {\n return `${encodeURIComponent(this.value)}:${encodeURIComponent(this.type)}`;\n }\n}\n\nexport default Attribute;\n","import globalState from './global';\nimport session from './session';\n\n/**\n * Get a public space where only the specified user (public key) can write. Others can read.\n * @param pub The public key string or keypair object of the user. Defaults to the current user from session.\n * @returns {Node} The user space.\n */\nexport default function(pub: any = session.getKey()) {\n if (typeof pub === 'string') {\n return globalState().user(pub);\n } else if (typeof pub === 'object') {\n const userSpace = globalState().user(pub.pub);\n userSpace.auth(pub);\n return userSpace;\n }\n}\n","// @ts-nocheck\n\nimport util from './util';\nimport Attribute from './Attribute';\nimport session from './session';\nimport publicState from './global';\nimport userState from './public';\nimport Key from './Key';\n\n// TODO: extract Group channels into their own class\n\nconst DEFAULT_PERMISSIONS = {read: true, write: true, admin: false};\n\n/**\n* Private communication channel between two or more participants ([Gun](https://github.com/amark/gun) public keys). Can be used independently of other Iris stuff.\n*\n* Used as a core element of [iris-messenger](https://github.com/irislib/iris-messenger).\n*\n* You can use iris.private(pub) to always use the same Channel object for a given pub.\n*\n* ---\n*\n* #### Key-value API\n* `channel.put(key, value)` and `channel.on(key, callback)`.\n*\n* Note that each participant has their own versions of each key-value — they don't overwrite each other. `channel.on()` callback returns them all by default and has a parameter that indicates whose value you got.\n*\n* While values are encrypted, encryption of keys is not implemented yet.\n*\n* #### Message API\n* `channel.send()` and `channel.getMessages()` for timestamp-indexed chat-style messaging.\n*\n* Message data is encrypted, but timestamps are public so that peers can return your messages in a sequential order.\n*\n* ---\n*\n* You can open a channel with yourself for a private key-value space or a \"note to self\" type chat with yourself.\n*\n* **Privacy disclaimer:** Channel ids, data values and messages are encrypted, but message timestamps are unencrypted so that peers can return them to you in a sequential order. By looking at the unencrypted timestamps (or Gun subscriptions), it is possible to guess who are communicating with each other. This could be improved by indexing messages by *day* only, so making the guess would be more difficult, while you could still return them in a semi-sequential order.\n*\n* @param {Object} options\n* @param {string} options.key your keypair\n* @param {Object} options.gun [gun](https://github.com/amark/gun) instance\n* @param options.participants (optional) string or string array or permissions object ({'pub1':{read:true,write:true,admin:false},'pub2'...}) of participant public keys (your own key is included by default)\n* @param {string} options.chatLink (optional) chat link instead of participants list\n* @param {string} options.uuid (group channels only) unique channel identifier. Leave out for new channel.\n* @param {string} options.name (group channels only) channel name\n* @example\n* // Copy & paste this to console at https://iris.to or other page that has gun, sea and iris-lib\n* // Due to an unsolved bug, someoneElse's messages only start showing up after a reload\n*\n* var gun1 = new Gun('https://gun-us.herokuapp.com/gun');\n* var gun2 = new Gun('https://gun-us.herokuapp.com/gun');\n* var myKey = await Key.getDefault();\n* var someoneElse = localStorage.getItem('someoneElsesKey');\n* if (someoneElse) {\n* someoneElse = JSON.parse(someoneElse);\n* } else {\n* someoneElse = await Key.generate();\n* localStorage.setItem('someoneElsesKey', JSON.stringify(someoneElse));\n* }\n*\n* iris.Channel.initUser(gun1, myKey); // saves myKey.epub to gun.user().get('epub')\n* iris.Channel.initUser(gun2, someoneElse);\n*\n* var ourChannel = new iris.Channel({key: myKey, gun: gun1, participants: someoneElse.pub});\n* var theirChannel = new iris.Channel({key: someoneElse, gun: gun2, participants: myKey.pub});\n*\n* var myChannels = {}; // you can list them in a user interface\n* function printMessage(msg, info) {\n* console.log(`[${new Date(msg.time).toLocaleString()}] ${info.from.slice(0,8)}: ${msg.text}`)\n* }\n* iris.Channel.getChannels(gun1, myKey, channel => {\n* var pub = channel.getCurrentParticipants()[0];\n* gun1.user(pub).get('profile').get('name').on(name => channel.name = name);\n* myChannels[pub] = channel;\n* channel.getMessages(printMessage);\n* channel.on('mood', (mood, from) => console.log(from.slice(0,8) + ' is feeling ' + mood));\n* });\n*\n* // you can play with these in the console:\n* ourChannel.send('message from myKey');\n* theirChannel.send('message from someoneElse');\n*\n* ourChannel.put('mood', 'blessed');\n* theirChannel.put('mood', 'happy');\n*\n* @example https://github.com/irislib/iris-lib/blob/master/__tests__/Channel.js\n*/\nclass Channel {\n // TODO: these should be done in a cleaner way\n latestTime: any;\n theirMsgsLastSeenDate: any;\n myLastSeenTime: any;\n theirMsgsLastSeenTime: any;\n notificationSetting: any;\n messageIds: any; // this is used from session.processMessage\n latest: any;\n uuid: any;\n name: any;\n attachments: any;\n\n theirSecretUuids = {};\n theirGroupSecrets = {};\n secrets = {};\n ourSecretChannelIds = {};\n theirSecretChannelIds = {};\n messages = {};\n chatLinks = {};\n groupSubscriptions = {};\n directSubscriptions = {};\n getParticipantsCallbacks = {};\n myGroupSecret: any;\n participants: any;\n\n constructor(options: any) {\n this.myGroupSecret = options.myGroupSecret;\n\n if (options.chatLink) {\n this.useChatLink(options);\n }\n\n if (typeof options.participants === `string`) {\n this.addParticipant(options.participants, options.save);\n } else if (Array.isArray(options.participants)) {\n const o = {};\n options.participants.forEach(p => o[p] = Object.assign({}, DEFAULT_PERMISSIONS));\n options.participants = o;\n }\n if (typeof options.participants === `object`) { // it's a group channel\n const keys = Object.keys(options.participants);\n keys.forEach(k => {\n if (k !== session.getKey().pub) {\n this.addParticipant(k, options.save, Object.assign({}, DEFAULT_PERMISSIONS, options.participants[k]));\n }\n });\n options.participants[session.getKey().pub] = options.participants[session.getKey().pub] || Object.assign({}, DEFAULT_PERMISSIONS);\n if (options.uuid) {\n this.uuid = options.uuid;\n this.name = options.name;\n } else {\n options.uuid = Attribute.getUuid().value;\n this.uuid = options.uuid;\n options.participants[session.getKey().pub].admin = true;\n options.participants[session.getKey().pub].founder = true;\n }\n this.getChatLinks({subscribe: true});\n }\n this.participants = options.participants;\n if (options.uuid) { // It's a group channel\n // share secret uuid with other participants. since secret is already non-deterministic, maybe uuid could also be?\n // generate channel-specific secret and share it with other participants\n // put() keys should be encrypted first? so you could do put(uuid, secret)\n // what if you join the channel with 2 unconnected devices? on reconnect, the older secret would be overwritten and messages unreadable. maybe participants should store each others' old keys? or maybe you should store them and re-encrypt old stuff when key changes? return them with map() instead?\n this.putDirect(`S${this.uuid}`, this.getMyGroupSecret());\n this.getMySecretUuid().then(s => {\n this.putDirect(this.uuid, s); // TODO: encrypt keys in put()\n });\n this.onTheirDirect(this.uuid, (s, k, from) => {\n this.theirSecretUuids[from] = s;\n });\n this.onTheirDirect(`S${this.uuid}`, (s, k, from) => {\n this.theirGroupSecrets[from] = s;\n });\n // need to make put(), on(), send() and getMessages() behave differently when it's a group and retain the old versions for mutual signaling\n }\n this.onTheir(`participants`, (participants, k, from) => {\n let hasAdmin = false;\n const keys = Object.keys(this.participants);\n for (let i = 0; i < keys.length; i++) {\n if (this.participants[keys[i]].admin || this.participants[keys[i]].inviter) {\n hasAdmin = true;\n break;\n }\n }\n if (!hasAdmin) {\n keys.forEach(k => this.participants[k].admin = true); // if no admins, make everyone admin\n }\n if (this.participants[from] && (this.participants[from].admin || this.participants[from].inviter)) {\n if (typeof participants === `object`) {\n if (JSON.stringify(this.participants) === JSON.stringify(participants)) { return; }\n this.participants = participants;\n delete this.participants[from].inviter;\n Object.keys(participants).forEach(k => {\n if (k !== session.getKey().pub) {\n this.addParticipant(k, true, Object.assign({}, DEFAULT_PERMISSIONS, participants[k]), true);\n }\n });\n this.participantsChanged();\n options.saved = true;\n }\n }\n });\n if (!options.saved && (options.save === undefined || options.save === true)) {\n this.save();\n }\n }\n\n useChatLink(options) {\n const s = options.chatLink.split('?');\n if (s.length === 2) {\n const chatWith = util.getUrlParameter('chatWith', s[1]);\n const channelId = util.getUrlParameter('channelId', s[1]);\n const inviter = util.getUrlParameter('inviter', s[1]);\n const pub = inviter || chatWith;\n if (chatWith) {\n options.participants = pub;\n } else if (channelId && inviter && inviter !== session.getKey().pub) { // TODO! initializing it twice breaks things - new secret is generated\n options.uuid = channelId;\n options.participants = {};\n options.participants[inviter] = Object.assign({inviter: true}, DEFAULT_PERMISSIONS);\n }\n if (pub !== session.getKey().pub) {\n const sharedSecret = util.getUrlParameter('s', s[1]);\n const linkId = util.getUrlParameter('k', s[1]);\n if (sharedSecret && linkId) {\n this.save(); // save the channel first so it's there before inviter subscribes to it\n options.saved = true;\n publicState().user(pub).get('chatLinks').get(linkId).get('encryptedSharedKey').on(async encrypted => {\n const sharedKey = await Key.decrypt(encrypted, sharedSecret);\n const encryptedChatRequest = await Key.encrypt(session.getKey().pub, sharedSecret); // TODO encrypt is not deterministic, it uses salt\n const channelRequestId = await util.getHash(encryptedChatRequest);\n publicState(sharedKey).get('chatRequests').get(channelRequestId.slice(0, 12)).put(encryptedChatRequest);\n });\n }\n }\n }\n }\n\n getTheirSecretUuid(pub) {\n return new Promise(resolve => {\n if (!this.theirSecretUuids[pub]) {\n this.onTheirDirect(this.uuid, s => {\n this.theirSecretUuids[pub] = s;\n resolve(this.theirSecretUuids[pub]);\n }, pub);\n } else {\n resolve(this.theirSecretUuids[pub]);\n }\n });\n }\n\n getTheirGroupSecret(pub) {\n if (pub === session.getKey().pub) { return this.getMyGroupSecret(); }\n return new Promise(resolve => {\n if (!this.theirGroupSecrets[pub]) {\n this.onTheirDirect(`S${this.uuid}`, s => {\n this.theirGroupSecrets[pub] = s;\n resolve(this.theirGroupSecrets[pub]);\n }, pub);\n } else {\n resolve(this.theirGroupSecrets[pub]);\n }\n });\n }\n\n changeMyGroupSecret() {\n this.myGroupSecret = Key.random(32).toString('base64');\n // TODO: secret should be archived and probably messages should include the encryption key id so past messages don't become unreadable\n this.putDirect(`S${this.uuid}`, this.myGroupSecret);\n }\n\n /**\n * Unsubscribe messages from a channel participants\n *\n * @param {string} participant public key\n */\n async mute(participant) {\n publicState().user(participant).get(this.theirSecretUuids[participant]).off();\n // TODO: persist\n }\n\n /**\n * Mute user and prevent them from seeing your further (and maybe past) messages\n *\n * @param {string} participant public key\n */\n async block(participant) {\n this.mute(participant);\n this.putDirect(this.uuid, null);\n this.putDirect(`S${this.uuid}`, null);\n delete this.secrets[participant];\n delete this.ourSecretChannelIds[participant];\n delete this.theirSecretChannelIds[participant];\n this.changeMyGroupSecret();\n }\n\n async getMySecretUuid() {\n if (!this.mySecretUuid) {\n const mySecret = await Key.secret(session.getKey().epub, session.getKey());\n const mySecretHash = await util.getHash(mySecret);\n this.mySecretUuid = await util.getHash(mySecretHash + this.uuid);\n }\n return this.mySecretUuid;\n }\n\n /**\n * List participants of the channel (other than you)\n */\n getCurrentParticipants() {\n return Object.keys(this.secrets);\n }\n\n /**\n * Subscribe to the changing list of participants by channel admins\n */\n getParticipants(callback) {\n if (this.getParticipantsCallbackId) {\n this.getParticipantsCallbackId++;\n } else {\n this.getParticipantsCallbackId = 1;\n }\n this.getParticipantsCallbacks[this.getParticipantsCallbackId] = callback;\n if (this.participants) {\n callback(this.participants);\n }\n }\n\n participantsChanged() {\n Object.keys(this.getParticipantsCallbacks).forEach(id => {\n this.getParticipantsCallbacks[id](this.participants);\n });\n }\n\n /**\n * Returns either the uuid of a group channel or the public key of a direct channel.\n */\n getId() {\n return this.uuid || this.getCurrentParticipants()[0];\n }\n\n async getSecret(pub) {\n if (!this.secrets[pub]) {\n const epub = await util.gunOnceDefined(publicState().user(pub).get(`epub`));\n this.secrets[pub] = await Key.secret(epub, session.getKey());\n }\n return this.secrets[pub];\n }\n\n /**\n *\n */\n static async getOurSecretChannelId(pub, pair) {\n const epub = await util.gunOnceDefined(publicState().user(pub).get(`epub`));\n const secret = await Key.secret(epub, pair);\n return util.getHash(secret + pub);\n }\n\n /**\n *\n */\n static async getTheirSecretChannelId(pub, pair) {\n const epub = await util.gunOnceDefined(publicState().user(pub).get(`epub`));\n const secret = await Key.secret(epub, pair);\n return util.getHash(secret + pair.pub);\n }\n\n /**\n * Calls back with Channels that you have initiated or written to.\n * @param {Object} keypair Key keypair that the gun instance is authenticated with\n * @param callback callback function that is called for each public key you have a channel with\n */\n static async getChannels(callback, listenToChatLinks = true) {\n const keypair = session.getKey();\n const mySecret = await Key.secret(keypair.epub, keypair);\n if (listenToChatLinks) {\n Channel.getMyChatLinks( undefined, undefined, true);\n }\n const seen = {};\n\n const handleChannel = async (value, ourSecretChannelId) => {\n if (value && !seen[ourSecretChannelId]) {\n seen[ourSecretChannelId] = true;\n if (ourSecretChannelId.length > 44) {\n publicState().user().get(`chats`).get(ourSecretChannelId).put(null);\n return;\n }\n const encryptedChatId = await util.gunOnceDefined(publicState().user().get(`chats`).get(ourSecretChannelId).get(`pub`));\n const chatId = await Key.decrypt(encryptedChatId, mySecret);\n if (!chatId) {\n return;\n }\n if (chatId.pub || typeof chatId === `string`) {\n callback(new Channel({\n key: keypair,\n participants: chatId.pub || chatId,\n save: false\n }));\n } else if (chatId.uuid && chatId.participants && chatId.myGroupSecret) {\n callback(new Channel({\n key: keypair,\n participants: chatId.participants,\n uuid: chatId.uuid,\n myGroupSecret: chatId.myGroupSecret,\n save: false\n }));\n }\n }\n };\n\n publicState().user().get(`chats`).map(handleChannel);\n }\n\n getMyGroupSecret() { // group secret could be deterministic: hash(encryptToSelf(uuid + iterator))\n if (!this.myGroupSecret) {\n this.changeMyGroupSecret();\n }\n return this.myGroupSecret;\n }\n\n async getOurSecretChannelId(pub) {\n if (!this.ourSecretChannelIds[pub]) {\n const secret = await this.getSecret(pub);\n this.ourSecretChannelIds[pub] = await util.getHash(secret + pub);\n }\n return this.ourSecretChannelIds[pub];\n }\n\n async getTheirSecretChannelId(pub) {\n if (!this.theirSecretChannelIds[pub]) {\n const secret = await this.getSecret(pub);\n this.theirSecretChannelIds[pub] = await util.getHash(secret + session.getKey().pub);\n }\n return this.theirSecretChannelIds[pub];\n }\n\n /**\n * Get messages from the channel\n */\n async getMessages(callback) { // TODO: save callback and apply it when new participants are added to channel\n this.getCurrentParticipants().forEach(async pub => {\n if (pub !== session.getKey().pub) {\n // Subscribe to their messages\n let theirSecretChannelId;\n if (this.uuid) {\n theirSecretChannelId = await this.getTheirSecretUuid(pub);\n } else {\n theirSecretChannelId = await this.getTheirSecretChannelId(pub);\n }\n // TODO map().once\n publicState().user(pub).get(`chats`).get(theirSecretChannelId).get(`msgs`).map((data, key) => {this.messageReceived(callback, data, this.uuid || pub, false, key, pub);});\n }\n if (!this.uuid) {\n // Subscribe to our messages\n const ourSecretChannelId = await this.getOurSecretChannelId(pub);\n // TODO map().once\n userState().get(`chats`).get(ourSecretChannelId).get(`msgs`).map((data, key) => {this.messageReceived(callback, data, pub, true, key, session.getKey().pub);});\n }\n });\n if (this.uuid) {\n // Subscribe to our messages\n const mySecretUuid = await this.getMySecretUuid();\n // TODO map().once\n userState().get(`chats`).get(mySecretUuid).get(`msgs`).map((data, key) => {this.messageReceived(callback, data, this.uuid, true, key, session.getKey().pub);});\n }\n }\n\n async messageReceived(callback, data, channelId, selfAuthored, key, from) {\n if (this.messages[key] || !data) {\n return;\n }\n const secret = this.uuid ? (await this.getTheirGroupSecret(from)) : (await this.getSecret(channelId));\n const decrypted = await Key.decrypt(data, secret);\n if (typeof decrypted !== `object`) {\n return;\n }\n const info = {selfAuthored, channelId, from};\n this.messages[key] = decrypted;\n callback(decrypted, info);\n }\n\n /**\n * Get latest message in this channel. Useful for channel listing.\n */\n async getLatestMsg(callback) {\n const callbackIfLatest = async (msg, info) => {\n if (!this.latest) {\n this.latest = msg;\n callback(msg, info);\n } else {\n const t = (typeof this.latest.time === `string` ? this.latest.time : this.latest.time.toISOString());\n if (t < msg.time) {\n this.latest = msg;\n callback(msg, info);\n }\n }\n };\n this.onMy('latestMsg', msg => callbackIfLatest(msg, {selfAuthored: true, from: session.getKey().pub}));\n this.onTheir('latestMsg', (msg, k, from) => callbackIfLatest(msg, {selfAuthored: false, from}));\n }\n\n /**\n * Useful for notifications\n * @param {integer} time last seen msg time (default: now)\n */\n async setMyMsgsLastSeenTime(time?: string) {\n time = time || new Date().toISOString();\n return this.put(`msgsLastSeenTime`, time);\n }\n\n /**\n * Useful for notifications\n */\n async getMyMsgsLastSeenTime(callback) {\n this.onMy(`msgsLastSeenTime`, time => {\n this.myMsgsLastSeenTime = time;\n if (callback) {\n callback(this.myMsgsLastSeenTime);\n }\n });\n }\n\n /**\n * For \"seen\" status indicator\n */\n async getTheirMsgsLastSeenTime(callback) {\n this.onTheir(`msgsLastSeenTime`, time => {\n this.theirMsgsLastSeenTime = time;\n if (callback) {\n callback(this.theirMsgsLastSeenTime);\n }\n });\n }\n\n async removeParticipant(pub) {\n this.addParticipant(pub, true, {read: false, write: false});\n }\n\n /**\n * Add a public key to the channel or update its permissions\n * @param {string} pub\n */\n async addParticipant(pub: string, save = true, permissions?: any, subscribe?: boolean) {\n if (this.uuid) {\n return;\n }\n if (permissions === undefined) {\n permissions = DEFAULT_PERMISSIONS;\n }\n if (this.secrets[pub] && JSON.stringify(this.secrets[pub]) === JSON.stringify(permissions)) { // TODO: should be this.participants[pub]\n return;\n }\n this.secrets[pub] = null;\n this.getSecret(pub);\n const ourSecretChannelId = await this.getOurSecretChannelId(pub);\n if (save) {\n // Save their public key in encrypted format, so in channel listing we know who we are channeling with\n const mySecret = await Key.secret(session.getKey().epub, session.getKey());\n publicState().user().get(`chats`).get(ourSecretChannelId).get(`pub`).put(await Key.encrypt({pub}, mySecret));\n }\n if (this.uuid) {\n this.participants[pub] = permissions;\n if (save) {\n this.putDirect(`S${this.uuid}`, this.getMyGroupSecret());\n this.getMySecretUuid().then(s => {\n this.putDirect(this.uuid, s); // TODO: encrypt keys in put()\n });\n this.onTheirDirect(this.uuid, (s, k, from) => {\n this.theirSecretUuids[from] = s;\n });\n this.onTheirDirect(`S${this.uuid}`, (s, k, from) => {\n this.theirGroupSecrets[from] = s;\n });\n this.save();\n }\n }\n if (subscribe) {\n Object.values(this.directSubscriptions).forEach(arr => {\n arr.forEach(o => {\n if (!o.from || o.from === pub) {\n this._onTheirDirectFromUser(pub, o.key, o.callback);\n }\n });\n });\n Object.values(this.groupSubscriptions).forEach(arr => {\n arr.forEach(o => {\n if (o.from && o.from !== pub) { return; }\n if (permissions.write) {\n this._onTheirGroupFromUser(pub, o.key, o.callback);\n } else { // unsubscribe\n o.event && o.event.off();\n }\n });\n });\n }\n }\n\n /**\n * Send a message to the channel\n * @param msg string or {time, text, ...} object\n */\n async send(msg) {\n if (typeof msg === `string`) {\n msg = msg.trim();\n if (msg.length === 0) {\n return;\n }\n msg = {\n time: (new Date()).toISOString(),\n text: msg\n };\n } else if (typeof msg === `object`) {\n msg.time = msg.time || (new Date()).toISOString();\n } else {\n throw new Error(`msg param must be a string or an object`);\n }\n //publicState().user().get('message').set(temp);\n if (this.uuid) {\n const encrypted = await Key.encrypt(JSON.stringify(msg), this.getMyGroupSecret());\n const mySecretUuid = await this.getMySecretUuid();\n userState().get(`chats`).get(mySecretUuid).get(`msgs`).get(`${msg.time}`).put(encrypted);\n userState().get(`chats`).get(mySecretUuid).get(`latestMsg`).put(encrypted);\n } else {\n const keys = this.getCurrentParticipants();\n for (let i = 0;i < keys.length;i++) {\n const encrypted = await Key.encrypt(JSON.stringify(msg), (await this.getSecret(keys[i])));\n const ourSecretChannelId = await this.getOurSecretChannelId(keys[i]);\n userState().get(`chats`).get(ourSecretChannelId).get(`msgs`).get(`${msg.time}`).put(encrypted);\n userState().get(`chats`).get(ourSecretChannelId).get(`latestMsg`).put(encrypted);\n }\n }\n }\n\n /**\n * Save the channel to our channels list without sending a message\n */\n async save() {\n if (this.uuid) {\n const mySecretUuid = await this.getMySecretUuid();\n userState().get(`chats`).get(mySecretUuid).get('msgs').get('a').put(null);\n this.put(`participants`, this.participants); // public participants list\n const mySecret = await Key.secret(session.getKey().epub, session.getKey());\n userState().get(`chats`).get(mySecretUuid).get(`pub`).put(await Key.encrypt({\n uuid: this.uuid,\n myGroupSecret: this.getMyGroupSecret(),\n participants: this.participants // private participants list\n }, mySecret));\n this.participantsChanged();\n } else {\n const keys = this.getCurrentParticipants();\n for (let i = 0;i < keys.length;i++) {\n const ourSecretChannelId = await this.getOurSecretChannelId(keys[i]);\n userState().get(`chats`).get(ourSecretChannelId).get('msgs').get('a').put(null);\n }\n }\n }\n\n /**\n * Save a key-value pair, encrypt value. Each participant in the Channel writes to their own version of the key-value pair — they don't overwrite the same one.\n * @param {string} key\n * @param value\n */\n async put(key, value) {\n return (this.uuid ? this.putGroup : this.putDirect).call(this, key, value);\n }\n\n async putGroup(key, value) {\n if (key === `msgs`) { throw new Error(`Sorry, you can't overwrite the msgs field which is used for .send()`); }\n const encrypted = await Key.encrypt(JSON.stringify(value), this.getMyGroupSecret());\n const mySecretUuid = await this.getMySecretUuid();\n userState().get(`chats`).get(mySecretUuid).get(key).put(encrypted);\n }\n\n async putDirect(key, value) {\n if (key === `msgs`) { throw new Error(`Sorry, you can't overwrite the msgs field which is used for .send()`); }\n const keys = this.getCurrentParticipants();\n for (let i = 0;i < keys.length;i++) {\n const encrypted = await Key.encrypt(JSON.stringify(value), (await this.getSecret(keys[i])));\n const ourSecretChannelId = await this.getOurSecretChannelId(keys[i]);\n userState().get(`chats`).get(ourSecretChannelId).get(key).put(encrypted);\n }\n }\n\n /**\n * Subscribe to a key-value pair. Callback returns every participant's value unless you limit it with *from* param.\n * @param {string} key\n * @param {function} callback\n * @param {string} from public key whose value you want, or *\"me\"* for your value only, or *\"them\"* for the value of others only\n */\n async on(key: string, callback: Function, from?: string) {\n return (this.uuid ? this.onGroup : this.onDirect).call(this, key, callback, from);\n }\n\n async onDirect(key: string, callback: Function, from?: string) {\n if (!from || from === `me` || from === session.getKey().pub) {\n this.onMy(key, (val: any) => callback(val, session.getKey().pub));\n }\n if (!from || (from !== `me` && from !== session.getKey().pub)) {\n this.onTheir(key, (val: any, k: string, pub: string) => callback(val, pub));\n }\n }\n\n async onGroup(key: string, callback: Function, from?: string) {\n if (!from || from === `me` || from === session.getKey().pub) {\n this.onMyGroup(key, val => callback(val, session.getKey().pub));\n }\n if (!from || (from !== `me` && from !== session.getKey().pub)) {\n this.onTheirGroup(key, (val, k, pub) => callback(val, pub));\n }\n }\n\n async onMy(key: string, callback: Function) {\n return (this.uuid ? this.onMyGroup : this.onMyDirect).call(this, key, callback);\n }\n\n async onMyDirect(key: string, callback: Function) {\n if (typeof callback !== 'function') {\n throw new Error(`onMy callback must be a function, got ${typeof callback}`);\n }\n const keys = this.getCurrentParticipants();\n for (let i = 0;i < keys.length;i++) {\n const ourSecretChannelId = await this.getOurSecretChannelId(keys[i]);\n publicState().user().get(`chats`).get(ourSecretChannelId).get(key).on(async (data: any) => {\n const decrypted = await Key.decrypt(data, (await this.getSecret(keys[i])));\n if (decrypted) {\n callback(typeof decrypted.v !== `undefined` ? decrypted.v : decrypted, key);\n }\n });\n break;\n }\n }\n\n async onMyGroup(key, callback) {\n if (typeof callback !== 'function') {\n throw new Error(`onMy callback must be a function, got ${typeof callback}`);\n }\n const mySecretUuid = await this.getMySecretUuid();\n const mySecret = await this.getMyGroupSecret();\n publicState().user().get(`chats`).get(mySecretUuid).get(key).on(async data => {\n const decrypted = await Key.decrypt(data, mySecret);\n if (decrypted) {\n callback(typeof decrypted.v !== `undefined` ? decrypted.v : decrypted, key, session.getKey().pub);\n }\n });\n }\n\n async onTheir(key: string, callback: Function, from: string) {\n return (this.uuid ? this.onTheirGroup : this.onTheirDirect).call(this, key, callback, from);\n }\n\n async _onTheirDirectFromUser(key: string, callback: Function, pub: string) {\n if (!this.hasWritePermission(pub)) { return; }\n const theirSecretChannelId = await this.getTheirSecretChannelId(pub);\n publicState().user(pub).get(`chats`).get(theirSecretChannelId).get(key).on(async (data: any) => {\n if (!this.hasWritePermission(pub)) { return; }\n const decrypted = await Key.decrypt(data, (await this.getSecret(pub)));\n if (decrypted) {\n callback(typeof decrypted.v !== `undefined` ? decrypted.v : decrypted, key, pub);\n }\n });\n }\n\n async onTheirDirect(key: string, callback: Function, from: string) { // TODO: subscribe to new channel participants\n if (typeof callback !== 'function') {\n throw new Error(`onTheir callback must be a function, got ${typeof callback}`);\n }\n if (!Object.prototype.hasOwnProperty.call(this.directSubscriptions, key)) {\n this.directSubscriptions[key] = [];\n }\n this.directSubscriptions[key].push({key, callback, from});\n const participants = this.getCurrentParticipants();\n participants.forEach(async pub => {\n if (from && pub !== from) { return; }\n this._onTheirDirectFromUser(pub, key, callback);\n });\n }\n\n hasWritePermission(pub) {\n return !this.uuid || (this.participants && this.participants[pub] && this.participants[pub].write);\n }\n\n async _onTheirGroupFromUser(pub: string, key: string, callback: Function, subscription: any) {\n if (!this.hasWritePermission(pub)) { return; }\n const theirSecretUuid = await this.getTheirSecretUuid(pub);\n publicState().user(pub).get(`chats`).get(theirSecretUuid).get(key).on(async (data: any, _a: any, _b: any, e: Event) => {\n if (subscription) { subscription.event = e; }\n if (!this.hasWritePermission(pub)) { return; }\n const decrypted = await Key.decrypt(data, (await this.getTheirGroupSecret(pub)));\n if (decrypted) {\n callback(typeof decrypted.v !== `undefined` ? decrypted.v : decrypted, key, pub);\n }\n });\n }\n\n async onTheirGroup(key, callback, from) {\n if (typeof callback !== 'function') {\n throw new Error(`onTheir callback must be a function, got ${typeof callback}`);\n }\n if (!Object.prototype.hasOwnProperty.call(this.groupSubscriptions, key)) {\n this.groupSubscriptions[key] = [];\n }\n const subscription = {key, callback, from};\n this.groupSubscriptions[key].push(subscription);\n\n this.getParticipants(participants => {\n Object.keys(participants).forEach(async pub => {\n if (from && pub !== from) { return; }\n if (!(participants[pub] && participants[pub].write)) { return; }\n this._onTheirGroupFromUser(pub, key, callback, subscription);\n });\n });\n }\n\n /**\n * Set typing status\n */\n setTyping(isTyping, timeout = 5) {\n isTyping = typeof isTyping === `undefined` ? true : isTyping;\n timeout = timeout * 1000;\n this.put(`typing`, isTyping ? new Date().toISOString() : new Date(0).toISOString());\n clearTimeout(this.setTypingTimeout);\n this.setTypingTimeout = setTimeout(() => this.put(`typing`, false), timeout);\n }\n\n /**\n * Get typing status\n */\n getTyping(callback, timeout = 5) { // TODO callback not called on setTyping(false), at least for self chat\n timeout = timeout * 1000;\n this.onTheir(`typing`, (typing, key, pub) => {\n if (callback) {\n const isTyping = typing && new Date() - new Date(typing) <= timeout;\n callback(isTyping, pub);\n this.getTypingTimeouts = this.getTypingTimeouts || {};\n clearTimeout(this.getTypingTimeouts[pub]);\n if (isTyping) {\n this.getTypingTimeouts[pub] = setTimeout(() => callback(false, pub), timeout);\n }\n }\n });\n }\n\n /**\n * Get a simple link that points to the channel.\n *\n * Direct channel: both users need to give their simple links. Use createChatLink() to get a two-way link that needs to be given by one user only.\n *\n * Group channel: Works only if the link recipient has been already added onto the channel participants list.\n */\n getSimpleLink(urlRoot = 'https://iris.to/') {\n if (this.uuid) {\n return `${urlRoot}?channelId=${this.uuid}&inviter=${session.getKey().pub}`;\n }\n return `${urlRoot}?chatWith=${this.getCurrentParticipants()[0]}`;\n }\n\n /**\n *\n */\n async getChatLinks(opts: any = {}) {\n let {callback, urlRoot, subscribe} = opts;\n urlRoot = urlRoot || 'https://iris.to/';\n if (!this.uuid) { throw new Error('Only group channels may have chat links'); }\n const chatLinks: any[] = [];\n const chatLinkSubscriptions = {};\n this.on('chatLinks', (links: any, from: string) => {\n // TODO: check admin permissions\n if (!links || typeof links !== 'object') { return; }\n Object.keys(links).forEach(linkId => {\n const link = links[linkId];\n if (link === null) {\n chatLinkSubscriptions[linkId] && chatLinkSubscriptions[linkId].off(); // unsubscribe removed chat link\n delete chatLinkSubscriptions[linkId];\n callback && callback({id: linkId, url: null});\n return;\n }\n if (chatLinks.indexOf(linkId) !== -1) { return; }\n const channels = [];\n chatLinks.push(linkId);\n const url = Channel.formatChatLink({urlRoot, inviter: from, channelId: this.uuid, sharedSecret: link.sharedSecret, linkId});\n callback && callback({url, id: linkId});\n if (subscribe) {\n publicState().user(link.sharedKey.pub).get('chatRequests').map(async (encPub, requestId, a, e) => {\n if (!encPub || typeof encPub !== 'string' || encPub.length < 10) { return; }\n chatLinkSubscriptions[linkId] = e;\n const s = JSON.stringify(encPub);\n if (channels.indexOf(s) === -1) {\n channels.push(s);\n const pub = await Key.decrypt(encPub, link.sharedSecret);\n this.addParticipant(pub, undefined, undefined, true);\n }\n });\n }\n });\n });\n }\n\n async createChatLink(urlRoot = 'https://iris.to/') {\n const sharedKey = await Key.generate();\n const sharedKeyString = JSON.stringify(sharedKey);\n const sharedSecret = await Key.secret(sharedKey.epub, sharedKey);\n const encryptedSharedKey = await Key.encrypt(sharedKeyString, sharedSecret);\n const ownerSecret = await Key.secret(session.getKey().epub, session.getKey());\n const ownerEncryptedSharedKey = await Key.encrypt(sharedKeyString, ownerSecret);\n let linkId = await util.getHash(encryptedSharedKey);\n linkId = linkId.slice(0, 12);\n\n // User has to exist, in order for .get(chatRequests).on() to be ever triggered\n publicState(sharedKey).get('chatRequests').put({a: 1});\n\n this.chatLinks[linkId] = {sharedKey, sharedSecret};\n this.put('chatLinks', this.chatLinks);\n userState().get('chatLinks').get(linkId).put({encryptedSharedKey, ownerEncryptedSharedKey});\n\n return Channel.formatChatLink({urlRoot, channelId: this.uuid, inviter: session.getKey().pub, sharedSecret, linkId});\n }\n\n /**\n * Set the user's online/active status\n * @param {string} activity string: set the activity status every 3 seconds, null/false: stop updating\n */\n static setActivity(activity) {\n if (publicState().irisActivityStatus === activity) { return; }\n publicState().irisActivityStatus = activity;\n clearTimeout(publicState().setActivityTimeout);\n const update = () => {\n publicState().user().get(`activity`).put({status: activity, time: new Date().toISOString()});\n };\n update();\n function timerUpdate() {\n update();\n publicState().setActivityTimeout = setTimeout(timerUpdate, 3000);\n }\n if (activity) {\n timerUpdate();\n }\n }\n\n /**\n * Get the online status of a user.\n *\n * @param {string} pubKey public key of the user\n * @param {boolean} callback receives a boolean each time the user's online status changes\n */\n static getActivity(pubKey, callback) {\n let timeout;\n publicState().user(pubKey).get(`activity`).on(activity => {\n if (!activity || !(activity.time && activity.status)) { return; }\n clearTimeout(timeout);\n const now = new Date();\n const activityDate = new Date(activity.time);\n const isActive = activityDate > new Date(now.getTime() - 10 * 1000) && activityDate < new Date(now.getTime() + 30 * 1000);\n callback({isActive, lastActive: activity.time, status: activity.status});\n if (isActive) {\n timeout = setTimeout(() => callback({isOnline: false, lastActive: activity.time}), 10000);\n }\n });\n }\n\n static formatChatLink({urlRoot, chatWith, channelId, inviter, sharedSecret, linkId}) {\n const enc = encodeURIComponent;\n if (channelId && inviter) {\n return `${urlRoot}?channelId=${enc(channelId)}&inviter=${enc(inviter)}&s=${enc(sharedSecret)}&k=${enc(linkId)}`;\n }\n return `${urlRoot}?chatWith=${enc(chatWith)}&s=${enc(sharedSecret)}&k=${enc(linkId)}`;\n }\n\n /**\n * Creates a channel link that can be used for two-way communication, i.e. only one link needs to be exchanged.\n */\n static async createChatLink(urlRoot = 'https://iris.to/') {\n const user = publicState().user();\n const key = session.getKey();\n\n // We create a new Gun user whose private key is shared with the chat link recipients.\n // Chat link recipients can contact you by writing their public key to the shared key's user space.\n const sharedKey = await Key.generate();\n const sharedKeyString = JSON.stringify(sharedKey);\n const sharedSecret = await Key.secret(sharedKey.epub, sharedKey);\n const encryptedSharedKey = await Key.encrypt(sharedKeyString, sharedSecret);\n const ownerSecret = await Key.secret(key.epub, key);\n const ownerEncryptedSharedKey = await Key.encrypt(sharedKeyString, ownerSecret);\n let linkId = await util.getHash(encryptedSharedKey);\n linkId = linkId.slice(0, 12);\n\n // User has to exist, in order for .get(chatRequests).on() to be ever triggered\n publicState(sharedKey).get('chatRequests').put({a: 1}).get('chatRequests').put({a: 1});\n\n user.get('chatLinks').get(linkId).put({encryptedSharedKey, ownerEncryptedSharedKey});\n\n return Channel.formatChatLink({urlRoot, chatWith: key.pub, sharedSecret, linkId});\n }\n\n /**\n *\n */\n static async getMyChatLinks(urlRoot = 'https://iris.to/', callback: Function, subscribe = false) {\n const key = session.getKey();\n const user = publicState().user();\n const mySecret = await Key.secret(key.epub, key);\n const chatLinks = [];\n user.get('chatLinks').map((data, linkId) => {\n if (!data || chatLinks.indexOf(linkId) !== -1) { return; }\n const channels = [];\n user.get('chatLinks').get(linkId).get('ownerEncryptedSharedKey').on(async enc => {\n if (!enc || chatLinks.indexOf(linkId) !== -1) { return; }\n chatLinks.push(linkId);\n const sharedKey = await Key.decrypt(enc, mySecret);\n const sharedSecret = await Key.secret(sharedKey.epub, sharedKey);\n const url = Channel.formatChatLink({urlRoot, chatWith: key.pub, sharedSecret, linkId});\n if (callback) {\n callback({url, id: linkId});\n }\n if (subscribe) {\n publicState().user(sharedKey.pub).get('chatRequests').map(async (encPub, requestId) => {\n if (!encPub) { return; }\n const s = JSON.stringify(encPub);\n if (channels.indexOf(s) === -1) {\n channels.push(s);\n const pub = await Key.decrypt(encPub, sharedSecret);\n const channel = new Channel({key, participants: pub});\n channel.save();\n }\n publicState(sharedKey).get('chatRequests').get(requestId).put(null);\n });\n }\n });\n });\n }\n\n /**\n *\n */\n removeGroupChatLink(linkId) {\n this.chatLinks[linkId] = null;\n this.put('chatLinks', this.chatLinks);\n publicState().user().get('chatLinks').get(linkId).put(null);\n }\n\n /**\n *\n */\n static removePrivateChatLink(key, linkId) {\n publicState().user().auth(key);\n publicState().user().get('chatLinks').get(linkId).put(null);\n }\n\n /**\n *\n */\n static async deleteChannel(key, pub) {\n publicState().user().auth(key);\n const channelId = await Channel.getOurSecretChannelId(pub, key);\n publicState().user().get('channels').get(channelId).put(null);\n publicState().user().get('channels').get(channelId).off();\n }\n\n /**\n *\n */\n static async deleteGroup(key, uuid) {\n const mySecret = await Key.secret(key.epub, key);\n const mySecretHash = await util.getHash(mySecret);\n const mySecretUuid = await util.getHash(mySecretHash + uuid);\n publicState().user().auth(key);\n publicState().user().get('channels').get(mySecretUuid).put(null);\n publicState().user().get('channels').get(mySecretUuid).off();\n }\n}\n\nexport default Channel;\n","import Channel from './Channel';\nimport session from './session';\n\nconst channels = new Map();\n\n/**\n * Private channel that only you and publicKey can read/write.\n * @param publicKey\n * @returns {Channel}\n */\nexport default function(publicKey = session.getKey(), chatLink?: string): Channel {\n let channel = channels.get(publicKey);\n if (!channel) {\n channel = new Channel({participants: publicKey, chatLink})\n channels.set(publicKey, channel);\n }\n return channel;\n}","import Node from './db/Node';\n\nlet local: Node;\n\n/**\n * Get a state that is only synced in memory and local storage.\n *\n * Useful for storing things like UI state, local indexes or logged in user.\n * @returns {Node}\n */\nexport default function() {\n if (!local) {\n local = new Node('local');\n }\n return local;\n}","import local from './local';\n\nlet blockedUsers: { [key: string]: boolean } = {};\n\nexport default function() {\n if (!blockedUsers) {\n blockedUsers = {};\n local().get('block').map((isBlocked: boolean, user: string) => {\n if (isBlocked === blockedUsers[user]) { return; }\n if (isBlocked) {\n blockedUsers[user] = isBlocked;\n local().get('groups').map((_v: any, k: string) => {\n local().get('groups').get(k).get(user).put(false);\n });\n } else {\n delete blockedUsers[user];\n }\n });\n }\n return blockedUsers;\n}","import local from \"./local\";\nimport userSpace from './public';\nimport blockedUsers from './blockedUsers';\n\nlet counter = 0;\nconst cache = new Map>();\nconst callbacks = new Map();\n\ntype Event = {\n off: () => void;\n}\n\n/**\n * Aggregates public data from all users in the group.\n *\n * For example, the public message feed, message replies and likes are aggregated using this.\n * @param groupName\n * @returns object\n */\nexport default function(groupName = 'everyone') {\n return {\n get(path: string, callback: any) {\n const groupNode = local().get('groups').get(groupName);\n const follows: { [key: string]: boolean; } = {};\n requestAnimationFrame(() => {\n groupNode.map((isFollowing: any, user: string) => {\n if (blockedUsers()[user]) { return; } // TODO: allow to specifically query blocked users?\n if (follows[user] && follows[user] === isFollowing) { return; }\n follows[user] = isFollowing;\n if (isFollowing) { // TODO: callback on unfollow, for unsubscribe\n let node = userSpace(user);\n if (path && path !== '/') {\n node = path.split('/').reduce((sum:any, s:string) => sum.get(decodeURIComponent(s)), node);\n }\n callback(node, user);\n }\n });\n });\n },\n\n _cached_map(cached: Map | undefined, cacheKey: string, path: string, myEvent: Event, callback: Function) {\n if (!cached) {\n const cached = new Map();\n cache.set(cacheKey, cached);\n this.get(path, (node: any, from: string) => node.map((value: any, key: string, x: any) => {\n const item = {value, key, from};\n cached.set(key, item);\n for (let cb of callbacks.get(cacheKey).values()) {\n cb(value, key, x, myEvent, from);\n }\n }));\n } else {\n for (let item of cached.values()) {\n callback(item.value, item.key, 0, myEvent, item.from);\n }\n }\n },\n\n // TODO: this should probably store just the most recent value, not everyone's value\n // TODO: for counting of likes etc, use this.count() instead\n _cached_on(cached: Map | undefined, cacheKey: string, path: string, myEvent: Event, callback: Function) {\n if (!cached) {\n const cached = new Map();\n cache.set(cacheKey, cached);\n this.get(path, (node: any, from: string) => node.on((value: any, key: string, x: any) => {\n const item = {value, key, from};\n cached.set(from, item);\n for (let cb of callbacks.get(cacheKey).values()) {\n cb(value, key, x, myEvent, from);\n }\n }));\n } else {\n for (let item of cached.values()) {\n callback(item.value, item.key, 0, myEvent, item.from);\n }\n }\n },\n\n _cached_count(cached: Map | undefined, cacheKey: string, path: string, myEvent: Event, callback: Function) {\n if (!cached) {\n const cached = new Map();\n cache.set(cacheKey, cached);\n this.get(path, (node: any, from: string) => node.on((value: any, key: string) => {\n value ? cached.set(from, true) : cached.delete(from);\n const count = cached.size;\n for (let cb of callbacks.get(cacheKey).values()) {\n cb(count, key, null, myEvent, from);\n }\n }));\n } else {\n callback(cached.size, path.split('/').pop(), null, myEvent);\n }\n },\n\n _cached_fn(fn: string, path: string, callback: Function) {\n const cacheKey = `${fn}:${groupName}:${path}`;\n\n let callbackId = counter++;\n if (callbacks.has(cacheKey)) {\n callbacks.get(cacheKey).set(callbackId, callback);\n } else {\n callbacks.set(cacheKey, new Map([[callbackId, callback]]));\n }\n\n const myEvent = {off: () => {\n let myCallbacks = callbacks.get(cacheKey);\n myCallbacks && myCallbacks.delete(callbackId);\n }};\n\n const cached = cache.get(cacheKey);\n\n switch (fn) {\n case 'map':\n this._cached_map(cached, cacheKey, path, myEvent, callback);\n break;\n case 'on':\n this._cached_on(cached, cacheKey, path, myEvent, callback);\n break;\n case 'count':\n this._cached_count(cached, cacheKey, path, myEvent, callback);\n break;\n }\n },\n\n map(path: string, callback: Function) { // group queries are slow, so we cache them\n this._cached_fn('map', path, callback);\n },\n\n on(path: string, callback: Function) {\n this._cached_fn('on', path, callback);\n },\n\n count(path: string, callback: Function) {\n this._cached_fn('count', path, callback);\n }\n }\n}","// @ts-nocheck\n\nimport _ from './lodash';\nimport session from './session';\nimport util from './util';\nimport publicState from './global';\nimport privateState from './private';\nimport local from './local';\nimport group from './group';\nimport Key from './Key';\n\nconst NOTIFICATION_SERVICE_URL = 'https://iris-notifications.herokuapp.com/notify';\n// const notificationSound = new Audio('../../assets/audio/notification.mp3'); // TODO\nlet loginTime;\nlet unseenMsgsTotal = 0;\nlet unseenNotificationCount = 0;\nconst webPushSubscriptions = {};\n\nfunction desktopNotificationsEnabled() {\n return window.Notification && Notification.permission === 'granted';\n}\n\nfunction notifyMsg(msg, info, channelId, onClick) {\n function shouldNotify() {\n if (msg.timeObj < loginTime) { return false; }\n if (info.selfAuthored) { return false; }\n if (document.visibilityState === 'visible') { return false; }\n const channel = privateState(channelId);\n if (channel.notificationSetting === 'nothing') { return false; }\n if (channel.notificationSetting === 'mentions' && !msg.text.includes(session.getMyName())) { return false; }\n return true;\n }\n function shouldDesktopNotify() {\n if (!desktopNotificationsEnabled()) { return false; }\n return shouldNotify();\n }\n function shouldAudioNotify() {\n return shouldNotify();\n }\n if (shouldAudioNotify()) {\n //notificationSound.play(); // TODO\n }\n if (shouldDesktopNotify()) {\n let body, title;\n const channel = privateState(channelId);\n if (channel.uuid) {\n title = channel.participantProfiles[info.from].name;\n body = `${name}: ${msg.text}`;\n } else {\n title = 'Message'\n body = msg.text;\n }\n body = util.truncateString(body, 50);\n let desktopNotification = new Notification(title, { // TODO: replace with actual name\n icon: '/assets/img/icon128.png',\n body,\n silent: true\n });\n desktopNotification.onclick = function() {\n changeUnseenNotificationCount(-1);\n onClick && onClick();\n window.focus();\n };\n }\n}\n\nfunction changeChatUnseenMsgsCount(chatId, change) {\n const chat = privateState(chatId);\n if (!chat) return;\n const chatNode = local().get('channels').get(chatId);\n if (change) {\n unseenMsgsTotal += change;\n chat.unseen += change;\n } else {\n unseenMsgsTotal = unseenMsgsTotal - (chat.unseen || 0);\n chat.unseen = 0;\n }\n chatNode.get('unseen').put(chat.unseen);\n unseenMsgsTotal = unseenMsgsTotal >= 0 ? unseenMsgsTotal : 0;\n local().get('unseenMsgsTotal').put(unseenMsgsTotal);\n}\n\nconst publicVapidKey = 'BMqSvZArOIdn7vGkYplSpkZ70-Qt8nhYbey26WVa3LF3SwzblSzm3n3HHycpNkAKVq7MCkrzFuTFs_en7Y_J2MI';\n\nfunction urlBase64ToUint8Array(base64String) {\n const padding = '='.repeat((4 - base64String.length % 4) % 4);\n const base64 = (base64String + padding)\n .replace(/-/g, '+')\n .replace(/_/g, '/');\n\n const rawData = window.atob(base64);\n const outputArray = new Uint8Array(rawData.length);\n\n for (let i = 0; i < rawData.length; ++i) {\n outputArray[i] = rawData.charCodeAt(i);\n }\n return outputArray;\n}\n\nasync function subscribe(reg) {\n try {\n const subscription = await reg.pushManager.subscribe({\n userVisibleOnly: true,\n applicationServerKey: urlBase64ToUint8Array(publicVapidKey)\n });\n addWebPushSubscription(subscription);\n } catch (e) {\n console.error('web push subscription error', e);\n }\n}\n\nasync function subscribeToWebPush() {\n console.log('subscribing to web push', navigator.serviceWorker);\n if (!desktopNotificationsEnabled() || !navigator.serviceWorker) { return false; }\n await navigator.serviceWorker.ready;\n const reg = await navigator.serviceWorker.getRegistration();\n reg.active.postMessage({key: session.getKey()});\n const sub = await reg.pushManager.getSubscription();\n sub ? addWebPushSubscription(sub) : subscribe(reg);\n}\n\nconst addWebPushSubscriptionsToChats = _.debounce(() => {\n const arr = Object.values(webPushSubscriptions);\n session.channelIds.forEach(channelId => {\n privateState(channelId).put('webPushSubscriptions', arr);\n });\n}, 5000);\n\nfunction removeSubscription(hash) {\n delete webPushSubscriptions[hash];\n publicState().user().get('webPushSubscriptions').get(hash).put(null);\n addWebPushSubscriptionsToChats();\n}\n\nasync function addWebPushSubscription(s, saveToGun = true) {\n const myKey = session.getKey();\n const mySecret = await Key.secret(myKey.epub, myKey);\n const enc = await Key.encrypt(s, mySecret);\n const hash = await util.getHash(JSON.stringify(s));\n if (saveToGun) {\n publicState().user().get('webPushSubscriptions').get(hash).put(enc);\n }\n webPushSubscriptions[hash] = s;\n addWebPushSubscriptionsToChats();\n}\n\nasync function getWebPushSubscriptions() {\n const myKey = session.getKey();\n const mySecret = await Key.secret(myKey.epub, myKey);\n publicState().user().get('webPushSubscriptions').map(async enc => {\n if (!enc) { return; }\n const s = await Key.decrypt(enc, mySecret);\n addWebPushSubscription(s, false);\n });\n}\n\nfunction getEpub(user) {\n return new Promise(resolve => {\n publicState().user(user).get('epub').on(async (epub,k,x,e) => {\n if (epub) {\n e.off();\n resolve(epub);\n }\n });\n });\n}\n\nasync function getNotificationText(notification) {\n const profile = await publicState().user(notification.from).get('profile').once();\n const name = (profile && profile.name) || 'someone';\n const event = notification.event || notification.action;\n let eventText;\n if (event === 'like') eventText = `${name} liked your post`;\n else if (event === 'reply') eventText = `${name} replied to your post`;\n else if (event === 'mention') eventText = `${name} mentioned you in their post`;\n else if (event === 'follow') eventText = `${name} started following you`;\n else eventText = `${name} sent you a notification: ${event}`;\n return eventText;\n}\n\nfunction subscribeToIrisNotifications(onClick?: Function) {\n let notificationsSeenTime: any;\n let notificationsShownTime: any;\n publicState().user().get('notificationsSeenTime').on(v => {\n notificationsSeenTime = v;\n console.log(v);\n });\n publicState().user().get('notificationsShownTime').on(v => notificationsShownTime = v);\n const setNotificationsShownTime = _.debounce(() => {\n publicState().user().get('notificationsShownTime').put(new Date().toISOString());\n }, 1000);\n const alreadyHave = new Set();\n group().on(`notifications/${session.getPubKey()}`, async (encryptedNotification, k, x, e, from) => {\n const id = from.slice(0,30) + encryptedNotification.slice(0,30);\n if (alreadyHave.has(id)) { return; }\n alreadyHave.add(id);\n const epub = await getEpub(from);\n const secret = await Key.secret(epub, session.getKey());\n const notification = await Key.decrypt(encryptedNotification, secret);\n if (!notification || typeof notification !== 'object') { return; }\n setNotificationsShownTime();\n notification.from = from;\n local().get('notifications').get(notification.time).put(notification);\n if (!notificationsSeenTime || (notificationsSeenTime < notification.time)) {\n changeUnseenNotificationCount(1);\n }\n if (!notificationsShownTime || notificationsShownTime < notification.time) {\n console.log('was new!');\n const text = await getNotificationText(notification);\n let desktopNotification = new Notification(text, {\n icon: '/assets/img/icon128.png',\n body: text,\n silent: true\n });\n desktopNotification.onclick = function() {\n const link = notification.target ? `/post/${notification.target}` : `/profile/${notification.from}`;\n onClick && onClick(link);\n changeUnseenNotificationCount(-1);\n window.focus();\n };\n }\n });\n}\n\nfunction changeUnseenNotificationCount(change) {\n if (!change) {\n unseenNotificationCount = 0;\n publicState().user().get('notificationsSeenTime').put(new Date().toISOString());\n } else {\n unseenNotificationCount += change;\n unseenNotificationCount = Math.max(unseenNotificationCount, 0);\n }\n local().get('unseenNotificationCount').put(unseenNotificationCount);\n}\n\nasync function sendIrisNotification(recipient, notification) {\n if (!(recipient && notification)) { return; } // TODO: use typescript or sth :D\n if (typeof notification === 'object') { notification.time = new Date().toISOString() }\n const epub = await getEpub(recipient);\n const secret = await Key.secret(epub, session.getKey());\n const enc = await Key.encrypt(notification, secret);\n publicState().user().get('notifications').get(recipient).put(enc);\n}\n\nasync function sendWebPushNotification(recipient, notification) {\n console.log('sending web push notification to', recipient, notification);\n const channel = privateState(recipient);\n const myKey = session.getKey();\n const shouldWebPush = (recipient === myKey.pub) || !(channel.activity && channel.activity.isActive);\n if (shouldWebPush && channel.webPushSubscriptions) {\n const subscriptions = [];\n const participants = Object.keys(channel.webPushSubscriptions);\n for (let i = 0; i < participants.length; i++) {\n const participant = participants[i];\n const secret = await channel.getSecret(participant);\n const payload = {\n title: await Key.encrypt(notification.title, secret),\n body: await Key.encrypt(notification.body, secret),\n from:{pub: myKey.pub, epub: myKey.epub}\n };\n channel.webPushSubscriptions[participant].forEach(s => {\n if (s && s.endpoint) {\n subscriptions.push({subscription: s, payload});\n }\n });\n }\n if (subscriptions.length === 0) {return;}\n fetch(NOTIFICATION_SERVICE_URL, {\n method: 'POST',\n body: JSON.stringify({subscriptions}),\n headers: {\n 'content-type': 'application/json'\n }\n }).catch(() => {});\n }\n}\n\nfunction init() {\n loginTime = new Date();\n unseenMsgsTotal = 0;\n}\n\nexport default {init, notifyMsg, getNotificationText, sendWebPushNotification, changeUnseenNotificationCount, subscribeToIrisNotifications, sendIrisNotification, changeChatUnseenCount: changeChatUnseenMsgsCount, webPushSubscriptions, subscribeToWebPush, getWebPushSubscriptions, removeSubscription};\n","/**\n * Fuse.js v6.6.2 - Lightweight fuzzy-search (http://fusejs.io)\n *\n * Copyright (c) 2022 Kiro Risk (http://kiro.me)\n * All Rights Reserved. Apache Software License 2.0\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nfunction isArray(value) {\n return !Array.isArray\n ? getTag(value) === '[object Array]'\n : Array.isArray(value)\n}\n\n// Adapted from: https://github.com/lodash/lodash/blob/master/.internal/baseToString.js\nconst INFINITY = 1 / 0;\nfunction baseToString(value) {\n // Exit early for strings to avoid a performance hit in some environments.\n if (typeof value == 'string') {\n return value\n }\n let result = value + '';\n return result == '0' && 1 / value == -INFINITY ? '-0' : result\n}\n\nfunction toString(value) {\n return value == null ? '' : baseToString(value)\n}\n\nfunction isString(value) {\n return typeof value === 'string'\n}\n\nfunction isNumber(value) {\n return typeof value === 'number'\n}\n\n// Adapted from: https://github.com/lodash/lodash/blob/master/isBoolean.js\nfunction isBoolean(value) {\n return (\n value === true ||\n value === false ||\n (isObjectLike(value) && getTag(value) == '[object Boolean]')\n )\n}\n\nfunction isObject(value) {\n return typeof value === 'object'\n}\n\n// Checks if `value` is object-like.\nfunction isObjectLike(value) {\n return isObject(value) && value !== null\n}\n\nfunction isDefined(value) {\n return value !== undefined && value !== null\n}\n\nfunction isBlank(value) {\n return !value.trim().length\n}\n\n// Gets the `toStringTag` of `value`.\n// Adapted from: https://github.com/lodash/lodash/blob/master/.internal/getTag.js\nfunction getTag(value) {\n return value == null\n ? value === undefined\n ? '[object Undefined]'\n : '[object Null]'\n : Object.prototype.toString.call(value)\n}\n\nconst EXTENDED_SEARCH_UNAVAILABLE = 'Extended search is not available';\n\nconst INCORRECT_INDEX_TYPE = \"Incorrect 'index' type\";\n\nconst LOGICAL_SEARCH_INVALID_QUERY_FOR_KEY = (key) =>\n `Invalid value for key ${key}`;\n\nconst PATTERN_LENGTH_TOO_LARGE = (max) =>\n `Pattern length exceeds max of ${max}.`;\n\nconst MISSING_KEY_PROPERTY = (name) => `Missing ${name} property in key`;\n\nconst INVALID_KEY_WEIGHT_VALUE = (key) =>\n `Property 'weight' in key '${key}' must be a positive integer`;\n\nconst hasOwn = Object.prototype.hasOwnProperty;\n\nclass KeyStore {\n constructor(keys) {\n this._keys = [];\n this._keyMap = {};\n\n let totalWeight = 0;\n\n keys.forEach((key) => {\n let obj = createKey(key);\n\n totalWeight += obj.weight;\n\n this._keys.push(obj);\n this._keyMap[obj.id] = obj;\n\n totalWeight += obj.weight;\n });\n\n // Normalize weights so that their sum is equal to 1\n this._keys.forEach((key) => {\n key.weight /= totalWeight;\n });\n }\n get(keyId) {\n return this._keyMap[keyId]\n }\n keys() {\n return this._keys\n }\n toJSON() {\n return JSON.stringify(this._keys)\n }\n}\n\nfunction createKey(key) {\n let path = null;\n let id = null;\n let src = null;\n let weight = 1;\n let getFn = null;\n\n if (isString(key) || isArray(key)) {\n src = key;\n path = createKeyPath(key);\n id = createKeyId(key);\n } else {\n if (!hasOwn.call(key, 'name')) {\n throw new Error(MISSING_KEY_PROPERTY('name'))\n }\n\n const name = key.name;\n src = name;\n\n if (hasOwn.call(key, 'weight')) {\n weight = key.weight;\n\n if (weight <= 0) {\n throw new Error(INVALID_KEY_WEIGHT_VALUE(name))\n }\n }\n\n path = createKeyPath(name);\n id = createKeyId(name);\n getFn = key.getFn;\n }\n\n return { path, id, weight, src, getFn }\n}\n\nfunction createKeyPath(key) {\n return isArray(key) ? key : key.split('.')\n}\n\nfunction createKeyId(key) {\n return isArray(key) ? key.join('.') : key\n}\n\nfunction get(obj, path) {\n let list = [];\n let arr = false;\n\n const deepGet = (obj, path, index) => {\n if (!isDefined(obj)) {\n return\n }\n if (!path[index]) {\n // If there's no path left, we've arrived at the object we care about.\n list.push(obj);\n } else {\n let key = path[index];\n\n const value = obj[key];\n\n if (!isDefined(value)) {\n return\n }\n\n // If we're at the last value in the path, and if it's a string/number/bool,\n // add it to the list\n if (\n index === path.length - 1 &&\n (isString(value) || isNumber(value) || isBoolean(value))\n ) {\n list.push(toString(value));\n } else if (isArray(value)) {\n arr = true;\n // Search each item in the array.\n for (let i = 0, len = value.length; i < len; i += 1) {\n deepGet(value[i], path, index + 1);\n }\n } else if (path.length) {\n // An object. Recurse further.\n deepGet(value, path, index + 1);\n }\n }\n };\n\n // Backwards compatibility (since path used to be a string)\n deepGet(obj, isString(path) ? path.split('.') : path, 0);\n\n return arr ? list : list[0]\n}\n\nconst MatchOptions = {\n // Whether the matches should be included in the result set. When `true`, each record in the result\n // set will include the indices of the matched characters.\n // These can consequently be used for highlighting purposes.\n includeMatches: false,\n // When `true`, the matching function will continue to the end of a search pattern even if\n // a perfect match has already been located in the string.\n findAllMatches: false,\n // Minimum number of characters that must be matched before a result is considered a match\n minMatchCharLength: 1\n};\n\nconst BasicOptions = {\n // When `true`, the algorithm continues searching to the end of the input even if a perfect\n // match is found before the end of the same input.\n isCaseSensitive: false,\n // When true, the matching function will continue to the end of a search pattern even if\n includeScore: false,\n // List of properties that will be searched. This also supports nested properties.\n keys: [],\n // Whether to sort the result list, by score\n shouldSort: true,\n // Default sort function: sort by ascending score, ascending index\n sortFn: (a, b) =>\n a.score === b.score ? (a.idx < b.idx ? -1 : 1) : a.score < b.score ? -1 : 1\n};\n\nconst FuzzyOptions = {\n // Approximately where in the text is the pattern expected to be found?\n location: 0,\n // At what point does the match algorithm give up. A threshold of '0.0' requires a perfect match\n // (of both letters and location), a threshold of '1.0' would match anything.\n threshold: 0.6,\n // Determines how close the match must be to the fuzzy location (specified above).\n // An exact letter match which is 'distance' characters away from the fuzzy location\n // would score as a complete mismatch. A distance of '0' requires the match be at\n // the exact location specified, a threshold of '1000' would require a perfect match\n // to be within 800 characters of the fuzzy location to be found using a 0.8 threshold.\n distance: 100\n};\n\nconst AdvancedOptions = {\n // When `true`, it enables the use of unix-like search commands\n useExtendedSearch: false,\n // The get function to use when fetching an object's properties.\n // The default will search nested paths *ie foo.bar.baz*\n getFn: get,\n // When `true`, search will ignore `location` and `distance`, so it won't matter\n // where in the string the pattern appears.\n // More info: https://fusejs.io/concepts/scoring-theory.html#fuzziness-score\n ignoreLocation: false,\n // When `true`, the calculation for the relevance score (used for sorting) will\n // ignore the field-length norm.\n // More info: https://fusejs.io/concepts/scoring-theory.html#field-length-norm\n ignoreFieldNorm: false,\n // The weight to determine how much field length norm effects scoring.\n fieldNormWeight: 1\n};\n\nvar Config = {\n ...BasicOptions,\n ...MatchOptions,\n ...FuzzyOptions,\n ...AdvancedOptions\n};\n\nconst SPACE = /[^ ]+/g;\n\n// Field-length norm: the shorter the field, the higher the weight.\n// Set to 3 decimals to reduce index size.\nfunction norm(weight = 1, mantissa = 3) {\n const cache = new Map();\n const m = Math.pow(10, mantissa);\n\n return {\n get(value) {\n const numTokens = value.match(SPACE).length;\n\n if (cache.has(numTokens)) {\n return cache.get(numTokens)\n }\n\n // Default function is 1/sqrt(x), weight makes that variable\n const norm = 1 / Math.pow(numTokens, 0.5 * weight);\n\n // In place of `toFixed(mantissa)`, for faster computation\n const n = parseFloat(Math.round(norm * m) / m);\n\n cache.set(numTokens, n);\n\n return n\n },\n clear() {\n cache.clear();\n }\n }\n}\n\nclass FuseIndex {\n constructor({\n getFn = Config.getFn,\n fieldNormWeight = Config.fieldNormWeight\n } = {}) {\n this.norm = norm(fieldNormWeight, 3);\n this.getFn = getFn;\n this.isCreated = false;\n\n this.setIndexRecords();\n }\n setSources(docs = []) {\n this.docs = docs;\n }\n setIndexRecords(records = []) {\n this.records = records;\n }\n setKeys(keys = []) {\n this.keys = keys;\n this._keysMap = {};\n keys.forEach((key, idx) => {\n this._keysMap[key.id] = idx;\n });\n }\n create() {\n if (this.isCreated || !this.docs.length) {\n return\n }\n\n this.isCreated = true;\n\n // List is Array\n if (isString(this.docs[0])) {\n this.docs.forEach((doc, docIndex) => {\n this._addString(doc, docIndex);\n });\n } else {\n // List is Array\n this.docs.forEach((doc, docIndex) => {\n this._addObject(doc, docIndex);\n });\n }\n\n this.norm.clear();\n }\n // Adds a doc to the end of the index\n add(doc) {\n const idx = this.size();\n\n if (isString(doc)) {\n this._addString(doc, idx);\n } else {\n this._addObject(doc, idx);\n }\n }\n // Removes the doc at the specified index of the index\n removeAt(idx) {\n this.records.splice(idx, 1);\n\n // Change ref index of every subsquent doc\n for (let i = idx, len = this.size(); i < len; i += 1) {\n this.records[i].i -= 1;\n }\n }\n getValueForItemAtKeyId(item, keyId) {\n return item[this._keysMap[keyId]]\n }\n size() {\n return this.records.length\n }\n _addString(doc, docIndex) {\n if (!isDefined(doc) || isBlank(doc)) {\n return\n }\n\n let record = {\n v: doc,\n i: docIndex,\n n: this.norm.get(doc)\n };\n\n this.records.push(record);\n }\n _addObject(doc, docIndex) {\n let record = { i: docIndex, $: {} };\n\n // Iterate over every key (i.e, path), and fetch the value at that key\n this.keys.forEach((key, keyIndex) => {\n let value = key.getFn ? key.getFn(doc) : this.getFn(doc, key.path);\n\n if (!isDefined(value)) {\n return\n }\n\n if (isArray(value)) {\n let subRecords = [];\n const stack = [{ nestedArrIndex: -1, value }];\n\n while (stack.length) {\n const { nestedArrIndex, value } = stack.pop();\n\n if (!isDefined(value)) {\n continue\n }\n\n if (isString(value) && !isBlank(value)) {\n let subRecord = {\n v: value,\n i: nestedArrIndex,\n n: this.norm.get(value)\n };\n\n subRecords.push(subRecord);\n } else if (isArray(value)) {\n value.forEach((item, k) => {\n stack.push({\n nestedArrIndex: k,\n value: item\n });\n });\n } else ;\n }\n record.$[keyIndex] = subRecords;\n } else if (isString(value) && !isBlank(value)) {\n let subRecord = {\n v: value,\n n: this.norm.get(value)\n };\n\n record.$[keyIndex] = subRecord;\n }\n });\n\n this.records.push(record);\n }\n toJSON() {\n return {\n keys: this.keys,\n records: this.records\n }\n }\n}\n\nfunction createIndex(\n keys,\n docs,\n { getFn = Config.getFn, fieldNormWeight = Config.fieldNormWeight } = {}\n) {\n const myIndex = new FuseIndex({ getFn, fieldNormWeight });\n myIndex.setKeys(keys.map(createKey));\n myIndex.setSources(docs);\n myIndex.create();\n return myIndex\n}\n\nfunction parseIndex(\n data,\n { getFn = Config.getFn, fieldNormWeight = Config.fieldNormWeight } = {}\n) {\n const { keys, records } = data;\n const myIndex = new FuseIndex({ getFn, fieldNormWeight });\n myIndex.setKeys(keys);\n myIndex.setIndexRecords(records);\n return myIndex\n}\n\nfunction computeScore$1(\n pattern,\n {\n errors = 0,\n currentLocation = 0,\n expectedLocation = 0,\n distance = Config.distance,\n ignoreLocation = Config.ignoreLocation\n } = {}\n) {\n const accuracy = errors / pattern.length;\n\n if (ignoreLocation) {\n return accuracy\n }\n\n const proximity = Math.abs(expectedLocation - currentLocation);\n\n if (!distance) {\n // Dodge divide by zero error.\n return proximity ? 1.0 : accuracy\n }\n\n return accuracy + proximity / distance\n}\n\nfunction convertMaskToIndices(\n matchmask = [],\n minMatchCharLength = Config.minMatchCharLength\n) {\n let indices = [];\n let start = -1;\n let end = -1;\n let i = 0;\n\n for (let len = matchmask.length; i < len; i += 1) {\n let match = matchmask[i];\n if (match && start === -1) {\n start = i;\n } else if (!match && start !== -1) {\n end = i - 1;\n if (end - start + 1 >= minMatchCharLength) {\n indices.push([start, end]);\n }\n start = -1;\n }\n }\n\n // (i-1 - start) + 1 => i - start\n if (matchmask[i - 1] && i - start >= minMatchCharLength) {\n indices.push([start, i - 1]);\n }\n\n return indices\n}\n\n// Machine word size\nconst MAX_BITS = 32;\n\nfunction search(\n text,\n pattern,\n patternAlphabet,\n {\n location = Config.location,\n distance = Config.distance,\n threshold = Config.threshold,\n findAllMatches = Config.findAllMatches,\n minMatchCharLength = Config.minMatchCharLength,\n includeMatches = Config.includeMatches,\n ignoreLocation = Config.ignoreLocation\n } = {}\n) {\n if (pattern.length > MAX_BITS) {\n throw new Error(PATTERN_LENGTH_TOO_LARGE(MAX_BITS))\n }\n\n const patternLen = pattern.length;\n // Set starting location at beginning text and initialize the alphabet.\n const textLen = text.length;\n // Handle the case when location > text.length\n const expectedLocation = Math.max(0, Math.min(location, textLen));\n // Highest score beyond which we give up.\n let currentThreshold = threshold;\n // Is there a nearby exact match? (speedup)\n let bestLocation = expectedLocation;\n\n // Performance: only computer matches when the minMatchCharLength > 1\n // OR if `includeMatches` is true.\n const computeMatches = minMatchCharLength > 1 || includeMatches;\n // A mask of the matches, used for building the indices\n const matchMask = computeMatches ? Array(textLen) : [];\n\n let index;\n\n // Get all exact matches, here for speed up\n while ((index = text.indexOf(pattern, bestLocation)) > -1) {\n let score = computeScore$1(pattern, {\n currentLocation: index,\n expectedLocation,\n distance,\n ignoreLocation\n });\n\n currentThreshold = Math.min(score, currentThreshold);\n bestLocation = index + patternLen;\n\n if (computeMatches) {\n let i = 0;\n while (i < patternLen) {\n matchMask[index + i] = 1;\n i += 1;\n }\n }\n }\n\n // Reset the best location\n bestLocation = -1;\n\n let lastBitArr = [];\n let finalScore = 1;\n let binMax = patternLen + textLen;\n\n const mask = 1 << (patternLen - 1);\n\n for (let i = 0; i < patternLen; i += 1) {\n // Scan for the best match; each iteration allows for one more error.\n // Run a binary search to determine how far from the match location we can stray\n // at this error level.\n let binMin = 0;\n let binMid = binMax;\n\n while (binMin < binMid) {\n const score = computeScore$1(pattern, {\n errors: i,\n currentLocation: expectedLocation + binMid,\n expectedLocation,\n distance,\n ignoreLocation\n });\n\n if (score <= currentThreshold) {\n binMin = binMid;\n } else {\n binMax = binMid;\n }\n\n binMid = Math.floor((binMax - binMin) / 2 + binMin);\n }\n\n // Use the result from this iteration as the maximum for the next.\n binMax = binMid;\n\n let start = Math.max(1, expectedLocation - binMid + 1);\n let finish = findAllMatches\n ? textLen\n : Math.min(expectedLocation + binMid, textLen) + patternLen;\n\n // Initialize the bit array\n let bitArr = Array(finish + 2);\n\n bitArr[finish + 1] = (1 << i) - 1;\n\n for (let j = finish; j >= start; j -= 1) {\n let currentLocation = j - 1;\n let charMatch = patternAlphabet[text.charAt(currentLocation)];\n\n if (computeMatches) {\n // Speed up: quick bool to int conversion (i.e, `charMatch ? 1 : 0`)\n matchMask[currentLocation] = +!!charMatch;\n }\n\n // First pass: exact match\n bitArr[j] = ((bitArr[j + 1] << 1) | 1) & charMatch;\n\n // Subsequent passes: fuzzy match\n if (i) {\n bitArr[j] |=\n ((lastBitArr[j + 1] | lastBitArr[j]) << 1) | 1 | lastBitArr[j + 1];\n }\n\n if (bitArr[j] & mask) {\n finalScore = computeScore$1(pattern, {\n errors: i,\n currentLocation,\n expectedLocation,\n distance,\n ignoreLocation\n });\n\n // This match will almost certainly be better than any existing match.\n // But check anyway.\n if (finalScore <= currentThreshold) {\n // Indeed it is\n currentThreshold = finalScore;\n bestLocation = currentLocation;\n\n // Already passed `loc`, downhill from here on in.\n if (bestLocation <= expectedLocation) {\n break\n }\n\n // When passing `bestLocation`, don't exceed our current distance from `expectedLocation`.\n start = Math.max(1, 2 * expectedLocation - bestLocation);\n }\n }\n }\n\n // No hope for a (better) match at greater error levels.\n const score = computeScore$1(pattern, {\n errors: i + 1,\n currentLocation: expectedLocation,\n expectedLocation,\n distance,\n ignoreLocation\n });\n\n if (score > currentThreshold) {\n break\n }\n\n lastBitArr = bitArr;\n }\n\n const result = {\n isMatch: bestLocation >= 0,\n // Count exact matches (those with a score of 0) to be \"almost\" exact\n score: Math.max(0.001, finalScore)\n };\n\n if (computeMatches) {\n const indices = convertMaskToIndices(matchMask, minMatchCharLength);\n if (!indices.length) {\n result.isMatch = false;\n } else if (includeMatches) {\n result.indices = indices;\n }\n }\n\n return result\n}\n\nfunction createPatternAlphabet(pattern) {\n let mask = {};\n\n for (let i = 0, len = pattern.length; i < len; i += 1) {\n const char = pattern.charAt(i);\n mask[char] = (mask[char] || 0) | (1 << (len - i - 1));\n }\n\n return mask\n}\n\nclass BitapSearch {\n constructor(\n pattern,\n {\n location = Config.location,\n threshold = Config.threshold,\n distance = Config.distance,\n includeMatches = Config.includeMatches,\n findAllMatches = Config.findAllMatches,\n minMatchCharLength = Config.minMatchCharLength,\n isCaseSensitive = Config.isCaseSensitive,\n ignoreLocation = Config.ignoreLocation\n } = {}\n ) {\n this.options = {\n location,\n threshold,\n distance,\n includeMatches,\n findAllMatches,\n minMatchCharLength,\n isCaseSensitive,\n ignoreLocation\n };\n\n this.pattern = isCaseSensitive ? pattern : pattern.toLowerCase();\n\n this.chunks = [];\n\n if (!this.pattern.length) {\n return\n }\n\n const addChunk = (pattern, startIndex) => {\n this.chunks.push({\n pattern,\n alphabet: createPatternAlphabet(pattern),\n startIndex\n });\n };\n\n const len = this.pattern.length;\n\n if (len > MAX_BITS) {\n let i = 0;\n const remainder = len % MAX_BITS;\n const end = len - remainder;\n\n while (i < end) {\n addChunk(this.pattern.substr(i, MAX_BITS), i);\n i += MAX_BITS;\n }\n\n if (remainder) {\n const startIndex = len - MAX_BITS;\n addChunk(this.pattern.substr(startIndex), startIndex);\n }\n } else {\n addChunk(this.pattern, 0);\n }\n }\n\n searchIn(text) {\n const { isCaseSensitive, includeMatches } = this.options;\n\n if (!isCaseSensitive) {\n text = text.toLowerCase();\n }\n\n // Exact match\n if (this.pattern === text) {\n let result = {\n isMatch: true,\n score: 0\n };\n\n if (includeMatches) {\n result.indices = [[0, text.length - 1]];\n }\n\n return result\n }\n\n // Otherwise, use Bitap algorithm\n const {\n location,\n distance,\n threshold,\n findAllMatches,\n minMatchCharLength,\n ignoreLocation\n } = this.options;\n\n let allIndices = [];\n let totalScore = 0;\n let hasMatches = false;\n\n this.chunks.forEach(({ pattern, alphabet, startIndex }) => {\n const { isMatch, score, indices } = search(text, pattern, alphabet, {\n location: location + startIndex,\n distance,\n threshold,\n findAllMatches,\n minMatchCharLength,\n includeMatches,\n ignoreLocation\n });\n\n if (isMatch) {\n hasMatches = true;\n }\n\n totalScore += score;\n\n if (isMatch && indices) {\n allIndices = [...allIndices, ...indices];\n }\n });\n\n let result = {\n isMatch: hasMatches,\n score: hasMatches ? totalScore / this.chunks.length : 1\n };\n\n if (hasMatches && includeMatches) {\n result.indices = allIndices;\n }\n\n return result\n }\n}\n\nclass BaseMatch {\n constructor(pattern) {\n this.pattern = pattern;\n }\n static isMultiMatch(pattern) {\n return getMatch(pattern, this.multiRegex)\n }\n static isSingleMatch(pattern) {\n return getMatch(pattern, this.singleRegex)\n }\n search(/*text*/) {}\n}\n\nfunction getMatch(pattern, exp) {\n const matches = pattern.match(exp);\n return matches ? matches[1] : null\n}\n\n// Token: 'file\n\nclass ExactMatch extends BaseMatch {\n constructor(pattern) {\n super(pattern);\n }\n static get type() {\n return 'exact'\n }\n static get multiRegex() {\n return /^=\"(.*)\"$/\n }\n static get singleRegex() {\n return /^=(.*)$/\n }\n search(text) {\n const isMatch = text === this.pattern;\n\n return {\n isMatch,\n score: isMatch ? 0 : 1,\n indices: [0, this.pattern.length - 1]\n }\n }\n}\n\n// Token: !fire\n\nclass InverseExactMatch extends BaseMatch {\n constructor(pattern) {\n super(pattern);\n }\n static get type() {\n return 'inverse-exact'\n }\n static get multiRegex() {\n return /^!\"(.*)\"$/\n }\n static get singleRegex() {\n return /^!(.*)$/\n }\n search(text) {\n const index = text.indexOf(this.pattern);\n const isMatch = index === -1;\n\n return {\n isMatch,\n score: isMatch ? 0 : 1,\n indices: [0, text.length - 1]\n }\n }\n}\n\n// Token: ^file\n\nclass PrefixExactMatch extends BaseMatch {\n constructor(pattern) {\n super(pattern);\n }\n static get type() {\n return 'prefix-exact'\n }\n static get multiRegex() {\n return /^\\^\"(.*)\"$/\n }\n static get singleRegex() {\n return /^\\^(.*)$/\n }\n search(text) {\n const isMatch = text.startsWith(this.pattern);\n\n return {\n isMatch,\n score: isMatch ? 0 : 1,\n indices: [0, this.pattern.length - 1]\n }\n }\n}\n\n// Token: !^fire\n\nclass InversePrefixExactMatch extends BaseMatch {\n constructor(pattern) {\n super(pattern);\n }\n static get type() {\n return 'inverse-prefix-exact'\n }\n static get multiRegex() {\n return /^!\\^\"(.*)\"$/\n }\n static get singleRegex() {\n return /^!\\^(.*)$/\n }\n search(text) {\n const isMatch = !text.startsWith(this.pattern);\n\n return {\n isMatch,\n score: isMatch ? 0 : 1,\n indices: [0, text.length - 1]\n }\n }\n}\n\n// Token: .file$\n\nclass SuffixExactMatch extends BaseMatch {\n constructor(pattern) {\n super(pattern);\n }\n static get type() {\n return 'suffix-exact'\n }\n static get multiRegex() {\n return /^\"(.*)\"\\$$/\n }\n static get singleRegex() {\n return /^(.*)\\$$/\n }\n search(text) {\n const isMatch = text.endsWith(this.pattern);\n\n return {\n isMatch,\n score: isMatch ? 0 : 1,\n indices: [text.length - this.pattern.length, text.length - 1]\n }\n }\n}\n\n// Token: !.file$\n\nclass InverseSuffixExactMatch extends BaseMatch {\n constructor(pattern) {\n super(pattern);\n }\n static get type() {\n return 'inverse-suffix-exact'\n }\n static get multiRegex() {\n return /^!\"(.*)\"\\$$/\n }\n static get singleRegex() {\n return /^!(.*)\\$$/\n }\n search(text) {\n const isMatch = !text.endsWith(this.pattern);\n return {\n isMatch,\n score: isMatch ? 0 : 1,\n indices: [0, text.length - 1]\n }\n }\n}\n\nclass FuzzyMatch extends BaseMatch {\n constructor(\n pattern,\n {\n location = Config.location,\n threshold = Config.threshold,\n distance = Config.distance,\n includeMatches = Config.includeMatches,\n findAllMatches = Config.findAllMatches,\n minMatchCharLength = Config.minMatchCharLength,\n isCaseSensitive = Config.isCaseSensitive,\n ignoreLocation = Config.ignoreLocation\n } = {}\n ) {\n super(pattern);\n this._bitapSearch = new BitapSearch(pattern, {\n location,\n threshold,\n distance,\n includeMatches,\n findAllMatches,\n minMatchCharLength,\n isCaseSensitive,\n ignoreLocation\n });\n }\n static get type() {\n return 'fuzzy'\n }\n static get multiRegex() {\n return /^\"(.*)\"$/\n }\n static get singleRegex() {\n return /^(.*)$/\n }\n search(text) {\n return this._bitapSearch.searchIn(text)\n }\n}\n\n// Token: 'file\n\nclass IncludeMatch extends BaseMatch {\n constructor(pattern) {\n super(pattern);\n }\n static get type() {\n return 'include'\n }\n static get multiRegex() {\n return /^'\"(.*)\"$/\n }\n static get singleRegex() {\n return /^'(.*)$/\n }\n search(text) {\n let location = 0;\n let index;\n\n const indices = [];\n const patternLen = this.pattern.length;\n\n // Get all exact matches\n while ((index = text.indexOf(this.pattern, location)) > -1) {\n location = index + patternLen;\n indices.push([index, location - 1]);\n }\n\n const isMatch = !!indices.length;\n\n return {\n isMatch,\n score: isMatch ? 0 : 1,\n indices\n }\n }\n}\n\n// ❗Order is important. DO NOT CHANGE.\nconst searchers = [\n ExactMatch,\n IncludeMatch,\n PrefixExactMatch,\n InversePrefixExactMatch,\n InverseSuffixExactMatch,\n SuffixExactMatch,\n InverseExactMatch,\n FuzzyMatch\n];\n\nconst searchersLen = searchers.length;\n\n// Regex to split by spaces, but keep anything in quotes together\nconst SPACE_RE = / +(?=(?:[^\\\"]*\\\"[^\\\"]*\\\")*[^\\\"]*$)/;\nconst OR_TOKEN = '|';\n\n// Return a 2D array representation of the query, for simpler parsing.\n// Example:\n// \"^core go$ | rb$ | py$ xy$\" => [[\"^core\", \"go$\"], [\"rb$\"], [\"py$\", \"xy$\"]]\nfunction parseQuery(pattern, options = {}) {\n return pattern.split(OR_TOKEN).map((item) => {\n let query = item\n .trim()\n .split(SPACE_RE)\n .filter((item) => item && !!item.trim());\n\n let results = [];\n for (let i = 0, len = query.length; i < len; i += 1) {\n const queryItem = query[i];\n\n // 1. Handle multiple query match (i.e, once that are quoted, like `\"hello world\"`)\n let found = false;\n let idx = -1;\n while (!found && ++idx < searchersLen) {\n const searcher = searchers[idx];\n let token = searcher.isMultiMatch(queryItem);\n if (token) {\n results.push(new searcher(token, options));\n found = true;\n }\n }\n\n if (found) {\n continue\n }\n\n // 2. Handle single query matches (i.e, once that are *not* quoted)\n idx = -1;\n while (++idx < searchersLen) {\n const searcher = searchers[idx];\n let token = searcher.isSingleMatch(queryItem);\n if (token) {\n results.push(new searcher(token, options));\n break\n }\n }\n }\n\n return results\n })\n}\n\n// These extended matchers can return an array of matches, as opposed\n// to a singl match\nconst MultiMatchSet = new Set([FuzzyMatch.type, IncludeMatch.type]);\n\n/**\n * Command-like searching\n * ======================\n *\n * Given multiple search terms delimited by spaces.e.g. `^jscript .python$ ruby !java`,\n * search in a given text.\n *\n * Search syntax:\n *\n * | Token | Match type | Description |\n * | ----------- | -------------------------- | -------------------------------------- |\n * | `jscript` | fuzzy-match | Items that fuzzy match `jscript` |\n * | `=scheme` | exact-match | Items that are `scheme` |\n * | `'python` | include-match | Items that include `python` |\n * | `!ruby` | inverse-exact-match | Items that do not include `ruby` |\n * | `^java` | prefix-exact-match | Items that start with `java` |\n * | `!^earlang` | inverse-prefix-exact-match | Items that do not start with `earlang` |\n * | `.js$` | suffix-exact-match | Items that end with `.js` |\n * | `!.go$` | inverse-suffix-exact-match | Items that do not end with `.go` |\n *\n * A single pipe character acts as an OR operator. For example, the following\n * query matches entries that start with `core` and end with either`go`, `rb`,\n * or`py`.\n *\n * ```\n * ^core go$ | rb$ | py$\n * ```\n */\nclass ExtendedSearch {\n constructor(\n pattern,\n {\n isCaseSensitive = Config.isCaseSensitive,\n includeMatches = Config.includeMatches,\n minMatchCharLength = Config.minMatchCharLength,\n ignoreLocation = Config.ignoreLocation,\n findAllMatches = Config.findAllMatches,\n location = Config.location,\n threshold = Config.threshold,\n distance = Config.distance\n } = {}\n ) {\n this.query = null;\n this.options = {\n isCaseSensitive,\n includeMatches,\n minMatchCharLength,\n findAllMatches,\n ignoreLocation,\n location,\n threshold,\n distance\n };\n\n this.pattern = isCaseSensitive ? pattern : pattern.toLowerCase();\n this.query = parseQuery(this.pattern, this.options);\n }\n\n static condition(_, options) {\n return options.useExtendedSearch\n }\n\n searchIn(text) {\n const query = this.query;\n\n if (!query) {\n return {\n isMatch: false,\n score: 1\n }\n }\n\n const { includeMatches, isCaseSensitive } = this.options;\n\n text = isCaseSensitive ? text : text.toLowerCase();\n\n let numMatches = 0;\n let allIndices = [];\n let totalScore = 0;\n\n // ORs\n for (let i = 0, qLen = query.length; i < qLen; i += 1) {\n const searchers = query[i];\n\n // Reset indices\n allIndices.length = 0;\n numMatches = 0;\n\n // ANDs\n for (let j = 0, pLen = searchers.length; j < pLen; j += 1) {\n const searcher = searchers[j];\n const { isMatch, indices, score } = searcher.search(text);\n\n if (isMatch) {\n numMatches += 1;\n totalScore += score;\n if (includeMatches) {\n const type = searcher.constructor.type;\n if (MultiMatchSet.has(type)) {\n allIndices = [...allIndices, ...indices];\n } else {\n allIndices.push(indices);\n }\n }\n } else {\n totalScore = 0;\n numMatches = 0;\n allIndices.length = 0;\n break\n }\n }\n\n // OR condition, so if TRUE, return\n if (numMatches) {\n let result = {\n isMatch: true,\n score: totalScore / numMatches\n };\n\n if (includeMatches) {\n result.indices = allIndices;\n }\n\n return result\n }\n }\n\n // Nothing was matched\n return {\n isMatch: false,\n score: 1\n }\n }\n}\n\nconst registeredSearchers = [];\n\nfunction register(...args) {\n registeredSearchers.push(...args);\n}\n\nfunction createSearcher(pattern, options) {\n for (let i = 0, len = registeredSearchers.length; i < len; i += 1) {\n let searcherClass = registeredSearchers[i];\n if (searcherClass.condition(pattern, options)) {\n return new searcherClass(pattern, options)\n }\n }\n\n return new BitapSearch(pattern, options)\n}\n\nconst LogicalOperator = {\n AND: '$and',\n OR: '$or'\n};\n\nconst KeyType = {\n PATH: '$path',\n PATTERN: '$val'\n};\n\nconst isExpression = (query) =>\n !!(query[LogicalOperator.AND] || query[LogicalOperator.OR]);\n\nconst isPath = (query) => !!query[KeyType.PATH];\n\nconst isLeaf = (query) =>\n !isArray(query) && isObject(query) && !isExpression(query);\n\nconst convertToExplicit = (query) => ({\n [LogicalOperator.AND]: Object.keys(query).map((key) => ({\n [key]: query[key]\n }))\n});\n\n// When `auto` is `true`, the parse function will infer and initialize and add\n// the appropriate `Searcher` instance\nfunction parse(query, options, { auto = true } = {}) {\n const next = (query) => {\n let keys = Object.keys(query);\n\n const isQueryPath = isPath(query);\n\n if (!isQueryPath && keys.length > 1 && !isExpression(query)) {\n return next(convertToExplicit(query))\n }\n\n if (isLeaf(query)) {\n const key = isQueryPath ? query[KeyType.PATH] : keys[0];\n\n const pattern = isQueryPath ? query[KeyType.PATTERN] : query[key];\n\n if (!isString(pattern)) {\n throw new Error(LOGICAL_SEARCH_INVALID_QUERY_FOR_KEY(key))\n }\n\n const obj = {\n keyId: createKeyId(key),\n pattern\n };\n\n if (auto) {\n obj.searcher = createSearcher(pattern, options);\n }\n\n return obj\n }\n\n let node = {\n children: [],\n operator: keys[0]\n };\n\n keys.forEach((key) => {\n const value = query[key];\n\n if (isArray(value)) {\n value.forEach((item) => {\n node.children.push(next(item));\n });\n }\n });\n\n return node\n };\n\n if (!isExpression(query)) {\n query = convertToExplicit(query);\n }\n\n return next(query)\n}\n\n// Practical scoring function\nfunction computeScore(\n results,\n { ignoreFieldNorm = Config.ignoreFieldNorm }\n) {\n results.forEach((result) => {\n let totalScore = 1;\n\n result.matches.forEach(({ key, norm, score }) => {\n const weight = key ? key.weight : null;\n\n totalScore *= Math.pow(\n score === 0 && weight ? Number.EPSILON : score,\n (weight || 1) * (ignoreFieldNorm ? 1 : norm)\n );\n });\n\n result.score = totalScore;\n });\n}\n\nfunction transformMatches(result, data) {\n const matches = result.matches;\n data.matches = [];\n\n if (!isDefined(matches)) {\n return\n }\n\n matches.forEach((match) => {\n if (!isDefined(match.indices) || !match.indices.length) {\n return\n }\n\n const { indices, value } = match;\n\n let obj = {\n indices,\n value\n };\n\n if (match.key) {\n obj.key = match.key.src;\n }\n\n if (match.idx > -1) {\n obj.refIndex = match.idx;\n }\n\n data.matches.push(obj);\n });\n}\n\nfunction transformScore(result, data) {\n data.score = result.score;\n}\n\nfunction format(\n results,\n docs,\n {\n includeMatches = Config.includeMatches,\n includeScore = Config.includeScore\n } = {}\n) {\n const transformers = [];\n\n if (includeMatches) transformers.push(transformMatches);\n if (includeScore) transformers.push(transformScore);\n\n return results.map((result) => {\n const { idx } = result;\n\n const data = {\n item: docs[idx],\n refIndex: idx\n };\n\n if (transformers.length) {\n transformers.forEach((transformer) => {\n transformer(result, data);\n });\n }\n\n return data\n })\n}\n\nclass Fuse {\n constructor(docs, options = {}, index) {\n this.options = { ...Config, ...options };\n\n if (\n this.options.useExtendedSearch &&\n !true\n ) {\n throw new Error(EXTENDED_SEARCH_UNAVAILABLE)\n }\n\n this._keyStore = new KeyStore(this.options.keys);\n\n this.setCollection(docs, index);\n }\n\n setCollection(docs, index) {\n this._docs = docs;\n\n if (index && !(index instanceof FuseIndex)) {\n throw new Error(INCORRECT_INDEX_TYPE)\n }\n\n this._myIndex =\n index ||\n createIndex(this.options.keys, this._docs, {\n getFn: this.options.getFn,\n fieldNormWeight: this.options.fieldNormWeight\n });\n }\n\n add(doc) {\n if (!isDefined(doc)) {\n return\n }\n\n this._docs.push(doc);\n this._myIndex.add(doc);\n }\n\n remove(predicate = (/* doc, idx */) => false) {\n const results = [];\n\n for (let i = 0, len = this._docs.length; i < len; i += 1) {\n const doc = this._docs[i];\n if (predicate(doc, i)) {\n this.removeAt(i);\n i -= 1;\n len -= 1;\n\n results.push(doc);\n }\n }\n\n return results\n }\n\n removeAt(idx) {\n this._docs.splice(idx, 1);\n this._myIndex.removeAt(idx);\n }\n\n getIndex() {\n return this._myIndex\n }\n\n search(query, { limit = -1 } = {}) {\n const {\n includeMatches,\n includeScore,\n shouldSort,\n sortFn,\n ignoreFieldNorm\n } = this.options;\n\n let results = isString(query)\n ? isString(this._docs[0])\n ? this._searchStringList(query)\n : this._searchObjectList(query)\n : this._searchLogical(query);\n\n computeScore(results, { ignoreFieldNorm });\n\n if (shouldSort) {\n results.sort(sortFn);\n }\n\n if (isNumber(limit) && limit > -1) {\n results = results.slice(0, limit);\n }\n\n return format(results, this._docs, {\n includeMatches,\n includeScore\n })\n }\n\n _searchStringList(query) {\n const searcher = createSearcher(query, this.options);\n const { records } = this._myIndex;\n const results = [];\n\n // Iterate over every string in the index\n records.forEach(({ v: text, i: idx, n: norm }) => {\n if (!isDefined(text)) {\n return\n }\n\n const { isMatch, score, indices } = searcher.searchIn(text);\n\n if (isMatch) {\n results.push({\n item: text,\n idx,\n matches: [{ score, value: text, norm, indices }]\n });\n }\n });\n\n return results\n }\n\n _searchLogical(query) {\n\n const expression = parse(query, this.options);\n\n const evaluate = (node, item, idx) => {\n if (!node.children) {\n const { keyId, searcher } = node;\n\n const matches = this._findMatches({\n key: this._keyStore.get(keyId),\n value: this._myIndex.getValueForItemAtKeyId(item, keyId),\n searcher\n });\n\n if (matches && matches.length) {\n return [\n {\n idx,\n item,\n matches\n }\n ]\n }\n\n return []\n }\n\n const res = [];\n for (let i = 0, len = node.children.length; i < len; i += 1) {\n const child = node.children[i];\n const result = evaluate(child, item, idx);\n if (result.length) {\n res.push(...result);\n } else if (node.operator === LogicalOperator.AND) {\n return []\n }\n }\n return res\n };\n\n const records = this._myIndex.records;\n const resultMap = {};\n const results = [];\n\n records.forEach(({ $: item, i: idx }) => {\n if (isDefined(item)) {\n let expResults = evaluate(expression, item, idx);\n\n if (expResults.length) {\n // Dedupe when adding\n if (!resultMap[idx]) {\n resultMap[idx] = { idx, item, matches: [] };\n results.push(resultMap[idx]);\n }\n expResults.forEach(({ matches }) => {\n resultMap[idx].matches.push(...matches);\n });\n }\n }\n });\n\n return results\n }\n\n _searchObjectList(query) {\n const searcher = createSearcher(query, this.options);\n const { keys, records } = this._myIndex;\n const results = [];\n\n // List is Array\n records.forEach(({ $: item, i: idx }) => {\n if (!isDefined(item)) {\n return\n }\n\n let matches = [];\n\n // Iterate over every key (i.e, path), and fetch the value at that key\n keys.forEach((key, keyIndex) => {\n matches.push(\n ...this._findMatches({\n key,\n value: item[keyIndex],\n searcher\n })\n );\n });\n\n if (matches.length) {\n results.push({\n idx,\n item,\n matches\n });\n }\n });\n\n return results\n }\n _findMatches({ key, value, searcher }) {\n if (!isDefined(value)) {\n return []\n }\n\n let matches = [];\n\n if (isArray(value)) {\n value.forEach(({ v: text, i: idx, n: norm }) => {\n if (!isDefined(text)) {\n return\n }\n\n const { isMatch, score, indices } = searcher.searchIn(text);\n\n if (isMatch) {\n matches.push({\n score,\n key,\n value: text,\n idx,\n norm,\n indices\n });\n }\n });\n } else {\n const { v: text, n: norm } = value;\n\n const { isMatch, score, indices } = searcher.searchIn(text);\n\n if (isMatch) {\n matches.push({ score, key, value: text, norm, indices });\n }\n }\n\n return matches\n }\n}\n\nFuse.version = '6.6.2';\nFuse.createIndex = createIndex;\nFuse.parseIndex = parseIndex;\nFuse.config = Config;\n\n{\n Fuse.parseQuery = parse;\n}\n\n{\n register(ExtendedSearch);\n}\n\nexport { Fuse as default };\n","import util from \"./util\";\nimport Node from \"./db/Node\";\n\n// TODO config {peers: ['http://localhost:8768/gun'], file: 'State.electron', multicast:false, localStorage: false}\nconst electron = util.isElectron ? new Node('electron').get('state') : null;\n\nexport default electron;","// @ts-nocheck\nimport Key from './Key';\nimport notifications from './notifications';\nimport Channel from './Channel';\nimport util from './util';\nimport _ from './lodash';\nimport Fuse from \"fuse.js\";\nimport local from './local';\nimport electron from './electron';\nimport user from './public';\nimport privateState from './private';\nimport blockedUsers from './blockedUsers';\n\nlet key: any;\nlet myName: string;\nlet latestChatLink: string;\nlet onlineTimeout: any;\nlet ourActivity: any;\nlet noFollows: boolean;\nlet noFollowers: boolean;\nlet searchIndex: any;\nlet initCalled: boolean;\nconst searchableItems: any = {};\nconst getExtendedFollowsCalled = new Map();\n\nconst DEFAULT_FOLLOW = 'hyECQHwSo7fgr2MVfPyakvayPeixxsaAWVtZ-vbaiSc.TXIp8MnCtrnW6n2MrYquWPcc-DTmZzMBmc2yaGv9gIU';\n\nconst DEFAULT_SETTINGS = {\n electron: {\n openAtLogin: true,\n minimizeOnClose: true\n },\n local: {\n enableWebtorrent: !util.isMobile,\n enablePublicPeerDiscovery: true,\n autoplayWebtorrent: true,\n maxConnectedPeers: util.isElectron ? 2 : 1\n }\n};\n\n/**\n * User session management utilities.\n */\nexport default {\n /**\n * Log in with a key from localStorage.\n *\n * If no key is found and options.autologin is not false, a new user will be created.\n *\n * If options.autofollow is not false, the default follow will be added.\n * @param options\n */\n init(options: any = {}) {\n if (initCalled) { return; }\n initCalled = true;\n let localStorageKey = localStorage.getItem('chatKeyPair');\n console.log('localStorageKey', localStorageKey);\n if (localStorageKey) {\n this.login(JSON.parse(localStorageKey));\n } else if (options.autologin !== false) {\n this.loginAsNewUser(options);\n } else {\n this.clearIndexedDB();\n }\n setTimeout(() => {\n local().get('block').map(() => {\n this.updateSearchIndex();\n });\n this.updateSearchIndex();\n });\n setInterval(() => {\n if (this.taskQueue.length) {\n //console.log('this.taskQueue', this.taskQueue.length);\n const t = this.taskQueue.shift();\n t && t();\n }\n }, 10);\n },\n\n DEFAULT_SETTINGS,\n DEFAULT_FOLLOW,\n\n taskQueue: [] as any[],\n\n updateSearchIndex: _.throttle(() => {\n const options = {keys: ['name'], includeScore: true, includeMatches: true, threshold: 0.3};\n const values = Object.values(_.omit(searchableItems, Object.keys(blockedUsers())));\n searchIndex = new Fuse(values, options);\n local().get('searchIndexUpdated').put(true);\n }, 2000, {leading:true}),\n\n saveSearchResult: _.throttle(k => {\n local().get('contacts').get(k).put({followDistance: searchableItems[k].followDistance,followerCount: searchableItems[k].followers.size});\n }, 1000, {leading:true}),\n\n addFollow(callback: Function, k: string, followDistance: number, follower?: string) {\n if (searchableItems[k]) {\n if (searchableItems[k].followDistance > followDistance) {\n searchableItems[k].followDistance = followDistance;\n }\n follower && searchableItems[k].followers.add(follower);\n } else {\n searchableItems[k] = {key: k, followDistance, followers: new Set(follower && [follower])};\n this.taskQueue.push(() => {\n user(k).get('profile').get('name').on((name: string) => {\n searchableItems[k].name = name;\n local().get('contacts').get(k).get('name').put(name);\n callback && callback(k, searchableItems[k]);\n });\n });\n }\n this.saveSearchResult(k);\n callback && callback(k, searchableItems[k]);\n this.updateSearchIndex();\n this.updateNoFollows();\n this.updateNoFollowers();\n },\n\n removeFollow(k: string, followDistance: number, follower: string) {\n if (followDistance === 1) {\n local().get('contacts').get(k).put(false);\n local().get('groups').get('follows').get(k).put(false);\n if (searchableItems[k]) {\n searchableItems[k].followers.delete(follower);\n this.updateNoFollows();\n this.updateNoFollowers();\n }\n }\n if (searchableItems[k] && searchableItems[k].followers.size === 0) {\n delete searchableItems[k];\n local().get('contacts').get(k).put(false);\n local().get('groups').get('everyone').get(k).put(false);\n }\n },\n\n getExtendedFollows(callback: Function, k = key.pub, maxDepth = 3, currentDepth = 1) {\n const called = getExtendedFollowsCalled.get(k);\n if (called && called <= currentDepth) {\n return;\n }\n getExtendedFollowsCalled.set(k, currentDepth);\n\n this.addFollow(callback, k, currentDepth - 1);\n\n user(k).get('follow').map((isFollowing: boolean, followedKey: string) => { // TODO: unfollow\n if (isFollowing) {\n this.addFollow(callback, followedKey, currentDepth, k);\n if (currentDepth < maxDepth) {\n this.taskQueue.push(() => this.getExtendedFollows(callback, followedKey, maxDepth, currentDepth + 1));\n }\n } else {\n this.removeFollow(followedKey, currentDepth, k);\n }\n });\n\n return searchableItems;\n },\n\n updateNoFollows: _.throttle(() => {\n const v = Object.keys(searchableItems).length <= 1;\n if (v !== noFollows) {\n noFollows = v;\n local().get('noFollows').put(noFollows);\n }\n }, 1000, {leading:true}),\n\n updateNoFollowers: _.throttle(() => {\n const v = !(searchableItems[key.pub] && (searchableItems[key.pub].followers.size > 0));\n if (v !== noFollowers) {\n noFollowers = v;\n local().get('noFollowers').put(noFollowers);\n }\n }, 1000, {leading:true}),\n\n getSearchIndex() {\n return searchIndex;\n },\n\n setOurOnlineStatus() {\n const activeRoute = window.location.hash;\n Channel.setActivity(ourActivity = 'active');\n const setActive = _.debounce(() => {\n const chatId = activeRoute && activeRoute.replace('#/profile/','').replace('#/chat/','');\n const chat = privateState(chatId);\n if (chat && !ourActivity) {\n chat.setMyMsgsLastSeenTime();\n }\n Channel.setActivity(ourActivity = 'active');\n clearTimeout(onlineTimeout);\n onlineTimeout = setTimeout(() => Channel.setActivity(ourActivity = 'online'), 30000);\n }, 1000);\n document.addEventListener(\"touchmove\", setActive);\n document.addEventListener(\"mousemove\", setActive);\n document.addEventListener(\"keypress\", setActive);\n document.addEventListener(\"visibilitychange\", () => {\n if (document.visibilityState === 'visible') {\n Channel.setActivity(ourActivity = 'active');\n const chatId = location.pathname.slice(1).replace('chat/','');\n const chat = activeRoute && privateState(chatId);\n if (chat) {\n chat.setMyMsgsLastSeenTime();\n notifications.changeChatUnseenCount(chatId, 0);\n }\n } else {\n Channel.setActivity(ourActivity = 'online');\n }\n });\n setActive();\n window.addEventListener(\"beforeunload\", () => {\n Channel.setActivity(ourActivity = null);\n });\n },\n\n updateGroups() {\n this.getExtendedFollows((k: string, info: any) => {\n if (info.followDistance <= 1) {\n local().get('groups').get('follows').get(k).put(true);\n }\n local().get('groups').get('everyone').get(k).put(true);\n if (k === this.getPubKey()) {\n this.updateNoFollowers();\n }\n });\n },\n\n /**\n * Log in with a private key.\n * @param key\n */\n login(k: any) {\n console.log('login', k);\n const shouldRefresh = !!key;\n console.log('shouldRefresh', shouldRefresh, 'key', key);\n key = k;\n localStorage.setItem('chatKeyPair', JSON.stringify(k));\n user().auth(key);\n user().put({epub: key.epub});\n notifications.subscribeToWebPush();\n notifications.getWebPushSubscriptions();\n //notifications.subscribeToIrisNotifications();\n Channel.getMyChatLinks( undefined, (chatLink: any) => {\n local().get('chatLinks').get(chatLink.id).put(chatLink.url);\n latestChatLink = chatLink.url;\n });\n this.setOurOnlineStatus();\n Channel.getChannels( (c: Channel) => this.addChannel(c));\n user().get('profile').get('name').on((name: any) => {\n if (name && typeof name === 'string') {\n myName = name;\n }\n });\n // a lot of this is iris-messenger stuff\n notifications.init();\n local().get('loggedIn').put(true);\n console.log('local().get(\\'loggedIn\\').put(true);', local());\n local().get('settings').once().then(settings => {\n if (!settings) {\n local().get('settings').put(DEFAULT_SETTINGS.local);\n } else if (settings.enableWebtorrent === undefined || settings.autoplayWebtorrent === undefined) {\n local().get('settings').get('enableWebtorrent').put(DEFAULT_SETTINGS.local.enableWebtorrent);\n local().get('settings').get('autoplayWebtorrent').put(DEFAULT_SETTINGS.local.autoplayWebtorrent);\n }\n });\n user().get('block').map((isBlocked: boolean, user: string) => {\n local().get('block').get(user).put(isBlocked);\n if (isBlocked) {\n delete searchableItems[user];\n }\n });\n this.updateGroups();\n if (shouldRefresh) {\n location.reload();\n }\n if (electron) {\n electron.get('settings').on(electron => {\n local().get('settings').get('electron').put(electron);\n });\n electron.get('user').put(key.pub);\n }\n local().get('filters').get('group').once().then(v => {\n if (!v) {\n local().get('filters').get('group').put('follows');\n }\n });\n },\n\n\n\n /**\n * Create a new user account and log in.\n * @param options {Object} - Options for the new account.\n * @returns {Promise<*>}\n */\n loginAsNewUser(options: any = {}) {\n const name = options.name || util.generateName();\n console.log('loginAsNewUser name', name);\n return Key.generate().then(k => {\n this.login(k);\n user().get('profile').put({a:null});\n user().get('profile').get('name').put(name);\n local().get('filters').put({a:null});\n local().get('filters').get('group').put('follows');\n Channel.createChatLink().then(l => latestChatLink = l);\n setTimeout(() => {\n if (options.autofollow !== false) {\n console.log('autofollowing', DEFAULT_FOLLOW);\n user().get('follow').get(DEFAULT_FOLLOW).put(true);\n }\n }, 1000); // maybe wait for login return instead\n });\n },\n\n /**\n * Log out the current user.\n * @returns {Promise}\n */\n async logOut() {\n if (electron) {\n electron.get('user').put(null);\n }\n // TODO: remove subscription from your channels\n if (navigator.serviceWorker) {\n const reg = await navigator.serviceWorker.getRegistration();\n if (reg && reg.pushManager) {\n reg.active?.postMessage({key: null});\n const sub = await reg.pushManager.getSubscription();\n if (sub) {\n const hash = await util.getHash(JSON.stringify(sub));\n notifications.removeSubscription(hash);\n sub.unsubscribe && sub.unsubscribe();\n }\n }\n }\n this.clearIndexedDB();\n localStorage.clear(); // TODO clear only iris data\n window.location.hash = '';\n window.location.href = '/';\n location.reload();\n },\n\n clearIndexedDB() {\n return new Promise(resolve => {\n const r1 = window.indexedDB.deleteDatabase('local()');\n const r2 = window.indexedDB.deleteDatabase('radata');\n let r1done = false;\n let r2done = false;\n const check = () => {\n r1done && r2done && resolve(undefined);\n }\n r1.onerror = r2.onerror = e => console.error(e);\n //r1.onblocked = r2.onblocked = e => console.error('blocked', e);\n r1.onsuccess = () => {\n r1done = true;\n check();\n }\n r2.onsuccess = () => {\n r2done = true;\n check();\n }\n });\n },\n\n getMyChatLink() {\n return latestChatLink || util.getProfileLink(key.pub);\n },\n\n /**\n * Get the keypair of the logged in user.\n * @returns {*}\n */\n getKey() { return key; },\n\n /**\n * Get the public key of the logged in user.\n * @returns {*}\n */\n getPubKey() {\n return key && key.pub;\n },\n\n /**\n * Get the name of the logged in user.\n * @returns {*}\n */\n getMyName() { return myName; }, // TODO maybe remove and use iris.user().get('profile').get('name') instead?\n\n myPeerUrl: (ip: string) => `http://${ip}:8767/gun`,\n\n async shareMyPeerUrl(channel: Channel) {\n const myIp = await local().get('settings').get('electron').get('publicIp').once();\n myIp && channel.put && channel.put('my_peer', this.myPeerUrl(myIp));\n },\n\n newChannel(pub: string, chatLink?: string) {\n if (!pub || this.channelIds.has(pub)) {\n return;\n }\n const chat = privateState(pub, chatLink);\n this.addChannel(chat);\n return chat;\n },\n\n addChannel(chat: Channel) {\n this.taskQueue.push(() => {\n let pub = chat.getId();\n if (this.channelIds.has(pub)) { return; }\n this.channelIds.add(pub);\n const chatNode = local().get('channels').get(pub);\n chatNode.get('latestTime').on((t: string) => {\n if (t && (!chat.latestTime || t > chat.latestTime)) {\n chat.latestTime = t;\n } else {\n // chatNode.get('latestTime').put(chat.latestTime); // omg recursion\n }\n });\n chatNode.get('theirMsgsLastSeenTime').on((t: string) => {\n if (!t) { return; }\n const d = new Date(t);\n if (!chat.theirMsgsLastSeenDate || chat.theirMsgsLastSeenDate < d) {\n chat.theirMsgsLastSeenDate = d;\n }\n });\n chat.getLatestMsg && chat.getLatestMsg((latest: any, info: any) => {\n this.processMessage(pub, latest, info);\n });\n notifications.changeChatUnseenCount(pub, 0);\n chat.notificationSetting = 'all';\n chat.onMy('notificationSetting', (val: any) => {\n chat.notificationSetting = val;\n });\n //$(\".chat-list\").append(el);\n chat.theirMsgsLastSeenTime = '';\n chat.getTheirMsgsLastSeenTime((time: any) => {\n if (chat && time && time >= chat.theirMsgsLastSeenTime) {\n chat.theirMsgsLastSeenTime = time;\n chatNode.get('theirMsgsLastSeenTime').put(time);\n }\n });\n chat.getMyMsgsLastSeenTime((time: any) => {\n chat.myLastSeenTime = new Date(time);\n if (chat.latest && chat.myLastSeenTime >= chat.latest.time) {\n notifications.changeChatUnseenCount(pub, 0);\n }\n });\n chat.isTyping = false;\n chat.getTyping(isTyping => {\n chat.isTyping = isTyping;\n local().get('channels').get(pub).get('isTyping').put(isTyping);\n });\n chat.online = {};\n Channel.getActivity(pub, (activity) => {\n if (chat) {\n chatNode.put({theirLastActiveTime: activity && activity.lastActive, activity: activity && activity.isActive && activity.status});\n chat.activity = activity;\n }\n });\n if (chat.uuid) {\n let isDarkMode = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches;\n chat.participantProfiles = {};\n chat.on('name', v => {\n chat.name = v;\n searchableItems[chat.uuid] = {name: v, uuid: chat.uuid};\n local().get('channels').get(chat.uuid).get('name').put(v);\n });\n chat.on('photo', v => {\n searchableItems[chat.uuid] = searchableItems[chat.uuid] || {};\n searchableItems[chat.uuid].photo = v;\n local().get('channels').get(chat.uuid).get('photo').put(v)\n });\n chat.on('about', v => local().get('channels').get(chat.uuid).get('about').put(v));\n chat.getParticipants(participants => {\n delete participants.undefined; // TODO fix where it comes from\n if (typeof participants === 'object') {\n let keys = Object.keys(participants);\n keys.forEach((k, i) => {\n let hue = 360 / Math.max(keys.length, 2) * i; // TODO use css filter brightness\n chat.participantProfiles[k] = {permissions: participants[k], color: `hsl(${hue}, 98%, ${isDarkMode ? 80 : 33}%)`};\n user(k).get('profile').get('name').on(name => {\n chat.participantProfiles[k].name = name;\n });\n });\n }\n local().get('channels').get(chat.uuid).get('participants').put(participants);\n });\n chat.inviteLinks = {};\n chat.getChatLinks({callback: ({url, id}) => {\n console.log('got chat link', id, url);\n chat.inviteLinks[id] = url; // TODO use State\n local().get('inviteLinksChanged').put(true);\n }});\n } else {\n // TODO do we want this?\n user(pub).get('profile').get('name').on(v => local().get('channels').get(pub).get('name').put(v))\n }\n if (chat.put) {\n chat.onTheir('webPushSubscriptions', (s, k, from) => {\n if (!Array.isArray(s)) { return; }\n chat.webPushSubscriptions = chat.webPushSubscriptions || {};\n chat.webPushSubscriptions[from || pub] = s;\n });\n const arr = Object.values(notifications.webPushSubscriptions);\n setTimeout(() => chat.put('webPushSubscriptions', arr), 5000);\n this.shareMyPeerUrl(chat);\n }\n chat.onTheir('call', call => {\n local().get('call').put({pub, call});\n });\n local().get('channels').get(pub).put({enabled:true});\n /* Disable private peer discovery, since they're not connecting anyway\n if (chat.onTheir) {\n chat.onTheir('my_peer', (url, k, from) => {\n console.log('Got private peer url', url, 'from', from);\n peers.addPeer({url, from})\n });\n }\n */\n\n });\n },\n\n // TODO: should perhaps be in Channel\n processMessage(chatId: string, msg: any, info: any, onClickNotification?: Function) {\n const chat = privateState(chatId);\n chat.messageIds = chat.messageIds || {};\n if (chat.messageIds[msg.time + info.from]) return;\n chat.messageIds[msg.time + info.from] = true;\n if (info) {\n msg = Object.assign(msg, info);\n }\n if (msg.invite) {\n const chatLink = `https://iris.to/?channelId=${msg.invite.group}&inviter=${chatId}`;\n this.newChannel(msg.invite.group, chatLink);\n return;\n }\n msg.selfAuthored = info.selfAuthored;\n local().get('channels').get(chatId).get('msgs').get(msg.time + (msg.from && msg.from.slice(0, 10))).put(JSON.stringify(msg));\n msg.timeObj = new Date(msg.time);\n if (!info.selfAuthored && msg.timeObj > chat.myLastSeenTime) {\n if (window.location.hash !== `#/chat/${ chatId}` || document.visibilityState !== 'visible') {\n notifications.changeChatUnseenCount(chatId, 1);\n } else if (ourActivity === 'active') {\n chat.setMyMsgsLastSeenTime();\n }\n }\n if (!info.selfAuthored && msg.time > chat.theirMsgsLastSeenTime) {\n local().get('channels').get(chatId).get('theirMsgsLastSeenTime').put(msg.time);\n }\n if (!chat.latestTime || (msg.time > chat.latestTime)) {\n local().get('channels').get(chatId).put({\n latestTime: msg.time,\n latest: {time: msg.time, text: msg.text, selfAuthored: info.selfAuthored}\n });\n }\n // TODO: onclickNotification should do route(`/chat/${ pub}`);\n notifications.notifyMsg(msg, info, chatId, onClickNotification);\n },\n\n subscribeToMsgs(pub) {\n const c = privateState(pub);\n if (c.subscribed) { return; }\n c.subscribed = true;\n c.getMessages((msg, info) => {\n this.processMessage(pub, msg, info);\n });\n },\n\n /**\n * Known private channels with other users\n */\n channelIds: new Set(),\n};\n","import publicSpace from './global';\nimport util from './util';\n\n/**\n * Content-addressed storage\n */\nexport default {\n /**\n * Get a file identified by its hash\n * @param hash\n * @param callback\n * @returns {Promise}\n */\n get(hash: string, callback: Function) {\n return new Promise((resolve, reject) => {\n if (!hash) {\n reject('No hash provided');\n }\n if (typeof hash !== 'string') {\n reject('Hash must be a string');\n }\n publicSpace().get('#').get(hash).on((v: any, _k: string, _x: any, e: any) => {\n if (v) {\n e.off();\n callback && callback(v);\n resolve(v);\n }\n });\n });\n },\n\n /**\n * Store a file and return its hash\n * @param value\n * @returns {Promise}\n */\n async put(value: any) {\n const hash = await util.getHash(value);\n publicSpace().get('#').get(hash).put(value);\n return hash;\n }\n}","// @ts-nocheck\n\n/*jshint unused: false */\n`use strict`;\nimport util from './util';\nimport Attribute from './Attribute';\nimport Key from './Key';\n\nconst errorMsg = `Invalid message:`;\n\nclass ValidationError extends Error {}\n\n/**\n* Signed message object. Your friends can index and relay your messages, while others can still verify that they were signed by you.\n*\n* Fields: signedData, signer (public key) and signature.\n*\n* signedData has an author, signer, type, time and optionally other fields.\n*\n* signature covers the utf8 string representation of signedData. Since messages are digitally signed, users only need to care about the message signer and not who relayed it or whose index it was found from.\n*\n* signer is the entity that verified its origin. In other words: message author and signer can be different entities, and only the signer needs to use Iris.\n*\n* For example, a crawler can import and sign other people's messages from Twitter. Only the users who trust the crawler will see the messages.\n*\n* Constructor: creates a message from the param obj.signedData that must contain at least the mandatory fields: author, type and time.\n* @param obj\n*\n*/\nclass SignedMessage {\n signedData: any;\n pubKey: any;\n sig: any;\n\n constructor(obj: any) {\n this.signedData = obj.signedData;\n this.pubKey = obj.pubKey;\n if (obj.sig) {\n if (typeof obj.sig !== `string`) {\n throw new ValidationError(`SignedMessage signature must be a string`);\n }\n this.sig = obj.sig;\n this.getHash();\n }\n this._validate();\n }\n\n getSignerKeyID() {\n return this.pubKey; // hack until gun supports keyID lookups\n //return util.getHash(this.pubKey);\n }\n\n _validate() {\n if (!this.signedData) {throw new ValidationError(`${errorMsg} Missing signedData`);}\n if (typeof this.signedData !== `object`) {throw new ValidationError(`${errorMsg} signedData must be an object`);}\n const d = this.signedData;\n\n if (!d.type) {throw new ValidationError(`${errorMsg} Missing type definition`);}\n if (!d.author) {throw new ValidationError(`${errorMsg} Missing author`);}\n if (typeof d.author !== `object`) {throw new ValidationError(`${errorMsg} Author must be object`);}\n if (Array.isArray(d.author)) {throw new ValidationError(`${errorMsg} Author must not be an array`);}\n if (Object.keys(d.author).length === 0) {throw new ValidationError(`${errorMsg} Author empty`);}\n if (this.pubKey) {\n this.signerKeyHash = this.getSignerKeyID();\n }\n for (const attr in d.author) {\n const t = typeof d.author[attr];\n if (t !== `string`) {\n if (Array.isArray(d.author[attr])) {\n for (let i = 0;i < d.author[attr].length;i++) {\n if (typeof d.author[attr][i] !== `string`) {throw new ValidationError(`${errorMsg} Author attribute must be string, got ${attr}: [${d.author[attr][i]}]`);}\n if (d.author[attr][i].length === 0) {\n throw new ValidationError(`${errorMsg} author ${attr} in array[${i}] is empty`);\n }\n }\n } else {\n throw new ValidationError(`${errorMsg} Author attribute must be string or array, got ${attr}: ${d.author[attr]}`);\n }\n }\n if (attr === `keyID`) {\n if (t !== `string`) {throw new ValidationError(`${errorMsg} Author keyID must be string, got ${t}`);}\n if (this.signerKeyHash && d.author[attr] !== this.signerKeyHash) {throw new ValidationError(`${errorMsg} If message has a keyID author, it must be signed by the same key`);}\n }\n }\n if (d.recipient) {\n if (typeof d.recipient !== `object`) {throw new ValidationError(`${errorMsg} Recipient must be object`);}\n if (Array.isArray(d.recipient)) {throw new ValidationError(`${errorMsg} Recipient must not be an array`);}\n if (Object.keys(d.recipient).length === 0) {throw new ValidationError(`${errorMsg} Recipient empty`);}\n for (const attr in d.recipient) {\n const t = typeof d.recipient[attr];\n if (t !== `string`) {\n if (Array.isArray(d.recipient[attr])) {\n for (let i = 0;i < d.recipient[attr].length;i++) {\n if (typeof d.recipient[attr][i] !== `string`) {throw new ValidationError(`${errorMsg} Recipient attribute must be string, got ${attr}: [${d.recipient[attr][i]}]`);}\n if (d.recipient[attr][i].length === 0) {\n throw new ValidationError(`${errorMsg} recipient ${attr} in array[${i}] is empty`);\n }\n }\n } else {\n throw new ValidationError(`${errorMsg} Recipient attribute must be string or array, got ${attr}: ${d.recipient[attr]}`);\n }\n }\n }\n }\n if (!(d.time || d.timestamp)) {throw new ValidationError(`${errorMsg} Missing time field`);}\n\n if (!Date.parse(d.time || d.timestamp)) {throw new ValidationError(`${errorMsg} Invalid time field`);}\n\n return true;\n }\n\n /**\n * @param {Object} key keypair to sign the message with\n */\n async sign(key) {\n this.sig = await Key.sign(this.signedData, key);\n this.pubKey = key.pub;\n await this.getHash();\n return true;\n }\n\n /**\n * Create an iris message. SignedMessage time is automatically set. If signingKey is specified and author omitted, signingKey will be used as author.\n * @param {Object} signedData message data object including author, recipient and other possible attributes\n * @param {Object} signingKey optionally, you can set the key to sign the message with\n * @returns {Promise} message\n */\n static async create(signedData, signingKey) {\n if (!signedData.author && signingKey) {\n signedData.author = {keyID: Key.getId(signingKey)};\n }\n signedData.time = signedData.time || (new Date()).toISOString();\n const m = new SignedMessage({signedData});\n if (signingKey) {\n await m.sign(signingKey);\n }\n return m;\n }\n\n getAuthor(index) {\n for (const a of this.getAuthorIterable()) {\n if (a.isUniqueType()) {\n return index.getContacts(a);\n }\n }\n }\n\n getRecipient(index) {\n if (!this.signedData.recipient) {\n return undefined;\n }\n for (const a of this.getRecipientIterable()) {\n if (a.isUniqueType()) {\n return index.getContacts(a);\n }\n }\n }\n\n /**\n * @returns {string} base64 sha256 hash of message\n */\n async getHash() {\n if (this.sig && !this.hash) {\n this.hash = await util.getHash(this.sig);\n }\n return this.hash;\n }\n\n getId() {\n return this.getHash();\n }\n\n static async fromSig(obj) {\n if (!obj.sig) {\n throw new Error(`Missing signature in object:`, obj);\n }\n if (!obj.pubKey) {\n throw new Error(`Missing pubKey in object:`);\n }\n //const signedData = await Key.verify(obj.sig, obj.pubKey); // disable sig verification while migrating to new gun :(\n const signedData = JSON.parse(obj.sig.slice(4)).m;\n const o = {signedData, sig: obj.sig, pubKey: obj.pubKey};\n return new SignedMessage(o);\n }\n\n /**\n * @return {boolean} true if message signature is valid. Otherwise throws ValidationError.\n */\n async verify() {\n if (!this.pubKey) {\n throw new ValidationError(`${errorMsg} SignedMessage has no .pubKey`);\n }\n if (!this.sig) {\n throw new ValidationError(`${errorMsg} SignedMessage has no .sig`);\n }\n this.signedData = await Key.verify(this.sig, this.pubKey);\n if (!this.signedData) {\n throw new ValidationError(`${errorMsg} Invalid signature`);\n }\n if (this.hash) {\n if (this.hash !== (await util.getHash(this.sig))) {\n throw new ValidationError(`${errorMsg} Invalid message hash`);\n }\n } else {\n this.getHash();\n }\n return true;\n }\n\n /**\n * @returns {string}\n */\n serialize() {\n return {sig: this.sig, pubKey: this.pubKey};\n }\n\n toString() {\n return JSON.stringify(this.serialize());\n }\n\n /**\n * @returns {Promise}\n */\n static async deserialize(s) {\n return SignedMessage.fromSig(s);\n }\n\n static async fromString(s) {\n return SignedMessage.fromSig(JSON.parse(s));\n }\n}\n\nexport default SignedMessage;\n","/*eslint no-useless-escape: \"off\", camelcase: \"off\" */\n\nimport session from './session';\nimport peers from './peers';\nimport util from './util';\nimport local from './local';\nimport global from './global';\nimport publicState from './public';\nimport group from './group';\nimport electron from './electron';\nimport privateState from './private';\nimport staticState from './static';\nimport notifications from './notifications';\n\nimport SignedMessage from './SignedMessage';\nimport Channel from './Channel';\nimport Node from './db/Node';\nimport Key from './Key';\n\nexport default {\n local,\n global,\n group,\n public: publicState,\n private: privateState,\n static: staticState,\n electron,\n peers,\n session,\n util,\n notifications,\n SignedMessage,\n Channel,\n Node,\n Key\n};"],"names":["_","throttle","func","limit","inThrottle","args","arguments","context","apply","setTimeout","debounce","inDebounce","clearTimeout","sample","arr","Math","floor","random","length","sampleSize","size","shuffled","slice","i","min","temp","index","defer","once","called","omit","obj","keys","newObj","Object","forEach","key","includes","defaults","undefined","pickBy","predicate","isEqual","a","b","Date","getTime","prototype","every","k","uniq","set","Set","Array","from","isNode","toString","call","global","process","e","userAgent","navigator","toLowerCase","isElectron","indexOf","isMobile","check","test","substr","vendor","gunOnceDefined","node","Promise","resolve","on","val","_k","_a","eve","off","animals","adjectives","getHash","data","format","Error","JSON","stringify","encoder","TextEncoder","encode","crypto","subtle","digest","buffer","hash","arrayBufferToBase64","base64ToHex","capitalize","s","charAt","toUpperCase","generateName","str","raw","atob","result","hex","charCodeAt","binary","bytes","Uint8Array","len","byteLength","String","fromCharCode","window","btoa","getCaret","el","selectionStart","document","selection","focus","r","createRange","re","createTextRange","rc","duplicate","moveToBookmark","getBookmark","setEndPoint","text","getUrlParameter","sParam","sParams","sPageURL","location","search","substring","sURLVariables","split","sParameterName","decodeURIComponent","formatTime","date","t","toLocaleTimeString","timeStyle","formatDate","toLocaleString","dateStyle","getDaySeparatorText","dateStr","now","nowStr","toLocaleDateString","dayDifference","round","weekday","getProfileLink","pub","origin","encodeURIComponent","truncateString","createElement","type","cls","parent","setAttribute","appendChild","delay","myKey","getActiveKey","datadir","keyfile","fs","privKeyFile","existsSync","f","readFileSync","fromString","generate","newKey","writeFileSync","chmodSync","localStorage","getItem","setItem","getDefault","getActivePub","setActiveKey","save","util","getId","parse","ecdhSubtle","generateKey","name","namedCurve","then","exportKey","privateKey","priv","d","publicKey","x","y","sa","epriv","epub","dh","console","log","keyToJwk","jwk","kty","crv","ext","key_ops","sign","pair","cb","opt","importKey","sig","m","Buffer","verify","buf","isValid","secret","keysToEcdhJwk","assign","pubJwk","props","privJwk","privKey","deriveBits","derivedBits","rawBits","derivedKey","aeskey","salt","combo","keyB64","replace","jwkKey","alg","getRandomValues","encrypt","msg","rand","iv","aes","ct","decrypt","json","bufiv","bufct","tagLength","TextDecoder","decode","_e","ELECTRON_GUN_URL","maxConnectedPeers","DEFAULT_PEERS","self","loc","host","is_localhost_but_not_dev","startsWith","hostname","endsWith","url","enabled","known","add","peer","visibility","Key","session","getKey","encryptedUrl","encryptedUrlHash","publicState","user","get","put","lastSeen","toISOString","connect","remove","disconnect","peerFromGun","getSaved","p","reset","isMixedContent","peers","disable","protocol","connectToLocalElectron","max","push","checkGunPeerCount","init","setInterval","generateUuid","c","v","Actor","id","handle","_message","postMessage","message","Message","fromObject","Get","Put","deserialize","dam","Hi","serialize","generateMsgId","nodeId","recipients","childKey","jsonStr","checksum","updatedNodes","inResponseTo","entries","children","myNodeId","childValue","value","updatedAt","isUserSpace","signatureObj","timestamp","signedObj","signature","signedStr","newFromKv","peerId","Memory","config","QuickLRU","maxSize","handlePut","handleGet","store","putMessage","mergeAndSave","nodeName","existing","asap","Dexie","Debug.debug","Debug.getErrorWithStack","safari14Workaround","_Dexie","Debug.setDebug","MyDexie","dbName","version","stores","nodes","table","IndexedDB","putQueue","values","map","notStored","db","bulkPut","err","error","queue","getQueue","bulkGet","callbacks","callback","open","stack","throttledPut","path","throttledGet","has","savePath","Websocket","router","ws","WebSocket","onopen","sendQueue","send","onmessage","event","onclose","onerror","readyState","OPEN","CONNECTING","Router","Map","storageAdapters","serverPeers","seenMessages","sendTo","topic","join","subscribers","subscribersByTopic","storageAdapter","subscriber","actor","opts","DEFAULT_CONFIG","allowPublicSpace","enableStats","localOnly","Node","on_subscriptions","once_subscriptions","map_subscriptions","root","webSocketPeers","getCurrentUser","currentUser","setCurrentUser","childData","doCallbacks","newNode","auth","isArray","signIfNeeded","addParentNodes","signed","childName","pop","parentId","request","counter","globalState","myOpts","retry","Infinity","UNIQUE_ID_VALIDATORS","email","bitcoin","bitcoin_address","ip","ipv6","gpg_fingerprint","gpg_keyid","google_oauth2","tel","phone","keyID","account","uuid","Attribute","guessTypeOf","getUuid","getUniqueIdValidators","isUniqueType","match","equals","uri","userSpace","DEFAULT_PERMISSIONS","read","write","admin","Channel","options","myGroupSecret","chatLink","useChatLink","participants","addParticipant","o","founder","getChatLinks","subscribe","putDirect","getMyGroupSecret","getMySecretUuid","onTheirDirect","theirSecretUuids","theirGroupSecrets","onTheir","hasAdmin","inviter","participantsChanged","saved","chatWith","channelId","sharedSecret","linkId","encrypted","sharedKey","encryptedChatRequest","channelRequestId","getTheirSecretUuid","getTheirGroupSecret","changeMyGroupSecret","mute","participant","block","secrets","ourSecretChannelIds","theirSecretChannelIds","mySecretUuid","mySecret","mySecretHash","getCurrentParticipants","getParticipants","getParticipantsCallbackId","getParticipantsCallbacks","getSecret","getOurSecretChannelId","getTheirSecretChannelId","getChannels","listenToChatLinks","keypair","getMyChatLinks","seen","handleChannel","ourSecretChannelId","encryptedChatId","chatId","getMessages","theirSecretChannelId","messageReceived","userState","selfAuthored","messages","decrypted","info","getLatestMsg","callbackIfLatest","latest","time","onMy","setMyMsgsLastSeenTime","getMyMsgsLastSeenTime","myMsgsLastSeenTime","getTheirMsgsLastSeenTime","theirMsgsLastSeenTime","removeParticipant","permissions","directSubscriptions","_onTheirDirectFromUser","groupSubscriptions","_onTheirGroupFromUser","trim","putGroup","onGroup","onDirect","onMyGroup","onTheirGroup","onMyDirect","hasWritePermission","hasOwnProperty","subscription","theirSecretUuid","_b","setTyping","isTyping","timeout","setTypingTimeout","getTyping","typing","getTypingTimeouts","getSimpleLink","urlRoot","chatLinks","chatLinkSubscriptions","links","link","channels","formatChatLink","encPub","requestId","createChatLink","sharedKeyString","encryptedSharedKey","ownerSecret","ownerEncryptedSharedKey","setActivity","activity","irisActivityStatus","setActivityTimeout","update","status","timerUpdate","getActivity","pubKey","activityDate","isActive","lastActive","isOnline","enc","channel","removeGroupChatLink","removePrivateChatLink","deleteChannel","deleteGroup","local","blockedUsers","isBlocked","_v","cache","groupName","groupNode","follows","requestAnimationFrame","isFollowing","reduce","sum","_cached_map","cached","cacheKey","myEvent","item","_cached_on","_cached_count","count","_cached_fn","fn","callbackId","myCallbacks","NOTIFICATION_SERVICE_URL","loginTime","unseenMsgsTotal","unseenNotificationCount","webPushSubscriptions","desktopNotificationsEnabled","Notification","permission","notifyMsg","onClick","shouldNotify","timeObj","visibilityState","privateState","notificationSetting","getMyName","shouldDesktopNotify","shouldAudioNotify","body","title","participantProfiles","desktopNotification","icon","silent","onclick","changeUnseenNotificationCount","changeChatUnseenMsgsCount","change","chat","chatNode","unseen","publicVapidKey","urlBase64ToUint8Array","base64String","padding","repeat","base64","rawData","outputArray","reg","pushManager","userVisibleOnly","applicationServerKey","addWebPushSubscription","subscribeToWebPush","serviceWorker","ready","getRegistration","active","getSubscription","sub","addWebPushSubscriptionsToChats","channelIds","removeSubscription","saveToGun","getWebPushSubscriptions","getEpub","getNotificationText","notification","profile","action","eventText","subscribeToIrisNotifications","notificationsSeenTime","notificationsShownTime","setNotificationsShownTime","alreadyHave","group","getPubKey","encryptedNotification","target","sendIrisNotification","recipient","sendWebPushNotification","shouldWebPush","subscriptions","payload","endpoint","fetch","method","headers","changeChatUnseenCount","hasOwn","electron","myName","latestChatLink","onlineTimeout","ourActivity","noFollows","noFollowers","searchIndex","initCalled","searchableItems","getExtendedFollowsCalled","DEFAULT_FOLLOW","DEFAULT_SETTINGS","openAtLogin","minimizeOnClose","enableWebtorrent","enablePublicPeerDiscovery","autoplayWebtorrent","localStorageKey","login","autologin","loginAsNewUser","clearIndexedDB","updateSearchIndex","taskQueue","shift","includeScore","includeMatches","threshold","Fuse","leading","saveSearchResult","followDistance","followerCount","followers","addFollow","follower","updateNoFollows","updateNoFollowers","removeFollow","getExtendedFollows","maxDepth","currentDepth","followedKey","getSearchIndex","setOurOnlineStatus","activeRoute","setActive","addEventListener","pathname","notifications","updateGroups","shouldRefresh","addChannel","settings","reload","l","autofollow","logOut","unsubscribe","clear","href","r1","indexedDB","deleteDatabase","r2","r1done","r2done","onsuccess","getMyChatLink","myPeerUrl","shareMyPeerUrl","myIp","newChannel","latestTime","theirMsgsLastSeenDate","processMessage","myLastSeenTime","online","theirLastActiveTime","isDarkMode","matchMedia","matches","photo","hue","color","inviteLinks","onClickNotification","messageIds","invite","subscribeToMsgs","subscribed","reject","publicSpace","_x","errorMsg","ValidationError","SignedMessage","signedData","_validate","getSignerKeyID","author","signerKeyHash","attr","create","signingKey","getAuthor","getAuthorIterable","getContacts","getRecipient","getRecipientIterable","fromSig","staticState"],"mappings":"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"} \ No newline at end of file diff --git a/dist/iris.umd.production.min.js b/dist/iris.umd.production.min.js index 3682c91..af14625 100644 --- a/dist/iris.umd.production.min.js +++ b/dist/iris.umd.production.min.js @@ -1,2 +1,2 @@ -!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("fs"),require("path"),require("aws-sdk"),require("url"),require("events"),require("https"),require("http"),require("net"),require("tls"),require("crypto"),require("stream"),require("zlib"),require("bufferutil"),require("utf-8-validate"),require("dgram"),require("os"),require("child_process")):"function"==typeof define&&define.amd?define(["exports","fs","path","aws-sdk","url","events","https","http","net","tls","crypto","stream","zlib","bufferutil","utf-8-validate","dgram","os","child_process"],t):t((e=e||self).iris={},e.fs,e.path$1,e.awsSdk,e.url,e.events,e.https,e.http,e.net,e.tls,e.crypto,e.stream$1,e.zlib,e.bufferutil,e.utf8Validate,e.dgram,e.os,e.child_process)}(this,(function(e,t,n,r,i,o,a,s,c,u,l,f,h,p,d,g,y,v){"use strict";t=t&&Object.prototype.hasOwnProperty.call(t,"default")?t.default:t,n=n&&Object.prototype.hasOwnProperty.call(n,"default")?n.default:n,r=r&&Object.prototype.hasOwnProperty.call(r,"default")?r.default:r,i=i&&Object.prototype.hasOwnProperty.call(i,"default")?i.default:i,o=o&&Object.prototype.hasOwnProperty.call(o,"default")?o.default:o,a=a&&Object.prototype.hasOwnProperty.call(a,"default")?a.default:a,s=s&&Object.prototype.hasOwnProperty.call(s,"default")?s.default:s,c=c&&Object.prototype.hasOwnProperty.call(c,"default")?c.default:c,u=u&&Object.prototype.hasOwnProperty.call(u,"default")?u.default:u,l=l&&Object.prototype.hasOwnProperty.call(l,"default")?l.default:l,f=f&&Object.prototype.hasOwnProperty.call(f,"default")?f.default:f,h=h&&Object.prototype.hasOwnProperty.call(h,"default")?h.default:h,p=p&&Object.prototype.hasOwnProperty.call(p,"default")?p.default:p,d=d&&Object.prototype.hasOwnProperty.call(d,"default")?d.default:d,g=g&&Object.prototype.hasOwnProperty.call(g,"default")?g.default:g,y=y&&Object.prototype.hasOwnProperty.call(y,"default")?y.default:y,v=v&&Object.prototype.hasOwnProperty.call(v,"default")?v.default:v;var m="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function b(e,t){return e(t={exports:{}},t.exports),t.exports}function w(){throw new Error("Dynamic requires are not currently supported by @rollup/plugin-commonjs")}b((function(e){!function(){var t,n={},r=setTimeout.turn||typeof setImmediate!=""+t&&setImmediate||setTimeout;function i(e){var t=parseFloat(e);return isNaN(t)?"true"==(e=e.trim())||"false"!=e&&("null"==e?null:void 0):t}n.parseAsync=function(e,n,o,a){if("string"==typeof e){var s={i:0,text:e,done:n,l:e.length,up:[]};a=a||32768,function n(){for(var o,c,u=s.text,l=s.i,f=s.l,h=0,p=s.w;h++f){s.end=!0;break}if(p){for(l=u.indexOf('"',l-1),d=u[l],c=0;"\\"==u[l-++c];);c=!(c%2),o=o||c,'"'!=d||c||(p=t,c=s.s,s.a?(c=u.slice(s.sl,l),(o||1+c.indexOf("\\"))&&(c=JSON.parse('"'+c+'"')),s.at instanceof Array?s.at.push(s.s=c):(s.at||(s.end=h=a,c=t),(s.at||{})[s.s]=s.s=c),s.s=t):(s.s=u.slice(s.sl,l),(o||1+s.s.indexOf("\\"))&&(s.s=JSON.parse('"'+s.s+'"'))),s.a=o=t),++l}else switch(d){case'"':s.sl=l,p=!0;break;case":":s.ai=l,s.a=!0;break;case",":(s.a||s.at instanceof Array)&&(c=u.slice(s.ai,l-1))&&t!==(c=i(c))&&(s.at instanceof Array?s.at.push(c):s.at[s.s]=c),s.a=t,s.at instanceof Array&&(s.a=!0,s.ai=l);break;case"{":s.up.push(s.at||(s.at={})),s.at instanceof Array?s.at.push(s.at={}):t!==(c=s.s)&&(s.at[c]=s.at={}),s.a=t;break;case"}":s.a&&(c=u.slice(s.ai,l-1))&&t!==(c=i(c))&&(s.at instanceof Array?s.at.push(c):(s.at||(s.end=h=a,c=t),(s.at||{})[s.s]=c)),s.a=t,s.at=s.up.pop();break;case"[":t!==(c=s.s)?(s.up.push(s.at),s.at[c]=s.at=[]):s.at||s.up.push(s.at=[]),s.a=!0,s.ai=l;break;case"]":s.a&&(c=u.slice(s.ai,l-1))&&t!==(c=i(c))&&(s.at instanceof Array?s.at.push(c):s.at[s.s]=c),s.a=t,s.at=s.up.pop()}}if(s.s=t,s.i=l,s.w=p,s.end){if(t===(c=s.at))try{c=JSON.parse(e)}catch(e){return s.done(e)}s.done(t,c)}else r(n)}()}else try{n(t,JSON.parse(e))}catch(e){n(e)}},n.stringifyAsync=function(e,n,i,o,a){(a=a||{}).text=a.text||"",a.up=[a.at={d:e}],a.done=n,a.i=0;var s=0;!function e(){var n,i=a.at,o=i.d,c="";switch(i.i&&i.i-i.j>0&&(c+=","),t!==(n=i.k)&&(c+=JSON.stringify(n)+":"),typeof o){case"boolean":c+=""+o;break;case"string":c+=JSON.stringify(o);break;case"number":c+=isNaN(o)?"null":o;break;case"object":if(!o){c+="null";break}if(o instanceof Array){c+="[",(i={i:-1,as:o,up:i,j:0}).l=o.length,a.up.push(a.at=i);break}if("function"!=typeof(o||"").toJSON){c+="{",(i={i:-1,ok:Object.keys(o).sort(),as:o,up:i,j:0}).l=i.ok.length,a.up.push(a.at=i);break}if(n=o.toJSON()){c+=n;break}case"function":if(i.as instanceof Array){c+="null";break}default:c="",i.j++}for(a.text+=c;1+i.i>=i.l;)a.text+=i.ok?"}":"]",i=a.at=i.up;if(++i.i0;)n+=t.charAt(Math.floor(Math.random()*t.length));return n},String.match=function(e,t){var n,r;return"string"==typeof e&&("string"==typeof t&&(t={"=":t}),e===(n=(t=t||{})["="]||t["*"]||t[">"]||t["<"])||r===t["="]&&(e.slice(0,((n=t["*"]||t[">"])||"").length)===n||r===t["*"]&&(r!==t[">"]&&r!==t["<"]?e>=t[">"]&&e<=t["<"]:r!==t[">"]&&e>=t[">"]||r!==t["<"]&&e<=t["<"])))},String.hash=function(e,t){if("string"==typeof e){if(t=t||0,!e.length)return t;for(var n=0,r=e.length;n=o.now()-n&&r++<3333?e():i((function(){n=o.now(),e()}),r=0)}}(),n=setTimeout,r=n.turn=n.turn||function(e){1==i.push(e)&&o(s)},i=r.s=[],o=n.poll,a=0,s=function(){(t=i[a++])&&t(),a!=i.length&&99!=a||(i=r.s=i.slice(a),a=0),i.length&&o(s)},function(){var e,t=setTimeout,n=t.turn;(t.each=t.each||function(t,r,i,o){o=o||9,function a(s,c,u){if(c=(s=(t||[]).splice(0,o)).length){for(var l=0;l"]||n;if(r)return"number"==typeof(r=r[t])?r:i},n.ify=function(e,t,n,i,o){(e=e||{})._=e._||{},o&&(e._["#"]=o);var a=e._[">"]||(e._[">"]={});return r!==t&&"_"!==t&&("number"==typeof n&&(a[t]=n),r!==i&&(e[t]=i)),e},e.exports=n}))(t,"./state"),t((function(e){t("./shim"),e.exports=function(e){var t={s:{}},n=t.s;e=e||{max:999,age:9e3},t.check=function(e){return!!n[e]&&r(e)};var r=t.track=function(i){var o=n[i]||(n[i]={});return o.was=t.now=+new Date,t.to||(t.to=setTimeout(t.drop,e.age+9)),r.ed&&r.ed(i),o};return t.drop=function(r){t.to=null,t.now=+new Date;var i=Object.keys(n);console.STAT&&console.STAT(t.now,+new Date-t.now,"dup drop keys"),setTimeout.each(i,(function(i){var o=n[i];o&&(r||e.age)>t.now-o.was||delete n[i]}),0,99)},t}}))(t,"./dup"),t((function(e){t("./onto"),e.exports=function(e,t){if(this.on){var r=(this.opt||{}).lack||9e3;if("function"!=typeof e){if(!e)return;var i=(this.tag||"")[o=e["#"]||e];if(!i)return;return t&&(i=this.on(o,t),clearTimeout(i.err),i.err=setTimeout((function(){i.off()}),r)),!0}var o=t&&t["#"]||n(9);if(!e)return o;var a=this.on(o,e,t);return a.err=a.err||setTimeout((function(){a.off(),a.next({err:"Error: No ACK yet.",lack:!0})}),r),o}};var n=String.random||function(){return Math.random().toString(36).slice(2)}}))(t,"./ask"),t((function(e){function r(e){return e instanceof r?(this._={$:this}).$:this instanceof r?r.create(this._={$:this,opt:e}):new r(e)}r.is=function(e){return e instanceof r||e&&e._&&e===e._.$||!1},r.version=.202,(r.chain=r.prototype).toJSON=function(){},t("./shim"),r.valid=t("./valid"),r.state=t("./state"),r.on=t("./onto"),r.dup=t("./dup"),r.ask=t("./ask"),function(){function e(n){if(n)if(n.out!==e){var i,o=this.as,c=o.at||o,u=c.$,l=c.dup,f=n.DBG;if((i=n["#"])||(i=n["#"]=s(9)),!l.check(i)){if(l.track(i),n._="function"==typeof(i=n._)?i:function(){},n.$&&n.$===(n.$._||"").$||(n.$=u),n["@"]&&!n.put&&function(e){var t,n=e["@"]||"";if(t=n._)t.acks=(t.acks||0)+1,(t.err=e.err)&&(e["@"]=t["#"],a(t)),t.ok=e.ok||t.ok,t.stop||t.crack||(t.crack=t.match&&t.match.push((function(){p(t)}))),p(t);else{var r=(r=e.$)&&(r=r._)&&(r=r.root)&&(r=r.dup);if(!(r=r.check(n)))return;e["@"]=r["#"]||e["@"]}}(n),!c.ask(n["@"],n)){if(f&&(f.u=+new Date),n.put)return void t(n);n.get&&r.on.get(n,u)}f&&(f.uc=+new Date),this.to.next(n),f&&(f.ua=+new Date),n.nts||n.NTS||(n.out=e,c.on("out",n),f&&(f.ue=+new Date))}}else this.to.next(n)}function t(t){if(t){var r=t._||"",o=r.root=((r.$=t.$||"")._||"").root;if(t["@"]&&r.faith&&!r.miss)return t.out=e,void o.on("out",t);r.latch=o.hatch,r.match=o.hatch=[];var s=t.put,l=r.DBG=t.DBG,f=+new Date;if(d=d||f,!s["#"]||!s["."]){l&&(l.p=f),r["#"]=t["#"],r.msg=t,r.all=0,r.stun=1;var h=Object.keys(s);console.STAT&&console.STAT(f,((l||r).pk=+new Date)-f,"put sort");var p,v,m,b,k,x,_,S=0;!function e(o){if(p!=S){if(p=S,!(m=h[S]))return console.STAT&&console.STAT(f,((l||r).pd=+new Date)-f,"put"),void a(r);(b=s[m])?(_=b._)?m!==_["#"]?x=g+y(m)+"soul not same.":(k=_[">"])||(x=g+y(m)+"no state."):x=g+y(m)+"no meta.":x=g+y(m)+"no node.",v=Object.keys(b||{})}if(x)return t.err=r.err=x,void a(r);var d,E=0;for(o=o||0;o++<9&&(d=v[E++]);)if("_"!==d){var T=b[d],O=k[d];if(i===O){x=g+y(d)+"on"+y(m)+"no state.";break}if(!u(T)){x=g+y(d)+"on"+y(m)+"bad "+typeof T+y(T);break}n(T,d,m,O,t),++w}(v=v.slice(E)).length?c(e):(++S,v=null,e(o))}()}}}function n(e,t,r,i,o){var a,s=o._||"",c=s.root,u=c.graph,f=u[r]||h,p=l(f,t,1),d=f[t],g=s.DBG;(a=console.STAT)&&(u[r]&&d||(a.has=(a.has||0)+1));var y=b();if(i>y)return setTimeout((function(){n(e,t,r,i,o)}),(a=i-y)>m?m:a),void(console.STAT&&console.STAT((g||s).Hf=+new Date,a,"future"));if(!(i":i},ok:o.ok,_:s})}}function o(e){var t;(t=(e._||"").DBG)&&(t.pa=+new Date,t.pm=t.pm||+new Date);var n,r=this.as,i=r.graph,o=e._,s=e.put,c=s["#"],u=s["."],l=s[":"],h=s[">"];(n=o.msg)&&(n=n.put)&&(n=n[c])&&f(n,u,h,l,c),i[c]=f(i[c],u,h,l,c),(n=(r.next||"")[c])&&n.on("in",e),a(o),this.to.next(e)}function a(t,n){var r;if(!t.stop&&(t.err||!(0<--t.stun))&&(t.stop=1,r=t.root)){var i=t.match;i.end=1,i===r.hatch&&(!(i=t.latch)||i.end?delete r.hatch:r.hatch=i),t.hatch&&t.hatch(),setTimeout.each(t.match,(function(e){e&&e()})),!(n=t.msg)||t.err||n.err||(n.out=e,t.root.on("out",n),k())}}function p(e){e&&e.root&&(e.stun||e.acks!==e.all||e.root.on("in",{"@":e["#"],err:e.err,ok:e.err?i:e.ok||{"":1}}))}r.create=function(t){t.root=t.root||t,t.graph=t.graph||{},t.on=t.on||r.on,t.ask=t.ask||r.ask,t.dup=t.dup||r.dup();var n=t.$.opt(t.opt);return t.once||(t.on("in",e,t),t.on("out",e,t),t.on("put",o,t),r.on("create",t),t.on("create",t)),t.once=1,n},r.on.put=t;var d,g="Error: Invalid graph!",y=function(e){return" '"+(""+e).slice(0,9)+"...' "},v=JSON.stringify,m=2147483647,b=r.state,w=0,k=function(){w>999&&w/-(d-(d=+new Date))>1&&(r.window&&console.log("Warning: You're syncing 1K+ records a second, faster than DOM can update - consider limiting query."),k=function(){w=0})}}(),function(){function e(e,t){var n=+new Date,r=e._||{},o=r.DBG=e.DBG,a=e["#"],c=s(9),u=Object.keys(t||"").sort(),h=((t||"")._||"")["#"],p=e.$._.root,d=t===p.graph[h];console.STAT&&console.STAT(n,((o||r).gk=+new Date)-n,"got keys"),t&&function e(){n=+new Date;for(var r,g,y,v=0,m={};v<9&&(r=u[v++]);)f(m,r,l(t,r),t[r],h);u=u.slice(v),(g={})[h]=m,m=g,d&&((y=function(){}).ram=y.faith=!0),g=u.length,console.STAT&&console.STAT(n,-(n-(n=+new Date)),"got copied some"),o&&(o.ga=+new Date),p.on("in",{"@":a,"#":c,put:m,"%":g?c=s(9):i,$:p.$,_:y,DBG:o,FOO:1}),console.STAT&&console.STAT(n,+new Date-n,"got in"),g&&setTimeout.turn(e)}(),t||p.on("in",{"@":e["#"]})}(r.on.get=function(t,n){var r=n._,o=t.get,a=o["#"],s=r.graph[a],c=o["."],u=(r.next||(r.next={}))[a],h=(t._||{}).DBG=t.DBG;if(h&&(h.g=+new Date),!s)return r.on("get",t);if(c){if(("string"!=typeof c||i===s[c])&&!((u||"").next||"")[c])return void r.on("get",t);s=f({},c,l(s,c),s[c],a)}s&&e(t,s),r.on("get",t)}).ack=e}(),r.chain.opt=function(e){var t=this._,n=(e=e||{}).peers||e;return Object.plain(e)||(e={}),Object.plain(t.opt)||(t.opt=e),"string"==typeof n&&(n=[n]),Object.plain(t.opt.peers)||(t.opt.peers={}),n instanceof Array&&(e.peers={},n.forEach((function(n){var r={};r.id=r.url=n,e.peers[n]=t.opt.peers[n]=t.opt.peers[n]||r}))),a(e,(function e(t){var n=this[t];this&&this.hasOwnProperty(t)||"string"==typeof n||Object.empty(n)?this[t]=n:(!n||n.constructor===Object||n instanceof Array)&&a(n,e)})),t.opt.from=e,r.on("opt",t),t.opt.uuid=t.opt.uuid||function(e){return r.state().toString(36).replace(".","")+String.random(e||12)},this};var i,o,a=function(e,t){Object.keys(e).forEach(t,e)},s=String.random,c=setTimeout.turn,u=r.valid,l=r.state.is,f=r.state.ify,h={};(r.log=function(){return!r.log.off&&o.log.apply(o,arguments),[].slice.call(arguments).join(" ")}).once=function(e,t,n){return(n=r.log.once)[e]=n[e]||0,n[e]++||r.log(t)},"undefined"!=typeof window&&((window.GUN=window.Gun=r).window=window);try{void 0!==n&&(n.exports=r)}catch(e){}e.exports=r,(r.window||{}).console=(r.window||{}).console||{log:function(){}},(o=console).only=function(e,t){return o.only.i&&e===o.only.i&&o.only.i++&&(o.log.apply(o,arguments)||t)},r.log.once("welcome","Hello wonderful person! :) Thanks for using GUN, please ask for help on http://chat.gun.eco if anything takes you longer than 5min to figure out!")}))(t,"./root"),t((function(e){t("./root").chain.back=function(e,t){if(-1===(e=e||1)||Infinity===e)return this._.root.$;if(1===e)return(this._.back||this._).$;var i=this._;if("string"==typeof e&&(e=e.split(".")),e instanceof Array){for(var o=0,a=e.length,s=i;o":h(s.graph[i.soul],t)}}),n))return}else{if(n=i.ask&&i.ask[""],(i.ask||(i.ask={}))[""]=i,a!==i.put&&(i.on("in",i),n))return;e.$=i.$}return s.ask(o,e),s.on("in",e)}if(t["."])return r.get?(e={get:{".":r.get},$:r.$},(i.ask||(i.ask={}))[r.get]=e.$._,i.on("out",e)):i.on("out",e={get:r.lex?e.get:{},$:r.$});if((r.ask||(r.ask={}))[""]=r,r.get)return t["."]=r.get,(i.ask||(i.ask={}))[r.get]=e.$._,i.on("out",e)}return i.on("out",e)}r.on("in",{put:r.put=a,$:r.$})},n.on.in=function(e,t){var n,o=(t=t||this.as).root,c=e.$||(e.$=t.$),l=(c||"")._||s,f=e.put||"",d=f["#"],g=f["."],y=a!==f["="]?f["="]:f[":"],v=f[">"]||-Infinity;if(a!==e.put&&(a===f["#"]||a===f["."]||a===f[":"]&&a===f["="]||a===f[">"]))return u(f)?void t.on("in",{$:l.back.$,put:{"#":d=l.back.soul,".":g=l.has||l.get,"=":f,">":h(l.back.put,g)},via:e}):(d=((f||"")._||"")["#"])?(c=t.root.$.get(d),setTimeout.each(Object.keys(f).sort(),(function(n){"_"!=n&&a!==(v=h(f,n))&&t.on("in",{$:c,put:{"#":d,".":n,"=":f[n],">":v},VIA:e})}))):void console.log("chain not yet supported for",f,"...",e,t);(e.seen||"")[t.id]||((e.seen||(e.seen=function(){}))[t.id]=t,t!==l&&(Object.keys(e).forEach((function(t){f[t]=e[t]}),f={}),f.get=t.get||f.get,t.soul||t.has?l.soul&&(f.$=t.$,f.$$=f.$$||l.$):f.$$$=f.$$$||t.$,e=f),i(e,t),(t.soul||e.$$)&&v>=h(o.graph[d],g)&&((f=o.$.get(d)._).put=p(f.put,g,v,y,d)),!l.soul&&v>=h(o.graph[d],g)&&(n=(o.$.get(d)._.next||"")[g])&&(n.put=y,"string"==typeof(f=u(y))&&(n.put=o.$.get(f)._.put||y)),this.to&&this.to.next(e),t.any&&setTimeout.each(Object.keys(t.any),(function(n){(n=t.any[n])&&n(e)}),0,99),t.echo&&setTimeout.each(Object.keys(t.echo),(function(n){(n=t.echo[n])&&n.on("in",e)}),0,99),((e.$$||"")._||l).soul&&(n=t.next)&&(n=n[g])&&(f={},Object.keys(e).forEach((function(t){f[t]=e[t]})),f.$=(e.$$||e.$).get(f.get=g),delete f.$$,delete f.$$$,n.on("in",f)),r(e,t))},n.on.link=r,n.on.unlink=i;var a,s={},c=String.random,u=n.valid,l=function(e,t){return e&&Object.prototype.hasOwnProperty.call(e,t)},f=n.state,h=f.is,p=f.ify}))(t,"./chain"),t((function(e){var n=t("./root");function r(e){var t,n=this.at||this.on;return!e||n.soul||n.has?this.off():(e=(e=(e=e.$||e)._||e).id)?!!(t=this.seen||(this.seen={}))[e]||void(t[e]=!0):void 0}n.chain.get=function(e,t,s){var c,u;if("string"==typeof e){if(0==e.length)return(c=this.chain())._.err={err:n.log("0 length key!",e)},t&&t.call(c,c._.err),c;(c=((l=this._).next||o)[e])||(c=e&&function(e,t){var n=t._,r=n.next,i=t.chain()._;return r||(r=n.next={}),r[i.get=e]=i,t===n.root.$?i.soul=e:(n.soul||n.has)&&(i.has=e),i}(e,this)),c=c&&c.$}else{if("function"==typeof e){if(!0===t)return function(e,t,r,o){var a,s=e._,c=0;(a=s.soul||s.link)?t(a,o,s):s.jam?s.jam.push([t,o]):(s.jam=[[t,o]],e.get((function(e,t){if(!(i===e.put&&!s.root.opt.super&&(a=Object.keys(s.root.opt.peers).length)&&++c<=a)){t.rid(e);var r,o=(o=e.$)&&o._||{},u=0;for(a=s.jam,delete s.jam;r=a[u++];){var l=r[0];r=r[1],l&&l(o.link||o.soul||n.valid(e.put)||((e.put||{})._||{})["#"],r,e,t)}}}),{out:{get:{".":!0}}}))}(this,e,0,s),this;var l,f,h=t||{},p=(l=(c=this)._).root;h.at=l,h.ok=e;var d={};function g(e,t,r){if(!g.stun&&(!(o=p.pass)||o[f])){var o,a=e.$._,s=(e.$$||"")._,c=(s||a).put,u={};if((!a.has&&!a.soul||i===c)&&(c=i===((o=e.put)||"")["="]?i===(o||"")[":"]?o:o[":"]:o["="]),"string"==typeof(o=n.valid(c))&&(c=i===(o=p.$.get(o)._.put)?h.not?i:c:o),!h.not||i!==c){if(i===h.stun){if((o=p.stun)&&o.on&&(l.$.back((function(e){if(o.on(""+e.id,u={}),(u.run||0)u.run&&(u.stun&&!u.stun.end||(u.stun=o.on("stun"),u.stun=u.stun&&u.stun.last),u.stun&&!u.stun.end)))return void((u.stun.add||(u.stun.add={}))[f]=function(){g(e,t,1)});if(i===c&&(r=0),(o=p.hatch)&&!o.end&&i===h.hatch&&!r){if(d[a.$._.id])return;return d[a.$._.id]=1,void o.push((function(){g(e,t,1)}))}d={}}if(p.pass){if(p.pass[f+a.id])return;p.pass[f+a.id]=1}h.on?h.ok.call(a.$,c,a.get,e,t||g):h.v2020?h.ok(e,t||g):(Object.keys(e).forEach((function(t){o[t]=e[t]}),o={}),(e=o).put=c,h.ok.call(h.as,e,t||g))}}}return g.at=l,(l.any||(l.any={}))[f=String.random(7)]=g,g.off=function(){g.stun=1,l.any&&delete l.any[f]},g.rid=r,g.id=h.run||++p.once,u=p.pass,(p.pass={})[f]=1,h.out=h.out||{get:{}},l.on("out",h.out),p.pass=u,c}if("number"==typeof e)return this.get(""+e,t,s);if("string"==typeof(u=a(e)))return this.get(u,t,s);(u=this.get.next)&&(c=u(this,e))}return c?(t&&"function"==typeof t&&c.get(t,s),c):((c=this.chain())._.err={err:n.log("Invalid get request!",e)},t&&t.call(c,c._.err),c)};var i,o={},a=n.valid}))(t,"./get"),t((function(e){var n=t("./root");function r(e,t){if(t){t=(t._||"").id||t;var r,i=e.root.stun||(e.root.stun={on:n.on}),o={};e.stun||(e.stun=i.on("stun",(function(){}))),(r=i.on(""+t))&&r.the.last.next(o),o.run>=e.run||i.on(""+t,(function(t){if(e.stun.end)return this.off(),void this.to.next(t);t.run=t.run||e.run,t.stun=t.stun||e.stun}))}}function i(e){if(e.err)i.end(e.stun,e.root);else if(!e.todo.length&&!e.end&&Object.empty(e.wait)){e.end=1;var t,r=e.$.back(-1)._,o=r.root,a=r.ask((function(t){o.on("ack",t),t.err&&!t.lack&&n.log(t),++s>(e.acks||0)&&this.off(),e.ack&&e.ack(t,this)}),e.opt),s=0,c=e.stun;(t=function(){c&&(i.end(c,o),setTimeout.each(Object.keys(c=c.add||""),(function(e){(e=c[e])&&e()})))}).hatch=t,e.ack&&!e.ok&&(e.ok=e.acks||9),e.via._.on("out",{put:e.out=e.graph,ok:e.ok&&{"@":e.ok+1},opt:e.opt,"#":a,_:t})}}n.chain.put=function(e,t,a){var l=this,f=l._,h=f.root;(a=a||{}).root=f.root,a.run||(a.run=h.once),r(a,f.id),a.ack=a.ack||t,a.via=a.via||l,a.data=a.data||e,a.soul||(a.soul=f.soul||"string"==typeof t&&t);var p=a.state=a.state||n.state();return"function"==typeof e?(e((function(e){a.data=e,l.put(o,o,a)})),l):a.soul?(a.$=h.$.get(a.soul),a.todo=[{it:a.data,ref:a.$}],a.turn=a.turn||s,a.ran=a.ran||i,function e(){var t,o,s,l,f,h=a.todo,d=h.pop(),g=d.it;if(r(a,d.ref),(l=d.todo)&&(g=g[o=l.pop()],l.length&&h.push(d)),o&&(h.path||(h.path=[])).push(o),!(t=c(g))&&!(f=n.is(g))){if(!Object.plain(g))return void i.err(a,"Invalid data: "+function(e,t){return e&&(t=e.constructor)&&t.name||typeof e}(g)+" at "+(a.via.back((function(e){e.get&&l.push(e.get)}),l=[])||l.join("."))+"."+(h.path||[]).join("."));for(var y=a.seen||(a.seen=[]),v=y.length;v--;)if(g===(l=y[v]).it){t=g=l.link;break}}if(o&&t)d.node=u(d.node,o,p,g);else{if(!a.seen)return void i.err(a,"Data at root of graph must be a node (an object).");a.seen.push(s={it:g,link:{},todo:f?[]:Object.keys(g).sort().reverse(),path:(h.path||[]).slice(),up:d}),d.node=u(d.node,o,p,s.link),!f&&s.todo.length&&h.push(s);var m=a.seen.length;function b(e,t){var n=s.link["#"];t&&(t.off(),t.rid(e));var i=n||e.soul||(l=(e.$$||e.$)._||"").soul||l.link||((l=l.put||"")._||"")["#"]||l["#"]||((l=e.put||"")&&e.$$?l["#"]:(l["="]||l[":"]||"")["#"]);!n&&r(a,e.$),i||d.link["#"]?(i||(i=[],(e.$$||e.$).back((function(e){if(l=e.soul||e.link)return i.push(l);i.push(e.get)})),i=i.reverse().join("/")),s.link["#"]=i,!f&&(((a.graph||(a.graph={}))[i]=s.node||(s.node={_:{}}))._["#"]=i),delete a.wait[m],s.wait&&setTimeout.each(s.wait,(function(e){e&&e()})),a.ran(a)):(d.wait||(d.wait=[])).push((function(){b(e,t)}))}(a.wait||(a.wait={}))[m]="",l=(s.ref=f?g:o?d.ref.get(o):d.ref)._,(l=g&&(g._||"")["#"]||l.soul||l.link)?b({soul:l}):s.ref.get(b,{run:a.run,v2020:1,out:{get:{".":" "}}})}if(!h.length)return a.ran(a);a.turn(e)}(),l):(function(e){var t,n=e.via._;e.via=e.via.back((function(n){if(n.soul||!n.get)return n.$;t=e.data,(e.data={})[n.get]=t})),e.via&&e.via._.soul||(e.via=n.root.$.get(((e.data||"")._||"")["#"]||n.$.back("opt.uuid")())),e.via.put(e.data,e.ack,e)}(a),l)},i.end=function(e,t){e.end=a,e.the.to===e&&e===e.the.last&&delete t.stun,e.off()},i.err=function(e,t){(e.ack||a).call(e,e.out={err:e.err=n.log(t)}),e.ran(e)};var o,a=function(){},s=setTimeout.turn,c=n.valid,u=n.state.ify}))(t,"./put"),t((function(e){var n=t("./root");t("./chain"),t("./back"),t("./put"),t("./get"),e.exports=n}))(t,"./index"),t((function(e){var n,r=t("./index");r.chain.on=function(e,t,n,r){var i,o=this._;if("string"==typeof e)return t?(i=o.on(e,t,n||o,r),n&&n.$&&(n.subs||(n.subs=[])).push(i),this):o.on(e);var a=t;return(a=!0===a?{change:!0}:a||{}).not=1,a.on=1,this.get(e,a),this},r.chain.once=function(e,t){if(t=t||{},!e)return function(e,t,n){return r.log.once("valonce","Chainable val is experimental, its behavior and API may change moving forward. Please play with it and report bugs and ideas on how to improve it."),(n=e.chain())._.nix=e.once((function(e,t){n._.on("in",this._)})),n._.lex=e._.lex,n}(this);var i,o=this._,a=o.root,s=String.random(7);return this.get((function(c,u,l,f){var h=this,p=h._,d=p.one||(p.one={});function g(y){p.has||p.soul||(p={put:c,get:u}),n===(i=p.put)&&(i=((l.$$||"")._||"").put),"string"!=typeof r.valid(i)||(i=a.$.get(i)._.put)!==n||y?f.stun||""!==d[s]&&(d[s]="",(o.soul||o.has)&&f.off(),e.call(h,i,p.get),clearTimeout(d[s])):d[s]=setTimeout((function(){g(1)}),t.wait||99)}f.stun||""!==d[s]&&(!0!==(i=r.valid(c))?"string"!=typeof i&&(clearTimeout((o.one||"")[s]),clearTimeout(d[s]),d[s]=setTimeout(g,t.wait||99)):g())}),{on:1}),this},r.chain.off=function(){var e,t=this._,n=t.back;if(n)return t.ack=0,(e=n.next)&&e[t.get]&&delete e[t.get],(e=n.ask)&&delete e[t.get],(e=n.put)&&delete e[t.get],(e=t.soul)&&delete n.root.graph[e],(e=t.map)&&Object.keys(e).forEach((function(t,r){(r=e[t]).link&&n.root.$.get(r.link).off()})),(e=t.next)&&Object.keys(e).forEach((function(t,n){e[t].$.off()})),t.on("off",{}),this}}))(t,"./on"),t((function(e){var n=t("./index"),r=n.chain.get.next;function i(e){this.to.next(e);var t,r=this.as;(e.$._.soul||e.$$)&&((t=r.lex)&&!String.match(e.get||(e.put||"")["."],t["."]||t["#"]||t)||n.on.link(e,r))}n.chain.get.next=function(e,t){var n;return Object.plain(t)?(n=((n=t["#"])||"")["="]||n)?e.get(n):((n=e.chain()._).lex=t,e.on("in",(function(e){String.match(e.get||(e.put||"")["."],t["."]||t["#"]||t)&&n.on("in",e),this.to.next(e)})),n.$):(r||a)(e,t)},n.chain.map=function(e,t,r){var s,c,u=this._;return Object.plain(e)&&(s=e["."]?e:{".":e},e=o),e?(n.log.once("mapfn","Map functions are experimental, their behavior and API may change moving forward. Please play with it and report bugs and ideas on how to improve it."),c=this.chain(),this.map().on((function(t,r,i,s){var u=(e||a).call(this,t,r,i,s);if(o!==u){if(t===u)return c._.on("in",i);if(n.is(u))return c._.on("in",u._);var l={};Object.keys(i.put).forEach((function(e){l[e]=i.put[e]}),l),l["="]=u,c._.on("in",{get:r,put:l})}})),c):((c=u.each)||((u.each=c=this.chain())._.lex=s||c._.lex||u.lex,c._.nix=this.back("nix"),this.on("in",i,c._)),c)};var o,a=function(){}}))(t,"./map"),t((function(e){var n=t("./index");n.chain.set=function(e,t,r){var i,o,a=this,s=a.back(-1);return t=t||function(){},(r=r||{}).item=r.item||e,(i=((e||"")._||"")["#"])&&((e={})["#"]=i),"string"==typeof(o=n.valid(e))?a.get(i=o).put(e,t,r):n.is(e)?(a.put((function(r){e.get((function(e,i,s){if(!e)return t.call(a,{err:n.log('Only a node can be linked! Not "'+s.put+'"!')});(o={})[e]={"#":e},r(o)}),!0)})),e):(Object.plain(e)&&(e=s.get(i=a.back("opt.uuid")()).put(e)),a.get(i||s.back("opt.uuid")(7)).put(e,t,r))}}))(t,"./set"),t((function(e){t("./shim");var n,r=function(){},i=JSON.parseAsync||function(e,t,n){var r=+new Date;try{t(void 0,JSON.parse(e,n),o.sucks(+new Date-r))}catch(e){t(e)}},o=JSON.stringifyAsync||function(e,t,n,r){var i=+new Date;try{t(void 0,JSON.stringify(e,n,r),o.sucks(+new Date-i))}catch(e){t(e)}};o.sucks=function(e){e>99&&(console.log("Warning: JSON blocking CPU detected. Add `gun/lib/yson.js` to fix."),o.sucks=r)};try{e.exports=function(e){var t=function(){},r=e.opt||{};r.log=r.log||console.log,r.gap=r.gap||r.wait||0,r.max=r.max||.3*(r.memory?999*r.memory*999:3e8),r.pack=r.pack||.01*r.max*.01,r.puff=r.puff||9;var a=setTimeout.turn||setTimeout,s=e.dup,c=s.check,u=s.track,l=t.hear=function(e,n){if(e){if(r.max<=e.length)return t.say({dam:"!",err:"Message too big!"},n);t===this&&(l.d+=e.length||0,++l.c);var o,s=n.SH=+new Date,c=e[0];return"["===c?(i(e,(function(e,i){if(e||!i)return t.say({dam:"!",err:"DAM JSON parse error."},n);console.STAT&&console.STAT(+new Date,i.length,"# on hear batch");var o=r.puff;!function e(){for(var r,s=+new Date,c=0;ct.length:!t.length)){if(!n)try{t=1===t.length?t[0]:JSON.stringify(t)}catch(e){return r.log("DAM JSON stringify error",e)}t&&h(t,e)}}function h(e,n){try{var r=n.wire;n.say?n.say(e):r.send&&r.send(e),t.say.d+=e.length||0,++t.say.c}catch(t){(n.queue=n.queue||[]).push(e)}}return l.one=function(n,r,i){var o,a,l,f,h;if(n.DBG&&(n.DBG=h={DBG:n.DBG}),h&&(h.h=i),h&&(h.hp=+new Date),(o=n["#"])||(o=n["#"]=String.random(9)),!((l=c(o))||(a=n["##"])&&(l=n["@"]||n.get&&o)&&s.check(f=l+a))){if((n._=function(){}).via=t.leap=r,(l=n["><"])&&"string"==typeof l&&l.slice(0,99).split(",").forEach((function(e){this[e]=1}),n._.yo={}),l=n.dam)return(l=t.hear[l])&&l(n,r,e),void u(o);(l=n.ok)&&(n._.near=l["/"]),i=+new Date,h&&(h.is=i),r.SI=o,u.ed=function(e){o===e&&(u.ed=0,(e=s.s[o])&&(e.via=r,n.get&&(e.it=n)))},e.on("in",t.last=n),h&&(h.hd=+new Date),console.STAT&&console.STAT(i,+new Date-i,n.get?"msg get":n.put?"msg put":"msg"),u(o),f&&u(f),t.leap=t.last=null}},l.c=l.d=0,function(){var e,i=0;function l(e,t){var n;return t instanceof Object?(Object.keys(t).sort().forEach(p,{to:n={},on:t}),n):t}function p(e){this.to[e]=this.on[e]}t.hash=function(e,n){var r,i,s,c=+new Date;o(e.put,(function o(u,l){var f=(i||(i=s=l||"")).slice(0,32768);r=String.hash(f,r),(i=i.slice(32768))?a(o,0):(console.STAT&&console.STAT(c,+new Date-c,"say json+hash"),e._.$put=s,e["##"]=r,t.say(e,n),delete e._.$put)}),l)},(t.say=function(o,c){var l;if((l=this)&&(l=l.to)&&l.next&&l.next(o),!o)return!1;var p,d,g,y=o["@"],v=o._||(o._=function(){}),m=o.DBG,b=+new Date;if(v.y=v.y||b,c||m&&(m.y=b),(p=o["#"])||(p=o["#"]=String.random(9)),!e&&u(p),(d=o["##"])||n===o.put||v.via||!y){if(!c&&y&&(c=(l=s.s[y])&&(l.via||(l=l.it)&&(l=l._)&&l.via)||(l=t.last)&&y===l["#"]&&t.leap),!c&&y){if(s.s[y])return;return console.STAT&&console.STAT(+new Date,++i,"total no peer to ack to"),!1}if(y&&!o.put&&!d&&((s.s[y]||"").it||"")["##"])return!1;if(!c&&t.way)return t.way(o);if(m&&(m.yh=+new Date),g=v.raw){if(m&&(m.yr=+new Date),!c||!c.id){if(!Object.plain(c||r.peers))return!1;b=+new Date;var w=r.peers,k=Object.keys(c||r.peers||{});return console.STAT&&console.STAT(b,+new Date-b,"peer keys"),void function n(){var r=+new Date;e=1;var i=v.raw;v.raw=g;for(var s,l=0;l<9&&(s=(k||"")[l++]);)(s=w[s]||(c||"")[s])&&t.say(o,s);v.raw=i,e=0,k=k.slice(l),console.STAT&&console.STAT(r,+new Date-r,"say loop"),k.length&&(a(n,0),y&&u(y))}()}if(!c.wire&&t.wire&&t.wire(c),p!==c.last){if(c.last=p,c===v.via)return!1;if((l=v.yo)&&(l[c.url]||l[c.pid]||l[c.id]))return!1;if(console.STAT&&console.STAT(b,((m||v).yp=+new Date)-(v.y||b),"say prep"),!e&&y&&u(y),c.batch){if(c.tail=(l=c.tail||0)+g.length,c.tail<=r.pack)return void(c.batch+=(l?",":"")+g);f(c)}c.batch="[";var x=+new Date;setTimeout((function(){console.STAT&&console.STAT(x,+new Date-x,"0ms TO"),f(c)}),r.gap),h(g,c),console.STAT&&y===c.SI&&console.STAT(b,+new Date-c.SH,"say ack")}}else t.raw(o,c)}else t.hash(o,c)}).c=t.say.d=0,t.raw=function(e,i){if(!e)return"";var a,u,l=e._||{};if(u=l.raw)return u;if("string"==typeof e)return e;var f=e["##"],h=e["@"];if(f&&h){if(!l.via&&c(h+f))return!1;if(u=(s.s[h]||"").it){if(f===u["##"])return!1;u["##"]||(u["##"]=f)}}if(!e.dam&&!e["@"]){var p=0,d=[];for(var g in u=r.peers){var y=u[g];if(d.push(y.url||y.pid||y.id),++p>6)break}p>1&&(e["><"]=d.join())}if(e.put&&(u=e.ok)&&(e.ok={"@":(u["@"]||1)-1,"/":u["/"]==e._.near?t.near:u["/"]}),a=l.$put)return u={},Object.keys(e).forEach((function(t){u[t]=e[t]})),u.put=":])([:",void o(u,(function(e,t){if(!e){var r=+new Date;u=t.indexOf('"put":":])([:"'),v(n,t=t.slice(0,u+6)+a+t.slice(u+14)),console.STAT&&console.STAT(r,+new Date-r,"say slice")}}));function v(n,r){n||(l.raw=r,t.say(e,i))}o(e,v)}}(),t.near=0,t.hi=function(n){var i;n.wire?(n.id?r.peers[n.url||n.id]=n:(i=n.id=n.id||n.url||String.random(9),t.say({dam:"?",pid:e.opt.pid},r.peers[i]=n),delete s.s[n.last]),n.met||(t.near++,n.met=+new Date,e.on("hi",n)),i=n.queue,n.queue=[],setTimeout.each(i||[],(function(e){h(e,n)}),0,9)):t.wire(n.length&&{url:n,id:n}||n)},t.bye=function(n){n.met&&--t.near,delete n.met,e.on("bye",n);var r=+new Date;r-=n.met||r,t.bye.time=((t.bye.time||r)+r)/2},t.hear["!"]=function(e,t){r.log("Error:",e.err)},t.hear["?"]=function(e,n){e.pid&&(n.pid||(n.pid=e.pid),e["@"])||(t.say({dam:"?",pid:r.pid,"@":e["#"]},n),delete s.s[n.last])},t.hear.mob=function(e,n){if(e.peers){var r=Object.keys(e.peers),i=r[Math.random()*r.length>>0];i&&(t.bye(n),t.hi(i))}},e.on("create",(function(e){e.opt.pid=e.opt.pid||String.random(9),this.to.next(e),e.on("out",t.say)})),e.on("bye",(function(e,t){this.to.next(e=r.peers[e.id||e]||e),e.bye?e.bye():(t=e.wire)&&t.close&&t.close(),delete r.peers[e.id],e.wire=null})),e.on("bye",(function(e,n){this.to.next(e),(n=console.STAT)&&(n.peers=t.near),(n=e.url)&&setTimeout((function(){}),r.lack||9e3)})),e.on("hi",(function(n,i){if(this.to.next(n),(i=console.STAT)&&(i.peers=t.near),!r.super){var o=Object.keys(e.next||"");o.length>9999&&!console.SUBS&&console.log(console.SUBS="Warning: You have more than 10K live GETs, which might use more bandwidth than your screen can show - consider `.off()`."),setTimeout.each(o,(function(i){var o=e.next[i];r.super||(o.ask||"")[""]?t.say({get:{"#":i}},n):setTimeout.each(Object.keys(o.ask||""),(function(r){r&&t.say({"##":String.hash((e.graph[i]||"")[r]),get:{"#":i,".":r}},n)}))}))}})),t}}catch(e){}}))(t,"./mesh"),t((function(e){var n=t("./index");n.Mesh=t("./mesh"),n.on("opt",(function(e){if(this.to.next(e),!e.once){var t=e.opt;if(!1!==t.WebSocket){var r=n.window||{},i=t.WebSocket||r.WebSocket||r.webkitWebSocket||r.mozWebSocket;if(i){t.WebSocket=i,(t.mesh=t.mesh||n.Mesh(e)).wire=t.wire=a,setTimeout((function(){!t.super&&e.on("out",{dam:"hi"})}),1);var o=""+void 0!=typeof document&&document}}}function a(e){try{if(!e||!e.url)return r&&r(e);var n=e.url.replace(/^http/,"ws"),r=e.wire=new t.WebSocket(n);return r.onclose=function(){s(e),t.mesh.bye(e)},r.onerror=function(t){s(e)},r.onopen=function(){t.mesh.hi(e)},r.onmessage=function(n){n&&t.mesh.hear(n.data||n,e)},r}catch(n){t.mesh.bye(e)}}function s(e){clearTimeout(e.defer),t.peers[e.url]&&(o&&e.retry<=0||(e.retry=(e.retry||t.retry+1||60)-(-e.tried+(e.tried=+new Date)<7992?1:0),e.defer=setTimeout((function t(){if(o&&o.hidden)return setTimeout(t,1998);a(e)}),1998)))}}))}))(t,"./websocket"),t((function(e){if("undefined"!=typeof Gun){var t;try{t=(Gun.window||function(){}).localStorage}catch(e){}t||(Gun.log("Warning: No localStorage exists to persist data to!"),t={setItem:function(e,t){this[e]=t},removeItem:function(e){delete this[e]},getItem:function(e){return this[e]}});var n=JSON.stringifyAsync||function(e,t,n,r){try{t(void 0,JSON.stringify(e,n,r))}catch(e){t(e)}};Gun.on("create",(function e(r){this.to.next(r);var i,o,a,s,c=r.opt,u=[];if(!1!==c.localStorage){c.prefix=c.file||"gun/";try{i=e[c.prefix]=e[c.prefix]||JSON.parse(a=t.getItem(c.prefix))||{}}catch(t){i=e[c.prefix]={}}a=(a||"").length,r.on("get",(function(e){this.to.next(e);var t,n,r,o=e.get;o&&(t=o["#"])&&((n=i[t]||void 0)&&(r=o["."])&&!Object.plain(r)&&(n=Gun.state.ify({},r,Gun.state.is(n,r),n[r],t)),Gun.on.get.ack(e,n))})),r.on("put",(function(e){this.to.next(e);var t=e.put,n=t["#"],c=e["#"],f=e.ok||"";i[n]=Gun.state.ify(i[n],t["."],t[">"],t[":"],n),s&&a>4999880?r.on("in",{"@":c,err:"localStorage max!"}):(e["@"]||e._.via&&!(Math.random()=0||Infinity===t||-Infinity===t)}},t.text=t.text||{is:function(t){return e("text"),"string"==typeof t}},t.text.ify=t.text.ify||function(n){return e("text.ify"),t.text.is(n)?n:"undefined"!=typeof JSON?JSON.stringify(n):n&&n.toString?n.toString():n},t.text.random=t.text.random||function(t,n){e("text.random");var r="";for(t=t||24,n=n||"0123456789ABCDEFGHIJKLMNOPQRSTUVWXZabcdefghijklmnopqrstuvwxyz";t>0;)r+=n.charAt(Math.floor(Math.random()*n.length)),t--;return r},t.text.match=t.text.match||function(t,n){var r,i;return e("text.match"),"string"==typeof t&&("string"==typeof n&&(n={"=":n}),t===(r=(n=n||{})["="]||n["*"]||n[">"]||n["<"])||i===n["="]&&(t.slice(0,((r=n["*"]||n[">"]||n["<"])||"").length)===r||i===n["*"]&&(i!==n[">"]&&i!==n["<"]?t>=n[">"]&&t<=n["<"]:i!==n[">"]&&t>=n[">"]||i!==n["<"]&&t<=n["<"])))},t.text.hash=t.text.hash||function(t,n){if(e("text.hash"),"string"==typeof t){if(n=n||0,!t.length)return n;for(var r=0,i=t.length;rn?1:0:0}},t.list.map=t.list.map||function(t,n,r){return e("list.map"),a(t,n,r)},t.list.index=1,t.obj=t.boj||{is:function(t){return e("obj"),!!t&&(t instanceof Object&&t.constructor===Object||"Object"===Object.prototype.toString.call(t).match(/^\[object (\w+)\]$/)[1])}},t.obj.put=t.obj.put||function(t,n,r){return e("obj.put"),(t||{})[n]=r,t},t.obj.has=t.obj.has||function(t,n){return e("obj.has"),t&&Object.prototype.hasOwnProperty.call(t,n)},t.obj.del=t.obj.del||function(t,n){if(e("obj.del"),t)return t[n]=null,delete t[n],t},t.obj.as=t.obj.as||function(t,n,r,i){return e("obj.as"),t[n]=t[n]||(i===r?{}:r)},t.obj.ify=t.obj.ify||function(t){if(e("obj.ify"),i(t))return t;try{t=JSON.parse(t)}catch(e){t={}}return t},function(){function n(e,t){o(this,t)&&void 0!==this[t]||(this[t]=e)}t.obj.to=t.obj.to||function(t,r){return e("obj.to"),a(t,n,r=r||{}),r}}(),t.obj.copy=t.obj.copy||function(t){return e("obj.copy"),t?JSON.parse(JSON.stringify(t)):t},function(){function n(e,t){var n=this.n;if(!n||!(t===n||i(n)&&o(n,t)))return void 0!==t||void 0}t.obj.empty=t.obj.empty||function(t,r){return e("obj.empty"),!t||!a(t,n,{n:r})}}(),function(){function n(e,t){2!==arguments.length?(n.r=n.r||[]).push(e):(n.r=n.r||{})[e]=t}var a,s=Object.keys;Object.keys=Object.keys||function(e){return a(e,(function(e,t,n){n(t)}))},t.obj.map=a=t.obj.map||function(a,c,u){e("obj.map");var l,f,h,p,d,g=0,y="function"==typeof c;if(n.r=l,s&&i(a)&&(p=s(a),d=!0),u=u||{},r(a)||p)for(f=(p||a).length;g(p||"￿")&&(k=0),k&&(y=a(y,m,b,c),n!==y))return y}else if(s.branch&&(y=a(n,m,b,c),n!==y))return y;if(c=v,!l&&(y=e(w,a,s,c),n!==y))return y;c.pop()}}}catch(e){console.error(e)}},"undefined"!=typeof window)window.Radix=t;else try{e.exports=t}catch(e){}var n,r=t.object=function(e,t,r){for(var i in e)if(e.hasOwnProperty(i)&&(r=t(e[i],i))!==n)return r},i={},o=String.fromCharCode(24)}()})),T=b((function(e){!function(){function t(e){(e=e||{}).log=e.log||console.log,e.file=String(e.file||"radata");var i=(t.has||(t.has={}))[e.file];if(i)return i;function o(e){return encodeURIComponent(e).replace(/\*/g,"%2A")}e.max=e.max||.3*(e.memory?999*e.memory*999:3e8),e.until=e.until||e.wait||250,e.batch=e.batch||1e4,e.chunk=e.chunk||1048576,e.code=e.code||{},e.code.from=e.code.from||"!",e.jsonify=!0;var a=""+y==typeof setImmediate?setTimeout:setImmediate,s=setTimeout.turn||a,c=r.object,u=0;if(!e.store)return e.log("ERROR: Radisk needs `opt.store` interface with `{get: fn, put: fn (, list: fn)}`!");if(!e.store.put)return e.log("ERROR: Radisk needs `store.put` interface with `(file, data, cb)`!");if(!e.store.get)return e.log("ERROR: Radisk needs `store.get` interface with `(file, cb)`!");var l=JSON.parseAsync||function(e,t,n){try{t(void 0,JSON.parse(e,n))}catch(e){t(e)}},f=function(e,t,n,r,i){if("function"!=typeof t)f.save(e,t,n,r,i);else{var o=n||{};f.read(e,n=t,o,i||r)}};f.save=function(t,n,i,a,s){var c,u,l={key:t,find:function(t){var n;l.file=t||(t=e.code.from),s&&(s=s[t]=s[t]||{}),s&&(s.sf=s.sf||+new Date),(n=f.disk[t])?l.mix(y,n):f.parse(t,l.mix,y,s)},mix:function(o,c){if(s&&(s.sml=+new Date),s&&(s.sm=s.sm||+new Date),l.err=o||l.err)i(o);else{var u,h=l.file=(c||"").file||l.file;if(!c&&h!==e.code.from)return f.find.bad(h),void f.save(t,n,i,a);(c=f.disk[h]||(f.disk[h]=c||r())).file||(c.file=h),e.compare&&(n=e.compare(c(t),n,t,h),y===n)?i(o,-1):((l.disk=c)(t,n),a&&((u=(u=c.tags||(c.tags={}))[a]||(u[a]=f.tags[a]||(f.tags[a]={})))[h]||(u[h]=f.one[a]||(f.one[a]=i)),i=null),s&&(s.st=s.st||+new Date),c.Q?i&&c.Q.push(i):(c.Q=i?[i]:[],c.to=setTimeout(l.write,e.until)))}},write:function(){s&&(s.sto=s.sto||+new Date);var e=c=l.file,t=l.disk;u=l.q=t.Q,l.tags=t.tags,delete t.Q,delete f.disk[e],delete t.tags,f.write(e,t,l.ack,y,s)},ack:function(e,t){var n,r;for(var i in s&&(s.sa=s.sa||+new Date),s&&(s.sal=u.length),f.tags)if(f.tags.hasOwnProperty(i)){var a=f.tags[i];if(!((r=f.disk[c])&&(r=r.tags)&&r[a])){var h;for(var p in n=a[c],delete a[c],a)if(a.hasOwnProperty(p)){h=!0;break}h||(delete f.tags[a],n&&n(e,t))}}!u&&(u="");for(var d=u.length,g=0,y=+new Date;g=p.end)return!0;p.hub(t,e)},p.both=function(e,t){c&&(c.wfd=+new Date),h?a(e||h):l?a(e,t):(l=!0,h=e)},p.each=function(n,r,i,o){if(y!==n&&p.count++,e.max<=(n||"").length)return a("Data too big!"),!0;var c=t.encode(o.length)+"#"+t.encode(i)+(y===n?"":":"+t.encode(n))+"\n";if(e.chunk1)return t.split()}t.text=s,t.write()},f.range=function(e,t){if(e&&t){if(y===t.start&&y===t.end)return e;if(y!==(n=e)&&(!n||"object"!=typeof n))return e;var n,i=r();return r.map(e,(function(e,t){i(t,e)}),t),i("")}},f.read=function(t,n,i,c){i=i||{};var u={key:t,find:function(t){var n;u.file=t||(t=e.code.from),c&&(c=c[t]=c[t]||{}),c&&(c.rf=c.rf||+new Date),(n=f.disk[u.file=t])?u.check(y,n):f.parse(t,u.check,y,c)},get:function(o,s,l){if(c&&(c.rgl=+new Date),c&&(c.rg=c.rg||+new Date),u.err=o||u.err)n(o);else{var h=u.file=(s||"").file||u.file;if(!s&&h!==e.code.from)return f.find.bad(h),void f.read(t,n,i);if(s=f.disk[h]||(f.disk[h]=s)){s.file||(s.file=h);var p=f.range(s(t),i);if(c&&(c.rr=+new Date),i.unit=s.unit,i.chunks=(i.chunks||0)+1,i.parsed=(i.parsed||0)+((l||"").parsed||i.chunks*e.chunk),i.more=1,i.next=y,r.map(f.list,(function(e,t){if(e&&h!==t)return i.next=t,1}),i.reverse?{reverse:1,end:h}:{start:h}),c&&(c.rl=+new Date),i.next||(i.more=0),i.next&&(!i.reverse&&(ti.next&&0!=t.indexOf(i.next)||y!==i.start&&(i.start||"")>i.next&&h<=i.start)&&(i.more=0)),i.more){if(p&&n(u.err,p,i),!(i.parsed>=i.limit)){var d=+new Date;c&&(c.rm=d);var g=i.next;a((function(){console.STAT&&console.STAT(d,+new Date-d,"rad more"),f.parse(g,u.check)}),0)}}else n(u.err,p,i)}else n(h===e.code.from?y:"No file!")}},check:function(t,n,i){if(u.get(t,n,i),n&&!n.check){n.check=1;var a=+new Date;(i||(i={})).file||(i.file=u.file),r.map(n,(function(t,n){f.find(n,(function(r){if((r||(r=e.code.from))!==i.file){var a=(""+Math.random()).slice(-3);s((function(){f.save(n,t,(function e(s,c){s?f.save(n,t,e):console.STAT&&console.STAT("MISLOCATED DATA CORRECTED",a,o(n),o(i.file),o(r))}))}),0)}}))})),console.STAT&&console.STAT(a,+new Date-a,"rad check")}}};f.find(t||(i.reverse?i.end||"":i.start||""),u.find)},h=0,p={},d=String.fromCharCode(31),f.parse=function(n,i,a,c){var g;if(!n)return i();if(g=p[n])g.push(i);else{g=p[n]=[i];var v=function(){},m={file:n};(v.disk=r()).file=n,v.read=function(t,r){if(c&&(c.rpg=+new Date),console.STAT&&console.STAT(b,+new Date-b,"read disk",JSON.stringify(n),++h,"total all parses."),(v.err=t)||(v.not=!r))return delete p[n],void v.map(g,v.ack);if("string"!=typeof r){try{e.max<=r.length?v.err="Chunk too big!":r=r.toString()}catch(e){v.err=e}if(v.err)return delete p[n],void v.map(g,v.ack)}m.parsed=r.length,c&&(c.rpl=m.parsed),c&&(c.rpa=g.length),b=+new Date,e.jsonify||"{"===r[0]?l(r,(function(e,t){return e?"{"===r[0]?(delete p[n],v.err="JSON error!",void v.map(g,v.ack)):void v.radec(e,r):(delete p[n],v.disk.$=t,console.STAT&&(u=+new Date-b)>9&&console.STAT(b,u,"rad parsed JSON"),c&&(c.rpd=+new Date),void v.map(g,v.ack))})):v.radec(t,r)},v.map=function(){if(g&&g.length){for(var e,t=+new Date,r=v.err,i=v.not?y:v.disk,a=0;a<9&&(e=g[a++]);)e(r,i,m);console.STAT&&console.STAT(t,+new Date-t,"rad packs",o(n)),console.STAT&&console.STAT(t,a,"rad packs #",o(n)),(g=g.slice(a)).length&&s(v.map,0)}},v.ack=function(e){e&&(v.err||v.not?e(v.err,y,m):e(y,v.disk,m))},v.radec=function(e,t){delete p[n],b=+new Date;var r,i,o,a=v.split(t),s=[];if(!a||0!==a[1])return v.err="File '"+n+"' does not have root radix! ",void v.map(g,v.ack);for(;a;)i=o=y,r=a[1],"#"==(a=v.split(a[2])||"")[0]&&(i=a[1],r<=(s=s.slice(0,r)).length&&s.push(i)),"\n"!=(a=v.split(a[2])||"")[0]&&("="!=a[0]&&":"!=a[0]||(o=a[1]),y!==i&&y!==o&&v.disk(s.join(""),o),a=v.split(a[2]));console.STAT&&console.STAT(b,+new Date-b,"parsed RAD"),v.map(g,v.ack)},v.split=function(e){if(e){var n,r,i=[],o={};if(n=e.indexOf(d),e[n])return r=e.slice(0,n),i[0]=r,i[1]=t.decode(e.slice(n),o),i[2]=e.slice(n+o.i),i}},f.disk&&(a||(a=(f.disk[n]||"").raw));var b=+new Date;if(c&&(c.rp=b),a)return s((function(){v.read(y,a)}),0);e.store.get(o(n),v.read)}},function(){var t,n,i=String.fromCharCode(28);function o(n,s){if(n)return e.log("list",n),void setTimeout((function(){f.parse(i,o)}),1e3);s?a(s):(t=t||s||r(),e.store.list?e.store.list((function(e){e?f.find.add(e,v):a(t)})):a(t))}function a(e,r){(t=t||e).file=i,r=n,n=null,c(r,(function(e){f.find(e[0],e[1])}))}f.find=function(a,s){if(!t)return n?void n.push([a,s]):(n=[[a,s]],void f.parse(i,o));r.map(f.list=t,(function(e,t){if(e)return s(t)||!0}),{reverse:1,end:a})||s(e.code.from)},f.find.add=function(e,n){t(e)||e===i?n(y,1):(t(e,1),n.found=(n.found||0)+1,f.write(i,t,(function(e,t){e?n(e):(n.found=(n.found||0)-1,0===n.found&&n(y,1))}),!0))},f.find.bad=function(e,n){t(e,0),f.write(i,t,n||v)}}();try{!n.window&&function(e){var t=E;e.find("a",(function(){var n,r,i=[];t.map(e.list,(function(e,t){t.indexOf("%1B")+1&&e&&i.push([t,e])})),i.length&&console.log("\n! ! ! WARNING ! ! !\nRAD v0.2020.x has detected OLD v0.2019.x data & automatically migrating. Automatic migration will be turned OFF in future versions! If you are just developing/testing, we recommend you reset your data. Please contact us if you have any concerns.\nThis message should only log once."),i.forEach((function(t){n=t[0],r=t[1],e.list(decodeURIComponent(n),r),e.list(n,0)})),n&&e.find.bad(n)}))}(f)}catch(e){}var y,v=function(){};return t.has[e.file]=f,f}if(i=String.fromCharCode(31),t.encode=function(e,t,n){var r=n=n||i;if("string"==typeof e){for(var o=e.indexOf(n);-1!=o;)r+=n,o=e.indexOf(n,o+1);return r+'"'+e+n}return e&&e["#"]&&1==Object.keys(e).length?r+"#"+void 0+r:"number"==typeof e?r+"+"+(e||0)+r:null===e?r+" "+r:!0===e?r+"+"+r:!1===e?r+"-"+r:void 0},t.decode=function(e,t,n){var r,o,a,s=-1,c=0;if((n=n||i)===e[0]){for(;n===e[++s];)++c;for(a=e[o=c]||!0;--c>=0;)s=e.indexOf(n,s+1);return-1==s&&(s=e.length),r=e.slice(o+1,s),t&&(t.i=s+1),'"'===a?r:"#"===a?{"#":r}:"+"===a?0===r.length||parseFloat(r):" "===a?null:"-"!==a&&void 0}},"undefined"!=typeof window){var n=window.Gun,r=window.Radix;window.Radisk=t}else{n=k,r=E;try{e.exports=t}catch(e){}}var i;t.Radix=r}()})),O="undefined"!=typeof window?window.Gun:k;function A(e){(e=e||{}).log=e.log||console.log,e.file=String(e.file||"radata");var n=t,r=function(){};if(A[e.file])return console.log("Warning: reusing same fs store and options as 1st."),A[e.file];A[e.file]=r;var i={};return r.put=function(t,r,o){var a=Math.random().toString(36).slice(-3);i[t]={id:a,data:r};var s=e.file+"-"+t+"-"+a+".tmp";n.writeFile(s,r,(function(r,c){if(r)return a===(i[t]||"").id&&delete i[t],o(r);!function(e,t,r){n.rename(e,t,(function(i){if(i)if("EXDEV"===i.code){var o=n.createReadStream(e),a=n.createWriteStream(t);o.on("error",r),a.on("error",r),o.on("close",(function(){n.unlink(e,r)})),o.pipe(a)}else r(i);else r()}))}(s,e.file+"/"+t,(function(e,n){a===(i[t]||"").id&&delete i[t],o(e,n||!e)}))}))},r.get=function(t,r){var o;(o=i[t])?r(void 0,o.data):n.readFile(e.file+"/"+t,(function(t,n){if(t){if("ENOENT"===(t.code||"").toUpperCase())return r();e.log("ERROR:",t)}r(t,n)}))},n.existsSync(e.file)||n.mkdirSync(e.file),r.list=function(t,r,i,o){n.readdirSync(e.file).forEach((function(e){t(e)})),t()},r}O.on("create",(function(e){O.TESTING&&(e.opt.file="radatatest"),this.to.next(e);var t,n=e.opt;if(!1!==n.rad&&!1!==n.radisk&&(t+""==typeof process||"false"!=""+(process.env||"").RAD)){var r=O.window&&O.window.Radisk||T,i=r.Radix,o=r(n),a=String.fromCharCode(27),s=0;e.on("put",(function(t){if(this.to.next(t),!(t._||"").rad){var n=t["#"],r=t.put,i=r["#"],s=r["."],c=r[":"],u=r[">"],l=(t._||"").DBG;l&&(l.sp=l.sp||+new Date);var f=(t._||"").RPS||((t._||"").RPS=+new Date);o(i+a+s,{":":c,">":u},(function(t,r){l&&(l.spd=l.spd||+new Date),console.STAT&&console.STAT(f,+new Date-f,"put"),e.on("in",t?{"@":n,err:t,DBG:l}:{"@":n,ok:r,DBG:l})}),!1,l&&(l.r=l.r||{})),l&&(l.sps=l.sps||+new Date)}})),e.on("get",(function(u){this.to.next(u);var l=(u._||"").DBG=u.DBG;l&&(l.sg=+new Date);var f,h,p,d,g=u["#"],y=u.get,v=u.get["#"],m=u.get["."]||"",b={};if("string"==typeof v?h=v:v&&(t!==(p=v["*"])&&(b.limit=d=1),t!==v[">"]&&(b.start=v[">"]),t!==v["<"]&&(b.end=v["<"]),h=d?""+p:p||v["="],d=null),h&&!b.limit&&("string"==typeof m?h=h+a+(b.atom=m):m&&(t!==m[">"]&&(b.start=m[">"],b.limit=1),t!==m["<"]&&(b.end=m["<"],b.limit=1),t!==(p=m["*"])&&(b.limit=d=1),h&&(h=h+a+(d?""+(p||""):p||(b.atom=m["="]||""))))),((p=y["%"])||b.limit)&&(b.limit=p<=(b.pack||1e5)?p:1),(m["-"]||(v||{})["-"]||y["-"])&&(b.reverse=!0),(p=(e.next||"")[v])&&p.put)if(b.atom){if((p=(p.next||"")[b.atom])&&p.rad)return}else if(p&&p.rad)return;var w=O.state(),k=+new Date,x=0;function _(e,t,n,i){if(x++,e){var o,s=(t=(h+t).split(a)).slice(0,1)[0];if(t=t.slice(-1)[0],b.limit&&b.limit<=b.count)return!0;if("string"!=typeof e)return(f=f||{})[s]=O.state.ify(f[s],t,e[">"],o=e[":"],s),void(b.count=(b.count||0)+((o||"").length||9));b.count=(b.count||0)+e.length;var c=e.lastIndexOf(">"),u=r.decode(e.slice(c+1),null,a);e=r.decode(e.slice(0,c),null,a),(f=f||{})[s]=O.state.ify(f[s],t,u,e,s)}}l&&(l.sgm=k),o(h||"",(function(r,o,u){l&&(l.sgr=+new Date),l&&(l.sgi=u);try{n.store.stats.get.time[c%50]=+new Date-k,++c,n.store.stats.get.count++,r&&(n.store.stats.get.err=r)}catch(e){}var p,d;if(console.STAT&&console.STAT(k,+new Date-k,"got",JSON.stringify(h)),k=+new Date,(u=u||"").unit&&o&&t!==(p=o[":"])&&t!==(d=o[">"])){var S=h.split(a),E=S[0],T=S[1];(f=f||{})[E]=O.state.ify(f[E],T,d,p,E),e.$.get(E).get(T)._.rad=w}else o&&("string"!=typeof o&&(b.atom?o=t:i.map(o,_,b)),!f&&o&&_(o,""),!b.atom&&!m&"string"==typeof v&&!b.limit&&!b.more&&(e.$.get(v)._.rad=w));l&&(l.sgp=+new Date),console.STAT&&(s=+new Date-k)>9&&(console.STAT(k,s,"got prep time"),console.STAT(k,x,"got prep #")),x=0,k=+new Date;var A=function(){};A.faith=!0,A.rad=y,e.on("in",{"@":g,put:f,"%":u.more?1:t,err:r||t,_:A,DBG:l}),console.STAT&&(s=+new Date-k)>9&&console.STAT(k,s,"got emit",Object.keys(f||{}).length),f=t}),b,l&&(l.r=l.r||{})),l&&(l.sgd=+new Date),console.STAT&&(s=+new Date-k)>9&&console.STAT(k,s,"get call")})),(n.store||{}).stats={get:{time:{},count:0},put:{time:{},count:0}};var c=0}}));var j="undefined"!=typeof window?window.Gun:k;j.on("create",(function(e){this.to.next(e);var t=e.opt;!1!==t.rfs&&(t.store=t.store||!j.window&&A(t))}));var D,I,C=A;function N(e){(e=e||{}).file=String(e.file||"radata");var t=e.s3,n=t.s3,r={p:{},g:{},l:{}},i=function(){};return N[e.file]?(console.log("Warning: reusing same S3 store and options as 1st."),N[e.file]):(N[e.file]=i,i.put=function(e,i,o){var a={Bucket:t.bucket,Key:e,Body:i};r.p[e]=i,delete r.g[e],delete r.l[1],n.putObject(a,(function(t,n){delete r.p[e],o(t,"s3")}))},i.get=function(e,i){var o;if(o=r.p[e])i(D,o);else if(o=r.g[e])o.push(i);else{var a=r.g[e]=[i];n.getObject({Bucket:t.bucket,Key:e||""},(function(t,n){t&&"NoSuchKey"===t.code&&(t=D),delete r.g[e];for(var i,o=(n||"").Body,s=0;i=a[s++];)i&&i(t,o)}))}},i.list=function(e,o,a,s){if(!s){if(r.l[1])return r.l[1].push(e);s=r.l[1]=[e]}n.listObjectsV2(a=a||{Bucket:t.bucket},(function(t,n){if(t)return k.log(t,t.stack);n.IsTruncated?(a.ContinuationToken=n.NextContinuationToken,i.list(e,o,a,s)):delete r.l[1]}))},!1!==e.rfs&&function(e,t){var n=C(e),r=t.put,i=t.get;t.put=function(e,t,i){var o,a,s=function(e,t){return a?i(e||a):o?i(e,t):(o=!0,void(a=e))};r(e,t,s),n.put(e,t,s)},t.get=function(e,t){n.get(e,(function(n,r){if(r)return t(n,r);i(e,t)}))}}(e,i),i)}k.on("create",(function(e){this.to.next(e);var t=e.opt;if(t.s3||process.env.AWS_S3_BUCKET){try{I=r}catch(e){console.log("Please `npm install aws-sdk` or add it to your package.json !"),AWS_SDK_NOT_INSTALLED}var n=t.s3||(t.s3={});n.bucket=n.bucket||process.env.AWS_S3_BUCKET,n.region=n.region||process.env.AWS_REGION||"us-east-1",n.accessKeyId=n.key=n.key||n.accessKeyId||process.env.AWS_ACCESS_KEY_ID,n.secretAccessKey=n.secret=n.secret||n.secretAccessKey||process.env.AWS_SECRET_ACCESS_KEY,(t.fakes3=t.fakes3||process.env.fakes3)&&(n.endpoint=t.fakes3,n.sslEnabled=!1,n.bucket=n.bucket.replace(".","p")),n.config=new I.Config(n),n.s3=n.s3||new I.S3(n.config),t.store=0===Object.keys(n.s3).length?t.store:N(t)}}));var M={BINARY_TYPES:["nodebuffer","arraybuffer","fragments"],GUID:"258EAFA5-E914-47DA-95CA-C5AB0DC85B11",kStatusCode:Symbol("status-code"),kWebSocket:Symbol("websocket"),EMPTY_BUFFER:Buffer.alloc(0),NOOP:()=>{}},L=b((function(e){const{EMPTY_BUFFER:t}=M;function n(e,n){if(0===e.length)return t;if(1===e.length)return e[0];const r=Buffer.allocUnsafe(n);let i=0;for(let t=0;t{this.pending--,this[R]()},this.concurrency=e||Infinity,this.jobs=[],this.pending=0}add(e){this.jobs.push(e),this[R]()}[R](){if(this.pending!==this.concurrency&&this.jobs.length){const e=this.jobs.shift();this.pending++,e(this[P])}}};const{kStatusCode:U,NOOP:$}=M,G=Buffer.from([0,0,255,255]),F=Symbol("permessage-deflate"),W=Symbol("total-length"),z=Symbol("callback"),K=Symbol("buffers"),q=Symbol("error");let H;var J=class{constructor(e,t,n){this._maxPayload=0|n,this._options=e||{},this._threshold=void 0!==this._options.threshold?this._options.threshold:1024,this._isServer=!!t,this._deflate=null,this._inflate=null,this.params=null,H||(H=new B(void 0!==this._options.concurrencyLimit?this._options.concurrencyLimit:10))}static get extensionName(){return"permessage-deflate"}offer(){const e={};return this._options.serverNoContextTakeover&&(e.server_no_context_takeover=!0),this._options.clientNoContextTakeover&&(e.client_no_context_takeover=!0),this._options.serverMaxWindowBits&&(e.server_max_window_bits=this._options.serverMaxWindowBits),this._options.clientMaxWindowBits?e.client_max_window_bits=this._options.clientMaxWindowBits:null==this._options.clientMaxWindowBits&&(e.client_max_window_bits=!0),e}accept(e){return e=this.normalizeParams(e),this.params=this._isServer?this.acceptAsServer(e):this.acceptAsClient(e),this.params}cleanup(){if(this._inflate&&(this._inflate.close(),this._inflate=null),this._deflate){const e=this._deflate[z];this._deflate.close(),this._deflate=null,e&&e(new Error("The deflate stream was closed while data was being processed"))}}acceptAsServer(e){const t=this._options,n=e.find(e=>!(!1===t.serverNoContextTakeover&&e.server_no_context_takeover||e.server_max_window_bits&&(!1===t.serverMaxWindowBits||"number"==typeof t.serverMaxWindowBits&&t.serverMaxWindowBits>e.server_max_window_bits)||"number"==typeof t.clientMaxWindowBits&&!e.client_max_window_bits));if(!n)throw new Error("None of the extension offers can be accepted");return t.serverNoContextTakeover&&(n.server_no_context_takeover=!0),t.clientNoContextTakeover&&(n.client_no_context_takeover=!0),"number"==typeof t.serverMaxWindowBits&&(n.server_max_window_bits=t.serverMaxWindowBits),"number"==typeof t.clientMaxWindowBits?n.client_max_window_bits=t.clientMaxWindowBits:!0!==n.client_max_window_bits&&!1!==t.clientMaxWindowBits||delete n.client_max_window_bits,n}acceptAsClient(e){const t=e[0];if(!1===this._options.clientNoContextTakeover&&t.client_no_context_takeover)throw new Error('Unexpected parameter "client_no_context_takeover"');if(t.client_max_window_bits){if(!1===this._options.clientMaxWindowBits||"number"==typeof this._options.clientMaxWindowBits&&t.client_max_window_bits>this._options.clientMaxWindowBits)throw new Error('Unexpected or invalid parameter "client_max_window_bits"')}else"number"==typeof this._options.clientMaxWindowBits&&(t.client_max_window_bits=this._options.clientMaxWindowBits);return t}normalizeParams(e){return e.forEach(e=>{Object.keys(e).forEach(t=>{let n=e[t];if(n.length>1)throw new Error(`Parameter "${t}" must have only a single value`);if(n=n[0],"client_max_window_bits"===t){if(!0!==n){const e=+n;if(!Number.isInteger(e)||e<8||e>15)throw new TypeError(`Invalid value for parameter "${t}": ${n}`);n=e}else if(!this._isServer)throw new TypeError(`Invalid value for parameter "${t}": ${n}`)}else if("server_max_window_bits"===t){const e=+n;if(!Number.isInteger(e)||e<8||e>15)throw new TypeError(`Invalid value for parameter "${t}": ${n}`);n=e}else{if("client_no_context_takeover"!==t&&"server_no_context_takeover"!==t)throw new Error(`Unknown parameter "${t}"`);if(!0!==n)throw new TypeError(`Invalid value for parameter "${t}": ${n}`)}e[t]=n})}),e}decompress(e,t,n){H.add(r=>{this._decompress(e,t,(e,t)=>{r(),n(e,t)})})}compress(e,t,n){H.add(r=>{this._compress(e,t,(e,t)=>{r(),n(e,t)})})}_decompress(e,t,n){const r=this._isServer?"client":"server";if(!this._inflate){const e=r+"_max_window_bits";this._inflate=h.createInflateRaw({...this._options.zlibInflateOptions,windowBits:"number"!=typeof this.params[e]?h.Z_DEFAULT_WINDOWBITS:this.params[e]}),this._inflate[F]=this,this._inflate[W]=0,this._inflate[K]=[],this._inflate.on("error",X),this._inflate.on("data",Y)}this._inflate[z]=n,this._inflate.write(e),t&&this._inflate.write(G),this._inflate.flush(()=>{const e=this._inflate[q];if(e)return this._inflate.close(),this._inflate=null,void n(e);const i=L.concat(this._inflate[K],this._inflate[W]);this._inflate._readableState.endEmitted?(this._inflate.close(),this._inflate=null):(this._inflate[W]=0,this._inflate[K]=[],t&&this.params[r+"_no_context_takeover"]&&this._inflate.reset()),n(null,i)})}_compress(e,t,n){const r=this._isServer?"server":"client";if(!this._deflate){const e=r+"_max_window_bits";this._deflate=h.createDeflateRaw({...this._options.zlibDeflateOptions,windowBits:"number"!=typeof this.params[e]?h.Z_DEFAULT_WINDOWBITS:this.params[e]}),this._deflate[W]=0,this._deflate[K]=[],this._deflate.on("error",$),this._deflate.on("data",V)}this._deflate[z]=n,this._deflate.write(e),this._deflate.flush(h.Z_SYNC_FLUSH,()=>{if(!this._deflate)return;let e=L.concat(this._deflate[K],this._deflate[W]);t&&(e=e.slice(0,e.length-4)),this._deflate[z]=null,this._deflate[W]=0,this._deflate[K]=[],t&&this.params[r+"_no_context_takeover"]&&this._deflate.reset(),n(null,e)})}};function V(e){this[K].push(e),this[W]+=e.length}function Y(e){this[W]+=e.length,this[F]._maxPayload<1||this[W]<=this[F]._maxPayload?this[K].push(e):(this[q]=new RangeError("Max payload size exceeded"),this[q].code="WS_ERR_UNSUPPORTED_MESSAGE_LENGTH",this[q][U]=1009,this.removeListener("data",Y),this.reset())}function X(e){this[F]._inflate=null,e[U]=1007,this[z](e)}var Q=b((function(e){function t(e){return e>=1e3&&e<=1014&&1004!==e&&1005!==e&&1006!==e||e>=3e3&&e<=4999}function n(e){const t=e.length;let n=0;for(;n=t||128!=(192&e[n+1])||128!=(192&e[n+2])||224===e[n]&&128==(224&e[n+1])||237===e[n]&&160==(224&e[n+1]))return!1;n+=3}else{if(240!=(248&e[n]))return!1;if(n+3>=t||128!=(192&e[n+1])||128!=(192&e[n+2])||128!=(192&e[n+3])||240===e[n]&&128==(240&e[n+1])||244===e[n]&&e[n+1]>143||e[n]>244)return!1;n+=4}return!0}try{let r=d;"object"==typeof r&&(r=r.Validation.isValidUTF8),e.exports={isValidStatusCode:t,isValidUTF8:e=>e.length<150?n(e):r(e)}}catch(r){e.exports={isValidStatusCode:t,isValidUTF8:n}}}));const{Writable:Z}=f,{BINARY_TYPES:ee,EMPTY_BUFFER:te,kStatusCode:ne,kWebSocket:re}=M,{concat:ie,toArrayBuffer:oe,unmask:ae}=L,{isValidStatusCode:se,isValidUTF8:ce}=Q;var ue=class extends Z{constructor(e,t,n,r){super(),this._binaryType=e||ee[0],this[re]=void 0,this._extensions=t||{},this._isServer=!!n,this._maxPayload=0|r,this._bufferedBytes=0,this._buffers=[],this._compressed=!1,this._payloadLength=0,this._mask=void 0,this._fragmented=0,this._masked=!1,this._fin=!1,this._opcode=0,this._totalPayloadLength=0,this._messageLength=0,this._fragments=[],this._state=0,this._loop=!1}_write(e,t,n){if(8===this._opcode&&0==this._state)return n();this._bufferedBytes+=e.length,this._buffers.push(e),this.startLoop(n)}consume(e){if(this._bufferedBytes-=e,e===this._buffers[0].length)return this._buffers.shift();if(e=n.length?t.set(this._buffers.shift(),r):(t.set(new Uint8Array(n.buffer,n.byteOffset,e),r),this._buffers[0]=n.slice(e)),e-=n.length}while(e>0);return t}startLoop(e){let t;this._loop=!0;do{switch(this._state){case 0:t=this.getInfo();break;case 1:t=this.getPayloadLength16();break;case 2:t=this.getPayloadLength64();break;case 3:this.getMask();break;case 4:t=this.getData(e);break;default:return void(this._loop=!1)}}while(this._loop);e(t)}getInfo(){if(this._bufferedBytes<2)return void(this._loop=!1);const e=this.consume(2);if(0!=(48&e[0]))return this._loop=!1,le(RangeError,"RSV2 and RSV3 must be clear",!0,1002,"WS_ERR_UNEXPECTED_RSV_2_3");const t=64==(64&e[0]);if(t&&!this._extensions[J.extensionName])return this._loop=!1,le(RangeError,"RSV1 must be clear",!0,1002,"WS_ERR_UNEXPECTED_RSV_1");if(this._fin=128==(128&e[0]),this._opcode=15&e[0],this._payloadLength=127&e[1],0===this._opcode){if(t)return this._loop=!1,le(RangeError,"RSV1 must be clear",!0,1002,"WS_ERR_UNEXPECTED_RSV_1");if(!this._fragmented)return this._loop=!1,le(RangeError,"invalid opcode 0",!0,1002,"WS_ERR_INVALID_OPCODE");this._opcode=this._fragmented}else if(1===this._opcode||2===this._opcode){if(this._fragmented)return this._loop=!1,le(RangeError,"invalid opcode "+this._opcode,!0,1002,"WS_ERR_INVALID_OPCODE");this._compressed=t}else{if(!(this._opcode>7&&this._opcode<11))return this._loop=!1,le(RangeError,"invalid opcode "+this._opcode,!0,1002,"WS_ERR_INVALID_OPCODE");if(!this._fin)return this._loop=!1,le(RangeError,"FIN must be set",!0,1002,"WS_ERR_EXPECTED_FIN");if(t)return this._loop=!1,le(RangeError,"RSV1 must be clear",!0,1002,"WS_ERR_UNEXPECTED_RSV_1");if(this._payloadLength>125)return this._loop=!1,le(RangeError,"invalid payload length "+this._payloadLength,!0,1002,"WS_ERR_INVALID_CONTROL_PAYLOAD_LENGTH")}if(this._fin||this._fragmented||(this._fragmented=this._opcode),this._masked=128==(128&e[1]),this._isServer){if(!this._masked)return this._loop=!1,le(RangeError,"MASK must be set",!0,1002,"WS_ERR_EXPECTED_MASK")}else if(this._masked)return this._loop=!1,le(RangeError,"MASK must be clear",!0,1002,"WS_ERR_UNEXPECTED_MASK");if(126===this._payloadLength)this._state=1;else{if(127!==this._payloadLength)return this.haveLength();this._state=2}}getPayloadLength16(){if(!(this._bufferedBytes<2))return this._payloadLength=this.consume(2).readUInt16BE(0),this.haveLength();this._loop=!1}getPayloadLength64(){if(this._bufferedBytes<8)return void(this._loop=!1);const e=this.consume(8),t=e.readUInt32BE(0);return t>Math.pow(2,21)-1?(this._loop=!1,le(RangeError,"Unsupported WebSocket frame: payload length > 2^53 - 1",!1,1009,"WS_ERR_UNSUPPORTED_DATA_PAYLOAD_LENGTH")):(this._payloadLength=t*Math.pow(2,32)+e.readUInt32BE(4),this.haveLength())}haveLength(){if(this._payloadLength&&this._opcode<8&&(this._totalPayloadLength+=this._payloadLength,this._totalPayloadLength>this._maxPayload&&this._maxPayload>0))return this._loop=!1,le(RangeError,"Max payload size exceeded",!1,1009,"WS_ERR_UNSUPPORTED_MESSAGE_LENGTH");this._state=this._masked?3:4}getMask(){this._bufferedBytes<4?this._loop=!1:(this._mask=this.consume(4),this._state=4)}getData(e){let t=te;if(this._payloadLength){if(this._bufferedBytes7?this.controlMessage(t):this._compressed?(this._state=5,void this.decompress(t,e)):(t.length&&(this._messageLength=this._totalPayloadLength,this._fragments.push(t)),this.dataMessage())}decompress(e,t){this._extensions[J.extensionName].decompress(e,this._fin,(e,n)=>{if(e)return t(e);if(n.length){if(this._messageLength+=n.length,this._messageLength>this._maxPayload&&this._maxPayload>0)return t(le(RangeError,"Max payload size exceeded",!1,1009,"WS_ERR_UNSUPPORTED_MESSAGE_LENGTH"));this._fragments.push(n)}const r=this.dataMessage();if(r)return t(r);this.startLoop(t)})}dataMessage(){if(this._fin){const e=this._messageLength,t=this._fragments;if(this._totalPayloadLength=0,this._messageLength=0,this._fragmented=0,this._fragments=[],2===this._opcode){let n;n="nodebuffer"===this._binaryType?ie(t,e):"arraybuffer"===this._binaryType?oe(ie(t,e)):t,this.emit("message",n)}else{const n=ie(t,e);if(!ce(n))return this._loop=!1,le(Error,"invalid UTF-8 sequence",!0,1007,"WS_ERR_INVALID_UTF8");this.emit("message",n.toString())}}this._state=0}controlMessage(e){if(8===this._opcode)if(this._loop=!1,0===e.length)this.emit("conclude",1005,""),this.end();else{if(1===e.length)return le(RangeError,"invalid payload length 1",!0,1002,"WS_ERR_INVALID_CONTROL_PAYLOAD_LENGTH");{const t=e.readUInt16BE(0);if(!se(t))return le(RangeError,"invalid status code "+t,!0,1002,"WS_ERR_INVALID_CLOSE_CODE");const n=e.slice(2);if(!ce(n))return le(Error,"invalid UTF-8 sequence",!0,1007,"WS_ERR_INVALID_UTF8");this.emit("conclude",t,n.toString()),this.end()}}else this.emit(9===this._opcode?"ping":"pong",e);this._state=0}};function le(e,t,n,r,i){const o=new e(n?"Invalid WebSocket frame: "+t:t);return Error.captureStackTrace(o,le),o.code=i,o[ne]=r,o}const{randomFillSync:fe}=l,{EMPTY_BUFFER:he}=M,{isValidStatusCode:pe}=Q,{mask:de,toBuffer:ge}=L,ye=Buffer.alloc(4);class ve{constructor(e,t){this._extensions=t||{},this._socket=e,this._firstFragment=!0,this._compress=!1,this._bufferedBytes=0,this._deflating=!1,this._queue=[]}static frame(e,t){const n=t.mask&&t.readOnly;let r=t.mask?6:2,i=e.length;e.length>=65536?(r+=8,i=127):e.length>125&&(r+=2,i=126);const o=Buffer.allocUnsafe(n?e.length+r:r);return o[0]=t.fin?128|t.opcode:t.opcode,t.rsv1&&(o[0]|=64),o[1]=i,126===i?o.writeUInt16BE(e.length,2):127===i&&(o.writeUInt32BE(0,2),o.writeUInt32BE(e.length,6)),t.mask?(fe(ye,0,4),o[1]|=128,o[r-4]=ye[0],o[r-3]=ye[1],o[r-2]=ye[2],o[r-1]=ye[3],n?(de(e,ye,o,r,e.length),[o]):(de(e,ye,e,0,e.length),[o,e])):[o,e]}close(e,t,n,r){let i;if(void 0===e)i=he;else{if("number"!=typeof e||!pe(e))throw new TypeError("First argument must be a valid error code number");if(void 0===t||""===t)i=Buffer.allocUnsafe(2),i.writeUInt16BE(e,0);else{const n=Buffer.byteLength(t);if(n>123)throw new RangeError("The message must not be greater than 123 bytes");i=Buffer.allocUnsafe(2+n),i.writeUInt16BE(e,0),i.write(t,2)}}this._deflating?this.enqueue([this.doClose,i,n,r]):this.doClose(i,n,r)}doClose(e,t,n){this.sendFrame(ve.frame(e,{fin:!0,rsv1:!1,opcode:8,mask:t,readOnly:!1}),n)}ping(e,t,n){const r=ge(e);if(r.length>125)throw new RangeError("The data size must not be greater than 125 bytes");this._deflating?this.enqueue([this.doPing,r,t,ge.readOnly,n]):this.doPing(r,t,ge.readOnly,n)}doPing(e,t,n,r){this.sendFrame(ve.frame(e,{fin:!0,rsv1:!1,opcode:9,mask:t,readOnly:n}),r)}pong(e,t,n){const r=ge(e);if(r.length>125)throw new RangeError("The data size must not be greater than 125 bytes");this._deflating?this.enqueue([this.doPong,r,t,ge.readOnly,n]):this.doPong(r,t,ge.readOnly,n)}doPong(e,t,n,r){this.sendFrame(ve.frame(e,{fin:!0,rsv1:!1,opcode:10,mask:t,readOnly:n}),r)}send(e,t,n){const r=ge(e),i=this._extensions[J.extensionName];let o=t.binary?2:1,a=t.compress;if(this._firstFragment?(this._firstFragment=!1,a&&i&&(a=r.length>=i._threshold),this._compress=a):(a=!1,o=0),t.fin&&(this._firstFragment=!0),i){const e={fin:t.fin,rsv1:a,opcode:o,mask:t.mask,readOnly:ge.readOnly};this._deflating?this.enqueue([this.dispatch,r,this._compress,e,n]):this.dispatch(r,this._compress,e,n)}else this.sendFrame(ve.frame(r,{fin:t.fin,rsv1:!1,opcode:o,mask:t.mask,readOnly:ge.readOnly}),n)}dispatch(e,t,n,r){if(!t)return void this.sendFrame(ve.frame(e,n),r);const i=this._extensions[J.extensionName];this._bufferedBytes+=e.length,this._deflating=!0,i.compress(e,n.fin,(t,i)=>{if(this._socket.destroyed){const e=new Error("The socket was closed while data was being compressed");"function"==typeof r&&r(e);for(let t=0;t{let n=e[t];return Array.isArray(n)||(n=[n]),n.map(e=>[t].concat(Object.keys(e).map(t=>{let n=e[t];return Array.isArray(n)||(n=[n]),n.map(e=>!0===e?t:`${t}=${e}`).join("; ")})).join("; ")).join(", ")}).join(", ")},parse:function(e){const t=Object.create(null);if(void 0===e||""===e)return t;let n,r,i=Object.create(null),o=!1,a=!1,s=!1,c=-1,u=-1,l=0;for(;l{Ve(t,g,"Opening handshake has timed out")}),g.on("error",e=>{null===g||g.aborted||(g=t._req=null,qe(t,e))}),g.on("response",a=>{const s=a.headers.location,c=a.statusCode;if(s&&o.followRedirects&&c>=300&&c<400){if(++t._redirects>o.maxRedirects)return void Ve(t,g,"Maximum redirects exceeded");let a;g.abort();try{a=new De(s,n)}catch(e){return void qe(t,e)}e(t,a,r,i)}else t.emit("unexpected-response",g,a)||Ve(t,g,"Unexpected server response: "+a.statusCode)}),g.on("upgrade",(e,n,i)=>{if(t.emit("upgrade",e),t.readyState!==ze.CONNECTING)return;if(g=t._req=null,"websocket"!==e.headers.upgrade.toLowerCase())return void Ve(t,n,"Invalid Upgrade header");const a=je("sha1").update(h+Ne).digest("base64");if(e.headers["sec-websocket-accept"]!==a)return void Ve(t,n,"Invalid Sec-WebSocket-Accept header");const s=e.headers["sec-websocket-protocol"],c=(r||"").split(/, */);let u;if(!r&&s?u="Server sent a subprotocol but none was requested":r&&!s?u="Server sent no subprotocol":s&&!c.includes(s)&&(u="Server sent an invalid subprotocol"),u)return void Ve(t,n,u);s&&(t._protocol=s);const l=e.headers["sec-websocket-extensions"];if(void 0!==l){if(!d)return void Ve(t,n,"Server sent a Sec-WebSocket-Extensions header but no extension was requested");let e;try{e=$e(l)}catch(e){return void Ve(t,n,"Invalid Sec-WebSocket-Extensions header")}const r=Object.keys(e);if(r.length){if(1!==r.length||r[0]!==J.extensionName)return void Ve(t,n,"Server indicated an extension that was not requested");try{d.accept(e[J.extensionName])}catch(e){return void Ve(t,n,"Invalid Sec-WebSocket-Extensions header")}t._extensions[J.extensionName]=d}}t.setSocket(n,i,o.maxPayload)})}(this,e,t,n)):this._isServer=!0}get binaryType(){return this._binaryType}set binaryType(e){Ie.includes(e)&&(this._binaryType=e,this._receiver&&(this._receiver._binaryType=e))}get bufferedAmount(){return this._socket?this._socket._writableState.length+this._sender._bufferedBytes:this._bufferedAmount}get extensions(){return Object.keys(this._extensions).join()}get onclose(){}set onclose(e){}get onerror(){}set onerror(e){}get onopen(){}set onopen(e){}get onmessage(){}set onmessage(e){}get protocol(){return this._protocol}get readyState(){return this._readyState}get url(){return this._url}setSocket(e,t,n){const r=new ue(this.binaryType,this._extensions,this._isServer,n);this._sender=new me(e,this._extensions),this._receiver=r,this._socket=e,r[Le]=this,e[Le]=this,r.on("conclude",Xe),r.on("drain",Qe),r.on("error",Ze),r.on("message",tt),r.on("ping",nt),r.on("pong",rt),e.setTimeout(0),e.setNoDelay(),t.length>0&&e.unshift(t),e.on("close",ot),e.on("data",at),e.on("end",st),e.on("error",ct),this._readyState=ze.OPEN,this.emit("open")}emitClose(){if(!this._socket)return this._readyState=ze.CLOSED,void this.emit("close",this._closeCode,this._closeMessage);this._extensions[J.extensionName]&&this._extensions[J.extensionName].cleanup(),this._receiver.removeAllListeners(),this._readyState=ze.CLOSED,this.emit("close",this._closeCode,this._closeMessage)}close(e,t){if(this.readyState!==ze.CLOSED){if(this.readyState===ze.CONNECTING)return Ve(this,this._req,"WebSocket was closed before the connection was established");this.readyState!==ze.CLOSING?(this._readyState=ze.CLOSING,this._sender.close(e,t,!this._isServer,e=>{e||(this._closeFrameSent=!0,(this._closeFrameReceived||this._receiver._writableState.errorEmitted)&&this._socket.end())}),this._closeTimer=setTimeout(this._socket.destroy.bind(this._socket),3e4)):this._closeFrameSent&&(this._closeFrameReceived||this._receiver._writableState.errorEmitted)&&this._socket.end()}}ping(e,t,n){if(this.readyState===ze.CONNECTING)throw new Error("WebSocket is not open: readyState 0 (CONNECTING)");"function"==typeof e?(n=e,e=t=void 0):"function"==typeof t&&(n=t,t=void 0),"number"==typeof e&&(e=e.toString()),this.readyState===ze.OPEN?(void 0===t&&(t=!this._isServer),this._sender.ping(e||Ce,t,n)):Ye(this,e,n)}pong(e,t,n){if(this.readyState===ze.CONNECTING)throw new Error("WebSocket is not open: readyState 0 (CONNECTING)");"function"==typeof e?(n=e,e=t=void 0):"function"==typeof t&&(n=t,t=void 0),"number"==typeof e&&(e=e.toString()),this.readyState===ze.OPEN?(void 0===t&&(t=!this._isServer),this._sender.pong(e||Ce,t,n)):Ye(this,e,n)}send(e,t,n){if(this.readyState===ze.CONNECTING)throw new Error("WebSocket is not open: readyState 0 (CONNECTING)");if("function"==typeof t&&(n=t,t={}),"number"==typeof e&&(e=e.toString()),this.readyState!==ze.OPEN)return void Ye(this,e,n);const r={binary:"string"!=typeof e,mask:!this._isServer,compress:!0,fin:!0,...t};this._extensions[J.extensionName]||(r.compress=!1),this._sender.send(e||Ce,r,n)}terminate(){if(this.readyState!==ze.CLOSED){if(this.readyState===ze.CONNECTING)return Ve(this,this._req,"WebSocket was closed before the connection was established");this._socket&&(this._readyState=ze.CLOSING,this._socket.destroy())}}}Object.defineProperty(ze,"CONNECTING",{enumerable:!0,value:Fe.indexOf("CONNECTING")}),Object.defineProperty(ze.prototype,"CONNECTING",{enumerable:!0,value:Fe.indexOf("CONNECTING")}),Object.defineProperty(ze,"OPEN",{enumerable:!0,value:Fe.indexOf("OPEN")}),Object.defineProperty(ze.prototype,"OPEN",{enumerable:!0,value:Fe.indexOf("OPEN")}),Object.defineProperty(ze,"CLOSING",{enumerable:!0,value:Fe.indexOf("CLOSING")}),Object.defineProperty(ze.prototype,"CLOSING",{enumerable:!0,value:Fe.indexOf("CLOSING")}),Object.defineProperty(ze,"CLOSED",{enumerable:!0,value:Fe.indexOf("CLOSED")}),Object.defineProperty(ze.prototype,"CLOSED",{enumerable:!0,value:Fe.indexOf("CLOSED")}),["binaryType","bufferedAmount","extensions","protocol","readyState","url"].forEach(e=>{Object.defineProperty(ze.prototype,e,{enumerable:!0})}),["open","error","close","message"].forEach(e=>{Object.defineProperty(ze.prototype,"on"+e,{enumerable:!0,get(){const t=this.listeners(e);for(let e=0;e`${e}: ${r[e]}`).join("\r\n")+"\r\n\r\n"+n)),e.removeListener("error",wt),e.destroy()}function xt(e){return e.trim()}Ke.createWebSocketStream=function(e,t){let n=!0,r=!0;function i(){n&&e._socket.resume()}e.readyState===e.CONNECTING?e.once("open",(function(){e._receiver.removeAllListeners("drain"),e._receiver.on("drain",i)})):(e._receiver.removeAllListeners("drain"),e._receiver.on("drain",i));const o=new ut({...t,autoDestroy:!1,emitClose:!1,objectMode:!1,writableObjectMode:!1});return e.on("message",(function(t){o.push(t)||(n=!1,e._socket.pause())})),e.once("error",(function(e){o.destroyed||(r=!1,o.destroy(e))})),e.once("close",(function(){o.destroyed||o.push(null)})),o._destroy=function(t,n){if(e.readyState===e.CLOSED)return n(t),void process.nextTick(lt,o);let i=!1;e.once("error",(function(e){i=!0,n(e)})),e.once("close",(function(){i||n(t),process.nextTick(lt,o)})),r&&e.terminate()},o._final=function(t){e.readyState!==e.CONNECTING?null!==e._socket&&(e._socket._writableState.finished?(t(),o._readableState.endEmitted&&o.destroy()):(e._socket.once("finish",(function(){t()})),e.close())):e.once("open",(function(){o._final(t)}))},o._read=function(){e.readyState!==e.OPEN&&e.readyState!==e.CLOSING||n||(n=!0,e._receiver._writableState.needDrain||e._socket.resume())},o._write=function(t,n,r){e.readyState!==e.CONNECTING?e.send(t,r):e.once("open",(function(){o._write(t,n,r)}))},o.on("end",ft),o.on("error",ht),o},Ke.Server=class extends o{constructor(e,t){if(super(),null==(e={maxPayload:104857600,perMessageDeflate:!1,handleProtocols:null,clientTracking:!0,verifyClient:null,noServer:!1,backlog:null,server:null,host:null,path:null,port:null,...e}).port&&!e.server&&!e.noServer||null!=e.port&&(e.server||e.noServer)||e.server&&e.noServer)throw new TypeError('One and only one of the "port", "server", or "noServer" options must be specified');if(null!=e.port?(this._server=s.createServer((e,t)=>{const n=s.STATUS_CODES[426];t.writeHead(426,{"Content-Length":n.length,"Content-Type":"text/plain"}),t.end(n)}),this._server.listen(e.port,e.host,e.backlog,t)):e.server&&(this._server=e.server),this._server){const e=this.emit.bind(this,"connection");this._removeListeners=function(e,t){for(const n of Object.keys(t))e.on(n,t[n]);return function(){for(const n of Object.keys(t))e.removeListener(n,t[n])}}(this._server,{listening:this.emit.bind(this,"listening"),error:this.emit.bind(this,"error"),upgrade:(t,n,r)=>{this.handleUpgrade(t,n,r,e)}})}!0===e.perMessageDeflate&&(e.perMessageDeflate={}),e.clientTracking&&(this.clients=new Set),this.options=e,this._state=0}address(){if(this.options.noServer)throw new Error('The server is operating in "noServer" mode');return this._server?this._server.address():null}close(e){if(e&&this.once("close",e),2===this._state)return void process.nextTick(bt,this);if(1===this._state)return;if(this._state=1,this.clients)for(const e of this.clients)e.terminate();const t=this._server;t&&(this._removeListeners(),this._removeListeners=this._server=null,null!=this.options.port)?t.close(bt.bind(void 0,this)):process.nextTick(bt,this)}shouldHandle(e){if(this.options.path){const t=e.url.indexOf("?");if((-1!==t?e.url.slice(0,t):e.url)!==this.options.path)return!1}return!0}handleUpgrade(e,t,n,r){t.on("error",wt);const i=void 0!==e.headers["sec-websocket-key"]&&e.headers["sec-websocket-key"].trim(),o=+e.headers["sec-websocket-version"],a={};if("GET"!==e.method||"websocket"!==e.headers.upgrade.toLowerCase()||!i||!mt.test(i)||8!==o&&13!==o||!this.shouldHandle(e))return kt(t,400);if(this.options.perMessageDeflate){const n=new J(this.options.perMessageDeflate,!0,this.options.maxPayload);try{const t=gt(e.headers["sec-websocket-extensions"]);t[J.extensionName]&&(n.accept(t[J.extensionName]),a[J.extensionName]=n)}catch(e){return kt(t,400)}}if(this.options.verifyClient){const s={origin:e.headers[8===o?"sec-websocket-origin":"origin"],secure:!(!e.socket.authorized&&!e.socket.encrypted),req:e};if(2===this.options.verifyClient.length)return void this.options.verifyClient(s,(o,s,c,u)=>{if(!o)return kt(t,s||401,c,u);this.completeUpgrade(i,a,e,t,n,r)});if(!this.options.verifyClient(s))return kt(t,401)}this.completeUpgrade(i,a,e,t,n,r)}completeUpgrade(e,t,n,r,i,o){if(!r.readable||!r.writable)return r.destroy();if(r[vt])throw new Error("server.handleUpgrade() was called more than once with the same socket, possibly due to a misconfiguration");if(this._state>0)return kt(r,503);const a=["HTTP/1.1 101 Switching Protocols","Upgrade: websocket","Connection: Upgrade","Sec-WebSocket-Accept: "+pt("sha1").update(e+yt).digest("base64")],s=new Ke(null);let c=n.headers["sec-websocket-protocol"];if(c&&(c=c.split(",").map(xt),c=this.options.handleProtocols?this.options.handleProtocols(c,n):c[0],c&&(a.push("Sec-WebSocket-Protocol: "+c),s._protocol=c)),t[J.extensionName]){const e=dt({[J.extensionName]:[t[J.extensionName].params]});a.push("Sec-WebSocket-Extensions: "+e),s._extensions=t}this.emit("headers",a,n),r.write(a.concat("\r\n").join("\r\n")),r.removeListener("error",wt),s.setSocket(r,i,this.options.maxPayload),this.clients&&(this.clients.add(s),s.on("close",()=>this.clients.delete(s))),o(s,n)}},Ke.Receiver=ue,Ke.Sender=me;var _t=Ke;k.on("opt",(function(e){var t=e.opt;if(!1===t.ws||t.once)this.to.next(e);else{t.mesh=t.mesh||k.Mesh(e),t.WebSocket=t.WebSocket||_t;var n=t.ws=t.ws||{};n.path=n.path||"/gun",n.noServer||(n.server=n.server||t.web,n.server)?(n.web=n.web||new t.WebSocket.Server(n),n.web.on("connection",(function(e,n){var r;e.headers=e.headers||(n||"").headers||"",console.STAT&&((console.STAT.sites||(console.STAT.sites={}))[e.headers.origin]=1),t.mesh.hi(r={wire:e}),e.on("message",(function(e){t.mesh.hear(e.data||e,r)})),e.on("close",(function(){t.mesh.bye(r)})),e.on("error",(function(e){})),setTimeout((function n(){if(t.peers[r.id]){try{e.send("[]")}catch(e){}setTimeout(n,2e4)}}),2e4)})),this.to.next(e)):this.to.next(e)}})),b((function(e){!function(){var t=this||self||t;function n(e,t){return t?w():e.slice?n[r(e)]:function(t,i){e(t={exports:{}}),n[r(i)]=t.exports};function r(e){return e.split("/").slice(-1).toString().replace(".js","")}}var r=e;n((function(e){void 0!==t&&(e.window=t);var n=(e.window||e).SEA||{};(n.window=e.window)&&(n.window.SEA=n);try{void 0+""!=typeof r&&(r.exports=n)}catch(e){}e.exports=n}))(n,"./root"),n((function(e){var t=n("./root");try{t.window&&location.protocol.indexOf("s")<0&&location.host.indexOf("localhost")<0&&!/^127\.\d+\.\d+\.\d+$/.test(location.hostname)&&location.protocol.indexOf("file:")<0&&(console.warn("HTTPS needed for WebCrypto in SEA, redirecting..."),location.protocol="https:")}catch(e){}}))(n,"./https"),n((function(e){var t;if(t+""==typeof btoa){if(t+""==typeof Buffer)try{m.Buffer=n("buffer",1).Buffer}catch(e){console.log("Please `npm install buffer` or add it to your package.json !")}m.btoa=function(e){return Buffer.from(e,"binary").toString("base64")},m.atob=function(e){return Buffer.from(e,"base64").toString("binary")}}}))(n,"./base64"),n((function(e){function t(){}n("./base64"),Object.assign(t,{from:Array.from}),(t.prototype=Object.create(Array.prototype)).toString=function(e,t,n){t=t||0;const r=this.length;if("hex"===(e=e||"utf8")){const e=new Uint8Array(this);return[...Array((n&&n+1||r)-t).keys()].map(n=>e[n+t].toString(16).padStart(2,"0")).join("")}return"utf8"===e?Array.from({length:(n||r)-t},(e,n)=>String.fromCharCode(this[n+t])).join(""):"base64"===e?btoa(this):void 0},e.exports=t}))(n,"./array"),n((function(e){n("./base64");var t=n("./array");function r(...e){return console.warn("new SafeBuffer() is depreciated, please use SafeBuffer.from()"),r.from(...e)}r.prototype=Object.create(Array.prototype),Object.assign(r,{from(){if(!Object.keys(arguments).length||null==arguments[0])throw new TypeError("First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.");const e=arguments[0];let n;if("string"==typeof e){const r=arguments[1]||"utf8";if("hex"===r){const r=e.match(/([\da-fA-F]{2})/g).map(e=>parseInt(e,16));if(!r||!r.length)throw new TypeError("Invalid first argument for type 'hex'.");n=t.from(r)}else if("utf8"===r||"binary"===r){const r=new Uint16Array(e.length);n=t.from(r)}else if("base64"===r){const r=atob(e),i=new Uint8Array(r.length);n=t.from(i)}else"binary"===r?n=t.from(e):console.info("SafeBuffer.from unknown encoding: "+r);return n}if(e.byteLength?e.byteLength:e.length){let n;return e instanceof ArrayBuffer&&(n=new Uint8Array(e)),t.from(n||e)}},alloc:(e,n=0)=>t.from(new Uint8Array(Array.from({length:e},()=>n))),allocUnsafe:e=>t.from(new Uint8Array(Array.from({length:e}))),concat(e){if(!Array.isArray(e))throw new TypeError("First argument must be Array containing ArrayBuffer or Uint8Array instances.");return t.from(e.reduce((e,t)=>e.concat(Array.from(t)),[]))}}),r.prototype.from=r.from,r.prototype.toString=t.prototype.toString,e.exports=r}))(n,"./buffer"),n((function(e){const i=n("./root"),o={Buffer:n("./buffer")};var a={};if(JSON.parseAsync=JSON.parseAsync||function(e,t,n){try{t(void 0,JSON.parse(e,n))}catch(e){t(e)}},JSON.stringifyAsync=JSON.stringifyAsync||function(e,t,n,r){try{t(void 0,JSON.stringify(e,n,r))}catch(e){t(e)}},o.parse=function(e,t){return new Promise((function(n,r){JSON.parseAsync(e,(function(e,t){e?r(e):n(t)}),t)}))},o.stringify=function(e,t,n){return new Promise((function(r,i){JSON.stringifyAsync(e,(function(e,t){e?i(e):r(t)}),t,n)}))},i.window&&(o.crypto=t.crypto||t.msCrypto,o.subtle=(o.crypto||a).subtle||(o.crypto||a).webkitSubtle,o.TextEncoder=t.TextEncoder,o.TextDecoder=t.TextDecoder,o.random=e=>o.Buffer.from(o.crypto.getRandomValues(new Uint8Array(o.Buffer.alloc(e))))),!o.TextDecoder){const{TextEncoder:e,TextDecoder:t}=n((void 0+""==typeof r?".":"")+"./lib/text-encoding",1);o.TextDecoder=t,o.TextEncoder=e}if(!o.crypto)try{var s=n("crypto",1);Object.assign(o,{crypto:s,random:e=>o.Buffer.from(s.randomBytes(e))});const{Crypto:e}=n("@peculiar/webcrypto",1);o.ossl=o.subtle=new e({directory:"ossl"}).subtle}catch(e){console.log("Please `npm install @peculiar/webcrypto` or add it to your package.json !")}e.exports=o}))(n,"./shim"),n((function(e){var t=n("./root"),r=n("./shim"),i={pbkdf2:{hash:{name:"SHA-256"},iter:1e5,ks:64},ecdsa:{pair:{name:"ECDSA",namedCurve:"P-256"},sign:{name:"ECDSA",hash:{name:"SHA-256"}}},ecdh:{name:"ECDH",namedCurve:"P-256"},jwk:function(e,t){var n={kty:"EC",crv:"P-256",x:(e=e.split("."))[0],y:e[1],ext:!0};return n.key_ops=t?["sign"]:["verify"],t&&(n.d=t),n},keyToJwk:function(e){return{kty:"oct",k:e.toString("base64").replace(/\+/g,"-").replace(/\//g,"_").replace(/\=/g,""),ext:!1,alg:"A256GCM"}},recall:{validity:43200,hook:function(e){return e}},check:function(e){return"string"==typeof e&&"SEA{"===e.slice(0,4)},parse:async function(e){try{var t="string"==typeof e;return t&&"SEA{"===e.slice(0,4)&&(e=e.slice(3)),t?await r.parse(e):e}catch(e){}return e}};t.opt=i,e.exports=i}))(n,"./settings"),n((function(e){var t=n("./shim");e.exports=async function(e,n){var r="string"==typeof e?e:await t.stringify(e),i=await t.subtle.digest({name:n||"SHA-256"},(new t.TextEncoder).encode(r));return t.Buffer.from(i)}}))(n,"./sha256"),n((function(e){const t=n("./shim"),r=t.ossl?t.ossl:t.subtle;e.exports=e=>r.digest({name:"SHA-1"},new ArrayBuffer(e))}))(n,"./sha1"),n((function(e){var t=n("./root"),r=n("./shim"),i=n("./settings"),o=n("./sha256");t.work=t.work||(async(e,n,a,s)=>{try{var c=(n||{}).epub||n;if(s=s||{},c instanceof Function&&(a=c,c=void 0),e="string"==typeof e?e:await r.stringify(e),"sha"===(s.name||"").toLowerCase().slice(0,3)){var u=r.Buffer.from(await o(e,s.name),"binary").toString(s.encode||"base64");if(a)try{a(u)}catch(e){console.log(e)}return u}c=c||r.random(9);var l=await(r.ossl||r.subtle).importKey("raw",(new r.TextEncoder).encode(e),{name:s.name||"PBKDF2"},!1,["deriveBits"]),f=await(r.ossl||r.subtle).deriveBits({name:s.name||"PBKDF2",iterations:s.iterations||i.pbkdf2.iter,salt:(new r.TextEncoder).encode(s.salt||c),hash:s.hash||i.pbkdf2.hash},l,s.length||8*i.pbkdf2.ks);e=r.random(e.length);var h=r.Buffer.from(f,"binary").toString(s.encode||"base64");if(a)try{a(h)}catch(e){console.log(e)}return h}catch(e){if(console.log(e),t.err=e,t.throw)throw e;return void(a&&a())}}),e.exports=t.work}))(n,"./work"),n((function(e){var t=n("./root"),r=n("./shim");n("./settings"),t.name=t.name||(async(e,n)=>{try{if(e)try{e()}catch(e){console.log(e)}return}catch(n){if(console.log(n),t.err=n,t.throw)throw n;return void(e&&e())}}),t.pair=t.pair||(async(e,n)=>{try{var i=r.ossl||r.subtle,o=await r.subtle.generateKey({name:"ECDSA",namedCurve:"P-256"},!0,["sign","verify"]).then(async e=>{var t={};t.priv=(await r.subtle.exportKey("jwk",e.privateKey)).d;var n=await r.subtle.exportKey("jwk",e.publicKey);return t.pub=n.x+"."+n.y,t});try{var a=await i.generateKey({name:"ECDH",namedCurve:"P-256"},!0,["deriveKey"]).then(async e=>{var t={};t.epriv=(await i.exportKey("jwk",e.privateKey)).d;var n=await i.exportKey("jwk",e.publicKey);return t.epub=n.x+"."+n.y,t})}catch(e){if(t.window)throw e;if("Error: ECDH is not a supported algorithm"!=e)throw e;console.log("Ignoring ECDH...")}var s={pub:o.pub,priv:o.priv,epub:(a=a||{}).epub,epriv:a.epriv};if(e)try{e(s)}catch(e){console.log(e)}return s}catch(n){if(console.log(n),t.err=n,t.throw)throw n;return void(e&&e())}}),e.exports=t.pair}))(n,"./pair"),n((function(e){var t,r=n("./root"),i=n("./shim"),o=n("./settings"),a=n("./sha256");r.sign=r.sign||(async(e,n,s,c)=>{try{if(c=c||{},!(n||c).priv){if(!r.I)throw"No signing key.";n=await r.I(null,{what:e,how:"sign",why:c.why})}if(t===e)throw"`undefined` not allowed.";var u=await o.parse(e),l=c.check=c.check||u;if(r.verify&&(r.opt.check(l)||l&&l.s&&l.m)&&t!==await r.verify(l,n)){var f=await o.parse(l);if(c.raw||(f="SEA"+await i.stringify(f)),s)try{s(f)}catch(e){console.log(e)}return f}var h=o.jwk(n.pub,n.priv),p=await a(u),d=await(i.ossl||i.subtle).importKey("jwk",h,{name:"ECDSA",namedCurve:"P-256"},!1,["sign"]).then(e=>(i.ossl||i.subtle).sign({name:"ECDSA",hash:{name:"SHA-256"}},e,new Uint8Array(p)));if(f={m:u,s:i.Buffer.from(d,"binary").toString(c.encode||"base64")},c.raw||(f="SEA"+await i.stringify(f)),s)try{s(f)}catch(e){console.log(e)}return f}catch(e){if(console.log(e),r.err=e,r.throw)throw e;return void(s&&s())}}),e.exports=r.sign}))(n,"./sign"),n((function(e){var t,r=n("./root"),i=n("./shim"),o=n("./settings"),a=n("./sha256");r.verify=r.verify||(async(e,n,s,c)=>{try{var u=await o.parse(e);if(!1===n){var l=await o.parse(u.m);if(s)try{s(l)}catch(e){console.log(e)}return l}c=c||{};var f,h,p,d=n.pub||n,g=r.opt.slow_leak?await r.opt.slow_leak(d):await(i.ossl||i.subtle).importKey("jwk",o.jwk(d),{name:"ECDSA",namedCurve:"P-256"},!1,["verify"]),y=await a(u.m);try{if(f=i.Buffer.from(u.s,c.encode||"base64"),h=new Uint8Array(f),!(p=await(i.ossl||i.subtle).verify({name:"ECDSA",hash:{name:"SHA-256"}},g,h,new Uint8Array(y))))throw"Signature did not match."}catch(t){if(r.opt.fallback)return await r.opt.fall_verify(e,n,s,c)}var v=p?await o.parse(u.m):t;if(s)try{s(v)}catch(e){console.log(e)}return v}catch(e){if(console.log(e),r.err=e,r.throw)throw e;return void(s&&s())}}),e.exports=r.verify;var s={},c=(r.opt.slow_leak=e=>{if(s[e])return s[e];var t=o.jwk(e);return s[e]=(i.ossl||i.subtle).importKey("jwk",t,{name:"ECDSA",namedCurve:"P-256"},!1,["verify"]),s[e]},r.opt);r.opt.fall_verify=async function(e,n,s,u,l){if(l===r.opt.fallback)throw"Signature did not match";l=l||1;var f=e||"";e=r.opt.unpack(e)||e;var h,p,d,g=await o.parse(e),y=n.pub||n,v=await r.opt.slow_leak(y),m=l<=r.opt.fallback?i.Buffer.from(await i.subtle.digest({name:"SHA-256"},(new i.TextEncoder).encode(await o.parse(g.m)))):await a(g.m);try{if(h=i.Buffer.from(g.s,u.encode||"base64"),p=new Uint8Array(h),!(d=await(i.ossl||i.subtle).verify({name:"ECDSA",hash:{name:"SHA-256"}},v,p,new Uint8Array(m))))throw"Signature did not match."}catch(e){try{h=i.Buffer.from(g.s,"utf8"),p=new Uint8Array(h),d=await(i.ossl||i.subtle).verify({name:"ECDSA",hash:{name:"SHA-256"}},v,p,new Uint8Array(m))}catch(e){if(!d)throw"Signature did not match."}}var b=d?await o.parse(g.m):t;if(c.fall_soul=f["#"],c.fall_key=f["."],c.fall_val=e,c.fall_state=f[">"],s)try{s(b)}catch(e){console.log(e)}return b},r.opt.fallback=2}))(n,"./verify"),n((function(e){var t=n("./shim"),r=n("./settings"),i=n("./sha256");e.exports=async(e,n,o)=>{const a=e+(n||t.random(8)).toString("utf8"),s=t.Buffer.from(await i(a),"binary"),c=r.keyToJwk(s);return await t.subtle.importKey("jwk",c,{name:"AES-GCM"},!1,["encrypt","decrypt"])}}))(n,"./aeskey"),n((function(e){var t=n("./root"),r=n("./shim"),i=(n("./settings"),n("./aeskey"));t.encrypt=t.encrypt||(async(e,n,o,a)=>{try{a=a||{};var s=(n||a).epriv||n;if(void 0===e)throw"`undefined` not allowed.";if(!s){if(!t.I)throw"No encryption key.";s=(n=await t.I(null,{what:e,how:"encrypt",why:a.why})).epriv||n}var c="string"==typeof e?e:await r.stringify(e),u={s:r.random(9),iv:r.random(15)},l=await i(s,u.s,a).then(e=>r.subtle.encrypt({name:a.name||"AES-GCM",iv:new Uint8Array(u.iv)},e,(new r.TextEncoder).encode(c))),f={ct:r.Buffer.from(l,"binary").toString(a.encode||"base64"),iv:u.iv.toString(a.encode||"base64"),s:u.s.toString(a.encode||"base64")};if(a.raw||(f="SEA"+await r.stringify(f)),o)try{o(f)}catch(e){console.log(e)}return f}catch(e){if(console.log(e),t.err=e,t.throw)throw e;return void(o&&o())}}),e.exports=t.encrypt}))(n,"./encrypt"),n((function(e){var t=n("./root"),r=n("./shim"),i=n("./settings"),o=n("./aeskey");t.decrypt=t.decrypt||(async(e,n,a,s)=>{try{s=s||{};var c=(n||s).epriv||n;if(!c){if(!t.I)throw"No decryption key.";c=(n=await t.I(null,{what:e,how:"decrypt",why:s.why})).epriv||n}var u,l,f,h=await i.parse(e);try{u=r.Buffer.from(h.s,s.encode||"base64"),l=r.Buffer.from(h.iv,s.encode||"base64"),f=r.Buffer.from(h.ct,s.encode||"base64");var p=await o(c,u,s).then(e=>r.subtle.decrypt({name:s.name||"AES-GCM",iv:new Uint8Array(l),tagLength:128},e,new Uint8Array(f)))}catch(r){if("utf8"===s.encode)throw"Could not decrypt";if(t.opt.fallback)return s.encode="utf8",await t.decrypt(e,n,a,s)}var d=await i.parse(new r.TextDecoder("utf8").decode(p));if(a)try{a(d)}catch(e){console.log(e)}return d}catch(e){if(console.log(e),t.err=e,t.throw)throw e;return void(a&&a())}}),e.exports=t.decrypt}))(n,"./decrypt"),n((function(e){var t=n("./root"),r=n("./shim");n("./settings"),t.secret=t.secret||(async(e,n,o,a)=>{try{if(a=a||{},!n||!n.epriv||!n.epub){if(!t.I)throw"No secret mix.";n=await t.I(null,{what:e,how:"secret",why:a.why})}var s=n.epub,c=n.epriv,u=r.ossl||r.subtle,l=i(e.epub||e),f=Object.assign({public:await u.importKey(...l,!0,[])},{name:"ECDH",namedCurve:"P-256"}),h=i(s,c),p=await u.importKey(...h,!1,["deriveBits"]).then(async e=>{var t=await u.deriveBits(f,e,256),n=new Uint8Array(t),r=await u.importKey("raw",n,{name:"AES-GCM",length:256},!0,["encrypt","decrypt"]);return u.exportKey("jwk",r).then(({k:e})=>e)});if(o)try{o(p)}catch(e){console.log(e)}return p}catch(e){if(console.log(e),t.err=e,t.throw)throw e;return void(o&&o())}});var i=(e,t)=>{var[n,r]=e.split(".");return["jwk",Object.assign(t?{d:t}:{},{x:n,y:r,kty:"EC",crv:"P-256",ext:!0}),{name:"ECDH",namedCurve:"P-256"}]};e.exports=t.secret}))(n,"./secret"),n((function(e){var t=n("./root");t.certify=t.certify||(async(e,n={},r,i,o={})=>{try{if(console.log("SEA.certify() is an early experimental community supported method that may change API behavior without warning in any future version."),!(e=(()=>{var t=[];if(e){if(("string"==typeof e||Array.isArray(e))&&e.indexOf("*")>-1)return"*";if("string"==typeof e)return e;if(Array.isArray(e)){if(1===e.length&&e[0])return"object"==typeof e[0]&&e[0].pub?e[0].pub:"string"==typeof e[0]?e[0]:null;e.map(e=>{"string"==typeof e?t.push(e):"object"==typeof e&&e.pub&&t.push(e.pub)})}return"object"==typeof e&&e.pub?e.pub:t.length>0?t:null}})()))return console.log("No certificant found.");const s=!o.expiry||"number"!=typeof o.expiry&&"string"!=typeof o.expiry?null:parseFloat(o.expiry),c=(n||{}).read?n.read:null,u=(n||{}).write?n.write:"string"==typeof n||Array.isArray(n)||n["+"]||n["#"]||n["."]||n["="]||n["*"]||n[">"]||n["<"]?n:null,l=(o||{}).block||(o||{}).blacklist||(o||{}).ban||{},f=l.read&&("string"==typeof l.read||(l.read||{})["#"])?l.read:null,h="string"==typeof l?l:l.write&&("string"==typeof l.write||l.write["#"])?l.write:null;if(!c&&!u)return console.log("No policy found.");const p=JSON.stringify({c:e,...s?{e:s}:{},...c?{r:c}:{},...u?{w:u}:{},...f?{rb:f}:{},...h?{wb:h}:{}});var a=await t.sign(p,r,null,{raw:1});if(o.raw||(a="SEA"+JSON.stringify(a)),i)try{i(a)}catch(e){console.log(e)}return a}catch(e){if(t.err=e,t.throw)throw e;return void(i&&i())}}),e.exports=t.certify}))(n,"./certify"),n((function(e){var t=n("./shim"),r=n("./root");r.work=n("./work"),r.sign=n("./sign"),r.verify=n("./verify"),r.encrypt=n("./encrypt"),r.decrypt=n("./decrypt"),r.certify=n("./certify"),r.random=r.random||t.random,r.Buffer=r.Buffer||n("./buffer"),r.keyid=r.keyid||(async e=>{try{const n=t.Buffer.concat(e.replace(/-/g,"+").replace(/_/g,"/").split(".").map(e=>t.Buffer.from(e,"base64"))),r=t.Buffer.concat([t.Buffer.from([153,n.length/256,n.length%256]),n]),i=await sha1hash(r),o=t.Buffer.from(i,"binary");return o.toString("hex",o.length-8)}catch(e){throw console.log(e),e}}),((r.window||{}).GUN||{}).SEA=r,e.exports=r}))(n,"./sea"),n((function(e){var t,i=n("./sea");function o(e){this._={$:this}}function a(){return t.state().toString(36).replace(".","")}t=i.window?i.window.GUN||{chain:{}}:n((void 0+""==typeof r?".":"")+"./gun",1),i.GUN=t,(o.prototype=function(){function e(){}return e.prototype=t.chain,new e}()).constructor=o,t.chain.user=function(e){var t,n=this.back(-1);if(e)return e=i.opt.pub((e._||"")["#"])||e,n.get("~"+e);if(t=n.back("user"))return t;var r=n=n._,s=r.opt.uuid||a;return(r=(t=r.user=this.chain(new o))._).opt={},r.opt.uuid=function(e){var t=s(),r=n.user;return r&&(r=r.is)&&(r=r.pub)?(t="~"+r+"/"+t,e&&e.call&&e(null,t),t):t},t},t.User=o,o.GUN=t,o.SEA=t.SEA=i,e.exports=o}))(n,"./user"),n((function(e){var i;(""+i!=typeof t?t.Gun||{chain:{}}:n((""+i==typeof r?".":"")+"./gun",1)).chain.then=function(e,t){var n=this,r=new Promise((function(e,r){n.once(e,t)}));return e?r.then(e):r}}))(n,"./then"),n((function(e){var r=n("./user"),i=r.SEA,o=r.GUN,a=function(){};r.prototype.create=function(...e){var t,n="object"==typeof e[0]&&(e[0].pub||e[0].epub)?e[0]:"object"==typeof e[1]&&(e[1].pub||e[1].epub)?e[1]:null,r=n&&(n.pub||n.epub)?n.pub:"string"==typeof e[0]?e[0]:null,s=n&&(n.pub||n.epub)?n:r&&"string"==typeof e[1]?e[1]:null,c=e.filter(e=>"function"==typeof e)[0]||null,u=e&&e.length>1&&"object"==typeof e[e.length-1]?e[e.length-1]:{},l=this,f=l._,h=l.back(-1);if(c=c||a,!1!==(u=u||{}).check&&(r||(t="No user."),(s||"").length<8&&(t="Password too short!"),t))return c({err:o.log(t)}),l;if(f.ing)return(c||a)({err:o.log("User is already being created or authenticated!"),wait:!0}),l;f.ing=!0;var p={a:function(e){if(p.pubs=e,e&&!u.already){var t={err:o.log("User already created!")};return f.ing=!1,(c||a)(t),void l.leave()}p.salt=String.random(64),i.work(s,p.salt,p.b)},b:function(e){p.proof=e,n?p.c(n):i.pair(p.c)},c:function(e){var t;p.pair=e||{},(t=f.root.user)&&(t._.sea=e,t.is={pub:e.pub,epub:e.epub,alias:r}),p.data={pub:e.pub},p.d()},d:function(){p.data.alias=r,p.e()},e:function(){p.data.epub=p.pair.epub,i.encrypt({priv:p.pair.priv,epriv:p.pair.epriv},p.proof,p.f,{raw:1})},f:function(e){p.data.auth=JSON.stringify({ek:e,s:p.salt}),p.g(p.data.auth)},g:function(e){var t;p.data.auth=p.data.auth||e,h.get(t="~"+p.pair.pub).put(p.data).on(p.h);var n={};n[t]={"#":t},h.get("~@"+r).put(n).get(t).on(p.i)},h:function(e,t,n,r){r.off(),p.h.ok=1,p.i()},i:function(e,t,i,o){o&&(p.i.ok=1,o.off()),p.h.ok&&p.i.ok&&(f.ing=!1,c({ok:0,pub:p.pair.pub}),a===c&&(n?l.auth(n):l.auth(r,s)))}};return h.get("~@"+r).once(p.a),l},r.prototype.leave=function(e,n){var r=this.back(-1)._.user;if(r&&(delete r.is,delete r._.is,delete r._.sea),i.window)try{var o={};delete(o=t.sessionStorage).recall,delete o.pair}catch(e){}return this}}))(n,"./create"),n((function(e){var r=n("./user"),i=r.SEA,o=r.GUN,a=function(){};function s(e){if("string"!=typeof e)return e;try{e=JSON.parse(e)}catch(t){e={}}return e}r.prototype.auth=function(...e){var n="object"==typeof e[0]&&(e[0].pub||e[0].epub)?e[0]:"object"==typeof e[1]&&(e[1].pub||e[1].epub)?e[1]:null,r=n||"string"!=typeof e[0]?null:e[0],c=!r&&(!n||n.priv&&n.epriv)||"string"!=typeof e[1]?null:e[1],u=e.filter(e=>"function"==typeof e)[0]||null,l=e&&e.length>1&&"object"==typeof e[e.length-1]?e[e.length-1]:{},f=this,h=f._,p=f.back(-1);if(h.ing)return(u||a)({err:o.log("User is already being created or authenticated!"),wait:!0}),f;h.ing=!0;var d,g={},y=9;return g.a=function(e){if(!e)return g.b();if(!e.pub){var t=[];return Object.keys(e).forEach((function(n){"_"!=n&&t.push(e[n])})),g.b(t)}if(g.name)return g.f(e);g.c((g.data=e).auth)},g.b=function(e){var t=(g.list=(g.list||[]).concat(e||[])).shift();if(d===t)return g.name?g.err("Your user account is not published for dApps to access, please consider syncing it online, or allowing local access by adding your device as a peer."):r&&y--?void p.get("~@"+r).once(g.a):g.err("Wrong user or password.");p.get(t).once(g.a)},g.c=function(e){return d===e?g.b():"string"==typeof e?g.c(s(e)):void i.work(c,(g.auth=e).s,g.d,g.enc)},g.d=function(e){i.decrypt(g.auth.ek,e,g.e,g.enc)},g.e=function(e){if(d===e)return g.enc?(g.enc=null,g.b()):(g.enc={encode:"utf8"},g.c(g.auth));g.half=e,g.f(g.data)},g.f=function(e){var t=g.half||{},n=g.data||{};g.g(g.lol={pub:e.pub||n.pub,epub:e.epub||n.epub,priv:e.priv||t.priv,epriv:e.epriv||t.epriv})},g.g=function(e){if(!e||!e.pub||!e.epub)return g.b();g.pair=e;var n=p._.user,y=n._,v=y.opt;(y=n._=p.get("~"+e.pub)._).opt=v,n.is={pub:e.pub,epub:e.epub,alias:r||e.pub},y.sea=g.pair,h.ing=!1;try{c&&d==(s(h.root.graph["~"+e.pub].auth)||"")[":"]&&(l.shuffle=l.change=c)}catch(e){}if(l.change?g.z():(u||a)(y),i.window&&(f.back("user")._.opt||l).remember)try{var m={};(m=t.sessionStorage).recall=!0,m.pair=JSON.stringify(e)}catch(e){}try{p._.tag.auth?p._.on("auth",y):setTimeout((function(){p._.on("auth",y)}),1)}catch(e){o.log("Your 'auth' callback crashed with:",e)}},g.h=function(e){return e?((r=e.alias)||(r=e.alias="~"+n.pub),e.auth?(n=null,void g.c((g.data=e).auth)):g.g(n)):g.b()},g.z=function(){g.salt=String.random(64),i.work(l.change,g.salt,g.y)},g.y=function(e){i.encrypt({priv:g.pair.priv,epriv:g.pair.epriv},e,g.x,{raw:1})},g.x=function(e){g.w(JSON.stringify({ek:e,s:g.salt}))},g.w=function(e){if(l.shuffle){console.log("migrate core account from UTF8 & shuffle");var t={};Object.keys(g.data).forEach((function(e){t[e]=g.data[e]})),delete t._,t.auth=e,p.get("~"+g.pair.pub).put(t)}p.get("~"+g.pair.pub).get("auth").put(e,u||a)},g.err=function(e){var t={err:o.log(e||"User cannot be found!")};h.ing=!1,(u||a)(t)},g.plugin=function(e){if(!(g.name=e))return g.err();var t=[e];"~"!==e[0]&&(t[1]="~"+e,t[2]="~@"+e),g.b(t)},n?n.priv&&n.epriv?g.g(n):p.get("~"+n.pub).once(g.h):r?p.get("~@"+r).once(g.a):r||c||i.name(g.plugin),f}}))(n,"./auth"),n((function(e){var r=n("./user"),i=r.SEA;r.prototype.recall=function(e,n){var r=this.back(-1);if((e=e||{})&&e.sessionStorage){if(i.window)try{var o;(o=t.sessionStorage)&&(r._.opt.remember=!0,(this.back("user")._.opt||e).remember=!0,(o.recall||o.pair)&&r.user().auth(JSON.parse(o.pair),n))}catch(e){}return this}return this}}))(n,"./recall"),n((function(e){var t=n("./user"),r=t.SEA,i=t.GUN,o=function(){};t.prototype.pair=function(){var e,t=this;try{e=new Proxy({DANGER:"☠"},{get:function(e,n,r){if(t.is&&(t._||"").sea)return t._.sea[n]}})}catch(e){}return e},t.prototype.delete=async function(e,t,n){console.log("user.delete() IS DEPRECATED AND WILL BE MOVED TO A MODULE!!!"),this.back(-1);var r=this.back("user");try{r.auth(e,t,(function(e){r.map().once((function(){this.put(null)})),r.leave(),(n||o)({ok:0})}))}catch(e){i.log("User.delete failed! Error:",e)}return this},t.prototype.alive=async function(){console.log("user.alive() IS DEPRECATED!!!");const e=this.back(-1);try{return await authRecall(e),e._.user._}catch(e){const t="No session!";throw i.log(t),{err:t}}},t.prototype.trust=async function(e){console.log("`.trust` API MAY BE DELETED OR CHANGED OR RENAMED, DO NOT USE!"),i.is(e)&&e.get("pub").get((e,t)=>{console.log(e,t)}),e.get("trust").get(path).put(theirPubkey)},t.prototype.grant=function(e,t){console.log("`.grant` API MAY BE DELETED OR CHANGED OR RENAMED, DO NOT USE!");var n=this.back(-1).user(),i=n._.sea,o="";return this.back((function(e){e.is||(o+=e.get||"")})),async function(){var a,s=await n.get("grant").get(i.pub).get(o).then();(s=await r.decrypt(s,i))||(s=r.random(16).toString(),a=await r.encrypt(s,i),n.get("grant").get(i.pub).get(o).put(a));var c=e.get("pub").then(),u=e.get("epub").then();c=await c,u=await u;var l=await r.secret(u,i);a=await r.encrypt(s,l),n.get("grant").get(c).get(o).put(a,t)}(),this},t.prototype.secret=function(e,t){console.log("`.secret` API MAY BE DELETED OR CHANGED OR RENAMED, DO NOT USE!");var n=this,i=n.back(-1).user(),o=i.pair(),a="";return n.back((function(e){e.is||(a+=e.get||"")})),async function(){var s,c=await i.get("trust").get(o.pub).get(a).then();(c=await r.decrypt(c,o))||(c=r.random(16).toString(),s=await r.encrypt(c,o),i.get("trust").get(o.pub).get(a).put(s)),s=await r.encrypt(e,c),n.put(s,t)}(),n},e.exports=t}))(n,"./share"),n((function(e){var i,o=n("./sea"),a=n("./settings"),s=""+i!=typeof t?t.Gun||{on:function(){}}:n((""+i==typeof r?".":"")+"./gun",1);function c(e){var t,n=this,r=n.as,i=e.put,a=i["#"],u=i["."],l=i[":"],f=i[">"],h=e["#"];if(a&&u)if((e._||"").faith&&(r.opt||"").faith&&"function"==typeof e._)o.opt.pack(i,(function(t){o.verify(t,!1,(function(t){i["="]=o.opt.unpack(t),n.to.next(e)}))}));else{var p=function(t){r.on("in",{"@":h,err:e.err=t})};(e._||"").DBG&&((e._||"").DBG.c=+new Date),0<=a.indexOf("{if(n.m&&n.s&&a&&p)return o.verify(n,p,n=>{if(i!==n&&i!==n.e&&t.put[">"]&&t.put[">"]>parseFloat(n.e))return f("Certificate expired.");if(i!==n&&n.c&&n.w&&(n.c===a||n.c.indexOf("*")>-1)){let t=c.indexOf("/")>-1?c.replace(c.substring(0,c.indexOf("/")+1),""):"";String.match=String.match||s.text.match;const i=Array.isArray(n.w)?n.w:"object"==typeof n.w||"string"==typeof n.w?[n.w]:[];for(const s of i)if(String.match(t,s["#"])&&String.match(r,s["."])||!s["."]&&String.match(t,s["#"])||!s["#"]&&String.match(r,s["."])||String.match(t?t+"/"+r:r,s["#"]||s)){if(s["+"]&&s["+"].indexOf("*")>-1&&t&&-1==t.indexOf(a)&&-1==r.indexOf(a))return f(`Path "${t}" or key "${r}" must contain string "${a}".`);if(n.wb&&("string"==typeof n.wb||(n.wb||{})["#"])){var o=e.as.root.$.back(-1);return"string"==typeof n.wb&&"~"!==n.wb.slice(0,1)&&(o=o.get("~"+p)),o.get(n.wb).get(a).once(e=>!e||1!==e&&!0!==e?u(n):f(`Certificant ${a} blocked.`))}return u(n)}return f("Certificate verification fail.")}})};if("pub"===r&&"~"+p===c)return n===p?e.to.next(t):f("Account not same!");(d=h.is)&&d.pub&&!g["*"]&&!g["+"]&&(p===d.pub||p!==d.pub&&((t._.msg||{}).opt||{}).cert)?o.opt.pack(t.put,r=>{o.sign(r,h._.sea,(async function(r){if(i===r)return f(o.err||"Signature fail.");if(t.put[":"]={":":d=o.opt.unpack(r.m),"~":r.s},t.put["="]=d,p===h.is.pub)return(d=l(n))&&((u.sea.own[d]=u.sea.own[d]||{})[p]=1),void JSON.stringifyAsync(t.put[":"],(function(n,r){return n?f(n||"Stringify error."):(t.put[":"]=r,e.to.next(t))}));if(p!==h.is.pub&&((t._.msg||{}).opt||{}).cert){const n=await a.parse(t._.msg.opt.cert);n&&n.m&&n.s&&y(n,h.is.pub,r=>{t.put[":"]["+"]=n,t.put[":"]["*"]=h.is.pub,JSON.stringifyAsync(t.put[":"],(function(n,r){return n?f(n||"Stringify error."):(t.put[":"]=r,e.to.next(t))}))})}}),{raw:1})}):o.opt.pack(t.put,n=>{o.verify(n,g["*"]||p,(function(n){var r;return n=o.opt.unpack(n),i===n?f("Unverified data."):((r=l(n))&&p===o.opt.pub(r)&&((u.sea.own[r]=u.sea.own[r]||{})[p]=1),g["+"]&&g["+"].m&&g["+"].s&&g["*"]?void y(g["+"],g["*"],r=>(t.put["="]=n,e.to.next(t))):(t.put["="]=n,e.to.next(t)))}))})},c.any=function(e,t,n,r,i,o,a,s){if(o.opt.secure)return a("Soul missing public key at '"+r+"'.");o.on("secure",(function(t){if(this.off(),!o.opt.secure)return e.to.next(t);a("Data cannot be changed.")})).on.on("secure",t)};var u=s.valid,l=function(e,t){return"string"==typeof(t=u(e))&&t},f=/[^\w_-]/;o.opt.pub=function(e){if(e&&(e=e.split("~"))&&(e=e[1])&&(e=e.split(f).slice(0,2))&&2==e.length&&"@"!==(e[0]||"")[0])return e.slice(0,2).join(".")},o.opt.stringy=function(e){},o.opt.pack=function(e,t,n,r,a){var c,u;if(o.opt.check(e))return t(e);e&&e["#"]&&e["."]&&e[">"]&&(c=e[":"],u=1),JSON.parseAsync(u?c:e,(function(o,c){var u=i!==(c||"")[":"]&&(c||"")["~"];t(u?{m:{"#":a||e["#"],".":n||e["."],":":(c||"")[":"],">":e[">"]||s.state.is(r,n)},s:u}:e)}))};var h=o.opt;o.opt.unpack=function(e,t,n){var r;if(i!==e){if(e&&i!==(r=e[":"]))return r;if(t=t||h.fall_key,!n&&h.fall_val&&((n={})[t]=h.fall_val),t&&n){if(e===n[t])return e;if(!o.opt.check(n[t]))return e;var a=n&&n._&&n._["#"]||h.fall_soul,c=s.state.is(n,t)||h.fall_state;return e&&4===e.length&&a===e[0]&&t===e[1]&&p(c)===p(e[3])?e[2]:c"];if(this.to.next(n),!n["@"]&&c&&u){var h=e.$.get(c)._,p=(h||"").route;p&&(h.skip?h.skip.now=n["#"]:(h.skip={now:n["#"]}).to=setTimeout((function(){setTimeout.each(Object.maps(p),(function(s){var d,g=h.skip||"";if(h.skip=null,d=p.get(s))if(d.wire){var y=(d.sub||(d.sub=new Object.Map)).get(c);if(y&&(y.get(u)||y.get(""))){var v,m=d.put||(d.put={}),b=e.graph[c];b&&void 0!==(v=b[u])&&(f=a(b,u),l=v),m[c]=o(m[c],u,f,l,c),((v=i.track(d.next=d.next||String.random(9))).back||(v.back={}))[""+g.now||n["#"]]=1,d.to||(d.to=setTimeout((function(){!function(e){var t={"#":e.next,put:e.put,ok:{"@":3,"/":r.near}};e.next=e.put=e.to=null,r.say(t,e)}(d)}),t.gap))}}else p.delete(s)}))}),9))}}))}));var o=St.state.ify,a=St.state.is;(function(){n.up={};var i=r.hear["?"];r.hear["?"]=function(e,o){var a;if(i(e,o),o.pid)if(o.pid!==t.pid){if(a=n.up[o.pid]){if(a===o)return;return t.pid>o.pid&&(o=n.up[(a=o).pid]),a.url=a.url||o.url,r.bye(o),void(n.up[a.pid]=a)}o.url&&(n.up[o.pid]=o,n.stay&&n.stay())}else r.bye(o)},r.hear.opt=function(e,t){if(!e.ok){var i=e.opt;i&&(i=i.peers)&&"string"==typeof i&&(99<=Object.keys(n.up).length||(r.hi({id:i,url:i,retry:9}),t&&r.say({dam:"opt",ok:1,"@":e["#"]},t)))}},n.stay=function(){clearTimeout(n.stay.to),n.stay.to=setTimeout((function(t,r){(t=e.stats&&e.stats.stay)&&(r={},Object.keys(n.up||"").forEach((function(e){(e=(n.up||"")[e]).url&&(r[e.url]={})})),(t.axe=t.axe||{}).up=r)}),9e3)},setTimeout((function(t){(t=e.stats&&e.stats.stay&&e.stats.stay.axe)&&(t=t.up)&&(t instanceof Array||(t=Object.keys(t)),setTimeout.each(t||[],(function(e){r.hear.opt({opt:{peers:e}})})))}),1e3)})(),t.mob=t.mob||9900,e.on("hi",(function(e){if(this.to.next(e),!e.url){var i=r.near;if(!(t.mob>=i)){var o={};Object.keys(n.up).forEach((function(e){(e=n.up[e]).url&&(o[e.url]={})})),r.say({dam:"mob",mob:i,peers:o},e),setTimeout((function(){r.bye(e)}),9)}}})),e.on("bye",(function(e){this.to.next(e)}))}}function s(e){if(e){var t,n=(e._||"").via;if(!n||!n.id)return c(e);if(!(t=u(e)._))return c(e);t.asked=+new Date,s.turn(e,t.route,0)}}function c(e){r.say(e,t.peers)}function u(t){var n,r="";return t&&t.get?("string"==typeof(n=t.get["#"])&&(r=e.$.get(n)),r):r}function l(e){return(e=e||"")["="]||e["*"]||e[">"]||e}}(e),this.to.next(e)})),function(){var e=Array.from;if(Object.maps=function(t){return e&&t instanceof Map?e(t.keys()):(t instanceof Object.Map&&(t=t.s),Object.keys(t))},e)return Object.Map=Map;(Object.Map=function(){this.s={}}).prototype={set:function(e,t){return this.s[e]=t,this},get:function(e){return this.s[e]},delete:function(e){delete this.s[e]}}}(),b((function(e){!function(){var t=setTimeout||{};typeof window!=""+void 0&&(t.window=window);var n=(t.window||"").AXE||function(){};(n.window=t.window)&&(n.window.AXE=n);var r=(n.window||"").GUN||k;(r.AXE=n).GUN=n.Gun=r,r.on("opt",(function(e){!function(e){if(!e.axe){var t=e.opt,n=t.peers;if(!1!==t.axe&&r.window){var i,o,a=r.window,s=a.localStorage||t.localStorage||{},c=a.location||t.location||{},u=a.navigator||t.navigator||{},l=e.axe={},f=t.mesh=t.mesh||r.Mesh(e);(i=n[o=c.origin+"/gun"]=n[o]||{}).id=i.url=o,i.retry=i.retry||0,(i=n[o="http://localhost:8765/gun"]=n[o]||{}).id=i.url=o,i.retry=i.retry||0,r.log.once("AXE","AXE enabled: Trying to find network via (1) local peer (2) last used peers (3) a URL parameter, and last (4) hard coded peers."),r.log.once("AXEWarn","Warning: AXE is in alpha, use only for testing!");var h=s.peers||"";if(h&&(h+=" "),h+=((c.search||"").split("peers=")[1]||"").split("&")[0],e.on("bye",(function(e){this.to.next(e),e.url&&(u.onLine||(e.retry=1),e.retry||(l.fall&&delete l.fall[e.url||e.id],function e(){if(l.fall){var t=Object.keys(l.fall||""),r=t[Math.random()*t.length>>0];t.length||(s.peers="",r="https://gunjs.herokuapp.com/gun"),n[r]?e():f.hi(r)}else setTimeout(e,9)}()))})),e.on("hi",(function(e){this.to.next(e)})),h)p(h);else try{fetch(((c.search||"").split("axe=")[1]||"").split("&")[0]||c.axe||"https://raw.githubusercontent.com/wiki/amark/gun/volunteer.dht.md").then((function(e){return e.text()})).then((function(e){p(s.peers=e)})).catch((function(){p()}))}catch(e){p()}}}function p(e){l.fall={},((e||"").match(/https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)/gi)||[]).forEach((function(e){l.fall[e]={url:e,id:e,retry:0}}))}}(e),this.to.next(e)}));try{e.exports=n}catch(e){}}()}));var Et="undefined"!=typeof window?window.Gun:k;Et.on("create",(function(e){this.to.next(e);var t=e.opt;if(!1!==t.multicast&&("undefined"==typeof process||"false"!=""+(process.env||{}).MULTICAST)){var n=t.multicast=t.multicast||{};n.address=n.address||"233.255.255.255",n.pack=n.pack||5e4,n.port=n.port||8765;var r,i=function(){},o="2"+Math.random().toString().slice(-8),a=t.mesh=t.mesh||Et.Mesh(e);try{r=g}catch(e){return}var s=r.createSocket({type:"udp4",reuseAddr:!0});s.bind({port:n.port,exclusive:!0},(function(){s.setBroadcast(!0),s.setMulticastTTL(128)})),s.on("listening",(function(){try{s.addMembership(n.address)}catch(e){return void console.error(e)}n.peer={id:n.address+":"+n.port,wire:s},n.peer.say=function(e){var t=Buffer.from(e,"utf8");n.pack<=t.length||s.send(t,0,t.length,n.port,n.address,i)},Et.log.once("multi","Multicast on "+n.peer.id)})),s.on("message",(function(e,r){try{if(!e)return;return"2"===(e=e.toString("utf8"))[0]?u(e,r):void t.mesh.hear(e,n.peer)}catch(e){return}})),setInterval(u,1e3)}function c(e){this.to.next(e),n.peer&&a.say(e,n.peer)}function u(t,r){var a;if(n.peer){if(!t)return t=u.id=u.id||Buffer.from(o,"utf8"),void s.send(t,0,t.length,n.port,n.address,i);(a=e.stats)&&(a=a.gap)&&r&&((a.near||(a.near={}))[r.address]=r.port||1),u.on||t===o||e.on("out",u.on=c)}}}));var Tt="undefined"!=typeof window?window.Gun:k;Tt.on("opt",(function(e){if(this.to.next(e),!e.once&&"undefined"!=typeof process&&void 0!==w&&!1!==e.opt.stats){var r=n||{},i=e.opt.file?r.resolve(e.opt.file).split(r.sep).slice(-1)[0]:"radata",o=function(){},a=y||{},s=t||{};if(s.existsSync=s.existsSync||r.existsSync,s.existsSync&&process){process.uptime=process.uptime||o,process.cpuUsage=process.cpuUsage||o,process.memoryUsage=process.memoryUsage||o,a.totalmem=a.totalmem||o,a.freemem=a.freemem||o,a.loadavg=a.loadavg||o,a.cpus=a.cpus||o;var c,u=+new Date;setTimeout((function(){e.stats=function(e){try{e=JSON.parse(e)}catch(t){e={}}return e}(s.existsSync(__dirname+"/../stats."+i)&&s.readFileSync(__dirname+"/../stats."+i).toString())||{},e.stats.up=e.stats.up||{},e.stats.up.start=e.stats.up.start||+new Date,e.stats.up.count=(e.stats.up.count||0)+1,e.stats.stay=e.stats.stay||{},e.stats.over=+new Date}),1),setInterval((function(){if(e.stats||(e.stats={}),!c){var t=e.stats;t.over=-(u-(u=+new Date)),(t.up||{}).time=process.uptime(),t.memory=process.memoryUsage()||{},t.memory.totalmem=a.totalmem(),t.memory.freemem=a.freemem(),t.cpu=process.cpuUsage()||{},t.cpu.loadavg=a.loadavg(),t.cpu.stack=(((setTimeout||"").turn||"").s||"").length,t.peers={},t.peers.count=console.STAT.peers||Object.keys(e.opt.peers||{}).length,t.node={},t.node.count=Object.keys(e.graph||{}).length,t.all=At,t.sites=console.STAT.sites,At={};var n=e.opt.mesh;n&&(t.dam={in:{count:n.hear.c,done:n.hear.d},out:{count:n.say.c,done:n.say.d}},n.hear.c=n.hear.d=n.say.c=n.say.d=0,t.peers.time=n.bye.time||0);var r=e.opt.store;(r=r&&r.stats)&&(t.rad=r,e.opt.store.stats={get:{time:{},count:0},put:{time:{},count:0}}),JSON.stringifyAsync(t,(function(e,t){e||(c=!0,s.writeFile(__dirname+"/../stats."+i,t,(function(e){c=!1,e&&console.log(console.STAT.err=e),console.STAT&&console.STAT(u,+new Date-u,"stats stash")})))}))}}),5e3)}}}));var Ot=Tt.log,At={};console.STAT=function(e,t,n,r){if("number"==typeof e&&"number"==typeof t&&"string"==typeof n){var i=At[n]||(At[n]=[]);1e3=0;--i){var o=this.tryEntries[i],a=o.completion;if("root"===o.tryLoc)return r("end");if(o.tryLoc<=this.prev){var s=n.call(o,"catchLoc"),c=n.call(o,"finallyLoc");if(s&&c){if(this.prev=0;--r){var i=this.tryEntries[r];if(i.tryLoc<=this.prev&&n.call(i,"finallyLoc")&&this.prev=0;--t){var n=this.tryEntries[t];if(n.finallyLoc===e)return this.complete(n.completion,n.afterLoc),x(n),l}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.tryLoc===e){var r=n.completion;if("throw"===r.type){var i=r.arg;x(n)}return i}}throw new Error("illegal catch attempt")},delegateYield:function(e,t,n){return this.delegate={iterator:S(e),resultName:t,nextLoc:n},"next"===this.method&&(this.arg=void 0),l}},e}function It(e,t,n,r,i,o,a){try{var s=e[o](a),c=s.value}catch(e){return void n(e)}s.done?t(c):Promise.resolve(c).then(r,i)}function Ct(e){return function(){var t=this,n=arguments;return new Promise((function(r,i){var o=e.apply(t,n);function a(e){It(o,r,i,a,s,"next",e)}function s(e){It(o,r,i,a,s,"throw",e)}a(void 0)}))}}function Nt(e){return(Nt=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function Mt(e,t){return(Mt=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function Lt(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}function Pt(e,t,n){return(Pt=Lt()?Reflect.construct.bind():function(e,t,n){var r=[null];r.push.apply(r,t);var i=new(Function.bind.apply(e,r));return n&&Mt(i,n.prototype),i}).apply(null,arguments)}function Rt(e){var t="function"==typeof Map?new Map:void 0;return(Rt=function(e){if(null===e||-1===Function.toString.call(e).indexOf("[native code]"))return e;if("function"!=typeof e)throw new TypeError("Super expression must either be null or a function");if(void 0!==t){if(t.has(e))return t.get(e);t.set(e,n)}function n(){return Pt(e,arguments,Nt(this).constructor)}return n.prototype=Object.create(e.prototype,{constructor:{value:n,enumerable:!1,writable:!0,configurable:!0}}),Mt(n,e)})(e)}function Bt(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n=e.length?{done:!0}:{done:!1,value:e[r++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var $t=function(e,t){var n;return function(){var r=arguments,i=this;n||(e.apply(i,r),n=!0,setTimeout((function(){return n=!1}),t))}},Gt=function(e,t){var n;return function(){var r=arguments,i=this;clearTimeout(n),n=setTimeout((function(){return e.apply(i,r)}),t)}},Ft=function(e){return e[Math.floor(Math.random()*e.length)]},Wt=function(e,t){var n={};return Object.keys(e).forEach((function(r){t.includes(r)||(n[r]=e[r])})),n},zt=!1;try{zt="[object process]"===Object.prototype.toString.call(global.process)}catch(e){}var Kt=!zt&&navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase(),qt=Kt&&Kt.indexOf(" electron/")>-1,Ht=["canidae","felidae","cat","cattle","dog","donkey","goat","horse","pig","rabbit","aardvark","aardwolf","albatross","alligator","alpaca","amphibian","anaconda","angelfish","anglerfish","ant","anteater","antelope","antlion","ape","aphid","armadillo","asp","baboon","badger","bandicoot","barnacle","barracuda","basilisk","bass","bat","bear","beaver","bedbug","bee","beetle","bird","bison","blackbird","boa","boar","bobcat","bobolink","bonobo","booby","bovid","bug","butterfly","buzzard","camel","canid","capybara","cardinal","caribou","carp","cat","catshark","caterpillar","catfish","cattle","centipede","cephalopod","chameleon","cheetah","chickadee","chicken","chimpanzee","chinchilla","chipmunk","clam","clownfish","cobra","cockroach","cod","condor","constrictor","coral","cougar","cow","coyote","crab","crane","crawdad","crayfish","cricket","crocodile","crow","cuckoo","cicada","damselfly","deer","dingo","dinosaur","dog","dolphin","donkey","dormouse","dove","dragonfly","dragon","duck","eagle","earthworm","earwig","echidna","eel","egret","elephant","elk","emu","ermine","falcon","ferret","finch","firefly","fish","flamingo","flea","fly","flyingfish","fowl","fox","frog","gamefowl","galliform","gazelle","gecko","gerbil","gibbon","giraffe","goat","goldfish","goose","gopher","gorilla","grasshopper","grouse","guan","guanaco","guineafowl","gull","guppy","haddock","halibut","hamster","hare","harrier","hawk","hedgehog","heron","herring","hippopotamus","hookworm","hornet","horse","hoverfly","hummingbird","hyena","iguana","impala","jackal","jaguar","jay","jellyfish","junglefowl","kangaroo","kingfisher","kite","kiwi","koala","koi","krill","ladybug","lamprey","landfowl","lark","leech","lemming","lemur","leopard","leopon","limpet","lion","lizard","llama","lobster","locust","loon","louse","lungfish","lynx","macaw","mackerel","magpie","mammal","manatee","mandrill","marlin","marmoset","marmot","marsupial","marten","mastodon","meadowlark","meerkat","mink","minnow","mite","mockingbird","mole","mollusk","mongoose","monkey","moose","mosquito","moth","mouse","mule","muskox","narwhal","newt","nightingale","ocelot","octopus","opossum","orangutan","orca","ostrich","otter","owl","ox","panda","panther","parakeet","parrot","parrotfish","partridge","peacock","peafowl","pelican","penguin","perch","pheasant","pig","pigeon","pike","pinniped","piranha","planarian","platypus","pony","porcupine","porpoise","possum","prawn","primate","ptarmigan","puffin","puma","python","quail","quelea","quokka","rabbit","raccoon","rat","rattlesnake","raven","reindeer","reptile","rhinoceros","roadrunner","rodent","rook","rooster","roundworm","sailfish","salamander","salmon","sawfish","scallop","scorpion","seahorse","shark","sheep","shrew","shrimp","silkworm","silverfish","skink","skunk","sloth","slug","smelt","snail","snake","snipe","sole","sparrow","spider","spoonbill","squid","squirrel","starfish","stingray","stoat","stork","sturgeon","swallow","swan","swift","swordfish","swordtail","tahr","takin","tapir","tarantula","tarsier","termite","tern","thrush","tick","tiger","tiglon","toad","tortoise","toucan","trout","tuna","turkey","turtle","tyrannosaurus","urial","vicuna","viper","vole","vulture","wallaby","walrus","wasp","warbler","weasel","whale","whippet","whitefish","wildcat","wildebeest","wildfowl","wolf","wolverine","wombat","woodpecker","worm","wren","xerinae","yak","zebra","alpaca","cat","cattle","chicken","dog","donkey","ferret","gayal","goldfish","guppy","horse","koi","llama","sheep","yak","unicorn"],Jt=["average","big","colossal","fat","giant","gigantic","great","huge","immense","large","little","long","mammoth","massive","miniature","petite","puny","short","small","tall","tiny","boiling","breezy","broken","bumpy","chilly","cold","cool","creepy","crooked","cuddly","curly","damaged","damp","dirty","dry","dusty","filthy","flaky","fluffy","wet","broad","chubby","crooked","curved","deep","flat","high","hollow","low","narrow","round","shallow","skinny","square","steep","straight","wide","ancient","brief","early","fast","late","long","modern","old","quick","rapid","short","slow","swift","young","abundant","empty","few","heavy","light","many","numerous","Sound","cooing","deafening","faint","harsh","hissing","hushed","husky","loud","melodic","moaning","mute","noisy","purring","quiet","raspy","resonant","screeching","shrill","silent","soft","squealing","thundering","voiceless","whispering","bitter","delicious","fresh","juicy","ripe","rotten","salty","sour","spicy","stale","sticky","strong","sweet","tasteless","tasty","thirsty","fluttering","fuzzy","greasy","grubby","hard","hot","icy","loose","melted","plastic","prickly","rainy","rough","scattered","shaggy","shaky","sharp","shivering","silky","slimy","slippery","smooth","soft","solid","steady","sticky","tender","tight","uneven","weak","wet","wooden","afraid","angry","annoyed","anxious","arrogant","ashamed","awful","bad","bewildered","bored","combative","condemned","confused","creepy","cruel","dangerous","defeated","defiant","depressed","disgusted","disturbed","eerie","embarrassed","envious","evil","fierce","foolish","frantic","frightened","grieving","helpless","homeless","hungry","hurt","ill","jealous","lonely","mysterious","naughty","nervous","obnoxious","outrageous","panicky","repulsive","scary","scornful","selfish","sore","tense","terrible","thoughtless","tired","troubled","upset","uptight","weary","wicked","worried","agreeable","amused","brave","calm","charming","cheerful","comfortable","cooperative","courageous","delightful","determined","eager","elated","enchanting","encouraging","energetic","enthusiastic","excited","exuberant","fair","faithful","fantastic","fine","friendly","funny","gentle","glorious","good","happy","healthy","helpful","hilarious","jolly","joyous","kind","lively","lovely","lucky","obedient","perfect","pleasant","proud","relieved","silly","smiling","splendid","successful","thoughtful","victorious","vivacious","witty","wonderful","zealous","zany","other","good","new","old","great","high","small","different","large","local","social","important","long","young","national","british","right","early","possible","big","little","political","able","late","general","full","far","low","public","available","bad","main","sure","clear","major","economic","only","likely","real","black","particular","international","special","difficult","certain","open","whole","white","free","short","easy","strong","european","central","similar","human","common","necessary","single","personal","hard","private","poor","financial","wide","foreign","simple","recent","concerned","american","various","close","fine","english","wrong","present","royal","natural","individual","nice","french","nihilist","solipsist","materialist","surrealist","heroic","awesome","hedonist","absurd","current","modern","labour","legal","happy","final","red","normal","serious","previous","total","prime","significant","industrial","sorry","dead","specific","appropriate","top","soviet","basic","military","original","successful","aware","hon","popular","heavy","professional","direct","dark","cold","ready","green","useful","effective","western","traditional","scottish","german","independent","deep","interesting","considerable","involved","physical","hot","existing","responsible","complete","medical","blue","extra","past","male","interested","fair","essential","beautiful","civil","primary","obvious","future","environmental","positive","senior","nuclear","annual","relevant","huge","rich","commercial","safe","regional","practical","official","separate","key","chief","regular","due","additional","active","powerful","complex","standard","impossible","light","warm","middle","fresh","sexual","front","domestic","actual","united","technical","ordinary","cheap","strange","internal","excellent","quiet","soft","potential","northern","religious","quick","very","famous","cultural","proper","broad","joint","formal","limited","conservative","lovely","usual","ltd","unable","rural","initial","substantial","bright","average","leading","reasonable","immediate","suitable","equal","detailed","working","overall","female","afraid","democratic","growing","sufficient","scientific","eastern","correct","inc","irish","expensive","educational","mental","dangerous","critical","increased","familiar","unlikely","double","perfect","slow","tiny","dry","historical","thin","daily","southern","increasing","wild","alone","urban","empty","married","narrow","liberal","supposed","upper","apparent","tall","busy","bloody","prepared","russian","moral","careful","clean","attractive","japanese","vital","thick","alternative","fast","ancient","elderly","rare","external","capable","brief","wonderful","grand","typical","entire","grey","constant","vast","surprised","ideal","terrible","academic","funny","minor","pleased","severe","ill","corporate","negative","permanent","weak","brown","fundamental","odd","crucial","inner","used","criminal","contemporary","sharp","sick","near","roman","massive","unique","secondary","parliamentary","african","unknown","subsequent","angry","alive","guilty","lucky","enormous","well","yellow","unusual","net","tough","dear","extensive","glad","remaining","agricultural","alright","healthy","italian","principal","tired","efficient","comfortable","chinese","relative","friendly","conventional","willing","sudden","proposed","voluntary","slight","valuable","dramatic","golden","temporary","federal","keen","flat","silent","indian","worried","pale","statutory","welsh","dependent","firm","wet","competitive","armed","radical","outside","acceptable","sensitive","living","pure","global","emotional","sad","secret","rapid","adequate","fixed","sweet","administrative","wooden","remarkable","comprehensive","surprising","solid","rough","mere","mass","brilliant","maximum","absolute","electronic","visual","electric","cool","spanish","literary","continuing","supreme","chemical","genuine","exciting","written","advanced","extreme","classical","fit","favourite","widespread","confident","straight","proud","numerous","opposite","distinct","mad","helpful","given","disabled","consistent","anxious","nervous","awful","stable","constitutional","satisfied","conscious","developing","strategic","holy","smooth","dominant","remote","theoretical","outstanding","pink","pretty","clinical","minimum","honest","impressive","related","residential","extraordinary","plain","visible","accurate","distant","still","greek","complicated","musical","precise","gentle","broken","live","silly","fat","tight","monetary","round","psychological","violent","unemployed","inevitable","junior","sensible","grateful","pleasant","dirty","structural","welcome","deaf","above","continuous","blind","overseas","mean","entitled","delighted","loose","occasional","evident","desperate","fellow","universal","square","steady","classic","equivalent","intellectual","victorian","level","ultimate","creative","lost","medieval","clever","linguistic","convinced","judicial","raw","sophisticated","asleep","vulnerable","illegal","outer","revolutionary","bitter","changing","australian","native","imperial","strict","wise","informal","flexible","collective","frequent","experimental","spiritual","intense","rational","generous","inadequate","prominent","logical","bare","historic","modest","dutch","acute","electrical","valid","weekly","gross","automatic","loud","reliable","mutual","liable","multiple","ruling","curious","sole","managing","pregnant","latin","nearby","exact","underlying","identical","satisfactory","marginal","distinctive","electoral","urgent","presidential","controversial","everyday","encouraging","organic","continued","expected","statistical","desirable","innocent","improved","exclusive","marked","experienced","unexpected","superb","sheer","disappointed","frightened","gastric","romantic","naked","reluctant","magnificent","convenient","established","closed","uncertain","artificial","diplomatic","tremendous","marine","mechanical","retail","institutional","mixed","required","biological","known","functional","straightforward","superior","digital","spectacular","unhappy","confused","unfair","aggressive","spare","painful","abstract","asian","associated","legislative","monthly","intelligent","hungry","explicit","nasty","just","faint","coloured","ridiculous","amazing","comparable","successive","realistic","back","decent","decentralized","bitcoin","cypherpunk","unnecessary","flying","random","influential","dull","genetic","neat","marvellous","crazy","damp","giant","secure","bottom","skilled","subtle","elegant","brave","lesser","parallel","steep","intensive","casual","tropical","lonely","partial","preliminary","concrete","alleged","assistant","vertical","upset","delicate","mild","occupational","excessive","progressive","exceptional","integrated","striking","continental","okay","harsh","combined","fierce","handsome","characteristic","chronic","compulsory","interim","objective","splendid","magic","systematic","obliged","payable","fun","horrible","primitive","fascinating","ideological","metropolitan","surrounding","estimated","peaceful","premier","operational","technological","kind","advisory","hostile","precious","accessible","determined","excited","impressed","provincial","smart","endless","isolated","drunk","geographical","like","dynamic","boring","forthcoming","unfortunate","definite","super","notable","indirect","stiff","wealthy","awkward","lively","neutral","artistic","content","mature","colonial","ambitious","evil","magnetic","verbal","legitimate","sympathetic","empirical","head","shallow","vague","naval","depressed","shared","added","shocked","mid","worthwhile","qualified","missing","blank","absent","favourable","polish","israeli","developed","profound","representative","enthusiastic","dreadful","rigid","reduced","cruel","coastal","peculiar","swiss","crude","extended","selected","eager","canadian","bold","relaxed","corresponding","running","planned","applicable","immense","allied","comparative","uncomfortable","conservation","productive","beneficial","bored","charming","minimal","mobile","turkish","orange","rear","passive","suspicious","overwhelming","fatal","resulting","symbolic","registered","neighbouring","calm","irrelevant","patient","compact","profitable","rival","loyal","moderate","distinguished","interior","noble","insufficient","eligible","mysterious","varying","managerial","molecular","olympic","linear","prospective","printed","parental","diverse","elaborate","furious","fiscal","burning","useless","semantic","embarrassed","inherent","philosophical","deliberate","awake","variable","promising","unpleasant","varied","sacred","selective","inclined","tender","hidden","worthy","intermediate","sound","protective","fortunate","slim","defensive","divine","stuck","driving","invisible","misleading","circular","mathematical","inappropriate","liquid","persistent","solar","doubtful","manual","architectural","intact","incredible","devoted","prior","tragic","respectable","optimistic","convincing","unacceptable","decisive","competent","spatial","respective","binding","relieved","nursing","toxic","select","redundant","integral","then","probable","amateur","fond","passing","specified","territorial","horizontal","inland","cognitive","regulatory","miserable","resident","polite","scared","gothic","civilian","instant","lengthy","adverse","korean","unconscious","anonymous","aesthetic","orthodox","static","unaware","costly","fantastic","foolish","fashionable","causal","compatible","wee","implicit","dual","ok","cheerful","subjective","forward","surviving","exotic","purple","cautious","visiting","aggregate","ethical","teenage","dying","disastrous","delicious","confidential","underground","thorough","grim","autonomous","atomic","frozen","colourful","injured","uniform","ashamed","glorious","wicked","coherent","rising","shy","novel","balanced","delightful","arbitrary","adjacent","worrying","weird","unchanged","rolling","evolutionary","intimate","sporting","disciplinary","formidable","lexical","noisy","gradual","accused","homeless","supporting","coming","renewed","excess","retired","rubber","chosen","outdoor","embarrassing","preferred","bizarre","appalling","agreed","imaginative","governing","accepted","vocational","mighty","puzzled","worldwide","organisational","sunny","eldest","eventual","spontaneous","vivid","rude","faithful","ministerial","innovative","controlled","conceptual","unwilling","civic","meaningful","alive","brainy","breakable","busy","careful","cautious","clever","concerned","crazy","curious","dead","different","difficult","doubtful","easy","famous","fragile","helpful","helpless","important","impossible","innocent","inquisitive","modern","open","outstanding","poor","powerful","puzzled","real","rich","shy","sleepy","super","tame","uninterested","wandering","wild","wrong","adorable","alert","average","beautiful","blonde","bloody","blushing","bright","clean","clear","cloudy","colorful","crowded","cute","dark","drab","distinct","dull","elegant","fancy","filthy","glamorous","gleaming","graceful","grotesque","homely","light","misty","motionless","muddy","plain","poised","quaint","shiny","smoggy","sparkling","spotless","stormy","strange","ugly","unsightly","unusual","bad","better","beautiful","big","black","blue","bright","clumsy","crazy","dizzy","dull","fat","frail","friendly","funny","great","green","gigantic","gorgeous","grumpy","handsome","happy","horrible","itchy","jittery","jolly","kind","long","lazy","magnificent","magenta","many","mighty","mushy","nasty","new","nice","nosy","nutty","nutritious","odd","orange","ordinary","pretty","precious","prickly","purple","quaint","quiet","quick","quickest","rainy","rare","ratty","red","roasted","robust","round","sad","scary","scrawny","short","silly","stingy","strange","striped","spotty","tart","tall","tame","tan","tender","testy","tricky","tough","ugly","ugliest","vast","watery","wasteful","wonderful","yellow","yummy","zany"],Vt={gunOnceDefined:function(e){return new Promise((function(t){e.on((function(e,n,r,i){void 0!==e&&(i.off(),t(e))}))}))},gunAsAnotherUser:function(e,t,n){var r=new jt({radisk:!1,peers:Object.keys(e._.opt.peers)}),i=r.user();return i.auth(t),setTimeout((function(){Object.values(r.back("opt.peers")).forEach((function(e){r.on("bye",e)}))}),2e4),n(i)},getHash:function(e,t){var n=this;return Ct(Dt().mark((function r(){var i;return Dt().wrap((function(r){for(;;)switch(r.prev=r.next){case 0:if(void 0===t&&(t="base64"),e){r.next=3;break}return r.abrupt("return",void 0);case 3:return r.next=5,jt.SEA.work(e,void 0,void 0,{name:"SHA-256"});case 5:if(i=r.sent){r.next=8;break}throw new Error("Gun.SEA.work failed for "+e);case 8:if(!(i.length>44)){r.next=10;break}throw new Error("Gun.SEA.work returned an invalid SHA-256 hash longer than 44 chars: "+i+". This is probably due to a sea.js bug on Safari.");case 10:if("hex"!==t){r.next=12;break}return r.abrupt("return",n.base64ToHex(i));case 12:return r.abrupt("return",i);case 13:case"end":return r.stop()}}),r)})))()},capitalize:function(e){return e.charAt(0).toUpperCase()+e.slice(1)},generateName:function(){return this.capitalize(Ft(Jt))+" "+this.capitalize(Ft(Ht))},base64ToHex:function(e){for(var t=atob(e),n="",r=0;rt?e.slice(0,t)+"...":e},createElement:function(e,t,n){var r=document.createElement(e);return t&&r.setAttribute("class",t),n&&n.appendChild(r),r},isNode:zt,isElectron:qt,isMobile:!zt&&function(){if(qt)return!1;var e,t=!1;return e=navigator.userAgent||navigator.vendor||"",(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(e)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(e.substr(0,4)))&&(t=!0),t}(),throttle:function(e,t){var n;return function(){var r=arguments,i=this;n||(e.apply(i,r),n=!0,setTimeout((function(){return n=!1}),t))}},debounce:function(e,t){var n;return function(){var r=this,i=arguments;clearTimeout(n),n=setTimeout((function(){return e.apply(r,i)}),t)}},sample:function(e){return e[Math.floor(Math.random()*e.length)]},sampleSize:function(e,t){for(var n,r,i=e.slice(0),o=e.length,a=o-t;o-- >a;)n=i[r=Math.floor((o+1)*Math.random())],i[r]=i[o],i[o]=n;return i.slice(a)},defer:function(e){return setTimeout(e,0)},once:function(e){var t=!1;return function(){t||(t=!0,e.apply(this,arguments))}},omit:function(e,t){var n={};return Object.keys(e).forEach((function(r){t.includes(r)||(n[r]=e[r])})),n}},Yt=(b((function(e){!function(){function t(e){(e=e||{}).file=String(e.file||"radata");var n=t[e.file],r=null;if(n)return console.log("Warning: reusing same IndexedDB store and options as 1st."),t[e.file];n=t[e.file]=function(){};try{e.indexedDB=e.indexedDB||t.indexedDB||indexedDB}catch(e){}try{if(!e.indexedDB||"file:"==location.protocol){var i=n.d||(n.d={});return n.put=function(e,t,n){i[e]=t,setTimeout((function(){n(null,1)}),250)},n.get=function(e,t){setTimeout((function(){t(null,i[e]||void 0)}),5)},console.log("Warning: No indexedDB exists to persist data to!"),n}}catch(e){}return n.start=function(){var t=indexedDB.open(e.file,1);t.onupgradeneeded=function(t){t.target.result.createObjectStore(e.file)},t.onsuccess=function(){r=t.result},t.onerror=function(e){console.log(e||1)}},n.start(),n.put=function(t,i,o){if(r){var a=r.transaction([e.file],"readwrite"),s=a.objectStore(e.file),c=s.put(i,""+t);c.onsuccess=s.onsuccess=a.onsuccess=function(){o(null,1)},c.onabort=s.onabort=a.onabort=function(e){o(e||"put.tx.abort")},c.onerror=s.onerror=a.onerror=function(e){o(e||"put.tx.error")}}else setTimeout((function(){n.put(t,i,o)}),1)},n.get=function(t,i){if(r){var o=r.transaction([e.file],"readonly").objectStore(e.file).get(""+t);o.onsuccess=function(){i(null,o.result)},o.onabort=function(e){i(e||4)},o.onerror=function(e){i(e||5)}}else setTimeout((function(){n.get(t,i)}),9)},setInterval((function(){r&&r.close(),r=null,n.start()}),15e3),n}if("undefined"!=typeof window)(t.window=window).RindexedDB=t,t.indexedDB=window.indexedDB;else try{e.exports=t}catch(e){}try{(t.window.Gun||k).on("create",(function(e){this.to.next(e),e.opt.store=e.opt.store||t(e.opt)}))}catch(e){}}()})),"http://localhost:8767/gun"),Xt={"https://gun-rs.iris.to/gun":{},"https://gun-us.herokuapp.com/gun":{}},Qt=window.location,Zt=Qt.host,en=Zt.startsWith("localhost")&&"localhost:8080"!==Zt;(Qt.hostname.endsWith("herokuapp.com")||en)&&(Object.keys(Xt).forEach((function(e){return Xt[e].enabled=!1})),Xt[Qt.origin+"/gun"]={enabled:!0});var tn,nn=/^(https?:\/\/)?([\da-z.-]+)\.([a-z.]{2,6})([\/\w .-]*)*\/?$/,rn={known:{},add:function(e){var t=this;return Ct(Dt().mark((function n(){var r,i,o,a;return Dt().wrap((function(n){for(;;)switch(n.prev=n.next){case 0:if(!e.url||nn.test(e.url)){n.next=2;break}throw new Error("Invalid url "+e.url);case 2:if(e.from&&Object.keys(t.known).forEach((function(n){t.known[n].from===e.from&&delete t.known[n]})),t.known[r=e.url||""]=t.known[r]||Wt(e,["url"]),"public"!==e.visibility){n.next=19;break}return n.next=8,jt.SEA.secret(Fr.getKey().epub,Fr.getKey());case 8:if(n.t0=n.sent,n.t0){n.next=11;break}n.t0="";case 11:return i=n.t0,n.next=14,jt.SEA.encrypt(e.url,i);case 14:return o=n.sent,n.next=17,jt.SEA.work(o,null,null,{name:"SHA-256"});case 17:a=n.sent,on().user().get("peers").get(a).put({url:e.url,lastSeen:(new Date).toISOString()});case 19:!1!==e.enabled?e.url&&t.connect(e.url):t.save();case 20:case"end":return n.stop()}}),n)})))()},remove:function(e){delete this.known[e],this.save()},disconnect:function(e){on().on("bye",e),e.url=""},save:function(){localStorage.setItem("gunPeers",JSON.stringify(this.known))},getSaved:function(){var e=localStorage.getItem("gunPeers");return e=e&&"undefined"!==e?JSON.parse(e):Xt,Vt.isElectron&&(e[Yt]={}),Object.keys(e).forEach((function(t){return n=e[t],r={enabled:!0},Object.keys(r).forEach((function(e){void 0===n[e]&&(n[e]=r[e])})),n;var n,r})),e},reset:function(){localStorage.setItem("gunPeers",""),this.known=this.getSaved()},connect:function(e){this.isMixedContent(e)||(this.known[e]?(this.known[e].enabled=!0,on().opt({peers:[e]}),this.save()):this.add({url:e}))},disable:function(e,t){this.known[e].enabled=!1,t&&this.disconnect(t),this.save()},isMixedContent:function(e){return"https:"===window.location.protocol&&0===e.indexOf("http:")},random:function(){var e,t,n,r=this,i=Vt.isElectron&&this.known[Yt]&&!1!==this.known[Yt].enabled,o=i?Math.max(1,1):2,a=function(e,t){for(var n,r,i=e.slice(0),o=e.length,a=o-t;o-- >a;)n=i[r=Math.floor((o+1)*Math.random())],i[r]=i[o],i[o]=n;return i.slice(a)}(Object.keys((e=this.known,t=function(e,t){return!r.isMixedContent(t)&&e.enabled&&!(Vt.isElectron&&t===Yt)},n={},Object.keys(e).forEach((function(r){t(e[r])&&(n[r]=e[r])})),n)),o);return a&&i&&a.push(Yt),a},checkGunPeerCount:function(){var e=this,t=on().back("opt.peers"),n=Object.values(t).filter((function(e){return e&&e.wire&&"WebSocket"!==e.wire.constructor.name&&console.log("WebRTC peer",e),e&&e.wire&&1===e.wire.readyState&&0===e.wire.bufferedAmount&&"WebSocket"===e.wire.constructor.name}));if(n.length<2){var r=Object.keys(this.known).filter((function(n){var r=Object.values(t).map((function(e){return e.url})).indexOf(n)>-1,i=e.known[n].enabled;return!("https:"===window.location.protocol&&0===n.indexOf("http:"))&&i&&!r}));if(r.length){var i=String(Ft(r));this.connect(i)}}n.length>2&&this.disconnect(Ft(n))},init:function(){var e=this;this.known=this.getSaved(),setInterval((function(){return e.checkGunPeerCount()}),1e3)}};function on(e){if(void 0===e&&(e={}),!tn){var t=Object.assign({peers:e.peers||rn.random(),localStorage:!1,retry:Infinity},e);e.peers&&e.peers.forEach((function(e){return rn.add({url:e})})),rn.init(),tn=new jt(t)}return tn}var an,sn={email:/^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i,bitcoin:/^[13][a-km-zA-HJ-NP-Z0-9]{26,33}$/,bitcoin_address:/^[13][a-km-zA-HJ-NP-Z0-9]{26,33}$/,ip:/^(([1-9]?\d|1\d\d|2[0-5][0-5]|2[0-4]\d)\.){3}([1-9]?\d|1\d\d|2[0-5][0-5]|2[0-4]\d)$/,ipv6:/^(?:[A-F0-9]{1,4}:){7}[A-F0-9]{1,4}$/,gpg_fingerprint:null,gpg_keyid:null,google_oauth2:null,tel:/^\d{7,}$/,phone:/^\d{7,}$/,keyID:null,url:/[-a-zA-Z0-9@:%_\+.~#?&//=]{2,256}\.[a-z]{2,4}\b(\/[-a-zA-Z0-9@:%_\+.~#?&//=]*)?/gi,account:/^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i,uuid:/[0-9a-f]{8}\-[0-9a-f]{4}\-[0-9a-f]{4}\-[0-9a-f]{4}\-[0-9a-f]{12}/},cn=function(){function e(t,n){if("object"==typeof t){if("string"!=typeof t.value)throw new Error("param1.value must be a string, got "+typeof t.value+": "+JSON.stringify(t.value));if("string"!=typeof t.type)throw new Error("param1.type must be a string, got "+typeof t.type+": "+JSON.stringify(t.type));n=t.value,t=t.type}if("string"!=typeof t)throw new Error("First param must be a string, got "+typeof t+": "+JSON.stringify(t));if(!t.length)throw new Error("First param string is empty");if(n){if("string"!=typeof n)throw new Error("Second parameter must be a string, got "+typeof n+": "+JSON.stringify(n));if(!n.length)throw new Error("Second param string is empty");this.type=t,this.value=n}else{this.value=t;var r=e.guessTypeOf(this.value);if(!r)throw new Error("Type of attribute was omitted and could not be guessed");this.type=r}}e.getUuid=function(){return new e("uuid",function e(t){return t?(t^16*Math.random()>>t/4).toString(16):([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g,e)}())},e.getUniqueIdValidators=function(){return sn},e.isUniqueType=function(e){return Object.keys(sn).indexOf(e)>-1};var t=e.prototype;return t.isUniqueType=function(){return e.isUniqueType(this.type)},e.guessTypeOf=function(e){for(var t in sn)if(e.match(sn[t]))return t},e.equals=function(e,t){return e.equals(t)},t.equals=function(e){return e&&this.type===e.type&&this.value===e.value},t.uri=function(){return encodeURIComponent(this.value)+":"+encodeURIComponent(this.type)},e}();function un(e){return an||(an=on().user()).auth(Fr.getKey()),e?on().user(e):an}var ln={read:!0,write:!0,admin:!1},fn=function(){function e(e){var t=this;if(this.theirSecretUuids={},this.theirGroupSecrets={},this.secrets={},this.ourSecretChannelIds={},this.theirSecretChannelIds={},this.messages={},this.chatLinks={},this.groupSubscriptions={},this.directSubscriptions={},this.getParticipantsCallbacks={},this.myGroupSecret=e.myGroupSecret,e.chatLink&&this.useChatLink(e),"string"==typeof e.participants)this.addParticipant(e.participants,e.save);else if(Array.isArray(e.participants)){var n={};e.participants.forEach((function(e){return n[e]=Object.assign({},ln)})),e.participants=n}"object"==typeof e.participants&&(Object.keys(e.participants).forEach((function(n){n!==Fr.getKey().pub&&t.addParticipant(n,e.save,Object.assign({},ln,e.participants[n]))})),e.participants[Fr.getKey().pub]=e.participants[Fr.getKey().pub]||Object.assign({},ln),e.uuid?(this.uuid=e.uuid,this.name=e.name):(e.uuid=cn.getUuid().value,this.uuid=e.uuid,e.participants[Fr.getKey().pub].admin=!0,e.participants[Fr.getKey().pub].founder=!0),this.getChatLinks({subscribe:!0})),this.participants=e.participants,e.uuid&&(this.putDirect("S"+this.uuid,this.getMyGroupSecret()),this.getMySecretUuid().then((function(e){t.putDirect(t.uuid,e)})),this.onTheirDirect(this.uuid,(function(e,n,r){t.theirSecretUuids[r]=e})),this.onTheirDirect("S"+this.uuid,(function(e,n,r){t.theirGroupSecrets[r]=e}))),this.onTheir("participants",(function(n,r,i){for(var o=!1,a=Object.keys(t.participants),s=0;s44)){t.next=5;break}return on().user().get("chats").get(s).put(null),t.abrupt("return");case 5:return t.next=7,Vt.gunOnceDefined(on().user().get("chats").get(s).get("pub"));case 7:return c=t.sent,t.next=10,jt.SEA.decrypt(c,o);case 10:if(u=t.sent){t.next=13;break}return t.abrupt("return");case 13:u.pub||"string"==typeof u?n(new e({key:i,participants:u.pub||u,save:!1})):u.uuid&&u.participants&&u.myGroupSecret&&n(new e({key:i,participants:u.participants,uuid:u.uuid,myGroupSecret:u.myGroupSecret,save:!1}));case 14:case"end":return t.stop()}}),t)})));return function(e,n){return t.apply(this,arguments)}}(),on().user().get("chats").map().on(s);case 9:case"end":return t.stop()}}),t)})));return function(e,n){return t.apply(this,arguments)}}(),t.getMyGroupSecret=function(){return this.myGroupSecret||this.changeMyGroupSecret(),this.myGroupSecret},t.getOurSecretChannelId=function(){var e=Ct(Dt().mark((function e(t){var n;return Dt().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(this.ourSecretChannelIds[t]){e.next=7;break}return e.next=3,this.getSecret(t);case 3:return n=e.sent,e.next=6,Vt.getHash(n+t);case 6:this.ourSecretChannelIds[t]=e.sent;case 7:return e.abrupt("return",this.ourSecretChannelIds[t]);case 8:case"end":return e.stop()}}),e,this)})));return function(t){return e.apply(this,arguments)}}(),t.getTheirSecretChannelId=function(){var e=Ct(Dt().mark((function e(t){var n;return Dt().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(this.theirSecretChannelIds[t]){e.next=7;break}return e.next=3,this.getSecret(t);case 3:return n=e.sent,e.next=6,Vt.getHash(n+Fr.getKey().pub);case 6:this.theirSecretChannelIds[t]=e.sent;case 7:return e.abrupt("return",this.theirSecretChannelIds[t]);case 8:case"end":return e.stop()}}),e,this)})));return function(t){return e.apply(this,arguments)}}(),t.getMessages=function(){var e=Ct(Dt().mark((function e(t){var n,r=this;return Dt().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(this.getCurrentParticipants().forEach(function(){var e=Ct(Dt().mark((function e(n){var i,o;return Dt().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n===Fr.getKey().pub){e.next=11;break}if(!r.uuid){e.next=7;break}return e.next=4,r.getTheirSecretUuid(n);case 4:i=e.sent,e.next=10;break;case 7:return e.next=9,r.getTheirSecretChannelId(n);case 9:i=e.sent;case 10:on().user(n).get("chats").get(i).get("msgs").map().once((function(e,i){r.messageReceived(t,e,r.uuid||n,!1,i,n)}));case 11:if(r.uuid){e.next=16;break}return e.next=14,r.getOurSecretChannelId(n);case 14:o=e.sent,un().get("chats").get(o).get("msgs").map().once((function(e,i){r.messageReceived(t,e,n,!0,i,Fr.getKey().pub)}));case 16:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}()),!this.uuid){e.next=6;break}return e.next=4,this.getMySecretUuid();case 4:n=e.sent,un().get("chats").get(n).get("msgs").map().once((function(e,n){r.messageReceived(t,e,r.uuid,!0,n,Fr.getKey().pub)}));case 6:case"end":return e.stop()}}),e,this)})));return function(t){return e.apply(this,arguments)}}(),t.messageReceived=function(){var e=Ct(Dt().mark((function e(t,n,r,i,o,a){var s,c,u;return Dt().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!this.messages[o]&&n){e.next=2;break}return e.abrupt("return");case 2:if(!this.uuid){e.next=8;break}return e.next=5,this.getTheirGroupSecret(a);case 5:e.t0=e.sent,e.next=11;break;case 8:return e.next=10,this.getSecret(r);case 10:e.t0=e.sent;case 11:return s=e.t0,e.next=14,jt.SEA.decrypt(n,s);case 14:if("object"==typeof(c=e.sent)){e.next=17;break}return e.abrupt("return");case 17:u={selfAuthored:i,channelId:r,from:a},this.messages[o]=c,t(c,u);case 20:case"end":return e.stop()}}),e,this)})));return function(t,n,r,i,o,a){return e.apply(this,arguments)}}(),t.getLatestMsg=function(){var e=Ct(Dt().mark((function e(t){var n,r=this;return Dt().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:n=function(){var e=Ct(Dt().mark((function e(n,i){return Dt().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:r.latest?("string"==typeof r.latest.time?r.latest.time:r.latest.time.toISOString()) '+t.label,i.addEventListener("click",(function(){i.setAttribute("style","display: none"),n?r.setAttribute("style",""):(n=new e(t.channelOptions),r=n.getChatBox(),document.body.appendChild(r))}))},t.getSimpleLink=function(e){return void 0===e&&(e="https://iris.to/"),this.uuid?e+"?channelId="+this.uuid+"&inviter="+Fr.getKey().pub:e+"?chatWith="+this.getCurrentParticipants()[0]},t.getChatLinks=function(){var t=Ct(Dt().mark((function t(n){var r,i,o,a,s,c,u=this;return Dt().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(void 0===n&&(n={}),i=(r=n).callback,a=r.subscribe,o=(o=r.urlRoot)||"https://iris.to/",this.uuid){t.next=5;break}throw new Error("Only group channels may have chat links");case 5:s=[],c={},this.on("chatLinks",(function(t,n){t&&"object"==typeof t&&Object.keys(t).forEach((function(r){var l=t[r];if(null===l)return c[r]&&c[r].off(),delete c[r],void(i&&i({id:r,url:null}));if(-1===s.indexOf(r)){var f=[];s.push(r);var h=e.formatChatLink({urlRoot:o,inviter:n,channelId:u.uuid,sharedSecret:l.sharedSecret,linkId:r});i&&i({url:h,id:r}),a&&on().user(l.sharedKey.pub).get("chatRequests").map().on(function(){var e=Ct(Dt().mark((function e(t,n,i,o){var a;return Dt().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t&&"string"==typeof t&&!(t.length<10)){e.next=2;break}return e.abrupt("return");case 2:if(c[r]=o,a=JSON.stringify(t),-1!==f.indexOf(a)){e.next=10;break}return f.push(a),e.next=8,jt.SEA.decrypt(t,l.sharedSecret);case 8:u.addParticipant(e.sent,void 0,void 0,!0);case 10:case"end":return e.stop()}}),e)})));return function(t,n,r,i){return e.apply(this,arguments)}}())}}))}));case 8:case"end":return t.stop()}}),t,this)})));return function(e){return t.apply(this,arguments)}}(),t.createChatLink=function(){var t=Ct(Dt().mark((function t(n){var r,i,o,a,s,c,u;return Dt().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return void 0===n&&(n="https://iris.to/"),t.next=3,jt.SEA.pair();case 3:return r=t.sent,i=JSON.stringify(r),t.next=7,jt.SEA.secret(r.epub,r);case 7:return o=t.sent,t.next=10,jt.SEA.encrypt(i,o);case 10:return a=t.sent,t.next=13,jt.SEA.secret(Fr.getKey().epub,Fr.getKey());case 13:return s=t.sent,t.next=16,jt.SEA.encrypt(i,s);case 16:return c=t.sent,t.next=19,Vt.getHash(a);case 19:return u=(u=t.sent).slice(0,12),t.next=23,Vt.gunAsAnotherUser(on(),r,(function(e){return e.get("chatRequests").put({a:1}).then()}));case 23:return this.chatLinks[u]={sharedKey:r,sharedSecret:o},this.put("chatLinks",this.chatLinks),un().get("chatLinks").get(u).put({encryptedSharedKey:a,ownerEncryptedSharedKey:c}),t.abrupt("return",e.formatChatLink({urlRoot:n,channelId:this.uuid,inviter:Fr.getKey().pub,sharedSecret:o,linkId:u}));case 27:case"end":return t.stop()}}),t,this)})));return function(e){return t.apply(this,arguments)}}(),t.getChatBox=function(){var t=this;Vt.injectCss();var n=!1,r=Vt.createElement("div","iris-chat-box"),i=Vt.createElement("div","iris-chat-header",r),o=Vt.createElement("span","iris-chat-minimize",i);o.innerText="—",o.addEventListener("click",(function(e){e.stopPropagation(),r.setAttribute("class","iris-chat-box minimized"),n=!0}));var a=Vt.createElement("div","iris-chat-header-text",i),s=Vt.createElement("span","iris-online-indicator",a);s.innerHTML="●";var c=Vt.createElement("span",void 0,a),u=Vt.createElement("span","iris-chat-close",i);u.innerHTML="×",u.addEventListener("click",(function(){r.setAttribute("style","display: none");var e=document.getElementById("iris-chat-open-button");e&&e.setAttribute("style","")})),i.addEventListener("click",(function(){n&&(r.setAttribute("class","iris-chat-box"),n=!1)}));var l=Vt.createElement("div","iris-chat-messages",r),f=Vt.createElement("div","iris-typing-indicator",r);f.innerText="typing...",this.getTyping((function(e){f.setAttribute("class","iris-typing-indicator"+(e?" yes":""))}));var h=Vt.createElement("div","iris-chat-input-wrapper",r),p=Vt.createElement("textarea",void 0,h);if(p.setAttribute("rows","1"),p.setAttribute("placeholder","Type a message"),Vt.isMobile){var d=Vt.createElement("button",void 0,h);d.innerHTML='\n \n ',d.addEventListener("click",(function(){t.send(p.value),p.value="",t.setTyping(!1)}))}var g=this.getCurrentParticipants();if(g.length){var y=g[0];on().user(y).get("profile").get("name").on((function(e){return c.innerText=e})),e.getActivity(on(),y,(function(e){s.setAttribute("class","iris-online-indicator"+(e.isActive?" yes":"")),l.querySelectorAll(".iris-chat-message:not(.delivered)").forEach((function(t){if(t.getAttribute("data-time")<=e.lastActive){var n=t.getAttribute("class");t.setAttribute("class",n+" delivered")}}))}))}return this.getTheirMsgsLastSeenTime((function(e){l.querySelectorAll(".iris-seen:not(.yes)").forEach((function(t){var n=t.parentElement.parentElement.parentElement;if(n.getAttribute("data-time")<=e){var r=n.getAttribute("class");-1===r.indexOf("delivered")&&n.setAttribute("class",r+" delivered"),t.setAttribute("class","iris-seen yes")}}))})),this.getMessages((function(e,n){var r=Vt.createElement("div","iris-msg-content");r.innerText=e.text;var i=Vt.createElement("div","time",r);i.innerText=Vt.formatTime(new Date(e.time)),n.selfAuthored&&(Vt.createElement("span",t.theirMsgsLastSeenTime>=e.time?"iris-seen yes":"iris-seen",i).innerHTML=' '),r.innerHTML=r.innerHTML.replace(/\n/g,"
\n");var o=Vt.createElement("div",(n.selfAuthored?"our":"their")+" iris-chat-message");o.appendChild(r),o.setAttribute("data-time",e.time);for(var a=l.children.length;a>=0;a--)if(0===a)l.insertBefore(o,l.firstChild);else{var s=l.children[a-1].getAttribute("data-time");if(s&&snew Date(r.getTime()-1e4)&&ie.db.version;if(e.versione.version&&(e.version=i)}return!0}return!1}function k(e){return o([function(e){for(var t=e.length,n=new ArrayBuffer(t),r=new Uint8Array(n),i=0;i0&&(!e.db||"InvalidStateError"===i.name||"NotFoundError"===i.name))return a.resolve().then((function(){if(!e.db||"NotFoundError"===i.name&&!e.db.objectStoreNames.contains(e.storeName)&&e.version<=e.db.version)return e.db&&(e.version=e.db.version+1),b(e)})).then((function(){return function(e){d(e);for(var t=h[e.name],n=t.forages,r=0;r=43)}})).catch((function(){return!1}))}(e).then((function(e){return f=e}))}(s.db).then((function(e){return e?t:(n=t,new a((function(e,t){var r=new FileReader;r.onerror=t,r.onloadend=function(t){var r=btoa(t.target.result||"");e({__local_forage_encoded_blob:!0,data:r,type:n.type})},r.readAsBinaryString(n)})));var n})):t})).then((function(t){S(r._dbInfo,"readwrite",(function(o,a){if(o)return i(o);try{var s=a.objectStore(r._dbInfo.storeName);null===t&&(t=void 0);var c=s.put(t,e);a.oncomplete=function(){void 0===t&&(t=null),n(t)},a.onabort=a.onerror=function(){i(c.error?c.error:c.transaction.error)}}catch(e){i(e)}}))})).catch(i)}));return s(i,n),i},removeItem:function(e,t){var n=this;e=u(e);var r=new a((function(t,r){n.ready().then((function(){S(n._dbInfo,"readwrite",(function(i,o){if(i)return r(i);try{var a=o.objectStore(n._dbInfo.storeName).delete(e);o.oncomplete=function(){t()},o.onerror=function(){r(a.error)},o.onabort=function(){r(a.error?a.error:a.transaction.error)}}catch(e){r(e)}}))})).catch(r)}));return s(r,t),r},clear:function(e){var t=this,n=new a((function(e,n){t.ready().then((function(){S(t._dbInfo,"readwrite",(function(r,i){if(r)return n(r);try{var o=i.objectStore(t._dbInfo.storeName).clear();i.oncomplete=function(){e()},i.onabort=i.onerror=function(){n(o.error?o.error:o.transaction.error)}}catch(e){n(e)}}))})).catch(n)}));return s(n,e),n},length:function(e){var t=this,n=new a((function(e,n){t.ready().then((function(){S(t._dbInfo,"readonly",(function(r,i){if(r)return n(r);try{var o=i.objectStore(t._dbInfo.storeName).count();o.onsuccess=function(){e(o.result)},o.onerror=function(){n(o.error)}}catch(e){n(e)}}))})).catch(n)}));return s(n,e),n},key:function(e,t){var n=this,r=new a((function(t,r){e<0?t(null):n.ready().then((function(){S(n._dbInfo,"readonly",(function(i,o){if(i)return r(i);try{var a=o.objectStore(n._dbInfo.storeName),s=!1,c=a.openKeyCursor();c.onsuccess=function(){var n=c.result;n?0===e||s?t(n.key):(s=!0,n.advance(e)):t(null)},c.onerror=function(){r(c.error)}}catch(e){r(e)}}))})).catch(r)}));return s(r,t),r},keys:function(e){var t=this,n=new a((function(e,n){t.ready().then((function(){S(t._dbInfo,"readonly",(function(r,i){if(r)return n(r);try{var o=i.objectStore(t._dbInfo.storeName).openKeyCursor(),a=[];o.onsuccess=function(){var t=o.result;t?(a.push(t.key),t.continue()):e(a)},o.onerror=function(){n(o.error)}}catch(e){n(e)}}))})).catch(n)}));return s(n,e),n},dropInstance:function(e,t){t=l.apply(this,arguments);var n=this.config();(e="function"!=typeof e&&e||{}).name||(e.name=e.name||n.name,e.storeName=e.storeName||n.storeName);var r,o=this;if(e.name){var c=e.name===n.name&&o._dbInfo.db,u=c?a.resolve(o._dbInfo.db):m(e).then((function(t){var n=h[e.name],r=n.forages;n.db=t;for(var i=0;i>4,l[c++]=(15&r)<<4|i>>2,l[c++]=(3&i)<<6|63&o;return u}function C(e){var t,n=new Uint8Array(e),r="";for(t=0;t>2],r+=T[(3&n[t])<<4|n[t+1]>>4],r+=T[(15&n[t+1])<<2|n[t+2]>>6],r+=T[63&n[t+2]];return n.length%3==2?r=r.substring(0,r.length-1)+"=":n.length%3==1&&(r=r.substring(0,r.length-2)+"=="),r}var N={serialize:function(e,t){var n="";if(e&&(n=D.call(e)),e&&("[object ArrayBuffer]"===n||e.buffer&&"[object ArrayBuffer]"===D.call(e.buffer))){var r,i="__lfsc__:";e instanceof ArrayBuffer?(r=e,i+="arbf"):(r=e.buffer,"[object Int8Array]"===n?i+="si08":"[object Uint8Array]"===n?i+="ui08":"[object Uint8ClampedArray]"===n?i+="uic8":"[object Int16Array]"===n?i+="si16":"[object Uint16Array]"===n?i+="ur16":"[object Int32Array]"===n?i+="si32":"[object Uint32Array]"===n?i+="ui32":"[object Float32Array]"===n?i+="fl32":"[object Float64Array]"===n?i+="fl64":t(new Error("Failed to get type for BinaryArray"))),t(i+C(r))}else if("[object Blob]"===n){var o=new FileReader;o.onload=function(){var n="~~local_forage_type~"+e.type+"~"+C(this.result);t("__lfsc__:blob"+n)},o.readAsArrayBuffer(e)}else try{t(JSON.stringify(e))}catch(n){console.error("Couldn't convert value into a JSON string: ",e),t(null,n)}},deserialize:function(e){if("__lfsc__:"!==e.substring(0,A))return JSON.parse(e);var t,n=e.substring(j),r=e.substring(A,j);if("blob"===r&&O.test(n)){var i=n.match(O);t=i[1],n=n.substring(i[0].length)}var a=I(n);switch(r){case"arbf":return a;case"blob":return o([a],{type:t});case"si08":return new Int8Array(a);case"ui08":return new Uint8Array(a);case"uic8":return new Uint8ClampedArray(a);case"si16":return new Int16Array(a);case"ur16":return new Uint16Array(a);case"si32":return new Int32Array(a);case"ui32":return new Uint32Array(a);case"fl32":return new Float32Array(a);case"fl64":return new Float64Array(a);default:throw new Error("Unkown type: "+r)}},stringToBuffer:I,bufferToString:C};function M(e,t,n,r){e.executeSql("CREATE TABLE IF NOT EXISTS "+t.storeName+" (id INTEGER PRIMARY KEY, key unique, value)",[],n,r)}function L(e,t,n,r,i,o){e.executeSql(n,r,i,(function(e,a){a.code===a.SYNTAX_ERR?e.executeSql("SELECT name FROM sqlite_master WHERE type='table' AND name = ?",[t.storeName],(function(e,s){s.rows.length?o(e,a):M(e,t,(function(){e.executeSql(n,r,i,o)}),o)}),o):o(e,a)}),o)}function P(e,t,n,r){var i=this;e=u(e);var o=new a((function(o,a){i.ready().then((function(){void 0===t&&(t=null);var s=t,c=i._dbInfo;c.serializer.serialize(t,(function(t,u){u?a(u):c.db.transaction((function(n){L(n,c,"INSERT OR REPLACE INTO "+c.storeName+" (key, value) VALUES (?, ?)",[e,t],(function(){o(s)}),(function(e,t){a(t)}))}),(function(t){if(t.code===t.QUOTA_ERR){if(r>0)return void o(P.apply(i,[e,s,n,r-1]));a(t)}}))}))})).catch(a)}));return s(o,n),o}function R(e){return new a((function(t,n){e.transaction((function(r){r.executeSql("SELECT name FROM sqlite_master WHERE type='table' AND name <> '__WebKitDatabaseInfoTable__'",[],(function(n,r){for(var i=[],o=0;o0?(this._dbInfo=t,t.serializer=N,a.resolve()):a.reject()},_support:function(){try{return"undefined"!=typeof localStorage&&"setItem"in localStorage&&!!localStorage.setItem}catch(e){return!1}}(),iterate:function(e,t){var n=this,r=n.ready().then((function(){for(var t=n._dbInfo,r=t.keyPrefix,i=r.length,o=localStorage.length,a=1,s=0;s=0;n--){var r=localStorage.key(n);0===r.indexOf(e)&&localStorage.removeItem(r)}}));return s(n,e),n},length:function(e){var t=this.keys().then((function(e){return e.length}));return s(t,e),t},key:function(e,t){var n=this,r=n.ready().then((function(){var t,r=n._dbInfo;try{t=localStorage.key(e)}catch(e){t=null}return t&&(t=t.substring(r.keyPrefix.length)),t}));return s(r,t),r},keys:function(e){var t=this,n=t.ready().then((function(){for(var e=t._dbInfo,n=localStorage.length,r=[],i=0;i=0;t--){var n=localStorage.key(t);0===n.indexOf(e)&&localStorage.removeItem(n)}})):a.reject("Invalid arguments"),t),r}},G=function(e,t){for(var n,r,i=e.length,o=0;o=0?Tn:0,mn().get("unseenMsgsTotal").put(Tn)}},webPushSubscriptions:An,subscribeToWebPush:function(){return Mn.apply(this,arguments)},getWebPushSubscriptions:function(){return Bn.apply(this,arguments)},removeSubscription:function(e){delete An[e],on().user().get("webPushSubscriptions").get(e).put(null),Ln()}};function qn(e){return Array.isArray?Array.isArray(e):"[object Array]"===Qn(e)}function Hn(e){return"string"==typeof e}function Jn(e){return"number"==typeof e}function Vn(e){return"object"==typeof e}function Yn(e){return null!=e}function Xn(e){return!e.trim().length}function Qn(e){return null==e?void 0===e?"[object Undefined]":"[object Null]":Object.prototype.toString.call(e)}const Zn=Object.prototype.hasOwnProperty;class er{constructor(e){this._keys=[],this._keyMap={};let t=0;e.forEach(e=>{let n=tr(e);t+=n.weight,this._keys.push(n),this._keyMap[n.id]=n,t+=n.weight}),this._keys.forEach(e=>{e.weight/=t})}get(e){return this._keyMap[e]}keys(){return this._keys}toJSON(){return JSON.stringify(this._keys)}}function tr(e){let t=null,n=null,r=null,i=1,o=null;if(Hn(e)||qn(e))r=e,t=nr(e),n=rr(e);else{if(!Zn.call(e,"name"))throw new Error("Missing name property in key");const a=e.name;if(r=a,Zn.call(e,"weight")&&(i=e.weight,i<=0))throw new Error((e=>`Property 'weight' in key '${e}' must be a positive integer`)(a));t=nr(a),n=rr(a),o=e.getFn}return{path:t,id:n,weight:i,src:r,getFn:o}}function nr(e){return qn(e)?e:e.split(".")}function rr(e){return qn(e)?e.join("."):e}var ir={isCaseSensitive:!1,includeScore:!1,keys:[],shouldSort:!0,sortFn:(e,t)=>e.score===t.score?e.idx{if(Yn(e))if(t[o]){const a=e[t[o]];if(!Yn(a))return;if(o===t.length-1&&(Hn(a)||Jn(a)||function(e){return!0===e||!1===e||function(e){return Vn(e)&&null!==e}(e)&&"[object Boolean]"==Qn(e)}(a)))n.push(function(e){return null==e?"":function(e){if("string"==typeof e)return e;let t=e+"";return"0"==t&&1/e==-1/0?"-0":t}(e)}(a));else if(qn(a)){r=!0;for(let e=0,n=a.length;e{this._keysMap[e.id]=t})}create(){!this.isCreated&&this.docs.length&&(this.isCreated=!0,Hn(this.docs[0])?this.docs.forEach((e,t)=>{this._addString(e,t)}):this.docs.forEach((e,t)=>{this._addObject(e,t)}),this.norm.clear())}add(e){const t=this.size();Hn(e)?this._addString(e,t):this._addObject(e,t)}removeAt(e){this.records.splice(e,1);for(let t=e,n=this.size();t{let i=t.getFn?t.getFn(e):this.getFn(e,t.path);if(Yn(i))if(qn(i)){let e=[];const t=[{nestedArrIndex:-1,value:i}];for(;t.length;){const{nestedArrIndex:n,value:r}=t.pop();if(Yn(r))if(Hn(r)&&!Xn(r)){let t={v:r,i:n,n:this.norm.get(r)};e.push(t)}else qn(r)&&r.forEach((e,n)=>{t.push({nestedArrIndex:n,value:e})})}n.$[r]=e}else if(Hn(i)&&!Xn(i)){let e={v:i,n:this.norm.get(i)};n.$[r]=e}}),this.records.push(n)}toJSON(){return{keys:this.keys,records:this.records}}}function sr(e,t,{getFn:n=ir.getFn,fieldNormWeight:r=ir.fieldNormWeight}={}){const i=new ar({getFn:n,fieldNormWeight:r});return i.setKeys(e.map(tr)),i.setSources(t),i.create(),i}function cr(e,{errors:t=0,currentLocation:n=0,expectedLocation:r=0,distance:i=ir.distance,ignoreLocation:o=ir.ignoreLocation}={}){const a=t/e.length;if(o)return a;const s=Math.abs(r-n);return i?a+s/i:s?1:a}function ur(e){let t={};for(let n=0,r=e.length;n{this.chunks.push({pattern:e,alphabet:ur(e),startIndex:t})},l=this.pattern.length;if(l>32){let e=0;const t=l%32,n=l-t;for(;e{const{isMatch:d,score:g,indices:y}=function(e,t,n,{location:r=ir.location,distance:i=ir.distance,threshold:o=ir.threshold,findAllMatches:a=ir.findAllMatches,minMatchCharLength:s=ir.minMatchCharLength,includeMatches:c=ir.includeMatches,ignoreLocation:u=ir.ignoreLocation}={}){if(t.length>32)throw new Error("Pattern length exceeds max of 32.");const l=t.length,f=e.length,h=Math.max(0,Math.min(r,f));let p=o,d=h;const g=s>1||c,y=g?Array(f):[];let v;for(;(v=e.indexOf(t,d))>-1;){let e=cr(t,{currentLocation:v,expectedLocation:h,distance:i,ignoreLocation:u});if(p=Math.min(e,p),d=v+l,g){let e=0;for(;e=c;o-=1){let a=o-1,s=n[e.charAt(a)];if(g&&(y[a]=+!!s),x[o]=(x[o+1]<<1|1)&s,r&&(x[o]|=(m[o+1]|m[o])<<1|1|m[o+1]),x[o]&k&&(b=cr(t,{errors:r,currentLocation:a,expectedLocation:h,distance:i,ignoreLocation:u}),b<=p)){if(p=b,d=a,d<=h)break;c=Math.max(1,2*h-d)}}if(cr(t,{errors:r+1,currentLocation:h,expectedLocation:h,distance:i,ignoreLocation:u})>p)break;m=x}const x={isMatch:d>=0,score:Math.max(.001,b)};if(g){const e=function(e=[],t=ir.minMatchCharLength){let n=[],r=-1,i=-1,o=0;for(let a=e.length;o=t&&n.push([r,i]),r=-1)}return e[o-1]&&o-r>=t&&n.push([r,o-1]),n}(y,s);e.length?c&&(x.indices=e):x.isMatch=!1}return x}(e,t,h,{location:r+p,distance:i,threshold:o,findAllMatches:a,minMatchCharLength:s,includeMatches:n,ignoreLocation:c});d&&(f=!0),l+=g,d&&y&&(u=[...u,...y])});let h={isMatch:f,score:f?l/this.chunks.length:1};return f&&n&&(h.indices=u),h}}class fr{constructor(e){this.pattern=e}static isMultiMatch(e){return hr(e,this.multiRegex)}static isSingleMatch(e){return hr(e,this.singleRegex)}search(){}}function hr(e,t){const n=e.match(t);return n?n[1]:null}class pr extends fr{constructor(e,{location:t=ir.location,threshold:n=ir.threshold,distance:r=ir.distance,includeMatches:i=ir.includeMatches,findAllMatches:o=ir.findAllMatches,minMatchCharLength:a=ir.minMatchCharLength,isCaseSensitive:s=ir.isCaseSensitive,ignoreLocation:c=ir.ignoreLocation}={}){super(e),this._bitapSearch=new lr(e,{location:t,threshold:n,distance:r,includeMatches:i,findAllMatches:o,minMatchCharLength:a,isCaseSensitive:s,ignoreLocation:c})}static get type(){return"fuzzy"}static get multiRegex(){return/^"(.*)"$/}static get singleRegex(){return/^(.*)$/}search(e){return this._bitapSearch.searchIn(e)}}class dr extends fr{constructor(e){super(e)}static get type(){return"include"}static get multiRegex(){return/^'"(.*)"$/}static get singleRegex(){return/^'(.*)$/}search(e){let t,n=0;const r=[],i=this.pattern.length;for(;(t=e.indexOf(this.pattern,n))>-1;)n=t+i,r.push([t,n-1]);const o=!!r.length;return{isMatch:o,score:o?0:1,indices:r}}}const gr=[class extends fr{constructor(e){super(e)}static get type(){return"exact"}static get multiRegex(){return/^="(.*)"$/}static get singleRegex(){return/^=(.*)$/}search(e){const t=e===this.pattern;return{isMatch:t,score:t?0:1,indices:[0,this.pattern.length-1]}}},dr,class extends fr{constructor(e){super(e)}static get type(){return"prefix-exact"}static get multiRegex(){return/^\^"(.*)"$/}static get singleRegex(){return/^\^(.*)$/}search(e){const t=e.startsWith(this.pattern);return{isMatch:t,score:t?0:1,indices:[0,this.pattern.length-1]}}},class extends fr{constructor(e){super(e)}static get type(){return"inverse-prefix-exact"}static get multiRegex(){return/^!\^"(.*)"$/}static get singleRegex(){return/^!\^(.*)$/}search(e){const t=!e.startsWith(this.pattern);return{isMatch:t,score:t?0:1,indices:[0,e.length-1]}}},class extends fr{constructor(e){super(e)}static get type(){return"inverse-suffix-exact"}static get multiRegex(){return/^!"(.*)"\$$/}static get singleRegex(){return/^!(.*)\$$/}search(e){const t=!e.endsWith(this.pattern);return{isMatch:t,score:t?0:1,indices:[0,e.length-1]}}},class extends fr{constructor(e){super(e)}static get type(){return"suffix-exact"}static get multiRegex(){return/^"(.*)"\$$/}static get singleRegex(){return/^(.*)\$$/}search(e){const t=e.endsWith(this.pattern);return{isMatch:t,score:t?0:1,indices:[e.length-this.pattern.length,e.length-1]}}},class extends fr{constructor(e){super(e)}static get type(){return"inverse-exact"}static get multiRegex(){return/^!"(.*)"$/}static get singleRegex(){return/^!(.*)$/}search(e){const t=-1===e.indexOf(this.pattern);return{isMatch:t,score:t?0:1,indices:[0,e.length-1]}}},pr],yr=gr.length,vr=/ +(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)/,mr=new Set([pr.type,dr.type]),br=[];function wr(e,t){for(let n=0,r=br.length;n!(!e.$and&&!e.$or),xr=e=>({$and:Object.keys(e).map(t=>({[t]:e[t]}))});function _r(e,t,{auto:n=!0}={}){const r=e=>{let i=Object.keys(e);const o=(e=>!!e.$path)(e);if(!o&&i.length>1&&!kr(e))return r(xr(e));if((e=>!qn(e)&&Vn(e)&&!kr(e))(e)){const r=o?e.$path:i[0],a=o?e.$val:e[r];if(!Hn(a))throw new Error((e=>"Invalid value for key "+e)(r));const s={keyId:rr(r),pattern:a};return n&&(s.searcher=wr(a,t)),s}let a={children:[],operator:i[0]};return i.forEach(t=>{const n=e[t];qn(n)&&n.forEach(e=>{a.children.push(r(e))})}),a};return kr(e)||(e=xr(e)),r(e)}function Sr(e,t){const n=e.matches;t.matches=[],Yn(n)&&n.forEach(e=>{if(!Yn(e.indices)||!e.indices.length)return;const{indices:n,value:r}=e;let i={indices:n,value:r};e.key&&(i.key=e.key.src),e.idx>-1&&(i.refIndex=e.idx),t.matches.push(i)})}function Er(e,t){t.score=e.score}class Tr{constructor(e,t={},n){this.options={...ir,...t},this._keyStore=new er(this.options.keys),this.setCollection(e,n)}setCollection(e,t){if(this._docs=e,t&&!(t instanceof ar))throw new Error("Incorrect 'index' type");this._myIndex=t||sr(this.options.keys,this._docs,{getFn:this.options.getFn,fieldNormWeight:this.options.fieldNormWeight})}add(e){Yn(e)&&(this._docs.push(e),this._myIndex.add(e))}remove(e=(()=>!1)){const t=[];for(let n=0,r=this._docs.length;n{let n=1;e.matches.forEach(({key:e,norm:r,score:i})=>{const o=e?e.weight:null;n*=Math.pow(0===i&&o?Number.EPSILON:i,(o||1)*(t?1:r))}),e.score=n})}(s,{ignoreFieldNorm:a}),i&&s.sort(o),Jn(t)&&t>-1&&(s=s.slice(0,t)),function(e,t,{includeMatches:n=ir.includeMatches,includeScore:r=ir.includeScore}={}){const i=[];return n&&i.push(Sr),r&&i.push(Er),e.map(e=>{const{idx:n}=e,r={item:t[n],refIndex:n};return i.length&&i.forEach(t=>{t(e,r)}),r})}(s,this._docs,{includeMatches:n,includeScore:r})}_searchStringList(e){const t=wr(e,this.options),{records:n}=this._myIndex,r=[];return n.forEach(({v:e,i:n,n:i})=>{if(!Yn(e))return;const{isMatch:o,score:a,indices:s}=t.searchIn(e);o&&r.push({item:e,idx:n,matches:[{score:a,value:e,norm:i,indices:s}]})}),r}_searchLogical(e){const t=_r(e,this.options),n=(e,t,r)=>{if(!e.children){const{keyId:n,searcher:i}=e,o=this._findMatches({key:this._keyStore.get(n),value:this._myIndex.getValueForItemAtKeyId(t,n),searcher:i});return o&&o.length?[{idx:r,item:t,matches:o}]:[]}const i=[];for(let o=0,a=e.children.length;o{if(Yn(e)){let a=n(t,e,o);a.length&&(r[o]||(r[o]={idx:o,item:e,matches:[]},i.push(r[o])),a.forEach(({matches:e})=>{r[o].matches.push(...e)}))}}),i}_searchObjectList(e){const t=wr(e,this.options),{keys:n,records:r}=this._myIndex,i=[];return r.forEach(({$:e,i:r})=>{if(!Yn(e))return;let o=[];n.forEach((n,r)=>{o.push(...this._findMatches({key:n,value:e[r],searcher:t}))}),o.length&&i.push({idx:r,item:e,matches:o})}),i}_findMatches({key:e,value:t,searcher:n}){if(!Yn(t))return[];let r=[];if(qn(t))t.forEach(({v:t,i:i,n:o})=>{if(!Yn(t))return;const{isMatch:a,score:s,indices:c}=n.searchIn(t);a&&r.push({score:s,key:e,value:t,idx:i,norm:o,indices:c})});else{const{v:i,n:o}=t,{isMatch:a,score:s,indices:c}=n.searchIn(i);a&&r.push({score:s,key:e,value:i,norm:o,indices:c})}return r}}Tr.version="6.6.2",Tr.createIndex=sr,Tr.parseIndex=function(e,{getFn:t=ir.getFn,fieldNormWeight:n=ir.fieldNormWeight}={}){const{keys:r,records:i}=e,o=new ar({getFn:t,fieldNormWeight:n});return o.setKeys(r),o.setIndexRecords(i),o},Tr.config=ir,Tr.parseQuery=_r,function(...e){br.push(...e)}(class{constructor(e,{isCaseSensitive:t=ir.isCaseSensitive,includeMatches:n=ir.includeMatches,minMatchCharLength:r=ir.minMatchCharLength,ignoreLocation:i=ir.ignoreLocation,findAllMatches:o=ir.findAllMatches,location:a=ir.location,threshold:s=ir.threshold,distance:c=ir.distance}={}){this.query=null,this.options={isCaseSensitive:t,includeMatches:n,minMatchCharLength:r,findAllMatches:o,ignoreLocation:i,location:a,threshold:s,distance:c},this.pattern=t?e:e.toLowerCase(),this.query=function(e,t={}){return e.split("|").map(e=>{let n=e.trim().split(vr).filter(e=>e&&!!e.trim()),r=[];for(let e=0,i=n.length;en&&(Br[t].followDistance=n),r&&Br[t].followers.add(r)):(Br[t]={key:t,followDistance:n,followers:new Set(r&&[r])},this.taskQueue.push((function(){un(t).get("profile").get("name").on((function(n){Br[t].name=n,mn().get("contacts").get(t).get("name").put(n),e&&e(t,Br[t])}))}))),this.saveSearchResult(t),e&&e(t,Br[t]),this.updateSearchIndex(),this.updateNoFollows(),this.updateNoFollowers()},removeFollow:function(e,t,n){1===t&&(mn().get("contacts").get(e).put(!1),mn().get("groups").get("follows").get(e).put(!1),Br[e]&&(Br[e].followers.delete(n),this.updateNoFollows(),this.updateNoFollowers())),console.log("removeFollow",e,t,n),Br[e]&&0===Br[e].followers.size&&(delete Br[e],mn().get("contacts").get(e).put(!1),mn().get("groups").get("everyone").get(e).put(!1))},getExtendedFollows:function(e,t,n,r){var i=this;void 0===t&&(t=Or.pub),void 0===n&&(n=3),void 0===r&&(r=1);var o=Ur.get(t);if(!(o&&o<=r))return Ur.set(t,r),this.addFollow(e,t,r-1),un(t).get("follow").map().on((function(o,a){o?(i.addFollow(e,a,r,t),r0);e!==Nr&&(Nr=e,mn().get("noFollowers").put(Nr))}),1e3),getSearchIndex:function(){return Mr},setOurOnlineStatus:function(){var e=window.location.hash;fn.setActivity(Ir="active");var t=Gt((function(){var t=pn(e&&e.replace("#/profile/","").replace("#/chat/",""));t&&!Ir&&t.setMyMsgsLastSeenTime(),fn.setActivity(Ir="active"),clearTimeout(Dr),Dr=setTimeout((function(){return fn.setActivity(Ir="online")}),3e4)}),1e3);document.addEventListener("touchmove",t),document.addEventListener("mousemove",t),document.addEventListener("keypress",t),document.addEventListener("visibilitychange",(function(){if("visible"===document.visibilityState){fn.setActivity(Ir="active");var t=location.pathname.slice(1).replace("chat/",""),n=e&&pn(t);n&&(n.setMyMsgsLastSeenTime(),Kn.changeChatUnseenCount(t,0))}else fn.setActivity(Ir="online")})),t(),window.addEventListener("beforeunload",(function(){fn.setActivity(Ir=null)}))},updateGroups:function(){var e=this;this.getExtendedFollows((function(t,n){n.followDistance<=1&&mn().get("groups").get("follows").get(t).put(!0),mn().get("groups").get("everyone").get(t).put(!0),t===e.getPubKey()&&e.updateNoFollowers()}))},login:function(e){var t=this,n=!!Or;Or=e,localStorage.setItem("chatKeyPair",JSON.stringify(e)),un().auth(Or),un().put({epub:Or.epub}),un().get("likes").put({a:null}),un().get("msgs").put({a:null}),un().get("replies").put({a:null}),Kn.subscribeToWebPush(),Kn.getWebPushSubscriptions(),Kn.subscribeToIrisNotifications(),fn.getMyChatLinks(void 0,(function(e){mn().get("chatLinks").get(e.id).put(e.url),jr=e.url})),this.setOurOnlineStatus(),fn.getChannels((function(e){return t.addChannel(e)})),un().get("profile").get("name").on((function(e){e&&"string"==typeof e&&(Ar=e)})),Kn.init(),mn().get("loggedIn").put(!0),mn().get("settings").once().then((function(e){e?void 0!==e.enableWebtorrent&&void 0!==e.autoplayWebtorrent||(mn().get("settings").get("enableWebtorrent").put(Gr.local.enableWebtorrent),mn().get("settings").get("autoplayWebtorrent").put(Gr.local.autoplayWebtorrent)):mn().get("settings").put(Gr.local)})),un().get("block").map().on((function(e,t){mn().get("block").get(t).put(e),e&&delete Br[t]})),this.updateGroups(),n&&location.reload(),Rr&&(Rr.get("settings").on((function(e){mn().get("settings").get("electron").put(e)})),Rr.get("user").put(Or.pub)),mn().get("filters").get("group").once().then((function(e){e||mn().get("filters").get("group").put("follows")}))},loginAsNewUser:function(e){var t=this;void 0===e&&(e={});var n=e.name||Vt.generateName();return console.log("loginAsNewUser name",n),jt.SEA.pair().then((function(r){t.login(r),un().get("profile").put({a:null}),un().get("profile").get("name").put(n),mn().get("filters").put({a:null}),mn().get("filters").get("group").put("follows"),fn.createChatLink().then((function(e){return jr=e})),setTimeout((function(){!1!==e.autofollow&&(console.log("autofollowing",$r),un().get("follow").get($r).put(!0))}),1e3)}))},logOut:function(){var e=this;return Ct(Dt().mark((function t(){var n,r,i;return Dt().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(Rr&&Rr.get("user").put(null),!navigator.serviceWorker){t.next=16;break}return t.next=4,navigator.serviceWorker.getRegistration();case 4:if(!(n=t.sent)||!n.pushManager){t.next=16;break}return null==(r=n.active)||r.postMessage({key:null}),t.next=9,n.pushManager.getSubscription();case 9:if(!(i=t.sent)){t.next=16;break}return t.next=13,Vt.getHash(JSON.stringify(i));case 13:Kn.removeSubscription(t.sent),i.unsubscribe&&i.unsubscribe();case 16:e.clearIndexedDB(),localStorage.clear(),dn.clear().then((function(){window.location.hash="",window.location.href="/",location.reload()}));case 19:case"end":return t.stop()}}),t)})))()},clearIndexedDB:function(){return new Promise((function(e){var t=window.indexedDB.deleteDatabase("local()"),n=window.indexedDB.deleteDatabase("radata"),r=!1,i=!1,o=function(){r&&i&&e(void 0)};t.onerror=n.onerror=function(e){return console.error(e)},t.onsuccess=function(){r=!0,o()},n.onsuccess=function(){i=!0,o()}}))},getMyChatLink:function(){return jr||Vt.getProfileLink(Or.pub)},getKey:function(){return Or},getPubKey:function(){return Or&&Or.pub},getMyName:function(){return Ar},myPeerUrl:function(e){return"http://"+e+":8767/gun"},shareMyPeerUrl:function(e){var t=this;return Ct(Dt().mark((function n(){var r;return Dt().wrap((function(n){for(;;)switch(n.prev=n.next){case 0:return n.next=2,mn().get("settings").get("electron").get("publicIp").once();case 2:(r=n.sent)&&e.put&&e.put("my_peer",t.myPeerUrl(r));case 4:case"end":return n.stop()}}),n)})))()},newChannel:function(e,t){if(e&&!this.channelIds.has(e)){var n=pn(e,t);return this.addChannel(n),n}},addChannel:function(e){var t=this;this.taskQueue.push((function(){var n=e.getId();if(!t.channelIds.has(n)){t.channelIds.add(n);var r=mn().get("channels").get(n);if(r.get("latestTime").on((function(t){t&&(!e.latestTime||t>e.latestTime)&&(e.latestTime=t)})),r.get("theirMsgsLastSeenTime").on((function(t){if(t){var n=new Date(t);(!e.theirMsgsLastSeenDate||e.theirMsgsLastSeenDate=e.theirMsgsLastSeenTime&&(e.theirMsgsLastSeenTime=t,r.get("theirMsgsLastSeenTime").put(t))})),e.getMyMsgsLastSeenTime((function(t){e.myLastSeenTime=new Date(t),e.latest&&e.myLastSeenTime>=e.latest.time&&Kn.changeChatUnseenCount(n,0)})),e.isTyping=!1,e.getTyping((function(t){e.isTyping=t,mn().get("channels").get(n).get("isTyping").put(t)})),e.online={},fn.getActivity(n,(function(t){e&&(r.put({theirLastActiveTime:t&&t.lastActive,activity:t&&t.isActive&&t.status}),e.activity=t)})),e.uuid){var i=window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches;e.participantProfiles={},e.on("name",(function(t){e.name=t,Br[e.uuid]={name:t,uuid:e.uuid},mn().get("channels").get(e.uuid).get("name").put(t)})),e.on("photo",(function(t){Br[e.uuid]=Br[e.uuid]||{},Br[e.uuid].photo=t,mn().get("channels").get(e.uuid).get("photo").put(t)})),e.on("about",(function(t){return mn().get("channels").get(e.uuid).get("about").put(t)})),e.getParticipants((function(t){if(delete t.undefined,"object"==typeof t){var n=Object.keys(t);n.forEach((function(r,o){var a=360/Math.max(n.length,2)*o;e.participantProfiles[r]={permissions:t[r],color:"hsl("+a+", 98%, "+(i?80:33)+"%)"},un(r).get("profile").get("name").on((function(t){e.participantProfiles[r].name=t}))}))}mn().get("channels").get(e.uuid).get("participants").put(t)})),e.inviteLinks={},e.getChatLinks({callback:function(t){var n=t.url,r=t.id;console.log("got chat link",r,n),e.inviteLinks[r]=n,mn().get("inviteLinksChanged").put(!0)}})}else un(n).get("profile").get("name").on((function(e){return mn().get("channels").get(n).get("name").put(e)}));if(e.put){e.onTheir("webPushSubscriptions",(function(t,r,i){Array.isArray(t)&&(e.webPushSubscriptions=e.webPushSubscriptions||{},e.webPushSubscriptions[i||n]=t)}));var o=Object.values(Kn.webPushSubscriptions);setTimeout((function(){return e.put("webPushSubscriptions",o)}),5e3),t.shareMyPeerUrl(e)}e.onTheir("call",(function(e){mn().get("call").put({pub:n,call:e})})),mn().get("channels").get(n).put({enabled:!0})}}))},processMessage:function(e,t,n,r){var i=pn(e);i.messageIds=i.messageIds||{},i.messageIds[t.time+n.from]||(i.messageIds[t.time+n.from]=!0,n&&(t=Object.assign(t,n)),t.invite?this.newChannel(t.invite.group,"https://iris.to/?channelId="+t.invite.group+"&inviter="+e):(t.selfAuthored=n.selfAuthored,mn().get("channels").get(e).get("msgs").get(t.time+(t.from&&t.from.slice(0,10))).put(JSON.stringify(t)),t.timeObj=new Date(t.time),!n.selfAuthored&&t.timeObj>i.myLastSeenTime&&(window.location.hash!=="#/chat/"+e||"visible"!==document.visibilityState?Kn.changeChatUnseenCount(e,1):"active"===Ir&&i.setMyMsgsLastSeenTime()),!n.selfAuthored&&t.time>i.theirMsgsLastSeenTime&&mn().get("channels").get(e).get("theirMsgsLastSeenTime").put(t.time),(!i.latestTime||t.time>i.latestTime)&&mn().get("channels").get(e).put({latestTime:t.time,latest:{time:t.time,text:t.text,selfAuthored:n.selfAuthored}}),Kn.notifyMsg(t,n,e,r)))},subscribeToMsgs:function(e){var t=this,n=pn(e);n.subscribed||(n.subscribed=!0,n.getMessages((function(n,r){t.processMessage(e,n,r)})))},channelIds:new Set},Wr={get:function(e,t){return new Promise((function(n,r){e||r("No hash provided"),"string"!=typeof e&&r("Hash must be a string"),on().get("#").get(e).on((function(e,r,i,o){e&&(o.off(),t&&t(e),n(e))}))}))},put:function(e){return Ct(Dt().mark((function t(){var n;return Dt().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,Vt.getHash(e);case 2:return n=t.sent,on().get("#").get(n).put(e),t.abrupt("return",n);case 5:case"end":return t.stop()}}),t)})))()}},zr=function(){function e(){}return e.getActiveKey=function(){var t=Ct(Dt().mark((function t(n,r,i){var o,a,s,c,u;return Dt().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(void 0===n&&(n="."),void 0===r&&(r="iris.key"),!Pr){t.next=4;break}return t.abrupt("return",Pr);case 4:if(!i){t.next=21;break}if(!i.existsSync(o=n+"/"+r)){t.next=11;break}a=i.readFileSync(o,"utf8"),Pr=e.fromString(a),t.next=17;break;case 11:return t.next=13,e.generate();case 13:s=t.sent,i.writeFileSync(o,e.toString(Pr=Pr||s)),i.chmodSync(o,400);case 17:if(Pr){t.next=19;break}throw new Error("loading default key failed - check "+n+"/"+r);case 19:t.next=33;break;case 21:if(!(c=window.localStorage.getItem("iris.myKey"))){t.next=26;break}Pr=e.fromString(c),t.next=31;break;case 26:return t.next=28,e.generate();case 28:u=t.sent,Pr=Pr||u,window.localStorage.setItem("iris.myKey",e.toString(Pr));case 31:if(Pr){t.next=33;break}throw new Error("loading default key failed - check localStorage iris.myKey");case 33:return t.abrupt("return",Pr);case 34:case"end":return t.stop()}}),t)})));return function(e,n,r){return t.apply(this,arguments)}}(),e.getDefault=function(t,n){return void 0===t&&(t="."),void 0===n&&(n="iris.key"),e.getActiveKey(t,n)},e.getActivePub=function(){var t=Ct(Dt().mark((function t(n,r){return Dt().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return void 0===n&&(n="."),void 0===r&&(r="iris.key"),t.next=4,e.getActiveKey(n,r);case 4:return t.abrupt("return",t.sent.pub);case 6:case"end":return t.stop()}}),t)})));return function(e,n){return t.apply(this,arguments)}}(),e.setActiveKey=function(t,n,r,i,o){if(void 0===n&&(n=!0),void 0===r&&(r="."),void 0===i&&(i="iris.key"),Pr=t,n)if(Vt.isNode){var a=r+"/"+i;o.writeFileSync(a,e.toString(Pr)),o.chmodSync(a,400)}else window.localStorage.setItem("iris.myKey",e.toString(Pr))},e.toString=function(e){return JSON.stringify(e)},e.getId=function(e){if(!e||!e.pub)throw new Error("missing param");return e.pub},e.fromString=function(e){return JSON.parse(e)},e.generate=function(){return jt.SEA.pair()},e.sign=function(){var e=Ct(Dt().mark((function e(t,n){return Dt().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,jt.SEA.sign(t,n);case 2:return e.abrupt("return","a"+e.sent);case 4:case"end":return e.stop()}}),e)})));return function(t,n){return e.apply(this,arguments)}}(),e.verify=function(e,t){return jt.SEA.verify(e.slice(1),t)},e}(),Kr="Invalid message:",qr=function(e){var t,n;function r(){return e.apply(this,arguments)||this}return n=e,(t=r).prototype=Object.create(n.prototype),t.prototype.constructor=t,Mt(t,n),r}(Rt(Error)),Hr=function(){function e(e){if(this.signedData=e.signedData,this.pubKey=e.pubKey,e.sig){if("string"!=typeof e.sig)throw new qr("SignedMessage signature must be a string");this.sig=e.sig,this.getHash()}this._validate()}e._getArray=function(e){for(var t=[],n=Object.keys(e),r=0;re.maxRating)throw new qr(Kr+" Rating is above maxRating");if(e.rating(this.signedData.maxRating+this.signedData.minRating)/2},t.isNegative=function(){return"rating"===this.signedData.type&&this.signedData.rating<(this.signedData.maxRating+this.signedData.minRating)/2},t.isNeutral=function(){return"rating"===this.signedData.type&&this.signedData.rating===(this.signedData.maxRating+this.signedData.minRating)/2},t.sign=function(){var e=Ct(Dt().mark((function e(t){return Dt().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,zr.sign(this.signedData,t);case 2:return this.sig=e.sent,this.pubKey=t.pub,e.next=6,this.getHash();case 6:return e.abrupt("return",!0);case 7:case"end":return e.stop()}}),e,this)})));return function(t){return e.apply(this,arguments)}}(),e.create=function(){var t=Ct(Dt().mark((function t(n,r){var i;return Dt().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(!n.author&&r&&(n.author={keyID:zr.getId(r)}),n.time=n.time||(new Date).toISOString(),i=new e({signedData:n}),!r){t.next=6;break}return t.next=6,i.sign(r);case 6:return t.abrupt("return",i);case 7:case"end":return t.stop()}}),t)})));return function(e,n){return t.apply(this,arguments)}}(),e.createVerification=function(t,n){return t.type="verification",e.create(t,n)},e.createRating=function(t,n){return t.type="rating",t.context=t.context||"iris",t.maxRating=t.maxRating||10,t.minRating=t.minRating||-10,e.create(t,n)},t.getAuthor=function(e){for(var t,n=Ut(this.getAuthorIterable());!(t=n()).done;){var r=t.value;if(r.isUniqueType())return e.getContacts(r)}},t.getRecipient=function(e){if(this.signedData.recipient)for(var t,n=Ut(this.getRecipientIterable());!(t=n()).done;){var r=t.value;if(r.isUniqueType())return e.getContacts(r)}},t.getHash=function(){var e=Ct(Dt().mark((function e(){return Dt().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!this.sig||this.hash){e.next=4;break}return e.next=3,Vt.getHash(this.sig);case 3:this.hash=e.sent;case 4:return e.abrupt("return",this.hash);case 5:case"end":return e.stop()}}),e,this)})));return function(){return e.apply(this,arguments)}}(),t.getId=function(){return this.getHash()},e.fromSig=function(){var t=Ct(Dt().mark((function t(n){var r;return Dt().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(n.sig){t.next=2;break}throw new Error("Missing signature in object:",n);case 2:if(n.pubKey){t.next=4;break}throw new Error("Missing pubKey in object:");case 4:return r=JSON.parse(n.sig.slice(4)).m,t.abrupt("return",new e({signedData:r,sig:n.sig,pubKey:n.pubKey}));case 7:case"end":return t.stop()}}),t)})));return function(e){return t.apply(this,arguments)}}(),t.verify=function(){var e=Ct(Dt().mark((function e(){return Dt().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(this.pubKey){e.next=2;break}throw new qr(Kr+" SignedMessage has no .pubKey");case 2:if(this.sig){e.next=4;break}throw new qr(Kr+" SignedMessage has no .sig");case 4:return e.next=6,zr.verify(this.sig,this.pubKey);case 6:if(this.signedData=e.sent,this.signedData){e.next=9;break}throw new qr(Kr+" Invalid signature");case 9:if(!this.hash){e.next=18;break}return e.t0=this.hash,e.next=13,Vt.getHash(this.sig);case 13:if(e.t1=e.sent,e.t0===e.t1){e.next=16;break}throw new qr(Kr+" Invalid message hash");case 16:e.next=19;break;case 18:this.getHash();case 19:return e.abrupt("return",!0);case 20:case"end":return e.stop()}}),e,this)})));return function(){return e.apply(this,arguments)}}(),t.serialize=function(){return{sig:this.sig,pubKey:this.pubKey}},t.toString=function(){return JSON.stringify(this.serialize())},e.deserialize=function(){var t=Ct(Dt().mark((function t(n){return Dt().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.abrupt("return",e.fromSig(n));case 1:case"end":return t.stop()}}),t)})));return function(e){return t.apply(this,arguments)}}(),e.fromString=function(){var t=Ct(Dt().mark((function t(n){return Dt().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.abrupt("return",e.fromSig(JSON.parse(n)));case 1:case"end":return t.stop()}}),t)})));return function(e){return t.apply(this,arguments)}}(),e.setReaction=function(){var e=Ct(Dt().mark((function e(t,n,r){var i;return Dt().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,n.getHash();case 2:i=e.sent,t.get("reactions").get(i).put(r),t.get("reactions").get(i).put(r),t.get("messagesByHash").get(i).get("reactions").get(this.rootContact.value).put(r),t.get("messagesByHash").get(i).get("reactions").get(this.rootContact.value).put(r);case 7:case"end":return e.stop()}}),e,this)})));return function(t,n,r){return e.apply(this,arguments)}}(),e}();e.default={local:mn,global:on,group:Sn,public:un,private:pn,static:Wr,electron:Rr,peers:rn,session:Fr,util:Vt,notifications:Kn,SEA:jt.SEA,Gun:jt,SignedMessage:Hr,Channel:fn,Node:vn},Object.defineProperty(e,"__esModule",{value:!0})})); +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e=e||self).iris={})}(this,(function(e){"use strict";function t(){t=function(){return e};var e={},n=Object.prototype,r=n.hasOwnProperty,i="function"==typeof Symbol?Symbol:{},a=i.iterator||"@@iterator",o=i.asyncIterator||"@@asyncIterator",s=i.toStringTag||"@@toStringTag";function u(e,t,n){return Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}),e[t]}try{u({},"")}catch(e){u=function(e,t,n){return e[t]=n}}function c(e,t,n,r){var i=Object.create((t&&t.prototype instanceof f?t:f).prototype),a=new _(r||[]);return i._invoke=function(e,t,n){var r="suspendedStart";return function(i,a){if("executing"===r)throw new Error("Generator is already running");if("completed"===r){if("throw"===i)throw a;return{value:void 0,done:!0}}for(n.method=i,n.arg=a;;){var o=n.delegate;if(o){var s=x(o,n);if(s){if(s===h)continue;return s}}if("next"===n.method)n.sent=n._sent=n.arg;else if("throw"===n.method){if("suspendedStart"===r)throw r="completed",n.arg;n.dispatchException(n.arg)}else"return"===n.method&&n.abrupt("return",n.arg);r="executing";var u=l(e,t,n);if("normal"===u.type){if(r=n.done?"completed":"suspendedYield",u.arg===h)continue;return{value:u.arg,done:n.done}}"throw"===u.type&&(r="completed",n.method="throw",n.arg=u.arg)}}}(e,n,a),i}function l(e,t,n){try{return{type:"normal",arg:e.call(t,n)}}catch(e){return{type:"throw",arg:e}}}e.wrap=c;var h={};function f(){}function p(){}function d(){}var g={};u(g,a,(function(){return this}));var y=Object.getPrototypeOf,v=y&&y(y(O([])));v&&v!==n&&r.call(v,a)&&(g=v);var m=d.prototype=f.prototype=Object.create(g);function b(e){["next","throw","return"].forEach((function(t){u(e,t,(function(e){return this._invoke(t,e)}))}))}function w(e,t){var n;this._invoke=function(i,a){function o(){return new t((function(n,o){!function n(i,a,o,s){var u=l(e[i],e,a);if("throw"!==u.type){var c=u.arg,h=c.value;return h&&"object"==typeof h&&r.call(h,"__await")?t.resolve(h.__await).then((function(e){n("next",e,o,s)}),(function(e){n("throw",e,o,s)})):t.resolve(h).then((function(e){c.value=e,o(c)}),(function(e){return n("throw",e,o,s)}))}s(u.arg)}(i,a,n,o)}))}return n=n?n.then(o,o):o()}}function x(e,t){var n=e.iterator[t.method];if(void 0===n){if(t.delegate=null,"throw"===t.method){if(e.iterator.return&&(t.method="return",t.arg=void 0,x(e,t),"throw"===t.method))return h;t.method="throw",t.arg=new TypeError("The iterator does not provide a 'throw' method")}return h}var r=l(n,e.iterator,t.arg);if("throw"===r.type)return t.method="throw",t.arg=r.arg,t.delegate=null,h;var i=r.arg;return i?i.done?(t[e.resultName]=i.value,t.next=e.nextLoc,"return"!==t.method&&(t.method="next",t.arg=void 0),t.delegate=null,h):i:(t.method="throw",t.arg=new TypeError("iterator result is not an object"),t.delegate=null,h)}function k(e){var t={tryLoc:e[0]};1 in e&&(t.catchLoc=e[1]),2 in e&&(t.finallyLoc=e[2],t.afterLoc=e[3]),this.tryEntries.push(t)}function S(e){var t=e.completion||{};t.type="normal",delete t.arg,e.completion=t}function _(e){this.tryEntries=[{tryLoc:"root"}],e.forEach(k,this),this.reset(!0)}function O(e){if(e){var t=e[a];if(t)return t.call(e);if("function"==typeof e.next)return e;if(!isNaN(e.length)){var n=-1,i=function t(){for(;++n=0;--i){var a=this.tryEntries[i],o=a.completion;if("root"===a.tryLoc)return n("end");if(a.tryLoc<=this.prev){var s=r.call(a,"catchLoc"),u=r.call(a,"finallyLoc");if(s&&u){if(this.prev=0;--n){var i=this.tryEntries[n];if(i.tryLoc<=this.prev&&r.call(i,"finallyLoc")&&this.prev=0;--t){var n=this.tryEntries[t];if(n.finallyLoc===e)return this.complete(n.completion,n.afterLoc),S(n),h}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.tryLoc===e){var r=n.completion;if("throw"===r.type){var i=r.arg;S(n)}return i}}throw new Error("illegal catch attempt")},delegateYield:function(e,t,n){return this.delegate={iterator:O(e),resultName:t,nextLoc:n},"next"===this.method&&(this.arg=void 0),h}},e}function n(e,t,n,r,i,a,o){try{var s=e[a](o),u=s.value}catch(e){return void n(e)}s.done?t(u):Promise.resolve(u).then(r,i)}function r(e){return function(){var t=this,r=arguments;return new Promise((function(i,a){var o=e.apply(t,r);function s(e){n(o,i,a,s,u,"next",e)}function u(e){n(o,i,a,s,u,"throw",e)}s(void 0)}))}}function i(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,o(e,t)}function a(e){return(a=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function o(e,t){return(o=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e})(e,t)}function s(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){}))),!0}catch(e){return!1}}function u(e,t,n){return(u=s()?Reflect.construct.bind():function(e,t,n){var r=[null];r.push.apply(r,t);var i=new(Function.bind.apply(e,r));return n&&o(i,n.prototype),i}).apply(null,arguments)}function c(e){var t="function"==typeof Map?new Map:void 0;return(c=function(e){if(null===e||-1===Function.toString.call(e).indexOf("[native code]"))return e;if("function"!=typeof e)throw new TypeError("Super expression must either be null or a function");if(void 0!==t){if(t.has(e))return t.get(e);t.set(e,n)}function n(){return u(e,arguments,a(this).constructor)}return n.prototype=Object.create(e.prototype,{constructor:{value:n,enumerable:!1,writable:!0,configurable:!0}}),o(n,e)})(e)}function l(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function h(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n=e.length?{done:!0}:{done:!1,value:e[r++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var p={throttle:function(e,t){var n;return function(){var r=arguments,i=this;n||(e.apply(i,r),n=!0,setTimeout((function(){return n=!1}),t))}},debounce:function(e,t){var n;return function(){var r=arguments,i=this;clearTimeout(n),n=setTimeout((function(){return e.apply(i,r)}),t)}},sample:function(e){return e[Math.floor(Math.random()*e.length)]},sampleSize:function(e,t){for(var n,r,i=e.slice(0),a=e.length,o=a-t;a-- >o;)n=i[r=Math.floor((a+1)*Math.random())],i[r]=i[a],i[a]=n;return i.slice(o)},defer:function(e){return setTimeout(e,0)},once:function(e){var t=!1;return function(){t||(t=!0,e.apply(this,arguments))}},omit:function(e,t){var n={};return Object.keys(e).forEach((function(r){t.includes(r)||(n[r]=e[r])})),n},defaults:function(e,t){return Object.keys(t).forEach((function(n){void 0===e[n]&&(e[n]=t[n])})),e},pickBy:function(e,t){var n={};return Object.keys(e).forEach((function(r){t(e[r])&&(n[r]=e[r])})),n},isEqual:function(e,t){if(e===t)return!0;if(e instanceof Date&&t instanceof Date)return e.getTime()===t.getTime();if(!e||!t||"object"!=typeof e&&"object"!=typeof t)return e!=e&&t!=t;if(e.prototype!==t.prototype)return!1;var n=Object.keys(e);return n.length===Object.keys(t).length&&n.every((function(n){return p.isEqual(e[n],t[n])}))},uniq:function(e){var t=new Set(e);return Array.from(t)}},d=!1;try{d="[object process]"===Object.prototype.toString.call(global.process)}catch(e){}var g,y=!d&&navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase(),v=y&&y.indexOf(" electron/")>-1,m=["canidae","felidae","cat","cattle","dog","donkey","goat","horse","pig","rabbit","aardvark","aardwolf","albatross","alligator","alpaca","amphibian","anaconda","angelfish","anglerfish","ant","anteater","antelope","antlion","ape","aphid","armadillo","asp","baboon","badger","bandicoot","barnacle","barracuda","basilisk","bass","bat","bear","beaver","bedbug","bee","beetle","bird","bison","blackbird","boa","boar","bobcat","bobolink","bonobo","booby","bovid","bug","butterfly","buzzard","camel","canid","capybara","cardinal","caribou","carp","cat","catshark","caterpillar","catfish","cattle","centipede","cephalopod","chameleon","cheetah","chickadee","chicken","chimpanzee","chinchilla","chipmunk","clam","clownfish","cobra","cockroach","cod","condor","constrictor","coral","cougar","cow","coyote","crab","crane","crawdad","crayfish","cricket","crocodile","crow","cuckoo","cicada","damselfly","deer","dingo","dinosaur","dog","dolphin","donkey","dormouse","dove","dragonfly","dragon","duck","eagle","earthworm","earwig","echidna","eel","egret","elephant","elk","emu","ermine","falcon","ferret","finch","firefly","fish","flamingo","flea","fly","flyingfish","fowl","fox","frog","gamefowl","galliform","gazelle","gecko","gerbil","gibbon","giraffe","goat","goldfish","goose","gopher","gorilla","grasshopper","grouse","guan","guanaco","guineafowl","gull","guppy","haddock","halibut","hamster","hare","harrier","hawk","hedgehog","heron","herring","hippopotamus","hookworm","hornet","horse","hoverfly","hummingbird","hyena","iguana","impala","jackal","jaguar","jay","jellyfish","junglefowl","kangaroo","kingfisher","kite","kiwi","koala","koi","krill","ladybug","lamprey","landfowl","lark","leech","lemming","lemur","leopard","leopon","limpet","lion","lizard","llama","lobster","locust","loon","louse","lungfish","lynx","macaw","mackerel","magpie","mammal","manatee","mandrill","marlin","marmoset","marmot","marsupial","marten","mastodon","meadowlark","meerkat","mink","minnow","mite","mockingbird","mole","mollusk","mongoose","monkey","moose","mosquito","moth","mouse","mule","muskox","narwhal","newt","nightingale","ocelot","octopus","opossum","orangutan","orca","ostrich","otter","owl","ox","panda","panther","parakeet","parrot","parrotfish","partridge","peacock","peafowl","pelican","penguin","perch","pheasant","pig","pigeon","pike","pinniped","piranha","planarian","platypus","pony","porcupine","porpoise","possum","prawn","primate","ptarmigan","puffin","puma","python","quail","quelea","quokka","rabbit","raccoon","rat","rattlesnake","raven","reindeer","reptile","rhinoceros","roadrunner","rodent","rook","rooster","roundworm","sailfish","salamander","salmon","sawfish","scallop","scorpion","seahorse","shark","sheep","shrew","shrimp","silkworm","silverfish","skink","skunk","sloth","slug","smelt","snail","snake","snipe","sole","sparrow","spider","spoonbill","squid","squirrel","starfish","stingray","stoat","stork","sturgeon","swallow","swan","swift","swordfish","swordtail","tahr","takin","tapir","tarantula","tarsier","termite","tern","thrush","tick","tiger","tiglon","toad","tortoise","toucan","trout","tuna","turkey","turtle","tyrannosaurus","urial","vicuna","viper","vole","vulture","wallaby","walrus","wasp","warbler","weasel","whale","whippet","whitefish","wildcat","wildebeest","wildfowl","wolf","wolverine","wombat","woodpecker","worm","wren","xerinae","yak","zebra","alpaca","cat","cattle","chicken","dog","donkey","ferret","gayal","goldfish","guppy","horse","koi","llama","sheep","yak","unicorn"],b=["average","big","colossal","fat","giant","gigantic","great","huge","immense","large","little","long","mammoth","massive","miniature","petite","puny","short","small","tall","tiny","boiling","breezy","broken","bumpy","chilly","cold","cool","creepy","crooked","cuddly","curly","damaged","damp","dirty","dry","dusty","filthy","flaky","fluffy","wet","broad","chubby","crooked","curved","deep","flat","high","hollow","low","narrow","round","shallow","skinny","square","steep","straight","wide","ancient","brief","early","fast","late","long","modern","old","quick","rapid","short","slow","swift","young","abundant","empty","few","heavy","light","many","numerous","Sound","cooing","deafening","faint","harsh","hissing","hushed","husky","loud","melodic","moaning","mute","noisy","purring","quiet","raspy","resonant","screeching","shrill","silent","soft","squealing","thundering","voiceless","whispering","bitter","delicious","fresh","juicy","ripe","rotten","salty","sour","spicy","stale","sticky","strong","sweet","tasteless","tasty","thirsty","fluttering","fuzzy","greasy","grubby","hard","hot","icy","loose","melted","plastic","prickly","rainy","rough","scattered","shaggy","shaky","sharp","shivering","silky","slimy","slippery","smooth","soft","solid","steady","sticky","tender","tight","uneven","weak","wet","wooden","afraid","angry","annoyed","anxious","arrogant","ashamed","awful","bad","bewildered","bored","combative","condemned","confused","creepy","cruel","dangerous","defeated","defiant","depressed","disgusted","disturbed","eerie","embarrassed","envious","evil","fierce","foolish","frantic","frightened","grieving","helpless","homeless","hungry","hurt","ill","jealous","lonely","mysterious","naughty","nervous","obnoxious","outrageous","panicky","repulsive","scary","scornful","selfish","sore","tense","terrible","thoughtless","tired","troubled","upset","uptight","weary","wicked","worried","agreeable","amused","brave","calm","charming","cheerful","comfortable","cooperative","courageous","delightful","determined","eager","elated","enchanting","encouraging","energetic","enthusiastic","excited","exuberant","fair","faithful","fantastic","fine","friendly","funny","gentle","glorious","good","happy","healthy","helpful","hilarious","jolly","joyous","kind","lively","lovely","lucky","obedient","perfect","pleasant","proud","relieved","silly","smiling","splendid","successful","thoughtful","victorious","vivacious","witty","wonderful","zealous","zany","other","good","new","old","great","high","small","different","large","local","social","important","long","young","national","british","right","early","possible","big","little","political","able","late","general","full","far","low","public","available","bad","main","sure","clear","major","economic","only","likely","real","black","particular","international","special","difficult","certain","open","whole","white","free","short","easy","strong","european","central","similar","human","common","necessary","single","personal","hard","private","poor","financial","wide","foreign","simple","recent","concerned","american","various","close","fine","english","wrong","present","royal","natural","individual","nice","french","nihilist","solipsist","materialist","surrealist","heroic","awesome","hedonist","absurd","current","modern","labour","legal","happy","final","red","normal","serious","previous","total","prime","significant","industrial","sorry","dead","specific","appropriate","top","soviet","basic","military","original","successful","aware","hon","popular","heavy","professional","direct","dark","cold","ready","green","useful","effective","western","traditional","scottish","german","independent","deep","interesting","considerable","involved","physical","hot","existing","responsible","complete","medical","blue","extra","past","male","interested","fair","essential","beautiful","civil","primary","obvious","future","environmental","positive","senior","nuclear","annual","relevant","huge","rich","commercial","safe","regional","practical","official","separate","key","chief","regular","due","additional","active","powerful","complex","standard","impossible","light","warm","middle","fresh","sexual","front","domestic","actual","united","technical","ordinary","cheap","strange","internal","excellent","quiet","soft","potential","northern","religious","quick","very","famous","cultural","proper","broad","joint","formal","limited","conservative","lovely","usual","ltd","unable","rural","initial","substantial","bright","average","leading","reasonable","immediate","suitable","equal","detailed","working","overall","female","afraid","democratic","growing","sufficient","scientific","eastern","correct","inc","irish","expensive","educational","mental","dangerous","critical","increased","familiar","unlikely","double","perfect","slow","tiny","dry","historical","thin","daily","southern","increasing","wild","alone","urban","empty","married","narrow","liberal","supposed","upper","apparent","tall","busy","bloody","prepared","russian","moral","careful","clean","attractive","japanese","vital","thick","alternative","fast","ancient","elderly","rare","external","capable","brief","wonderful","grand","typical","entire","grey","constant","vast","surprised","ideal","terrible","academic","funny","minor","pleased","severe","ill","corporate","negative","permanent","weak","brown","fundamental","odd","crucial","inner","used","criminal","contemporary","sharp","sick","near","roman","massive","unique","secondary","parliamentary","african","unknown","subsequent","angry","alive","guilty","lucky","enormous","well","yellow","unusual","net","tough","dear","extensive","glad","remaining","agricultural","alright","healthy","italian","principal","tired","efficient","comfortable","chinese","relative","friendly","conventional","willing","sudden","proposed","voluntary","slight","valuable","dramatic","golden","temporary","federal","keen","flat","silent","indian","worried","pale","statutory","welsh","dependent","firm","wet","competitive","armed","radical","outside","acceptable","sensitive","living","pure","global","emotional","sad","secret","rapid","adequate","fixed","sweet","administrative","wooden","remarkable","comprehensive","surprising","solid","rough","mere","mass","brilliant","maximum","absolute","electronic","visual","electric","cool","spanish","literary","continuing","supreme","chemical","genuine","exciting","written","advanced","extreme","classical","fit","favourite","widespread","confident","straight","proud","numerous","opposite","distinct","mad","helpful","given","disabled","consistent","anxious","nervous","awful","stable","constitutional","satisfied","conscious","developing","strategic","holy","smooth","dominant","remote","theoretical","outstanding","pink","pretty","clinical","minimum","honest","impressive","related","residential","extraordinary","plain","visible","accurate","distant","still","greek","complicated","musical","precise","gentle","broken","live","silly","fat","tight","monetary","round","psychological","violent","unemployed","inevitable","junior","sensible","grateful","pleasant","dirty","structural","welcome","deaf","above","continuous","blind","overseas","mean","entitled","delighted","loose","occasional","evident","desperate","fellow","universal","square","steady","classic","equivalent","intellectual","victorian","level","ultimate","creative","lost","medieval","clever","linguistic","convinced","judicial","raw","sophisticated","asleep","vulnerable","illegal","outer","revolutionary","bitter","changing","australian","native","imperial","strict","wise","informal","flexible","collective","frequent","experimental","spiritual","intense","rational","generous","inadequate","prominent","logical","bare","historic","modest","dutch","acute","electrical","valid","weekly","gross","automatic","loud","reliable","mutual","liable","multiple","ruling","curious","sole","managing","pregnant","latin","nearby","exact","underlying","identical","satisfactory","marginal","distinctive","electoral","urgent","presidential","controversial","everyday","encouraging","organic","continued","expected","statistical","desirable","innocent","improved","exclusive","marked","experienced","unexpected","superb","sheer","disappointed","frightened","gastric","romantic","naked","reluctant","magnificent","convenient","established","closed","uncertain","artificial","diplomatic","tremendous","marine","mechanical","retail","institutional","mixed","required","biological","known","functional","straightforward","superior","digital","spectacular","unhappy","confused","unfair","aggressive","spare","painful","abstract","asian","associated","legislative","monthly","intelligent","hungry","explicit","nasty","just","faint","coloured","ridiculous","amazing","comparable","successive","realistic","back","decent","decentralized","bitcoin","cypherpunk","unnecessary","flying","random","influential","dull","genetic","neat","marvellous","crazy","damp","giant","secure","bottom","skilled","subtle","elegant","brave","lesser","parallel","steep","intensive","casual","tropical","lonely","partial","preliminary","concrete","alleged","assistant","vertical","upset","delicate","mild","occupational","excessive","progressive","exceptional","integrated","striking","continental","okay","harsh","combined","fierce","handsome","characteristic","chronic","compulsory","interim","objective","splendid","magic","systematic","obliged","payable","fun","horrible","primitive","fascinating","ideological","metropolitan","surrounding","estimated","peaceful","premier","operational","technological","kind","advisory","hostile","precious","accessible","determined","excited","impressed","provincial","smart","endless","isolated","drunk","geographical","like","dynamic","boring","forthcoming","unfortunate","definite","super","notable","indirect","stiff","wealthy","awkward","lively","neutral","artistic","content","mature","colonial","ambitious","evil","magnetic","verbal","legitimate","sympathetic","empirical","head","shallow","vague","naval","depressed","shared","added","shocked","mid","worthwhile","qualified","missing","blank","absent","favourable","polish","israeli","developed","profound","representative","enthusiastic","dreadful","rigid","reduced","cruel","coastal","peculiar","swiss","crude","extended","selected","eager","canadian","bold","relaxed","corresponding","running","planned","applicable","immense","allied","comparative","uncomfortable","conservation","productive","beneficial","bored","charming","minimal","mobile","turkish","orange","rear","passive","suspicious","overwhelming","fatal","resulting","symbolic","registered","neighbouring","calm","irrelevant","patient","compact","profitable","rival","loyal","moderate","distinguished","interior","noble","insufficient","eligible","mysterious","varying","managerial","molecular","olympic","linear","prospective","printed","parental","diverse","elaborate","furious","fiscal","burning","useless","semantic","embarrassed","inherent","philosophical","deliberate","awake","variable","promising","unpleasant","varied","sacred","selective","inclined","tender","hidden","worthy","intermediate","sound","protective","fortunate","slim","defensive","divine","stuck","driving","invisible","misleading","circular","mathematical","inappropriate","liquid","persistent","solar","doubtful","manual","architectural","intact","incredible","devoted","prior","tragic","respectable","optimistic","convincing","unacceptable","decisive","competent","spatial","respective","binding","relieved","nursing","toxic","select","redundant","integral","then","probable","amateur","fond","passing","specified","territorial","horizontal","inland","cognitive","regulatory","miserable","resident","polite","scared","gothic","civilian","instant","lengthy","adverse","korean","unconscious","anonymous","aesthetic","orthodox","static","unaware","costly","fantastic","foolish","fashionable","causal","compatible","wee","implicit","dual","ok","cheerful","subjective","forward","surviving","exotic","purple","cautious","visiting","aggregate","ethical","teenage","dying","disastrous","delicious","confidential","underground","thorough","grim","autonomous","atomic","frozen","colourful","injured","uniform","ashamed","glorious","wicked","coherent","rising","shy","novel","balanced","delightful","arbitrary","adjacent","worrying","weird","unchanged","rolling","evolutionary","intimate","sporting","disciplinary","formidable","lexical","noisy","gradual","accused","homeless","supporting","coming","renewed","excess","retired","rubber","chosen","outdoor","embarrassing","preferred","bizarre","appalling","agreed","imaginative","governing","accepted","vocational","mighty","puzzled","worldwide","organisational","sunny","eldest","eventual","spontaneous","vivid","rude","faithful","ministerial","innovative","controlled","conceptual","unwilling","civic","meaningful","alive","brainy","breakable","busy","careful","cautious","clever","concerned","crazy","curious","dead","different","difficult","doubtful","easy","famous","fragile","helpful","helpless","important","impossible","innocent","inquisitive","modern","open","outstanding","poor","powerful","puzzled","real","rich","shy","sleepy","super","tame","uninterested","wandering","wild","wrong","adorable","alert","average","beautiful","blonde","bloody","blushing","bright","clean","clear","cloudy","colorful","crowded","cute","dark","drab","distinct","dull","elegant","fancy","filthy","glamorous","gleaming","graceful","grotesque","homely","light","misty","motionless","muddy","plain","poised","quaint","shiny","smoggy","sparkling","spotless","stormy","strange","ugly","unsightly","unusual","bad","better","beautiful","big","black","blue","bright","clumsy","crazy","dizzy","dull","fat","frail","friendly","funny","great","green","gigantic","gorgeous","grumpy","handsome","happy","horrible","itchy","jittery","jolly","kind","long","lazy","magnificent","magenta","many","mighty","mushy","nasty","new","nice","nosy","nutty","nutritious","odd","orange","ordinary","pretty","precious","prickly","purple","quaint","quiet","quick","quickest","rainy","rare","ratty","red","roasted","robust","round","sad","scary","scrawny","short","silly","stingy","strange","striped","spotty","tart","tall","tame","tan","tender","testy","tricky","tough","ugly","ugliest","vast","watery","wasteful","wonderful","yellow","yummy","zany"],w={gunOnceDefined:function(e){return new Promise((function(t){e.on((function(e,n,r,i){void 0!==e&&(i.off(),t(e))}))}))},getHash:function(e,n){var i=this;return r(t().mark((function r(){var a,o,s;return t().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(void 0===n&&(n="base64"),void 0!==e){t.next=3;break}throw new Error("getHash data was undefined");case 3:return"string"!=typeof e&&(e=JSON.stringify(e)),a=new TextEncoder,e=a.encode(e),t.next=8,crypto.subtle.digest("SHA-256",e);case 8:if(o=t.sent,"buffer"!==n){t.next=11;break}return t.abrupt("return",o);case 11:if(s=i.arrayBufferToBase64(o),"hex"!==n){t.next=14;break}return t.abrupt("return",i.base64ToHex(s));case 14:return t.abrupt("return",s);case 15:case"end":return t.stop()}}),r)})))()},capitalize:function(e){return e.charAt(0).toUpperCase()+e.slice(1)},generateName:function(){return this.capitalize(p.sample(b))+" "+this.capitalize(p.sample(m))},base64ToHex:function(e){for(var t=atob(e),n="",r=0;rt?e.slice(0,t)+"...":e},createElement:function(e,t,n){var r=document.createElement(e);return t&&r.setAttribute("class",t),n&&n.appendChild(r),r},isNode:d,isElectron:v,isMobile:!d&&function(){if(v)return!1;var e,t=!1;return e=navigator.userAgent||navigator.vendor||"",(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(e)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(e.substr(0,4)))&&(t=!0),t}(),throttle:function(e,t){var n;return function(){var r=arguments,i=this;n||(e.apply(i,r),n=!0,setTimeout((function(){return n=!1}),t))}},debounce:function(e,t){var n;return function(){var r=this,i=arguments;clearTimeout(n),n=setTimeout((function(){return e.apply(r,i)}),t)}},sample:function(e){return e[Math.floor(Math.random()*e.length)]},sampleSize:function(e,t){for(var n,r,i=e.slice(0),a=e.length,o=a-t;a-- >o;)n=i[r=Math.floor((a+1)*Math.random())],i[r]=i[a],i[a]=n;return i.slice(o)},defer:function(e){return setTimeout(e,0)},once:function(e){var t=!1;return function(){t||(t=!0,e.apply(this,arguments))}},omit:function(e,t){var n={};return Object.keys(e).forEach((function(r){t.includes(r)||(n[r]=e[r])})),n}},x={getActiveKey:function(e,n,i){var a=this;return r(t().mark((function r(){var o,s,u,c,l;return t().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(void 0===e&&(e="."),void 0===n&&(n="iris.key"),!g){t.next=4;break}return t.abrupt("return",g);case 4:if(!i){t.next=21;break}if(!i.existsSync(o=e+"/"+n)){t.next=11;break}s=i.readFileSync(o,"utf8"),g=a.fromString(s),t.next=17;break;case 11:return t.next=13,a.generate();case 13:u=t.sent,i.writeFileSync(o,a.toString(g=g||u)),i.chmodSync(o,400);case 17:if(g){t.next=19;break}throw new Error("loading default key failed - check "+e+"/"+n);case 19:t.next=33;break;case 21:if(!(c=window.localStorage.getItem("iris.myKey"))){t.next=26;break}g=a.fromString(c),t.next=31;break;case 26:return t.next=28,a.generate();case 28:l=t.sent,g=g||l,window.localStorage.setItem("iris.myKey",a.toString(g));case 31:if(g){t.next=33;break}throw new Error("loading default key failed - check localStorage iris.myKey");case 33:return t.abrupt("return",g);case 34:case"end":return t.stop()}}),r)})))()},getDefault:function(e,t){return void 0===e&&(e="."),void 0===t&&(t="iris.key"),this.getActiveKey(e,t)},getActivePub:function(e,n){var i=this;return r(t().mark((function r(){return t().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return void 0===e&&(e="."),void 0===n&&(n="iris.key"),t.next=4,i.getActiveKey(e,n);case 4:return t.abrupt("return",t.sent.pub);case 6:case"end":return t.stop()}}),r)})))()},setActiveKey:function(e,t,n,r,i){if(void 0===t&&(t=!0),void 0===n&&(n="."),void 0===r&&(r="iris.key"),g=e,t)if(w.isNode){var a=n+"/"+r;i.writeFileSync(a,this.toString(g)),i.chmodSync(a,400)}else window.localStorage.setItem("iris.myKey",this.toString(g))},toString:function(e){return JSON.stringify(e)},getId:function(e){if(!e||!e.pub)throw new Error("missing param");return e.pub},fromString:function(e){return JSON.parse(e)},generate:function(){return r(t().mark((function e(){var n,i,a;return t().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,n=window.crypto.subtle,e.next=4,n.generateKey({name:"ECDSA",namedCurve:"P-256"},!0,["sign","verify"]).then(function(){var e=r(t().mark((function e(r){var i,a;return t().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return i={},e.next=3,n.exportKey("jwk",r.privateKey);case 3:return i.priv=e.sent.d,e.next=6,n.exportKey("jwk",r.publicKey);case 6:return i.pub=(a=e.sent).x+"."+a.y,e.abrupt("return",i);case 9:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}());case 4:return i=e.sent,e.prev=5,e.next=8,n.generateKey({name:"ECDH",namedCurve:"P-256"},!0,["deriveKey"]).then(function(){var e=r(t().mark((function e(r){var i,a;return t().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return i={},e.next=3,n.exportKey("jwk",r.privateKey);case 3:return i.epriv=e.sent.d,e.next=6,n.exportKey("jwk",r.publicKey);case 6:return i.epub=(a=e.sent).x+"."+a.y,e.abrupt("return",i);case 9:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}());case 8:a=e.sent,e.next=18;break;case 11:if(e.prev=11,e.t0=e.catch(5),"Error: ECDH is not a supported algorithm"!=e.t0){e.next=17;break}console.log("Ignoring ECDH..."),e.next=18;break;case 17:throw e.t0;case 18:return e.abrupt("return",{pub:i.pub,priv:i.priv,epub:(a=a||{}).epub,epriv:a.epriv});case 23:throw e.prev=23,e.t1=e.catch(0),console.log(e.t1),e.t1;case 28:case"end":return e.stop()}}),e,null,[[0,23],[5,11]])})))()},keyToJwk:function(e){"string"==typeof e&&(e={pub:e});var t={kty:"EC",crv:"P-256",x:e.pub.split(".")[0],y:e.pub.split(".")[1],ext:!0};return t.key_ops=e.priv?["sign"]:["verify"],e.priv&&(t.d=e.priv),t},sign:function(e,n,i,a){var o=this;return r(t().mark((function r(){var s,u,c,l;return t().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(void 0===a&&(a={}),void 0!==e){t.next=3;break}throw"`undefined` not allowed.";case 3:return s="string"==typeof e?e:JSON.stringify(e),u=o.keyToJwk(n),t.next=7,w.getHash(s,"buffer");case 7:return c=t.sent,t.next=10,window.crypto.subtle.importKey("jwk",u,{name:"ECDSA",namedCurve:"P-256"},!1,["sign"]).then((function(e){return window.crypto.subtle.sign({name:"ECDSA",hash:{name:"SHA-256"}},e,c)}));case 10:if(l={m:s,s:Buffer.from(t.sent).toString(a.encode||"base64")},a.raw||(l="aSEA"+JSON.stringify(l)),i)try{i(l)}catch(e){console.log(e)}return t.abrupt("return",l);case 15:case"end":return t.stop()}}),r)})))()},verify:function(e,n,i,a){var o=this;return r(t().mark((function r(){var s,u,c,l,h,f,p;return t().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(void 0===a&&(a={}),t.prev=1,"string"==typeof e){"aSEA"===e.slice(0,4)&&(e=e.slice(4));try{e=JSON.parse(e)}catch(e){}}return s=o.keyToJwk(n.pub||n),t.next=7,crypto.subtle.importKey("jwk",s,{name:"ECDSA",namedCurve:"P-256"},!1,["verify"]);case 7:u=t.sent,c=e.m;try{c=JSON.parse(c)}catch(e){}return t.next=12,w.getHash(c,"buffer");case 12:return l=t.sent,h=Buffer.from(e.s,a.encode||"base64"),f=new Uint8Array(h),t.next=17,crypto.subtle.verify({name:"ECDSA",hash:{name:"SHA-256"}},u,f,l);case 17:if(p=t.sent?JSON.parse(c):void 0,i)try{i(p)}catch(e){console.log(e)}return t.abrupt("return",p);case 24:return t.prev=24,t.t0=t.catch(1),console.log(t.t0),t.abrupt("return",void 0);case 28:case"end":return t.stop()}}),r,null,[[1,24]])})))()},secret:function(e,n){return r(t().mark((function i(){var a,o,s,u,c,l;return t().wrap((function(i){for(;;)switch(i.prev=i.next){case 0:return o=n.epub,s=n.epriv,u=(a=function(e,t){var n=e.split(".");return Object.assign(t?{d:t}:{},{x:n[0],y:n[1],kty:"EC",crv:"P-256",ext:!0})})(e.epub||e),i.t0=Object,i.next=8,crypto.subtle.importKey("jwk",u,{name:"ECDH",namedCurve:"P-256"},!0,[]);case 8:return i.t1=i.sent,i.t2={public:i.t1},i.t3={name:"ECDH",namedCurve:"P-256"},c=i.t0.assign.call(i.t0,i.t2,i.t3),l=a(o,s),i.abrupt("return",crypto.subtle.importKey("jwk",l,{name:"ECDH",namedCurve:"P-256"},!1,["deriveBits"]).then(function(){var e=r(t().mark((function e(n){var r;return t().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,crypto.subtle.deriveBits(c,n,256);case 2:return r=new Uint8Array(e.sent),e.next=6,crypto.subtle.importKey("raw",r,{name:"AES-GCM",length:256},!0,["encrypt","decrypt"]);case 6:return e.abrupt("return",crypto.subtle.exportKey("jwk",e.sent).then((function(e){return e.k})));case 8:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}()));case 14:case"end":return i.stop()}}),i)})))()},aeskey:function(e,n){var i=this;return r(t().mark((function r(){var a,o,s,u,c;return t().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return a=e+(n||i.random(8)).toString("utf8"),t.next=3,crypto.subtle.digest({name:"SHA-256"},(new TextEncoder).encode(a));case 3:return o=t.sent,o=Buffer.from(o,"binary"),s=o.toString("base64"),u=s.replace(/\+/g,"-").replace(/\//g,"_").replace(/\=/g,""),c={kty:"oct",k:u,ext:!1,alg:"A256GCM"},t.next=10,crypto.subtle.importKey("jwk",c,{name:"AES-GCM"},!1,["encrypt","decrypt"]);case 10:return t.abrupt("return",t.sent);case 11:case"end":return t.stop()}}),r)})))()},random:function(e){return Buffer.from(crypto.getRandomValues(new Uint8Array(e)))},encrypt:function(e,n,i,a){var o=this;return r(t().mark((function r(){var s,u,c,l;return t().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(void 0===a&&(a={}),s=n.epriv||n,void 0!==e){t.next=4;break}throw"`undefined` not allowed.";case 4:return u="string"==typeof e?e:JSON.stringify(e),c={s:o.random(9),iv:o.random(15)},t.next=8,o.aeskey(s,c.s).then((function(e){return crypto.subtle.encrypt({name:a.name||"AES-GCM",iv:new Uint8Array(c.iv)},e,(new TextEncoder).encode(u))}));case 8:if(l={ct:Buffer.from(t.sent,"binary").toString(a.encode||"base64"),iv:c.iv.toString(a.encode||"base64"),s:c.s.toString(a.encode||"base64")},a.raw||(l="SEA"+JSON.stringify(l)),i)try{i(l)}catch(e){console.log(e)}return t.abrupt("return",l);case 13:case"end":return t.stop()}}),r)})))()},decrypt:function(e,n,i,a){var o=this;return r(t().mark((function r(){var s,u,c,l,h,f,p,d;return t().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:void 0===a&&(a={}),s=n.epriv||n;try{e=JSON.parse(e)}catch(e){}if((u=0===e.indexOf("SEA{")?JSON.parse(e.slice(3)):JSON.parse(e)).ct&&u.iv&&u.s){t.next=6;break}throw"Invalid ciphertext "+u;case 6:return c=Buffer.from(u.s,a.encode||"base64"),l=Buffer.from(u.iv,a.encode||"base64"),h=Buffer.from(u.ct,a.encode||"base64"),t.next=11,o.aeskey(s,c).then((function(e){return crypto.subtle.decrypt({name:a.name||"AES-GCM",iv:new Uint8Array(l),tagLength:128},e,new Uint8Array(h))}));case 11:f=t.sent,p=new TextDecoder("utf8").decode(f),d=p;try{d=JSON.parse(p)}catch(e){}if(i)try{i(d)}catch(e){console.log(e)}return t.abrupt("return",d);case 17:case"end":return t.stop()}}),r)})))()}},k="http://localhost:8767/gun",S={"wss://gun-rs.iris.to/gun":{}};if(self.window){var _=window.location,O=_.host,E=O.startsWith("localhost")&&"localhost:8080"!==O;(_.hostname.endsWith("herokuapp.com")||E)&&(Object.keys(S).forEach((function(e){return S[e].enabled=!1})),S[_.origin+"/gun"]={enabled:!0})}var M={known:{},add:function(e){var n=this;return r(t().mark((function r(){var i,a,o,s;return t().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(e.from&&Object.keys(n.known).forEach((function(t){n.known[t].from===e.from&&delete n.known[t]})),n.known[i=e.url||""]=n.known[i]||p.omit(e,["url"]),"public"!==e.visibility){t.next=17;break}return t.next=6,x.secret(va.getKey().epub,va.getKey());case 6:if(t.t0=t.sent,t.t0){t.next=9;break}t.t0="";case 9:return a=t.t0,t.next=12,x.encrypt(e.url,a);case 12:return o=t.sent,t.next=15,w.getHash(o);case 15:s=t.sent,Fr().user().get("peers").get(s).put({url:e.url,lastSeen:(new Date).toISOString()});case 17:!1!==e.enabled?e.url&&n.connect(e.url):n.save();case 18:case"end":return t.stop()}}),r)})))()},remove:function(e){delete this.known[e],this.save()},disconnect:function(e){Fr().on("bye",e),e.url=""},save:function(){localStorage.setItem("gunPeers",JSON.stringify(this.known))},getSaved:function(){var e=localStorage.getItem("gunPeers");return e=e&&"undefined"!==e?JSON.parse(e):S,w.isElectron&&(e[k]={}),Object.keys(e).forEach((function(t){return p.defaults(e[t],{enabled:!0})})),e},reset:function(){localStorage.setItem("gunPeers",""),this.known=this.getSaved()},connect:function(e){e&&(this.isMixedContent(e)||(this.known[e]?(this.known[e].enabled=!0,Fr().opt({peers:[e]}),this.save()):this.add({url:e})))},disable:function(e,t){this.known[e].enabled=!1,t&&this.disconnect(t),this.save()},isMixedContent:function(e){return!!e&&"https:"===window.location.protocol&&0===e.indexOf("http:")},random:function(){var e=this,t=w.isElectron&&this.known[k]&&!1!==this.known[k].enabled,n=t?Math.max(0,1):1,r=p.sampleSize(Object.keys(p.pickBy(this.known,(function(t,n){return!e.isMixedContent(n)&&t.enabled&&!(w.isElectron&&n===k)}))),n);return r&&t&&r.push(k),console.log("sample",r,JSON.stringify(this.known)),r},checkGunPeerCount:function(){},init:function(){var e=this;this.known=this.getSaved(),setInterval((function(){return e.checkGunPeerCount()}),1e3)}},C=function(){function e(e){void 0===e&&(e="xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,(function(e){var t=16*Math.random()|0;return("x"==e?t:3&t|8).toString(16)}))),this.id=e}var t=e.prototype;return t.handle=function(e){throw new Error("not implemented")},t.postMessage=function(e){this.handle(e)},e}(),I=function(){function e(){}return e.fromObject=function(e){if("get"===e.type)return P.fromObject(e);if("put"===e.type)return j.fromObject(e);throw new Error("not implemented")},e.deserialize=function(){var e=r(t().mark((function e(n,r){var i;return t().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!(i=JSON.parse(n)).get){e.next=5;break}return e.abrupt("return",P.deserialize(i,n,r));case 5:if(!i.put){e.next=9;break}return e.abrupt("return",j.deserialize(i,n,r));case 9:if(!i.dam||"hi"!==i.dam){e.next=13;break}return e.abrupt("return",T.deserialize(i));case 13:throw new Error("unknown message type");case 14:case"end":return e.stop()}}),e)})));return function(t,n){return e.apply(this,arguments)}}(),e.prototype.serialize=function(){throw new Error("not implemented")},e}();function A(){return Math.random().toString(36).slice(2,10)}var P=function(){function e(e,t,n,r,i,a,o){this.type="get",this.id=e,this.from=n,this.nodeId=t,this.recipients=r,this.childKey=i,this.jsonStr=a,this.checksum=o}return e.prototype.serialize=function(){if(this.jsonStr)return this.jsonStr;var e=this.nodeId.replace(/^global\//,"").replace(/^user\//,"~"),t={"#":this.id,get:{"#":e,".":this.childKey}};return this.childKey&&(t.get["."]=this.childKey),this.jsonStr=JSON.stringify(t),this.jsonStr},e.deserialize=function(){var n=r(t().mark((function n(r,i,a){var o,s;return t().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return o=r["#"],(s=r.get["#"]).startsWith("~")&&(s="user/"+s.slice(1)),t.abrupt("return",new e(o,s="global/"+s,a,void 0,r.get["."],i));case 6:case"end":return t.stop()}}),n)})));return function(e,t,r){return n.apply(this,arguments)}}(),e.fromObject=function(t){return new e(t.id,t.nodeId,t.from,t.recipients,t.childKey,t.jsonStr,t.checksum)},e.new=function(t,n,r,i,a,o){return new e(A(),t,n,r,i,a,o)},e}(),j=function(){function e(e,t,n,r,i,a,o){this.type="put",this.id=e,this.from=n,this.updatedNodes=t,this.inResponseTo=r,this.recipients=i,this.jsonStr=a,this.checksum=o}return e.prototype.serialize=function(){for(var e={"#":this.id,put:{}},t=0,n=Object.entries(this.updatedNodes);t"]=o._[">"]||{},o._[">"][l]=f.updatedAt}}return JSON.stringify(e)},e.deserialize=function(){var n=r(t().mark((function n(r,i,a){var o,s,u,c,l,h,f,p,d,g,y,v,m,b,w,k,S,_,O;return t().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:o=r["#"],s={},u=0,c=Object.entries(r.put);case 3:if(!(u":f._[">"][m]}),t.next=23,x.verify({s:S,m:_},w);case 23:if(t.t0=t.sent,t.t1=void 0,t.t0!==t.t1){t.next=27;break}throw new Error("invalid signature in "+h+" of "+_);case 27:p[m]={value:b,updatedAt:f._[">"][m]};case 29:g++,t.next=9;break;case 32:O="global/"+h.replace(/^~/,"user/"),s[O]=p;case 34:u++,t.next=3;break;case 37:return t.abrupt("return",new e(o,s,a,void 0,void 0,i));case 38:case"end":return t.stop()}}),n)})));return function(e,t,r){return n.apply(this,arguments)}}(),e.fromObject=function(t){return new e(t.id,t.updatedNodes,t.from,t.inResponseTo,t.recipients,t.jsonStr,t.checksum)},e.new=function(t,n,r,i,a,o){return new e(A(),t,n,r,i,a,o)},e.newFromKv=function(t,n,r){var i={};return i[t]=n,e.new(i,r)},e}(),T=function(){function e(e,t){this.type="hi",this.peerId=e,this.jsonStr=t}return e.prototype.serialize=function(){return this.jsonStr||(this.jsonStr=JSON.stringify({dam:"hi","#":this.peerId})),this.jsonStr},e.deserialize=function(t){return new e(t["#"])},e}();class K extends Map{constructor(e={}){if(super(),!(e.maxSize&&e.maxSize>0))throw new TypeError("`maxSize` must be a number greater than 0");if("number"==typeof e.maxAge&&0===e.maxAge)throw new TypeError("`maxAge` must be a number greater than 0");this.maxSize=e.maxSize,this.maxAge=e.maxAge||Number.POSITIVE_INFINITY,this.onEviction=e.onEviction,this.cache=new Map,this.oldCache=new Map,this._size=0}_emitEvictions(e){if("function"==typeof this.onEviction)for(const[t,n]of e)this.onEviction(t,n.value)}_deleteIfExpired(e,t){return"number"==typeof t.expiry&&t.expiry<=Date.now()&&("function"==typeof this.onEviction&&this.onEviction(e,t.value),this.delete(e))}_getOrDeleteIfExpired(e,t){if(!1===this._deleteIfExpired(e,t))return t.value}_getItemValue(e,t){return t.expiry?this._getOrDeleteIfExpired(e,t):t.value}_peek(e,t){const n=t.get(e);return this._getItemValue(e,n)}_set(e,t){this.cache.set(e,t),this._size++,this._size>=this.maxSize&&(this._size=0,this._emitEvictions(this.oldCache),this.oldCache=this.cache,this.cache=new Map)}_moveToRecent(e,t){this.oldCache.delete(e),this._set(e,t)}*_entriesAscending(){for(const e of this.oldCache){const[t,n]=e;this.cache.has(t)||!1===this._deleteIfExpired(t,n)&&(yield e)}for(const e of this.cache){const[t,n]=e;!1===this._deleteIfExpired(t,n)&&(yield e)}}get(e){if(this.cache.has(e)){const t=this.cache.get(e);return this._getItemValue(e,t)}if(this.oldCache.has(e)){const t=this.oldCache.get(e);if(!1===this._deleteIfExpired(e,t))return this._moveToRecent(e,t),t.value}}set(e,t,{maxAge:n=this.maxAge}={}){const r="number"==typeof n&&n!==Number.POSITIVE_INFINITY?Date.now()+n:void 0;this.cache.has(e)?this.cache.set(e,{value:t,expiry:r}):this._set(e,{value:t,expiry:r})}has(e){return this.cache.has(e)?!this._deleteIfExpired(e,this.cache.get(e)):!!this.oldCache.has(e)&&!this._deleteIfExpired(e,this.oldCache.get(e))}peek(e){return this.cache.has(e)?this._peek(e,this.cache):this.oldCache.has(e)?this._peek(e,this.oldCache):void 0}delete(e){const t=this.cache.delete(e);return t&&this._size--,this.oldCache.delete(e)||t}clear(){this.cache.clear(),this.oldCache.clear(),this._size=0}resize(e){if(!(e&&e>0))throw new TypeError("`maxSize` must be a number greater than 0");const t=[...this._entriesAscending()],n=t.length-e;n<0?(this.cache=new Map(t),this.oldCache=new Map,this._size=t.length):(n>0&&this._emitEvictions(t.slice(0,n)),this.oldCache=new Map(t.slice(n)),this.cache=new Map,this._size=0),this.maxSize=e}*keys(){for(const[e]of this)yield e}*values(){for(const[,e]of this)yield e}*[Symbol.iterator](){for(const e of this.cache){const[t,n]=e;!1===this._deleteIfExpired(t,n)&&(yield[t,n.value])}for(const e of this.oldCache){const[t,n]=e;this.cache.has(t)||!1===this._deleteIfExpired(t,n)&&(yield[t,n.value])}}*entriesDescending(){let e=[...this.cache];for(let t=e.length-1;t>=0;--t){const n=e[t],[r,i]=n;!1===this._deleteIfExpired(r,i)&&(yield[r,i.value])}e=[...this.oldCache];for(let t=e.length-1;t>=0;--t){const n=e[t],[r,i]=n;this.cache.has(r)||!1===this._deleteIfExpired(r,i)&&(yield[r,i.value])}}*entriesAscending(){for(const[e,t]of this._entriesAscending())yield[e,t.value]}get size(){if(!this._size)return this.oldCache.size;let e=0;for(const t of this.oldCache.keys())this.cache.has(t)||e++;return Math.min(this._size+e,this.maxSize)}entries(){return this.entriesAscending()}forEach(e,t=this){for(const[n,r]of this.entriesAscending())e.call(t,r,n,this)}get[Symbol.toStringTag](){return JSON.stringify([...this.entriesAscending()])}}var D=function(e){function n(t){var n;return void 0===t&&(t={}),(n=e.call(this)||this).config={},n.store=new K({maxSize:1e4}),n.config=t,n}i(n,e);var a=n.prototype;return a.handle=function(e){e instanceof j?this.handlePut(e):e instanceof P?this.handleGet(e):console.log("Memory got unknown message",e)},a.handleGet=function(e){if(e.from){var t=this.store.get(e.nodeId);if(t){var n=j.newFromKv(e.nodeId,t,this);n.inResponseTo=e.id,e.from&&e.from.postMessage(n)}}else console.log("no from in get message")},a.mergeAndSave=function(e,t){var n=this.store.get(e);if(void 0===n)this.store.set(e,t);else{for(var r=0,i=Object.entries(t);r=s.updatedAt||(n[o]=s)}this.store.set(e,n)}},a.handlePut=function(){var e=r(t().mark((function e(n){var r,i,a,o,s;return t().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:r=0,i=Object.entries(n.updatedNodes);case 1:if(!(r=0)n=t;else{var a=z(t);for(var o in n=a===Object.prototype?{}:Object.create(a),le&&le.set(t,n),t)G(t,o)&&(n[o]=e(t[o]))}return n}(e);return le=null,t}var fe={}.toString;function pe(e){return fe.call(e).slice(8,-1)}var de="undefined"!=typeof Symbol?Symbol.iterator:"@@iterator",ge="symbol"==typeof de?function(e){var t;return null!=e&&(t=e[de])&&t.apply(e)}:function(){return null},ye={};function ve(e){var t,n,r,i;if(1===arguments.length){if(B(e))return e.slice();if(this===ye&&"string"==typeof e)return[e];if(i=ge(e)){for(n=[];!(r=i.next()).done;)n.push(r.value);return n}if(null==e)return[e];if("number"==typeof(t=e.length)){for(n=new Array(t);t--;)n[t]=e[t];return n}return[e]}for(t=arguments.length,n=new Array(t);t--;)n[t]=arguments[t];return n}var me="undefined"!=typeof Symbol?function(e){return"AsyncFunction"===e[Symbol.toStringTag]}:function(){return!1},be="undefined"!=typeof location&&/^(http|https):\/\/(localhost|127\.0\.0\.1)/.test(location.href);function we(e,t){be=e,xe=t}var xe=function(){return!0},ke=!new Error("").stack;function Se(){if(ke)try{throw new Error}catch(e){return e}return new Error}function _e(e,t){var n=e.stack;return n?(t=t||0,0===n.indexOf(e.name)&&(t+=(e.name+e.message).split("\n").length),n.split("\n").slice(t).filter(xe).map((function(e){return"\n"+e})).join("")):""}var Oe=["Unknown","Constraint","Data","TransactionInactive","ReadOnly","Version","NotFound","InvalidState","InvalidAccess","Abort","Timeout","QuotaExceeded","Syntax","DataClone"],Ee=["Modify","Bulk","OpenFailed","VersionChange","Schema","Upgrade","InvalidTable","MissingAPI","NoSuchDatabase","InvalidArgument","SubTransaction","Unsupported","Internal","DatabaseClosed","PrematureCommit","ForeignAwait"].concat(Oe),Me={VersionChanged:"Database version changed by other database connection",DatabaseClosed:"Database has been closed",Abort:"Transaction aborted",TransactionInactive:"Transaction has already completed or failed",MissingAPI:"IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb"};function Ce(e,t){this._e=Se(),this.name=e,this.message=t}function Ie(e,t){return e+". Errors: "+Object.keys(t).map((function(e){return t[e].toString()})).filter((function(e,t,n){return n.indexOf(e)===t})).join("\n")}function Ae(e,t,n,r){this._e=Se(),this.failures=t,this.failedKeys=r,this.successCount=n,this.message=Ie(e,t)}function Pe(e,t){this._e=Se(),this.name="BulkError",this.failures=Object.keys(t).map((function(e){return t[e]})),this.failuresByPos=t,this.message=Ie(e,t)}$(Ce).from(Error).extend({stack:{get:function(){return this._stack||(this._stack=this.name+": "+this.message+_e(this._e,2))}},toString:function(){return this.name+": "+this.message}}),$(Ae).from(Ce),$(Pe).from(Ce);var je=Ee.reduce((function(e,t){return e[t]=t+"Error",e}),{}),Te=Ce,Ke=Ee.reduce((function(e,t){var n=t+"Error";function r(e,r){this._e=Se(),this.name=n,e?"string"==typeof e?(this.message=e+(r?"\n "+r:""),this.inner=r||null):"object"==typeof e&&(this.message=e.name+" "+e.message,this.inner=e):(this.message=Me[t]||n,this.inner=null)}return $(r).from(Te),e[t]=r,e}),{});Ke.Syntax=SyntaxError,Ke.Type=TypeError,Ke.Range=RangeError;var De=Oe.reduce((function(e,t){return e[t+"Error"]=Ke[t],e}),{}),Ne=Ee.reduce((function(e,t){return-1===["Syntax","Type","Range"].indexOf(t)&&(e[t+"Error"]=Ke[t]),e}),{});function Le(){}function Re(e){return e}function Fe(e,t){return null==e||e===Re?t:function(n){return t(e(n))}}function Be(e,t){return function(){e.apply(this,arguments),t.apply(this,arguments)}}function qe(e,t){return e===Le?t:function(){var n=e.apply(this,arguments);void 0!==n&&(arguments[0]=n);var r=this.onsuccess,i=this.onerror;this.onsuccess=null,this.onerror=null;var a=t.apply(this,arguments);return r&&(this.onsuccess=this.onsuccess?Be(r,this.onsuccess):r),i&&(this.onerror=this.onerror?Be(i,this.onerror):i),void 0!==a?a:n}}function ze(e,t){return e===Le?t:function(){e.apply(this,arguments);var n=this.onsuccess,r=this.onerror;this.onsuccess=this.onerror=null,t.apply(this,arguments),n&&(this.onsuccess=this.onsuccess?Be(n,this.onsuccess):n),r&&(this.onerror=this.onerror?Be(r,this.onerror):r)}}function Ue(e,t){return e===Le?t:function(n){var r=e.apply(this,arguments);q(n,r);var i=this.onsuccess,a=this.onerror;this.onsuccess=null,this.onerror=null;var o=t.apply(this,arguments);return i&&(this.onsuccess=this.onsuccess?Be(i,this.onsuccess):i),a&&(this.onerror=this.onerror?Be(a,this.onerror):a),void 0===r?void 0===o?void 0:o:q(r,o)}}function Ge(e,t){return e===Le?t:function(){return!1!==t.apply(this,arguments)&&e.apply(this,arguments)}}function We(e,t){return e===Le?t:function(){var n=e.apply(this,arguments);if(n&&"function"==typeof n.then){for(var r=this,i=arguments.length,a=new Array(i);i--;)a[i]=arguments[i];return n.then((function(){return t.apply(r,a)}))}return t.apply(this,arguments)}}Ne.ModifyError=Ae,Ne.DexieError=Ce,Ne.BulkError=Pe;var Je={},He="undefined"==typeof Promise?[]:function(){var e=Promise.resolve();if("undefined"==typeof crypto||!crypto.subtle)return[e,z(e),e];var t=crypto.subtle.digest("SHA-512",new Uint8Array([0]));return[t,z(t),e]}(),$e=He[0],Ve=He[1],Qe=He[2],Ye=Ve&&Ve.then,Xe=$e&&$e.constructor,Ze=!!Qe,et=!1,tt=Qe?function(){Qe.then(St)}:R.setImmediate?setImmediate.bind(null,St):R.MutationObserver?function(){var e=document.createElement("div");new MutationObserver((function(){St(),e=null})).observe(e,{attributes:!0}),e.setAttribute("i","1")}:function(){setTimeout(St,0)},nt=function(e,t){ht.push([e,t]),it&&(tt(),it=!1)},rt=!0,it=!0,at=[],ot=[],st=null,ut=Re,ct={id:"global",global:!0,ref:0,unhandleds:[],onunhandled:Ht,pgp:!1,env:{},finalize:function(){this.unhandleds.forEach((function(e){try{Ht(e[0],e[1])}catch(e){}}))}},lt=ct,ht=[],ft=0,pt=[];function dt(e){if("object"!=typeof this)throw new TypeError("Promises must be constructed via new");this._listeners=[],this.onuncatched=Le,this._lib=!1;var t=this._PSD=lt;if(be&&(this._stackHolder=Se(),this._prev=null,this._numPrev=0),"function"!=typeof e){if(e!==Je)throw new TypeError("Not a function");return this._state=arguments[1],this._value=arguments[2],void(!1===this._state&&mt(this,this._value))}this._state=null,this._value=null,++t.ref,vt(this,e)}var gt={get:function(){var e=lt,t=Tt;function n(n,r){var i=this,a=!e.global&&(e!==lt||t!==Tt),o=a&&!Lt(),s=new dt((function(t,s){wt(i,new yt(Wt(n,e,a,o),Wt(r,e,a,o),t,s,e))}));return be&&kt(s,this),s}return n.prototype=Je,n},set:function(e){H(this,"then",e&&e.prototype===Je?gt:{get:function(){return e},set:gt.set})}};function yt(e,t,n,r,i){this.onFulfilled="function"==typeof e?e:null,this.onRejected="function"==typeof t?t:null,this.resolve=n,this.reject=r,this.psd=i}function vt(e,t){try{t((function(t){if(null===e._state){if(t===e)throw new TypeError("A promise cannot be resolved with itself.");var n=e._lib&&_t();t&&"function"==typeof t.then?vt(e,(function(e,n){t instanceof dt?t._then(e,n):t.then(e,n)})):(e._state=!0,e._value=t,bt(e)),n&&Ot()}}),mt.bind(null,e))}catch(t){mt(e,t)}}function mt(e,t){if(ot.push(t),null===e._state){var n=e._lib&&_t();t=ut(t),e._state=!1,e._value=t,be&&null!==t&&"object"==typeof t&&!t._promise&&function(n,r,i){try{(function(){var n=Q(t,"stack");t._promise=e,H(t,"stack",{get:function(){return et?n&&(n.get?n.get.apply(t):n.value):e.stack}})}).apply(null,void 0)}catch(e){}}(),function(e){at.some((function(t){return t._value===e._value}))||at.push(e)}(e),bt(e),n&&Ot()}}function bt(e){var t=e._listeners;e._listeners=[];for(var n=0,r=t.length;n0;)for(e=ht,ht=[],n=e.length,t=0;t0);rt=!0,it=!0}function Et(){var e=at;at=[],e.forEach((function(e){e._PSD.onunhandled.call(null,e._value,e)}));for(var t=pt.slice(0),n=t.length;n;)t[--n]()}function Mt(e){return new dt(Je,!1,e)}function Ct(e,t){var n=lt;return function(){var r=_t(),i=lt;try{return qt(n,!0),e.apply(this,arguments)}catch(e){t&&t(e)}finally{qt(i,!1),r&&Ot()}}}W(dt.prototype,{then:gt,_then:function(e,t){wt(this,new yt(null,null,e,t,lt))},catch:function(e){if(1===arguments.length)return this.then(null,e);var t=arguments[0],n=arguments[1];return this.then(null,"function"==typeof t?function(e){return e instanceof t?n(e):Mt(e)}:function(e){return e&&e.name===t?n(e):Mt(e)})},finally:function(e){return this.then((function(t){return e(),t}),(function(t){return e(),Mt(t)}))},stack:{get:function(){if(this._stack)return this._stack;try{et=!0;var e=function e(t,n,r){if(n.length===r)return n;var i="";if(!1===t._state){var a,o,s=t._value;null!=s?(a=s.name||"Error",o=s.message||s,i=_e(s,0)):(a=s,o=""),n.push(a+(o?": "+o:"")+i)}return be&&((i=_e(t._stackHolder,2))&&-1===n.indexOf(i)&&n.push(i),t._prev&&e(t._prev,n,r)),n}(this,[],20).join("\nFrom previous: ");return null!==this._state&&(this._stack=e),e}finally{et=!1}}},timeout:function(e,t){var n=this;return e.",Yt=[],Xt="undefined"!=typeof navigator&&/(MSIE|Trident|Edge)/.test(navigator.userAgent),Zt=Xt,en=Xt,tn=function(e){return!/(dexie\.js|dexie\.min\.js)/.test(e)};function nn(e,t){return e?t?function(){return e.apply(this,arguments)&&t.apply(this,arguments)}:e:t}var rn={type:3,lower:-Infinity,lowerOpen:!1,upper:[[]],upperOpen:!1};function an(e){return"string"!=typeof e||/\./.test(e)?function(e){return e}:function(t){return void 0===t[e]&&e in t&&delete(t=he(t))[e],t}}var on=function(){function e(){}return e.prototype._trans=function(e,t,n){var r=this._tx||lt.trans,i=this.name;function a(e,n,r){if(!r.schema[i])throw new Ke.NotFound("Table "+i+" not part of transaction");return t(r.idbtrans,r)}var o=_t();try{return r&&r.db===this.db?r===lt.trans?r._promise(e,a,n):Dt((function(){return r._promise(e,a,n)}),{trans:r,transless:lt.transless||lt}):function e(t,n,r,i){if(t.idbdb&&(t._state.openComplete||lt.letThrough||t._vip)){var a=t._createTransaction(n,r,t._dbSchema);try{a.create(),t._state.PR1398_maxLoop=3}catch(a){return a.name===je.InvalidState&&t.isOpen()&&--t._state.PR1398_maxLoop>0?(console.warn("Dexie: Need to reopen db"),t._close(),t.open().then((function(){return e(t,n,r,i)}))):$t(a)}return a._promise(n,(function(e,t){return Dt((function(){return lt.trans=a,i(e,t,a)}))})).then((function(e){return a._completion.then((function(){return e}))}))}if(t._state.openComplete)return $t(new Ke.DatabaseClosed(t._state.dbOpenError));if(!t._state.isBeingOpened){if(!t._options.autoOpen)return $t(new Ke.DatabaseClosed);t.open().catch(Le)}return t._state.dbReadyPromise.then((function(){return e(t,n,r,i)}))}(this.db,e,[this.name],a)}finally{o&&Ot()}},e.prototype.get=function(e,t){var n=this;return e&&e.constructor===Object?this.where(e).first(t):this._trans("readonly",(function(t){return n.core.get({trans:t,key:e}).then((function(e){return n.hook.reading.fire(e)}))})).then(t)},e.prototype.where=function(e){if("string"==typeof e)return new this.db.WhereClause(this,e);if(B(e))return new this.db.WhereClause(this,"["+e.join("+")+"]");var t=F(e);if(1===t.length)return this.where(t[0]).equals(e[t[0]]);var n=this.schema.indexes.concat(this.schema.primKey).filter((function(e){return e.compound&&t.every((function(t){return e.keyPath.indexOf(t)>=0}))&&e.keyPath.every((function(e){return t.indexOf(e)>=0}))}))[0];if(n&&this.db._maxKey!==Vt)return this.where(n.name).equals(n.keyPath.map((function(t){return e[t]})));!n&&be&&console.warn("The query "+JSON.stringify(e)+" on "+this.name+" would benefit of a compound index ["+t.join("+")+"]");var r=this.schema.idxByName,i=this.db._deps.indexedDB;function a(e,t){try{return 0===i.cmp(e,t)}catch(e){return!1}}var o=t.reduce((function(t,n){var i=t[0],o=t[1],s=r[n],u=e[n];return[i||s,i||!s?nn(o,s&&s.multi?function(e){var t=re(e,n);return B(t)&&t.some((function(e){return a(u,e)}))}:function(e){return a(u,re(e,n))}):o]}),[null,null]),s=o[0],u=o[1];return s?this.where(s.name).equals(e[s.keyPath]).filter(u):n?this.filter(u):this.where(t).equals("")},e.prototype.filter=function(e){return this.toCollection().and(e)},e.prototype.count=function(e){return this.toCollection().count(e)},e.prototype.offset=function(e){return this.toCollection().offset(e)},e.prototype.limit=function(e){return this.toCollection().limit(e)},e.prototype.each=function(e){return this.toCollection().each(e)},e.prototype.toArray=function(e){return this.toCollection().toArray(e)},e.prototype.toCollection=function(){return new this.db.Collection(new this.db.WhereClause(this))},e.prototype.orderBy=function(e){return new this.db.Collection(new this.db.WhereClause(this,B(e)?"["+e.join("+")+"]":e))},e.prototype.reverse=function(){return this.toCollection().reverse()},e.prototype.mapToClass=function(e){this.schema.mappedClass=e;var t=function(t){if(!t)return t;var n=Object.create(e.prototype);for(var r in t)if(G(t,r))try{n[r]=t[r]}catch(e){}return n};return this.schema.readHook&&this.hook.reading.unsubscribe(this.schema.readHook),this.schema.readHook=t,this.hook("reading",t),e},e.prototype.defineClass=function(){return this.mapToClass((function(e){q(this,e)}))},e.prototype.add=function(e,t){var n=this,r=this.schema.primKey,i=r.keyPath,a=e;return i&&r.auto&&(a=an(i)(e)),this._trans("readwrite",(function(e){return n.core.mutate({trans:e,type:"add",keys:null!=t?[t]:null,values:[a]})})).then((function(e){return e.numFailures?dt.reject(e.failures[0]):e.lastResult})).then((function(t){if(i)try{ie(e,i,t)}catch(e){}return t}))},e.prototype.update=function(e,t){if("object"!=typeof e||B(e))return this.where(":id").equals(e).modify(t);var n=re(e,this.schema.primKey.keyPath);if(void 0===n)return $t(new Ke.InvalidArgument("Given object does not contain its primary key"));try{"function"!=typeof t?F(t).forEach((function(n){ie(e,n,t[n])})):t(e,{value:e,primKey:n})}catch(e){}return this.where(":id").equals(n).modify(t)},e.prototype.put=function(e,t){var n=this,r=this.schema.primKey,i=r.keyPath,a=e;return i&&r.auto&&(a=an(i)(e)),this._trans("readwrite",(function(e){return n.core.mutate({trans:e,type:"put",values:[a],keys:null!=t?[t]:null})})).then((function(e){return e.numFailures?dt.reject(e.failures[0]):e.lastResult})).then((function(t){if(i)try{ie(e,i,t)}catch(e){}return t}))},e.prototype.delete=function(e){var t=this;return this._trans("readwrite",(function(n){return t.core.mutate({trans:n,type:"delete",keys:[e]})})).then((function(e){return e.numFailures?dt.reject(e.failures[0]):void 0}))},e.prototype.clear=function(){var e=this;return this._trans("readwrite",(function(t){return e.core.mutate({trans:t,type:"deleteRange",range:rn})})).then((function(e){return e.numFailures?dt.reject(e.failures[0]):void 0}))},e.prototype.bulkGet=function(e){var t=this;return this._trans("readonly",(function(n){return t.core.getMany({keys:e,trans:n}).then((function(e){return e.map((function(e){return t.hook.reading.fire(e)}))}))}))},e.prototype.bulkAdd=function(e,t,n){var r=this,i=Array.isArray(t)?t:void 0,a=(n=n||(i?void 0:t))?n.allKeys:void 0;return this._trans("readwrite",(function(t){var n=r.schema.primKey,o=n.auto,s=n.keyPath;if(s&&i)throw new Ke.InvalidArgument("bulkAdd(): keys argument invalid on tables with inbound keys");if(i&&i.length!==e.length)throw new Ke.InvalidArgument("Arguments objects and keys must have the same length");var u=e.length,c=s&&o?e.map(an(s)):e;return r.core.mutate({trans:t,type:"add",keys:i,values:c,wantResults:a}).then((function(e){var t=e.numFailures;if(0===t)return a?e.results:e.lastResult;throw new Pe(r.name+".bulkAdd(): "+t+" of "+u+" operations failed",e.failures)}))}))},e.prototype.bulkPut=function(e,t,n){var r=this,i=Array.isArray(t)?t:void 0,a=(n=n||(i?void 0:t))?n.allKeys:void 0;return this._trans("readwrite",(function(t){var n=r.schema.primKey,o=n.auto,s=n.keyPath;if(s&&i)throw new Ke.InvalidArgument("bulkPut(): keys argument invalid on tables with inbound keys");if(i&&i.length!==e.length)throw new Ke.InvalidArgument("Arguments objects and keys must have the same length");var u=e.length,c=s&&o?e.map(an(s)):e;return r.core.mutate({trans:t,type:"put",keys:i,values:c,wantResults:a}).then((function(e){var t=e.numFailures;if(0===t)return a?e.results:e.lastResult;throw new Pe(r.name+".bulkPut(): "+t+" of "+u+" operations failed",e.failures)}))}))},e.prototype.bulkDelete=function(e){var t=this,n=e.length;return this._trans("readwrite",(function(n){return t.core.mutate({trans:n,type:"delete",keys:e})})).then((function(e){var r=e.numFailures;if(0===r)return e.lastResult;throw new Pe(t.name+".bulkDelete(): "+r+" of "+n+" operations failed",e.failures)}))},e}();function sn(e){var t={},n=function(n,r){if(r){for(var i=arguments.length,a=new Array(i-1);--i;)a[i-1]=arguments[i];return t[n].subscribe.apply(null,a),e}if("string"==typeof n)return t[n]};n.addEventType=a;for(var r=1,i=arguments.length;rt?1:er?o:0}return this.toArray((function(e){return e.sort(s)})).then(t)},e.prototype.toArray=function(e){var t=this;return this._read((function(e){var n=t._ctx;if("next"===n.dir&&cn(n,!0)&&n.limit>0){var r=n.valueMapper,i=fn(n,n.table.core.schema);return n.table.core.query({trans:e,limit:n.limit,values:!0,query:{index:i,range:n.range}}).then((function(e){var t=e.result;return r?t.map(r):t}))}var a=[];return dn(n,(function(e){return a.push(e)}),e,n.table.core).then((function(){return a}))}),e)},e.prototype.offset=function(e){var t=this._ctx;return e<=0||(t.offset+=e,cn(t)?hn(t,(function(){var t=e;return function(e,n){return 0===t||(1===t?(--t,!1):(n((function(){e.advance(t),t=0})),!1))}})):hn(t,(function(){var t=e;return function(){return--t<0}}))),this},e.prototype.limit=function(e){return this._ctx.limit=Math.min(this._ctx.limit,e),hn(this._ctx,(function(){var t=e;return function(e,n,r){return--t<=0&&n(r),t>=0}}),!0),this},e.prototype.until=function(e,t){return ln(this._ctx,(function(n,r,i){return!e(n.value)||(r(i),t)})),this},e.prototype.first=function(e){return this.limit(1).toArray((function(e){return e[0]})).then(e)},e.prototype.last=function(e){return this.reverse().first(e)},e.prototype.filter=function(e){var t;return ln(this._ctx,(function(t){return e(t.value)})),(t=this._ctx).isMatch=nn(t.isMatch,e),this},e.prototype.and=function(e){return this.filter(e)},e.prototype.or=function(e){return new this.db.WhereClause(this._ctx.table,e,this)},e.prototype.reverse=function(){return this._ctx.dir="prev"===this._ctx.dir?"next":"prev",this._ondirectionchange&&this._ondirectionchange(this._ctx.dir),this},e.prototype.desc=function(){return this.reverse()},e.prototype.eachKey=function(e){var t=this._ctx;return t.keysOnly=!t.isMatch,this.each((function(t,n){e(n.key,n)}))},e.prototype.eachUniqueKey=function(e){return this._ctx.unique="unique",this.eachKey(e)},e.prototype.eachPrimaryKey=function(e){var t=this._ctx;return t.keysOnly=!t.isMatch,this.each((function(t,n){e(n.primaryKey,n)}))},e.prototype.keys=function(e){var t=this._ctx;t.keysOnly=!t.isMatch;var n=[];return this.each((function(e,t){n.push(t.key)})).then((function(){return n})).then(e)},e.prototype.primaryKeys=function(e){var t=this._ctx;if("next"===t.dir&&cn(t,!0)&&t.limit>0)return this._read((function(e){var n=fn(t,t.table.core.schema);return t.table.core.query({trans:e,values:!1,limit:t.limit,query:{index:n,range:t.range}})})).then((function(e){return e.result})).then(e);t.keysOnly=!t.isMatch;var n=[];return this.each((function(e,t){n.push(t.primaryKey)})).then((function(){return n})).then(e)},e.prototype.uniqueKeys=function(e){return this._ctx.unique="unique",this.keys(e)},e.prototype.firstKey=function(e){return this.limit(1).keys((function(e){return e[0]})).then(e)},e.prototype.lastKey=function(e){return this.reverse().firstKey(e)},e.prototype.distinct=function(){var e=this._ctx,t=e.index&&e.table.schema.idxByName[e.index];if(!t||!t.multi)return this;var n={};return ln(this._ctx,(function(e){var t=e.primaryKey.toString(),r=G(n,t);return n[t]=!0,!r})),this},e.prototype.modify=function(e){var t=this,n=this._ctx;return this._write((function(r){var i;if("function"==typeof e)i=e;else{var a=F(e),o=a.length;i=function(t){for(var n=!1,r=0;r0&&s.mutate({trans:r,type:"add",values:p}).then((function(e){for(var t in e.failures)v.splice(parseInt(t),1);g(p.length,e)}))).then((function(){return(d.length>0||x&&"object"==typeof e)&&s.mutate({trans:r,type:"put",keys:y,values:d,criteria:x,changeSpec:"function"!=typeof e&&e}).then((function(e){return g(d.length,e)}))})).then((function(){return(v.length>0||x&&e===wn)&&s.mutate({trans:r,type:"delete",keys:v,criteria:x}).then((function(e){return g(v.length,e)}))})).then((function(){return t.length>o+u&&a(o+h)}))}))};return a(0).then((function(){if(f.length>0)throw new Ae("Error modifying one or more objects",f,p,d);return t.length}))}))}))},e.prototype.delete=function(){var e=this._ctx,t=e.range;return cn(e)&&(e.isPrimKey&&!en||3===t.type)?this._write((function(n){var r=t;return e.table.core.count({trans:n,query:{index:e.table.core.schema.primaryKey,range:r}}).then((function(t){return e.table.core.mutate({trans:n,type:"deleteRange",range:r}).then((function(e){var n=e.failures,r=e.numFailures;if(r)throw new Ae("Could not delete some values",Object.keys(n).map((function(e){return n[e]})),t-r);return t-r}))}))})):this.modify(wn)},e}(),wn=function(e,t){return t.value=null};function xn(e,t){return et?-1:e===t?0:1}function Sn(e,t,n){var r=e instanceof In?new e.Collection(e):e;return r._ctx.error=n?new n(t):new TypeError(t),r}function _n(e){return new e.Collection(e,(function(){return Cn("")})).limit(0)}function On(e,t,n,r,i,a){for(var o=Math.min(e.length,r.length),s=-1,u=0;u=0?e.substr(0,s)+t[s]+n.substr(s+1):null;i(e[u],c)<0&&(s=u)}return o0)&&(p=y)}return n(null!==p?function(){e.continue(p+l)}:r),!1})),p}function Mn(e,t,n,r){return{type:2,lower:e,upper:t,lowerOpen:n,upperOpen:r}}function Cn(e){return{type:1,lower:e,upper:e}}var In=function(){function e(){}return Object.defineProperty(e.prototype,"Collection",{get:function(){return this._ctx.table.db.Collection},enumerable:!1,configurable:!0}),e.prototype.between=function(e,t,n,r){n=!1!==n,r=!0===r;try{return this._cmp(e,t)>0||0===this._cmp(e,t)&&(n||r)&&(!n||!r)?_n(this):new this.Collection(this,(function(){return Mn(e,t,!n,!r)}))}catch(e){return Sn(this,Qt)}},e.prototype.equals=function(e){return null==e?Sn(this,Qt):new this.Collection(this,(function(){return Cn(e)}))},e.prototype.above=function(e){return null==e?Sn(this,Qt):new this.Collection(this,(function(){return Mn(e,void 0,!0)}))},e.prototype.aboveOrEqual=function(e){return null==e?Sn(this,Qt):new this.Collection(this,(function(){return Mn(e,void 0,!1)}))},e.prototype.below=function(e){return null==e?Sn(this,Qt):new this.Collection(this,(function(){return Mn(void 0,e,!1,!0)}))},e.prototype.belowOrEqual=function(e){return null==e?Sn(this,Qt):new this.Collection(this,(function(){return Mn(void 0,e)}))},e.prototype.startsWith=function(e){return"string"!=typeof e?Sn(this,"String expected."):this.between(e,e+Vt,!0,!0)},e.prototype.startsWithIgnoreCase=function(e){return""===e?this.startsWith(e):En(this,(function(e,t){return 0===e.indexOf(t[0])}),[e],Vt)},e.prototype.equalsIgnoreCase=function(e){return En(this,(function(e,t){return e===t[0]}),[e],"")},e.prototype.anyOfIgnoreCase=function(){var e=ve.apply(ye,arguments);return 0===e.length?_n(this):En(this,(function(e,t){return-1!==t.indexOf(e)}),e,"")},e.prototype.startsWithAnyOfIgnoreCase=function(){var e=ve.apply(ye,arguments);return 0===e.length?_n(this):En(this,(function(e,t){return t.some((function(t){return 0===e.indexOf(t)}))}),e,Vt)},e.prototype.anyOf=function(){var e=this,t=ve.apply(ye,arguments),n=this._cmp;try{t.sort(n)}catch(e){return Sn(this,Qt)}if(0===t.length)return _n(this);var r=new this.Collection(this,(function(){return Mn(t[0],t[t.length-1])}));r._ondirectionchange=function(r){t.sort(n="next"===r?e._ascending:e._descending)};var i=0;return r._addAlgorithm((function(e,r,a){for(var o=e.key;n(o,t[i])>0;)if(++i===t.length)return r(a),!1;return 0===n(o,t[i])||(r((function(){e.continue(t[i])})),!1)})),r},e.prototype.notEqual=function(e){return this.inAnyRange([[-Infinity,e],[e,this.db._maxKey]],{includeLowers:!1,includeUppers:!1})},e.prototype.noneOf=function(){var e=ve.apply(ye,arguments);if(0===e.length)return new this.Collection(this);try{e.sort(this._ascending)}catch(e){return Sn(this,Qt)}var t=e.reduce((function(e,t){return e?e.concat([[e[e.length-1][1],t]]):[[-Infinity,t]]}),null);return t.push([e[e.length-1],this.db._maxKey]),this.inAnyRange(t,{includeLowers:!1,includeUppers:!1})},e.prototype.inAnyRange=function(e,t){var n=this,r=this._cmp,i=this._ascending,a=this._descending,o=this._min,s=this._max;if(0===e.length)return _n(this);if(!e.every((function(e){return void 0!==e[0]&&void 0!==e[1]&&i(e[0],e[1])<=0})))return Sn(this,"First argument to inAnyRange() must be an Array of two-value Arrays [lower,upper] where upper must not be lower than lower",Ke.InvalidArgument);var u,c=!t||!1!==t.includeLowers,l=t&&!0===t.includeUppers,h=i;function f(e,t){return h(e[0],t[0])}try{(u=e.reduce((function(e,t){for(var n=0,i=e.length;n0){a[0]=o(a[0],t[0]),a[1]=s(a[1],t[1]);break}}return n===i&&e.push(t),e}),[])).sort(f)}catch(e){return Sn(this,Qt)}var p=0,d=l?function(e){return i(e,u[p][1])>0}:function(e){return i(e,u[p][1])>=0},g=c?function(e){return a(e,u[p][0])>0}:function(e){return a(e,u[p][0])>=0},y=d,v=new this.Collection(this,(function(){return Mn(u[0][0],u[u.length-1][1],!c,!l)}));return v._ondirectionchange=function(e){"next"===e?(y=d,h=i):(y=g,h=a),u.sort(f)},v._addAlgorithm((function(e,t,r){for(var a=e.key;y(a);)if(++p===u.length)return t(r),!1;return!!function(e){return!d(e)&&!g(e)}(a)||(0===n._cmp(a,u[p][1])||0===n._cmp(a,u[p][0])||t((function(){e.continue(h===i?u[p][0]:u[p][1])})),!1)})),v},e.prototype.startsWithAnyOf=function(){var e=ve.apply(ye,arguments);return e.every((function(e){return"string"==typeof e}))?0===e.length?_n(this):this.inAnyRange(e.map((function(e){return[e,e+Vt]}))):Sn(this,"startsWithAnyOf() only works with strings")},e}();function An(e){return Ct((function(t){return Pn(t),e(t.target.error),!1}))}function Pn(e){e.stopPropagation&&e.stopPropagation(),e.preventDefault&&e.preventDefault()}var jn=sn(null,"storagemutated"),Tn=function(){function e(){}return e.prototype._lock=function(){return ee(!lt.global),++this._reculock,1!==this._reculock||lt.global||(lt.lockOwnerFor=this),this},e.prototype._unlock=function(){if(ee(!lt.global),0==--this._reculock)for(lt.global||(lt.lockOwnerFor=null);this._blockedFuncs.length>0&&!this._locked();){var e=this._blockedFuncs.shift();try{Ut(e[1],e[0])}catch(e){}}return this},e.prototype._locked=function(){return this._reculock&<.lockOwnerFor!==this},e.prototype.create=function(e){var t=this;if(!this.mode)return this;var n=this.db.idbdb,r=this.db._state.dbOpenError;if(ee(!this.idbtrans),!e&&!n)switch(r&&r.name){case"DatabaseClosedError":throw new Ke.DatabaseClosed(r);case"MissingAPIError":throw new Ke.MissingAPI(r.message,r);default:throw new Ke.OpenFailed(r)}if(!this.active)throw new Ke.TransactionInactive;return ee(null===this._completion._state),(e=this.idbtrans=e||(this.db.core?this.db.core.transaction(this.storeNames,this.mode,{durability:this.chromeTransactionDurability}):n.transaction(this.storeNames,this.mode,{durability:this.chromeTransactionDurability}))).onerror=Ct((function(n){Pn(n),t._reject(e.error)})),e.onabort=Ct((function(n){Pn(n),t.active&&t._reject(new Ke.Abort(e.error)),t.active=!1,t.on("abort").fire(n)})),e.oncomplete=Ct((function(){t.active=!1,t._resolve(),"mutatedParts"in e&&jn.storagemutated.fire(e.mutatedParts)})),this},e.prototype._promise=function(e,t,n){var r=this;if("readwrite"===e&&"readwrite"!==this.mode)return $t(new Ke.ReadOnly("Transaction is readonly"));if(!this.active)return $t(new Ke.TransactionInactive);if(this._locked())return new dt((function(i,a){r._blockedFuncs.push([function(){r._promise(e,t,n).then(i,a)},lt])}));if(n)return Dt((function(){var e=new dt((function(e,n){r._lock();var i=t(e,n,r);i&&i.then&&i.then(e,n)}));return e.finally((function(){return r._unlock()})),e._lib=!0,e}));var i=new dt((function(e,n){var i=t(e,n,r);i&&i.then&&i.then(e,n)}));return i._lib=!0,i},e.prototype._root=function(){return this.parent?this.parent._root():this},e.prototype.waitFor=function(e){var t=this._root(),n=dt.resolve(e);if(t._waitingFor)t._waitingFor=t._waitingFor.then((function(){return n}));else{t._waitingFor=n,t._waitingQueue=[];var r=t.idbtrans.objectStore(t.storeNames[0]);!function e(){for(++t._spinCount;t._waitingQueue.length;)t._waitingQueue.shift()();t._waitingFor&&(r.get(-Infinity).onsuccess=e)}()}var i=t._waitingFor;return new dt((function(e,r){n.then((function(n){return t._waitingQueue.push(Ct(e.bind(null,n)))}),(function(e){return t._waitingQueue.push(Ct(r.bind(null,e)))})).finally((function(){t._waitingFor===i&&(t._waitingFor=null)}))}))},e.prototype.abort=function(){this.active&&(this.active=!1,this.idbtrans&&this.idbtrans.abort(),this._reject(new Ke.Abort))},e.prototype.table=function(e){var t=this._memoizedTables||(this._memoizedTables={});if(G(t,e))return t[e];var n=this.schema[e];if(!n)throw new Ke.NotFound("Table "+e+" not part of transaction");var r=new this.db.Table(e,n,this);return r.core=this.db.core.table(e),t[e]=r,r},e}();function Kn(e,t,n,r,i,a,o){return{name:e,keyPath:t,unique:n,multi:r,auto:i,compound:a,src:(n&&!o?"&":"")+(r?"*":"")+(i?"++":"")+Dn(t)}}function Dn(e){return"string"==typeof e?e:e?"["+[].join.call(e,"+")+"]":""}function Nn(e,t,n){return{name:e,primKey:t,indexes:n,mappedClass:null,idxByName:ne(n,(function(e){return[e.name,e]}))}}var Ln=function(e){try{return e.only([[]]),Ln=function(){return[[]]},[[]]}catch(e){return Ln=function(){return Vt},Vt}};function Rn(e){return null==e?function(){}:"string"==typeof e?function(e){return 1===e.split(".").length?function(t){return t[e]}:function(t){return re(t,e)}}(e):function(t){return re(t,e)}}function Fn(e){return[].slice.call(e)}var Bn=0;function qn(e){return null==e?":id":"string"==typeof e?e:"["+e.join("+")+"]"}function zn(e,t,n){function r(e){if(3===e.type)return null;if(4===e.type)throw new Error("Cannot convert never type to IDBKeyRange");var n=e.lower,r=e.upper,i=e.lowerOpen,a=e.upperOpen;return void 0===n?void 0===r?null:t.upperBound(r,!!a):void 0===r?t.lowerBound(n,!!i):t.bound(n,r,!!i,!!a)}var i=function(e,t){var n=Fn(e.objectStoreNames);return{schema:{name:e.name,tables:n.map((function(e){return t.objectStore(e)})).map((function(e){var t=e.keyPath,n=e.autoIncrement,r=B(t),i={},a={name:e.name,primaryKey:{name:null,isPrimaryKey:!0,outbound:null==t,compound:r,keyPath:t,autoIncrement:n,unique:!0,extractKey:Rn(t)},indexes:Fn(e.indexNames).map((function(t){return e.index(t)})).map((function(e){var t=e.unique,n=e.multiEntry,r=e.keyPath,a={name:e.name,compound:B(r),keyPath:r,unique:t,multiEntry:n,extractKey:Rn(r)};return i[qn(r)]=a,a})),getIndexByKeyPath:function(e){return i[qn(e)]}};return i[":id"]=a.primaryKey,null!=t&&(i[qn(t)]=a.primaryKey),a}))},hasGetAll:n.length>0&&"getAll"in t.objectStore(n[0])&&!("undefined"!=typeof navigator&&/Safari/.test(navigator.userAgent)&&!/(Chrome\/|Edge\/)/.test(navigator.userAgent)&&[].concat(navigator.userAgent.match(/Safari\/(\d*)/))[1]<604)}}(e,n),a=i.schema,o=i.hasGetAll,s=a.tables.map((function(e){return function(e){var t=e.name;return{name:t,schema:e,mutate:function(e){var n=e.trans,i=e.type,a=e.keys,o=e.values,s=e.range;return new Promise((function(e,u){e=Ct(e);var c=n.objectStore(t),l=null==c.keyPath,h="put"===i||"add"===i;if(!h&&"delete"!==i&&"deleteRange"!==i)throw new Error("Invalid operation type: "+i);var f,p=(a||o||{length:1}).length;if(a&&o&&a.length!==o.length)throw new Error("Given keys array must have same length as given values array.");if(0===p)return e({numFailures:0,failures:{},results:[],lastResult:void 0});var d=[],g=[],y=0,v=function(e){++y,Pn(e)};if("deleteRange"===i){if(4===s.type)return e({numFailures:y,failures:g,results:[],lastResult:void 0});d.push(f=3===s.type?c.clear():c.delete(r(s)))}else{var m=h?l?[o,a]:[o,null]:[a,null],b=m[0],w=m[1];if(h)for(var x=0;x0||o.add.length>0||o.change.length>0)&&r.change.push(o)}}else r.add.push([n,a])}return r}function $n(e,t,n,r){var i=e.db.createObjectStore(t,n.keyPath?{keyPath:n.keyPath,autoIncrement:n.auto}:{autoIncrement:n.auto});return r.forEach((function(e){return Vn(i,e)})),i}function Vn(e,t){e.createIndex(t.name,t.keyPath,{unique:t.unique,multiEntry:t.multi})}function Qn(e,t,n){var r={};return X(t.objectStoreNames,0).forEach((function(e){for(var t=n.objectStore(e),i=t.keyPath,a=Kn(Dn(i),i||"",!1,!1,!!t.autoIncrement,i&&"string"!=typeof i,!0),o=[],s=0;s0?(console.warn("Dexie: Need to reopen db"),e._close(),e.open().then((function(){return or(e,t,n,null,i)}))):$t(r)}var u,c=me(i);c&&Nt();var l=dt.follow((function(){if(u=i.call(o,o))if(c){var e=Lt.bind(null,null);u.then(e,e)}else"function"==typeof u.next&&"function"==typeof u.throw&&(u=ir(u))}),s);return(u&&"function"==typeof u.then?dt.resolve(u).then((function(e){return o.active?e:$t(new Ke.PrematureCommit("Transaction committed too early. See http://bit.ly/2kdckMn"))})):l.then((function(){return u}))).then((function(e){return r&&o._resolve(),o._completion.then((function(){return e}))})).catch((function(e){return o._reject(e),$t(e)}))}))}function sr(e,t,n){for(var r=B(e)?e.slice():[e],i=0;i0,l=N(N({},n),{isVirtual:c,keyTail:t,keyLength:u,extractKey:Rn(e),unique:!c&&n.unique});return s.push(l),l.isPrimaryKey||a.push(l),u>1&&o(2===u?e[0]:e.slice(0,u-1),t+1,n),s.sort((function(e,t){return e.keyTail-t.keyTail})),l}var s=o(r.primaryKey.keyPath,0,r.primaryKey);i[":id"]=[s];for(var u=0,c=r.indexes;u0?Promise.reject(n.failures[0]):r.length1?t:e}:{d:0})};function yr(e,t,n){var r=yn(t,n);if(!isNaN(r)){if(r>0)throw RangeError();if(dr(e))return q(e,{from:t,to:n,d:1});var i=e.l,a=e.r;if(yn(n,e.from)<0)return i?yr(i,t,n):e.l={from:t,to:n,d:1,l:null,r:null},br(e);if(yn(t,e.to)>0)return a?yr(a,t,n):e.r={from:t,to:n,d:1,l:null,r:null},br(e);yn(t,e.from)<0&&(e.from=t,e.l=null,e.d=a?a.d+1:1),yn(n,e.to)>0&&(e.to=n,e.r=null,e.d=e.l?e.l.d+1:1);var o=!e.r;i&&!e.l&&vr(e,i),a&&o&&vr(e,a)}}function vr(e,t){dr(t)||function e(t,n){var r=n.l,i=n.r;yr(t,n.from,n.to),r&&e(t,r),i&&e(t,i)}(e,t)}function mr(e){var t=dr(e)?null:{s:0,n:e};return{next:function(e){for(var n=arguments.length>0;t;)switch(t.s){case 0:if(t.s=1,n)for(;t.n.l&&yn(e,t.n.from)<0;)t={up:t,n:t.n.l,s:1};else for(;t.n.l;)t={up:t,n:t.n.l,s:1};case 1:if(t.s=2,!n||yn(e,t.n.to)<=0)return{value:t.n,done:!1};case 2:if(t.n.r){t.s=3,t={up:t,n:t.n.r,s:0};continue}case 3:t=t.up}return{done:!0}}}}function br(e){var t,n,r=((null===(t=e.r)||void 0===t?void 0:t.d)||0)-((null===(n=e.l)||void 0===n?void 0:n.d)||0),i=r>1?"r":r<-1?"l":"";if(i){var a="r"===i?"l":"r",o=N({},e),s=e[i];e.from=s.from,e.to=s.to,e[i]=s[i],o[i]=s[a],e[a]=o,o.d=wr(o)}e.d=wr(e)}function wr(e){var t=e.r,n=e.l;return(t?n?Math.max(t.d,n.d):t.d:n?n.d:0)+1}W(gr.prototype,((fr={add:function(e){return vr(this,e),this},addKey:function(e){return yr(this,e,e),this},addKeys:function(e){var t=this;return e.forEach((function(e){return yr(t,e,e)})),this}})[de]=function(){return mr(this)},fr));var xr,kr={stack:"dbcore",level:0,create:function(e){var t=e.schema.name,n=new gr(e.MIN_KEY,e.MAX_KEY);return N(N({},e),{table:function(r){var i=e.table(r),a=i.schema,o=a.primaryKey,s=o.extractKey,u=o.outbound,c=N(N({},i),{mutate:function(e){var o=e.trans,s=o.mutatedParts||(o.mutatedParts={}),u=function(e){var n="idb://"+t+"/"+r+"/"+e;return s[n]||(s[n]=new gr)},c=u(""),l=u(":dels"),h=e.type,f="deleteRange"===e.type?[e.range]:"delete"===e.type?[e.keys]:e.values.length<50?[[],e.values]:[],p=f[0],d=f[1],g=e.trans._cache;return i.mutate(e).then((function(e){if(B(p)){"delete"!==h&&(p=e.results),c.addKeys(p);var t=hr(p,g);t||"add"===h||l.addKeys(p),(t||d)&&function(e,t,n,r){t.indexes.forEach((function(t){var i=e(t.name||"");function a(e){return null!=e?t.extractKey(e):null}var o=function(e){return t.multiEntry&&B(e)?e.forEach((function(e){return i.addKey(e)})):i.addKey(e)};(n||r).forEach((function(e,t){var i=n&&a(n[t]),s=r&&a(r[t]);0!==yn(i,s)&&(null!=i&&o(i),null!=s&&o(s))}))}))}(u,a,t,d)}else if(p){var r={from:p.lower,to:p.upper};l.add(r),c.add(r)}else c.add(n),l.add(n),a.indexes.forEach((function(e){return u(e.name).add(n)}));return e}))}}),l=function(t){var n,r,i=t.query,a=i.range;return[i.index,new gr(null!==(n=a.lower)&&void 0!==n?n:e.MIN_KEY,null!==(r=a.upper)&&void 0!==r?r:e.MAX_KEY)]},h={get:function(e){return[o,new gr(e.key)]},getMany:function(e){return[o,(new gr).addKeys(e.keys)]},count:l,query:l,openCursor:l};return F(h).forEach((function(e){c[e]=function(a){var o=lt.subscr;if(o){var c=function(e){var n="idb://"+t+"/"+r+"/"+e;return o[n]||(o[n]=new gr)},l=c(""),f=c(":dels"),p=h[e](a),d=p[0],g=p[1];if(c(d.name||"").add(g),!d.isPrimaryKey){if("count"!==e){var y="query"===e&&u&&a.values&&i.query(N(N({},a),{values:!1}));return i[e].apply(this,arguments).then((function(t){if("query"===e){if(u&&a.values)return y.then((function(e){return l.addKeys(e.result),t}));var n=a.values?t.result.map(s):t.result;a.values?l.addKeys(n):f.addKeys(n)}else if("openCursor"===e){var r=t,i=a.values;return r&&Object.create(r,{key:{get:function(){return f.addKey(r.primaryKey),r.key}},primaryKey:{get:function(){var e=r.primaryKey;return f.addKey(e),e}},value:{get:function(){return i&&l.addKey(r.primaryKey),r.value}}})}return t}))}f.add(n)}}return i[e].apply(this,arguments)}})),c}})}},Sr=function(){function e(t,n){var r=this;this._middlewares={},this.verno=0;var i=e.dependencies;this._options=n=N({addons:e.addons,autoOpen:!0,indexedDB:i.indexedDB,IDBKeyRange:i.IDBKeyRange},n),this._deps={indexedDB:n.indexedDB,IDBKeyRange:n.IDBKeyRange};var a=n.addons;this._dbSchema={},this._versions=[],this._storeNames=[],this._allTables={},this.idbdb=null,this._novip=this;var o,s={dbOpenError:null,isBeingOpened:!1,onReadyBeingFired:null,openComplete:!1,dbReadyResolve:Le,dbReadyPromise:null,cancelOpen:Le,openCanceller:null,autoSchema:!0,PR1398_maxLoop:3};s.dbReadyPromise=new dt((function(e){s.dbReadyResolve=e})),s.openCanceller=new dt((function(e,t){s.cancelOpen=t})),this._state=s,this.name=t,this.on=sn(this,"populate","blocked","versionchange","close",{ready:[We,Le]}),this.on.ready.subscribe=Z(this.on.ready.subscribe,(function(t){return function(n,i){e.vip((function(){var e=r._state;if(e.openComplete)e.dbOpenError||dt.resolve().then(n),i&&t(n);else if(e.onReadyBeingFired)e.onReadyBeingFired.push(n),i&&t(n);else{t(n);var a=r;i||t((function e(){a.on.ready.unsubscribe(n),a.on.ready.unsubscribe(e)}))}}))}})),this.Collection=(o=this,un(bn.prototype,(function(e,t){this.db=o;var n=rn,r=null;if(t)try{n=t()}catch(e){r=e}var i=e._ctx,a=i.table,s=a.hook.reading.fire;this._ctx={table:a,index:i.index,isPrimKey:!i.index||a.schema.primKey.keyPath&&i.index===a.schema.primKey.name,range:n,keysOnly:!1,dir:"next",unique:"",algorithm:null,filter:null,replayFilter:null,justLimit:!0,isMatch:null,offset:0,limit:Infinity,error:r,or:i.or,valueMapper:s!==Re?s:null}}))),this.Table=function(e){return un(on.prototype,(function(t,n,r){this.db=e,this._tx=r,this.name=t,this.schema=n,this.hook=e._allTables[t]?e._allTables[t].hook:sn(null,{creating:[qe,Le],reading:[Fe,Re],updating:[Ue,Le],deleting:[ze,Le]})}))}(this),this.Transaction=function(e){return un(Tn.prototype,(function(t,n,r,i,a){var o=this;this.db=e,this.mode=t,this.storeNames=n,this.schema=r,this.chromeTransactionDurability=i,this.idbtrans=null,this.on=sn(this,"complete","error","abort"),this.parent=a||null,this.active=!0,this._reculock=0,this._blockedFuncs=[],this._resolve=null,this._reject=null,this._waitingFor=null,this._waitingQueue=null,this._spinCount=0,this._completion=new dt((function(e,t){o._resolve=e,o._reject=t})),this._completion.then((function(){o.active=!1,o.on.complete.fire()}),(function(e){var t=o.active;return o.active=!1,o.on.error.fire(e),o.parent?o.parent._reject(e):t&&o.idbtrans&&o.idbtrans.abort(),$t(e)}))}))}(this),this.Version=function(e){return un(Xn.prototype,(function(t){this.db=e,this._cfg={version:t,storesSource:null,dbschema:{},tables:{},contentUpgrade:null}}))}(this),this.WhereClause=function(e){return un(In.prototype,(function(t,n,r){this.db=e,this._ctx={table:t,index:":id"===n?null:n,or:r};var i=e._deps.indexedDB;if(!i)throw new Ke.MissingAPI;this._cmp=this._ascending=i.cmp.bind(i),this._descending=function(e,t){return i.cmp(t,e)},this._max=function(e,t){return i.cmp(e,t)>0?e:t},this._min=function(e,t){return i.cmp(e,t)<0?e:t},this._IDBKeyRange=e._deps.IDBKeyRange}))}(this),this.on("versionchange",(function(e){e.newVersion>0?console.warn("Another connection wants to upgrade database '"+r.name+"'. Closing db now to resume the upgrade."):console.warn("Another connection wants to delete database '"+r.name+"'. Closing db now to resume the delete request."),r.close()})),this.on("blocked",(function(e){!e.newVersion||e.newVersionMath.pow(2,62)?0:r.oldVersion;s=l<1,e._novip.idbdb=c.result,function(e,t,n,r){var i=e._dbSchema,a=e._createTransaction("readwrite",e._storeNames,i);a.create(n),a._completion.catch(r);var o=a._reject.bind(a),s=lt.transless||lt;Dt((function(){lt.trans=a,lt.transless=s,0===t?(F(i).forEach((function(e){$n(n,e,i[e].primKey,i[e].indexes)})),Un(e,n),dt.follow((function(){return e.on.populate.fire(a)})).catch(o)):function(e,t,n,r){var i=e._novip,a=[],o=i._versions,s=i._dbSchema=Qn(0,i.idbdb,r),u=!1;return o.filter((function(e){return e._cfg.version>=t})).forEach((function(e){a.push((function(){var a=s,o=e._cfg.dbschema;Yn(i,a,r),Yn(i,o,r),s=i._dbSchema=o;var c=Hn(a,o);c.add.forEach((function(e){$n(r,e[0],e[1].primKey,e[1].indexes)})),c.change.forEach((function(e){if(e.recreate)throw new Ke.Upgrade("Not yet support for changing primary key");var t=r.objectStore(e.name);e.add.forEach((function(e){return Vn(t,e)})),e.change.forEach((function(e){t.deleteIndex(e.name),Vn(t,e)})),e.del.forEach((function(e){return t.deleteIndex(e)}))}));var l=e._cfg.contentUpgrade;if(l&&e._cfg.version>t){Un(i,r),n._memoizedTables={},u=!0;var h=ae(o);c.del.forEach((function(e){h[e]=a[e]})),Wn(i,[i.Transaction.prototype]),Gn(i,[i.Transaction.prototype],F(h),h),n.schema=h;var f,p=me(l);p&&Nt();var d=dt.follow((function(){if((f=l(n))&&p){var e=Lt.bind(null,null);f.then(e,e)}}));return f&&"function"==typeof f.then?dt.resolve(f):d.then((function(){return f}))}})),a.push((function(t){u&&Zt||function(e,t){[].slice.call(t.db.objectStoreNames).forEach((function(n){return null==e[n]&&t.db.deleteObjectStore(n)}))}(e._cfg.dbschema,t),Wn(i,[i.Transaction.prototype]),Gn(i,[i.Transaction.prototype],i._storeNames,i._dbSchema),n.schema=i._dbSchema}))})),function e(){return a.length?dt.resolve(a.shift()(n.idbtrans)).then(e):dt.resolve()}().then((function(){var e,t;t=r,F(e=s).forEach((function(n){t.db.objectStoreNames.contains(n)||$n(t,n,e[n].primKey,e[n].indexes)}))}))}(e,t,a,n).catch(o)}))}(e,l/10,o,a)}}),a),c.onsuccess=Ct((function(){o=null;var n,i=e._novip.idbdb=c.result,a=X(i.objectStoreNames);if(a.length>0)try{var l=i.transaction(1===(n=a).length?n[0]:n,"readonly");t.autoSchema?function(e,t,n){var r=e._novip;r.verno=t.version/10;var i=r._dbSchema=Qn(0,t,n);r._storeNames=X(t.objectStoreNames,0),Gn(r,[r._allTables],F(i),i)}(e,i,l):(Yn(e,e._dbSchema,l),function(e,t){var n=Hn(Qn(0,e.idbdb,t),e._dbSchema);return!(n.add.length||n.change.some((function(e){return e.add.length||e.change.length})))}(e,l)||console.warn("Dexie SchemaDiff: Schema was extended without increasing the number passed to db.version(). Some queries may fail.")),Un(e,l)}catch(e){}Yt.push(e),i.onversionchange=Ct((function(n){t.vcFired=!0,e.on("versionchange").fire(n)})),i.onclose=Ct((function(t){e.on("close").fire(t)})),s&&function(e,t){var n=e.indexedDB,r=e.IDBKeyRange;!er(n)&&"__dbnames"!==t&&Zn(n,r).put({name:t}).catch(Le)}(e._deps,u),r()}),a)}))}))]).then((function(){return i(),t.onReadyBeingFired=[],dt.resolve(nr((function(){return e.on.ready.fire(e.vip)}))).then((function n(){if(t.onReadyBeingFired.length>0){var r=t.onReadyBeingFired.reduce(We,Le);return t.onReadyBeingFired=[],dt.resolve(nr((function(){return r(e.vip)}))).then(n)}}))})).finally((function(){t.onReadyBeingFired=null,t.isBeingOpened=!1})).then((function(){return e})).catch((function(n){t.dbOpenError=n;try{o&&o.abort()}catch(e){}return r===t.openCanceller&&e._close(),$t(n)})).finally((function(){t.openComplete=!0,a()}))}(this)},e.prototype._close=function(){var e=this._state,t=Yt.indexOf(this);if(t>=0&&Yt.splice(t,1),this.idbdb){try{this.idbdb.close()}catch(e){}this._novip.idbdb=null}e.dbReadyPromise=new dt((function(t){e.dbReadyResolve=t})),e.openCanceller=new dt((function(t,n){e.cancelOpen=n}))},e.prototype.close=function(){this._close();var e=this._state;this._options.autoOpen=!1,e.dbOpenError=new Ke.DatabaseClosed,e.isBeingOpened&&e.cancelOpen(e.dbOpenError)},e.prototype.delete=function(){var e=this,t=arguments.length>0,n=this._state;return new dt((function(r,i){var a=function(){e.close();var t=e._deps.indexedDB.deleteDatabase(e.name);t.onsuccess=Ct((function(){tr(e._deps,e.name),r()})),t.onerror=An(i),t.onblocked=e._fireOnBlocked};if(t)throw new Ke.InvalidArgument("Arguments not allowed in db.delete()");n.isBeingOpened?n.dbReadyPromise.then(a):a()}))},e.prototype.backendDB=function(){return this.idbdb},e.prototype.isOpen=function(){return null!==this.idbdb},e.prototype.hasBeenClosed=function(){var e=this._state.dbOpenError;return e&&"DatabaseClosed"===e.name},e.prototype.hasFailed=function(){return null!==this._state.dbOpenError},e.prototype.dynamicallyOpened=function(){return this._state.autoSchema},Object.defineProperty(e.prototype,"tables",{get:function(){var e=this;return F(this._allTables).map((function(t){return e._allTables[t]}))},enumerable:!1,configurable:!0}),e.prototype.transaction=function(){var e=ar.apply(this,arguments);return this._transaction.apply(this,e)},e.prototype._transaction=function(e,t,n){var r=this,i=lt.trans;i&&i.db===this&&-1===e.indexOf("!")||(i=null);var a,o,s=-1!==e.indexOf("?");e=e.replace("!","").replace("?","");try{if(o=t.map((function(e){var t=e instanceof r.Table?e.name:e;if("string"!=typeof t)throw new TypeError("Invalid table argument to Dexie.transaction(). Only Table or String are allowed");return t})),"r"==e||"readonly"===e)a="readonly";else{if("rw"!=e&&"readwrite"!=e)throw new Ke.InvalidArgument("Invalid transaction mode: "+e);a="readwrite"}if(i){if("readonly"===i.mode&&"readwrite"===a){if(!s)throw new Ke.SubTransaction("Cannot enter a sub-transaction with READWRITE mode when parent transaction is READONLY");i=null}i&&o.forEach((function(e){if(i&&-1===i.storeNames.indexOf(e)){if(!s)throw new Ke.SubTransaction("Table "+e+" not included in parent transaction.");i=null}})),s&&i&&!i.active&&(i=null)}}catch(e){return i?i._promise(null,(function(t,n){n(e)})):$t(e)}var u=or.bind(null,this,a,o,i,n);return i?i._promise(a,u,"lock"):lt.trans?Ut(lt.transless,(function(){return r._whenReady(u)})):this._whenReady(u)},e.prototype.table=function(e){if(!G(this._allTables,e))throw new Ke.InvalidTable("Table "+e+" does not exist");return this._allTables[e]},e}(),_r="undefined"!=typeof Symbol&&"observable"in Symbol?Symbol.observable:"@@observable",Or=function(){function e(e){this._subscribe=e}return e.prototype.subscribe=function(e,t,n){return this._subscribe(e&&"function"!=typeof e?e:{next:e,error:t,complete:n})},e.prototype[_r]=function(){return this},e}();function Er(e,t){return F(t).forEach((function(n){vr(e[n]||(e[n]=new gr),t[n])})),e}try{xr={indexedDB:R.indexedDB||R.mozIndexedDB||R.webkitIndexedDB||R.msIndexedDB,IDBKeyRange:R.IDBKeyRange||R.webkitIDBKeyRange}}catch(e){xr={indexedDB:null,IDBKeyRange:null}}var Mr=Sr;function Cr(e){var t=Ir;try{Ir=!0,jn.storagemutated.fire(e)}finally{Ir=t}}W(Mr,N(N({},Ne),{delete:function(e){return new Mr(e,{addons:[]}).delete()},exists:function(e){return new Mr(e,{addons:[]}).open().then((function(e){return e.close(),!0})).catch("NoSuchDatabaseError",(function(){return!1}))},getDatabaseNames:function(e){try{return function(e){var t=e.indexedDB,n=e.IDBKeyRange;return er(t)?Promise.resolve(t.databases()).then((function(e){return e.map((function(e){return e.name})).filter((function(e){return"__dbnames"!==e}))})):Zn(t,n).toCollection().primaryKeys()}(Mr.dependencies).then(e)}catch(e){return $t(new Ke.MissingAPI)}},defineClass:function(){return function(e){q(this,e)}},ignoreTransaction:function(e){return lt.trans?Ut(lt.transless,e):e()},vip:nr,async:function(e){return function(){try{var t=ir(e.apply(this,arguments));return t&&"function"==typeof t.then?t:dt.resolve(t)}catch(e){return $t(e)}}},spawn:function(e,t,n){try{var r=ir(e.apply(n,t||[]));return r&&"function"==typeof r.then?r:dt.resolve(r)}catch(e){return $t(e)}},currentTransaction:{get:function(){return lt.trans||null}},waitFor:function(e,t){var n=dt.resolve("function"==typeof e?Mr.ignoreTransaction(e):e).timeout(t||6e4);return lt.trans?lt.trans.waitFor(n):n},Promise:dt,debug:{get:function(){return be},set:function(e){we(e,"dexie"===e?function(){return!0}:tn)}},derive:$,extend:q,props:W,override:Z,Events:sn,on:jn,liveQuery:function(e){return new Or((function(t){var n=me(e),r=!1,i={},a={},o={get closed(){return r},unsubscribe:function(){r=!0,jn.storagemutated.unsubscribe(l)}};t.start&&t.start(o);var s=!1,u=!1;function c(){return F(a).some((function(e){return i[e]&&function(e,t){var n=mr(t),r=n.next();if(r.done)return!1;for(var i=r.value,a=mr(e),o=a.next(i.from),s=o.value;!r.done&&!o.done;){if(yn(s.from,i.to)<=0&&yn(s.to,i.from)>=0)return!0;yn(i.from,s.from)<0?i=(r=n.next(s.from)).value:s=(o=a.next(i.from)).value}return!1}(i[e],a[e])}))}var l=function(e){Er(i,e),c()&&h()},h=function(){if(!s&&!r){i={};var f={},p=function(t){n&&Nt();var r=function(){return Dt(e,{subscr:t,trans:null})},i=lt.trans?Ut(lt.transless,r):r();return n&&i.then(Lt,Lt),i}(f);u||(jn("storagemutated",l),u=!0),s=!0,Promise.resolve(p).then((function(e){s=!1,r||(c()?h():(i={},a=f,t.next&&t.next(e)))}),(function(e){s=!1,t.error&&t.error(e),o.unsubscribe()}))}};return h(),o}))},extendObservabilitySet:Er,getByKeyPath:re,setByKeyPath:ie,delByKeyPath:function(e,t){"string"==typeof t?ie(e,t,void 0):"length"in t&&[].map.call(t,(function(t){ie(e,t,void 0)}))},shallowClone:ae,deepClone:he,getObjectDiff:cr,cmp:yn,asap:te,minKey:-Infinity,addons:[],connections:Yt,errnames:je,dependencies:xr,semVer:"3.2.2",version:"3.2.2".split(".").map((function(e){return parseInt(e)})).reduce((function(e,t,n){return e+t/Math.pow(10,2*n)}))})),Mr.maxKey=Ln(Mr.dependencies.IDBKeyRange),"undefined"!=typeof dispatchEvent&&"undefined"!=typeof addEventListener&&(jn("storagemutated",(function(e){var t;Ir||(Xt?(t=document.createEvent("CustomEvent")).initCustomEvent("x-storagemutated-1",!0,!0,e):t=new CustomEvent("x-storagemutated-1",{detail:e}),Ir=!0,dispatchEvent(t),Ir=!1)})),addEventListener("x-storagemutated-1",(function(e){Ir||Cr(e.detail)})));var Ir=!1;if("undefined"!=typeof BroadcastChannel){var Ar=new BroadcastChannel("x-storagemutated-1");jn("storagemutated",(function(e){Ir||Ar.postMessage(e)})),Ar.onmessage=function(e){e.data&&Cr(e.data)}}else if("undefined"!=typeof self&&"undefined"!=typeof navigator){jn("storagemutated",(function(e){try{Ir||("undefined"!=typeof localStorage&&localStorage.setItem("x-storagemutated-1",JSON.stringify({trig:Math.random(),changedParts:e})),"object"==typeof self.clients&&L([],self.clients.matchAll({includeUncontrolled:!0}),!0).forEach((function(t){return t.postMessage({type:"x-storagemutated-1",changedParts:e})})))}catch(e){}})),"undefined"!=typeof addEventListener&&addEventListener("storage",(function(e){if("x-storagemutated-1"===e.key){var t=JSON.parse(e.newValue);t&&Cr(t.changedParts)}}));var Pr=self.document&&navigator.serviceWorker;Pr&&Pr.addEventListener("message",(function(e){var t=e.data;t&&"x-storagemutated-1"===t.type&&Cr(t.changedParts)}))}dt.rejectionMapper=function(e,t){if(!e||e instanceof Ce||e instanceof TypeError||e instanceof SyntaxError||!e.name||!De[e.name])return e;var n=new De[e.name](t||e.message,e);return"stack"in e&&H(n,"stack",{get:function(){return this.inner.stack}}),n},we(be,tn);var jr,Tr=function(e){function t(t){var n;return(n=e.call(this,t)||this).version(1).stores({nodes:", value, updatedAt"}),n.nodes=n.table("nodes"),n}return i(t,e),t}(Sr),Kr=function(e){function n(t){var n;return void 0===t&&(t={}),(n=e.call(this)||this).config={},n.notStored=new Set,n.putQueue={},n.getQueue={},n.i=0,n.queue=0,n.throttledPut=p.throttle((function(){var e=Object.keys(n.putQueue),t=e.map((function(e){return n.notStored.delete(e),n.putQueue[e]}));n.db.nodes.bulkPut(t,e).catch((function(e){console.error(e)})),n.putQueue={}}),500),n.throttledGet=p.throttle((function(){var e=n.getQueue,t=Object.keys(e);n.db.nodes.bulkGet(t).then((function(n){for(var r=0;r=u.updatedAt||(r[s]=u)}n.put(e,r)}}))},a.savePath=function(e,t){void 0===t?(this.db.nodes.delete(e),this.notStored.add(e)):(this.notStored.delete(e),this.mergeAndSave(e,t))},a.handlePut=function(){var e=r(t().mark((function e(n){var r,i,a,o,s;return t().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:r=0,i=Object.entries(n.updatedNodes);case 1:if(!(r>t/4).toString(16):([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g,e)}())},e.getUniqueIdValidators=function(){return Br},e.isUniqueType=function(e){return Object.keys(Br).indexOf(e)>-1};var t=e.prototype;return t.isUniqueType=function(){return e.isUniqueType(this.type)},e.guessTypeOf=function(e){for(var t in Br)if(e.match(Br[t]))return t},e.equals=function(e,t){return e.equals(t)},t.equals=function(e){return e&&this.type===e.type&&this.value===e.value},t.uri=function(){return encodeURIComponent(this.value)+":"+encodeURIComponent(this.type)},e}();function zr(e){if(void 0===e&&(e=va.getKey()),"string"==typeof e)return Fr().user(e);if("object"==typeof e){var t=Fr().user(e.pub);return t.auth(e),t}}var Ur,Gr={read:!0,write:!0,admin:!1},Wr=function(){function e(e){var t=this;if(this.theirSecretUuids={},this.theirGroupSecrets={},this.secrets={},this.ourSecretChannelIds={},this.theirSecretChannelIds={},this.messages={},this.chatLinks={},this.groupSubscriptions={},this.directSubscriptions={},this.getParticipantsCallbacks={},this.myGroupSecret=e.myGroupSecret,e.chatLink&&this.useChatLink(e),"string"==typeof e.participants)this.addParticipant(e.participants,e.save);else if(Array.isArray(e.participants)){var n={};e.participants.forEach((function(e){return n[e]=Object.assign({},Gr)})),e.participants=n}"object"==typeof e.participants&&(Object.keys(e.participants).forEach((function(n){n!==va.getKey().pub&&t.addParticipant(n,e.save,Object.assign({},Gr,e.participants[n]))})),e.participants[va.getKey().pub]=e.participants[va.getKey().pub]||Object.assign({},Gr),e.uuid?(this.uuid=e.uuid,this.name=e.name):(e.uuid=qr.getUuid().value,this.uuid=e.uuid,e.participants[va.getKey().pub].admin=!0,e.participants[va.getKey().pub].founder=!0),this.getChatLinks({subscribe:!0})),this.participants=e.participants,e.uuid&&(this.putDirect("S"+this.uuid,this.getMyGroupSecret()),this.getMySecretUuid().then((function(e){t.putDirect(t.uuid,e)})),this.onTheirDirect(this.uuid,(function(e,n,r){t.theirSecretUuids[r]=e})),this.onTheirDirect("S"+this.uuid,(function(e,n,r){t.theirGroupSecrets[r]=e}))),this.onTheir("participants",(function(n,r,i){for(var a=!1,o=Object.keys(t.participants),s=0;s44)){t.next=5;break}return Fr().user().get("chats").get(a).put(null),t.abrupt("return");case 5:return t.next=7,w.gunOnceDefined(Fr().user().get("chats").get(a).get("pub"));case 7:return c=t.sent,t.next=10,x.decrypt(c,s);case 10:if(l=t.sent){t.next=13;break}return t.abrupt("return");case 13:l.pub||"string"==typeof l?i(new e({key:o,participants:l.pub||l,save:!1})):l.uuid&&l.participants&&l.myGroupSecret&&i(new e({key:o,participants:l.participants,uuid:l.uuid,myGroupSecret:l.myGroupSecret,save:!1}));case 14:case"end":return t.stop()}}),n)})));return function(e,t){return n.apply(this,arguments)}}(),Fr().user().get("chats").map(c);case 9:case"end":return n.stop()}}),n)})));return function(e,t){return n.apply(this,arguments)}}(),n.getMyGroupSecret=function(){return this.myGroupSecret||this.changeMyGroupSecret(),this.myGroupSecret},n.getOurSecretChannelId=function(){var e=r(t().mark((function e(n){var r;return t().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(this.ourSecretChannelIds[n]){e.next=7;break}return e.next=3,this.getSecret(n);case 3:return r=e.sent,e.next=6,w.getHash(r+n);case 6:this.ourSecretChannelIds[n]=e.sent;case 7:return e.abrupt("return",this.ourSecretChannelIds[n]);case 8:case"end":return e.stop()}}),e,this)})));return function(t){return e.apply(this,arguments)}}(),n.getTheirSecretChannelId=function(){var e=r(t().mark((function e(n){var r;return t().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(this.theirSecretChannelIds[n]){e.next=7;break}return e.next=3,this.getSecret(n);case 3:return r=e.sent,e.next=6,w.getHash(r+va.getKey().pub);case 6:this.theirSecretChannelIds[n]=e.sent;case 7:return e.abrupt("return",this.theirSecretChannelIds[n]);case 8:case"end":return e.stop()}}),e,this)})));return function(t){return e.apply(this,arguments)}}(),n.getMessages=function(){var e=r(t().mark((function e(n){var i,a=this;return t().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(this.getCurrentParticipants().forEach(function(){var e=r(t().mark((function e(r){var i,o;return t().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(r===va.getKey().pub){e.next=11;break}if(!a.uuid){e.next=7;break}return e.next=4,a.getTheirSecretUuid(r);case 4:i=e.sent,e.next=10;break;case 7:return e.next=9,a.getTheirSecretChannelId(r);case 9:i=e.sent;case 10:Fr().user(r).get("chats").get(i).get("msgs").map((function(e,t){a.messageReceived(n,e,a.uuid||r,!1,t,r)}));case 11:if(a.uuid){e.next=16;break}return e.next=14,a.getOurSecretChannelId(r);case 14:o=e.sent,zr().get("chats").get(o).get("msgs").map((function(e,t){a.messageReceived(n,e,r,!0,t,va.getKey().pub)}));case 16:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}()),!this.uuid){e.next=6;break}return e.next=4,this.getMySecretUuid();case 4:i=e.sent,zr().get("chats").get(i).get("msgs").map((function(e,t){a.messageReceived(n,e,a.uuid,!0,t,va.getKey().pub)}));case 6:case"end":return e.stop()}}),e,this)})));return function(t){return e.apply(this,arguments)}}(),n.messageReceived=function(){var e=r(t().mark((function e(n,r,i,a,o,s){var u,c,l;return t().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!this.messages[o]&&r){e.next=2;break}return e.abrupt("return");case 2:if(!this.uuid){e.next=8;break}return e.next=5,this.getTheirGroupSecret(s);case 5:e.t0=e.sent,e.next=11;break;case 8:return e.next=10,this.getSecret(i);case 10:e.t0=e.sent;case 11:return u=e.t0,e.next=14,x.decrypt(r,u);case 14:if("object"==typeof(c=e.sent)){e.next=17;break}return e.abrupt("return");case 17:l={selfAuthored:a,channelId:i,from:s},this.messages[o]=c,n(c,l);case 20:case"end":return e.stop()}}),e,this)})));return function(t,n,r,i,a,o){return e.apply(this,arguments)}}(),n.getLatestMsg=function(){var e=r(t().mark((function e(n){var i,a=this;return t().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:i=function(){var e=r(t().mark((function e(r,i){return t().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:a.latest?("string"==typeof a.latest.time?a.latest.time:a.latest.time.toISOString())new Date(r.getTime()-1e4)&&i=0?ni:0,$r().get("unseenMsgsTotal").put(ni)}},webPushSubscriptions:ii,subscribeToWebPush:function(){return li.apply(this,arguments)},getWebPushSubscriptions:function(){return di.apply(this,arguments)},removeSubscription:function(e){delete ii[e],Fr().user().get("webPushSubscriptions").get(e).put(null),hi()}};function ki(e){return Array.isArray?Array.isArray(e):"[object Array]"===Ci(e)}function Si(e){return"string"==typeof e}function _i(e){return"number"==typeof e}function Oi(e){return"object"==typeof e}function Ei(e){return null!=e}function Mi(e){return!e.trim().length}function Ci(e){return null==e?void 0===e?"[object Undefined]":"[object Null]":Object.prototype.toString.call(e)}const Ii=Object.prototype.hasOwnProperty;class Ai{constructor(e){this._keys=[],this._keyMap={};let t=0;e.forEach(e=>{let n=Pi(e);t+=n.weight,this._keys.push(n),this._keyMap[n.id]=n,t+=n.weight}),this._keys.forEach(e=>{e.weight/=t})}get(e){return this._keyMap[e]}keys(){return this._keys}toJSON(){return JSON.stringify(this._keys)}}function Pi(e){let t=null,n=null,r=null,i=1,a=null;if(Si(e)||ki(e))r=e,t=ji(e),n=Ti(e);else{if(!Ii.call(e,"name"))throw new Error("Missing name property in key");const o=e.name;if(r=o,Ii.call(e,"weight")&&(i=e.weight,i<=0))throw new Error((e=>`Property 'weight' in key '${e}' must be a positive integer`)(o));t=ji(o),n=Ti(o),a=e.getFn}return{path:t,id:n,weight:i,src:r,getFn:a}}function ji(e){return ki(e)?e:e.split(".")}function Ti(e){return ki(e)?e.join("."):e}var Ki={isCaseSensitive:!1,includeScore:!1,keys:[],shouldSort:!0,sortFn:(e,t)=>e.score===t.score?e.idx{if(Ei(e))if(t[a]){const o=e[t[a]];if(!Ei(o))return;if(a===t.length-1&&(Si(o)||_i(o)||function(e){return!0===e||!1===e||function(e){return Oi(e)&&null!==e}(e)&&"[object Boolean]"==Ci(e)}(o)))n.push(function(e){return null==e?"":function(e){if("string"==typeof e)return e;let t=e+"";return"0"==t&&1/e==-1/0?"-0":t}(e)}(o));else if(ki(o)){r=!0;for(let e=0,n=o.length;e{this._keysMap[e.id]=t})}create(){!this.isCreated&&this.docs.length&&(this.isCreated=!0,Si(this.docs[0])?this.docs.forEach((e,t)=>{this._addString(e,t)}):this.docs.forEach((e,t)=>{this._addObject(e,t)}),this.norm.clear())}add(e){const t=this.size();Si(e)?this._addString(e,t):this._addObject(e,t)}removeAt(e){this.records.splice(e,1);for(let t=e,n=this.size();t{let i=t.getFn?t.getFn(e):this.getFn(e,t.path);if(Ei(i))if(ki(i)){let e=[];const t=[{nestedArrIndex:-1,value:i}];for(;t.length;){const{nestedArrIndex:n,value:r}=t.pop();if(Ei(r))if(Si(r)&&!Mi(r)){let t={v:r,i:n,n:this.norm.get(r)};e.push(t)}else ki(r)&&r.forEach((e,n)=>{t.push({nestedArrIndex:n,value:e})})}n.$[r]=e}else if(Si(i)&&!Mi(i)){let e={v:i,n:this.norm.get(i)};n.$[r]=e}}),this.records.push(n)}toJSON(){return{keys:this.keys,records:this.records}}}function Li(e,t,{getFn:n=Ki.getFn,fieldNormWeight:r=Ki.fieldNormWeight}={}){const i=new Ni({getFn:n,fieldNormWeight:r});return i.setKeys(e.map(Pi)),i.setSources(t),i.create(),i}function Ri(e,{errors:t=0,currentLocation:n=0,expectedLocation:r=0,distance:i=Ki.distance,ignoreLocation:a=Ki.ignoreLocation}={}){const o=t/e.length;if(a)return o;const s=Math.abs(r-n);return i?o+s/i:s?1:o}function Fi(e){let t={};for(let n=0,r=e.length;n{this.chunks.push({pattern:e,alphabet:Fi(e),startIndex:t})},l=this.pattern.length;if(l>32){let e=0;const t=l%32,n=l-t;for(;e{const{isMatch:d,score:g,indices:y}=function(e,t,n,{location:r=Ki.location,distance:i=Ki.distance,threshold:a=Ki.threshold,findAllMatches:o=Ki.findAllMatches,minMatchCharLength:s=Ki.minMatchCharLength,includeMatches:u=Ki.includeMatches,ignoreLocation:c=Ki.ignoreLocation}={}){if(t.length>32)throw new Error("Pattern length exceeds max of 32.");const l=t.length,h=e.length,f=Math.max(0,Math.min(r,h));let p=a,d=f;const g=s>1||u,y=g?Array(h):[];let v;for(;(v=e.indexOf(t,d))>-1;){let e=Ri(t,{currentLocation:v,expectedLocation:f,distance:i,ignoreLocation:c});if(p=Math.min(e,p),d=v+l,g){let e=0;for(;e=u;a-=1){let o=a-1,s=n[e.charAt(o)];if(g&&(y[o]=+!!s),k[a]=(k[a+1]<<1|1)&s,r&&(k[a]|=(m[a+1]|m[a])<<1|1|m[a+1]),k[a]&x&&(b=Ri(t,{errors:r,currentLocation:o,expectedLocation:f,distance:i,ignoreLocation:c}),b<=p)){if(p=b,d=o,d<=f)break;u=Math.max(1,2*f-d)}}if(Ri(t,{errors:r+1,currentLocation:f,expectedLocation:f,distance:i,ignoreLocation:c})>p)break;m=k}const k={isMatch:d>=0,score:Math.max(.001,b)};if(g){const e=function(e=[],t=Ki.minMatchCharLength){let n=[],r=-1,i=-1,a=0;for(let o=e.length;a=t&&n.push([r,i]),r=-1)}return e[a-1]&&a-r>=t&&n.push([r,a-1]),n}(y,s);e.length?u&&(k.indices=e):k.isMatch=!1}return k}(e,t,f,{location:r+p,distance:i,threshold:a,findAllMatches:o,minMatchCharLength:s,includeMatches:n,ignoreLocation:u});d&&(h=!0),l+=g,d&&y&&(c=[...c,...y])});let f={isMatch:h,score:h?l/this.chunks.length:1};return h&&n&&(f.indices=c),f}}class qi{constructor(e){this.pattern=e}static isMultiMatch(e){return zi(e,this.multiRegex)}static isSingleMatch(e){return zi(e,this.singleRegex)}search(){}}function zi(e,t){const n=e.match(t);return n?n[1]:null}class Ui extends qi{constructor(e,{location:t=Ki.location,threshold:n=Ki.threshold,distance:r=Ki.distance,includeMatches:i=Ki.includeMatches,findAllMatches:a=Ki.findAllMatches,minMatchCharLength:o=Ki.minMatchCharLength,isCaseSensitive:s=Ki.isCaseSensitive,ignoreLocation:u=Ki.ignoreLocation}={}){super(e),this._bitapSearch=new Bi(e,{location:t,threshold:n,distance:r,includeMatches:i,findAllMatches:a,minMatchCharLength:o,isCaseSensitive:s,ignoreLocation:u})}static get type(){return"fuzzy"}static get multiRegex(){return/^"(.*)"$/}static get singleRegex(){return/^(.*)$/}search(e){return this._bitapSearch.searchIn(e)}}class Gi extends qi{constructor(e){super(e)}static get type(){return"include"}static get multiRegex(){return/^'"(.*)"$/}static get singleRegex(){return/^'(.*)$/}search(e){let t,n=0;const r=[],i=this.pattern.length;for(;(t=e.indexOf(this.pattern,n))>-1;)n=t+i,r.push([t,n-1]);const a=!!r.length;return{isMatch:a,score:a?0:1,indices:r}}}const Wi=[class extends qi{constructor(e){super(e)}static get type(){return"exact"}static get multiRegex(){return/^="(.*)"$/}static get singleRegex(){return/^=(.*)$/}search(e){const t=e===this.pattern;return{isMatch:t,score:t?0:1,indices:[0,this.pattern.length-1]}}},Gi,class extends qi{constructor(e){super(e)}static get type(){return"prefix-exact"}static get multiRegex(){return/^\^"(.*)"$/}static get singleRegex(){return/^\^(.*)$/}search(e){const t=e.startsWith(this.pattern);return{isMatch:t,score:t?0:1,indices:[0,this.pattern.length-1]}}},class extends qi{constructor(e){super(e)}static get type(){return"inverse-prefix-exact"}static get multiRegex(){return/^!\^"(.*)"$/}static get singleRegex(){return/^!\^(.*)$/}search(e){const t=!e.startsWith(this.pattern);return{isMatch:t,score:t?0:1,indices:[0,e.length-1]}}},class extends qi{constructor(e){super(e)}static get type(){return"inverse-suffix-exact"}static get multiRegex(){return/^!"(.*)"\$$/}static get singleRegex(){return/^!(.*)\$$/}search(e){const t=!e.endsWith(this.pattern);return{isMatch:t,score:t?0:1,indices:[0,e.length-1]}}},class extends qi{constructor(e){super(e)}static get type(){return"suffix-exact"}static get multiRegex(){return/^"(.*)"\$$/}static get singleRegex(){return/^(.*)\$$/}search(e){const t=e.endsWith(this.pattern);return{isMatch:t,score:t?0:1,indices:[e.length-this.pattern.length,e.length-1]}}},class extends qi{constructor(e){super(e)}static get type(){return"inverse-exact"}static get multiRegex(){return/^!"(.*)"$/}static get singleRegex(){return/^!(.*)$/}search(e){const t=-1===e.indexOf(this.pattern);return{isMatch:t,score:t?0:1,indices:[0,e.length-1]}}},Ui],Ji=Wi.length,Hi=/ +(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)/,$i=new Set([Ui.type,Gi.type]),Vi=[];function Qi(e,t){for(let n=0,r=Vi.length;n!(!e.$and&&!e.$or),Xi=e=>({$and:Object.keys(e).map(t=>({[t]:e[t]}))});function Zi(e,t,{auto:n=!0}={}){const r=e=>{let i=Object.keys(e);const a=(e=>!!e.$path)(e);if(!a&&i.length>1&&!Yi(e))return r(Xi(e));if((e=>!ki(e)&&Oi(e)&&!Yi(e))(e)){const r=a?e.$path:i[0],o=a?e.$val:e[r];if(!Si(o))throw new Error((e=>"Invalid value for key "+e)(r));const s={keyId:Ti(r),pattern:o};return n&&(s.searcher=Qi(o,t)),s}let o={children:[],operator:i[0]};return i.forEach(t=>{const n=e[t];ki(n)&&n.forEach(e=>{o.children.push(r(e))})}),o};return Yi(e)||(e=Xi(e)),r(e)}function ea(e,t){const n=e.matches;t.matches=[],Ei(n)&&n.forEach(e=>{if(!Ei(e.indices)||!e.indices.length)return;const{indices:n,value:r}=e;let i={indices:n,value:r};e.key&&(i.key=e.key.src),e.idx>-1&&(i.refIndex=e.idx),t.matches.push(i)})}function ta(e,t){t.score=e.score}class na{constructor(e,t={},n){this.options={...Ki,...t},this._keyStore=new Ai(this.options.keys),this.setCollection(e,n)}setCollection(e,t){if(this._docs=e,t&&!(t instanceof Ni))throw new Error("Incorrect 'index' type");this._myIndex=t||Li(this.options.keys,this._docs,{getFn:this.options.getFn,fieldNormWeight:this.options.fieldNormWeight})}add(e){Ei(e)&&(this._docs.push(e),this._myIndex.add(e))}remove(e=(()=>!1)){const t=[];for(let n=0,r=this._docs.length;n{let n=1;e.matches.forEach(({key:e,norm:r,score:i})=>{const a=e?e.weight:null;n*=Math.pow(0===i&&a?Number.EPSILON:i,(a||1)*(t?1:r))}),e.score=n})}(s,{ignoreFieldNorm:o}),i&&s.sort(a),_i(t)&&t>-1&&(s=s.slice(0,t)),function(e,t,{includeMatches:n=Ki.includeMatches,includeScore:r=Ki.includeScore}={}){const i=[];return n&&i.push(ea),r&&i.push(ta),e.map(e=>{const{idx:n}=e,r={item:t[n],refIndex:n};return i.length&&i.forEach(t=>{t(e,r)}),r})}(s,this._docs,{includeMatches:n,includeScore:r})}_searchStringList(e){const t=Qi(e,this.options),{records:n}=this._myIndex,r=[];return n.forEach(({v:e,i:n,n:i})=>{if(!Ei(e))return;const{isMatch:a,score:o,indices:s}=t.searchIn(e);a&&r.push({item:e,idx:n,matches:[{score:o,value:e,norm:i,indices:s}]})}),r}_searchLogical(e){const t=Zi(e,this.options),n=(e,t,r)=>{if(!e.children){const{keyId:n,searcher:i}=e,a=this._findMatches({key:this._keyStore.get(n),value:this._myIndex.getValueForItemAtKeyId(t,n),searcher:i});return a&&a.length?[{idx:r,item:t,matches:a}]:[]}const i=[];for(let a=0,o=e.children.length;a{if(Ei(e)){let o=n(t,e,a);o.length&&(r[a]||(r[a]={idx:a,item:e,matches:[]},i.push(r[a])),o.forEach(({matches:e})=>{r[a].matches.push(...e)}))}}),i}_searchObjectList(e){const t=Qi(e,this.options),{keys:n,records:r}=this._myIndex,i=[];return r.forEach(({$:e,i:r})=>{if(!Ei(e))return;let a=[];n.forEach((n,r)=>{a.push(...this._findMatches({key:n,value:e[r],searcher:t}))}),a.length&&i.push({idx:r,item:e,matches:a})}),i}_findMatches({key:e,value:t,searcher:n}){if(!Ei(t))return[];let r=[];if(ki(t))t.forEach(({v:t,i:i,n:a})=>{if(!Ei(t))return;const{isMatch:o,score:s,indices:u}=n.searchIn(t);o&&r.push({score:s,key:e,value:t,idx:i,norm:a,indices:u})});else{const{v:i,n:a}=t,{isMatch:o,score:s,indices:u}=n.searchIn(i);o&&r.push({score:s,key:e,value:i,norm:a,indices:u})}return r}}na.version="6.6.2",na.createIndex=Li,na.parseIndex=function(e,{getFn:t=Ki.getFn,fieldNormWeight:n=Ki.fieldNormWeight}={}){const{keys:r,records:i}=e,a=new Ni({getFn:t,fieldNormWeight:n});return a.setKeys(r),a.setIndexRecords(i),a},na.config=Ki,na.parseQuery=Zi,function(...e){Vi.push(...e)}(class{constructor(e,{isCaseSensitive:t=Ki.isCaseSensitive,includeMatches:n=Ki.includeMatches,minMatchCharLength:r=Ki.minMatchCharLength,ignoreLocation:i=Ki.ignoreLocation,findAllMatches:a=Ki.findAllMatches,location:o=Ki.location,threshold:s=Ki.threshold,distance:u=Ki.distance}={}){this.query=null,this.options={isCaseSensitive:t,includeMatches:n,minMatchCharLength:r,findAllMatches:a,ignoreLocation:i,location:o,threshold:s,distance:u},this.pattern=t?e:e.toLowerCase(),this.query=function(e,t={}){return e.split("|").map(e=>{let n=e.trim().split(Hi).filter(e=>e&&!!e.trim()),r=[];for(let e=0,i=n.length;en&&(pa[t].followDistance=n),r&&pa[t].followers.add(r)):(pa[t]={key:t,followDistance:n,followers:new Set(r&&[r])},this.taskQueue.push((function(){zr(t).get("profile").get("name").on((function(n){pa[t].name=n,$r().get("contacts").get(t).get("name").put(n),e&&e(t,pa[t])}))}))),this.saveSearchResult(t),e&&e(t,pa[t]),this.updateSearchIndex(),this.updateNoFollows(),this.updateNoFollowers()},removeFollow:function(e,t,n){1===t&&($r().get("contacts").get(e).put(!1),$r().get("groups").get("follows").get(e).put(!1),pa[e]&&(pa[e].followers.delete(n),this.updateNoFollows(),this.updateNoFollowers())),pa[e]&&0===pa[e].followers.size&&(delete pa[e],$r().get("contacts").get(e).put(!1),$r().get("groups").get("everyone").get(e).put(!1))},getExtendedFollows:function(e,t,n,r){var i=this;void 0===t&&(t=ra.pub),void 0===n&&(n=3),void 0===r&&(r=1);var a=da.get(t);if(!(a&&a<=r))return da.set(t,r),this.addFollow(e,t,r-1),zr(t).get("follow").map((function(a,o){a?(i.addFollow(e,o,r,t),r0);e!==ca&&(ca=e,$r().get("noFollowers").put(ca))}),1e3,{leading:!0}),getSearchIndex:function(){return la},setOurOnlineStatus:function(){var e=window.location.hash;Wr.setActivity(sa="active");var t=p.debounce((function(){var t=Hr(e&&e.replace("#/profile/","").replace("#/chat/",""));t&&!sa&&t.setMyMsgsLastSeenTime(),Wr.setActivity(sa="active"),clearTimeout(oa),oa=setTimeout((function(){return Wr.setActivity(sa="online")}),3e4)}),1e3);document.addEventListener("touchmove",t),document.addEventListener("mousemove",t),document.addEventListener("keypress",t),document.addEventListener("visibilitychange",(function(){if("visible"===document.visibilityState){Wr.setActivity(sa="active");var t=location.pathname.slice(1).replace("chat/",""),n=e&&Hr(t);n&&(n.setMyMsgsLastSeenTime(),xi.changeChatUnseenCount(t,0))}else Wr.setActivity(sa="online")})),t(),window.addEventListener("beforeunload",(function(){Wr.setActivity(sa=null)}))},updateGroups:function(){var e=this;this.getExtendedFollows((function(t,n){n.followDistance<=1&&$r().get("groups").get("follows").get(t).put(!0),$r().get("groups").get("everyone").get(t).put(!0),t===e.getPubKey()&&e.updateNoFollowers()}))},login:function(e){var t=this;console.log("login",e);var n=!!ra;console.log("shouldRefresh",n,"key",ra),ra=e,localStorage.setItem("chatKeyPair",JSON.stringify(e)),zr().auth(ra),zr().put({epub:ra.epub}),xi.subscribeToWebPush(),xi.getWebPushSubscriptions(),Wr.getMyChatLinks(void 0,(function(e){$r().get("chatLinks").get(e.id).put(e.url),aa=e.url})),this.setOurOnlineStatus(),Wr.getChannels((function(e){return t.addChannel(e)})),zr().get("profile").get("name").on((function(e){e&&"string"==typeof e&&(ia=e)})),xi.init(),$r().get("loggedIn").put(!0),console.log("local().get('loggedIn').put(true);",$r()),$r().get("settings").once().then((function(e){e?void 0!==e.enableWebtorrent&&void 0!==e.autoplayWebtorrent||($r().get("settings").get("enableWebtorrent").put(ya.local.enableWebtorrent),$r().get("settings").get("autoplayWebtorrent").put(ya.local.autoplayWebtorrent)):$r().get("settings").put(ya.local)})),zr().get("block").map((function(e,t){$r().get("block").get(t).put(e),e&&delete pa[t]})),this.updateGroups(),n&&location.reload(),fa&&(fa.get("settings").on((function(e){$r().get("settings").get("electron").put(e)})),fa.get("user").put(ra.pub)),$r().get("filters").get("group").once().then((function(e){e||$r().get("filters").get("group").put("follows")}))},loginAsNewUser:function(e){var t=this;void 0===e&&(e={});var n=e.name||w.generateName();return console.log("loginAsNewUser name",n),x.generate().then((function(r){t.login(r),zr().get("profile").put({a:null}),zr().get("profile").get("name").put(n),$r().get("filters").put({a:null}),$r().get("filters").get("group").put("follows"),Wr.createChatLink().then((function(e){return aa=e})),setTimeout((function(){!1!==e.autofollow&&(console.log("autofollowing",ga),zr().get("follow").get(ga).put(!0))}),1e3)}))},logOut:function(){var e=this;return r(t().mark((function n(){var r,i,a;return t().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(fa&&fa.get("user").put(null),!navigator.serviceWorker){t.next=16;break}return t.next=4,navigator.serviceWorker.getRegistration();case 4:if(!(r=t.sent)||!r.pushManager){t.next=16;break}return null==(i=r.active)||i.postMessage({key:null}),t.next=9,r.pushManager.getSubscription();case 9:if(!(a=t.sent)){t.next=16;break}return t.next=13,w.getHash(JSON.stringify(a));case 13:xi.removeSubscription(t.sent),a.unsubscribe&&a.unsubscribe();case 16:e.clearIndexedDB(),localStorage.clear(),window.location.hash="",window.location.href="/",location.reload();case 21:case"end":return t.stop()}}),n)})))()},clearIndexedDB:function(){return new Promise((function(e){var t=window.indexedDB.deleteDatabase("local()"),n=window.indexedDB.deleteDatabase("radata"),r=!1,i=!1,a=function(){r&&i&&e(void 0)};t.onerror=n.onerror=function(e){return console.error(e)},t.onsuccess=function(){r=!0,a()},n.onsuccess=function(){i=!0,a()}}))},getMyChatLink:function(){return aa||w.getProfileLink(ra.pub)},getKey:function(){return ra},getPubKey:function(){return ra&&ra.pub},getMyName:function(){return ia},myPeerUrl:function(e){return"http://"+e+":8767/gun"},shareMyPeerUrl:function(e){var n=this;return r(t().mark((function r(){var i;return t().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,$r().get("settings").get("electron").get("publicIp").once();case 2:(i=t.sent)&&e.put&&e.put("my_peer",n.myPeerUrl(i));case 4:case"end":return t.stop()}}),r)})))()},newChannel:function(e,t){if(e&&!this.channelIds.has(e)){var n=Hr(e,t);return this.addChannel(n),n}},addChannel:function(e){var t=this;this.taskQueue.push((function(){var n=e.getId();if(!t.channelIds.has(n)){t.channelIds.add(n);var r=$r().get("channels").get(n);if(r.get("latestTime").on((function(t){t&&(!e.latestTime||t>e.latestTime)&&(e.latestTime=t)})),r.get("theirMsgsLastSeenTime").on((function(t){if(t){var n=new Date(t);(!e.theirMsgsLastSeenDate||e.theirMsgsLastSeenDate=e.theirMsgsLastSeenTime&&(e.theirMsgsLastSeenTime=t,r.get("theirMsgsLastSeenTime").put(t))})),e.getMyMsgsLastSeenTime((function(t){e.myLastSeenTime=new Date(t),e.latest&&e.myLastSeenTime>=e.latest.time&&xi.changeChatUnseenCount(n,0)})),e.isTyping=!1,e.getTyping((function(t){e.isTyping=t,$r().get("channels").get(n).get("isTyping").put(t)})),e.online={},Wr.getActivity(n,(function(t){e&&(r.put({theirLastActiveTime:t&&t.lastActive,activity:t&&t.isActive&&t.status}),e.activity=t)})),e.uuid){var i=window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches;e.participantProfiles={},e.on("name",(function(t){e.name=t,pa[e.uuid]={name:t,uuid:e.uuid},$r().get("channels").get(e.uuid).get("name").put(t)})),e.on("photo",(function(t){pa[e.uuid]=pa[e.uuid]||{},pa[e.uuid].photo=t,$r().get("channels").get(e.uuid).get("photo").put(t)})),e.on("about",(function(t){return $r().get("channels").get(e.uuid).get("about").put(t)})),e.getParticipants((function(t){if(delete t.undefined,"object"==typeof t){var n=Object.keys(t);n.forEach((function(r,a){var o=360/Math.max(n.length,2)*a;e.participantProfiles[r]={permissions:t[r],color:"hsl("+o+", 98%, "+(i?80:33)+"%)"},zr(r).get("profile").get("name").on((function(t){e.participantProfiles[r].name=t}))}))}$r().get("channels").get(e.uuid).get("participants").put(t)})),e.inviteLinks={},e.getChatLinks({callback:function(t){var n=t.url,r=t.id;console.log("got chat link",r,n),e.inviteLinks[r]=n,$r().get("inviteLinksChanged").put(!0)}})}else zr(n).get("profile").get("name").on((function(e){return $r().get("channels").get(n).get("name").put(e)}));if(e.put){e.onTheir("webPushSubscriptions",(function(t,r,i){Array.isArray(t)&&(e.webPushSubscriptions=e.webPushSubscriptions||{},e.webPushSubscriptions[i||n]=t)}));var a=Object.values(xi.webPushSubscriptions);setTimeout((function(){return e.put("webPushSubscriptions",a)}),5e3),t.shareMyPeerUrl(e)}e.onTheir("call",(function(e){$r().get("call").put({pub:n,call:e})})),$r().get("channels").get(n).put({enabled:!0})}}))},processMessage:function(e,t,n,r){var i=Hr(e);i.messageIds=i.messageIds||{},i.messageIds[t.time+n.from]||(i.messageIds[t.time+n.from]=!0,n&&(t=Object.assign(t,n)),t.invite?this.newChannel(t.invite.group,"https://iris.to/?channelId="+t.invite.group+"&inviter="+e):(t.selfAuthored=n.selfAuthored,$r().get("channels").get(e).get("msgs").get(t.time+(t.from&&t.from.slice(0,10))).put(JSON.stringify(t)),t.timeObj=new Date(t.time),!n.selfAuthored&&t.timeObj>i.myLastSeenTime&&(window.location.hash!=="#/chat/"+e||"visible"!==document.visibilityState?xi.changeChatUnseenCount(e,1):"active"===sa&&i.setMyMsgsLastSeenTime()),!n.selfAuthored&&t.time>i.theirMsgsLastSeenTime&&$r().get("channels").get(e).get("theirMsgsLastSeenTime").put(t.time),(!i.latestTime||t.time>i.latestTime)&&$r().get("channels").get(e).put({latestTime:t.time,latest:{time:t.time,text:t.text,selfAuthored:n.selfAuthored}}),xi.notifyMsg(t,n,e,r)))},subscribeToMsgs:function(e){var t=this,n=Hr(e);n.subscribed||(n.subscribed=!0,n.getMessages((function(n,r){t.processMessage(e,n,r)})))},channelIds:new Set},ma={get:function(e,t){return new Promise((function(n,r){e||r("No hash provided"),"string"!=typeof e&&r("Hash must be a string"),Fr().get("#").get(e).on((function(e,r,i,a){e&&(a.off(),t&&t(e),n(e))}))}))},put:function(e){return r(t().mark((function n(){var r;return t().wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,w.getHash(e);case 2:return r=t.sent,Fr().get("#").get(r).put(e),t.abrupt("return",r);case 5:case"end":return t.stop()}}),n)})))()}},ba="Invalid message:",wa=function(e){function t(){return e.apply(this,arguments)||this}return i(t,e),t}(c(Error)),xa=function(){function e(e){if(this.signedData=e.signedData,this.pubKey=e.pubKey,e.sig){if("string"!=typeof e.sig)throw new wa("SignedMessage signature must be a string");this.sig=e.sig,this.getHash()}this._validate()}var n=e.prototype;return n.getSignerKeyID=function(){return this.pubKey},n._validate=function(){if(!this.signedData)throw new wa(ba+" Missing signedData");if("object"!=typeof this.signedData)throw new wa(ba+" signedData must be an object");var e=this.signedData;if(!e.type)throw new wa(ba+" Missing type definition");if(!e.author)throw new wa(ba+" Missing author");if("object"!=typeof e.author)throw new wa(ba+" Author must be object");if(Array.isArray(e.author))throw new wa(ba+" Author must not be an array");if(0===Object.keys(e.author).length)throw new wa(ba+" Author empty");for(var t in this.pubKey&&(this.signerKeyHash=this.getSignerKeyID()),e.author){var n=typeof e.author[t];if("string"!==n){if(!Array.isArray(e.author[t]))throw new wa(ba+" Author attribute must be string or array, got "+t+": "+e.author[t]);for(var r=0;r l){\n\t\t\t\tctx.end = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif(w){\n\t\t\t\ti = s.indexOf('\"', i-1); c = s[i];\n\t\t\t\ttmp = 0; while('\\\\' == s[i-(++tmp)]){}; tmp = !(tmp % 2);//tmp = ('\\\\' == s[i-1]); // json is stupid\n\t\t\t\tb = b || tmp;\n\t\t\t\tif('\"' == c && !tmp){\n\t\t\t\t\tw = u;\n\t\t\t\t\ttmp = ctx.s;\n\t\t\t\t\tif(ctx.a){\n\t\t\t\t\t\ttmp = s.slice(ctx.sl, i);\n\t\t\t\t\t\tif(b || (1+tmp.indexOf('\\\\'))){ tmp = JSON.parse('\"'+tmp+'\"') } // escape + unicode :( handling\n\t\t\t\t\t\tif(ctx.at instanceof Array){\n\t\t\t\t\t\t\tctx.at.push(ctx.s = tmp);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tif(!ctx.at){ ctx.end = j = M; tmp = u }\n\t\t\t\t\t\t\t(ctx.at||{})[ctx.s] = ctx.s = tmp;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tctx.s = u;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tctx.s = s.slice(ctx.sl, i);\n\t\t\t\t\t\tif(b || (1+ctx.s.indexOf('\\\\'))){ ctx.s = JSON.parse('\"'+ctx.s+'\"'); } // escape + unicode :( handling\n\t\t\t\t\t}\n\t\t\t\t\tctx.a = b = u;\n\t\t\t\t}\n\t\t\t\t++i;\n\t\t\t} else {\n\t\t\t\tswitch(c){\n\t\t\t\tcase '\"':\n\t\t\t\t\tctx.sl = i;\n\t\t\t\t\tw = true;\n\t\t\t\t\tbreak;\n\t\t\t\tcase ':':\n\t\t\t\t\tctx.ai = i;\n\t\t\t\t\tctx.a = true;\n\t\t\t\t\tbreak;\n\t\t\t\tcase ',':\n\t\t\t\t\tif(ctx.a || ctx.at instanceof Array){\n\t\t\t\t\t\tif(tmp = s.slice(ctx.ai, i-1)){\n\t\t\t\t\t\t\tif(u !== (tmp = value(tmp))){\n\t\t\t\t\t\t\t\tif(ctx.at instanceof Array){\n\t\t\t\t\t\t\t\t\tctx.at.push(tmp);\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tctx.at[ctx.s] = tmp;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tctx.a = u;\n\t\t\t\t\tif(ctx.at instanceof Array){\n\t\t\t\t\t\tctx.a = true;\n\t\t\t\t\t\tctx.ai = i;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase '{':\n\t\t\t\t\tctx.up.push(ctx.at||(ctx.at = {}));\n\t\t\t\t\tif(ctx.at instanceof Array){\n\t\t\t\t\t\tctx.at.push(ctx.at = {});\n\t\t\t\t\t} else\n\t\t\t\t\tif(u !== (tmp = ctx.s)){\n\t\t\t\t\t\tctx.at[tmp] = ctx.at = {};\n\t\t\t\t\t}\n\t\t\t\t\tctx.a = u;\n\t\t\t\t\tbreak;\n\t\t\t\tcase '}':\n\t\t\t\t\tif(ctx.a){\n\t\t\t\t\t\tif(tmp = s.slice(ctx.ai, i-1)){\n\t\t\t\t\t\t\tif(u !== (tmp = value(tmp))){\n\t\t\t\t\t\t\t\tif(ctx.at instanceof Array){\n\t\t\t\t\t\t\t\t\tctx.at.push(tmp);\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tif(!ctx.at){ ctx.end = j = M; tmp = u }\n\t\t\t\t\t\t\t\t\t(ctx.at||{})[ctx.s] = tmp;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tctx.a = u;\n\t\t\t\t\tctx.at = ctx.up.pop();\n\t\t\t\t\tbreak;\n\t\t\t\tcase '[':\n\t\t\t\t\tif(u !== (tmp = ctx.s)){\n\t\t\t\t\t\tctx.up.push(ctx.at);\n\t\t\t\t\t\tctx.at[tmp] = ctx.at = [];\n\t\t\t\t\t} else\n\t\t\t\t\tif(!ctx.at){\n\t\t\t\t\t\tctx.up.push(ctx.at = []);\n\t\t\t\t\t}\n\t\t\t\t\tctx.a = true;\n\t\t\t\t\tctx.ai = i;\n\t\t\t\t\tbreak;\n\t\t\t\tcase ']':\n\t\t\t\t\tif(ctx.a){\n\t\t\t\t\t\tif(tmp = s.slice(ctx.ai, i-1)){\n\t\t\t\t\t\t\tif(u !== (tmp = value(tmp))){\n\t\t\t\t\t\t\t\tif(ctx.at instanceof Array){\n\t\t\t\t\t\t\t\t\tctx.at.push(tmp);\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tctx.at[ctx.s] = tmp;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tctx.a = u;\n\t\t\t\t\tctx.at = ctx.up.pop();\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tctx.s = u;\n\t\tctx.i = i;\n\t\tctx.w = w;\n\t\tif(ctx.end){\n\t\t\ttmp = ctx.at;\n\t\t\tif(u === tmp){\n\t\t\t\ttry{ tmp = JSON.parse(text)\n\t\t\t\t}catch(e){ return ctx.done(e) }\n\t\t\t}\n\t\t\tctx.done(u, tmp);\n\t\t} else {\n\t\t\tsI(parse);\n\t\t}\n\t}\n}\nfunction value(s){\n\tvar n = parseFloat(s);\n\tif(!isNaN(n)){\n\t\treturn n;\n\t}\n\ts = s.trim();\n\tif('true' == s){\n\t\treturn true;\n\t}\n\tif('false' == s){\n\t\treturn false;\n\t}\n\tif('null' == s){\n\t\treturn null;\n\t}\n}\n\nyson.stringifyAsync = function(data, done, replacer, space, ctx){\n\t//try{done(u, JSON.stringify(data, replacer, space))}catch(e){done(e)}return;\n\tctx = ctx || {};\n\tctx.text = ctx.text || \"\";\n\tctx.up = [ctx.at = {d: data}];\n\tctx.done = done;\n\tctx.i = 0;\n\tvar j = 0;\n\tify();\n\tfunction ify(){\n\t\tvar at = ctx.at, data = at.d, add = '', tmp;\n\t\tif(at.i && (at.i - at.j) > 0){ add += ',' }\n\t\tif(u !== (tmp = at.k)){ add += JSON.stringify(tmp) + ':' } //'\"'+tmp+'\":' } // only if backslash\n\t\tswitch(typeof data){\n\t\tcase 'boolean':\n\t\t\tadd += ''+data;\n\t\t\tbreak;\n\t\tcase 'string':\n\t\t\tadd += JSON.stringify(data); //ctx.text += '\"'+data+'\"';//JSON.stringify(data); // only if backslash\n\t\t\tbreak;\n\t\tcase 'number':\n\t\t\tadd += (isNaN(data)? 'null' : data);\n\t\t\tbreak;\n\t\tcase 'object':\n\t\t\tif(!data){\n\t\t\t\tadd += 'null';\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif(data instanceof Array){\t\n\t\t\t\tadd += '[';\n\t\t\t\tat = {i: -1, as: data, up: at, j: 0};\n\t\t\t\tat.l = data.length;\n\t\t\t\tctx.up.push(ctx.at = at);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif('function' != typeof (data||'').toJSON){\n\t\t\t\tadd += '{';\n\t\t\t\tat = {i: -1, ok: Object.keys(data).sort(), as: data, up: at, j: 0};\n\t\t\t\tat.l = at.ok.length;\n\t\t\t\tctx.up.push(ctx.at = at);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif(tmp = data.toJSON()){\n\t\t\t\tadd += tmp;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t// let this & below pass into default case...\n\t\tcase 'function':\n\t\t\tif(at.as instanceof Array){\n\t\t\t\tadd += 'null';\n\t\t\t\tbreak;\n\t\t\t}\n\t\tdefault: // handle wrongly added leading `,` if previous item not JSON-able.\n\t\t\tadd = '';\n\t\t\tat.j++;\n\t\t}\n\t\tctx.text += add;\n\t\twhile(1+at.i >= at.l){\n\t\t\tctx.text += (at.ok? '}' : ']');\n\t\t\tat = ctx.at = at.up;\n\t\t}\n\t\tif(++at.i < at.l){\n\t\t\tif(tmp = at.ok){\n\t\t\t\tat.d = at.as[at.k = tmp[at.i]];\n\t\t\t} else {\n\t\t\t\tat.d = at.as[at.i];\n\t\t\t}\n\t\t\tif(++j < 9){ return ify() } else { j = 0 }\n\t\t\tsI(ify);\n\t\t\treturn;\n\t\t}\n\t\tctx.done(u, ctx.text);\n\t}\n}\nif(typeof window != ''+u){ window.YSON = yson }\ntry{ if(typeof module != ''+u){ module.exports = yson } }catch(e){}\nif(typeof JSON != ''+u){\n\tJSON.parseAsync = yson.parseAsync;\n\tJSON.stringifyAsync = yson.stringifyAsync;\n}\n\n}());",";(function(){\n\n /* UNBUILD */\n function USE(arg, req){\n return req? require(arg) : arg.slice? USE[R(arg)] : function(mod, path){\n arg(mod = {exports: {}});\n USE[R(path)] = mod.exports;\n }\n function R(p){\n return p.split('/').slice(-1).toString().replace('.js','');\n }\n }\n if(typeof module !== \"undefined\"){ var MODULE = module }\n /* UNBUILD */\n\n\t;USE(function(module){\n\t\t// Shim for generic javascript utilities.\n\t\tString.random = function(l, c){\n\t\t\tvar s = '';\n\t\t\tl = l || 24; // you are not going to make a 0 length random number, so no need to check type\n\t\t\tc = c || '0123456789ABCDEFGHIJKLMNOPQRSTUVWXZabcdefghijklmnopqrstuvwxyz';\n\t\t\twhile(l-- > 0){ s += c.charAt(Math.floor(Math.random() * c.length)) }\n\t\t\treturn s;\n\t\t}\n\t\tString.match = function(t, o){ var tmp, u;\n\t\t\tif('string' !== typeof t){ return false }\n\t\t\tif('string' == typeof o){ o = {'=': o} }\n\t\t\to = o || {};\n\t\t\ttmp = (o['='] || o['*'] || o['>'] || o['<']);\n\t\t\tif(t === tmp){ return true }\n\t\t\tif(u !== o['=']){ return false }\n\t\t\ttmp = (o['*'] || o['>']);\n\t\t\tif(t.slice(0, (tmp||'').length) === tmp){ return true }\n\t\t\tif(u !== o['*']){ return false }\n\t\t\tif(u !== o['>'] && u !== o['<']){\n\t\t\t\treturn (t >= o['>'] && t <= o['<'])? true : false;\n\t\t\t}\n\t\t\tif(u !== o['>'] && t >= o['>']){ return true }\n\t\t\tif(u !== o['<'] && t <= o['<']){ return true }\n\t\t\treturn false;\n\t\t}\n\t\tString.hash = function(s, c){ // via SO\n\t\t\tif(typeof s !== 'string'){ return }\n\t c = c || 0; // CPU schedule hashing by\n\t if(!s.length){ return c }\n\t for(var i=0,l=s.length,n; i= (check.now() - l)) && c++ < 3333){ f(); return }\n\t\t\t\tsI(function(){ l = check.now(); f() },c=0)\n\t\t\t}\n\t\t}());\n\t\t;(function(){ // Too many polls block, this \"threads\" them in turns over a single thread in time.\n\t\t\tvar sT = setTimeout, t = sT.turn = sT.turn || function(f){ 1 == s.push(f) && p(T) }\n\t\t\t, s = t.s = [], p = sT.poll, i = 0, f, T = function(){\n\t\t\t\tif(f = s[i++]){ f() }\n\t\t\t\tif(i == s.length || 99 == i){\n\t\t\t\t\ts = t.s = s.slice(i);\n\t\t\t\t\ti = 0;\n\t\t\t\t}\n\t\t\t\tif(s.length){ p(T) }\n\t\t\t}\n\t\t}());\n\t\t;(function(){\n\t\t\tvar u, sT = setTimeout, T = sT.turn;\n\t\t\t(sT.each = sT.each || function(l,f,e,S){ S = S || 9; (function t(s,L,r){\n\t\t\t if(L = (s = (l||[]).splice(0,S)).length){\n\t\t\t \tfor(var i = 0; i < L; i++){\n\t\t\t \t\tif(u !== (r = f(s[i]))){ break }\n\t\t\t \t}\n\t\t\t \tif(u === r){ T(t); return }\n\t\t\t } e && e(r);\n\t\t\t}())})();\n\t\t}());\n\t})(USE, './shim');\n\n\t;USE(function(module){\n\t\t// On event emitter generic javascript utility.\n\t\tmodule.exports = function onto(tag, arg, as){\n\t\t\tif(!tag){ return {to: onto} }\n\t\t\tvar u, f = 'function' == typeof arg, tag = (this.tag || (this.tag = {}))[tag] || f && (\n\t\t\t\tthis.tag[tag] = {tag: tag, to: onto._ = { next: function(arg){ var tmp;\n\t\t\t\t\tif(tmp = this.to){ tmp.next(arg) }\n\t\t\t}}});\n\t\t\tif(f){\n\t\t\t\tvar be = {\n\t\t\t\t\toff: onto.off ||\n\t\t\t\t\t(onto.off = function(){\n\t\t\t\t\t\tif(this.next === onto._.next){ return !0 }\n\t\t\t\t\t\tif(this === this.the.last){\n\t\t\t\t\t\t\tthis.the.last = this.back;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.to.back = this.back;\n\t\t\t\t\t\tthis.next = onto._.next;\n\t\t\t\t\t\tthis.back.to = this.to;\n\t\t\t\t\t\tif(this.the.last === this.the){\n\t\t\t\t\t\t\tdelete this.on.tag[this.the.tag];\n\t\t\t\t\t\t}\n\t\t\t\t\t}),\n\t\t\t\t\tto: onto._,\n\t\t\t\t\tnext: arg,\n\t\t\t\t\tthe: tag,\n\t\t\t\t\ton: this,\n\t\t\t\t\tas: as,\n\t\t\t\t};\n\t\t\t\t(be.back = tag.last || tag).to = be;\n\t\t\t\treturn tag.last = be;\n\t\t\t}\n\t\t\tif((tag = tag.to) && u !== arg){ tag.next(arg) }\n\t\t\treturn tag;\n\t\t};\n\t})(USE, './onto');\n\n\t;USE(function(module){\n\t\t// Valid values are a subset of JSON: null, binary, number (!Infinity), text,\n\t\t// or a soul relation. Arrays need special algorithms to handle concurrency,\n\t\t// so they are not supported directly. Use an extension that supports them if\n\t\t// needed but research their problems first.\n\t\tmodule.exports = function (v) {\n\t\t // \"deletes\", nulling out keys.\n\t\t return v === null ||\n\t\t\t\"string\" === typeof v ||\n\t\t\t\"boolean\" === typeof v ||\n\t\t\t// we want +/- Infinity to be, but JSON does not support it, sad face.\n\t\t\t// can you guess what v === v checks for? ;)\n\t\t\t(\"number\" === typeof v && v != Infinity && v != -Infinity && v === v) ||\n\t\t\t(!!v && \"string\" == typeof v[\"#\"] && Object.keys(v).length === 1 && v[\"#\"]);\n\t\t}\n\t})(USE, './valid');\n\n\t;USE(function(module){\n\t\tUSE('./shim');\n\t\tfunction State(){\n\t\t\tvar t = +new Date;\n\t\t\tif(last < t){\n\t\t\t\treturn N = 0, last = t + State.drift;\n\t\t\t}\n\t\t\treturn last = t + ((N += 1) / D) + State.drift;\n\t\t}\n\t\tState.drift = 0;\n\t\tvar NI = -Infinity, N = 0, D = 999, last = NI, u; // WARNING! In the future, on machines that are D times faster than 2016AD machines, you will want to increase D by another several orders of magnitude so the processing speed never out paces the decimal resolution (increasing an integer effects the state accuracy).\n\t\tState.is = function(n, k, o){ // convenience function to get the state on a key on a node and return it.\n\t\t\tvar tmp = (k && n && n._ && n._['>']) || o;\n\t\t\tif(!tmp){ return }\n\t\t\treturn ('number' == typeof (tmp = tmp[k]))? tmp : NI;\n\t\t}\n\t\tState.ify = function(n, k, s, v, soul){ // put a key's state on a node.\n\t\t\t(n = n || {})._ = n._ || {}; // safety check or init.\n\t\t\tif(soul){ n._['#'] = soul } // set a soul if specified.\n\t\t\tvar tmp = n._['>'] || (n._['>'] = {}); // grab the states data.\n\t\t\tif(u !== k && k !== '_'){\n\t\t\t\tif('number' == typeof s){ tmp[k] = s } // add the valid state.\n\t\t\t\tif(u !== v){ n[k] = v } // Note: Not its job to check for valid values!\n\t\t\t}\n\t\t\treturn n;\n\t\t}\n\t\tmodule.exports = State;\n\t})(USE, './state');\n\n\t;USE(function(module){\n\t\tUSE('./shim');\n\t\tfunction Dup(opt){\n\t\t\tvar dup = {s:{}}, s = dup.s;\n\t\t\topt = opt || {max: 999, age: 1000 * 9};//*/ 1000 * 9 * 3};\n\t\t\tdup.check = function(id){\n\t\t\t\tif(!s[id]){ return false }\n\t\t\t\treturn dt(id);\n\t\t\t}\n\t\t\tvar dt = dup.track = function(id){\n\t\t\t\tvar it = s[id] || (s[id] = {});\n\t\t\t\tit.was = dup.now = +new Date;\n\t\t\t\tif(!dup.to){ dup.to = setTimeout(dup.drop, opt.age + 9) }\n\t\t\t\tif(dt.ed){ dt.ed(id) }\n\t\t\t\treturn it;\n\t\t\t}\n\t\t\tdup.drop = function(age){\n\t\t\t\tdup.to = null;\n\t\t\t\tdup.now = +new Date;\n\t\t\t\tvar l = Object.keys(s);\n\t\t\t\tconsole.STAT && console.STAT(dup.now, +new Date - dup.now, 'dup drop keys'); // prev ~20% CPU 7% RAM 300MB // now ~25% CPU 7% RAM 500MB\n\t\t\t\tsetTimeout.each(l, function(id){ var it = s[id]; // TODO: .keys( is slow?\n\t\t\t\t\tif(it && (age || opt.age) > (dup.now - it.was)){ return }\n\t\t\t\t\tdelete s[id];\n\t\t\t\t},0,99);\n\t\t\t}\n\t\t\treturn dup;\n\t\t}\n\t\tmodule.exports = Dup;\n\t})(USE, './dup');\n\n\t;USE(function(module){\n\t\t// request / response module, for asking and acking messages.\n\t\tUSE('./onto'); // depends upon onto!\n\t\tmodule.exports = function ask(cb, as){\n\t\t\tif(!this.on){ return }\n\t\t\tvar lack = (this.opt||{}).lack || 9000;\n\t\t\tif(!('function' == typeof cb)){\n\t\t\t\tif(!cb){ return }\n\t\t\t\tvar id = cb['#'] || cb, tmp = (this.tag||'')[id];\n\t\t\t\tif(!tmp){ return }\n\t\t\t\tif(as){\n\t\t\t\t\ttmp = this.on(id, as);\n\t\t\t\t\tclearTimeout(tmp.err);\n\t\t\t\t\ttmp.err = setTimeout(function(){ tmp.off() }, lack);\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tvar id = (as && as['#']) || random(9);\n\t\t\tif(!cb){ return id }\n\t\t\tvar to = this.on(id, cb, as);\n\t\t\tto.err = to.err || setTimeout(function(){ to.off();\n\t\t\t\tto.next({err: \"Error: No ACK yet.\", lack: true});\n\t\t\t}, lack);\n\t\t\treturn id;\n\t\t}\n\t\tvar random = String.random || function(){ return Math.random().toString(36).slice(2) }\n\t})(USE, './ask');\n\n\t;USE(function(module){\n\n\t\tfunction Gun(o){\n\t\t\tif(o instanceof Gun){ return (this._ = {$: this}).$ }\n\t\t\tif(!(this instanceof Gun)){ return new Gun(o) }\n\t\t\treturn Gun.create(this._ = {$: this, opt: o});\n\t\t}\n\n\t\tGun.is = function($){ return ($ instanceof Gun) || ($ && $._ && ($ === $._.$)) || false }\n\n\t\tGun.version = 0.2020;\n\n\t\tGun.chain = Gun.prototype;\n\t\tGun.chain.toJSON = function(){};\n\n\t\tUSE('./shim');\n\t\tGun.valid = USE('./valid');\n\t\tGun.state = USE('./state');\n\t\tGun.on = USE('./onto');\n\t\tGun.dup = USE('./dup');\n\t\tGun.ask = USE('./ask');\n\n\t\t;(function(){\n\t\t\tGun.create = function(at){\n\t\t\t\tat.root = at.root || at;\n\t\t\t\tat.graph = at.graph || {};\n\t\t\t\tat.on = at.on || Gun.on;\n\t\t\t\tat.ask = at.ask || Gun.ask;\n\t\t\t\tat.dup = at.dup || Gun.dup();\n\t\t\t\tvar gun = at.$.opt(at.opt);\n\t\t\t\tif(!at.once){\n\t\t\t\t\tat.on('in', universe, at);\n\t\t\t\t\tat.on('out', universe, at);\n\t\t\t\t\tat.on('put', map, at);\n\t\t\t\t\tGun.on('create', at);\n\t\t\t\t\tat.on('create', at);\n\t\t\t\t}\n\t\t\t\tat.once = 1;\n\t\t\t\treturn gun;\n\t\t\t}\n\t\t\tfunction universe(msg){\n\t\t\t\t// TODO: BUG! msg.out = null being set!\n\t\t\t\t//if(!F){ var eve = this; setTimeout(function(){ universe.call(eve, msg,1) },Math.random() * 100);return; } // ADD F TO PARAMS!\n\t\t\t\tif(!msg){ return }\n\t\t\t\tif(msg.out === universe){ this.to.next(msg); return }\n\t\t\t\tvar eve = this, as = eve.as, at = as.at || as, gun = at.$, dup = at.dup, tmp, DBG = msg.DBG;\n\t\t\t\t(tmp = msg['#']) || (tmp = msg['#'] = text_rand(9));\n\t\t\t\tif(dup.check(tmp)){ return } dup.track(tmp);\n\t\t\t\ttmp = msg._; msg._ = ('function' == typeof tmp)? tmp : function(){};\n\t\t\t\t(msg.$ && (msg.$ === (msg.$._||'').$)) || (msg.$ = gun);\n\t\t\t\tif(msg['@'] && !msg.put){ ack(msg) }\n\t\t\t\tif(!at.ask(msg['@'], msg)){ // is this machine listening for an ack?\n\t\t\t\t\tDBG && (DBG.u = +new Date);\n\t\t\t\t\tif(msg.put){ put(msg); return } else\n\t\t\t\t\tif(msg.get){ Gun.on.get(msg, gun) }\n\t\t\t\t}\n\t\t\t\tDBG && (DBG.uc = +new Date);\n\t\t\t\teve.to.next(msg);\n\t\t\t\tDBG && (DBG.ua = +new Date);\n\t\t\t\tif(msg.nts || msg.NTS){ return } // TODO: This shouldn't be in core, but fast way to prevent NTS spread. Delete this line after all peers have upgraded to newer versions.\n\t\t\t\tmsg.out = universe; at.on('out', msg);\n\t\t\t\tDBG && (DBG.ue = +new Date);\n\t\t\t}\n\t\t\tfunction put(msg){\n\t\t\t\tif(!msg){ return }\n\t\t\t\tvar ctx = msg._||'', root = ctx.root = ((ctx.$ = msg.$||'')._||'').root;\n\t\t\t\tif(msg['@'] && ctx.faith && !ctx.miss){ // TODO: AXE may split/route based on 'put' what should we do here? Detect @ in AXE? I think we don't have to worry, as DAM will route it on @.\n\t\t\t\t\tmsg.out = universe;\n\t\t\t\t\troot.on('out', msg);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tctx.latch = root.hatch; ctx.match = root.hatch = [];\n\t\t\t\tvar put = msg.put;\n\t\t\t\tvar DBG = ctx.DBG = msg.DBG, S = +new Date; CT = CT || S;\n\t\t\t\tif(put['#'] && put['.']){ /*root && root.on('put', msg);*/ return } // TODO: BUG! This needs to call HAM instead.\n\t\t\t\tDBG && (DBG.p = S);\n\t\t\t\tctx['#'] = msg['#'];\n\t\t\t\tctx.msg = msg;\n\t\t\t\tctx.all = 0;\n\t\t\t\tctx.stun = 1;\n\t\t\t\tvar nl = Object.keys(put);//.sort(); // TODO: This is unbounded operation, large graphs will be slower. Write our own CPU scheduled sort? Or somehow do it in below? Keys itself is not O(1) either, create ES5 shim over ?weak map? or custom which is constant.\n\t\t\t\tconsole.STAT && console.STAT(S, ((DBG||ctx).pk = +new Date) - S, 'put sort');\n\t\t\t\tvar ni = 0, nj, kl, soul, node, states, err, tmp;\n\t\t\t\t(function pop(o){\n\t\t\t\t\tif(nj != ni){ nj = ni;\n\t\t\t\t\t\tif(!(soul = nl[ni])){\n\t\t\t\t\t\t\tconsole.STAT && console.STAT(S, ((DBG||ctx).pd = +new Date) - S, 'put');\n\t\t\t\t\t\t\tfire(ctx);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(!(node = put[soul])){ err = ERR+cut(soul)+\"no node.\" } else\n\t\t\t\t\t\tif(!(tmp = node._)){ err = ERR+cut(soul)+\"no meta.\" } else\n\t\t\t\t\t\tif(soul !== tmp['#']){ err = ERR+cut(soul)+\"soul not same.\" } else\n\t\t\t\t\t\tif(!(states = tmp['>'])){ err = ERR+cut(soul)+\"no state.\" }\n\t\t\t\t\t\tkl = Object.keys(node||{}); // TODO: .keys( is slow\n\t\t\t\t\t}\n\t\t\t\t\tif(err){\n\t\t\t\t\t\tmsg.err = ctx.err = err; // invalid data should error and stun the message.\n\t\t\t\t\t\tfire(ctx);\n\t\t\t\t\t\t//console.log(\"handle error!\", err) // handle!\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tvar i = 0, key; o = o || 0;\n\t\t\t\t\twhile(o++ < 9 && (key = kl[i++])){\n\t\t\t\t\t\tif('_' === key){ continue }\n\t\t\t\t\t\tvar val = node[key], state = states[key];\n\t\t\t\t\t\tif(u === state){ err = ERR+cut(key)+\"on\"+cut(soul)+\"no state.\"; break }\n\t\t\t\t\t\tif(!valid(val)){ err = ERR+cut(key)+\"on\"+cut(soul)+\"bad \"+(typeof val)+cut(val); break }\n\t\t\t\t\t\t//ctx.all++; //ctx.ack[soul+key] = '';\n\t\t\t\t\t\tham(val, key, soul, state, msg);\n\t\t\t\t\t\t++C; // courtesy count;\n\t\t\t\t\t}\n\t\t\t\t\tif((kl = kl.slice(i)).length){ turn(pop); return }\n\t\t\t\t\t++ni; kl = null; pop(o);\n\t\t\t\t}());\n\t\t\t} Gun.on.put = put;\n\t\t\t// TODO: MARK!!! clock below, reconnect sync, SEA certify wire merge, User.auth taking multiple times, // msg put, put, say ack, hear loop...\n\t\t\t// WASIS BUG! local peer not ack. .off other people: .open\n\t\t\tfunction ham(val, key, soul, state, msg){\n\t\t\t\tvar ctx = msg._||'', root = ctx.root, graph = root.graph, lot, tmp;\n\t\t\t\tvar vertex = graph[soul] || empty, was = state_is(vertex, key, 1), known = vertex[key];\n\t\t\t\t\n\t\t\t\tvar DBG = ctx.DBG; if(tmp = console.STAT){ if(!graph[soul] || !known){ tmp.has = (tmp.has || 0) + 1 } }\n\n\t\t\t\tvar now = State(), u;\n\t\t\t\tif(state > now){\n\t\t\t\t\tsetTimeout(function(){ ham(val, key, soul, state, msg) }, (tmp = state - now) > MD? MD : tmp); // Max Defer 32bit. :(\n\t\t\t\t\tconsole.STAT && console.STAT(((DBG||ctx).Hf = +new Date), tmp, 'future');\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif(state < was){ /*old;*/ if(true || !ctx.miss){ return } } // but some chains have a cache miss that need to re-fire. // TODO: Improve in future. // for AXE this would reduce rebroadcast, but GUN does it on message forwarding. // TURNS OUT CACHE MISS WAS NOT NEEDED FOR NEW CHAINS ANYMORE!!! DANGER DANGER DANGER, ALWAYS RETURN! (or am I missing something?)\n\t\t\t\tif(!ctx.faith){ // TODO: BUG? Can this be used for cache miss as well? // Yes this was a bug, need to check cache miss for RAD tests, but should we care about the faith check now? Probably not.\n\t\t\t\t\tif(state === was && (val === known || L(val) <= L(known))){ /*console.log(\"same\");*/ /*same;*/ if(!ctx.miss){ return } } // same\n\t\t\t\t}\n\t\t\t\tctx.stun++; // TODO: 'forget' feature in SEA tied to this, bad approach, but hacked in for now. Any changes here must update there.\n\t\t\t\tvar aid = msg['#']+ctx.all++, id = {toString: function(){ return aid }, _: ctx}; id.toJSON = id.toString; // this *trick* makes it compatible between old & new versions.\n\t\t\t\troot.dup.track(id)['#'] = msg['#']; // fixes new OK acks for RPC like RTC.\n\t\t\t\tDBG && (DBG.ph = DBG.ph || +new Date);\n\t\t\t\troot.on('put', {'#': id, '@': msg['@'], put: {'#': soul, '.': key, ':': val, '>': state}, ok: msg.ok, _: ctx});\n\t\t\t}\n\t\t\tfunction map(msg){\n\t\t\t\tvar DBG; if(DBG = (msg._||'').DBG){ DBG.pa = +new Date; DBG.pm = DBG.pm || +new Date}\n \tvar eve = this, root = eve.as, graph = root.graph, ctx = msg._, put = msg.put, soul = put['#'], key = put['.'], val = put[':'], state = put['>'], id = msg['#'], tmp;\n \tif((tmp = ctx.msg) && (tmp = tmp.put) && (tmp = tmp[soul])){ state_ify(tmp, key, state, val, soul) } // necessary! or else out messages do not get SEA transforms.\n \t//var bytes = ((graph[soul]||'')[key]||'').length||1;\n\t\t\t\tgraph[soul] = state_ify(graph[soul], key, state, val, soul);\n\t\t\t\tif(tmp = (root.next||'')[soul]){\n\t\t\t\t\t//tmp.bytes = (tmp.bytes||0) + ((val||'').length||1) - bytes;\n\t\t\t\t\t//if(tmp.bytes > 2**13){ Gun.log.once('byte-limit', \"Note: In the future, GUN peers will enforce a ~4KB query limit. Please see https://gun.eco/docs/Page\") }\n\t\t\t\t\ttmp.on('in', msg)\n\t\t\t\t}\n\t\t\t\tfire(ctx);\n\t\t\t\teve.to.next(msg);\n\t\t\t}\n\t\t\tfunction fire(ctx, msg){ var root;\n\t\t\t\tif(ctx.stop){ return }\n\t\t\t\tif(!ctx.err && 0 < --ctx.stun){ return } // TODO: 'forget' feature in SEA tied to this, bad approach, but hacked in for now. Any changes here must update there.\n\t\t\t\tctx.stop = 1;\n\t\t\t\tif(!(root = ctx.root)){ return }\n\t\t\t\tvar tmp = ctx.match; tmp.end = 1;\n\t\t\t\tif(tmp === root.hatch){ if(!(tmp = ctx.latch) || tmp.end){ delete root.hatch } else { root.hatch = tmp } }\n\t\t\t\tctx.hatch && ctx.hatch(); // TODO: rename/rework how put & this interact.\n\t\t\t\tsetTimeout.each(ctx.match, function(cb){cb && cb()}); \n\t\t\t\tif(!(msg = ctx.msg) || ctx.err || msg.err){ return }\n\t\t\t\tmsg.out = universe;\n\t\t\t\tctx.root.on('out', msg);\n\n\t\t\t\tCF(); // courtesy check;\n\t\t\t}\n\t\t\tfunction ack(msg){ // aggregate ACKs.\n\t\t\t\tvar id = msg['@'] || '', ctx, ok, tmp;\n\t\t\t\tif(!(ctx = id._)){\n\t\t\t\t\tvar dup = (dup = msg.$) && (dup = dup._) && (dup = dup.root) && (dup = dup.dup);\n\t\t\t\t\tif(!(dup = dup.check(id))){ return }\n\t\t\t\t\tmsg['@'] = dup['#'] || msg['@']; // This doesn't do anything anymore, backtrack it to something else?\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tctx.acks = (ctx.acks||0) + 1;\n\t\t\t\tif(ctx.err = msg.err){\n\t\t\t\t\tmsg['@'] = ctx['#'];\n\t\t\t\t\tfire(ctx); // TODO: BUG? How it skips/stops propagation of msg if any 1 item is error, this would assume a whole batch/resync has same malicious intent.\n\t\t\t\t}\n\t\t\t\tctx.ok = msg.ok || ctx.ok;\n\t\t\t\tif(!ctx.stop && !ctx.crack){ ctx.crack = ctx.match && ctx.match.push(function(){back(ctx)}) } // handle synchronous acks. NOTE: If a storage peer ACKs synchronously then the PUT loop has not even counted up how many items need to be processed, so ctx.STOP flags this and adds only 1 callback to the end of the PUT loop.\n\t\t\t\tback(ctx);\n\t\t\t}\n\t\t\tfunction back(ctx){\n\t\t\t\tif(!ctx || !ctx.root){ return }\n\t\t\t\tif(ctx.stun || ctx.acks !== ctx.all){ return }\n\t\t\t\tctx.root.on('in', {'@': ctx['#'], err: ctx.err, ok: ctx.err? u : ctx.ok || {'':1}});\n\t\t\t}\n\n\t\t\tvar ERR = \"Error: Invalid graph!\";\n\t\t\tvar cut = function(s){ return \" '\"+(''+s).slice(0,9)+\"...' \" }\n\t\t\tvar L = JSON.stringify, MD = 2147483647, State = Gun.state;\n\t\t\tvar C = 0, CT, CF = function(){if(C>999 && (C/-(CT - (CT = +new Date))>1)){Gun.window && console.log(\"Warning: You're syncing 1K+ records a second, faster than DOM can update - consider limiting query.\");CF=function(){C=0}}};\n\n\t\t}());\n\n\t\t;(function(){\n\t\t\tGun.on.get = function(msg, gun){\n\t\t\t\tvar root = gun._, get = msg.get, soul = get['#'], node = root.graph[soul], has = get['.'];\n\t\t\t\tvar next = root.next || (root.next = {}), at = next[soul];\n\n\t\t\t\t// TODO: Azarattum bug, what is in graph is not same as what is in next. Fix!\n\n\t\t\t\t// queue concurrent GETs?\n\t\t\t\t// TODO: consider tagging original message into dup for DAM.\n\t\t\t\t// TODO: ^ above? In chat app, 12 messages resulted in same peer asking for `#user.pub` 12 times. (same with #user GET too, yipes!) // DAM note: This also resulted in 12 replies from 1 peer which all had same ##hash but none of them deduped because each get was different.\n\t\t\t\t// TODO: Moving quick hacks fixing these things to axe for now.\n\t\t\t\t// TODO: a lot of GET #foo then GET #foo.\"\" happening, why?\n\t\t\t\t// TODO: DAM's ## hash check, on same get ACK, producing multiple replies still, maybe JSON vs YSON?\n\t\t\t\t// TMP note for now: viMZq1slG was chat LEX query #.\n\t\t\t\t/*if(gun !== (tmp = msg.$) && (tmp = (tmp||'')._)){\n\t\t\t\t\tif(tmp.Q){ tmp.Q[msg['#']] = ''; return } // chain does not need to ask for it again.\n\t\t\t\t\ttmp.Q = {};\n\t\t\t\t}*/\n\t\t\t\t/*if(u === has){\n\t\t\t\t\tif(at.Q){\n\t\t\t\t\t\t//at.Q[msg['#']] = '';\n\t\t\t\t\t\t//return;\n\t\t\t\t\t}\n\t\t\t\t\tat.Q = {};\n\t\t\t\t}*/\n\t\t\t\tvar ctx = msg._||{}, DBG = ctx.DBG = msg.DBG;\n\t\t\t\tDBG && (DBG.g = +new Date);\n\t\t\t\t//console.log(\"GET:\", get, node, has);\n\t\t\t\tif(!node){ return root.on('get', msg) }\n\t\t\t\tif(has){\n\t\t\t\t\tif('string' != typeof has || u === node[has]){\n\t\t\t\t\t\tif(!((at||'').next||'')[has]){ root.on('get', msg); return }\n\t\t\t\t\t}\n\t\t\t\t\tnode = state_ify({}, has, state_is(node, has), node[has], soul);\n\t\t\t\t\t// If we have a key in-memory, do we really need to fetch?\n\t\t\t\t\t// Maybe... in case the in-memory key we have is a local write\n\t\t\t\t\t// we still need to trigger a pull/merge from peers.\n\t\t\t\t}\n\t\t\t\t//Gun.window? Gun.obj.copy(node) : node; // HNPERF: If !browser bump Performance? Is this too dangerous to reference root graph? Copy / shallow copy too expensive for big nodes. Gun.obj.to(node); // 1 layer deep copy // Gun.obj.copy(node); // too slow on big nodes\n\t\t\t\tnode && ack(msg, node);\n\t\t\t\troot.on('get', msg); // send GET to storage adapters.\n\t\t\t}\n\t\t\tfunction ack(msg, node){\n\t\t\t\tvar S = +new Date, ctx = msg._||{}, DBG = ctx.DBG = msg.DBG;\n\t\t\t\tvar to = msg['#'], id = text_rand(9), keys = Object.keys(node||'').sort(), soul = ((node||'')._||'')['#'], kl = keys.length, j = 0, root = msg.$._.root, F = (node === root.graph[soul]);\n\t\t\t\tconsole.STAT && console.STAT(S, ((DBG||ctx).gk = +new Date) - S, 'got keys');\n\t\t\t\t// PERF: Consider commenting this out to force disk-only reads for perf testing? // TODO: .keys( is slow\n\t\t\t\tnode && (function go(){\n\t\t\t\t\tS = +new Date;\n\t\t\t\t\tvar i = 0, k, put = {}, tmp;\n\t\t\t\t\twhile(i < 9 && (k = keys[i++])){\n\t\t\t\t\t\tstate_ify(put, k, state_is(node, k), node[k], soul);\n\t\t\t\t\t}\n\t\t\t\t\tkeys = keys.slice(i);\n\t\t\t\t\t(tmp = {})[soul] = put; put = tmp;\n\t\t\t\t\tvar faith; if(F){ faith = function(){}; faith.ram = faith.faith = true; } // HNPERF: We're testing performance improvement by skipping going through security again, but this should be audited.\n\t\t\t\t\ttmp = keys.length;\n\t\t\t\t\tconsole.STAT && console.STAT(S, -(S - (S = +new Date)), 'got copied some');\n\t\t\t\t\tDBG && (DBG.ga = +new Date);\n\t\t\t\t\troot.on('in', {'@': to, '#': id, put: put, '%': (tmp? (id = text_rand(9)) : u), $: root.$, _: faith, DBG: DBG, FOO: 1});\n\t\t\t\t\tconsole.STAT && console.STAT(S, +new Date - S, 'got in');\n\t\t\t\t\tif(!tmp){ return }\n\t\t\t\t\tsetTimeout.turn(go);\n\t\t\t\t}());\n\t\t\t\tif(!node){ root.on('in', {'@': msg['#']}) } // TODO: I don't think I like this, the default lS adapter uses this but \"not found\" is a sensitive issue, so should probably be handled more carefully/individually.\n\t\t\t} Gun.on.get.ack = ack;\n\t\t}());\n\n\t\t;(function(){\n\t\t\tGun.chain.opt = function(opt){\n\t\t\t\topt = opt || {};\n\t\t\t\tvar gun = this, at = gun._, tmp = opt.peers || opt;\n\t\t\t\tif(!Object.plain(opt)){ opt = {} }\n\t\t\t\tif(!Object.plain(at.opt)){ at.opt = opt }\n\t\t\t\tif('string' == typeof tmp){ tmp = [tmp] }\n\t\t\t\tif(!Object.plain(at.opt.peers)){ at.opt.peers = {}}\n\t\t\t\tif(tmp instanceof Array){\n\t\t\t\t\topt.peers = {};\n\t\t\t\t\ttmp.forEach(function(url){\n\t\t\t\t\t\tvar p = {}; p.id = p.url = url;\n\t\t\t\t\t\topt.peers[url] = at.opt.peers[url] = at.opt.peers[url] || p;\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t\tobj_each(opt, function each(k){ var v = this[k];\n\t\t\t\t\tif((this && this.hasOwnProperty(k)) || 'string' == typeof v || Object.empty(v)){ this[k] = v; return }\n\t\t\t\t\tif(v && v.constructor !== Object && !(v instanceof Array)){ return }\n\t\t\t\t\tobj_each(v, each);\n\t\t\t\t});\n\t\t\t\tat.opt.from = opt;\n\t\t\t\tGun.on('opt', at);\n\t\t\t\tat.opt.uuid = at.opt.uuid || function uuid(l){ return Gun.state().toString(36).replace('.','') + String.random(l||12) }\n\t\t\t\treturn gun;\n\t\t\t}\n\t\t}());\n\n\t\tvar obj_each = function(o,f){ Object.keys(o).forEach(f,o) }, text_rand = String.random, turn = setTimeout.turn, valid = Gun.valid, state_is = Gun.state.is, state_ify = Gun.state.ify, u, empty = {}, C;\n\n\t\tGun.log = function(){ return (!Gun.log.off && C.log.apply(C, arguments)), [].slice.call(arguments).join(' ') };\n\t\tGun.log.once = function(w,s,o){ return (o = Gun.log.once)[w] = o[w] || 0, o[w]++ || Gun.log(s) };\n\n\t\tif(typeof window !== \"undefined\"){ (window.GUN = window.Gun = Gun).window = window }\n\t\ttry{ if(typeof MODULE !== \"undefined\"){ MODULE.exports = Gun } }catch(e){}\n\t\tmodule.exports = Gun;\n\t\t\n\t\t(Gun.window||{}).console = (Gun.window||{}).console || {log: function(){}};\n\t\t(C = console).only = function(i, s){ return (C.only.i && i === C.only.i && C.only.i++) && (C.log.apply(C, arguments) || s) };\n\n\t\t;\"Please do not remove welcome log unless you are paying for a monthly sponsorship, thanks!\";\n\t\tGun.log.once(\"welcome\", \"Hello wonderful person! :) Thanks for using GUN, please ask for help on http://chat.gun.eco if anything takes you longer than 5min to figure out!\");\n\t})(USE, './root');\n\n\t;USE(function(module){\n\t\tvar Gun = USE('./root');\n\t\tGun.chain.back = function(n, opt){ var tmp;\n\t\t\tn = n || 1;\n\t\t\tif(-1 === n || Infinity === n){\n\t\t\t\treturn this._.root.$;\n\t\t\t} else\n\t\t\tif(1 === n){\n\t\t\t\treturn (this._.back || this._).$;\n\t\t\t}\n\t\t\tvar gun = this, at = gun._;\n\t\t\tif(typeof n === 'string'){\n\t\t\t\tn = n.split('.');\n\t\t\t}\n\t\t\tif(n instanceof Array){\n\t\t\t\tvar i = 0, l = n.length, tmp = at;\n\t\t\t\tfor(i; i < l; i++){\n\t\t\t\t\ttmp = (tmp||empty)[n[i]];\n\t\t\t\t}\n\t\t\t\tif(u !== tmp){\n\t\t\t\t\treturn opt? gun : tmp;\n\t\t\t\t} else\n\t\t\t\tif((tmp = at.back)){\n\t\t\t\t\treturn tmp.$.back(n, opt);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif('function' == typeof n){\n\t\t\t\tvar yes, tmp = {back: at};\n\t\t\t\twhile((tmp = tmp.back)\n\t\t\t\t&& u === (yes = n(tmp, opt))){}\n\t\t\t\treturn yes;\n\t\t\t}\n\t\t\tif('number' == typeof n){\n\t\t\t\treturn (at.back || at).$.back(n - 1);\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\tvar empty = {}, u;\n\t})(USE, './back');\n\n\t;USE(function(module){\n\t\t// WARNING: GUN is very simple, but the JavaScript chaining API around GUN\n\t\t// is complicated and was extremely hard to build. If you port GUN to another\n\t\t// language, consider implementing an easier API to build.\n\t\tvar Gun = USE('./root');\n\t\tGun.chain.chain = function(sub){\n\t\t\tvar gun = this, at = gun._, chain = new (sub || gun).constructor(gun), cat = chain._, root;\n\t\t\tcat.root = root = at.root;\n\t\t\tcat.id = ++root.once;\n\t\t\tcat.back = gun._;\n\t\t\tcat.on = Gun.on;\n\t\t\tcat.on('in', Gun.on.in, cat); // For 'in' if I add my own listeners to each then I MUST do it before in gets called. If I listen globally for all incoming data instead though, regardless of individual listeners, I can transform the data there and then as well.\n\t\t\tcat.on('out', Gun.on.out, cat); // However for output, there isn't really the global option. I must listen by adding my own listener individually BEFORE this one is ever called.\n\t\t\treturn chain;\n\t\t}\n\n\t\tfunction output(msg){\n\t\t\tvar put, get, at = this.as, back = at.back, root = at.root, tmp;\n\t\t\tif(!msg.$){ msg.$ = at.$ }\n\t\t\tthis.to.next(msg);\n\t\t\tif(at.err){ at.on('in', {put: at.put = u, $: at.$}); return }\n\t\t\tif(get = msg.get){\n\t\t\t\t/*if(u !== at.put){\n\t\t\t\t\tat.on('in', at);\n\t\t\t\t\treturn;\n\t\t\t\t}*/\n\t\t\t\tif(root.pass){ root.pass[at.id] = at; } // will this make for buggy behavior elsewhere?\n\t\t\t\tif(at.lex){ Object.keys(at.lex).forEach(function(k){ tmp[k] = at.lex[k] }, tmp = msg.get = msg.get || {}) }\n\t\t\t\tif(get['#'] || at.soul){\n\t\t\t\t\tget['#'] = get['#'] || at.soul;\n\t\t\t\t\t//root.graph[get['#']] = root.graph[get['#']] || {_:{'#':get['#'],'>':{}}};\n\t\t\t\t\tmsg['#'] || (msg['#'] = text_rand(9)); // A3120 ?\n\t\t\t\t\tback = (root.$.get(get['#'])._);\n\t\t\t\t\tif(!(get = get['.'])){ // soul\n\t\t\t\t\t\ttmp = back.ask && back.ask['']; // check if we have already asked for the full node\n\t\t\t\t\t\t(back.ask || (back.ask = {}))[''] = back; // add a flag that we are now.\n\t\t\t\t\t\tif(u !== back.put){ // if we already have data,\n\t\t\t\t\t\t\tback.on('in', back); // send what is cached down the chain\n\t\t\t\t\t\t\tif(tmp){ return } // and don't ask for it again.\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmsg.$ = back.$;\n\t\t\t\t\t} else\n\t\t\t\t\tif(obj_has(back.put, get)){ // TODO: support #LEX !\n\t\t\t\t\t\ttmp = back.ask && back.ask[get];\n\t\t\t\t\t\t(back.ask || (back.ask = {}))[get] = back.$.get(get)._;\n\t\t\t\t\t\tback.on('in', {get: get, put: {'#': back.soul, '.': get, ':': back.put[get], '>': state_is(root.graph[back.soul], get)}});\n\t\t\t\t\t\tif(tmp){ return }\n\t\t\t\t\t}\n\t\t\t\t\t\t/*put = (back.$.get(get)._);\n\t\t\t\t\t\tif(!(tmp = put.ack)){ put.ack = -1 }\n\t\t\t\t\t\tback.on('in', {\n\t\t\t\t\t\t\t$: back.$,\n\t\t\t\t\t\t\tput: Gun.state.ify({}, get, Gun.state(back.put, get), back.put[get]),\n\t\t\t\t\t\t\tget: back.get\n\t\t\t\t\t\t});\n\t\t\t\t\t\tif(tmp){ return }\n\t\t\t\t\t} else\n\t\t\t\t\tif('string' != typeof get){\n\t\t\t\t\t\tvar put = {}, meta = (back.put||{})._;\n\t\t\t\t\t\tGun.obj.map(back.put, function(v,k){\n\t\t\t\t\t\t\tif(!Gun.text.match(k, get)){ return }\n\t\t\t\t\t\t\tput[k] = v;\n\t\t\t\t\t\t})\n\t\t\t\t\t\tif(!Gun.obj.empty(put)){\n\t\t\t\t\t\t\tput._ = meta;\n\t\t\t\t\t\t\tback.on('in', {$: back.$, put: put, get: back.get})\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(tmp = at.lex){\n\t\t\t\t\t\t\ttmp = (tmp._) || (tmp._ = function(){});\n\t\t\t\t\t\t\tif(back.ack < tmp.ask){ tmp.ask = back.ack }\n\t\t\t\t\t\t\tif(tmp.ask){ return }\n\t\t\t\t\t\t\ttmp.ask = 1;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t*/\n\t\t\t\t\troot.ask(ack, msg); // A3120 ?\n\t\t\t\t\treturn root.on('in', msg);\n\t\t\t\t}\n\t\t\t\t//if(root.now){ root.now[at.id] = root.now[at.id] || true; at.pass = {} }\n\t\t\t\tif(get['.']){\n\t\t\t\t\tif(at.get){\n\t\t\t\t\t\tmsg = {get: {'.': at.get}, $: at.$};\n\t\t\t\t\t\t(back.ask || (back.ask = {}))[at.get] = msg.$._; // TODO: PERFORMANCE? More elegant way?\n\t\t\t\t\t\treturn back.on('out', msg);\n\t\t\t\t\t}\n\t\t\t\t\tmsg = {get: at.lex? msg.get : {}, $: at.$};\n\t\t\t\t\treturn back.on('out', msg);\n\t\t\t\t}\n\t\t\t\t(at.ask || (at.ask = {}))[''] = at;\t //at.ack = at.ack || -1;\n\t\t\t\tif(at.get){\n\t\t\t\t\tget['.'] = at.get;\n\t\t\t\t\t(back.ask || (back.ask = {}))[at.get] = msg.$._; // TODO: PERFORMANCE? More elegant way?\n\t\t\t\t\treturn back.on('out', msg);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn back.on('out', msg);\n\t\t}; Gun.on.out = output;\n\n\t\tfunction input(msg, cat){ cat = cat || this.as; // TODO: V8 may not be able to optimize functions with different parameter calls, so try to do benchmark to see if there is any actual difference.\n\t\t\tvar root = cat.root, gun = msg.$ || (msg.$ = cat.$), at = (gun||'')._ || empty, tmp = msg.put||'', soul = tmp['#'], key = tmp['.'], change = (u !== tmp['='])? tmp['='] : tmp[':'], state = tmp['>'] || -Infinity, sat; // eve = event, at = data at, cat = chain at, sat = sub at (children chains).\n\t\t\tif(u !== msg.put && (u === tmp['#'] || u === tmp['.'] || (u === tmp[':'] && u === tmp['=']) || u === tmp['>'])){ // convert from old format\n\t\t\t\tif(!valid(tmp)){\n\t\t\t\t\tif(!(soul = ((tmp||'')._||'')['#'])){ console.log(\"chain not yet supported for\", tmp, '...', msg, cat); return; }\n\t\t\t\t\tgun = cat.root.$.get(soul);\n\t\t\t\t\treturn setTimeout.each(Object.keys(tmp).sort(), function(k){ // TODO: .keys( is slow // BUG? ?Some re-in logic may depend on this being sync?\n\t\t\t\t\t\tif('_' == k || u === (state = state_is(tmp, k))){ return }\n\t\t\t\t\t\tcat.on('in', {$: gun, put: {'#': soul, '.': k, '=': tmp[k], '>': state}, VIA: msg});\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tcat.on('in', {$: at.back.$, put: {'#': soul = at.back.soul, '.': key = at.has || at.get, '=': tmp, '>': state_is(at.back.put, key)}, via: msg}); // TODO: This could be buggy! It assumes/approxes data, other stuff could have corrupted it.\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif((msg.seen||'')[cat.id]){ return } (msg.seen || (msg.seen = function(){}))[cat.id] = cat; // help stop some infinite loops\n\n\t\t\tif(cat !== at){ // don't worry about this when first understanding the code, it handles changing contexts on a message. A soul chain will never have a different context.\n\t\t\t\tObject.keys(msg).forEach(function(k){ tmp[k] = msg[k] }, tmp = {}); // make copy of message\n\t\t\t\ttmp.get = cat.get || tmp.get;\n\t\t\t\tif(!cat.soul && !cat.has){ // if we do not recognize the chain type\n\t\t\t\t\ttmp.$$$ = tmp.$$$ || cat.$; // make a reference to wherever it came from.\n\t\t\t\t} else\n\t\t\t\tif(at.soul){ // a has (property) chain will have a different context sometimes if it is linked (to a soul chain). Anything that is not a soul or has chain, will always have different contexts.\n\t\t\t\t\ttmp.$ = cat.$;\n\t\t\t\t\ttmp.$$ = tmp.$$ || at.$;\n\t\t\t\t}\n\t\t\t\tmsg = tmp; // use the message with the new context instead;\n\t\t\t}\n\t\t\tunlink(msg, cat);\n\n\t\t\tif(((cat.soul/* && (cat.ask||'')['']*/) || msg.$$) && state >= state_is(root.graph[soul], key)){ // The root has an in-memory cache of the graph, but if our peer has asked for the data then we want a per deduplicated chain copy of the data that might have local edits on it.\n\t\t\t\t(tmp = root.$.get(soul)._).put = state_ify(tmp.put, key, state, change, soul);\n\t\t\t}\n\t\t\tif(!at.soul /*&& (at.ask||'')['']*/ && state >= state_is(root.graph[soul], key) && (sat = (root.$.get(soul)._.next||'')[key])){ // Same as above here, but for other types of chains. // TODO: Improve perf by preventing echoes recaching.\n\t\t\t\tsat.put = change; // update cache\n\t\t\t\tif('string' == typeof (tmp = valid(change))){\n\t\t\t\t\tsat.put = root.$.get(tmp)._.put || change; // share same cache as what we're linked to.\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.to && this.to.next(msg); // 1st API job is to call all chain listeners.\n\t\t\t// TODO: Make input more reusable by only doing these (some?) calls if we are a chain we recognize? This means each input listener would be responsible for when listeners need to be called, which makes sense, as they might want to filter.\n\t\t\tcat.any && setTimeout.each(Object.keys(cat.any), function(any){ (any = cat.any[any]) && any(msg) },0,99); // 1st API job is to call all chain listeners. // TODO: .keys( is slow // BUG: Some re-in logic may depend on this being sync.\n\t\t\tcat.echo && setTimeout.each(Object.keys(cat.echo), function(lat){ (lat = cat.echo[lat]) && lat.on('in', msg) },0,99); // & linked at chains // TODO: .keys( is slow // BUG: Some re-in logic may depend on this being sync.\n\n\t\t\tif(((msg.$$||'')._||at).soul){ // comments are linear, but this line of code is non-linear, so if I were to comment what it does, you'd have to read 42 other comments first... but you can't read any of those comments until you first read this comment. What!? // shouldn't this match link's check?\n\t\t\t\t// is there cases where it is a $$ that we do NOT want to do the following? \n\t\t\t\tif((sat = cat.next) && (sat = sat[key])){ // TODO: possible trick? Maybe have `ionmap` code set a sat? // TODO: Maybe we should do `cat.ask` instead? I guess does not matter.\n\t\t\t\t\ttmp = {}; Object.keys(msg).forEach(function(k){ tmp[k] = msg[k] });\n\t\t\t\t\ttmp.$ = (msg.$$||msg.$).get(tmp.get = key); delete tmp.$$; delete tmp.$$$;\n\t\t\t\t\tsat.on('in', tmp);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlink(msg, cat);\n\t\t}; Gun.on.in = input;\n\n\t\tfunction link(msg, cat){ cat = cat || this.as || msg.$._;\n\t\t\tif(msg.$$ && this !== Gun.on){ return } // $$ means we came from a link, so we are at the wrong level, thus ignore it unless overruled manually by being called directly.\n\t\t\tif(!msg.put || cat.soul){ return } // But you cannot overrule being linked to nothing, or trying to link a soul chain - that must never happen.\n\t\t\tvar put = msg.put||'', link = put['=']||put[':'], tmp;\n\t\t\tvar root = cat.root, tat = root.$.get(put['#']).get(put['.'])._;\n\t\t\tif('string' != typeof (link = valid(link))){\n\t\t\t\tif(this === Gun.on){ (tat.echo || (tat.echo = {}))[cat.id] = cat } // allow some chain to explicitly force linking to simple data.\n\t\t\t\treturn; // by default do not link to data that is not a link.\n\t\t\t}\n\t\t\tif((tat.echo || (tat.echo = {}))[cat.id] // we've already linked ourselves so we do not need to do it again. Except... (annoying implementation details)\n\t\t\t\t&& !(root.pass||'')[cat.id]){ return } // if a new event listener was added, we need to make a pass through for it. The pass will be on the chain, not always the chain passed down. \n\t\t\tif(tmp = root.pass){ if(tmp[link+cat.id]){ return } tmp[link+cat.id] = 1 } // But the above edge case may \"pass through\" on a circular graph causing infinite passes, so we hackily add a temporary check for that.\n\n\t\t\t(tat.echo||(tat.echo={}))[cat.id] = cat; // set ourself up for the echo! // TODO: BUG? Echo to self no longer causes problems? Confirm.\n\n\t\t\tif(cat.has){ cat.link = link }\n\t\t\tvar sat = root.$.get(tat.link = link)._; // grab what we're linking to.\n\t\t\t(sat.echo || (sat.echo = {}))[tat.id] = tat; // link it.\n\t\t\tvar tmp = cat.ask||''; // ask the chain for what needs to be loaded next!\n\t\t\tif(tmp[''] || cat.lex){ // we might need to load the whole thing // TODO: cat.lex probably has edge case bugs to it, need more test coverage.\n\t\t\t\tsat.on('out', {get: {'#': link}});\n\t\t\t}\n\t\t\tsetTimeout.each(Object.keys(tmp), function(get, sat){ // if sub chains are asking for data. // TODO: .keys( is slow // BUG? ?Some re-in logic may depend on this being sync?\n\t\t\t\tif(!get || !(sat = tmp[get])){ return }\n\t\t\t\tsat.on('out', {get: {'#': link, '.': get}}); // go get it.\n\t\t\t},0,99);\n\t\t}; Gun.on.link = link;\n\n\t\tfunction unlink(msg, cat){ // ugh, so much code for seemingly edge case behavior.\n\t\t\tvar put = msg.put||'', change = (u !== put['='])? put['='] : put[':'], root = cat.root, link, tmp;\n\t\t\tif(u === change){ // 1st edge case: If we have a brand new database, no data will be found.\n\t\t\t\t// TODO: BUG! because emptying cache could be async from below, make sure we are not emptying a newer cache. So maybe pass an Async ID to check against?\n\t\t\t\t// TODO: BUG! What if this is a map? // Warning! Clearing things out needs to be robust against sync/async ops, or else you'll see `map val get put` test catastrophically fail because map attempts to link when parent graph is streamed before child value gets set. Need to differentiate between lack acks and force clearing.\n\t\t\t\tif(cat.soul && u !== cat.put){ return } // data may not be found on a soul, but if a soul already has data, then nothing can clear the soul as a whole.\n\t\t\t\t//if(!cat.has){ return }\n\t\t\t\ttmp = (msg.$$||msg.$||'')._||'';\n\t\t\t\tif(msg['@'] && (u !== tmp.put || u !== cat.put)){ return } // a \"not found\" from other peers should not clear out data if we have already found it.\n\t\t\t\t//if(cat.has && u === cat.put && !(root.pass||'')[cat.id]){ return } // if we are already unlinked, do not call again, unless edge case. // TODO: BUG! This line should be deleted for \"unlink deeply nested\".\n\t\t\t\tif(link = cat.link || msg.linked){\n\t\t\t\t\tdelete (root.$.get(link)._.echo||'')[cat.id];\n\t\t\t\t}\n\t\t\t\tif(cat.has){ // TODO: Empty out links, maps, echos, acks/asks, etc.?\n\t\t\t\t\tcat.link = null;\n\t\t\t\t}\n\t\t\t\tcat.put = u; // empty out the cache if, for example, alice's car's color no longer exists (relative to alice) if alice no longer has a car.\n\t\t\t\t// TODO: BUG! For maps, proxy this so the individual sub is triggered, not all subs.\n\t\t\t\tsetTimeout.each(Object.keys(cat.next||''), function(get, sat){ // empty out all sub chains. // TODO: .keys( is slow // BUG? ?Some re-in logic may depend on this being sync? // TODO: BUG? This will trigger deeper put first, does put logic depend on nested order? // TODO: BUG! For map, this needs to be the isolated child, not all of them.\n\t\t\t\t\tif(!(sat = cat.next[get])){ return }\n\t\t\t\t\t//if(cat.has && u === sat.put && !(root.pass||'')[sat.id]){ return } // if we are already unlinked, do not call again, unless edge case. // TODO: BUG! This line should be deleted for \"unlink deeply nested\".\n\t\t\t\t\tif(link){ delete (root.$.get(link).get(get)._.echo||'')[sat.id] }\n\t\t\t\t\tsat.on('in', {get: get, put: u, $: sat.$}); // TODO: BUG? Add recursive seen check?\n\t\t\t\t},0,99);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif(cat.soul){ return } // a soul cannot unlink itself.\n\t\t\tif(msg.$$){ return } // a linked chain does not do the unlinking, the sub chain does. // TODO: BUG? Will this cancel maps?\n\t\t\tlink = valid(change); // need to unlink anytime we are not the same link, though only do this once per unlink (and not on init).\n\t\t\ttmp = msg.$._||'';\n\t\t\tif(link === tmp.link || (cat.has && !tmp.link)){\n\t\t\t\tif((root.pass||'')[cat.id] && 'string' !== typeof link){\n\n\t\t\t\t} else {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tdelete (tmp.echo||'')[cat.id];\n\t\t\tunlink({get: cat.get, put: u, $: msg.$, linked: msg.linked = msg.linked || tmp.link}, cat); // unlink our sub chains.\n\t\t}; Gun.on.unlink = unlink;\n\n\t\tfunction ack(msg, ev){\n\t\t\t//if(!msg['%'] && (this||'').off){ this.off() } // do NOT memory leak, turn off listeners! Now handled by .ask itself\n\t\t\t// manhattan:\n\t\t\tvar as = this.as, at = as.$._, root = at.root, get = as.get||'', tmp = (msg.put||'')[get['#']]||'';\n\t\t\tif(!msg.put || ('string' == typeof get['.'] && u === tmp[get['.']])){\n\t\t\t\tif(u !== at.put){ return }\n\t\t\t\tif(!at.soul && !at.has){ return } // TODO: BUG? For now, only core-chains will handle not-founds, because bugs creep in if non-core chains are used as $ but we can revisit this later for more powerful extensions.\n\t\t\t\tat.ack = (at.ack || 0) + 1;\n\t\t\t\tat.on('in', {\n\t\t\t\t\tget: at.get,\n\t\t\t\t\tput: at.put = u,\n\t\t\t\t\t$: at.$,\n\t\t\t\t\t'@': msg['@']\n\t\t\t\t});\n\t\t\t\t/*(tmp = at.Q) && setTimeout.each(Object.keys(tmp), function(id){ // TODO: Temporary testing, not integrated or being used, probably delete.\n\t\t\t\t\tObject.keys(msg).forEach(function(k){ tmp[k] = msg[k] }, tmp = {}); tmp['@'] = id; // copy message\n\t\t\t\t\troot.on('in', tmp);\n\t\t\t\t}); delete at.Q;*/\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t(msg._||{}).miss = 1;\n\t\t\tGun.on.put(msg);\n\t\t\treturn; // eom\n\t\t}\n\n\t\tvar empty = {}, u, text_rand = String.random, valid = Gun.valid, obj_has = function(o, k){ return o && Object.prototype.hasOwnProperty.call(o, k) }, state = Gun.state, state_is = state.is, state_ify = state.ify;\n\t})(USE, './chain');\n\n\t;USE(function(module){\n\t\tvar Gun = USE('./root');\n\t\tGun.chain.get = function(key, cb, as){\n\t\t\tvar gun, tmp;\n\t\t\tif(typeof key === 'string'){\n\t\t\t\tif(key.length == 0) {\t\n\t\t\t\t\t(gun = this.chain())._.err = {err: Gun.log('0 length key!', key)};\n\t\t\t\t\tif(cb){ cb.call(gun, gun._.err) }\n\t\t\t\t\treturn gun;\n\t\t\t\t}\n\t\t\t\tvar back = this, cat = back._;\n\t\t\t\tvar next = cat.next || empty;\n\t\t\t\tif(!(gun = next[key])){\n\t\t\t\t\tgun = key && cache(key, back);\n\t\t\t\t}\n\t\t\t\tgun = gun && gun.$;\n\t\t\t} else\n\t\t\tif('function' == typeof key){\n\t\t\t\tif(true === cb){ return soul(this, key, cb, as), this }\n\t\t\t\tgun = this;\n\t\t\t\tvar cat = gun._, opt = cb || {}, root = cat.root, id;\n\t\t\t\topt.at = cat;\n\t\t\t\topt.ok = key;\n\t\t\t\tvar wait = {}; // can we assign this to the at instead, like in once?\n\t\t\t\t//var path = []; cat.$.back(at => { at.get && path.push(at.get.slice(0,9))}); path = path.reverse().join('.');\n\t\t\t\tfunction any(msg, eve, f){\n\t\t\t\t\tif(any.stun){ return }\n\t\t\t\t\tif((tmp = root.pass) && !tmp[id]){ return }\n\t\t\t\t\tvar at = msg.$._, sat = (msg.$$||'')._, data = (sat||at).put, odd = (!at.has && !at.soul), test = {}, link, tmp;\n\t\t\t\t\tif(odd || u === data){ // handles non-core\n\t\t\t\t\t\tdata = (u === ((tmp = msg.put)||'')['='])? (u === (tmp||'')[':'])? tmp : tmp[':'] : tmp['='];\n\t\t\t\t\t}\n\t\t\t\t\tif(link = ('string' == typeof (tmp = Gun.valid(data)))){\n\t\t\t\t\t\tdata = (u === (tmp = root.$.get(tmp)._.put))? opt.not? u : data : tmp;\n\t\t\t\t\t}\n\t\t\t\t\tif(opt.not && u === data){ return }\n\t\t\t\t\tif(u === opt.stun){\n\t\t\t\t\t\tif((tmp = root.stun) && tmp.on){\n\t\t\t\t\t\t\tcat.$.back(function(a){ // our chain stunned?\n\t\t\t\t\t\t\t\ttmp.on(''+a.id, test = {});\n\t\t\t\t\t\t\t\tif((test.run || 0) < any.id){ return test } // if there is an earlier stun on gapless parents/self.\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t!test.run && tmp.on(''+at.id, test = {}); // this node stunned?\n\t\t\t\t\t\t\t!test.run && sat && tmp.on(''+sat.id, test = {}); // linked node stunned?\n\t\t\t\t\t\t\tif(any.id > test.run){\n\t\t\t\t\t\t\t\tif(!test.stun || test.stun.end){\n\t\t\t\t\t\t\t\t\ttest.stun = tmp.on('stun');\n\t\t\t\t\t\t\t\t\ttest.stun = test.stun && test.stun.last;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif(test.stun && !test.stun.end){\n\t\t\t\t\t\t\t\t\t//if(odd && u === data){ return }\n\t\t\t\t\t\t\t\t\t//if(u === msg.put){ return } // \"not found\" acks will be found if there is stun, so ignore these.\n\t\t\t\t\t\t\t\t\t(test.stun.add || (test.stun.add = {}))[id] = function(){ any(msg,eve,1) } // add ourself to the stun callback list that is called at end of the write.\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(/*odd &&*/ u === data){ f = 0 } // if data not found, keep waiting/trying.\n\t\t\t\t\t\t/*if(f && u === data){\n\t\t\t\t\t\t\tcat.on('out', opt.out);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}*/\n\t\t\t\t\t\tif((tmp = root.hatch) && !tmp.end && u === opt.hatch && !f){ // quick hack! // What's going on here? Because data is streamed, we get things one by one, but a lot of developers would rather get a callback after each batch instead, so this does that by creating a wait list per chain id that is then called at the end of the batch by the hatch code in the root put listener.\n\t\t\t\t\t\t\tif(wait[at.$._.id]){ return } wait[at.$._.id] = 1;\n\t\t\t\t\t\t\ttmp.push(function(){any(msg,eve,1)});\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}; wait = {}; // end quick hack.\n\t\t\t\t\t}\n\t\t\t\t\t// call:\n\t\t\t\t\tif(root.pass){ if(root.pass[id+at.id]){ return } root.pass[id+at.id] = 1 }\n\t\t\t\t\tif(opt.on){ opt.ok.call(at.$, data, at.get, msg, eve || any); return } // TODO: Also consider breaking `this` since a lot of people do `=>` these days and `.call(` has slower performance.\n\t\t\t\t\tif(opt.v2020){ opt.ok(msg, eve || any); return }\n\t\t\t\t\tObject.keys(msg).forEach(function(k){ tmp[k] = msg[k] }, tmp = {}); msg = tmp; msg.put = data; // 2019 COMPATIBILITY! TODO: GET RID OF THIS!\n\t\t\t\t\topt.ok.call(opt.as, msg, eve || any); // is this the right\n\t\t\t\t};\n\t\t\t\tany.at = cat;\n\t\t\t\t//(cat.any||(cat.any=function(msg){ setTimeout.each(Object.keys(cat.any||''), function(act){ (act = cat.any[act]) && act(msg) },0,99) }))[id = String.random(7)] = any; // maybe switch to this in future?\n\t\t\t\t(cat.any||(cat.any={}))[id = String.random(7)] = any;\n\t\t\t\tany.off = function(){ any.stun = 1; if(!cat.any){ return } delete cat.any[id] }\n\t\t\t\tany.rid = rid; // logic from old version, can we clean it up now?\n\t\t\t\tany.id = opt.run || ++root.once; // used in callback to check if we are earlier than a write. // will this ever cause an integer overflow?\n\t\t\t\ttmp = root.pass; (root.pass = {})[id] = 1; // Explanation: test trade-offs want to prevent recursion so we add/remove pass flag as it gets fulfilled to not repeat, however map map needs many pass flags - how do we reconcile?\n\t\t\t\topt.out = opt.out || {get: {}};\n\t\t\t\tcat.on('out', opt.out);\n\t\t\t\troot.pass = tmp;\n\t\t\t\treturn gun;\n\t\t\t} else\n\t\t\tif('number' == typeof key){\n\t\t\t\treturn this.get(''+key, cb, as);\n\t\t\t} else\n\t\t\tif('string' == typeof (tmp = valid(key))){\n\t\t\t\treturn this.get(tmp, cb, as);\n\t\t\t} else\n\t\t\tif(tmp = this.get.next){\n\t\t\t\tgun = tmp(this, key);\n\t\t\t}\n\t\t\tif(!gun){\n\t\t\t\t(gun = this.chain())._.err = {err: Gun.log('Invalid get request!', key)}; // CLEAN UP\n\t\t\t\tif(cb){ cb.call(gun, gun._.err) }\n\t\t\t\treturn gun;\n\t\t\t}\n\t\t\tif(cb && 'function' == typeof cb){\n\t\t\t\tgun.get(cb, as);\n\t\t\t}\n\t\t\treturn gun;\n\t\t}\n\t\tfunction cache(key, back){\n\t\t\tvar cat = back._, next = cat.next, gun = back.chain(), at = gun._;\n\t\t\tif(!next){ next = cat.next = {} }\n\t\t\tnext[at.get = key] = at;\n\t\t\tif(back === cat.root.$){\n\t\t\t\tat.soul = key;\n\t\t\t\t//at.put = {};\n\t\t\t} else\n\t\t\tif(cat.soul || cat.has){\n\t\t\t\tat.has = key;\n\t\t\t\t//if(obj_has(cat.put, key)){\n\t\t\t\t\t//at.put = cat.put[key];\n\t\t\t\t//}\n\t\t\t}\n\t\t\treturn at;\n\t\t}\n\t\tfunction soul(gun, cb, opt, as){\n\t\t\tvar cat = gun._, acks = 0, tmp;\n\t\t\tif(tmp = cat.soul || cat.link){ return cb(tmp, as, cat) }\n\t\t\tif(cat.jam){ return cat.jam.push([cb, as]) }\n\t\t\tcat.jam = [[cb,as]];\n\t\t\tgun.get(function go(msg, eve){\n\t\t\t\tif(u === msg.put && !cat.root.opt.super && (tmp = Object.keys(cat.root.opt.peers).length) && ++acks <= tmp){ // TODO: super should not be in core code, bring AXE up into core instead to fix? // TODO: .keys( is slow\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\teve.rid(msg);\n\t\t\t\tvar at = ((at = msg.$) && at._) || {}, i = 0, as;\n\t\t\t\ttmp = cat.jam; delete cat.jam; // tmp = cat.jam.splice(0, 100);\n\t\t\t\t//if(tmp.length){ process.nextTick(function(){ go(msg, eve) }) }\n\t\t\t\twhile(as = tmp[i++]){ //Gun.obj.map(tmp, function(as, cb){\n\t\t\t\t\tvar cb = as[0], id; as = as[1];\n\t\t\t\t\tcb && cb(id = at.link || at.soul || Gun.valid(msg.put) || ((msg.put||{})._||{})['#'], as, msg, eve);\n\t\t\t\t} //);\n\t\t\t}, {out: {get: {'.':true}}});\n\t\t\treturn gun;\n\t\t}\n\t\tfunction rid(at){\n\t\t\tvar cat = this.at || this.on;\n\t\t\tif(!at || cat.soul || cat.has){ return this.off() }\n\t\t\tif(!(at = (at = (at = at.$ || at)._ || at).id)){ return }\n\t\t\tvar map = cat.map, tmp, seen;\n\t\t\t//if(!map || !(tmp = map[at]) || !(tmp = tmp.at)){ return }\n\t\t\tif(tmp = (seen = this.seen || (this.seen = {}))[at]){ return true }\n\t\t\tseen[at] = true;\n\t\t\treturn;\n\t\t\t//tmp.echo[cat.id] = {}; // TODO: Warning: This unsubscribes ALL of this chain's listeners from this link, not just the one callback event.\n\t\t\t//obj.del(map, at); // TODO: Warning: This unsubscribes ALL of this chain's listeners from this link, not just the one callback event.\n\t\t\treturn;\n\t\t}\n\t\tvar empty = {}, valid = Gun.valid, u;\n\t})(USE, './get');\n\n\t;USE(function(module){\n\t\tvar Gun = USE('./root');\n\t\tGun.chain.put = function(data, cb, as){ // I rewrote it :)\n\t\t\tvar gun = this, at = gun._, root = at.root;\n\t\t\tas = as || {};\n\t\t\tas.root = at.root;\n\t\t\tas.run || (as.run = root.once);\n\t\t\tstun(as, at.id); // set a flag for reads to check if this chain is writing.\n\t\t\tas.ack = as.ack || cb;\n\t\t\tas.via = as.via || gun;\n\t\t\tas.data = as.data || data;\n\t\t\tas.soul || (as.soul = at.soul || ('string' == typeof cb && cb));\n\t\t\tvar s = as.state = as.state || Gun.state();\n\t\t\tif('function' == typeof data){ data(function(d){ as.data = d; gun.put(u,u,as) }); return gun }\n\t\t\tif(!as.soul){ return get(as), gun }\n\t\t\tas.$ = root.$.get(as.soul); // TODO: This may not allow user chaining and similar?\n\t\t\tas.todo = [{it: as.data, ref: as.$}];\n\t\t\tas.turn = as.turn || turn;\n\t\t\tas.ran = as.ran || ran;\n\t\t\t//var path = []; as.via.back(at => { at.get && path.push(at.get.slice(0,9)) }); path = path.reverse().join('.');\n\t\t\t// TODO: Perf! We only need to stun chains that are being modified, not necessarily written to.\n\t\t\t(function walk(){\n\t\t\t\tvar to = as.todo, at = to.pop(), d = at.it, cid = at.ref && at.ref._.id, v, k, cat, tmp, g;\n\t\t\t\tstun(as, at.ref);\n\t\t\t\tif(tmp = at.todo){\n\t\t\t\t\tk = tmp.pop(); d = d[k];\n\t\t\t\t\tif(tmp.length){ to.push(at) }\n\t\t\t\t}\n\t\t\t\tk && (to.path || (to.path = [])).push(k);\n\t\t\t\tif(!(v = valid(d)) && !(g = Gun.is(d))){\n\t\t\t\t\tif(!Object.plain(d)){ ran.err(as, \"Invalid data: \"+ check(d) +\" at \" + (as.via.back(function(at){at.get && tmp.push(at.get)}, tmp = []) || tmp.join('.'))+'.'+(to.path||[]).join('.')); return }\n\t\t\t\t\tvar seen = as.seen || (as.seen = []), i = seen.length;\n\t\t\t\t\twhile(i--){ if(d === (tmp = seen[i]).it){ v = d = tmp.link; break } }\n\t\t\t\t}\n\t\t\t\tif(k && v){ at.node = state_ify(at.node, k, s, d) } // handle soul later.\n\t\t\t\telse {\n\t\t\t\t\tif(!as.seen){ ran.err(as, \"Data at root of graph must be a node (an object).\"); return }\n\t\t\t\t\tas.seen.push(cat = {it: d, link: {}, todo: g? [] : Object.keys(d).sort().reverse(), path: (to.path||[]).slice(), up: at}); // Any perf reasons to CPU schedule this .keys( ?\n\t\t\t\t\tat.node = state_ify(at.node, k, s, cat.link);\n\t\t\t\t\t!g && cat.todo.length && to.push(cat);\n\t\t\t\t\t// ---------------\n\t\t\t\t\tvar id = as.seen.length;\n\t\t\t\t\t(as.wait || (as.wait = {}))[id] = '';\n\t\t\t\t\ttmp = (cat.ref = (g? d : k? at.ref.get(k) : at.ref))._;\n\t\t\t\t\t(tmp = (d && (d._||'')['#']) || tmp.soul || tmp.link)? resolve({soul: tmp}) : cat.ref.get(resolve, {run: as.run, /*hatch: 0,*/ v2020:1, out:{get:{'.':' '}}}); // TODO: BUG! This should be resolve ONLY soul to prevent full data from being loaded. // Fixed now?\n\t\t\t\t\t//setTimeout(function(){ if(F){ return } console.log(\"I HAVE NOT BEEN CALLED!\", path, id, cat.ref._.id, k) }, 9000); var F; // MAKE SURE TO ADD F = 1 below!\n\t\t\t\t\tfunction resolve(msg, eve){\n\t\t\t\t\t\tvar end = cat.link['#'];\n\t\t\t\t\t\tif(eve){ eve.off(); eve.rid(msg) } // TODO: Too early! Check all peers ack not found.\n\t\t\t\t\t\t// TODO: BUG maybe? Make sure this does not pick up a link change wipe, that it uses the changign link instead.\n\t\t\t\t\t\tvar soul = end || msg.soul || (tmp = (msg.$$||msg.$)._||'').soul || tmp.link || ((tmp = tmp.put||'')._||'')['#'] || tmp['#'] || (((tmp = msg.put||'') && msg.$$)? tmp['#'] : (tmp['=']||tmp[':']||'')['#']);\n\t\t\t\t\t\t!end && stun(as, msg.$);\n\t\t\t\t\t\tif(!soul && !at.link['#']){ // check soul link above us\n\t\t\t\t\t\t\t(at.wait || (at.wait = [])).push(function(){ resolve(msg, eve) }) // wait\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(!soul){\n\t\t\t\t\t\t\tsoul = [];\n\t\t\t\t\t\t\t(msg.$$||msg.$).back(function(at){\n\t\t\t\t\t\t\t\tif(tmp = at.soul || at.link){ return soul.push(tmp) }\n\t\t\t\t\t\t\t\tsoul.push(at.get);\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tsoul = soul.reverse().join('/');\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcat.link['#'] = soul;\n\t\t\t\t\t\t!g && (((as.graph || (as.graph = {}))[soul] = (cat.node || (cat.node = {_:{}})))._['#'] = soul);\n\t\t\t\t\t\tdelete as.wait[id];\n\t\t\t\t\t\tcat.wait && setTimeout.each(cat.wait, function(cb){ cb && cb() });\n\t\t\t\t\t\tas.ran(as);\n\t\t\t\t\t};\n\t\t\t\t\t// ---------------\n\t\t\t\t}\n\t\t\t\tif(!to.length){ return as.ran(as) }\n\t\t\t\tas.turn(walk);\n\t\t\t}());\n\t\t\treturn gun;\n\t\t}\n\n\t\tfunction stun(as, id){\n\t\t\tif(!id){ return } id = (id._||'').id||id;\n\t\t\tvar run = as.root.stun || (as.root.stun = {on: Gun.on}), test = {}, tmp;\n\t\t\tas.stun || (as.stun = run.on('stun', function(){ }));\n\t\t\tif(tmp = run.on(''+id)){ tmp.the.last.next(test) }\n\t\t\tif(test.run >= as.run){ return }\n\t\t\trun.on(''+id, function(test){\n\t\t\t\tif(as.stun.end){\n\t\t\t\t\tthis.off();\n\t\t\t\t\tthis.to.next(test);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\ttest.run = test.run || as.run;\n\t\t\t\ttest.stun = test.stun || as.stun; return;\n\t\t\t\tif(this.to.to){\n\t\t\t\t\tthis.the.last.next(test);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\ttest.stun = as.stun;\n\t\t\t});\n\t\t}\n\n\t\tfunction ran(as){\n\t\t\tif(as.err){ ran.end(as.stun, as.root); return } // move log handle here.\n\t\t\tif(as.todo.length || as.end || !Object.empty(as.wait)){ return } as.end = 1;\n\t\t\t//(as.retry = function(){ as.acks = 0;\n\t\t\tvar cat = (as.$.back(-1)._), root = cat.root, ask = cat.ask(function(ack){\n\t\t\t\troot.on('ack', ack);\n\t\t\t\tif(ack.err && !ack.lack){ Gun.log(ack) }\n\t\t\t\tif(++acks > (as.acks || 0)){ this.off() } // Adjustable ACKs! Only 1 by default.\n\t\t\t\tif(!as.ack){ return }\n\t\t\t\tas.ack(ack, this);\n\t\t\t}, as.opt), acks = 0, stun = as.stun, tmp;\n\t\t\t(tmp = function(){ // this is not official yet, but quick solution to hack in for now.\n\t\t\t\tif(!stun){ return }\n\t\t\t\tran.end(stun, root);\n\t\t\t\tsetTimeout.each(Object.keys(stun = stun.add||''), function(cb){ if(cb = stun[cb]){cb()} }); // resume the stunned reads // Any perf reasons to CPU schedule this .keys( ?\n\t\t\t}).hatch = tmp; // this is not official yet ^\n\t\t\t//console.log(1, \"PUT\", as.run, as.graph);\n\t\t\tif(as.ack && !as.ok){ as.ok = as.acks || 9 } // TODO: In future! Remove this! This is just old API support.\n\t\t\t(as.via._).on('out', {put: as.out = as.graph, ok: as.ok && {'@': as.ok+1}, opt: as.opt, '#': ask, _: tmp});\n\t\t\t//})();\n\t\t}; ran.end = function(stun,root){\n\t\t\tstun.end = noop; // like with the earlier id, cheaper to make this flag a function so below callbacks do not have to do an extra type check.\n\t\t\tif(stun.the.to === stun && stun === stun.the.last){ delete root.stun }\n\t\t\tstun.off();\n\t\t}; ran.err = function(as, err){\n\t\t\t(as.ack||noop).call(as, as.out = { err: as.err = Gun.log(err) });\n\t\t\tas.ran(as);\n\t\t}\n\n\t\tfunction get(as){\n\t\t\tvar at = as.via._, tmp;\n\t\t\tas.via = as.via.back(function(at){\n\t\t\t\tif(at.soul || !at.get){ return at.$ }\n\t\t\t\ttmp = as.data; (as.data = {})[at.get] = tmp;\n\t\t\t});\n\t\t\tif(!as.via || !as.via._.soul){\n\t\t\t\tas.via = at.root.$.get(((as.data||'')._||'')['#'] || at.$.back('opt.uuid')())\n\t\t\t}\n\t\t\tas.via.put(as.data, as.ack, as);\n\t\t\t\n\n\t\t\treturn;\n\t\t\tif(at.get && at.back.soul){\n\t\t\t\ttmp = as.data;\n\t\t\t\tas.via = at.back.$;\n\t\t\t\t(as.data = {})[at.get] = tmp; \n\t\t\t\tas.via.put(as.data, as.ack, as);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tfunction check(d, tmp){ return ((d && (tmp = d.constructor) && tmp.name) || typeof d) }\n\n\t\tvar u, empty = {}, noop = function(){}, turn = setTimeout.turn, valid = Gun.valid, state_ify = Gun.state.ify;\n\t\tvar iife = function(fn,as){fn.call(as||empty)}\n\t})(USE, './put');\n\n\t;USE(function(module){\n\t\tvar Gun = USE('./root');\n\t\tUSE('./chain');\n\t\tUSE('./back');\n\t\tUSE('./put');\n\t\tUSE('./get');\n\t\tmodule.exports = Gun;\n\t})(USE, './index');\n\n\t;USE(function(module){\n\t\tvar Gun = USE('./index');\n\t\tGun.chain.on = function(tag, arg, eas, as){ // don't rewrite!\n\t\t\tvar gun = this, cat = gun._, root = cat.root, act, off, id, tmp;\n\t\t\tif(typeof tag === 'string'){\n\t\t\t\tif(!arg){ return cat.on(tag) }\n\t\t\t\tact = cat.on(tag, arg, eas || cat, as);\n\t\t\t\tif(eas && eas.$){\n\t\t\t\t\t(eas.subs || (eas.subs = [])).push(act);\n\t\t\t\t}\n\t\t\t\treturn gun;\n\t\t\t}\n\t\t\tvar opt = arg;\n\t\t\t(opt = (true === opt)? {change: true} : opt || {}).not = 1; opt.on = 1;\n\t\t\t//opt.at = cat;\n\t\t\t//opt.ok = tag;\n\t\t\t//opt.last = {};\n\t\t\tvar wait = {}; // can we assign this to the at instead, like in once?\n\t\t\tgun.get(tag, opt);\n\t\t\t/*gun.get(function on(data,key,msg,eve){ var $ = this;\n\t\t\t\tif(tmp = root.hatch){ // quick hack!\n\t\t\t\t\tif(wait[$._.id]){ return } wait[$._.id] = 1;\n\t\t\t\t\ttmp.push(function(){on.call($, data,key,msg,eve)});\n\t\t\t\t\treturn;\n\t\t\t\t}; wait = {}; // end quick hack.\n\t\t\t\ttag.call($, data,key,msg,eve);\n\t\t\t}, opt); // TODO: PERF! Event listener leak!!!?*/\n\t\t\t/*\n\t\t\tfunction one(msg, eve){\n\t\t\t\tif(one.stun){ return }\n\t\t\t\tvar at = msg.$._, data = at.put, tmp;\n\t\t\t\tif(tmp = at.link){ data = root.$.get(tmp)._.put }\n\t\t\t\tif(opt.not===u && u === data){ return }\n\t\t\t\tif(opt.stun===u && (tmp = root.stun) && (tmp = tmp[at.id] || tmp[at.back.id]) && !tmp.end){ // Remember! If you port this into `.get(cb` make sure you allow stun:0 skip option for `.put(`.\n\t\t\t\t\ttmp[id] = function(){one(msg,eve)};\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t//tmp = one.wait || (one.wait = {}); console.log(tmp[at.id] === ''); if(tmp[at.id] !== ''){ tmp[at.id] = tmp[at.id] || setTimeout(function(){tmp[at.id]='';one(msg,eve)},1); return } delete tmp[at.id];\n\t\t\t\t// call:\n\t\t\t\tif(opt.as){\n\t\t\t\t\topt.ok.call(opt.as, msg, eve || one);\n\t\t\t\t} else {\n\t\t\t\t\topt.ok.call(at.$, data, msg.get || at.get, msg, eve || one);\n\t\t\t\t}\n\t\t\t};\n\t\t\tone.at = cat;\n\t\t\t(cat.act||(cat.act={}))[id = String.random(7)] = one;\n\t\t\tone.off = function(){ one.stun = 1; if(!cat.act){ return } delete cat.act[id] }\n\t\t\tcat.on('out', {get: {}});*/\n\t\t\treturn gun;\n\t\t}\n\t\t// Rules:\n\t\t// 1. If cached, should be fast, but not read while write.\n\t\t// 2. Should not retrigger other listeners, should get triggered even if nothing found.\n\t\t// 3. If the same callback passed to many different once chains, each should resolve - an unsubscribe from the same callback should not effect the state of the other resolving chains, if you do want to cancel them all early you should mutate the callback itself with a flag & check for it at top of callback\n\t\tGun.chain.once = function(cb, opt){ opt = opt || {}; // avoid rewriting\n\t\t\tif(!cb){ return none(this,opt) }\n\t\t\tvar gun = this, cat = gun._, root = cat.root, data = cat.put, id = String.random(7), one, tmp;\n\t\t\tgun.get(function(data,key,msg,eve){\n\t\t\t\tvar $ = this, at = $._, one = (at.one||(at.one={}));\n\t\t\t\tif(eve.stun){ return } if('' === one[id]){ return }\n\t\t\t\tif(true === (tmp = Gun.valid(data))){ once(); return }\n\t\t\t\tif('string' == typeof tmp){ return } // TODO: BUG? Will this always load?\n\t\t\t\tclearTimeout((cat.one||'')[id]); // clear \"not found\" since they only get set on cat.\n\t\t\t\tclearTimeout(one[id]); one[id] = setTimeout(once, opt.wait||99); // TODO: Bug? This doesn't handle plural chains.\n\t\t\t\tfunction once(f){\n\t\t\t\t\tif(!at.has && !at.soul){ at = {put: data, get: key} } // handles non-core messages.\n\t\t\t\t\tif(u === (tmp = at.put)){ tmp = ((msg.$$||'')._||'').put }\n\t\t\t\t\tif('string' == typeof Gun.valid(tmp)){\n\t\t\t\t\t\ttmp = root.$.get(tmp)._.put;\n\t\t\t\t\t\tif(tmp === u && !f){\n\t\t\t\t\t\t\tone[id] = setTimeout(function(){ once(1) }, opt.wait||99); // TODO: Quick fix. Maybe use ack count for more predictable control?\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t//console.log(\"AND VANISHED\", data);\n\t\t\t\t\tif(eve.stun){ return } if('' === one[id]){ return } one[id] = '';\n\t\t\t\t\tif(cat.soul || cat.has){ eve.off() } // TODO: Plural chains? // else { ?.off() } // better than one check?\n\t\t\t\t\tcb.call($, tmp, at.get);\n\t\t\t\t\tclearTimeout(one[id]); // clear \"not found\" since they only get set on cat. // TODO: This was hackily added, is it necessary or important? Probably not, in future try removing this. Was added just as a safety for the `&& !f` check.\n\t\t\t\t};\n\t\t\t}, {on: 1});\n\t\t\treturn gun;\n\t\t}\n\t\tfunction none(gun,opt,chain){\n\t\t\tGun.log.once(\"valonce\", \"Chainable val is experimental, its behavior and API may change moving forward. Please play with it and report bugs and ideas on how to improve it.\");\n\t\t\t(chain = gun.chain())._.nix = gun.once(function(data, key){ chain._.on('in', this._) });\n\t\t\tchain._.lex = gun._.lex; // TODO: Better approach in future? This is quick for now.\n\t\t\treturn chain;\n\t\t}\n\n\t\tGun.chain.off = function(){\n\t\t\t// make off more aggressive. Warning, it might backfire!\n\t\t\tvar gun = this, at = gun._, tmp;\n\t\t\tvar cat = at.back;\n\t\t\tif(!cat){ return }\n\t\t\tat.ack = 0; // so can resubscribe.\n\t\t\tif(tmp = cat.next){\n\t\t\t\tif(tmp[at.get]){\n\t\t\t\t\tdelete tmp[at.get];\n\t\t\t\t} else {\n\n\t\t\t\t}\n\t\t\t}\n\t\t\t// TODO: delete cat.one[map.id]?\n\t\t\tif(tmp = cat.ask){\n\t\t\t\tdelete tmp[at.get];\n\t\t\t}\n\t\t\tif(tmp = cat.put){\n\t\t\t\tdelete tmp[at.get];\n\t\t\t}\n\t\t\tif(tmp = at.soul){\n\t\t\t\tdelete cat.root.graph[tmp];\n\t\t\t}\n\t\t\tif(tmp = at.map){\n\t\t\t\tObject.keys(tmp).forEach(function(i,at){ at = tmp[i]; //obj_map(tmp, function(at){\n\t\t\t\t\tif(at.link){\n\t\t\t\t\t\tcat.root.$.get(at.link).off();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\tif(tmp = at.next){\n\t\t\t\tObject.keys(tmp).forEach(function(i,neat){ neat = tmp[i]; //obj_map(tmp, function(neat){\n\t\t\t\t\tneat.$.off();\n\t\t\t\t});\n\t\t\t}\n\t\t\tat.on('off', {});\n\t\t\treturn gun;\n\t\t}\n\t\tvar empty = {}, noop = function(){}, u;\n\t})(USE, './on');\n\n\t;USE(function(module){\n\t\tvar Gun = USE('./index'), next = Gun.chain.get.next;\n\t\tGun.chain.get.next = function(gun, lex){ var tmp;\n\t\t\tif(!Object.plain(lex)){ return (next||noop)(gun, lex) }\n\t\t\tif(tmp = ((tmp = lex['#'])||'')['='] || tmp){ return gun.get(tmp) }\n\t\t\t(tmp = gun.chain()._).lex = lex; // LEX!\n\t\t\tgun.on('in', function(eve){\n\t\t\t\tif(String.match(eve.get|| (eve.put||'')['.'], lex['.'] || lex['#'] || lex)){\n\t\t\t\t\ttmp.on('in', eve);\n\t\t\t\t}\n\t\t\t\tthis.to.next(eve);\n\t\t\t});\n\t\t\treturn tmp.$;\n\t\t}\n\t\tGun.chain.map = function(cb, opt, t){\n\t\t\tvar gun = this, cat = gun._, lex, chain;\n\t\t\tif(Object.plain(cb)){ lex = cb['.']? cb : {'.': cb}; cb = u }\n\t\t\tif(!cb){\n\t\t\t\tif(chain = cat.each){ return chain }\n\t\t\t\t(cat.each = chain = gun.chain())._.lex = lex || chain._.lex || cat.lex;\n\t\t\t\tchain._.nix = gun.back('nix');\n\t\t\t\tgun.on('in', map, chain._);\n\t\t\t\treturn chain;\n\t\t\t}\n\t\t\tGun.log.once(\"mapfn\", \"Map functions are experimental, their behavior and API may change moving forward. Please play with it and report bugs and ideas on how to improve it.\");\n\t\t\tchain = gun.chain();\n\t\t\tgun.map().on(function(data, key, msg, eve){\n\t\t\t\tvar next = (cb||noop).call(this, data, key, msg, eve);\n\t\t\t\tif(u === next){ return }\n\t\t\t\tif(data === next){ return chain._.on('in', msg) }\n\t\t\t\tif(Gun.is(next)){ return chain._.on('in', next._) }\n\t\t\t\tvar tmp = {}; Object.keys(msg.put).forEach(function(k){ tmp[k] = msg.put[k] }, tmp); tmp['='] = next; \n\t\t\t\tchain._.on('in', {get: key, put: tmp});\n\t\t\t});\n\t\t\treturn chain;\n\t\t}\n\t\tfunction map(msg){ this.to.next(msg);\n\t\t\tvar cat = this.as, gun = msg.$, at = gun._, put = msg.put, tmp;\n\t\t\tif(!at.soul && !msg.$$){ return } // this line took hundreds of tries to figure out. It only works if core checks to filter out above chains during link tho. This says \"only bother to map on a node\" for this layer of the chain. If something is not a node, map should not work.\n\t\t\tif((tmp = cat.lex) && !String.match(msg.get|| (put||'')['.'], tmp['.'] || tmp['#'] || tmp)){ return }\n\t\t\tGun.on.link(msg, cat);\n\t\t}\n\t\tvar noop = function(){}, event = {stun: noop, off: noop}, u;\n\t})(USE, './map');\n\n\t;USE(function(module){\n\t\tvar Gun = USE('./index');\n\t\tGun.chain.set = function(item, cb, opt){\n\t\t\tvar gun = this, root = gun.back(-1), soul, tmp;\n\t\t\tcb = cb || function(){};\n\t\t\topt = opt || {}; opt.item = opt.item || item;\n\t\t\tif(soul = ((item||'')._||'')['#']){ (item = {})['#'] = soul } // check if node, make link.\n\t\t\tif('string' == typeof (tmp = Gun.valid(item))){ return gun.get(soul = tmp).put(item, cb, opt) } // check if link\n\t\t\tif(!Gun.is(item)){\n\t\t\t\tif(Object.plain(item)){\n\t\t\t\t\titem = root.get(soul = gun.back('opt.uuid')()).put(item);\n\t\t\t\t}\n\t\t\t\treturn gun.get(soul || root.back('opt.uuid')(7)).put(item, cb, opt);\n\t\t\t}\n\t\t\tgun.put(function(go){\n\t\t\t\titem.get(function(soul, o, msg){ // TODO: BUG! We no longer have this option? & go error not handled?\n\t\t\t\t\tif(!soul){ return cb.call(gun, {err: Gun.log('Only a node can be linked! Not \"' + msg.put + '\"!')}) }\n\t\t\t\t\t(tmp = {})[soul] = {'#': soul}; go(tmp);\n\t\t\t\t},true);\n\t\t\t})\n\t\t\treturn item;\n\t\t}\n\t})(USE, './set');\n\n\t;USE(function(module){\n\t\tUSE('./shim');\n\n\t\tvar noop = function(){}\n\t\tvar parse = JSON.parseAsync || function(t,cb,r){ var u, d = +new Date; try{ cb(u, JSON.parse(t,r), json.sucks(+new Date - d)) }catch(e){ cb(e) } }\n\t\tvar json = JSON.stringifyAsync || function(v,cb,r,s){ var u, d = +new Date; try{ cb(u, JSON.stringify(v,r,s), json.sucks(+new Date - d)) }catch(e){ cb(e) } }\n\t\tjson.sucks = function(d){ if(d > 99){ console.log(\"Warning: JSON blocking CPU detected. Add `gun/lib/yson.js` to fix.\"); json.sucks = noop } }\n\n\t\tfunction Mesh(root){\n\t\t\tvar mesh = function(){};\n\t\t\tvar opt = root.opt || {};\n\t\t\topt.log = opt.log || console.log;\n\t\t\topt.gap = opt.gap || opt.wait || 0;\n\t\t\topt.max = opt.max || (opt.memory? (opt.memory * 999 * 999) : 300000000) * 0.3;\n\t\t\topt.pack = opt.pack || (opt.max * 0.01 * 0.01);\n\t\t\topt.puff = opt.puff || 9; // IDEA: do a start/end benchmark, divide ops/result.\n\t\t\tvar puff = setTimeout.turn || setTimeout;\n\n\t\t\tvar dup = root.dup, dup_check = dup.check, dup_track = dup.track;\n\n\t\t\tvar ST = +new Date, LT = ST;\n\n\t\t\tvar hear = mesh.hear = function(raw, peer){\n\t\t\t\tif(!raw){ return }\n\t\t\t\tif(opt.max <= raw.length){ return mesh.say({dam: '!', err: \"Message too big!\"}, peer) }\n\t\t\t\tif(mesh === this){\n\t\t\t\t\t/*if('string' == typeof raw){ try{\n\t\t\t\t\t\tvar stat = console.STAT || {};\n\t\t\t\t\t\t//console.log('HEAR:', peer.id, (raw||'').slice(0,250), ((raw||'').length / 1024 / 1024).toFixed(4));\n\t\t\t\t\t\t\n\t\t\t\t\t\t//console.log(setTimeout.turn.s.length, 'stacks', parseFloat((-(LT - (LT = +new Date))/1000).toFixed(3)), 'sec', parseFloat(((LT-ST)/1000 / 60).toFixed(1)), 'up', stat.peers||0, 'peers', stat.has||0, 'has', stat.memhused||0, stat.memused||0, stat.memax||0, 'heap mem max');\n\t\t\t\t\t}catch(e){ console.log('DBG err', e) }}*/\n\t\t\t\t\thear.d += raw.length||0 ; ++hear.c } // STATS!\n\t\t\t\tvar S = peer.SH = +new Date;\n\t\t\t\tvar tmp = raw[0], msg;\n\t\t\t\t//raw && raw.slice && console.log(\"hear:\", ((peer.wire||'').headers||'').origin, raw.length, raw.slice && raw.slice(0,50)); //tc-iamunique-tc-package-ds1\n\t\t\t\tif('[' === tmp){\n\t\t\t\t\tparse(raw, function(err, msg){\n\t\t\t\t\t\tif(err || !msg){ return mesh.say({dam: '!', err: \"DAM JSON parse error.\"}, peer) }\n\t\t\t\t\t\tconsole.STAT && console.STAT(+new Date, msg.length, '# on hear batch');\n\t\t\t\t\t\tvar P = opt.puff;\n\t\t\t\t\t\t(function go(){\n\t\t\t\t\t\t\tvar S = +new Date;\n\t\t\t\t\t\t\tvar i = 0, m; while(i < P && (m = msg[i++])){ mesh.hear(m, peer) }\n\t\t\t\t\t\t\tmsg = msg.slice(i); // slicing after is faster than shifting during.\n\t\t\t\t\t\t\tconsole.STAT && console.STAT(S, +new Date - S, 'hear loop');\n\t\t\t\t\t\t\tflush(peer); // force send all synchronously batched acks.\n\t\t\t\t\t\t\tif(!msg.length){ return }\n\t\t\t\t\t\t\tpuff(go, 0);\n\t\t\t\t\t\t}());\n\t\t\t\t\t});\n\t\t\t\t\traw = ''; // \n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif('{' === tmp || ((raw['#'] || Object.plain(raw)) && (msg = raw))){\n\t\t\t\t\tif(msg){ return hear.one(msg, peer, S) }\n\t\t\t\t\tparse(raw, function(err, msg){\n\t\t\t\t\t\tif(err || !msg){ return mesh.say({dam: '!', err: \"DAM JSON parse error.\"}, peer) }\n\t\t\t\t\t\thear.one(msg, peer, S);\n\t\t\t\t\t});\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\thear.one = function(msg, peer, S){ // S here is temporary! Undo.\n\t\t\t\tvar id, hash, tmp, ash, DBG;\n\t\t\t\tif(msg.DBG){ msg.DBG = DBG = {DBG: msg.DBG} }\n\t\t\t\tDBG && (DBG.h = S);\n\t\t\t\tDBG && (DBG.hp = +new Date);\n\t\t\t\tif(!(id = msg['#'])){ id = msg['#'] = String.random(9) }\n\t\t\t\tif(tmp = dup_check(id)){ return }\n\t\t\t\t// DAM logic:\n\t\t\t\tif(!(hash = msg['##']) && false && u !== msg.put){ /*hash = msg['##'] = Type.obj.hash(msg.put)*/ } // disable hashing for now // TODO: impose warning/penalty instead (?)\n\t\t\t\tif(hash && (tmp = msg['@'] || (msg.get && id)) && dup.check(ash = tmp+hash)){ return } // Imagine A <-> B <=> (C & D), C & D reply with same ACK but have different IDs, B can use hash to dedup. Or if a GET has a hash already, we shouldn't ACK if same.\n\t\t\t\t(msg._ = function(){}).via = mesh.leap = peer;\n\t\t\t\tif((tmp = msg['><']) && 'string' == typeof tmp){ tmp.slice(0,99).split(',').forEach(function(k){ this[k] = 1 }, (msg._).yo = {}) } // Peers already sent to, do not resend.\n\t\t\t\t// DAM ^\n\t\t\t\tif(tmp = msg.dam){\n\t\t\t\t\tif(tmp = mesh.hear[tmp]){\n\t\t\t\t\t\ttmp(msg, peer, root);\n\t\t\t\t\t}\n\t\t\t\t\tdup_track(id);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif(tmp = msg.ok){ msg._.near = tmp['/'] }\n\t\t\t\tvar S = +new Date;\n\t\t\t\tDBG && (DBG.is = S); peer.SI = id;\n\t\t\t\tdup_track.ed = function(d){\n\t\t\t\t\tif(id !== d){ return }\n\t\t\t\t\tdup_track.ed = 0;\n\t\t\t\t\tif(!(d = dup.s[id])){ return }\n\t\t\t\t\td.via = peer;\n\t\t\t\t\tif(msg.get){ d.it = msg }\n\t\t\t\t}\n\t\t\t\troot.on('in', mesh.last = msg);\n\t\t\t\tDBG && (DBG.hd = +new Date);\n\t\t\t\tconsole.STAT && console.STAT(S, +new Date - S, msg.get? 'msg get' : msg.put? 'msg put' : 'msg');\n\t\t\t\tdup_track(id); // in case 'in' does not call track.\n\t\t\t\tif(ash){ dup_track(ash) } //dup.track(tmp+hash, true).it = it(msg);\n\t\t\t\tmesh.leap = mesh.last = null; // warning! mesh.leap could be buggy.\n\t\t\t}\n\t\t\tvar tomap = function(k,i,m){m(k,true)};\n\t\t\thear.c = hear.d = 0;\n\n\t\t\t;(function(){\n\t\t\t\tvar SMIA = 0;\n\t\t\t\tvar loop;\n\t\t\t\tmesh.hash = function(msg, peer){ var h, s, t;\n\t\t\t\t\tvar S = +new Date;\n\t\t\t\t\tjson(msg.put, function hash(err, text){\n\t\t\t\t\t\tvar ss = (s || (s = t = text||'')).slice(0, 32768); // 1024 * 32\n\t\t\t\t\t h = String.hash(ss, h); s = s.slice(32768);\n\t\t\t\t\t if(s){ puff(hash, 0); return }\n\t\t\t\t\t\tconsole.STAT && console.STAT(S, +new Date - S, 'say json+hash');\n\t\t\t\t\t msg._.$put = t;\n\t\t\t\t\t msg['##'] = h;\n\t\t\t\t\t mesh.say(msg, peer);\n\t\t\t\t\t delete msg._.$put;\n\t\t\t\t\t}, sort);\n\t\t\t\t}\n\t\t\t\tfunction sort(k, v){ var tmp;\n\t\t\t\t\tif(!(v instanceof Object)){ return v }\n\t\t\t\t\tObject.keys(v).sort().forEach(sorta, {to: tmp = {}, on: v});\n\t\t\t\t\treturn tmp;\n\t\t\t\t} function sorta(k){ this.to[k] = this.on[k] }\n\n\t\t\t\tvar say = mesh.say = function(msg, peer){ var tmp;\n\t\t\t\t\tif((tmp = this) && (tmp = tmp.to) && tmp.next){ tmp.next(msg) } // compatible with middleware adapters.\n\t\t\t\t\tif(!msg){ return false }\n\t\t\t\t\tvar id, hash, raw, ack = msg['@'];\n//if(opt.super && (!ack || !msg.put)){ return } // TODO: MANHATTAN STUB //OBVIOUSLY BUG! But squelch relay. // :( get only is 100%+ CPU usage :(\n\t\t\t\t\tvar meta = msg._||(msg._=function(){});\n\t\t\t\t\tvar DBG = msg.DBG, S = +new Date; meta.y = meta.y || S; if(!peer){ DBG && (DBG.y = S) }\n\t\t\t\t\tif(!(id = msg['#'])){ id = msg['#'] = String.random(9) }\n\t\t\t\t\t!loop && dup_track(id);//.it = it(msg); // track for 9 seconds, default. Earth<->Mars would need more! // always track, maybe move this to the 'after' logic if we split function.\n\t\t\t\t\t//if(msg.put && (msg.err || (dup.s[id]||'').err)){ return false } // TODO: in theory we should not be able to stun a message, but for now going to check if it can help network performance preventing invalid data to relay.\n\t\t\t\t\tif(!(hash = msg['##']) && u !== msg.put && !meta.via && ack){ mesh.hash(msg, peer); return } // TODO: Should broadcasts be hashed?\n\t\t\t\t\tif(!peer && ack){ peer = ((tmp = dup.s[ack]) && (tmp.via || ((tmp = tmp.it) && (tmp = tmp._) && tmp.via))) || ((tmp = mesh.last) && ack === tmp['#'] && mesh.leap) } // warning! mesh.leap could be buggy! mesh last check reduces this. // TODO: CLEAN UP THIS LINE NOW? `.it` should be reliable.\n\t\t\t\t\tif(!peer && ack){ // still no peer, then ack daisy chain 'tunnel' got lost.\n\t\t\t\t\t\tif(dup.s[ack]){ return } // in dups but no peer hints that this was ack to ourself, ignore.\n\t\t\t\t\t\tconsole.STAT && console.STAT(+new Date, ++SMIA, 'total no peer to ack to'); // TODO: Delete this now. Dropping lost ACKs is protocol fine now.\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t} // TODO: Temporary? If ack via trace has been lost, acks will go to all peers, which trashes browser bandwidth. Not relaying the ack will force sender to ask for ack again. Note, this is technically wrong for mesh behavior.\n\t\t\t\t\tif(ack && !msg.put && !hash && ((dup.s[ack]||'').it||'')['##']){ return false } // If we're saying 'not found' but a relay had data, do not bother sending our not found. // Is this correct, return false? // NOTE: ADD PANIC TEST FOR THIS!\n\t\t\t\t\tif(!peer && mesh.way){ return mesh.way(msg) }\n\t\t\t\t\tDBG && (DBG.yh = +new Date);\n\t\t\t\t\tif(!(raw = meta.raw)){ mesh.raw(msg, peer); return }\n\t\t\t\t\tDBG && (DBG.yr = +new Date);\n\t\t\t\t\tif(!peer || !peer.id){\n\t\t\t\t\t\tif(!Object.plain(peer || opt.peers)){ return false }\n\t\t\t\t\t\tvar S = +new Date;\n\t\t\t\t\t\tvar P = opt.puff, ps = opt.peers, pl = Object.keys(peer || opt.peers || {}); // TODO: .keys( is slow\n\t\t\t\t\t\tconsole.STAT && console.STAT(S, +new Date - S, 'peer keys');\n\t\t\t\t\t\t;(function go(){\n\t\t\t\t\t\t\tvar S = +new Date;\n\t\t\t\t\t\t\t//Type.obj.map(peer || opt.peers, each); // in case peer is a peer list.\n\t\t\t\t\t\t\tloop = 1; var wr = meta.raw; meta.raw = raw; // quick perf hack\n\t\t\t\t\t\t\tvar i = 0, p; while(i < 9 && (p = (pl||'')[i++])){\n\t\t\t\t\t\t\t\tif(!(p = ps[p] || (peer||'')[p])){ continue }\n\t\t\t\t\t\t\t\tmesh.say(msg, p);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tmeta.raw = wr; loop = 0;\n\t\t\t\t\t\t\tpl = pl.slice(i); // slicing after is faster than shifting during.\n\t\t\t\t\t\t\tconsole.STAT && console.STAT(S, +new Date - S, 'say loop');\n\t\t\t\t\t\t\tif(!pl.length){ return }\n\t\t\t\t\t\t\tpuff(go, 0);\n\t\t\t\t\t\t\tack && dup_track(ack); // keep for later\n\t\t\t\t\t\t}());\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\t// TODO: PERF: consider splitting function here, so say loops do less work.\n\t\t\t\t\tif(!peer.wire && mesh.wire){ mesh.wire(peer) }\n\t\t\t\t\tif(id === peer.last){ return } peer.last = id; // was it just sent?\n\t\t\t\t\tif(peer === meta.via){ return false } // don't send back to self.\n\t\t\t\t\tif((tmp = meta.yo) && (tmp[peer.url] || tmp[peer.pid] || tmp[peer.id]) /*&& !o*/){ return false }\n\t\t\t\t\tconsole.STAT && console.STAT(S, ((DBG||meta).yp = +new Date) - (meta.y || S), 'say prep');\n\t\t\t\t\t!loop && ack && dup_track(ack); // streaming long responses needs to keep alive the ack.\n\t\t\t\t\tif(peer.batch){\n\t\t\t\t\t\tpeer.tail = (tmp = peer.tail || 0) + raw.length;\n\t\t\t\t\t\tif(peer.tail <= opt.pack){\n\t\t\t\t\t\t\tpeer.batch += (tmp?',':'')+raw;\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tflush(peer);\n\t\t\t\t\t}\n\t\t\t\t\tpeer.batch = '['; // Prevents double JSON!\n\t\t\t\t\tvar ST = +new Date;\n\t\t\t\t\tsetTimeout(function(){\n\t\t\t\t\t\tconsole.STAT && console.STAT(ST, +new Date - ST, '0ms TO');\n\t\t\t\t\t\tflush(peer);\n\t\t\t\t\t}, opt.gap); // TODO: queuing/batching might be bad for low-latency video game performance! Allow opt out?\n\t\t\t\t\tsend(raw, peer);\n\t\t\t\t\tconsole.STAT && (ack === peer.SI) && console.STAT(S, +new Date - peer.SH, 'say ack');\n\t\t\t\t}\n\t\t\t\tmesh.say.c = mesh.say.d = 0;\n\t\t\t\t// TODO: this caused a out-of-memory crash!\n\t\t\t\tmesh.raw = function(msg, peer){ // TODO: Clean this up / delete it / move logic out!\n\t\t\t\t\tif(!msg){ return '' }\n\t\t\t\t\tvar meta = (msg._) || {}, put, tmp;\n\t\t\t\t\tif(tmp = meta.raw){ return tmp }\n\t\t\t\t\tif('string' == typeof msg){ return msg }\n\t\t\t\t\tvar hash = msg['##'], ack = msg['@'];\n\t\t\t\t\tif(hash && ack){\n\t\t\t\t\t\tif(!meta.via && dup_check(ack+hash)){ return false } // for our own out messages, memory & storage may ack the same thing, so dedup that. Tho if via another peer, we already tracked it upon hearing, so this will always trigger false positives, so don't do that!\n\t\t\t\t\t\tif(tmp = (dup.s[ack]||'').it){\n\t\t\t\t\t\t\tif(hash === tmp['##']){ return false } // if ask has a matching hash, acking is optional.\n\t\t\t\t\t\t\tif(!tmp['##']){ tmp['##'] = hash } // if none, add our hash to ask so anyone we relay to can dedup. // NOTE: May only check against 1st ack chunk, 2nd+ won't know and still stream back to relaying peers which may then dedup. Any way to fix this wasted bandwidth? I guess force rate limiting breaking change, that asking peer has to ask for next lexical chunk.\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif(!msg.dam && !msg['@']){\n\t\t\t\t\t\tvar i = 0, to = []; tmp = opt.peers;\n\t\t\t\t\t\tfor(var k in tmp){ var p = tmp[k]; // TODO: Make it up peers instead!\n\t\t\t\t\t\t\tto.push(p.url || p.pid || p.id);\n\t\t\t\t\t\t\tif(++i > 6){ break }\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(i > 1){ msg['><'] = to.join() } // TODO: BUG! This gets set regardless of peers sent to! Detect?\n\t\t\t\t\t}\n\t\t\t\t\tif(msg.put && (tmp = msg.ok)){ msg.ok = {'@':(tmp['@']||1)-1, '/': (tmp['/']==msg._.near)? mesh.near : tmp['/']}; }\n\t\t\t\t\tif(put = meta.$put){\n\t\t\t\t\t\ttmp = {}; Object.keys(msg).forEach(function(k){ tmp[k] = msg[k] });\n\t\t\t\t\t\ttmp.put = ':])([:';\n\t\t\t\t\t\tjson(tmp, function(err, raw){\n\t\t\t\t\t\t\tif(err){ return } // TODO: Handle!!\n\t\t\t\t\t\t\tvar S = +new Date;\n\t\t\t\t\t\t\ttmp = raw.indexOf('\"put\":\":])([:\"');\n\t\t\t\t\t\t\tres(u, raw = raw.slice(0, tmp+6) + put + raw.slice(tmp + 14));\n\t\t\t\t\t\t\tconsole.STAT && console.STAT(S, +new Date - S, 'say slice');\n\t\t\t\t\t\t});\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tjson(msg, res);\n\t\t\t\t\tfunction res(err, raw){\n\t\t\t\t\t\tif(err){ return } // TODO: Handle!!\n\t\t\t\t\t\tmeta.raw = raw; //if(meta && (raw||'').length < (999 * 99)){ meta.raw = raw } // HNPERF: If string too big, don't keep in memory.\n\t\t\t\t\t\tmesh.say(msg, peer);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}());\n\n\t\t\tfunction flush(peer){\n\t\t\t\tvar tmp = peer.batch, t = 'string' == typeof tmp, l;\n\t\t\t\tif(t){ tmp += ']' }// TODO: Prevent double JSON!\n\t\t\t\tpeer.batch = peer.tail = null;\n\t\t\t\tif(!tmp){ return }\n\t\t\t\tif(t? 3 > tmp.length : !tmp.length){ return } // TODO: ^\n\t\t\t\tif(!t){try{tmp = (1 === tmp.length? tmp[0] : JSON.stringify(tmp));\n\t\t\t\t}catch(e){return opt.log('DAM JSON stringify error', e)}}\n\t\t\t\tif(!tmp){ return }\n\t\t\t\tsend(tmp, peer);\n\t\t\t}\n\t\t\t// for now - find better place later.\n\t\t\tfunction send(raw, peer){ try{\n\t\t\t\tvar wire = peer.wire;\n\t\t\t\tif(peer.say){\n\t\t\t\t\tpeer.say(raw);\n\t\t\t\t} else\n\t\t\t\tif(wire.send){\n\t\t\t\t\twire.send(raw);\n\t\t\t\t}\n\t\t\t\tmesh.say.d += raw.length||0; ++mesh.say.c; // STATS!\n\t\t\t}catch(e){\n\t\t\t\t(peer.queue = peer.queue || []).push(raw);\n\t\t\t}}\n\n\t\t\tmesh.near = 0;\n\t\t\tmesh.hi = function(peer){\n\t\t\t\tvar wire = peer.wire, tmp;\n\t\t\t\tif(!wire){ mesh.wire((peer.length && {url: peer, id: peer}) || peer); return }\n\t\t\t\tif(peer.id){\n\t\t\t\t\topt.peers[peer.url || peer.id] = peer;\n\t\t\t\t} else {\n\t\t\t\t\ttmp = peer.id = peer.id || peer.url || String.random(9);\n\t\t\t\t\tmesh.say({dam: '?', pid: root.opt.pid}, opt.peers[tmp] = peer);\n\t\t\t\t\tdelete dup.s[peer.last]; // IMPORTANT: see https://gun.eco/docs/DAM#self\n\t\t\t\t}\n\t\t\t\tif(!peer.met){\n\t\t\t\t\tmesh.near++;\n\t\t\t\t\tpeer.met = +(new Date);\n\t\t\t\t\troot.on('hi', peer)\n\t\t\t\t}\n\t\t\t\t// @rogowski I need this here by default for now to fix go1dfish's bug\n\t\t\t\ttmp = peer.queue; peer.queue = [];\n\t\t\t\tsetTimeout.each(tmp||[],function(msg){\n\t\t\t\t\tsend(msg, peer);\n\t\t\t\t},0,9);\n\t\t\t\t//Type.obj.native && Type.obj.native(); // dirty place to check if other JS polluted.\n\t\t\t}\n\t\t\tmesh.bye = function(peer){\n\t\t\t\tpeer.met && --mesh.near;\n\t\t\t\tdelete peer.met;\n\t\t\t\troot.on('bye', peer);\n\t\t\t\tvar tmp = +(new Date); tmp = (tmp - (peer.met||tmp));\n\t\t\t\tmesh.bye.time = ((mesh.bye.time || tmp) + tmp) / 2;\n\t\t\t}\n\t\t\tmesh.hear['!'] = function(msg, peer){ opt.log('Error:', msg.err) }\n\t\t\tmesh.hear['?'] = function(msg, peer){\n\t\t\t\tif(msg.pid){\n\t\t\t\t\tif(!peer.pid){ peer.pid = msg.pid }\n\t\t\t\t\tif(msg['@']){ return }\n\t\t\t\t}\n\t\t\t\tmesh.say({dam: '?', pid: opt.pid, '@': msg['#']}, peer);\n\t\t\t\tdelete dup.s[peer.last]; // IMPORTANT: see https://gun.eco/docs/DAM#self\n\t\t\t}\n\t\t\tmesh.hear['mob'] = function(msg, peer){ // NOTE: AXE will overload this with better logic.\n\t\t\t\tif(!msg.peers){ return }\n\t\t\t\tvar peers = Object.keys(msg.peers), one = peers[(Math.random()*peers.length) >> 0];\n\t\t\t\tif(!one){ return }\n\t\t\t\tmesh.bye(peer);\n\t\t\t\tmesh.hi(one);\n\t\t\t}\n\n\t\t\troot.on('create', function(root){\n\t\t\t\troot.opt.pid = root.opt.pid || String.random(9);\n\t\t\t\tthis.to.next(root);\n\t\t\t\troot.on('out', mesh.say);\n\t\t\t});\n\n\t\t\troot.on('bye', function(peer, tmp){\n\t\t\t\tpeer = opt.peers[peer.id || peer] || peer;\n\t\t\t\tthis.to.next(peer);\n\t\t\t\tpeer.bye? peer.bye() : (tmp = peer.wire) && tmp.close && tmp.close();\n\t\t\t\tdelete opt.peers[peer.id];\n\t\t\t\tpeer.wire = null;\n\t\t\t});\n\n\t\t\tvar gets = {};\n\t\t\troot.on('bye', function(peer, tmp){ this.to.next(peer);\n\t\t\t\tif(tmp = console.STAT){ tmp.peers = mesh.near; }\n\t\t\t\tif(!(tmp = peer.url)){ return } gets[tmp] = true;\n\t\t\t\tsetTimeout(function(){ delete gets[tmp] },opt.lack || 9000);\n\t\t\t});\n\t\t\troot.on('hi', function(peer, tmp){ this.to.next(peer);\n\t\t\t\tif(tmp = console.STAT){ tmp.peers = mesh.near }\n\t\t\t\tif(opt.super){ return } // temporary (?) until we have better fix/solution?\n\t\t\t\tvar souls = Object.keys(root.next||''); // TODO: .keys( is slow\n\t\t\t\tif(souls.length > 9999 && !console.SUBS){ console.log(console.SUBS = \"Warning: You have more than 10K live GETs, which might use more bandwidth than your screen can show - consider `.off()`.\") }\n\t\t\t\tsetTimeout.each(souls, function(soul){ var node = root.next[soul];\n\t\t\t\t\tif(opt.super || (node.ask||'')['']){ mesh.say({get: {'#': soul}}, peer); return }\n\t\t\t\t\tsetTimeout.each(Object.keys(node.ask||''), function(key){ if(!key){ return }\n\t\t\t\t\t\t// is the lack of ## a !onion hint?\n\t\t\t\t\t\tmesh.say({'##': String.hash((root.graph[soul]||'')[key]), get: {'#': soul, '.': key}}, peer);\n\t\t\t\t\t\t// TODO: Switch this so Book could route?\n\t\t\t\t\t})\n\t\t\t\t});\n\t\t\t});\n\n\t\t\treturn mesh;\n\t\t}\n\t var empty = {}, ok = true, u;\n\n\t try{ module.exports = Mesh }catch(e){}\n\n\t})(USE, './mesh');\n\n\t;USE(function(module){\n\t\tvar Gun = USE('./index');\n\t\tGun.Mesh = USE('./mesh');\n\n\t\t// TODO: resync upon reconnect online/offline\n\t\t//window.ononline = window.onoffline = function(){ console.log('online?', navigator.onLine) }\n\n\t\tGun.on('opt', function(root){\n\t\t\tthis.to.next(root);\n\t\t\tif(root.once){ return }\n\t\t\tvar opt = root.opt;\n\t\t\tif(false === opt.WebSocket){ return }\n\n\t\t\tvar env = Gun.window || {};\n\t\t\tvar websocket = opt.WebSocket || env.WebSocket || env.webkitWebSocket || env.mozWebSocket;\n\t\t\tif(!websocket){ return }\n\t\t\topt.WebSocket = websocket;\n\n\t\t\tvar mesh = opt.mesh = opt.mesh || Gun.Mesh(root);\n\n\t\t\tvar wire = mesh.wire || opt.wire;\n\t\t\tmesh.wire = opt.wire = open;\n\t\t\tfunction open(peer){ try{\n\t\t\t\tif(!peer || !peer.url){ return wire && wire(peer) }\n\t\t\t\tvar url = peer.url.replace(/^http/, 'ws');\n\t\t\t\tvar wire = peer.wire = new opt.WebSocket(url);\n\t\t\t\twire.onclose = function(){\n\t\t\t\t\treconnect(peer);\n\t\t\t\t\topt.mesh.bye(peer);\n\t\t\t\t};\n\t\t\t\twire.onerror = function(err){\n\t\t\t\t\treconnect(peer);\n\t\t\t\t};\n\t\t\t\twire.onopen = function(){\n\t\t\t\t\topt.mesh.hi(peer);\n\t\t\t\t}\n\t\t\t\twire.onmessage = function(msg){\n\t\t\t\t\tif(!msg){ return }\n\t\t\t\t\topt.mesh.hear(msg.data || msg, peer);\n\t\t\t\t};\n\t\t\t\treturn wire;\n\t\t\t}catch(e){ opt.mesh.bye(peer) }}\n\n\t\t\tsetTimeout(function(){ !opt.super && root.on('out', {dam:'hi'}) },1); // it can take a while to open a socket, so maybe no longer lazy load for perf reasons?\n\n\t\t\tvar wait = 2 * 999;\n\t\t\tfunction reconnect(peer){\n\t\t\t\tclearTimeout(peer.defer);\n\t\t\t\tif(!opt.peers[peer.url]){ return }\n\t\t\t\tif(doc && peer.retry <= 0){ return }\n\t\t\t\tpeer.retry = (peer.retry || opt.retry+1 || 60) - ((-peer.tried + (peer.tried = +new Date) < wait*4)?1:0);\n\t\t\t\tpeer.defer = setTimeout(function to(){\n\t\t\t\t\tif(doc && doc.hidden){ return setTimeout(to,wait) }\n\t\t\t\t\topen(peer);\n\t\t\t\t}, wait);\n\t\t\t}\n\t\t\tvar doc = (''+u !== typeof document) && document;\n\t\t});\n\t\tvar noop = function(){}, u;\n\t})(USE, './websocket');\n\n\t;USE(function(module){\n\t\tif(typeof Gun === 'undefined'){ return }\n\n\t\tvar noop = function(){}, store, u;\n\t\ttry{store = (Gun.window||noop).localStorage}catch(e){}\n\t\tif(!store){\n\t\t\tGun.log(\"Warning: No localStorage exists to persist data to!\");\n\t\t\tstore = {setItem: function(k,v){this[k]=v}, removeItem: function(k){delete this[k]}, getItem: function(k){return this[k]}};\n\t\t}\n\n\t\tvar parse = JSON.parseAsync || function(t,cb,r){ var u; try{ cb(u, JSON.parse(t,r)) }catch(e){ cb(e) } }\n\t\tvar json = JSON.stringifyAsync || function(v,cb,r,s){ var u; try{ cb(u, JSON.stringify(v,r,s)) }catch(e){ cb(e) } }\n\n\t\tGun.on('create', function lg(root){\n\t\t\tthis.to.next(root);\n\t\t\tvar opt = root.opt, graph = root.graph, acks = [], disk, to, size, stop;\n\t\t\tif(false === opt.localStorage){ return }\n\t\t\topt.prefix = opt.file || 'gun/';\n\t\t\ttry{ disk = lg[opt.prefix] = lg[opt.prefix] || JSON.parse(size = store.getItem(opt.prefix)) || {}; // TODO: Perf! This will block, should we care, since limited to 5MB anyways?\n\t\t\t}catch(e){ disk = lg[opt.prefix] = {}; }\n\t\t\tsize = (size||'').length;\n\n\t\t\troot.on('get', function(msg){\n\t\t\t\tthis.to.next(msg);\n\t\t\t\tvar lex = msg.get, soul, data, tmp, u;\n\t\t\t\tif(!lex || !(soul = lex['#'])){ return }\n\t\t\t\tdata = disk[soul] || u;\n\t\t\t\tif(data && (tmp = lex['.']) && !Object.plain(tmp)){ // pluck!\n\t\t\t\t\tdata = Gun.state.ify({}, tmp, Gun.state.is(data, tmp), data[tmp], soul);\n\t\t\t\t}\n\t\t\t\t//if(data){ (tmp = {})[soul] = data } // back into a graph.\n\t\t\t\t//setTimeout(function(){\n\t\t\t\tGun.on.get.ack(msg, data); //root.on('in', {'@': msg['#'], put: tmp, lS:1});// || root.$});\n\t\t\t\t//}, Math.random() * 10); // FOR TESTING PURPOSES!\n\t\t\t});\n\n\t\t\troot.on('put', function(msg){\n\t\t\t\tthis.to.next(msg); // remember to call next middleware adapter\n\t\t\t\tvar put = msg.put, soul = put['#'], key = put['.'], id = msg['#'], ok = msg.ok||'', tmp; // pull data off wire envelope\n\t\t\t\tdisk[soul] = Gun.state.ify(disk[soul], key, put['>'], put[':'], soul); // merge into disk object\n\t\t\t\tif(stop && size > (4999880)){ root.on('in', {'@': id, err: \"localStorage max!\"}); return; }\n\t\t\t\t//if(!msg['@']){ acks.push(id) } // then ack any non-ack write. // TODO: use batch id.\n\t\t\t\tif(!msg['@'] && (!msg._.via || Math.random() < (ok['@'] / ok['/']))){ acks.push(id) } // then ack any non-ack write. // TODO: use batch id.\n\t\t\t\tif(to){ return }\n\t\t\t\tto = setTimeout(flush, 9+(size / 333)); // 0.1MB = 0.3s, 5MB = 15s \n\t\t\t});\n\t\t\tfunction flush(){\n\t\t\t\tif(!acks.length && ((setTimeout.turn||'').s||'').length){ setTimeout(flush,99); return; } // defer if \"busy\" && no saves.\n\t\t\t\tvar err, ack = acks; clearTimeout(to); to = false; acks = [];\n\t\t\t\tjson(disk, function(err, tmp){\n\t\t\t\t\ttry{!err && store.setItem(opt.prefix, tmp);\n\t\t\t\t\t}catch(e){ err = stop = e || \"localStorage failure\" }\n\t\t\t\t\tif(err){\n\t\t\t\t\t\tGun.log(err + \" Consider using GUN's IndexedDB plugin for RAD for more storage space, https://gun.eco/docs/RAD#install\");\n\t\t\t\t\t\troot.on('localStorage:error', {err: err, get: opt.prefix, put: disk});\n\t\t\t\t\t}\n\t\t\t\t\tsize = tmp.length;\n\n\t\t\t\t\t//if(!err && !Object.empty(opt.peers)){ return } // only ack if there are no peers. // Switch this to probabilistic mode\n\t\t\t\t\tsetTimeout.each(ack, function(id){\n\t\t\t\t\t\troot.on('in', {'@': id, err: err, ok: 0}); // localStorage isn't reliable, so make its `ok` code be a low number.\n\t\t\t\t\t},0,99);\n\t\t\t\t})\n\t\t\t}\n\t\t\n\t\t});\n\t})(USE, './localStorage');\n\n}());\n\n/* BELOW IS TEMPORARY FOR OLD INTERNAL COMPATIBILITY, THEY ARE IMMEDIATELY DEPRECATED AND WILL BE REMOVED IN NEXT VERSION */\n;(function(){\n\tvar u;\n\tif(''+u == typeof Gun){ return }\n\tvar DEP = function(n){ console.warn(\"Warning! Deprecated internal utility will break in next version:\", n) }\n\t// Generic javascript utilities.\n\tvar Type = Gun;\n\t//Type.fns = Type.fn = {is: function(fn){ return (!!fn && fn instanceof Function) }}\n\tType.fn = Type.fn || {is: function(fn){ DEP('fn'); return (!!fn && 'function' == typeof fn) }}\n\tType.bi = Type.bi || {is: function(b){ DEP('bi');return (b instanceof Boolean || typeof b == 'boolean') }}\n\tType.num = Type.num || {is: function(n){ DEP('num'); return !list_is(n) && ((n - parseFloat(n) + 1) >= 0 || Infinity === n || -Infinity === n) }}\n\tType.text = Type.text || {is: function(t){ DEP('text'); return (typeof t == 'string') }}\n\tType.text.ify = Type.text.ify || function(t){ DEP('text.ify');\n\t\tif(Type.text.is(t)){ return t }\n\t\tif(typeof JSON !== \"undefined\"){ return JSON.stringify(t) }\n\t\treturn (t && t.toString)? t.toString() : t;\n\t}\n\tType.text.random = Type.text.random || function(l, c){ DEP('text.random');\n\t\tvar s = '';\n\t\tl = l || 24; // you are not going to make a 0 length random number, so no need to check type\n\t\tc = c || '0123456789ABCDEFGHIJKLMNOPQRSTUVWXZabcdefghijklmnopqrstuvwxyz';\n\t\twhile(l > 0){ s += c.charAt(Math.floor(Math.random() * c.length)); l-- }\n\t\treturn s;\n\t}\n\tType.text.match = Type.text.match || function(t, o){ var tmp, u; DEP('text.match');\n\t\tif('string' !== typeof t){ return false }\n\t\tif('string' == typeof o){ o = {'=': o} }\n\t\to = o || {};\n\t\ttmp = (o['='] || o['*'] || o['>'] || o['<']);\n\t\tif(t === tmp){ return true }\n\t\tif(u !== o['=']){ return false }\n\t\ttmp = (o['*'] || o['>'] || o['<']);\n\t\tif(t.slice(0, (tmp||'').length) === tmp){ return true }\n\t\tif(u !== o['*']){ return false }\n\t\tif(u !== o['>'] && u !== o['<']){\n\t\t\treturn (t >= o['>'] && t <= o['<'])? true : false;\n\t\t}\n\t\tif(u !== o['>'] && t >= o['>']){ return true }\n\t\tif(u !== o['<'] && t <= o['<']){ return true }\n\t\treturn false;\n\t}\n\tType.text.hash = Type.text.hash || function(s, c){ // via SO\n\t\tDEP('text.hash');\n\t\tif(typeof s !== 'string'){ return }\n\t c = c || 0;\n\t if(!s.length){ return c }\n\t for(var i=0,l=s.length,n; i B){ return 1 }\n\t\t\telse { return 0 }\n\t\t}\n\t}\n\tType.list.map = Type.list.map || function(l, c, _){ DEP('list.map'); return obj_map(l, c, _) }\n\tType.list.index = 1; // change this to 0 if you want non-logical, non-mathematical, non-matrix, non-convenient array notation\n\tType.obj = Type.boj || {is: function(o){ DEP('obj'); return o? (o instanceof Object && o.constructor === Object) || Object.prototype.toString.call(o).match(/^\\[object (\\w+)\\]$/)[1] === 'Object' : false }}\n\tType.obj.put = Type.obj.put || function(o, k, v){ DEP('obj.put'); return (o||{})[k] = v, o }\n\tType.obj.has = Type.obj.has || function(o, k){ DEP('obj.has'); return o && Object.prototype.hasOwnProperty.call(o, k) }\n\tType.obj.del = Type.obj.del || function(o, k){ DEP('obj.del'); \n\t\tif(!o){ return }\n\t\to[k] = null;\n\t\tdelete o[k];\n\t\treturn o;\n\t}\n\tType.obj.as = Type.obj.as || function(o, k, v, u){ DEP('obj.as'); return o[k] = o[k] || (u === v? {} : v) }\n\tType.obj.ify = Type.obj.ify || function(o){ DEP('obj.ify'); \n\t\tif(obj_is(o)){ return o }\n\t\ttry{o = JSON.parse(o);\n\t\t}catch(e){o={}};\n\t\treturn o;\n\t}\n\t;(function(){ var u;\n\t\tfunction map(v,k){\n\t\t\tif(obj_has(this,k) && u !== this[k]){ return }\n\t\t\tthis[k] = v;\n\t\t}\n\t\tType.obj.to = Type.obj.to || function(from, to){ DEP('obj.to'); \n\t\t\tto = to || {};\n\t\t\tobj_map(from, map, to);\n\t\t\treturn to;\n\t\t}\n\t}());\n\tType.obj.copy = Type.obj.copy || function(o){ DEP('obj.copy'); // because http://web.archive.org/web/20140328224025/http://jsperf.com/cloning-an-object/2\n\t\treturn !o? o : JSON.parse(JSON.stringify(o)); // is shockingly faster than anything else, and our data has to be a subset of JSON anyways!\n\t}\n\t;(function(){\n\t\tfunction empty(v,i){ var n = this.n, u;\n\t\t\tif(n && (i === n || (obj_is(n) && obj_has(n, i)))){ return }\n\t\t\tif(u !== i){ return true }\n\t\t}\n\t\tType.obj.empty = Type.obj.empty || function(o, n){ DEP('obj.empty'); \n\t\t\tif(!o){ return true }\n\t\t\treturn obj_map(o,empty,{n:n})? false : true;\n\t\t}\n\t}());\n\t;(function(){\n\t\tfunction t(k,v){\n\t\t\tif(2 === arguments.length){\n\t\t\t\tt.r = t.r || {};\n\t\t\t\tt.r[k] = v;\n\t\t\t\treturn;\n\t\t\t} t.r = t.r || [];\n\t\t\tt.r.push(k);\n\t\t};\n\t\tvar keys = Object.keys, map, u;\n\t\tObject.keys = Object.keys || function(o){ return map(o, function(v,k,t){t(k)}) }\n\t\tType.obj.map = map = Type.obj.map || function(l, c, _){ DEP('obj.map'); \n\t\t\tvar u, i = 0, x, r, ll, lle, f = 'function' == typeof c;\n\t\t\tt.r = u;\n\t\t\tif(keys && obj_is(l)){\n\t\t\t\tll = keys(l); lle = true;\n\t\t\t}\n\t\t\t_ = _ || {};\n\t\t\tif(list_is(l) || ll){\n\t\t\t\tx = (ll || l).length;\n\t\t\t\tfor(;i < x; i++){\n\t\t\t\t\tvar ii = (i + Type.list.index);\n\t\t\t\t\tif(f){\n\t\t\t\t\t\tr = lle? c.call(_, l[ll[i]], ll[i], t) : c.call(_, l[i], ii, t);\n\t\t\t\t\t\tif(r !== u){ return r }\n\t\t\t\t\t} else {\n\t\t\t\t\t\t//if(Type.test.is(c,l[i])){ return ii } // should implement deep equality testing!\n\t\t\t\t\t\tif(c === l[lle? ll[i] : i]){ return ll? ll[i] : ii } // use this for now\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor(i in l){\n\t\t\t\t\tif(f){\n\t\t\t\t\t\tif(obj_has(l,i)){\n\t\t\t\t\t\t\tr = _? c.call(_, l[i], i, t) : c(l[i], i, t);\n\t\t\t\t\t\t\tif(r !== u){ return r }\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\t//if(a.test.is(c,l[i])){ return i } // should implement deep equality testing!\n\t\t\t\t\t\tif(c === l[i]){ return i } // use this for now\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn f? t.r : Type.list.index? 0 : -1;\n\t\t}\n\t}());\n\tType.time = Type.time || {};\n\tType.time.is = Type.time.is || function(t){ DEP('time'); return t? t instanceof Date : (+new Date().getTime()) }\n\n\tvar fn_is = Type.fn.is;\n\tvar list_is = Type.list.is;\n\tvar obj = Type.obj, obj_is = obj.is, obj_has = obj.has, obj_map = obj.map;\n\n\tvar Val = {};\n\tVal.is = function(v){ DEP('val.is'); // Valid values are a subset of JSON: null, binary, number (!Infinity), text, or a soul relation. Arrays need special algorithms to handle concurrency, so they are not supported directly. Use an extension that supports them if needed but research their problems first.\n\t\tif(v === u){ return false }\n\t\tif(v === null){ return true } // \"deletes\", nulling out keys.\n\t\tif(v === Infinity){ return false } // we want this to be, but JSON does not support it, sad face.\n\t\tif(text_is(v) // by \"text\" we mean strings.\n\t\t|| bi_is(v) // by \"binary\" we mean boolean.\n\t\t|| num_is(v)){ // by \"number\" we mean integers or decimals.\n\t\t\treturn true; // simple values are valid.\n\t\t}\n\t\treturn Val.link.is(v) || false; // is the value a soul relation? Then it is valid and return it. If not, everything else remaining is an invalid data type. Custom extensions can be built on top of these primitives to support other types.\n\t}\n\tVal.link = Val.rel = {_: '#'};\n\t;(function(){\n\t\tVal.link.is = function(v){ DEP('val.link.is'); // this defines whether an object is a soul relation or not, they look like this: {'#': 'UUID'}\n\t\t\tif(v && v[rel_] && !v._ && obj_is(v)){ // must be an object.\n\t\t\t\tvar o = {};\n\t\t\t\tobj_map(v, map, o);\n\t\t\t\tif(o.id){ // a valid id was found.\n\t\t\t\t\treturn o.id; // yay! Return it.\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false; // the value was not a valid soul relation.\n\t\t}\n\t\tfunction map(s, k){ var o = this; // map over the object...\n\t\t\tif(o.id){ return o.id = false } // if ID is already defined AND we're still looping through the object, it is considered invalid.\n\t\t\tif(k == rel_ && text_is(s)){ // the key should be '#' and have a text value.\n\t\t\t\to.id = s; // we found the soul!\n\t\t\t} else {\n\t\t\t\treturn o.id = false; // if there exists anything else on the object that isn't the soul, then it is considered invalid.\n\t\t\t}\n\t\t}\n\t}());\n\tVal.link.ify = function(t){ DEP('val.link.ify'); return obj_put({}, rel_, t) } // convert a soul into a relation and return it.\n\tType.obj.has._ = '.';\n\tvar rel_ = Val.link._, u;\n\tvar bi_is = Type.bi.is;\n\tvar num_is = Type.num.is;\n\tvar text_is = Type.text.is;\n\tvar obj = Type.obj, obj_is = obj.is, obj_put = obj.put, obj_map = obj.map;\n\n\tType.val = Type.val || Val;\n\n\tvar Node = {_: '_'};\n\tNode.soul = function(n, o){ DEP('node.soul'); return (n && n._ && n._[o || soul_]) } // convenience function to check to see if there is a soul on a node and return it.\n\tNode.soul.ify = function(n, o){ DEP('node.soul.ify'); // put a soul on an object.\n\t\to = (typeof o === 'string')? {soul: o} : o || {};\n\t\tn = n || {}; // make sure it exists.\n\t\tn._ = n._ || {}; // make sure meta exists.\n\t\tn._[soul_] = o.soul || n._[soul_] || text_random(); // put the soul on it.\n\t\treturn n;\n\t}\n\tNode.soul._ = Val.link._;\n\t;(function(){\n\t\tNode.is = function(n, cb, as){ DEP('node.is'); var s; // checks to see if an object is a valid node.\n\t\t\tif(!obj_is(n)){ return false } // must be an object.\n\t\t\tif(s = Node.soul(n)){ // must have a soul on it.\n\t\t\t\treturn !obj_map(n, map, {as:as,cb:cb,s:s,n:n});\n\t\t\t}\n\t\t\treturn false; // nope! This was not a valid node.\n\t\t}\n\t\tfunction map(v, k){ // we invert this because the way we check for this is via a negation.\n\t\t\tif(k === Node._){ return } // skip over the metadata.\n\t\t\tif(!Val.is(v)){ return true } // it is true that this is an invalid node.\n\t\t\tif(this.cb){ this.cb.call(this.as, v, k, this.n, this.s) } // optionally callback each key/value.\n\t\t}\n\t}());\n\t;(function(){\n\t\tNode.ify = function(obj, o, as){ DEP('node.ify'); // returns a node from a shallow object.\n\t\t\tif(!o){ o = {} }\n\t\t\telse if(typeof o === 'string'){ o = {soul: o} }\n\t\t\telse if('function' == typeof o){ o = {map: o} }\n\t\t\tif(o.map){ o.node = o.map.call(as, obj, u, o.node || {}) }\n\t\t\tif(o.node = Node.soul.ify(o.node || {}, o)){\n\t\t\t\tobj_map(obj, map, {o:o,as:as});\n\t\t\t}\n\t\t\treturn o.node; // This will only be a valid node if the object wasn't already deep!\n\t\t}\n\t\tfunction map(v, k){ var o = this.o, tmp, u; // iterate over each key/value.\n\t\t\tif(o.map){\n\t\t\t\ttmp = o.map.call(this.as, v, ''+k, o.node);\n\t\t\t\tif(u === tmp){\n\t\t\t\t\tobj_del(o.node, k);\n\t\t\t\t} else\n\t\t\t\tif(o.node){ o.node[k] = tmp }\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif(Val.is(v)){\n\t\t\t\to.node[k] = v;\n\t\t\t}\n\t\t}\n\t}());\n\tvar obj = Type.obj, obj_is = obj.is, obj_del = obj.del, obj_map = obj.map;\n\tvar text = Type.text, text_random = text.random;\n\tvar soul_ = Node.soul._;\n\tvar u;\n\tType.node = Type.node || Node;\n\n\tvar State = Type.state;\n\tState.lex = function(){ DEP('state.lex'); return State().toString(36).replace('.','') }\n\tState.to = function(from, k, to){ DEP('state.to'); \n\t\tvar val = (from||{})[k];\n\t\tif(obj_is(val)){\n\t\t\tval = obj_copy(val);\n\t\t}\n\t\treturn State.ify(to, k, State.is(from, k), val, Node.soul(from));\n\t}\n\t;(function(){\n\t\tState.map = function(cb, s, as){ DEP('state.map'); var u; // for use with Node.ify\n\t\t\tvar o = obj_is(o = cb || s)? o : null;\n\t\t\tcb = fn_is(cb = cb || s)? cb : null;\n\t\t\tif(o && !cb){\n\t\t\t\ts = num_is(s)? s : State();\n\t\t\t\to[N_] = o[N_] || {};\n\t\t\t\tobj_map(o, map, {o:o,s:s});\n\t\t\t\treturn o;\n\t\t\t}\n\t\t\tas = as || obj_is(s)? s : u;\n\t\t\ts = num_is(s)? s : State();\n\t\t\treturn function(v, k, o, opt){\n\t\t\t\tif(!cb){\n\t\t\t\t\tmap.call({o: o, s: s}, v,k);\n\t\t\t\t\treturn v;\n\t\t\t\t}\n\t\t\t\tcb.call(as || this || {}, v, k, o, opt);\n\t\t\t\tif(obj_has(o,k) && u === o[k]){ return }\n\t\t\t\tmap.call({o: o, s: s}, v,k);\n\t\t\t}\n\t\t}\n\t\tfunction map(v,k){\n\t\t\tif(N_ === k){ return }\n\t\t\tState.ify(this.o, k, this.s) ;\n\t\t}\n\t}());\n\tvar obj = Type.obj, obj_as = obj.as, obj_has = obj.has, obj_is = obj.is, obj_map = obj.map, obj_copy = obj.copy;\n\tvar num = Type.num, num_is = num.is;\n\tvar fn = Type.fn, fn_is = fn.is;\n\tvar N_ = Node._, u;\n\n\tvar Graph = {};\n\t;(function(){\n\t\tGraph.is = function(g, cb, fn, as){ DEP('graph.is'); // checks to see if an object is a valid graph.\n\t\t\tif(!g || !obj_is(g) || obj_empty(g)){ return false } // must be an object.\n\t\t\treturn !obj_map(g, map, {cb:cb,fn:fn,as:as}); // makes sure it wasn't an empty object.\n\t\t}\n\t\tfunction map(n, s){ // we invert this because the way'? we check for this is via a negation.\n\t\t\tif(!n || s !== Node.soul(n) || !Node.is(n, this.fn, this.as)){ return true } // it is true that this is an invalid graph.\n\t\t\tif(!this.cb){ return }\n\t\t\tnf.n = n; nf.as = this.as; // sequential race conditions aren't races.\n\t\t\tthis.cb.call(nf.as, n, s, nf);\n\t\t}\n\t\tfunction nf(fn){ // optional callback for each node.\n\t\t\tif(fn){ Node.is(nf.n, fn, nf.as) } // where we then have an optional callback for each key/value.\n\t\t}\n\t}());\n\t;(function(){\n\t\tGraph.ify = function(obj, env, as){ DEP('graph.ify'); \n\t\t\tvar at = {path: [], obj: obj};\n\t\t\tif(!env){\n\t\t\t\tenv = {};\n\t\t\t} else\n\t\t\tif(typeof env === 'string'){\n\t\t\t\tenv = {soul: env};\n\t\t\t} else\n\t\t\tif('function' == typeof env){\n\t\t\t\tenv.map = env;\n\t\t\t}\n\t\t\tif(typeof as === 'string'){\n\t\t\t\tenv.soul = env.soul || as;\n\t\t\t\tas = u;\n\t\t\t}\n\t\t\tif(env.soul){\n\t\t\t\tat.link = Val.link.ify(env.soul);\n\t\t\t}\n\t\t\tenv.shell = (as||{}).shell;\n\t\t\tenv.graph = env.graph || {};\n\t\t\tenv.seen = env.seen || [];\n\t\t\tenv.as = env.as || as;\n\t\t\tnode(env, at);\n\t\t\tenv.root = at.node;\n\t\t\treturn env.graph;\n\t\t}\n\t\tfunction node(env, at){ var tmp;\n\t\t\tif(tmp = seen(env, at)){ return tmp }\n\t\t\tat.env = env;\n\t\t\tat.soul = soul;\n\t\t\tif(Node.ify(at.obj, map, at)){\n\t\t\t\tat.link = at.link || Val.link.ify(Node.soul(at.node));\n\t\t\t\tif(at.obj !== env.shell){\n\t\t\t\t\tenv.graph[Val.link.is(at.link)] = at.node;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn at;\n\t\t}\n\t\tfunction map(v,k,n){\n\t\t\tvar at = this, env = at.env, is, tmp;\n\t\t\tif(Node._ === k && obj_has(v,Val.link._)){\n\t\t\t\treturn n._; // TODO: Bug?\n\t\t\t}\n\t\t\tif(!(is = valid(v,k,n, at,env))){ return }\n\t\t\tif(!k){\n\t\t\t\tat.node = at.node || n || {};\n\t\t\t\tif(obj_has(v, Node._) && Node.soul(v)){ // ? for safety ?\n\t\t\t\t\tat.node._ = obj_copy(v._);\n\t\t\t\t}\n\t\t\t\tat.node = Node.soul.ify(at.node, Val.link.is(at.link));\n\t\t\t\tat.link = at.link || Val.link.ify(Node.soul(at.node));\n\t\t\t}\n\t\t\tif(tmp = env.map){\n\t\t\t\ttmp.call(env.as || {}, v,k,n, at);\n\t\t\t\tif(obj_has(n,k)){\n\t\t\t\t\tv = n[k];\n\t\t\t\t\tif(u === v){\n\t\t\t\t\t\tobj_del(n, k);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tif(!(is = valid(v,k,n, at,env))){ return }\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(!k){ return at.node }\n\t\t\tif(true === is){\n\t\t\t\treturn v;\n\t\t\t}\n\t\t\ttmp = node(env, {obj: v, path: at.path.concat(k)});\n\t\t\tif(!tmp.node){ return }\n\t\t\treturn tmp.link; //{'#': Node.soul(tmp.node)};\n\t\t}\n\t\tfunction soul(id){ var at = this;\n\t\t\tvar prev = Val.link.is(at.link), graph = at.env.graph;\n\t\t\tat.link = at.link || Val.link.ify(id);\n\t\t\tat.link[Val.link._] = id;\n\t\t\tif(at.node && at.node[Node._]){\n\t\t\t\tat.node[Node._][Val.link._] = id;\n\t\t\t}\n\t\t\tif(obj_has(graph, prev)){\n\t\t\t\tgraph[id] = graph[prev];\n\t\t\t\tobj_del(graph, prev);\n\t\t\t}\n\t\t}\n\t\tfunction valid(v,k,n, at,env){ var tmp;\n\t\t\tif(Val.is(v)){ return true }\n\t\t\tif(obj_is(v)){ return 1 }\n\t\t\tif(tmp = env.invalid){\n\t\t\t\tv = tmp.call(env.as || {}, v,k,n);\n\t\t\t\treturn valid(v,k,n, at,env);\n\t\t\t}\n\t\t\tenv.err = \"Invalid value at '\" + at.path.concat(k).join('.') + \"'!\";\n\t\t\tif(Type.list.is(v)){ env.err += \" Use `.set(item)` instead of an Array.\" }\n\t\t}\n\t\tfunction seen(env, at){\n\t\t\tvar arr = env.seen, i = arr.length, has;\n\t\t\twhile(i--){ has = arr[i];\n\t\t\t\tif(at.obj === has.obj){ return has }\n\t\t\t}\n\t\t\tarr.push(at);\n\t\t}\n\t}());\n\tGraph.node = function(node){ DEP('graph.node'); \n\t\tvar soul = Node.soul(node);\n\t\tif(!soul){ return }\n\t\treturn obj_put({}, soul, node);\n\t}\n\t;(function(){\n\t\tGraph.to = function(graph, root, opt){ DEP('graph.to'); \n\t\t\tif(!graph){ return }\n\t\t\tvar obj = {};\n\t\t\topt = opt || {seen: {}};\n\t\t\tobj_map(graph[root], map, {obj:obj, graph: graph, opt: opt});\n\t\t\treturn obj;\n\t\t}\n\t\tfunction map(v,k){ var tmp, obj;\n\t\t\tif(Node._ === k){\n\t\t\t\tif(obj_empty(v, Val.link._)){\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tthis.obj[k] = obj_copy(v);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif(!(tmp = Val.link.is(v))){\n\t\t\t\tthis.obj[k] = v;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif(obj = this.opt.seen[tmp]){\n\t\t\t\tthis.obj[k] = obj;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.obj[k] = this.opt.seen[tmp] = Graph.to(this.graph, tmp, this.opt);\n\t\t}\n\t}());\n\tvar fn_is = Type.fn.is;\n\tvar obj = Type.obj, obj_is = obj.is, obj_del = obj.del, obj_has = obj.has, obj_empty = obj.empty, obj_put = obj.put, obj_map = obj.map, obj_copy = obj.copy;\n\tvar u;\n\tType.graph = Type.graph || Graph;\n}());","var fs = require('fs');\nvar path = require('path');\nvar dot = /\\.\\.+/g;\nvar slash = /\\/\\/+/g;\n\nfunction CDN(dir){\n\treturn function(req, res){\n\t\treq.url = (req.url||'').replace(dot,'').replace(slash,'/');\n\t\tif(serve(req, res)){ return } // filters GUN requests!\n\t\tif (req.url.slice(-3) === '.js') {\n\t\t\tres.writeHead(200, {'Content-Type': 'text/javascript'});\n\t\t}\n\t\tfs.createReadStream(path.join(dir, req.url)).on('error',function(tmp){ // static files!\n\t\t\tfs.readFile(path.join(dir, 'index.html'), function(err, tmp){\n\t\t\t\ttry{ res.writeHead(200, {'Content-Type': 'text/html'});\n\t\t\t\tres.end(tmp+''); }catch(e){} // or default to index\n\t\t})}).pipe(res); // stream\n\t}\n}\n\nfunction serve(req, res, next){ var tmp;\n\tif(typeof req === 'string'){\n\t\treturn CDN(req);\n\t}\n\tif(!req || !res){ return false }\n\tnext = next || serve;\n\tif(!req.url){ return next() }\n\tif(res.setHeader){ res.setHeader('Access-Control-Allow-Origin', '*') }\n\tif(0 <= req.url.indexOf('gun.js')){\n\t\tres.writeHead(200, {'Content-Type': 'text/javascript'});\n\t\tres.end(serve.js = serve.js || require('fs').readFileSync(__dirname + '/../gun.js'));\n\t\treturn true;\n\t}\n\tif(0 <= req.url.indexOf('gun/')){\n\t\tvar path = __dirname + '/../' + req.url.split('/').slice(2).join('/');\n\t\tif('/' === path.slice(-1)){\n\t\t\tfs.readdir(path, function(err, dir){ res.end((dir || (err && 404))+'') });\n\t\t\treturn true;\n\t\t}\n\t\tvar S = +new Date;\n\t\tvar rs = fs.createReadStream(path);\n\t\trs.on('open', function(){ console.STAT && console.STAT(S, +new Date - S, 'serve file open'); rs.pipe(res) });\n\t\trs.on('error', function(err){ res.end(404+'') });\n\t\trs.on('end', function(){ console.STAT && console.STAT(S, +new Date - S, 'serve file end') });\n\t\treturn true;\n\t}\n\tif((tmp = req.socket) && (tmp = tmp.server) && (tmp = tmp.route)){ var url;\n\t\tif(tmp = tmp[(((req.url||'').slice(1)).split('/')[0]||'').split('.')[0]]){\n\t\t\ttry{ return tmp(req, res, next) }catch(e){ console.log(req.url+' crashed with '+e) }\n\t\t}\n\t}\n\treturn next();\n}\n\nmodule.exports = serve;\n",";(function(){\n\n\tfunction Radix(){\n\t\tvar radix = function(key, val, t){\n\t\t\tradix.unit = 0;\n\t\t\tif(!t && u !== val){ \n\t\t\t\tradix.last = (''+key < radix.last)? radix.last : ''+key;\n\t\t\t\tdelete (radix.$||{})[_];\n\t\t\t}\n\t\t\tt = t || radix.$ || (radix.$ = {});\n\t\t\tif(!key && Object.keys(t).length){ return t }\n\t\t\tkey = ''+key;\n\t\t\tvar i = 0, l = key.length-1, k = key[i], at, tmp;\n\t\t\twhile(!(at = t[k]) && i < l){\n\t\t\t\tk += key[++i];\n\t\t\t}\n\t\t\tif(!at){\n\t\t\t\tif(!each(t, function(r, s){\n\t\t\t\t\tvar ii = 0, kk = '';\n\t\t\t\t\tif((s||'').length){ while(s[ii] == key[ii]){\n\t\t\t\t\t\tkk += s[ii++];\n\t\t\t\t\t} }\n\t\t\t\t\tif(kk){\n\t\t\t\t\t\tif(u === val){\n\t\t\t\t\t\t\tif(ii <= l){ return }\n\t\t\t\t\t\t\t(tmp || (tmp = {}))[s.slice(ii)] = r;\n\t\t\t\t\t\t\t//(tmp[_] = function $(){ $.sort = Object.keys(tmp).sort(); return $ }()); // get rid of this one, cause it is on read?\n\t\t\t\t\t\t\treturn r;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tvar __ = {};\n\t\t\t\t\t\t__[s.slice(ii)] = r;\n\t\t\t\t\t\tii = key.slice(ii);\n\t\t\t\t\t\t('' === ii)? (__[''] = val) : ((__[ii] = {})[''] = val);\n\t\t\t\t\t\t//(__[_] = function $(){ $.sort = Object.keys(__).sort(); return $ }());\n\t\t\t\t\t\tt[kk] = __;\n\t\t\t\t\t\tif(Radix.debug && 'undefined' === ''+kk){ console.log(0, kk); debugger }\n\t\t\t\t\t\tdelete t[s];\n\t\t\t\t\t\t//(t[_] = function $(){ $.sort = Object.keys(t).sort(); return $ }());\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t})){\n\t\t\t\t\tif(u === val){ return; }\n\t\t\t\t\t(t[k] || (t[k] = {}))[''] = val;\n\t\t\t\t\tif(Radix.debug && 'undefined' === ''+k){ console.log(1, k); debugger }\n\t\t\t\t\t//(t[_] = function $(){ $.sort = Object.keys(t).sort(); return $ }());\n\t\t\t\t}\n\t\t\t\tif(u === val){\n\t\t\t\t\treturn tmp;\n\t\t\t\t}\n\t\t\t} else \n\t\t\tif(i == l){\n\t\t\t\t//if(u === val){ return (u === (tmp = at['']))? at : tmp } // THIS CODE IS CORRECT, below is\n\t\t\t\tif(u === val){ return (u === (tmp = at['']))? at : ((radix.unit = 1) && tmp) } // temporary help??\n\t\t\t\tat[''] = val;\n\t\t\t\t//(at[_] = function $(){ $.sort = Object.keys(at).sort(); return $ }());\n\t\t\t} else {\n\t\t\t\tif(u !== val){ delete at[_] }\n\t\t\t\t//at && (at[_] = function $(){ $.sort = Object.keys(at).sort(); return $ }());\n\t\t\t\treturn radix(key.slice(++i), val, at || (at = {}));\n\t\t\t}\n\t\t}\n\t\treturn radix;\n\t};\n\n\tRadix.map = function rap(radix, cb, opt, pre){\n\t\ttry {\n\t\t\tpre = pre || []; // TODO: BUG: most out-of-memory crashes come from here.\n\t\t\tvar t = ('function' == typeof radix)? radix.$ || {} : radix;\n\t\t\t//!opt && console.log(\"WHAT IS T?\", JSON.stringify(t).length);\n\t\t\tif(!t){ return }\n\t\t\tif('string' == typeof t){ if(Radix.debug){ throw ['BUG:', radix, cb, opt, pre] } return; }\n\t\t\tvar keys = (t[_]||no).sort || (t[_] = function $(){ $.sort = Object.keys(t).sort(); return $ }()).sort, rev; // ONLY 17% of ops are pre-sorted!\n\t\t\t//var keys = Object.keys(t).sort();\n\t\t\topt = (true === opt)? {branch: true} : (opt || {});\n\t\t\tif(rev = opt.reverse){ keys = keys.slice(0).reverse() }\n\t\t\tvar start = opt.start, end = opt.end, END = '\\uffff';\n\t\t\tvar i = 0, l = keys.length;\n\t\t\tfor(;i < l; i++){ var key = keys[i], tree = t[key], tmp, p, pt;\n\t\t\t\tif(!tree || '' === key || _ === key || 'undefined' === key){ continue }\n\t\t\t\tp = pre.slice(0); p.push(key);\n\t\t\t\tpt = p.join('');\n\t\t\t\tif(u !== start && pt < (start||'').slice(0,pt.length)){ continue }\n\t\t\t\tif(u !== end && (end || END) < pt){ continue }\n\t\t\t\tif(rev){ // children must be checked first when going in reverse.\n\t\t\t\t\ttmp = rap(tree, cb, opt, p);\n\t\t\t\t\tif(u !== tmp){ return tmp }\n\t\t\t\t}\n\t\t\t\tif(u !== (tmp = tree[''])){\n\t\t\t\t\tvar yes = 1;\n\t\t\t\t\tif(u !== start && pt < (start||'')){ yes = 0 }\n\t\t\t\t\tif(u !== end && pt > (end || END)){ yes = 0 }\n\t\t\t\t\tif(yes){\n\t\t\t\t\t\ttmp = cb(tmp, pt, key, pre);\n\t\t\t\t\t\tif(u !== tmp){ return tmp }\n\t\t\t\t\t}\n\t\t\t\t} else\n\t\t\t\tif(opt.branch){\n\t\t\t\t\ttmp = cb(u, pt, key, pre);\n\t\t\t\t\tif(u !== tmp){ return tmp }\n\t\t\t\t}\n\t\t\t\tpre = p;\n\t\t\t\tif(!rev){\n\t\t\t\t\ttmp = rap(tree, cb, opt, pre);\n\t\t\t\t\tif(u !== tmp){ return tmp }\n\t\t\t\t}\n\t\t\t\tpre.pop();\n\t\t\t}\n\t\t} catch (e) { console.error(e); }\n\t};\n\n\tif(typeof window !== \"undefined\"){\n\t window.Radix = Radix;\n\t} else { \n\t\ttry{ module.exports = Radix }catch(e){}\n\t}\n\tvar each = Radix.object = function(o, f, r){\n\t\tfor(var k in o){\n\t\t\tif(!o.hasOwnProperty(k)){ continue }\n\t\t\tif((r = f(o[k], k)) !== u){ return r }\n\t\t}\n\t}, no = {}, u;\n\tvar _ = String.fromCharCode(24);\n\t\n}());\n",";(function(){\n\n\tfunction Radisk(opt){\n\n\t\topt = opt || {};\n\t\topt.log = opt.log || console.log;\n\t\topt.file = String(opt.file || 'radata');\n\t\tvar has = (Radisk.has || (Radisk.has = {}))[opt.file];\n\t\tif(has){ return has }\n\n\t\topt.max = opt.max || (opt.memory? (opt.memory * 999 * 999) : 300000000) * 0.3;\n\t\topt.until = opt.until || opt.wait || 250;\n\t\topt.batch = opt.batch || (10 * 1000);\n\t\topt.chunk = opt.chunk || (1024 * 1024 * 1); // 1MB\n\t\topt.code = opt.code || {};\n\t\topt.code.from = opt.code.from || '!';\n\t\topt.jsonify = true;\n\n\n\t\tfunction ename(t){ return encodeURIComponent(t).replace(/\\*/g, '%2A') } // TODO: Hash this also, but allow migration!\n\t\tfunction atomic(v){ return u !== v && (!v || 'object' != typeof v) }\n\t\tvar timediate = (''+u === typeof setImmediate)? setTimeout : setImmediate;\n\t\tvar puff = setTimeout.turn || timediate, u;\n\t\tvar map = Radix.object;\n\t\tvar ST = 0;\n\n\t\tif(!opt.store){\n\t\t\treturn opt.log(\"ERROR: Radisk needs `opt.store` interface with `{get: fn, put: fn (, list: fn)}`!\");\n\t\t}\n\t\tif(!opt.store.put){\n\t\t\treturn opt.log(\"ERROR: Radisk needs `store.put` interface with `(file, data, cb)`!\");\n\t\t}\n\t\tif(!opt.store.get){\n\t\t\treturn opt.log(\"ERROR: Radisk needs `store.get` interface with `(file, cb)`!\");\n\t\t}\n\t\tif(!opt.store.list){\n\t\t\t//opt.log(\"WARNING: `store.list` interface might be needed!\");\n\t\t}\n\n\t\tif(''+u != typeof require){ require('./yson') }\n\t\tvar parse = JSON.parseAsync || function(t,cb,r){ var u; try{ cb(u, JSON.parse(t,r)) }catch(e){ cb(e) } }\n\t\tvar json = JSON.stringifyAsync || function(v,cb,r,s){ var u; try{ cb(u, JSON.stringify(v,r,s)) }catch(e){ cb(e) } }\n\t\t/*\n\t\t\tAny and all storage adapters should...\n\t\t\t1. Because writing to disk takes time, we should batch data to disk. This improves performance, and reduces potential disk corruption.\n\t\t\t2. If a batch exceeds a certain number of writes, we should immediately write to disk when physically possible. This caps total performance, but reduces potential loss.\n\t\t*/\n\t\tvar r = function(key, data, cb, tag, DBG){\n\t\t\tif('function' === typeof data){\n\t\t\t\tvar o = cb || {};\n\t\t\t\tcb = data;\n\t\t\t\tr.read(key, cb, o, DBG || tag);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t//var tmp = (tmp = r.batch = r.batch || {})[key] = tmp[key] || {};\n\t\t\t//var tmp = (tmp = r.batch = r.batch || {})[key] = data;\n\t\t\tr.save(key, data, cb, tag, DBG);\n\t\t}\n\t\tr.save = function(key, data, cb, tag, DBG){\n\t\t\tvar s = {key: key}, tags, f, d, q;\n\t\t\ts.find = function(file){ var tmp;\n\t\t\t\ts.file = file || (file = opt.code.from);\n\t\t\t\tDBG && (DBG = DBG[file] = DBG[file] || {});\n\t\t\t\tDBG && (DBG.sf = DBG.sf || +new Date);\n\t\t\t\t//console.only.i && console.log('found', file);\n\t\t\t\tif(tmp = r.disk[file]){ s.mix(u, tmp); return }\n\t\t\t\tr.parse(file, s.mix, u, DBG);\n\t\t\t}\n\t\t\ts.mix = function(err, disk){\n\t\t\t\tDBG && (DBG.sml = +new Date);\n\t\t\t\tDBG && (DBG.sm = DBG.sm || +new Date);\n\t\t\t\tif(s.err = err || s.err){ cb(err); return } // TODO: HANDLE BATCH EMIT\n\t\t\t\tvar file = s.file = (disk||'').file || s.file, tmp;\n\t\t\t\tif(!disk && file !== opt.code.from){ // corrupt file?\n\t\t\t\t\tr.find.bad(file); // remove from dir list\n\t\t\t\t\tr.save(key, data, cb, tag); // try again\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t(disk = r.disk[file] || (r.disk[file] = disk || Radix())).file || (disk.file = file);\n\t\t\t\tif(opt.compare){\n\t\t\t\t\tdata = opt.compare(disk(key), data, key, file);\n\t\t\t\t\tif(u === data){ cb(err, -1); return } // TODO: HANDLE BATCH EMIT\n\t\t\t\t}\n\t\t\t\t(s.disk = disk)(key, data);\n\t\t\t\tif(tag){\n\t\t\t\t\t(tmp = (tmp = disk.tags || (disk.tags = {}))[tag] || (tmp[tag] = r.tags[tag] || (r.tags[tag] = {})))[file] || (tmp[file] = r.one[tag] || (r.one[tag] = cb));\n\t\t\t\t\tcb = null;\n\t\t\t\t}\n\t\t\t\tDBG && (DBG.st = DBG.st || +new Date);\n\t\t\t\t//console.only.i && console.log('mix', disk.Q);\n\t\t\t\tif(disk.Q){ cb && disk.Q.push(cb); return } disk.Q = (cb? [cb] : []);\n\t\t\t\tdisk.to = setTimeout(s.write, opt.until);\n\t\t\t}\n\t\t\ts.write = function(){\n\t\t\t\tDBG && (DBG.sto = DBG.sto || +new Date);\n\t\t\t\tvar file = f = s.file, disk = d = s.disk;\n\t\t\t\tq = s.q = disk.Q;\n\t\t\t\ttags = s.tags = disk.tags;\n\t\t\t\tdelete disk.Q;\n\t\t\t\tdelete r.disk[file];\n\t\t\t\tdelete disk.tags;\n\t\t\t\t//console.only.i && console.log('write', file, disk, 'was saving:', key, data);\n\t\t\t\tr.write(file, disk, s.ack, u, DBG);\n\t\t\t}\n\t\t\ts.ack = function(err, ok){\n\t\t\t\tDBG && (DBG.sa = DBG.sa || +new Date);\n\t\t\t\tDBG && (DBG.sal = q.length);\n\t\t\t\tvar ack, tmp;\n\t\t\t\t// TODO!!!! CHANGE THIS INTO PUFF!!!!!!!!!!!!!!!!\n\t\t\t\tfor(var id in r.tags){\n\t\t\t\t\tif(!r.tags.hasOwnProperty(id)){ continue } var tag = r.tags[id];\n\t\t\t\t\tif((tmp = r.disk[f]) && (tmp = tmp.tags) && tmp[tag]){ continue }\n\t\t\t\t\tack = tag[f];\n\t\t\t\t\tdelete tag[f];\n\t\t\t\t\tvar ne; for(var k in tag){ if(tag.hasOwnProperty(k)){ ne = true; break } } // is not empty?\n\t\t\t\t\tif(ne){ continue } //if(!obj_empty(tag)){ continue }\n\t\t\t\t\tdelete r.tags[tag];\n\t\t\t\t\tack && ack(err, ok);\n\t\t\t\t}\n\t\t\t\t!q && (q = '');\n\t\t\t\tvar l = q.length, i = 0;\n\t\t\t\t// TODO: PERF: Why is acks so slow, what work do they do??? CHECK THIS!!\n\t\t\t\t// TODO: PERF: Why is acks so slow, what work do they do??? CHECK THIS!!\n\t\t\t\t// TODO: PERF: Why is acks so slow, what work do they do??? CHECK THIS!!\n\t\t\t\t// TODO: PERF: Why is acks so slow, what work do they do??? CHECK THIS!!\n\t\t\t\t// TODO: PERF: Why is acks so slow, what work do they do??? CHECK THIS!!\n\t\t\t\t// TODO: PERF: Why is acks so slow, what work do they do??? CHECK THIS!!\n\t\t\t\t// TODO: PERF: Why is acks so slow, what work do they do??? CHECK THIS!!\n\t\t\t\tvar S = +new Date;\n\t\t\t\tfor(;i < l; i++){ (ack = q[i]) && ack(err, ok) }\n\t\t\t\tconsole.STAT && console.STAT(S, +new Date - S, 'rad acks', ename(s.file));\n\t\t\t\tconsole.STAT && console.STAT(S, q.length, 'rad acks #', ename(s.file));\n\t\t\t}\n\t\t\tcb || (cb = function(err, ok){ // test delete!\n\t\t\t\tif(!err){ return }\n\t\t\t});\n\t\t\t//console.only.i && console.log('save', key);\n\t\t\tr.find(key, s.find);\n }\n r.disk = {};\n r.one = {};\n r.tags = {};\n\n\t\t/*\n\t\t\tAny storage engine at some point will have to do a read in order to write.\n\t\t\tThis is true of even systems that use an append only log, if they support updates.\n\t\t\tTherefore it is unavoidable that a read will have to happen,\n\t\t\tthe question is just how long you delay it.\n\t\t*/\n\t\tvar RWC = 0;\n\t\tr.write = function(file, rad, cb, o, DBG){\n\t\t\tif(!rad){ cb('No radix!'); return }\n\t\t\to = ('object' == typeof o)? o : {force: o};\n\t\t\tvar f = function Fractal(){}, a, b;\n\t\t\tf.text = '';\n\t\t\tf.file = file = rad.file || (rad.file = file);\n\t\t\tif(!file){ cb('What file?'); return }\n\t\t\tf.write = function(){\n\t\t\t\tvar text = rad.raw = f.text;\n\t\t\t\tr.disk[file = rad.file || f.file || file] = rad;\n\t\t\t\tvar S = +new Date;\n\t\t\t\tDBG && (DBG.wd = S);\n\t\t\t\t//console.only.i && console.log('add', file);\n\t\t\t\tr.find.add(file, function add(err){\n\t\t\t\t\tDBG && (DBG.wa = +new Date);\n\t\t\t\t\tif(err){ cb(err); return }\n\t\t\t\t\t//console.only.i && console.log('disk', file, text);\n\t\t\t\t\topt.store.put(ename(file), text, function safe(err, ok){\n\t\t\t\t\t\tDBG && (DBG.wp = +new Date);\n\t\t\t\t\t\tconsole.STAT && console.STAT(S, ST = +new Date - S, \"wrote disk\", JSON.stringify(file), ++RWC, 'total all writes.');\n\t\t\t\t\t\t//console.only.i && console.log('done', err, ok || 1, cb);\n\t\t\t\t\t\tcb(err, ok || 1);\n\t\t\t\t\t\tif(!rad.Q){ delete r.disk[file] } // VERY IMPORTANT! Clean up memory, but not if there is already queued writes on it!\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t}\n\t\t\tf.split = function(){\n\t\t\t\tvar S = +new Date;\n\t\t\t\tDBG && (DBG.wf = S);\n\t\t\t\tf.text = '';\n\t\t\t\tif(!f.count){ f.count = 0;\n\t\t\t\t\tRadix.map(rad, function count(){ f.count++ }); // TODO: Perf? Any faster way to get total length?\n\t\t\t\t}\n\t\t\t\tDBG && (DBG.wfc = f.count);\n\t\t\t\tf.limit = Math.ceil(f.count/2);\n\t\t\t\tvar SC = f.count;\n\t\t\t\tf.count = 0;\n\t\t\t\tDBG && (DBG.wf1 = +new Date);\n\t\t\t\tf.sub = Radix();\n\t\t\t\tRadix.map(rad, f.slice, {reverse: 1}); // IMPORTANT: DO THIS IN REVERSE, SO LAST HALF OF DATA MOVED TO NEW FILE BEFORE DROPPING FROM CURRENT FILE.\n\t\t\t\tDBG && (DBG.wf2 = +new Date);\n\t\t\t\tr.write(f.end, f.sub, f.both, o);\n\t\t\t\tDBG && (DBG.wf3 = +new Date);\n\t\t\t\tf.hub = Radix();\n\t\t\t\tRadix.map(rad, f.stop);\n\t\t\t\tDBG && (DBG.wf4 = +new Date);\n\t\t\t\tr.write(rad.file, f.hub, f.both, o);\n\t\t\t\tDBG && (DBG.wf5 = +new Date);\n\t\t\t\tconsole.STAT && console.STAT(S, +new Date - S, \"rad split\", ename(rad.file), SC);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tf.slice = function(val, key){\n\t\t\t\tf.sub(f.end = key, val);\n\t\t\t\tif(f.limit <= (++f.count)){ return true }\n\t\t\t}\n\t\t\tf.stop = function(val, key){\n\t\t\t\tif(key >= f.end){ return true }\n\t\t\t\tf.hub(key, val);\n\t\t\t}\n\t\t\tf.both = function(err, ok){\n\t\t\t\tDBG && (DBG.wfd = +new Date);\n\t\t\t\tif(b){ cb(err || b); return }\n\t\t\t\tif(a){ cb(err, ok); return }\n\t\t\t\ta = true;\n\t\t\t\tb = err;\n\t\t\t}\n\t\t\tf.each = function(val, key, k, pre){\n\t\t\t\tif(u !== val){ f.count++ }\n\t\t\t\tif(opt.max <= (val||'').length){ return cb(\"Data too big!\"), true }\n\t\t\t\tvar enc = Radisk.encode(pre.length) +'#'+ Radisk.encode(k) + (u === val? '' : ':'+ Radisk.encode(val)) +'\\n';\n\t\t\t\tif((opt.chunk < f.text.length + enc.length) && (1 < f.count) && !o.force){\n\t\t\t\t\treturn f.split();\n\t\t\t\t}\n\t\t\t\tf.text += enc;\n\t\t\t}\n\t\t\t//console.only.i && console.log('writing');\n\t\t\tif(opt.jsonify){ r.write.jsonify(f, rad, cb, o, DBG); return } // temporary testing idea\n\t\t\tif(!Radix.map(rad, f.each, true)){ f.write() }\n\t\t}\n\n\t\tr.write.jsonify = function(f, rad, cb, o, DBG){\n\t\t\tvar raw;\n\t\t\tvar S = +new Date;\n\t\t\tDBG && (DBG.w = S);\n\t\t\ttry{raw = JSON.stringify(rad.$);\n\t\t\t}catch(e){ cb(\"Cannot radisk!\"); return }\n\t\t\tDBG && (DBG.ws = +new Date);\n\t\t\tconsole.STAT && console.STAT(S, +new Date - S, \"rad stringified JSON\");\n\t\t\tif(opt.chunk < raw.length && !o.force){\n\t\t\t\tvar c = 0;\n\t\t\t\tRadix.map(rad, function(){\n\t\t\t\t\tif(c++){ return true } // more than 1 item\n\t\t\t\t});\n\t\t\t\tif(c > 1){\n\t\t\t\t\treturn f.split();\n\t\t\t\t}\n\t\t\t}\n\t\t\tf.text = raw;\n\t\t\tf.write();\n\t\t}\n\n\t\tr.range = function(tree, o){\n\t\t\tif(!tree || !o){ return }\n\t\t\tif(u === o.start && u === o.end){ return tree }\n\t\t\tif(atomic(tree)){ return tree }\n\t\t\tvar sub = Radix();\n\t\t\tRadix.map(tree, function(v,k){ sub(k,v) }, o); // ONLY PLACE THAT TAKES TREE, maybe reduce API for better perf?\n\t\t\treturn sub('');\n\t\t}\n\n\t\t;(function(){\n\t\t\tr.read = function(key, cb, o, DBG){\n\t\t\t\to = o || {};\n\t\t\t\tvar g = {key: key};\n\t\t\t\tg.find = function(file){ var tmp;\n\t\t\t\t\tg.file = file || (file = opt.code.from);\n\t\t\t\t\tDBG && (DBG = DBG[file] = DBG[file] || {});\n\t\t\t\t\tDBG && (DBG.rf = DBG.rf || +new Date);\n\t\t\t\t\tif(tmp = r.disk[g.file = file]){ g.check(u, tmp); return }\n\t\t\t\t\tr.parse(file, g.check, u, DBG);\n\t\t\t\t}\n\t\t\t\tg.get = function(err, disk, info){\n\t\t\t\t\tDBG && (DBG.rgl = +new Date);\n\t\t\t\t\tDBG && (DBG.rg = DBG.rg || +new Date);\n\t\t\t\t\tif(g.err = err || g.err){ cb(err); return }\n\t\t\t\t\tvar file = g.file = (disk||'').file || g.file;\n\t\t\t\t\tif(!disk && file !== opt.code.from){ // corrupt file?\n\t\t\t\t\t\tr.find.bad(file); // remove from dir list\n\t\t\t\t\t\tr.read(key, cb, o); // try again\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tdisk = r.disk[file] || (r.disk[file] = disk);\n\t\t\t\t\tif(!disk){ cb(file === opt.code.from? u : \"No file!\"); return }\n\t\t\t\t\tdisk.file || (disk.file = file);\n\t\t\t\t\tvar data = r.range(disk(key), o);\n\t\t\t\t\tDBG && (DBG.rr = +new Date);\n\t\t\t\t\to.unit = disk.unit;\n\t\t\t\t\to.chunks = (o.chunks || 0) + 1;\n\t\t\t\t\to.parsed = (o.parsed || 0) + ((info||'').parsed||(o.chunks*opt.chunk));\n\t\t\t\t\to.more = 1;\n\t\t\t\t\to.next = u;\n\t\t\t\t\tRadix.map(r.list, function next(v,f){\n\t\t\t\t\t\tif(!v || file === f){ return }\n\t\t\t\t\t\to.next = f;\n\t\t\t\t\t\treturn 1;\n\t\t\t\t\t}, o.reverse? {reverse: 1, end: file} : {start: file});\n\t\t\t\t\tDBG && (DBG.rl = +new Date);\n\t\t\t\t\tif(!o.next){ o.more = 0 }\n\t\t\t\t\tif(o.next){\n\t\t\t\t\t\tif(!o.reverse && ((key < o.next && 0 != o.next.indexOf(key)) || (u !== o.end && (o.end || '\\uffff') < o.next))){ o.more = 0 }\n\t\t\t\t\t\tif(o.reverse && ((key > o.next && 0 != key.indexOf(o.next)) || ((u !== o.start && (o.start || '') > o.next && file <= o.start)))){ o.more = 0 }\n\t\t\t\t\t}\n\t\t\t\t\t//console.log(5, process.memoryUsage().heapUsed);\n\t\t\t\t\tif(!o.more){ cb(g.err, data, o); return }\n\t\t\t\t\tif(data){ cb(g.err, data, o) }\n\t\t\t\t\tif(o.parsed >= o.limit){ return }\n\t\t\t\t\tvar S = +new Date;\n\t\t\t\t\tDBG && (DBG.rm = S);\n\t\t\t\t\tvar next = o.next;\n\t\t\t\t\ttimediate(function(){\n\t\t\t\t\t\tconsole.STAT && console.STAT(S, +new Date - S, 'rad more');\n\t\t\t\t\t\tr.parse(next, g.check);\n\t\t\t\t\t},0);\n\t\t\t\t}\n\t\t\t\tg.check = function(err, disk, info){\n\t\t\t\t\t//console.log(4, process.memoryUsage().heapUsed);\n\t\t\t\t\tg.get(err, disk, info);\n\t\t\t\t\tif(!disk || disk.check){ return } disk.check = 1;\n\t\t\t\t\tvar S = +new Date;\n\t\t\t\t\t(info || (info = {})).file || (info.file = g.file);\n\t\t\t\t\tRadix.map(disk, function(val, key){\n\t\t\t\t\t\t// assume in memory for now, since both write/read already call r.find which will init it.\n\t\t\t\t\t\tr.find(key, function(file){\n\t\t\t\t\t\t\tif((file || (file = opt.code.from)) === info.file){ return }\n\t\t\t\t\t\t\tvar id = (''+Math.random()).slice(-3);\n\t\t\t\t\t\t\tpuff(function(){\n\t\t\t\t\t\t\tr.save(key, val, function ack(err, ok){\n\t\t\t\t\t\t\t\tif(err){ r.save(key, val, ack); return } // ad infinitum???\n\t\t\t\t\t\t\t\t// TODO: NOTE!!! Mislocated data could be because of a synchronous `put` from the `g.get(` other than perf shouldn't we do the check first before acking?\n\t\t\t\t\t\t\t\tconsole.STAT && console.STAT(\"MISLOCATED DATA CORRECTED\", id, ename(key), ename(info.file), ename(file));\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t},0);\n\t\t\t\t\t\t})\n\t\t\t\t\t});\n\t\t\t\t\tconsole.STAT && console.STAT(S, +new Date - S, \"rad check\");\n\t\t\t\t}\n\t\t\t\tr.find(key || (o.reverse? (o.end||'') : (o.start||'')), g.find); \n\t\t\t}\n\t\t\tfunction rev(a,b){ return b }\n\t\t\tvar revo = {reverse: true};\n\t\t}());\n\n\t\t;(function(){\n\t\t\t/*\n\t\t\t\tLet us start by assuming we are the only process that is\n\t\t\t\tchanging the directory or bucket. Not because we do not want\n\t\t\t\tto be multi-process/machine, but because we want to experiment\n\t\t\t\twith how much performance and scale we can get out of only one.\n\t\t\t\tThen we can work on the harder problem of being multi-process.\n\t\t\t*/\n\t\t\tvar RPC = 0;\n\t\t\tvar Q = {}, s = String.fromCharCode(31);\n\t\t\tr.parse = function(file, cb, raw, DBG){ var q;\n\t\t\t\tif(!file){ return cb(); }\n\t\t\t\tif(q = Q[file]){ q.push(cb); return } q = Q[file] = [cb];\n\t\t\t\tvar p = function Parse(){}, info = {file: file};\n\t\t\t\t(p.disk = Radix()).file = file;\n\t\t\t\tp.read = function(err, data){ var tmp;\n\t\t\t\t\tDBG && (DBG.rpg = +new Date);\n\t\t\t\t\tconsole.STAT && console.STAT(S, +new Date - S, 'read disk', JSON.stringify(file), ++RPC, 'total all parses.');\n\t\t\t\t\t//console.log(2, process.memoryUsage().heapUsed);\n\t\t\t\t\tif((p.err = err) || (p.not = !data)){\n\t\t\t\t\t\tdelete Q[file];\n\t\t\t\t\t\tp.map(q, p.ack);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tif('string' !== typeof data){\n\t\t\t\t\t\ttry{\n\t\t\t\t\t\t\tif(opt.max <= data.length){\n\t\t\t\t\t\t\t\tp.err = \"Chunk too big!\";\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tdata = data.toString(); // If it crashes, it crashes here. How!?? We check size first!\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}catch(e){ p.err = e }\n\t\t\t\t\t\tif(p.err){\n\t\t\t\t\t\t\tdelete Q[file];\n\t\t\t\t\t\t\tp.map(q, p.ack);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tinfo.parsed = data.length;\n\t\t\t\t\tDBG && (DBG.rpl = info.parsed);\n\t\t\t\t\tDBG && (DBG.rpa = q.length);\n\t\t\t\t\tS = +new Date;\n\t\t\t\t\tif(!(opt.jsonify || '{' === data[0])){\n\t\t\t\t\t\tp.radec(err, data);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tparse(data, function(err, tree){\n\t\t\t\t\t\t//console.log(3, process.memoryUsage().heapUsed);\n\t\t\t\t\t\tif(!err){\n\t\t\t\t\t\t\tdelete Q[file];\n\t\t\t\t\t\t\tp.disk.$ = tree;\n\t\t\t\t\t\t\tconsole.STAT && (ST = +new Date - S) > 9 && console.STAT(S, ST, 'rad parsed JSON');\n\t\t\t\t\t\t\tDBG && (DBG.rpd = +new Date);\n\t\t\t\t\t\t\tp.map(q, p.ack); // hmmm, v8 profiler can't see into this cause of try/catch?\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif('{' === data[0]){\n\t\t\t\t\t\t\tdelete Q[file];\n\t\t\t\t\t\t\tp.err = tmp || \"JSON error!\";\n\t\t\t\t\t\t\tp.map(q, p.ack);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tp.radec(err, data);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tp.map = function(){ // switch to setTimeout.each now?\n\t\t\t\t\tif(!q || !q.length){ return }\n\t\t\t\t\t//var i = 0, l = q.length, ack;\n\t\t\t\t\tvar S = +new Date;\n\t\t\t\t\tvar err = p.err, data = p.not? u : p.disk;\n\t\t\t\t\tvar i = 0, ack; while(i < 9 && (ack = q[i++])){ ack(err, data, info) } // too much?\n\t\t\t\t\tconsole.STAT && console.STAT(S, +new Date - S, 'rad packs', ename(file));\n\t\t\t\t\tconsole.STAT && console.STAT(S, i, 'rad packs #', ename(file)); \n\t\t\t\t\tif(!(q = q.slice(i)).length){ return }\n\t\t\t\t\tpuff(p.map, 0);\n\t\t\t\t}\n\t\t\t\tp.ack = function(cb){\n\t\t\t\t\tif(!cb){ return }\n\t\t\t\t\tif(p.err || p.not){\n\t\t\t\t\t\tcb(p.err, u, info);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tcb(u, p.disk, info);\n\t\t\t\t}\n\t\t\t\tp.radec = function(err, data){\n\t\t\t\t\tdelete Q[file];\n\t\t\t\t\tS = +new Date;\n\t\t\t\t\tvar tmp = p.split(data), pre = [], i, k, v;\n\t\t\t\t\tif(!tmp || 0 !== tmp[1]){\n\t\t\t\t\t\tp.err = \"File '\"+file+\"' does not have root radix! \";\n\t\t\t\t\t\tp.map(q, p.ack);\n\t\t\t\t\t\treturn; \n\t\t\t\t\t}\n\t\t\t\t\twhile(tmp){\n\t\t\t\t\t\tk = v = u;\n\t\t\t\t\t\ti = tmp[1];\n\t\t\t\t\t\ttmp = p.split(tmp[2])||'';\n\t\t\t\t\t\tif('#' == tmp[0]){\n\t\t\t\t\t\t\tk = tmp[1];\n\t\t\t\t\t\t\tpre = pre.slice(0,i);\n\t\t\t\t\t\t\tif(i <= pre.length){\n\t\t\t\t\t\t\t\tpre.push(k);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttmp = p.split(tmp[2])||'';\n\t\t\t\t\t\tif('\\n' == tmp[0]){ continue }\n\t\t\t\t\t\tif('=' == tmp[0] || ':' == tmp[0]){ v = tmp[1] }\n\t\t\t\t\t\tif(u !== k && u !== v){ p.disk(pre.join(''), v) }\n\t\t\t\t\t\ttmp = p.split(tmp[2]);\n\t\t\t\t\t}\n\t\t\t\t\tconsole.STAT && console.STAT(S, +new Date - S, 'parsed RAD');\n\t\t\t\t\tp.map(q, p.ack);\n\t\t\t\t};\n\t\t\t\tp.split = function(t){\n\t\t\t\t\tif(!t){ return }\n\t\t\t\t\tvar l = [], o = {}, i = -1, a = '', b, c;\n\t\t\t\t\ti = t.indexOf(s);\n\t\t\t\t\tif(!t[i]){ return }\n\t\t\t\t\ta = t.slice(0, i);\n\t\t\t\t\tl[0] = a;\n\t\t\t\t\tl[1] = b = Radisk.decode(t.slice(i), o);\n\t\t\t\t\tl[2] = t.slice(i + o.i);\n\t\t\t\t\treturn l;\n\t\t\t\t}\n\t\t\t\tif(r.disk){ raw || (raw = (r.disk[file]||'').raw) }\n\t\t\t\tvar S = +new Date, SM, SL;\n\t\t\t\tDBG && (DBG.rp = S);\n\t\t\t\tif(raw){ return puff(function(){ p.read(u, raw) }, 0) }\n\t\t\t\topt.store.get(ename(file), p.read);\n\t\t\t\t// TODO: What if memory disk gets filled with updates, and we get an old one back?\n\t\t\t}\n\t\t}());\n\n\t\t;(function(){\n\t\t\tvar dir, f = String.fromCharCode(28), Q;\n\t\t\tr.find = function(key, cb){\n\t\t\t\tif(!dir){\n\t\t\t\t\tif(Q){ Q.push([key, cb]); return } Q = [[key, cb]];\n\t\t\t\t\tr.parse(f, init);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tRadix.map(r.list = dir, function(val, key){\n\t\t\t\t\tif(!val){ return }\n\t\t\t\t\treturn cb(key) || true;\n\t\t\t\t}, {reverse: 1, end: key}) || cb(opt.code.from);\n\t\t\t}\n\t\t\tr.find.add = function(file, cb){\n\t\t\t\tvar has = dir(file);\n\t\t\t\tif(has || file === f){ cb(u, 1); return }\n\t\t\t\tdir(file, 1);\n\t\t\t\tcb.found = (cb.found || 0) + 1;\n\t\t\t\tr.write(f, dir, function(err, ok){\n\t\t\t\t\tif(err){ cb(err); return }\n\t\t\t\t\tcb.found = (cb.found || 0) - 1;\n\t\t\t\t\tif(0 !== cb.found){ return }\n\t\t\t\t\tcb(u, 1);\n\t\t\t\t}, true);\n\t\t\t}\n\t\t\tr.find.bad = function(file, cb){\n\t\t\t\tdir(file, 0);\n\t\t\t\tr.write(f, dir, cb||noop);\n\t\t\t}\n\t\t\tfunction init(err, disk){\n\t\t\t\tif(err){\n\t\t\t\t\topt.log('list', err);\n\t\t\t\t\tsetTimeout(function(){ r.parse(f, init) }, 1000);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif(disk){ drain(disk); return }\n\t\t\t\tdir = dir || disk || Radix();\n\t\t\t\tif(!opt.store.list){ drain(dir); return }\n\t\t\t\t// import directory.\n\t\t\t\topt.store.list(function(file){\n\t\t\t\t\tif(!file){ drain(dir); return }\n\t\t\t\t\tr.find.add(file, noop);\n\t\t\t\t});\n\t\t\t}\n\t\t\tfunction drain(rad, tmp){\n\t\t\t\tdir = dir || rad;\n\t\t\t\tdir.file = f;\n\t\t\t\ttmp = Q; Q = null;\n\t\t\t\tmap(tmp, function(arg){\n\t\t\t\t\tr.find(arg[0], arg[1]);\n\t\t\t\t});\n\t\t\t}\n\t\t}());\n\n\t\ttry{ !Gun.window && require('./radmigtmp')(r) }catch(e){}\n\n\t\tvar noop = function(){}, RAD, u;\n\t\tRadisk.has[opt.file] = r;\n\t\treturn r;\n\t}\n\n\t;(function(){\n\t\tvar _ = String.fromCharCode(31), u;\n\t\tRadisk.encode = function(d, o, s){ s = s || _;\n\t\t\tvar t = s, tmp;\n\t\t\tif(typeof d == 'string'){\n\t\t\t\tvar i = d.indexOf(s);\n\t\t\t\twhile(i != -1){ t += s; i = d.indexOf(s, i+1) }\n\t\t\t\treturn t + '\"' + d + s;\n\t\t\t} else\n\t\t\tif(d && d['#'] && 1 == Object.keys(d).length){\n\t\t\t\treturn t + '#' + tmp + t;\n\t\t\t} else\n\t\t\tif('number' == typeof d){\n\t\t\t\treturn t + '+' + (d||0) + t;\n\t\t\t} else\n\t\t\tif(null === d){\n\t\t\t\treturn t + ' ' + t;\n\t\t\t} else\n\t\t\tif(true === d){\n\t\t\t\treturn t + '+' + t;\n\t\t\t} else\n\t\t\tif(false === d){\n\t\t\t\treturn t + '-' + t;\n\t\t\t}// else\n\t\t\t//if(binary){}\n\t\t}\n\t\tRadisk.decode = function(t, o, s){ s = s || _;\n\t\t\tvar d = '', i = -1, n = 0, c, p;\n\t\t\tif(s !== t[0]){ return }\n\t\t\twhile(s === t[++i]){ ++n }\n\t\t\tp = t[c = n] || true;\n\t\t\twhile(--n >= 0){ i = t.indexOf(s, i+1) }\n\t\t\tif(i == -1){ i = t.length }\n\t\t\td = t.slice(c+1, i);\n\t\t\tif(o){ o.i = i+1 }\n\t\t\tif('\"' === p){\n\t\t\t\treturn d;\n\t\t\t} else\n\t\t\tif('#' === p){\n\t\t\t\treturn {'#':d};\n\t\t\t} else\n\t\t\tif('+' === p){\n\t\t\t\tif(0 === d.length){\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn parseFloat(d);\n\t\t\t} else\n\t\t\tif(' ' === p){\n\t\t\t\treturn null;\n\t\t\t} else\n\t\t\tif('-' === p){\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}());\n\n\tif(typeof window !== \"undefined\"){\n\t var Gun = window.Gun;\n\t var Radix = window.Radix;\n\t window.Radisk = Radisk;\n\t} else { \n\t var Gun = require('../gun');\n\t\tvar Radix = require('./radix');\n\t\t//var Radix = require('./radix2'); Radisk = require('./radisk2');\n\t\ttry{ module.exports = Radisk }catch(e){}\n\t}\n\n\tRadisk.Radix = Radix;\n\n}());","module.exports = function(r){\n\tvar Radix = require('./radix');\n\tr.find('a', function(){\n\t\tvar l = [];\n\t\tRadix.map(r.list, function(v,f){\n\t\t\tif(!(f.indexOf('%1B') + 1)){ return }\n\t\t\tif(!v){ return }\n\t\t\tl.push([f,v]);\n\t\t});\n\t\tif(l.length){\n\t\t\tconsole.log(\"\\n! ! ! WARNING ! ! !\\nRAD v0.2020.x has detected OLD v0.2019.x data & automatically migrating. Automatic migration will be turned OFF in future versions! If you are just developing/testing, we recommend you reset your data. Please contact us if you have any concerns.\\nThis message should only log once.\")\n\t\t}\n\t\tvar f, v;\n\t\tl.forEach(function(a){\n\t\t\tf = a[0]; v = a[1];\n\t\t\tr.list(decodeURIComponent(f), v);\n\t\t\tr.list(f, 0);\n\t\t});\n\t\tif(!f){ return }\n\t\tr.find.bad(f);\n\t})\n};","var Gun = (typeof window !== \"undefined\")? window.Gun : require('../gun');\n\nGun.on('create', function(root){\n if(Gun.TESTING){ root.opt.file = 'radatatest' }\n this.to.next(root);\n var opt = root.opt, empty = {}, u;\n if(false === opt.rad || false === opt.radisk){ return }\n if((u+'' != typeof process) && 'false' === ''+(process.env||'').RAD){ return }\n var Radisk = (Gun.window && Gun.window.Radisk) || require('./radisk');\n var Radix = Radisk.Radix;\n var dare = Radisk(opt), esc = String.fromCharCode(27);\n var ST = 0;\n \n root.on('put', function(msg){\n this.to.next(msg);\n if((msg._||'').rad){ return } // don't save what just came from a read.\n //if(msg['@']){ return } // WHY DID I NOT ADD THIS?\n var id = msg['#'], put = msg.put, soul = put['#'], key = put['.'], val = put[':'], state = put['>'], tmp;\n var DBG = (msg._||'').DBG; DBG && (DBG.sp = DBG.sp || +new Date);\n //var lot = (msg._||'').lot||''; count[id] = (count[id] || 0) + 1; \n var S = (msg._||'').RPS || ((msg._||'').RPS = +new Date);\n //console.log(\"PUT ------->>>\", soul,key, val, state);\n //dare(soul+esc+key, {':': val, '>': state}, dare.one[id] || function(err, ok){\n dare(soul+esc+key, {':': val, '>': state}, function(err, ok){\n //console.log(\"<<<------- PAT\", soul,key, val, state, 'in', +new Date - S);\n DBG && (DBG.spd = DBG.spd || +new Date);\n console.STAT && console.STAT(S, +new Date - S, 'put');\n //if(!err && count[id] !== lot.s){ console.log(err = \"Disk count not same as ram count.\"); console.STAT && console.STAT(+new Date, lot.s - count[id], 'put ack != count') } delete count[id];\n if(err){ root.on('in', {'@': id, err: err, DBG: DBG}); return }\n root.on('in', {'@': id, ok: ok, DBG: DBG});\n //}, id, DBG && (DBG.r = DBG.r || {}));\n }, false && id, DBG && (DBG.r = DBG.r || {}));\n DBG && (DBG.sps = DBG.sps || +new Date);\n });\n var count = {}, obj_empty = Object.empty;\n \n root.on('get', function(msg){\n this.to.next(msg);\n var ctx = msg._||'', DBG = ctx.DBG = msg.DBG; DBG && (DBG.sg = +new Date);\n var id = msg['#'], get = msg.get, soul = msg.get['#'], has = msg.get['.']||'', o = {}, graph, lex, key, tmp, force;\n if('string' == typeof soul){\n key = soul;\n } else \n if(soul){\n if(u !== (tmp = soul['*'])){ o.limit = force = 1 }\n if(u !== soul['>']){ o.start = soul['>'] }\n if(u !== soul['<']){ o.end = soul['<'] }\n key = force? (''+tmp) : tmp || soul['='];\n force = null;\n }\n if(key && !o.limit){ // a soul.has must be on a soul, and not during soul*\n if('string' == typeof has){\n key = key+esc+(o.atom = has);\n } else \n if(has){\n if(u !== has['>']){ o.start = has['>']; o.limit = 1 }\n if(u !== has['<']){ o.end = has['<']; o.limit = 1 }\n if(u !== (tmp = has['*'])){ o.limit = force = 1 }\n if(key){ key = key+esc + (force? (''+(tmp||'')) : tmp || (o.atom = has['='] || '')) }\n }\n }\n if((tmp = get['%']) || o.limit){\n o.limit = (tmp <= (o.pack || (1000 * 100)))? tmp : 1;\n }\n if(has['-'] || (soul||{})['-'] || get['-']){ o.reverse = true }\n if((tmp = (root.next||'')[soul]) && tmp.put){\n if(o.atom){\n tmp = (tmp.next||'')[o.atom] ;\n if(tmp && tmp.rad){ return }\n } else\n if(tmp && tmp.rad){ return }\n }\n var now = Gun.state();\n var S = (+new Date), C = 0, SPT = 0; // STATS!\n DBG && (DBG.sgm = S);\n //var GID = String.random(3); console.log(\"GET ------->>>\", GID, key, o, '?', get);\n dare(key||'', function(err, data, info){\n //console.log(\"<<<------- GOT\", GID, +new Date - S, err, data);\n DBG && (DBG.sgr = +new Date);\n DBG && (DBG.sgi = info);\n try{opt.store.stats.get.time[statg % 50] = (+new Date) - S; ++statg;\n opt.store.stats.get.count++;\n if(err){ opt.store.stats.get.err = err }\n }catch(e){} // STATS!\n //if(u === data && info.chunks > 1){ return } // if we already sent a chunk, ignore ending empty responses. // this causes tests to fail.\n console.STAT && console.STAT(S, +new Date - S, 'got', JSON.stringify(key)); S = +new Date;\n info = info || '';\n var va, ve;\n if(info.unit && data && u !== (va = data[':']) && u !== (ve = data['>'])){ // new format\n var tmp = key.split(esc), so = tmp[0], ha = tmp[1];\n (graph = graph || {})[so] = Gun.state.ify(graph[so], ha, ve, va, so);\n root.$.get(so).get(ha)._.rad = now;\n // REMEMBER TO ADD _rad TO NODE/SOUL QUERY!\n } else\n if(data){ // old code path\n if(typeof data !== 'string'){\n if(o.atom){\n data = u;\n } else {\n Radix.map(data, each, o); // IS A RADIX TREE, NOT FUNCTION!\n }\n }\n if(!graph && data){ each(data, '') }\n // TODO: !has what about soul lookups?\n if(!o.atom && !has & 'string' == typeof soul && !o.limit && !o.more){\n root.$.get(soul)._.rad = now;\n }\n }\n DBG && (DBG.sgp = +new Date);\n // TODO: PERF NOTES! This is like 0.2s, but for each ack, or all? Can you cache these preps?\n // TODO: PERF NOTES! This is like 0.2s, but for each ack, or all? Can you cache these preps?\n // TODO: PERF NOTES! This is like 0.2s, but for each ack, or all? Can you cache these preps?\n // TODO: PERF NOTES! This is like 0.2s, but for each ack, or all? Can you cache these preps?\n // TODO: PERF NOTES! This is like 0.2s, but for each ack, or all? Can you cache these preps?\n // Or benchmark by reusing first start date.\n if(console.STAT && (ST = +new Date - S) > 9){ console.STAT(S, ST, 'got prep time'); console.STAT(S, C, 'got prep #') } SPT += ST; C = 0; S = +new Date;\n var faith = function(){}; faith.faith = true; faith.rad = get; // HNPERF: We're testing performance improvement by skipping going through security again, but this should be audited.\n root.on('in', {'@': id, put: graph, '%': info.more? 1 : u, err: err? err : u, _: faith, DBG: DBG});\n console.STAT && (ST = +new Date - S) > 9 && console.STAT(S, ST, 'got emit', Object.keys(graph||{}).length);\n graph = u; // each is outside our scope, we have to reset graph to nothing!\n }, o, DBG && (DBG.r = DBG.r || {}));\n DBG && (DBG.sgd = +new Date);\n console.STAT && (ST = +new Date - S) > 9 && console.STAT(S, ST, 'get call'); // TODO: Perf: this was half a second??????\n function each(val, has, a,b){ // TODO: THIS CODE NEEDS TO BE FASTER!!!!\n C++;\n if(!val){ return }\n has = (key+has).split(esc);\n var soul = has.slice(0,1)[0];\n has = has.slice(-1)[0];\n if(o.limit && o.limit <= o.count){ return true }\n var va, ve, so = soul, ha = has;\n //if(u !== (va = val[':']) && u !== (ve = val['>'])){ // THIS HANDLES NEW CODE!\n if('string' != typeof val){ // THIS HANDLES NEW CODE!\n va = val[':']; ve = val['>'];\n (graph = graph || {})[so] = Gun.state.ify(graph[so], ha, ve, va, so);\n //root.$.get(so).get(ha)._.rad = now;\n o.count = (o.count || 0) + ((va||'').length || 9);\n return;\n }\n o.count = (o.count || 0) + val.length;\n var tmp = val.lastIndexOf('>');\n var state = Radisk.decode(val.slice(tmp+1), null, esc);\n val = Radisk.decode(val.slice(0,tmp), null, esc);\n (graph = graph || {})[soul] = Gun.state.ify(graph[soul], has, state, val, soul);\n }\n });\n var val_is = Gun.valid;\n (opt.store||{}).stats = {get:{time:{}, count:0}, put: {time:{}, count:0}}; // STATS!\n var statg = 0, statp = 0; // STATS!\n});","function Store(opt){\n\topt = opt || {};\n\topt.log = opt.log || console.log;\n\topt.file = String(opt.file || 'radata');\n\tvar fs = require('fs'), u;\n\n\tvar store = function Store(){};\n\tif(Store[opt.file]){\n\t\tconsole.log(\"Warning: reusing same fs store and options as 1st.\");\n\t\treturn Store[opt.file];\n\t}\n\tStore[opt.file] = store;\n\tvar puts = {};\n\n\t// TODO!!! ADD ZLIB INFLATE / DEFLATE COMPRESSION!\n\tstore.put = function(file, data, cb){\n\t\tvar random = Math.random().toString(36).slice(-3);\n\t\tputs[file] = {id: random, data: data};\n\t\tvar tmp = opt.file+'-'+file+'-'+random+'.tmp';\n\t\tfs.writeFile(tmp, data, function(err, ok){\n\t\t\tif(err){\n\t\t\t\tif(random === (puts[file]||'').id){ delete puts[file] }\n\t\t\t\treturn cb(err);\n\t\t\t}\n\t\t\tmove(tmp, opt.file+'/'+file, function(err, ok){\n\t\t\t\tif(random === (puts[file]||'').id){ delete puts[file] }\n\t\t\t\tcb(err, ok || !err);\n\t\t\t});\n\t\t});\n\t};\n\tstore.get = function(file, cb){ var tmp; // this took 3s+?\n\t\tif(tmp = puts[file]){ cb(u, tmp.data); return }\n\t\tfs.readFile(opt.file+'/'+file, function(err, data){\n\t\t\tif(err){\n\t\t\t\tif('ENOENT' === (err.code||'').toUpperCase()){\n\t\t\t\t\treturn cb();\n\t\t\t\t}\n\t\t\t\topt.log(\"ERROR:\", err);\n\t\t\t}\n\t\t\tcb(err, data);\n\t\t});\n\t};\n\n\tif(!fs.existsSync(opt.file)){ fs.mkdirSync(opt.file) }\n\n\tfunction move(oldPath, newPath, cb) {\n\t\tfs.rename(oldPath, newPath, function (err) {\n\t\t\tif (err) {\n\t\t\t\tif (err.code === 'EXDEV') {\n\t\t\t\t\tvar readStream = fs.createReadStream(oldPath);\n\t\t\t\t\tvar writeStream = fs.createWriteStream(newPath);\n\n\t\t\t\t\treadStream.on('error', cb);\n\t\t\t\t\twriteStream.on('error', cb);\n\n\t\t\t\t\treadStream.on('close', function () {\n\t\t\t\t\t\tfs.unlink(oldPath, cb);\n\t\t\t\t\t});\n\n\t\t\t\t\treadStream.pipe(writeStream);\n\t\t\t\t} else {\n\t\t\t\t\tcb(err);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcb();\n\t\t\t}\n\t\t});\n\t};\n\n\tstore.list = function(cb, match, params, cbs){\n\t\tvar dir = fs.readdirSync(opt.file);\n\t\tdir.forEach(function(file){\n\t\t\tcb(file);\n\t\t})\n\t\tcb();\n\t};\n\t\n\treturn store;\n}\n\nvar Gun = (typeof window !== \"undefined\")? window.Gun : require('../gun');\nGun.on('create', function(root){\n\tthis.to.next(root);\n\tvar opt = root.opt;\n\tif(opt.rfs === false){ return }\n\topt.store = opt.store || (!Gun.window && Store(opt));\n});\n\nmodule.exports = Store;","var Gun = require('../gun');\nvar Radisk = require('./radisk');\nvar fs = require('fs');\nvar Radix = Radisk.Radix;\nvar u, AWS;\n\nGun.on('create', function(root){\n\tthis.to.next(root);\n\tvar opt = root.opt;\n\tif(!opt.s3 && !process.env.AWS_S3_BUCKET){ return }\n\t//opt.batch = opt.batch || (1000 * 10);\n\t//opt.until = opt.until || (1000 * 3); // ignoring these now, cause perf > cost\n\t//opt.chunk = opt.chunk || (1024 * 1024 * 10); // 10MB // when cost only cents\n\n\ttry{AWS = require('aws-sdk');\n\t}catch(e){\n\t\tconsole.log(\"Please `npm install aws-sdk` or add it to your package.json !\");\n\t\tAWS_SDK_NOT_INSTALLED;\n\t}\n\n\tvar opts = opt.s3 || (opt.s3 = {});\n\topts.bucket = opts.bucket || process.env.AWS_S3_BUCKET;\n\topts.region = opts.region || process.env.AWS_REGION || \"us-east-1\";\n\topts.accessKeyId = opts.key = opts.key || opts.accessKeyId || process.env.AWS_ACCESS_KEY_ID;\n\topts.secretAccessKey = opts.secret = opts.secret || opts.secretAccessKey || process.env.AWS_SECRET_ACCESS_KEY;\n\n\tif(opt.fakes3 = opt.fakes3 || process.env.fakes3){\n\t\topts.endpoint = opt.fakes3;\n\t\topts.sslEnabled = false;\n\t\topts.bucket = opts.bucket.replace('.','p');\n\t}\n\n\topts.config = new AWS.Config(opts);\n\topts.s3 = opts.s3 || new AWS.S3(opts.config);\n\n\topt.store = Object.keys(opts.s3).length === 0 ? opt.store : Store(opt);\n});\n\nfunction Store(opt){\n\topt = opt || {};\n\topt.file = String(opt.file || 'radata');\n\tvar opts = opt.s3, s3 = opts.s3;\n\tvar c = {p: {}, g: {}, l: {}};\n\t\n\tvar store = function Store(){};\n\tif(Store[opt.file]){\n\t\tconsole.log(\"Warning: reusing same S3 store and options as 1st.\");\n\t\treturn Store[opt.file];\n\t}\n\tStore[opt.file] = store;\n\n\tstore.put = function(file, data, cb){\n\t\tvar params = {Bucket: opts.bucket, Key: file, Body: data};\n\t\t//console.log(\"RS3 PUT ---->\", (data||\"\").slice(0,20));\n\t\tc.p[file] = data;\n\t\tdelete c.g[file];//Gun.obj.del(c.g, file);\n\t\tdelete c.l[1];//Gun.obj.del(c.l, 1);\n s3.putObject(params, function(err, ok){\n \tdelete c.p[file];\n \tcb(err, 's3');\n });\n\t};\n\tstore.get = function(file, cb){ var tmp;\n\t\tif(tmp = c.p[file]){ cb(u, tmp); return }\n\t\tif(tmp = c.g[file]){ tmp.push(cb); return }\n\t\tvar cbs = c.g[file] = [cb];\n\t\tvar params = {Bucket: opts.bucket, Key: file||''};\n\t\t//console.log(\"RS3 GET ---->\", file);\n\t\ts3.getObject(params, function got(err, ack){\n\t\t\tif(err && 'NoSuchKey' === err.code){ err = u }\n\t\t\t//console.log(\"RS3 GOT <----\", err, file, cbs.length, ((ack||{}).Body||'').length);//.toString().slice(0,20));\n\t\t\tdelete c.g[file];//Gun.obj.del(c.g, file);\n\t\t\tvar data, data = (ack||'').Body;\n\t\t\t//console.log(1, process.memoryUsage().heapUsed);\n\t\t\tvar i = 0, cba; while(cba = cbs[i++]){ cba && cba(err, data) }//Gun.obj.map(cbs, cbe);\n\t\t});\n\t};\n\tstore.list = function(cb, match, params, cbs){\n\t\tif(!cbs){\n\t\t\tif(c.l[1]){ return c.l[1].push(cb) }\n\t\t\tcbs = c.l[1] = [cb];\n\t\t}\n\t\tparams = params || {Bucket: opts.bucket};\n\t\t//console.log(\"RS3 LIST --->\");\n\t\ts3.listObjectsV2(params, function(err, data){\n\t\t\t//console.log(\"RS3 LIST <---\", err, data, cbs.length);\n\t\t\tif(err){ return Gun.log(err, err.stack) }\n\t\t\tvar IT = data.IsTruncated, cbe = function(cb){\n\t\t\t\tif(cb.end){ return }\n\t\t\t\tif(Gun.obj.map(data.Contents, function(content){\n\t\t\t\t\treturn cb(content.Key);\n\t\t\t\t})){ cb.end = true; return }\n\t\t\t\tif(IT){ return }\n\t\t\t\t// Stream interface requires a final call to know when to be done.\n\t\t\t\tcb.end = true; cb();\n\t\t\t}\n\t\t\t// Gun.obj.map(cbs, cbe); // lets see if fixes heroku\n\t\t\tif(!IT){ delete c.l[1]; return }\n\t params.ContinuationToken = data.NextContinuationToken;\n\t \tstore.list(cb, match, params, cbs);\n });\n\t};\n\t//store.list(function(){ return true });\n\tif(false !== opt.rfs){ require('./rfsmix')(opt, store) } // ugly, but gotta move fast for now.\n\treturn store;\n}\n\nmodule.exports = Store;\n","module.exports = function(opt, store){\n\tvar rfs = require('./rfs')(opt);\n\tvar p = store.put;\n\tvar g = store.get;\n\tstore.put = function(file, data, cb){\n\t\tvar a, b, c = function(err, ok){\n\t\t\tif(b){ return cb(err || b) }\n\t\t\tif(a){ return cb(err, ok) }\n\t\t\ta = true;\n\t\t\tb = err;\n\t\t}\n\t\tp(file, data, c); // parallel\n\t\trfs.put(file, data, c); // parallel\n\t}\n\tstore.get = function(file, cb){\n\t\trfs.get(file, function(err, data){\n\t\t\t//console.log(\"rfs3 hijacked\", file);\n\t\t\tif(data){ return cb(err, data) }\n\t\t\tg(file, cb);\n\t\t});\n\t}\n\treturn store;\n}","'use strict';\n\nmodule.exports = {\n BINARY_TYPES: ['nodebuffer', 'arraybuffer', 'fragments'],\n GUID: '258EAFA5-E914-47DA-95CA-C5AB0DC85B11',\n kStatusCode: Symbol('status-code'),\n kWebSocket: Symbol('websocket'),\n EMPTY_BUFFER: Buffer.alloc(0),\n NOOP: () => {}\n};\n","'use strict';\n\nconst { EMPTY_BUFFER } = require('./constants');\n\n/**\n * Merges an array of buffers into a new buffer.\n *\n * @param {Buffer[]} list The array of buffers to concat\n * @param {Number} totalLength The total length of buffers in the list\n * @return {Buffer} The resulting buffer\n * @public\n */\nfunction concat(list, totalLength) {\n if (list.length === 0) return EMPTY_BUFFER;\n if (list.length === 1) return list[0];\n\n const target = Buffer.allocUnsafe(totalLength);\n let offset = 0;\n\n for (let i = 0; i < list.length; i++) {\n const buf = list[i];\n target.set(buf, offset);\n offset += buf.length;\n }\n\n if (offset < totalLength) return target.slice(0, offset);\n\n return target;\n}\n\n/**\n * Masks a buffer using the given mask.\n *\n * @param {Buffer} source The buffer to mask\n * @param {Buffer} mask The mask to use\n * @param {Buffer} output The buffer where to store the result\n * @param {Number} offset The offset at which to start writing\n * @param {Number} length The number of bytes to mask.\n * @public\n */\nfunction _mask(source, mask, output, offset, length) {\n for (let i = 0; i < length; i++) {\n output[offset + i] = source[i] ^ mask[i & 3];\n }\n}\n\n/**\n * Unmasks a buffer using the given mask.\n *\n * @param {Buffer} buffer The buffer to unmask\n * @param {Buffer} mask The mask to use\n * @public\n */\nfunction _unmask(buffer, mask) {\n // Required until https://github.com/nodejs/node/issues/9006 is resolved.\n const length = buffer.length;\n for (let i = 0; i < length; i++) {\n buffer[i] ^= mask[i & 3];\n }\n}\n\n/**\n * Converts a buffer to an `ArrayBuffer`.\n *\n * @param {Buffer} buf The buffer to convert\n * @return {ArrayBuffer} Converted buffer\n * @public\n */\nfunction toArrayBuffer(buf) {\n if (buf.byteLength === buf.buffer.byteLength) {\n return buf.buffer;\n }\n\n return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength);\n}\n\n/**\n * Converts `data` to a `Buffer`.\n *\n * @param {*} data The data to convert\n * @return {Buffer} The buffer\n * @throws {TypeError}\n * @public\n */\nfunction toBuffer(data) {\n toBuffer.readOnly = true;\n\n if (Buffer.isBuffer(data)) return data;\n\n let buf;\n\n if (data instanceof ArrayBuffer) {\n buf = Buffer.from(data);\n } else if (ArrayBuffer.isView(data)) {\n buf = Buffer.from(data.buffer, data.byteOffset, data.byteLength);\n } else {\n buf = Buffer.from(data);\n toBuffer.readOnly = false;\n }\n\n return buf;\n}\n\ntry {\n const bufferUtil = require('bufferutil');\n const bu = bufferUtil.BufferUtil || bufferUtil;\n\n module.exports = {\n concat,\n mask(source, mask, output, offset, length) {\n if (length < 48) _mask(source, mask, output, offset, length);\n else bu.mask(source, mask, output, offset, length);\n },\n toArrayBuffer,\n toBuffer,\n unmask(buffer, mask) {\n if (buffer.length < 32) _unmask(buffer, mask);\n else bu.unmask(buffer, mask);\n }\n };\n} catch (e) /* istanbul ignore next */ {\n module.exports = {\n concat,\n mask: _mask,\n toArrayBuffer,\n toBuffer,\n unmask: _unmask\n };\n}\n","'use strict';\n\nconst kDone = Symbol('kDone');\nconst kRun = Symbol('kRun');\n\n/**\n * A very simple job queue with adjustable concurrency. Adapted from\n * https://github.com/STRML/async-limiter\n */\nclass Limiter {\n /**\n * Creates a new `Limiter`.\n *\n * @param {Number} [concurrency=Infinity] The maximum number of jobs allowed\n * to run concurrently\n */\n constructor(concurrency) {\n this[kDone] = () => {\n this.pending--;\n this[kRun]();\n };\n this.concurrency = concurrency || Infinity;\n this.jobs = [];\n this.pending = 0;\n }\n\n /**\n * Adds a job to the queue.\n *\n * @param {Function} job The job to run\n * @public\n */\n add(job) {\n this.jobs.push(job);\n this[kRun]();\n }\n\n /**\n * Removes a job from the queue and runs it if possible.\n *\n * @private\n */\n [kRun]() {\n if (this.pending === this.concurrency) return;\n\n if (this.jobs.length) {\n const job = this.jobs.shift();\n\n this.pending++;\n job(this[kDone]);\n }\n }\n}\n\nmodule.exports = Limiter;\n","'use strict';\n\nconst zlib = require('zlib');\n\nconst bufferUtil = require('./buffer-util');\nconst Limiter = require('./limiter');\nconst { kStatusCode, NOOP } = require('./constants');\n\nconst TRAILER = Buffer.from([0x00, 0x00, 0xff, 0xff]);\nconst kPerMessageDeflate = Symbol('permessage-deflate');\nconst kTotalLength = Symbol('total-length');\nconst kCallback = Symbol('callback');\nconst kBuffers = Symbol('buffers');\nconst kError = Symbol('error');\n\n//\n// We limit zlib concurrency, which prevents severe memory fragmentation\n// as documented in https://github.com/nodejs/node/issues/8871#issuecomment-250915913\n// and https://github.com/websockets/ws/issues/1202\n//\n// Intentionally global; it's the global thread pool that's an issue.\n//\nlet zlibLimiter;\n\n/**\n * permessage-deflate implementation.\n */\nclass PerMessageDeflate {\n /**\n * Creates a PerMessageDeflate instance.\n *\n * @param {Object} [options] Configuration options\n * @param {Boolean} [options.serverNoContextTakeover=false] Request/accept\n * disabling of server context takeover\n * @param {Boolean} [options.clientNoContextTakeover=false] Advertise/\n * acknowledge disabling of client context takeover\n * @param {(Boolean|Number)} [options.serverMaxWindowBits] Request/confirm the\n * use of a custom server window size\n * @param {(Boolean|Number)} [options.clientMaxWindowBits] Advertise support\n * for, or request, a custom client window size\n * @param {Object} [options.zlibDeflateOptions] Options to pass to zlib on\n * deflate\n * @param {Object} [options.zlibInflateOptions] Options to pass to zlib on\n * inflate\n * @param {Number} [options.threshold=1024] Size (in bytes) below which\n * messages should not be compressed\n * @param {Number} [options.concurrencyLimit=10] The number of concurrent\n * calls to zlib\n * @param {Boolean} [isServer=false] Create the instance in either server or\n * client mode\n * @param {Number} [maxPayload=0] The maximum allowed message length\n */\n constructor(options, isServer, maxPayload) {\n this._maxPayload = maxPayload | 0;\n this._options = options || {};\n this._threshold =\n this._options.threshold !== undefined ? this._options.threshold : 1024;\n this._isServer = !!isServer;\n this._deflate = null;\n this._inflate = null;\n\n this.params = null;\n\n if (!zlibLimiter) {\n const concurrency =\n this._options.concurrencyLimit !== undefined\n ? this._options.concurrencyLimit\n : 10;\n zlibLimiter = new Limiter(concurrency);\n }\n }\n\n /**\n * @type {String}\n */\n static get extensionName() {\n return 'permessage-deflate';\n }\n\n /**\n * Create an extension negotiation offer.\n *\n * @return {Object} Extension parameters\n * @public\n */\n offer() {\n const params = {};\n\n if (this._options.serverNoContextTakeover) {\n params.server_no_context_takeover = true;\n }\n if (this._options.clientNoContextTakeover) {\n params.client_no_context_takeover = true;\n }\n if (this._options.serverMaxWindowBits) {\n params.server_max_window_bits = this._options.serverMaxWindowBits;\n }\n if (this._options.clientMaxWindowBits) {\n params.client_max_window_bits = this._options.clientMaxWindowBits;\n } else if (this._options.clientMaxWindowBits == null) {\n params.client_max_window_bits = true;\n }\n\n return params;\n }\n\n /**\n * Accept an extension negotiation offer/response.\n *\n * @param {Array} configurations The extension negotiation offers/reponse\n * @return {Object} Accepted configuration\n * @public\n */\n accept(configurations) {\n configurations = this.normalizeParams(configurations);\n\n this.params = this._isServer\n ? this.acceptAsServer(configurations)\n : this.acceptAsClient(configurations);\n\n return this.params;\n }\n\n /**\n * Releases all resources used by the extension.\n *\n * @public\n */\n cleanup() {\n if (this._inflate) {\n this._inflate.close();\n this._inflate = null;\n }\n\n if (this._deflate) {\n const callback = this._deflate[kCallback];\n\n this._deflate.close();\n this._deflate = null;\n\n if (callback) {\n callback(\n new Error(\n 'The deflate stream was closed while data was being processed'\n )\n );\n }\n }\n }\n\n /**\n * Accept an extension negotiation offer.\n *\n * @param {Array} offers The extension negotiation offers\n * @return {Object} Accepted configuration\n * @private\n */\n acceptAsServer(offers) {\n const opts = this._options;\n const accepted = offers.find((params) => {\n if (\n (opts.serverNoContextTakeover === false &&\n params.server_no_context_takeover) ||\n (params.server_max_window_bits &&\n (opts.serverMaxWindowBits === false ||\n (typeof opts.serverMaxWindowBits === 'number' &&\n opts.serverMaxWindowBits > params.server_max_window_bits))) ||\n (typeof opts.clientMaxWindowBits === 'number' &&\n !params.client_max_window_bits)\n ) {\n return false;\n }\n\n return true;\n });\n\n if (!accepted) {\n throw new Error('None of the extension offers can be accepted');\n }\n\n if (opts.serverNoContextTakeover) {\n accepted.server_no_context_takeover = true;\n }\n if (opts.clientNoContextTakeover) {\n accepted.client_no_context_takeover = true;\n }\n if (typeof opts.serverMaxWindowBits === 'number') {\n accepted.server_max_window_bits = opts.serverMaxWindowBits;\n }\n if (typeof opts.clientMaxWindowBits === 'number') {\n accepted.client_max_window_bits = opts.clientMaxWindowBits;\n } else if (\n accepted.client_max_window_bits === true ||\n opts.clientMaxWindowBits === false\n ) {\n delete accepted.client_max_window_bits;\n }\n\n return accepted;\n }\n\n /**\n * Accept the extension negotiation response.\n *\n * @param {Array} response The extension negotiation response\n * @return {Object} Accepted configuration\n * @private\n */\n acceptAsClient(response) {\n const params = response[0];\n\n if (\n this._options.clientNoContextTakeover === false &&\n params.client_no_context_takeover\n ) {\n throw new Error('Unexpected parameter \"client_no_context_takeover\"');\n }\n\n if (!params.client_max_window_bits) {\n if (typeof this._options.clientMaxWindowBits === 'number') {\n params.client_max_window_bits = this._options.clientMaxWindowBits;\n }\n } else if (\n this._options.clientMaxWindowBits === false ||\n (typeof this._options.clientMaxWindowBits === 'number' &&\n params.client_max_window_bits > this._options.clientMaxWindowBits)\n ) {\n throw new Error(\n 'Unexpected or invalid parameter \"client_max_window_bits\"'\n );\n }\n\n return params;\n }\n\n /**\n * Normalize parameters.\n *\n * @param {Array} configurations The extension negotiation offers/reponse\n * @return {Array} The offers/response with normalized parameters\n * @private\n */\n normalizeParams(configurations) {\n configurations.forEach((params) => {\n Object.keys(params).forEach((key) => {\n let value = params[key];\n\n if (value.length > 1) {\n throw new Error(`Parameter \"${key}\" must have only a single value`);\n }\n\n value = value[0];\n\n if (key === 'client_max_window_bits') {\n if (value !== true) {\n const num = +value;\n if (!Number.isInteger(num) || num < 8 || num > 15) {\n throw new TypeError(\n `Invalid value for parameter \"${key}\": ${value}`\n );\n }\n value = num;\n } else if (!this._isServer) {\n throw new TypeError(\n `Invalid value for parameter \"${key}\": ${value}`\n );\n }\n } else if (key === 'server_max_window_bits') {\n const num = +value;\n if (!Number.isInteger(num) || num < 8 || num > 15) {\n throw new TypeError(\n `Invalid value for parameter \"${key}\": ${value}`\n );\n }\n value = num;\n } else if (\n key === 'client_no_context_takeover' ||\n key === 'server_no_context_takeover'\n ) {\n if (value !== true) {\n throw new TypeError(\n `Invalid value for parameter \"${key}\": ${value}`\n );\n }\n } else {\n throw new Error(`Unknown parameter \"${key}\"`);\n }\n\n params[key] = value;\n });\n });\n\n return configurations;\n }\n\n /**\n * Decompress data. Concurrency limited.\n *\n * @param {Buffer} data Compressed data\n * @param {Boolean} fin Specifies whether or not this is the last fragment\n * @param {Function} callback Callback\n * @public\n */\n decompress(data, fin, callback) {\n zlibLimiter.add((done) => {\n this._decompress(data, fin, (err, result) => {\n done();\n callback(err, result);\n });\n });\n }\n\n /**\n * Compress data. Concurrency limited.\n *\n * @param {Buffer} data Data to compress\n * @param {Boolean} fin Specifies whether or not this is the last fragment\n * @param {Function} callback Callback\n * @public\n */\n compress(data, fin, callback) {\n zlibLimiter.add((done) => {\n this._compress(data, fin, (err, result) => {\n done();\n callback(err, result);\n });\n });\n }\n\n /**\n * Decompress data.\n *\n * @param {Buffer} data Compressed data\n * @param {Boolean} fin Specifies whether or not this is the last fragment\n * @param {Function} callback Callback\n * @private\n */\n _decompress(data, fin, callback) {\n const endpoint = this._isServer ? 'client' : 'server';\n\n if (!this._inflate) {\n const key = `${endpoint}_max_window_bits`;\n const windowBits =\n typeof this.params[key] !== 'number'\n ? zlib.Z_DEFAULT_WINDOWBITS\n : this.params[key];\n\n this._inflate = zlib.createInflateRaw({\n ...this._options.zlibInflateOptions,\n windowBits\n });\n this._inflate[kPerMessageDeflate] = this;\n this._inflate[kTotalLength] = 0;\n this._inflate[kBuffers] = [];\n this._inflate.on('error', inflateOnError);\n this._inflate.on('data', inflateOnData);\n }\n\n this._inflate[kCallback] = callback;\n\n this._inflate.write(data);\n if (fin) this._inflate.write(TRAILER);\n\n this._inflate.flush(() => {\n const err = this._inflate[kError];\n\n if (err) {\n this._inflate.close();\n this._inflate = null;\n callback(err);\n return;\n }\n\n const data = bufferUtil.concat(\n this._inflate[kBuffers],\n this._inflate[kTotalLength]\n );\n\n if (this._inflate._readableState.endEmitted) {\n this._inflate.close();\n this._inflate = null;\n } else {\n this._inflate[kTotalLength] = 0;\n this._inflate[kBuffers] = [];\n\n if (fin && this.params[`${endpoint}_no_context_takeover`]) {\n this._inflate.reset();\n }\n }\n\n callback(null, data);\n });\n }\n\n /**\n * Compress data.\n *\n * @param {Buffer} data Data to compress\n * @param {Boolean} fin Specifies whether or not this is the last fragment\n * @param {Function} callback Callback\n * @private\n */\n _compress(data, fin, callback) {\n const endpoint = this._isServer ? 'server' : 'client';\n\n if (!this._deflate) {\n const key = `${endpoint}_max_window_bits`;\n const windowBits =\n typeof this.params[key] !== 'number'\n ? zlib.Z_DEFAULT_WINDOWBITS\n : this.params[key];\n\n this._deflate = zlib.createDeflateRaw({\n ...this._options.zlibDeflateOptions,\n windowBits\n });\n\n this._deflate[kTotalLength] = 0;\n this._deflate[kBuffers] = [];\n\n //\n // An `'error'` event is emitted, only on Node.js < 10.0.0, if the\n // `zlib.DeflateRaw` instance is closed while data is being processed.\n // This can happen if `PerMessageDeflate#cleanup()` is called at the wrong\n // time due to an abnormal WebSocket closure.\n //\n this._deflate.on('error', NOOP);\n this._deflate.on('data', deflateOnData);\n }\n\n this._deflate[kCallback] = callback;\n\n this._deflate.write(data);\n this._deflate.flush(zlib.Z_SYNC_FLUSH, () => {\n if (!this._deflate) {\n //\n // The deflate stream was closed while data was being processed.\n //\n return;\n }\n\n let data = bufferUtil.concat(\n this._deflate[kBuffers],\n this._deflate[kTotalLength]\n );\n\n if (fin) data = data.slice(0, data.length - 4);\n\n //\n // Ensure that the callback will not be called again in\n // `PerMessageDeflate#cleanup()`.\n //\n this._deflate[kCallback] = null;\n\n this._deflate[kTotalLength] = 0;\n this._deflate[kBuffers] = [];\n\n if (fin && this.params[`${endpoint}_no_context_takeover`]) {\n this._deflate.reset();\n }\n\n callback(null, data);\n });\n }\n}\n\nmodule.exports = PerMessageDeflate;\n\n/**\n * The listener of the `zlib.DeflateRaw` stream `'data'` event.\n *\n * @param {Buffer} chunk A chunk of data\n * @private\n */\nfunction deflateOnData(chunk) {\n this[kBuffers].push(chunk);\n this[kTotalLength] += chunk.length;\n}\n\n/**\n * The listener of the `zlib.InflateRaw` stream `'data'` event.\n *\n * @param {Buffer} chunk A chunk of data\n * @private\n */\nfunction inflateOnData(chunk) {\n this[kTotalLength] += chunk.length;\n\n if (\n this[kPerMessageDeflate]._maxPayload < 1 ||\n this[kTotalLength] <= this[kPerMessageDeflate]._maxPayload\n ) {\n this[kBuffers].push(chunk);\n return;\n }\n\n this[kError] = new RangeError('Max payload size exceeded');\n this[kError].code = 'WS_ERR_UNSUPPORTED_MESSAGE_LENGTH';\n this[kError][kStatusCode] = 1009;\n this.removeListener('data', inflateOnData);\n this.reset();\n}\n\n/**\n * The listener of the `zlib.InflateRaw` stream `'error'` event.\n *\n * @param {Error} err The emitted error\n * @private\n */\nfunction inflateOnError(err) {\n //\n // There is no need to call `Zlib#close()` as the handle is automatically\n // closed when an error is emitted.\n //\n this[kPerMessageDeflate]._inflate = null;\n err[kStatusCode] = 1007;\n this[kCallback](err);\n}\n","'use strict';\n\n/**\n * Checks if a status code is allowed in a close frame.\n *\n * @param {Number} code The status code\n * @return {Boolean} `true` if the status code is valid, else `false`\n * @public\n */\nfunction isValidStatusCode(code) {\n return (\n (code >= 1000 &&\n code <= 1014 &&\n code !== 1004 &&\n code !== 1005 &&\n code !== 1006) ||\n (code >= 3000 && code <= 4999)\n );\n}\n\n/**\n * Checks if a given buffer contains only correct UTF-8.\n * Ported from https://www.cl.cam.ac.uk/%7Emgk25/ucs/utf8_check.c by\n * Markus Kuhn.\n *\n * @param {Buffer} buf The buffer to check\n * @return {Boolean} `true` if `buf` contains only correct UTF-8, else `false`\n * @public\n */\nfunction _isValidUTF8(buf) {\n const len = buf.length;\n let i = 0;\n\n while (i < len) {\n if ((buf[i] & 0x80) === 0) {\n // 0xxxxxxx\n i++;\n } else if ((buf[i] & 0xe0) === 0xc0) {\n // 110xxxxx 10xxxxxx\n if (\n i + 1 === len ||\n (buf[i + 1] & 0xc0) !== 0x80 ||\n (buf[i] & 0xfe) === 0xc0 // Overlong\n ) {\n return false;\n }\n\n i += 2;\n } else if ((buf[i] & 0xf0) === 0xe0) {\n // 1110xxxx 10xxxxxx 10xxxxxx\n if (\n i + 2 >= len ||\n (buf[i + 1] & 0xc0) !== 0x80 ||\n (buf[i + 2] & 0xc0) !== 0x80 ||\n (buf[i] === 0xe0 && (buf[i + 1] & 0xe0) === 0x80) || // Overlong\n (buf[i] === 0xed && (buf[i + 1] & 0xe0) === 0xa0) // Surrogate (U+D800 - U+DFFF)\n ) {\n return false;\n }\n\n i += 3;\n } else if ((buf[i] & 0xf8) === 0xf0) {\n // 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx\n if (\n i + 3 >= len ||\n (buf[i + 1] & 0xc0) !== 0x80 ||\n (buf[i + 2] & 0xc0) !== 0x80 ||\n (buf[i + 3] & 0xc0) !== 0x80 ||\n (buf[i] === 0xf0 && (buf[i + 1] & 0xf0) === 0x80) || // Overlong\n (buf[i] === 0xf4 && buf[i + 1] > 0x8f) ||\n buf[i] > 0xf4 // > U+10FFFF\n ) {\n return false;\n }\n\n i += 4;\n } else {\n return false;\n }\n }\n\n return true;\n}\n\ntry {\n let isValidUTF8 = require('utf-8-validate');\n\n /* istanbul ignore if */\n if (typeof isValidUTF8 === 'object') {\n isValidUTF8 = isValidUTF8.Validation.isValidUTF8; // utf-8-validate@<3.0.0\n }\n\n module.exports = {\n isValidStatusCode,\n isValidUTF8(buf) {\n return buf.length < 150 ? _isValidUTF8(buf) : isValidUTF8(buf);\n }\n };\n} catch (e) /* istanbul ignore next */ {\n module.exports = {\n isValidStatusCode,\n isValidUTF8: _isValidUTF8\n };\n}\n","'use strict';\n\nconst { Writable } = require('stream');\n\nconst PerMessageDeflate = require('./permessage-deflate');\nconst {\n BINARY_TYPES,\n EMPTY_BUFFER,\n kStatusCode,\n kWebSocket\n} = require('./constants');\nconst { concat, toArrayBuffer, unmask } = require('./buffer-util');\nconst { isValidStatusCode, isValidUTF8 } = require('./validation');\n\nconst GET_INFO = 0;\nconst GET_PAYLOAD_LENGTH_16 = 1;\nconst GET_PAYLOAD_LENGTH_64 = 2;\nconst GET_MASK = 3;\nconst GET_DATA = 4;\nconst INFLATING = 5;\n\n/**\n * HyBi Receiver implementation.\n *\n * @extends Writable\n */\nclass Receiver extends Writable {\n /**\n * Creates a Receiver instance.\n *\n * @param {String} [binaryType=nodebuffer] The type for binary data\n * @param {Object} [extensions] An object containing the negotiated extensions\n * @param {Boolean} [isServer=false] Specifies whether to operate in client or\n * server mode\n * @param {Number} [maxPayload=0] The maximum allowed message length\n */\n constructor(binaryType, extensions, isServer, maxPayload) {\n super();\n\n this._binaryType = binaryType || BINARY_TYPES[0];\n this[kWebSocket] = undefined;\n this._extensions = extensions || {};\n this._isServer = !!isServer;\n this._maxPayload = maxPayload | 0;\n\n this._bufferedBytes = 0;\n this._buffers = [];\n\n this._compressed = false;\n this._payloadLength = 0;\n this._mask = undefined;\n this._fragmented = 0;\n this._masked = false;\n this._fin = false;\n this._opcode = 0;\n\n this._totalPayloadLength = 0;\n this._messageLength = 0;\n this._fragments = [];\n\n this._state = GET_INFO;\n this._loop = false;\n }\n\n /**\n * Implements `Writable.prototype._write()`.\n *\n * @param {Buffer} chunk The chunk of data to write\n * @param {String} encoding The character encoding of `chunk`\n * @param {Function} cb Callback\n * @private\n */\n _write(chunk, encoding, cb) {\n if (this._opcode === 0x08 && this._state == GET_INFO) return cb();\n\n this._bufferedBytes += chunk.length;\n this._buffers.push(chunk);\n this.startLoop(cb);\n }\n\n /**\n * Consumes `n` bytes from the buffered data.\n *\n * @param {Number} n The number of bytes to consume\n * @return {Buffer} The consumed bytes\n * @private\n */\n consume(n) {\n this._bufferedBytes -= n;\n\n if (n === this._buffers[0].length) return this._buffers.shift();\n\n if (n < this._buffers[0].length) {\n const buf = this._buffers[0];\n this._buffers[0] = buf.slice(n);\n return buf.slice(0, n);\n }\n\n const dst = Buffer.allocUnsafe(n);\n\n do {\n const buf = this._buffers[0];\n const offset = dst.length - n;\n\n if (n >= buf.length) {\n dst.set(this._buffers.shift(), offset);\n } else {\n dst.set(new Uint8Array(buf.buffer, buf.byteOffset, n), offset);\n this._buffers[0] = buf.slice(n);\n }\n\n n -= buf.length;\n } while (n > 0);\n\n return dst;\n }\n\n /**\n * Starts the parsing loop.\n *\n * @param {Function} cb Callback\n * @private\n */\n startLoop(cb) {\n let err;\n this._loop = true;\n\n do {\n switch (this._state) {\n case GET_INFO:\n err = this.getInfo();\n break;\n case GET_PAYLOAD_LENGTH_16:\n err = this.getPayloadLength16();\n break;\n case GET_PAYLOAD_LENGTH_64:\n err = this.getPayloadLength64();\n break;\n case GET_MASK:\n this.getMask();\n break;\n case GET_DATA:\n err = this.getData(cb);\n break;\n default:\n // `INFLATING`\n this._loop = false;\n return;\n }\n } while (this._loop);\n\n cb(err);\n }\n\n /**\n * Reads the first two bytes of a frame.\n *\n * @return {(RangeError|undefined)} A possible error\n * @private\n */\n getInfo() {\n if (this._bufferedBytes < 2) {\n this._loop = false;\n return;\n }\n\n const buf = this.consume(2);\n\n if ((buf[0] & 0x30) !== 0x00) {\n this._loop = false;\n return error(\n RangeError,\n 'RSV2 and RSV3 must be clear',\n true,\n 1002,\n 'WS_ERR_UNEXPECTED_RSV_2_3'\n );\n }\n\n const compressed = (buf[0] & 0x40) === 0x40;\n\n if (compressed && !this._extensions[PerMessageDeflate.extensionName]) {\n this._loop = false;\n return error(\n RangeError,\n 'RSV1 must be clear',\n true,\n 1002,\n 'WS_ERR_UNEXPECTED_RSV_1'\n );\n }\n\n this._fin = (buf[0] & 0x80) === 0x80;\n this._opcode = buf[0] & 0x0f;\n this._payloadLength = buf[1] & 0x7f;\n\n if (this._opcode === 0x00) {\n if (compressed) {\n this._loop = false;\n return error(\n RangeError,\n 'RSV1 must be clear',\n true,\n 1002,\n 'WS_ERR_UNEXPECTED_RSV_1'\n );\n }\n\n if (!this._fragmented) {\n this._loop = false;\n return error(\n RangeError,\n 'invalid opcode 0',\n true,\n 1002,\n 'WS_ERR_INVALID_OPCODE'\n );\n }\n\n this._opcode = this._fragmented;\n } else if (this._opcode === 0x01 || this._opcode === 0x02) {\n if (this._fragmented) {\n this._loop = false;\n return error(\n RangeError,\n `invalid opcode ${this._opcode}`,\n true,\n 1002,\n 'WS_ERR_INVALID_OPCODE'\n );\n }\n\n this._compressed = compressed;\n } else if (this._opcode > 0x07 && this._opcode < 0x0b) {\n if (!this._fin) {\n this._loop = false;\n return error(\n RangeError,\n 'FIN must be set',\n true,\n 1002,\n 'WS_ERR_EXPECTED_FIN'\n );\n }\n\n if (compressed) {\n this._loop = false;\n return error(\n RangeError,\n 'RSV1 must be clear',\n true,\n 1002,\n 'WS_ERR_UNEXPECTED_RSV_1'\n );\n }\n\n if (this._payloadLength > 0x7d) {\n this._loop = false;\n return error(\n RangeError,\n `invalid payload length ${this._payloadLength}`,\n true,\n 1002,\n 'WS_ERR_INVALID_CONTROL_PAYLOAD_LENGTH'\n );\n }\n } else {\n this._loop = false;\n return error(\n RangeError,\n `invalid opcode ${this._opcode}`,\n true,\n 1002,\n 'WS_ERR_INVALID_OPCODE'\n );\n }\n\n if (!this._fin && !this._fragmented) this._fragmented = this._opcode;\n this._masked = (buf[1] & 0x80) === 0x80;\n\n if (this._isServer) {\n if (!this._masked) {\n this._loop = false;\n return error(\n RangeError,\n 'MASK must be set',\n true,\n 1002,\n 'WS_ERR_EXPECTED_MASK'\n );\n }\n } else if (this._masked) {\n this._loop = false;\n return error(\n RangeError,\n 'MASK must be clear',\n true,\n 1002,\n 'WS_ERR_UNEXPECTED_MASK'\n );\n }\n\n if (this._payloadLength === 126) this._state = GET_PAYLOAD_LENGTH_16;\n else if (this._payloadLength === 127) this._state = GET_PAYLOAD_LENGTH_64;\n else return this.haveLength();\n }\n\n /**\n * Gets extended payload length (7+16).\n *\n * @return {(RangeError|undefined)} A possible error\n * @private\n */\n getPayloadLength16() {\n if (this._bufferedBytes < 2) {\n this._loop = false;\n return;\n }\n\n this._payloadLength = this.consume(2).readUInt16BE(0);\n return this.haveLength();\n }\n\n /**\n * Gets extended payload length (7+64).\n *\n * @return {(RangeError|undefined)} A possible error\n * @private\n */\n getPayloadLength64() {\n if (this._bufferedBytes < 8) {\n this._loop = false;\n return;\n }\n\n const buf = this.consume(8);\n const num = buf.readUInt32BE(0);\n\n //\n // The maximum safe integer in JavaScript is 2^53 - 1. An error is returned\n // if payload length is greater than this number.\n //\n if (num > Math.pow(2, 53 - 32) - 1) {\n this._loop = false;\n return error(\n RangeError,\n 'Unsupported WebSocket frame: payload length > 2^53 - 1',\n false,\n 1009,\n 'WS_ERR_UNSUPPORTED_DATA_PAYLOAD_LENGTH'\n );\n }\n\n this._payloadLength = num * Math.pow(2, 32) + buf.readUInt32BE(4);\n return this.haveLength();\n }\n\n /**\n * Payload length has been read.\n *\n * @return {(RangeError|undefined)} A possible error\n * @private\n */\n haveLength() {\n if (this._payloadLength && this._opcode < 0x08) {\n this._totalPayloadLength += this._payloadLength;\n if (this._totalPayloadLength > this._maxPayload && this._maxPayload > 0) {\n this._loop = false;\n return error(\n RangeError,\n 'Max payload size exceeded',\n false,\n 1009,\n 'WS_ERR_UNSUPPORTED_MESSAGE_LENGTH'\n );\n }\n }\n\n if (this._masked) this._state = GET_MASK;\n else this._state = GET_DATA;\n }\n\n /**\n * Reads mask bytes.\n *\n * @private\n */\n getMask() {\n if (this._bufferedBytes < 4) {\n this._loop = false;\n return;\n }\n\n this._mask = this.consume(4);\n this._state = GET_DATA;\n }\n\n /**\n * Reads data bytes.\n *\n * @param {Function} cb Callback\n * @return {(Error|RangeError|undefined)} A possible error\n * @private\n */\n getData(cb) {\n let data = EMPTY_BUFFER;\n\n if (this._payloadLength) {\n if (this._bufferedBytes < this._payloadLength) {\n this._loop = false;\n return;\n }\n\n data = this.consume(this._payloadLength);\n if (this._masked) unmask(data, this._mask);\n }\n\n if (this._opcode > 0x07) return this.controlMessage(data);\n\n if (this._compressed) {\n this._state = INFLATING;\n this.decompress(data, cb);\n return;\n }\n\n if (data.length) {\n //\n // This message is not compressed so its lenght is the sum of the payload\n // length of all fragments.\n //\n this._messageLength = this._totalPayloadLength;\n this._fragments.push(data);\n }\n\n return this.dataMessage();\n }\n\n /**\n * Decompresses data.\n *\n * @param {Buffer} data Compressed data\n * @param {Function} cb Callback\n * @private\n */\n decompress(data, cb) {\n const perMessageDeflate = this._extensions[PerMessageDeflate.extensionName];\n\n perMessageDeflate.decompress(data, this._fin, (err, buf) => {\n if (err) return cb(err);\n\n if (buf.length) {\n this._messageLength += buf.length;\n if (this._messageLength > this._maxPayload && this._maxPayload > 0) {\n return cb(\n error(\n RangeError,\n 'Max payload size exceeded',\n false,\n 1009,\n 'WS_ERR_UNSUPPORTED_MESSAGE_LENGTH'\n )\n );\n }\n\n this._fragments.push(buf);\n }\n\n const er = this.dataMessage();\n if (er) return cb(er);\n\n this.startLoop(cb);\n });\n }\n\n /**\n * Handles a data message.\n *\n * @return {(Error|undefined)} A possible error\n * @private\n */\n dataMessage() {\n if (this._fin) {\n const messageLength = this._messageLength;\n const fragments = this._fragments;\n\n this._totalPayloadLength = 0;\n this._messageLength = 0;\n this._fragmented = 0;\n this._fragments = [];\n\n if (this._opcode === 2) {\n let data;\n\n if (this._binaryType === 'nodebuffer') {\n data = concat(fragments, messageLength);\n } else if (this._binaryType === 'arraybuffer') {\n data = toArrayBuffer(concat(fragments, messageLength));\n } else {\n data = fragments;\n }\n\n this.emit('message', data);\n } else {\n const buf = concat(fragments, messageLength);\n\n if (!isValidUTF8(buf)) {\n this._loop = false;\n return error(\n Error,\n 'invalid UTF-8 sequence',\n true,\n 1007,\n 'WS_ERR_INVALID_UTF8'\n );\n }\n\n this.emit('message', buf.toString());\n }\n }\n\n this._state = GET_INFO;\n }\n\n /**\n * Handles a control message.\n *\n * @param {Buffer} data Data to handle\n * @return {(Error|RangeError|undefined)} A possible error\n * @private\n */\n controlMessage(data) {\n if (this._opcode === 0x08) {\n this._loop = false;\n\n if (data.length === 0) {\n this.emit('conclude', 1005, '');\n this.end();\n } else if (data.length === 1) {\n return error(\n RangeError,\n 'invalid payload length 1',\n true,\n 1002,\n 'WS_ERR_INVALID_CONTROL_PAYLOAD_LENGTH'\n );\n } else {\n const code = data.readUInt16BE(0);\n\n if (!isValidStatusCode(code)) {\n return error(\n RangeError,\n `invalid status code ${code}`,\n true,\n 1002,\n 'WS_ERR_INVALID_CLOSE_CODE'\n );\n }\n\n const buf = data.slice(2);\n\n if (!isValidUTF8(buf)) {\n return error(\n Error,\n 'invalid UTF-8 sequence',\n true,\n 1007,\n 'WS_ERR_INVALID_UTF8'\n );\n }\n\n this.emit('conclude', code, buf.toString());\n this.end();\n }\n } else if (this._opcode === 0x09) {\n this.emit('ping', data);\n } else {\n this.emit('pong', data);\n }\n\n this._state = GET_INFO;\n }\n}\n\nmodule.exports = Receiver;\n\n/**\n * Builds an error object.\n *\n * @param {function(new:Error|RangeError)} ErrorCtor The error constructor\n * @param {String} message The error message\n * @param {Boolean} prefix Specifies whether or not to add a default prefix to\n * `message`\n * @param {Number} statusCode The status code\n * @param {String} errorCode The exposed error code\n * @return {(Error|RangeError)} The error\n * @private\n */\nfunction error(ErrorCtor, message, prefix, statusCode, errorCode) {\n const err = new ErrorCtor(\n prefix ? `Invalid WebSocket frame: ${message}` : message\n );\n\n Error.captureStackTrace(err, error);\n err.code = errorCode;\n err[kStatusCode] = statusCode;\n return err;\n}\n","/* eslint no-unused-vars: [\"error\", { \"varsIgnorePattern\": \"^net|tls$\" }] */\n\n'use strict';\n\nconst net = require('net');\nconst tls = require('tls');\nconst { randomFillSync } = require('crypto');\n\nconst PerMessageDeflate = require('./permessage-deflate');\nconst { EMPTY_BUFFER } = require('./constants');\nconst { isValidStatusCode } = require('./validation');\nconst { mask: applyMask, toBuffer } = require('./buffer-util');\n\nconst mask = Buffer.alloc(4);\n\n/**\n * HyBi Sender implementation.\n */\nclass Sender {\n /**\n * Creates a Sender instance.\n *\n * @param {(net.Socket|tls.Socket)} socket The connection socket\n * @param {Object} [extensions] An object containing the negotiated extensions\n */\n constructor(socket, extensions) {\n this._extensions = extensions || {};\n this._socket = socket;\n\n this._firstFragment = true;\n this._compress = false;\n\n this._bufferedBytes = 0;\n this._deflating = false;\n this._queue = [];\n }\n\n /**\n * Frames a piece of data according to the HyBi WebSocket protocol.\n *\n * @param {Buffer} data The data to frame\n * @param {Object} options Options object\n * @param {Number} options.opcode The opcode\n * @param {Boolean} [options.readOnly=false] Specifies whether `data` can be\n * modified\n * @param {Boolean} [options.fin=false] Specifies whether or not to set the\n * FIN bit\n * @param {Boolean} [options.mask=false] Specifies whether or not to mask\n * `data`\n * @param {Boolean} [options.rsv1=false] Specifies whether or not to set the\n * RSV1 bit\n * @return {Buffer[]} The framed data as a list of `Buffer` instances\n * @public\n */\n static frame(data, options) {\n const merge = options.mask && options.readOnly;\n let offset = options.mask ? 6 : 2;\n let payloadLength = data.length;\n\n if (data.length >= 65536) {\n offset += 8;\n payloadLength = 127;\n } else if (data.length > 125) {\n offset += 2;\n payloadLength = 126;\n }\n\n const target = Buffer.allocUnsafe(merge ? data.length + offset : offset);\n\n target[0] = options.fin ? options.opcode | 0x80 : options.opcode;\n if (options.rsv1) target[0] |= 0x40;\n\n target[1] = payloadLength;\n\n if (payloadLength === 126) {\n target.writeUInt16BE(data.length, 2);\n } else if (payloadLength === 127) {\n target.writeUInt32BE(0, 2);\n target.writeUInt32BE(data.length, 6);\n }\n\n if (!options.mask) return [target, data];\n\n randomFillSync(mask, 0, 4);\n\n target[1] |= 0x80;\n target[offset - 4] = mask[0];\n target[offset - 3] = mask[1];\n target[offset - 2] = mask[2];\n target[offset - 1] = mask[3];\n\n if (merge) {\n applyMask(data, mask, target, offset, data.length);\n return [target];\n }\n\n applyMask(data, mask, data, 0, data.length);\n return [target, data];\n }\n\n /**\n * Sends a close message to the other peer.\n *\n * @param {Number} [code] The status code component of the body\n * @param {String} [data] The message component of the body\n * @param {Boolean} [mask=false] Specifies whether or not to mask the message\n * @param {Function} [cb] Callback\n * @public\n */\n close(code, data, mask, cb) {\n let buf;\n\n if (code === undefined) {\n buf = EMPTY_BUFFER;\n } else if (typeof code !== 'number' || !isValidStatusCode(code)) {\n throw new TypeError('First argument must be a valid error code number');\n } else if (data === undefined || data === '') {\n buf = Buffer.allocUnsafe(2);\n buf.writeUInt16BE(code, 0);\n } else {\n const length = Buffer.byteLength(data);\n\n if (length > 123) {\n throw new RangeError('The message must not be greater than 123 bytes');\n }\n\n buf = Buffer.allocUnsafe(2 + length);\n buf.writeUInt16BE(code, 0);\n buf.write(data, 2);\n }\n\n if (this._deflating) {\n this.enqueue([this.doClose, buf, mask, cb]);\n } else {\n this.doClose(buf, mask, cb);\n }\n }\n\n /**\n * Frames and sends a close message.\n *\n * @param {Buffer} data The message to send\n * @param {Boolean} [mask=false] Specifies whether or not to mask `data`\n * @param {Function} [cb] Callback\n * @private\n */\n doClose(data, mask, cb) {\n this.sendFrame(\n Sender.frame(data, {\n fin: true,\n rsv1: false,\n opcode: 0x08,\n mask,\n readOnly: false\n }),\n cb\n );\n }\n\n /**\n * Sends a ping message to the other peer.\n *\n * @param {*} data The message to send\n * @param {Boolean} [mask=false] Specifies whether or not to mask `data`\n * @param {Function} [cb] Callback\n * @public\n */\n ping(data, mask, cb) {\n const buf = toBuffer(data);\n\n if (buf.length > 125) {\n throw new RangeError('The data size must not be greater than 125 bytes');\n }\n\n if (this._deflating) {\n this.enqueue([this.doPing, buf, mask, toBuffer.readOnly, cb]);\n } else {\n this.doPing(buf, mask, toBuffer.readOnly, cb);\n }\n }\n\n /**\n * Frames and sends a ping message.\n *\n * @param {Buffer} data The message to send\n * @param {Boolean} [mask=false] Specifies whether or not to mask `data`\n * @param {Boolean} [readOnly=false] Specifies whether `data` can be modified\n * @param {Function} [cb] Callback\n * @private\n */\n doPing(data, mask, readOnly, cb) {\n this.sendFrame(\n Sender.frame(data, {\n fin: true,\n rsv1: false,\n opcode: 0x09,\n mask,\n readOnly\n }),\n cb\n );\n }\n\n /**\n * Sends a pong message to the other peer.\n *\n * @param {*} data The message to send\n * @param {Boolean} [mask=false] Specifies whether or not to mask `data`\n * @param {Function} [cb] Callback\n * @public\n */\n pong(data, mask, cb) {\n const buf = toBuffer(data);\n\n if (buf.length > 125) {\n throw new RangeError('The data size must not be greater than 125 bytes');\n }\n\n if (this._deflating) {\n this.enqueue([this.doPong, buf, mask, toBuffer.readOnly, cb]);\n } else {\n this.doPong(buf, mask, toBuffer.readOnly, cb);\n }\n }\n\n /**\n * Frames and sends a pong message.\n *\n * @param {Buffer} data The message to send\n * @param {Boolean} [mask=false] Specifies whether or not to mask `data`\n * @param {Boolean} [readOnly=false] Specifies whether `data` can be modified\n * @param {Function} [cb] Callback\n * @private\n */\n doPong(data, mask, readOnly, cb) {\n this.sendFrame(\n Sender.frame(data, {\n fin: true,\n rsv1: false,\n opcode: 0x0a,\n mask,\n readOnly\n }),\n cb\n );\n }\n\n /**\n * Sends a data message to the other peer.\n *\n * @param {*} data The message to send\n * @param {Object} options Options object\n * @param {Boolean} [options.compress=false] Specifies whether or not to\n * compress `data`\n * @param {Boolean} [options.binary=false] Specifies whether `data` is binary\n * or text\n * @param {Boolean} [options.fin=false] Specifies whether the fragment is the\n * last one\n * @param {Boolean} [options.mask=false] Specifies whether or not to mask\n * `data`\n * @param {Function} [cb] Callback\n * @public\n */\n send(data, options, cb) {\n const buf = toBuffer(data);\n const perMessageDeflate = this._extensions[PerMessageDeflate.extensionName];\n let opcode = options.binary ? 2 : 1;\n let rsv1 = options.compress;\n\n if (this._firstFragment) {\n this._firstFragment = false;\n if (rsv1 && perMessageDeflate) {\n rsv1 = buf.length >= perMessageDeflate._threshold;\n }\n this._compress = rsv1;\n } else {\n rsv1 = false;\n opcode = 0;\n }\n\n if (options.fin) this._firstFragment = true;\n\n if (perMessageDeflate) {\n const opts = {\n fin: options.fin,\n rsv1,\n opcode,\n mask: options.mask,\n readOnly: toBuffer.readOnly\n };\n\n if (this._deflating) {\n this.enqueue([this.dispatch, buf, this._compress, opts, cb]);\n } else {\n this.dispatch(buf, this._compress, opts, cb);\n }\n } else {\n this.sendFrame(\n Sender.frame(buf, {\n fin: options.fin,\n rsv1: false,\n opcode,\n mask: options.mask,\n readOnly: toBuffer.readOnly\n }),\n cb\n );\n }\n }\n\n /**\n * Dispatches a data message.\n *\n * @param {Buffer} data The message to send\n * @param {Boolean} [compress=false] Specifies whether or not to compress\n * `data`\n * @param {Object} options Options object\n * @param {Number} options.opcode The opcode\n * @param {Boolean} [options.readOnly=false] Specifies whether `data` can be\n * modified\n * @param {Boolean} [options.fin=false] Specifies whether or not to set the\n * FIN bit\n * @param {Boolean} [options.mask=false] Specifies whether or not to mask\n * `data`\n * @param {Boolean} [options.rsv1=false] Specifies whether or not to set the\n * RSV1 bit\n * @param {Function} [cb] Callback\n * @private\n */\n dispatch(data, compress, options, cb) {\n if (!compress) {\n this.sendFrame(Sender.frame(data, options), cb);\n return;\n }\n\n const perMessageDeflate = this._extensions[PerMessageDeflate.extensionName];\n\n this._bufferedBytes += data.length;\n this._deflating = true;\n perMessageDeflate.compress(data, options.fin, (_, buf) => {\n if (this._socket.destroyed) {\n const err = new Error(\n 'The socket was closed while data was being compressed'\n );\n\n if (typeof cb === 'function') cb(err);\n\n for (let i = 0; i < this._queue.length; i++) {\n const callback = this._queue[i][4];\n\n if (typeof callback === 'function') callback(err);\n }\n\n return;\n }\n\n this._bufferedBytes -= data.length;\n this._deflating = false;\n options.readOnly = false;\n this.sendFrame(Sender.frame(buf, options), cb);\n this.dequeue();\n });\n }\n\n /**\n * Executes queued send operations.\n *\n * @private\n */\n dequeue() {\n while (!this._deflating && this._queue.length) {\n const params = this._queue.shift();\n\n this._bufferedBytes -= params[1].length;\n Reflect.apply(params[0], this, params.slice(1));\n }\n }\n\n /**\n * Enqueues a send operation.\n *\n * @param {Array} params Send operation parameters.\n * @private\n */\n enqueue(params) {\n this._bufferedBytes += params[1].length;\n this._queue.push(params);\n }\n\n /**\n * Sends a frame.\n *\n * @param {Buffer[]} list The frame to send\n * @param {Function} [cb] Callback\n * @private\n */\n sendFrame(list, cb) {\n if (list.length === 2) {\n this._socket.cork();\n this._socket.write(list[0]);\n this._socket.write(list[1], cb);\n this._socket.uncork();\n } else {\n this._socket.write(list[0], cb);\n }\n }\n}\n\nmodule.exports = Sender;\n","'use strict';\n\n/**\n * Class representing an event.\n *\n * @private\n */\nclass Event {\n /**\n * Create a new `Event`.\n *\n * @param {String} type The name of the event\n * @param {Object} target A reference to the target to which the event was\n * dispatched\n */\n constructor(type, target) {\n this.target = target;\n this.type = type;\n }\n}\n\n/**\n * Class representing a message event.\n *\n * @extends Event\n * @private\n */\nclass MessageEvent extends Event {\n /**\n * Create a new `MessageEvent`.\n *\n * @param {(String|Buffer|ArrayBuffer|Buffer[])} data The received data\n * @param {WebSocket} target A reference to the target to which the event was\n * dispatched\n */\n constructor(data, target) {\n super('message', target);\n\n this.data = data;\n }\n}\n\n/**\n * Class representing a close event.\n *\n * @extends Event\n * @private\n */\nclass CloseEvent extends Event {\n /**\n * Create a new `CloseEvent`.\n *\n * @param {Number} code The status code explaining why the connection is being\n * closed\n * @param {String} reason A human-readable string explaining why the\n * connection is closing\n * @param {WebSocket} target A reference to the target to which the event was\n * dispatched\n */\n constructor(code, reason, target) {\n super('close', target);\n\n this.wasClean = target._closeFrameReceived && target._closeFrameSent;\n this.reason = reason;\n this.code = code;\n }\n}\n\n/**\n * Class representing an open event.\n *\n * @extends Event\n * @private\n */\nclass OpenEvent extends Event {\n /**\n * Create a new `OpenEvent`.\n *\n * @param {WebSocket} target A reference to the target to which the event was\n * dispatched\n */\n constructor(target) {\n super('open', target);\n }\n}\n\n/**\n * Class representing an error event.\n *\n * @extends Event\n * @private\n */\nclass ErrorEvent extends Event {\n /**\n * Create a new `ErrorEvent`.\n *\n * @param {Object} error The error that generated this event\n * @param {WebSocket} target A reference to the target to which the event was\n * dispatched\n */\n constructor(error, target) {\n super('error', target);\n\n this.message = error.message;\n this.error = error;\n }\n}\n\n/**\n * This provides methods for emulating the `EventTarget` interface. It's not\n * meant to be used directly.\n *\n * @mixin\n */\nconst EventTarget = {\n /**\n * Register an event listener.\n *\n * @param {String} type A string representing the event type to listen for\n * @param {Function} listener The listener to add\n * @param {Object} [options] An options object specifies characteristics about\n * the event listener\n * @param {Boolean} [options.once=false] A `Boolean`` indicating that the\n * listener should be invoked at most once after being added. If `true`,\n * the listener would be automatically removed when invoked.\n * @public\n */\n addEventListener(type, listener, options) {\n if (typeof listener !== 'function') return;\n\n function onMessage(data) {\n listener.call(this, new MessageEvent(data, this));\n }\n\n function onClose(code, message) {\n listener.call(this, new CloseEvent(code, message, this));\n }\n\n function onError(error) {\n listener.call(this, new ErrorEvent(error, this));\n }\n\n function onOpen() {\n listener.call(this, new OpenEvent(this));\n }\n\n const method = options && options.once ? 'once' : 'on';\n\n if (type === 'message') {\n onMessage._listener = listener;\n this[method](type, onMessage);\n } else if (type === 'close') {\n onClose._listener = listener;\n this[method](type, onClose);\n } else if (type === 'error') {\n onError._listener = listener;\n this[method](type, onError);\n } else if (type === 'open') {\n onOpen._listener = listener;\n this[method](type, onOpen);\n } else {\n this[method](type, listener);\n }\n },\n\n /**\n * Remove an event listener.\n *\n * @param {String} type A string representing the event type to remove\n * @param {Function} listener The listener to remove\n * @public\n */\n removeEventListener(type, listener) {\n const listeners = this.listeners(type);\n\n for (let i = 0; i < listeners.length; i++) {\n if (listeners[i] === listener || listeners[i]._listener === listener) {\n this.removeListener(type, listeners[i]);\n }\n }\n }\n};\n\nmodule.exports = EventTarget;\n","'use strict';\n\n//\n// Allowed token characters:\n//\n// '!', '#', '$', '%', '&', ''', '*', '+', '-',\n// '.', 0-9, A-Z, '^', '_', '`', a-z, '|', '~'\n//\n// tokenChars[32] === 0 // ' '\n// tokenChars[33] === 1 // '!'\n// tokenChars[34] === 0 // '\"'\n// ...\n//\n// prettier-ignore\nconst tokenChars = [\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0 - 15\n 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 16 - 31\n 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, // 32 - 47\n 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, // 48 - 63\n 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 64 - 79\n 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, // 80 - 95\n 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 96 - 111\n 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0 // 112 - 127\n];\n\n/**\n * Adds an offer to the map of extension offers or a parameter to the map of\n * parameters.\n *\n * @param {Object} dest The map of extension offers or parameters\n * @param {String} name The extension or parameter name\n * @param {(Object|Boolean|String)} elem The extension parameters or the\n * parameter value\n * @private\n */\nfunction push(dest, name, elem) {\n if (dest[name] === undefined) dest[name] = [elem];\n else dest[name].push(elem);\n}\n\n/**\n * Parses the `Sec-WebSocket-Extensions` header into an object.\n *\n * @param {String} header The field value of the header\n * @return {Object} The parsed object\n * @public\n */\nfunction parse(header) {\n const offers = Object.create(null);\n\n if (header === undefined || header === '') return offers;\n\n let params = Object.create(null);\n let mustUnescape = false;\n let isEscaping = false;\n let inQuotes = false;\n let extensionName;\n let paramName;\n let start = -1;\n let end = -1;\n let i = 0;\n\n for (; i < header.length; i++) {\n const code = header.charCodeAt(i);\n\n if (extensionName === undefined) {\n if (end === -1 && tokenChars[code] === 1) {\n if (start === -1) start = i;\n } else if (code === 0x20 /* ' ' */ || code === 0x09 /* '\\t' */) {\n if (end === -1 && start !== -1) end = i;\n } else if (code === 0x3b /* ';' */ || code === 0x2c /* ',' */) {\n if (start === -1) {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n\n if (end === -1) end = i;\n const name = header.slice(start, end);\n if (code === 0x2c) {\n push(offers, name, params);\n params = Object.create(null);\n } else {\n extensionName = name;\n }\n\n start = end = -1;\n } else {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n } else if (paramName === undefined) {\n if (end === -1 && tokenChars[code] === 1) {\n if (start === -1) start = i;\n } else if (code === 0x20 || code === 0x09) {\n if (end === -1 && start !== -1) end = i;\n } else if (code === 0x3b || code === 0x2c) {\n if (start === -1) {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n\n if (end === -1) end = i;\n push(params, header.slice(start, end), true);\n if (code === 0x2c) {\n push(offers, extensionName, params);\n params = Object.create(null);\n extensionName = undefined;\n }\n\n start = end = -1;\n } else if (code === 0x3d /* '=' */ && start !== -1 && end === -1) {\n paramName = header.slice(start, i);\n start = end = -1;\n } else {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n } else {\n //\n // The value of a quoted-string after unescaping must conform to the\n // token ABNF, so only token characters are valid.\n // Ref: https://tools.ietf.org/html/rfc6455#section-9.1\n //\n if (isEscaping) {\n if (tokenChars[code] !== 1) {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n if (start === -1) start = i;\n else if (!mustUnescape) mustUnescape = true;\n isEscaping = false;\n } else if (inQuotes) {\n if (tokenChars[code] === 1) {\n if (start === -1) start = i;\n } else if (code === 0x22 /* '\"' */ && start !== -1) {\n inQuotes = false;\n end = i;\n } else if (code === 0x5c /* '\\' */) {\n isEscaping = true;\n } else {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n } else if (code === 0x22 && header.charCodeAt(i - 1) === 0x3d) {\n inQuotes = true;\n } else if (end === -1 && tokenChars[code] === 1) {\n if (start === -1) start = i;\n } else if (start !== -1 && (code === 0x20 || code === 0x09)) {\n if (end === -1) end = i;\n } else if (code === 0x3b || code === 0x2c) {\n if (start === -1) {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n\n if (end === -1) end = i;\n let value = header.slice(start, end);\n if (mustUnescape) {\n value = value.replace(/\\\\/g, '');\n mustUnescape = false;\n }\n push(params, paramName, value);\n if (code === 0x2c) {\n push(offers, extensionName, params);\n params = Object.create(null);\n extensionName = undefined;\n }\n\n paramName = undefined;\n start = end = -1;\n } else {\n throw new SyntaxError(`Unexpected character at index ${i}`);\n }\n }\n }\n\n if (start === -1 || inQuotes) {\n throw new SyntaxError('Unexpected end of input');\n }\n\n if (end === -1) end = i;\n const token = header.slice(start, end);\n if (extensionName === undefined) {\n push(offers, token, params);\n } else {\n if (paramName === undefined) {\n push(params, token, true);\n } else if (mustUnescape) {\n push(params, paramName, token.replace(/\\\\/g, ''));\n } else {\n push(params, paramName, token);\n }\n push(offers, extensionName, params);\n }\n\n return offers;\n}\n\n/**\n * Builds the `Sec-WebSocket-Extensions` header field value.\n *\n * @param {Object} extensions The map of extensions and parameters to format\n * @return {String} A string representing the given object\n * @public\n */\nfunction format(extensions) {\n return Object.keys(extensions)\n .map((extension) => {\n let configurations = extensions[extension];\n if (!Array.isArray(configurations)) configurations = [configurations];\n return configurations\n .map((params) => {\n return [extension]\n .concat(\n Object.keys(params).map((k) => {\n let values = params[k];\n if (!Array.isArray(values)) values = [values];\n return values\n .map((v) => (v === true ? k : `${k}=${v}`))\n .join('; ');\n })\n )\n .join('; ');\n })\n .join(', ');\n })\n .join(', ');\n}\n\nmodule.exports = { format, parse };\n","/* eslint no-unused-vars: [\"error\", { \"varsIgnorePattern\": \"^Readable$\" }] */\n\n'use strict';\n\nconst EventEmitter = require('events');\nconst https = require('https');\nconst http = require('http');\nconst net = require('net');\nconst tls = require('tls');\nconst { randomBytes, createHash } = require('crypto');\nconst { Readable } = require('stream');\nconst { URL } = require('url');\n\nconst PerMessageDeflate = require('./permessage-deflate');\nconst Receiver = require('./receiver');\nconst Sender = require('./sender');\nconst {\n BINARY_TYPES,\n EMPTY_BUFFER,\n GUID,\n kStatusCode,\n kWebSocket,\n NOOP\n} = require('./constants');\nconst { addEventListener, removeEventListener } = require('./event-target');\nconst { format, parse } = require('./extension');\nconst { toBuffer } = require('./buffer-util');\n\nconst readyStates = ['CONNECTING', 'OPEN', 'CLOSING', 'CLOSED'];\nconst protocolVersions = [8, 13];\nconst closeTimeout = 30 * 1000;\n\n/**\n * Class representing a WebSocket.\n *\n * @extends EventEmitter\n */\nclass WebSocket extends EventEmitter {\n /**\n * Create a new `WebSocket`.\n *\n * @param {(String|URL)} address The URL to which to connect\n * @param {(String|String[])} [protocols] The subprotocols\n * @param {Object} [options] Connection options\n */\n constructor(address, protocols, options) {\n super();\n\n this._binaryType = BINARY_TYPES[0];\n this._closeCode = 1006;\n this._closeFrameReceived = false;\n this._closeFrameSent = false;\n this._closeMessage = '';\n this._closeTimer = null;\n this._extensions = {};\n this._protocol = '';\n this._readyState = WebSocket.CONNECTING;\n this._receiver = null;\n this._sender = null;\n this._socket = null;\n\n if (address !== null) {\n this._bufferedAmount = 0;\n this._isServer = false;\n this._redirects = 0;\n\n if (Array.isArray(protocols)) {\n protocols = protocols.join(', ');\n } else if (typeof protocols === 'object' && protocols !== null) {\n options = protocols;\n protocols = undefined;\n }\n\n initAsClient(this, address, protocols, options);\n } else {\n this._isServer = true;\n }\n }\n\n /**\n * This deviates from the WHATWG interface since ws doesn't support the\n * required default \"blob\" type (instead we define a custom \"nodebuffer\"\n * type).\n *\n * @type {String}\n */\n get binaryType() {\n return this._binaryType;\n }\n\n set binaryType(type) {\n if (!BINARY_TYPES.includes(type)) return;\n\n this._binaryType = type;\n\n //\n // Allow to change `binaryType` on the fly.\n //\n if (this._receiver) this._receiver._binaryType = type;\n }\n\n /**\n * @type {Number}\n */\n get bufferedAmount() {\n if (!this._socket) return this._bufferedAmount;\n\n return this._socket._writableState.length + this._sender._bufferedBytes;\n }\n\n /**\n * @type {String}\n */\n get extensions() {\n return Object.keys(this._extensions).join();\n }\n\n /**\n * @type {Function}\n */\n /* istanbul ignore next */\n get onclose() {\n return undefined;\n }\n\n /* istanbul ignore next */\n set onclose(listener) {}\n\n /**\n * @type {Function}\n */\n /* istanbul ignore next */\n get onerror() {\n return undefined;\n }\n\n /* istanbul ignore next */\n set onerror(listener) {}\n\n /**\n * @type {Function}\n */\n /* istanbul ignore next */\n get onopen() {\n return undefined;\n }\n\n /* istanbul ignore next */\n set onopen(listener) {}\n\n /**\n * @type {Function}\n */\n /* istanbul ignore next */\n get onmessage() {\n return undefined;\n }\n\n /* istanbul ignore next */\n set onmessage(listener) {}\n\n /**\n * @type {String}\n */\n get protocol() {\n return this._protocol;\n }\n\n /**\n * @type {Number}\n */\n get readyState() {\n return this._readyState;\n }\n\n /**\n * @type {String}\n */\n get url() {\n return this._url;\n }\n\n /**\n * Set up the socket and the internal resources.\n *\n * @param {(net.Socket|tls.Socket)} socket The network socket between the\n * server and client\n * @param {Buffer} head The first packet of the upgraded stream\n * @param {Number} [maxPayload=0] The maximum allowed message size\n * @private\n */\n setSocket(socket, head, maxPayload) {\n const receiver = new Receiver(\n this.binaryType,\n this._extensions,\n this._isServer,\n maxPayload\n );\n\n this._sender = new Sender(socket, this._extensions);\n this._receiver = receiver;\n this._socket = socket;\n\n receiver[kWebSocket] = this;\n socket[kWebSocket] = this;\n\n receiver.on('conclude', receiverOnConclude);\n receiver.on('drain', receiverOnDrain);\n receiver.on('error', receiverOnError);\n receiver.on('message', receiverOnMessage);\n receiver.on('ping', receiverOnPing);\n receiver.on('pong', receiverOnPong);\n\n socket.setTimeout(0);\n socket.setNoDelay();\n\n if (head.length > 0) socket.unshift(head);\n\n socket.on('close', socketOnClose);\n socket.on('data', socketOnData);\n socket.on('end', socketOnEnd);\n socket.on('error', socketOnError);\n\n this._readyState = WebSocket.OPEN;\n this.emit('open');\n }\n\n /**\n * Emit the `'close'` event.\n *\n * @private\n */\n emitClose() {\n if (!this._socket) {\n this._readyState = WebSocket.CLOSED;\n this.emit('close', this._closeCode, this._closeMessage);\n return;\n }\n\n if (this._extensions[PerMessageDeflate.extensionName]) {\n this._extensions[PerMessageDeflate.extensionName].cleanup();\n }\n\n this._receiver.removeAllListeners();\n this._readyState = WebSocket.CLOSED;\n this.emit('close', this._closeCode, this._closeMessage);\n }\n\n /**\n * Start a closing handshake.\n *\n * +----------+ +-----------+ +----------+\n * - - -|ws.close()|-->|close frame|-->|ws.close()|- - -\n * | +----------+ +-----------+ +----------+ |\n * +----------+ +-----------+ |\n * CLOSING |ws.close()|<--|close frame|<--+-----+ CLOSING\n * +----------+ +-----------+ |\n * | | | +---+ |\n * +------------------------+-->|fin| - - - -\n * | +---+ | +---+\n * - - - - -|fin|<---------------------+\n * +---+\n *\n * @param {Number} [code] Status code explaining why the connection is closing\n * @param {String} [data] A string explaining why the connection is closing\n * @public\n */\n close(code, data) {\n if (this.readyState === WebSocket.CLOSED) return;\n if (this.readyState === WebSocket.CONNECTING) {\n const msg = 'WebSocket was closed before the connection was established';\n return abortHandshake(this, this._req, msg);\n }\n\n if (this.readyState === WebSocket.CLOSING) {\n if (\n this._closeFrameSent &&\n (this._closeFrameReceived || this._receiver._writableState.errorEmitted)\n ) {\n this._socket.end();\n }\n\n return;\n }\n\n this._readyState = WebSocket.CLOSING;\n this._sender.close(code, data, !this._isServer, (err) => {\n //\n // This error is handled by the `'error'` listener on the socket. We only\n // want to know if the close frame has been sent here.\n //\n if (err) return;\n\n this._closeFrameSent = true;\n\n if (\n this._closeFrameReceived ||\n this._receiver._writableState.errorEmitted\n ) {\n this._socket.end();\n }\n });\n\n //\n // Specify a timeout for the closing handshake to complete.\n //\n this._closeTimer = setTimeout(\n this._socket.destroy.bind(this._socket),\n closeTimeout\n );\n }\n\n /**\n * Send a ping.\n *\n * @param {*} [data] The data to send\n * @param {Boolean} [mask] Indicates whether or not to mask `data`\n * @param {Function} [cb] Callback which is executed when the ping is sent\n * @public\n */\n ping(data, mask, cb) {\n if (this.readyState === WebSocket.CONNECTING) {\n throw new Error('WebSocket is not open: readyState 0 (CONNECTING)');\n }\n\n if (typeof data === 'function') {\n cb = data;\n data = mask = undefined;\n } else if (typeof mask === 'function') {\n cb = mask;\n mask = undefined;\n }\n\n if (typeof data === 'number') data = data.toString();\n\n if (this.readyState !== WebSocket.OPEN) {\n sendAfterClose(this, data, cb);\n return;\n }\n\n if (mask === undefined) mask = !this._isServer;\n this._sender.ping(data || EMPTY_BUFFER, mask, cb);\n }\n\n /**\n * Send a pong.\n *\n * @param {*} [data] The data to send\n * @param {Boolean} [mask] Indicates whether or not to mask `data`\n * @param {Function} [cb] Callback which is executed when the pong is sent\n * @public\n */\n pong(data, mask, cb) {\n if (this.readyState === WebSocket.CONNECTING) {\n throw new Error('WebSocket is not open: readyState 0 (CONNECTING)');\n }\n\n if (typeof data === 'function') {\n cb = data;\n data = mask = undefined;\n } else if (typeof mask === 'function') {\n cb = mask;\n mask = undefined;\n }\n\n if (typeof data === 'number') data = data.toString();\n\n if (this.readyState !== WebSocket.OPEN) {\n sendAfterClose(this, data, cb);\n return;\n }\n\n if (mask === undefined) mask = !this._isServer;\n this._sender.pong(data || EMPTY_BUFFER, mask, cb);\n }\n\n /**\n * Send a data message.\n *\n * @param {*} data The message to send\n * @param {Object} [options] Options object\n * @param {Boolean} [options.compress] Specifies whether or not to compress\n * `data`\n * @param {Boolean} [options.binary] Specifies whether `data` is binary or\n * text\n * @param {Boolean} [options.fin=true] Specifies whether the fragment is the\n * last one\n * @param {Boolean} [options.mask] Specifies whether or not to mask `data`\n * @param {Function} [cb] Callback which is executed when data is written out\n * @public\n */\n send(data, options, cb) {\n if (this.readyState === WebSocket.CONNECTING) {\n throw new Error('WebSocket is not open: readyState 0 (CONNECTING)');\n }\n\n if (typeof options === 'function') {\n cb = options;\n options = {};\n }\n\n if (typeof data === 'number') data = data.toString();\n\n if (this.readyState !== WebSocket.OPEN) {\n sendAfterClose(this, data, cb);\n return;\n }\n\n const opts = {\n binary: typeof data !== 'string',\n mask: !this._isServer,\n compress: true,\n fin: true,\n ...options\n };\n\n if (!this._extensions[PerMessageDeflate.extensionName]) {\n opts.compress = false;\n }\n\n this._sender.send(data || EMPTY_BUFFER, opts, cb);\n }\n\n /**\n * Forcibly close the connection.\n *\n * @public\n */\n terminate() {\n if (this.readyState === WebSocket.CLOSED) return;\n if (this.readyState === WebSocket.CONNECTING) {\n const msg = 'WebSocket was closed before the connection was established';\n return abortHandshake(this, this._req, msg);\n }\n\n if (this._socket) {\n this._readyState = WebSocket.CLOSING;\n this._socket.destroy();\n }\n }\n}\n\n/**\n * @constant {Number} CONNECTING\n * @memberof WebSocket\n */\nObject.defineProperty(WebSocket, 'CONNECTING', {\n enumerable: true,\n value: readyStates.indexOf('CONNECTING')\n});\n\n/**\n * @constant {Number} CONNECTING\n * @memberof WebSocket.prototype\n */\nObject.defineProperty(WebSocket.prototype, 'CONNECTING', {\n enumerable: true,\n value: readyStates.indexOf('CONNECTING')\n});\n\n/**\n * @constant {Number} OPEN\n * @memberof WebSocket\n */\nObject.defineProperty(WebSocket, 'OPEN', {\n enumerable: true,\n value: readyStates.indexOf('OPEN')\n});\n\n/**\n * @constant {Number} OPEN\n * @memberof WebSocket.prototype\n */\nObject.defineProperty(WebSocket.prototype, 'OPEN', {\n enumerable: true,\n value: readyStates.indexOf('OPEN')\n});\n\n/**\n * @constant {Number} CLOSING\n * @memberof WebSocket\n */\nObject.defineProperty(WebSocket, 'CLOSING', {\n enumerable: true,\n value: readyStates.indexOf('CLOSING')\n});\n\n/**\n * @constant {Number} CLOSING\n * @memberof WebSocket.prototype\n */\nObject.defineProperty(WebSocket.prototype, 'CLOSING', {\n enumerable: true,\n value: readyStates.indexOf('CLOSING')\n});\n\n/**\n * @constant {Number} CLOSED\n * @memberof WebSocket\n */\nObject.defineProperty(WebSocket, 'CLOSED', {\n enumerable: true,\n value: readyStates.indexOf('CLOSED')\n});\n\n/**\n * @constant {Number} CLOSED\n * @memberof WebSocket.prototype\n */\nObject.defineProperty(WebSocket.prototype, 'CLOSED', {\n enumerable: true,\n value: readyStates.indexOf('CLOSED')\n});\n\n[\n 'binaryType',\n 'bufferedAmount',\n 'extensions',\n 'protocol',\n 'readyState',\n 'url'\n].forEach((property) => {\n Object.defineProperty(WebSocket.prototype, property, { enumerable: true });\n});\n\n//\n// Add the `onopen`, `onerror`, `onclose`, and `onmessage` attributes.\n// See https://html.spec.whatwg.org/multipage/comms.html#the-websocket-interface\n//\n['open', 'error', 'close', 'message'].forEach((method) => {\n Object.defineProperty(WebSocket.prototype, `on${method}`, {\n enumerable: true,\n get() {\n const listeners = this.listeners(method);\n for (let i = 0; i < listeners.length; i++) {\n if (listeners[i]._listener) return listeners[i]._listener;\n }\n\n return undefined;\n },\n set(listener) {\n const listeners = this.listeners(method);\n for (let i = 0; i < listeners.length; i++) {\n //\n // Remove only the listeners added via `addEventListener`.\n //\n if (listeners[i]._listener) this.removeListener(method, listeners[i]);\n }\n this.addEventListener(method, listener);\n }\n });\n});\n\nWebSocket.prototype.addEventListener = addEventListener;\nWebSocket.prototype.removeEventListener = removeEventListener;\n\nmodule.exports = WebSocket;\n\n/**\n * Initialize a WebSocket client.\n *\n * @param {WebSocket} websocket The client to initialize\n * @param {(String|URL)} address The URL to which to connect\n * @param {String} [protocols] The subprotocols\n * @param {Object} [options] Connection options\n * @param {(Boolean|Object)} [options.perMessageDeflate=true] Enable/disable\n * permessage-deflate\n * @param {Number} [options.handshakeTimeout] Timeout in milliseconds for the\n * handshake request\n * @param {Number} [options.protocolVersion=13] Value of the\n * `Sec-WebSocket-Version` header\n * @param {String} [options.origin] Value of the `Origin` or\n * `Sec-WebSocket-Origin` header\n * @param {Number} [options.maxPayload=104857600] The maximum allowed message\n * size\n * @param {Boolean} [options.followRedirects=false] Whether or not to follow\n * redirects\n * @param {Number} [options.maxRedirects=10] The maximum number of redirects\n * allowed\n * @private\n */\nfunction initAsClient(websocket, address, protocols, options) {\n const opts = {\n protocolVersion: protocolVersions[1],\n maxPayload: 100 * 1024 * 1024,\n perMessageDeflate: true,\n followRedirects: false,\n maxRedirects: 10,\n ...options,\n createConnection: undefined,\n socketPath: undefined,\n hostname: undefined,\n protocol: undefined,\n timeout: undefined,\n method: undefined,\n host: undefined,\n path: undefined,\n port: undefined\n };\n\n if (!protocolVersions.includes(opts.protocolVersion)) {\n throw new RangeError(\n `Unsupported protocol version: ${opts.protocolVersion} ` +\n `(supported versions: ${protocolVersions.join(', ')})`\n );\n }\n\n let parsedUrl;\n\n if (address instanceof URL) {\n parsedUrl = address;\n websocket._url = address.href;\n } else {\n parsedUrl = new URL(address);\n websocket._url = address;\n }\n\n const isUnixSocket = parsedUrl.protocol === 'ws+unix:';\n\n if (!parsedUrl.host && (!isUnixSocket || !parsedUrl.pathname)) {\n const err = new Error(`Invalid URL: ${websocket.url}`);\n\n if (websocket._redirects === 0) {\n throw err;\n } else {\n emitErrorAndClose(websocket, err);\n return;\n }\n }\n\n const isSecure =\n parsedUrl.protocol === 'wss:' || parsedUrl.protocol === 'https:';\n const defaultPort = isSecure ? 443 : 80;\n const key = randomBytes(16).toString('base64');\n const get = isSecure ? https.get : http.get;\n let perMessageDeflate;\n\n opts.createConnection = isSecure ? tlsConnect : netConnect;\n opts.defaultPort = opts.defaultPort || defaultPort;\n opts.port = parsedUrl.port || defaultPort;\n opts.host = parsedUrl.hostname.startsWith('[')\n ? parsedUrl.hostname.slice(1, -1)\n : parsedUrl.hostname;\n opts.headers = {\n 'Sec-WebSocket-Version': opts.protocolVersion,\n 'Sec-WebSocket-Key': key,\n Connection: 'Upgrade',\n Upgrade: 'websocket',\n ...opts.headers\n };\n opts.path = parsedUrl.pathname + parsedUrl.search;\n opts.timeout = opts.handshakeTimeout;\n\n if (opts.perMessageDeflate) {\n perMessageDeflate = new PerMessageDeflate(\n opts.perMessageDeflate !== true ? opts.perMessageDeflate : {},\n false,\n opts.maxPayload\n );\n opts.headers['Sec-WebSocket-Extensions'] = format({\n [PerMessageDeflate.extensionName]: perMessageDeflate.offer()\n });\n }\n if (protocols) {\n opts.headers['Sec-WebSocket-Protocol'] = protocols;\n }\n if (opts.origin) {\n if (opts.protocolVersion < 13) {\n opts.headers['Sec-WebSocket-Origin'] = opts.origin;\n } else {\n opts.headers.Origin = opts.origin;\n }\n }\n if (parsedUrl.username || parsedUrl.password) {\n opts.auth = `${parsedUrl.username}:${parsedUrl.password}`;\n }\n\n if (isUnixSocket) {\n const parts = opts.path.split(':');\n\n opts.socketPath = parts[0];\n opts.path = parts[1];\n }\n\n if (opts.followRedirects) {\n if (websocket._redirects === 0) {\n websocket._originalUnixSocket = isUnixSocket;\n websocket._originalSecure = isSecure;\n websocket._originalHostOrSocketPath = isUnixSocket\n ? opts.socketPath\n : parsedUrl.host;\n\n const headers = options && options.headers;\n\n //\n // Shallow copy the user provided options so that headers can be changed\n // without mutating the original object.\n //\n options = { ...options, headers: {} };\n\n if (headers) {\n for (const [key, value] of Object.entries(headers)) {\n options.headers[key.toLowerCase()] = value;\n }\n }\n } else {\n const isSameHost = isUnixSocket\n ? websocket._originalUnixSocket\n ? opts.socketPath === websocket._originalHostOrSocketPath\n : false\n : websocket._originalUnixSocket\n ? false\n : parsedUrl.host === websocket._originalHostOrSocketPath;\n\n if (!isSameHost || (websocket._originalSecure && !isSecure)) {\n //\n // Match curl 7.77.0 behavior and drop the following headers. These\n // headers are also dropped when following a redirect to a subdomain.\n //\n delete opts.headers.authorization;\n delete opts.headers.cookie;\n\n if (!isSameHost) delete opts.headers.host;\n\n opts.auth = undefined;\n }\n }\n\n //\n // Match curl 7.77.0 behavior and make the first `Authorization` header win.\n // If the `Authorization` header is set, then there is nothing to do as it\n // will take precedence.\n //\n if (opts.auth && !options.headers.authorization) {\n options.headers.authorization =\n 'Basic ' + Buffer.from(opts.auth).toString('base64');\n }\n }\n\n let req = (websocket._req = get(opts));\n\n if (opts.timeout) {\n req.on('timeout', () => {\n abortHandshake(websocket, req, 'Opening handshake has timed out');\n });\n }\n\n req.on('error', (err) => {\n if (req === null || req.aborted) return;\n\n req = websocket._req = null;\n emitErrorAndClose(websocket, err);\n });\n\n req.on('response', (res) => {\n const location = res.headers.location;\n const statusCode = res.statusCode;\n\n if (\n location &&\n opts.followRedirects &&\n statusCode >= 300 &&\n statusCode < 400\n ) {\n if (++websocket._redirects > opts.maxRedirects) {\n abortHandshake(websocket, req, 'Maximum redirects exceeded');\n return;\n }\n\n req.abort();\n\n let addr;\n\n try {\n addr = new URL(location, address);\n } catch (err) {\n emitErrorAndClose(websocket, err);\n return;\n }\n\n initAsClient(websocket, addr, protocols, options);\n } else if (!websocket.emit('unexpected-response', req, res)) {\n abortHandshake(\n websocket,\n req,\n `Unexpected server response: ${res.statusCode}`\n );\n }\n });\n\n req.on('upgrade', (res, socket, head) => {\n websocket.emit('upgrade', res);\n\n //\n // The user may have closed the connection from a listener of the `upgrade`\n // event.\n //\n if (websocket.readyState !== WebSocket.CONNECTING) return;\n\n req = websocket._req = null;\n\n if (res.headers.upgrade.toLowerCase() !== 'websocket') {\n abortHandshake(websocket, socket, 'Invalid Upgrade header');\n return;\n }\n\n const digest = createHash('sha1')\n .update(key + GUID)\n .digest('base64');\n\n if (res.headers['sec-websocket-accept'] !== digest) {\n abortHandshake(websocket, socket, 'Invalid Sec-WebSocket-Accept header');\n return;\n }\n\n const serverProt = res.headers['sec-websocket-protocol'];\n const protList = (protocols || '').split(/, */);\n let protError;\n\n if (!protocols && serverProt) {\n protError = 'Server sent a subprotocol but none was requested';\n } else if (protocols && !serverProt) {\n protError = 'Server sent no subprotocol';\n } else if (serverProt && !protList.includes(serverProt)) {\n protError = 'Server sent an invalid subprotocol';\n }\n\n if (protError) {\n abortHandshake(websocket, socket, protError);\n return;\n }\n\n if (serverProt) websocket._protocol = serverProt;\n\n const secWebSocketExtensions = res.headers['sec-websocket-extensions'];\n\n if (secWebSocketExtensions !== undefined) {\n if (!perMessageDeflate) {\n const message =\n 'Server sent a Sec-WebSocket-Extensions header but no extension ' +\n 'was requested';\n abortHandshake(websocket, socket, message);\n return;\n }\n\n let extensions;\n\n try {\n extensions = parse(secWebSocketExtensions);\n } catch (err) {\n const message = 'Invalid Sec-WebSocket-Extensions header';\n abortHandshake(websocket, socket, message);\n return;\n }\n\n const extensionNames = Object.keys(extensions);\n\n if (extensionNames.length) {\n if (\n extensionNames.length !== 1 ||\n extensionNames[0] !== PerMessageDeflate.extensionName\n ) {\n const message =\n 'Server indicated an extension that was not requested';\n abortHandshake(websocket, socket, message);\n return;\n }\n\n try {\n perMessageDeflate.accept(extensions[PerMessageDeflate.extensionName]);\n } catch (err) {\n const message = 'Invalid Sec-WebSocket-Extensions header';\n abortHandshake(websocket, socket, message);\n return;\n }\n\n websocket._extensions[PerMessageDeflate.extensionName] =\n perMessageDeflate;\n }\n }\n\n websocket.setSocket(socket, head, opts.maxPayload);\n });\n}\n\n/**\n * Emit the `'error'` and `'close'` event.\n *\n * @param {WebSocket} websocket The WebSocket instance\n * @param {Error} The error to emit\n * @private\n */\nfunction emitErrorAndClose(websocket, err) {\n websocket._readyState = WebSocket.CLOSING;\n websocket.emit('error', err);\n websocket.emitClose();\n}\n\n/**\n * Create a `net.Socket` and initiate a connection.\n *\n * @param {Object} options Connection options\n * @return {net.Socket} The newly created socket used to start the connection\n * @private\n */\nfunction netConnect(options) {\n options.path = options.socketPath;\n return net.connect(options);\n}\n\n/**\n * Create a `tls.TLSSocket` and initiate a connection.\n *\n * @param {Object} options Connection options\n * @return {tls.TLSSocket} The newly created socket used to start the connection\n * @private\n */\nfunction tlsConnect(options) {\n options.path = undefined;\n\n if (!options.servername && options.servername !== '') {\n options.servername = net.isIP(options.host) ? '' : options.host;\n }\n\n return tls.connect(options);\n}\n\n/**\n * Abort the handshake and emit an error.\n *\n * @param {WebSocket} websocket The WebSocket instance\n * @param {(http.ClientRequest|net.Socket|tls.Socket)} stream The request to\n * abort or the socket to destroy\n * @param {String} message The error message\n * @private\n */\nfunction abortHandshake(websocket, stream, message) {\n websocket._readyState = WebSocket.CLOSING;\n\n const err = new Error(message);\n Error.captureStackTrace(err, abortHandshake);\n\n if (stream.setHeader) {\n stream.abort();\n\n if (stream.socket && !stream.socket.destroyed) {\n //\n // On Node.js >= 14.3.0 `request.abort()` does not destroy the socket if\n // called after the request completed. See\n // https://github.com/websockets/ws/issues/1869.\n //\n stream.socket.destroy();\n }\n\n stream.once('abort', websocket.emitClose.bind(websocket));\n websocket.emit('error', err);\n } else {\n stream.destroy(err);\n stream.once('error', websocket.emit.bind(websocket, 'error'));\n stream.once('close', websocket.emitClose.bind(websocket));\n }\n}\n\n/**\n * Handle cases where the `ping()`, `pong()`, or `send()` methods are called\n * when the `readyState` attribute is `CLOSING` or `CLOSED`.\n *\n * @param {WebSocket} websocket The WebSocket instance\n * @param {*} [data] The data to send\n * @param {Function} [cb] Callback\n * @private\n */\nfunction sendAfterClose(websocket, data, cb) {\n if (data) {\n const length = toBuffer(data).length;\n\n //\n // The `_bufferedAmount` property is used only when the peer is a client and\n // the opening handshake fails. Under these circumstances, in fact, the\n // `setSocket()` method is not called, so the `_socket` and `_sender`\n // properties are set to `null`.\n //\n if (websocket._socket) websocket._sender._bufferedBytes += length;\n else websocket._bufferedAmount += length;\n }\n\n if (cb) {\n const err = new Error(\n `WebSocket is not open: readyState ${websocket.readyState} ` +\n `(${readyStates[websocket.readyState]})`\n );\n cb(err);\n }\n}\n\n/**\n * The listener of the `Receiver` `'conclude'` event.\n *\n * @param {Number} code The status code\n * @param {String} reason The reason for closing\n * @private\n */\nfunction receiverOnConclude(code, reason) {\n const websocket = this[kWebSocket];\n\n websocket._closeFrameReceived = true;\n websocket._closeMessage = reason;\n websocket._closeCode = code;\n\n if (websocket._socket[kWebSocket] === undefined) return;\n\n websocket._socket.removeListener('data', socketOnData);\n process.nextTick(resume, websocket._socket);\n\n if (code === 1005) websocket.close();\n else websocket.close(code, reason);\n}\n\n/**\n * The listener of the `Receiver` `'drain'` event.\n *\n * @private\n */\nfunction receiverOnDrain() {\n this[kWebSocket]._socket.resume();\n}\n\n/**\n * The listener of the `Receiver` `'error'` event.\n *\n * @param {(RangeError|Error)} err The emitted error\n * @private\n */\nfunction receiverOnError(err) {\n const websocket = this[kWebSocket];\n\n if (websocket._socket[kWebSocket] !== undefined) {\n websocket._socket.removeListener('data', socketOnData);\n\n //\n // On Node.js < 14.0.0 the `'error'` event is emitted synchronously. See\n // https://github.com/websockets/ws/issues/1940.\n //\n process.nextTick(resume, websocket._socket);\n\n websocket.close(err[kStatusCode]);\n }\n\n websocket.emit('error', err);\n}\n\n/**\n * The listener of the `Receiver` `'finish'` event.\n *\n * @private\n */\nfunction receiverOnFinish() {\n this[kWebSocket].emitClose();\n}\n\n/**\n * The listener of the `Receiver` `'message'` event.\n *\n * @param {(String|Buffer|ArrayBuffer|Buffer[])} data The message\n * @private\n */\nfunction receiverOnMessage(data) {\n this[kWebSocket].emit('message', data);\n}\n\n/**\n * The listener of the `Receiver` `'ping'` event.\n *\n * @param {Buffer} data The data included in the ping frame\n * @private\n */\nfunction receiverOnPing(data) {\n const websocket = this[kWebSocket];\n\n websocket.pong(data, !websocket._isServer, NOOP);\n websocket.emit('ping', data);\n}\n\n/**\n * The listener of the `Receiver` `'pong'` event.\n *\n * @param {Buffer} data The data included in the pong frame\n * @private\n */\nfunction receiverOnPong(data) {\n this[kWebSocket].emit('pong', data);\n}\n\n/**\n * Resume a readable stream\n *\n * @param {Readable} stream The readable stream\n * @private\n */\nfunction resume(stream) {\n stream.resume();\n}\n\n/**\n * The listener of the `net.Socket` `'close'` event.\n *\n * @private\n */\nfunction socketOnClose() {\n const websocket = this[kWebSocket];\n\n this.removeListener('close', socketOnClose);\n this.removeListener('data', socketOnData);\n this.removeListener('end', socketOnEnd);\n\n websocket._readyState = WebSocket.CLOSING;\n\n let chunk;\n\n //\n // The close frame might not have been received or the `'end'` event emitted,\n // for example, if the socket was destroyed due to an error. Ensure that the\n // `receiver` stream is closed after writing any remaining buffered data to\n // it. If the readable side of the socket is in flowing mode then there is no\n // buffered data as everything has been already written and `readable.read()`\n // will return `null`. If instead, the socket is paused, any possible buffered\n // data will be read as a single chunk.\n //\n if (\n !this._readableState.endEmitted &&\n !websocket._closeFrameReceived &&\n !websocket._receiver._writableState.errorEmitted &&\n (chunk = websocket._socket.read()) !== null\n ) {\n websocket._receiver.write(chunk);\n }\n\n websocket._receiver.end();\n\n this[kWebSocket] = undefined;\n\n clearTimeout(websocket._closeTimer);\n\n if (\n websocket._receiver._writableState.finished ||\n websocket._receiver._writableState.errorEmitted\n ) {\n websocket.emitClose();\n } else {\n websocket._receiver.on('error', receiverOnFinish);\n websocket._receiver.on('finish', receiverOnFinish);\n }\n}\n\n/**\n * The listener of the `net.Socket` `'data'` event.\n *\n * @param {Buffer} chunk A chunk of data\n * @private\n */\nfunction socketOnData(chunk) {\n if (!this[kWebSocket]._receiver.write(chunk)) {\n this.pause();\n }\n}\n\n/**\n * The listener of the `net.Socket` `'end'` event.\n *\n * @private\n */\nfunction socketOnEnd() {\n const websocket = this[kWebSocket];\n\n websocket._readyState = WebSocket.CLOSING;\n websocket._receiver.end();\n this.end();\n}\n\n/**\n * The listener of the `net.Socket` `'error'` event.\n *\n * @private\n */\nfunction socketOnError() {\n const websocket = this[kWebSocket];\n\n this.removeListener('error', socketOnError);\n this.on('error', NOOP);\n\n if (websocket) {\n websocket._readyState = WebSocket.CLOSING;\n this.destroy();\n }\n}\n","'use strict';\n\nconst { Duplex } = require('stream');\n\n/**\n * Emits the `'close'` event on a stream.\n *\n * @param {Duplex} stream The stream.\n * @private\n */\nfunction emitClose(stream) {\n stream.emit('close');\n}\n\n/**\n * The listener of the `'end'` event.\n *\n * @private\n */\nfunction duplexOnEnd() {\n if (!this.destroyed && this._writableState.finished) {\n this.destroy();\n }\n}\n\n/**\n * The listener of the `'error'` event.\n *\n * @param {Error} err The error\n * @private\n */\nfunction duplexOnError(err) {\n this.removeListener('error', duplexOnError);\n this.destroy();\n if (this.listenerCount('error') === 0) {\n // Do not suppress the throwing behavior.\n this.emit('error', err);\n }\n}\n\n/**\n * Wraps a `WebSocket` in a duplex stream.\n *\n * @param {WebSocket} ws The `WebSocket` to wrap\n * @param {Object} [options] The options for the `Duplex` constructor\n * @return {Duplex} The duplex stream\n * @public\n */\nfunction createWebSocketStream(ws, options) {\n let resumeOnReceiverDrain = true;\n let terminateOnDestroy = true;\n\n function receiverOnDrain() {\n if (resumeOnReceiverDrain) ws._socket.resume();\n }\n\n if (ws.readyState === ws.CONNECTING) {\n ws.once('open', function open() {\n ws._receiver.removeAllListeners('drain');\n ws._receiver.on('drain', receiverOnDrain);\n });\n } else {\n ws._receiver.removeAllListeners('drain');\n ws._receiver.on('drain', receiverOnDrain);\n }\n\n const duplex = new Duplex({\n ...options,\n autoDestroy: false,\n emitClose: false,\n objectMode: false,\n writableObjectMode: false\n });\n\n ws.on('message', function message(msg) {\n if (!duplex.push(msg)) {\n resumeOnReceiverDrain = false;\n ws._socket.pause();\n }\n });\n\n ws.once('error', function error(err) {\n if (duplex.destroyed) return;\n\n // Prevent `ws.terminate()` from being called by `duplex._destroy()`.\n //\n // - If the `'error'` event is emitted before the `'open'` event, then\n // `ws.terminate()` is a noop as no socket is assigned.\n // - Otherwise, the error is re-emitted by the listener of the `'error'`\n // event of the `Receiver` object. The listener already closes the\n // connection by calling `ws.close()`. This allows a close frame to be\n // sent to the other peer. If `ws.terminate()` is called right after this,\n // then the close frame might not be sent.\n terminateOnDestroy = false;\n duplex.destroy(err);\n });\n\n ws.once('close', function close() {\n if (duplex.destroyed) return;\n\n duplex.push(null);\n });\n\n duplex._destroy = function (err, callback) {\n if (ws.readyState === ws.CLOSED) {\n callback(err);\n process.nextTick(emitClose, duplex);\n return;\n }\n\n let called = false;\n\n ws.once('error', function error(err) {\n called = true;\n callback(err);\n });\n\n ws.once('close', function close() {\n if (!called) callback(err);\n process.nextTick(emitClose, duplex);\n });\n\n if (terminateOnDestroy) ws.terminate();\n };\n\n duplex._final = function (callback) {\n if (ws.readyState === ws.CONNECTING) {\n ws.once('open', function open() {\n duplex._final(callback);\n });\n return;\n }\n\n // If the value of the `_socket` property is `null` it means that `ws` is a\n // client websocket and the handshake failed. In fact, when this happens, a\n // socket is never assigned to the websocket. Wait for the `'error'` event\n // that will be emitted by the websocket.\n if (ws._socket === null) return;\n\n if (ws._socket._writableState.finished) {\n callback();\n if (duplex._readableState.endEmitted) duplex.destroy();\n } else {\n ws._socket.once('finish', function finish() {\n // `duplex` is not destroyed here because the `'end'` event will be\n // emitted on `duplex` after this `'finish'` event. The EOF signaling\n // `null` chunk is, in fact, pushed when the websocket emits `'close'`.\n callback();\n });\n ws.close();\n }\n };\n\n duplex._read = function () {\n if (\n (ws.readyState === ws.OPEN || ws.readyState === ws.CLOSING) &&\n !resumeOnReceiverDrain\n ) {\n resumeOnReceiverDrain = true;\n if (!ws._receiver._writableState.needDrain) ws._socket.resume();\n }\n };\n\n duplex._write = function (chunk, encoding, callback) {\n if (ws.readyState === ws.CONNECTING) {\n ws.once('open', function open() {\n duplex._write(chunk, encoding, callback);\n });\n return;\n }\n\n ws.send(chunk, callback);\n };\n\n duplex.on('end', duplexOnEnd);\n duplex.on('error', duplexOnError);\n return duplex;\n}\n\nmodule.exports = createWebSocketStream;\n","/* eslint no-unused-vars: [\"error\", { \"varsIgnorePattern\": \"^net|tls|https$\" }] */\n\n'use strict';\n\nconst EventEmitter = require('events');\nconst http = require('http');\nconst https = require('https');\nconst net = require('net');\nconst tls = require('tls');\nconst { createHash } = require('crypto');\n\nconst PerMessageDeflate = require('./permessage-deflate');\nconst WebSocket = require('./websocket');\nconst { format, parse } = require('./extension');\nconst { GUID, kWebSocket } = require('./constants');\n\nconst keyRegex = /^[+/0-9A-Za-z]{22}==$/;\n\nconst RUNNING = 0;\nconst CLOSING = 1;\nconst CLOSED = 2;\n\n/**\n * Class representing a WebSocket server.\n *\n * @extends EventEmitter\n */\nclass WebSocketServer extends EventEmitter {\n /**\n * Create a `WebSocketServer` instance.\n *\n * @param {Object} options Configuration options\n * @param {Number} [options.backlog=511] The maximum length of the queue of\n * pending connections\n * @param {Boolean} [options.clientTracking=true] Specifies whether or not to\n * track clients\n * @param {Function} [options.handleProtocols] A hook to handle protocols\n * @param {String} [options.host] The hostname where to bind the server\n * @param {Number} [options.maxPayload=104857600] The maximum allowed message\n * size\n * @param {Boolean} [options.noServer=false] Enable no server mode\n * @param {String} [options.path] Accept only connections matching this path\n * @param {(Boolean|Object)} [options.perMessageDeflate=false] Enable/disable\n * permessage-deflate\n * @param {Number} [options.port] The port where to bind the server\n * @param {(http.Server|https.Server)} [options.server] A pre-created HTTP/S\n * server to use\n * @param {Function} [options.verifyClient] A hook to reject connections\n * @param {Function} [callback] A listener for the `listening` event\n */\n constructor(options, callback) {\n super();\n\n options = {\n maxPayload: 100 * 1024 * 1024,\n perMessageDeflate: false,\n handleProtocols: null,\n clientTracking: true,\n verifyClient: null,\n noServer: false,\n backlog: null, // use default (511 as implemented in net.js)\n server: null,\n host: null,\n path: null,\n port: null,\n ...options\n };\n\n if (\n (options.port == null && !options.server && !options.noServer) ||\n (options.port != null && (options.server || options.noServer)) ||\n (options.server && options.noServer)\n ) {\n throw new TypeError(\n 'One and only one of the \"port\", \"server\", or \"noServer\" options ' +\n 'must be specified'\n );\n }\n\n if (options.port != null) {\n this._server = http.createServer((req, res) => {\n const body = http.STATUS_CODES[426];\n\n res.writeHead(426, {\n 'Content-Length': body.length,\n 'Content-Type': 'text/plain'\n });\n res.end(body);\n });\n this._server.listen(\n options.port,\n options.host,\n options.backlog,\n callback\n );\n } else if (options.server) {\n this._server = options.server;\n }\n\n if (this._server) {\n const emitConnection = this.emit.bind(this, 'connection');\n\n this._removeListeners = addListeners(this._server, {\n listening: this.emit.bind(this, 'listening'),\n error: this.emit.bind(this, 'error'),\n upgrade: (req, socket, head) => {\n this.handleUpgrade(req, socket, head, emitConnection);\n }\n });\n }\n\n if (options.perMessageDeflate === true) options.perMessageDeflate = {};\n if (options.clientTracking) this.clients = new Set();\n this.options = options;\n this._state = RUNNING;\n }\n\n /**\n * Returns the bound address, the address family name, and port of the server\n * as reported by the operating system if listening on an IP socket.\n * If the server is listening on a pipe or UNIX domain socket, the name is\n * returned as a string.\n *\n * @return {(Object|String|null)} The address of the server\n * @public\n */\n address() {\n if (this.options.noServer) {\n throw new Error('The server is operating in \"noServer\" mode');\n }\n\n if (!this._server) return null;\n return this._server.address();\n }\n\n /**\n * Close the server.\n *\n * @param {Function} [cb] Callback\n * @public\n */\n close(cb) {\n if (cb) this.once('close', cb);\n\n if (this._state === CLOSED) {\n process.nextTick(emitClose, this);\n return;\n }\n\n if (this._state === CLOSING) return;\n this._state = CLOSING;\n\n //\n // Terminate all associated clients.\n //\n if (this.clients) {\n for (const client of this.clients) client.terminate();\n }\n\n const server = this._server;\n\n if (server) {\n this._removeListeners();\n this._removeListeners = this._server = null;\n\n //\n // Close the http server if it was internally created.\n //\n if (this.options.port != null) {\n server.close(emitClose.bind(undefined, this));\n return;\n }\n }\n\n process.nextTick(emitClose, this);\n }\n\n /**\n * See if a given request should be handled by this server instance.\n *\n * @param {http.IncomingMessage} req Request object to inspect\n * @return {Boolean} `true` if the request is valid, else `false`\n * @public\n */\n shouldHandle(req) {\n if (this.options.path) {\n const index = req.url.indexOf('?');\n const pathname = index !== -1 ? req.url.slice(0, index) : req.url;\n\n if (pathname !== this.options.path) return false;\n }\n\n return true;\n }\n\n /**\n * Handle a HTTP Upgrade request.\n *\n * @param {http.IncomingMessage} req The request object\n * @param {(net.Socket|tls.Socket)} socket The network socket between the\n * server and client\n * @param {Buffer} head The first packet of the upgraded stream\n * @param {Function} cb Callback\n * @public\n */\n handleUpgrade(req, socket, head, cb) {\n socket.on('error', socketOnError);\n\n const key =\n req.headers['sec-websocket-key'] !== undefined\n ? req.headers['sec-websocket-key'].trim()\n : false;\n const version = +req.headers['sec-websocket-version'];\n const extensions = {};\n\n if (\n req.method !== 'GET' ||\n req.headers.upgrade.toLowerCase() !== 'websocket' ||\n !key ||\n !keyRegex.test(key) ||\n (version !== 8 && version !== 13) ||\n !this.shouldHandle(req)\n ) {\n return abortHandshake(socket, 400);\n }\n\n if (this.options.perMessageDeflate) {\n const perMessageDeflate = new PerMessageDeflate(\n this.options.perMessageDeflate,\n true,\n this.options.maxPayload\n );\n\n try {\n const offers = parse(req.headers['sec-websocket-extensions']);\n\n if (offers[PerMessageDeflate.extensionName]) {\n perMessageDeflate.accept(offers[PerMessageDeflate.extensionName]);\n extensions[PerMessageDeflate.extensionName] = perMessageDeflate;\n }\n } catch (err) {\n return abortHandshake(socket, 400);\n }\n }\n\n //\n // Optionally call external client verification handler.\n //\n if (this.options.verifyClient) {\n const info = {\n origin:\n req.headers[`${version === 8 ? 'sec-websocket-origin' : 'origin'}`],\n secure: !!(req.socket.authorized || req.socket.encrypted),\n req\n };\n\n if (this.options.verifyClient.length === 2) {\n this.options.verifyClient(info, (verified, code, message, headers) => {\n if (!verified) {\n return abortHandshake(socket, code || 401, message, headers);\n }\n\n this.completeUpgrade(key, extensions, req, socket, head, cb);\n });\n return;\n }\n\n if (!this.options.verifyClient(info)) return abortHandshake(socket, 401);\n }\n\n this.completeUpgrade(key, extensions, req, socket, head, cb);\n }\n\n /**\n * Upgrade the connection to WebSocket.\n *\n * @param {String} key The value of the `Sec-WebSocket-Key` header\n * @param {Object} extensions The accepted extensions\n * @param {http.IncomingMessage} req The request object\n * @param {(net.Socket|tls.Socket)} socket The network socket between the\n * server and client\n * @param {Buffer} head The first packet of the upgraded stream\n * @param {Function} cb Callback\n * @throws {Error} If called more than once with the same socket\n * @private\n */\n completeUpgrade(key, extensions, req, socket, head, cb) {\n //\n // Destroy the socket if the client has already sent a FIN packet.\n //\n if (!socket.readable || !socket.writable) return socket.destroy();\n\n if (socket[kWebSocket]) {\n throw new Error(\n 'server.handleUpgrade() was called more than once with the same ' +\n 'socket, possibly due to a misconfiguration'\n );\n }\n\n if (this._state > RUNNING) return abortHandshake(socket, 503);\n\n const digest = createHash('sha1')\n .update(key + GUID)\n .digest('base64');\n\n const headers = [\n 'HTTP/1.1 101 Switching Protocols',\n 'Upgrade: websocket',\n 'Connection: Upgrade',\n `Sec-WebSocket-Accept: ${digest}`\n ];\n\n const ws = new WebSocket(null);\n let protocol = req.headers['sec-websocket-protocol'];\n\n if (protocol) {\n protocol = protocol.split(',').map(trim);\n\n //\n // Optionally call external protocol selection handler.\n //\n if (this.options.handleProtocols) {\n protocol = this.options.handleProtocols(protocol, req);\n } else {\n protocol = protocol[0];\n }\n\n if (protocol) {\n headers.push(`Sec-WebSocket-Protocol: ${protocol}`);\n ws._protocol = protocol;\n }\n }\n\n if (extensions[PerMessageDeflate.extensionName]) {\n const params = extensions[PerMessageDeflate.extensionName].params;\n const value = format({\n [PerMessageDeflate.extensionName]: [params]\n });\n headers.push(`Sec-WebSocket-Extensions: ${value}`);\n ws._extensions = extensions;\n }\n\n //\n // Allow external modification/inspection of handshake headers.\n //\n this.emit('headers', headers, req);\n\n socket.write(headers.concat('\\r\\n').join('\\r\\n'));\n socket.removeListener('error', socketOnError);\n\n ws.setSocket(socket, head, this.options.maxPayload);\n\n if (this.clients) {\n this.clients.add(ws);\n ws.on('close', () => this.clients.delete(ws));\n }\n\n cb(ws, req);\n }\n}\n\nmodule.exports = WebSocketServer;\n\n/**\n * Add event listeners on an `EventEmitter` using a map of \n * pairs.\n *\n * @param {EventEmitter} server The event emitter\n * @param {Object.} map The listeners to add\n * @return {Function} A function that will remove the added listeners when\n * called\n * @private\n */\nfunction addListeners(server, map) {\n for (const event of Object.keys(map)) server.on(event, map[event]);\n\n return function removeListeners() {\n for (const event of Object.keys(map)) {\n server.removeListener(event, map[event]);\n }\n };\n}\n\n/**\n * Emit a `'close'` event on an `EventEmitter`.\n *\n * @param {EventEmitter} server The event emitter\n * @private\n */\nfunction emitClose(server) {\n server._state = CLOSED;\n server.emit('close');\n}\n\n/**\n * Handle premature socket errors.\n *\n * @private\n */\nfunction socketOnError() {\n this.destroy();\n}\n\n/**\n * Close the connection when preconditions are not fulfilled.\n *\n * @param {(net.Socket|tls.Socket)} socket The socket of the upgrade request\n * @param {Number} code The HTTP response status code\n * @param {String} [message] The HTTP response body\n * @param {Object} [headers] Additional HTTP response headers\n * @private\n */\nfunction abortHandshake(socket, code, message, headers) {\n if (socket.writable) {\n message = message || http.STATUS_CODES[code];\n headers = {\n Connection: 'close',\n 'Content-Type': 'text/html',\n 'Content-Length': Buffer.byteLength(message),\n ...headers\n };\n\n socket.write(\n `HTTP/1.1 ${code} ${http.STATUS_CODES[code]}\\r\\n` +\n Object.keys(headers)\n .map((h) => `${h}: ${headers[h]}`)\n .join('\\r\\n') +\n '\\r\\n\\r\\n' +\n message\n );\n }\n\n socket.removeListener('error', socketOnError);\n socket.destroy();\n}\n\n/**\n * Remove whitespace characters from both ends of a string.\n *\n * @param {String} str The string\n * @return {String} A new string representing `str` stripped of whitespace\n * characters from both its beginning and end\n * @private\n */\nfunction trim(str) {\n return str.trim();\n}\n","'use strict';\n\nconst WebSocket = require('./lib/websocket');\n\nWebSocket.createWebSocketStream = require('./lib/stream');\nWebSocket.Server = require('./lib/websocket-server');\nWebSocket.Receiver = require('./lib/receiver');\nWebSocket.Sender = require('./lib/sender');\n\nmodule.exports = WebSocket;\n","var Gun = require('../gun');\n\n/*\n\tAn Ad-Hoc Mesh-Network Daisy-Chain\n\tshould work even if humans are\n\tcommunicating with each other blind.\n\n\tTo prevent infinite broadcast loops,\n\twe use a deduplication process\n\tbased on the message's identifier.\n\tThis is currently implemented in core.\n\n\tHowever, because this still creates a\n\tN*2 (where N is the number of connections)\n\tflood, it is not scalable for traditional\n\tservices that have a hub network topology.\n\n\tDoes this mean we have to abandon mesh\n\talgorithms? No, we can simply layer more\n\tefficient optimizations in based on constraints.\n\tIf these constraints exist, it automatically\n\tupgrades, but if not, it falls back to the\n\tbrute-force mesh based robust algorithm.\n\tA simple example is to limit peer connections\n\tand rely upon daisy chaining to relay messages.\n\n\tAnother example, is if peers are willing to\n\tidentify themselves, then we can improve the\n\tefficiency of the network by having each peer\n\tinclude the names of peers it is connected in\n\teach message. Then each subsequent peer will\n\tnot relay it to them, since it is unnecessary.\n\tThis should create N (where N is the number of\n\tpeers) messages (or possibly N+ if there is a\n\tcommon peer of uncommon peers that receives it\n\tand relays at exact latency timings), which is\n\toptimal.\n\n\tSince computer networks aren't actually blind,\n\twe will implement the above method to improve\n\tthe performance of the ad-hoc mesh network.\n\n\tBut why not have every message contain the\n\twhole history of peers that it relayed through?\n\tBecause in sufficiently large enough networks,\n\twith extensive daisy chaining, this will cause\n\tthe message to become prohibitively slow and\n\tincrease indefinitely in size.\n\n*/\n\nGun.on('opt', function(root){\n\tvar opt = root.opt;\n\tif(false === opt.ws || opt.once){\n\t\tthis.to.next(root);\n\t\treturn;\n\t}\t\n\n\tvar url = require('url');\n\topt.mesh = opt.mesh || Gun.Mesh(root);\n\topt.WebSocket = opt.WebSocket || require('ws');\n\tvar ws = opt.ws = opt.ws || {};\n\tws.path = ws.path || '/gun';\n\t// if we DO need an HTTP server, then choose ws specific one or GUN default one.\n\tif(!ws.noServer){\n\t\tws.server = ws.server || opt.web;\n\t\tif(!ws.server){ this.to.next(root); return } // ugh, bug fix for @jamierez & unstoppable ryan.\n\t}\n\tws.web = ws.web || new opt.WebSocket.Server(ws); // we still need a WS server.\n\tws.web.on('connection', function(wire, req){ var peer;\n\t\twire.headers = wire.headers || (req||'').headers || '';\n\t\tconsole.STAT && ((console.STAT.sites || (console.STAT.sites = {}))[wire.headers.origin] = 1);\n\t\topt.mesh.hi(peer = {wire: wire});\n\t\twire.on('message', function(msg){\n\t\t\topt.mesh.hear(msg.data || msg, peer);\n\t\t});\n\t\twire.on('close', function(){\n\t\t\topt.mesh.bye(peer);\n\t\t});\n\t\twire.on('error', function(e){});\n\t\tsetTimeout(function heart(){ if(!opt.peers[peer.id]){ return } try{ wire.send(\"[]\") }catch(e){} ;setTimeout(heart, 1000 * 20) }, 1000 * 20); // Some systems, like Heroku, require heartbeats to not time out. // TODO: Make this configurable? // TODO: PERF: Find better approach than try/timeouts?\n\t});\n\tthis.to.next(root);\n});",";(function(){\n\n var window = this || self || window;\n\n /* UNBUILD */\n function USE(arg, req){\n return req? require(arg) : arg.slice? USE[R(arg)] : function(mod, path){\n arg(mod = {exports: {}});\n USE[R(path)] = mod.exports;\n }\n function R(p){\n return p.split('/').slice(-1).toString().replace('.js','');\n }\n }\n if(typeof module !== \"undefined\"){ var MODULE = module }\n /* UNBUILD */\n\n ;USE(function(module){\n // Security, Encryption, and Authorization: SEA.js\n // MANDATORY READING: https://gun.eco/explainers/data/security.html\n // IT IS IMPLEMENTED IN A POLYFILL/SHIM APPROACH.\n // THIS IS AN EARLY ALPHA!\n\n if(typeof window !== \"undefined\"){ module.window = window }\n\n var tmp = module.window || module, u;\n var SEA = tmp.SEA || {};\n\n if(SEA.window = module.window){ SEA.window.SEA = SEA }\n\n try{ if(u+'' !== typeof MODULE){ MODULE.exports = SEA } }catch(e){}\n module.exports = SEA;\n })(USE, './root');\n\n ;USE(function(module){\n var SEA = USE('./root');\n try{ if(SEA.window){\n if(location.protocol.indexOf('s') < 0\n && location.host.indexOf('localhost') < 0\n && ! /^127\\.\\d+\\.\\d+\\.\\d+$/.test(location.hostname)\n && location.protocol.indexOf('file:') < 0){\n console.warn('HTTPS needed for WebCrypto in SEA, redirecting...');\n location.protocol = 'https:'; // WebCrypto does NOT work without HTTPS!\n }\n } }catch(e){}\n })(USE, './https');\n\n ;USE(function(module){\n var u;\n if(u+''== typeof btoa){\n if(u+'' == typeof Buffer){\n try{ global.Buffer = USE(\"buffer\", 1).Buffer }catch(e){ console.log(\"Please `npm install buffer` or add it to your package.json !\") }\n }\n global.btoa = function(data){ return Buffer.from(data, \"binary\").toString(\"base64\") };\n global.atob = function(data){ return Buffer.from(data, \"base64\").toString(\"binary\") };\n }\n })(USE, './base64');\n\n ;USE(function(module){\n USE('./base64');\n // This is Array extended to have .toString(['utf8'|'hex'|'base64'])\n function SeaArray() {}\n Object.assign(SeaArray, { from: Array.from })\n SeaArray.prototype = Object.create(Array.prototype)\n SeaArray.prototype.toString = function(enc, start, end) { enc = enc || 'utf8'; start = start || 0;\n const length = this.length\n if (enc === 'hex') {\n const buf = new Uint8Array(this)\n return [ ...Array(((end && (end + 1)) || length) - start).keys()]\n .map((i) => buf[ i + start ].toString(16).padStart(2, '0')).join('')\n }\n if (enc === 'utf8') {\n return Array.from(\n { length: (end || length) - start },\n (_, i) => String.fromCharCode(this[ i + start])\n ).join('')\n }\n if (enc === 'base64') {\n return btoa(this)\n }\n }\n module.exports = SeaArray;\n })(USE, './array');\n\n ;USE(function(module){\n USE('./base64');\n // This is Buffer implementation used in SEA. Functionality is mostly\n // compatible with NodeJS 'safe-buffer' and is used for encoding conversions\n // between binary and 'hex' | 'utf8' | 'base64'\n // See documentation and validation for safe implementation in:\n // https://github.com/feross/safe-buffer#update\n var SeaArray = USE('./array');\n function SafeBuffer(...props) {\n console.warn('new SafeBuffer() is depreciated, please use SafeBuffer.from()')\n return SafeBuffer.from(...props)\n }\n SafeBuffer.prototype = Object.create(Array.prototype)\n Object.assign(SafeBuffer, {\n // (data, enc) where typeof data === 'string' then enc === 'utf8'|'hex'|'base64'\n from() {\n if (!Object.keys(arguments).length || arguments[0]==null) {\n throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.')\n }\n const input = arguments[0]\n let buf\n if (typeof input === 'string') {\n const enc = arguments[1] || 'utf8'\n if (enc === 'hex') {\n const bytes = input.match(/([\\da-fA-F]{2})/g)\n .map((byte) => parseInt(byte, 16))\n if (!bytes || !bytes.length) {\n throw new TypeError('Invalid first argument for type \\'hex\\'.')\n }\n buf = SeaArray.from(bytes)\n } else if (enc === 'utf8' || 'binary' === enc) { // EDIT BY MARK: I think this is safe, tested it against a couple \"binary\" strings. This lets SafeBuffer match NodeJS Buffer behavior more where it safely btoas regular strings.\n const length = input.length\n const words = new Uint16Array(length)\n Array.from({ length: length }, (_, i) => words[i] = input.charCodeAt(i))\n buf = SeaArray.from(words)\n } else if (enc === 'base64') {\n const dec = atob(input)\n const length = dec.length\n const bytes = new Uint8Array(length)\n Array.from({ length: length }, (_, i) => bytes[i] = dec.charCodeAt(i))\n buf = SeaArray.from(bytes)\n } else if (enc === 'binary') { // deprecated by above comment\n buf = SeaArray.from(input) // some btoas were mishandled.\n } else {\n console.info('SafeBuffer.from unknown encoding: '+enc)\n }\n return buf\n }\n const byteLength = input.byteLength // what is going on here? FOR MARTTI\n const length = input.byteLength ? input.byteLength : input.length\n if (length) {\n let buf\n if (input instanceof ArrayBuffer) {\n buf = new Uint8Array(input)\n }\n return SeaArray.from(buf || input)\n }\n },\n // This is 'safe-buffer.alloc' sans encoding support\n alloc(length, fill = 0 /*, enc*/ ) {\n return SeaArray.from(new Uint8Array(Array.from({ length: length }, () => fill)))\n },\n // This is normal UNSAFE 'buffer.alloc' or 'new Buffer(length)' - don't use!\n allocUnsafe(length) {\n return SeaArray.from(new Uint8Array(Array.from({ length : length })))\n },\n // This puts together array of array like members\n concat(arr) { // octet array\n if (!Array.isArray(arr)) {\n throw new TypeError('First argument must be Array containing ArrayBuffer or Uint8Array instances.')\n }\n return SeaArray.from(arr.reduce((ret, item) => ret.concat(Array.from(item)), []))\n }\n })\n SafeBuffer.prototype.from = SafeBuffer.from\n SafeBuffer.prototype.toString = SeaArray.prototype.toString\n\n module.exports = SafeBuffer;\n })(USE, './buffer');\n\n ;USE(function(module){\n const SEA = USE('./root')\n const api = {Buffer: USE('./buffer')}\n var o = {}, u;\n\n // ideally we can move away from JSON entirely? unlikely due to compatibility issues... oh well.\n JSON.parseAsync = JSON.parseAsync || function(t,cb,r){ var u; try{ cb(u, JSON.parse(t,r)) }catch(e){ cb(e) } }\n JSON.stringifyAsync = JSON.stringifyAsync || function(v,cb,r,s){ var u; try{ cb(u, JSON.stringify(v,r,s)) }catch(e){ cb(e) } }\n\n api.parse = function(t,r){ return new Promise(function(res, rej){\n JSON.parseAsync(t,function(err, raw){ err? rej(err) : res(raw) },r);\n })}\n api.stringify = function(v,r,s){ return new Promise(function(res, rej){\n JSON.stringifyAsync(v,function(err, raw){ err? rej(err) : res(raw) },r,s);\n })}\n\n if(SEA.window){\n api.crypto = window.crypto || window.msCrypto\n api.subtle = (api.crypto||o).subtle || (api.crypto||o).webkitSubtle;\n api.TextEncoder = window.TextEncoder;\n api.TextDecoder = window.TextDecoder;\n api.random = (len) => api.Buffer.from(api.crypto.getRandomValues(new Uint8Array(api.Buffer.alloc(len))));\n }\n if(!api.TextDecoder)\n {\n const { TextEncoder, TextDecoder } = USE((u+'' == typeof MODULE?'.':'')+'./lib/text-encoding', 1);\n api.TextDecoder = TextDecoder;\n api.TextEncoder = TextEncoder;\n }\n if(!api.crypto)\n {\n try\n {\n var crypto = USE('crypto', 1);\n Object.assign(api, {\n crypto,\n random: (len) => api.Buffer.from(crypto.randomBytes(len))\n }); \n const { Crypto: WebCrypto } = USE('@peculiar/webcrypto', 1);\n api.ossl = api.subtle = new WebCrypto({directory: 'ossl'}).subtle // ECDH\n }\n catch(e){\n console.log(\"Please `npm install @peculiar/webcrypto` or add it to your package.json !\");\n }}\n\n module.exports = api\n })(USE, './shim');\n\n ;USE(function(module){\n var SEA = USE('./root');\n var shim = USE('./shim');\n var s = {};\n s.pbkdf2 = {hash: {name : 'SHA-256'}, iter: 100000, ks: 64};\n s.ecdsa = {\n pair: {name: 'ECDSA', namedCurve: 'P-256'},\n sign: {name: 'ECDSA', hash: {name: 'SHA-256'}}\n };\n s.ecdh = {name: 'ECDH', namedCurve: 'P-256'};\n\n // This creates Web Cryptography API compliant JWK for sign/verify purposes\n s.jwk = function(pub, d){ // d === priv\n pub = pub.split('.');\n var x = pub[0], y = pub[1];\n var jwk = {kty: \"EC\", crv: \"P-256\", x: x, y: y, ext: true};\n jwk.key_ops = d ? ['sign'] : ['verify'];\n if(d){ jwk.d = d }\n return jwk;\n };\n \n s.keyToJwk = function(keyBytes) {\n const keyB64 = keyBytes.toString('base64');\n const k = keyB64.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/\\=/g, '');\n return { kty: 'oct', k: k, ext: false, alg: 'A256GCM' };\n }\n\n s.recall = {\n validity: 12 * 60 * 60, // internally in seconds : 12 hours\n hook: function(props){ return props } // { iat, exp, alias, remember } // or return new Promise((resolve, reject) => resolve(props)\n };\n\n s.check = function(t){ return (typeof t == 'string') && ('SEA{' === t.slice(0,4)) }\n s.parse = async function p(t){ try {\n var yes = (typeof t == 'string');\n if(yes && 'SEA{' === t.slice(0,4)){ t = t.slice(3) }\n return yes ? await shim.parse(t) : t;\n } catch (e) {}\n return t;\n }\n\n SEA.opt = s;\n module.exports = s\n })(USE, './settings');\n\n ;USE(function(module){\n var shim = USE('./shim');\n module.exports = async function(d, o){\n var t = (typeof d == 'string')? d : await shim.stringify(d);\n var hash = await shim.subtle.digest({name: o||'SHA-256'}, new shim.TextEncoder().encode(t));\n return shim.Buffer.from(hash);\n }\n })(USE, './sha256');\n\n ;USE(function(module){\n // This internal func returns SHA-1 hashed data for KeyID generation\n const __shim = USE('./shim')\n const subtle = __shim.subtle\n const ossl = __shim.ossl ? __shim.ossl : subtle\n const sha1hash = (b) => ossl.digest({name: 'SHA-1'}, new ArrayBuffer(b))\n module.exports = sha1hash\n })(USE, './sha1');\n\n ;USE(function(module){\n var SEA = USE('./root');\n var shim = USE('./shim');\n var S = USE('./settings');\n var sha = USE('./sha256');\n var u;\n\n SEA.work = SEA.work || (async (data, pair, cb, opt) => { try { // used to be named `proof`\n var salt = (pair||{}).epub || pair; // epub not recommended, salt should be random!\n opt = opt || {};\n if(salt instanceof Function){\n cb = salt;\n salt = u;\n }\n data = (typeof data == 'string')? data : await shim.stringify(data);\n if('sha' === (opt.name||'').toLowerCase().slice(0,3)){\n var rsha = shim.Buffer.from(await sha(data, opt.name), 'binary').toString(opt.encode || 'base64')\n if(cb){ try{ cb(rsha) }catch(e){console.log(e)} }\n return rsha;\n }\n salt = salt || shim.random(9);\n var key = await (shim.ossl || shim.subtle).importKey('raw', new shim.TextEncoder().encode(data), {name: opt.name || 'PBKDF2'}, false, ['deriveBits']);\n var work = await (shim.ossl || shim.subtle).deriveBits({\n name: opt.name || 'PBKDF2',\n iterations: opt.iterations || S.pbkdf2.iter,\n salt: new shim.TextEncoder().encode(opt.salt || salt),\n hash: opt.hash || S.pbkdf2.hash,\n }, key, opt.length || (S.pbkdf2.ks * 8))\n data = shim.random(data.length) // Erase data in case of passphrase\n var r = shim.Buffer.from(work, 'binary').toString(opt.encode || 'base64')\n if(cb){ try{ cb(r) }catch(e){console.log(e)} }\n return r;\n } catch(e) { \n console.log(e);\n SEA.err = e;\n if(SEA.throw){ throw e }\n if(cb){ cb() }\n return;\n }});\n\n module.exports = SEA.work;\n })(USE, './work');\n\n ;USE(function(module){\n var SEA = USE('./root');\n var shim = USE('./shim');\n var S = USE('./settings');\n\n SEA.name = SEA.name || (async (cb, opt) => { try {\n if(cb){ try{ cb() }catch(e){console.log(e)} }\n return;\n } catch(e) {\n console.log(e);\n SEA.err = e;\n if(SEA.throw){ throw e }\n if(cb){ cb() }\n return;\n }});\n\n //SEA.pair = async (data, proof, cb) => { try {\n SEA.pair = SEA.pair || (async (cb, opt) => { try {\n\n var ecdhSubtle = shim.ossl || shim.subtle;\n // First: ECDSA keys for signing/verifying...\n var sa = await shim.subtle.generateKey({name: 'ECDSA', namedCurve: 'P-256'}, true, [ 'sign', 'verify' ])\n .then(async (keys) => {\n // privateKey scope doesn't leak out from here!\n //const { d: priv } = await shim.subtle.exportKey('jwk', keys.privateKey)\n var key = {};\n key.priv = (await shim.subtle.exportKey('jwk', keys.privateKey)).d;\n var pub = await shim.subtle.exportKey('jwk', keys.publicKey);\n //const pub = Buff.from([ x, y ].join(':')).toString('base64') // old\n key.pub = pub.x+'.'+pub.y; // new\n // x and y are already base64\n // pub is UTF8 but filename/URL safe (https://www.ietf.org/rfc/rfc3986.txt)\n // but split on a non-base64 letter.\n return key;\n })\n \n // To include PGPv4 kind of keyId:\n // const pubId = await SEA.keyid(keys.pub)\n // Next: ECDH keys for encryption/decryption...\n\n try{\n var dh = await ecdhSubtle.generateKey({name: 'ECDH', namedCurve: 'P-256'}, true, ['deriveKey'])\n .then(async (keys) => {\n // privateKey scope doesn't leak out from here!\n var key = {};\n key.epriv = (await ecdhSubtle.exportKey('jwk', keys.privateKey)).d;\n var pub = await ecdhSubtle.exportKey('jwk', keys.publicKey);\n //const epub = Buff.from([ ex, ey ].join(':')).toString('base64') // old\n key.epub = pub.x+'.'+pub.y; // new\n // ex and ey are already base64\n // epub is UTF8 but filename/URL safe (https://www.ietf.org/rfc/rfc3986.txt)\n // but split on a non-base64 letter.\n return key;\n })\n }catch(e){\n if(SEA.window){ throw e }\n if(e == 'Error: ECDH is not a supported algorithm'){ console.log('Ignoring ECDH...') }\n else { throw e }\n } dh = dh || {};\n\n var r = { pub: sa.pub, priv: sa.priv, /* pubId, */ epub: dh.epub, epriv: dh.epriv }\n if(cb){ try{ cb(r) }catch(e){console.log(e)} }\n return r;\n } catch(e) {\n console.log(e);\n SEA.err = e;\n if(SEA.throw){ throw e }\n if(cb){ cb() }\n return;\n }});\n\n module.exports = SEA.pair;\n })(USE, './pair');\n\n ;USE(function(module){\n var SEA = USE('./root');\n var shim = USE('./shim');\n var S = USE('./settings');\n var sha = USE('./sha256');\n var u;\n\n SEA.sign = SEA.sign || (async (data, pair, cb, opt) => { try {\n opt = opt || {};\n if(!(pair||opt).priv){\n if(!SEA.I){ throw 'No signing key.' }\n pair = await SEA.I(null, {what: data, how: 'sign', why: opt.why});\n }\n if(u === data){ throw '`undefined` not allowed.' }\n var json = await S.parse(data);\n var check = opt.check = opt.check || json;\n if(SEA.verify && (SEA.opt.check(check) || (check && check.s && check.m))\n && u !== await SEA.verify(check, pair)){ // don't sign if we already signed it.\n var r = await S.parse(check);\n if(!opt.raw){ r = 'SEA' + await shim.stringify(r) }\n if(cb){ try{ cb(r) }catch(e){console.log(e)} }\n return r;\n }\n var pub = pair.pub;\n var priv = pair.priv;\n var jwk = S.jwk(pub, priv);\n var hash = await sha(json);\n var sig = await (shim.ossl || shim.subtle).importKey('jwk', jwk, {name: 'ECDSA', namedCurve: 'P-256'}, false, ['sign'])\n .then((key) => (shim.ossl || shim.subtle).sign({name: 'ECDSA', hash: {name: 'SHA-256'}}, key, new Uint8Array(hash))) // privateKey scope doesn't leak out from here!\n var r = {m: json, s: shim.Buffer.from(sig, 'binary').toString(opt.encode || 'base64')}\n if(!opt.raw){ r = 'SEA' + await shim.stringify(r) }\n\n if(cb){ try{ cb(r) }catch(e){console.log(e)} }\n return r;\n } catch(e) {\n console.log(e);\n SEA.err = e;\n if(SEA.throw){ throw e }\n if(cb){ cb() }\n return;\n }});\n\n module.exports = SEA.sign;\n })(USE, './sign');\n\n ;USE(function(module){\n var SEA = USE('./root');\n var shim = USE('./shim');\n var S = USE('./settings');\n var sha = USE('./sha256');\n var u;\n\n SEA.verify = SEA.verify || (async (data, pair, cb, opt) => { try {\n var json = await S.parse(data);\n if(false === pair){ // don't verify!\n var raw = await S.parse(json.m);\n if(cb){ try{ cb(raw) }catch(e){console.log(e)} }\n return raw;\n }\n opt = opt || {};\n // SEA.I // verify is free! Requires no user permission.\n var pub = pair.pub || pair;\n var key = SEA.opt.slow_leak? await SEA.opt.slow_leak(pub) : await (shim.ossl || shim.subtle).importKey('jwk', S.jwk(pub), {name: 'ECDSA', namedCurve: 'P-256'}, false, ['verify']);\n var hash = await sha(json.m);\n var buf, sig, check, tmp; try{\n buf = shim.Buffer.from(json.s, opt.encode || 'base64'); // NEW DEFAULT!\n sig = new Uint8Array(buf);\n check = await (shim.ossl || shim.subtle).verify({name: 'ECDSA', hash: {name: 'SHA-256'}}, key, sig, new Uint8Array(hash));\n if(!check){ throw \"Signature did not match.\" }\n }catch(e){\n if(SEA.opt.fallback){\n return await SEA.opt.fall_verify(data, pair, cb, opt);\n }\n }\n var r = check? await S.parse(json.m) : u;\n\n if(cb){ try{ cb(r) }catch(e){console.log(e)} }\n return r;\n } catch(e) {\n console.log(e); // mismatched owner FOR MARTTI\n SEA.err = e;\n if(SEA.throw){ throw e }\n if(cb){ cb() }\n return;\n }});\n\n module.exports = SEA.verify;\n // legacy & ossl memory leak mitigation:\n\n var knownKeys = {};\n var keyForPair = SEA.opt.slow_leak = pair => {\n if (knownKeys[pair]) return knownKeys[pair];\n var jwk = S.jwk(pair);\n knownKeys[pair] = (shim.ossl || shim.subtle).importKey(\"jwk\", jwk, {name: 'ECDSA', namedCurve: 'P-256'}, false, [\"verify\"]);\n return knownKeys[pair];\n };\n\n var O = SEA.opt;\n SEA.opt.fall_verify = async function(data, pair, cb, opt, f){\n if(f === SEA.opt.fallback){ throw \"Signature did not match\" } f = f || 1;\n var tmp = data||'';\n data = SEA.opt.unpack(data) || data;\n var json = await S.parse(data), pub = pair.pub || pair, key = await SEA.opt.slow_leak(pub);\n var hash = (f <= SEA.opt.fallback)? shim.Buffer.from(await shim.subtle.digest({name: 'SHA-256'}, new shim.TextEncoder().encode(await S.parse(json.m)))) : await sha(json.m); // this line is old bad buggy code but necessary for old compatibility.\n var buf; var sig; var check; try{\n buf = shim.Buffer.from(json.s, opt.encode || 'base64') // NEW DEFAULT!\n sig = new Uint8Array(buf)\n check = await (shim.ossl || shim.subtle).verify({name: 'ECDSA', hash: {name: 'SHA-256'}}, key, sig, new Uint8Array(hash))\n if(!check){ throw \"Signature did not match.\" }\n }catch(e){ try{\n buf = shim.Buffer.from(json.s, 'utf8') // AUTO BACKWARD OLD UTF8 DATA!\n sig = new Uint8Array(buf)\n check = await (shim.ossl || shim.subtle).verify({name: 'ECDSA', hash: {name: 'SHA-256'}}, key, sig, new Uint8Array(hash))\n }catch(e){\n if(!check){ throw \"Signature did not match.\" }\n }\n }\n var r = check? await S.parse(json.m) : u;\n O.fall_soul = tmp['#']; O.fall_key = tmp['.']; O.fall_val = data; O.fall_state = tmp['>'];\n if(cb){ try{ cb(r) }catch(e){console.log(e)} }\n return r;\n }\n SEA.opt.fallback = 2;\n\n })(USE, './verify');\n\n ;USE(function(module){\n var shim = USE('./shim');\n var S = USE('./settings');\n var sha256hash = USE('./sha256');\n\n const importGen = async (key, salt, opt) => {\n //const combo = shim.Buffer.concat([shim.Buffer.from(key, 'utf8'), salt || shim.random(8)]).toString('utf8') // old\n opt = opt || {};\n const combo = key + (salt || shim.random(8)).toString('utf8'); // new\n const hash = shim.Buffer.from(await sha256hash(combo), 'binary')\n \n const jwkKey = S.keyToJwk(hash) \n return await shim.subtle.importKey('jwk', jwkKey, {name:'AES-GCM'}, false, ['encrypt', 'decrypt'])\n }\n module.exports = importGen;\n })(USE, './aeskey');\n\n ;USE(function(module){\n var SEA = USE('./root');\n var shim = USE('./shim');\n var S = USE('./settings');\n var aeskey = USE('./aeskey');\n var u;\n\n SEA.encrypt = SEA.encrypt || (async (data, pair, cb, opt) => { try {\n opt = opt || {};\n var key = (pair||opt).epriv || pair;\n if(u === data){ throw '`undefined` not allowed.' }\n if(!key){\n if(!SEA.I){ throw 'No encryption key.' }\n pair = await SEA.I(null, {what: data, how: 'encrypt', why: opt.why});\n key = pair.epriv || pair;\n }\n var msg = (typeof data == 'string')? data : await shim.stringify(data);\n var rand = {s: shim.random(9), iv: shim.random(15)}; // consider making this 9 and 15 or 18 or 12 to reduce == padding.\n var ct = await aeskey(key, rand.s, opt).then((aes) => (/*shim.ossl ||*/ shim.subtle).encrypt({ // Keeping the AES key scope as private as possible...\n name: opt.name || 'AES-GCM', iv: new Uint8Array(rand.iv)\n }, aes, new shim.TextEncoder().encode(msg)));\n var r = {\n ct: shim.Buffer.from(ct, 'binary').toString(opt.encode || 'base64'),\n iv: rand.iv.toString(opt.encode || 'base64'),\n s: rand.s.toString(opt.encode || 'base64')\n }\n if(!opt.raw){ r = 'SEA' + await shim.stringify(r) }\n\n if(cb){ try{ cb(r) }catch(e){console.log(e)} }\n return r;\n } catch(e) { \n console.log(e);\n SEA.err = e;\n if(SEA.throw){ throw e }\n if(cb){ cb() }\n return;\n }});\n\n module.exports = SEA.encrypt;\n })(USE, './encrypt');\n\n ;USE(function(module){\n var SEA = USE('./root');\n var shim = USE('./shim');\n var S = USE('./settings');\n var aeskey = USE('./aeskey');\n\n SEA.decrypt = SEA.decrypt || (async (data, pair, cb, opt) => { try {\n opt = opt || {};\n var key = (pair||opt).epriv || pair;\n if(!key){\n if(!SEA.I){ throw 'No decryption key.' }\n pair = await SEA.I(null, {what: data, how: 'decrypt', why: opt.why});\n key = pair.epriv || pair;\n }\n var json = await S.parse(data);\n var buf, bufiv, bufct; try{\n buf = shim.Buffer.from(json.s, opt.encode || 'base64');\n bufiv = shim.Buffer.from(json.iv, opt.encode || 'base64');\n bufct = shim.Buffer.from(json.ct, opt.encode || 'base64');\n var ct = await aeskey(key, buf, opt).then((aes) => (/*shim.ossl ||*/ shim.subtle).decrypt({ // Keeping aesKey scope as private as possible...\n name: opt.name || 'AES-GCM', iv: new Uint8Array(bufiv), tagLength: 128\n }, aes, new Uint8Array(bufct)));\n }catch(e){\n if('utf8' === opt.encode){ throw \"Could not decrypt\" }\n if(SEA.opt.fallback){\n opt.encode = 'utf8';\n return await SEA.decrypt(data, pair, cb, opt);\n }\n }\n var r = await S.parse(new shim.TextDecoder('utf8').decode(ct));\n if(cb){ try{ cb(r) }catch(e){console.log(e)} }\n return r;\n } catch(e) { \n console.log(e);\n SEA.err = e;\n if(SEA.throw){ throw e }\n if(cb){ cb() }\n return;\n }});\n\n module.exports = SEA.decrypt;\n })(USE, './decrypt');\n\n ;USE(function(module){\n var SEA = USE('./root');\n var shim = USE('./shim');\n var S = USE('./settings');\n // Derive shared secret from other's pub and my epub/epriv \n SEA.secret = SEA.secret || (async (key, pair, cb, opt) => { try {\n opt = opt || {};\n if(!pair || !pair.epriv || !pair.epub){\n if(!SEA.I){ throw 'No secret mix.' }\n pair = await SEA.I(null, {what: key, how: 'secret', why: opt.why});\n }\n var pub = key.epub || key;\n var epub = pair.epub;\n var epriv = pair.epriv;\n var ecdhSubtle = shim.ossl || shim.subtle;\n var pubKeyData = keysToEcdhJwk(pub);\n var props = Object.assign({ public: await ecdhSubtle.importKey(...pubKeyData, true, []) },{name: 'ECDH', namedCurve: 'P-256'}); // Thanks to @sirpy !\n var privKeyData = keysToEcdhJwk(epub, epriv);\n var derived = await ecdhSubtle.importKey(...privKeyData, false, ['deriveBits']).then(async (privKey) => {\n // privateKey scope doesn't leak out from here!\n var derivedBits = await ecdhSubtle.deriveBits(props, privKey, 256);\n var rawBits = new Uint8Array(derivedBits);\n var derivedKey = await ecdhSubtle.importKey('raw', rawBits,{ name: 'AES-GCM', length: 256 }, true, [ 'encrypt', 'decrypt' ]);\n return ecdhSubtle.exportKey('jwk', derivedKey).then(({ k }) => k);\n })\n var r = derived;\n if(cb){ try{ cb(r) }catch(e){console.log(e)} }\n return r;\n } catch(e) {\n console.log(e);\n SEA.err = e;\n if(SEA.throw){ throw e }\n if(cb){ cb() }\n return;\n }});\n\n // can this be replaced with settings.jwk?\n var keysToEcdhJwk = (pub, d) => { // d === priv\n //var [ x, y ] = shim.Buffer.from(pub, 'base64').toString('utf8').split(':') // old\n var [ x, y ] = pub.split('.') // new\n var jwk = d ? { d: d } : {}\n return [ // Use with spread returned value...\n 'jwk',\n Object.assign(\n jwk,\n { x: x, y: y, kty: 'EC', crv: 'P-256', ext: true }\n ), // ??? refactor\n {name: 'ECDH', namedCurve: 'P-256'}\n ]\n }\n\n module.exports = SEA.secret;\n })(USE, './secret');\n\n ;USE(function(module){\n var SEA = USE('./root');\n // This is to certify that a group of \"certificants\" can \"put\" anything at a group of matched \"paths\" to the certificate authority's graph\n SEA.certify = SEA.certify || (async (certificants, policy = {}, authority, cb, opt = {}) => { try {\n /*\n The Certify Protocol was made out of love by a Vietnamese code enthusiast. Vietnamese people around the world deserve respect!\n IMPORTANT: A Certificate is like a Signature. No one knows who (authority) created/signed a cert until you put it into their graph.\n \"certificants\": '*' or a String (Bob.pub) || an Object that contains \"pub\" as a key || an array of [object || string]. These people will have the rights.\n \"policy\": A string ('inbox'), or a RAD/LEX object {'*': 'inbox'}, or an Array of RAD/LEX objects or strings. RAD/LEX object can contain key \"?\" with indexOf(\"*\") > -1 to force key equals certificant pub. This rule is used to check against soul+'/'+key using Gun.text.match or String.match.\n \"authority\": Key pair or priv of the certificate authority.\n \"cb\": A callback function after all things are done.\n \"opt\": If opt.expiry (a timestamp) is set, SEA won't sync data after opt.expiry. If opt.block is set, SEA will look for block before syncing.\n */\n console.log('SEA.certify() is an early experimental community supported method that may change API behavior without warning in any future version.')\n\n certificants = (() => {\n var data = []\n if (certificants) {\n if ((typeof certificants === 'string' || Array.isArray(certificants)) && certificants.indexOf('*') > -1) return '*'\n if (typeof certificants === 'string') return certificants\n if (Array.isArray(certificants)) {\n if (certificants.length === 1 && certificants[0]) return typeof certificants[0] === 'object' && certificants[0].pub ? certificants[0].pub : typeof certificants[0] === 'string' ? certificants[0] : null\n certificants.map(certificant => {\n if (typeof certificant ==='string') data.push(certificant)\n else if (typeof certificant === 'object' && certificant.pub) data.push(certificant.pub)\n })\n }\n\n if (typeof certificants === 'object' && certificants.pub) return certificants.pub\n return data.length > 0 ? data : null\n }\n return\n })()\n\n if (!certificants) return console.log(\"No certificant found.\")\n\n const expiry = opt.expiry && (typeof opt.expiry === 'number' || typeof opt.expiry === 'string') ? parseFloat(opt.expiry) : null\n const readPolicy = (policy || {}).read ? policy.read : null\n const writePolicy = (policy || {}).write ? policy.write : typeof policy === 'string' || Array.isArray(policy) || policy[\"+\"] || policy[\"#\"] || policy[\".\"] || policy[\"=\"] || policy[\"*\"] || policy[\">\"] || policy[\"<\"] ? policy : null\n // The \"blacklist\" feature is now renamed to \"block\". Why ? BECAUSE BLACK LIVES MATTER!\n // We can now use 3 keys: block, blacklist, ban\n const block = (opt || {}).block || (opt || {}).blacklist || (opt || {}).ban || {}\n const readBlock = block.read && (typeof block.read === 'string' || (block.read || {})['#']) ? block.read : null\n const writeBlock = typeof block === 'string' ? block : block.write && (typeof block.write === 'string' || block.write['#']) ? block.write : null\n\n if (!readPolicy && !writePolicy) return console.log(\"No policy found.\")\n\n // reserved keys: c, e, r, w, rb, wb\n const data = JSON.stringify({\n c: certificants,\n ...(expiry ? {e: expiry} : {}), // inject expiry if possible\n ...(readPolicy ? {r: readPolicy } : {}), // \"r\" stands for read, which means read permission.\n ...(writePolicy ? {w: writePolicy} : {}), // \"w\" stands for write, which means write permission.\n ...(readBlock ? {rb: readBlock} : {}), // inject READ block if possible\n ...(writeBlock ? {wb: writeBlock} : {}), // inject WRITE block if possible\n })\n\n const certificate = await SEA.sign(data, authority, null, {raw:1})\n\n var r = certificate\n if(!opt.raw){ r = 'SEA'+JSON.stringify(r) }\n if(cb){ try{ cb(r) }catch(e){console.log(e)} }\n return r;\n } catch(e) {\n SEA.err = e;\n if(SEA.throw){ throw e }\n if(cb){ cb() }\n return;\n }});\n\n module.exports = SEA.certify;\n })(USE, './certify');\n\n ;USE(function(module){\n var shim = USE('./shim');\n // Practical examples about usage found in tests.\n var SEA = USE('./root');\n SEA.work = USE('./work');\n SEA.sign = USE('./sign');\n SEA.verify = USE('./verify');\n SEA.encrypt = USE('./encrypt');\n SEA.decrypt = USE('./decrypt');\n SEA.certify = USE('./certify');\n //SEA.opt.aeskey = USE('./aeskey'); // not official! // this causes problems in latest WebCrypto.\n\n SEA.random = SEA.random || shim.random;\n\n // This is Buffer used in SEA and usable from Gun/SEA application also.\n // For documentation see https://nodejs.org/api/buffer.html\n SEA.Buffer = SEA.Buffer || USE('./buffer');\n\n // These SEA functions support now ony Promises or\n // async/await (compatible) code, use those like Promises.\n //\n // Creates a wrapper library around Web Crypto API\n // for various AES, ECDSA, PBKDF2 functions we called above.\n // Calculate public key KeyID aka PGPv4 (result: 8 bytes as hex string)\n SEA.keyid = SEA.keyid || (async (pub) => {\n try {\n // base64('base64(x):base64(y)') => shim.Buffer(xy)\n const pb = shim.Buffer.concat(\n pub.replace(/-/g, '+').replace(/_/g, '/').split('.')\n .map((t) => shim.Buffer.from(t, 'base64'))\n )\n // id is PGPv4 compliant raw key\n const id = shim.Buffer.concat([\n shim.Buffer.from([0x99, pb.length / 0x100, pb.length % 0x100]), pb\n ])\n const sha1 = await sha1hash(id)\n const hash = shim.Buffer.from(sha1, 'binary')\n return hash.toString('hex', hash.length - 8) // 16-bit ID as hex\n } catch (e) {\n console.log(e)\n throw e\n }\n });\n // all done!\n // Obviously it is missing MANY necessary features. This is only an alpha release.\n // Please experiment with it, audit what I've done so far, and complain about what needs to be added.\n // SEA should be a full suite that is easy and seamless to use.\n // Again, scroll naer the top, where I provide an EXAMPLE of how to create a user and sign in.\n // Once logged in, the rest of the code you just read handled automatically signing/validating data.\n // But all other behavior needs to be equally easy, like opinionated ways of\n // Adding friends (trusted public keys), sending private messages, etc.\n // Cheers! Tell me what you think.\n ((SEA.window||{}).GUN||{}).SEA = SEA;\n\n module.exports = SEA\n // -------------- END SEA MODULES --------------------\n // -- BEGIN SEA+GUN MODULES: BUNDLED BY DEFAULT UNTIL OTHERS USE SEA ON OWN -------\n })(USE, './sea');\n\n ;USE(function(module){\n var SEA = USE('./sea'), Gun, u;\n if(SEA.window){\n Gun = SEA.window.GUN || {chain:{}};\n } else {\n Gun = USE((u+'' == typeof MODULE?'.':'')+'./gun', 1);\n }\n SEA.GUN = Gun;\n\n function User(root){ \n this._ = {$: this};\n }\n User.prototype = (function(){ function F(){}; F.prototype = Gun.chain; return new F() }()) // Object.create polyfill\n User.prototype.constructor = User;\n\n // let's extend the gun chain with a `user` function.\n // only one user can be logged in at a time, per gun instance.\n Gun.chain.user = function(pub){\n var gun = this, root = gun.back(-1), user;\n if(pub){\n pub = SEA.opt.pub((pub._||'')['#']) || pub;\n return root.get('~'+pub);\n }\n if(user = root.back('user')){ return user }\n var root = (root._), at = root, uuid = at.opt.uuid || lex;\n (at = (user = at.user = gun.chain(new User))._).opt = {};\n at.opt.uuid = function(cb){\n var id = uuid(), pub = root.user;\n if(!pub || !(pub = pub.is) || !(pub = pub.pub)){ return id }\n id = '~' + pub + '/' + id;\n if(cb && cb.call){ cb(null, id) }\n return id;\n }\n return user;\n }\n function lex(){ return Gun.state().toString(36).replace('.','') }\n Gun.User = User;\n User.GUN = Gun;\n User.SEA = Gun.SEA = SEA;\n module.exports = User;\n })(USE, './user');\n\n ;USE(function(module){\n var u, Gun = (''+u != typeof window)? (window.Gun||{chain:{}}) : USE((''+u === typeof MODULE?'.':'')+'./gun', 1);\n Gun.chain.then = function(cb, opt){\n var gun = this, p = (new Promise(function(res, rej){\n gun.once(res, opt);\n }));\n return cb? p.then(cb) : p;\n }\n })(USE, './then');\n\n ;USE(function(module){\n var User = USE('./user'), SEA = User.SEA, Gun = User.GUN, noop = function(){};\n\n // Well first we have to actually create a user. That is what this function does.\n User.prototype.create = function(...args){\n var pair = typeof args[0] === 'object' && (args[0].pub || args[0].epub) ? args[0] : typeof args[1] === 'object' && (args[1].pub || args[1].epub) ? args[1] : null;\n var alias = pair && (pair.pub || pair.epub) ? pair.pub : typeof args[0] === 'string' ? args[0] : null;\n var pass = pair && (pair.pub || pair.epub) ? pair : alias && typeof args[1] === 'string' ? args[1] : null;\n var cb = args.filter(arg => typeof arg === 'function')[0] || null; // cb now can stand anywhere, after alias/pass or pair\n var opt = args && args.length > 1 && typeof args[args.length-1] === 'object' ? args[args.length-1] : {}; // opt is always the last parameter which typeof === 'object' and stands after cb\n \n var gun = this, cat = (gun._), root = gun.back(-1);\n cb = cb || noop;\n opt = opt || {};\n if(false !== opt.check){\n var err;\n if(!alias){ err = \"No user.\" }\n if((pass||'').length < 8){ err = \"Password too short!\" }\n if(err){\n cb({err: Gun.log(err)});\n return gun;\n }\n }\n if(cat.ing){\n (cb || noop)({err: Gun.log(\"User is already being created or authenticated!\"), wait: true});\n return gun;\n }\n cat.ing = true;\n var act = {}, u;\n act.a = function(pubs){\n act.pubs = pubs;\n if(pubs && !opt.already){\n // If we can enforce that a user name is already taken, it might be nice to try, but this is not guaranteed.\n var ack = {err: Gun.log('User already created!')};\n cat.ing = false;\n (cb || noop)(ack);\n gun.leave();\n return;\n }\n act.salt = String.random(64); // pseudo-randomly create a salt, then use PBKDF2 function to extend the password with it.\n SEA.work(pass, act.salt, act.b); // this will take some short amount of time to produce a proof, which slows brute force attacks.\n }\n act.b = function(proof){\n act.proof = proof;\n pair ? act.c(pair) : SEA.pair(act.c) // generate a brand new key pair or use the existing.\n }\n act.c = function(pair){\n var tmp\n act.pair = pair || {};\n if(tmp = cat.root.user){\n tmp._.sea = pair;\n tmp.is = {pub: pair.pub, epub: pair.epub, alias: alias};\n }\n // the user's public key doesn't need to be signed. But everything else needs to be signed with it! // we have now automated it! clean up these extra steps now!\n act.data = {pub: pair.pub};\n act.d();\n }\n act.d = function(){\n act.data.alias = alias;\n act.e();\n }\n act.e = function(){\n act.data.epub = act.pair.epub; \n SEA.encrypt({priv: act.pair.priv, epriv: act.pair.epriv}, act.proof, act.f, {raw:1}); // to keep the private key safe, we AES encrypt it with the proof of work!\n }\n act.f = function(auth){\n act.data.auth = JSON.stringify({ek: auth, s: act.salt}); \n act.g(act.data.auth);\n }\n act.g = function(auth){ var tmp;\n act.data.auth = act.data.auth || auth;\n root.get(tmp = '~'+act.pair.pub).put(act.data).on(act.h); // awesome, now we can actually save the user with their public key as their ID.\n var link = {}; link[tmp] = {'#': tmp}; root.get('~@'+alias).put(link).get(tmp).on(act.i); // next up, we want to associate the alias with the public key. So we add it to the alias list.\n }\n act.h = function(data, key, msg, eve){\n eve.off(); act.h.ok = 1; act.i();\n }\n act.i = function(data, key, msg, eve){\n if(eve){ act.i.ok = 1; eve.off() }\n if(!act.h.ok || !act.i.ok){ return }\n cat.ing = false;\n cb({ok: 0, pub: act.pair.pub}); // callback that the user has been created. (Note: ok = 0 because we didn't wait for disk to ack)\n if(noop === cb){ pair ? gun.auth(pair) : gun.auth(alias, pass) } // if no callback is passed, auto-login after signing up.\n }\n root.get('~@'+alias).once(act.a);\n return gun;\n }\n User.prototype.leave = function(opt, cb){\n var gun = this, user = (gun.back(-1)._).user;\n if(user){\n delete user.is;\n delete user._.is;\n delete user._.sea;\n }\n if(SEA.window){\n try{var sS = {};\n sS = window.sessionStorage;\n delete sS.recall;\n delete sS.pair;\n }catch(e){};\n }\n return gun;\n }\n })(USE, './create');\n\n ;USE(function(module){\n var User = USE('./user'), SEA = User.SEA, Gun = User.GUN, noop = function(){};\n // now that we have created a user, we want to authenticate them!\n User.prototype.auth = function(...args){ // TODO: this PR with arguments need to be cleaned up / refactored.\n var pair = typeof args[0] === 'object' && (args[0].pub || args[0].epub) ? args[0] : typeof args[1] === 'object' && (args[1].pub || args[1].epub) ? args[1] : null;\n var alias = !pair && typeof args[0] === 'string' ? args[0] : null;\n var pass = (alias || (pair && !(pair.priv && pair.epriv))) && typeof args[1] === 'string' ? args[1] : null;\n var cb = args.filter(arg => typeof arg === 'function')[0] || null; // cb now can stand anywhere, after alias/pass or pair\n var opt = args && args.length > 1 && typeof args[args.length-1] === 'object' ? args[args.length-1] : {}; // opt is always the last parameter which typeof === 'object' and stands after cb\n \n var gun = this, cat = (gun._), root = gun.back(-1);\n \n if(cat.ing){\n (cb || noop)({err: Gun.log(\"User is already being created or authenticated!\"), wait: true});\n return gun;\n }\n cat.ing = true;\n \n var act = {}, u, tries = 9;\n act.a = function(data){\n if(!data){ return act.b() }\n if(!data.pub){\n var tmp = []; Object.keys(data).forEach(function(k){ if('_'==k){ return } tmp.push(data[k]) })\n return act.b(tmp);\n }\n if(act.name){ return act.f(data) }\n act.c((act.data = data).auth);\n }\n act.b = function(list){\n var get = (act.list = (act.list||[]).concat(list||[])).shift();\n if(u === get){\n if(act.name){ return act.err('Your user account is not published for dApps to access, please consider syncing it online, or allowing local access by adding your device as a peer.') }\n if(alias && tries--){\n root.get('~@'+alias).once(act.a);\n return;\n }\n return act.err('Wrong user or password.') \n }\n root.get(get).once(act.a);\n }\n act.c = function(auth){\n if(u === auth){ return act.b() }\n if('string' == typeof auth){ return act.c(obj_ify(auth)) } // in case of legacy\n SEA.work(pass, (act.auth = auth).s, act.d, act.enc); // the proof of work is evidence that we've spent some time/effort trying to log in, this slows brute force.\n }\n act.d = function(proof){\n SEA.decrypt(act.auth.ek, proof, act.e, act.enc);\n }\n act.e = function(half){\n if(u === half){\n if(!act.enc){ // try old format\n act.enc = {encode: 'utf8'};\n return act.c(act.auth);\n } act.enc = null; // end backwards\n return act.b();\n }\n act.half = half;\n act.f(act.data);\n }\n act.f = function(pair){\n var half = act.half || {}, data = act.data || {};\n act.g(act.lol = {pub: pair.pub || data.pub, epub: pair.epub || data.epub, priv: pair.priv || half.priv, epriv: pair.epriv || half.epriv});\n }\n act.g = function(pair){\n if(!pair || !pair.pub || !pair.epub){ return act.b() }\n act.pair = pair;\n var user = (root._).user, at = (user._);\n var tmp = at.tag;\n var upt = at.opt;\n at = user._ = root.get('~'+pair.pub)._;\n at.opt = upt;\n // add our credentials in-memory only to our root user instance\n user.is = {pub: pair.pub, epub: pair.epub, alias: alias || pair.pub};\n at.sea = act.pair;\n cat.ing = false;\n try{if(pass && u == (obj_ify(cat.root.graph['~'+pair.pub].auth)||'')[':']){ opt.shuffle = opt.change = pass; } }catch(e){} // migrate UTF8 & Shuffle!\n opt.change? act.z() : (cb || noop)(at);\n if(SEA.window && ((gun.back('user')._).opt||opt).remember){\n // TODO: this needs to be modular.\n try{var sS = {};\n sS = window.sessionStorage; // TODO: FIX BUG putting on `.is`!\n sS.recall = true;\n sS.pair = JSON.stringify(pair); // auth using pair is more reliable than alias/pass\n }catch(e){}\n }\n try{\n if(root._.tag.auth){ // auth handle might not be registered yet\n (root._).on('auth', at) // TODO: Deprecate this, emit on user instead! Update docs when you do.\n } else { setTimeout(function(){ (root._).on('auth', at) },1) } // if not, hackily add a timeout.\n //at.on('auth', at) // Arrgh, this doesn't work without event \"merge\" code, but \"merge\" code causes stack overflow and crashes after logging in & trying to write data.\n }catch(e){\n Gun.log(\"Your 'auth' callback crashed with:\", e);\n }\n }\n act.h = function(data){\n if(!data){ return act.b() }\n alias = data.alias\n if(!alias)\n alias = data.alias = \"~\" + pair.pub \n if(!data.auth){\n return act.g(pair);\n }\n pair = null;\n act.c((act.data = data).auth);\n }\n act.z = function(){\n // password update so encrypt private key using new pwd + salt\n act.salt = String.random(64); // pseudo-random\n SEA.work(opt.change, act.salt, act.y);\n }\n act.y = function(proof){\n SEA.encrypt({priv: act.pair.priv, epriv: act.pair.epriv}, proof, act.x, {raw:1});\n }\n act.x = function(auth){\n act.w(JSON.stringify({ek: auth, s: act.salt}));\n }\n act.w = function(auth){\n if(opt.shuffle){ // delete in future!\n console.log('migrate core account from UTF8 & shuffle');\n var tmp = {}; Object.keys(act.data).forEach(function(k){ tmp[k] = act.data[k] });\n delete tmp._;\n tmp.auth = auth;\n root.get('~'+act.pair.pub).put(tmp);\n } // end delete\n root.get('~'+act.pair.pub).get('auth').put(auth, cb || noop);\n }\n act.err = function(e){\n var ack = {err: Gun.log(e || 'User cannot be found!')};\n cat.ing = false;\n (cb || noop)(ack);\n }\n act.plugin = function(name){\n if(!(act.name = name)){ return act.err() }\n var tmp = [name];\n if('~' !== name[0]){\n tmp[1] = '~'+name;\n tmp[2] = '~@'+name;\n }\n act.b(tmp);\n }\n if(pair){\n if(pair.priv && pair.epriv)\n act.g(pair);\n else\n root.get('~'+pair.pub).once(act.h);\n } else\n if(alias){\n root.get('~@'+alias).once(act.a);\n } else\n if(!alias && !pass){\n SEA.name(act.plugin);\n }\n return gun;\n }\n function obj_ify(o){\n if('string' != typeof o){ return o }\n try{o = JSON.parse(o);\n }catch(e){o={}};\n return o;\n }\n })(USE, './auth');\n\n ;USE(function(module){\n var User = USE('./user'), SEA = User.SEA, Gun = User.GUN;\n User.prototype.recall = function(opt, cb){\n var gun = this, root = gun.back(-1), tmp;\n opt = opt || {};\n if(opt && opt.sessionStorage){\n if(SEA.window){\n try{\n var sS = {};\n sS = window.sessionStorage; // TODO: FIX BUG putting on `.is`!\n if(sS){\n (root._).opt.remember = true;\n ((gun.back('user')._).opt||opt).remember = true;\n if(sS.recall || sS.pair) root.user().auth(JSON.parse(sS.pair), cb); // pair is more reliable than alias/pass\n }\n }catch(e){}\n }\n return gun;\n }\n /*\n TODO: copy mhelander's expiry code back in.\n Although, we should check with community,\n should expiry be core or a plugin?\n */\n return gun;\n }\n })(USE, './recall');\n\n ;USE(function(module){\n var User = USE('./user'), SEA = User.SEA, Gun = User.GUN, noop = function(){};\n User.prototype.pair = function(){\n var user = this, proxy; // undeprecated, hiding with proxies.\n try{ proxy = new Proxy({DANGER:'\\u2620'}, {get: function(t,p,r){\n if(!user.is || !(user._||'').sea){ return }\n return user._.sea[p];\n }})}catch(e){}\n return proxy;\n }\n // If authenticated user wants to delete his/her account, let's support it!\n User.prototype.delete = async function(alias, pass, cb){\n console.log(\"user.delete() IS DEPRECATED AND WILL BE MOVED TO A MODULE!!!\");\n var gun = this, root = gun.back(-1), user = gun.back('user');\n try {\n user.auth(alias, pass, function(ack){\n var pub = (user.is||{}).pub;\n // Delete user data\n user.map().once(function(){ this.put(null) });\n // Wipe user data from memory\n user.leave();\n (cb || noop)({ok: 0});\n });\n } catch (e) {\n Gun.log('User.delete failed! Error:', e);\n }\n return gun;\n }\n User.prototype.alive = async function(){\n console.log(\"user.alive() IS DEPRECATED!!!\");\n const gunRoot = this.back(-1)\n try {\n // All is good. Should we do something more with actual recalled data?\n await authRecall(gunRoot)\n return gunRoot._.user._\n } catch (e) {\n const err = 'No session!'\n Gun.log(err)\n throw { err }\n }\n }\n User.prototype.trust = async function(user){\n console.log(\"`.trust` API MAY BE DELETED OR CHANGED OR RENAMED, DO NOT USE!\");\n // TODO: BUG!!! SEA `node` read listener needs to be async, which means core needs to be async too.\n //gun.get('alice').get('age').trust(bob);\n if (Gun.is(user)) {\n user.get('pub').get((ctx, ev) => {\n console.log(ctx, ev)\n })\n }\n user.get('trust').get(path).put(theirPubkey);\n\n // do a lookup on this gun chain directly (that gets bob's copy of the data)\n // do a lookup on the metadata trust table for this path (that gets all the pubkeys allowed to write on this path)\n // do a lookup on each of those pubKeys ON the path (to get the collab data \"layers\")\n // THEN you perform Jachen's mix operation\n // and return the result of that to...\n }\n User.prototype.grant = function(to, cb){\n console.log(\"`.grant` API MAY BE DELETED OR CHANGED OR RENAMED, DO NOT USE!\");\n var gun = this, user = gun.back(-1).user(), pair = user._.sea, path = '';\n gun.back(function(at){ if(at.is){ return } path += (at.get||'') });\n (async function(){\n var enc, sec = await user.get('grant').get(pair.pub).get(path).then();\n sec = await SEA.decrypt(sec, pair);\n if(!sec){\n sec = SEA.random(16).toString();\n enc = await SEA.encrypt(sec, pair);\n user.get('grant').get(pair.pub).get(path).put(enc);\n }\n var pub = to.get('pub').then();\n var epub = to.get('epub').then();\n pub = await pub; epub = await epub;\n var dh = await SEA.secret(epub, pair);\n enc = await SEA.encrypt(sec, dh);\n user.get('grant').get(pub).get(path).put(enc, cb);\n }());\n return gun;\n }\n User.prototype.secret = function(data, cb){\n console.log(\"`.secret` API MAY BE DELETED OR CHANGED OR RENAMED, DO NOT USE!\");\n var gun = this, user = gun.back(-1).user(), pair = user.pair(), path = '';\n gun.back(function(at){ if(at.is){ return } path += (at.get||'') });\n (async function(){\n var enc, sec = await user.get('trust').get(pair.pub).get(path).then();\n sec = await SEA.decrypt(sec, pair);\n if(!sec){\n sec = SEA.random(16).toString();\n enc = await SEA.encrypt(sec, pair);\n user.get('trust').get(pair.pub).get(path).put(enc);\n }\n enc = await SEA.encrypt(data, sec);\n gun.put(enc, cb);\n }());\n return gun;\n }\n\n /**\n * returns the decrypted value, encrypted by secret\n * @returns {Promise}\n // Mark needs to review 1st before officially supported\n User.prototype.decrypt = function(cb) {\n let gun = this,\n path = ''\n gun.back(function(at) {\n if (at.is) {\n return\n }\n path += at.get || ''\n })\n return gun\n .then(async data => {\n if (data == null) {\n return\n }\n const user = gun.back(-1).user()\n const pair = user.pair()\n let sec = await user\n .get('trust')\n .get(pair.pub)\n .get(path)\n sec = await SEA.decrypt(sec, pair)\n if (!sec) {\n return data\n }\n let decrypted = await SEA.decrypt(data, sec)\n return decrypted\n })\n .then(res => {\n cb && cb(res)\n return res\n })\n }\n */\n module.exports = User\n })(USE, './share');\n\n ;USE(function(module){\n var SEA = USE('./sea'), S = USE('./settings'), noop = function() {}, u;\n var Gun = (''+u != typeof window)? (window.Gun||{on:noop}) : USE((''+u === typeof MODULE?'.':'')+'./gun', 1);\n // After we have a GUN extension to make user registration/login easy, we then need to handle everything else.\n\n // We do this with a GUN adapter, we first listen to when a gun instance is created (and when its options change)\n Gun.on('opt', function(at){\n if(!at.sea){ // only add SEA once per instance, on the \"at\" context.\n at.sea = {own: {}};\n at.on('put', check, at); // SEA now runs its firewall on HAM diffs, not all i/o.\n }\n this.to.next(at); // make sure to call the \"next\" middleware adapter.\n });\n\n // Alright, this next adapter gets run at the per node level in the graph database.\n // correction: 2020 it gets run on each key/value pair in a node upon a HAM diff.\n // This will let us verify that every property on a node has a value signed by a public key we trust.\n // If the signature does not match, the data is just `undefined` so it doesn't get passed on.\n // If it does match, then we transform the in-memory \"view\" of the data into its plain value (without the signature).\n // Now NOTE! Some data is \"system\" data, not user data. Example: List of public keys, aliases, etc.\n // This data is self-enforced (the value can only match its ID), but that is handled in the `security` function.\n // From the self-enforced data, we can see all the edges in the graph that belong to a public key.\n // Example: ~ASDF is the ID of a node with ASDF as its public key, signed alias and salt, and\n // its encrypted private key, but it might also have other signed values on it like `profile = ` edge.\n // Using that directed edge's ID, we can then track (in memory) which IDs belong to which keys.\n // Here is a problem: Multiple public keys can \"claim\" any node's ID, so this is dangerous!\n // This means we should ONLY trust our \"friends\" (our key ring) public keys, not any ones.\n // I have not yet added that to SEA yet in this alpha release. That is coming soon, but beware in the meanwhile!\n\n function check(msg){ // REVISE / IMPROVE, NO NEED TO PASS MSG/EVE EACH SUB?\n var eve = this, at = eve.as, put = msg.put, soul = put['#'], key = put['.'], val = put[':'], state = put['>'], id = msg['#'], tmp;\n if(!soul || !key){ return }\n if((msg._||'').faith && (at.opt||'').faith && 'function' == typeof msg._){\n SEA.opt.pack(put, function(raw){\n SEA.verify(raw, false, function(data){ // this is synchronous if false\n put['='] = SEA.opt.unpack(data);\n eve.to.next(msg);\n })})\n return \n }\n var no = function(why){ at.on('in', {'@': id, err: msg.err = why}) }; // exploit internal relay stun for now, maybe violates spec, but testing for now. // Note: this may be only the sharded message, not original batch.\n //var no = function(why){ msg.ack(why) };\n (msg._||'').DBG && ((msg._||'').DBG.c = +new Date);\n if(0 <= soul.indexOf(' {\n if (certificate.m && certificate.s && certificant && pub)\n // now verify certificate\n return SEA.verify(certificate, pub, data => { // check if \"pub\" (of the graph owner) really issued this cert\n if (u !== data && u !== data.e && msg.put['>'] && msg.put['>'] > parseFloat(data.e)) return no(\"Certificate expired.\") // certificate expired\n // \"data.c\" = a list of certificants/certified users\n // \"data.w\" = lex WRITE permission, in the future, there will be \"data.r\" which means lex READ permission\n if (u !== data && data.c && data.w && (data.c === certificant || data.c.indexOf('*' || certificant) > -1)) {\n // ok, now \"certificant\" is in the \"certificants\" list, but is \"path\" allowed? Check path\n let path = soul.indexOf('/') > -1 ? soul.replace(soul.substring(0, soul.indexOf('/') + 1), '') : ''\n String.match = String.match || Gun.text.match\n const w = Array.isArray(data.w) ? data.w : typeof data.w === 'object' || typeof data.w === 'string' ? [data.w] : []\n for (const lex of w) {\n if ((String.match(path, lex['#']) && String.match(key, lex['.'])) || (!lex['.'] && String.match(path, lex['#'])) || (!lex['#'] && String.match(key, lex['.'])) || String.match((path ? path + '/' + key : key), lex['#'] || lex)) {\n // is Certificant forced to present in Path\n if (lex['+'] && lex['+'].indexOf('*') > -1 && path && path.indexOf(certificant) == -1 && key.indexOf(certificant) == -1) return no(`Path \"${path}\" or key \"${key}\" must contain string \"${certificant}\".`)\n // path is allowed, but is there any WRITE block? Check it out\n if (data.wb && (typeof data.wb === 'string' || ((data.wb || {})['#']))) { // \"data.wb\" = path to the WRITE block\n var root = eve.as.root.$.back(-1)\n if (typeof data.wb === 'string' && '~' !== data.wb.slice(0, 1)) root = root.get('~' + pub)\n return root.get(data.wb).get(certificant).once(value => { // TODO: INTENT TO DEPRECATE.\n if (value && (value === 1 || value === true)) return no(`Certificant ${certificant} blocked.`)\n return cb(data)\n })\n }\n return cb(data)\n }\n }\n return no(\"Certificate verification fail.\")\n }\n })\n return\n }\n \n if ('pub' === key && '~' + pub === soul) {\n if (val === pub) return eve.to.next(msg) // the account MUST match `pub` property that equals the ID of the public key.\n return no(\"Account not same!\")\n }\n\n if ((tmp = user.is) && tmp.pub && !raw['*'] && !raw['+'] && (pub === tmp.pub || (pub !== tmp.pub && ((msg._.msg || {}).opt || {}).cert))){\n SEA.opt.pack(msg.put, packed => {\n SEA.sign(packed, (user._).sea, async function(data) {\n if (u === data) return no(SEA.err || 'Signature fail.')\n msg.put[':'] = {':': tmp = SEA.opt.unpack(data.m), '~': data.s}\n msg.put['='] = tmp\n \n // if writing to own graph, just allow it\n if (pub === user.is.pub) {\n if (tmp = link_is(val)) (at.sea.own[tmp] = at.sea.own[tmp] || {})[pub] = 1\n JSON.stringifyAsync(msg.put[':'], function(err,s){\n if(err){ return no(err || \"Stringify error.\") }\n msg.put[':'] = s;\n return eve.to.next(msg);\n })\n return\n }\n \n // if writing to other's graph, check if cert exists then try to inject cert into put, also inject self pub so that everyone can verify the put\n if (pub !== user.is.pub && ((msg._.msg || {}).opt || {}).cert) {\n const cert = await S.parse(msg._.msg.opt.cert)\n // even if cert exists, we must verify it\n if (cert && cert.m && cert.s)\n verify(cert, user.is.pub, _ => {\n msg.put[':']['+'] = cert // '+' is a certificate\n msg.put[':']['*'] = user.is.pub // '*' is pub of the user who puts\n JSON.stringifyAsync(msg.put[':'], function(err,s){\n if(err){ return no(err || \"Stringify error.\") }\n msg.put[':'] = s;\n return eve.to.next(msg);\n })\n return\n })\n }\n }, {raw: 1})\n })\n return;\n }\n\n SEA.opt.pack(msg.put, packed => {\n SEA.verify(packed, raw['*'] || pub, function(data){ var tmp;\n data = SEA.opt.unpack(data);\n if (u === data) return no(\"Unverified data.\") // make sure the signature matches the account it claims to be on. // reject any updates that are signed with a mismatched account.\n if ((tmp = link_is(data)) && pub === SEA.opt.pub(tmp)) (at.sea.own[tmp] = at.sea.own[tmp] || {})[pub] = 1\n \n // check if cert ('+') and putter's pub ('*') exist\n if (raw['+'] && raw['+']['m'] && raw['+']['s'] && raw['*'])\n // now verify certificate\n verify(raw['+'], raw['*'], _ => {\n msg.put['='] = data;\n return eve.to.next(msg);\n })\n else {\n msg.put['='] = data;\n return eve.to.next(msg);\n }\n });\n })\n return\n };\n check.any = function(eve, msg, val, key, soul, at, no, user){ var tmp, pub;\n if(at.opt.secure){ return no(\"Soul missing public key at '\" + key + \"'.\") }\n // TODO: Ask community if should auto-sign non user-graph data.\n at.on('secure', function(msg){ this.off();\n if(!at.opt.secure){ return eve.to.next(msg) }\n no(\"Data cannot be changed.\");\n }).on.on('secure', msg);\n return;\n }\n\n var valid = Gun.valid, link_is = function(d,l){ return 'string' == typeof (l = valid(d)) && l }, state_ify = (Gun.state||'').ify;\n\n var pubcut = /[^\\w_-]/; // anything not alphanumeric or _ -\n SEA.opt.pub = function(s){\n if(!s){ return }\n s = s.split('~');\n if(!s || !(s = s[1])){ return }\n s = s.split(pubcut).slice(0,2);\n if(!s || 2 != s.length){ return }\n if('@' === (s[0]||'')[0]){ return }\n s = s.slice(0,2).join('.');\n return s;\n }\n SEA.opt.stringy = function(t){\n // TODO: encrypt etc. need to check string primitive. Make as breaking change.\n }\n SEA.opt.pack = function(d,cb,k, n,s){ var tmp, f; // pack for verifying\n if(SEA.opt.check(d)){ return cb(d) }\n if(d && d['#'] && d['.'] && d['>']){ tmp = d[':']; f = 1 }\n JSON.parseAsync(f? tmp : d, function(err, meta){\n var sig = ((u !== (meta||'')[':']) && (meta||'')['~']); // or just ~ check?\n if(!sig){ cb(d); return }\n cb({m: {'#':s||d['#'],'.':k||d['.'],':':(meta||'')[':'],'>':d['>']||Gun.state.is(n, k)}, s: sig});\n });\n }\n var O = SEA.opt;\n SEA.opt.unpack = function(d, k, n){ var tmp;\n if(u === d){ return }\n if(d && (u !== (tmp = d[':']))){ return tmp }\n k = k || O.fall_key; if(!n && O.fall_val){ n = {}; n[k] = O.fall_val }\n if(!k || !n){ return }\n if(d === n[k]){ return d }\n if(!SEA.opt.check(n[k])){ return d }\n var soul = (n && n._ && n._['#']) || O.fall_soul, s = Gun.state.is(n, k) || O.fall_state;\n if(d && 4 === d.length && soul === d[0] && k === d[1] && fl(s) === fl(d[3])){\n return d[2];\n }\n if(s < SEA.opt.shuffle_attack){\n return d;\n }\n }\n SEA.opt.shuffle_attack = 1546329600000; // Jan 1, 2019\n var fl = Math.floor; // TODO: Still need to fix inconsistent state issue.\n // TODO: Potential bug? If pub/priv key starts with `-`? IDK how possible.\n\n })(USE, './index');\n}());\n","// I don't quite know where this should go yet, so putting it here\n// what will probably wind up happening is that minimal AXE logic added to end of gun.js\n// and then rest of AXE logic (here) will be moved back to gun/axe.js\n// but for now... I gotta rush this out!\nvar Gun = (typeof window !== \"undefined\")? window.Gun : require('../gun'), u;\nGun.on('opt', function(at){ start(at); this.to.next(at) }); // make sure to call the \"next\" middleware adapter.\n// TODO: BUG: panic test/panic/1 & test/panic/3 fail when AXE is on.\nfunction start(root){\n\tif(root.axe){ return }\n\tvar opt = root.opt, peers = opt.peers;\n\tif(false === opt.axe){ return }\n\tif((typeof process !== \"undefined\") && 'false' === ''+(process.env||'').AXE){ return }\n\tGun.log.once(\"AXE\", \"AXE relay enabled!\");\n\tvar axe = root.axe = {}, tmp, id;\n\tvar mesh = opt.mesh = opt.mesh || Gun.Mesh(root); // DAM!\n\tvar dup = root.dup;\n\n\tmesh.way = function(msg){\n\t\tif(!msg){ return }\n\t\t//relayUp(msg); // TEMPORARY!!!\n\t\tif(msg.get){ return GET(msg) }\n\t\tif(msg.put){ return }\n\t\tfall(msg);\n\t}\n\n\tfunction GET(msg){\n\t\tif(!msg){ return }\n\t\tvar via = (msg._||'').via, soul, has, tmp, ref;\n\t\tif(!via || !via.id){ return fall(msg) }\n\t\t// SUBSCRIPTION LOGIC MOVED TO GET'S ACK REPLY.\n\t\tif(!(ref = REF(msg)._)){ return fall(msg) }\n\t\tref.asked = +new Date;\n\t\tGET.turn(msg, ref.route, 0);\n\t}\n\tGET.turn = function(msg, route, turn){\n\t\tvar tmp = msg['#'], tag = dup.s[tmp], next; \n\t\tif(!tmp || !tag){ return } // message timed out, GUN may require us to relay, tho AXE does not like that. Rethink?\n\t\t// TOOD: BUG! Handle edge case where live updates occur while these turn hashes are being checked (they'll never be consistent), but we don't want to degrade to O(N), if we know the via asking peer got an update, then we should do something like cancel these turns asking for data.\n\t\t// Ideas: Save a random seed that sorts the route, store it and the index. // Or indexing on lowest latency is probably better.\n\t\tclearTimeout(tag.lack);\n\t\tif(tag.ack && (tmp = tag['##']) && msg['##'] === tmp){ return } // hashes match, stop asking other peers!\n\t\tnext = (Object.maps(route||opt.peers)).slice(turn = turn || 0);\n\t\tif(!next.length){\n\t\t\tif(!route){ return } // asked all peers, stop asking!\n\t\t\tGET.turn(msg, u, 0); // asked all subs, now now ask any peers. (not always the best idea, but stays )\n\t\t\treturn;\n\t\t}\n\t\tsetTimeout.each(next, function(id){\n\t\t\tvar peer = opt.peers[id]; turn++;\n\t\t\tif(!peer || !peer.wire){ route && route.delete(id); return } // bye! // TODO: CHECK IF 0 OTHER PEERS & UNSUBSCRIBE\n\t\t\tif(mesh.say(msg, peer) === false){ return } // was self\n\t\t\tif(0 == (turn % 3)){ return 1 }\n\t\t}, function(){\n\t\t\ttag['##'] = msg['##']; // should probably set this in a more clever manner, do live `in` checks ++ --, etc. but being lazy for now. // TODO: Yes, see `in` TODO, currently this might match against only in-mem cause no other peers reply, which is \"fine\", but could cause a false positive.\n\t\t\ttag.lack = setTimeout(function(){ GET.turn(msg, route, turn) }, 25);\n\t\t}, 3);\n\t}\n\tfunction fall(msg){ mesh.say(msg, opt.peers) }\n\tfunction REF(msg){\n\t\tvar ref = '', soul, has, tmp;\n\t\tif(!msg || !msg.get){ return ref }\n\t\tif('string' == typeof (soul = msg.get['#'])){ ref = root.$.get(soul) }\n\t\tif('string' == typeof (tmp = msg.get['.'])){ has = tmp } else { has = '' }\n\t\treturn ref;\n\t}\n\tfunction LEX(lex){ return (lex = lex || '')['='] || lex['*'] || lex['>'] || lex }\n\t\n\troot.on('in', function(msg){ var to = this.to, tmp;\n\t\tif((tmp = msg['@']) && (tmp = dup.s[tmp])){\n\t\t\ttmp.ack = (tmp.ack || 0) + 1; // count remote ACKs to GET. // TODO: If mismatch, should trigger next asks.\n\t\t\tif(tmp.it && tmp.it.get && msg.put){ // WHEN SEEING A PUT REPLY TO A GET...\n\t\t\t\tvar get = tmp.it.get||'', ref = REF(tmp.it)._, via = (tmp.it._||'').via||'', sub;\n\t\t\t\tif(via && ref){ // SUBSCRIBE THE PEER WHO ASKED VIA FOR IT:\n\t\t\t\t\t//console.log(\"SUBSCRIBING\", Object.maps(ref.route||''), \"to\", LEX(get['#']));\n\t\t\t\t\tvia.id && (ref.route || (ref.route = new Object.Map)).set(via.id, via);\n\t\t\t\t\tsub = (via.sub || (via.sub = new Object.Map));\n\t\t\t\t\tref && (sub.get(LEX(get['#'])) || (sub.set(LEX(get['#']), sub = new Object.Map) && sub)).set(LEX(get['.']), 1); // {soul: {'':1, has: 1}}\n\n\t\t\t\t\tvia = (msg._||'').via||'';\n\t\t\t\t\tif(via){ // BIDIRECTIONAL SUBSCRIBE: REPLIER IS NOW SUBSCRIBED. DO WE WANT THIS?\n\t\t\t\t\t\tvia.id && (ref.route || (ref.route = new Object.Map)).set(via.id, via);\n\t\t\t\t\t\tsub = (via.sub || (via.sub = new Object.Map));\n\t\t\t\t\t\tif(ref){\n\t\t\t\t\t\t\tvar soul = LEX(get['#']), sift = sub.get(soul), has = LEX(get['.']);\n\t\t\t\t\t\t\tif(has){\n\t\t\t\t\t\t\t\t(sift || (sub.set(soul, sift = new Object.Map) && sift)).set(has, 1);\n\t\t\t\t\t\t\t} else\n\t\t\t\t\t\t\tif(!sift){\n\t\t\t\t\t\t\t\tsub.set(soul, sift = new Object.Map);\n\t\t\t\t\t\t\t\tsift.set('', 1);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif((tmp = tmp.back)){ // backtrack OKs since AXE splits PUTs up.\n\t\t\t\tsetTimeout.each(Object.keys(tmp), function(id){\n\t\t\t\t\tto.next({'#': msg['#'], '@': id, ok: msg.ok});\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tto.next(msg);\n\t});\n\n\troot.on('create', function(root){\n\t\tthis.to.next(root);\n\t\tvar Q = {};\n\t\troot.on('put', function(msg){\n\t\t\tvar eve = this, at = eve.as, put = msg.put, soul = put['#'], has = put['.'], val = put[':'], state = put['>'], q, tmp;\n\t\t\teve.to.next(msg);\n\t\t\tif(msg['@']){ return } // acks send existing data, not updates, so no need to resend to others.\n\t\t\tif(!soul || !has){ return }\n\t\t\tvar ref = root.$.get(soul)._, route = (ref||'').route;\n\t\t\tif(!route){ return }\n\t\t\tif(ref.skip){ ref.skip.now = msg['#']; return }\n\t\t\t(ref.skip = {now: msg['#']}).to = setTimeout(function(){\n\t\t\tsetTimeout.each(Object.maps(route), function(pid){ var peer, tmp;\n\t\t\t\tvar skip = ref.skip||''; ref.skip = null;\n\t\t\t\tif(!(peer = route.get(pid))){ return }\n\t\t\t\tif(!peer.wire){ route.delete(pid); return } // bye!\n\t\t\t\tvar sub = (peer.sub || (peer.sub = new Object.Map)).get(soul);\n\t\t\t\tif(!sub){ return }\n\t\t\t\tif(!sub.get(has) && !sub.get('')){ return }\n\t\t\t\tvar put = peer.put || (peer.put = {});\n\t\t\t\tvar node = root.graph[soul], tmp;\n\t\t\t\tif(node && u !== (tmp = node[has])){\n\t\t\t\t\tstate = state_is(node, has);\n\t\t\t\t\tval = tmp;\n\t\t\t\t}\n\t\t\t\tput[soul] = state_ify(put[soul], has, state, val, soul);\n\t\t\t\ttmp = dup.track(peer.next = peer.next || String.random(9));\n\t\t\t\t(tmp.back || (tmp.back = {}))[''+skip.now||msg['#']] = 1;\n\t\t\t\tif(peer.to){ return }\n\t\t\t\tpeer.to = setTimeout(function(){ flush(peer) }, opt.gap);\n\t\t\t}) }, 9);\n\t\t});\n\t});\n\n\tfunction flush(peer){\n\t\tvar msg = {'#': peer.next, put: peer.put, ok: {'@': 3, '/': mesh.near}}; // BUG: TODO: sub count!\n\t\t// TODO: what about DAM's >< dedup? Current thinking is, don't use it, however, you could store first msg# & latest msg#, and if here... latest === first then likely it is the same >< thing, so if(firstMsg['><'][peer.id]){ return } don't send.\n\t\tpeer.next = peer.put = peer.to = null;\n\t\tmesh.say(msg, peer);\n\t}\n\tvar state_ify = Gun.state.ify, state_is = Gun.state.is;\n\n\tfunction relayUp(msg){\n\t\tmesh.say(msg, axe.up);\n\t}\n\n\t;(function(){ // THIS IS THE UP MODULE;\n\t\taxe.up = {};\n\t\tvar hi = mesh.hear['?']; // lower-level integration with DAM! This is abnormal but helps performance.\n\t\tmesh.hear['?'] = function(msg, peer){ var p; // deduplicate unnecessary connections:\n\t\t\thi(msg, peer);\n\t\t\tif(!peer.pid){ return }\n\t\t\tif(peer.pid === opt.pid){ mesh.bye(peer); return } // if I connected to myself, drop.\n\t\t\tif(p = axe.up[peer.pid]){ // if we both connected to each other...\n\t\t\t\tif(p === peer){ return } // do nothing if no conflict,\n\t\t\t\tif(opt.pid > peer.pid){ // else deterministically sort\n\t\t\t\t\tp = peer; // so we will wind up choosing the same to keep\n\t\t\t\t\tpeer = axe.up[p.pid]; // and the same to drop.\n\t\t\t\t}\n\t\t\t\tp.url = p.url || peer.url; // copy if not\n\t\t\t\tmesh.bye(peer); // drop\n\t\t\t\taxe.up[p.pid] = p; // update same to be same.\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif(!peer.url){ return }\n\t\t\taxe.up[peer.pid] = peer;\n\t\t\tif(axe.stay){ axe.stay() }\n\t\t};\n\n\t\tmesh.hear['opt'] = function(msg, peer){\n\t\t\tif(msg.ok){ return }\n\t\t\tvar tmp = msg.opt;\n\t\t\tif(!tmp){ return }\n\t\t\ttmp = tmp.peers;\n\t\t\tif(!tmp || 'string' != typeof tmp){ return }\n\t\t\tif(99 <= Object.keys(axe.up).length){ return } // 99 TEMPORARILY UNTIL BENCHMARKED!\n\t\t\tmesh.hi({id: tmp, url: tmp, retry: 9});\n\t\t\tif(peer){ mesh.say({dam: 'opt', ok: 1, '@': msg['#']}, peer) }\n\t\t}\n\n\t\taxe.stay = function(){\n\t\t\tclearTimeout(axe.stay.to);\n\t\t\taxe.stay.to = setTimeout(function(tmp, urls){\n\t\t\t\tif(!(tmp = root.stats && root.stats.stay)){ return }\n\t\t\t\turls = {}; Object.keys(axe.up||'').forEach(function(p){\n\t\t\t\t\tp = (axe.up||'')[p]; if(p.url){ urls[p.url] = {} }\n\t\t\t\t});\n\t\t\t\t(tmp.axe = tmp.axe || {}).up = urls;\n\t\t\t}, 1000 * 9);//1000 * 60);\n\t\t};\n\t\tsetTimeout(function(tmp){\n\t\t\tif(!(tmp = root.stats && root.stats.stay && root.stats.stay.axe)){ return }\n\t\t\tif(!(tmp = tmp.up)){ return }\n\t\t\tif(!(tmp instanceof Array)){ tmp = Object.keys(tmp) }\n\t\t\tsetTimeout.each(tmp||[], function(url){ mesh.hear.opt({opt: {peers: url}}) });\n\t\t},1000);\n\t}());\n\n\t;(function(){ // THIS IS THE MOB MODULE;\n\t\t//return; // WORK IN PROGRESS, TEST FINALIZED, NEED TO MAKE STABLE.\n\t\t/*\n\t\t\tAXE should have a couple of threshold items...\n\t\t\tlet's pretend there is a variable max peers connected\n\t\t\tmob = 10000\n\t\t\tif we get more peers than that...\n\t\t\twe should start sending those peers a remote command\n\t\t\tthat they should connect to this or that other peer\n\t\t\tand then once they (or before they do?) drop them from us.\n\t\t\tsake of the test... gonna set that peer number to 1.\n\t\t\tThe mob threshold might be determined by other factors,\n\t\t\tlike how much RAM or CPU stress we have.\n\t\t*/\n\t\topt.mob = opt.mob || 9900; // should be based on ulimit, some clouds as low as 10K.\n\n\t\t// handle rebalancing a mob of peers:\n\t\troot.on('hi', function(peer){\n\t\t\tthis.to.next(peer);\n\t\t\tif(peer.url){ return } // I am assuming that if we are wanting to make an outbound connection to them, that we don't ever want to drop them unless our actual config settings change.\n\t\t\tvar count = /*Object.keys(opt.peers).length ||*/ mesh.near; // TODO: BUG! This is slow, use .near, but near is buggy right now, fix in DAM.\n\t\t\t//console.log(\"are we mobbed?\", opt.mob, Object.keys(opt.peers).length, mesh.near);\n\t\t\tif(opt.mob >= count){ return } // TODO: Make dynamic based on RAM/CPU also. Or possibly even weird stuff like opt.mob / axe.up length?\n\t\t\tvar peers = {};Object.keys(axe.up).forEach(function(p){ p = axe.up[p]; p.url && (peers[p.url]={}) });\n\t\t\t// TODO: BUG!!! Infinite reconnection loop happens if not enough relays, or if some are missing. For instance, :8766 says to connect to :8767 which then says to connect to :8766. To not DDoS when system overload, figure clever way to tell peers to retry later, that network does not have enough capacity?\n\t\t\tmesh.say({dam: 'mob', mob: count, peers: peers}, peer);\n\t\t\tsetTimeout(function(){ mesh.bye(peer) }, 9); // something with better perf?\n\t\t});\n\t\troot.on('bye', function(peer){\n\t\t\tthis.to.next(peer);\n\t\t});\n\n\t}());\n}\n\n;(function(){\n\tvar from = Array.from;\n\tObject.maps = function(o){\n\t\tif(from && o instanceof Map){ return from(o.keys()) }\n\t\tif(o instanceof Object.Map){ o = o.s }\n\t\treturn Object.keys(o);\n\t}\n\tif(from){ return Object.Map = Map }\n\t(Object.Map = function(){ this.s = {} }).prototype = {set:function(k,v){this.s[k]=v;return this},get:function(k){return this.s[k]},delete:function(k){delete this.s[k]}};\n}());\n",";(function(){\n\n\tvar sT = setTimeout || {}, u;\n if(typeof window !== ''+u){ sT.window = window }\n\tvar AXE = (sT.window||'').AXE || function(){};\n if(AXE.window = sT.window){ AXE.window.AXE = AXE }\n\n\tvar Gun = (AXE.window||'').GUN || require('./gun');\n\t(Gun.AXE = AXE).GUN = AXE.Gun = Gun;\n\n //if(!Gun.window){ try{ require('./lib/axe') }catch(e){} }\n if(!Gun.window){ require('./lib/axe') }\n\n\tGun.on('opt', function(at){ start(at) ; this.to.next(at) }); // make sure to call the \"next\" middleware adapter.\n\n\tfunction start(root){\n\t\tif(root.axe){ return }\n\t\tvar opt = root.opt, peers = opt.peers;\n\t\tif(false === opt.axe){ return }\n\t\tif(!Gun.window){ return } // handled by ^ lib/axe.js\n\t\tvar w = Gun.window, lS = w.localStorage || opt.localStorage || {}, loc = w.location || opt.location || {}, nav = w.navigator || opt.navigator || {};\n\t\tvar axe = root.axe = {}, tmp, id;\n\t\tvar mesh = opt.mesh = opt.mesh || Gun.Mesh(root); // DAM!\n\n\t\ttmp = peers[id = loc.origin + '/gun'] = peers[id] || {};\n\t\ttmp.id = tmp.url = id; tmp.retry = tmp.retry || 0;\n\t\ttmp = peers[id = 'http://localhost:8765/gun'] = peers[id] || {};\n\t\ttmp.id = tmp.url = id; tmp.retry = tmp.retry || 0;\n\t\tGun.log.once(\"AXE\", \"AXE enabled: Trying to find network via (1) local peer (2) last used peers (3) a URL parameter, and last (4) hard coded peers.\");\n\t\tGun.log.once(\"AXEWarn\", \"Warning: AXE is in alpha, use only for testing!\");\n\t\tvar last = lS.peers || ''; if(last){ last += ' ' }\n\t\tlast += ((loc.search||'').split('peers=')[1]||'').split('&')[0];\n\n\t\troot.on('bye', function(peer){\n\t\t\tthis.to.next(peer);\n\t\t\tif(!peer.url){ return } // ignore WebRTC disconnects for now.\n\t\t\tif(!nav.onLine){ peer.retry = 1 }\n\t\t\tif(peer.retry){ return }\n\t\t\tif(axe.fall){ delete axe.fall[peer.url || peer.id] }\n\t\t\t(function next(){\n\t\t\t\tif(!axe.fall){ setTimeout(next, 9); return } // not found yet\n\t\t\t\tvar fall = Object.keys(axe.fall||''), one = fall[(Math.random()*fall.length) >> 0];\n\t\t\t\tif(!fall.length){ lS.peers = ''; one = 'https://gunjs.herokuapp.com/gun' } // out of peers\n\t\t\t\tif(peers[one]){ next(); return } // already choose\n\t\t\t\tmesh.hi(one);\n\t\t\t}());\n\t\t});\n\n\t\troot.on('hi', function(peer){ // TEMPORARY! Try to connect all peers.\n\t\t\tthis.to.next(peer);\n\t\t\tif(!peer.url){ return } // ignore WebRTC disconnects for now.\n\t\t\treturn; // DO NOT COMMIT THIS FEATURE YET! KEEP TESTING NETWORK PERFORMANCE FIRST!\n\t\t\t(function next(){\n\t\t\t\tif(!peer.wire){ return }\n\t\t\t\tif(!axe.fall){ setTimeout(next, 9); return } // not found yet\n\t\t\t\tvar one = (next.fall = next.fall || Object.keys(axe.fall||'')).pop();\n\t\t\t\tif(!one){ return }\n\t\t\t\tsetTimeout(next, 99);\n\t\t\t\tmesh.say({dam: 'opt', opt: {peers: one}}, peer);\n\t\t\t}());\n\t\t});\n\n\t\tfunction found(text){\n\n\t\t\taxe.fall = {};\n\t\t\t((text||'').match(/https?:\\/\\/(www\\.)?[-a-zA-Z0-9@:%._\\+~#=]{1,256}\\.[a-zA-Z0-9()]{1,6}\\b([-a-zA-Z0-9()@:%_\\+.~#?&//=]*)/ig)||[]).forEach(function(url){\n\t\t\t\taxe.fall[url] = {url: url, id: url, retry: 0}; // RETRY\n\t\t\t});\n\t\t\t\n\t\t\treturn;\n\n\t\t\t// TODO: Finish porting below? Maybe not.\n\n\t\t\tObject.keys(last.peers||'').forEach(function(key){\n\t\t\t\ttmp = peers[id = key] = peers[id] || {};\n\t\t\t\ttmp.id = tmp.url = id;\n\t\t\t});\n\t\t\ttmp = peers[id = 'https://guntest.herokuapp.com/gun'] = peers[id] || {};\n\t\t\ttmp.id = tmp.url = id;\n\n\t\t\tvar mesh = opt.mesh = opt.mesh || Gun.Mesh(root); // DAM!\n\t\t\tmesh.way = function(msg){\n\t\t\t\tif(root.$ === msg.$ || (msg._||'').via){\n\t\t\t\t\tmesh.say(msg, opt.peers);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tvar at = (msg.$||'')._;\n\t\t\t\tif(!at){ mesh.say(msg, opt.peers); return }\n\t\t\t\tif(msg.get){\n\t\t\t\t\tif(at.axe){ return } // don't ask for it again!\n\t\t\t\t\tat.axe = {};\n\t\t\t\t}\n\t\t\t\tmesh.say(msg, opt.peers);\n\t\t\t}\n\t\t}\n\n\t\tif(last){ found(last); return }\n\t\ttry{ fetch(((loc.search||'').split('axe=')[1]||'').split('&')[0] || loc.axe || 'https://raw.githubusercontent.com/wiki/amark/gun/volunteer.dht.md').then(function(res){\n\t \treturn res.text()\n\t }).then(function(text){\n\t \tfound(lS.peers = text);\n\t }).catch(function(){\n\t \tfound(); // nothing\n\t })}catch(e){found()}\n\t}\n\n\tvar empty = {}, yes = true;\n try{ if(typeof module != ''+u){ module.exports = AXE } }catch(e){}\n}());","var Gun = (typeof window !== \"undefined\")? window.Gun : require('../gun');\n\nGun.on('create', function(root){\n\tthis.to.next(root);\n\tvar opt = root.opt;\n if(false === opt.multicast){ return }\n if((typeof process !== \"undefined\") && 'false' === ''+(process.env||{}).MULTICAST){ return }\n\t//if(true !== opt.multicast){ return } // disable multicast by default for now.\n\n var udp = opt.multicast = opt.multicast || {};\n udp.address = udp.address || '233.255.255.255';\n udp.pack = udp.pack || 50000; // UDP messages limited to 65KB.\n udp.port = udp.port || 8765;\n\n var noop = function(){}, u;\n var pid = '2'+Math.random().toString().slice(-8);\n var mesh = opt.mesh = opt.mesh || Gun.Mesh(root);\n var dgram;\n\n try{ dgram = require(\"dgram\") }catch(e){ return }\n var socket = dgram.createSocket({type: \"udp4\", reuseAddr: true});\n socket.bind({port: udp.port, exclusive: true}, function(){\n socket.setBroadcast(true);\n socket.setMulticastTTL(128);\n });\n\n socket.on(\"listening\", function(){\n try { socket.addMembership(udp.address) }catch(e){ console.error(e); return; }\n udp.peer = {id: udp.address + ':' + udp.port, wire: socket};\n\n udp.peer.say = function(raw){\n var buf = Buffer.from(raw, 'utf8');\n if(udp.pack <= buf.length){ // message too big!!!\n return;\n }\n socket.send(buf, 0, buf.length, udp.port, udp.address, noop);\n }\n //opt.mesh.hi(udp.peer);\n\n Gun.log.once('multi', 'Multicast on '+udp.peer.id);\n return; // below code only needed for when WebSocket connections desired!\n setInterval(function broadcast(){\n port = port || (opt.web && opt.web.address()||{}).port;\n if(!port){ return }\n udp.peer.say(JSON.stringify({id: opt.pid || (opt.pid = Math.random().toString(36).slice(2)), port: port}));\n }, 1000);\n });\n\n socket.on(\"message\", function(raw, info) { try {\n if(!raw){ return }\n raw = raw.toString('utf8');\n if('2'===raw[0]){ return check(raw, info) }\n opt.mesh.hear(raw, udp.peer);\n\n return; // below code only needed for when WebSocket connections desired!\n var message;\n message = JSON.parse(raw.toString('utf8'));\n\n if(opt.pid === message.id){ return } // ignore self\n\n var url = 'http://' + info.address + ':' + (port || (opt.web && opt.web.address()||{}).port) + '/gun';\n if(root.opt.peers[url]){ return }\n\n //console.log('discovered', url, message, info);\n root.$.opt(url);\n\n } catch(e){\n //console.log('multicast error', e, raw);\n return;\n } });\n\n function say(msg){\n this.to.next(msg);\n if(!udp.peer){ return }\n mesh.say(msg, udp.peer);\n }\n\n function check(id, info){ var tmp;\n if(!udp.peer){ return }\n if(!id){\n id = check.id = check.id || Buffer.from(pid, 'utf8');\n socket.send(id, 0, id.length, udp.port, udp.address, noop);\n return;\n }\n if((tmp = root.stats) && (tmp = tmp.gap) && info){ (tmp.near || (tmp.near = {}))[info.address] = info.port || 1 } // STATS!\n if(check.on || id === pid){ return }\n root.on('out', check.on = say); // TODO: MULTICAST NEEDS TO BE CHECKED FOR NEW CODE SYSTEM!!!!!!!!!! // TODO: This approach seems interferes with other relays, below does not but...\n //opt.mesh.hi(udp.peer); // IS THIS CORRECT?\n }\n\n setInterval(check, 1000 * 1);\n\n});\n","var Gun = (typeof window !== \"undefined\")? window.Gun : require('../gun');\n\nGun.on('opt', function(root){\n\tthis.to.next(root);\n\tif(root.once){ return }\n\tif(typeof process === 'undefined'){ return }\n\tif(typeof require === 'undefined'){ return }\n\tif(false === root.opt.stats){ return }\n\tvar path = require('path') || {};\n\tvar file = root.opt.file ? path.resolve(root.opt.file).split(path.sep).slice(-1)[0] : 'radata';\n\tvar noop = function(){};\n\tvar os = require('os') || {};\n\tvar fs = require('fs') || {};\n\tfs.existsSync = fs.existsSync || path.existsSync;\n\tif(!fs.existsSync){ return }\n\tif(!process){ return }\n\tprocess.uptime = process.uptime || noop;\n\tprocess.cpuUsage = process.cpuUsage || noop;\n\tprocess.memoryUsage = process.memoryUsage || noop;\n\tos.totalmem = os.totalmem || noop;\n\tos.freemem = os.freemem || noop;\n\tos.loadavg = os.loadavg || noop;\n\tos.cpus = os.cpus || noop;\n\tvar S = +new Date, W;\n\tvar obj_ify = function(o){try{o = JSON.parse(o)}catch(e){o={}};return o;}\n\tsetTimeout(function(){\n\t\troot.stats = obj_ify((fs.existsSync(__dirname+'/../stats.'+file) && fs.readFileSync(__dirname+'/../stats.'+file).toString())) || {};\n\t\troot.stats.up = root.stats.up || {};\n\t\troot.stats.up.start = root.stats.up.start || +(new Date);\n\t\troot.stats.up.count = (root.stats.up.count || 0) + 1;\n\t\troot.stats.stay = root.stats.stay || {};\n\t\troot.stats.over = +new Date;\n\t},1);\n\tsetInterval(function(){\n\t\tif(!root.stats){ root.stats = {} }\n\t\tif(W){ return }\n\t\tvar stats = root.stats, tmp;\n\t\tstats.over = -(S - (S = +new Date));\n\t\t(stats.up||{}).time = process.uptime();\n\t\tstats.memory = process.memoryUsage() || {};\n\t\tstats.memory.totalmem = os.totalmem();\n\t\tstats.memory.freemem = os.freemem();\n\t\tstats.cpu = process.cpuUsage() || {};\n\t\tstats.cpu.loadavg = os.loadavg();\n\t\tstats.cpu.stack = (((setTimeout||'').turn||'').s||'').length;\n\t\tstats.peers = {};\n\n\t\tstats.peers.count = console.STAT.peers || Object.keys(root.opt.peers||{}).length; // TODO: .keys( is slow\n\t\tstats.node = {};\n\t\tstats.node.count = Object.keys(root.graph||{}).length; // TODO: .keys( is slow\n\t\tstats.all = all;\n\t\tstats.sites = console.STAT.sites;\n\t\tall = {}; // will this cause missing stats?\n\t\tvar dam = root.opt.mesh;\n\t\tif(dam){\n\t\t\tstats.dam = {'in': {count: dam.hear.c, done: dam.hear.d}, 'out': {count: dam.say.c, done: dam.say.d}};\n\t\t\tdam.hear.c = dam.hear.d = dam.say.c = dam.say.d = 0; // reset\n\t\t\tstats.peers.time = dam.bye.time || 0;\n\t\t}\n\t\tvar rad = root.opt.store; rad = rad && rad.stats;\n\t\tif(rad){\n\t\t\tstats.rad = rad;\n\t\t\troot.opt.store.stats = {get:{time:{}, count:0}, put: {time:{}, count:0}}; // reset\n\t\t}\n\t\tJSON.stringifyAsync(stats, function(err, raw){ if(err){ return } W = true;\n\t\t\tfs.writeFile(__dirname+'/../stats.'+file, raw, function(err){ W = false; err && console.log(console.STAT.err = err); console.STAT && console.STAT(S, +new Date - S, 'stats stash') });\n\t\t});\n\n\t\t//exec(\"top -b -n 1\", function(err, out){ out && fs.writeFile(__dirname+'/../stats.top.'+file, out, noop) }); // was it really seriously actually this?\n\t//}, 1000 * 15);\n\t}, 1000 * 5);\n});\n\nvar exec = require(\"child_process\").exec, noop = function(){};\nrequire('./yson');\n\nvar log = Gun.log, all = {}, max = 1000;\nconsole.STAT = function(a,b,c,d){\n\tif('number' == typeof a && 'number' == typeof b && 'string' == typeof c){\n\t\tvar tmp = (all[c] || (all[c] = []));\n\t\tif(max < tmp.push([a,b])){ all[c] = [] } // reset\n\t\t//return;\n\t}\n\tif(!console.LOG || log.off){ return a }\n\treturn log.apply(Gun, arguments);\n}",";(function(){\n\trequire('./yson');\n\tvar Gun = require('../gun'), u;\n\tGun.serve = require('./serve');\n\t//process.env.GUN_ENV = process.env.GUN_ENV || 'debug';\n\t//console.LOG = {}; // only do this for dev.\n\tGun.on('opt', function(root){\n\t\tif(u === root.opt.super){ root.opt.super = true }\n\t\tif(u === root.opt.faith){ root.opt.faith = true } // HNPERF: This should probably be off, but we're testing performance improvements, please audit.\n\t\troot.opt.log = root.opt.log || Gun.log;\n\t\tthis.to.next(root);\n\t})\n\t//require('../nts');\n\trequire('./store');\n\trequire('./rfs');\n\trequire('./rs3');\n\trequire('./wire');\n\n\ttry{require('../sea');}catch(e){}\n\ttry{require('../axe');}catch(e){}\n\t//require('./file');\n\t//require('./evict');\n\trequire('./multicast');\n\trequire('./stats');\n\tmodule.exports = Gun;\n}());\n","// @ts-nocheck\nexport default {\n throttle: (func: Function, limit: number) => {\n let inThrottle: boolean;\n return function() {\n const args = arguments;\n const context = this;\n if (!inThrottle) {\n func.apply(context, args);\n inThrottle = true;\n setTimeout(() => inThrottle = false, limit);\n }\n };\n },\n debounce: (func: Function, limit: number) => {\n let inDebounce: boolean;\n return function() {\n const args = arguments;\n const context = this;\n clearTimeout(inDebounce);\n inDebounce = setTimeout(() => func.apply(context, args), limit);\n };\n },\n sample: (arr: any[]) => arr[Math.floor(Math.random() * arr.length)],\n sampleSize: (arr: any[], size: number) => {\n const shuffled = arr.slice(0);\n let i = arr.length;\n let min = i - size;\n let temp;\n let index;\n while (i-- > min) {\n index = Math.floor((i + 1) * Math.random());\n temp = shuffled[index];\n shuffled[index] = shuffled[i];\n shuffled[i] = temp;\n }\n return shuffled.slice(min);\n },\n defer: (func: Function) => setTimeout(func, 0),\n once: (func: Function) => {\n let called = false;\n return function() {\n if (called) {\n return;\n }\n called = true;\n func.apply(this, arguments);\n };\n },\n omit: (obj: any, keys: string[]) => {\n const newObj = {};\n Object.keys(obj).forEach(key => {\n if (!keys.includes(key)) {\n newObj[key] = obj[key];\n }\n });\n return newObj;\n },\n defaults: (obj: any, defaults: any) => {\n Object.keys(defaults).forEach(key => {\n if (obj[key] === undefined) {\n obj[key] = defaults[key];\n }\n });\n return obj;\n },\n pickBy: (obj: any, predicate: Function) => {\n const newObj = {};\n Object.keys(obj).forEach(key => {\n if (predicate(obj[key])) {\n newObj[key] = obj[key];\n }\n });\n return newObj;\n }\n}","// @ts-nocheck\n/* eslint no-useless-escape: \"off\", camelcase: \"off\" */\n\nimport Gun from 'gun'; // eslint-disable-line no-unused-vars\nimport 'gun/sea';\nimport _ from './lodash';\n\n// eslint-disable-line no-unused-vars\n\nlet isNode = false;\ntry {\n isNode = Object.prototype.toString.call(global.process) === `[object process]`;\n} catch (e) { null; }\n\nconst userAgent = !isNode && navigator && navigator.userAgent && navigator.userAgent.toLowerCase();\nconst isElectron = (userAgent && userAgent.indexOf(' electron/') > -1);\n\nconst isMobile = !isNode && (function() {\n if (isElectron) { return false; }\n let check = false;\n (function(a) {if (/(android|bb\\d+|meego).+mobile|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\\-(n|u)|c55\\/|capi|ccwa|cdm\\-|cell|chtm|cldc|cmd\\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\\-s|devi|dica|dmob|do(c|p)o|ds(12|\\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\\-|_)|g1 u|g560|gene|gf\\-5|g\\-mo|go(\\.w|od)|gr(ad|un)|haie|hcit|hd\\-(m|p|t)|hei\\-|hi(pt|ta)|hp( i|ip)|hs\\-c|ht(c(\\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\\-(20|go|ma)|i230|iac( |\\-|\\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\\/)|klon|kpt |kwc\\-|kyo(c|k)|le(no|xi)|lg( g|\\/(k|l|u)|50|54|\\-[a-w])|libw|lynx|m1\\-w|m3ga|m50\\/|ma(te|ui|xo)|mc(01|21|ca)|m\\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\\-2|po(ck|rt|se)|prox|psio|pt\\-g|qa\\-a|qc(07|12|21|32|60|\\-[2-7]|i\\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\\-|oo|p\\-)|sdk\\/|se(c(\\-|0|1)|47|mc|nd|ri)|sgh\\-|shar|sie(\\-|m)|sk\\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\\-|v\\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\\-|tdg\\-|tel(i|m)|tim\\-|t\\-mo|to(pl|sh)|ts(70|m\\-|m3|m5)|tx\\-9|up(\\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\\-|your|zeto|zte\\-/i.test(a.substr(0, 4))) check = true;})(navigator.userAgent || navigator.vendor || '');\n return check;\n})();\n\nfunction gunAsAnotherUser(gun: any, key: any, f: Function) { // Hacky way to use multiple users with gun\n const gun2 = new Gun({radisk: false, peers: Object.keys(gun._.opt.peers)}); // TODO: copy other options too\n const user = gun2.user();\n user.auth(key);\n setTimeout(() => {\n // @ts-ignore\n const peers = Object.values(gun2.back('opt.peers'));\n peers.forEach(peer => {\n // @ts-ignore\n gun2.on('bye', peer);\n });\n }, 20000);\n return f(user);\n}\n\nfunction gunOnceDefined(node: any) {\n return new Promise(resolve => {\n node.on((val: any, _k: any, _a: any, eve: any) => {\n if (val !== undefined) {\n eve.off();\n resolve(val);\n }\n });\n });\n}\n\nconst animals = [\n 'canidae',\n 'felidae',\n 'cat',\n 'cattle',\n 'dog',\n 'donkey',\n 'goat',\n 'horse',\n 'pig',\n 'rabbit',\n 'aardvark',\n 'aardwolf',\n 'albatross',\n 'alligator',\n 'alpaca',\n 'amphibian',\n 'anaconda',\n 'angelfish',\n 'anglerfish',\n 'ant',\n 'anteater',\n 'antelope',\n 'antlion',\n 'ape',\n 'aphid',\n 'armadillo',\n 'asp',\n 'baboon',\n 'badger',\n 'bandicoot',\n 'barnacle',\n 'barracuda',\n 'basilisk',\n 'bass',\n 'bat',\n 'bear',\n 'beaver',\n 'bedbug',\n 'bee',\n 'beetle',\n 'bird',\n 'bison',\n 'blackbird',\n 'boa',\n 'boar',\n 'bobcat',\n 'bobolink',\n 'bonobo',\n 'booby',\n 'bovid',\n 'bug',\n 'butterfly',\n 'buzzard',\n 'camel',\n 'canid',\n 'capybara',\n 'cardinal',\n 'caribou',\n 'carp',\n 'cat',\n 'catshark',\n 'caterpillar',\n 'catfish',\n 'cattle',\n 'centipede',\n 'cephalopod',\n 'chameleon',\n 'cheetah',\n 'chickadee',\n 'chicken',\n 'chimpanzee',\n 'chinchilla',\n 'chipmunk',\n 'clam',\n 'clownfish',\n 'cobra',\n 'cockroach',\n 'cod',\n 'condor',\n 'constrictor',\n 'coral',\n 'cougar',\n 'cow',\n 'coyote',\n 'crab',\n 'crane',\n 'crawdad',\n 'crayfish',\n 'cricket',\n 'crocodile',\n 'crow',\n 'cuckoo',\n 'cicada',\n 'damselfly',\n 'deer',\n 'dingo',\n 'dinosaur',\n 'dog',\n 'dolphin',\n 'donkey',\n 'dormouse',\n 'dove',\n 'dragonfly',\n 'dragon',\n 'duck',\n 'eagle',\n 'earthworm',\n 'earwig',\n 'echidna',\n 'eel',\n 'egret',\n 'elephant',\n 'elk',\n 'emu',\n 'ermine',\n 'falcon',\n 'ferret',\n 'finch',\n 'firefly',\n 'fish',\n 'flamingo',\n 'flea',\n 'fly',\n 'flyingfish',\n 'fowl',\n 'fox',\n 'frog',\n 'gamefowl',\n 'galliform',\n 'gazelle',\n 'gecko',\n 'gerbil',\n 'gibbon',\n 'giraffe',\n 'goat',\n 'goldfish',\n 'goose',\n 'gopher',\n 'gorilla',\n 'grasshopper',\n 'grouse',\n 'guan',\n 'guanaco',\n 'guineafowl',\n 'gull',\n 'guppy',\n 'haddock',\n 'halibut',\n 'hamster',\n 'hare',\n 'harrier',\n 'hawk',\n 'hedgehog',\n 'heron',\n 'herring',\n 'hippopotamus',\n 'hookworm',\n 'hornet',\n 'horse',\n 'hoverfly',\n 'hummingbird',\n 'hyena',\n 'iguana',\n 'impala',\n 'jackal',\n 'jaguar',\n 'jay',\n 'jellyfish',\n 'junglefowl',\n 'kangaroo',\n 'kingfisher',\n 'kite',\n 'kiwi',\n 'koala',\n 'koi',\n 'krill',\n 'ladybug',\n 'lamprey',\n 'landfowl',\n 'lark',\n 'leech',\n 'lemming',\n 'lemur',\n 'leopard',\n 'leopon',\n 'limpet',\n 'lion',\n 'lizard',\n 'llama',\n 'lobster',\n 'locust',\n 'loon',\n 'louse',\n 'lungfish',\n 'lynx',\n 'macaw',\n 'mackerel',\n 'magpie',\n 'mammal',\n 'manatee',\n 'mandrill',\n 'marlin',\n 'marmoset',\n 'marmot',\n 'marsupial',\n 'marten',\n 'mastodon',\n 'meadowlark',\n 'meerkat',\n 'mink',\n 'minnow',\n 'mite',\n 'mockingbird',\n 'mole',\n 'mollusk',\n 'mongoose',\n 'monkey',\n 'moose',\n 'mosquito',\n 'moth',\n 'mouse',\n 'mule',\n 'muskox',\n 'narwhal',\n 'newt',\n 'nightingale',\n 'ocelot',\n 'octopus',\n 'opossum',\n 'orangutan',\n 'orca',\n 'ostrich',\n 'otter',\n 'owl',\n 'ox',\n 'panda',\n 'panther',\n 'parakeet',\n 'parrot',\n 'parrotfish',\n 'partridge',\n 'peacock',\n 'peafowl',\n 'pelican',\n 'penguin',\n 'perch',\n 'pheasant',\n 'pig',\n 'pigeon',\n 'pike',\n 'pinniped',\n 'piranha',\n 'planarian',\n 'platypus',\n 'pony',\n 'porcupine',\n 'porpoise',\n 'possum',\n 'prawn',\n 'primate',\n 'ptarmigan',\n 'puffin',\n 'puma',\n 'python',\n 'quail',\n 'quelea',\n 'quokka',\n 'rabbit',\n 'raccoon',\n 'rat',\n 'rattlesnake',\n 'raven',\n 'reindeer',\n 'reptile',\n 'rhinoceros',\n 'roadrunner',\n 'rodent',\n 'rook',\n 'rooster',\n 'roundworm',\n 'sailfish',\n 'salamander',\n 'salmon',\n 'sawfish',\n 'scallop',\n 'scorpion',\n 'seahorse',\n 'shark',\n 'sheep',\n 'shrew',\n 'shrimp',\n 'silkworm',\n 'silverfish',\n 'skink',\n 'skunk',\n 'sloth',\n 'slug',\n 'smelt',\n 'snail',\n 'snake',\n 'snipe',\n 'sole',\n 'sparrow',\n 'spider',\n 'spoonbill',\n 'squid',\n 'squirrel',\n 'starfish',\n 'stingray',\n 'stoat',\n 'stork',\n 'sturgeon',\n 'swallow',\n 'swan',\n 'swift',\n 'swordfish',\n 'swordtail',\n 'tahr',\n 'takin',\n 'tapir',\n 'tarantula',\n 'tarsier',\n 'termite',\n 'tern',\n 'thrush',\n 'tick',\n 'tiger',\n 'tiglon',\n 'toad',\n 'tortoise',\n 'toucan',\n 'trout',\n 'tuna',\n 'turkey',\n 'turtle',\n 'tyrannosaurus',\n 'urial',\n 'vicuna',\n 'viper',\n 'vole',\n 'vulture',\n 'wallaby',\n 'walrus',\n 'wasp',\n 'warbler',\n 'weasel',\n 'whale',\n 'whippet',\n 'whitefish',\n 'wildcat',\n 'wildebeest',\n 'wildfowl',\n 'wolf',\n 'wolverine',\n 'wombat',\n 'woodpecker',\n 'worm',\n 'wren',\n 'xerinae',\n 'yak',\n 'zebra',\n 'alpaca',\n 'cat',\n 'cattle',\n 'chicken',\n 'dog',\n 'donkey',\n 'ferret',\n 'gayal',\n 'goldfish',\n 'guppy',\n 'horse',\n 'koi',\n 'llama',\n 'sheep',\n 'yak',\n 'unicorn',\n];\n\nconst adjectives = [\n 'average',\n 'big',\n 'colossal',\n 'fat',\n 'giant',\n 'gigantic',\n 'great',\n 'huge',\n 'immense',\n 'large',\n 'little',\n 'long',\n 'mammoth',\n 'massive',\n 'miniature',\n 'petite',\n 'puny',\n 'short',\n 'small',\n 'tall',\n 'tiny',\n 'boiling',\n 'breezy',\n 'broken',\n 'bumpy',\n 'chilly',\n 'cold',\n 'cool',\n 'creepy',\n 'crooked',\n 'cuddly',\n 'curly',\n 'damaged',\n 'damp',\n 'dirty',\n 'dry',\n 'dusty',\n 'filthy',\n 'flaky',\n 'fluffy',\n 'wet',\n 'broad',\n 'chubby',\n 'crooked',\n 'curved',\n 'deep',\n 'flat',\n 'high',\n 'hollow',\n 'low',\n 'narrow',\n 'round',\n 'shallow',\n 'skinny',\n 'square',\n 'steep',\n 'straight',\n 'wide',\n 'ancient',\n 'brief',\n 'early',\n 'fast',\n 'late',\n 'long',\n 'modern',\n 'old',\n 'quick',\n 'rapid',\n 'short',\n 'slow',\n 'swift',\n 'young',\n 'abundant',\n 'empty',\n 'few',\n 'heavy',\n 'light',\n 'many',\n 'numerous',\n 'Sound',\n 'cooing',\n 'deafening',\n 'faint',\n 'harsh',\n 'hissing',\n 'hushed',\n 'husky',\n 'loud',\n 'melodic',\n 'moaning',\n 'mute',\n 'noisy',\n 'purring',\n 'quiet',\n 'raspy',\n 'resonant',\n 'screeching',\n 'shrill',\n 'silent',\n 'soft',\n 'squealing',\n 'thundering',\n 'voiceless',\n 'whispering',\n 'bitter',\n 'delicious',\n 'fresh',\n 'juicy',\n 'ripe',\n 'rotten',\n 'salty',\n 'sour',\n 'spicy',\n 'stale',\n 'sticky',\n 'strong',\n 'sweet',\n 'tasteless',\n 'tasty',\n 'thirsty',\n 'fluttering',\n 'fuzzy',\n 'greasy',\n 'grubby',\n 'hard',\n 'hot',\n 'icy',\n 'loose',\n 'melted',\n 'plastic',\n 'prickly',\n 'rainy',\n 'rough',\n 'scattered',\n 'shaggy',\n 'shaky',\n 'sharp',\n 'shivering',\n 'silky',\n 'slimy',\n 'slippery',\n 'smooth',\n 'soft',\n 'solid',\n 'steady',\n 'sticky',\n 'tender',\n 'tight',\n 'uneven',\n 'weak',\n 'wet',\n 'wooden',\n 'afraid',\n 'angry',\n 'annoyed',\n 'anxious',\n 'arrogant',\n 'ashamed',\n 'awful',\n 'bad',\n 'bewildered',\n 'bored',\n 'combative',\n 'condemned',\n 'confused',\n 'creepy',\n 'cruel',\n 'dangerous',\n 'defeated',\n 'defiant',\n 'depressed',\n 'disgusted',\n 'disturbed',\n 'eerie',\n 'embarrassed',\n 'envious',\n 'evil',\n 'fierce',\n 'foolish',\n 'frantic',\n 'frightened',\n 'grieving',\n 'helpless',\n 'homeless',\n 'hungry',\n 'hurt',\n 'ill',\n 'jealous',\n 'lonely',\n 'mysterious',\n 'naughty',\n 'nervous',\n 'obnoxious',\n 'outrageous',\n 'panicky',\n 'repulsive',\n 'scary',\n 'scornful',\n 'selfish',\n 'sore',\n 'tense',\n 'terrible',\n 'thoughtless',\n 'tired',\n 'troubled',\n 'upset',\n 'uptight',\n 'weary',\n 'wicked',\n 'worried',\n 'agreeable',\n 'amused',\n 'brave',\n 'calm',\n 'charming',\n 'cheerful',\n 'comfortable',\n 'cooperative',\n 'courageous',\n 'delightful',\n 'determined',\n 'eager',\n 'elated',\n 'enchanting',\n 'encouraging',\n 'energetic',\n 'enthusiastic',\n 'excited',\n 'exuberant',\n 'fair',\n 'faithful',\n 'fantastic',\n 'fine',\n 'friendly',\n 'funny',\n 'gentle',\n 'glorious',\n 'good',\n 'happy',\n 'healthy',\n 'helpful',\n 'hilarious',\n 'jolly',\n 'joyous',\n 'kind',\n 'lively',\n 'lovely',\n 'lucky',\n 'obedient',\n 'perfect',\n 'pleasant',\n 'proud',\n 'relieved',\n 'silly',\n 'smiling',\n 'splendid',\n 'successful',\n 'thoughtful',\n 'victorious',\n 'vivacious',\n 'witty',\n 'wonderful',\n 'zealous',\n 'zany',\n 'other',\n 'good',\n 'new',\n 'old',\n 'great',\n 'high',\n 'small',\n 'different',\n 'large',\n 'local',\n 'social',\n 'important',\n 'long',\n 'young',\n 'national',\n 'british',\n 'right',\n 'early',\n 'possible',\n 'big',\n 'little',\n 'political',\n 'able',\n 'late',\n 'general',\n 'full',\n 'far',\n 'low',\n 'public',\n 'available',\n 'bad',\n 'main',\n 'sure',\n 'clear',\n 'major',\n 'economic',\n 'only',\n 'likely',\n 'real',\n 'black',\n 'particular',\n 'international',\n 'special',\n 'difficult',\n 'certain',\n 'open',\n 'whole',\n 'white',\n 'free',\n 'short',\n 'easy',\n 'strong',\n 'european',\n 'central',\n 'similar',\n 'human',\n 'common',\n 'necessary',\n 'single',\n 'personal',\n 'hard',\n 'private',\n 'poor',\n 'financial',\n 'wide',\n 'foreign',\n 'simple',\n 'recent',\n 'concerned',\n 'american',\n 'various',\n 'close',\n 'fine',\n 'english',\n 'wrong',\n 'present',\n 'royal',\n 'natural',\n 'individual',\n 'nice',\n 'french',\n 'nihilist',\n 'solipsist',\n 'materialist',\n 'surrealist',\n 'heroic',\n 'awesome',\n 'hedonist',\n 'absurd',\n 'current',\n 'modern',\n 'labour',\n 'legal',\n 'happy',\n 'final',\n 'red',\n 'normal',\n 'serious',\n 'previous',\n 'total',\n 'prime',\n 'significant',\n 'industrial',\n 'sorry',\n 'dead',\n 'specific',\n 'appropriate',\n 'top',\n 'soviet',\n 'basic',\n 'military',\n 'original',\n 'successful',\n 'aware',\n 'hon',\n 'popular',\n 'heavy',\n 'professional',\n 'direct',\n 'dark',\n 'cold',\n 'ready',\n 'green',\n 'useful',\n 'effective',\n 'western',\n 'traditional',\n 'scottish',\n 'german',\n 'independent',\n 'deep',\n 'interesting',\n 'considerable',\n 'involved',\n 'physical',\n 'hot',\n 'existing',\n 'responsible',\n 'complete',\n 'medical',\n 'blue',\n 'extra',\n 'past',\n 'male',\n 'interested',\n 'fair',\n 'essential',\n 'beautiful',\n 'civil',\n 'primary',\n 'obvious',\n 'future',\n 'environmental',\n 'positive',\n 'senior',\n 'nuclear',\n 'annual',\n 'relevant',\n 'huge',\n 'rich',\n 'commercial',\n 'safe',\n 'regional',\n 'practical',\n 'official',\n 'separate',\n 'key',\n 'chief',\n 'regular',\n 'due',\n 'additional',\n 'active',\n 'powerful',\n 'complex',\n 'standard',\n 'impossible',\n 'light',\n 'warm',\n 'middle',\n 'fresh',\n 'sexual',\n 'front',\n 'domestic',\n 'actual',\n 'united',\n 'technical',\n 'ordinary',\n 'cheap',\n 'strange',\n 'internal',\n 'excellent',\n 'quiet',\n 'soft',\n 'potential',\n 'northern',\n 'religious',\n 'quick',\n 'very',\n 'famous',\n 'cultural',\n 'proper',\n 'broad',\n 'joint',\n 'formal',\n 'limited',\n 'conservative',\n 'lovely',\n 'usual',\n 'ltd',\n 'unable',\n 'rural',\n 'initial',\n 'substantial',\n 'bright',\n 'average',\n 'leading',\n 'reasonable',\n 'immediate',\n 'suitable',\n 'equal',\n 'detailed',\n 'working',\n 'overall',\n 'female',\n 'afraid',\n 'democratic',\n 'growing',\n 'sufficient',\n 'scientific',\n 'eastern',\n 'correct',\n 'inc',\n 'irish',\n 'expensive',\n 'educational',\n 'mental',\n 'dangerous',\n 'critical',\n 'increased',\n 'familiar',\n 'unlikely',\n 'double',\n 'perfect',\n 'slow',\n 'tiny',\n 'dry',\n 'historical',\n 'thin',\n 'daily',\n 'southern',\n 'increasing',\n 'wild',\n 'alone',\n 'urban',\n 'empty',\n 'married',\n 'narrow',\n 'liberal',\n 'supposed',\n 'upper',\n 'apparent',\n 'tall',\n 'busy',\n 'bloody',\n 'prepared',\n 'russian',\n 'moral',\n 'careful',\n 'clean',\n 'attractive',\n 'japanese',\n 'vital',\n 'thick',\n 'alternative',\n 'fast',\n 'ancient',\n 'elderly',\n 'rare',\n 'external',\n 'capable',\n 'brief',\n 'wonderful',\n 'grand',\n 'typical',\n 'entire',\n 'grey',\n 'constant',\n 'vast',\n 'surprised',\n 'ideal',\n 'terrible',\n 'academic',\n 'funny',\n 'minor',\n 'pleased',\n 'severe',\n 'ill',\n 'corporate',\n 'negative',\n 'permanent',\n 'weak',\n 'brown',\n 'fundamental',\n 'odd',\n 'crucial',\n 'inner',\n 'used',\n 'criminal',\n 'contemporary',\n 'sharp',\n 'sick',\n 'near',\n 'roman',\n 'massive',\n 'unique',\n 'secondary',\n 'parliamentary',\n 'african',\n 'unknown',\n 'subsequent',\n 'angry',\n 'alive',\n 'guilty',\n 'lucky',\n 'enormous',\n 'well',\n 'yellow',\n 'unusual',\n 'net',\n 'tough',\n 'dear',\n 'extensive',\n 'glad',\n 'remaining',\n 'agricultural',\n 'alright',\n 'healthy',\n 'italian',\n 'principal',\n 'tired',\n 'efficient',\n 'comfortable',\n 'chinese',\n 'relative',\n 'friendly',\n 'conventional',\n 'willing',\n 'sudden',\n 'proposed',\n 'voluntary',\n 'slight',\n 'valuable',\n 'dramatic',\n 'golden',\n 'temporary',\n 'federal',\n 'keen',\n 'flat',\n 'silent',\n 'indian',\n 'worried',\n 'pale',\n 'statutory',\n 'welsh',\n 'dependent',\n 'firm',\n 'wet',\n 'competitive',\n 'armed',\n 'radical',\n 'outside',\n 'acceptable',\n 'sensitive',\n 'living',\n 'pure',\n 'global',\n 'emotional',\n 'sad',\n 'secret',\n 'rapid',\n 'adequate',\n 'fixed',\n 'sweet',\n 'administrative',\n 'wooden',\n 'remarkable',\n 'comprehensive',\n 'surprising',\n 'solid',\n 'rough',\n 'mere',\n 'mass',\n 'brilliant',\n 'maximum',\n 'absolute',\n 'electronic',\n 'visual',\n 'electric',\n 'cool',\n 'spanish',\n 'literary',\n 'continuing',\n 'supreme',\n 'chemical',\n 'genuine',\n 'exciting',\n 'written',\n 'advanced',\n 'extreme',\n 'classical',\n 'fit',\n 'favourite',\n 'widespread',\n 'confident',\n 'straight',\n 'proud',\n 'numerous',\n 'opposite',\n 'distinct',\n 'mad',\n 'helpful',\n 'given',\n 'disabled',\n 'consistent',\n 'anxious',\n 'nervous',\n 'awful',\n 'stable',\n 'constitutional',\n 'satisfied',\n 'conscious',\n 'developing',\n 'strategic',\n 'holy',\n 'smooth',\n 'dominant',\n 'remote',\n 'theoretical',\n 'outstanding',\n 'pink',\n 'pretty',\n 'clinical',\n 'minimum',\n 'honest',\n 'impressive',\n 'related',\n 'residential',\n 'extraordinary',\n 'plain',\n 'visible',\n 'accurate',\n 'distant',\n 'still',\n 'greek',\n 'complicated',\n 'musical',\n 'precise',\n 'gentle',\n 'broken',\n 'live',\n 'silly',\n 'fat',\n 'tight',\n 'monetary',\n 'round',\n 'psychological',\n 'violent',\n 'unemployed',\n 'inevitable',\n 'junior',\n 'sensible',\n 'grateful',\n 'pleasant',\n 'dirty',\n 'structural',\n 'welcome',\n 'deaf',\n 'above',\n 'continuous',\n 'blind',\n 'overseas',\n 'mean',\n 'entitled',\n 'delighted',\n 'loose',\n 'occasional',\n 'evident',\n 'desperate',\n 'fellow',\n 'universal',\n 'square',\n 'steady',\n 'classic',\n 'equivalent',\n 'intellectual',\n 'victorian',\n 'level',\n 'ultimate',\n 'creative',\n 'lost',\n 'medieval',\n 'clever',\n 'linguistic',\n 'convinced',\n 'judicial',\n 'raw',\n 'sophisticated',\n 'asleep',\n 'vulnerable',\n 'illegal',\n 'outer',\n 'revolutionary',\n 'bitter',\n 'changing',\n 'australian',\n 'native',\n 'imperial',\n 'strict',\n 'wise',\n 'informal',\n 'flexible',\n 'collective',\n 'frequent',\n 'experimental',\n 'spiritual',\n 'intense',\n 'rational',\n 'generous',\n 'inadequate',\n 'prominent',\n 'logical',\n 'bare',\n 'historic',\n 'modest',\n 'dutch',\n 'acute',\n 'electrical',\n 'valid',\n 'weekly',\n 'gross',\n 'automatic',\n 'loud',\n 'reliable',\n 'mutual',\n 'liable',\n 'multiple',\n 'ruling',\n 'curious',\n 'sole',\n 'managing',\n 'pregnant',\n 'latin',\n 'nearby',\n 'exact',\n 'underlying',\n 'identical',\n 'satisfactory',\n 'marginal',\n 'distinctive',\n 'electoral',\n 'urgent',\n 'presidential',\n 'controversial',\n 'everyday',\n 'encouraging',\n 'organic',\n 'continued',\n 'expected',\n 'statistical',\n 'desirable',\n 'innocent',\n 'improved',\n 'exclusive',\n 'marked',\n 'experienced',\n 'unexpected',\n 'superb',\n 'sheer',\n 'disappointed',\n 'frightened',\n 'gastric',\n 'romantic',\n 'naked',\n 'reluctant',\n 'magnificent',\n 'convenient',\n 'established',\n 'closed',\n 'uncertain',\n 'artificial',\n 'diplomatic',\n 'tremendous',\n 'marine',\n 'mechanical',\n 'retail',\n 'institutional',\n 'mixed',\n 'required',\n 'biological',\n 'known',\n 'functional',\n 'straightforward',\n 'superior',\n 'digital',\n 'spectacular',\n 'unhappy',\n 'confused',\n 'unfair',\n 'aggressive',\n 'spare',\n 'painful',\n 'abstract',\n 'asian',\n 'associated',\n 'legislative',\n 'monthly',\n 'intelligent',\n 'hungry',\n 'explicit',\n 'nasty',\n 'just',\n 'faint',\n 'coloured',\n 'ridiculous',\n 'amazing',\n 'comparable',\n 'successive',\n 'realistic',\n 'back',\n 'decent',\n 'decentralized',\n 'bitcoin',\n 'cypherpunk',\n 'unnecessary',\n 'flying',\n 'random',\n 'influential',\n 'dull',\n 'genetic',\n 'neat',\n 'marvellous',\n 'crazy',\n 'damp',\n 'giant',\n 'secure',\n 'bottom',\n 'skilled',\n 'subtle',\n 'elegant',\n 'brave',\n 'lesser',\n 'parallel',\n 'steep',\n 'intensive',\n 'casual',\n 'tropical',\n 'lonely',\n 'partial',\n 'preliminary',\n 'concrete',\n 'alleged',\n 'assistant',\n 'vertical',\n 'upset',\n 'delicate',\n 'mild',\n 'occupational',\n 'excessive',\n 'progressive',\n 'exceptional',\n 'integrated',\n 'striking',\n 'continental',\n 'okay',\n 'harsh',\n 'combined',\n 'fierce',\n 'handsome',\n 'characteristic',\n 'chronic',\n 'compulsory',\n 'interim',\n 'objective',\n 'splendid',\n 'magic',\n 'systematic',\n 'obliged',\n 'payable',\n 'fun',\n 'horrible',\n 'primitive',\n 'fascinating',\n 'ideological',\n 'metropolitan',\n 'surrounding',\n 'estimated',\n 'peaceful',\n 'premier',\n 'operational',\n 'technological',\n 'kind',\n 'advisory',\n 'hostile',\n 'precious',\n 'accessible',\n 'determined',\n 'excited',\n 'impressed',\n 'provincial',\n 'smart',\n 'endless',\n 'isolated',\n 'drunk',\n 'geographical',\n 'like',\n 'dynamic',\n 'boring',\n 'forthcoming',\n 'unfortunate',\n 'definite',\n 'super',\n 'notable',\n 'indirect',\n 'stiff',\n 'wealthy',\n 'awkward',\n 'lively',\n 'neutral',\n 'artistic',\n 'content',\n 'mature',\n 'colonial',\n 'ambitious',\n 'evil',\n 'magnetic',\n 'verbal',\n 'legitimate',\n 'sympathetic',\n 'empirical',\n 'head',\n 'shallow',\n 'vague',\n 'naval',\n 'depressed',\n 'shared',\n 'added',\n 'shocked',\n 'mid',\n 'worthwhile',\n 'qualified',\n 'missing',\n 'blank',\n 'absent',\n 'favourable',\n 'polish',\n 'israeli',\n 'developed',\n 'profound',\n 'representative',\n 'enthusiastic',\n 'dreadful',\n 'rigid',\n 'reduced',\n 'cruel',\n 'coastal',\n 'peculiar',\n 'swiss',\n 'crude',\n 'extended',\n 'selected',\n 'eager',\n 'canadian',\n 'bold',\n 'relaxed',\n 'corresponding',\n 'running',\n 'planned',\n 'applicable',\n 'immense',\n 'allied',\n 'comparative',\n 'uncomfortable',\n 'conservation',\n 'productive',\n 'beneficial',\n 'bored',\n 'charming',\n 'minimal',\n 'mobile',\n 'turkish',\n 'orange',\n 'rear',\n 'passive',\n 'suspicious',\n 'overwhelming',\n 'fatal',\n 'resulting',\n 'symbolic',\n 'registered',\n 'neighbouring',\n 'calm',\n 'irrelevant',\n 'patient',\n 'compact',\n 'profitable',\n 'rival',\n 'loyal',\n 'moderate',\n 'distinguished',\n 'interior',\n 'noble',\n 'insufficient',\n 'eligible',\n 'mysterious',\n 'varying',\n 'managerial',\n 'molecular',\n 'olympic',\n 'linear',\n 'prospective',\n 'printed',\n 'parental',\n 'diverse',\n 'elaborate',\n 'furious',\n 'fiscal',\n 'burning',\n 'useless',\n 'semantic',\n 'embarrassed',\n 'inherent',\n 'philosophical',\n 'deliberate',\n 'awake',\n 'variable',\n 'promising',\n 'unpleasant',\n 'varied',\n 'sacred',\n 'selective',\n 'inclined',\n 'tender',\n 'hidden',\n 'worthy',\n 'intermediate',\n 'sound',\n 'protective',\n 'fortunate',\n 'slim',\n 'defensive',\n 'divine',\n 'stuck',\n 'driving',\n 'invisible',\n 'misleading',\n 'circular',\n 'mathematical',\n 'inappropriate',\n 'liquid',\n 'persistent',\n 'solar',\n 'doubtful',\n 'manual',\n 'architectural',\n 'intact',\n 'incredible',\n 'devoted',\n 'prior',\n 'tragic',\n 'respectable',\n 'optimistic',\n 'convincing',\n 'unacceptable',\n 'decisive',\n 'competent',\n 'spatial',\n 'respective',\n 'binding',\n 'relieved',\n 'nursing',\n 'toxic',\n 'select',\n 'redundant',\n 'integral',\n 'then',\n 'probable',\n 'amateur',\n 'fond',\n 'passing',\n 'specified',\n 'territorial',\n 'horizontal',\n 'inland',\n 'cognitive',\n 'regulatory',\n 'miserable',\n 'resident',\n 'polite',\n 'scared',\n 'gothic',\n 'civilian',\n 'instant',\n 'lengthy',\n 'adverse',\n 'korean',\n 'unconscious',\n 'anonymous',\n 'aesthetic',\n 'orthodox',\n 'static',\n 'unaware',\n 'costly',\n 'fantastic',\n 'foolish',\n 'fashionable',\n 'causal',\n 'compatible',\n 'wee',\n 'implicit',\n 'dual',\n 'ok',\n 'cheerful',\n 'subjective',\n 'forward',\n 'surviving',\n 'exotic',\n 'purple',\n 'cautious',\n 'visiting',\n 'aggregate',\n 'ethical',\n 'teenage',\n 'dying',\n 'disastrous',\n 'delicious',\n 'confidential',\n 'underground',\n 'thorough',\n 'grim',\n 'autonomous',\n 'atomic',\n 'frozen',\n 'colourful',\n 'injured',\n 'uniform',\n 'ashamed',\n 'glorious',\n 'wicked',\n 'coherent',\n 'rising',\n 'shy',\n 'novel',\n 'balanced',\n 'delightful',\n 'arbitrary',\n 'adjacent',\n 'worrying',\n 'weird',\n 'unchanged',\n 'rolling',\n 'evolutionary',\n 'intimate',\n 'sporting',\n 'disciplinary',\n 'formidable',\n 'lexical',\n 'noisy',\n 'gradual',\n 'accused',\n 'homeless',\n 'supporting',\n 'coming',\n 'renewed',\n 'excess',\n 'retired',\n 'rubber',\n 'chosen',\n 'outdoor',\n 'embarrassing',\n 'preferred',\n 'bizarre',\n 'appalling',\n 'agreed',\n 'imaginative',\n 'governing',\n 'accepted',\n 'vocational',\n 'mighty',\n 'puzzled',\n 'worldwide',\n 'organisational',\n 'sunny',\n 'eldest',\n 'eventual',\n 'spontaneous',\n 'vivid',\n 'rude',\n 'faithful',\n 'ministerial',\n 'innovative',\n 'controlled',\n 'conceptual',\n 'unwilling',\n 'civic',\n 'meaningful',\n 'alive',\n 'brainy',\n 'breakable',\n 'busy',\n 'careful',\n 'cautious',\n 'clever',\n 'concerned',\n 'crazy',\n 'curious',\n 'dead',\n 'different',\n 'difficult',\n 'doubtful',\n 'easy',\n 'famous',\n 'fragile',\n 'helpful',\n 'helpless',\n 'important',\n 'impossible',\n 'innocent',\n 'inquisitive',\n 'modern',\n 'open',\n 'outstanding',\n 'poor',\n 'powerful',\n 'puzzled',\n 'real',\n 'rich',\n 'shy',\n 'sleepy',\n 'super',\n 'tame',\n 'uninterested',\n 'wandering',\n 'wild',\n 'wrong',\n 'adorable',\n 'alert',\n 'average',\n 'beautiful',\n 'blonde',\n 'bloody',\n 'blushing',\n 'bright',\n 'clean',\n 'clear',\n 'cloudy',\n 'colorful',\n 'crowded',\n 'cute',\n 'dark',\n 'drab',\n 'distinct',\n 'dull',\n 'elegant',\n 'fancy',\n 'filthy',\n 'glamorous',\n 'gleaming',\n 'graceful',\n 'grotesque',\n 'homely',\n 'light',\n 'misty',\n 'motionless',\n 'muddy',\n 'plain',\n 'poised',\n 'quaint',\n 'shiny',\n 'smoggy',\n 'sparkling',\n 'spotless',\n 'stormy',\n 'strange',\n 'ugly',\n 'unsightly',\n 'unusual',\n 'bad',\n 'better',\n 'beautiful',\n 'big',\n 'black',\n 'blue',\n 'bright',\n 'clumsy',\n 'crazy',\n 'dizzy',\n 'dull',\n 'fat',\n 'frail',\n 'friendly',\n 'funny',\n 'great',\n 'green',\n 'gigantic',\n 'gorgeous',\n 'grumpy',\n 'handsome',\n 'happy',\n 'horrible',\n 'itchy',\n 'jittery',\n 'jolly',\n 'kind',\n 'long',\n 'lazy',\n 'magnificent',\n 'magenta',\n 'many',\n 'mighty',\n 'mushy',\n 'nasty',\n 'new',\n 'nice',\n 'nosy',\n 'nutty',\n 'nutritious',\n 'odd',\n 'orange',\n 'ordinary',\n 'pretty',\n 'precious',\n 'prickly',\n 'purple',\n 'quaint',\n 'quiet',\n 'quick',\n 'quickest',\n 'rainy',\n 'rare',\n 'ratty',\n 'red',\n 'roasted',\n 'robust',\n 'round',\n 'sad',\n 'scary',\n 'scrawny',\n 'short',\n 'silly',\n 'stingy',\n 'strange',\n 'striped',\n 'spotty',\n 'tart',\n 'tall',\n 'tame',\n 'tan',\n 'tender',\n 'testy',\n 'tricky',\n 'tough',\n 'ugly',\n 'ugliest',\n 'vast',\n 'watery',\n 'wasteful',\n 'wonderful',\n 'yellow',\n 'yummy',\n 'zany',\n];\n\nexport default {\n gunOnceDefined,\n gunAsAnotherUser,\n async getHash (str: string, format = `base64`) {\n if (!str) {\n return undefined;\n }\n const hash = await Gun.SEA.work(str, undefined, undefined, {name: `SHA-256`});\n if (!hash) {\n throw new Error(`Gun.SEA.work failed for ${str}`);\n }\n if (hash.length > 44) {\n throw new Error(`Gun.SEA.work returned an invalid SHA-256 hash longer than 44 chars: ${hash}. This is probably due to a sea.js bug on Safari.`);\n }\n if (format === `hex`) {\n return this.base64ToHex(hash);\n }\n return hash;\n },\n\n capitalize(s: string) {\n return s.charAt(0).toUpperCase() + s.slice(1)\n },\n\n generateName() {\n return `${this.capitalize(_.sample(adjectives)!)} ${this.capitalize(_.sample(animals)!)}`;\n },\n\n base64ToHex(str: string) {\n const raw = atob(str);\n let result = '';\n for (let i = 0; i < raw.length; i++) {\n const hex = raw.charCodeAt(i).toString(16);\n result += (hex.length === 2 ? hex : `0${ hex}`);\n }\n return result;\n },\n\n getCaret(el: HTMLInputElement) {\n if (el.selectionStart) {\n return el.selectionStart;\n } else { // @ts-ignore\n if (document.selection) {\n el.focus();\n // @ts-ignore\n const r = document.selection.createRange();\n if (r === null) {\n return 0;\n }\n // @ts-ignore\n const re = el.createTextRange(), rc = re.duplicate();\n re.moveToBookmark(r.getBookmark());\n rc.setEndPoint('EndToStart', re);\n return rc.text.length;\n }\n }\n return 0;\n },\n\n injectCss() {\n const elementId = `irisStyle`;\n if (document.getElementById(elementId)) {\n return;\n }\n const sheet = document.createElement(`style`);\n sheet.id = elementId;\n sheet.innerHTML = `\n .iris-follow-button .hover {\n display: none;\n }\n\n .iris-follow-button.following:hover .hover {\n display: inline;\n }\n\n .iris-follow-button.following:hover .nonhover {\n display: none;\n }\n\n .iris-identicon * {\n box-sizing: border-box;\n }\n\n .iris-identicon {\n vertical-align: middle;\n border-radius: 50%;\n text-align: center;\n display: inline-block;\n position: relative;\n max-width: 100%;\n }\n\n .iris-distance {\n z-index: 2;\n position: absolute;\n left:0%;\n top:2px;\n width: 100%;\n text-align: right;\n color: #fff;\n text-shadow: 0 0 1px #000;\n font-size: 75%;\n line-height: 75%;\n font-weight: bold;\n }\n\n .iris-pie {\n border-radius: 50%;\n position: absolute;\n top: 0;\n left: 0;\n box-shadow: 0px 0px 0px 0px #82FF84;\n padding-bottom: 100%;\n max-width: 100%;\n -webkit-transition: all 0.2s ease-in-out;\n -moz-transition: all 0.2s ease-in-out;\n transition: all 0.2s ease-in-out;\n }\n\n .iris-card {\n padding: 10px;\n background-color: #f7f7f7;\n color: #777;\n border: 1px solid #ddd;\n display: flex;\n flex-direction: row;\n overflow: hidden;\n }\n\n .iris-card a {\n -webkit-transition: color 150ms;\n transition: color 150ms;\n text-decoration: none;\n color: #337ab7;\n }\n\n .iris-card a:hover, .iris-card a:active {\n text-decoration: underline;\n color: #23527c;\n }\n\n .iris-pos {\n color: #3c763d;\n }\n\n .iris-neg {\n color: #a94442;\n }\n\n .iris-identicon img {\n position: absolute;\n top: 0;\n left: 0;\n max-width: 100%;\n border-radius: 50%;\n border-color: transparent;\n border-style: solid;\n }\n\n .iris-chat-open-button {\n background-color: #1e1e1e;\n color: #fff;\n padding: 15px;\n cursor: pointer;\n user-select: none;\n }\n\n .iris-chat-open-button svg {\n width: 1em;\n }\n\n .iris-chat-open-button, .iris-chat-box {\n position: fixed;\n bottom: 0.5rem;\n right: 0.5rem;\n border-radius: 8px;\n font-family: system-ui;\n font-size: 15px;\n }\n\n .iris-chat-box {\n background-color: #fff;\n max-height: 25rem;\n box-shadow: 2px 2px 20px rgba(0, 0, 0, 0.2);\n height: calc(100% - 44px);\n display: flex;\n flex-direction: column;\n width: 320px;\n color: rgb(38, 38, 38);\n }\n\n .iris-chat-box.minimized {\n height: auto;\n }\n\n .iris-chat-box.minimized .iris-chat-header {\n border-radius: 8px;\n cursor: pointer;\n }\n\n .iris-chat-box.minimized .iris-chat-messages, .iris-chat-box.minimized .iris-typing-indicator, .iris-chat-box.minimized .iris-chat-input-wrapper, .iris-chat-box.minimized .iris-chat-minimize, .iris-chat-box.minimized .iris-chat-close {\n display: none;\n }\n\n .iris-chat-header {\n background-color: #1e1e1e;\n height: 44px;\n color: #fff;\n border-radius: 8px 8px 0 0;\n text-align: center;\n display: flex;\n flex-direction: row;\n justify-content: center;\n align-items: center;\n flex: none;\n white-space: nowrap;\n text-overflow: ellipsis;\n overflow: hidden;\n }\n\n .iris-chat-header-text {\n flex: 1;\n }\n\n .iris-online-indicator {\n color: #bfbfbf;\n margin-right: 5px;\n font-size: 12px;\n user-select: none;\n flex: none;\n }\n\n .iris-online-indicator.yes {\n color: #80bf5f;\n }\n\n .iris-typing-indicator {\n display: none;\n background-color: rgba(255, 255, 255, 0.5);\n font-size: 12px;\n padding: 2px;\n color: #777;\n }\n\n .iris-typing-indicator.yes {\n display: block;\n }\n\n .iris-chat-messages {\n flex: 1;\n padding: 15px;\n overflow-y: scroll;\n }\n\n .iris-chat-input-wrapper {\n flex: none;\n padding: 15px;\n background-color: #efefef;\n display: flex;\n flex-direction: row;\n border-radius: 0 0 8px 8px;\n }\n\n .iris-chat-input-wrapper textarea {\n padding: 15px 8px;\n border-radius: 4px;\n border: 1px solid rgba(0,0,0,0);\n width: auto;\n font-size: 15px;\n resize: none;\n flex: 1;\n }\n\n .iris-chat-input-wrapper textarea:focus {\n outline: none;\n border: 1px solid #6dd0ed;\n }\n\n .iris-chat-input-wrapper button svg {\n display: inline-block;\n font-size: inherit;\n height: 1em;\n width: 1em;\n overflow: visible;\n vertical-align: -0.125em;\n }\n\n .iris-chat-input-wrapper button, .iris-chat-input-wrapper button:hover, .iris-chat-input-wrapper button:active, .iris-chat-input-wrapper button:focus {\n flex: none;\n color: #999;\n background-color: transparent;\n font-size: 30px;\n padding: 5px;\n border: 1px solid rgba(0,0,0,0);\n border-radius: 4px;\n margin-left: 5px;\n }\n\n .iris-chat-input-wrapper button:active, .iris-chat-input-wrapper button:focus {\n outline: none;\n border: 1px solid #6dd0ed;\n }\n\n .iris-chat-message {\n display: flex;\n flex-direction: column;\n margin-bottom: 2px;\n overflow-wrap: break-word;\n }\n\n .iris-msg-content {\n background-color: #efefef;\n padding: 6px 10px;\n border-radius: 8px;\n box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.1);\n flex: none;\n max-width: 75%;\n }\n\n .emoji {\n font-size: 1.3em;\n line-height: 1em;\n }\n\n .iris-chat-message .emoji-only {\n font-size: 3em;\n text-align: center;\n }\n\n .iris-seen {\n color: rgba(0, 0, 0, 0.45);\n user-select: none;\n }\n\n .iris-seen.yes {\n color: #4fc3f7;\n }\n\n .iris-seen svg {\n width: 18px;\n }\n\n .iris-delivered-checkmark {\n display: none;\n }\n\n .delivered .iris-delivered-checkmark {\n display: initial;\n }\n\n .iris-chat-minimize, .iris-chat-close {\n user-select: none;\n cursor: pointer;\n width: 45px;\n line-height: 44px;\n }\n\n .iris-chat-message.their {\n align-items: flex-start;\n }\n\n .iris-chat-message.their + .iris-chat-message.our .iris-msg-content, .day-separator + .iris-chat-message.our .iris-msg-content {\n margin-top: 15px;\n border-radius: 8px 0px 8px 8px;\n }\n\n .iris-chat-message.their:first-of-type .iris-msg-content {\n border-radius: 0px 8px 8px 8px;\n }\n\n .iris-chat-message.our:first-of-type .iris-msg-content {\n border-radius: 8px 0px 8px 8px;\n }\n\n .iris-chat-message.our + .iris-chat-message.their .iris-msg-content, .day-separator + .iris-chat-message.their .iris-msg-content {\n margin-top: 15px;\n border-radius: 0px 8px 8px 8px;\n }\n\n .iris-chat-message.our {\n align-items: flex-end;\n }\n\n .iris-chat-message.our .iris-msg-content {\n background-color: #c5ecf7;\n }\n\n .iris-chat-message .time {\n text-align: right;\n font-size: 12px;\n color: rgba(0, 0, 0, 0.45);\n }\n\n .iris-non-string {\n color: blue;\n }\n\n .day-separator {\n display: inline-block;\n border-radius: 8px;\n background-color: rgba(227, 249, 255, 0.91);\n padding: 6px 10px;\n margin-top: 15px;\n margin-left: auto;\n margin-right: auto;\n text-transform: uppercase;\n font-size: 13px;\n color: rgba(74, 74, 74, 0.88);\n box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.1);\n user-select: none;\n }\n\n .day-separator:first-of-type {\n margin-top: 0;\n }\n\n *[contenteditable=\"true\"]:not(:focus) {\n cursor: pointer;\n }\n\n *[contenteditable=\"true\"] {\n outline: none;\n }\n\n [placeholder]:empty:before {\n content: attr(placeholder);\n color: #999;\n }\n\n [placeholder]:empty:focus {\n cursor: text;\n }\n `;\n document.head.prepend(sheet);\n },\n\n getUrlParameter(sParam: string, sParams: string) {\n const sPageURL = sParams || window.location.search.substring(1);\n const sURLVariables = sPageURL.split('&');\n let sParameterName, i;\n\n for (i = 0; i < sURLVariables.length; i++) {\n sParameterName = sURLVariables[i].split('=');\n if (sParameterName[0] === sParam) {\n return sParameterName[1] === undefined ? true : decodeURIComponent(sParameterName[1]);\n }\n }\n return;\n },\n\n formatTime(date: Date) {\n // @ts-ignore\n const t: any = date.toLocaleTimeString(undefined, {timeStyle: 'short'});\n const s = t.split(':');\n if (s.length === 3) { // safari tries to display seconds\n return `${s[0] }:${ s[1] }${s[2].slice(2)}`;\n }\n return t;\n },\n\n formatDate(date: Date) {\n const t = date.toLocaleString(undefined, {dateStyle: 'short', timeStyle: 'short'});\n const s = t.split(':');\n if (s.length === 3) { // safari tries to display seconds\n return `${s[0] }:${ s[1] }${s[2].slice(2)}`;\n }\n return t;\n },\n\n getDaySeparatorText(date: Date, dateStr: string, now?: Date, nowStr?: string) {\n if (!now) {\n now = new Date();\n // @ts-ignore\n nowStr = now.toLocaleDateString({dateStyle: 'short'});\n }\n if (dateStr === nowStr) {\n return 'today';\n }\n const dayDifference = Math.round((now - date) / (1000 * 60 * 60 * 24));\n if (dayDifference === 0) {\n return 'today';\n }\n if (dayDifference === 1) {\n return 'yesterday';\n }\n if (dayDifference <= 5) {\n return date.toLocaleDateString(undefined, {weekday: 'long'});\n }\n return dateStr;\n },\n\n getProfileLink(pub: string) {\n return `${window.location.origin}/#/profile/${encodeURIComponent(pub)}`;\n },\n\n truncateString(s: string, length = 30) {\n return s.length > length ? `${s.slice(0, length)}...` : s;\n },\n\n createElement(type: string, cls?: string, parent?: HTMLElement) {\n const el = document.createElement(type);\n if (cls) {\n el.setAttribute('class', cls);\n }\n if (parent) {\n parent.appendChild(el);\n }\n return el;\n },\n\n isNode,\n isElectron,\n isMobile,\n\n throttle: (func: Function, limit: number) => {\n let inThrottle: boolean;\n return function() {\n const args = arguments;\n const context = this;\n if (!inThrottle) {\n func.apply(context, args);\n inThrottle = true;\n setTimeout(() => inThrottle = false, limit);\n }\n };\n },\n debounce: (func: Function, delay: number) => {\n let inDebounce: boolean;\n return function() {\n const context = this;\n const args = arguments;\n clearTimeout(inDebounce);\n inDebounce = setTimeout(() => func.apply(context, args), delay);\n };\n },\n sample: (arr: any[]) => arr[Math.floor(Math.random() * arr.length)],\n sampleSize: (arr: any[], size: number) => {\n const shuffled = arr.slice(0);\n let i = arr.length;\n let min = i - size;\n let temp;\n let index;\n while (i-- > min) {\n index = Math.floor((i + 1) * Math.random());\n temp = shuffled[index];\n shuffled[index] = shuffled[i];\n shuffled[i] = temp;\n }\n return shuffled.slice(min);\n },\n defer: (func: Function) => setTimeout(func, 0),\n once: (func: Function) => {\n let called = false;\n return function() {\n if (called) {\n return;\n }\n called = true;\n func.apply(this, arguments);\n };\n },\n omit: (obj: any, keys: string[]) => {\n const newObj = {};\n Object.keys(obj).forEach(key => {\n if (!keys.includes(key)) {\n newObj[key] = obj[key];\n }\n });\n return newObj;\n }\n};\n","import session from './session';\nimport _ from './lodash';\nimport Gun from 'gun';\nimport util from './util';\nimport publicState from './global';\n\nconst ELECTRON_GUN_URL = 'http://localhost:8767/gun';\nlet maxConnectedPeers = 2;\n\ntype Peer = {\n url?: string;\n enabled?: boolean;\n from?: string;\n visibility?: string;\n}\n\ntype Peers = {\n [key: string]: Peer\n}\n\nconst DEFAULT_PEERS: Peers = {\n 'https://gun-rs.iris.to/gun': {},\n 'https://gun-us.herokuapp.com/gun': {},\n};\n\nconst loc = window.location;\nconst host = loc.host;\nconst is_localhost_but_not_dev = host.startsWith('localhost') && host !== 'localhost:8080';\nif (loc.hostname.endsWith('herokuapp.com') || is_localhost_but_not_dev) {\n Object.keys(DEFAULT_PEERS).forEach(url => DEFAULT_PEERS[url].enabled = false);\n DEFAULT_PEERS[`${loc.origin}/gun`] = {enabled: true};\n}\n\nconst urlRegex = /^(https?:\\/\\/)?([\\da-z.-]+)\\.([a-z.]{2,6})([\\/\\w .-]*)*\\/?$/;\n\n/**\n * Networking and peer management utilities\n */\nexport default {\n known: {} as Peers,\n\n /** */\n async add(peer: Peer) {\n if (peer.url && !urlRegex.test(peer.url)) {\n throw new Error(`Invalid url ${peer.url}`);\n }\n\n if (peer.from) {\n Object.keys(this.known).forEach(k => {\n if (this.known[k].from === peer.from) { // remove previous peer url from the same user\n delete this.known[k];\n }\n });\n }\n const url = peer.url || '';\n this.known[url] = this.known[url] || _.omit(peer, ['url']);\n if (peer.visibility === 'public') {\n // rolling some crypto operations to obfuscate actual url in case we want to remove it\n let secret = await Gun.SEA.secret(session.getKey().epub, session.getKey()) || '';\n let encryptedUrl = await Gun.SEA.encrypt(peer.url, secret);\n let encryptedUrlHash = await Gun.SEA.work(encryptedUrl, null, null, {name: 'SHA-256'});\n publicState().user().get('peers').get(encryptedUrlHash).put({url: peer.url, lastSeen: new Date().toISOString()});\n }\n if (peer.enabled !== false) {\n peer.url && this.connect(peer.url); // this calls savePeers()\n } else {\n this.save();\n }\n },\n\n /** */\n remove(url: string) {\n delete this.known[url];\n this.save();\n },\n\n /** */\n disconnect(peerFromGun: any) {\n publicState().on('bye', peerFromGun);\n peerFromGun.url = '';\n },\n\n save() {\n localStorage.setItem('gunPeers', JSON.stringify(this.known));\n },\n\n getSaved() {\n let p: any = localStorage.getItem('gunPeers');\n if (p && p !== 'undefined') {\n p = JSON.parse(p);\n } else {\n p = DEFAULT_PEERS;\n }\n if (util.isElectron) {\n p[ELECTRON_GUN_URL] = {};\n }\n Object.keys(p).forEach(k => _.defaults(p[k], {enabled: true}));\n return p;\n },\n\n /** */\n reset() {\n localStorage.setItem('gunPeers', '');\n this.known = this.getSaved();\n },\n\n /** */\n connect(url: string) {\n if (this.isMixedContent(url)) { return; }\n if (this.known[url]) {\n this.known[url].enabled = true;\n publicState().opt({peers: [url]});\n this.save();\n } else {\n this.add({url});\n }\n },\n\n /** */\n disable(url: string, peerFromGun: any) {\n this.known[url].enabled = false;\n if (peerFromGun) {\n this.disconnect(peerFromGun);\n }\n this.save();\n },\n\n isMixedContent(url: string) {\n return window.location.protocol === 'https:' && (url.indexOf('http:') === 0);\n },\n\n random() {\n const connectToLocalElectron = util.isElectron && this.known[ELECTRON_GUN_URL] && this.known[ELECTRON_GUN_URL].enabled !== false;\n const sampleSize = connectToLocalElectron ? Math.max(maxConnectedPeers - 1, 1) : maxConnectedPeers;\n const sample = _.sampleSize(\n Object.keys(\n _.pickBy(this.known, (peer: any, url: string) => {\n return !this.isMixedContent(url) && peer.enabled && !(util.isElectron && url === ELECTRON_GUN_URL);\n })\n ), sampleSize\n );\n if (sample && connectToLocalElectron) {\n sample.push(ELECTRON_GUN_URL);\n }\n return sample;\n },\n\n checkGunPeerCount() {\n let peersFromGun = publicState().back('opt.peers');\n let connectedPeers = Object.values(peersFromGun).filter((peer: any) => {\n if (peer && peer.wire && peer.wire.constructor.name !== 'WebSocket') {\n console.log('WebRTC peer', peer);\n }\n return peer && peer.wire && peer.wire.readyState === 1 && peer.wire.bufferedAmount === 0 && peer.wire.constructor.name === 'WebSocket';\n });\n if (connectedPeers.length < maxConnectedPeers) {\n let unconnectedPeers = Object.keys(this.known).filter(url => {\n let addedToGun = Object.values(peersFromGun).map((peer:any) => peer.url).indexOf(url) > -1;\n let enabled = this.known[url].enabled;\n const mixedContent = (window.location.protocol === 'https:' && (url.indexOf('http:') === 0));\n return !mixedContent && enabled && !addedToGun;\n });\n if (unconnectedPeers.length) {\n const sample = String(_.sample(unconnectedPeers));\n this.connect(sample);\n }\n }\n if (connectedPeers.length > maxConnectedPeers) {\n this.disconnect(_.sample(connectedPeers));\n }\n },\n\n init() {\n this.known = this.getSaved();\n /* use the default value of 1 for now because of memory issue\n local().get('settings').get('maxConnectedPeers').on(n => {\n if (n !== undefined) maxConnectedPeers = n;\n });\n */\n setInterval(() => this.checkGunPeerCount(), 1000);\n }\n};\n",";(function(){\n/* // from @jabis\nif (navigator.storage && navigator.storage.estimate) {\n const quota = await navigator.storage.estimate();\n // quota.usage -> Number of bytes used.\n // quota.quota -> Maximum number of bytes available.\n const percentageUsed = (quota.usage / quota.quota) * 100;\n console.log(`You've used ${percentageUsed}% of the available storage.`);\n const remaining = quota.quota - quota.usage;\n console.log(`You can write up to ${remaining} more bytes.`);\n}\n*/\n function Store(opt){\n opt = opt || {};\n opt.file = String(opt.file || 'radata');\n var store = Store[opt.file], db = null, u;\n\n if(store){\n console.log(\"Warning: reusing same IndexedDB store and options as 1st.\");\n return Store[opt.file];\n }\n store = Store[opt.file] = function(){};\n\n try{opt.indexedDB = opt.indexedDB || Store.indexedDB || indexedDB}catch(e){}\n try{if(!opt.indexedDB || 'file:' == location.protocol){\n var s = store.d || (store.d = {});\n store.put = function(f, d, cb){ s[f] = d; setTimeout(function(){ cb(null, 1) },250) };\n store.get = function(f, cb){ setTimeout(function(){ cb(null, s[f] || u) },5) };\n console.log('Warning: No indexedDB exists to persist data to!');\n return store;\n }}catch(e){}\n \n\n store.start = function(){\n var o = indexedDB.open(opt.file, 1);\n o.onupgradeneeded = function(eve){ (eve.target.result).createObjectStore(opt.file) }\n o.onsuccess = function(){ db = o.result }\n o.onerror = function(eve){ console.log(eve||1); }\n }; store.start();\n\n store.put = function(key, data, cb){\n if(!db){ setTimeout(function(){ store.put(key, data, cb) },1); return }\n var tx = db.transaction([opt.file], 'readwrite');\n var obj = tx.objectStore(opt.file);\n var req = obj.put(data, ''+key);\n req.onsuccess = obj.onsuccess = tx.onsuccess = function(){ cb(null, 1) }\n req.onabort = obj.onabort = tx.onabort = function(eve){ cb(eve||'put.tx.abort') }\n req.onerror = obj.onerror = tx.onerror = function(eve){ cb(eve||'put.tx.error') }\n }\n\n store.get = function(key, cb){\n if(!db){ setTimeout(function(){ store.get(key, cb) },9); return }\n var tx = db.transaction([opt.file], 'readonly');\n var obj = tx.objectStore(opt.file);\n var req = obj.get(''+key);\n req.onsuccess = function(){ cb(null, req.result) }\n req.onabort = function(eve){ cb(eve||4) }\n req.onerror = function(eve){ cb(eve||5) }\n }\n setInterval(function(){ db && db.close(); db = null; store.start() }, 1000 * 15); // reset webkit bug?\n return store;\n }\n\n if(typeof window !== \"undefined\"){\n (Store.window = window).RindexedDB = Store;\n Store.indexedDB = window.indexedDB; // safari bug\n } else {\n try{ module.exports = Store }catch(e){}\n }\n\n try{\n var Gun = Store.window.Gun || require('../gun');\n Gun.on('create', function(root){\n this.to.next(root);\n root.opt.store = root.opt.store || Store(root.opt);\n });\n }catch(e){}\n\n}());","import Gun from 'gun';\nimport 'gun/sea';\nimport 'gun/lib/yson';\nimport 'gun/lib/radix';\nimport 'gun/lib/radisk';\nimport 'gun/lib/store';\nimport 'gun/lib/rindexed';\nimport peers from \"./peers\";\n\nlet global: any;\n\nexport default function(opts: any = {}) {\n if (!global) {\n const myOpts = Object.assign({ peers: (opts.peers || peers.random()), localStorage: false, retry:Infinity }, opts);\n if (opts.peers) {\n opts.peers.forEach((url: string) => peers.add({url}));\n }\n peers.init();\n global = new Gun(myOpts);\n }\n return global;\n}","// @ts-nocheck\n\n/*eslint no-useless-escape: \"off\", camelcase: \"off\" */\n\nconst UNIQUE_ID_VALIDATORS = {\n email: /^([\\w-]+(?:\\.[\\w-]+)*)@((?:[\\w-]+\\.)*\\w[\\w-]{0,66})\\.([a-z]{2,6}(?:\\.[a-z]{2})?)$/i,\n bitcoin: /^[13][a-km-zA-HJ-NP-Z0-9]{26,33}$/,\n bitcoin_address: /^[13][a-km-zA-HJ-NP-Z0-9]{26,33}$/,\n ip: /^(([1-9]?\\d|1\\d\\d|2[0-5][0-5]|2[0-4]\\d)\\.){3}([1-9]?\\d|1\\d\\d|2[0-5][0-5]|2[0-4]\\d)$/,\n ipv6: /^(?:[A-F0-9]{1,4}:){7}[A-F0-9]{1,4}$/,\n gpg_fingerprint: null,\n gpg_keyid: null,\n google_oauth2: null,\n tel: /^\\d{7,}$/,\n phone: /^\\d{7,}$/,\n keyID: null,\n url: /[-a-zA-Z0-9@:%_\\+.~#?&//=]{2,256}\\.[a-z]{2,4}\\b(\\/[-a-zA-Z0-9@:%_\\+.~#?&//=]*)?/gi,\n account: /^([\\w-]+(?:\\.[\\w-]+)*)@((?:[\\w-]+\\.)*\\w[\\w-]{0,66})\\.([a-z]{2,6}(?:\\.[a-z]{2})?)$/i,\n uuid: /[0-9a-f]{8}\\-[0-9a-f]{4}\\-[0-9a-f]{4}\\-[0-9a-f]{4}\\-[0-9a-f]{12}/\n};\n\n// TODO this class could perhaps be removed\n\nclass Attribute {\n constructor(a, b) {\n if (typeof a === `object`) {\n if (typeof a.value !== `string`) { throw new Error(`param1.value must be a string, got ${typeof a.value}: ${JSON.stringify(a.value)}`); }\n if (typeof a.type !== `string`) { throw new Error(`param1.type must be a string, got ${typeof a.type}: ${JSON.stringify(a.type)}`); }\n b = a.value;\n a = a.type;\n }\n if (typeof a !== `string`) { throw new Error(`First param must be a string, got ${typeof a}: ${JSON.stringify(a)}`); }\n if (!a.length) { throw new Error(`First param string is empty`); }\n if (b) {\n if (typeof b !== `string`) { throw new Error(`Second parameter must be a string, got ${typeof b}: ${JSON.stringify(b)}`); }\n if (!b.length) { throw new Error(`Second param string is empty`); }\n this.type = a;\n this.value = b;\n } else {\n this.value = a;\n const t = Attribute.guessTypeOf(this.value);\n if (t) {\n this.type = t;\n } else {\n throw new Error(`Type of attribute was omitted and could not be guessed`);\n }\n }\n }\n\n static getUuid() {\n const b = a => a ? (a ^ Math.random() * 16 >> a / 4).toString(16) : ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, b);\n return new Attribute(`uuid`, b());\n }\n\n static getUniqueIdValidators() {\n return UNIQUE_ID_VALIDATORS;\n }\n\n static isUniqueType(type) {\n return Object.keys(UNIQUE_ID_VALIDATORS).indexOf(type) > -1;\n }\n\n isUniqueType() {\n return Attribute.isUniqueType(this.type);\n }\n\n static guessTypeOf(value) {\n for (const key in UNIQUE_ID_VALIDATORS) {\n if (value.match(UNIQUE_ID_VALIDATORS[key])) {\n return key;\n }\n }\n }\n\n static equals(a, b) {\n return a.equals(b);\n }\n\n equals(a) {\n return a && this.type === a.type && this.value === a.value;\n }\n\n uri() {\n return `${encodeURIComponent(this.value)}:${encodeURIComponent(this.type)}`;\n }\n}\n\nexport default Attribute;\n","import publicState from './global';\nimport session from './session';\n\nlet currentUser: any;\n\n/**\n * Get a public space where only the specified user (public key) can write. Others can read.\n * @param pub The public key of the user. Defaults to the current user from session.\n * @returns {Node} The user space.\n */\nexport default function(pub?: string) {\n if (!currentUser) {\n currentUser = publicState().user();\n currentUser.auth(session.getKey());\n }\n return pub ? publicState().user(pub) : currentUser;\n}\n","// @ts-nocheck\n\nimport Gun from 'gun';\nimport 'gun/sea';\nimport util from './util';\nimport Attribute from './Attribute';\nimport session from './session';\nimport publicState from './global';\nimport userState from './public';\n\n// TODO: extract Group channels into their own class\n\nconst DEFAULT_PERMISSIONS = {read: true, write: true, admin: false};\n\n/**\n* Private communication channel between two or more participants ([Gun](https://github.com/amark/gun) public keys). Can be used independently of other Iris stuff.\n*\n* Used as a core element of [iris-messenger](https://github.com/irislib/iris-messenger).\n*\n* You can use iris.private(pub) to always use the same Channel object for a given pub.\n*\n* ---\n*\n* #### Key-value API\n* `channel.put(key, value)` and `channel.on(key, callback)`.\n*\n* Note that each participant has their own versions of each key-value — they don't overwrite each other. `channel.on()` callback returns them all by default and has a parameter that indicates whose value you got.\n*\n* While values are encrypted, encryption of keys is not implemented yet.\n*\n* #### Message API\n* `channel.send()` and `channel.getMessages()` for timestamp-indexed chat-style messaging.\n*\n* Message data is encrypted, but timestamps are public so that peers can return your messages in a sequential order.\n*\n* ---\n*\n* You can open a channel with yourself for a private key-value space or a \"note to self\" type chat with yourself.\n*\n* **Privacy disclaimer:** Channel ids, data values and messages are encrypted, but message timestamps are unencrypted so that peers can return them to you in a sequential order. By looking at the unencrypted timestamps (or Gun subscriptions), it is possible to guess who are communicating with each other. This could be improved by indexing messages by *day* only, so making the guess would be more difficult, while you could still return them in a semi-sequential order.\n*\n* @param {Object} options\n* @param {string} options.key your keypair\n* @param {Object} options.gun [gun](https://github.com/amark/gun) instance\n* @param options.participants (optional) string or string array or permissions object ({'pub1':{read:true,write:true,admin:false},'pub2'...}) of participant public keys (your own key is included by default)\n* @param {string} options.chatLink (optional) chat link instead of participants list\n* @param {string} options.uuid (group channels only) unique channel identifier. Leave out for new channel.\n* @param {string} options.name (group channels only) channel name\n* @example\n* // Copy & paste this to console at https://iris.to or other page that has gun, sea and iris-lib\n* // Due to an unsolved bug, someoneElse's messages only start showing up after a reload\n*\n* var gun1 = new Gun('https://gun-us.herokuapp.com/gun');\n* var gun2 = new Gun('https://gun-us.herokuapp.com/gun');\n* var myKey = await iris.Key.getDefault();\n* var someoneElse = localStorage.getItem('someoneElsesKey');\n* if (someoneElse) {\n* someoneElse = JSON.parse(someoneElse);\n* } else {\n* someoneElse = await iris.Key.generate();\n* localStorage.setItem('someoneElsesKey', JSON.stringify(someoneElse));\n* }\n*\n* iris.Channel.initUser(gun1, myKey); // saves myKey.epub to gun.user().get('epub')\n* iris.Channel.initUser(gun2, someoneElse);\n*\n* var ourChannel = new iris.Channel({key: myKey, gun: gun1, participants: someoneElse.pub});\n* var theirChannel = new iris.Channel({key: someoneElse, gun: gun2, participants: myKey.pub});\n*\n* var myChannels = {}; // you can list them in a user interface\n* function printMessage(msg, info) {\n* console.log(`[${new Date(msg.time).toLocaleString()}] ${info.from.slice(0,8)}: ${msg.text}`)\n* }\n* iris.Channel.getChannels(gun1, myKey, channel => {\n* var pub = channel.getCurrentParticipants()[0];\n* gun1.user(pub).get('profile').get('name').on(name => channel.name = name);\n* myChannels[pub] = channel;\n* channel.getMessages(printMessage);\n* channel.on('mood', (mood, from) => console.log(from.slice(0,8) + ' is feeling ' + mood));\n* });\n*\n* // you can play with these in the console:\n* ourChannel.send('message from myKey');\n* theirChannel.send('message from someoneElse');\n*\n* ourChannel.put('mood', 'blessed');\n* theirChannel.put('mood', 'happy');\n*\n* @example https://github.com/irislib/iris-lib/blob/master/__tests__/Channel.js\n*/\nclass Channel {\n // TODO: these should be done in a cleaner way\n latestTime: any;\n theirMsgsLastSeenDate: any;\n myLastSeenTime: any;\n theirMsgsLastSeenTime: any;\n notificationSetting: any;\n messageIds: any; // this is used from session.processMessage\n latest: any;\n uuid: any;\n name: any;\n attachments: any;\n\n theirSecretUuids = {};\n theirGroupSecrets = {};\n secrets = {};\n ourSecretChannelIds = {};\n theirSecretChannelIds = {};\n messages = {};\n chatLinks = {};\n groupSubscriptions = {};\n directSubscriptions = {};\n getParticipantsCallbacks = {};\n myGroupSecret: any;\n participants: any;\n\n constructor(options: any) {\n this.myGroupSecret = options.myGroupSecret;\n\n if (options.chatLink) {\n this.useChatLink(options);\n }\n\n if (typeof options.participants === `string`) {\n this.addParticipant(options.participants, options.save);\n } else if (Array.isArray(options.participants)) {\n const o = {};\n options.participants.forEach(p => o[p] = Object.assign({}, DEFAULT_PERMISSIONS));\n options.participants = o;\n }\n if (typeof options.participants === `object`) { // it's a group channel\n const keys = Object.keys(options.participants);\n keys.forEach(k => {\n if (k !== session.getKey().pub) {\n this.addParticipant(k, options.save, Object.assign({}, DEFAULT_PERMISSIONS, options.participants[k]));\n }\n });\n options.participants[session.getKey().pub] = options.participants[session.getKey().pub] || Object.assign({}, DEFAULT_PERMISSIONS);\n if (options.uuid) {\n this.uuid = options.uuid;\n this.name = options.name;\n } else {\n options.uuid = Attribute.getUuid().value;\n this.uuid = options.uuid;\n options.participants[session.getKey().pub].admin = true;\n options.participants[session.getKey().pub].founder = true;\n }\n this.getChatLinks({subscribe: true});\n }\n this.participants = options.participants;\n if (options.uuid) { // It's a group channel\n // share secret uuid with other participants. since secret is already non-deterministic, maybe uuid could also be?\n // generate channel-specific secret and share it with other participants\n // put() keys should be encrypted first? so you could do put(uuid, secret)\n // what if you join the channel with 2 unconnected devices? on reconnect, the older secret would be overwritten and messages unreadable. maybe participants should store each others' old keys? or maybe you should store them and re-encrypt old stuff when key changes? return them with map() instead?\n this.putDirect(`S${this.uuid}`, this.getMyGroupSecret());\n this.getMySecretUuid().then(s => {\n this.putDirect(this.uuid, s); // TODO: encrypt keys in put()\n });\n this.onTheirDirect(this.uuid, (s, k, from) => {\n this.theirSecretUuids[from] = s;\n });\n this.onTheirDirect(`S${this.uuid}`, (s, k, from) => {\n this.theirGroupSecrets[from] = s;\n });\n // need to make put(), on(), send() and getMessages() behave differently when it's a group and retain the old versions for mutual signaling\n }\n this.onTheir(`participants`, (participants, k, from) => {\n let hasAdmin = false;\n const keys = Object.keys(this.participants);\n for (let i = 0; i < keys.length; i++) {\n if (this.participants[keys[i]].admin || this.participants[keys[i]].inviter) {\n hasAdmin = true;\n break;\n }\n }\n if (!hasAdmin) {\n keys.forEach(k => this.participants[k].admin = true); // if no admins, make everyone admin\n }\n if (this.participants[from] && (this.participants[from].admin || this.participants[from].inviter)) {\n if (typeof participants === `object`) {\n if (JSON.stringify(this.participants) === JSON.stringify(participants)) { return; }\n this.participants = participants;\n delete this.participants[from].inviter;\n Object.keys(participants).forEach(k => {\n if (k !== session.getKey().pub) {\n this.addParticipant(k, true, Object.assign({}, DEFAULT_PERMISSIONS, participants[k]), true);\n }\n });\n this.participantsChanged();\n options.saved = true;\n }\n }\n });\n if (!options.saved && (options.save === undefined || options.save === true)) {\n this.save();\n }\n }\n\n useChatLink(options) {\n const s = options.chatLink.split('?');\n if (s.length === 2) {\n const chatWith = util.getUrlParameter('chatWith', s[1]);\n const channelId = util.getUrlParameter('channelId', s[1]);\n const inviter = util.getUrlParameter('inviter', s[1]);\n const pub = inviter || chatWith;\n if (chatWith) {\n options.participants = pub;\n } else if (channelId && inviter && inviter !== session.getKey().pub) { // TODO! initializing it twice breaks things - new secret is generated\n options.uuid = channelId;\n options.participants = {};\n options.participants[inviter] = Object.assign({inviter: true}, DEFAULT_PERMISSIONS);\n }\n if (pub !== session.getKey().pub) {\n const sharedSecret = util.getUrlParameter('s', s[1]);\n const linkId = util.getUrlParameter('k', s[1]);\n if (sharedSecret && linkId) {\n this.save(); // save the channel first so it's there before inviter subscribes to it\n options.saved = true;\n publicState().user(pub).get('chatLinks').get(linkId).get('encryptedSharedKey').on(async encrypted => {\n const sharedKey = await Gun.SEA.decrypt(encrypted, sharedSecret);\n const encryptedChatRequest = await Gun.SEA.encrypt(session.getKey().pub, sharedSecret); // TODO encrypt is not deterministic, it uses salt\n const channelRequestId = await util.getHash(encryptedChatRequest);\n util.gunAsAnotherUser(publicState(), sharedKey, user => {\n user.get('chatRequests').get(channelRequestId.slice(0, 12)).put(encryptedChatRequest);\n });\n });\n }\n }\n }\n }\n\n getTheirSecretUuid(pub) {\n return new Promise(resolve => {\n if (!this.theirSecretUuids[pub]) {\n this.onTheirDirect(this.uuid, s => {\n this.theirSecretUuids[pub] = s;\n resolve(this.theirSecretUuids[pub]);\n }, pub);\n } else {\n resolve(this.theirSecretUuids[pub]);\n }\n });\n }\n\n getTheirGroupSecret(pub) {\n if (pub === session.getKey().pub) { return this.getMyGroupSecret(); }\n return new Promise(resolve => {\n if (!this.theirGroupSecrets[pub]) {\n this.onTheirDirect(`S${this.uuid}`, s => {\n this.theirGroupSecrets[pub] = s;\n resolve(this.theirGroupSecrets[pub]);\n }, pub);\n } else {\n resolve(this.theirGroupSecrets[pub]);\n }\n });\n }\n\n changeMyGroupSecret() {\n this.myGroupSecret = Gun.SEA.random(32).toString('base64');\n // TODO: secret should be archived and probably messages should include the encryption key id so past messages don't become unreadable\n this.putDirect(`S${this.uuid}`, this.myGroupSecret);\n }\n\n /**\n * Unsubscribe messages from a channel participants\n *\n * @param {string} participant public key\n */\n async mute(participant) {\n publicState().user(participant).get(this.theirSecretUuids[participant]).off();\n // TODO: persist\n }\n\n /**\n * Mute user and prevent them from seeing your further (and maybe past) messages\n *\n * @param {string} participant public key\n */\n async block(participant) {\n this.mute(participant);\n this.putDirect(this.uuid, null);\n this.putDirect(`S${this.uuid}`, null);\n delete this.secrets[participant];\n delete this.ourSecretChannelIds[participant];\n delete this.theirSecretChannelIds[participant];\n this.changeMyGroupSecret();\n }\n\n async getMySecretUuid() {\n if (!this.mySecretUuid) {\n const mySecret = await Gun.SEA.secret(session.getKey().epub, session.getKey());\n const mySecretHash = await util.getHash(mySecret);\n this.mySecretUuid = await util.getHash(mySecretHash + this.uuid);\n }\n return this.mySecretUuid;\n }\n\n /**\n * List participants of the channel (other than you)\n */\n getCurrentParticipants() {\n return Object.keys(this.secrets);\n }\n\n /**\n * Subscribe to the changing list of participants by channel admins\n */\n getParticipants(callback) {\n if (this.getParticipantsCallbackId) {\n this.getParticipantsCallbackId++;\n } else {\n this.getParticipantsCallbackId = 1;\n }\n this.getParticipantsCallbacks[this.getParticipantsCallbackId] = callback;\n if (this.participants) {\n callback(this.participants);\n }\n }\n\n participantsChanged() {\n Object.keys(this.getParticipantsCallbacks).forEach(id => {\n this.getParticipantsCallbacks[id](this.participants);\n });\n }\n\n /**\n * Returns either the uuid of a group channel or the public key of a direct channel.\n */\n getId() {\n return this.uuid || this.getCurrentParticipants()[0];\n }\n\n async getSecret(pub) {\n if (!this.secrets[pub]) {\n const epub = await util.gunOnceDefined(publicState().user(pub).get(`epub`));\n this.secrets[pub] = await Gun.SEA.secret(epub, session.getKey());\n }\n return this.secrets[pub];\n }\n\n /**\n *\n */\n static async getOurSecretChannelId(pub, pair) {\n const epub = await util.gunOnceDefined(publicState().user(pub).get(`epub`));\n const secret = await Gun.SEA.secret(epub, pair);\n return util.getHash(secret + pub);\n }\n\n /**\n *\n */\n static async getTheirSecretChannelId(pub, pair) {\n const epub = await util.gunOnceDefined(publicState().user(pub).get(`epub`));\n const secret = await Gun.SEA.secret(epub, pair);\n return util.getHash(secret + pair.pub);\n }\n\n /**\n * Calls back with Channels that you have initiated or written to.\n * @param {Object} keypair Gun.SEA keypair that the gun instance is authenticated with\n * @param callback callback function that is called for each public key you have a channel with\n */\n static async getChannels(callback, listenToChatLinks = true) {\n const keypair = session.getKey();\n const mySecret = await Gun.SEA.secret(keypair.epub, keypair);\n if (listenToChatLinks) {\n Channel.getMyChatLinks( undefined, undefined, true);\n }\n const seen = {};\n\n const handleChannel = async (value, ourSecretChannelId) => {\n if (value && !seen[ourSecretChannelId]) {\n seen[ourSecretChannelId] = true;\n if (ourSecretChannelId.length > 44) {\n publicState().user().get(`chats`).get(ourSecretChannelId).put(null);\n return;\n }\n const encryptedChatId = await util.gunOnceDefined(publicState().user().get(`chats`).get(ourSecretChannelId).get(`pub`));\n const chatId = await Gun.SEA.decrypt(encryptedChatId, mySecret);\n if (!chatId) {\n return;\n }\n if (chatId.pub || typeof chatId === `string`) {\n callback(new Channel({\n key: keypair,\n participants: chatId.pub || chatId,\n save: false\n }));\n } else if (chatId.uuid && chatId.participants && chatId.myGroupSecret) {\n callback(new Channel({\n key: keypair,\n participants: chatId.participants,\n uuid: chatId.uuid,\n myGroupSecret: chatId.myGroupSecret,\n save: false\n }));\n }\n }\n };\n\n publicState().user().get(`chats`).map().on(handleChannel);\n }\n\n getMyGroupSecret() { // group secret could be deterministic: hash(encryptToSelf(uuid + iterator))\n if (!this.myGroupSecret) {\n this.changeMyGroupSecret();\n }\n return this.myGroupSecret;\n }\n\n async getOurSecretChannelId(pub) {\n if (!this.ourSecretChannelIds[pub]) {\n const secret = await this.getSecret(pub);\n this.ourSecretChannelIds[pub] = await util.getHash(secret + pub);\n }\n return this.ourSecretChannelIds[pub];\n }\n\n async getTheirSecretChannelId(pub) {\n if (!this.theirSecretChannelIds[pub]) {\n const secret = await this.getSecret(pub);\n this.theirSecretChannelIds[pub] = await util.getHash(secret + session.getKey().pub);\n }\n return this.theirSecretChannelIds[pub];\n }\n\n /**\n * Get messages from the channel\n */\n async getMessages(callback) { // TODO: save callback and apply it when new participants are added to channel\n this.getCurrentParticipants().forEach(async pub => {\n if (pub !== session.getKey().pub) {\n // Subscribe to their messages\n let theirSecretChannelId;\n if (this.uuid) {\n theirSecretChannelId = await this.getTheirSecretUuid(pub);\n } else {\n theirSecretChannelId = await this.getTheirSecretChannelId(pub);\n }\n publicState().user(pub).get(`chats`).get(theirSecretChannelId).get(`msgs`).map().once((data, key) => {this.messageReceived(callback, data, this.uuid || pub, false, key, pub);});\n }\n if (!this.uuid) {\n // Subscribe to our messages\n const ourSecretChannelId = await this.getOurSecretChannelId(pub);\n userState().get(`chats`).get(ourSecretChannelId).get(`msgs`).map().once((data, key) => {this.messageReceived(callback, data, pub, true, key, session.getKey().pub);});\n }\n });\n if (this.uuid) {\n // Subscribe to our messages\n const mySecretUuid = await this.getMySecretUuid();\n userState().get(`chats`).get(mySecretUuid).get(`msgs`).map().once((data, key) => {this.messageReceived(callback, data, this.uuid, true, key, session.getKey().pub);});\n }\n }\n\n async messageReceived(callback, data, channelId, selfAuthored, key, from) {\n if (this.messages[key] || !data) {\n return;\n }\n const secret = this.uuid ? (await this.getTheirGroupSecret(from)) : (await this.getSecret(channelId));\n const decrypted = await Gun.SEA.decrypt(data, secret);\n if (typeof decrypted !== `object`) {\n return;\n }\n const info = {selfAuthored, channelId, from};\n this.messages[key] = decrypted;\n callback(decrypted, info);\n }\n\n /**\n * Get latest message in this channel. Useful for channel listing.\n */\n async getLatestMsg(callback) {\n const callbackIfLatest = async (msg, info) => {\n if (!this.latest) {\n this.latest = msg;\n callback(msg, info);\n } else {\n const t = (typeof this.latest.time === `string` ? this.latest.time : this.latest.time.toISOString());\n if (t < msg.time) {\n this.latest = msg;\n callback(msg, info);\n }\n }\n };\n this.onMy('latestMsg', msg => callbackIfLatest(msg, {selfAuthored: true, from: session.getKey().pub}));\n this.onTheir('latestMsg', (msg, k, from) => callbackIfLatest(msg, {selfAuthored: false, from}));\n }\n\n /**\n * Useful for notifications\n * @param {integer} time last seen msg time (default: now)\n */\n async setMyMsgsLastSeenTime(time?: string) {\n time = time || new Date().toISOString();\n return this.put(`msgsLastSeenTime`, time);\n }\n\n /**\n * Useful for notifications\n */\n async getMyMsgsLastSeenTime(callback) {\n this.onMy(`msgsLastSeenTime`, time => {\n this.myMsgsLastSeenTime = time;\n if (callback) {\n callback(this.myMsgsLastSeenTime);\n }\n });\n }\n\n /**\n * For \"seen\" status indicator\n */\n async getTheirMsgsLastSeenTime(callback) {\n this.onTheir(`msgsLastSeenTime`, time => {\n this.theirMsgsLastSeenTime = time;\n if (callback) {\n callback(this.theirMsgsLastSeenTime);\n }\n });\n }\n\n async removeParticipant(pub) {\n this.addParticipant(pub, true, {read: false, write: false});\n }\n\n /**\n * Add a public key to the channel or update its permissions\n * @param {string} pub\n */\n async addParticipant(pub: string, save = true, permissions?: any, subscribe?: boolean) {\n if (this.uuid) {\n return;\n }\n if (permissions === undefined) {\n permissions = DEFAULT_PERMISSIONS;\n }\n if (this.secrets[pub] && JSON.stringify(this.secrets[pub]) === JSON.stringify(permissions)) { // TODO: should be this.participants[pub]\n return;\n }\n this.secrets[pub] = null;\n this.getSecret(pub);\n const ourSecretChannelId = await this.getOurSecretChannelId(pub);\n if (save) {\n // Save their public key in encrypted format, so in channel listing we know who we are channeling with\n const mySecret = await Gun.SEA.secret(session.getKey().epub, session.getKey());\n publicState().user().get(`chats`).get(ourSecretChannelId).get(`pub`).put(await Gun.SEA.encrypt({pub}, mySecret));\n }\n if (this.uuid) {\n this.participants[pub] = permissions;\n if (save) {\n this.putDirect(`S${this.uuid}`, this.getMyGroupSecret());\n this.getMySecretUuid().then(s => {\n this.putDirect(this.uuid, s); // TODO: encrypt keys in put()\n });\n this.onTheirDirect(this.uuid, (s, k, from) => {\n this.theirSecretUuids[from] = s;\n });\n this.onTheirDirect(`S${this.uuid}`, (s, k, from) => {\n this.theirGroupSecrets[from] = s;\n });\n this.save();\n }\n }\n if (subscribe) {\n Object.values(this.directSubscriptions).forEach(arr => {\n arr.forEach(o => {\n if (!o.from || o.from === pub) {\n this._onTheirDirectFromUser(pub, o.key, o.callback);\n }\n });\n });\n Object.values(this.groupSubscriptions).forEach(arr => {\n arr.forEach(o => {\n if (o.from && o.from !== pub) { return; }\n if (permissions.write) {\n this._onTheirGroupFromUser(pub, o.key, o.callback);\n } else { // unsubscribe\n o.event && o.event.off();\n }\n });\n });\n }\n }\n\n /**\n * Send a message to the channel\n * @param msg string or {time, text, ...} object\n */\n async send(msg) {\n if (typeof msg === `string`) {\n msg = msg.trim();\n if (msg.length === 0) {\n return;\n }\n msg = {\n time: (new Date()).toISOString(),\n text: msg\n };\n } else if (typeof msg === `object`) {\n msg.time = msg.time || (new Date()).toISOString();\n } else {\n throw new Error(`msg param must be a string or an object`);\n }\n //publicState().user().get('message').set(temp);\n if (this.uuid) {\n const encrypted = await Gun.SEA.encrypt(JSON.stringify(msg), this.getMyGroupSecret());\n const mySecretUuid = await this.getMySecretUuid();\n userState().get(`chats`).get(mySecretUuid).get(`msgs`).get(`${msg.time}`).put(encrypted);\n userState().get(`chats`).get(mySecretUuid).get(`latestMsg`).put(encrypted);\n } else {\n const keys = this.getCurrentParticipants();\n for (let i = 0;i < keys.length;i++) {\n const encrypted = await Gun.SEA.encrypt(JSON.stringify(msg), (await this.getSecret(keys[i])));\n const ourSecretChannelId = await this.getOurSecretChannelId(keys[i]);\n userState().get(`chats`).get(ourSecretChannelId).get(`msgs`).get(`${msg.time}`).put(encrypted);\n userState().get(`chats`).get(ourSecretChannelId).get(`latestMsg`).put(encrypted);\n }\n }\n }\n\n /**\n * Save the channel to our channels list without sending a message\n */\n async save() {\n if (this.uuid) {\n const mySecretUuid = await this.getMySecretUuid();\n userState().get(`chats`).get(mySecretUuid).get('msgs').get('a').put(null);\n this.put(`participants`, this.participants); // public participants list\n const mySecret = await Gun.SEA.secret(session.getKey().epub, session.getKey());\n userState().get(`chats`).get(mySecretUuid).get(`pub`).put(await Gun.SEA.encrypt({\n uuid: this.uuid,\n myGroupSecret: this.getMyGroupSecret(),\n participants: this.participants // private participants list\n }, mySecret));\n this.participantsChanged();\n } else {\n const keys = this.getCurrentParticipants();\n for (let i = 0;i < keys.length;i++) {\n const ourSecretChannelId = await this.getOurSecretChannelId(keys[i]);\n userState().get(`chats`).get(ourSecretChannelId).get('msgs').get('a').put(null);\n }\n }\n }\n\n /**\n * Save a key-value pair, encrypt value. Each participant in the Channel writes to their own version of the key-value pair — they don't overwrite the same one.\n * @param {string} key\n * @param value\n */\n async put(key, value) {\n return (this.uuid ? this.putGroup : this.putDirect).call(this, key, value);\n }\n\n async putGroup(key, value) {\n if (key === `msgs`) { throw new Error(`Sorry, you can't overwrite the msgs field which is used for .send()`); }\n const encrypted = await Gun.SEA.encrypt(JSON.stringify(value), this.getMyGroupSecret());\n const mySecretUuid = await this.getMySecretUuid();\n userState().get(`chats`).get(mySecretUuid).get(key).put(encrypted);\n }\n\n async putDirect(key, value) {\n if (key === `msgs`) { throw new Error(`Sorry, you can't overwrite the msgs field which is used for .send()`); }\n const keys = this.getCurrentParticipants();\n for (let i = 0;i < keys.length;i++) {\n const encrypted = await Gun.SEA.encrypt(JSON.stringify(value), (await this.getSecret(keys[i])));\n const ourSecretChannelId = await this.getOurSecretChannelId(keys[i]);\n userState().get(`chats`).get(ourSecretChannelId).get(key).put(encrypted);\n }\n }\n\n /**\n * Subscribe to a key-value pair. Callback returns every participant's value unless you limit it with *from* param.\n * @param {string} key\n * @param {function} callback\n * @param {string} from public key whose value you want, or *\"me\"* for your value only, or *\"them\"* for the value of others only\n */\n async on(key: string, callback: Function, from?: string) {\n return (this.uuid ? this.onGroup : this.onDirect).call(this, key, callback, from);\n }\n\n async onDirect(key: string, callback: Function, from?: string) {\n if (!from || from === `me` || from === session.getKey().pub) {\n this.onMy(key, (val: any) => callback(val, session.getKey().pub));\n }\n if (!from || (from !== `me` && from !== session.getKey().pub)) {\n this.onTheir(key, (val: any, k: string, pub: string) => callback(val, pub));\n }\n }\n\n async onGroup(key: string, callback: Function, from?: string) {\n if (!from || from === `me` || from === session.getKey().pub) {\n this.onMyGroup(key, val => callback(val, session.getKey().pub));\n }\n if (!from || (from !== `me` && from !== session.getKey().pub)) {\n this.onTheirGroup(key, (val, k, pub) => callback(val, pub));\n }\n }\n\n async onMy(key: string, callback: Function) {\n return (this.uuid ? this.onMyGroup : this.onMyDirect).call(this, key, callback);\n }\n\n async onMyDirect(key: string, callback: Function) {\n if (typeof callback !== 'function') {\n throw new Error(`onMy callback must be a function, got ${typeof callback}`);\n }\n const keys = this.getCurrentParticipants();\n for (let i = 0;i < keys.length;i++) {\n const ourSecretChannelId = await this.getOurSecretChannelId(keys[i]);\n publicState().user().get(`chats`).get(ourSecretChannelId).get(key).on(async (data: any) => {\n const decrypted = await Gun.SEA.decrypt(data, (await this.getSecret(keys[i])));\n if (decrypted) {\n callback(typeof decrypted.v !== `undefined` ? decrypted.v : decrypted, key);\n }\n });\n break;\n }\n }\n\n async onMyGroup(key, callback) {\n if (typeof callback !== 'function') {\n throw new Error(`onMy callback must be a function, got ${typeof callback}`);\n }\n const mySecretUuid = await this.getMySecretUuid();\n const mySecret = await this.getMyGroupSecret();\n publicState().user().get(`chats`).get(mySecretUuid).get(key).on(async data => {\n const decrypted = await Gun.SEA.decrypt(data, mySecret);\n if (decrypted) {\n callback(typeof decrypted.v !== `undefined` ? decrypted.v : decrypted, key, session.getKey().pub);\n }\n });\n }\n\n async onTheir(key: string, callback: Function, from: string) {\n return (this.uuid ? this.onTheirGroup : this.onTheirDirect).call(this, key, callback, from);\n }\n\n async _onTheirDirectFromUser(key: string, callback: Function, pub: string) {\n if (!this.hasWritePermission(pub)) { return; }\n const theirSecretChannelId = await this.getTheirSecretChannelId(pub);\n publicState().user(pub).get(`chats`).get(theirSecretChannelId).get(key).on(async (data: any) => {\n if (!this.hasWritePermission(pub)) { return; }\n const decrypted = await Gun.SEA.decrypt(data, (await this.getSecret(pub)));\n if (decrypted) {\n callback(typeof decrypted.v !== `undefined` ? decrypted.v : decrypted, key, pub);\n }\n });\n }\n\n async onTheirDirect(key: string, callback: Function, from: string) { // TODO: subscribe to new channel participants\n if (typeof callback !== 'function') {\n throw new Error(`onTheir callback must be a function, got ${typeof callback}`);\n }\n if (!Object.prototype.hasOwnProperty.call(this.directSubscriptions, key)) {\n this.directSubscriptions[key] = [];\n }\n this.directSubscriptions[key].push({key, callback, from});\n const participants = this.getCurrentParticipants();\n participants.forEach(async pub => {\n if (from && pub !== from) { return; }\n this._onTheirDirectFromUser(pub, key, callback);\n });\n }\n\n hasWritePermission(pub) {\n return !this.uuid || (this.participants && this.participants[pub] && this.participants[pub].write);\n }\n\n async _onTheirGroupFromUser(pub: string, key: string, callback: Function, subscription: any) {\n if (!this.hasWritePermission(pub)) { return; }\n const theirSecretUuid = await this.getTheirSecretUuid(pub);\n publicState().user(pub).get(`chats`).get(theirSecretUuid).get(key).on(async (data: any, _a: any, _b: any, e: Event) => {\n if (subscription) { subscription.event = e; }\n if (!this.hasWritePermission(pub)) { return; }\n const decrypted = await Gun.SEA.decrypt(data, (await this.getTheirGroupSecret(pub)));\n if (decrypted) {\n callback(typeof decrypted.v !== `undefined` ? decrypted.v : decrypted, key, pub);\n }\n });\n }\n\n async onTheirGroup(key, callback, from) {\n if (typeof callback !== 'function') {\n throw new Error(`onTheir callback must be a function, got ${typeof callback}`);\n }\n if (!Object.prototype.hasOwnProperty.call(this.groupSubscriptions, key)) {\n this.groupSubscriptions[key] = [];\n }\n const subscription = {key, callback, from};\n this.groupSubscriptions[key].push(subscription);\n\n this.getParticipants(participants => {\n Object.keys(participants).forEach(async pub => {\n if (from && pub !== from) { return; }\n if (!(participants[pub] && participants[pub].write)) { return; }\n this._onTheirGroupFromUser(pub, key, callback, subscription);\n });\n });\n }\n\n /**\n * Set typing status\n */\n setTyping(isTyping, timeout = 5) {\n isTyping = typeof isTyping === `undefined` ? true : isTyping;\n timeout = timeout * 1000;\n this.put(`typing`, isTyping ? new Date().toISOString() : new Date(0).toISOString());\n clearTimeout(this.setTypingTimeout);\n this.setTypingTimeout = setTimeout(() => this.put(`typing`, false), timeout);\n }\n\n /**\n * Get typing status\n */\n getTyping(callback, timeout = 5) { // TODO callback not called on setTyping(false), at least for self chat\n timeout = timeout * 1000;\n this.onTheir(`typing`, (typing, key, pub) => {\n if (callback) {\n const isTyping = typing && new Date() - new Date(typing) <= timeout;\n callback(isTyping, pub);\n this.getTypingTimeouts = this.getTypingTimeouts || {};\n clearTimeout(this.getTypingTimeouts[pub]);\n if (isTyping) {\n this.getTypingTimeouts[pub] = setTimeout(() => callback(false, pub), timeout);\n }\n }\n });\n }\n\n /**\n * Add a chat button to page\n * @param options {label, channelOptions}\n */\n static addChatButton(options = {}) {\n options = Object.assign({label: 'Chat'}, options);\n if (!options.channelOptions) {\n throw new Error('addChatButton missing options.channelOptions param');\n }\n util.injectCss();\n let channel, box;\n const btn = util.createElement('div', 'iris-chat-open-button', document.body);\n btn.setAttribute('id', 'iris-chat-open-button');\n btn.innerHTML = ` ${options.label}`;\n btn.addEventListener('click', () => {\n btn.setAttribute('style', 'display: none');\n if (!channel) {\n channel = new Channel(options.channelOptions);\n box = channel.getChatBox();\n document.body.appendChild(box);\n } else {\n box.setAttribute('style', ''); // show\n }\n });\n }\n\n /**\n * Get a simple link that points to the channel.\n *\n * Direct channel: both users need to give their simple links. Use createChatLink() to get a two-way link that needs to be given by one user only.\n *\n * Group channel: Works only if the link recipient has been already added onto the channel participants list.\n */\n getSimpleLink(urlRoot = 'https://iris.to/') {\n if (this.uuid) {\n return `${urlRoot}?channelId=${this.uuid}&inviter=${session.getKey().pub}`;\n }\n return `${urlRoot}?chatWith=${this.getCurrentParticipants()[0]}`;\n }\n\n /**\n *\n */\n async getChatLinks(opts: any = {}) {\n let {callback, urlRoot, subscribe} = opts;\n urlRoot = urlRoot || 'https://iris.to/';\n if (!this.uuid) { throw new Error('Only group channels may have chat links'); }\n const chatLinks: any[] = [];\n const chatLinkSubscriptions = {};\n this.on('chatLinks', (links: any, from: string) => {\n // TODO: check admin permissions\n if (!links || typeof links !== 'object') { return; }\n Object.keys(links).forEach(linkId => {\n const link = links[linkId];\n if (link === null) {\n chatLinkSubscriptions[linkId] && chatLinkSubscriptions[linkId].off(); // unsubscribe removed chat link\n delete chatLinkSubscriptions[linkId];\n callback && callback({id: linkId, url: null});\n return;\n }\n if (chatLinks.indexOf(linkId) !== -1) { return; }\n const channels = [];\n chatLinks.push(linkId);\n const url = Channel.formatChatLink({urlRoot, inviter: from, channelId: this.uuid, sharedSecret: link.sharedSecret, linkId});\n callback && callback({url, id: linkId});\n if (subscribe) {\n publicState().user(link.sharedKey.pub).get('chatRequests').map().on(async (encPub, requestId, a, e) => {\n if (!encPub || typeof encPub !== 'string' || encPub.length < 10) { return; }\n chatLinkSubscriptions[linkId] = e;\n const s = JSON.stringify(encPub);\n if (channels.indexOf(s) === -1) {\n channels.push(s);\n const pub = await Gun.SEA.decrypt(encPub, link.sharedSecret);\n this.addParticipant(pub, undefined, undefined, true);\n }\n });\n }\n });\n });\n }\n\n async createChatLink(urlRoot = 'https://iris.to/') {\n const sharedKey = await Gun.SEA.pair();\n const sharedKeyString = JSON.stringify(sharedKey);\n const sharedSecret = await Gun.SEA.secret(sharedKey.epub, sharedKey);\n const encryptedSharedKey = await Gun.SEA.encrypt(sharedKeyString, sharedSecret);\n const ownerSecret = await Gun.SEA.secret(session.getKey().epub, session.getKey());\n const ownerEncryptedSharedKey = await Gun.SEA.encrypt(sharedKeyString, ownerSecret);\n let linkId = await util.getHash(encryptedSharedKey);\n linkId = linkId.slice(0, 12);\n\n // User has to exist, in order for .get(chatRequests).on() to be ever triggered\n await util.gunAsAnotherUser(publicState(), sharedKey, user => {\n return user.get('chatRequests').put({a: 1}).then();\n });\n\n this.chatLinks[linkId] = {sharedKey, sharedSecret};\n this.put('chatLinks', this.chatLinks);\n userState().get('chatLinks').get(linkId).put({encryptedSharedKey, ownerEncryptedSharedKey});\n\n return Channel.formatChatLink({urlRoot, channelId: this.uuid, inviter: session.getKey().pub, sharedSecret, linkId});\n }\n\n /**\n * Get a channel box element that you can add to your page\n */\n getChatBox() {\n util.injectCss();\n let minimized = false;\n\n const chatBox = util.createElement('div', 'iris-chat-box');\n const header = util.createElement('div', 'iris-chat-header', chatBox);\n const minimize = util.createElement('span', 'iris-chat-minimize', header);\n minimize.innerText = '—';\n minimize.addEventListener('click', e => {\n e.stopPropagation();\n chatBox.setAttribute('class', 'iris-chat-box minimized');\n minimized = true;\n });\n const headerText = util.createElement('div', 'iris-chat-header-text', header);\n const onlineIndicator = util.createElement('span', 'iris-online-indicator', headerText);\n onlineIndicator.innerHTML = '●';\n const nameEl = util.createElement('span', undefined, headerText);\n const close = util.createElement('span', 'iris-chat-close', header);\n close.innerHTML = '×';\n close.addEventListener('click', () => {\n chatBox.setAttribute('style', 'display: none');\n const openChatBtn = document.getElementById('iris-chat-open-button');\n if (openChatBtn) {\n openChatBtn.setAttribute('style', ''); // show\n }\n });\n header.addEventListener('click', () => {\n if (minimized) {\n chatBox.setAttribute('class', 'iris-chat-box');\n minimized = false;\n }\n });\n\n const messages = util.createElement('div', 'iris-chat-messages', chatBox);\n\n const typingIndicator = util.createElement('div', 'iris-typing-indicator', chatBox);\n typingIndicator.innerText = 'typing...';\n this.getTyping(isTyping => {\n typingIndicator.setAttribute('class', `iris-typing-indicator${ isTyping ? ' yes' : ''}`);\n });\n\n const inputWrapper = util.createElement('div', 'iris-chat-input-wrapper', chatBox);\n const textArea = util.createElement('textarea', undefined, inputWrapper);\n textArea.setAttribute('rows', '1');\n textArea.setAttribute('placeholder', 'Type a message');\n if (util.isMobile) {\n const sendBtn = util.createElement('button', undefined, inputWrapper);\n sendBtn.innerHTML = `\n \n `;\n sendBtn.addEventListener('click', () => {\n this.send(textArea.value);\n textArea.value = '';\n this.setTyping(false);\n });\n }\n\n const participants = this.getCurrentParticipants();\n if (participants.length) {\n const pub = participants[0];\n publicState().user(pub).get('profile').get('name').on(name => nameEl.innerText = name);\n Channel.getActivity(publicState(), pub, status => {\n const cls = `iris-online-indicator${ status.isActive ? ' yes' : ''}`;\n onlineIndicator.setAttribute('class', cls);\n const undelivered = messages.querySelectorAll('.iris-chat-message:not(.delivered)');\n undelivered.forEach(msg => {\n if (msg.getAttribute('data-time') <= status.lastActive) {\n const c = msg.getAttribute('class');\n msg.setAttribute('class', `${c } delivered`);\n }\n });\n });\n }\n\n this.getTheirMsgsLastSeenTime(time => {\n const unseen = messages.querySelectorAll('.iris-seen:not(.yes)');\n unseen.forEach(indicator => {\n const msgEl = indicator.parentElement.parentElement.parentElement;\n if (msgEl.getAttribute('data-time') <= time) {\n const msgClass = msgEl.getAttribute('class');\n if (msgClass.indexOf('delivered') === -1) {\n msgEl.setAttribute('class', `${msgClass } delivered`);\n }\n indicator.setAttribute('class', 'iris-seen yes');\n }\n });\n });\n\n this.getMessages((msg, info) => {\n const msgContent = util.createElement('div', 'iris-msg-content');\n msgContent.innerText = msg.text;\n const time = util.createElement('div', 'time', msgContent);\n time.innerText = util.formatTime(new Date(msg.time));\n if (info.selfAuthored) {\n const cls = this.theirMsgsLastSeenTime >= msg.time ? 'iris-seen yes' : 'iris-seen';\n const seenIndicator = util.createElement('span', cls, time);\n seenIndicator.innerHTML = ' ';\n }\n msgContent.innerHTML = msgContent.innerHTML.replace(/\\n/g, '
\\n');\n\n const msgEl = util.createElement('div', `${info.selfAuthored ? 'our' : 'their'} iris-chat-message`);\n msgEl.appendChild(msgContent);\n msgEl.setAttribute('data-time', msg.time);\n for (let i = messages.children.length; i >= 0; i--) {\n if (i === 0) {\n messages.insertBefore(msgEl, messages.firstChild);\n } else {\n const t = messages.children[i - 1].getAttribute('data-time');\n if (t && t < msg.time) {\n messages.children[i - 1].insertAdjacentElement('afterend', msgEl);\n break;\n }\n }\n }\n messages.scrollTop = messages.scrollHeight;\n });\n\n textArea.addEventListener('keyup', event => {\n Channel.setActivity(publicState(), true); // TODO\n this.setMyMsgsLastSeenTime(); // TODO\n if (event.keyCode === 13) {\n event.preventDefault();\n const content = textArea.value;\n const caret = util.getCaret(textArea);\n if (event.shiftKey) {\n textArea.value = `${content.substring(0, caret - 1) }\\n${ content.substring(caret, content.length)}`;\n } else {\n textArea.value = content.substring(0, caret - 1) + content.substring(caret, content.length);\n this.send(textArea.value);\n textArea.value = '';\n this.setTyping(false);\n }\n } else {\n this.setTyping(!!textArea.value.length);\n }\n });\n\n return chatBox;\n }\n\n /**\n * Set the user's online/active status\n * @param {string} activity string: set the activity status every 3 seconds, null/false: stop updating\n */\n static setActivity(activity) {\n if (publicState().irisActivityStatus === activity) { return; }\n publicState().irisActivityStatus = activity;\n clearTimeout(publicState().setActivityTimeout);\n const update = () => {\n publicState().user().get(`activity`).put({status: activity, time: new Date(Gun.state()).toISOString()});\n };\n update();\n function timerUpdate() {\n update();\n publicState().setActivityTimeout = setTimeout(timerUpdate, 3000);\n }\n if (activity) {\n timerUpdate();\n }\n }\n\n /**\n * Get the online status of a user.\n *\n * @param {string} pubKey public key of the user\n * @param {boolean} callback receives a boolean each time the user's online status changes\n */\n static getActivity(pubKey, callback) {\n let timeout;\n publicState().user(pubKey).get(`activity`).on(activity => {\n if (!activity || !(activity.time && activity.status)) { return; }\n clearTimeout(timeout);\n const now = new Date(Gun.state());\n const activityDate = new Date(activity.time);\n const isActive = activityDate > new Date(now.getTime() - 10 * 1000) && activityDate < new Date(now.getTime() + 30 * 1000);\n callback({isActive, lastActive: activity.time, status: activity.status});\n if (isActive) {\n timeout = setTimeout(() => callback({isOnline: false, lastActive: activity.time}), 10000);\n }\n });\n }\n\n static formatChatLink({urlRoot, chatWith, channelId, inviter, sharedSecret, linkId}) {\n const enc = encodeURIComponent;\n if (channelId && inviter) {\n return `${urlRoot}?channelId=${enc(channelId)}&inviter=${enc(inviter)}&s=${enc(sharedSecret)}&k=${enc(linkId)}`;\n }\n return `${urlRoot}?chatWith=${enc(chatWith)}&s=${enc(sharedSecret)}&k=${enc(linkId)}`;\n }\n\n /**\n * Creates a channel link that can be used for two-way communication, i.e. only one link needs to be exchanged.\n */\n static async createChatLink(urlRoot = 'https://iris.to/') {\n const user = publicState().user();\n const key = session.getKey();\n\n // We create a new Gun user whose private key is shared with the chat link recipients.\n // Chat link recipients can contact you by writing their public key to the shared key's user space.\n const sharedKey = await Gun.SEA.pair();\n const sharedKeyString = JSON.stringify(sharedKey);\n const sharedSecret = await Gun.SEA.secret(sharedKey.epub, sharedKey);\n const encryptedSharedKey = await Gun.SEA.encrypt(sharedKeyString, sharedSecret);\n const ownerSecret = await Gun.SEA.secret(key.epub, key);\n const ownerEncryptedSharedKey = await Gun.SEA.encrypt(sharedKeyString, ownerSecret);\n let linkId = await util.getHash(encryptedSharedKey);\n linkId = linkId.slice(0, 12);\n\n // User has to exist, in order for .get(chatRequests).on() to be ever triggered\n util.gunAsAnotherUser(publicState(), sharedKey, user => {\n user.get('chatRequests').put({a: 1});\n });\n\n user.get('chatLinks').get(linkId).put({encryptedSharedKey, ownerEncryptedSharedKey});\n\n return Channel.formatChatLink({urlRoot, chatWith: key.pub, sharedSecret, linkId});\n }\n\n /**\n *\n */\n static async getMyChatLinks(urlRoot = 'https://iris.to/', callback: Function, subscribe = false) {\n const key = session.getKey();\n const user = publicState().user();\n const mySecret = await Gun.SEA.secret(key.epub, key);\n const chatLinks = [];\n user.get('chatLinks').map().on((data, linkId) => {\n if (!data || chatLinks.indexOf(linkId) !== -1) { return; }\n const channels = [];\n user.get('chatLinks').get(linkId).get('ownerEncryptedSharedKey').on(async enc => {\n if (!enc || chatLinks.indexOf(linkId) !== -1) { return; }\n chatLinks.push(linkId);\n const sharedKey = await Gun.SEA.decrypt(enc, mySecret);\n const sharedSecret = await Gun.SEA.secret(sharedKey.epub, sharedKey);\n const url = Channel.formatChatLink({urlRoot, chatWith: key.pub, sharedSecret, linkId});\n if (callback) {\n callback({url, id: linkId});\n }\n if (subscribe) {\n publicState().user(sharedKey.pub).get('chatRequests').map().on(async (encPub, requestId) => {\n if (!encPub) { return; }\n const s = JSON.stringify(encPub);\n if (channels.indexOf(s) === -1) {\n channels.push(s);\n const pub = await Gun.SEA.decrypt(encPub, sharedSecret);\n const channel = new Channel({key, participants: pub});\n channel.save();\n }\n util.gunAsAnotherUser(publicState(), sharedKey, user => { // remove the channel request after reading\n user.get('chatRequests').get(requestId).put(null);\n });\n });\n }\n });\n });\n }\n\n /**\n *\n */\n removeGroupChatLink(linkId) {\n this.chatLinks[linkId] = null;\n this.put('chatLinks', this.chatLinks);\n publicState().user().get('chatLinks').get(linkId).put(null);\n }\n\n /**\n *\n */\n static removePrivateChatLink(key, linkId) {\n publicState().user().auth(key);\n publicState().user().get('chatLinks').get(linkId).put(null);\n }\n\n /**\n *\n */\n static async deleteChannel(key, pub) {\n publicState().user().auth(key);\n const channelId = await Channel.getOurSecretChannelId(pub, key);\n publicState().user().get('channels').get(channelId).put(null);\n publicState().user().get('channels').get(channelId).off();\n }\n\n /**\n *\n */\n static async deleteGroup(key, uuid) {\n const mySecret = await Gun.SEA.secret(key.epub, key);\n const mySecretHash = await util.getHash(mySecret);\n const mySecretUuid = await util.getHash(mySecretHash + uuid);\n publicState().user().auth(key);\n publicState().user().get('channels').get(mySecretUuid).put(null);\n publicState().user().get('channels').get(mySecretUuid).off();\n }\n}\n\nexport default Channel;\n","import Channel from './Channel';\nimport session from './session';\n\nconst channels = new Map();\n\n/**\n * Private channel that only you and publicKey can read/write.\n * @param publicKey\n * @returns {Channel}\n */\nexport default function(publicKey = session.getKey(), chatLink?: string): Channel {\n let channel = channels.get(publicKey);\n if (!channel) {\n channel = new Channel({participants: publicKey, chatLink})\n channels.set(publicKey, channel);\n }\n return channel;\n}","/*!\n localForage -- Offline Storage, Improved\n Version 1.10.0\n https://localforage.github.io/localForage\n (c) 2013-2017 Mozilla, Apache License 2.0\n*/\n(function(f){if(typeof exports===\"object\"&&typeof module!==\"undefined\"){module.exports=f()}else if(typeof define===\"function\"&&define.amd){define([],f)}else{var g;if(typeof window!==\"undefined\"){g=window}else if(typeof global!==\"undefined\"){g=global}else if(typeof self!==\"undefined\"){g=self}else{g=this}g.localforage = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw (f.code=\"MODULE_NOT_FOUND\", f)}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o element; its readystatechange event will be fired asynchronously once it is inserted\n // into the document. Do so, thus queuing up the task. Remember to clean up once it's been called.\n var scriptEl = global.document.createElement('script');\n scriptEl.onreadystatechange = function () {\n nextTick();\n\n scriptEl.onreadystatechange = null;\n scriptEl.parentNode.removeChild(scriptEl);\n scriptEl = null;\n };\n global.document.documentElement.appendChild(scriptEl);\n };\n } else {\n scheduleDrain = function () {\n setTimeout(nextTick, 0);\n };\n }\n}\n\nvar draining;\nvar queue = [];\n//named nextTick for less confusing stack traces\nfunction nextTick() {\n draining = true;\n var i, oldQueue;\n var len = queue.length;\n while (len) {\n oldQueue = queue;\n queue = [];\n i = -1;\n while (++i < len) {\n oldQueue[i]();\n }\n len = queue.length;\n }\n draining = false;\n}\n\nmodule.exports = immediate;\nfunction immediate(task) {\n if (queue.push(task) === 1 && !draining) {\n scheduleDrain();\n }\n}\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{}],2:[function(_dereq_,module,exports){\n'use strict';\nvar immediate = _dereq_(1);\n\n/* istanbul ignore next */\nfunction INTERNAL() {}\n\nvar handlers = {};\n\nvar REJECTED = ['REJECTED'];\nvar FULFILLED = ['FULFILLED'];\nvar PENDING = ['PENDING'];\n\nmodule.exports = Promise;\n\nfunction Promise(resolver) {\n if (typeof resolver !== 'function') {\n throw new TypeError('resolver must be a function');\n }\n this.state = PENDING;\n this.queue = [];\n this.outcome = void 0;\n if (resolver !== INTERNAL) {\n safelyResolveThenable(this, resolver);\n }\n}\n\nPromise.prototype[\"catch\"] = function (onRejected) {\n return this.then(null, onRejected);\n};\nPromise.prototype.then = function (onFulfilled, onRejected) {\n if (typeof onFulfilled !== 'function' && this.state === FULFILLED ||\n typeof onRejected !== 'function' && this.state === REJECTED) {\n return this;\n }\n var promise = new this.constructor(INTERNAL);\n if (this.state !== PENDING) {\n var resolver = this.state === FULFILLED ? onFulfilled : onRejected;\n unwrap(promise, resolver, this.outcome);\n } else {\n this.queue.push(new QueueItem(promise, onFulfilled, onRejected));\n }\n\n return promise;\n};\nfunction QueueItem(promise, onFulfilled, onRejected) {\n this.promise = promise;\n if (typeof onFulfilled === 'function') {\n this.onFulfilled = onFulfilled;\n this.callFulfilled = this.otherCallFulfilled;\n }\n if (typeof onRejected === 'function') {\n this.onRejected = onRejected;\n this.callRejected = this.otherCallRejected;\n }\n}\nQueueItem.prototype.callFulfilled = function (value) {\n handlers.resolve(this.promise, value);\n};\nQueueItem.prototype.otherCallFulfilled = function (value) {\n unwrap(this.promise, this.onFulfilled, value);\n};\nQueueItem.prototype.callRejected = function (value) {\n handlers.reject(this.promise, value);\n};\nQueueItem.prototype.otherCallRejected = function (value) {\n unwrap(this.promise, this.onRejected, value);\n};\n\nfunction unwrap(promise, func, value) {\n immediate(function () {\n var returnValue;\n try {\n returnValue = func(value);\n } catch (e) {\n return handlers.reject(promise, e);\n }\n if (returnValue === promise) {\n handlers.reject(promise, new TypeError('Cannot resolve promise with itself'));\n } else {\n handlers.resolve(promise, returnValue);\n }\n });\n}\n\nhandlers.resolve = function (self, value) {\n var result = tryCatch(getThen, value);\n if (result.status === 'error') {\n return handlers.reject(self, result.value);\n }\n var thenable = result.value;\n\n if (thenable) {\n safelyResolveThenable(self, thenable);\n } else {\n self.state = FULFILLED;\n self.outcome = value;\n var i = -1;\n var len = self.queue.length;\n while (++i < len) {\n self.queue[i].callFulfilled(value);\n }\n }\n return self;\n};\nhandlers.reject = function (self, error) {\n self.state = REJECTED;\n self.outcome = error;\n var i = -1;\n var len = self.queue.length;\n while (++i < len) {\n self.queue[i].callRejected(error);\n }\n return self;\n};\n\nfunction getThen(obj) {\n // Make sure we only access the accessor once as required by the spec\n var then = obj && obj.then;\n if (obj && (typeof obj === 'object' || typeof obj === 'function') && typeof then === 'function') {\n return function appyThen() {\n then.apply(obj, arguments);\n };\n }\n}\n\nfunction safelyResolveThenable(self, thenable) {\n // Either fulfill, reject or reject with error\n var called = false;\n function onError(value) {\n if (called) {\n return;\n }\n called = true;\n handlers.reject(self, value);\n }\n\n function onSuccess(value) {\n if (called) {\n return;\n }\n called = true;\n handlers.resolve(self, value);\n }\n\n function tryToUnwrap() {\n thenable(onSuccess, onError);\n }\n\n var result = tryCatch(tryToUnwrap);\n if (result.status === 'error') {\n onError(result.value);\n }\n}\n\nfunction tryCatch(func, value) {\n var out = {};\n try {\n out.value = func(value);\n out.status = 'success';\n } catch (e) {\n out.status = 'error';\n out.value = e;\n }\n return out;\n}\n\nPromise.resolve = resolve;\nfunction resolve(value) {\n if (value instanceof this) {\n return value;\n }\n return handlers.resolve(new this(INTERNAL), value);\n}\n\nPromise.reject = reject;\nfunction reject(reason) {\n var promise = new this(INTERNAL);\n return handlers.reject(promise, reason);\n}\n\nPromise.all = all;\nfunction all(iterable) {\n var self = this;\n if (Object.prototype.toString.call(iterable) !== '[object Array]') {\n return this.reject(new TypeError('must be an array'));\n }\n\n var len = iterable.length;\n var called = false;\n if (!len) {\n return this.resolve([]);\n }\n\n var values = new Array(len);\n var resolved = 0;\n var i = -1;\n var promise = new this(INTERNAL);\n\n while (++i < len) {\n allResolver(iterable[i], i);\n }\n return promise;\n function allResolver(value, i) {\n self.resolve(value).then(resolveFromAll, function (error) {\n if (!called) {\n called = true;\n handlers.reject(promise, error);\n }\n });\n function resolveFromAll(outValue) {\n values[i] = outValue;\n if (++resolved === len && !called) {\n called = true;\n handlers.resolve(promise, values);\n }\n }\n }\n}\n\nPromise.race = race;\nfunction race(iterable) {\n var self = this;\n if (Object.prototype.toString.call(iterable) !== '[object Array]') {\n return this.reject(new TypeError('must be an array'));\n }\n\n var len = iterable.length;\n var called = false;\n if (!len) {\n return this.resolve([]);\n }\n\n var i = -1;\n var promise = new this(INTERNAL);\n\n while (++i < len) {\n resolver(iterable[i]);\n }\n return promise;\n function resolver(value) {\n self.resolve(value).then(function (response) {\n if (!called) {\n called = true;\n handlers.resolve(promise, response);\n }\n }, function (error) {\n if (!called) {\n called = true;\n handlers.reject(promise, error);\n }\n });\n }\n}\n\n},{\"1\":1}],3:[function(_dereq_,module,exports){\n(function (global){\n'use strict';\nif (typeof global.Promise !== 'function') {\n global.Promise = _dereq_(2);\n}\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{\"2\":2}],4:[function(_dereq_,module,exports){\n'use strict';\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction getIDB() {\n /* global indexedDB,webkitIndexedDB,mozIndexedDB,OIndexedDB,msIndexedDB */\n try {\n if (typeof indexedDB !== 'undefined') {\n return indexedDB;\n }\n if (typeof webkitIndexedDB !== 'undefined') {\n return webkitIndexedDB;\n }\n if (typeof mozIndexedDB !== 'undefined') {\n return mozIndexedDB;\n }\n if (typeof OIndexedDB !== 'undefined') {\n return OIndexedDB;\n }\n if (typeof msIndexedDB !== 'undefined') {\n return msIndexedDB;\n }\n } catch (e) {\n return;\n }\n}\n\nvar idb = getIDB();\n\nfunction isIndexedDBValid() {\n try {\n // Initialize IndexedDB; fall back to vendor-prefixed versions\n // if needed.\n if (!idb || !idb.open) {\n return false;\n }\n // We mimic PouchDB here;\n //\n // We test for openDatabase because IE Mobile identifies itself\n // as Safari. Oh the lulz...\n var isSafari = typeof openDatabase !== 'undefined' && /(Safari|iPhone|iPad|iPod)/.test(navigator.userAgent) && !/Chrome/.test(navigator.userAgent) && !/BlackBerry/.test(navigator.platform);\n\n var hasFetch = typeof fetch === 'function' && fetch.toString().indexOf('[native code') !== -1;\n\n // Safari <10.1 does not meet our requirements for IDB support\n // (see: https://github.com/pouchdb/pouchdb/issues/5572).\n // Safari 10.1 shipped with fetch, we can use that to detect it.\n // Note: this creates issues with `window.fetch` polyfills and\n // overrides; see:\n // https://github.com/localForage/localForage/issues/856\n return (!isSafari || hasFetch) && typeof indexedDB !== 'undefined' &&\n // some outdated implementations of IDB that appear on Samsung\n // and HTC Android devices <4.4 are missing IDBKeyRange\n // See: https://github.com/mozilla/localForage/issues/128\n // See: https://github.com/mozilla/localForage/issues/272\n typeof IDBKeyRange !== 'undefined';\n } catch (e) {\n return false;\n }\n}\n\n// Abstracts constructing a Blob object, so it also works in older\n// browsers that don't support the native Blob constructor. (i.e.\n// old QtWebKit versions, at least).\n// Abstracts constructing a Blob object, so it also works in older\n// browsers that don't support the native Blob constructor. (i.e.\n// old QtWebKit versions, at least).\nfunction createBlob(parts, properties) {\n /* global BlobBuilder,MSBlobBuilder,MozBlobBuilder,WebKitBlobBuilder */\n parts = parts || [];\n properties = properties || {};\n try {\n return new Blob(parts, properties);\n } catch (e) {\n if (e.name !== 'TypeError') {\n throw e;\n }\n var Builder = typeof BlobBuilder !== 'undefined' ? BlobBuilder : typeof MSBlobBuilder !== 'undefined' ? MSBlobBuilder : typeof MozBlobBuilder !== 'undefined' ? MozBlobBuilder : WebKitBlobBuilder;\n var builder = new Builder();\n for (var i = 0; i < parts.length; i += 1) {\n builder.append(parts[i]);\n }\n return builder.getBlob(properties.type);\n }\n}\n\n// This is CommonJS because lie is an external dependency, so Rollup\n// can just ignore it.\nif (typeof Promise === 'undefined') {\n // In the \"nopromises\" build this will just throw if you don't have\n // a global promise object, but it would throw anyway later.\n _dereq_(3);\n}\nvar Promise$1 = Promise;\n\nfunction executeCallback(promise, callback) {\n if (callback) {\n promise.then(function (result) {\n callback(null, result);\n }, function (error) {\n callback(error);\n });\n }\n}\n\nfunction executeTwoCallbacks(promise, callback, errorCallback) {\n if (typeof callback === 'function') {\n promise.then(callback);\n }\n\n if (typeof errorCallback === 'function') {\n promise[\"catch\"](errorCallback);\n }\n}\n\nfunction normalizeKey(key) {\n // Cast the key to a string, as that's all we can set as a key.\n if (typeof key !== 'string') {\n console.warn(key + ' used as a key, but it is not a string.');\n key = String(key);\n }\n\n return key;\n}\n\nfunction getCallback() {\n if (arguments.length && typeof arguments[arguments.length - 1] === 'function') {\n return arguments[arguments.length - 1];\n }\n}\n\n// Some code originally from async_storage.js in\n// [Gaia](https://github.com/mozilla-b2g/gaia).\n\nvar DETECT_BLOB_SUPPORT_STORE = 'local-forage-detect-blob-support';\nvar supportsBlobs = void 0;\nvar dbContexts = {};\nvar toString = Object.prototype.toString;\n\n// Transaction Modes\nvar READ_ONLY = 'readonly';\nvar READ_WRITE = 'readwrite';\n\n// Transform a binary string to an array buffer, because otherwise\n// weird stuff happens when you try to work with the binary string directly.\n// It is known.\n// From http://stackoverflow.com/questions/14967647/ (continues on next line)\n// encode-decode-image-with-base64-breaks-image (2013-04-21)\nfunction _binStringToArrayBuffer(bin) {\n var length = bin.length;\n var buf = new ArrayBuffer(length);\n var arr = new Uint8Array(buf);\n for (var i = 0; i < length; i++) {\n arr[i] = bin.charCodeAt(i);\n }\n return buf;\n}\n\n//\n// Blobs are not supported in all versions of IndexedDB, notably\n// Chrome <37 and Android <5. In those versions, storing a blob will throw.\n//\n// Various other blob bugs exist in Chrome v37-42 (inclusive).\n// Detecting them is expensive and confusing to users, and Chrome 37-42\n// is at very low usage worldwide, so we do a hacky userAgent check instead.\n//\n// content-type bug: https://code.google.com/p/chromium/issues/detail?id=408120\n// 404 bug: https://code.google.com/p/chromium/issues/detail?id=447916\n// FileReader bug: https://code.google.com/p/chromium/issues/detail?id=447836\n//\n// Code borrowed from PouchDB. See:\n// https://github.com/pouchdb/pouchdb/blob/master/packages/node_modules/pouchdb-adapter-idb/src/blobSupport.js\n//\nfunction _checkBlobSupportWithoutCaching(idb) {\n return new Promise$1(function (resolve) {\n var txn = idb.transaction(DETECT_BLOB_SUPPORT_STORE, READ_WRITE);\n var blob = createBlob(['']);\n txn.objectStore(DETECT_BLOB_SUPPORT_STORE).put(blob, 'key');\n\n txn.onabort = function (e) {\n // If the transaction aborts now its due to not being able to\n // write to the database, likely due to the disk being full\n e.preventDefault();\n e.stopPropagation();\n resolve(false);\n };\n\n txn.oncomplete = function () {\n var matchedChrome = navigator.userAgent.match(/Chrome\\/(\\d+)/);\n var matchedEdge = navigator.userAgent.match(/Edge\\//);\n // MS Edge pretends to be Chrome 42:\n // https://msdn.microsoft.com/en-us/library/hh869301%28v=vs.85%29.aspx\n resolve(matchedEdge || !matchedChrome || parseInt(matchedChrome[1], 10) >= 43);\n };\n })[\"catch\"](function () {\n return false; // error, so assume unsupported\n });\n}\n\nfunction _checkBlobSupport(idb) {\n if (typeof supportsBlobs === 'boolean') {\n return Promise$1.resolve(supportsBlobs);\n }\n return _checkBlobSupportWithoutCaching(idb).then(function (value) {\n supportsBlobs = value;\n return supportsBlobs;\n });\n}\n\nfunction _deferReadiness(dbInfo) {\n var dbContext = dbContexts[dbInfo.name];\n\n // Create a deferred object representing the current database operation.\n var deferredOperation = {};\n\n deferredOperation.promise = new Promise$1(function (resolve, reject) {\n deferredOperation.resolve = resolve;\n deferredOperation.reject = reject;\n });\n\n // Enqueue the deferred operation.\n dbContext.deferredOperations.push(deferredOperation);\n\n // Chain its promise to the database readiness.\n if (!dbContext.dbReady) {\n dbContext.dbReady = deferredOperation.promise;\n } else {\n dbContext.dbReady = dbContext.dbReady.then(function () {\n return deferredOperation.promise;\n });\n }\n}\n\nfunction _advanceReadiness(dbInfo) {\n var dbContext = dbContexts[dbInfo.name];\n\n // Dequeue a deferred operation.\n var deferredOperation = dbContext.deferredOperations.pop();\n\n // Resolve its promise (which is part of the database readiness\n // chain of promises).\n if (deferredOperation) {\n deferredOperation.resolve();\n return deferredOperation.promise;\n }\n}\n\nfunction _rejectReadiness(dbInfo, err) {\n var dbContext = dbContexts[dbInfo.name];\n\n // Dequeue a deferred operation.\n var deferredOperation = dbContext.deferredOperations.pop();\n\n // Reject its promise (which is part of the database readiness\n // chain of promises).\n if (deferredOperation) {\n deferredOperation.reject(err);\n return deferredOperation.promise;\n }\n}\n\nfunction _getConnection(dbInfo, upgradeNeeded) {\n return new Promise$1(function (resolve, reject) {\n dbContexts[dbInfo.name] = dbContexts[dbInfo.name] || createDbContext();\n\n if (dbInfo.db) {\n if (upgradeNeeded) {\n _deferReadiness(dbInfo);\n dbInfo.db.close();\n } else {\n return resolve(dbInfo.db);\n }\n }\n\n var dbArgs = [dbInfo.name];\n\n if (upgradeNeeded) {\n dbArgs.push(dbInfo.version);\n }\n\n var openreq = idb.open.apply(idb, dbArgs);\n\n if (upgradeNeeded) {\n openreq.onupgradeneeded = function (e) {\n var db = openreq.result;\n try {\n db.createObjectStore(dbInfo.storeName);\n if (e.oldVersion <= 1) {\n // Added when support for blob shims was added\n db.createObjectStore(DETECT_BLOB_SUPPORT_STORE);\n }\n } catch (ex) {\n if (ex.name === 'ConstraintError') {\n console.warn('The database \"' + dbInfo.name + '\"' + ' has been upgraded from version ' + e.oldVersion + ' to version ' + e.newVersion + ', but the storage \"' + dbInfo.storeName + '\" already exists.');\n } else {\n throw ex;\n }\n }\n };\n }\n\n openreq.onerror = function (e) {\n e.preventDefault();\n reject(openreq.error);\n };\n\n openreq.onsuccess = function () {\n var db = openreq.result;\n db.onversionchange = function (e) {\n // Triggered when the database is modified (e.g. adding an objectStore) or\n // deleted (even when initiated by other sessions in different tabs).\n // Closing the connection here prevents those operations from being blocked.\n // If the database is accessed again later by this instance, the connection\n // will be reopened or the database recreated as needed.\n e.target.close();\n };\n resolve(db);\n _advanceReadiness(dbInfo);\n };\n });\n}\n\nfunction _getOriginalConnection(dbInfo) {\n return _getConnection(dbInfo, false);\n}\n\nfunction _getUpgradedConnection(dbInfo) {\n return _getConnection(dbInfo, true);\n}\n\nfunction _isUpgradeNeeded(dbInfo, defaultVersion) {\n if (!dbInfo.db) {\n return true;\n }\n\n var isNewStore = !dbInfo.db.objectStoreNames.contains(dbInfo.storeName);\n var isDowngrade = dbInfo.version < dbInfo.db.version;\n var isUpgrade = dbInfo.version > dbInfo.db.version;\n\n if (isDowngrade) {\n // If the version is not the default one\n // then warn for impossible downgrade.\n if (dbInfo.version !== defaultVersion) {\n console.warn('The database \"' + dbInfo.name + '\"' + \" can't be downgraded from version \" + dbInfo.db.version + ' to version ' + dbInfo.version + '.');\n }\n // Align the versions to prevent errors.\n dbInfo.version = dbInfo.db.version;\n }\n\n if (isUpgrade || isNewStore) {\n // If the store is new then increment the version (if needed).\n // This will trigger an \"upgradeneeded\" event which is required\n // for creating a store.\n if (isNewStore) {\n var incVersion = dbInfo.db.version + 1;\n if (incVersion > dbInfo.version) {\n dbInfo.version = incVersion;\n }\n }\n\n return true;\n }\n\n return false;\n}\n\n// encode a blob for indexeddb engines that don't support blobs\nfunction _encodeBlob(blob) {\n return new Promise$1(function (resolve, reject) {\n var reader = new FileReader();\n reader.onerror = reject;\n reader.onloadend = function (e) {\n var base64 = btoa(e.target.result || '');\n resolve({\n __local_forage_encoded_blob: true,\n data: base64,\n type: blob.type\n });\n };\n reader.readAsBinaryString(blob);\n });\n}\n\n// decode an encoded blob\nfunction _decodeBlob(encodedBlob) {\n var arrayBuff = _binStringToArrayBuffer(atob(encodedBlob.data));\n return createBlob([arrayBuff], { type: encodedBlob.type });\n}\n\n// is this one of our fancy encoded blobs?\nfunction _isEncodedBlob(value) {\n return value && value.__local_forage_encoded_blob;\n}\n\n// Specialize the default `ready()` function by making it dependent\n// on the current database operations. Thus, the driver will be actually\n// ready when it's been initialized (default) *and* there are no pending\n// operations on the database (initiated by some other instances).\nfunction _fullyReady(callback) {\n var self = this;\n\n var promise = self._initReady().then(function () {\n var dbContext = dbContexts[self._dbInfo.name];\n\n if (dbContext && dbContext.dbReady) {\n return dbContext.dbReady;\n }\n });\n\n executeTwoCallbacks(promise, callback, callback);\n return promise;\n}\n\n// Try to establish a new db connection to replace the\n// current one which is broken (i.e. experiencing\n// InvalidStateError while creating a transaction).\nfunction _tryReconnect(dbInfo) {\n _deferReadiness(dbInfo);\n\n var dbContext = dbContexts[dbInfo.name];\n var forages = dbContext.forages;\n\n for (var i = 0; i < forages.length; i++) {\n var forage = forages[i];\n if (forage._dbInfo.db) {\n forage._dbInfo.db.close();\n forage._dbInfo.db = null;\n }\n }\n dbInfo.db = null;\n\n return _getOriginalConnection(dbInfo).then(function (db) {\n dbInfo.db = db;\n if (_isUpgradeNeeded(dbInfo)) {\n // Reopen the database for upgrading.\n return _getUpgradedConnection(dbInfo);\n }\n return db;\n }).then(function (db) {\n // store the latest db reference\n // in case the db was upgraded\n dbInfo.db = dbContext.db = db;\n for (var i = 0; i < forages.length; i++) {\n forages[i]._dbInfo.db = db;\n }\n })[\"catch\"](function (err) {\n _rejectReadiness(dbInfo, err);\n throw err;\n });\n}\n\n// FF doesn't like Promises (micro-tasks) and IDDB store operations,\n// so we have to do it with callbacks\nfunction createTransaction(dbInfo, mode, callback, retries) {\n if (retries === undefined) {\n retries = 1;\n }\n\n try {\n var tx = dbInfo.db.transaction(dbInfo.storeName, mode);\n callback(null, tx);\n } catch (err) {\n if (retries > 0 && (!dbInfo.db || err.name === 'InvalidStateError' || err.name === 'NotFoundError')) {\n return Promise$1.resolve().then(function () {\n if (!dbInfo.db || err.name === 'NotFoundError' && !dbInfo.db.objectStoreNames.contains(dbInfo.storeName) && dbInfo.version <= dbInfo.db.version) {\n // increase the db version, to create the new ObjectStore\n if (dbInfo.db) {\n dbInfo.version = dbInfo.db.version + 1;\n }\n // Reopen the database for upgrading.\n return _getUpgradedConnection(dbInfo);\n }\n }).then(function () {\n return _tryReconnect(dbInfo).then(function () {\n createTransaction(dbInfo, mode, callback, retries - 1);\n });\n })[\"catch\"](callback);\n }\n\n callback(err);\n }\n}\n\nfunction createDbContext() {\n return {\n // Running localForages sharing a database.\n forages: [],\n // Shared database.\n db: null,\n // Database readiness (promise).\n dbReady: null,\n // Deferred operations on the database.\n deferredOperations: []\n };\n}\n\n// Open the IndexedDB database (automatically creates one if one didn't\n// previously exist), using any options set in the config.\nfunction _initStorage(options) {\n var self = this;\n var dbInfo = {\n db: null\n };\n\n if (options) {\n for (var i in options) {\n dbInfo[i] = options[i];\n }\n }\n\n // Get the current context of the database;\n var dbContext = dbContexts[dbInfo.name];\n\n // ...or create a new context.\n if (!dbContext) {\n dbContext = createDbContext();\n // Register the new context in the global container.\n dbContexts[dbInfo.name] = dbContext;\n }\n\n // Register itself as a running localForage in the current context.\n dbContext.forages.push(self);\n\n // Replace the default `ready()` function with the specialized one.\n if (!self._initReady) {\n self._initReady = self.ready;\n self.ready = _fullyReady;\n }\n\n // Create an array of initialization states of the related localForages.\n var initPromises = [];\n\n function ignoreErrors() {\n // Don't handle errors here,\n // just makes sure related localForages aren't pending.\n return Promise$1.resolve();\n }\n\n for (var j = 0; j < dbContext.forages.length; j++) {\n var forage = dbContext.forages[j];\n if (forage !== self) {\n // Don't wait for itself...\n initPromises.push(forage._initReady()[\"catch\"](ignoreErrors));\n }\n }\n\n // Take a snapshot of the related localForages.\n var forages = dbContext.forages.slice(0);\n\n // Initialize the connection process only when\n // all the related localForages aren't pending.\n return Promise$1.all(initPromises).then(function () {\n dbInfo.db = dbContext.db;\n // Get the connection or open a new one without upgrade.\n return _getOriginalConnection(dbInfo);\n }).then(function (db) {\n dbInfo.db = db;\n if (_isUpgradeNeeded(dbInfo, self._defaultConfig.version)) {\n // Reopen the database for upgrading.\n return _getUpgradedConnection(dbInfo);\n }\n return db;\n }).then(function (db) {\n dbInfo.db = dbContext.db = db;\n self._dbInfo = dbInfo;\n // Share the final connection amongst related localForages.\n for (var k = 0; k < forages.length; k++) {\n var forage = forages[k];\n if (forage !== self) {\n // Self is already up-to-date.\n forage._dbInfo.db = dbInfo.db;\n forage._dbInfo.version = dbInfo.version;\n }\n }\n });\n}\n\nfunction getItem(key, callback) {\n var self = this;\n\n key = normalizeKey(key);\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n createTransaction(self._dbInfo, READ_ONLY, function (err, transaction) {\n if (err) {\n return reject(err);\n }\n\n try {\n var store = transaction.objectStore(self._dbInfo.storeName);\n var req = store.get(key);\n\n req.onsuccess = function () {\n var value = req.result;\n if (value === undefined) {\n value = null;\n }\n if (_isEncodedBlob(value)) {\n value = _decodeBlob(value);\n }\n resolve(value);\n };\n\n req.onerror = function () {\n reject(req.error);\n };\n } catch (e) {\n reject(e);\n }\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\n// Iterate over all items stored in database.\nfunction iterate(iterator, callback) {\n var self = this;\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n createTransaction(self._dbInfo, READ_ONLY, function (err, transaction) {\n if (err) {\n return reject(err);\n }\n\n try {\n var store = transaction.objectStore(self._dbInfo.storeName);\n var req = store.openCursor();\n var iterationNumber = 1;\n\n req.onsuccess = function () {\n var cursor = req.result;\n\n if (cursor) {\n var value = cursor.value;\n if (_isEncodedBlob(value)) {\n value = _decodeBlob(value);\n }\n var result = iterator(value, cursor.key, iterationNumber++);\n\n // when the iterator callback returns any\n // (non-`undefined`) value, then we stop\n // the iteration immediately\n if (result !== void 0) {\n resolve(result);\n } else {\n cursor[\"continue\"]();\n }\n } else {\n resolve();\n }\n };\n\n req.onerror = function () {\n reject(req.error);\n };\n } catch (e) {\n reject(e);\n }\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n\n return promise;\n}\n\nfunction setItem(key, value, callback) {\n var self = this;\n\n key = normalizeKey(key);\n\n var promise = new Promise$1(function (resolve, reject) {\n var dbInfo;\n self.ready().then(function () {\n dbInfo = self._dbInfo;\n if (toString.call(value) === '[object Blob]') {\n return _checkBlobSupport(dbInfo.db).then(function (blobSupport) {\n if (blobSupport) {\n return value;\n }\n return _encodeBlob(value);\n });\n }\n return value;\n }).then(function (value) {\n createTransaction(self._dbInfo, READ_WRITE, function (err, transaction) {\n if (err) {\n return reject(err);\n }\n\n try {\n var store = transaction.objectStore(self._dbInfo.storeName);\n\n // The reason we don't _save_ null is because IE 10 does\n // not support saving the `null` type in IndexedDB. How\n // ironic, given the bug below!\n // See: https://github.com/mozilla/localForage/issues/161\n if (value === null) {\n value = undefined;\n }\n\n var req = store.put(value, key);\n\n transaction.oncomplete = function () {\n // Cast to undefined so the value passed to\n // callback/promise is the same as what one would get out\n // of `getItem()` later. This leads to some weirdness\n // (setItem('foo', undefined) will return `null`), but\n // it's not my fault localStorage is our baseline and that\n // it's weird.\n if (value === undefined) {\n value = null;\n }\n\n resolve(value);\n };\n transaction.onabort = transaction.onerror = function () {\n var err = req.error ? req.error : req.transaction.error;\n reject(err);\n };\n } catch (e) {\n reject(e);\n }\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nfunction removeItem(key, callback) {\n var self = this;\n\n key = normalizeKey(key);\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n createTransaction(self._dbInfo, READ_WRITE, function (err, transaction) {\n if (err) {\n return reject(err);\n }\n\n try {\n var store = transaction.objectStore(self._dbInfo.storeName);\n // We use a Grunt task to make this safe for IE and some\n // versions of Android (including those used by Cordova).\n // Normally IE won't like `.delete()` and will insist on\n // using `['delete']()`, but we have a build step that\n // fixes this for us now.\n var req = store[\"delete\"](key);\n transaction.oncomplete = function () {\n resolve();\n };\n\n transaction.onerror = function () {\n reject(req.error);\n };\n\n // The request will be also be aborted if we've exceeded our storage\n // space.\n transaction.onabort = function () {\n var err = req.error ? req.error : req.transaction.error;\n reject(err);\n };\n } catch (e) {\n reject(e);\n }\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nfunction clear(callback) {\n var self = this;\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n createTransaction(self._dbInfo, READ_WRITE, function (err, transaction) {\n if (err) {\n return reject(err);\n }\n\n try {\n var store = transaction.objectStore(self._dbInfo.storeName);\n var req = store.clear();\n\n transaction.oncomplete = function () {\n resolve();\n };\n\n transaction.onabort = transaction.onerror = function () {\n var err = req.error ? req.error : req.transaction.error;\n reject(err);\n };\n } catch (e) {\n reject(e);\n }\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nfunction length(callback) {\n var self = this;\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n createTransaction(self._dbInfo, READ_ONLY, function (err, transaction) {\n if (err) {\n return reject(err);\n }\n\n try {\n var store = transaction.objectStore(self._dbInfo.storeName);\n var req = store.count();\n\n req.onsuccess = function () {\n resolve(req.result);\n };\n\n req.onerror = function () {\n reject(req.error);\n };\n } catch (e) {\n reject(e);\n }\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nfunction key(n, callback) {\n var self = this;\n\n var promise = new Promise$1(function (resolve, reject) {\n if (n < 0) {\n resolve(null);\n\n return;\n }\n\n self.ready().then(function () {\n createTransaction(self._dbInfo, READ_ONLY, function (err, transaction) {\n if (err) {\n return reject(err);\n }\n\n try {\n var store = transaction.objectStore(self._dbInfo.storeName);\n var advanced = false;\n var req = store.openKeyCursor();\n\n req.onsuccess = function () {\n var cursor = req.result;\n if (!cursor) {\n // this means there weren't enough keys\n resolve(null);\n\n return;\n }\n\n if (n === 0) {\n // We have the first key, return it if that's what they\n // wanted.\n resolve(cursor.key);\n } else {\n if (!advanced) {\n // Otherwise, ask the cursor to skip ahead n\n // records.\n advanced = true;\n cursor.advance(n);\n } else {\n // When we get here, we've got the nth key.\n resolve(cursor.key);\n }\n }\n };\n\n req.onerror = function () {\n reject(req.error);\n };\n } catch (e) {\n reject(e);\n }\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nfunction keys(callback) {\n var self = this;\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n createTransaction(self._dbInfo, READ_ONLY, function (err, transaction) {\n if (err) {\n return reject(err);\n }\n\n try {\n var store = transaction.objectStore(self._dbInfo.storeName);\n var req = store.openKeyCursor();\n var keys = [];\n\n req.onsuccess = function () {\n var cursor = req.result;\n\n if (!cursor) {\n resolve(keys);\n return;\n }\n\n keys.push(cursor.key);\n cursor[\"continue\"]();\n };\n\n req.onerror = function () {\n reject(req.error);\n };\n } catch (e) {\n reject(e);\n }\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nfunction dropInstance(options, callback) {\n callback = getCallback.apply(this, arguments);\n\n var currentConfig = this.config();\n options = typeof options !== 'function' && options || {};\n if (!options.name) {\n options.name = options.name || currentConfig.name;\n options.storeName = options.storeName || currentConfig.storeName;\n }\n\n var self = this;\n var promise;\n if (!options.name) {\n promise = Promise$1.reject('Invalid arguments');\n } else {\n var isCurrentDb = options.name === currentConfig.name && self._dbInfo.db;\n\n var dbPromise = isCurrentDb ? Promise$1.resolve(self._dbInfo.db) : _getOriginalConnection(options).then(function (db) {\n var dbContext = dbContexts[options.name];\n var forages = dbContext.forages;\n dbContext.db = db;\n for (var i = 0; i < forages.length; i++) {\n forages[i]._dbInfo.db = db;\n }\n return db;\n });\n\n if (!options.storeName) {\n promise = dbPromise.then(function (db) {\n _deferReadiness(options);\n\n var dbContext = dbContexts[options.name];\n var forages = dbContext.forages;\n\n db.close();\n for (var i = 0; i < forages.length; i++) {\n var forage = forages[i];\n forage._dbInfo.db = null;\n }\n\n var dropDBPromise = new Promise$1(function (resolve, reject) {\n var req = idb.deleteDatabase(options.name);\n\n req.onerror = function () {\n var db = req.result;\n if (db) {\n db.close();\n }\n reject(req.error);\n };\n\n req.onblocked = function () {\n // Closing all open connections in onversionchange handler should prevent this situation, but if\n // we do get here, it just means the request remains pending - eventually it will succeed or error\n console.warn('dropInstance blocked for database \"' + options.name + '\" until all open connections are closed');\n };\n\n req.onsuccess = function () {\n var db = req.result;\n if (db) {\n db.close();\n }\n resolve(db);\n };\n });\n\n return dropDBPromise.then(function (db) {\n dbContext.db = db;\n for (var i = 0; i < forages.length; i++) {\n var _forage = forages[i];\n _advanceReadiness(_forage._dbInfo);\n }\n })[\"catch\"](function (err) {\n (_rejectReadiness(options, err) || Promise$1.resolve())[\"catch\"](function () {});\n throw err;\n });\n });\n } else {\n promise = dbPromise.then(function (db) {\n if (!db.objectStoreNames.contains(options.storeName)) {\n return;\n }\n\n var newVersion = db.version + 1;\n\n _deferReadiness(options);\n\n var dbContext = dbContexts[options.name];\n var forages = dbContext.forages;\n\n db.close();\n for (var i = 0; i < forages.length; i++) {\n var forage = forages[i];\n forage._dbInfo.db = null;\n forage._dbInfo.version = newVersion;\n }\n\n var dropObjectPromise = new Promise$1(function (resolve, reject) {\n var req = idb.open(options.name, newVersion);\n\n req.onerror = function (err) {\n var db = req.result;\n db.close();\n reject(err);\n };\n\n req.onupgradeneeded = function () {\n var db = req.result;\n db.deleteObjectStore(options.storeName);\n };\n\n req.onsuccess = function () {\n var db = req.result;\n db.close();\n resolve(db);\n };\n });\n\n return dropObjectPromise.then(function (db) {\n dbContext.db = db;\n for (var j = 0; j < forages.length; j++) {\n var _forage2 = forages[j];\n _forage2._dbInfo.db = db;\n _advanceReadiness(_forage2._dbInfo);\n }\n })[\"catch\"](function (err) {\n (_rejectReadiness(options, err) || Promise$1.resolve())[\"catch\"](function () {});\n throw err;\n });\n });\n }\n }\n\n executeCallback(promise, callback);\n return promise;\n}\n\nvar asyncStorage = {\n _driver: 'asyncStorage',\n _initStorage: _initStorage,\n _support: isIndexedDBValid(),\n iterate: iterate,\n getItem: getItem,\n setItem: setItem,\n removeItem: removeItem,\n clear: clear,\n length: length,\n key: key,\n keys: keys,\n dropInstance: dropInstance\n};\n\nfunction isWebSQLValid() {\n return typeof openDatabase === 'function';\n}\n\n// Sadly, the best way to save binary data in WebSQL/localStorage is serializing\n// it to Base64, so this is how we store it to prevent very strange errors with less\n// verbose ways of binary <-> string data storage.\nvar BASE_CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n\nvar BLOB_TYPE_PREFIX = '~~local_forage_type~';\nvar BLOB_TYPE_PREFIX_REGEX = /^~~local_forage_type~([^~]+)~/;\n\nvar SERIALIZED_MARKER = '__lfsc__:';\nvar SERIALIZED_MARKER_LENGTH = SERIALIZED_MARKER.length;\n\n// OMG the serializations!\nvar TYPE_ARRAYBUFFER = 'arbf';\nvar TYPE_BLOB = 'blob';\nvar TYPE_INT8ARRAY = 'si08';\nvar TYPE_UINT8ARRAY = 'ui08';\nvar TYPE_UINT8CLAMPEDARRAY = 'uic8';\nvar TYPE_INT16ARRAY = 'si16';\nvar TYPE_INT32ARRAY = 'si32';\nvar TYPE_UINT16ARRAY = 'ur16';\nvar TYPE_UINT32ARRAY = 'ui32';\nvar TYPE_FLOAT32ARRAY = 'fl32';\nvar TYPE_FLOAT64ARRAY = 'fl64';\nvar TYPE_SERIALIZED_MARKER_LENGTH = SERIALIZED_MARKER_LENGTH + TYPE_ARRAYBUFFER.length;\n\nvar toString$1 = Object.prototype.toString;\n\nfunction stringToBuffer(serializedString) {\n // Fill the string into a ArrayBuffer.\n var bufferLength = serializedString.length * 0.75;\n var len = serializedString.length;\n var i;\n var p = 0;\n var encoded1, encoded2, encoded3, encoded4;\n\n if (serializedString[serializedString.length - 1] === '=') {\n bufferLength--;\n if (serializedString[serializedString.length - 2] === '=') {\n bufferLength--;\n }\n }\n\n var buffer = new ArrayBuffer(bufferLength);\n var bytes = new Uint8Array(buffer);\n\n for (i = 0; i < len; i += 4) {\n encoded1 = BASE_CHARS.indexOf(serializedString[i]);\n encoded2 = BASE_CHARS.indexOf(serializedString[i + 1]);\n encoded3 = BASE_CHARS.indexOf(serializedString[i + 2]);\n encoded4 = BASE_CHARS.indexOf(serializedString[i + 3]);\n\n /*jslint bitwise: true */\n bytes[p++] = encoded1 << 2 | encoded2 >> 4;\n bytes[p++] = (encoded2 & 15) << 4 | encoded3 >> 2;\n bytes[p++] = (encoded3 & 3) << 6 | encoded4 & 63;\n }\n return buffer;\n}\n\n// Converts a buffer to a string to store, serialized, in the backend\n// storage library.\nfunction bufferToString(buffer) {\n // base64-arraybuffer\n var bytes = new Uint8Array(buffer);\n var base64String = '';\n var i;\n\n for (i = 0; i < bytes.length; i += 3) {\n /*jslint bitwise: true */\n base64String += BASE_CHARS[bytes[i] >> 2];\n base64String += BASE_CHARS[(bytes[i] & 3) << 4 | bytes[i + 1] >> 4];\n base64String += BASE_CHARS[(bytes[i + 1] & 15) << 2 | bytes[i + 2] >> 6];\n base64String += BASE_CHARS[bytes[i + 2] & 63];\n }\n\n if (bytes.length % 3 === 2) {\n base64String = base64String.substring(0, base64String.length - 1) + '=';\n } else if (bytes.length % 3 === 1) {\n base64String = base64String.substring(0, base64String.length - 2) + '==';\n }\n\n return base64String;\n}\n\n// Serialize a value, afterwards executing a callback (which usually\n// instructs the `setItem()` callback/promise to be executed). This is how\n// we store binary data with localStorage.\nfunction serialize(value, callback) {\n var valueType = '';\n if (value) {\n valueType = toString$1.call(value);\n }\n\n // Cannot use `value instanceof ArrayBuffer` or such here, as these\n // checks fail when running the tests using casper.js...\n //\n // TODO: See why those tests fail and use a better solution.\n if (value && (valueType === '[object ArrayBuffer]' || value.buffer && toString$1.call(value.buffer) === '[object ArrayBuffer]')) {\n // Convert binary arrays to a string and prefix the string with\n // a special marker.\n var buffer;\n var marker = SERIALIZED_MARKER;\n\n if (value instanceof ArrayBuffer) {\n buffer = value;\n marker += TYPE_ARRAYBUFFER;\n } else {\n buffer = value.buffer;\n\n if (valueType === '[object Int8Array]') {\n marker += TYPE_INT8ARRAY;\n } else if (valueType === '[object Uint8Array]') {\n marker += TYPE_UINT8ARRAY;\n } else if (valueType === '[object Uint8ClampedArray]') {\n marker += TYPE_UINT8CLAMPEDARRAY;\n } else if (valueType === '[object Int16Array]') {\n marker += TYPE_INT16ARRAY;\n } else if (valueType === '[object Uint16Array]') {\n marker += TYPE_UINT16ARRAY;\n } else if (valueType === '[object Int32Array]') {\n marker += TYPE_INT32ARRAY;\n } else if (valueType === '[object Uint32Array]') {\n marker += TYPE_UINT32ARRAY;\n } else if (valueType === '[object Float32Array]') {\n marker += TYPE_FLOAT32ARRAY;\n } else if (valueType === '[object Float64Array]') {\n marker += TYPE_FLOAT64ARRAY;\n } else {\n callback(new Error('Failed to get type for BinaryArray'));\n }\n }\n\n callback(marker + bufferToString(buffer));\n } else if (valueType === '[object Blob]') {\n // Conver the blob to a binaryArray and then to a string.\n var fileReader = new FileReader();\n\n fileReader.onload = function () {\n // Backwards-compatible prefix for the blob type.\n var str = BLOB_TYPE_PREFIX + value.type + '~' + bufferToString(this.result);\n\n callback(SERIALIZED_MARKER + TYPE_BLOB + str);\n };\n\n fileReader.readAsArrayBuffer(value);\n } else {\n try {\n callback(JSON.stringify(value));\n } catch (e) {\n console.error(\"Couldn't convert value into a JSON string: \", value);\n\n callback(null, e);\n }\n }\n}\n\n// Deserialize data we've inserted into a value column/field. We place\n// special markers into our strings to mark them as encoded; this isn't\n// as nice as a meta field, but it's the only sane thing we can do whilst\n// keeping localStorage support intact.\n//\n// Oftentimes this will just deserialize JSON content, but if we have a\n// special marker (SERIALIZED_MARKER, defined above), we will extract\n// some kind of arraybuffer/binary data/typed array out of the string.\nfunction deserialize(value) {\n // If we haven't marked this string as being specially serialized (i.e.\n // something other than serialized JSON), we can just return it and be\n // done with it.\n if (value.substring(0, SERIALIZED_MARKER_LENGTH) !== SERIALIZED_MARKER) {\n return JSON.parse(value);\n }\n\n // The following code deals with deserializing some kind of Blob or\n // TypedArray. First we separate out the type of data we're dealing\n // with from the data itself.\n var serializedString = value.substring(TYPE_SERIALIZED_MARKER_LENGTH);\n var type = value.substring(SERIALIZED_MARKER_LENGTH, TYPE_SERIALIZED_MARKER_LENGTH);\n\n var blobType;\n // Backwards-compatible blob type serialization strategy.\n // DBs created with older versions of localForage will simply not have the blob type.\n if (type === TYPE_BLOB && BLOB_TYPE_PREFIX_REGEX.test(serializedString)) {\n var matcher = serializedString.match(BLOB_TYPE_PREFIX_REGEX);\n blobType = matcher[1];\n serializedString = serializedString.substring(matcher[0].length);\n }\n var buffer = stringToBuffer(serializedString);\n\n // Return the right type based on the code/type set during\n // serialization.\n switch (type) {\n case TYPE_ARRAYBUFFER:\n return buffer;\n case TYPE_BLOB:\n return createBlob([buffer], { type: blobType });\n case TYPE_INT8ARRAY:\n return new Int8Array(buffer);\n case TYPE_UINT8ARRAY:\n return new Uint8Array(buffer);\n case TYPE_UINT8CLAMPEDARRAY:\n return new Uint8ClampedArray(buffer);\n case TYPE_INT16ARRAY:\n return new Int16Array(buffer);\n case TYPE_UINT16ARRAY:\n return new Uint16Array(buffer);\n case TYPE_INT32ARRAY:\n return new Int32Array(buffer);\n case TYPE_UINT32ARRAY:\n return new Uint32Array(buffer);\n case TYPE_FLOAT32ARRAY:\n return new Float32Array(buffer);\n case TYPE_FLOAT64ARRAY:\n return new Float64Array(buffer);\n default:\n throw new Error('Unkown type: ' + type);\n }\n}\n\nvar localforageSerializer = {\n serialize: serialize,\n deserialize: deserialize,\n stringToBuffer: stringToBuffer,\n bufferToString: bufferToString\n};\n\n/*\n * Includes code from:\n *\n * base64-arraybuffer\n * https://github.com/niklasvh/base64-arraybuffer\n *\n * Copyright (c) 2012 Niklas von Hertzen\n * Licensed under the MIT license.\n */\n\nfunction createDbTable(t, dbInfo, callback, errorCallback) {\n t.executeSql('CREATE TABLE IF NOT EXISTS ' + dbInfo.storeName + ' ' + '(id INTEGER PRIMARY KEY, key unique, value)', [], callback, errorCallback);\n}\n\n// Open the WebSQL database (automatically creates one if one didn't\n// previously exist), using any options set in the config.\nfunction _initStorage$1(options) {\n var self = this;\n var dbInfo = {\n db: null\n };\n\n if (options) {\n for (var i in options) {\n dbInfo[i] = typeof options[i] !== 'string' ? options[i].toString() : options[i];\n }\n }\n\n var dbInfoPromise = new Promise$1(function (resolve, reject) {\n // Open the database; the openDatabase API will automatically\n // create it for us if it doesn't exist.\n try {\n dbInfo.db = openDatabase(dbInfo.name, String(dbInfo.version), dbInfo.description, dbInfo.size);\n } catch (e) {\n return reject(e);\n }\n\n // Create our key/value table if it doesn't exist.\n dbInfo.db.transaction(function (t) {\n createDbTable(t, dbInfo, function () {\n self._dbInfo = dbInfo;\n resolve();\n }, function (t, error) {\n reject(error);\n });\n }, reject);\n });\n\n dbInfo.serializer = localforageSerializer;\n return dbInfoPromise;\n}\n\nfunction tryExecuteSql(t, dbInfo, sqlStatement, args, callback, errorCallback) {\n t.executeSql(sqlStatement, args, callback, function (t, error) {\n if (error.code === error.SYNTAX_ERR) {\n t.executeSql('SELECT name FROM sqlite_master ' + \"WHERE type='table' AND name = ?\", [dbInfo.storeName], function (t, results) {\n if (!results.rows.length) {\n // if the table is missing (was deleted)\n // re-create it table and retry\n createDbTable(t, dbInfo, function () {\n t.executeSql(sqlStatement, args, callback, errorCallback);\n }, errorCallback);\n } else {\n errorCallback(t, error);\n }\n }, errorCallback);\n } else {\n errorCallback(t, error);\n }\n }, errorCallback);\n}\n\nfunction getItem$1(key, callback) {\n var self = this;\n\n key = normalizeKey(key);\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n var dbInfo = self._dbInfo;\n dbInfo.db.transaction(function (t) {\n tryExecuteSql(t, dbInfo, 'SELECT * FROM ' + dbInfo.storeName + ' WHERE key = ? LIMIT 1', [key], function (t, results) {\n var result = results.rows.length ? results.rows.item(0).value : null;\n\n // Check to see if this is serialized content we need to\n // unpack.\n if (result) {\n result = dbInfo.serializer.deserialize(result);\n }\n\n resolve(result);\n }, function (t, error) {\n reject(error);\n });\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nfunction iterate$1(iterator, callback) {\n var self = this;\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n var dbInfo = self._dbInfo;\n\n dbInfo.db.transaction(function (t) {\n tryExecuteSql(t, dbInfo, 'SELECT * FROM ' + dbInfo.storeName, [], function (t, results) {\n var rows = results.rows;\n var length = rows.length;\n\n for (var i = 0; i < length; i++) {\n var item = rows.item(i);\n var result = item.value;\n\n // Check to see if this is serialized content\n // we need to unpack.\n if (result) {\n result = dbInfo.serializer.deserialize(result);\n }\n\n result = iterator(result, item.key, i + 1);\n\n // void(0) prevents problems with redefinition\n // of `undefined`.\n if (result !== void 0) {\n resolve(result);\n return;\n }\n }\n\n resolve();\n }, function (t, error) {\n reject(error);\n });\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nfunction _setItem(key, value, callback, retriesLeft) {\n var self = this;\n\n key = normalizeKey(key);\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n // The localStorage API doesn't return undefined values in an\n // \"expected\" way, so undefined is always cast to null in all\n // drivers. See: https://github.com/mozilla/localForage/pull/42\n if (value === undefined) {\n value = null;\n }\n\n // Save the original value to pass to the callback.\n var originalValue = value;\n\n var dbInfo = self._dbInfo;\n dbInfo.serializer.serialize(value, function (value, error) {\n if (error) {\n reject(error);\n } else {\n dbInfo.db.transaction(function (t) {\n tryExecuteSql(t, dbInfo, 'INSERT OR REPLACE INTO ' + dbInfo.storeName + ' ' + '(key, value) VALUES (?, ?)', [key, value], function () {\n resolve(originalValue);\n }, function (t, error) {\n reject(error);\n });\n }, function (sqlError) {\n // The transaction failed; check\n // to see if it's a quota error.\n if (sqlError.code === sqlError.QUOTA_ERR) {\n // We reject the callback outright for now, but\n // it's worth trying to re-run the transaction.\n // Even if the user accepts the prompt to use\n // more storage on Safari, this error will\n // be called.\n //\n // Try to re-run the transaction.\n if (retriesLeft > 0) {\n resolve(_setItem.apply(self, [key, originalValue, callback, retriesLeft - 1]));\n return;\n }\n reject(sqlError);\n }\n });\n }\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nfunction setItem$1(key, value, callback) {\n return _setItem.apply(this, [key, value, callback, 1]);\n}\n\nfunction removeItem$1(key, callback) {\n var self = this;\n\n key = normalizeKey(key);\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n var dbInfo = self._dbInfo;\n dbInfo.db.transaction(function (t) {\n tryExecuteSql(t, dbInfo, 'DELETE FROM ' + dbInfo.storeName + ' WHERE key = ?', [key], function () {\n resolve();\n }, function (t, error) {\n reject(error);\n });\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\n// Deletes every item in the table.\n// TODO: Find out if this resets the AUTO_INCREMENT number.\nfunction clear$1(callback) {\n var self = this;\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n var dbInfo = self._dbInfo;\n dbInfo.db.transaction(function (t) {\n tryExecuteSql(t, dbInfo, 'DELETE FROM ' + dbInfo.storeName, [], function () {\n resolve();\n }, function (t, error) {\n reject(error);\n });\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\n// Does a simple `COUNT(key)` to get the number of items stored in\n// localForage.\nfunction length$1(callback) {\n var self = this;\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n var dbInfo = self._dbInfo;\n dbInfo.db.transaction(function (t) {\n // Ahhh, SQL makes this one soooooo easy.\n tryExecuteSql(t, dbInfo, 'SELECT COUNT(key) as c FROM ' + dbInfo.storeName, [], function (t, results) {\n var result = results.rows.item(0).c;\n resolve(result);\n }, function (t, error) {\n reject(error);\n });\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\n// Return the key located at key index X; essentially gets the key from a\n// `WHERE id = ?`. This is the most efficient way I can think to implement\n// this rarely-used (in my experience) part of the API, but it can seem\n// inconsistent, because we do `INSERT OR REPLACE INTO` on `setItem()`, so\n// the ID of each key will change every time it's updated. Perhaps a stored\n// procedure for the `setItem()` SQL would solve this problem?\n// TODO: Don't change ID on `setItem()`.\nfunction key$1(n, callback) {\n var self = this;\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n var dbInfo = self._dbInfo;\n dbInfo.db.transaction(function (t) {\n tryExecuteSql(t, dbInfo, 'SELECT key FROM ' + dbInfo.storeName + ' WHERE id = ? LIMIT 1', [n + 1], function (t, results) {\n var result = results.rows.length ? results.rows.item(0).key : null;\n resolve(result);\n }, function (t, error) {\n reject(error);\n });\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nfunction keys$1(callback) {\n var self = this;\n\n var promise = new Promise$1(function (resolve, reject) {\n self.ready().then(function () {\n var dbInfo = self._dbInfo;\n dbInfo.db.transaction(function (t) {\n tryExecuteSql(t, dbInfo, 'SELECT key FROM ' + dbInfo.storeName, [], function (t, results) {\n var keys = [];\n\n for (var i = 0; i < results.rows.length; i++) {\n keys.push(results.rows.item(i).key);\n }\n\n resolve(keys);\n }, function (t, error) {\n reject(error);\n });\n });\n })[\"catch\"](reject);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\n// https://www.w3.org/TR/webdatabase/#databases\n// > There is no way to enumerate or delete the databases available for an origin from this API.\nfunction getAllStoreNames(db) {\n return new Promise$1(function (resolve, reject) {\n db.transaction(function (t) {\n t.executeSql('SELECT name FROM sqlite_master ' + \"WHERE type='table' AND name <> '__WebKitDatabaseInfoTable__'\", [], function (t, results) {\n var storeNames = [];\n\n for (var i = 0; i < results.rows.length; i++) {\n storeNames.push(results.rows.item(i).name);\n }\n\n resolve({\n db: db,\n storeNames: storeNames\n });\n }, function (t, error) {\n reject(error);\n });\n }, function (sqlError) {\n reject(sqlError);\n });\n });\n}\n\nfunction dropInstance$1(options, callback) {\n callback = getCallback.apply(this, arguments);\n\n var currentConfig = this.config();\n options = typeof options !== 'function' && options || {};\n if (!options.name) {\n options.name = options.name || currentConfig.name;\n options.storeName = options.storeName || currentConfig.storeName;\n }\n\n var self = this;\n var promise;\n if (!options.name) {\n promise = Promise$1.reject('Invalid arguments');\n } else {\n promise = new Promise$1(function (resolve) {\n var db;\n if (options.name === currentConfig.name) {\n // use the db reference of the current instance\n db = self._dbInfo.db;\n } else {\n db = openDatabase(options.name, '', '', 0);\n }\n\n if (!options.storeName) {\n // drop all database tables\n resolve(getAllStoreNames(db));\n } else {\n resolve({\n db: db,\n storeNames: [options.storeName]\n });\n }\n }).then(function (operationInfo) {\n return new Promise$1(function (resolve, reject) {\n operationInfo.db.transaction(function (t) {\n function dropTable(storeName) {\n return new Promise$1(function (resolve, reject) {\n t.executeSql('DROP TABLE IF EXISTS ' + storeName, [], function () {\n resolve();\n }, function (t, error) {\n reject(error);\n });\n });\n }\n\n var operations = [];\n for (var i = 0, len = operationInfo.storeNames.length; i < len; i++) {\n operations.push(dropTable(operationInfo.storeNames[i]));\n }\n\n Promise$1.all(operations).then(function () {\n resolve();\n })[\"catch\"](function (e) {\n reject(e);\n });\n }, function (sqlError) {\n reject(sqlError);\n });\n });\n });\n }\n\n executeCallback(promise, callback);\n return promise;\n}\n\nvar webSQLStorage = {\n _driver: 'webSQLStorage',\n _initStorage: _initStorage$1,\n _support: isWebSQLValid(),\n iterate: iterate$1,\n getItem: getItem$1,\n setItem: setItem$1,\n removeItem: removeItem$1,\n clear: clear$1,\n length: length$1,\n key: key$1,\n keys: keys$1,\n dropInstance: dropInstance$1\n};\n\nfunction isLocalStorageValid() {\n try {\n return typeof localStorage !== 'undefined' && 'setItem' in localStorage &&\n // in IE8 typeof localStorage.setItem === 'object'\n !!localStorage.setItem;\n } catch (e) {\n return false;\n }\n}\n\nfunction _getKeyPrefix(options, defaultConfig) {\n var keyPrefix = options.name + '/';\n\n if (options.storeName !== defaultConfig.storeName) {\n keyPrefix += options.storeName + '/';\n }\n return keyPrefix;\n}\n\n// Check if localStorage throws when saving an item\nfunction checkIfLocalStorageThrows() {\n var localStorageTestKey = '_localforage_support_test';\n\n try {\n localStorage.setItem(localStorageTestKey, true);\n localStorage.removeItem(localStorageTestKey);\n\n return false;\n } catch (e) {\n return true;\n }\n}\n\n// Check if localStorage is usable and allows to save an item\n// This method checks if localStorage is usable in Safari Private Browsing\n// mode, or in any other case where the available quota for localStorage\n// is 0 and there wasn't any saved items yet.\nfunction _isLocalStorageUsable() {\n return !checkIfLocalStorageThrows() || localStorage.length > 0;\n}\n\n// Config the localStorage backend, using options set in the config.\nfunction _initStorage$2(options) {\n var self = this;\n var dbInfo = {};\n if (options) {\n for (var i in options) {\n dbInfo[i] = options[i];\n }\n }\n\n dbInfo.keyPrefix = _getKeyPrefix(options, self._defaultConfig);\n\n if (!_isLocalStorageUsable()) {\n return Promise$1.reject();\n }\n\n self._dbInfo = dbInfo;\n dbInfo.serializer = localforageSerializer;\n\n return Promise$1.resolve();\n}\n\n// Remove all keys from the datastore, effectively destroying all data in\n// the app's key/value store!\nfunction clear$2(callback) {\n var self = this;\n var promise = self.ready().then(function () {\n var keyPrefix = self._dbInfo.keyPrefix;\n\n for (var i = localStorage.length - 1; i >= 0; i--) {\n var key = localStorage.key(i);\n\n if (key.indexOf(keyPrefix) === 0) {\n localStorage.removeItem(key);\n }\n }\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\n// Retrieve an item from the store. Unlike the original async_storage\n// library in Gaia, we don't modify return values at all. If a key's value\n// is `undefined`, we pass that value to the callback function.\nfunction getItem$2(key, callback) {\n var self = this;\n\n key = normalizeKey(key);\n\n var promise = self.ready().then(function () {\n var dbInfo = self._dbInfo;\n var result = localStorage.getItem(dbInfo.keyPrefix + key);\n\n // If a result was found, parse it from the serialized\n // string into a JS object. If result isn't truthy, the key\n // is likely undefined and we'll pass it straight to the\n // callback.\n if (result) {\n result = dbInfo.serializer.deserialize(result);\n }\n\n return result;\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\n// Iterate over all items in the store.\nfunction iterate$2(iterator, callback) {\n var self = this;\n\n var promise = self.ready().then(function () {\n var dbInfo = self._dbInfo;\n var keyPrefix = dbInfo.keyPrefix;\n var keyPrefixLength = keyPrefix.length;\n var length = localStorage.length;\n\n // We use a dedicated iterator instead of the `i` variable below\n // so other keys we fetch in localStorage aren't counted in\n // the `iterationNumber` argument passed to the `iterate()`\n // callback.\n //\n // See: github.com/mozilla/localForage/pull/435#discussion_r38061530\n var iterationNumber = 1;\n\n for (var i = 0; i < length; i++) {\n var key = localStorage.key(i);\n if (key.indexOf(keyPrefix) !== 0) {\n continue;\n }\n var value = localStorage.getItem(key);\n\n // If a result was found, parse it from the serialized\n // string into a JS object. If result isn't truthy, the\n // key is likely undefined and we'll pass it straight\n // to the iterator.\n if (value) {\n value = dbInfo.serializer.deserialize(value);\n }\n\n value = iterator(value, key.substring(keyPrefixLength), iterationNumber++);\n\n if (value !== void 0) {\n return value;\n }\n }\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\n// Same as localStorage's key() method, except takes a callback.\nfunction key$2(n, callback) {\n var self = this;\n var promise = self.ready().then(function () {\n var dbInfo = self._dbInfo;\n var result;\n try {\n result = localStorage.key(n);\n } catch (error) {\n result = null;\n }\n\n // Remove the prefix from the key, if a key is found.\n if (result) {\n result = result.substring(dbInfo.keyPrefix.length);\n }\n\n return result;\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nfunction keys$2(callback) {\n var self = this;\n var promise = self.ready().then(function () {\n var dbInfo = self._dbInfo;\n var length = localStorage.length;\n var keys = [];\n\n for (var i = 0; i < length; i++) {\n var itemKey = localStorage.key(i);\n if (itemKey.indexOf(dbInfo.keyPrefix) === 0) {\n keys.push(itemKey.substring(dbInfo.keyPrefix.length));\n }\n }\n\n return keys;\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\n// Supply the number of keys in the datastore to the callback function.\nfunction length$2(callback) {\n var self = this;\n var promise = self.keys().then(function (keys) {\n return keys.length;\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\n// Remove an item from the store, nice and simple.\nfunction removeItem$2(key, callback) {\n var self = this;\n\n key = normalizeKey(key);\n\n var promise = self.ready().then(function () {\n var dbInfo = self._dbInfo;\n localStorage.removeItem(dbInfo.keyPrefix + key);\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\n// Set a key's value and run an optional callback once the value is set.\n// Unlike Gaia's implementation, the callback function is passed the value,\n// in case you want to operate on that value only after you're sure it\n// saved, or something like that.\nfunction setItem$2(key, value, callback) {\n var self = this;\n\n key = normalizeKey(key);\n\n var promise = self.ready().then(function () {\n // Convert undefined values to null.\n // https://github.com/mozilla/localForage/pull/42\n if (value === undefined) {\n value = null;\n }\n\n // Save the original value to pass to the callback.\n var originalValue = value;\n\n return new Promise$1(function (resolve, reject) {\n var dbInfo = self._dbInfo;\n dbInfo.serializer.serialize(value, function (value, error) {\n if (error) {\n reject(error);\n } else {\n try {\n localStorage.setItem(dbInfo.keyPrefix + key, value);\n resolve(originalValue);\n } catch (e) {\n // localStorage capacity exceeded.\n // TODO: Make this a specific error/event.\n if (e.name === 'QuotaExceededError' || e.name === 'NS_ERROR_DOM_QUOTA_REACHED') {\n reject(e);\n }\n reject(e);\n }\n }\n });\n });\n });\n\n executeCallback(promise, callback);\n return promise;\n}\n\nfunction dropInstance$2(options, callback) {\n callback = getCallback.apply(this, arguments);\n\n options = typeof options !== 'function' && options || {};\n if (!options.name) {\n var currentConfig = this.config();\n options.name = options.name || currentConfig.name;\n options.storeName = options.storeName || currentConfig.storeName;\n }\n\n var self = this;\n var promise;\n if (!options.name) {\n promise = Promise$1.reject('Invalid arguments');\n } else {\n promise = new Promise$1(function (resolve) {\n if (!options.storeName) {\n resolve(options.name + '/');\n } else {\n resolve(_getKeyPrefix(options, self._defaultConfig));\n }\n }).then(function (keyPrefix) {\n for (var i = localStorage.length - 1; i >= 0; i--) {\n var key = localStorage.key(i);\n\n if (key.indexOf(keyPrefix) === 0) {\n localStorage.removeItem(key);\n }\n }\n });\n }\n\n executeCallback(promise, callback);\n return promise;\n}\n\nvar localStorageWrapper = {\n _driver: 'localStorageWrapper',\n _initStorage: _initStorage$2,\n _support: isLocalStorageValid(),\n iterate: iterate$2,\n getItem: getItem$2,\n setItem: setItem$2,\n removeItem: removeItem$2,\n clear: clear$2,\n length: length$2,\n key: key$2,\n keys: keys$2,\n dropInstance: dropInstance$2\n};\n\nvar sameValue = function sameValue(x, y) {\n return x === y || typeof x === 'number' && typeof y === 'number' && isNaN(x) && isNaN(y);\n};\n\nvar includes = function includes(array, searchElement) {\n var len = array.length;\n var i = 0;\n while (i < len) {\n if (sameValue(array[i], searchElement)) {\n return true;\n }\n i++;\n }\n\n return false;\n};\n\nvar isArray = Array.isArray || function (arg) {\n return Object.prototype.toString.call(arg) === '[object Array]';\n};\n\n// Drivers are stored here when `defineDriver()` is called.\n// They are shared across all instances of localForage.\nvar DefinedDrivers = {};\n\nvar DriverSupport = {};\n\nvar DefaultDrivers = {\n INDEXEDDB: asyncStorage,\n WEBSQL: webSQLStorage,\n LOCALSTORAGE: localStorageWrapper\n};\n\nvar DefaultDriverOrder = [DefaultDrivers.INDEXEDDB._driver, DefaultDrivers.WEBSQL._driver, DefaultDrivers.LOCALSTORAGE._driver];\n\nvar OptionalDriverMethods = ['dropInstance'];\n\nvar LibraryMethods = ['clear', 'getItem', 'iterate', 'key', 'keys', 'length', 'removeItem', 'setItem'].concat(OptionalDriverMethods);\n\nvar DefaultConfig = {\n description: '',\n driver: DefaultDriverOrder.slice(),\n name: 'localforage',\n // Default DB size is _JUST UNDER_ 5MB, as it's the highest size\n // we can use without a prompt.\n size: 4980736,\n storeName: 'keyvaluepairs',\n version: 1.0\n};\n\nfunction callWhenReady(localForageInstance, libraryMethod) {\n localForageInstance[libraryMethod] = function () {\n var _args = arguments;\n return localForageInstance.ready().then(function () {\n return localForageInstance[libraryMethod].apply(localForageInstance, _args);\n });\n };\n}\n\nfunction extend() {\n for (var i = 1; i < arguments.length; i++) {\n var arg = arguments[i];\n\n if (arg) {\n for (var _key in arg) {\n if (arg.hasOwnProperty(_key)) {\n if (isArray(arg[_key])) {\n arguments[0][_key] = arg[_key].slice();\n } else {\n arguments[0][_key] = arg[_key];\n }\n }\n }\n }\n }\n\n return arguments[0];\n}\n\nvar LocalForage = function () {\n function LocalForage(options) {\n _classCallCheck(this, LocalForage);\n\n for (var driverTypeKey in DefaultDrivers) {\n if (DefaultDrivers.hasOwnProperty(driverTypeKey)) {\n var driver = DefaultDrivers[driverTypeKey];\n var driverName = driver._driver;\n this[driverTypeKey] = driverName;\n\n if (!DefinedDrivers[driverName]) {\n // we don't need to wait for the promise,\n // since the default drivers can be defined\n // in a blocking manner\n this.defineDriver(driver);\n }\n }\n }\n\n this._defaultConfig = extend({}, DefaultConfig);\n this._config = extend({}, this._defaultConfig, options);\n this._driverSet = null;\n this._initDriver = null;\n this._ready = false;\n this._dbInfo = null;\n\n this._wrapLibraryMethodsWithReady();\n this.setDriver(this._config.driver)[\"catch\"](function () {});\n }\n\n // Set any config values for localForage; can be called anytime before\n // the first API call (e.g. `getItem`, `setItem`).\n // We loop through options so we don't overwrite existing config\n // values.\n\n\n LocalForage.prototype.config = function config(options) {\n // If the options argument is an object, we use it to set values.\n // Otherwise, we return either a specified config value or all\n // config values.\n if ((typeof options === 'undefined' ? 'undefined' : _typeof(options)) === 'object') {\n // If localforage is ready and fully initialized, we can't set\n // any new configuration values. Instead, we return an error.\n if (this._ready) {\n return new Error(\"Can't call config() after localforage \" + 'has been used.');\n }\n\n for (var i in options) {\n if (i === 'storeName') {\n options[i] = options[i].replace(/\\W/g, '_');\n }\n\n if (i === 'version' && typeof options[i] !== 'number') {\n return new Error('Database version must be a number.');\n }\n\n this._config[i] = options[i];\n }\n\n // after all config options are set and\n // the driver option is used, try setting it\n if ('driver' in options && options.driver) {\n return this.setDriver(this._config.driver);\n }\n\n return true;\n } else if (typeof options === 'string') {\n return this._config[options];\n } else {\n return this._config;\n }\n };\n\n // Used to define a custom driver, shared across all instances of\n // localForage.\n\n\n LocalForage.prototype.defineDriver = function defineDriver(driverObject, callback, errorCallback) {\n var promise = new Promise$1(function (resolve, reject) {\n try {\n var driverName = driverObject._driver;\n var complianceError = new Error('Custom driver not compliant; see ' + 'https://mozilla.github.io/localForage/#definedriver');\n\n // A driver name should be defined and not overlap with the\n // library-defined, default drivers.\n if (!driverObject._driver) {\n reject(complianceError);\n return;\n }\n\n var driverMethods = LibraryMethods.concat('_initStorage');\n for (var i = 0, len = driverMethods.length; i < len; i++) {\n var driverMethodName = driverMethods[i];\n\n // when the property is there,\n // it should be a method even when optional\n var isRequired = !includes(OptionalDriverMethods, driverMethodName);\n if ((isRequired || driverObject[driverMethodName]) && typeof driverObject[driverMethodName] !== 'function') {\n reject(complianceError);\n return;\n }\n }\n\n var configureMissingMethods = function configureMissingMethods() {\n var methodNotImplementedFactory = function methodNotImplementedFactory(methodName) {\n return function () {\n var error = new Error('Method ' + methodName + ' is not implemented by the current driver');\n var promise = Promise$1.reject(error);\n executeCallback(promise, arguments[arguments.length - 1]);\n return promise;\n };\n };\n\n for (var _i = 0, _len = OptionalDriverMethods.length; _i < _len; _i++) {\n var optionalDriverMethod = OptionalDriverMethods[_i];\n if (!driverObject[optionalDriverMethod]) {\n driverObject[optionalDriverMethod] = methodNotImplementedFactory(optionalDriverMethod);\n }\n }\n };\n\n configureMissingMethods();\n\n var setDriverSupport = function setDriverSupport(support) {\n if (DefinedDrivers[driverName]) {\n console.info('Redefining LocalForage driver: ' + driverName);\n }\n DefinedDrivers[driverName] = driverObject;\n DriverSupport[driverName] = support;\n // don't use a then, so that we can define\n // drivers that have simple _support methods\n // in a blocking manner\n resolve();\n };\n\n if ('_support' in driverObject) {\n if (driverObject._support && typeof driverObject._support === 'function') {\n driverObject._support().then(setDriverSupport, reject);\n } else {\n setDriverSupport(!!driverObject._support);\n }\n } else {\n setDriverSupport(true);\n }\n } catch (e) {\n reject(e);\n }\n });\n\n executeTwoCallbacks(promise, callback, errorCallback);\n return promise;\n };\n\n LocalForage.prototype.driver = function driver() {\n return this._driver || null;\n };\n\n LocalForage.prototype.getDriver = function getDriver(driverName, callback, errorCallback) {\n var getDriverPromise = DefinedDrivers[driverName] ? Promise$1.resolve(DefinedDrivers[driverName]) : Promise$1.reject(new Error('Driver not found.'));\n\n executeTwoCallbacks(getDriverPromise, callback, errorCallback);\n return getDriverPromise;\n };\n\n LocalForage.prototype.getSerializer = function getSerializer(callback) {\n var serializerPromise = Promise$1.resolve(localforageSerializer);\n executeTwoCallbacks(serializerPromise, callback);\n return serializerPromise;\n };\n\n LocalForage.prototype.ready = function ready(callback) {\n var self = this;\n\n var promise = self._driverSet.then(function () {\n if (self._ready === null) {\n self._ready = self._initDriver();\n }\n\n return self._ready;\n });\n\n executeTwoCallbacks(promise, callback, callback);\n return promise;\n };\n\n LocalForage.prototype.setDriver = function setDriver(drivers, callback, errorCallback) {\n var self = this;\n\n if (!isArray(drivers)) {\n drivers = [drivers];\n }\n\n var supportedDrivers = this._getSupportedDrivers(drivers);\n\n function setDriverToConfig() {\n self._config.driver = self.driver();\n }\n\n function extendSelfWithDriver(driver) {\n self._extend(driver);\n setDriverToConfig();\n\n self._ready = self._initStorage(self._config);\n return self._ready;\n }\n\n function initDriver(supportedDrivers) {\n return function () {\n var currentDriverIndex = 0;\n\n function driverPromiseLoop() {\n while (currentDriverIndex < supportedDrivers.length) {\n var driverName = supportedDrivers[currentDriverIndex];\n currentDriverIndex++;\n\n self._dbInfo = null;\n self._ready = null;\n\n return self.getDriver(driverName).then(extendSelfWithDriver)[\"catch\"](driverPromiseLoop);\n }\n\n setDriverToConfig();\n var error = new Error('No available storage method found.');\n self._driverSet = Promise$1.reject(error);\n return self._driverSet;\n }\n\n return driverPromiseLoop();\n };\n }\n\n // There might be a driver initialization in progress\n // so wait for it to finish in order to avoid a possible\n // race condition to set _dbInfo\n var oldDriverSetDone = this._driverSet !== null ? this._driverSet[\"catch\"](function () {\n return Promise$1.resolve();\n }) : Promise$1.resolve();\n\n this._driverSet = oldDriverSetDone.then(function () {\n var driverName = supportedDrivers[0];\n self._dbInfo = null;\n self._ready = null;\n\n return self.getDriver(driverName).then(function (driver) {\n self._driver = driver._driver;\n setDriverToConfig();\n self._wrapLibraryMethodsWithReady();\n self._initDriver = initDriver(supportedDrivers);\n });\n })[\"catch\"](function () {\n setDriverToConfig();\n var error = new Error('No available storage method found.');\n self._driverSet = Promise$1.reject(error);\n return self._driverSet;\n });\n\n executeTwoCallbacks(this._driverSet, callback, errorCallback);\n return this._driverSet;\n };\n\n LocalForage.prototype.supports = function supports(driverName) {\n return !!DriverSupport[driverName];\n };\n\n LocalForage.prototype._extend = function _extend(libraryMethodsAndProperties) {\n extend(this, libraryMethodsAndProperties);\n };\n\n LocalForage.prototype._getSupportedDrivers = function _getSupportedDrivers(drivers) {\n var supportedDrivers = [];\n for (var i = 0, len = drivers.length; i < len; i++) {\n var driverName = drivers[i];\n if (this.supports(driverName)) {\n supportedDrivers.push(driverName);\n }\n }\n return supportedDrivers;\n };\n\n LocalForage.prototype._wrapLibraryMethodsWithReady = function _wrapLibraryMethodsWithReady() {\n // Add a stub for each driver API method that delays the call to the\n // corresponding driver method until localForage is ready. These stubs\n // will be replaced by the driver methods as soon as the driver is\n // loaded, so there is no performance impact.\n for (var i = 0, len = LibraryMethods.length; i < len; i++) {\n callWhenReady(this, LibraryMethods[i]);\n }\n };\n\n LocalForage.prototype.createInstance = function createInstance(options) {\n return new LocalForage(options);\n };\n\n return LocalForage;\n}();\n\n// The actual localForage object that we expose as a module or via a\n// global. It's extended by pulling in one of our other libraries.\n\n\nvar localforage_js = new LocalForage();\n\nmodule.exports = localforage_js;\n\n},{\"3\":3}]},{},[4])(4)\n});\n","// @ts-nocheck\n\nimport localForage from 'localforage';\nimport _ from './lodash';\n\ntype MyEventListener = {\n off: Function\n};\n\n// Localforage returns null if an item is not found, so we represent null with this uuid instead.\n// not foolproof, but good enough for now.\nconst LOCALFORAGE_NULL = \"c2fc1ad0-f76f-11ec-b939-0242ac120002\";\nconst notInLocalForage = new Set();\n\nlocalForage.config({\n driver: [localForage.LOCALSTORAGE, localForage.INDEXEDDB, localForage.WEBSQL]\n})\n\n/**\n Our very own implementation of the Gun API\n */\nexport default class Node {\n id: string;\n parent: Node | null;\n children = new Map();\n on_subscriptions = new Map();\n map_subscriptions = new Map();\n value: any = undefined;\n counter = 0;\n loaded = false;\n\n /** */\n constructor(id: string = '', parent: Node|null = null) {\n this.id = id;\n this.parent = parent;\n }\n\n saveLocalForage = _.throttle(async () => {\n if (!this.loaded) {\n await this.loadLocalForage();\n }\n if (this.children.size) {\n const children = Array.from(this.children.keys());\n localForage.setItem(this.id, children);\n } else if (this.value === undefined) {\n localForage.removeItem(this.id);\n } else {\n localForage.setItem(this.id, this.value === null ? LOCALFORAGE_NULL : this.value);\n }\n }, 500);\n\n loadLocalForage = _.throttle(async () => {\n if (notInLocalForage.has(this.id)) {\n return undefined;\n }\n // try to get the value from localforage\n let result = await localForage.getItem(this.id);\n // getItem returns null if not found\n if (result === null) {\n result = undefined;\n notInLocalForage.add(this.id);\n } else if (result === LOCALFORAGE_NULL) {\n result = null;\n } else if (Array.isArray(result)) {\n // result is a list of children\n const newResult = {};\n await Promise.all(result.map(async key => {\n newResult[key] = await this.get(key).once();\n }));\n result = newResult;\n } else {\n // result is a value\n this.value = result;\n }\n this.loaded = true;\n return result;\n }, 500);\n\n doCallbacks = _.throttle(() => {\n for (const [id, callback] of this.on_subscriptions) {\n const event = { off: () => this.on_subscriptions.delete(id) };\n this.once(callback, event, false);\n }\n if (this.parent) {\n for (const [id, callback] of this.parent.on_subscriptions) {\n const event = { off: () => this.parent.on_subscriptions.delete(id) };\n this.parent.once(callback, event, false);\n }\n for (const [id, callback] of this.parent.map_subscriptions) {\n const event = { off: () => this.parent.map_subscriptions.delete(id) };\n this.once(callback, event, false);\n }\n }\n }, 40);\n\n /**\n *\n * @param key\n * @returns {Node}\n * @example node.get('users').get('alice').put({name: 'Alice'})\n */\n get(key) {\n const existing = this.children.get(key);\n if (existing) {\n return existing;\n }\n const new_node = new Node(`${this.id}/${key}`, this);\n this.children.set(key, new_node);\n this.saveLocalForage();\n return new_node;\n }\n\n /**\n * Set a value to the node. If the value is an object, it will be converted to child nodes.\n * @param value\n * @example node.get('users').get('alice').put({name: 'Alice'})\n */\n put(value) {\n if (Array.isArray(value)) {\n throw new Error('Sorry, we don\\'t deal with arrays');\n }\n if (typeof value === 'object' && value !== null) {\n this.value = undefined;\n for (const key in value) {\n this.get(key).put(value[key]);\n }\n _.defer(() => this.doCallbacks(), 100);\n return;\n }\n this.children = new Map();\n this.value = value;\n this.doCallbacks();\n this.saveLocalForage();\n }\n\n // protip: the code would be a lot cleaner if you separated the Node API from storage adapters.\n /**\n * Return a value without subscribing to it\n * @param callback\n * @param event\n * @param returnIfUndefined\n * @returns {Promise<*>}\n */\n async once(callback?: Function, event?: MyEventListener, returnIfUndefined = true): Promise {\n let result: any;\n if (this.children.size) {\n // return an object containing all children\n result = {};\n await Promise.all(Array.from(this.children.keys()).map(async key => {\n result[key] = await this.get(key).once(undefined, event);\n }));\n } else if (this.value !== undefined) {\n result = this.value;\n } else {\n result = await this.loadLocalForage();\n }\n if (result !== undefined || returnIfUndefined) {\n callback && callback(result, this.id.slice(this.id.lastIndexOf('/') + 1), null, event);\n return result;\n }\n }\n\n /**\n * Subscribe to a value\n * @param callback\n */\n on(callback: Function): void {\n const id = this.counter++;\n this.on_subscriptions.set(id, callback);\n const event = { off: () => this.on_subscriptions.delete(id) };\n this.once(callback, event, false);\n }\n\n /**\n * Subscribe to the children of a node. Callback is called separately for each child.\n * @param callback\n * @returns {Promise}\n */\n async map(callback: Function) {\n const id = this.counter++;\n this.map_subscriptions.set(id, callback);\n const event = { off: () => this.map_subscriptions.delete(id) };\n if (!this.loaded) {\n // ensure that the list of children is loaded\n await this.loadLocalForage();\n }\n for (const child of this.children.values()) {\n child.once(callback, event, false);\n }\n }\n}","import Node from './Node';\n\nlet local: Node;\n\n/**\n * Get a state that is only synced in memory and local storage.\n *\n * Useful for storing things like UI state, local indexes or logged in user.\n * @returns {Node}\n */\nexport default function() {\n if (!local) {\n local = new Node();\n }\n return local;\n}","import local from './local';\n\nlet blockedUsers: { [key: string]: boolean } = {};\n\nexport default function() {\n if (!blockedUsers) {\n blockedUsers = {};\n local().get('block').map((isBlocked: boolean, user: string) => {\n if (isBlocked === blockedUsers[user]) { return; }\n if (isBlocked) {\n blockedUsers[user] = isBlocked;\n local().get('groups').map((_v: any, k: string) => {\n local().get('groups').get(k).get(user).put(false);\n });\n } else {\n delete blockedUsers[user];\n }\n });\n }\n return blockedUsers;\n}","import local from \"./local\";\nimport userSpace from './public';\nimport blockedUsers from './blockedUsers';\n\nlet counter = 0;\nconst cache = new Map>();\nconst callbacks = new Map();\n\ntype Event = {\n off: () => void;\n}\n\n/**\n * Aggregates public data from all users in the group.\n *\n * For example, the public message feed, message replies and likes are aggregated using this.\n * @param groupName\n * @returns object\n */\nexport default function(groupName = 'everyone') {\n return {\n get(path: string, callback: any) {\n const groupNode = local().get('groups').get(groupName);\n const follows: { [key: string]: boolean; } = {};\n requestAnimationFrame(() => {\n groupNode.map((isFollowing: any, user: string) => {\n if (blockedUsers()[user]) { return; } // TODO: allow to specifically query blocked users?\n if (follows[user] && follows[user] === isFollowing) { return; }\n follows[user] = isFollowing;\n if (isFollowing) { // TODO: callback on unfollow, for unsubscribe\n let node = userSpace(user);\n if (path && path !== '/') {\n node = path.split('/').reduce((sum:any, s:string) => sum.get(decodeURIComponent(s)), node);\n }\n callback(node, user);\n }\n });\n });\n },\n\n _cached_map(cached: Map | undefined, cacheKey: string, path: string, myEvent: Event, callback: Function) {\n if (!cached) {\n const cached = new Map();\n cache.set(cacheKey, cached);\n this.get(path, (node: any, from: string) => node.map((value: any, key: string, x: any) => {\n const item = {value, key, from};\n cached.set(key, item);\n for (let cb of callbacks.get(cacheKey).values()) {\n cb(value, key, x, myEvent, from);\n }\n }));\n } else {\n for (let item of cached.values()) {\n callback(item.value, item.key, 0, myEvent, item.from);\n }\n }\n },\n\n // TODO: this should probably store just the most recent value, not everyone's value\n // TODO: for counting of likes etc, use this.count() instead\n _cached_on(cached: Map | undefined, cacheKey: string, path: string, myEvent: Event, callback: Function) {\n if (!cached) {\n const cached = new Map();\n cache.set(cacheKey, cached);\n this.get(path, (node: any, from: string) => node.on((value: any, key: string, x: any) => {\n const item = {value, key, from};\n cached.set(from, item);\n for (let cb of callbacks.get(cacheKey).values()) {\n cb(value, key, x, myEvent, from);\n }\n }));\n } else {\n for (let item of cached.values()) {\n callback(item.value, item.key, 0, myEvent, item.from);\n }\n }\n },\n\n _cached_count(cached: Map | undefined, cacheKey: string, path: string, myEvent: Event, callback: Function) {\n if (!cached) {\n const cached = new Map();\n cache.set(cacheKey, cached);\n this.get(path, (node: any, from: string) => node.on((value: any, key: string) => {\n value ? cached.set(from, true) : cached.delete(from);\n const count = cached.size;\n for (let cb of callbacks.get(cacheKey).values()) {\n cb(count, key, null, myEvent, from);\n }\n }));\n } else {\n callback(cached.size, path.split('/').pop(), null, myEvent);\n }\n },\n\n _cached_fn(fn: string, path: string, callback: Function) {\n const cacheKey = `${fn}:${groupName}:${path}`;\n\n let callbackId = counter++;\n if (callbacks.has(cacheKey)) {\n callbacks.get(cacheKey).set(callbackId, callback);\n } else {\n callbacks.set(cacheKey, new Map([[callbackId, callback]]));\n }\n\n const myEvent = {off: () => {\n let myCallbacks = callbacks.get(cacheKey);\n myCallbacks && myCallbacks.delete(callbackId);\n }};\n\n const cached = cache.get(cacheKey);\n\n switch (fn) {\n case 'map':\n this._cached_map(cached, cacheKey, path, myEvent, callback);\n break;\n case 'on':\n this._cached_on(cached, cacheKey, path, myEvent, callback);\n break;\n case 'count':\n this._cached_count(cached, cacheKey, path, myEvent, callback);\n break;\n }\n },\n\n map(path: string, callback: Function) { // group queries are slow, so we cache them\n this._cached_fn('map', path, callback);\n },\n\n on(path: string, callback: Function) {\n this._cached_fn('on', path, callback);\n },\n\n count(path: string, callback: Function) {\n this._cached_fn('count', path, callback);\n }\n }\n}","// @ts-nocheck\n\nimport _ from './lodash';\nimport Gun from 'gun';\n\nimport session from './session';\nimport util from './util';\nimport publicState from './global';\nimport privateState from './private';\nimport local from './local';\nimport group from './group';\n\nconst NOTIFICATION_SERVICE_URL = 'https://iris-notifications.herokuapp.com/notify';\n// const notificationSound = new Audio('../../assets/audio/notification.mp3'); // TODO\nlet loginTime;\nlet unseenMsgsTotal = 0;\nlet unseenNotificationCount = 0;\nconst webPushSubscriptions = {};\n\nfunction desktopNotificationsEnabled() {\n return window.Notification && Notification.permission === 'granted';\n}\n\nfunction notifyMsg(msg, info, channelId, onClick) {\n function shouldNotify() {\n if (msg.timeObj < loginTime) { return false; }\n if (info.selfAuthored) { return false; }\n if (document.visibilityState === 'visible') { return false; }\n const channel = privateState(channelId);\n if (channel.notificationSetting === 'nothing') { return false; }\n if (channel.notificationSetting === 'mentions' && !msg.text.includes(session.getMyName())) { return false; }\n return true;\n }\n function shouldDesktopNotify() {\n if (!desktopNotificationsEnabled()) { return false; }\n return shouldNotify();\n }\n function shouldAudioNotify() {\n return shouldNotify();\n }\n if (shouldAudioNotify()) {\n //notificationSound.play(); // TODO\n }\n if (shouldDesktopNotify()) {\n let body, title;\n const channel = privateState(channelId);\n if (channel.uuid) {\n title = channel.participantProfiles[info.from].name;\n body = `${name}: ${msg.text}`;\n } else {\n title = 'Message'\n body = msg.text;\n }\n body = util.truncateString(body, 50);\n let desktopNotification = new Notification(title, { // TODO: replace with actual name\n icon: '/assets/img/icon128.png',\n body,\n silent: true\n });\n desktopNotification.onclick = function() {\n changeUnseenNotificationCount(-1);\n onClick && onClick();\n window.focus();\n };\n }\n}\n\nfunction changeChatUnseenMsgsCount(chatId, change) {\n const chat = privateState(chatId);\n if (!chat) return;\n const chatNode = local().get('channels').get(chatId);\n if (change) {\n unseenMsgsTotal += change;\n chat.unseen += change;\n } else {\n unseenMsgsTotal = unseenMsgsTotal - (chat.unseen || 0);\n chat.unseen = 0;\n }\n chatNode.get('unseen').put(chat.unseen);\n unseenMsgsTotal = unseenMsgsTotal >= 0 ? unseenMsgsTotal : 0;\n local().get('unseenMsgsTotal').put(unseenMsgsTotal);\n}\n\nconst publicVapidKey = 'BMqSvZArOIdn7vGkYplSpkZ70-Qt8nhYbey26WVa3LF3SwzblSzm3n3HHycpNkAKVq7MCkrzFuTFs_en7Y_J2MI';\n\nfunction urlBase64ToUint8Array(base64String) {\n const padding = '='.repeat((4 - base64String.length % 4) % 4);\n const base64 = (base64String + padding)\n .replace(/-/g, '+')\n .replace(/_/g, '/');\n\n const rawData = window.atob(base64);\n const outputArray = new Uint8Array(rawData.length);\n\n for (let i = 0; i < rawData.length; ++i) {\n outputArray[i] = rawData.charCodeAt(i);\n }\n return outputArray;\n}\n\nasync function subscribe(reg) {\n try {\n const subscription = await reg.pushManager.subscribe({\n userVisibleOnly: true,\n applicationServerKey: urlBase64ToUint8Array(publicVapidKey)\n });\n addWebPushSubscription(subscription);\n } catch (e) {\n console.error('web push subscription error', e);\n }\n}\n\nasync function subscribeToWebPush() {\n console.log('subscribing to web push', navigator.serviceWorker);\n if (!desktopNotificationsEnabled() || !navigator.serviceWorker) { return false; }\n await navigator.serviceWorker.ready;\n const reg = await navigator.serviceWorker.getRegistration();\n reg.active.postMessage({key: session.getKey()});\n const sub = await reg.pushManager.getSubscription();\n sub ? addWebPushSubscription(sub) : subscribe(reg);\n}\n\nconst addWebPushSubscriptionsToChats = _.debounce(() => {\n const arr = Object.values(webPushSubscriptions);\n session.channelIds.forEach(channelId => {\n privateState(channelId).put('webPushSubscriptions', arr);\n });\n}, 5000);\n\nfunction removeSubscription(hash) {\n delete webPushSubscriptions[hash];\n publicState().user().get('webPushSubscriptions').get(hash).put(null);\n addWebPushSubscriptionsToChats();\n}\n\nasync function addWebPushSubscription(s, saveToGun = true) {\n const myKey = session.getKey();\n const mySecret = await Gun.SEA.secret(myKey.epub, myKey);\n const enc = await Gun.SEA.encrypt(s, mySecret);\n const hash = await util.getHash(JSON.stringify(s));\n if (saveToGun) {\n publicState().user().get('webPushSubscriptions').get(hash).put(enc);\n }\n webPushSubscriptions[hash] = s;\n addWebPushSubscriptionsToChats();\n}\n\nasync function getWebPushSubscriptions() {\n const myKey = session.getKey();\n const mySecret = await Gun.SEA.secret(myKey.epub, myKey);\n publicState().user().get('webPushSubscriptions').map().on(async enc => {\n if (!enc) { return; }\n const s = await Gun.SEA.decrypt(enc, mySecret);\n addWebPushSubscription(s, false);\n });\n}\n\nfunction getEpub(user) {\n return new Promise(resolve => {\n publicState().user(user).get('epub').on(async (epub,k,x,e) => {\n if (epub) {\n e.off();\n resolve(epub);\n }\n });\n });\n}\n\nasync function getNotificationText(notification) {\n const profile = await publicState().user(notification.from).get('profile').once();\n const name = (profile && profile.name) || 'someone';\n const event = notification.event || notification.action;\n let eventText;\n if (event === 'like') eventText = `${name} liked your post`;\n else if (event === 'reply') eventText = `${name} replied to your post`;\n else if (event === 'mention') eventText = `${name} mentioned you in their post`;\n else if (event === 'follow') eventText = `${name} started following you`;\n else eventText = `${name} sent you a notification: ${event}`;\n return eventText;\n}\n\nfunction subscribeToIrisNotifications(onClick?: Function) {\n let notificationsSeenTime: any;\n let notificationsShownTime: any;\n publicState().user().get('notificationsSeenTime').on(v => {\n notificationsSeenTime = v;\n console.log(v);\n });\n publicState().user().get('notificationsShownTime').on(v => notificationsShownTime = v);\n const setNotificationsShownTime = _.debounce(() => {\n publicState().user().get('notificationsShownTime').put(new Date().toISOString());\n }, 1000);\n const alreadyHave = new Set();\n group().on(`notifications/${session.getPubKey()}`, async (encryptedNotification, k, x, e, from) => {\n const id = from.slice(0,30) + encryptedNotification.slice(0,30);\n if (alreadyHave.has(id)) { return; }\n alreadyHave.add(id);\n const epub = await getEpub(from);\n const secret = await Gun.SEA.secret(epub, session.getKey());\n const notification = await Gun.SEA.decrypt(encryptedNotification, secret);\n if (!notification || typeof notification !== 'object') { return; }\n setNotificationsShownTime();\n notification.from = from;\n local().get('notifications').get(notification.time).put(notification);\n if (!notificationsSeenTime || (notificationsSeenTime < notification.time)) {\n changeUnseenNotificationCount(1);\n }\n if (!notificationsShownTime || notificationsShownTime < notification.time) {\n console.log('was new!');\n const text = await getNotificationText(notification);\n let desktopNotification = new Notification(text, {\n icon: '/assets/img/icon128.png',\n body: text,\n silent: true\n });\n desktopNotification.onclick = function() {\n const link = notification.target ? `/post/${notification.target}` : `/profile/${notification.from}`;\n onClick && onClick(link);\n changeUnseenNotificationCount(-1);\n window.focus();\n };\n }\n });\n}\n\nfunction changeUnseenNotificationCount(change) {\n if (!change) {\n unseenNotificationCount = 0;\n publicState().user().get('notificationsSeenTime').put(new Date().toISOString());\n } else {\n unseenNotificationCount += change;\n unseenNotificationCount = Math.max(unseenNotificationCount, 0);\n }\n local().get('unseenNotificationCount').put(unseenNotificationCount);\n}\n\nasync function sendIrisNotification(recipient, notification) {\n if (!(recipient && notification)) { return; } // TODO: use typescript or sth :D\n if (typeof notification === 'object') { notification.time = new Date().toISOString() }\n const epub = await getEpub(recipient);\n const secret = await Gun.SEA.secret(epub, session.getKey());\n const enc = await Gun.SEA.encrypt(notification, secret);\n publicState().user().get('notifications').get(recipient).put(enc);\n}\n\nasync function sendWebPushNotification(recipient, notification) {\n console.log('sending web push notification to', recipient, notification);\n const channel = privateState(recipient);\n const myKey = session.getKey();\n const shouldWebPush = (recipient === myKey.pub) || !(channel.activity && channel.activity.isActive);\n if (shouldWebPush && channel.webPushSubscriptions) {\n const subscriptions = [];\n const participants = Object.keys(channel.webPushSubscriptions);\n for (let i = 0; i < participants.length; i++) {\n const participant = participants[i];\n const secret = await channel.getSecret(participant);\n const payload = {\n title: await Gun.SEA.encrypt(notification.title, secret),\n body: await Gun.SEA.encrypt(notification.body, secret),\n from:{pub: myKey.pub, epub: myKey.epub}\n };\n channel.webPushSubscriptions[participant].forEach(s => {\n if (s && s.endpoint) {\n subscriptions.push({subscription: s, payload});\n }\n });\n }\n if (subscriptions.length === 0) {return;}\n fetch(NOTIFICATION_SERVICE_URL, {\n method: 'POST',\n body: JSON.stringify({subscriptions}),\n headers: {\n 'content-type': 'application/json'\n }\n }).catch(() => {});\n }\n}\n\nfunction init() {\n loginTime = new Date();\n unseenMsgsTotal = 0;\n}\n\nexport default {init, notifyMsg, getNotificationText, sendWebPushNotification, changeUnseenNotificationCount, subscribeToIrisNotifications, sendIrisNotification, changeChatUnseenCount: changeChatUnseenMsgsCount, webPushSubscriptions, subscribeToWebPush, getWebPushSubscriptions, removeSubscription};\n","/**\n * Fuse.js v6.6.2 - Lightweight fuzzy-search (http://fusejs.io)\n *\n * Copyright (c) 2022 Kiro Risk (http://kiro.me)\n * All Rights Reserved. Apache Software License 2.0\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nfunction isArray(value) {\n return !Array.isArray\n ? getTag(value) === '[object Array]'\n : Array.isArray(value)\n}\n\n// Adapted from: https://github.com/lodash/lodash/blob/master/.internal/baseToString.js\nconst INFINITY = 1 / 0;\nfunction baseToString(value) {\n // Exit early for strings to avoid a performance hit in some environments.\n if (typeof value == 'string') {\n return value\n }\n let result = value + '';\n return result == '0' && 1 / value == -INFINITY ? '-0' : result\n}\n\nfunction toString(value) {\n return value == null ? '' : baseToString(value)\n}\n\nfunction isString(value) {\n return typeof value === 'string'\n}\n\nfunction isNumber(value) {\n return typeof value === 'number'\n}\n\n// Adapted from: https://github.com/lodash/lodash/blob/master/isBoolean.js\nfunction isBoolean(value) {\n return (\n value === true ||\n value === false ||\n (isObjectLike(value) && getTag(value) == '[object Boolean]')\n )\n}\n\nfunction isObject(value) {\n return typeof value === 'object'\n}\n\n// Checks if `value` is object-like.\nfunction isObjectLike(value) {\n return isObject(value) && value !== null\n}\n\nfunction isDefined(value) {\n return value !== undefined && value !== null\n}\n\nfunction isBlank(value) {\n return !value.trim().length\n}\n\n// Gets the `toStringTag` of `value`.\n// Adapted from: https://github.com/lodash/lodash/blob/master/.internal/getTag.js\nfunction getTag(value) {\n return value == null\n ? value === undefined\n ? '[object Undefined]'\n : '[object Null]'\n : Object.prototype.toString.call(value)\n}\n\nconst EXTENDED_SEARCH_UNAVAILABLE = 'Extended search is not available';\n\nconst INCORRECT_INDEX_TYPE = \"Incorrect 'index' type\";\n\nconst LOGICAL_SEARCH_INVALID_QUERY_FOR_KEY = (key) =>\n `Invalid value for key ${key}`;\n\nconst PATTERN_LENGTH_TOO_LARGE = (max) =>\n `Pattern length exceeds max of ${max}.`;\n\nconst MISSING_KEY_PROPERTY = (name) => `Missing ${name} property in key`;\n\nconst INVALID_KEY_WEIGHT_VALUE = (key) =>\n `Property 'weight' in key '${key}' must be a positive integer`;\n\nconst hasOwn = Object.prototype.hasOwnProperty;\n\nclass KeyStore {\n constructor(keys) {\n this._keys = [];\n this._keyMap = {};\n\n let totalWeight = 0;\n\n keys.forEach((key) => {\n let obj = createKey(key);\n\n totalWeight += obj.weight;\n\n this._keys.push(obj);\n this._keyMap[obj.id] = obj;\n\n totalWeight += obj.weight;\n });\n\n // Normalize weights so that their sum is equal to 1\n this._keys.forEach((key) => {\n key.weight /= totalWeight;\n });\n }\n get(keyId) {\n return this._keyMap[keyId]\n }\n keys() {\n return this._keys\n }\n toJSON() {\n return JSON.stringify(this._keys)\n }\n}\n\nfunction createKey(key) {\n let path = null;\n let id = null;\n let src = null;\n let weight = 1;\n let getFn = null;\n\n if (isString(key) || isArray(key)) {\n src = key;\n path = createKeyPath(key);\n id = createKeyId(key);\n } else {\n if (!hasOwn.call(key, 'name')) {\n throw new Error(MISSING_KEY_PROPERTY('name'))\n }\n\n const name = key.name;\n src = name;\n\n if (hasOwn.call(key, 'weight')) {\n weight = key.weight;\n\n if (weight <= 0) {\n throw new Error(INVALID_KEY_WEIGHT_VALUE(name))\n }\n }\n\n path = createKeyPath(name);\n id = createKeyId(name);\n getFn = key.getFn;\n }\n\n return { path, id, weight, src, getFn }\n}\n\nfunction createKeyPath(key) {\n return isArray(key) ? key : key.split('.')\n}\n\nfunction createKeyId(key) {\n return isArray(key) ? key.join('.') : key\n}\n\nfunction get(obj, path) {\n let list = [];\n let arr = false;\n\n const deepGet = (obj, path, index) => {\n if (!isDefined(obj)) {\n return\n }\n if (!path[index]) {\n // If there's no path left, we've arrived at the object we care about.\n list.push(obj);\n } else {\n let key = path[index];\n\n const value = obj[key];\n\n if (!isDefined(value)) {\n return\n }\n\n // If we're at the last value in the path, and if it's a string/number/bool,\n // add it to the list\n if (\n index === path.length - 1 &&\n (isString(value) || isNumber(value) || isBoolean(value))\n ) {\n list.push(toString(value));\n } else if (isArray(value)) {\n arr = true;\n // Search each item in the array.\n for (let i = 0, len = value.length; i < len; i += 1) {\n deepGet(value[i], path, index + 1);\n }\n } else if (path.length) {\n // An object. Recurse further.\n deepGet(value, path, index + 1);\n }\n }\n };\n\n // Backwards compatibility (since path used to be a string)\n deepGet(obj, isString(path) ? path.split('.') : path, 0);\n\n return arr ? list : list[0]\n}\n\nconst MatchOptions = {\n // Whether the matches should be included in the result set. When `true`, each record in the result\n // set will include the indices of the matched characters.\n // These can consequently be used for highlighting purposes.\n includeMatches: false,\n // When `true`, the matching function will continue to the end of a search pattern even if\n // a perfect match has already been located in the string.\n findAllMatches: false,\n // Minimum number of characters that must be matched before a result is considered a match\n minMatchCharLength: 1\n};\n\nconst BasicOptions = {\n // When `true`, the algorithm continues searching to the end of the input even if a perfect\n // match is found before the end of the same input.\n isCaseSensitive: false,\n // When true, the matching function will continue to the end of a search pattern even if\n includeScore: false,\n // List of properties that will be searched. This also supports nested properties.\n keys: [],\n // Whether to sort the result list, by score\n shouldSort: true,\n // Default sort function: sort by ascending score, ascending index\n sortFn: (a, b) =>\n a.score === b.score ? (a.idx < b.idx ? -1 : 1) : a.score < b.score ? -1 : 1\n};\n\nconst FuzzyOptions = {\n // Approximately where in the text is the pattern expected to be found?\n location: 0,\n // At what point does the match algorithm give up. A threshold of '0.0' requires a perfect match\n // (of both letters and location), a threshold of '1.0' would match anything.\n threshold: 0.6,\n // Determines how close the match must be to the fuzzy location (specified above).\n // An exact letter match which is 'distance' characters away from the fuzzy location\n // would score as a complete mismatch. A distance of '0' requires the match be at\n // the exact location specified, a threshold of '1000' would require a perfect match\n // to be within 800 characters of the fuzzy location to be found using a 0.8 threshold.\n distance: 100\n};\n\nconst AdvancedOptions = {\n // When `true`, it enables the use of unix-like search commands\n useExtendedSearch: false,\n // The get function to use when fetching an object's properties.\n // The default will search nested paths *ie foo.bar.baz*\n getFn: get,\n // When `true`, search will ignore `location` and `distance`, so it won't matter\n // where in the string the pattern appears.\n // More info: https://fusejs.io/concepts/scoring-theory.html#fuzziness-score\n ignoreLocation: false,\n // When `true`, the calculation for the relevance score (used for sorting) will\n // ignore the field-length norm.\n // More info: https://fusejs.io/concepts/scoring-theory.html#field-length-norm\n ignoreFieldNorm: false,\n // The weight to determine how much field length norm effects scoring.\n fieldNormWeight: 1\n};\n\nvar Config = {\n ...BasicOptions,\n ...MatchOptions,\n ...FuzzyOptions,\n ...AdvancedOptions\n};\n\nconst SPACE = /[^ ]+/g;\n\n// Field-length norm: the shorter the field, the higher the weight.\n// Set to 3 decimals to reduce index size.\nfunction norm(weight = 1, mantissa = 3) {\n const cache = new Map();\n const m = Math.pow(10, mantissa);\n\n return {\n get(value) {\n const numTokens = value.match(SPACE).length;\n\n if (cache.has(numTokens)) {\n return cache.get(numTokens)\n }\n\n // Default function is 1/sqrt(x), weight makes that variable\n const norm = 1 / Math.pow(numTokens, 0.5 * weight);\n\n // In place of `toFixed(mantissa)`, for faster computation\n const n = parseFloat(Math.round(norm * m) / m);\n\n cache.set(numTokens, n);\n\n return n\n },\n clear() {\n cache.clear();\n }\n }\n}\n\nclass FuseIndex {\n constructor({\n getFn = Config.getFn,\n fieldNormWeight = Config.fieldNormWeight\n } = {}) {\n this.norm = norm(fieldNormWeight, 3);\n this.getFn = getFn;\n this.isCreated = false;\n\n this.setIndexRecords();\n }\n setSources(docs = []) {\n this.docs = docs;\n }\n setIndexRecords(records = []) {\n this.records = records;\n }\n setKeys(keys = []) {\n this.keys = keys;\n this._keysMap = {};\n keys.forEach((key, idx) => {\n this._keysMap[key.id] = idx;\n });\n }\n create() {\n if (this.isCreated || !this.docs.length) {\n return\n }\n\n this.isCreated = true;\n\n // List is Array\n if (isString(this.docs[0])) {\n this.docs.forEach((doc, docIndex) => {\n this._addString(doc, docIndex);\n });\n } else {\n // List is Array\n this.docs.forEach((doc, docIndex) => {\n this._addObject(doc, docIndex);\n });\n }\n\n this.norm.clear();\n }\n // Adds a doc to the end of the index\n add(doc) {\n const idx = this.size();\n\n if (isString(doc)) {\n this._addString(doc, idx);\n } else {\n this._addObject(doc, idx);\n }\n }\n // Removes the doc at the specified index of the index\n removeAt(idx) {\n this.records.splice(idx, 1);\n\n // Change ref index of every subsquent doc\n for (let i = idx, len = this.size(); i < len; i += 1) {\n this.records[i].i -= 1;\n }\n }\n getValueForItemAtKeyId(item, keyId) {\n return item[this._keysMap[keyId]]\n }\n size() {\n return this.records.length\n }\n _addString(doc, docIndex) {\n if (!isDefined(doc) || isBlank(doc)) {\n return\n }\n\n let record = {\n v: doc,\n i: docIndex,\n n: this.norm.get(doc)\n };\n\n this.records.push(record);\n }\n _addObject(doc, docIndex) {\n let record = { i: docIndex, $: {} };\n\n // Iterate over every key (i.e, path), and fetch the value at that key\n this.keys.forEach((key, keyIndex) => {\n let value = key.getFn ? key.getFn(doc) : this.getFn(doc, key.path);\n\n if (!isDefined(value)) {\n return\n }\n\n if (isArray(value)) {\n let subRecords = [];\n const stack = [{ nestedArrIndex: -1, value }];\n\n while (stack.length) {\n const { nestedArrIndex, value } = stack.pop();\n\n if (!isDefined(value)) {\n continue\n }\n\n if (isString(value) && !isBlank(value)) {\n let subRecord = {\n v: value,\n i: nestedArrIndex,\n n: this.norm.get(value)\n };\n\n subRecords.push(subRecord);\n } else if (isArray(value)) {\n value.forEach((item, k) => {\n stack.push({\n nestedArrIndex: k,\n value: item\n });\n });\n } else ;\n }\n record.$[keyIndex] = subRecords;\n } else if (isString(value) && !isBlank(value)) {\n let subRecord = {\n v: value,\n n: this.norm.get(value)\n };\n\n record.$[keyIndex] = subRecord;\n }\n });\n\n this.records.push(record);\n }\n toJSON() {\n return {\n keys: this.keys,\n records: this.records\n }\n }\n}\n\nfunction createIndex(\n keys,\n docs,\n { getFn = Config.getFn, fieldNormWeight = Config.fieldNormWeight } = {}\n) {\n const myIndex = new FuseIndex({ getFn, fieldNormWeight });\n myIndex.setKeys(keys.map(createKey));\n myIndex.setSources(docs);\n myIndex.create();\n return myIndex\n}\n\nfunction parseIndex(\n data,\n { getFn = Config.getFn, fieldNormWeight = Config.fieldNormWeight } = {}\n) {\n const { keys, records } = data;\n const myIndex = new FuseIndex({ getFn, fieldNormWeight });\n myIndex.setKeys(keys);\n myIndex.setIndexRecords(records);\n return myIndex\n}\n\nfunction computeScore$1(\n pattern,\n {\n errors = 0,\n currentLocation = 0,\n expectedLocation = 0,\n distance = Config.distance,\n ignoreLocation = Config.ignoreLocation\n } = {}\n) {\n const accuracy = errors / pattern.length;\n\n if (ignoreLocation) {\n return accuracy\n }\n\n const proximity = Math.abs(expectedLocation - currentLocation);\n\n if (!distance) {\n // Dodge divide by zero error.\n return proximity ? 1.0 : accuracy\n }\n\n return accuracy + proximity / distance\n}\n\nfunction convertMaskToIndices(\n matchmask = [],\n minMatchCharLength = Config.minMatchCharLength\n) {\n let indices = [];\n let start = -1;\n let end = -1;\n let i = 0;\n\n for (let len = matchmask.length; i < len; i += 1) {\n let match = matchmask[i];\n if (match && start === -1) {\n start = i;\n } else if (!match && start !== -1) {\n end = i - 1;\n if (end - start + 1 >= minMatchCharLength) {\n indices.push([start, end]);\n }\n start = -1;\n }\n }\n\n // (i-1 - start) + 1 => i - start\n if (matchmask[i - 1] && i - start >= minMatchCharLength) {\n indices.push([start, i - 1]);\n }\n\n return indices\n}\n\n// Machine word size\nconst MAX_BITS = 32;\n\nfunction search(\n text,\n pattern,\n patternAlphabet,\n {\n location = Config.location,\n distance = Config.distance,\n threshold = Config.threshold,\n findAllMatches = Config.findAllMatches,\n minMatchCharLength = Config.minMatchCharLength,\n includeMatches = Config.includeMatches,\n ignoreLocation = Config.ignoreLocation\n } = {}\n) {\n if (pattern.length > MAX_BITS) {\n throw new Error(PATTERN_LENGTH_TOO_LARGE(MAX_BITS))\n }\n\n const patternLen = pattern.length;\n // Set starting location at beginning text and initialize the alphabet.\n const textLen = text.length;\n // Handle the case when location > text.length\n const expectedLocation = Math.max(0, Math.min(location, textLen));\n // Highest score beyond which we give up.\n let currentThreshold = threshold;\n // Is there a nearby exact match? (speedup)\n let bestLocation = expectedLocation;\n\n // Performance: only computer matches when the minMatchCharLength > 1\n // OR if `includeMatches` is true.\n const computeMatches = minMatchCharLength > 1 || includeMatches;\n // A mask of the matches, used for building the indices\n const matchMask = computeMatches ? Array(textLen) : [];\n\n let index;\n\n // Get all exact matches, here for speed up\n while ((index = text.indexOf(pattern, bestLocation)) > -1) {\n let score = computeScore$1(pattern, {\n currentLocation: index,\n expectedLocation,\n distance,\n ignoreLocation\n });\n\n currentThreshold = Math.min(score, currentThreshold);\n bestLocation = index + patternLen;\n\n if (computeMatches) {\n let i = 0;\n while (i < patternLen) {\n matchMask[index + i] = 1;\n i += 1;\n }\n }\n }\n\n // Reset the best location\n bestLocation = -1;\n\n let lastBitArr = [];\n let finalScore = 1;\n let binMax = patternLen + textLen;\n\n const mask = 1 << (patternLen - 1);\n\n for (let i = 0; i < patternLen; i += 1) {\n // Scan for the best match; each iteration allows for one more error.\n // Run a binary search to determine how far from the match location we can stray\n // at this error level.\n let binMin = 0;\n let binMid = binMax;\n\n while (binMin < binMid) {\n const score = computeScore$1(pattern, {\n errors: i,\n currentLocation: expectedLocation + binMid,\n expectedLocation,\n distance,\n ignoreLocation\n });\n\n if (score <= currentThreshold) {\n binMin = binMid;\n } else {\n binMax = binMid;\n }\n\n binMid = Math.floor((binMax - binMin) / 2 + binMin);\n }\n\n // Use the result from this iteration as the maximum for the next.\n binMax = binMid;\n\n let start = Math.max(1, expectedLocation - binMid + 1);\n let finish = findAllMatches\n ? textLen\n : Math.min(expectedLocation + binMid, textLen) + patternLen;\n\n // Initialize the bit array\n let bitArr = Array(finish + 2);\n\n bitArr[finish + 1] = (1 << i) - 1;\n\n for (let j = finish; j >= start; j -= 1) {\n let currentLocation = j - 1;\n let charMatch = patternAlphabet[text.charAt(currentLocation)];\n\n if (computeMatches) {\n // Speed up: quick bool to int conversion (i.e, `charMatch ? 1 : 0`)\n matchMask[currentLocation] = +!!charMatch;\n }\n\n // First pass: exact match\n bitArr[j] = ((bitArr[j + 1] << 1) | 1) & charMatch;\n\n // Subsequent passes: fuzzy match\n if (i) {\n bitArr[j] |=\n ((lastBitArr[j + 1] | lastBitArr[j]) << 1) | 1 | lastBitArr[j + 1];\n }\n\n if (bitArr[j] & mask) {\n finalScore = computeScore$1(pattern, {\n errors: i,\n currentLocation,\n expectedLocation,\n distance,\n ignoreLocation\n });\n\n // This match will almost certainly be better than any existing match.\n // But check anyway.\n if (finalScore <= currentThreshold) {\n // Indeed it is\n currentThreshold = finalScore;\n bestLocation = currentLocation;\n\n // Already passed `loc`, downhill from here on in.\n if (bestLocation <= expectedLocation) {\n break\n }\n\n // When passing `bestLocation`, don't exceed our current distance from `expectedLocation`.\n start = Math.max(1, 2 * expectedLocation - bestLocation);\n }\n }\n }\n\n // No hope for a (better) match at greater error levels.\n const score = computeScore$1(pattern, {\n errors: i + 1,\n currentLocation: expectedLocation,\n expectedLocation,\n distance,\n ignoreLocation\n });\n\n if (score > currentThreshold) {\n break\n }\n\n lastBitArr = bitArr;\n }\n\n const result = {\n isMatch: bestLocation >= 0,\n // Count exact matches (those with a score of 0) to be \"almost\" exact\n score: Math.max(0.001, finalScore)\n };\n\n if (computeMatches) {\n const indices = convertMaskToIndices(matchMask, minMatchCharLength);\n if (!indices.length) {\n result.isMatch = false;\n } else if (includeMatches) {\n result.indices = indices;\n }\n }\n\n return result\n}\n\nfunction createPatternAlphabet(pattern) {\n let mask = {};\n\n for (let i = 0, len = pattern.length; i < len; i += 1) {\n const char = pattern.charAt(i);\n mask[char] = (mask[char] || 0) | (1 << (len - i - 1));\n }\n\n return mask\n}\n\nclass BitapSearch {\n constructor(\n pattern,\n {\n location = Config.location,\n threshold = Config.threshold,\n distance = Config.distance,\n includeMatches = Config.includeMatches,\n findAllMatches = Config.findAllMatches,\n minMatchCharLength = Config.minMatchCharLength,\n isCaseSensitive = Config.isCaseSensitive,\n ignoreLocation = Config.ignoreLocation\n } = {}\n ) {\n this.options = {\n location,\n threshold,\n distance,\n includeMatches,\n findAllMatches,\n minMatchCharLength,\n isCaseSensitive,\n ignoreLocation\n };\n\n this.pattern = isCaseSensitive ? pattern : pattern.toLowerCase();\n\n this.chunks = [];\n\n if (!this.pattern.length) {\n return\n }\n\n const addChunk = (pattern, startIndex) => {\n this.chunks.push({\n pattern,\n alphabet: createPatternAlphabet(pattern),\n startIndex\n });\n };\n\n const len = this.pattern.length;\n\n if (len > MAX_BITS) {\n let i = 0;\n const remainder = len % MAX_BITS;\n const end = len - remainder;\n\n while (i < end) {\n addChunk(this.pattern.substr(i, MAX_BITS), i);\n i += MAX_BITS;\n }\n\n if (remainder) {\n const startIndex = len - MAX_BITS;\n addChunk(this.pattern.substr(startIndex), startIndex);\n }\n } else {\n addChunk(this.pattern, 0);\n }\n }\n\n searchIn(text) {\n const { isCaseSensitive, includeMatches } = this.options;\n\n if (!isCaseSensitive) {\n text = text.toLowerCase();\n }\n\n // Exact match\n if (this.pattern === text) {\n let result = {\n isMatch: true,\n score: 0\n };\n\n if (includeMatches) {\n result.indices = [[0, text.length - 1]];\n }\n\n return result\n }\n\n // Otherwise, use Bitap algorithm\n const {\n location,\n distance,\n threshold,\n findAllMatches,\n minMatchCharLength,\n ignoreLocation\n } = this.options;\n\n let allIndices = [];\n let totalScore = 0;\n let hasMatches = false;\n\n this.chunks.forEach(({ pattern, alphabet, startIndex }) => {\n const { isMatch, score, indices } = search(text, pattern, alphabet, {\n location: location + startIndex,\n distance,\n threshold,\n findAllMatches,\n minMatchCharLength,\n includeMatches,\n ignoreLocation\n });\n\n if (isMatch) {\n hasMatches = true;\n }\n\n totalScore += score;\n\n if (isMatch && indices) {\n allIndices = [...allIndices, ...indices];\n }\n });\n\n let result = {\n isMatch: hasMatches,\n score: hasMatches ? totalScore / this.chunks.length : 1\n };\n\n if (hasMatches && includeMatches) {\n result.indices = allIndices;\n }\n\n return result\n }\n}\n\nclass BaseMatch {\n constructor(pattern) {\n this.pattern = pattern;\n }\n static isMultiMatch(pattern) {\n return getMatch(pattern, this.multiRegex)\n }\n static isSingleMatch(pattern) {\n return getMatch(pattern, this.singleRegex)\n }\n search(/*text*/) {}\n}\n\nfunction getMatch(pattern, exp) {\n const matches = pattern.match(exp);\n return matches ? matches[1] : null\n}\n\n// Token: 'file\n\nclass ExactMatch extends BaseMatch {\n constructor(pattern) {\n super(pattern);\n }\n static get type() {\n return 'exact'\n }\n static get multiRegex() {\n return /^=\"(.*)\"$/\n }\n static get singleRegex() {\n return /^=(.*)$/\n }\n search(text) {\n const isMatch = text === this.pattern;\n\n return {\n isMatch,\n score: isMatch ? 0 : 1,\n indices: [0, this.pattern.length - 1]\n }\n }\n}\n\n// Token: !fire\n\nclass InverseExactMatch extends BaseMatch {\n constructor(pattern) {\n super(pattern);\n }\n static get type() {\n return 'inverse-exact'\n }\n static get multiRegex() {\n return /^!\"(.*)\"$/\n }\n static get singleRegex() {\n return /^!(.*)$/\n }\n search(text) {\n const index = text.indexOf(this.pattern);\n const isMatch = index === -1;\n\n return {\n isMatch,\n score: isMatch ? 0 : 1,\n indices: [0, text.length - 1]\n }\n }\n}\n\n// Token: ^file\n\nclass PrefixExactMatch extends BaseMatch {\n constructor(pattern) {\n super(pattern);\n }\n static get type() {\n return 'prefix-exact'\n }\n static get multiRegex() {\n return /^\\^\"(.*)\"$/\n }\n static get singleRegex() {\n return /^\\^(.*)$/\n }\n search(text) {\n const isMatch = text.startsWith(this.pattern);\n\n return {\n isMatch,\n score: isMatch ? 0 : 1,\n indices: [0, this.pattern.length - 1]\n }\n }\n}\n\n// Token: !^fire\n\nclass InversePrefixExactMatch extends BaseMatch {\n constructor(pattern) {\n super(pattern);\n }\n static get type() {\n return 'inverse-prefix-exact'\n }\n static get multiRegex() {\n return /^!\\^\"(.*)\"$/\n }\n static get singleRegex() {\n return /^!\\^(.*)$/\n }\n search(text) {\n const isMatch = !text.startsWith(this.pattern);\n\n return {\n isMatch,\n score: isMatch ? 0 : 1,\n indices: [0, text.length - 1]\n }\n }\n}\n\n// Token: .file$\n\nclass SuffixExactMatch extends BaseMatch {\n constructor(pattern) {\n super(pattern);\n }\n static get type() {\n return 'suffix-exact'\n }\n static get multiRegex() {\n return /^\"(.*)\"\\$$/\n }\n static get singleRegex() {\n return /^(.*)\\$$/\n }\n search(text) {\n const isMatch = text.endsWith(this.pattern);\n\n return {\n isMatch,\n score: isMatch ? 0 : 1,\n indices: [text.length - this.pattern.length, text.length - 1]\n }\n }\n}\n\n// Token: !.file$\n\nclass InverseSuffixExactMatch extends BaseMatch {\n constructor(pattern) {\n super(pattern);\n }\n static get type() {\n return 'inverse-suffix-exact'\n }\n static get multiRegex() {\n return /^!\"(.*)\"\\$$/\n }\n static get singleRegex() {\n return /^!(.*)\\$$/\n }\n search(text) {\n const isMatch = !text.endsWith(this.pattern);\n return {\n isMatch,\n score: isMatch ? 0 : 1,\n indices: [0, text.length - 1]\n }\n }\n}\n\nclass FuzzyMatch extends BaseMatch {\n constructor(\n pattern,\n {\n location = Config.location,\n threshold = Config.threshold,\n distance = Config.distance,\n includeMatches = Config.includeMatches,\n findAllMatches = Config.findAllMatches,\n minMatchCharLength = Config.minMatchCharLength,\n isCaseSensitive = Config.isCaseSensitive,\n ignoreLocation = Config.ignoreLocation\n } = {}\n ) {\n super(pattern);\n this._bitapSearch = new BitapSearch(pattern, {\n location,\n threshold,\n distance,\n includeMatches,\n findAllMatches,\n minMatchCharLength,\n isCaseSensitive,\n ignoreLocation\n });\n }\n static get type() {\n return 'fuzzy'\n }\n static get multiRegex() {\n return /^\"(.*)\"$/\n }\n static get singleRegex() {\n return /^(.*)$/\n }\n search(text) {\n return this._bitapSearch.searchIn(text)\n }\n}\n\n// Token: 'file\n\nclass IncludeMatch extends BaseMatch {\n constructor(pattern) {\n super(pattern);\n }\n static get type() {\n return 'include'\n }\n static get multiRegex() {\n return /^'\"(.*)\"$/\n }\n static get singleRegex() {\n return /^'(.*)$/\n }\n search(text) {\n let location = 0;\n let index;\n\n const indices = [];\n const patternLen = this.pattern.length;\n\n // Get all exact matches\n while ((index = text.indexOf(this.pattern, location)) > -1) {\n location = index + patternLen;\n indices.push([index, location - 1]);\n }\n\n const isMatch = !!indices.length;\n\n return {\n isMatch,\n score: isMatch ? 0 : 1,\n indices\n }\n }\n}\n\n// ❗Order is important. DO NOT CHANGE.\nconst searchers = [\n ExactMatch,\n IncludeMatch,\n PrefixExactMatch,\n InversePrefixExactMatch,\n InverseSuffixExactMatch,\n SuffixExactMatch,\n InverseExactMatch,\n FuzzyMatch\n];\n\nconst searchersLen = searchers.length;\n\n// Regex to split by spaces, but keep anything in quotes together\nconst SPACE_RE = / +(?=(?:[^\\\"]*\\\"[^\\\"]*\\\")*[^\\\"]*$)/;\nconst OR_TOKEN = '|';\n\n// Return a 2D array representation of the query, for simpler parsing.\n// Example:\n// \"^core go$ | rb$ | py$ xy$\" => [[\"^core\", \"go$\"], [\"rb$\"], [\"py$\", \"xy$\"]]\nfunction parseQuery(pattern, options = {}) {\n return pattern.split(OR_TOKEN).map((item) => {\n let query = item\n .trim()\n .split(SPACE_RE)\n .filter((item) => item && !!item.trim());\n\n let results = [];\n for (let i = 0, len = query.length; i < len; i += 1) {\n const queryItem = query[i];\n\n // 1. Handle multiple query match (i.e, once that are quoted, like `\"hello world\"`)\n let found = false;\n let idx = -1;\n while (!found && ++idx < searchersLen) {\n const searcher = searchers[idx];\n let token = searcher.isMultiMatch(queryItem);\n if (token) {\n results.push(new searcher(token, options));\n found = true;\n }\n }\n\n if (found) {\n continue\n }\n\n // 2. Handle single query matches (i.e, once that are *not* quoted)\n idx = -1;\n while (++idx < searchersLen) {\n const searcher = searchers[idx];\n let token = searcher.isSingleMatch(queryItem);\n if (token) {\n results.push(new searcher(token, options));\n break\n }\n }\n }\n\n return results\n })\n}\n\n// These extended matchers can return an array of matches, as opposed\n// to a singl match\nconst MultiMatchSet = new Set([FuzzyMatch.type, IncludeMatch.type]);\n\n/**\n * Command-like searching\n * ======================\n *\n * Given multiple search terms delimited by spaces.e.g. `^jscript .python$ ruby !java`,\n * search in a given text.\n *\n * Search syntax:\n *\n * | Token | Match type | Description |\n * | ----------- | -------------------------- | -------------------------------------- |\n * | `jscript` | fuzzy-match | Items that fuzzy match `jscript` |\n * | `=scheme` | exact-match | Items that are `scheme` |\n * | `'python` | include-match | Items that include `python` |\n * | `!ruby` | inverse-exact-match | Items that do not include `ruby` |\n * | `^java` | prefix-exact-match | Items that start with `java` |\n * | `!^earlang` | inverse-prefix-exact-match | Items that do not start with `earlang` |\n * | `.js$` | suffix-exact-match | Items that end with `.js` |\n * | `!.go$` | inverse-suffix-exact-match | Items that do not end with `.go` |\n *\n * A single pipe character acts as an OR operator. For example, the following\n * query matches entries that start with `core` and end with either`go`, `rb`,\n * or`py`.\n *\n * ```\n * ^core go$ | rb$ | py$\n * ```\n */\nclass ExtendedSearch {\n constructor(\n pattern,\n {\n isCaseSensitive = Config.isCaseSensitive,\n includeMatches = Config.includeMatches,\n minMatchCharLength = Config.minMatchCharLength,\n ignoreLocation = Config.ignoreLocation,\n findAllMatches = Config.findAllMatches,\n location = Config.location,\n threshold = Config.threshold,\n distance = Config.distance\n } = {}\n ) {\n this.query = null;\n this.options = {\n isCaseSensitive,\n includeMatches,\n minMatchCharLength,\n findAllMatches,\n ignoreLocation,\n location,\n threshold,\n distance\n };\n\n this.pattern = isCaseSensitive ? pattern : pattern.toLowerCase();\n this.query = parseQuery(this.pattern, this.options);\n }\n\n static condition(_, options) {\n return options.useExtendedSearch\n }\n\n searchIn(text) {\n const query = this.query;\n\n if (!query) {\n return {\n isMatch: false,\n score: 1\n }\n }\n\n const { includeMatches, isCaseSensitive } = this.options;\n\n text = isCaseSensitive ? text : text.toLowerCase();\n\n let numMatches = 0;\n let allIndices = [];\n let totalScore = 0;\n\n // ORs\n for (let i = 0, qLen = query.length; i < qLen; i += 1) {\n const searchers = query[i];\n\n // Reset indices\n allIndices.length = 0;\n numMatches = 0;\n\n // ANDs\n for (let j = 0, pLen = searchers.length; j < pLen; j += 1) {\n const searcher = searchers[j];\n const { isMatch, indices, score } = searcher.search(text);\n\n if (isMatch) {\n numMatches += 1;\n totalScore += score;\n if (includeMatches) {\n const type = searcher.constructor.type;\n if (MultiMatchSet.has(type)) {\n allIndices = [...allIndices, ...indices];\n } else {\n allIndices.push(indices);\n }\n }\n } else {\n totalScore = 0;\n numMatches = 0;\n allIndices.length = 0;\n break\n }\n }\n\n // OR condition, so if TRUE, return\n if (numMatches) {\n let result = {\n isMatch: true,\n score: totalScore / numMatches\n };\n\n if (includeMatches) {\n result.indices = allIndices;\n }\n\n return result\n }\n }\n\n // Nothing was matched\n return {\n isMatch: false,\n score: 1\n }\n }\n}\n\nconst registeredSearchers = [];\n\nfunction register(...args) {\n registeredSearchers.push(...args);\n}\n\nfunction createSearcher(pattern, options) {\n for (let i = 0, len = registeredSearchers.length; i < len; i += 1) {\n let searcherClass = registeredSearchers[i];\n if (searcherClass.condition(pattern, options)) {\n return new searcherClass(pattern, options)\n }\n }\n\n return new BitapSearch(pattern, options)\n}\n\nconst LogicalOperator = {\n AND: '$and',\n OR: '$or'\n};\n\nconst KeyType = {\n PATH: '$path',\n PATTERN: '$val'\n};\n\nconst isExpression = (query) =>\n !!(query[LogicalOperator.AND] || query[LogicalOperator.OR]);\n\nconst isPath = (query) => !!query[KeyType.PATH];\n\nconst isLeaf = (query) =>\n !isArray(query) && isObject(query) && !isExpression(query);\n\nconst convertToExplicit = (query) => ({\n [LogicalOperator.AND]: Object.keys(query).map((key) => ({\n [key]: query[key]\n }))\n});\n\n// When `auto` is `true`, the parse function will infer and initialize and add\n// the appropriate `Searcher` instance\nfunction parse(query, options, { auto = true } = {}) {\n const next = (query) => {\n let keys = Object.keys(query);\n\n const isQueryPath = isPath(query);\n\n if (!isQueryPath && keys.length > 1 && !isExpression(query)) {\n return next(convertToExplicit(query))\n }\n\n if (isLeaf(query)) {\n const key = isQueryPath ? query[KeyType.PATH] : keys[0];\n\n const pattern = isQueryPath ? query[KeyType.PATTERN] : query[key];\n\n if (!isString(pattern)) {\n throw new Error(LOGICAL_SEARCH_INVALID_QUERY_FOR_KEY(key))\n }\n\n const obj = {\n keyId: createKeyId(key),\n pattern\n };\n\n if (auto) {\n obj.searcher = createSearcher(pattern, options);\n }\n\n return obj\n }\n\n let node = {\n children: [],\n operator: keys[0]\n };\n\n keys.forEach((key) => {\n const value = query[key];\n\n if (isArray(value)) {\n value.forEach((item) => {\n node.children.push(next(item));\n });\n }\n });\n\n return node\n };\n\n if (!isExpression(query)) {\n query = convertToExplicit(query);\n }\n\n return next(query)\n}\n\n// Practical scoring function\nfunction computeScore(\n results,\n { ignoreFieldNorm = Config.ignoreFieldNorm }\n) {\n results.forEach((result) => {\n let totalScore = 1;\n\n result.matches.forEach(({ key, norm, score }) => {\n const weight = key ? key.weight : null;\n\n totalScore *= Math.pow(\n score === 0 && weight ? Number.EPSILON : score,\n (weight || 1) * (ignoreFieldNorm ? 1 : norm)\n );\n });\n\n result.score = totalScore;\n });\n}\n\nfunction transformMatches(result, data) {\n const matches = result.matches;\n data.matches = [];\n\n if (!isDefined(matches)) {\n return\n }\n\n matches.forEach((match) => {\n if (!isDefined(match.indices) || !match.indices.length) {\n return\n }\n\n const { indices, value } = match;\n\n let obj = {\n indices,\n value\n };\n\n if (match.key) {\n obj.key = match.key.src;\n }\n\n if (match.idx > -1) {\n obj.refIndex = match.idx;\n }\n\n data.matches.push(obj);\n });\n}\n\nfunction transformScore(result, data) {\n data.score = result.score;\n}\n\nfunction format(\n results,\n docs,\n {\n includeMatches = Config.includeMatches,\n includeScore = Config.includeScore\n } = {}\n) {\n const transformers = [];\n\n if (includeMatches) transformers.push(transformMatches);\n if (includeScore) transformers.push(transformScore);\n\n return results.map((result) => {\n const { idx } = result;\n\n const data = {\n item: docs[idx],\n refIndex: idx\n };\n\n if (transformers.length) {\n transformers.forEach((transformer) => {\n transformer(result, data);\n });\n }\n\n return data\n })\n}\n\nclass Fuse {\n constructor(docs, options = {}, index) {\n this.options = { ...Config, ...options };\n\n if (\n this.options.useExtendedSearch &&\n !true\n ) {\n throw new Error(EXTENDED_SEARCH_UNAVAILABLE)\n }\n\n this._keyStore = new KeyStore(this.options.keys);\n\n this.setCollection(docs, index);\n }\n\n setCollection(docs, index) {\n this._docs = docs;\n\n if (index && !(index instanceof FuseIndex)) {\n throw new Error(INCORRECT_INDEX_TYPE)\n }\n\n this._myIndex =\n index ||\n createIndex(this.options.keys, this._docs, {\n getFn: this.options.getFn,\n fieldNormWeight: this.options.fieldNormWeight\n });\n }\n\n add(doc) {\n if (!isDefined(doc)) {\n return\n }\n\n this._docs.push(doc);\n this._myIndex.add(doc);\n }\n\n remove(predicate = (/* doc, idx */) => false) {\n const results = [];\n\n for (let i = 0, len = this._docs.length; i < len; i += 1) {\n const doc = this._docs[i];\n if (predicate(doc, i)) {\n this.removeAt(i);\n i -= 1;\n len -= 1;\n\n results.push(doc);\n }\n }\n\n return results\n }\n\n removeAt(idx) {\n this._docs.splice(idx, 1);\n this._myIndex.removeAt(idx);\n }\n\n getIndex() {\n return this._myIndex\n }\n\n search(query, { limit = -1 } = {}) {\n const {\n includeMatches,\n includeScore,\n shouldSort,\n sortFn,\n ignoreFieldNorm\n } = this.options;\n\n let results = isString(query)\n ? isString(this._docs[0])\n ? this._searchStringList(query)\n : this._searchObjectList(query)\n : this._searchLogical(query);\n\n computeScore(results, { ignoreFieldNorm });\n\n if (shouldSort) {\n results.sort(sortFn);\n }\n\n if (isNumber(limit) && limit > -1) {\n results = results.slice(0, limit);\n }\n\n return format(results, this._docs, {\n includeMatches,\n includeScore\n })\n }\n\n _searchStringList(query) {\n const searcher = createSearcher(query, this.options);\n const { records } = this._myIndex;\n const results = [];\n\n // Iterate over every string in the index\n records.forEach(({ v: text, i: idx, n: norm }) => {\n if (!isDefined(text)) {\n return\n }\n\n const { isMatch, score, indices } = searcher.searchIn(text);\n\n if (isMatch) {\n results.push({\n item: text,\n idx,\n matches: [{ score, value: text, norm, indices }]\n });\n }\n });\n\n return results\n }\n\n _searchLogical(query) {\n\n const expression = parse(query, this.options);\n\n const evaluate = (node, item, idx) => {\n if (!node.children) {\n const { keyId, searcher } = node;\n\n const matches = this._findMatches({\n key: this._keyStore.get(keyId),\n value: this._myIndex.getValueForItemAtKeyId(item, keyId),\n searcher\n });\n\n if (matches && matches.length) {\n return [\n {\n idx,\n item,\n matches\n }\n ]\n }\n\n return []\n }\n\n const res = [];\n for (let i = 0, len = node.children.length; i < len; i += 1) {\n const child = node.children[i];\n const result = evaluate(child, item, idx);\n if (result.length) {\n res.push(...result);\n } else if (node.operator === LogicalOperator.AND) {\n return []\n }\n }\n return res\n };\n\n const records = this._myIndex.records;\n const resultMap = {};\n const results = [];\n\n records.forEach(({ $: item, i: idx }) => {\n if (isDefined(item)) {\n let expResults = evaluate(expression, item, idx);\n\n if (expResults.length) {\n // Dedupe when adding\n if (!resultMap[idx]) {\n resultMap[idx] = { idx, item, matches: [] };\n results.push(resultMap[idx]);\n }\n expResults.forEach(({ matches }) => {\n resultMap[idx].matches.push(...matches);\n });\n }\n }\n });\n\n return results\n }\n\n _searchObjectList(query) {\n const searcher = createSearcher(query, this.options);\n const { keys, records } = this._myIndex;\n const results = [];\n\n // List is Array\n records.forEach(({ $: item, i: idx }) => {\n if (!isDefined(item)) {\n return\n }\n\n let matches = [];\n\n // Iterate over every key (i.e, path), and fetch the value at that key\n keys.forEach((key, keyIndex) => {\n matches.push(\n ...this._findMatches({\n key,\n value: item[keyIndex],\n searcher\n })\n );\n });\n\n if (matches.length) {\n results.push({\n idx,\n item,\n matches\n });\n }\n });\n\n return results\n }\n _findMatches({ key, value, searcher }) {\n if (!isDefined(value)) {\n return []\n }\n\n let matches = [];\n\n if (isArray(value)) {\n value.forEach(({ v: text, i: idx, n: norm }) => {\n if (!isDefined(text)) {\n return\n }\n\n const { isMatch, score, indices } = searcher.searchIn(text);\n\n if (isMatch) {\n matches.push({\n score,\n key,\n value: text,\n idx,\n norm,\n indices\n });\n }\n });\n } else {\n const { v: text, n: norm } = value;\n\n const { isMatch, score, indices } = searcher.searchIn(text);\n\n if (isMatch) {\n matches.push({ score, key, value: text, norm, indices });\n }\n }\n\n return matches\n }\n}\n\nFuse.version = '6.6.2';\nFuse.createIndex = createIndex;\nFuse.parseIndex = parseIndex;\nFuse.config = Config;\n\n{\n Fuse.parseQuery = parse;\n}\n\n{\n register(ExtendedSearch);\n}\n\nexport { Fuse as default };\n","import util from \"./util\";\nimport Gun from \"gun\";\n\nconst electron = util.isElectron ? new Gun({peers: ['http://localhost:8768/gun'], file: 'State.electron', multicast:false, localStorage: false}).get('state') : null;\n\nexport default electron;","// @ts-nocheck\nimport Gun from 'gun';\nimport notifications from './notifications';\nimport Channel from './Channel';\nimport util from './util';\nimport _ from './lodash';\nimport Fuse from \"fuse.js\";\nimport localforage from 'localforage';\nimport local from './local';\nimport electron from './electron';\nimport user from './public';\nimport privateState from './private';\nimport blockedUsers from './blockedUsers';\n\nlet key: any;\nlet myName: string;\nlet latestChatLink: string;\nlet onlineTimeout: any;\nlet ourActivity: any;\nlet noFollows: boolean;\nlet noFollowers: boolean;\nlet searchIndex: any;\nlet initCalled: boolean;\nconst searchableItems: any = {};\nconst getExtendedFollowsCalled = new Map();\n\nconst DEFAULT_FOLLOW = 'hyECQHwSo7fgr2MVfPyakvayPeixxsaAWVtZ-vbaiSc.TXIp8MnCtrnW6n2MrYquWPcc-DTmZzMBmc2yaGv9gIU';\n\nconst DEFAULT_SETTINGS = {\n electron: {\n openAtLogin: true,\n minimizeOnClose: true\n },\n local: {\n enableWebtorrent: !util.isMobile,\n enablePublicPeerDiscovery: true,\n autoplayWebtorrent: true,\n maxConnectedPeers: util.isElectron ? 2 : 1\n }\n}\n\n/**\n * User session management utilities.\n */\nexport default {\n /**\n * Log in with a key from localStorage.\n *\n * If no key is found and options.autologin is not false, a new user will be created.\n *\n * If options.autofollow is not false, the default follow will be added.\n * @param options\n */\n init(options: any = {}) {\n if (initCalled) { return; }\n initCalled = true;\n let localStorageKey = localStorage.getItem('chatKeyPair');\n if (localStorageKey) {\n this.login(JSON.parse(localStorageKey));\n } else if (options.autologin !== false) {\n this.loginAsNewUser(options);\n } else {\n this.clearIndexedDB();\n }\n setTimeout(() => {\n local().get('block').map(() => {\n this.updateSearchIndex();\n });\n this.updateSearchIndex();\n });\n setInterval(() => {\n if (this.taskQueue.length) {\n //console.log('this.taskQueue', this.taskQueue.length);\n const t = this.taskQueue.shift();\n t && t();\n }\n }, 10);\n },\n\n DEFAULT_SETTINGS,\n DEFAULT_FOLLOW,\n\n taskQueue: [] as any[],\n\n updateSearchIndex: _.throttle(() => {\n const options = {keys: ['name'], includeScore: true, includeMatches: true, threshold: 0.3};\n const values = Object.values(_.omit(searchableItems, Object.keys(blockedUsers())));\n searchIndex = new Fuse(values, options);\n local().get('searchIndexUpdated').put(true);\n }, 2000, {leading:true}),\n\n saveSearchResult: _.throttle(k => {\n local().get('contacts').get(k).put({followDistance: searchableItems[k].followDistance,followerCount: searchableItems[k].followers.size});\n }, 1000, {leading:true}),\n\n addFollow(callback: Function, k: string, followDistance: number, follower?: string) {\n if (searchableItems[k]) {\n if (searchableItems[k].followDistance > followDistance) {\n searchableItems[k].followDistance = followDistance;\n }\n follower && searchableItems[k].followers.add(follower);\n } else {\n searchableItems[k] = {key: k, followDistance, followers: new Set(follower && [follower])};\n this.taskQueue.push(() => {\n user(k).get('profile').get('name').on((name: string) => {\n searchableItems[k].name = name;\n local().get('contacts').get(k).get('name').put(name);\n callback && callback(k, searchableItems[k]);\n });\n });\n }\n this.saveSearchResult(k);\n callback && callback(k, searchableItems[k]);\n this.updateSearchIndex();\n this.updateNoFollows();\n this.updateNoFollowers();\n },\n\n removeFollow(k: string, followDistance: number, follower: string) {\n if (followDistance === 1) {\n local().get('contacts').get(k).put(false);\n local().get('groups').get('follows').get(k).put(false);\n if (searchableItems[k]) {\n searchableItems[k].followers.delete(follower);\n this.updateNoFollows();\n this.updateNoFollowers();\n }\n }\n console.log('removeFollow', k, followDistance, follower);\n if (searchableItems[k] && searchableItems[k].followers.size === 0) {\n delete searchableItems[k];\n local().get('contacts').get(k).put(false);\n local().get('groups').get('everyone').get(k).put(false);\n }\n },\n\n getExtendedFollows(callback: Function, k = key.pub, maxDepth = 3, currentDepth = 1) {\n const called = getExtendedFollowsCalled.get(k);\n if (called && called <= currentDepth) {\n return;\n }\n getExtendedFollowsCalled.set(k, currentDepth);\n\n this.addFollow(callback, k, currentDepth - 1);\n\n user(k).get('follow').map().on((isFollowing: boolean, followedKey: string) => { // TODO: unfollow\n if (isFollowing) {\n this.addFollow(callback, followedKey, currentDepth, k);\n if (currentDepth < maxDepth) {\n this.taskQueue.push(() => this.getExtendedFollows(callback, followedKey, maxDepth, currentDepth + 1));\n }\n } else {\n this.removeFollow(followedKey, currentDepth, k);\n }\n });\n\n return searchableItems;\n },\n\n updateNoFollows: _.throttle(() => {\n const v = Object.keys(searchableItems).length <= 1;\n if (v !== noFollows) {\n noFollows = v;\n local().get('noFollows').put(noFollows);\n }\n }, 1000, {leading:true}),\n\n updateNoFollowers: _.throttle(() => {\n const v = !(searchableItems[key.pub] && (searchableItems[key.pub].followers.size > 0));\n if (v !== noFollowers) {\n noFollowers = v;\n local().get('noFollowers').put(noFollowers);\n }\n }, 1000, {leading:true}),\n\n getSearchIndex() {\n return searchIndex;\n },\n\n setOurOnlineStatus() {\n const activeRoute = window.location.hash;\n Channel.setActivity(ourActivity = 'active');\n const setActive = _.debounce(() => {\n const chatId = activeRoute && activeRoute.replace('#/profile/','').replace('#/chat/','');\n const chat = privateState(chatId);\n if (chat && !ourActivity) {\n chat.setMyMsgsLastSeenTime();\n }\n Channel.setActivity(ourActivity = 'active');\n clearTimeout(onlineTimeout);\n onlineTimeout = setTimeout(() => Channel.setActivity(ourActivity = 'online'), 30000);\n }, 1000);\n document.addEventListener(\"touchmove\", setActive);\n document.addEventListener(\"mousemove\", setActive);\n document.addEventListener(\"keypress\", setActive);\n document.addEventListener(\"visibilitychange\", () => {\n if (document.visibilityState === 'visible') {\n Channel.setActivity(ourActivity = 'active');\n const chatId = location.pathname.slice(1).replace('chat/','');\n const chat = activeRoute && privateState(chatId);\n if (chat) {\n chat.setMyMsgsLastSeenTime();\n notifications.changeChatUnseenCount(chatId, 0);\n }\n } else {\n Channel.setActivity(ourActivity = 'online');\n }\n });\n setActive();\n window.addEventListener(\"beforeunload\", () => {\n Channel.setActivity(ourActivity = null);\n });\n },\n\n updateGroups() {\n this.getExtendedFollows((k: string, info: any) => {\n if (info.followDistance <= 1) {\n local().get('groups').get('follows').get(k).put(true);\n }\n local().get('groups').get('everyone').get(k).put(true);\n if (k === this.getPubKey()) {\n this.updateNoFollowers();\n }\n });\n },\n\n /**\n * Log in with a private key.\n * @param key\n */\n login(k: any) {\n const shouldRefresh = !!key;\n key = k;\n localStorage.setItem('chatKeyPair', JSON.stringify(k));\n user().auth(key);\n user().put({epub: key.epub});\n user().get('likes').put({a:null}); // gun bug?\n user().get('msgs').put({a:null}); // gun bug?\n user().get('replies').put({a:null}); // gun bug?\n notifications.subscribeToWebPush();\n notifications.getWebPushSubscriptions();\n notifications.subscribeToIrisNotifications();\n Channel.getMyChatLinks( undefined, (chatLink: any) => {\n local().get('chatLinks').get(chatLink.id).put(chatLink.url);\n latestChatLink = chatLink.url;\n });\n this.setOurOnlineStatus();\n Channel.getChannels( (c: Channel) => this.addChannel(c));\n user().get('profile').get('name').on((name: any) => {\n if (name && typeof name === 'string') {\n myName = name;\n }\n });\n notifications.init();\n local().get('loggedIn').put(true);\n local().get('settings').once().then(settings => {\n if (!settings) {\n local().get('settings').put(DEFAULT_SETTINGS.local);\n } else if (settings.enableWebtorrent === undefined || settings.autoplayWebtorrent === undefined) {\n local().get('settings').get('enableWebtorrent').put(DEFAULT_SETTINGS.local.enableWebtorrent);\n local().get('settings').get('autoplayWebtorrent').put(DEFAULT_SETTINGS.local.autoplayWebtorrent);\n }\n });\n user().get('block').map().on((isBlocked: boolean, user: string) => {\n local().get('block').get(user).put(isBlocked);\n if (isBlocked) {\n delete searchableItems[user];\n }\n });\n this.updateGroups();\n if (shouldRefresh) {\n location.reload();\n }\n if (electron) {\n electron.get('settings').on(electron => {\n local().get('settings').get('electron').put(electron);\n });\n electron.get('user').put(key.pub);\n }\n local().get('filters').get('group').once().then(v => {\n if (!v) {\n local().get('filters').get('group').put('follows');\n }\n });\n },\n\n /**\n * Create a new user account and log in.\n * @param options {Object} - Options for the new account.\n * @returns {Promise<*>}\n */\n loginAsNewUser(options: any = {}) {\n const name = options.name || util.generateName();\n console.log('loginAsNewUser name', name);\n return Gun.SEA.pair().then(k => {\n this.login(k);\n user().get('profile').put({a:null});\n user().get('profile').get('name').put(name);\n local().get('filters').put({a:null});\n local().get('filters').get('group').put('follows');\n Channel.createChatLink().then(l => latestChatLink = l);\n setTimeout(() => {\n if (options.autofollow !== false) {\n console.log('autofollowing', DEFAULT_FOLLOW);\n user().get('follow').get(DEFAULT_FOLLOW).put(true);\n }\n }, 1000); // maybe wait for login return instead\n });\n },\n\n /**\n * Log out the current user.\n * @returns {Promise}\n */\n async logOut() {\n if (electron) {\n electron.get('user').put(null);\n }\n // TODO: remove subscription from your channels\n if (navigator.serviceWorker) {\n const reg = await navigator.serviceWorker.getRegistration();\n if (reg && reg.pushManager) {\n reg.active?.postMessage({key: null});\n const sub = await reg.pushManager.getSubscription();\n if (sub) {\n const hash = await util.getHash(JSON.stringify(sub));\n notifications.removeSubscription(hash);\n sub.unsubscribe && sub.unsubscribe();\n }\n }\n }\n this.clearIndexedDB();\n localStorage.clear(); // TODO clear only iris data\n localforage.clear().then(() => {\n window.location.hash = '';\n window.location.href = '/';\n location.reload();\n });\n },\n\n clearIndexedDB() {\n return new Promise(resolve => {\n const r1 = window.indexedDB.deleteDatabase('local()');\n const r2 = window.indexedDB.deleteDatabase('radata');\n let r1done = false;\n let r2done = false;\n const check = () => {\n r1done && r2done && resolve(undefined);\n }\n r1.onerror = r2.onerror = e => console.error(e);\n //r1.onblocked = r2.onblocked = e => console.error('blocked', e);\n r1.onsuccess = () => {\n r1done = true;\n check();\n }\n r2.onsuccess = () => {\n r2done = true;\n check();\n }\n });\n },\n\n getMyChatLink() {\n return latestChatLink || util.getProfileLink(key.pub);\n },\n\n /**\n * Get the keypair of the logged in user.\n * @returns {*}\n */\n getKey() { return key; },\n\n /**\n * Get the public key of the logged in user.\n * @returns {*}\n */\n getPubKey() {\n return key && key.pub;\n },\n\n /**\n * Get the name of the logged in user.\n * @returns {*}\n */\n getMyName() { return myName; }, // TODO maybe remove and use iris.user().get('profile').get('name') instead?\n\n myPeerUrl: (ip: string) => `http://${ip}:8767/gun`,\n\n async shareMyPeerUrl(channel: Channel) {\n const myIp = await local().get('settings').get('electron').get('publicIp').once();\n myIp && channel.put && channel.put('my_peer', this.myPeerUrl(myIp));\n },\n\n newChannel(pub: string, chatLink?: string) {\n if (!pub || this.channelIds.has(pub)) {\n return;\n }\n const chat = privateState(pub, chatLink);\n this.addChannel(chat);\n return chat;\n },\n\n addChannel(chat: Channel) {\n this.taskQueue.push(() => {\n let pub = chat.getId();\n if (this.channelIds.has(pub)) { return; }\n this.channelIds.add(pub);\n const chatNode = local().get('channels').get(pub);\n chatNode.get('latestTime').on((t: string) => {\n if (t && (!chat.latestTime || t > chat.latestTime)) {\n chat.latestTime = t;\n } else {\n // chatNode.get('latestTime').put(chat.latestTime); // omg recursion\n }\n });\n chatNode.get('theirMsgsLastSeenTime').on((t: string) => {\n if (!t) { return; }\n const d = new Date(t);\n if (!chat.theirMsgsLastSeenDate || chat.theirMsgsLastSeenDate < d) {\n chat.theirMsgsLastSeenDate = d;\n }\n });\n chat.getLatestMsg && chat.getLatestMsg((latest: any, info: any) => {\n this.processMessage(pub, latest, info);\n });\n notifications.changeChatUnseenCount(pub, 0);\n chat.notificationSetting = 'all';\n chat.onMy('notificationSetting', (val: any) => {\n chat.notificationSetting = val;\n });\n //$(\".chat-list\").append(el);\n chat.theirMsgsLastSeenTime = '';\n chat.getTheirMsgsLastSeenTime((time: any) => {\n if (chat && time && time >= chat.theirMsgsLastSeenTime) {\n chat.theirMsgsLastSeenTime = time;\n chatNode.get('theirMsgsLastSeenTime').put(time);\n }\n });\n chat.getMyMsgsLastSeenTime((time: any) => {\n chat.myLastSeenTime = new Date(time);\n if (chat.latest && chat.myLastSeenTime >= chat.latest.time) {\n notifications.changeChatUnseenCount(pub, 0);\n }\n });\n chat.isTyping = false;\n chat.getTyping(isTyping => {\n chat.isTyping = isTyping;\n local().get('channels').get(pub).get('isTyping').put(isTyping);\n });\n chat.online = {};\n Channel.getActivity(pub, (activity) => {\n if (chat) {\n chatNode.put({theirLastActiveTime: activity && activity.lastActive, activity: activity && activity.isActive && activity.status});\n chat.activity = activity;\n }\n });\n if (chat.uuid) {\n let isDarkMode = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches;\n chat.participantProfiles = {};\n chat.on('name', v => {\n chat.name = v;\n searchableItems[chat.uuid] = {name: v, uuid: chat.uuid};\n local().get('channels').get(chat.uuid).get('name').put(v);\n });\n chat.on('photo', v => {\n searchableItems[chat.uuid] = searchableItems[chat.uuid] || {};\n searchableItems[chat.uuid].photo = v;\n local().get('channels').get(chat.uuid).get('photo').put(v)\n });\n chat.on('about', v => local().get('channels').get(chat.uuid).get('about').put(v));\n chat.getParticipants(participants => {\n delete participants.undefined; // TODO fix where it comes from\n if (typeof participants === 'object') {\n let keys = Object.keys(participants);\n keys.forEach((k, i) => {\n let hue = 360 / Math.max(keys.length, 2) * i; // TODO use css filter brightness\n chat.participantProfiles[k] = {permissions: participants[k], color: `hsl(${hue}, 98%, ${isDarkMode ? 80 : 33}%)`};\n user(k).get('profile').get('name').on(name => {\n chat.participantProfiles[k].name = name;\n });\n });\n }\n local().get('channels').get(chat.uuid).get('participants').put(participants);\n });\n chat.inviteLinks = {};\n chat.getChatLinks({callback: ({url, id}) => {\n console.log('got chat link', id, url);\n chat.inviteLinks[id] = url; // TODO use State\n local().get('inviteLinksChanged').put(true);\n }});\n } else {\n // TODO do we want this?\n user(pub).get('profile').get('name').on(v => local().get('channels').get(pub).get('name').put(v))\n }\n if (chat.put) {\n chat.onTheir('webPushSubscriptions', (s, k, from) => {\n if (!Array.isArray(s)) { return; }\n chat.webPushSubscriptions = chat.webPushSubscriptions || {};\n chat.webPushSubscriptions[from || pub] = s;\n });\n const arr = Object.values(notifications.webPushSubscriptions);\n setTimeout(() => chat.put('webPushSubscriptions', arr), 5000);\n this.shareMyPeerUrl(chat);\n }\n chat.onTheir('call', call => {\n local().get('call').put({pub, call});\n });\n local().get('channels').get(pub).put({enabled:true});\n /* Disable private peer discovery, since they're not connecting anyway\n if (chat.onTheir) {\n chat.onTheir('my_peer', (url, k, from) => {\n console.log('Got private peer url', url, 'from', from);\n peers.addPeer({url, from})\n });\n }\n */\n\n });\n },\n\n // TODO: should perhaps be in Channel\n processMessage(chatId: string, msg: any, info: any, onClickNotification?: Function) {\n const chat = privateState(chatId);\n chat.messageIds = chat.messageIds || {};\n if (chat.messageIds[msg.time + info.from]) return;\n chat.messageIds[msg.time + info.from] = true;\n if (info) {\n msg = Object.assign(msg, info);\n }\n if (msg.invite) {\n const chatLink = `https://iris.to/?channelId=${msg.invite.group}&inviter=${chatId}`;\n this.newChannel(msg.invite.group, chatLink);\n return;\n }\n msg.selfAuthored = info.selfAuthored;\n local().get('channels').get(chatId).get('msgs').get(msg.time + (msg.from && msg.from.slice(0, 10))).put(JSON.stringify(msg));\n msg.timeObj = new Date(msg.time);\n if (!info.selfAuthored && msg.timeObj > chat.myLastSeenTime) {\n if (window.location.hash !== `#/chat/${ chatId}` || document.visibilityState !== 'visible') {\n notifications.changeChatUnseenCount(chatId, 1);\n } else if (ourActivity === 'active') {\n chat.setMyMsgsLastSeenTime();\n }\n }\n if (!info.selfAuthored && msg.time > chat.theirMsgsLastSeenTime) {\n local().get('channels').get(chatId).get('theirMsgsLastSeenTime').put(msg.time);\n }\n if (!chat.latestTime || (msg.time > chat.latestTime)) {\n local().get('channels').get(chatId).put({\n latestTime: msg.time,\n latest: {time: msg.time, text: msg.text, selfAuthored: info.selfAuthored}\n });\n }\n // TODO: onclickNotification should do route(`/chat/${ pub}`);\n notifications.notifyMsg(msg, info, chatId, onClickNotification);\n },\n\n subscribeToMsgs(pub) {\n const c = privateState(pub);\n if (c.subscribed) { return; }\n c.subscribed = true;\n c.getMessages((msg, info) => {\n this.processMessage(pub, msg, info);\n });\n },\n\n /**\n * Known private channels with other users\n */\n channelIds: new Set(),\n};\n","/*eslint no-useless-escape: \"off\", camelcase: \"off\" */\n\nimport util from './util';\nimport Gun from 'gun'; // eslint-disable-line no-unused-vars\nimport 'gun/sea';\n// eslint-disable-line no-unused-vars\n\nlet myKey: any;\n\nclass Key {\n static async getActiveKey(datadir = `.`, keyfile = `iris.key`, fs?: any) {\n if (myKey) {\n return myKey;\n }\n if (fs) {\n const privKeyFile = `${datadir}/${keyfile}`;\n if (fs.existsSync(privKeyFile)) {\n const f = fs.readFileSync(privKeyFile, `utf8`);\n myKey = Key.fromString(f);\n } else {\n const newKey = await Key.generate();\n myKey = myKey || newKey; // eslint-disable-line require-atomic-updates\n fs.writeFileSync(privKeyFile, Key.toString(myKey));\n fs.chmodSync(privKeyFile, 400);\n }\n if (!myKey) {\n throw new Error(`loading default key failed - check ${datadir}/${keyfile}`);\n }\n } else {\n const str = window.localStorage.getItem(`iris.myKey`);\n if (str) {\n myKey = Key.fromString(str);\n } else {\n const newKey = await Key.generate();\n myKey = myKey || newKey; // eslint-disable-line require-atomic-updates\n window.localStorage.setItem(`iris.myKey`, Key.toString(myKey));\n }\n if (!myKey) {\n throw new Error(`loading default key failed - check localStorage iris.myKey`);\n }\n }\n return myKey;\n }\n\n static getDefault(datadir = `.`, keyfile = `iris.key`) {\n return Key.getActiveKey(datadir, keyfile);\n }\n\n static async getActivePub(datadir = `.`, keyfile = `iris.key`) {\n const key = await Key.getActiveKey(datadir, keyfile);\n return key.pub;\n }\n\n static setActiveKey(key: any, save = true, datadir = `.`, keyfile = `iris.key`, fs: any) {\n myKey = key;\n if (!save) return;\n if (util.isNode) {\n const privKeyFile = `${datadir}/${keyfile}`;\n fs.writeFileSync(privKeyFile, Key.toString(myKey));\n fs.chmodSync(privKeyFile, 400);\n } else {\n window.localStorage.setItem(`iris.myKey`, Key.toString(myKey));\n }\n }\n\n static toString(key: any) {\n return JSON.stringify(key);\n }\n\n static getId(key: any) {\n if (!(key && key.pub)) {\n throw new Error(`missing param`);\n }\n return key.pub; // hack until GUN supports lookups by keyID\n //return util.getHash(key.pub);\n }\n\n static fromString(str: string) {\n return JSON.parse(str);\n }\n\n static generate() {\n return Gun.SEA.pair();\n }\n\n static async sign(msg: any, pair: any) {\n const sig = await Gun.SEA.sign(msg, pair);\n return `a${sig}`;\n }\n\n static verify(msg: any, pubKey: any) {\n return Gun.SEA.verify(msg.slice(1), pubKey);\n }\n}\n\nexport default Key;\n","import publicSpace from './global';\nimport util from './util';\n\n/**\n * Content-addressed storage\n */\nexport default {\n /**\n * Get a file identified by its hash\n * @param hash\n * @param callback\n * @returns {Promise}\n */\n get(hash: string, callback: Function) {\n return new Promise((resolve, reject) => {\n if (!hash) {\n reject('No hash provided');\n }\n if (typeof hash !== 'string') {\n reject('Hash must be a string');\n }\n publicSpace().get('#').get(hash).on((v: any, _k: string, _x: any, e: any) => {\n if (v) {\n e.off();\n callback && callback(v);\n resolve(v);\n }\n });\n });\n },\n\n /**\n * Store a file and return its hash\n * @param value\n * @returns {Promise}\n */\n async put(value: any) {\n const hash = await util.getHash(value);\n publicSpace().get('#').get(hash).put(value);\n return hash;\n }\n}","// @ts-nocheck\n\n/*jshint unused: false */\n`use strict`;\nimport util from './util';\nimport Attribute from './Attribute';\nimport Key from './Key';\n\nconst errorMsg = `Invalid message:`;\n\nclass ValidationError extends Error {}\n\n/**\n* Signed message object. Your friends can index and relay your messages, while others can still verify that they were signed by you.\n*\n* Fields: signedData, signer (public key) and signature.\n*\n* signedData has an author, signer, type, time and optionally other fields.\n*\n* signature covers the utf8 string representation of signedData. Since messages are digitally signed, users only need to care about the message signer and not who relayed it or whose index it was found from.\n*\n* signer is the entity that verified its origin. In other words: message author and signer can be different entities, and only the signer needs to use Iris.\n*\n* For example, a crawler can import and sign other people's messages from Twitter. Only the users who trust the crawler will see the messages.\n*\n* Constructor: creates a message from the param obj.signedData that must contain at least the mandatory fields: author, type and time.\n* @param obj\n*\n* @example\n* https://github.com/irislib/iris-lib/blob/master/__tests__/SignedMessage.js\n*\n* Verification message:\n* {\n* signedData: {\n* author: {name:'Alice', key:'ABCD1234'},\n* recipient: {\n* name: 'Bob',\n* email: ['bob@example.com', 'bob.saget@example.com'],\n* bitcoin: '1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa'\n* },\n* type: 'verification'\n* },\n* signer: 'ABCD1234',\n* signature: '1234ABCD'\n* }\n*/\nclass SignedMessage {\n signedData: any;\n pubKey: any;\n sig: any;\n\n constructor(obj: any) {\n this.signedData = obj.signedData;\n this.pubKey = obj.pubKey;\n if (obj.sig) {\n if (typeof obj.sig !== `string`) {\n throw new ValidationError(`SignedMessage signature must be a string`);\n }\n this.sig = obj.sig;\n this.getHash();\n }\n this._validate();\n }\n\n static _getArray(authorOrRecipient) {\n const arr = [];\n const keys = Object.keys(authorOrRecipient);\n for (let i = 0;i < keys.length;i++) {\n const type = keys[i];\n const value = authorOrRecipient[keys[i]];\n if (typeof value === `string`) {\n arr.push(new Attribute(type, value));\n } else { // array\n for (let j = 0;j < value.length;j++) {\n const elementValue = value[j];\n arr.push(new Attribute(type, elementValue));\n }\n }\n }\n return arr;\n }\n\n static _getIterable(authorOrRecipient) {\n return {\n *[Symbol.iterator]() {\n const keys = Object.keys(authorOrRecipient);\n for (let i = 0;i < keys.length;i++) {\n const type = keys[i];\n const value = authorOrRecipient[keys[i]];\n if (typeof value === `string`) {\n yield new Attribute(type, value);\n } else { // array\n for (let j = 0;j < value.length;j++) {\n const elementValue = value[j];\n yield new Attribute(type, elementValue);\n }\n }\n }\n }\n };\n }\n\n getAuthorIterable() {\n return SignedMessage._getIterable(this.signedData.author);\n }\n\n getRecipientIterable() {\n return SignedMessage._getIterable(this.signedData.recipient);\n }\n\n getAuthorArray() {\n return SignedMessage._getArray(this.signedData.author);\n }\n\n getRecipientArray() {\n return this.signedData.recipient ? SignedMessage._getArray(this.signedData.recipient) : [];\n }\n\n getSignerKeyID() {\n return this.pubKey; // hack until gun supports keyID lookups\n //return util.getHash(this.pubKey);\n }\n\n _validate() {\n if (!this.signedData) {throw new ValidationError(`${errorMsg} Missing signedData`);}\n if (typeof this.signedData !== `object`) {throw new ValidationError(`${errorMsg} signedData must be an object`);}\n const d = this.signedData;\n\n if (!d.type) {throw new ValidationError(`${errorMsg} Missing type definition`);}\n if (!d.author) {throw new ValidationError(`${errorMsg} Missing author`);}\n if (typeof d.author !== `object`) {throw new ValidationError(`${errorMsg} Author must be object`);}\n if (Array.isArray(d.author)) {throw new ValidationError(`${errorMsg} Author must not be an array`);}\n if (Object.keys(d.author).length === 0) {throw new ValidationError(`${errorMsg} Author empty`);}\n if (this.pubKey) {\n this.signerKeyHash = this.getSignerKeyID();\n }\n for (const attr in d.author) {\n const t = typeof d.author[attr];\n if (t !== `string`) {\n if (Array.isArray(d.author[attr])) {\n for (let i = 0;i < d.author[attr].length;i++) {\n if (typeof d.author[attr][i] !== `string`) {throw new ValidationError(`${errorMsg} Author attribute must be string, got ${attr}: [${d.author[attr][i]}]`);}\n if (d.author[attr][i].length === 0) {\n throw new ValidationError(`${errorMsg} author ${attr} in array[${i}] is empty`);\n }\n }\n } else {\n throw new ValidationError(`${errorMsg} Author attribute must be string or array, got ${attr}: ${d.author[attr]}`);\n }\n }\n if (attr === `keyID`) {\n if (t !== `string`) {throw new ValidationError(`${errorMsg} Author keyID must be string, got ${t}`);}\n if (this.signerKeyHash && d.author[attr] !== this.signerKeyHash) {throw new ValidationError(`${errorMsg} If message has a keyID author, it must be signed by the same key`);}\n }\n }\n if (d.recipient) {\n if (typeof d.recipient !== `object`) {throw new ValidationError(`${errorMsg} Recipient must be object`);}\n if (Array.isArray(d.recipient)) {throw new ValidationError(`${errorMsg} Recipient must not be an array`);}\n if (Object.keys(d.recipient).length === 0) {throw new ValidationError(`${errorMsg} Recipient empty`);}\n for (const attr in d.recipient) {\n const t = typeof d.recipient[attr];\n if (t !== `string`) {\n if (Array.isArray(d.recipient[attr])) {\n for (let i = 0;i < d.recipient[attr].length;i++) {\n if (typeof d.recipient[attr][i] !== `string`) {throw new ValidationError(`${errorMsg} Recipient attribute must be string, got ${attr}: [${d.recipient[attr][i]}]`);}\n if (d.recipient[attr][i].length === 0) {\n throw new ValidationError(`${errorMsg} recipient ${attr} in array[${i}] is empty`);\n }\n }\n } else {\n throw new ValidationError(`${errorMsg} Recipient attribute must be string or array, got ${attr}: ${d.recipient[attr]}`);\n }\n }\n }\n }\n if (!(d.time || d.timestamp)) {throw new ValidationError(`${errorMsg} Missing time field`);}\n\n if (!Date.parse(d.time || d.timestamp)) {throw new ValidationError(`${errorMsg} Invalid time field`);}\n\n if (d.type === `rating`) {\n if (isNaN(d.rating)) {throw new ValidationError(`${errorMsg} Invalid rating`);}\n if (isNaN(d.maxRating)) {throw new ValidationError(`${errorMsg} Invalid maxRating`);}\n if (isNaN(d.minRating)) {throw new ValidationError(`${errorMsg} Invalid minRating`);}\n if (d.rating > d.maxRating) {throw new ValidationError(`${errorMsg} Rating is above maxRating`);}\n if (d.rating < d.minRating) {throw new ValidationError(`${errorMsg} Rating is below minRating`);}\n if (typeof d.context !== `string` || !d.context.length) {throw new ValidationError(`${errorMsg} Rating messages must have a context field`);}\n }\n\n if (d.type === `verification` || d.type === `unverification`) {\n if (d.recipient.length < 2) {throw new ValidationError(`${errorMsg} At least 2 recipient attributes are needed for a connection / disconnection. Got: ${d.recipient}`);}\n }\n\n return true;\n }\n\n isPositive() {\n return this.signedData.type === `rating` && this.signedData.rating > (this.signedData.maxRating + this.signedData.minRating) / 2;\n }\n\n isNegative() {\n return this.signedData.type === `rating` && this.signedData.rating < (this.signedData.maxRating + this.signedData.minRating) / 2;\n }\n\n isNeutral() {\n return this.signedData.type === `rating` && this.signedData.rating === (this.signedData.maxRating + this.signedData.minRating) / 2;\n }\n\n /**\n * @param {Object} key Gun.SEA keypair to sign the message with\n */\n async sign(key) {\n this.sig = await Key.sign(this.signedData, key);\n this.pubKey = key.pub;\n await this.getHash();\n return true;\n }\n\n /**\n * Create an iris message. SignedMessage time is automatically set. If signingKey is specified and author omitted, signingKey will be used as author.\n * @param {Object} signedData message data object including author, recipient and other possible attributes\n * @param {Object} signingKey optionally, you can set the key to sign the message with\n * @returns {Promise} message\n */\n static async create(signedData, signingKey) {\n if (!signedData.author && signingKey) {\n signedData.author = {keyID: Key.getId(signingKey)};\n }\n signedData.time = signedData.time || (new Date()).toISOString();\n const m = new SignedMessage({signedData});\n if (signingKey) {\n await m.sign(signingKey);\n }\n return m;\n }\n\n static createVerification(signedData, signingKey) {\n signedData.type = `verification`;\n return SignedMessage.create(signedData, signingKey);\n }\n\n static createRating(signedData, signingKey) {\n signedData.type = `rating`;\n signedData.context = signedData.context || `iris`;\n signedData.maxRating = signedData.maxRating || 10;\n signedData.minRating = signedData.minRating || -10;\n return SignedMessage.create(signedData, signingKey);\n }\n\n getAuthor(index) {\n for (const a of this.getAuthorIterable()) {\n if (a.isUniqueType()) {\n return index.getContacts(a);\n }\n }\n }\n\n getRecipient(index) {\n if (!this.signedData.recipient) {\n return undefined;\n }\n for (const a of this.getRecipientIterable()) {\n if (a.isUniqueType()) {\n return index.getContacts(a);\n }\n }\n }\n\n /**\n * @returns {string} base64 sha256 hash of message\n */\n async getHash() {\n if (this.sig && !this.hash) {\n this.hash = await util.getHash(this.sig);\n }\n return this.hash;\n }\n\n getId() {\n return this.getHash();\n }\n\n static async fromSig(obj) {\n if (!obj.sig) {\n throw new Error(`Missing signature in object:`, obj);\n }\n if (!obj.pubKey) {\n throw new Error(`Missing pubKey in object:`);\n }\n //const signedData = await Key.verify(obj.sig, obj.pubKey); // disable sig verification while migrating to new gun :(\n const signedData = JSON.parse(obj.sig.slice(4)).m;\n const o = {signedData, sig: obj.sig, pubKey: obj.pubKey};\n return new SignedMessage(o);\n }\n\n /**\n * @return {boolean} true if message signature is valid. Otherwise throws ValidationError.\n */\n async verify() {\n if (!this.pubKey) {\n throw new ValidationError(`${errorMsg} SignedMessage has no .pubKey`);\n }\n if (!this.sig) {\n throw new ValidationError(`${errorMsg} SignedMessage has no .sig`);\n }\n this.signedData = await Key.verify(this.sig, this.pubKey);\n if (!this.signedData) {\n throw new ValidationError(`${errorMsg} Invalid signature`);\n }\n if (this.hash) {\n if (this.hash !== (await util.getHash(this.sig))) {\n throw new ValidationError(`${errorMsg} Invalid message hash`);\n }\n } else {\n this.getHash();\n }\n return true;\n }\n\n /**\n * @returns {string}\n */\n serialize() {\n return {sig: this.sig, pubKey: this.pubKey};\n }\n\n toString() {\n return JSON.stringify(this.serialize());\n }\n\n /**\n * @returns {Promise}\n */\n static async deserialize(s) {\n return SignedMessage.fromSig(s);\n }\n\n static async fromString(s) {\n return SignedMessage.fromSig(JSON.parse(s));\n }\n\n static async setReaction(gun, msg, reaction) {\n const hash = await msg.getHash();\n gun.get(`reactions`).get(hash).put(reaction);\n gun.get(`reactions`).get(hash).put(reaction);\n gun.get(`messagesByHash`).get(hash).get(`reactions`).get(this.rootContact.value).put(reaction);\n gun.get(`messagesByHash`).get(hash).get(`reactions`).get(this.rootContact.value).put(reaction);\n }\n}\n\nexport default SignedMessage;\n","/*eslint no-useless-escape: \"off\", camelcase: \"off\" */\n\nimport Gun from 'gun';\nimport 'gun/sea';\n\nimport session from './session';\nimport peers from './peers';\nimport util from './util';\nimport local from './local';\nimport global from './global';\nimport publicState from './public';\nimport group from './group';\nimport electron from './electron';\nimport privateState from './private';\nimport staticState from './static';\nimport notifications from './notifications';\n\nimport SignedMessage from './SignedMessage';\nimport Channel from './Channel';\nimport Node from './Node';\n\nexport default {\n local,\n global,\n\n group,\n public: publicState,\n private: privateState,\n static: staticState,\n electron,\n peers,\n session,\n util,\n notifications,\n\n SEA: Gun.SEA,\n Gun,\n SignedMessage,\n Channel,\n Node,\n};"],"names":["u","yson","sI","setTimeout","turn","setImmediate","value","s","n","parseFloat","isNaN","trim","parseAsync","text","done","revive","M","ctx","i","l","length","up","parse","b","tmp","j","w","c","end","indexOf","a","slice","sl","JSON","at","Array","push","ai","pop","e","stringifyAsync","data","replacer","space","d","ify","add","k","stringify","as","toJSON","ok","Object","keys","sort","window","YSON","module","USE","arg","req","require","R","mod","path","exports","p","split","toString","replace","MODULE","String","random","charAt","Math","floor","match","t","o","=","hash","charCodeAt","f","sT","T","has","prototype","hasOwnProperty","plain","constructor","call","empty","MessageChannel","port1","onmessage","q","port2","postMessage","check","performance","now","Date","hold","poll","each","S","L","r","splice","onto","tag","to","this","_","next","be","off","the","last","back","on","v","Infinity","State","N","drift","D","NI","is","soul","opt","dup","max","age","id","dt","track","it","was","drop","ed","console","STAT","cb","lack","clearTimeout","err","Gun","$","create","version","chain","valid","state","ask","universe","msg","out","gun","DBG","text_rand","put","acks","fire","stop","crack","root","ack","get","uc","ua","nts","NTS","ue","faith","miss","latch","hatch","CT","all","stun","nl","pk","nj","kl","node","states","ni","pd","ERR","cut","key","val","ham","C","graph","vertex","state_is","known","MD","Hf","aid","ph","#","@",".",":",">","map","pa","pm","state_ify","CF","once","log","F","gk","go","ram","ga","%","FOO","g","peers","forEach","url","obj_each","from","uuid","apply","arguments","join","GUN","only","yes","link","cat","$$","tat","echo","pass","sat","lex","unlink","change","linked","ev","sub","in","obj_has","via","VIA","seen","$$$","any","lat","rid","cache","jam","eve","super","wait","test","not","run","v2020","ran","todo","ref","walk","name","reverse","resolve","noop","eas","act","subs","nix","none","one","neat","set","item","json","sucks","mesh","gap","memory","pack","puff","dup_check","dup_track","hear","raw","peer","say","dam","SH","P","m","flush","batch","tail","send","wire","queue","ash","h","hp","leap","yo","near","SI","hd","loop","SMIA","sorta","ss","$put","meta","y","way","yh","yr","ps","pl","wr","pid","yp","ST","/","res","hi","met","bye","time","close","souls","SUBS","##","Mesh","WebSocket","env","websocket","webkitWebSocket","mozWebSocket","open","doc","document","onclose","reconnect","onerror","onopen","defer","retry","tried","hidden","store","localStorage","setItem","removeItem","getItem","lg","disk","size","prefix","file","DEP","warn","Type","fn","bi","Boolean","num","list_is","list","slit","A","B","obj_map","index","obj","boj","del","obj_is","copy","x","ll","lle","ii","getTime","fn_is","Val","text_is","bi_is","num_is","rel","rel_","obj_put","Node","soul_","text_random","obj_del","obj_copy","N_","Graph","nf","obj_empty","arr","shell","concat","prev","invalid","dot","slash","serve","dir","writeHead","Content-Type","fs","createReadStream","readFile","pipe","setHeader","js","readFileSync","__dirname","readdir","rs","socket","server","route","Radix","radix","unit","kk","__","debug","rap","pre","rev","no","branch","start","pt","tree","error","object","fromCharCode","Radisk","ename","encodeURIComponent","until","chunk","code","jsonify","timediate","save","read","find","sf","mix","sml","sm","bad","compare","tags","st","Q","write","sto","sa","sal","ne","RPC","RWC","rad","force","wd","wa","wp","wf","count","wfc","limit","ceil","SC","wf1","wf2","both","wf3","hub","wf4","wf5","wfd","enc","encode","ws","range","rf","info","rgl","rg","rr","chunks","parsed","more","rl","rm","rpg","rpl","rpa","radec","rpd","decode","rp","init","drain","found","require$$0","decodeURIComponent","require$$1","require$$2","require$$3","Store","puts","writeFile","oldPath","newPath","rename","readStream","writeStream","createWriteStream","move","toUpperCase","existsSync","mkdirSync","params","cbs","readdirSync","TESTING","radisk","process","RAD","dare","esc","sp","RPS","spd","sps","sg","atom","va","lastIndexOf","sgm","sgr","sgi","stats","statg","ve","so","ha","sgp","sgd","rfs","AWS","opts","s3","Bucket","bucket","Key","Body","putObject","getObject","cba","listObjectsV2","stack","IsTruncated","ContinuationToken","NextContinuationToken","AWS_S3_BUCKET","AWS_SDK_NOT_INSTALLED","region","AWS_REGION","accessKeyId","AWS_ACCESS_KEY_ID","secretAccessKey","secret","AWS_SECRET_ACCESS_KEY","fakes3","endpoint","sslEnabled","config","Config","S3","BINARY_TYPES","GUID","kStatusCode","Symbol","kWebSocket","EMPTY_BUFFER","Buffer","alloc","NOOP","totalLength","target","allocUnsafe","offset","buf","_mask","source","mask","output","_unmask","buffer","toArrayBuffer","byteLength","byteOffset","toBuffer","readOnly","isBuffer","ArrayBuffer","isView","bufferUtil","bu","BufferUtil","[object Object]","unmask","kDone","kRun","concurrency","pending","jobs","job","shift","TRAILER","kPerMessageDeflate","kTotalLength","kCallback","kBuffers","kError","zlibLimiter","options","isServer","maxPayload","_maxPayload","_options","_threshold","undefined","threshold","_isServer","_deflate","_inflate","Limiter","concurrencyLimit","extensionName","serverNoContextTakeover","server_no_context_takeover","clientNoContextTakeover","client_no_context_takeover","serverMaxWindowBits","server_max_window_bits","clientMaxWindowBits","client_max_window_bits","configurations","normalizeParams","acceptAsServer","acceptAsClient","callback","Error","offers","accepted","response","Number","isInteger","TypeError","fin","_decompress","result","_compress","zlib","createInflateRaw","zlibInflateOptions","windowBits","Z_DEFAULT_WINDOWBITS","inflateOnError","inflateOnData","_readableState","endEmitted","reset","createDeflateRaw","zlibDeflateOptions","deflateOnData","Z_SYNC_FLUSH","RangeError","removeListener","isValidStatusCode","_isValidUTF8","len","isValidUTF8","Validation","Writable","binaryType","extensions","_binaryType","_extensions","_bufferedBytes","_buffers","_compressed","_payloadLength","_fragmented","_masked","_fin","_opcode","_totalPayloadLength","_messageLength","_fragments","_state","_loop","encoding","startLoop","dst","Uint8Array","getInfo","getPayloadLength16","getPayloadLength64","getMask","getData","consume","compressed","PerMessageDeflate","haveLength","readUInt16BE","readUInt32BE","pow","controlMessage","decompress","dataMessage","er","messageLength","fragments","emit","ErrorCtor","message","statusCode","errorCode","captureStackTrace","randomFillSync","applyMask","Sender","_socket","_firstFragment","_deflating","_queue","merge","payloadLength","opcode","rsv1","writeUInt16BE","writeUInt32BE","enqueue","doClose","sendFrame","frame","doPing","doPong","perMessageDeflate","binary","compress","dispatch","destroyed","dequeue","Reflect","cork","uncork","Event","type","MessageEvent","CloseEvent","reason","wasClean","_closeFrameReceived","_closeFrameSent","OpenEvent","ErrorEvent","listener","onMessage","onClose","onError","onOpen","method","_listener","listeners","tokenChars","dest","elem","format","extension","isArray","values","header","paramName","mustUnescape","isEscaping","inQuotes","SyntaxError","token","randomBytes","createHash","URL","addEventListener","removeEventListener","require$$4","require$$5","require$$6","readyStates","protocolVersions","EventEmitter","address","protocols","_closeCode","_closeMessage","_closeTimer","_protocol","_readyState","CONNECTING","_receiver","_sender","_bufferedAmount","_redirects","initAsClient","protocolVersion","followRedirects","maxRedirects","createConnection","socketPath","hostname","protocol","timeout","host","port","includes","parsedUrl","_url","href","isUnixSocket","pathname","emitErrorAndClose","isSecure","defaultPort","https","http","tlsConnect","netConnect","startsWith","headers","Sec-WebSocket-Version","Sec-WebSocket-Key","Connection","Upgrade","search","handshakeTimeout","offer","origin","Origin","username","password","auth","parts","_originalUnixSocket","_originalSecure","_originalHostOrSocketPath","entries","toLowerCase","isSameHost","authorization","cookie","_req","abortHandshake","aborted","location","addr","abort","head","readyState","upgrade","digest","update","serverProt","protList","protError","secWebSocketExtensions","extensionNames","accept","setSocket","bufferedAmount","_writableState","receiver","Receiver","receiverOnConclude","receiverOnDrain","receiverOnError","receiverOnMessage","receiverOnPing","receiverOnPong","setNoDelay","unshift","socketOnClose","socketOnData","socketOnEnd","socketOnError","OPEN","CLOSED","cleanup","removeAllListeners","CLOSING","errorEmitted","destroy","bind","ping","sendAfterClose","pong","defineProperty","enumerable","property","emitClose","net","connect","servername","isIP","tls","stream","nextTick","resume","receiverOnFinish","finished","pause","Duplex","duplexOnEnd","duplexOnError","listenerCount","keyRegex","writable","STATUS_CODES","Content-Length","str","createWebSocketStream","resumeOnReceiverDrain","terminateOnDestroy","duplex","autoDestroy","objectMode","writableObjectMode","_destroy","called","terminate","_final","_read","needDrain","_write","Server","handleProtocols","clientTracking","verifyClient","noServer","backlog","_server","createServer","body","listen","emitConnection","_removeListeners","event","addListeners","listening","handleUpgrade","clients","Set","client","shouldHandle","secure","authorized","encrypted","verified","completeUpgrade","readable","delete","web","sites","heart","self","SEA","btoa","global","atob","SeaArray","assign","padStart","SafeBuffer","props","input","bytes","byte","parseInt","words","Uint16Array","dec","fill","reduce","ret","api","Promise","rej","crypto","msCrypto","subtle","webkitSubtle","TextEncoder","TextDecoder","getRandomValues","Crypto","WebCrypto","ossl","directory","shim","pbkdf2","iter","ks","ecdsa","pair","namedCurve","sign","ecdh","jwk","pub","kty","crv","ext","key_ops","keyToJwk","keyBytes","alg","recall","validity","hook","async","__shim","sha","work","salt","epub","Function","rsha","importKey","deriveBits","iterations","throw","ecdhSubtle","generateKey","then","priv","exportKey","privateKey","publicKey","dh","epriv","I","what","how","why","verify","sig","slow_leak","fallback","fall_verify","knownKeys","O","unpack","fall_soul","fall_key","fall_val","fall_state","sha256hash","combo","jwkKey","aeskey","encrypt","rand","iv","ct","aes","decrypt","bufiv","bufct","tagLength","pubKeyData","keysToEcdhJwk","public","privKeyData","privKey","derivedBits","rawBits","derivedKey","certify","certificants","policy","authority","certificant","expiry","readPolicy","writePolicy","block","blacklist","ban","readBlock","writeBlock","rb","wb","keyid","pb","sha1","sha1hash","User","user","args","alias","filter","ing","pubs","already","leave","proof","sea","ek","sS","sessionStorage","obj_ify","tries","half","lol","upt","shuffle","z","remember","plugin","proxy","Proxy","DANGER","alive","gunRoot","authRecall","trust","theirPubkey","grant","sec","own","hexStr","base64","substring","hexToBase64","link_is","certificate","cert","packed","~","pubcut","stringy","fl","shuffle_attack","axe","AXE","GET","fall","maps","REF","Map","LEX","sift","skip","stay","urls","mob","asked","lS","loc","nav","navigator","onLine","fetch","catch","multicast","MULTICAST","udp","dgram","createSocket","reuseAddr","exclusive","setBroadcast","setMulticastTTL","addMembership","setInterval","sep","os","uptime","cpuUsage","memoryUsage","totalmem","freemem","loadavg","cpus","W","over","cpu","LOG","func","inThrottle","context","inDebounce","newObj","isNode","userAgent","isElectron","animals","adjectives","gunOnceDefined","_k","_a","gunAsAnotherUser","gun2","getHash","_context","_this","base64ToHex","capitalize","generateName","hex","getCaret","el","selectionStart","selection","focus","createRange","re","createTextRange","rc","duplicate","moveToBookmark","getBookmark","setEndPoint","injectCss","getElementById","sheet","createElement","innerHTML","prepend","getUrlParameter","sParam","sParams","sParameterName","sURLVariables","formatTime","date","toLocaleTimeString","timeStyle","formatDate","toLocaleString","dateStyle","getDaySeparatorText","dateStr","nowStr","toLocaleDateString","dayDifference","round","weekday","getProfileLink","truncateString","cls","parent","setAttribute","appendChild","isMobile","vendor","substr","throttle","debounce","delay","sample","sampleSize","temp","shuffled","min","omit","ELECTRON_GUN_URL","db","indexedDB","onupgradeneeded","createObjectStore","onsuccess","tx","transaction","objectStore","onabort","RindexedDB","DEFAULT_PEERS","https://gun-rs.iris.to/gun","https://gun-us.herokuapp.com/gun","is_localhost_but_not_dev","endsWith","enabled","urlRegex","visibility","session","getKey","encryptedUrl","encryptedUrlHash","publicState","lastSeen","toISOString","remove","disconnect","peerFromGun","getSaved","util","defaults","isMixedContent","disable","predicate","connectToLocalElectron","maxConnectedPeers","_this2","checkGunPeerCount","peersFromGun","connectedPeers","unconnectedPeers","addedToGun","_this3","_this4","myOpts","currentUser","UNIQUE_ID_VALIDATORS","email","bitcoin","bitcoin_address","ip","ipv6","gpg_fingerprint","gpg_keyid","google_oauth2","tel","phone","keyID","account","Attribute","guessTypeOf","getUuid","getUniqueIdValidators","isUniqueType","_proto","equals","uri","DEFAULT_PERMISSIONS","admin","Channel","myGroupSecret","chatLink","useChatLink","participants","addParticipant","founder","getChatLinks","subscribe","putDirect","getMyGroupSecret","getMySecretUuid","onTheirDirect","theirSecretUuids","theirGroupSecrets","onTheir","hasAdmin","inviter","participantsChanged","saved","chatWith","channelId","sharedSecret","linkId","sharedKey","encryptedChatRequest","channelRequestId","getTheirSecretUuid","getTheirGroupSecret","changeMyGroupSecret","mute","participant","secrets","ourSecretChannelIds","theirSecretChannelIds","mySecretUuid","_context4","mySecret","mySecretHash","getCurrentParticipants","getParticipants","getParticipantsCallbackId","getParticipantsCallbacks","getId","getSecret","_context5","getOurSecretChannelId","_context6","getTheirSecretChannelId","_context7","getChannels","listenToChatLinks","keypair","_context9","getMyChatLinks","handleChannel","ourSecretChannelId","_context8","encryptedChatId","chatId","_context10","_context11","getMessages","_context12","_this5","theirSecretChannelId","messageReceived","userState","_context13","selfAuthored","messages","_context14","decrypted","getLatestMsg","callbackIfLatest","_this6","latest","onMy","setMyMsgsLastSeenTime","getMyMsgsLastSeenTime","_this7","myMsgsLastSeenTime","getTheirMsgsLastSeenTime","_this8","theirMsgsLastSeenTime","removeParticipant","permissions","_context21","_this9","directSubscriptions","_onTheirDirectFromUser","groupSubscriptions","_onTheirGroupFromUser","_context22","_context23","putGroup","_context25","_context26","onGroup","onDirect","onMyGroup","onTheirGroup","onMyDirect","_context33","_context32","_this10","_context31","_context35","_context34","hasWritePermission","_context38","_this11","_context37","_context40","_context39","_this12","subscription","_context42","theirSecretUuid","_b","_this13","_context41","_context44","_context43","_this14","setTyping","isTyping","setTypingTimeout","_this15","getTyping","typing","_this16","getTypingTimeouts","addChatButton","label","channelOptions","channel","box","btn","getChatBox","getSimpleLink","urlRoot","_opts","_context46","chatLinks","chatLinkSubscriptions","links","channels","formatChatLink","_this17","encPub","requestId","_context45","createChatLink","_context47","sharedKeyString","encryptedSharedKey","ownerSecret","ownerEncryptedSharedKey","minimized","chatBox","minimize","innerText","stopPropagation","headerText","onlineIndicator","nameEl","openChatBtn","typingIndicator","inputWrapper","textArea","sendBtn","_this18","getActivity","status","isActive","querySelectorAll","getAttribute","lastActive","indicator","msgEl","parentElement","msgClass","msgContent","children","insertBefore","firstChild","insertAdjacentElement","scrollTop","scrollHeight","setActivity","keyCode","preventDefault","content","caret","shiftKey","activity","irisActivityStatus","setActivityTimeout","timerUpdate","pubKey","activityDate","isOnline","_context48","_context51","_context50","_context49","removeGroupChatLink","removePrivateChatLink","deleteChannel","_context52","deleteGroup","_context53","1","_dereq_","scheduleDrain","draining","Mutation","MutationObserver","WebKitMutationObserver","observer","element","createTextNode","observe","characterData","scriptEl","onreadystatechange","parentNode","removeChild","documentElement","oldQueue","task","2","immediate","INTERNAL","handlers","REJECTED","FULFILLED","PENDING","resolver","outcome","safelyResolveThenable","QueueItem","promise","onFulfilled","onRejected","callFulfilled","otherCallFulfilled","callRejected","otherCallRejected","unwrap","returnValue","reject","getThen","thenable","onSuccess","tryCatch","iterable","resolved","allResolver","outValue","race","3","4","_typeof","iterator","idb","webkitIndexedDB","mozIndexedDB","OIndexedDB","msIndexedDB","getIDB","createBlob","properties","Blob","builder","BlobBuilder","MSBlobBuilder","MozBlobBuilder","WebKitBlobBuilder","append","getBlob","Promise$1","executeCallback","executeTwoCallbacks","errorCallback","normalizeKey","getCallback","supportsBlobs","dbContexts","_deferReadiness","dbInfo","dbContext","deferredOperation","deferredOperations","dbReady","_advanceReadiness","_rejectReadiness","_getConnection","upgradeNeeded","forages","dbArgs","openreq","storeName","oldVersion","ex","newVersion","onversionchange","_getOriginalConnection","_getUpgradedConnection","_isUpgradeNeeded","defaultVersion","isNewStore","objectStoreNames","contains","isUpgrade","incVersion","_decodeBlob","encodedBlob","bin","_binStringToArrayBuffer","_isEncodedBlob","__local_forage_encoded_blob","_fullyReady","_initReady","_dbInfo","createTransaction","mode","retries","forage","_tryReconnect","asyncStorage","_driver","_initStorage","ready","initPromises","ignoreErrors","_defaultConfig","_support","isSafari","openDatabase","platform","hasFetch","IDBKeyRange","isIndexedDBValid","iterate","openCursor","iterationNumber","cursor","txn","blob","oncomplete","matchedChrome","matchedEdge","_checkBlobSupportWithoutCaching","_checkBlobSupport","blobSupport","reader","FileReader","onloadend","readAsBinaryString","clear","advanced","openKeyCursor","advance","dropInstance","currentConfig","isCurrentDb","dbPromise","deleteObjectStore","_forage2","deleteDatabase","onblocked","BASE_CHARS","BLOB_TYPE_PREFIX_REGEX","SERIALIZED_MARKER_LENGTH","TYPE_SERIALIZED_MARKER_LENGTH","toString$1","stringToBuffer","serializedString","encoded1","encoded2","encoded3","encoded4","bufferLength","bufferToString","base64String","localforageSerializer","serialize","valueType","marker","fileReader","onload","SERIALIZED_MARKER","readAsArrayBuffer","deserialize","blobType","matcher","Int8Array","Uint8ClampedArray","Int16Array","Int32Array","Uint32Array","Float32Array","Float64Array","createDbTable","executeSql","tryExecuteSql","sqlStatement","SYNTAX_ERR","results","rows","_setItem","retriesLeft","originalValue","serializer","sqlError","QUOTA_ERR","getAllStoreNames","storeNames","webSQLStorage","dbInfoPromise","description","operationInfo","dropTable","operations","_getKeyPrefix","defaultConfig","keyPrefix","localStorageWrapper","checkIfLocalStorageThrows","isLocalStorageValid","keyPrefixLength","itemKey","array","searchElement","DefinedDrivers","DriverSupport","DefaultDrivers","INDEXEDDB","WEBSQL","LOCALSTORAGE","DefaultDriverOrder","OptionalDriverMethods","LibraryMethods","DefaultConfig","driver","callWhenReady","localForageInstance","libraryMethod","_args","extend","_key","localforage_js","LocalForage","driverTypeKey","instance","Constructor","_classCallCheck","driverName","defineDriver","_config","_driverSet","_initDriver","_ready","_wrapLibraryMethodsWithReady","setDriver","driverObject","complianceError","driverMethods","driverMethodName","methodNotImplementedFactory","methodName","_i","_len","optionalDriverMethod","configureMissingMethods","setDriverSupport","support","getDriver","getDriverPromise","getSerializer","serializerPromise","drivers","supportedDrivers","_getSupportedDrivers","setDriverToConfig","extendSelfWithDriver","_extend","oldDriverSetDone","currentDriverIndex","driverPromiseLoop","initDriver","supports","libraryMethodsAndProperties","createInstance","notInLocalForage","localForage","local","loaded","loadLocalForage","_context3","newResult","_context2","on_subscriptions","_loop3","map_subscriptions","_loop2","existing","new_node","saveLocalForage","doCallbacks","returnIfUndefined","counter","blockedUsers","isBlocked","_v","callbacks","groupName","groupNode","follows","requestAnimationFrame","isFollowing","userSpace","sum","_cached_map","cached","cacheKey","myEvent","_cached_on","_cached_count","_cached_fn","callbackId","myCallbacks","loginTime","unseenMsgsTotal","unseenNotificationCount","webPushSubscriptions","desktopNotificationsEnabled","Notification","permission","publicVapidKey","urlBase64ToUint8Array","repeat","rawData","outputArray","_subscribe","reg","pushManager","userVisibleOnly","applicationServerKey","addWebPushSubscription","_subscribeToWebPush","serviceWorker","getRegistration","active","getSubscription","addWebPushSubscriptionsToChats","channelIds","privateState","_addWebPushSubscription","saveToGun","myKey","_getWebPushSubscriptions","getEpub","getNotificationText","_getNotificationText","notification","profile","action","changeUnseenNotificationCount","_sendIrisNotification","recipient","_sendWebPushNotification","subscriptions","title","payload","content-type","_ret","notifyMsg","onClick","shouldNotify","timeObj","visibilityState","notificationSetting","getMyName","participantProfiles","icon","silent","onclick","sendWebPushNotification","subscribeToIrisNotifications","notificationsSeenTime","notificationsShownTime","setNotificationsShownTime","alreadyHave","group","getPubKey","encryptedNotification","sendIrisNotification","changeChatUnseenCount","chat","chatNode","unseen","subscribeToWebPush","getWebPushSubscriptions","removeSubscription","getTag","isString","isNumber","isObject","isDefined","isBlank","hasOwn","KeyStore","_keys","_keyMap","totalWeight","createKey","weight","keyId","src","getFn","createKeyPath","createKeyId","INVALID_KEY_WEIGHT_VALUE","isCaseSensitive","includeScore","shouldSort","sortFn","score","idx","includeMatches","findAllMatches","minMatchCharLength","distance","useExtendedSearch","deepGet","isObjectLike","isBoolean","baseToString","ignoreLocation","ignoreFieldNorm","fieldNormWeight","SPACE","FuseIndex","norm","mantissa","numTokens","isCreated","setIndexRecords","docs","records","_keysMap","docIndex","_addString","_addObject","record","keyIndex","subRecords","nestedArrIndex","subRecord","createIndex","myIndex","setKeys","setSources","computeScore$1","pattern","errors","currentLocation","expectedLocation","accuracy","proximity","abs","createPatternAlphabet","char","BitapSearch","addChunk","startIndex","alphabet","remainder","isMatch","indices","allIndices","totalScore","hasMatches","patternAlphabet","patternLen","textLen","currentThreshold","bestLocation","computeMatches","matchMask","lastBitArr","finalScore","binMax","binMin","binMid","finish","bitArr","charMatch","matchmask","convertMaskToIndices","BaseMatch","getMatch","multiRegex","singleRegex","exp","matches","FuzzyMatch","_bitapSearch","searchIn","IncludeMatch","searchers","searchersLen","SPACE_RE","MultiMatchSet","registeredSearchers","createSearcher","searcherClass","condition","isExpression","query","convertToExplicit","$and","auto","isQueryPath","isPath","isLeaf","LOGICAL_SEARCH_INVALID_QUERY_FOR_KEY","searcher","operator","transformMatches","refIndex","transformScore","Fuse","_keyStore","setCollection","_docs","_myIndex","removeAt","_searchStringList","_searchObjectList","_searchLogical","EPSILON","computeScore","transformers","transformer","expression","evaluate","_findMatches","getValueForItemAtKeyId","resultMap","expResults","parseIndex","parseQuery","register","queryItem","isMultiMatch","isSingleMatch","numMatches","qLen","pLen","myName","latestChatLink","onlineTimeout","ourActivity","noFollows","noFollowers","searchIndex","initCalled","electron","searchableItems","getExtendedFollowsCalled","DEFAULT_FOLLOW","DEFAULT_SETTINGS","openAtLogin","minimizeOnClose","enableWebtorrent","enablePublicPeerDiscovery","autoplayWebtorrent","localStorageKey","login","autologin","loginAsNewUser","clearIndexedDB","updateSearchIndex","taskQueue","saveSearchResult","followDistance","followerCount","followers","addFollow","follower","updateNoFollows","updateNoFollowers","removeFollow","getExtendedFollows","maxDepth","currentDepth","followedKey","getSearchIndex","setOurOnlineStatus","activeRoute","setActive","notifications","updateGroups","shouldRefresh","addChannel","settings","reload","autofollow","logOut","_reg$active","unsubscribe","localforage","r1","r2","r1done","r2done","getMyChatLink","myPeerUrl","shareMyPeerUrl","myIp","newChannel","latestTime","theirMsgsLastSeenDate","processMessage","myLastSeenTime","online","theirLastActiveTime","isDarkMode","matchMedia","photo","hue","color","inviteLinks","onClickNotification","messageIds","invite","subscribeToMsgs","subscribed","publicSpace","_x","getActiveKey","datadir","keyfile","privKeyFile","fromString","generate","newKey","writeFileSync","chmodSync","getDefault","getActivePub","setActiveKey","errorMsg","ValidationError","SignedMessage","signedData","_validate","_getArray","authorOrRecipient","_getIterable","elementValue","getAuthorIterable","author","getRecipientIterable","getAuthorArray","getRecipientArray","getSignerKeyID","attr","signerKeyHash","timestamp","rating","maxRating","minRating","isPositive","isNegative","isNeutral","signingKey","createVerification","createRating","getAuthor","getContacts","getRecipient","fromSig","setReaction","reaction","rootContact","private","static","staticState"],"mappings":"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UACA,aACA,aACA,WACA,OACA,YACA,QACA,YACA,MACA,SACA,cACA,QACA,SACA,MACA,SACA,OACA,QACA,UACA,WACA,UACA,YACA,OACA,SACA,SACA,YACA,OACA,QACA,WACA,MACA,UACA,SACA,WACA,OACA,YACA,SACA,OACA,QACA,YACA,SACA,UACA,MACA,QACA,WACA,MACA,MACA,SACA,SACA,SACA,QACA,UACA,OACA,WACA,OACA,MACA,aACA,OACA,MACA,OACA,WACA,YACA,UACA,QACA,SACA,SACA,UACA,OACA,WACA,QACA,SACA,UACA,cACA,SACA,OACA,UACA,aACA,OACA,QACA,UACA,UACA,UACA,OACA,UACA,OACA,WACA,QACA,UACA,eACA,WACA,SACA,QACA,WACA,cACA,QACA,SACA,SACA,SACA,SACA,MACA,YACA,aACA,WACA,aACA,OACA,OACA,QACA,MACA,QACA,UACA,UACA,WACA,OACA,QACA,UACA,QACA,UACA,SACA,SACA,OACA,SACA,QACA,UACA,SACA,OACA,QACA,WACA,OACA,QACA,WACA,SACA,SACA,UACA,WACA,SACA,WACA,SACA,YACA,SACA,WACA,aACA,UACA,OACA,SACA,OACA,cACA,OACA,UACA,WACA,SACA,QACA,WACA,OACA,QACA,OACA,SACA,UACA,OACA,cACA,SACA,UACA,UACA,YACA,OACA,UACA,QACA,MACA,KACA,QACA,UACA,WACA,SACA,aACA,YACA,UACA,UACA,UACA,UACA,QACA,WACA,MACA,SACA,OACA,WACA,UACA,YACA,WACA,OACA,YACA,WACA,SACA,QACA,UACA,YACA,SACA,OACA,SACA,QACA,SACA,SACA,SACA,UACA,MACA,cACA,QACA,WACA,UACA,aACA,aACA,SACA,OACA,UACA,YACA,WACA,aACA,SACA,UACA,UACA,WACA,WACA,QACA,QACA,QACA,SACA,WACA,aACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,OACA,UACA,SACA,YACA,QACA,WACA,WACA,WACA,QACA,QACA,WACA,UACA,OACA,QACA,YACA,YACA,OACA,QACA,QACA,YACA,UACA,UACA,OACA,SACA,OACA,QACA,SACA,OACA,WACA,SACA,QACA,OACA,SACA,SACA,gBACA,QACA,SACA,QACA,OACA,UACA,UACA,SACA,OACA,UACA,SACA,QACA,UACA,YACA,UACA,aACA,WACA,OACA,YACA,SACA,aACA,OACA,OACA,UACA,MACA,QACA,SACA,MACA,SACA,UACA,MACA,SACA,SACA,QACA,WACA,QACA,QACA,MACA,QACA,QACA,MACA,WAGIC,GAAa,CACjB,UACA,MACA,WACA,MACA,QACA,WACA,QACA,OACA,UACA,QACA,SACA,OACA,UACA,UACA,YACA,SACA,OACA,QACA,QACA,OACA,OACA,UACA,SACA,SACA,QACA,SACA,OACA,OACA,SACA,UACA,SACA,QACA,UACA,OACA,QACA,MACA,QACA,SACA,QACA,SACA,MACA,QACA,SACA,UACA,SACA,OACA,OACA,OACA,SACA,MACA,SACA,QACA,UACA,SACA,SACA,QACA,WACA,OACA,UACA,QACA,QACA,OACA,OACA,OACA,SACA,MACA,QACA,QACA,QACA,OACA,QACA,QACA,WACA,QACA,MACA,QACA,QACA,OACA,WACA,QACA,SACA,YACA,QACA,QACA,UACA,SACA,QACA,OACA,UACA,UACA,OACA,QACA,UACA,QACA,QACA,WACA,aACA,SACA,SACA,OACA,YACA,aACA,YACA,aACA,SACA,YACA,QACA,QACA,OACA,SACA,QACA,OACA,QACA,QACA,SACA,SACA,QACA,YACA,QACA,UACA,aACA,QACA,SACA,SACA,OACA,MACA,MACA,QACA,SACA,UACA,UACA,QACA,QACA,YACA,SACA,QACA,QACA,YACA,QACA,QACA,WACA,SACA,OACA,QACA,SACA,SACA,SACA,QACA,SACA,OACA,MACA,SACA,SACA,QACA,UACA,UACA,WACA,UACA,QACA,MACA,aACA,QACA,YACA,YACA,WACA,SACA,QACA,YACA,WACA,UACA,YACA,YACA,YACA,QACA,cACA,UACA,OACA,SACA,UACA,UACA,aACA,WACA,WACA,WACA,SACA,OACA,MACA,UACA,SACA,aACA,UACA,UACA,YACA,aACA,UACA,YACA,QACA,WACA,UACA,OACA,QACA,WACA,cACA,QACA,WACA,QACA,UACA,QACA,SACA,UACA,YACA,SACA,QACA,OACA,WACA,WACA,cACA,cACA,aACA,aACA,aACA,QACA,SACA,aACA,cACA,YACA,eACA,UACA,YACA,OACA,WACA,YACA,OACA,WACA,QACA,SACA,WACA,OACA,QACA,UACA,UACA,YACA,QACA,SACA,OACA,SACA,SACA,QACA,WACA,UACA,WACA,QACA,WACA,QACA,UACA,WACA,aACA,aACA,aACA,YACA,QACA,YACA,UACA,OACA,QACA,OACA,MACA,MACA,QACA,OACA,QACA,YACA,QACA,QACA,SACA,YACA,OACA,QACA,WACA,UACA,QACA,QACA,WACA,MACA,SACA,YACA,OACA,OACA,UACA,OACA,MACA,MACA,SACA,YACA,MACA,OACA,OACA,QACA,QACA,WACA,OACA,SACA,OACA,QACA,aACA,gBACA,UACA,YACA,UACA,OACA,QACA,QACA,OACA,QACA,OACA,SACA,WACA,UACA,UACA,QACA,SACA,YACA,SACA,WACA,OACA,UACA,OACA,YACA,OACA,UACA,SACA,SACA,YACA,WACA,UACA,QACA,OACA,UACA,QACA,UACA,QACA,UACA,aACA,OACA,SACA,WACA,YACA,cACA,aACA,SACA,UACA,WACA,SACA,UACA,SACA,SACA,QACA,QACA,QACA,MACA,SACA,UACA,WACA,QACA,QACA,cACA,aACA,QACA,OACA,WACA,cACA,MACA,SACA,QACA,WACA,WACA,aACA,QACA,MACA,UACA,QACA,eACA,SACA,OACA,OACA,QACA,QACA,SACA,YACA,UACA,cACA,WACA,SACA,cACA,OACA,cACA,eACA,WACA,WACA,MACA,WACA,cACA,WACA,UACA,OACA,QACA,OACA,OACA,aACA,OACA,YACA,YACA,QACA,UACA,UACA,SACA,gBACA,WACA,SACA,UACA,SACA,WACA,OACA,OACA,aACA,OACA,WACA,YACA,WACA,WACA,MACA,QACA,UACA,MACA,aACA,SACA,WACA,UACA,WACA,aACA,QACA,OACA,SACA,QACA,SACA,QACA,WACA,SACA,SACA,YACA,WACA,QACA,UACA,WACA,YACA,QACA,OACA,YACA,WACA,YACA,QACA,OACA,SACA,WACA,SACA,QACA,QACA,SACA,UACA,eACA,SACA,QACA,MACA,SACA,QACA,UACA,cACA,SACA,UACA,UACA,aACA,YACA,WACA,QACA,WACA,UACA,UACA,SACA,SACA,aACA,UACA,aACA,aACA,UACA,UACA,MACA,QACA,YACA,cACA,SACA,YACA,WACA,YACA,WACA,WACA,SACA,UACA,OACA,OACA,MACA,aACA,OACA,QACA,WACA,aACA,OACA,QACA,QACA,QACA,UACA,SACA,UACA,WACA,QACA,WACA,OACA,OACA,SACA,WACA,UACA,QACA,UACA,QACA,aACA,WACA,QACA,QACA,cACA,OACA,UACA,UACA,OACA,WACA,UACA,QACA,YACA,QACA,UACA,SACA,OACA,WACA,OACA,YACA,QACA,WACA,WACA,QACA,QACA,UACA,SACA,MACA,YACA,WACA,YACA,OACA,QACA,cACA,MACA,UACA,QACA,OACA,WACA,eACA,QACA,OACA,OACA,QACA,UACA,SACA,YACA,gBACA,UACA,UACA,aACA,QACA,QACA,SACA,QACA,WACA,OACA,SACA,UACA,MACA,QACA,OACA,YACA,OACA,YACA,eACA,UACA,UACA,UACA,YACA,QACA,YACA,cACA,UACA,WACA,WACA,eACA,UACA,SACA,WACA,YACA,SACA,WACA,WACA,SACA,YACA,UACA,OACA,OACA,SACA,SACA,UACA,OACA,YACA,QACA,YACA,OACA,MACA,cACA,QACA,UACA,UACA,aACA,YACA,SACA,OACA,SACA,YACA,MACA,SACA,QACA,WACA,QACA,QACA,iBACA,SACA,aACA,gBACA,aACA,QACA,QACA,OACA,OACA,YACA,UACA,WACA,aACA,SACA,WACA,OACA,UACA,WACA,aACA,UACA,WACA,UACA,WACA,UACA,WACA,UACA,YACA,MACA,YACA,aACA,YACA,WACA,QACA,WACA,WACA,WACA,MACA,UACA,QACA,WACA,aACA,UACA,UACA,QACA,SACA,iBACA,YACA,YACA,aACA,YACA,OACA,SACA,WACA,SACA,cACA,cACA,OACA,SACA,WACA,UACA,SACA,aACA,UACA,cACA,gBACA,QACA,UACA,WACA,UACA,QACA,QACA,cACA,UACA,UACA,SACA,SACA,OACA,QACA,MACA,QACA,WACA,QACA,gBACA,UACA,aACA,aACA,SACA,WACA,WACA,WACA,QACA,aACA,UACA,OACA,QACA,aACA,QACA,WACA,OACA,WACA,YACA,QACA,aACA,UACA,YACA,SACA,YACA,SACA,SACA,UACA,aACA,eACA,YACA,QACA,WACA,WACA,OACA,WACA,SACA,aACA,YACA,WACA,MACA,gBACA,SACA,aACA,UACA,QACA,gBACA,SACA,WACA,aACA,SACA,WACA,SACA,OACA,WACA,WACA,aACA,WACA,eACA,YACA,UACA,WACA,WACA,aACA,YACA,UACA,OACA,WACA,SACA,QACA,QACA,aACA,QACA,SACA,QACA,YACA,OACA,WACA,SACA,SACA,WACA,SACA,UACA,OACA,WACA,WACA,QACA,SACA,QACA,aACA,YACA,eACA,WACA,cACA,YACA,SACA,eACA,gBACA,WACA,cACA,UACA,YACA,WACA,cACA,YACA,WACA,WACA,YACA,SACA,cACA,aACA,SACA,QACA,eACA,aACA,UACA,WACA,QACA,YACA,cACA,aACA,cACA,SACA,YACA,aACA,aACA,aACA,SACA,aACA,SACA,gBACA,QACA,WACA,aACA,QACA,aACA,kBACA,WACA,UACA,cACA,UACA,WACA,SACA,aACA,QACA,UACA,WACA,QACA,aACA,cACA,UACA,cACA,SACA,WACA,QACA,OACA,QACA,WACA,aACA,UACA,aACA,aACA,YACA,OACA,SACA,gBACA,UACA,aACA,cACA,SACA,SACA,cACA,OACA,UACA,OACA,aACA,QACA,OACA,QACA,SACA,SACA,UACA,SACA,UACA,QACA,SACA,WACA,QACA,YACA,SACA,WACA,SACA,UACA,cACA,WACA,UACA,YACA,WACA,QACA,WACA,OACA,eACA,YACA,cACA,cACA,aACA,WACA,cACA,OACA,QACA,WACA,SACA,WACA,iBACA,UACA,aACA,UACA,YACA,WACA,QACA,aACA,UACA,UACA,MACA,WACA,YACA,cACA,cACA,eACA,cACA,YACA,WACA,UACA,cACA,gBACA,OACA,WACA,UACA,WACA,aACA,aACA,UACA,YACA,aACA,QACA,UACA,WACA,QACA,eACA,OACA,UACA,SACA,cACA,cACA,WACA,QACA,UACA,WACA,QACA,UACA,UACA,SACA,UACA,WACA,UACA,SACA,WACA,YACA,OACA,WACA,SACA,aACA,cACA,YACA,OACA,UACA,QACA,QACA,YACA,SACA,QACA,UACA,MACA,aACA,YACA,UACA,QACA,SACA,aACA,SACA,UACA,YACA,WACA,iBACA,eACA,WACA,QACA,UACA,QACA,UACA,WACA,QACA,QACA,WACA,WACA,QACA,WACA,OACA,UACA,gBACA,UACA,UACA,aACA,UACA,SACA,cACA,gBACA,eACA,aACA,aACA,QACA,WACA,UACA,SACA,UACA,SACA,OACA,UACA,aACA,eACA,QACA,YACA,WACA,aACA,eACA,OACA,aACA,UACA,UACA,aACA,QACA,QACA,WACA,gBACA,WACA,QACA,eACA,WACA,aACA,UACA,aACA,YACA,UACA,SACA,cACA,UACA,WACA,UACA,YACA,UACA,SACA,UACA,UACA,WACA,cACA,WACA,gBACA,aACA,QACA,WACA,YACA,aACA,SACA,SACA,YACA,WACA,SACA,SACA,SACA,eACA,QACA,aACA,YACA,OACA,YACA,SACA,QACA,UACA,YACA,aACA,WACA,eACA,gBACA,SACA,aACA,QACA,WACA,SACA,gBACA,SACA,aACA,UACA,QACA,SACA,cACA,aACA,aACA,eACA,WACA,YACA,UACA,aACA,UACA,WACA,UACA,QACA,SACA,YACA,WACA,OACA,WACA,UACA,OACA,UACA,YACA,cACA,aACA,SACA,YACA,aACA,YACA,WACA,SACA,SACA,SACA,WACA,UACA,UACA,UACA,SACA,cACA,YACA,YACA,WACA,SACA,UACA,SACA,YACA,UACA,cACA,SACA,aACA,MACA,WACA,OACA,KACA,WACA,aACA,UACA,YACA,SACA,SACA,WACA,WACA,YACA,UACA,UACA,QACA,aACA,YACA,eACA,cACA,WACA,OACA,aACA,SACA,SACA,YACA,UACA,UACA,UACA,WACA,SACA,WACA,SACA,MACA,QACA,WACA,aACA,YACA,WACA,WACA,QACA,YACA,UACA,eACA,WACA,WACA,eACA,aACA,UACA,QACA,UACA,UACA,WACA,aACA,SACA,UACA,SACA,UACA,SACA,SACA,UACA,eACA,YACA,UACA,YACA,SACA,cACA,YACA,WACA,aACA,SACA,UACA,YACA,iBACA,QACA,SACA,WACA,cACA,QACA,OACA,WACA,cACA,aACA,aACA,aACA,YACA,QACA,aACA,QACA,SACA,YACA,OACA,UACA,WACA,SACA,YACA,QACA,UACA,OACA,YACA,YACA,WACA,OACA,SACA,UACA,UACA,WACA,YACA,aACA,WACA,cACA,SACA,OACA,cACA,OACA,WACA,UACA,OACA,OACA,MACA,SACA,QACA,OACA,eACA,YACA,OACA,QACA,WACA,QACA,UACA,YACA,SACA,SACA,WACA,SACA,QACA,QACA,SACA,WACA,UACA,OACA,OACA,OACA,WACA,OACA,UACA,QACA,SACA,YACA,WACA,WACA,YACA,SACA,QACA,QACA,aACA,QACA,QACA,SACA,SACA,QACA,SACA,YACA,WACA,SACA,UACA,OACA,YACA,UACA,MACA,SACA,YACA,MACA,QACA,OACA,SACA,SACA,QACA,QACA,OACA,MACA,QACA,WACA,QAC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"} \ No newline at end of file +{"version":3,"file":"iris.umd.production.min.js","sources":["../src/lodash.ts","../src/util.ts","../src/Key.ts","../src/peers.ts","../src/db/Actor.ts","../src/db/Message.ts","../node_modules/quick-lru/index.js","../src/db/adapters/Memory.ts","../node_modules/dexie/node_modules/tslib/tslib.es6.js","../node_modules/dexie/src/globals/global.ts","../node_modules/dexie/src/functions/utils.ts","../node_modules/dexie/src/helpers/debug.ts","../node_modules/dexie/src/errors/errors.js","../node_modules/dexie/src/functions/chaining-functions.js","../node_modules/dexie/src/helpers/promise.js","../node_modules/dexie/src/globals/constants.ts","../node_modules/dexie/src/functions/combine.ts","../node_modules/dexie/src/dbcore/keyrange.ts","../node_modules/dexie/src/functions/workaround-undefined-primkey.ts","../node_modules/dexie/src/classes/table/table.ts","../node_modules/dexie/src/functions/temp-transaction.ts","../node_modules/dexie/src/helpers/Events.js","../node_modules/dexie/src/functions/make-class-constructor.ts","../node_modules/dexie/src/classes/collection/collection-helpers.ts","../node_modules/dexie/src/functions/cmp.ts","../node_modules/dexie/src/classes/collection/collection.ts","../node_modules/dexie/src/functions/compare-functions.ts","../node_modules/dexie/src/classes/where-clause/where-clause-helpers.ts","../node_modules/dexie/src/classes/where-clause/where-clause.ts","../node_modules/dexie/src/functions/event-wrappers.ts","../node_modules/dexie/src/globals/global-events.ts","../node_modules/dexie/src/classes/transaction/transaction.ts","../node_modules/dexie/src/helpers/index-spec.ts","../node_modules/dexie/src/helpers/table-schema.ts","../node_modules/dexie/src/functions/quirks.ts","../node_modules/dexie/src/dbcore/get-key-extractor.ts","../node_modules/dexie/src/dbcore/dbcore-indexeddb.ts","../node_modules/dexie/src/classes/dexie/generate-middleware-stacks.ts","../node_modules/dexie/src/classes/version/schema-helpers.ts","../node_modules/dexie/src/classes/version/version.ts","../node_modules/dexie/src/helpers/database-enumerator.ts","../node_modules/dexie/src/classes/dexie/vip.ts","../node_modules/dexie/node_modules/safari-14-idb-fix/dist/index.js","../node_modules/dexie/src/helpers/yield-support.ts","../node_modules/dexie/src/classes/dexie/transaction-helpers.ts","../node_modules/dexie/src/dbcore/virtual-index-middleware.ts","../node_modules/dexie/src/functions/get-object-diff.ts","../node_modules/dexie/src/hooks/hooks-middleware.ts","../node_modules/dexie/src/dbcore/get-effective-keys.ts","../node_modules/dexie/src/dbcore/cache-existing-values-middleware.ts","../node_modules/dexie/src/helpers/rangeset.ts","../node_modules/dexie/src/live-query/observability-middleware.ts","../node_modules/dexie/src/classes/dexie/dexie-dom-dependencies.ts","../node_modules/dexie/src/classes/dexie/dexie.ts","../node_modules/dexie/src/classes/collection/collection-constructor.ts","../node_modules/dexie/src/classes/table/table-constructor.ts","../node_modules/dexie/src/classes/transaction/transaction-constructor.ts","../node_modules/dexie/src/classes/version/version-constructor.ts","../node_modules/dexie/src/classes/where-clause/where-clause-constructor.ts","../node_modules/dexie/src/classes/dexie/dexie-open.ts","../node_modules/dexie/src/classes/observable/observable.ts","../node_modules/dexie/src/live-query/extend-observability-set.ts","../node_modules/dexie/src/classes/dexie/dexie-static-props.ts","../node_modules/dexie/src/live-query/propagate-locally.ts","../node_modules/dexie/src/live-query/live-query.ts","../node_modules/dexie/src/live-query/enable-broadcast.ts","../node_modules/dexie/src/index.ts","../src/db/adapters/IndexedDB.ts","../src/global.ts","../src/db/adapters/Websocket.ts","../src/db/Router.ts","../src/db/Node.ts","../src/Attribute.ts","../src/public.ts","../src/Channel.ts","../src/local.ts","../src/private.ts","../src/blockedUsers.ts","../src/group.ts","../src/notifications.ts","../node_modules/fuse.js/dist/fuse.esm.js","../src/electron.ts","../src/session.ts","../src/static.ts","../src/SignedMessage.ts","../src/index.ts"],"sourcesContent":["// @ts-nocheck\nconst _ = {\n throttle: (func: Function, limit: number) => {\n let inThrottle: boolean;\n return function() {\n const args = arguments;\n const context = this;\n if (!inThrottle) {\n func.apply(context, args);\n inThrottle = true;\n setTimeout(() => inThrottle = false, limit);\n }\n };\n },\n debounce: (func: Function, limit: number) => {\n let inDebounce: boolean;\n return function() {\n const args = arguments;\n const context = this;\n clearTimeout(inDebounce);\n inDebounce = setTimeout(() => func.apply(context, args), limit);\n };\n },\n sample: (arr: any[]) => arr[Math.floor(Math.random() * arr.length)],\n sampleSize: (arr: any[], size: number) => {\n const shuffled = arr.slice(0);\n let i = arr.length;\n let min = i - size;\n let temp;\n let index;\n while (i-- > min) {\n index = Math.floor((i + 1) * Math.random());\n temp = shuffled[index];\n shuffled[index] = shuffled[i];\n shuffled[i] = temp;\n }\n return shuffled.slice(min);\n },\n defer: (func: Function) => setTimeout(func, 0),\n once: (func: Function) => {\n let called = false;\n return function() {\n if (called) {\n return;\n }\n called = true;\n func.apply(this, arguments);\n };\n },\n omit: (obj: any, keys: string[]) => {\n const newObj = {};\n Object.keys(obj).forEach(key => {\n if (!keys.includes(key)) {\n newObj[key] = obj[key];\n }\n });\n return newObj;\n },\n defaults: (obj: any, defaults: any) => {\n Object.keys(defaults).forEach(key => {\n if (obj[key] === undefined) {\n obj[key] = defaults[key];\n }\n });\n return obj;\n },\n pickBy: (obj: any, predicate: Function) => {\n const newObj = {};\n Object.keys(obj).forEach(key => {\n if (predicate(obj[key])) {\n newObj[key] = obj[key];\n }\n });\n return newObj;\n },\n isEqual: (a: any, b: any) => {\n if (a === b) {\n return true;\n }\n if (a instanceof Date && b instanceof Date) {\n return a.getTime() === b.getTime();\n }\n if (!a || !b || (typeof a !== 'object' && typeof b !== 'object')) {\n return a !== a && b !== b;\n }\n if (a.prototype !== b.prototype) {\n return false;\n }\n const keys = Object.keys(a);\n if (keys.length !== Object.keys(b).length) {\n return false;\n }\n return keys.every(k => _.isEqual(a[k], b[k]));\n },\n uniq: (arr: any[]) => {\n const set = new Set(arr);\n return Array.from(set);\n }\n};\n\nexport default _;","// @ts-nocheck\n/* eslint no-useless-escape: \"off\", camelcase: \"off\" */\n\nimport _ from './lodash';\n\n// eslint-disable-line no-unused-vars\n\nlet isNode = false;\ntry {\n isNode = Object.prototype.toString.call(global.process) === `[object process]`;\n} catch (e) { null; }\n\nconst userAgent = !isNode && navigator && navigator.userAgent && navigator.userAgent.toLowerCase();\nconst isElectron = (userAgent && userAgent.indexOf(' electron/') > -1);\n\nconst isMobile = !isNode && (function() {\n if (isElectron) { return false; }\n let check = false;\n (function(a) {if (/(android|bb\\d+|meego).+mobile|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\\-(n|u)|c55\\/|capi|ccwa|cdm\\-|cell|chtm|cldc|cmd\\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\\-s|devi|dica|dmob|do(c|p)o|ds(12|\\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\\-|_)|g1 u|g560|gene|gf\\-5|g\\-mo|go(\\.w|od)|gr(ad|un)|haie|hcit|hd\\-(m|p|t)|hei\\-|hi(pt|ta)|hp( i|ip)|hs\\-c|ht(c(\\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\\-(20|go|ma)|i230|iac( |\\-|\\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\\/)|klon|kpt |kwc\\-|kyo(c|k)|le(no|xi)|lg( g|\\/(k|l|u)|50|54|\\-[a-w])|libw|lynx|m1\\-w|m3ga|m50\\/|ma(te|ui|xo)|mc(01|21|ca)|m\\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\\-2|po(ck|rt|se)|prox|psio|pt\\-g|qa\\-a|qc(07|12|21|32|60|\\-[2-7]|i\\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\\-|oo|p\\-)|sdk\\/|se(c(\\-|0|1)|47|mc|nd|ri)|sgh\\-|shar|sie(\\-|m)|sk\\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\\-|v\\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\\-|tdg\\-|tel(i|m)|tim\\-|t\\-mo|to(pl|sh)|ts(70|m\\-|m3|m5)|tx\\-9|up(\\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\\-|your|zeto|zte\\-/i.test(a.substr(0, 4))) check = true;})(navigator.userAgent || navigator.vendor || '');\n return check;\n})();\n\nfunction gunOnceDefined(node: any) {\n return new Promise(resolve => {\n node.on((val: any, _k: any, _a: any, eve: any) => {\n if (val !== undefined) {\n eve.off();\n resolve(val);\n }\n });\n });\n}\n\nconst animals = [\n 'canidae',\n 'felidae',\n 'cat',\n 'cattle',\n 'dog',\n 'donkey',\n 'goat',\n 'horse',\n 'pig',\n 'rabbit',\n 'aardvark',\n 'aardwolf',\n 'albatross',\n 'alligator',\n 'alpaca',\n 'amphibian',\n 'anaconda',\n 'angelfish',\n 'anglerfish',\n 'ant',\n 'anteater',\n 'antelope',\n 'antlion',\n 'ape',\n 'aphid',\n 'armadillo',\n 'asp',\n 'baboon',\n 'badger',\n 'bandicoot',\n 'barnacle',\n 'barracuda',\n 'basilisk',\n 'bass',\n 'bat',\n 'bear',\n 'beaver',\n 'bedbug',\n 'bee',\n 'beetle',\n 'bird',\n 'bison',\n 'blackbird',\n 'boa',\n 'boar',\n 'bobcat',\n 'bobolink',\n 'bonobo',\n 'booby',\n 'bovid',\n 'bug',\n 'butterfly',\n 'buzzard',\n 'camel',\n 'canid',\n 'capybara',\n 'cardinal',\n 'caribou',\n 'carp',\n 'cat',\n 'catshark',\n 'caterpillar',\n 'catfish',\n 'cattle',\n 'centipede',\n 'cephalopod',\n 'chameleon',\n 'cheetah',\n 'chickadee',\n 'chicken',\n 'chimpanzee',\n 'chinchilla',\n 'chipmunk',\n 'clam',\n 'clownfish',\n 'cobra',\n 'cockroach',\n 'cod',\n 'condor',\n 'constrictor',\n 'coral',\n 'cougar',\n 'cow',\n 'coyote',\n 'crab',\n 'crane',\n 'crawdad',\n 'crayfish',\n 'cricket',\n 'crocodile',\n 'crow',\n 'cuckoo',\n 'cicada',\n 'damselfly',\n 'deer',\n 'dingo',\n 'dinosaur',\n 'dog',\n 'dolphin',\n 'donkey',\n 'dormouse',\n 'dove',\n 'dragonfly',\n 'dragon',\n 'duck',\n 'eagle',\n 'earthworm',\n 'earwig',\n 'echidna',\n 'eel',\n 'egret',\n 'elephant',\n 'elk',\n 'emu',\n 'ermine',\n 'falcon',\n 'ferret',\n 'finch',\n 'firefly',\n 'fish',\n 'flamingo',\n 'flea',\n 'fly',\n 'flyingfish',\n 'fowl',\n 'fox',\n 'frog',\n 'gamefowl',\n 'galliform',\n 'gazelle',\n 'gecko',\n 'gerbil',\n 'gibbon',\n 'giraffe',\n 'goat',\n 'goldfish',\n 'goose',\n 'gopher',\n 'gorilla',\n 'grasshopper',\n 'grouse',\n 'guan',\n 'guanaco',\n 'guineafowl',\n 'gull',\n 'guppy',\n 'haddock',\n 'halibut',\n 'hamster',\n 'hare',\n 'harrier',\n 'hawk',\n 'hedgehog',\n 'heron',\n 'herring',\n 'hippopotamus',\n 'hookworm',\n 'hornet',\n 'horse',\n 'hoverfly',\n 'hummingbird',\n 'hyena',\n 'iguana',\n 'impala',\n 'jackal',\n 'jaguar',\n 'jay',\n 'jellyfish',\n 'junglefowl',\n 'kangaroo',\n 'kingfisher',\n 'kite',\n 'kiwi',\n 'koala',\n 'koi',\n 'krill',\n 'ladybug',\n 'lamprey',\n 'landfowl',\n 'lark',\n 'leech',\n 'lemming',\n 'lemur',\n 'leopard',\n 'leopon',\n 'limpet',\n 'lion',\n 'lizard',\n 'llama',\n 'lobster',\n 'locust',\n 'loon',\n 'louse',\n 'lungfish',\n 'lynx',\n 'macaw',\n 'mackerel',\n 'magpie',\n 'mammal',\n 'manatee',\n 'mandrill',\n 'marlin',\n 'marmoset',\n 'marmot',\n 'marsupial',\n 'marten',\n 'mastodon',\n 'meadowlark',\n 'meerkat',\n 'mink',\n 'minnow',\n 'mite',\n 'mockingbird',\n 'mole',\n 'mollusk',\n 'mongoose',\n 'monkey',\n 'moose',\n 'mosquito',\n 'moth',\n 'mouse',\n 'mule',\n 'muskox',\n 'narwhal',\n 'newt',\n 'nightingale',\n 'ocelot',\n 'octopus',\n 'opossum',\n 'orangutan',\n 'orca',\n 'ostrich',\n 'otter',\n 'owl',\n 'ox',\n 'panda',\n 'panther',\n 'parakeet',\n 'parrot',\n 'parrotfish',\n 'partridge',\n 'peacock',\n 'peafowl',\n 'pelican',\n 'penguin',\n 'perch',\n 'pheasant',\n 'pig',\n 'pigeon',\n 'pike',\n 'pinniped',\n 'piranha',\n 'planarian',\n 'platypus',\n 'pony',\n 'porcupine',\n 'porpoise',\n 'possum',\n 'prawn',\n 'primate',\n 'ptarmigan',\n 'puffin',\n 'puma',\n 'python',\n 'quail',\n 'quelea',\n 'quokka',\n 'rabbit',\n 'raccoon',\n 'rat',\n 'rattlesnake',\n 'raven',\n 'reindeer',\n 'reptile',\n 'rhinoceros',\n 'roadrunner',\n 'rodent',\n 'rook',\n 'rooster',\n 'roundworm',\n 'sailfish',\n 'salamander',\n 'salmon',\n 'sawfish',\n 'scallop',\n 'scorpion',\n 'seahorse',\n 'shark',\n 'sheep',\n 'shrew',\n 'shrimp',\n 'silkworm',\n 'silverfish',\n 'skink',\n 'skunk',\n 'sloth',\n 'slug',\n 'smelt',\n 'snail',\n 'snake',\n 'snipe',\n 'sole',\n 'sparrow',\n 'spider',\n 'spoonbill',\n 'squid',\n 'squirrel',\n 'starfish',\n 'stingray',\n 'stoat',\n 'stork',\n 'sturgeon',\n 'swallow',\n 'swan',\n 'swift',\n 'swordfish',\n 'swordtail',\n 'tahr',\n 'takin',\n 'tapir',\n 'tarantula',\n 'tarsier',\n 'termite',\n 'tern',\n 'thrush',\n 'tick',\n 'tiger',\n 'tiglon',\n 'toad',\n 'tortoise',\n 'toucan',\n 'trout',\n 'tuna',\n 'turkey',\n 'turtle',\n 'tyrannosaurus',\n 'urial',\n 'vicuna',\n 'viper',\n 'vole',\n 'vulture',\n 'wallaby',\n 'walrus',\n 'wasp',\n 'warbler',\n 'weasel',\n 'whale',\n 'whippet',\n 'whitefish',\n 'wildcat',\n 'wildebeest',\n 'wildfowl',\n 'wolf',\n 'wolverine',\n 'wombat',\n 'woodpecker',\n 'worm',\n 'wren',\n 'xerinae',\n 'yak',\n 'zebra',\n 'alpaca',\n 'cat',\n 'cattle',\n 'chicken',\n 'dog',\n 'donkey',\n 'ferret',\n 'gayal',\n 'goldfish',\n 'guppy',\n 'horse',\n 'koi',\n 'llama',\n 'sheep',\n 'yak',\n 'unicorn',\n];\n\nconst adjectives = [\n 'average',\n 'big',\n 'colossal',\n 'fat',\n 'giant',\n 'gigantic',\n 'great',\n 'huge',\n 'immense',\n 'large',\n 'little',\n 'long',\n 'mammoth',\n 'massive',\n 'miniature',\n 'petite',\n 'puny',\n 'short',\n 'small',\n 'tall',\n 'tiny',\n 'boiling',\n 'breezy',\n 'broken',\n 'bumpy',\n 'chilly',\n 'cold',\n 'cool',\n 'creepy',\n 'crooked',\n 'cuddly',\n 'curly',\n 'damaged',\n 'damp',\n 'dirty',\n 'dry',\n 'dusty',\n 'filthy',\n 'flaky',\n 'fluffy',\n 'wet',\n 'broad',\n 'chubby',\n 'crooked',\n 'curved',\n 'deep',\n 'flat',\n 'high',\n 'hollow',\n 'low',\n 'narrow',\n 'round',\n 'shallow',\n 'skinny',\n 'square',\n 'steep',\n 'straight',\n 'wide',\n 'ancient',\n 'brief',\n 'early',\n 'fast',\n 'late',\n 'long',\n 'modern',\n 'old',\n 'quick',\n 'rapid',\n 'short',\n 'slow',\n 'swift',\n 'young',\n 'abundant',\n 'empty',\n 'few',\n 'heavy',\n 'light',\n 'many',\n 'numerous',\n 'Sound',\n 'cooing',\n 'deafening',\n 'faint',\n 'harsh',\n 'hissing',\n 'hushed',\n 'husky',\n 'loud',\n 'melodic',\n 'moaning',\n 'mute',\n 'noisy',\n 'purring',\n 'quiet',\n 'raspy',\n 'resonant',\n 'screeching',\n 'shrill',\n 'silent',\n 'soft',\n 'squealing',\n 'thundering',\n 'voiceless',\n 'whispering',\n 'bitter',\n 'delicious',\n 'fresh',\n 'juicy',\n 'ripe',\n 'rotten',\n 'salty',\n 'sour',\n 'spicy',\n 'stale',\n 'sticky',\n 'strong',\n 'sweet',\n 'tasteless',\n 'tasty',\n 'thirsty',\n 'fluttering',\n 'fuzzy',\n 'greasy',\n 'grubby',\n 'hard',\n 'hot',\n 'icy',\n 'loose',\n 'melted',\n 'plastic',\n 'prickly',\n 'rainy',\n 'rough',\n 'scattered',\n 'shaggy',\n 'shaky',\n 'sharp',\n 'shivering',\n 'silky',\n 'slimy',\n 'slippery',\n 'smooth',\n 'soft',\n 'solid',\n 'steady',\n 'sticky',\n 'tender',\n 'tight',\n 'uneven',\n 'weak',\n 'wet',\n 'wooden',\n 'afraid',\n 'angry',\n 'annoyed',\n 'anxious',\n 'arrogant',\n 'ashamed',\n 'awful',\n 'bad',\n 'bewildered',\n 'bored',\n 'combative',\n 'condemned',\n 'confused',\n 'creepy',\n 'cruel',\n 'dangerous',\n 'defeated',\n 'defiant',\n 'depressed',\n 'disgusted',\n 'disturbed',\n 'eerie',\n 'embarrassed',\n 'envious',\n 'evil',\n 'fierce',\n 'foolish',\n 'frantic',\n 'frightened',\n 'grieving',\n 'helpless',\n 'homeless',\n 'hungry',\n 'hurt',\n 'ill',\n 'jealous',\n 'lonely',\n 'mysterious',\n 'naughty',\n 'nervous',\n 'obnoxious',\n 'outrageous',\n 'panicky',\n 'repulsive',\n 'scary',\n 'scornful',\n 'selfish',\n 'sore',\n 'tense',\n 'terrible',\n 'thoughtless',\n 'tired',\n 'troubled',\n 'upset',\n 'uptight',\n 'weary',\n 'wicked',\n 'worried',\n 'agreeable',\n 'amused',\n 'brave',\n 'calm',\n 'charming',\n 'cheerful',\n 'comfortable',\n 'cooperative',\n 'courageous',\n 'delightful',\n 'determined',\n 'eager',\n 'elated',\n 'enchanting',\n 'encouraging',\n 'energetic',\n 'enthusiastic',\n 'excited',\n 'exuberant',\n 'fair',\n 'faithful',\n 'fantastic',\n 'fine',\n 'friendly',\n 'funny',\n 'gentle',\n 'glorious',\n 'good',\n 'happy',\n 'healthy',\n 'helpful',\n 'hilarious',\n 'jolly',\n 'joyous',\n 'kind',\n 'lively',\n 'lovely',\n 'lucky',\n 'obedient',\n 'perfect',\n 'pleasant',\n 'proud',\n 'relieved',\n 'silly',\n 'smiling',\n 'splendid',\n 'successful',\n 'thoughtful',\n 'victorious',\n 'vivacious',\n 'witty',\n 'wonderful',\n 'zealous',\n 'zany',\n 'other',\n 'good',\n 'new',\n 'old',\n 'great',\n 'high',\n 'small',\n 'different',\n 'large',\n 'local',\n 'social',\n 'important',\n 'long',\n 'young',\n 'national',\n 'british',\n 'right',\n 'early',\n 'possible',\n 'big',\n 'little',\n 'political',\n 'able',\n 'late',\n 'general',\n 'full',\n 'far',\n 'low',\n 'public',\n 'available',\n 'bad',\n 'main',\n 'sure',\n 'clear',\n 'major',\n 'economic',\n 'only',\n 'likely',\n 'real',\n 'black',\n 'particular',\n 'international',\n 'special',\n 'difficult',\n 'certain',\n 'open',\n 'whole',\n 'white',\n 'free',\n 'short',\n 'easy',\n 'strong',\n 'european',\n 'central',\n 'similar',\n 'human',\n 'common',\n 'necessary',\n 'single',\n 'personal',\n 'hard',\n 'private',\n 'poor',\n 'financial',\n 'wide',\n 'foreign',\n 'simple',\n 'recent',\n 'concerned',\n 'american',\n 'various',\n 'close',\n 'fine',\n 'english',\n 'wrong',\n 'present',\n 'royal',\n 'natural',\n 'individual',\n 'nice',\n 'french',\n 'nihilist',\n 'solipsist',\n 'materialist',\n 'surrealist',\n 'heroic',\n 'awesome',\n 'hedonist',\n 'absurd',\n 'current',\n 'modern',\n 'labour',\n 'legal',\n 'happy',\n 'final',\n 'red',\n 'normal',\n 'serious',\n 'previous',\n 'total',\n 'prime',\n 'significant',\n 'industrial',\n 'sorry',\n 'dead',\n 'specific',\n 'appropriate',\n 'top',\n 'soviet',\n 'basic',\n 'military',\n 'original',\n 'successful',\n 'aware',\n 'hon',\n 'popular',\n 'heavy',\n 'professional',\n 'direct',\n 'dark',\n 'cold',\n 'ready',\n 'green',\n 'useful',\n 'effective',\n 'western',\n 'traditional',\n 'scottish',\n 'german',\n 'independent',\n 'deep',\n 'interesting',\n 'considerable',\n 'involved',\n 'physical',\n 'hot',\n 'existing',\n 'responsible',\n 'complete',\n 'medical',\n 'blue',\n 'extra',\n 'past',\n 'male',\n 'interested',\n 'fair',\n 'essential',\n 'beautiful',\n 'civil',\n 'primary',\n 'obvious',\n 'future',\n 'environmental',\n 'positive',\n 'senior',\n 'nuclear',\n 'annual',\n 'relevant',\n 'huge',\n 'rich',\n 'commercial',\n 'safe',\n 'regional',\n 'practical',\n 'official',\n 'separate',\n 'key',\n 'chief',\n 'regular',\n 'due',\n 'additional',\n 'active',\n 'powerful',\n 'complex',\n 'standard',\n 'impossible',\n 'light',\n 'warm',\n 'middle',\n 'fresh',\n 'sexual',\n 'front',\n 'domestic',\n 'actual',\n 'united',\n 'technical',\n 'ordinary',\n 'cheap',\n 'strange',\n 'internal',\n 'excellent',\n 'quiet',\n 'soft',\n 'potential',\n 'northern',\n 'religious',\n 'quick',\n 'very',\n 'famous',\n 'cultural',\n 'proper',\n 'broad',\n 'joint',\n 'formal',\n 'limited',\n 'conservative',\n 'lovely',\n 'usual',\n 'ltd',\n 'unable',\n 'rural',\n 'initial',\n 'substantial',\n 'bright',\n 'average',\n 'leading',\n 'reasonable',\n 'immediate',\n 'suitable',\n 'equal',\n 'detailed',\n 'working',\n 'overall',\n 'female',\n 'afraid',\n 'democratic',\n 'growing',\n 'sufficient',\n 'scientific',\n 'eastern',\n 'correct',\n 'inc',\n 'irish',\n 'expensive',\n 'educational',\n 'mental',\n 'dangerous',\n 'critical',\n 'increased',\n 'familiar',\n 'unlikely',\n 'double',\n 'perfect',\n 'slow',\n 'tiny',\n 'dry',\n 'historical',\n 'thin',\n 'daily',\n 'southern',\n 'increasing',\n 'wild',\n 'alone',\n 'urban',\n 'empty',\n 'married',\n 'narrow',\n 'liberal',\n 'supposed',\n 'upper',\n 'apparent',\n 'tall',\n 'busy',\n 'bloody',\n 'prepared',\n 'russian',\n 'moral',\n 'careful',\n 'clean',\n 'attractive',\n 'japanese',\n 'vital',\n 'thick',\n 'alternative',\n 'fast',\n 'ancient',\n 'elderly',\n 'rare',\n 'external',\n 'capable',\n 'brief',\n 'wonderful',\n 'grand',\n 'typical',\n 'entire',\n 'grey',\n 'constant',\n 'vast',\n 'surprised',\n 'ideal',\n 'terrible',\n 'academic',\n 'funny',\n 'minor',\n 'pleased',\n 'severe',\n 'ill',\n 'corporate',\n 'negative',\n 'permanent',\n 'weak',\n 'brown',\n 'fundamental',\n 'odd',\n 'crucial',\n 'inner',\n 'used',\n 'criminal',\n 'contemporary',\n 'sharp',\n 'sick',\n 'near',\n 'roman',\n 'massive',\n 'unique',\n 'secondary',\n 'parliamentary',\n 'african',\n 'unknown',\n 'subsequent',\n 'angry',\n 'alive',\n 'guilty',\n 'lucky',\n 'enormous',\n 'well',\n 'yellow',\n 'unusual',\n 'net',\n 'tough',\n 'dear',\n 'extensive',\n 'glad',\n 'remaining',\n 'agricultural',\n 'alright',\n 'healthy',\n 'italian',\n 'principal',\n 'tired',\n 'efficient',\n 'comfortable',\n 'chinese',\n 'relative',\n 'friendly',\n 'conventional',\n 'willing',\n 'sudden',\n 'proposed',\n 'voluntary',\n 'slight',\n 'valuable',\n 'dramatic',\n 'golden',\n 'temporary',\n 'federal',\n 'keen',\n 'flat',\n 'silent',\n 'indian',\n 'worried',\n 'pale',\n 'statutory',\n 'welsh',\n 'dependent',\n 'firm',\n 'wet',\n 'competitive',\n 'armed',\n 'radical',\n 'outside',\n 'acceptable',\n 'sensitive',\n 'living',\n 'pure',\n 'global',\n 'emotional',\n 'sad',\n 'secret',\n 'rapid',\n 'adequate',\n 'fixed',\n 'sweet',\n 'administrative',\n 'wooden',\n 'remarkable',\n 'comprehensive',\n 'surprising',\n 'solid',\n 'rough',\n 'mere',\n 'mass',\n 'brilliant',\n 'maximum',\n 'absolute',\n 'electronic',\n 'visual',\n 'electric',\n 'cool',\n 'spanish',\n 'literary',\n 'continuing',\n 'supreme',\n 'chemical',\n 'genuine',\n 'exciting',\n 'written',\n 'advanced',\n 'extreme',\n 'classical',\n 'fit',\n 'favourite',\n 'widespread',\n 'confident',\n 'straight',\n 'proud',\n 'numerous',\n 'opposite',\n 'distinct',\n 'mad',\n 'helpful',\n 'given',\n 'disabled',\n 'consistent',\n 'anxious',\n 'nervous',\n 'awful',\n 'stable',\n 'constitutional',\n 'satisfied',\n 'conscious',\n 'developing',\n 'strategic',\n 'holy',\n 'smooth',\n 'dominant',\n 'remote',\n 'theoretical',\n 'outstanding',\n 'pink',\n 'pretty',\n 'clinical',\n 'minimum',\n 'honest',\n 'impressive',\n 'related',\n 'residential',\n 'extraordinary',\n 'plain',\n 'visible',\n 'accurate',\n 'distant',\n 'still',\n 'greek',\n 'complicated',\n 'musical',\n 'precise',\n 'gentle',\n 'broken',\n 'live',\n 'silly',\n 'fat',\n 'tight',\n 'monetary',\n 'round',\n 'psychological',\n 'violent',\n 'unemployed',\n 'inevitable',\n 'junior',\n 'sensible',\n 'grateful',\n 'pleasant',\n 'dirty',\n 'structural',\n 'welcome',\n 'deaf',\n 'above',\n 'continuous',\n 'blind',\n 'overseas',\n 'mean',\n 'entitled',\n 'delighted',\n 'loose',\n 'occasional',\n 'evident',\n 'desperate',\n 'fellow',\n 'universal',\n 'square',\n 'steady',\n 'classic',\n 'equivalent',\n 'intellectual',\n 'victorian',\n 'level',\n 'ultimate',\n 'creative',\n 'lost',\n 'medieval',\n 'clever',\n 'linguistic',\n 'convinced',\n 'judicial',\n 'raw',\n 'sophisticated',\n 'asleep',\n 'vulnerable',\n 'illegal',\n 'outer',\n 'revolutionary',\n 'bitter',\n 'changing',\n 'australian',\n 'native',\n 'imperial',\n 'strict',\n 'wise',\n 'informal',\n 'flexible',\n 'collective',\n 'frequent',\n 'experimental',\n 'spiritual',\n 'intense',\n 'rational',\n 'generous',\n 'inadequate',\n 'prominent',\n 'logical',\n 'bare',\n 'historic',\n 'modest',\n 'dutch',\n 'acute',\n 'electrical',\n 'valid',\n 'weekly',\n 'gross',\n 'automatic',\n 'loud',\n 'reliable',\n 'mutual',\n 'liable',\n 'multiple',\n 'ruling',\n 'curious',\n 'sole',\n 'managing',\n 'pregnant',\n 'latin',\n 'nearby',\n 'exact',\n 'underlying',\n 'identical',\n 'satisfactory',\n 'marginal',\n 'distinctive',\n 'electoral',\n 'urgent',\n 'presidential',\n 'controversial',\n 'everyday',\n 'encouraging',\n 'organic',\n 'continued',\n 'expected',\n 'statistical',\n 'desirable',\n 'innocent',\n 'improved',\n 'exclusive',\n 'marked',\n 'experienced',\n 'unexpected',\n 'superb',\n 'sheer',\n 'disappointed',\n 'frightened',\n 'gastric',\n 'romantic',\n 'naked',\n 'reluctant',\n 'magnificent',\n 'convenient',\n 'established',\n 'closed',\n 'uncertain',\n 'artificial',\n 'diplomatic',\n 'tremendous',\n 'marine',\n 'mechanical',\n 'retail',\n 'institutional',\n 'mixed',\n 'required',\n 'biological',\n 'known',\n 'functional',\n 'straightforward',\n 'superior',\n 'digital',\n 'spectacular',\n 'unhappy',\n 'confused',\n 'unfair',\n 'aggressive',\n 'spare',\n 'painful',\n 'abstract',\n 'asian',\n 'associated',\n 'legislative',\n 'monthly',\n 'intelligent',\n 'hungry',\n 'explicit',\n 'nasty',\n 'just',\n 'faint',\n 'coloured',\n 'ridiculous',\n 'amazing',\n 'comparable',\n 'successive',\n 'realistic',\n 'back',\n 'decent',\n 'decentralized',\n 'bitcoin',\n 'cypherpunk',\n 'unnecessary',\n 'flying',\n 'random',\n 'influential',\n 'dull',\n 'genetic',\n 'neat',\n 'marvellous',\n 'crazy',\n 'damp',\n 'giant',\n 'secure',\n 'bottom',\n 'skilled',\n 'subtle',\n 'elegant',\n 'brave',\n 'lesser',\n 'parallel',\n 'steep',\n 'intensive',\n 'casual',\n 'tropical',\n 'lonely',\n 'partial',\n 'preliminary',\n 'concrete',\n 'alleged',\n 'assistant',\n 'vertical',\n 'upset',\n 'delicate',\n 'mild',\n 'occupational',\n 'excessive',\n 'progressive',\n 'exceptional',\n 'integrated',\n 'striking',\n 'continental',\n 'okay',\n 'harsh',\n 'combined',\n 'fierce',\n 'handsome',\n 'characteristic',\n 'chronic',\n 'compulsory',\n 'interim',\n 'objective',\n 'splendid',\n 'magic',\n 'systematic',\n 'obliged',\n 'payable',\n 'fun',\n 'horrible',\n 'primitive',\n 'fascinating',\n 'ideological',\n 'metropolitan',\n 'surrounding',\n 'estimated',\n 'peaceful',\n 'premier',\n 'operational',\n 'technological',\n 'kind',\n 'advisory',\n 'hostile',\n 'precious',\n 'accessible',\n 'determined',\n 'excited',\n 'impressed',\n 'provincial',\n 'smart',\n 'endless',\n 'isolated',\n 'drunk',\n 'geographical',\n 'like',\n 'dynamic',\n 'boring',\n 'forthcoming',\n 'unfortunate',\n 'definite',\n 'super',\n 'notable',\n 'indirect',\n 'stiff',\n 'wealthy',\n 'awkward',\n 'lively',\n 'neutral',\n 'artistic',\n 'content',\n 'mature',\n 'colonial',\n 'ambitious',\n 'evil',\n 'magnetic',\n 'verbal',\n 'legitimate',\n 'sympathetic',\n 'empirical',\n 'head',\n 'shallow',\n 'vague',\n 'naval',\n 'depressed',\n 'shared',\n 'added',\n 'shocked',\n 'mid',\n 'worthwhile',\n 'qualified',\n 'missing',\n 'blank',\n 'absent',\n 'favourable',\n 'polish',\n 'israeli',\n 'developed',\n 'profound',\n 'representative',\n 'enthusiastic',\n 'dreadful',\n 'rigid',\n 'reduced',\n 'cruel',\n 'coastal',\n 'peculiar',\n 'swiss',\n 'crude',\n 'extended',\n 'selected',\n 'eager',\n 'canadian',\n 'bold',\n 'relaxed',\n 'corresponding',\n 'running',\n 'planned',\n 'applicable',\n 'immense',\n 'allied',\n 'comparative',\n 'uncomfortable',\n 'conservation',\n 'productive',\n 'beneficial',\n 'bored',\n 'charming',\n 'minimal',\n 'mobile',\n 'turkish',\n 'orange',\n 'rear',\n 'passive',\n 'suspicious',\n 'overwhelming',\n 'fatal',\n 'resulting',\n 'symbolic',\n 'registered',\n 'neighbouring',\n 'calm',\n 'irrelevant',\n 'patient',\n 'compact',\n 'profitable',\n 'rival',\n 'loyal',\n 'moderate',\n 'distinguished',\n 'interior',\n 'noble',\n 'insufficient',\n 'eligible',\n 'mysterious',\n 'varying',\n 'managerial',\n 'molecular',\n 'olympic',\n 'linear',\n 'prospective',\n 'printed',\n 'parental',\n 'diverse',\n 'elaborate',\n 'furious',\n 'fiscal',\n 'burning',\n 'useless',\n 'semantic',\n 'embarrassed',\n 'inherent',\n 'philosophical',\n 'deliberate',\n 'awake',\n 'variable',\n 'promising',\n 'unpleasant',\n 'varied',\n 'sacred',\n 'selective',\n 'inclined',\n 'tender',\n 'hidden',\n 'worthy',\n 'intermediate',\n 'sound',\n 'protective',\n 'fortunate',\n 'slim',\n 'defensive',\n 'divine',\n 'stuck',\n 'driving',\n 'invisible',\n 'misleading',\n 'circular',\n 'mathematical',\n 'inappropriate',\n 'liquid',\n 'persistent',\n 'solar',\n 'doubtful',\n 'manual',\n 'architectural',\n 'intact',\n 'incredible',\n 'devoted',\n 'prior',\n 'tragic',\n 'respectable',\n 'optimistic',\n 'convincing',\n 'unacceptable',\n 'decisive',\n 'competent',\n 'spatial',\n 'respective',\n 'binding',\n 'relieved',\n 'nursing',\n 'toxic',\n 'select',\n 'redundant',\n 'integral',\n 'then',\n 'probable',\n 'amateur',\n 'fond',\n 'passing',\n 'specified',\n 'territorial',\n 'horizontal',\n 'inland',\n 'cognitive',\n 'regulatory',\n 'miserable',\n 'resident',\n 'polite',\n 'scared',\n 'gothic',\n 'civilian',\n 'instant',\n 'lengthy',\n 'adverse',\n 'korean',\n 'unconscious',\n 'anonymous',\n 'aesthetic',\n 'orthodox',\n 'static',\n 'unaware',\n 'costly',\n 'fantastic',\n 'foolish',\n 'fashionable',\n 'causal',\n 'compatible',\n 'wee',\n 'implicit',\n 'dual',\n 'ok',\n 'cheerful',\n 'subjective',\n 'forward',\n 'surviving',\n 'exotic',\n 'purple',\n 'cautious',\n 'visiting',\n 'aggregate',\n 'ethical',\n 'teenage',\n 'dying',\n 'disastrous',\n 'delicious',\n 'confidential',\n 'underground',\n 'thorough',\n 'grim',\n 'autonomous',\n 'atomic',\n 'frozen',\n 'colourful',\n 'injured',\n 'uniform',\n 'ashamed',\n 'glorious',\n 'wicked',\n 'coherent',\n 'rising',\n 'shy',\n 'novel',\n 'balanced',\n 'delightful',\n 'arbitrary',\n 'adjacent',\n 'worrying',\n 'weird',\n 'unchanged',\n 'rolling',\n 'evolutionary',\n 'intimate',\n 'sporting',\n 'disciplinary',\n 'formidable',\n 'lexical',\n 'noisy',\n 'gradual',\n 'accused',\n 'homeless',\n 'supporting',\n 'coming',\n 'renewed',\n 'excess',\n 'retired',\n 'rubber',\n 'chosen',\n 'outdoor',\n 'embarrassing',\n 'preferred',\n 'bizarre',\n 'appalling',\n 'agreed',\n 'imaginative',\n 'governing',\n 'accepted',\n 'vocational',\n 'mighty',\n 'puzzled',\n 'worldwide',\n 'organisational',\n 'sunny',\n 'eldest',\n 'eventual',\n 'spontaneous',\n 'vivid',\n 'rude',\n 'faithful',\n 'ministerial',\n 'innovative',\n 'controlled',\n 'conceptual',\n 'unwilling',\n 'civic',\n 'meaningful',\n 'alive',\n 'brainy',\n 'breakable',\n 'busy',\n 'careful',\n 'cautious',\n 'clever',\n 'concerned',\n 'crazy',\n 'curious',\n 'dead',\n 'different',\n 'difficult',\n 'doubtful',\n 'easy',\n 'famous',\n 'fragile',\n 'helpful',\n 'helpless',\n 'important',\n 'impossible',\n 'innocent',\n 'inquisitive',\n 'modern',\n 'open',\n 'outstanding',\n 'poor',\n 'powerful',\n 'puzzled',\n 'real',\n 'rich',\n 'shy',\n 'sleepy',\n 'super',\n 'tame',\n 'uninterested',\n 'wandering',\n 'wild',\n 'wrong',\n 'adorable',\n 'alert',\n 'average',\n 'beautiful',\n 'blonde',\n 'bloody',\n 'blushing',\n 'bright',\n 'clean',\n 'clear',\n 'cloudy',\n 'colorful',\n 'crowded',\n 'cute',\n 'dark',\n 'drab',\n 'distinct',\n 'dull',\n 'elegant',\n 'fancy',\n 'filthy',\n 'glamorous',\n 'gleaming',\n 'graceful',\n 'grotesque',\n 'homely',\n 'light',\n 'misty',\n 'motionless',\n 'muddy',\n 'plain',\n 'poised',\n 'quaint',\n 'shiny',\n 'smoggy',\n 'sparkling',\n 'spotless',\n 'stormy',\n 'strange',\n 'ugly',\n 'unsightly',\n 'unusual',\n 'bad',\n 'better',\n 'beautiful',\n 'big',\n 'black',\n 'blue',\n 'bright',\n 'clumsy',\n 'crazy',\n 'dizzy',\n 'dull',\n 'fat',\n 'frail',\n 'friendly',\n 'funny',\n 'great',\n 'green',\n 'gigantic',\n 'gorgeous',\n 'grumpy',\n 'handsome',\n 'happy',\n 'horrible',\n 'itchy',\n 'jittery',\n 'jolly',\n 'kind',\n 'long',\n 'lazy',\n 'magnificent',\n 'magenta',\n 'many',\n 'mighty',\n 'mushy',\n 'nasty',\n 'new',\n 'nice',\n 'nosy',\n 'nutty',\n 'nutritious',\n 'odd',\n 'orange',\n 'ordinary',\n 'pretty',\n 'precious',\n 'prickly',\n 'purple',\n 'quaint',\n 'quiet',\n 'quick',\n 'quickest',\n 'rainy',\n 'rare',\n 'ratty',\n 'red',\n 'roasted',\n 'robust',\n 'round',\n 'sad',\n 'scary',\n 'scrawny',\n 'short',\n 'silly',\n 'stingy',\n 'strange',\n 'striped',\n 'spotty',\n 'tart',\n 'tall',\n 'tame',\n 'tan',\n 'tender',\n 'testy',\n 'tricky',\n 'tough',\n 'ugly',\n 'ugliest',\n 'vast',\n 'watery',\n 'wasteful',\n 'wonderful',\n 'yellow',\n 'yummy',\n 'zany',\n];\n\nexport default {\n gunOnceDefined,\n async getHash (data: any, format = `base64`) {\n if (data === undefined) {\n throw new Error('getHash data was undefined');\n }\n if (typeof data !== 'string') {\n data = JSON.stringify(data);\n }\n\n const encoder = new TextEncoder();\n data = encoder.encode(data);\n const buffer = await crypto.subtle.digest('SHA-256', data);\n\n if (format === 'buffer') {\n return buffer;\n }\n\n const hash = this.arrayBufferToBase64(buffer);\n if (format === `hex`) {\n return this.base64ToHex(hash);\n }\n return hash;\n },\n\n capitalize(s: string) {\n return s.charAt(0).toUpperCase() + s.slice(1)\n },\n\n generateName() {\n return `${this.capitalize(_.sample(adjectives)!)} ${this.capitalize(_.sample(animals)!)}`;\n },\n\n base64ToHex(str: string) {\n const raw = atob(str);\n let result = '';\n for (let i = 0; i < raw.length; i++) {\n const hex = raw.charCodeAt(i).toString(16);\n result += (hex.length === 2 ? hex : `0${ hex}`);\n }\n return result;\n },\n\n arrayBufferToBase64( buffer ) {\n var binary = '';\n var bytes = new Uint8Array( buffer );\n var len = bytes.byteLength;\n for (var i = 0; i < len; i++) {\n binary += String.fromCharCode( bytes[ i ] );\n }\n return window.btoa( binary );\n },\n\n getCaret(el: HTMLInputElement) {\n if (el.selectionStart) {\n return el.selectionStart;\n } else { // @ts-ignore\n if (document.selection) {\n el.focus();\n // @ts-ignore\n const r = document.selection.createRange();\n if (r === null) {\n return 0;\n }\n // @ts-ignore\n const re = el.createTextRange(), rc = re.duplicate();\n re.moveToBookmark(r.getBookmark());\n rc.setEndPoint('EndToStart', re);\n return rc.text.length;\n }\n }\n return 0;\n },\n\n getUrlParameter(sParam: string, sParams: string) {\n const sPageURL = sParams || window.location.search.substring(1);\n const sURLVariables = sPageURL.split('&');\n let sParameterName, i;\n\n for (i = 0; i < sURLVariables.length; i++) {\n sParameterName = sURLVariables[i].split('=');\n if (sParameterName[0] === sParam) {\n return sParameterName[1] === undefined ? true : decodeURIComponent(sParameterName[1]);\n }\n }\n return;\n },\n\n formatTime(date: Date) {\n // @ts-ignore\n const t: any = date.toLocaleTimeString(undefined, {timeStyle: 'short'});\n const s = t.split(':');\n if (s.length === 3) { // safari tries to display seconds\n return `${s[0] }:${ s[1] }${s[2].slice(2)}`;\n }\n return t;\n },\n\n formatDate(date: Date) {\n const t = date.toLocaleString(undefined, {dateStyle: 'short', timeStyle: 'short'});\n const s = t.split(':');\n if (s.length === 3) { // safari tries to display seconds\n return `${s[0] }:${ s[1] }${s[2].slice(2)}`;\n }\n return t;\n },\n\n getDaySeparatorText(date: Date, dateStr: string, now?: Date, nowStr?: string) {\n if (!now) {\n now = new Date();\n // @ts-ignore\n nowStr = now.toLocaleDateString({dateStyle: 'short'});\n }\n if (dateStr === nowStr) {\n return 'today';\n }\n const dayDifference = Math.round((now - date) / (1000 * 60 * 60 * 24));\n if (dayDifference === 0) {\n return 'today';\n }\n if (dayDifference === 1) {\n return 'yesterday';\n }\n if (dayDifference <= 5) {\n return date.toLocaleDateString(undefined, {weekday: 'long'});\n }\n return dateStr;\n },\n\n getProfileLink(pub: string) {\n return `${window.location.origin}/#/profile/${encodeURIComponent(pub)}`;\n },\n\n truncateString(s: string, length = 30) {\n return s.length > length ? `${s.slice(0, length)}...` : s;\n },\n\n createElement(type: string, cls?: string, parent?: HTMLElement) {\n const el = document.createElement(type);\n if (cls) {\n el.setAttribute('class', cls);\n }\n if (parent) {\n parent.appendChild(el);\n }\n return el;\n },\n\n isNode,\n isElectron,\n isMobile,\n\n throttle: (func: Function, limit: number) => {\n let inThrottle: boolean;\n return function() {\n const args = arguments;\n const context = this;\n if (!inThrottle) {\n func.apply(context, args);\n inThrottle = true;\n setTimeout(() => inThrottle = false, limit);\n }\n };\n },\n debounce: (func: Function, delay: number) => {\n let inDebounce: boolean;\n return function() {\n const context = this;\n const args = arguments;\n clearTimeout(inDebounce);\n inDebounce = setTimeout(() => func.apply(context, args), delay);\n };\n },\n sample: (arr: any[]) => arr[Math.floor(Math.random() * arr.length)],\n sampleSize: (arr: any[], size: number) => {\n const shuffled = arr.slice(0);\n let i = arr.length;\n let min = i - size;\n let temp;\n let index;\n while (i-- > min) {\n index = Math.floor((i + 1) * Math.random());\n temp = shuffled[index];\n shuffled[index] = shuffled[i];\n shuffled[i] = temp;\n }\n return shuffled.slice(min);\n },\n defer: (func: Function) => setTimeout(func, 0),\n once: (func: Function) => {\n let called = false;\n return function() {\n if (called) {\n return;\n }\n called = true;\n func.apply(this, arguments);\n };\n },\n omit: (obj: any, keys: string[]) => {\n const newObj = {};\n Object.keys(obj).forEach(key => {\n if (!keys.includes(key)) {\n newObj[key] = obj[key];\n }\n });\n return newObj;\n }\n};\n","/*eslint no-useless-escape: \"off\", camelcase: \"off\" */\n\nimport util from './util';\n// eslint-disable-line no-unused-vars\n\nlet myKey: any;\n\nexport default {\n async getActiveKey(datadir = `.`, keyfile = `iris.key`, fs?: any) {\n if (myKey) {\n return myKey;\n }\n if (fs) {\n const privKeyFile = `${datadir}/${keyfile}`;\n if (fs.existsSync(privKeyFile)) {\n const f = fs.readFileSync(privKeyFile, `utf8`);\n myKey = this.fromString(f);\n } else {\n const newKey = await this.generate();\n myKey = myKey || newKey; // eslint-disable-line require-atomic-updates\n fs.writeFileSync(privKeyFile, this.toString(myKey));\n fs.chmodSync(privKeyFile, 400);\n }\n if (!myKey) {\n throw new Error(`loading default key failed - check ${datadir}/${keyfile}`);\n }\n } else {\n const str = window.localStorage.getItem(`iris.myKey`);\n if (str) {\n myKey = this.fromString(str);\n } else {\n const newKey = await this.generate();\n myKey = myKey || newKey; // eslint-disable-line require-atomic-updates\n window.localStorage.setItem(`iris.myKey`, this.toString(myKey));\n }\n if (!myKey) {\n throw new Error(`loading default key failed - check localStorage iris.myKey`);\n }\n }\n return myKey;\n },\n\n getDefault(datadir = `.`, keyfile = `iris.key`) {\n return this.getActiveKey(datadir, keyfile);\n },\n\n async getActivePub(datadir = `.`, keyfile = `iris.key`) {\n const key = await this.getActiveKey(datadir, keyfile);\n return key.pub;\n },\n\n setActiveKey(key: any, save = true, datadir = `.`, keyfile = `iris.key`, fs: any) {\n myKey = key;\n if (!save) return;\n if (util.isNode) {\n const privKeyFile = `${datadir}/${keyfile}`;\n fs.writeFileSync(privKeyFile, this.toString(myKey));\n fs.chmodSync(privKeyFile, 400);\n } else {\n window.localStorage.setItem(`iris.myKey`, this.toString(myKey));\n }\n },\n\n toString(key: any) {\n return JSON.stringify(key);\n },\n\n getId(key: any) {\n if (!(key && key.pub)) {\n throw new Error(`missing param`);\n }\n return key.pub; // hack until GUN supports lookups by keyID\n //return util.getHash(key.pub);\n },\n\n fromString(str: string) {\n return JSON.parse(str);\n },\n\n // copied from Gun.SEA\n async generate() {\n try {\n var ecdhSubtle = window.crypto.subtle;\n // First: ECDSA keys for signing/verifying...\n var sa = await ecdhSubtle.generateKey({name: 'ECDSA', namedCurve: 'P-256'}, true, ['sign', 'verify'])\n .then(async (keys) => {\n // privateKey scope doesn't leak out from here!\n //const { d: priv } = await shim.subtle.exportKey('jwk', keys.privateKey)\n var key: any = {};\n key.priv = (await ecdhSubtle.exportKey('jwk', keys.privateKey)).d;\n var pub = await ecdhSubtle.exportKey('jwk', keys.publicKey);\n //const pub = Buff.from([ x, y ].join(':')).toString('base64') // old\n key.pub = pub.x + '.' + pub.y; // new\n // x and y are already base64\n // pub is UTF8 but filename/URL safe (https://www.ietf.org/rfc/rfc3986.txt)\n // but split on a non-base64 letter.\n return key;\n })\n\n // To include PGPv4 kind of keyId:\n // const pubId = await SEA.keyid(keys.pub)\n // Next: ECDH keys for encryption/decryption...\n\n try {\n var dh = await ecdhSubtle.generateKey({name: 'ECDH', namedCurve: 'P-256'}, true, ['deriveKey'])\n .then(async (keys) => {\n // privateKey scope doesn't leak out from here!\n var key: any = {};\n key.epriv = (await ecdhSubtle.exportKey('jwk', keys.privateKey)).d;\n var pub = await ecdhSubtle.exportKey('jwk', keys.publicKey);\n //const epub = Buff.from([ ex, ey ].join(':')).toString('base64') // old\n key.epub = pub.x + '.' + pub.y; // new\n // ex and ey are already base64\n // epub is UTF8 but filename/URL safe (https://www.ietf.org/rfc/rfc3986.txt)\n // but split on a non-base64 letter.\n return key;\n })\n } catch (e) {\n if (e == 'Error: ECDH is not a supported algorithm') {\n console.log('Ignoring ECDH...')\n } else {\n throw e\n }\n }\n dh = dh || {};\n\n var r = {pub: sa.pub, priv: sa.priv, /* pubId, */ epub: dh.epub, epriv: dh.epriv}\n return r;\n } catch (e) {\n console.log(e);\n throw e;\n return;\n }\n },\n\n keyToJwk(key: any): JsonWebKey {\n if (typeof key === 'string') {\n key = { pub: key };\n }\n const jwk: JsonWebKey = {\n kty: 'EC',\n crv: 'P-256',\n x: key.pub.split('.')[0],\n y: key.pub.split('.')[1],\n ext: true,\n };\n jwk.key_ops = key.priv ? ['sign'] : ['verify'];\n if (key.priv) {\n jwk.d = key.priv\n }\n return jwk;\n },\n\n async sign(data: any, pair: any, cb?: Function, opt: any = {}) {\n if(undefined === data){ throw '`undefined` not allowed.' }\n const text = typeof data === 'string' ? data : JSON.stringify(data); // Gun.SEA doesn't preserve data type: \"0\" -> 0. Should we change this?\n var jwk = this.keyToJwk(pair);\n var hash = await util.getHash(text, 'buffer') as Buffer;\n var sig = await window.crypto.subtle.importKey('jwk', jwk, {name: 'ECDSA', namedCurve: 'P-256'}, false, ['sign'])\n .then((key) =>\n window.crypto.subtle.sign({name: 'ECDSA', hash: {name: 'SHA-256'}}, key, hash)\n ) // privateKey scope doesn't leak out from here!\n var r: any = {m: text, s: Buffer.from(sig).toString(opt.encode || 'base64')}\n if(!opt.raw){ r = 'aSEA' + JSON.stringify(r) } // \"aSEA\" was a dumb fix for an earlier bug in Gun.SEA\n\n if(cb){ try{ cb(r) }catch(e){console.log(e)} }\n return r;\n },\n\n async verify(data: any, pair: any, cb?: Function, opt: any = {}) {\n try {\n if (typeof data === 'string') {\n if (data.slice(0, 4) === 'aSEA') {\n data = data.slice(4)\n }\n try {\n data = JSON.parse(data);\n } catch (e) {\n // not JSON\n }\n }\n var pub = pair.pub || pair;\n var jwk = this.keyToJwk(pub);\n var key = await crypto.subtle.importKey('jwk', jwk, {name: 'ECDSA', namedCurve: 'P-256'}, false, ['verify']);\n\n let text = data.m;\n try {\n text = JSON.parse(text);\n } catch (e) {\n // ignore\n }\n\n let hash = await util.getHash(text, 'buffer') as Buffer;\n var buf, sig, isValid;\n buf = Buffer.from(data.s, opt.encode || 'base64');\n sig = new Uint8Array(buf);\n isValid = await crypto.subtle.verify({name: 'ECDSA', hash: {name: 'SHA-256'}}, key, sig, hash);\n var r = isValid? JSON.parse(text) : undefined;\n if (r === undefined) {\n //console.log('invalid', data, pair, hash);\n }\n\n if(cb){ try{ cb(r) }catch(e){console.log(e)} }\n return r;\n } catch (e) {\n console.log(e);\n return undefined;\n }\n },\n\n async secret(key: any, pair: any) {\n var keysToEcdhJwk = (pub: any, d?: any): any => { // d === priv\n //var [ x, y ] = shim.Buffer.from(pub, 'base64').toString('utf8').split(':') // old\n var [ x, y ] = pub.split('.') // new\n const jwk: JsonWebKey = Object.assign(\n d ? { d } : {},\n { x: x, y: y, kty: 'EC', crv: 'P-256', ext: true }\n );\n return jwk;\n }\n\n var pub = key.epub || key;\n var epub = pair.epub;\n var epriv = pair.epriv;\n var pubJwk = keysToEcdhJwk(pub);\n var props = Object.assign({\n public: await crypto.subtle.importKey('jwk', pubJwk, {name: 'ECDH', namedCurve: 'P-256'}, true, [])\n },{name: 'ECDH', namedCurve: 'P-256'});\n var privJwk = keysToEcdhJwk(epub, epriv);\n return crypto.subtle.importKey('jwk', privJwk, {name: 'ECDH', namedCurve: 'P-256'}, false, ['deriveBits'])\n .then(async (privKey) => {\n var derivedBits = await crypto.subtle.deriveBits(props, privKey, 256);\n var rawBits = new Uint8Array(derivedBits);\n var derivedKey = await crypto.subtle.importKey('raw', rawBits,{ name: 'AES-GCM', length: 256 }, true, [ 'encrypt', 'decrypt' ]);\n return crypto.subtle.exportKey('jwk', derivedKey).then(({ k }) => k);\n });\n },\n\n async aeskey(key: any, salt?: Buffer) {\n const combo = key + (salt || this.random(8)).toString('utf8'); // new\n let hash: any = await crypto.subtle.digest({name: 'SHA-256'}, new TextEncoder().encode(combo));\n hash = Buffer.from(hash, 'binary');\n\n const keyB64 = hash.toString('base64');\n const k = keyB64.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/\\=/g, '');\n\n const jwkKey = { kty: 'oct', k: k, ext: false, alg: 'A256GCM' };\n return await crypto.subtle.importKey('jwk', jwkKey, {name:'AES-GCM'}, false, ['encrypt', 'decrypt'])\n },\n\n random(len: number) {\n return Buffer.from(crypto.getRandomValues(new Uint8Array(len)));\n },\n\n async encrypt(data: any, pair: any, cb?: Function, opt: any = {}) {\n var key = pair.epriv || pair;\n if(undefined === data){ throw '`undefined` not allowed.' }\n var msg = (typeof data == 'string')? data : JSON.stringify(data); // Gun.SEA doesn't preserve data type: \"0\" -> 0. Should we change this?\n var rand = {s: this.random(9), iv: this.random(15)}; // consider making this 9 and 15 or 18 or 12 to reduce == padding.\n var ct = await this.aeskey(key, rand.s).then((aes) => crypto.subtle.encrypt({ // Keeping the AES key scope as private as possible...\n name: opt.name || 'AES-GCM', iv: new Uint8Array(rand.iv)\n }, aes, new TextEncoder().encode(msg)));\n var r: any = {\n // @ts-ignore\n ct: Buffer.from(ct, 'binary').toString(opt.encode || 'base64'),\n iv: rand.iv.toString(opt.encode || 'base64'),\n s: rand.s.toString(opt.encode || 'base64')\n }\n if(!opt.raw){ r = 'SEA' + JSON.stringify(r) }\n\n if(cb){ try{ cb(r) }catch(e){console.log(e)} }\n return r;\n },\n\n async decrypt(data: any, pair: any, cb?: Function, opt: any = {}) {\n var key = pair.epriv || pair;\n let json;\n try { data = JSON.parse(data); } catch (e) {}\n if (data.indexOf('SEA{') === 0) {\n json = JSON.parse(data.slice(3));\n } else {\n json = JSON.parse(data);\n }\n if (!json.ct || !json.iv || !json.s) {\n throw 'Invalid ciphertext ' + json;\n }\n var buf: Buffer, bufiv: Buffer, bufct: Buffer;\n buf = Buffer.from(json.s, opt.encode || 'base64');\n bufiv = Buffer.from(json.iv, opt.encode || 'base64');\n bufct = Buffer.from(json.ct, opt.encode || 'base64');\n var ct = await this.aeskey(key, buf).then((aes) => crypto.subtle.decrypt({ // Keeping aesKey scope as private as possible...\n name: opt.name || 'AES-GCM', iv: new Uint8Array(bufiv), tagLength: 128\n }, aes, new Uint8Array(bufct)));\n const text = new TextDecoder('utf8').decode(ct);\n var r = text;\n try { r = JSON.parse(text); } catch (_e) {}\n if(cb){ try{ cb(r) }catch(e){console.log(e)} }\n return r;\n }\n}","import session from './session';\nimport _ from './lodash';\nimport util from './util';\nimport publicState from './global';\nimport Key from './Key';\n\nconst ELECTRON_GUN_URL = 'http://localhost:8767/gun';\nlet maxConnectedPeers = 1;\n\ntype Peer = {\n url?: string;\n enabled?: boolean;\n from?: string;\n visibility?: string;\n}\n\ntype Peers = {\n [key: string]: Peer\n}\n\nconst DEFAULT_PEERS: Peers = {\n 'wss://gun-rs.iris.to/gun': {},\n// 'wss://gun-us.herokuapp.com/gun': {},\n};\n\nif (self.window) {\n const loc = window.location;\n const host = loc.host;\n const is_localhost_but_not_dev = host.startsWith('localhost') && host !== 'localhost:8080';\n if (loc.hostname.endsWith('herokuapp.com') || is_localhost_but_not_dev) {\n Object.keys(DEFAULT_PEERS).forEach(url => DEFAULT_PEERS[url].enabled = false);\n DEFAULT_PEERS[`${loc.origin}/gun`] = {enabled: true};\n }\n}\n\n/**\n * Networking and peer management utilities\n */\nexport default {\n known: {} as Peers,\n\n /** */\n async add(peer: Peer) {\n if (peer.from) {\n Object.keys(this.known).forEach(k => {\n if (this.known[k].from === peer.from) { // remove previous peer url from the same user\n delete this.known[k];\n }\n });\n }\n const url = peer.url || '';\n this.known[url] = this.known[url] || _.omit(peer, ['url']);\n if (peer.visibility === 'public') {\n // rolling some crypto operations to obfuscate actual url in case we want to remove it\n let secret = await Key.secret(session.getKey().epub, session.getKey()) || '';\n let encryptedUrl = await Key.encrypt(peer.url, secret);\n let encryptedUrlHash = await util.getHash(encryptedUrl);\n publicState().user().get('peers').get(encryptedUrlHash).put({url: peer.url, lastSeen: new Date().toISOString()});\n }\n if (peer.enabled !== false) {\n peer.url && this.connect(peer.url); // this calls savePeers()\n } else {\n this.save();\n }\n },\n\n /** */\n remove(url: string) {\n delete this.known[url];\n this.save();\n },\n\n /** */\n disconnect(peerFromGun: any) {\n publicState().on('bye', peerFromGun);\n peerFromGun.url = '';\n },\n\n save() {\n // TODO store them in iris.local() instead of localStorage\n localStorage.setItem('gunPeers', JSON.stringify(this.known));\n },\n\n getSaved() {\n let p: any = localStorage.getItem('gunPeers');\n if (p && p !== 'undefined') {\n p = JSON.parse(p);\n } else {\n p = DEFAULT_PEERS;\n }\n if (util.isElectron) {\n p[ELECTRON_GUN_URL] = {};\n }\n Object.keys(p).forEach(k => _.defaults(p[k], {enabled: true}));\n return p;\n },\n\n /** */\n reset() {\n localStorage.setItem('gunPeers', '');\n this.known = this.getSaved();\n },\n\n /** */\n connect(url: string) {\n if (!url) {\n return;\n }\n if (this.isMixedContent(url)) { return; }\n if (this.known[url]) {\n this.known[url].enabled = true;\n publicState().opt({peers: [url]});\n this.save();\n } else {\n this.add({url});\n }\n },\n\n /** */\n disable(url: string, peerFromGun: any) {\n this.known[url].enabled = false;\n if (peerFromGun) {\n this.disconnect(peerFromGun);\n }\n this.save();\n },\n\n isMixedContent(url: string) {\n if (!url) { return false; }\n return window.location.protocol === 'https:' && (url.indexOf('http:') === 0);\n },\n\n random() {\n const connectToLocalElectron = util.isElectron && this.known[ELECTRON_GUN_URL] && this.known[ELECTRON_GUN_URL].enabled !== false;\n const sampleSize = connectToLocalElectron ? Math.max(maxConnectedPeers - 1, 1) : maxConnectedPeers;\n const sample = _.sampleSize(\n Object.keys(\n _.pickBy(this.known, (peer: any, url: string) => {\n return !this.isMixedContent(url) && peer.enabled && !(util.isElectron && url === ELECTRON_GUN_URL);\n })\n ), sampleSize\n );\n if (sample && connectToLocalElectron) {\n sample.push(ELECTRON_GUN_URL);\n }\n console.log('sample', sample, JSON.stringify(this.known));\n return sample;\n },\n\n checkGunPeerCount() {\n return;\n let peersFromGun = publicState().back('opt.peers');\n let connectedPeers = Object.values(peersFromGun).filter((peer: any) => {\n if (peer && peer.wire && peer.wire.constructor.name !== 'WebSocket') {\n console.log('WebRTC peer', peer);\n }\n return peer && peer.wire && peer.wire.readyState === 1 && peer.wire.bufferedAmount === 0 && peer.wire.constructor.name === 'WebSocket';\n });\n if (connectedPeers.length < maxConnectedPeers) {\n let unconnectedPeers = Object.keys(this.known).filter(url => {\n let addedToGun = Object.values(peersFromGun).map((peer:any) => peer.url).indexOf(url) > -1;\n let enabled = this.known[url].enabled;\n const mixedContent = (window.location.protocol === 'https:' && (url.indexOf('http:') === 0));\n return !mixedContent && enabled && !addedToGun;\n });\n if (unconnectedPeers.length) {\n const sample = String(_.sample(unconnectedPeers));\n this.connect(sample);\n }\n }\n if (connectedPeers.length > maxConnectedPeers) {\n this.disconnect(_.sample(connectedPeers));\n }\n },\n\n init() {\n this.known = this.getSaved();\n /* use the default value of 1 for now because of memory issue\n local().get('settings').get('maxConnectedPeers').on(n => {\n if (n !== undefined) maxConnectedPeers = n;\n });\n */\n setInterval(() => this.checkGunPeerCount(), 1000);\n }\n};\n","import {Message} from './Message';\n\nexport function generateUuid() {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\n const r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8);\n return v.toString(16);\n });\n}\n\nexport class Actor {\n id: string;\n\n handle(_message: Message) {\n throw new Error('not implemented');\n }\n\n // so we can support a similar api as Channels\n postMessage(message: Message) {\n this.handle(message);\n }\n\n constructor(id = generateUuid()) {\n this.id = id;\n }\n}","import {Actor} from './Actor';\nimport {Children} from \"./Node\";\nimport Key from \"../Key\";\n\nexport class Message {\n // When Messages are sent over BroadcastChannel, class name is lost.\n static fromObject(obj: any): Message {\n if (obj.type === 'get') {\n return Get.fromObject(obj);\n } else if (obj.type === 'put') {\n return Put.fromObject(obj);\n } else {\n throw new Error('not implemented');\n }\n }\n\n static async deserialize(str: string, from: Actor): Promise {\n const obj = JSON.parse(str);\n if (obj.get) {\n return Get.deserialize(obj, str, from);\n } else if (obj.put) {\n return Put.deserialize(obj, str, from);\n } else if (obj.dam && obj.dam === \"hi\") {\n return Hi.deserialize(obj);\n } else {\n throw new Error('unknown message type');\n }\n }\n\n serialize(): string {\n throw new Error('not implemented');\n }\n}\n\nfunction generateMsgId(): string {\n return Math.random().toString(36).slice(2, 10);\n}\n\nexport class Get implements Message {\n type: string = 'get';\n id: string;\n nodeId: string;\n from: Actor;\n recipients?: string[];\n childKey?: string;\n jsonStr?: string;\n checksum?: string;\n\n serialize(): string {\n if (this.jsonStr) {\n return this.jsonStr;\n }\n\n // TODO remove \"global/\", replace /^user\\// with ~\n let nodeId = this.nodeId.replace(/^global\\//, '').replace(/^user\\//, '~');\n const obj: any = {\n \"#\": this.id,\n get: {\n \"#\": nodeId,\n \".\": this.childKey\n },\n };\n\n if (this.childKey) {\n obj.get['.'] = this.childKey;\n }\n this.jsonStr = JSON.stringify(obj);\n return this.jsonStr;\n }\n\n static async deserialize(obj: any, jsonStr: string, from: Actor): Promise {\n const id = obj['#'];\n let nodeId = obj.get['#']; // TODO add \"global/\" prefix, replace /^~/ with \"user/\"\n if (nodeId.startsWith('~')) {\n nodeId = 'user/' + nodeId.slice(1);\n }\n nodeId = 'global/' + nodeId;\n const childKey = obj.get['.'];\n return new Get(id, nodeId, from, undefined, childKey, jsonStr);\n }\n\n static fromObject(obj: any): Get {\n return new Get(obj.id, obj.nodeId, obj.from, obj.recipients, obj.childKey, obj.jsonStr, obj.checksum);\n }\n\n static new(nodeId: string, from: Actor, recipients?: string[], childKey?: string, jsonStr?: string, checksum?: string): Get {\n const id = generateMsgId();\n return new Get(id, nodeId, from, recipients, childKey, jsonStr, checksum);\n }\n\n constructor(id: string, nodeId: string, from: Actor, recipients?: string[], childKey?: string, jsonStr?: string, checksum?: string) {\n this.id = id;\n this.from = from;\n this.nodeId = nodeId;\n this.recipients = recipients;\n this.childKey = childKey;\n this.jsonStr = jsonStr;\n this.checksum = checksum;\n }\n}\n\nexport type UpdatedNodes = {\n [key: string]: Children;\n};\n\nexport class Put implements Message {\n type: string = 'put';\n id: string;\n from: Actor;\n updatedNodes: UpdatedNodes;\n inResponseTo?: string;\n recipients?: string[];\n jsonStr?: string;\n checksum?: string;\n\n serialize(): string {\n const obj = {\n \"#\" : this.id,\n \"put\": {} as any\n };\n\n // iterate over this.updatedNodes\n for (const [nodeId, children] of Object.entries(this.updatedNodes)) {\n let myNodeId = nodeId.replace(/^global\\//, '').replace(/^user\\//, '~');\n const node: any = obj.put[myNodeId] = {};\n for (const [childKey, childValue] of Object.entries(children)) {\n if (!childValue) {\n continue;\n }\n const data = childValue;\n node[childKey] = data.value;\n node[\"_\"] = node[\"_\"] || {};\n node[\"_\"][\">\"] = node[\"_\"][\">\"] || {};\n node[\"_\"][\">\"][childKey] = data.updatedAt;\n }\n }\n return JSON.stringify(obj);\n }\n\n static async deserialize(obj: any, jsonStr: string, from: Actor): Promise {\n const id = obj['#'];\n const updatedNodes: UpdatedNodes = {};\n type SerializedChildren = {\n [key: string]: any;\n }\n for (const [nodeId, c] of Object.entries(obj.put)) {\n const children = c as SerializedChildren;\n const node: any = {};\n const isUserSpace = nodeId.startsWith('~');\n for (const [childKey, childValue] of Object.entries(children)) {\n if (childKey === '_') {\n continue;\n }\n if (isUserSpace) {\n const user = nodeId.split('/')[0].slice(1);\n const signatureObj = JSON.parse(childValue);\n const timestamp = children['_']['>'][childKey];\n const value = signatureObj[':'];\n const signedObj = {\n \"#\": nodeId,\n \".\": childKey,\n \":\": value,\n \">\": timestamp\n };\n const signature = signatureObj['~'];\n const signedStr = JSON.stringify(signedObj);\n if (await Key.verify({s: signature, m: signedStr}, user) === undefined) {\n throw new Error(`invalid signature in ${nodeId} of ${signedStr}`);\n }\n }\n // TODO test hash space validity\n const updatedAt = children['_']['>'][childKey];\n node[childKey] = {\n value: childValue,\n updatedAt,\n };\n }\n const myNodeId = 'global/' + nodeId.replace(/^~/, 'user/');\n updatedNodes[myNodeId] = node;\n }\n return new Put(id, updatedNodes, from, undefined, undefined, jsonStr);\n }\n\n static fromObject(obj: any): Put {\n return new Put(obj.id, obj.updatedNodes, obj.from, obj.inResponseTo, obj.recipients, obj.jsonStr, obj.checksum);\n }\n\n static new(updatedNodes: UpdatedNodes, from: Actor, inResponseTo?: string, recipients?: string[], jsonStr?: string, checksum?: string): Put {\n const id = generateMsgId();\n return new Put(id, updatedNodes, from, inResponseTo, recipients, jsonStr, checksum);\n }\n\n static newFromKv(key: string, children: Children, from:Actor) {\n const updatedNodes: UpdatedNodes = {};\n updatedNodes[key] = children;\n return Put.new(updatedNodes, from);\n }\n\n constructor(id: string, updatedNodes: UpdatedNodes, from: Actor, inResponseTo?: string, recipients?: string[], jsonStr?: string, checksum?: string) {\n this.id = id;\n this.from = from;\n this.updatedNodes = updatedNodes;\n this.inResponseTo = inResponseTo;\n this.recipients = recipients;\n this.jsonStr = jsonStr;\n this.checksum = checksum;\n }\n}\n\nexport class Hi implements Message {\n type: string = 'hi';\n peerId: string;\n jsonStr?: string;\n\n //{\"#\":\"aHHO9Srurq9nh6Q9\",\"dam\":\"hi\"}\n\n\n serialize(): string {\n if (this.jsonStr) {\n return this.jsonStr;\n }\n\n const obj: any = {\n dam: \"hi\",\n \"#\": this.peerId,\n };\n\n this.jsonStr = JSON.stringify(obj);\n return this.jsonStr;\n }\n\n static deserialize(obj: any): Hi {\n const peerId = obj['#'];\n return new Hi(peerId);\n }\n\n constructor(peerId: string, jsonStr?: string) {\n this.peerId = peerId;\n this.jsonStr = jsonStr;\n }\n}\n\nconst parseGet = (get: any, from: Actor): Get => {\n return new Get(get.id, get.nodeId, from, get.recipients, get.childKey, get.jsonStr, get.checksum);\n}\n\nconst parsePut = (put: any, from: Actor): Put => {\n return new Put(put.id, put.updatedNodes, from, put.inResponseTo, put.recipients, put.jsonStr, put.checksum);\n}\n\nexport function messageFromJsonString(jsonStr: string, from: Actor): Message {\n const obj = JSON.parse(jsonStr);\n if (obj.get) {\n return parseGet(obj.get, from);\n } else if (obj.put) {\n return parsePut(obj.put, from);\n } else {\n throw new Error('Unknown message type');\n }\n}","export default class QuickLRU extends Map {\n\tconstructor(options = {}) {\n\t\tsuper();\n\n\t\tif (!(options.maxSize && options.maxSize > 0)) {\n\t\t\tthrow new TypeError('`maxSize` must be a number greater than 0');\n\t\t}\n\n\t\tif (typeof options.maxAge === 'number' && options.maxAge === 0) {\n\t\t\tthrow new TypeError('`maxAge` must be a number greater than 0');\n\t\t}\n\n\t\t// TODO: Use private class fields when ESLint supports them.\n\t\tthis.maxSize = options.maxSize;\n\t\tthis.maxAge = options.maxAge || Number.POSITIVE_INFINITY;\n\t\tthis.onEviction = options.onEviction;\n\t\tthis.cache = new Map();\n\t\tthis.oldCache = new Map();\n\t\tthis._size = 0;\n\t}\n\n\t// TODO: Use private class methods when targeting Node.js 16.\n\t_emitEvictions(cache) {\n\t\tif (typeof this.onEviction !== 'function') {\n\t\t\treturn;\n\t\t}\n\n\t\tfor (const [key, item] of cache) {\n\t\t\tthis.onEviction(key, item.value);\n\t\t}\n\t}\n\n\t_deleteIfExpired(key, item) {\n\t\tif (typeof item.expiry === 'number' && item.expiry <= Date.now()) {\n\t\t\tif (typeof this.onEviction === 'function') {\n\t\t\t\tthis.onEviction(key, item.value);\n\t\t\t}\n\n\t\t\treturn this.delete(key);\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t_getOrDeleteIfExpired(key, item) {\n\t\tconst deleted = this._deleteIfExpired(key, item);\n\t\tif (deleted === false) {\n\t\t\treturn item.value;\n\t\t}\n\t}\n\n\t_getItemValue(key, item) {\n\t\treturn item.expiry ? this._getOrDeleteIfExpired(key, item) : item.value;\n\t}\n\n\t_peek(key, cache) {\n\t\tconst item = cache.get(key);\n\n\t\treturn this._getItemValue(key, item);\n\t}\n\n\t_set(key, value) {\n\t\tthis.cache.set(key, value);\n\t\tthis._size++;\n\n\t\tif (this._size >= this.maxSize) {\n\t\t\tthis._size = 0;\n\t\t\tthis._emitEvictions(this.oldCache);\n\t\t\tthis.oldCache = this.cache;\n\t\t\tthis.cache = new Map();\n\t\t}\n\t}\n\n\t_moveToRecent(key, item) {\n\t\tthis.oldCache.delete(key);\n\t\tthis._set(key, item);\n\t}\n\n\t* _entriesAscending() {\n\t\tfor (const item of this.oldCache) {\n\t\t\tconst [key, value] = item;\n\t\t\tif (!this.cache.has(key)) {\n\t\t\t\tconst deleted = this._deleteIfExpired(key, value);\n\t\t\t\tif (deleted === false) {\n\t\t\t\t\tyield item;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (const item of this.cache) {\n\t\t\tconst [key, value] = item;\n\t\t\tconst deleted = this._deleteIfExpired(key, value);\n\t\t\tif (deleted === false) {\n\t\t\t\tyield item;\n\t\t\t}\n\t\t}\n\t}\n\n\tget(key) {\n\t\tif (this.cache.has(key)) {\n\t\t\tconst item = this.cache.get(key);\n\n\t\t\treturn this._getItemValue(key, item);\n\t\t}\n\n\t\tif (this.oldCache.has(key)) {\n\t\t\tconst item = this.oldCache.get(key);\n\t\t\tif (this._deleteIfExpired(key, item) === false) {\n\t\t\t\tthis._moveToRecent(key, item);\n\t\t\t\treturn item.value;\n\t\t\t}\n\t\t}\n\t}\n\n\tset(key, value, {maxAge = this.maxAge} = {}) {\n\t\tconst expiry =\n\t\t\ttypeof maxAge === 'number' && maxAge !== Number.POSITIVE_INFINITY ?\n\t\t\t\tDate.now() + maxAge :\n\t\t\t\tundefined;\n\t\tif (this.cache.has(key)) {\n\t\t\tthis.cache.set(key, {\n\t\t\t\tvalue,\n\t\t\t\texpiry\n\t\t\t});\n\t\t} else {\n\t\t\tthis._set(key, {value, expiry});\n\t\t}\n\t}\n\n\thas(key) {\n\t\tif (this.cache.has(key)) {\n\t\t\treturn !this._deleteIfExpired(key, this.cache.get(key));\n\t\t}\n\n\t\tif (this.oldCache.has(key)) {\n\t\t\treturn !this._deleteIfExpired(key, this.oldCache.get(key));\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tpeek(key) {\n\t\tif (this.cache.has(key)) {\n\t\t\treturn this._peek(key, this.cache);\n\t\t}\n\n\t\tif (this.oldCache.has(key)) {\n\t\t\treturn this._peek(key, this.oldCache);\n\t\t}\n\t}\n\n\tdelete(key) {\n\t\tconst deleted = this.cache.delete(key);\n\t\tif (deleted) {\n\t\t\tthis._size--;\n\t\t}\n\n\t\treturn this.oldCache.delete(key) || deleted;\n\t}\n\n\tclear() {\n\t\tthis.cache.clear();\n\t\tthis.oldCache.clear();\n\t\tthis._size = 0;\n\t}\n\n\tresize(newSize) {\n\t\tif (!(newSize && newSize > 0)) {\n\t\t\tthrow new TypeError('`maxSize` must be a number greater than 0');\n\t\t}\n\n\t\tconst items = [...this._entriesAscending()];\n\t\tconst removeCount = items.length - newSize;\n\t\tif (removeCount < 0) {\n\t\t\tthis.cache = new Map(items);\n\t\t\tthis.oldCache = new Map();\n\t\t\tthis._size = items.length;\n\t\t} else {\n\t\t\tif (removeCount > 0) {\n\t\t\t\tthis._emitEvictions(items.slice(0, removeCount));\n\t\t\t}\n\n\t\t\tthis.oldCache = new Map(items.slice(removeCount));\n\t\t\tthis.cache = new Map();\n\t\t\tthis._size = 0;\n\t\t}\n\n\t\tthis.maxSize = newSize;\n\t}\n\n\t* keys() {\n\t\tfor (const [key] of this) {\n\t\t\tyield key;\n\t\t}\n\t}\n\n\t* values() {\n\t\tfor (const [, value] of this) {\n\t\t\tyield value;\n\t\t}\n\t}\n\n\t* [Symbol.iterator]() {\n\t\tfor (const item of this.cache) {\n\t\t\tconst [key, value] = item;\n\t\t\tconst deleted = this._deleteIfExpired(key, value);\n\t\t\tif (deleted === false) {\n\t\t\t\tyield [key, value.value];\n\t\t\t}\n\t\t}\n\n\t\tfor (const item of this.oldCache) {\n\t\t\tconst [key, value] = item;\n\t\t\tif (!this.cache.has(key)) {\n\t\t\t\tconst deleted = this._deleteIfExpired(key, value);\n\t\t\t\tif (deleted === false) {\n\t\t\t\t\tyield [key, value.value];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t* entriesDescending() {\n\t\tlet items = [...this.cache];\n\t\tfor (let i = items.length - 1; i >= 0; --i) {\n\t\t\tconst item = items[i];\n\t\t\tconst [key, value] = item;\n\t\t\tconst deleted = this._deleteIfExpired(key, value);\n\t\t\tif (deleted === false) {\n\t\t\t\tyield [key, value.value];\n\t\t\t}\n\t\t}\n\n\t\titems = [...this.oldCache];\n\t\tfor (let i = items.length - 1; i >= 0; --i) {\n\t\t\tconst item = items[i];\n\t\t\tconst [key, value] = item;\n\t\t\tif (!this.cache.has(key)) {\n\t\t\t\tconst deleted = this._deleteIfExpired(key, value);\n\t\t\t\tif (deleted === false) {\n\t\t\t\t\tyield [key, value.value];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t* entriesAscending() {\n\t\tfor (const [key, value] of this._entriesAscending()) {\n\t\t\tyield [key, value.value];\n\t\t}\n\t}\n\n\tget size() {\n\t\tif (!this._size) {\n\t\t\treturn this.oldCache.size;\n\t\t}\n\n\t\tlet oldCacheSize = 0;\n\t\tfor (const key of this.oldCache.keys()) {\n\t\t\tif (!this.cache.has(key)) {\n\t\t\t\toldCacheSize++;\n\t\t\t}\n\t\t}\n\n\t\treturn Math.min(this._size + oldCacheSize, this.maxSize);\n\t}\n\n\tentries() {\n\t\treturn this.entriesAscending();\n\t}\n\n\tforEach(callbackFunction, thisArgument = this) {\n\t\tfor (const [key, value] of this.entriesAscending()) {\n\t\t\tcallbackFunction.call(thisArgument, value, key, this);\n\t\t}\n\t}\n\n\tget [Symbol.toStringTag]() {\n\t\treturn JSON.stringify([...this.entriesAscending()]);\n\t}\n}\n","import {Put, Get, Message} from '../Message'\nimport { Actor } from '../Actor';\nimport QuickLRU from 'quick-lru';\nimport {Children} from \"../Node\";\n//import {NodeData} from \"../Node\";\n// import * as Comlink from \"comlink\";\nimport _ from '../../lodash';\n\nexport default class Memory extends Actor {\n config = {};\n store: QuickLRU = new QuickLRU({ maxSize: 10000 });\n\n constructor(config: any = {}) {\n super();\n this.config = config;\n }\n\n handle(message: Message) {\n if (message instanceof Put) {\n this.handlePut(message);\n } else if (message instanceof Get) {\n this.handleGet(message);\n } else {\n console.log('Memory got unknown message', message);\n }\n }\n\n handleGet(message: Get) {\n if (!message.from) {\n console.log('no from in get message');\n return;\n }\n let children = this.store.get(message.nodeId);\n if (children) {\n //console.log('have', message.nodeId, children);\n const putMessage = Put.newFromKv(message.nodeId, children, this);\n putMessage.inResponseTo = message.id;\n message.from && message.from.postMessage(putMessage);\n } else {\n //console.log('dont have', message.nodeId);\n }\n }\n\n mergeAndSave(nodeName: string, children: Children) {\n const existing = this.store.get(nodeName);\n\n // TODO check updatedAt timestamp\n if (existing === undefined) {\n this.store.set(nodeName, children);\n } else {\n for (const [key, value] of Object.entries(children)) {\n if (existing[key] && existing[key].updatedAt >= value.updatedAt) {\n continue;\n }\n existing[key] = value;\n }\n this.store.set(nodeName, existing);\n }\n }\n\n async handlePut(put: Put) {\n for (const [nodeName, children] of Object.entries(put.updatedNodes)) {\n if (!children) {\n console.log('deleting', nodeName);\n this.store.delete(nodeName);\n continue;\n }\n this.mergeAndSave(nodeName, children);\n }\n }\n}\n\n/*\nlet actor;\nglobal.onconnect = () => {\n if (actor) {\n console.log ('worker already exists');\n } else {\n console.log('starting worker');\n actor = actor || new IndexedDB();\n }\n}\n */\n\n// self.onconnect = (e) => Comlink.expose(actor, e.ports[0]);","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n","declare var global;\nexport const _global: any =\n typeof globalThis !== 'undefined' ? globalThis :\n typeof self !== 'undefined' ? self :\n typeof window !== 'undefined' ? window :\n global;\n","import { _global } from \"../globals/global\";\nexport const keys = Object.keys;\nexport const isArray = Array.isArray;\nif (typeof Promise !== 'undefined' && !_global.Promise){\n // In jsdom, this it can be the case that Promise is not put on the global object.\n // If so, we need to patch the global object for the rest of the code to work as expected.\n // Other dexie code expects Promise to be on the global object (like normal browser environments)\n _global.Promise = Promise;\n}\nexport { _global }\n\nexport function extend(obj: T, extension: X): T & X {\n if (typeof extension !== 'object') return obj as T & X;\n keys(extension).forEach(function (key) {\n obj[key] = extension[key];\n });\n return obj as T & X;\n}\n\nexport const getProto = Object.getPrototypeOf;\nexport const _hasOwn = {}.hasOwnProperty;\nexport function hasOwn(obj, prop) {\n return _hasOwn.call(obj, prop);\n}\n\nexport function props (proto, extension) {\n if (typeof extension === 'function') extension = extension(getProto(proto));\n (typeof Reflect === \"undefined\" ? keys : Reflect.ownKeys)(extension).forEach(key => {\n setProp(proto, key, extension[key]);\n });\n}\n\nexport const defineProperty = Object.defineProperty;\n\nexport function setProp(obj, prop, functionOrGetSet, options?) {\n defineProperty(obj, prop, extend(functionOrGetSet && hasOwn(functionOrGetSet, \"get\") && typeof functionOrGetSet.get === 'function' ?\n {get: functionOrGetSet.get, set: functionOrGetSet.set, configurable: true} :\n {value: functionOrGetSet, configurable: true, writable: true}, options));\n}\n\nexport function derive(Child) {\n return {\n from: function (Parent) {\n Child.prototype = Object.create(Parent.prototype);\n setProp(Child.prototype, \"constructor\", Child);\n return {\n extend: props.bind(null, Child.prototype)\n };\n }\n };\n}\n\nexport const getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\nexport function getPropertyDescriptor(obj, prop) {\n const pd = getOwnPropertyDescriptor(obj, prop);\n let proto;\n return pd || (proto = getProto(obj)) && getPropertyDescriptor (proto, prop);\n}\n\nconst _slice = [].slice;\nexport function slice(args, start?, end?) {\n return _slice.call(args, start, end);\n}\n\nexport function override(origFunc, overridedFactory) {\n return overridedFactory(origFunc);\n}\n\nexport function assert (b) {\n if (!b) throw new Error(\"Assertion Failed\");\n}\n\nexport function asap(fn) {\n // @ts-ignore\n if (_global.setImmediate) setImmediate(fn); else setTimeout(fn, 0);\n}\n\nexport function getUniqueArray(a) {\n return a.filter((value, index, self) => self.indexOf(value) === index);\n}\n\n/** Generate an object (hash map) based on given array.\n * @param extractor Function taking an array item and its index and returning an array of 2 items ([key, value]) to\n * instert on the resulting object for each item in the array. If this function returns a falsy value, the\n * current item wont affect the resulting object.\n */\nexport function arrayToObject (array: T[], extractor: (x:T, idx: number)=>[string, R]): {[name: string]: R} {\n return array.reduce((result, item, i) => {\n var nameAndValue = extractor(item, i);\n if (nameAndValue) result[nameAndValue[0]] = nameAndValue[1];\n return result;\n }, {});\n}\n\nexport function trycatcher(fn, reject) {\n return function () {\n try {\n fn.apply(this, arguments);\n } catch (e) {\n reject(e);\n }\n };\n}\n\nexport function tryCatch(fn: (...args: any[])=>void, onerror, args?) : void {\n try {\n fn.apply(null, args);\n } catch (ex) {\n onerror && onerror(ex);\n }\n}\n\nexport function getByKeyPath(obj, keyPath) {\n // http://www.w3.org/TR/IndexedDB/#steps-for-extracting-a-key-from-a-value-using-a-key-path\n if (hasOwn(obj, keyPath)) return obj[keyPath]; // This line is moved from last to first for optimization purpose.\n if (!keyPath) return obj;\n if (typeof keyPath !== 'string') {\n var rv = [];\n for (var i = 0, l = keyPath.length; i < l; ++i) {\n var val = getByKeyPath(obj, keyPath[i]);\n rv.push(val);\n }\n return rv;\n }\n var period = keyPath.indexOf('.');\n if (period !== -1) {\n var innerObj = obj[keyPath.substr(0, period)];\n return innerObj === undefined ? undefined : getByKeyPath(innerObj, keyPath.substr(period + 1));\n }\n return undefined;\n}\n\nexport function setByKeyPath(obj, keyPath, value) {\n if (!obj || keyPath === undefined) return;\n if ('isFrozen' in Object && Object.isFrozen(obj)) return;\n if (typeof keyPath !== 'string' && 'length' in keyPath) {\n assert(typeof value !== 'string' && 'length' in value);\n for (var i = 0, l = keyPath.length; i < l; ++i) {\n setByKeyPath(obj, keyPath[i], value[i]);\n }\n } else {\n var period = keyPath.indexOf('.');\n if (period !== -1) {\n var currentKeyPath = keyPath.substr(0, period);\n var remainingKeyPath = keyPath.substr(period + 1);\n if (remainingKeyPath === \"\")\n if (value === undefined) {\n if (isArray(obj) && !isNaN(parseInt(currentKeyPath))) obj.splice(currentKeyPath, 1);\n else delete obj[currentKeyPath];\n } else obj[currentKeyPath] = value;\n else {\n var innerObj = obj[currentKeyPath];\n if (!innerObj || !hasOwn(obj, currentKeyPath)) innerObj = (obj[currentKeyPath] = {});\n setByKeyPath(innerObj, remainingKeyPath, value);\n }\n } else {\n if (value === undefined) {\n if (isArray(obj) && !isNaN(parseInt(keyPath))) obj.splice(keyPath, 1);\n else delete obj[keyPath];\n } else obj[keyPath] = value;\n }\n }\n}\n\nexport function delByKeyPath(obj, keyPath) {\n if (typeof keyPath === 'string')\n setByKeyPath(obj, keyPath, undefined);\n else if ('length' in keyPath)\n [].map.call(keyPath, function(kp) {\n setByKeyPath(obj, kp, undefined);\n });\n}\n\nexport function shallowClone(obj) {\n var rv = {};\n for (var m in obj) {\n if (hasOwn(obj, m)) rv[m] = obj[m];\n }\n return rv;\n}\n\nconst concat = [].concat;\nexport function flatten (a: (T | T[])[]) : T[] {\n return concat.apply([], a);\n}\n\n//https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Structured_clone_algorithm\nconst intrinsicTypeNames =\n \"Boolean,String,Date,RegExp,Blob,File,FileList,FileSystemFileHandle,ArrayBuffer,DataView,Uint8ClampedArray,ImageBitmap,ImageData,Map,Set,CryptoKey\"\n .split(',').concat(\n flatten([8,16,32,64].map(num=>[\"Int\",\"Uint\",\"Float\"].map(t=>t+num+\"Array\")))\n ).filter(t=>_global[t]);\nconst intrinsicTypes = intrinsicTypeNames.map(t=>_global[t]);\nexport const intrinsicTypeNameSet = arrayToObject(intrinsicTypeNames, x=>[x,true]);\n\nlet circularRefs: null | WeakMap = null;\nexport function deepClone(any: T): T {\n circularRefs = typeof WeakMap !== 'undefined' && new WeakMap();\n const rv = innerDeepClone(any);\n circularRefs = null;\n return rv;\n}\n\nfunction innerDeepClone(any: T): T {\n if (!any || typeof any !== 'object') return any;\n let rv = circularRefs && circularRefs.get(any); // Resolve circular references\n if (rv) return rv;\n if (isArray(any)) {\n rv = [];\n circularRefs && circularRefs.set(any, rv);\n for (var i = 0, l = any.length; i < l; ++i) {\n rv.push(innerDeepClone(any[i]));\n }\n } else if (intrinsicTypes.indexOf(any.constructor) >= 0) {\n rv = any;\n } else {\n const proto = getProto(any);\n rv = proto === Object.prototype ? {} : Object.create(proto);\n circularRefs && circularRefs.set(any, rv);\n for (var prop in any) {\n if (hasOwn(any, prop)) {\n rv[prop] = innerDeepClone(any[prop]);\n }\n }\n }\n return rv;\n}\n\nconst {toString} = {};\nexport function toStringTag(o: Object) {\n return toString.call(o).slice(8, -1);\n}\n\n// If first argument is iterable or array-like, return it as an array\nexport const iteratorSymbol = typeof Symbol !== 'undefined' ?\n Symbol.iterator :\n '@@iterator';\nexport const getIteratorOf = typeof iteratorSymbol === \"symbol\" ? function(x) {\n var i;\n return x != null && (i = x[iteratorSymbol]) && i.apply(x);\n} : function () { return null; };\nexport const asyncIteratorSymbol = typeof Symbol !== 'undefined'\n ? Symbol.asyncIterator || Symbol.for(\"Symbol.asyncIterator\")\n : '@asyncIterator';\n\nexport const NO_CHAR_ARRAY = {};\n// Takes one or several arguments and returns an array based on the following criteras:\n// * If several arguments provided, return arguments converted to an array in a way that\n// still allows javascript engine to optimize the code.\n// * If single argument is an array, return a clone of it.\n// * If this-pointer equals NO_CHAR_ARRAY, don't accept strings as valid iterables as a special\n// case to the two bullets below.\n// * If single argument is an iterable, convert it to an array and return the resulting array.\n// * If single argument is array-like (has length of type number), convert it to an array.\nexport function getArrayOf (arrayLike) {\n var i, a, x, it;\n if (arguments.length === 1) {\n if (isArray(arrayLike)) return arrayLike.slice();\n if (this === NO_CHAR_ARRAY && typeof arrayLike === 'string') return [arrayLike];\n if ((it = getIteratorOf(arrayLike))) {\n a = [];\n while ((x = it.next()), !x.done) a.push(x.value);\n return a;\n }\n if (arrayLike == null) return [arrayLike];\n i = arrayLike.length;\n if (typeof i === 'number') {\n a = new Array(i);\n while (i--) a[i] = arrayLike[i];\n return a;\n }\n return [arrayLike];\n }\n i = arguments.length;\n a = new Array(i);\n while (i--) a[i] = arguments[i];\n return a;\n}\nexport const isAsyncFunction = typeof Symbol !== 'undefined'\n ? (fn: Function) => fn[Symbol.toStringTag] === 'AsyncFunction'\n : ()=>false;\n","// By default, debug will be true only if platform is a web platform and its page is served from localhost.\n// When debug = true, error's stacks will contain asyncronic long stacks.\nexport var debug = typeof location !== 'undefined' &&\n // By default, use debug mode if served from localhost.\n /^(http|https):\\/\\/(localhost|127\\.0\\.0\\.1)/.test(location.href);\n\nexport function setDebug(value, filter) {\n debug = value;\n libraryFilter = filter;\n}\n\nexport var libraryFilter = () => true;\n\nexport const NEEDS_THROW_FOR_STACK = !new Error(\"\").stack;\n\nexport function getErrorWithStack() {\n \"use strict\";\n if (NEEDS_THROW_FOR_STACK) try {\n // Doing something naughty in strict mode here to trigger a specific error\n // that can be explicitely ignored in debugger's exception settings.\n // If we'd just throw new Error() here, IE's debugger's exception settings\n // will just consider it as \"exception thrown by javascript code\" which is\n // something you wouldn't want it to ignore.\n getErrorWithStack.arguments;\n throw new Error(); // Fallback if above line don't throw.\n } catch(e) {\n return e;\n }\n return new Error();\n}\n\nexport function prettyStack(exception, numIgnoredFrames) {\n var stack = exception.stack;\n if (!stack) return \"\";\n numIgnoredFrames = (numIgnoredFrames || 0);\n if (stack.indexOf(exception.name) === 0)\n numIgnoredFrames += (exception.name + exception.message).split('\\n').length;\n return stack.split('\\n')\n .slice(numIgnoredFrames)\n .filter(libraryFilter)\n .map(frame => \"\\n\" + frame)\n .join('');\n}\n\n// TODO: Replace this in favor of a decorator instead.\nexport function deprecated (what: string, fn: (...args)=>T) {\n return function () {\n console.warn(`${what} is deprecated. See https://dexie.org/docs/Deprecations. ${prettyStack(getErrorWithStack(), 1)}`);\n return fn.apply(this, arguments);\n } as (...args)=>T\n}\n","import { derive, setProp } from '../functions/utils';\nimport { getErrorWithStack, prettyStack } from '../helpers/debug';\n\nvar dexieErrorNames = [\n 'Modify',\n 'Bulk',\n 'OpenFailed',\n 'VersionChange',\n 'Schema',\n 'Upgrade',\n 'InvalidTable',\n 'MissingAPI',\n 'NoSuchDatabase',\n 'InvalidArgument',\n 'SubTransaction',\n 'Unsupported',\n 'Internal',\n 'DatabaseClosed',\n 'PrematureCommit',\n 'ForeignAwait'\n];\n\nvar idbDomErrorNames = [\n 'Unknown',\n 'Constraint',\n 'Data',\n 'TransactionInactive',\n 'ReadOnly',\n 'Version',\n 'NotFound',\n 'InvalidState',\n 'InvalidAccess',\n 'Abort',\n 'Timeout',\n 'QuotaExceeded',\n 'Syntax',\n 'DataClone'\n];\n\nvar errorList = dexieErrorNames.concat(idbDomErrorNames);\n\nvar defaultTexts = {\n VersionChanged: \"Database version changed by other database connection\",\n DatabaseClosed: \"Database has been closed\",\n Abort: \"Transaction aborted\",\n TransactionInactive: \"Transaction has already completed or failed\",\n MissingAPI: \"IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb\"\n};\n\n//\n// DexieError - base class of all out exceptions.\n//\nexport function DexieError (name, msg) {\n // Reason we don't use ES6 classes is because:\n // 1. It bloats transpiled code and increases size of minified code.\n // 2. It doesn't give us much in this case.\n // 3. It would require sub classes to call super(), which\n // is not needed when deriving from Error.\n this._e = getErrorWithStack();\n this.name = name;\n this.message = msg;\n}\n\nderive(DexieError).from(Error).extend({\n stack: {\n get: function() {\n return this._stack ||\n (this._stack = this.name + \": \" + this.message + prettyStack(this._e, 2));\n }\n },\n toString: function(){ return this.name + \": \" + this.message; }\n});\n\nfunction getMultiErrorMessage (msg, failures) {\n return msg + \". Errors: \" + Object.keys(failures)\n .map(key=>failures[key].toString())\n .filter((v,i,s)=>s.indexOf(v) === i) // Only unique error strings\n .join('\\n');\n}\n\n//\n// ModifyError - thrown in Collection.modify()\n// Specific constructor because it contains members failures and failedKeys.\n//\nexport function ModifyError (msg, failures, successCount, failedKeys) {\n this._e = getErrorWithStack();\n this.failures = failures;\n this.failedKeys = failedKeys;\n this.successCount = successCount;\n this.message = getMultiErrorMessage(msg, failures);\n}\nderive(ModifyError).from(DexieError);\n\nexport function BulkError (msg, failures) {\n this._e = getErrorWithStack();\n this.name = \"BulkError\";\n this.failures = Object.keys(failures).map(pos => failures[pos]);\n this.failuresByPos = failures;\n this.message = getMultiErrorMessage(msg, failures);\n}\nderive(BulkError).from(DexieError);\n\n//\n//\n// Dynamically generate error names and exception classes based\n// on the names in errorList.\n//\n//\n\n// Map of {ErrorName -> ErrorName + \"Error\"}\nexport var errnames = errorList.reduce((obj,name)=>(obj[name]=name+\"Error\",obj),{});\n\n// Need an alias for DexieError because we're gonna create subclasses with the same name.\nconst BaseException = DexieError;\n// Map of {ErrorName -> exception constructor}\nexport var exceptions = errorList.reduce((obj,name)=>{\n // Let the name be \"DexieError\" because this name may\n // be shown in call stack and when debugging. DexieError is\n // the most true name because it derives from DexieError,\n // and we cannot change Function.name programatically without\n // dynamically create a Function object, which would be considered\n // 'eval-evil'.\n var fullName = name + \"Error\";\n function DexieError (msgOrInner, inner){\n this._e = getErrorWithStack();\n this.name = fullName;\n if (!msgOrInner) {\n this.message = defaultTexts[name] || fullName;\n this.inner = null;\n } else if (typeof msgOrInner === 'string') {\n this.message = `${msgOrInner}${!inner ? '' : '\\n ' + inner}`;\n this.inner = inner || null;\n } else if (typeof msgOrInner === 'object') {\n this.message = `${msgOrInner.name} ${msgOrInner.message}`;\n this.inner = msgOrInner;\n }\n }\n derive(DexieError).from(BaseException);\n obj[name]=DexieError;\n return obj;\n},{});\n\n// Use ECMASCRIPT standard exceptions where applicable:\nexceptions.Syntax = SyntaxError;\nexceptions.Type = TypeError;\nexceptions.Range = RangeError;\n\nexport var exceptionMap = idbDomErrorNames.reduce((obj, name)=>{\n obj[name + \"Error\"] = exceptions[name];\n return obj;\n}, {});\n\nexport function mapError (domError, message) {\n if (!domError || domError instanceof DexieError || domError instanceof TypeError || domError instanceof SyntaxError || !domError.name || !exceptionMap[domError.name])\n return domError;\n var rv = new exceptionMap[domError.name](message || domError.message, domError);\n if (\"stack\" in domError) {\n // Derive stack from inner exception if it has a stack\n setProp(rv, \"stack\", {get: function(){\n return this.inner.stack;\n }});\n }\n return rv;\n}\n\nexport var fullNameExceptions = errorList.reduce((obj, name)=>{\n if ([\"Syntax\",\"Type\",\"Range\"].indexOf(name) === -1)\n obj[name + \"Error\"] = exceptions[name];\n return obj;\n}, {});\n\nfullNameExceptions.ModifyError = ModifyError;\nfullNameExceptions.DexieError = DexieError;\nfullNameExceptions.BulkError = BulkError;\n","import {extend} from './utils';\n\nexport function nop() { }\nexport function mirror(val) { return val; }\nexport function pureFunctionChain(f1, f2) {\n // Enables chained events that takes ONE argument and returns it to the next function in chain.\n // This pattern is used in the hook(\"reading\") event.\n if (f1 == null || f1 === mirror) return f2;\n return function (val) {\n return f2(f1(val));\n };\n}\n\nexport function callBoth(on1, on2) {\n return function () {\n on1.apply(this, arguments);\n on2.apply(this, arguments);\n };\n}\n\nexport function hookCreatingChain(f1, f2) {\n // Enables chained events that takes several arguments and may modify first argument by making a modification and then returning the same instance.\n // This pattern is used in the hook(\"creating\") event.\n if (f1 === nop) return f2;\n return function () {\n var res = f1.apply(this, arguments);\n if (res !== undefined) arguments[0] = res;\n var onsuccess = this.onsuccess, // In case event listener has set this.onsuccess\n onerror = this.onerror; // In case event listener has set this.onerror\n this.onsuccess = null;\n this.onerror = null;\n var res2 = f2.apply(this, arguments);\n if (onsuccess) this.onsuccess = this.onsuccess ? callBoth(onsuccess, this.onsuccess) : onsuccess;\n if (onerror) this.onerror = this.onerror ? callBoth(onerror, this.onerror) : onerror;\n return res2 !== undefined ? res2 : res;\n };\n}\n\nexport function hookDeletingChain(f1, f2) {\n if (f1 === nop) return f2;\n return function () {\n f1.apply(this, arguments);\n var onsuccess = this.onsuccess, // In case event listener has set this.onsuccess\n onerror = this.onerror; // In case event listener has set this.onerror\n this.onsuccess = this.onerror = null;\n f2.apply(this, arguments);\n if (onsuccess) this.onsuccess = this.onsuccess ? callBoth(onsuccess, this.onsuccess) : onsuccess;\n if (onerror) this.onerror = this.onerror ? callBoth(onerror, this.onerror) : onerror;\n };\n}\n\nexport function hookUpdatingChain(f1, f2) {\n if (f1 === nop) return f2;\n return function (modifications) {\n var res = f1.apply(this, arguments);\n extend(modifications, res); // If f1 returns new modifications, extend caller's modifications with the result before calling next in chain.\n var onsuccess = this.onsuccess, // In case event listener has set this.onsuccess\n onerror = this.onerror; // In case event listener has set this.onerror\n this.onsuccess = null;\n this.onerror = null;\n var res2 = f2.apply(this, arguments);\n if (onsuccess) this.onsuccess = this.onsuccess ? callBoth(onsuccess, this.onsuccess) : onsuccess;\n if (onerror) this.onerror = this.onerror ? callBoth(onerror, this.onerror) : onerror;\n return res === undefined ?\n (res2 === undefined ? undefined : res2) :\n (extend(res, res2));\n };\n}\n\nexport function reverseStoppableEventChain(f1, f2) {\n if (f1 === nop) return f2;\n return function () {\n if (f2.apply(this, arguments) === false) return false;\n return f1.apply(this, arguments);\n };\n}\n\nexport function nonStoppableEventChain(f1, f2) {\n if (f1 === nop) return f2;\n return function () {\n f1.apply(this, arguments);\n f2.apply(this, arguments);\n };\n}\n\nexport function promisableChain(f1, f2) {\n if (f1 === nop) return f2;\n return function () {\n var res = f1.apply(this, arguments);\n if (res && typeof res.then === 'function') {\n var thiz = this,\n i = arguments.length,\n args = new Array(i);\n while (i--) args[i] = arguments[i];\n return res.then(function () {\n return f2.apply(thiz, args);\n });\n }\n return f2.apply(this, arguments);\n };\n}\n","/*\n * Copyright (c) 2014-2017 David Fahlander\n * Apache License Version 2.0, January 2004, http://www.apache.org/licenses/LICENSE-2.0\n */\nimport { _global } from '../globals/global';\nimport {tryCatch, props, setProp, _global,\n getPropertyDescriptor, getArrayOf, extend, getProto} from '../functions/utils';\nimport {nop, callBoth, mirror} from '../functions/chaining-functions';\nimport {debug, prettyStack, getErrorWithStack} from './debug';\nimport {exceptions} from '../errors';\n\n//\n// Promise and Zone (PSD) for Dexie library\n//\n// I started out writing this Promise class by copying promise-light (https://github.com/taylorhakes/promise-light) by\n// https://github.com/taylorhakes - an A+ and ECMASCRIPT 6 compliant Promise implementation.\n//\n// In previous versions this was fixed by not calling setTimeout when knowing that the resolve() or reject() came from another\n// tick. In Dexie v1.4.0, I've rewritten the Promise class entirely. Just some fragments of promise-light is left. I use\n// another strategy now that simplifies everything a lot: to always execute callbacks in a new micro-task, but have an own micro-task\n// engine that is indexedDB compliant across all browsers.\n// Promise class has also been optimized a lot with inspiration from bluebird - to avoid closures as much as possible.\n// Also with inspiration from bluebird, asyncronic stacks in debug mode.\n//\n// Specific non-standard features of this Promise class:\n// * Custom zone support (a.k.a. PSD) with ability to keep zones also when using native promises as well as\n// native async / await.\n// * Promise.follow() method built upon the custom zone engine, that allows user to track all promises created from current stack frame\n// and below + all promises that those promises creates or awaits.\n// * Detect any unhandled promise in a PSD-scope (PSD.onunhandled). \n//\n// David Fahlander, https://github.com/dfahlander\n//\n\n// Just a pointer that only this module knows about.\n// Used in Promise constructor to emulate a private constructor.\nvar INTERNAL = {};\n\n// Async stacks (long stacks) must not grow infinitely.\nconst\n LONG_STACKS_CLIP_LIMIT = 100,\n // When calling error.stack or promise.stack, limit the number of asyncronic stacks to print out. \n MAX_LONG_STACKS = 20,\n ZONE_ECHO_LIMIT = 100,\n [resolvedNativePromise, nativePromiseProto, resolvedGlobalPromise] = typeof Promise === 'undefined' ?\n [] :\n (()=>{\n let globalP = Promise.resolve();\n if (typeof crypto === 'undefined' || !crypto.subtle)\n return [globalP, getProto(globalP), globalP];\n // Generate a native promise (as window.Promise may have been patched)\n const nativeP = crypto.subtle.digest(\"SHA-512\", new Uint8Array([0]));\n return [\n nativeP,\n getProto(nativeP),\n globalP\n ];\n })(),\n nativePromiseThen = nativePromiseProto && nativePromiseProto.then;\n\nexport const NativePromise = resolvedNativePromise && resolvedNativePromise.constructor;\nconst patchGlobalPromise = !!resolvedGlobalPromise;\n\nvar stack_being_generated = false;\n\n/* The default function used only for the very first promise in a promise chain.\n As soon as then promise is resolved or rejected, all next tasks will be executed in micro ticks\n emulated in this module. For indexedDB compatibility, this means that every method needs to \n execute at least one promise before doing an indexedDB operation. Dexie will always call \n db.ready().then() for every operation to make sure the indexedDB event is started in an\n indexedDB-compatible emulated micro task loop.\n*/\nvar schedulePhysicalTick = resolvedGlobalPromise ?\n () => {resolvedGlobalPromise.then(physicalTick);}\n :\n _global.setImmediate ? \n // setImmediate supported. Those modern platforms also supports Function.bind().\n setImmediate.bind(null, physicalTick) :\n _global.MutationObserver ?\n // MutationObserver supported\n () => {\n var hiddenDiv = document.createElement(\"div\");\n (new MutationObserver(() => {\n physicalTick();\n hiddenDiv = null;\n })).observe(hiddenDiv, { attributes: true });\n hiddenDiv.setAttribute('i', '1');\n } :\n // No support for setImmediate or MutationObserver. No worry, setTimeout is only called\n // once time. Every tick that follows will be our emulated micro tick.\n // Could have uses setTimeout.bind(null, 0, physicalTick) if it wasnt for that FF13 and below has a bug \n ()=>{setTimeout(physicalTick,0);};\n\n// Configurable through Promise.scheduler.\n// Don't export because it would be unsafe to let unknown\n// code call it unless they do try..catch within their callback.\n// This function can be retrieved through getter of Promise.scheduler though,\n// but users must not do Promise.scheduler = myFuncThatThrowsException\nvar asap = function (callback, args) {\n microtickQueue.push([callback, args]);\n if (needsNewPhysicalTick) {\n schedulePhysicalTick();\n needsNewPhysicalTick = false;\n }\n};\n\nvar isOutsideMicroTick = true, // True when NOT in a virtual microTick.\n needsNewPhysicalTick = true, // True when a push to microtickQueue must also schedulePhysicalTick()\n unhandledErrors = [], // Rejected promises that has occured. Used for triggering 'unhandledrejection'.\n rejectingErrors = [], // Tracks if errors are being re-rejected during onRejected callback.\n currentFulfiller = null,\n rejectionMapper = mirror; // Remove in next major when removing error mapping of DOMErrors and DOMExceptions\n \nexport var globalPSD = {\n id: 'global',\n global: true,\n ref: 0,\n unhandleds: [],\n onunhandled: globalError,\n pgp: false,\n env: {},\n finalize: function () {\n this.unhandleds.forEach(uh => {\n try {\n globalError(uh[0], uh[1]);\n } catch (e) {}\n });\n }\n};\n\nexport var PSD = globalPSD;\n\nexport var microtickQueue = []; // Callbacks to call in this or next physical tick.\nexport var numScheduledCalls = 0; // Number of listener-calls left to do in this physical tick.\nexport var tickFinalizers = []; // Finalizers to call when there are no more async calls scheduled within current physical tick.\n\nexport default function DexiePromise(fn) {\n if (typeof this !== 'object') throw new TypeError('Promises must be constructed via new'); \n this._listeners = [];\n this.onuncatched = nop; // Deprecate in next major. Not needed. Better to use global error handler.\n \n // A library may set `promise._lib = true;` after promise is created to make resolve() or reject()\n // execute the microtask engine implicitely within the call to resolve() or reject().\n // To remain A+ compliant, a library must only set `_lib=true` if it can guarantee that the stack\n // only contains library code when calling resolve() or reject().\n // RULE OF THUMB: ONLY set _lib = true for promises explicitely resolving/rejecting directly from\n // global scope (event handler, timer etc)!\n this._lib = false;\n // Current async scope\n var psd = (this._PSD = PSD);\n\n if (debug) {\n this._stackHolder = getErrorWithStack();\n this._prev = null;\n this._numPrev = 0; // Number of previous promises (for long stacks)\n }\n \n if (typeof fn !== 'function') {\n if (fn !== INTERNAL) throw new TypeError('Not a function');\n // Private constructor (INTERNAL, state, value).\n // Used internally by Promise.resolve() and Promise.reject().\n this._state = arguments[1];\n this._value = arguments[2];\n if (this._state === false)\n handleRejection(this, this._value); // Map error, set stack and addPossiblyUnhandledError().\n return;\n }\n \n this._state = null; // null (=pending), false (=rejected) or true (=resolved)\n this._value = null; // error or result\n ++psd.ref; // Refcounting current scope\n executePromiseTask(this, fn);\n}\n\n// Prepare a property descriptor to put onto Promise.prototype.then\nconst thenProp = {\n get: function() {\n var psd = PSD, microTaskId = totalEchoes;\n\n function then (onFulfilled, onRejected) {\n var possibleAwait = !psd.global && (psd !== PSD || microTaskId !== totalEchoes);\n const cleanup = possibleAwait && !decrementExpectedAwaits();\n var rv = new DexiePromise((resolve, reject) => {\n propagateToListener(this, new Listener(\n nativeAwaitCompatibleWrap(onFulfilled, psd, possibleAwait, cleanup),\n nativeAwaitCompatibleWrap(onRejected, psd, possibleAwait, cleanup),\n resolve,\n reject,\n psd));\n });\n debug && linkToPreviousPromise(rv, this);\n return rv;\n }\n\n then.prototype = INTERNAL; // For idempotense, see setter below.\n\n return then;\n },\n // Be idempotent and allow another framework (such as zone.js or another instance of a Dexie.Promise module) to replace Promise.prototype.then\n // and when that framework wants to restore the original property, we must identify that and restore the original property descriptor.\n set: function (value) {\n setProp (this, 'then', value && value.prototype === INTERNAL ?\n thenProp : // Restore to original property descriptor.\n {\n get: function(){\n return value; // Getter returning provided value (behaves like value is just changed)\n },\n set: thenProp.set // Keep a setter that is prepared to restore original.\n }\n );\n }\n};\n\nprops(DexiePromise.prototype, {\n then: thenProp, // Defined above.\n _then: function (onFulfilled, onRejected) {\n // A little tinier version of then() that don't have to create a resulting promise.\n propagateToListener(this, new Listener(null, null, onFulfilled, onRejected, PSD)); \n },\n\n catch: function (onRejected) {\n if (arguments.length === 1) return this.then(null, onRejected);\n // First argument is the Error type to catch\n var type = arguments[0],\n handler = arguments[1];\n return typeof type === 'function' ? this.then(null, err =>\n // Catching errors by its constructor type (similar to java / c++ / c#)\n // Sample: promise.catch(TypeError, function (e) { ... });\n err instanceof type ? handler(err) : PromiseReject(err))\n : this.then(null, err =>\n // Catching errors by the error.name property. Makes sense for indexedDB where error type\n // is always DOMError but where e.name tells the actual error type.\n // Sample: promise.catch('ConstraintError', function (e) { ... });\n err && err.name === type ? handler(err) : PromiseReject(err));\n },\n\n finally: function (onFinally) {\n return this.then(value => {\n onFinally();\n return value;\n }, err => {\n onFinally();\n return PromiseReject(err);\n });\n },\n \n stack: {\n get: function() {\n if (this._stack) return this._stack;\n try {\n stack_being_generated = true;\n var stacks = getStack (this, [], MAX_LONG_STACKS);\n var stack = stacks.join(\"\\nFrom previous: \");\n if (this._state !== null) this._stack = stack; // Stack may be updated on reject.\n return stack;\n } finally {\n stack_being_generated = false;\n }\n }\n },\n\n timeout: function (ms, msg) {\n return ms < Infinity ?\n new DexiePromise((resolve, reject) => {\n var handle = setTimeout(() => reject(new exceptions.Timeout(msg)), ms);\n this.then(resolve, reject).finally(clearTimeout.bind(null, handle));\n }) : this;\n }\n});\n\nif (typeof Symbol !== 'undefined' && Symbol.toStringTag)\n setProp(DexiePromise.prototype, Symbol.toStringTag, 'Dexie.Promise');\n\n// Now that Promise.prototype is defined, we have all it takes to set globalPSD.env.\n// Environment globals snapshotted on leaving global zone\nglobalPSD.env = snapShot();\n\nfunction Listener(onFulfilled, onRejected, resolve, reject, zone) {\n this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null;\n this.onRejected = typeof onRejected === 'function' ? onRejected : null;\n this.resolve = resolve;\n this.reject = reject;\n this.psd = zone;\n}\n\n// Promise Static Properties\nprops (DexiePromise, {\n all: function () {\n var values = getArrayOf.apply(null, arguments) // Supports iterables, implicit arguments and array-like.\n .map(onPossibleParallellAsync); // Handle parallell async/awaits \n return new DexiePromise(function (resolve, reject) {\n if (values.length === 0) resolve([]);\n var remaining = values.length;\n values.forEach((a,i) => DexiePromise.resolve(a).then(x => {\n values[i] = x;\n if (!--remaining) resolve(values);\n }, reject));\n });\n },\n \n resolve: value => {\n if (value instanceof DexiePromise) return value;\n if (value && typeof value.then === 'function') return new DexiePromise((resolve, reject)=>{\n value.then(resolve, reject);\n });\n var rv = new DexiePromise(INTERNAL, true, value);\n linkToPreviousPromise(rv, currentFulfiller);\n return rv;\n },\n \n reject: PromiseReject,\n \n race: function () {\n var values = getArrayOf.apply(null, arguments).map(onPossibleParallellAsync);\n return new DexiePromise((resolve, reject) => {\n values.map(value => DexiePromise.resolve(value).then(resolve, reject));\n });\n },\n\n PSD: {\n get: ()=>PSD,\n set: value => PSD = value\n },\n\n totalEchoes: {get: ()=>totalEchoes},\n\n //task: {get: ()=>task},\n \n newPSD: newScope,\n \n usePSD: usePSD,\n \n scheduler: {\n get: () => asap,\n set: value => {asap = value}\n },\n \n rejectionMapper: {\n get: () => rejectionMapper,\n set: value => {rejectionMapper = value;} // Map reject failures\n },\n \n follow: (fn, zoneProps) => {\n return new DexiePromise((resolve, reject) => {\n return newScope((resolve, reject) => {\n var psd = PSD;\n psd.unhandleds = []; // For unhandled standard- or 3rd party Promises. Checked at psd.finalize()\n psd.onunhandled = reject; // Triggered directly on unhandled promises of this library.\n psd.finalize = callBoth(function () {\n // Unhandled standard or 3rd part promises are put in PSD.unhandleds and\n // examined upon scope completion while unhandled rejections in this Promise\n // will trigger directly through psd.onunhandled\n run_at_end_of_this_or_next_physical_tick(()=>{\n this.unhandleds.length === 0 ? resolve() : reject(this.unhandleds[0]);\n });\n }, psd.finalize);\n fn();\n }, zoneProps, resolve, reject);\n });\n }\n});\n\nif (NativePromise) {\n if (NativePromise.allSettled) setProp (DexiePromise, \"allSettled\", function() {\n const possiblePromises = getArrayOf.apply(null, arguments).map(onPossibleParallellAsync);\n return new DexiePromise(resolve => {\n if (possiblePromises.length === 0) resolve([]);\n let remaining = possiblePromises.length;\n const results = new Array(remaining);\n possiblePromises.forEach((p, i) => DexiePromise.resolve(p).then(\n value => results[i] = {status: \"fulfilled\", value},\n reason => results[i] = {status: \"rejected\", reason})\n .then(()=>--remaining || resolve(results)));\n });\n });\n if (NativePromise.any && typeof AggregateError !== 'undefined') setProp(DexiePromise, \"any\", function() {\n const possiblePromises = getArrayOf.apply(null, arguments).map(onPossibleParallellAsync);\n return new DexiePromise((resolve, reject) => {\n if (possiblePromises.length === 0) reject(new AggregateError([]));\n let remaining = possiblePromises.length;\n const failures = new Array(remaining);\n possiblePromises.forEach((p, i) => DexiePromise.resolve(p).then(\n value => resolve(value),\n failure => {\n failures[i] = failure;\n if (!--remaining) reject(new AggregateError(failures));\n }));\n });\n });\n}\n\n/**\n* Take a potentially misbehaving resolver function and make sure\n* onFulfilled and onRejected are only called once.\n*\n* Makes no guarantees about asynchrony.\n*/\nfunction executePromiseTask (promise, fn) {\n // Promise Resolution Procedure:\n // https://github.com/promises-aplus/promises-spec#the-promise-resolution-procedure\n try {\n fn(value => {\n if (promise._state !== null) return; // Already settled\n if (value === promise) throw new TypeError('A promise cannot be resolved with itself.');\n var shouldExecuteTick = promise._lib && beginMicroTickScope();\n if (value && typeof value.then === 'function') {\n executePromiseTask(promise, (resolve, reject) => {\n value instanceof DexiePromise ?\n value._then(resolve, reject) :\n value.then(resolve, reject);\n });\n } else {\n promise._state = true;\n promise._value = value;\n propagateAllListeners(promise);\n }\n if (shouldExecuteTick) endMicroTickScope();\n }, handleRejection.bind(null, promise)); // If Function.bind is not supported. Exception is handled in catch below\n } catch (ex) {\n handleRejection(promise, ex);\n }\n}\n\nfunction handleRejection (promise, reason) {\n rejectingErrors.push(reason);\n if (promise._state !== null) return;\n var shouldExecuteTick = promise._lib && beginMicroTickScope();\n reason = rejectionMapper(reason);\n promise._state = false;\n promise._value = reason;\n debug && reason !== null && typeof reason === 'object' && !reason._promise && tryCatch(()=>{\n var origProp = getPropertyDescriptor(reason, \"stack\"); \n reason._promise = promise; \n setProp(reason, \"stack\", {\n get: () =>\n stack_being_generated ?\n origProp && (origProp.get ?\n origProp.get.apply(reason) :\n origProp.value) :\n promise.stack\n });\n });\n // Add the failure to a list of possibly uncaught errors\n addPossiblyUnhandledError(promise);\n propagateAllListeners(promise);\n if (shouldExecuteTick) endMicroTickScope();\n}\n\nfunction propagateAllListeners (promise) {\n //debug && linkToPreviousPromise(promise);\n var listeners = promise._listeners;\n promise._listeners = [];\n for (var i = 0, len = listeners.length; i < len; ++i) {\n propagateToListener(promise, listeners[i]);\n }\n var psd = promise._PSD;\n --psd.ref || psd.finalize(); // if psd.ref reaches zero, call psd.finalize();\n if (numScheduledCalls === 0) {\n // If numScheduledCalls is 0, it means that our stack is not in a callback of a scheduled call,\n // and that no deferreds where listening to this rejection or success.\n // Since there is a risk that our stack can contain application code that may\n // do stuff after this code is finished that may generate new calls, we cannot\n // call finalizers here.\n ++numScheduledCalls;\n asap(()=>{\n if (--numScheduledCalls === 0) finalizePhysicalTick(); // Will detect unhandled errors\n }, []);\n }\n}\n\nfunction propagateToListener(promise, listener) {\n if (promise._state === null) {\n promise._listeners.push(listener);\n return;\n }\n\n var cb = promise._state ? listener.onFulfilled : listener.onRejected;\n if (cb === null) {\n // This Listener doesnt have a listener for the event being triggered (onFulfilled or onReject) so lets forward the event to any eventual listeners on the Promise instance returned by then() or catch()\n return (promise._state ? listener.resolve : listener.reject) (promise._value);\n }\n ++listener.psd.ref;\n ++numScheduledCalls;\n asap (callListener, [cb, promise, listener]);\n}\n\nfunction callListener (cb, promise, listener) {\n try {\n // Set static variable currentFulfiller to the promise that is being fullfilled,\n // so that we connect the chain of promises (for long stacks support)\n currentFulfiller = promise;\n \n // Call callback and resolve our listener with it's return value.\n var ret, value = promise._value;\n \n if (promise._state) {\n // cb is onResolved\n ret = cb (value);\n } else {\n // cb is onRejected\n if (rejectingErrors.length) rejectingErrors = [];\n ret = cb(value);\n if (rejectingErrors.indexOf(value) === -1)\n markErrorAsHandled(promise); // Callback didnt do Promise.reject(err) nor reject(err) onto another promise.\n }\n listener.resolve(ret);\n } catch (e) {\n // Exception thrown in callback. Reject our listener.\n listener.reject(e);\n } finally {\n // Restore env and currentFulfiller.\n currentFulfiller = null;\n if (--numScheduledCalls === 0) finalizePhysicalTick();\n --listener.psd.ref || listener.psd.finalize();\n }\n}\n\nfunction getStack (promise, stacks, limit) {\n if (stacks.length === limit) return stacks;\n var stack = \"\";\n if (promise._state === false) {\n var failure = promise._value,\n errorName,\n message;\n \n if (failure != null) {\n errorName = failure.name || \"Error\";\n message = failure.message || failure;\n stack = prettyStack(failure, 0);\n } else {\n errorName = failure; // If error is undefined or null, show that.\n message = \"\";\n }\n stacks.push(errorName + (message ? \": \" + message : \"\") + stack);\n }\n if (debug) {\n stack = prettyStack(promise._stackHolder, 2);\n if (stack && stacks.indexOf(stack) === -1) stacks.push(stack);\n if (promise._prev) getStack(promise._prev, stacks, limit);\n }\n return stacks;\n}\n\nfunction linkToPreviousPromise(promise, prev) {\n // Support long stacks by linking to previous completed promise.\n var numPrev = prev ? prev._numPrev + 1 : 0;\n if (numPrev < LONG_STACKS_CLIP_LIMIT) { // Prohibit infinite Promise loops to get an infinite long memory consuming \"tail\".\n promise._prev = prev;\n promise._numPrev = numPrev;\n }\n}\n\n/* The callback to schedule with setImmediate() or setTimeout().\n It runs a virtual microtick and executes any callback registered in microtickQueue.\n */\nfunction physicalTick() {\n beginMicroTickScope() && endMicroTickScope();\n}\n\nexport function beginMicroTickScope() {\n var wasRootExec = isOutsideMicroTick;\n isOutsideMicroTick = false;\n needsNewPhysicalTick = false;\n return wasRootExec;\n}\n\n/* Executes micro-ticks without doing try..catch.\n This can be possible because we only use this internally and\n the registered functions are exception-safe (they do try..catch\n internally before calling any external method). If registering\n functions in the microtickQueue that are not exception-safe, this\n would destroy the framework and make it instable. So we don't export\n our asap method.\n*/\nexport function endMicroTickScope() {\n var callbacks, i, l;\n do {\n while (microtickQueue.length > 0) {\n callbacks = microtickQueue;\n microtickQueue = [];\n l = callbacks.length;\n for (i = 0; i < l; ++i) {\n var item = callbacks[i];\n item[0].apply(null, item[1]);\n }\n }\n } while (microtickQueue.length > 0);\n isOutsideMicroTick = true;\n needsNewPhysicalTick = true;\n}\n\nfunction finalizePhysicalTick() {\n var unhandledErrs = unhandledErrors;\n unhandledErrors = [];\n unhandledErrs.forEach(p => {\n p._PSD.onunhandled.call(null, p._value, p);\n });\n var finalizers = tickFinalizers.slice(0); // Clone first because finalizer may remove itself from list.\n var i = finalizers.length;\n while (i) finalizers[--i](); \n}\n\nfunction run_at_end_of_this_or_next_physical_tick (fn) {\n function finalizer() {\n fn();\n tickFinalizers.splice(tickFinalizers.indexOf(finalizer), 1);\n }\n tickFinalizers.push(finalizer);\n ++numScheduledCalls;\n asap(()=>{\n if (--numScheduledCalls === 0) finalizePhysicalTick();\n }, []);\n}\n\nfunction addPossiblyUnhandledError(promise) {\n // Only add to unhandledErrors if not already there. The first one to add to this list\n // will be upon the first rejection so that the root cause (first promise in the\n // rejection chain) is the one listed.\n if (!unhandledErrors.some(p => p._value === promise._value))\n unhandledErrors.push(promise);\n}\n\nfunction markErrorAsHandled(promise) {\n // Called when a reject handled is actually being called.\n // Search in unhandledErrors for any promise whos _value is this promise_value (list\n // contains only rejected promises, and only one item per error)\n var i = unhandledErrors.length;\n while (i) if (unhandledErrors[--i]._value === promise._value) {\n // Found a promise that failed with this same error object pointer,\n // Remove that since there is a listener that actually takes care of it.\n unhandledErrors.splice(i, 1);\n return;\n }\n}\n\nfunction PromiseReject (reason) {\n return new DexiePromise(INTERNAL, false, reason);\n}\n\nexport function wrap (fn, errorCatcher) {\n var psd = PSD;\n return function() {\n var wasRootExec = beginMicroTickScope(),\n outerScope = PSD;\n\n try {\n switchToZone(psd, true);\n return fn.apply(this, arguments);\n } catch (e) {\n errorCatcher && errorCatcher(e);\n } finally {\n switchToZone(outerScope, false);\n if (wasRootExec) endMicroTickScope();\n }\n };\n}\n\n\n//\n// variables used for native await support\n//\nconst task = { awaits: 0, echoes: 0, id: 0}; // The ongoing macro-task when using zone-echoing.\nvar taskCounter = 0; // ID counter for macro tasks.\nvar zoneStack = []; // Stack of left zones to restore asynchronically.\nvar zoneEchoes = 0; // zoneEchoes is a must in order to persist zones between native await expressions.\nvar totalEchoes = 0; // ID counter for micro-tasks. Used to detect possible native await in our Promise.prototype.then.\n\n\nvar zone_id_counter = 0;\nexport function newScope (fn, props, a1, a2) {\n var parent = PSD,\n psd = Object.create(parent);\n psd.parent = parent;\n psd.ref = 0;\n psd.global = false;\n psd.id = ++zone_id_counter;\n // Prepare for promise patching (done in usePSD):\n var globalEnv = globalPSD.env;\n psd.env = patchGlobalPromise ? {\n Promise: DexiePromise, // Changing window.Promise could be omitted for Chrome and Edge, where IDB+Promise plays well!\n PromiseProp: {value: DexiePromise, configurable: true, writable: true},\n all: DexiePromise.all,\n race: DexiePromise.race,\n allSettled: DexiePromise.allSettled,\n any: DexiePromise.any,\n resolve: DexiePromise.resolve,\n reject: DexiePromise.reject,\n nthen: getPatchedPromiseThen (globalEnv.nthen, psd), // native then\n gthen: getPatchedPromiseThen (globalEnv.gthen, psd) // global then\n } : {};\n if (props) extend(psd, props);\n \n // unhandleds and onunhandled should not be specifically set here.\n // Leave them on parent prototype.\n // unhandleds.push(err) will push to parent's prototype\n // onunhandled() will call parents onunhandled (with this scope's this-pointer though!)\n ++parent.ref;\n psd.finalize = function () {\n --this.parent.ref || this.parent.finalize();\n }\n var rv = usePSD (psd, fn, a1, a2);\n if (psd.ref === 0) psd.finalize();\n return rv;\n}\n\n// Function to call if scopeFunc returns NativePromise\n// Also for each NativePromise in the arguments to Promise.all()\nexport function incrementExpectedAwaits() {\n if (!task.id) task.id = ++taskCounter;\n ++task.awaits;\n task.echoes += ZONE_ECHO_LIMIT;\n return task.id;\n}\n\n// Function to call when 'then' calls back on a native promise where onAwaitExpected() had been called.\n// Also call this when a native await calls then method on a promise. In that case, don't supply\n// sourceTaskId because we already know it refers to current task.\nexport function decrementExpectedAwaits() {\n if (!task.awaits) return false;\n if (--task.awaits === 0) task.id = 0;\n task.echoes = task.awaits * ZONE_ECHO_LIMIT; // Will reset echoes to 0 if awaits is 0.\n return true;\n}\n\nif ((''+nativePromiseThen).indexOf('[native code]') === -1) {\n // If the native promise' prototype is patched, we cannot rely on zone echoing.\n // Disable that here:\n incrementExpectedAwaits = decrementExpectedAwaits = nop;\n}\n\n// Call from Promise.all() and Promise.race()\nexport function onPossibleParallellAsync (possiblePromise) {\n if (task.echoes && possiblePromise && possiblePromise.constructor === NativePromise) {\n incrementExpectedAwaits(); \n return possiblePromise.then(x => {\n decrementExpectedAwaits();\n return x;\n }, e => {\n decrementExpectedAwaits();\n return rejection(e);\n });\n }\n return possiblePromise;\n}\n\nfunction zoneEnterEcho(targetZone) {\n ++totalEchoes;\n //console.log(\"Total echoes \", totalEchoes);\n if (!task.echoes || --task.echoes === 0) {\n task.echoes = task.id = 0; // Cancel zone echoing.\n }\n\n zoneStack.push(PSD);\n switchToZone(targetZone, true);\n}\n\nfunction zoneLeaveEcho() {\n var zone = zoneStack[zoneStack.length-1];\n zoneStack.pop();\n switchToZone(zone, false);\n}\n\nfunction switchToZone (targetZone, bEnteringZone) {\n var currentZone = PSD;\n if (bEnteringZone ? task.echoes && (!zoneEchoes++ || targetZone !== PSD) : zoneEchoes && (!--zoneEchoes || targetZone !== PSD)) {\n // Enter or leave zone asynchronically as well, so that tasks initiated during current tick\n // will be surrounded by the zone when they are invoked.\n enqueueNativeMicroTask(bEnteringZone ? zoneEnterEcho.bind(null, targetZone) : zoneLeaveEcho);\n }\n if (targetZone === PSD) return;\n\n PSD = targetZone; // The actual zone switch occurs at this line.\n\n // Snapshot on every leave from global zone.\n if (currentZone === globalPSD) globalPSD.env = snapShot();\n\n if (patchGlobalPromise) {\n // Let's patch the global and native Promises (may be same or may be different)\n var GlobalPromise = globalPSD.env.Promise;\n // Swich environments (may be PSD-zone or the global zone. Both apply.)\n var targetEnv = targetZone.env;\n\n // Change Promise.prototype.then for native and global Promise (they MAY differ on polyfilled environments, but both can be accessed)\n // Must be done on each zone change because the patched method contains targetZone in its closure.\n nativePromiseProto.then = targetEnv.nthen;\n GlobalPromise.prototype.then = targetEnv.gthen;\n\n if (currentZone.global || targetZone.global) {\n // Leaving or entering global zone. It's time to patch / restore global Promise.\n\n // Set this Promise to window.Promise so that transiled async functions will work on Firefox, Safari and IE, as well as with Zonejs and angular.\n Object.defineProperty(_global, 'Promise', targetEnv.PromiseProp);\n\n // Support Promise.all() etc to work indexedDB-safe also when people are including es6-promise as a module (they might\n // not be accessing global.Promise but a local reference to it)\n GlobalPromise.all = targetEnv.all;\n GlobalPromise.race = targetEnv.race;\n GlobalPromise.resolve = targetEnv.resolve;\n GlobalPromise.reject = targetEnv.reject;\n if (targetEnv.allSettled) GlobalPromise.allSettled = targetEnv.allSettled;\n if (targetEnv.any) GlobalPromise.any = targetEnv.any;\n }\n }\n}\n\nfunction snapShot () {\n var GlobalPromise = _global.Promise;\n return patchGlobalPromise ? {\n Promise: GlobalPromise,\n PromiseProp: Object.getOwnPropertyDescriptor(_global, \"Promise\"),\n all: GlobalPromise.all,\n race: GlobalPromise.race,\n allSettled: GlobalPromise.allSettled,\n any: GlobalPromise.any,\n resolve: GlobalPromise.resolve,\n reject: GlobalPromise.reject,\n nthen: nativePromiseProto.then,\n gthen: GlobalPromise.prototype.then\n } : {};\n}\n\nexport function usePSD (psd, fn, a1, a2, a3) {\n var outerScope = PSD;\n try {\n switchToZone(psd, true);\n return fn(a1, a2, a3);\n } finally {\n switchToZone(outerScope, false);\n }\n}\n\nfunction enqueueNativeMicroTask (job) {\n //\n // Precondition: nativePromiseThen !== undefined\n //\n nativePromiseThen.call(resolvedNativePromise, job);\n}\n\nfunction nativeAwaitCompatibleWrap(fn, zone, possibleAwait, cleanup) {\n return typeof fn !== 'function' ? fn : function () {\n var outerZone = PSD;\n if (possibleAwait) incrementExpectedAwaits();\n switchToZone(zone, true);\n try {\n return fn.apply(this, arguments);\n } finally {\n switchToZone(outerZone, false);\n if (cleanup) enqueueNativeMicroTask(decrementExpectedAwaits);\n }\n };\n}\n\nfunction getPatchedPromiseThen (origThen, zone) {\n return function (onResolved, onRejected) {\n return origThen.call(this,\n nativeAwaitCompatibleWrap(onResolved, zone),\n nativeAwaitCompatibleWrap(onRejected, zone));\n };\n}\n\nconst UNHANDLEDREJECTION = \"unhandledrejection\";\n\nfunction globalError(err, promise) {\n var rv;\n try {\n rv = promise.onuncatched(err);\n } catch (e) {}\n if (rv !== false) try {\n var event, eventData = {promise: promise, reason: err};\n if (_global.document && document.createEvent) {\n event = document.createEvent('Event');\n event.initEvent(UNHANDLEDREJECTION, true, true);\n extend(event, eventData);\n } else if (_global.CustomEvent) {\n event = new CustomEvent(UNHANDLEDREJECTION, {detail: eventData});\n extend(event, eventData);\n }\n if (event && _global.dispatchEvent) {\n dispatchEvent(event);\n if (!_global.PromiseRejectionEvent && _global.onunhandledrejection)\n // No native support for PromiseRejectionEvent but user has set window.onunhandledrejection. Manually call it.\n try {_global.onunhandledrejection(event);} catch (_) {}\n }\n if (debug && event && !event.defaultPrevented) {\n console.warn(`Unhandled rejection: ${err.stack || err}`);\n }\n } catch (e) {}\n}\n\nexport var rejection = DexiePromise.reject;\n\nexport {DexiePromise};\n","import { Dexie } from \"../classes/dexie\";\n\nexport const DEXIE_VERSION = '{version}'; // Replaced by build-script.\nexport const maxString = String.fromCharCode(65535);\nexport const minKey = -Infinity; // minKey can be constant. maxKey must be a prop of Dexie (_maxKey)\nexport const INVALID_KEY_ARGUMENT =\n \"Invalid key provided. Keys must be of type string, number, Date or Array.\";\nexport const STRING_EXPECTED = \"String expected.\";\nexport const connections: Dexie[] = [];\nexport const isIEOrEdge =\n typeof navigator !== 'undefined' && /(MSIE|Trident|Edge)/.test(navigator.userAgent);\nexport const hasIEDeleteObjectStoreBug = isIEOrEdge;\nexport const hangsOnDeleteLargeKeyRange = isIEOrEdge;\nexport const dexieStackFrameFilter = frame => !/(dexie\\.js|dexie\\.min\\.js)/.test(frame);\nexport const DBNAMES_DB = '__dbnames';\nexport const READONLY = 'readonly';\nexport const READWRITE = 'readwrite';\n","export function combine(filter1, filter2) {\n return filter1 ?\n filter2 ?\n function () { return filter1.apply(this, arguments) && filter2.apply(this, arguments); } :\n filter1 :\n filter2;\n}\n","import { DBCoreKeyRange, DBCoreRangeType } from '../public/types/dbcore';\n\nexport const AnyRange: DBCoreKeyRange = {\n type: DBCoreRangeType.Any,\n lower: -Infinity,\n lowerOpen: false,\n upper: [[]],\n upperOpen: false\n}\n\nexport const NeverRange: DBCoreKeyRange = {\n type: DBCoreRangeType.Never,\n lower: -Infinity,\n lowerOpen: true,\n upper: -Infinity,\n upperOpen: true\n}\n","import { deepClone, delByKeyPath, getByKeyPath } from './utils';\n\n// This workaround is needed since obj could be a custom-class instance with an\n// uninitialized keyPath. See the following comment for more context:\n// https://github.com/dfahlander/Dexie.js/issues/1280#issuecomment-823557881\nexport function workaroundForUndefinedPrimKey(keyPath: string | ArrayLike) {\n // Workaround only needed for plain non-dotted keyPaths\n return typeof keyPath === \"string\" && !/\\./.test(keyPath) \n ? (obj: object) => {\n if (obj[keyPath] === undefined && (keyPath in obj)) {\n // property exists but is undefined. This will not be liked by Indexeddb.\n // Need to remove the property before adding it but we need to clone it before\n // doing that to not be intrusive.\n obj = deepClone(obj);\n delete obj[keyPath];\n }\n return obj;\n }\n : (obj: object) => obj;\n}","import { BulkError, exceptions } from '../../errors';\nimport { Table as ITable } from '../../public/types/table';\nimport { TableSchema } from '../../public/types/table-schema';\nimport { TableHooks } from '../../public/types/table-hooks';\nimport { DexiePromise as Promise, PSD, newScope, wrap, rejection, beginMicroTickScope, endMicroTickScope } from '../../helpers/promise';\nimport { Transaction } from '../transaction';\nimport { Dexie } from '../dexie';\nimport { tempTransaction } from '../../functions/temp-transaction';\nimport { Collection } from '../collection';\nimport { isArray, keys, getByKeyPath, hasOwn, setByKeyPath, deepClone, tryCatch, arrayToObject, extend } from '../../functions/utils';\nimport { maxString } from '../../globals/constants';\nimport { combine } from '../../functions/combine';\nimport { PromiseExtended } from \"../../public/types/promise-extended\";\nimport { IndexableType } from '../../public/types/indexable-type';\nimport { debug } from '../../helpers/debug';\nimport { DBCoreTable } from '../../public/types/dbcore';\nimport { AnyRange } from '../../dbcore/keyrange';\nimport { workaroundForUndefinedPrimKey } from '../../functions/workaround-undefined-primkey';\n\n/** class Table\n * \n * https://dexie.org/docs/Table/Table\n */\nexport class Table implements ITable {\n db: Dexie;\n _tx?: Transaction;\n name: string;\n schema: TableSchema;\n hook: TableHooks;\n core: DBCoreTable;\n\n _trans(\n mode: IDBTransactionMode,\n fn: (idbtrans: IDBTransaction, dxTrans: Transaction) => PromiseLike | void,\n writeLocked?: boolean | string) : PromiseExtended\n {\n const trans: Transaction = this._tx || PSD.trans;\n const tableName = this.name;\n \n function checkTableInTransaction(resolve, reject, trans: Transaction) {\n if (!trans.schema[tableName])\n throw new exceptions.NotFound(\"Table \" + tableName + \" not part of transaction\");\n return fn(trans.idbtrans, trans);\n }\n // Surround all in a microtick scope.\n // Reason: Browsers (modern Safari + older others)\n // still as of 2018-10-10 has problems keeping a transaction\n // alive between micro ticks. Safari because if transaction\n // is created but not used in same microtick, it will go\n // away. That specific issue could be solved in DBCore\n // by opening the transaction just before using it instead.\n // But older Firefoxes and IE11 (with Promise polyfills)\n // will still have probs.\n // The beginMicrotickScope()/endMicrotickScope() works\n // in cooperation with Dexie.Promise to orchestrate\n // the micro-ticks in endMicrotickScope() rather than\n // in native engine.\n const wasRootExec = beginMicroTickScope();\n try {\n return trans && trans.db === this.db ?\n trans === PSD.trans ?\n trans._promise(mode, checkTableInTransaction, writeLocked) :\n newScope(() => trans._promise(mode, checkTableInTransaction, writeLocked), { trans: trans, transless: PSD.transless || PSD }) :\n tempTransaction(this.db, mode, [this.name], checkTableInTransaction);\n } finally {\n if (wasRootExec) endMicroTickScope();\n }\n }\n\n /** Table.get()\n * \n * https://dexie.org/docs/Table/Table.get()\n * \n **/\n get(keyOrCrit, cb?) {\n if (keyOrCrit && keyOrCrit.constructor === Object)\n return this.where(keyOrCrit as { [key: string]: IndexableType }).first(cb);\n\n return this._trans('readonly', (trans) => {\n return this.core.get({trans, key: keyOrCrit})\n .then(res => this.hook.reading.fire(res));\n }).then(cb);\n }\n\n /** Table.where()\n * \n * https://dexie.org/docs/Table/Table.where()\n * \n **/\n where(indexOrCrit: string | string[] | { [key: string]: IndexableType }) {\n if (typeof indexOrCrit === 'string')\n return new this.db.WhereClause(this, indexOrCrit);\n if (isArray(indexOrCrit))\n return new this.db.WhereClause(this, `[${indexOrCrit.join('+')}]`);\n // indexOrCrit is an object map of {[keyPath]:value} \n const keyPaths = keys(indexOrCrit);\n if (keyPaths.length === 1)\n // Only one critera. This was the easy case:\n return this\n .where(keyPaths[0])\n .equals(indexOrCrit[keyPaths[0]]);\n\n // Multiple criterias.\n // Let's try finding a compound index that matches all keyPaths in\n // arbritary order:\n const compoundIndex = this.schema.indexes.concat(this.schema.primKey).filter(ix =>\n ix.compound &&\n keyPaths.every(keyPath => ix.keyPath.indexOf(keyPath) >= 0) &&\n (ix.keyPath as string[]).every(keyPath => keyPaths.indexOf(keyPath) >= 0))[0];\n\n if (compoundIndex && this.db._maxKey !== maxString)\n // Cool! We found such compound index\n // and this browser supports compound indexes (maxKey !== maxString)!\n return this\n .where(compoundIndex.name)\n .equals((compoundIndex.keyPath as string[]).map(kp => indexOrCrit[kp]));\n\n if (!compoundIndex && debug) console.warn(\n `The query ${JSON.stringify(indexOrCrit)} on ${this.name} would benefit of a ` +\n `compound index [${keyPaths.join('+')}]`);\n\n // Ok, now let's fallback to finding at least one matching index\n // and filter the rest.\n const { idxByName } = this.schema;\n const idb = this.db._deps.indexedDB;\n\n function equals (a, b) {\n try {\n return idb.cmp(a,b) === 0; // Works with all indexable types including binary keys.\n } catch (e) {\n return false;\n }\n }\n\n const [idx, filterFunction] = keyPaths.reduce(([prevIndex, prevFilterFn], keyPath) => {\n const index = idxByName[keyPath];\n const value = indexOrCrit[keyPath];\n return [\n prevIndex || index, // idx::=Pick index of first matching keypath\n prevIndex || !index ? // filter::=null if not needed, otherwise combine function filter\n combine(\n prevFilterFn,\n index && index.multi ?\n x => {\n const prop = getByKeyPath(x, keyPath);\n return isArray(prop) && prop.some(item => equals(value, item));\n } : x => equals(value, getByKeyPath(x, keyPath)))\n : prevFilterFn\n ];\n }, [null, null]);\n\n return idx ?\n this.where(idx.name).equals(indexOrCrit[idx.keyPath])\n .filter(filterFunction) :\n compoundIndex ?\n this.filter(filterFunction) : // Has compound but browser bad. Allow filter.\n this.where(keyPaths).equals(''); // No index at all. Fail lazily with \"[a+b+c] is not indexed\"\n }\n\n /** Table.filter()\n * \n * https://dexie.org/docs/Table/Table.filter()\n * \n **/\n filter(filterFunction: (obj: any) => boolean) {\n return this.toCollection().and(filterFunction);\n }\n\n /** Table.count()\n * \n * https://dexie.org/docs/Table/Table.count()\n * \n **/\n count(thenShortcut?: any) {\n return this.toCollection().count(thenShortcut);\n }\n\n /** Table.offset()\n * \n * https://dexie.org/docs/Table/Table.offset()\n * \n **/\n offset(offset: number) {\n return this.toCollection().offset(offset);\n }\n\n /** Table.limit()\n * \n * https://dexie.org/docs/Table/Table.limit()\n * \n **/\n limit(numRows: number) {\n return this.toCollection().limit(numRows);\n }\n\n /** Table.each()\n * \n * https://dexie.org/docs/Table/Table.each()\n * \n **/\n each(callback: (obj: any, cursor: { key: IndexableType, primaryKey: IndexableType }) => any) {\n return this.toCollection().each(callback);\n }\n\n /** Table.toArray()\n * \n * https://dexie.org/docs/Table/Table.toArray()\n * \n **/\n toArray(thenShortcut?: any) {\n return this.toCollection().toArray(thenShortcut);\n }\n\n /** Table.toCollection()\n * \n * https://dexie.org/docs/Table/Table.toCollection()\n * \n **/\n toCollection() {\n return new this.db.Collection(new this.db.WhereClause(this));\n }\n\n /** Table.orderBy()\n * \n * https://dexie.org/docs/Table/Table.orderBy()\n * \n **/\n orderBy(index: string | string[]) {\n return new this.db.Collection(\n new this.db.WhereClause(this, isArray(index) ?\n `[${index.join('+')}]` :\n index));\n }\n\n /** Table.reverse()\n * \n * https://dexie.org/docs/Table/Table.reverse()\n * \n **/\n reverse(): Collection {\n return this.toCollection().reverse();\n }\n\n /** Table.mapToClass()\n * \n * https://dexie.org/docs/Table/Table.mapToClass()\n * \n **/\n mapToClass(constructor: Function) {\n this.schema.mappedClass = constructor;\n // Now, subscribe to the when(\"reading\") event to make all objects that come out from this table inherit from given class\n // no matter which method to use for reading (Table.get() or Table.where(...)... )\n const readHook = obj => {\n if (!obj) return obj; // No valid object. (Value is null). Return as is.\n // Create a new object that derives from constructor:\n const res = Object.create(constructor.prototype);\n // Clone members:\n for (var m in obj) if (hasOwn(obj, m)) try { res[m] = obj[m]; } catch (_) { }\n return res;\n };\n\n if (this.schema.readHook) {\n this.hook.reading.unsubscribe(this.schema.readHook);\n }\n this.schema.readHook = readHook;\n this.hook(\"reading\", readHook);\n return constructor;\n }\n\n /** @deprecated */\n defineClass() {\n function Class (content){\n extend(this, content);\n };\n return this.mapToClass(Class);\n }\n\n /** Table.add()\n * \n * https://dexie.org/docs/Table/Table.add()\n * \n **/\n add(obj, key?: IndexableType): PromiseExtended {\n const {auto, keyPath} = this.schema.primKey;\n let objToAdd = obj;\n if (keyPath && auto) {\n objToAdd = workaroundForUndefinedPrimKey(keyPath)(obj);\n }\n return this._trans('readwrite', trans => {\n return this.core.mutate({trans, type: 'add', keys: key != null ? [key] : null, values: [objToAdd]});\n }).then(res => res.numFailures ? Promise.reject(res.failures[0]) : res.lastResult)\n .then(lastResult => {\n if (keyPath) {\n // This part should be here for backward compatibility.\n // If ever feeling too bad about this, please wait to a new major before removing it,\n // and document the change thoroughly.\n try{setByKeyPath(obj, keyPath, lastResult);}catch(_){};\n }\n return lastResult;\n });\n }\n\n /** Table.update()\n * \n * https://dexie.org/docs/Table/Table.update()\n * \n **/\n update(keyOrObject, modifications: { [keyPath: string]: any; } | ((obj: any, ctx:{value: any, primKey: IndexableType}) => void | boolean)): PromiseExtended {\n if (typeof keyOrObject === 'object' && !isArray(keyOrObject)) {\n const key = getByKeyPath(keyOrObject, this.schema.primKey.keyPath);\n if (key === undefined) return rejection(new exceptions.InvalidArgument(\n \"Given object does not contain its primary key\"));\n // object to modify. Also modify given object with the modifications:\n // This part should be here for backward compatibility.\n // If ever feeling too bad about mutating given object, please wait to a new major before removing it,\n // and document the change thoroughly.\n try {\n if (typeof modifications !== \"function\") {\n keys(modifications).forEach(keyPath => {\n setByKeyPath(keyOrObject, keyPath, modifications[keyPath]);\n });\n } else {\n // Now since we support function argument, we should have a similar behavior here as well\n // (as long as we do this mutability stuff on the given object)\n modifications(keyOrObject, {value: keyOrObject, primKey: key});\n }\n } catch {\n // Maybe given object was frozen.\n // This part is not essential. Just move on as nothing happened...\n }\n return this.where(\":id\").equals(key).modify(modifications);\n } else {\n // key to modify\n return this.where(\":id\").equals(keyOrObject).modify(modifications);\n }\n }\n\n /** Table.put()\n * \n * https://dexie.org/docs/Table/Table.put()\n * \n **/\n put(obj, key?: IndexableType): PromiseExtended {\n const {auto, keyPath} = this.schema.primKey;\n let objToAdd = obj;\n if (keyPath && auto) {\n objToAdd = workaroundForUndefinedPrimKey(keyPath)(obj);\n }\n return this._trans(\n 'readwrite',\n trans => this.core.mutate({trans, type: 'put', values: [objToAdd], keys: key != null ? [key] : null}))\n .then(res => res.numFailures ? Promise.reject(res.failures[0]) : res.lastResult)\n .then(lastResult => {\n if (keyPath) {\n // This part should be here for backward compatibility.\n // If ever feeling too bad about this, please wait to a new major before removing it,\n // and document the change thoroughly.\n try{setByKeyPath(obj, keyPath, lastResult);}catch(_){};\n }\n return lastResult;\n });\n }\n\n /** Table.delete()\n * \n * https://dexie.org/docs/Table/Table.delete()\n * \n **/\n delete(key: IndexableType): PromiseExtended {\n return this._trans('readwrite',\n trans => this.core.mutate({trans, type: 'delete', keys: [key]}))\n .then(res => res.numFailures ? Promise.reject(res.failures[0]) : undefined);\n }\n\n /** Table.clear()\n * \n * https://dexie.org/docs/Table/Table.clear()\n * \n **/\n clear() {\n return this._trans('readwrite',\n trans => this.core.mutate({trans, type: 'deleteRange', range: AnyRange}))\n .then(res => res.numFailures ? Promise.reject(res.failures[0]) : undefined);\n }\n\n /** Table.bulkGet()\n * \n * https://dexie.org/docs/Table/Table.bulkGet()\n * \n * @param keys \n */\n bulkGet(keys: IndexableType[]) {\n return this._trans('readonly', trans => {\n return this.core.getMany({\n keys,\n trans\n }).then(result => result.map(res => this.hook.reading.fire(res)));\n });\n }\n\n /** Table.bulkAdd()\n * \n * https://dexie.org/docs/Table/Table.bulkAdd()\n * \n **/\n bulkAdd(\n objects: any[],\n keysOrOptions?: ReadonlyArray | { allKeys?: boolean },\n options?: { allKeys?: boolean }\n ) { \n const keys = Array.isArray(keysOrOptions) ? keysOrOptions : undefined;\n options = options || (keys ? undefined : keysOrOptions as { allKeys?: boolean });\n const wantResults = options ? options.allKeys : undefined;\n\n return this._trans('readwrite', trans => {\n const {auto, keyPath} = this.schema.primKey;\n if (keyPath && keys)\n throw new exceptions.InvalidArgument(\"bulkAdd(): keys argument invalid on tables with inbound keys\");\n if (keys && keys.length !== objects.length)\n throw new exceptions.InvalidArgument(\"Arguments objects and keys must have the same length\");\n\n const numObjects = objects.length; // Pick length here to allow garbage collection of objects later\n let objectsToAdd = keyPath && auto ?\n objects.map(workaroundForUndefinedPrimKey(keyPath)) :\n objects;\n return this.core.mutate(\n {trans, type: 'add', keys: keys as IndexableType[], values: objectsToAdd, wantResults}\n )\n .then(({numFailures, results,lastResult, failures}) => {\n const result = wantResults ? results : lastResult;\n if (numFailures === 0) return result;\n throw new BulkError(\n `${this.name}.bulkAdd(): ${numFailures} of ${numObjects} operations failed`, failures);\n });\n });\n }\n\n /** Table.bulkPut()\n * \n * https://dexie.org/docs/Table/Table.bulkPut()\n * \n **/\n bulkPut(\n objects: any[],\n keysOrOptions?: ReadonlyArray | { allKeys?: boolean },\n options?: { allKeys?: boolean }\n ) { \n const keys = Array.isArray(keysOrOptions) ? keysOrOptions : undefined;\n options = options || (keys ? undefined : keysOrOptions as { allKeys?: boolean });\n const wantResults = options ? options.allKeys : undefined;\n\n return this._trans('readwrite', trans => {\n const {auto, keyPath} = this.schema.primKey;\n if (keyPath && keys)\n throw new exceptions.InvalidArgument(\"bulkPut(): keys argument invalid on tables with inbound keys\");\n if (keys && keys.length !== objects.length)\n throw new exceptions.InvalidArgument(\"Arguments objects and keys must have the same length\");\n\n const numObjects = objects.length; // Pick length here to allow garbage collection of objects later\n let objectsToPut = keyPath && auto ?\n objects.map(workaroundForUndefinedPrimKey(keyPath)) :\n objects;\n\n return this.core.mutate(\n {trans, type: 'put', keys: keys as IndexableType[], values: objectsToPut, wantResults}\n )\n .then(({numFailures, results, lastResult, failures}) => {\n const result = wantResults ? results : lastResult;\n if (numFailures === 0) return result;\n throw new BulkError(\n `${this.name}.bulkPut(): ${numFailures} of ${numObjects} operations failed`, failures);\n });\n });\n }\n\n /** Table.bulkDelete()\n * \n * https://dexie.org/docs/Table/Table.bulkDelete()\n * \n **/\n bulkDelete(keys: ReadonlyArray): PromiseExtended {\n const numKeys = keys.length;\n return this._trans('readwrite', trans => {\n return this.core.mutate({trans, type: 'delete', keys: keys as IndexableType[]});\n }).then(({numFailures, lastResult, failures}) => {\n if (numFailures === 0) return lastResult;\n throw new BulkError(\n `${this.name}.bulkDelete(): ${numFailures} of ${numKeys} operations failed`, failures);\n });\n }\n}\n","import { PSD, rejection, newScope } from \"../helpers/promise\";\nimport { DexieOptions } from \"../public/types/dexie-constructor\";\nimport { errnames, exceptions } from \"../errors\";\nimport { nop } from \"./chaining-functions\";\nimport { Transaction } from \"../classes/transaction\";\nimport { Dexie } from '../classes/dexie';\n\n/* Generate a temporary transaction when db operations are done outside a transaction scope.\n*/\nexport function tempTransaction (\n db: Dexie,\n mode: IDBTransactionMode,\n storeNames: string[],\n fn: (resolve, reject, trans: Transaction) => any)\n // Last argument is \"writeLocked\". But this doesnt apply to oneshot direct db operations, so we ignore it.\n{\n if (!db.idbdb || (!db._state.openComplete && (!PSD.letThrough && !db._vip))) {\n if (db._state.openComplete) {\n // db.idbdb is falsy but openComplete is true. Must have been an exception durin open.\n // Don't wait for openComplete as it would lead to infinite loop.\n return rejection(new exceptions.DatabaseClosed(db._state.dbOpenError));\n }\n if (!db._state.isBeingOpened) {\n if (!db._options.autoOpen)\n return rejection(new exceptions.DatabaseClosed());\n db.open().catch(nop); // Open in background. If if fails, it will be catched by the final promise anyway.\n }\n return db._state.dbReadyPromise.then(() => tempTransaction(db, mode, storeNames, fn));\n } else {\n var trans = db._createTransaction(mode, storeNames, db._dbSchema);\n try {\n trans.create();\n db._state.PR1398_maxLoop = 3;\n } catch (ex) {\n if (ex.name === errnames.InvalidState && db.isOpen() && --db._state.PR1398_maxLoop > 0) {\n console.warn('Dexie: Need to reopen db');\n db._close();\n return db.open().then(()=>tempTransaction(db, mode, storeNames, fn));\n }\n return rejection(ex);\n }\n return trans._promise(mode, (resolve, reject) => {\n return newScope(() => { // OPTIMIZATION POSSIBLE? newScope() not needed because it's already done in _promise.\n PSD.trans = trans;\n return fn(resolve, reject, trans);\n });\n }).then(result => {\n // Instead of resolving value directly, wait with resolving it until transaction has completed.\n // Otherwise the data would not be in the DB if requesting it in the then() operation.\n // Specifically, to ensure that the following expression will work:\n //\n // db.friends.put({name: \"Arne\"}).then(function () {\n // db.friends.where(\"name\").equals(\"Arne\").count(function(count) {\n // assert (count === 1);\n // });\n // });\n //\n return trans._completion.then(() => result);\n });/*.catch(err => { // Don't do this as of now. If would affect bulk- and modify methods in a way that could be more intuitive. But wait! Maybe change in next major.\n trans._reject(err);\n return rejection(err);\n });*/\n }\n}\n","import {keys, isArray, asap} from '../functions/utils';\nimport {nop, mirror, reverseStoppableEventChain} from '../functions/chaining-functions';\nimport {exceptions} from '../errors';\n\nexport default function Events(ctx) {\n var evs = {};\n var rv = function (eventName, subscriber) {\n if (subscriber) {\n // Subscribe. If additional arguments than just the subscriber was provided, forward them as well.\n var i = arguments.length, args = new Array(i - 1);\n while (--i) args[i - 1] = arguments[i];\n evs[eventName].subscribe.apply(null, args);\n return ctx;\n } else if (typeof (eventName) === 'string') {\n // Return interface allowing to fire or unsubscribe from event\n return evs[eventName];\n }\n };\n rv.addEventType = add;\n \n for (var i = 1, l = arguments.length; i < l; ++i) {\n add(arguments[i]);\n }\n \n return rv;\n\n function add(eventName, chainFunction, defaultFunction) {\n if (typeof eventName === 'object') return addConfiguredEvents(eventName);\n if (!chainFunction) chainFunction = reverseStoppableEventChain;\n if (!defaultFunction) defaultFunction = nop;\n\n var context = {\n subscribers: [],\n fire: defaultFunction,\n subscribe: function (cb) {\n if (context.subscribers.indexOf(cb) === -1) {\n context.subscribers.push(cb);\n context.fire = chainFunction(context.fire, cb);\n }\n },\n unsubscribe: function (cb) {\n context.subscribers = context.subscribers.filter(function (fn) { return fn !== cb; });\n context.fire = context.subscribers.reduce(chainFunction, defaultFunction);\n }\n };\n evs[eventName] = rv[eventName] = context;\n return context;\n }\n\n function addConfiguredEvents(cfg) {\n // events(this, {reading: [functionChain, nop]});\n keys(cfg).forEach(function (eventName) {\n var args = cfg[eventName];\n if (isArray(args)) {\n add(eventName, cfg[eventName][0], cfg[eventName][1]);\n } else if (args === 'asap') {\n // Rather than approaching event subscription using a functional approach, we here do it in a for-loop where subscriber is executed in its own stack\n // enabling that any exception that occur wont disturb the initiator and also not nescessary be catched and forgotten.\n var context = add(eventName, mirror, function fire() {\n // Optimazation-safe cloning of arguments into args.\n var i = arguments.length, args = new Array(i);\n while (i--) args[i] = arguments[i];\n // All each subscriber:\n context.subscribers.forEach(function (fn) {\n asap(function fireEvent() {\n fn.apply(null, args);\n });\n });\n });\n } else throw new exceptions.InvalidArgument(\"Invalid event config\");\n });\n }\n}\n","import { arrayToObject, derive } from './utils';\n\n\nexport function makeClassConstructor (prototype: Object, constructor: Function) {\n /*const propertyDescriptorMap = arrayToObject(\n Object.getOwnPropertyNames(prototype),\n propKey => [propKey, Object.getOwnPropertyDescriptor(prototype, propKey)]);\n\n // Both derive and clone the prototype.\n // derive: So that x instanceof T returns true when T is the class template.\n // clone: Optimizes method access a bit (but actually not nescessary)\n const derivedPrototypeClone = Object.create(prototype, propertyDescriptorMap);\n derivedPrototypeClone.constructor = constructor;\n constructor.prototype = derivedPrototypeClone;\n return constructor as any as TConstructor;*/\n\n // Keep the above code in case we want to clone AND derive the parent prototype.\n // Reason would be optimization of property access.\n // The code below will only create a prototypal inheritance from given constructor function\n // to given prototype.\n derive(constructor).from({prototype});\n return constructor as any as TConstructor; \n}\n","import { combine } from \"../../functions/combine\";\nimport { exceptions } from \"../../errors\";\nimport { hasOwn } from \"../../functions/utils\";\nimport { wrap } from \"../../helpers/promise\";\nimport { Collection } from './';\nimport { DBCoreCursor, DBCoreTable, DBCoreTransaction, DBCoreTableSchema, DBCoreRangeType } from '../../public/types/dbcore';\nimport { nop } from '../../functions/chaining-functions';\n\ntype CollectionContext = Collection[\"_ctx\"];\n\nexport function isPlainKeyRange (ctx: CollectionContext, ignoreLimitFilter?: boolean) {\n return !(ctx.filter || ctx.algorithm || ctx.or) &&\n (ignoreLimitFilter ? ctx.justLimit : !ctx.replayFilter);\n} \n\nexport function addFilter(ctx: CollectionContext, fn: Function) {\n ctx.filter = combine(ctx.filter, fn);\n}\n\nexport function addReplayFilter (ctx: CollectionContext, factory, isLimitFilter?) {\n var curr = ctx.replayFilter;\n ctx.replayFilter = curr ? ()=>combine(curr(), factory()) : factory;\n ctx.justLimit = isLimitFilter && !curr;\n}\n\nexport function addMatchFilter(ctx: CollectionContext, fn) {\n ctx.isMatch = combine(ctx.isMatch, fn);\n}\n\nexport function getIndexOrStore(ctx: CollectionContext, coreSchema: DBCoreTableSchema) {\n // TODO: Rewrite this. No need to know ctx.isPrimKey. ctx.index should hold the keypath.\n // Still, throw if not found!\n if (ctx.isPrimKey) return coreSchema.primaryKey;\n const index = coreSchema.getIndexByKeyPath(ctx.index);\n if (!index) throw new exceptions.Schema(\"KeyPath \" + ctx.index + \" on object store \" + coreSchema.name + \" is not indexed\");\n return index;\n}\n\nexport function openCursor(ctx: CollectionContext, coreTable: DBCoreTable, trans: DBCoreTransaction) {\n const index = getIndexOrStore(ctx, coreTable.schema);\n return coreTable.openCursor({\n trans,\n values: !ctx.keysOnly,\n reverse: ctx.dir === 'prev',\n unique: !!ctx.unique,\n query: {\n index, \n range: ctx.range\n }\n });\n}\n\nexport function iter (\n ctx: CollectionContext, \n fn: (item, cursor: DBCoreCursor, advance: Function)=>void,\n coreTrans: DBCoreTransaction,\n coreTable: DBCoreTable): Promise\n{\n const filter = ctx.replayFilter ? combine(ctx.filter, ctx.replayFilter()) : ctx.filter;\n if (!ctx.or) {\n return iterate(\n openCursor(ctx, coreTable, coreTrans),\n combine(ctx.algorithm, filter), fn, !ctx.keysOnly && ctx.valueMapper);\n } else {\n const set = {};\n\n const union = (item: any, cursor: DBCoreCursor, advance) => {\n if (!filter || filter(cursor, advance, result=>cursor.stop(result), err => cursor.fail(err))) {\n var primaryKey = cursor.primaryKey;\n var key = '' + primaryKey;\n if (key === '[object ArrayBuffer]') key = '' + new Uint8Array(primaryKey);\n if (!hasOwn(set, key)) {\n set[key] = true;\n fn(item, cursor, advance);\n }\n }\n }\n\n return Promise.all([\n ctx.or._iterate(union, coreTrans),\n iterate(openCursor(ctx, coreTable, coreTrans), ctx.algorithm, union, !ctx.keysOnly && ctx.valueMapper)\n ]);\n }\n}\n\nfunction iterate(cursorPromise: Promise, filter, fn, valueMapper): Promise {\n \n // Apply valueMapper (hook('reading') or mappped class)\n var mappedFn = valueMapper ? (x,c,a) => fn(valueMapper(x),c,a) : fn;\n // Wrap fn with PSD and microtick stuff from Promise.\n var wrappedFn = wrap(mappedFn);\n \n return cursorPromise.then(cursor => {\n if (cursor) {\n return cursor.start(()=>{\n var c = ()=>cursor.continue();\n if (!filter || filter(cursor, advancer => c = advancer, val=>{cursor.stop(val);c=nop}, e => {cursor.fail(e);c = nop;}))\n wrappedFn(cursor.value, cursor, advancer => c = advancer);\n c();\n });\n }\n });\n}\n","// Implementation of https://www.w3.org/TR/IndexedDB-3/#compare-two-keys\n\nimport { toStringTag } from './utils';\n\n// ... with the adjustment to return NaN instead of throwing.\nexport function cmp(a: any, b: any): number {\n try {\n const ta = type(a);\n const tb = type(b);\n if (ta !== tb) {\n if (ta === 'Array') return 1;\n if (tb === 'Array') return -1;\n if (ta === 'binary') return 1;\n if (tb === 'binary') return -1;\n if (ta === 'string') return 1;\n if (tb === 'string') return -1;\n if (ta === 'Date') return 1;\n if (tb !== 'Date') return NaN;\n return -1;\n }\n switch (ta) {\n case 'number':\n case 'Date':\n case 'string':\n return a > b ? 1 : a < b ? -1 : 0;\n case 'binary': {\n return compareUint8Arrays(getUint8Array(a), getUint8Array(b));\n }\n case 'Array':\n return compareArrays(a, b);\n }\n } catch {}\n return NaN; // Return value if any given args are valid keys.\n}\n\nexport function compareArrays(a: any[], b: any[]): number {\n const al = a.length;\n const bl = b.length;\n const l = al < bl ? al : bl;\n for (let i = 0; i < l; ++i) {\n const res = cmp(a[i], b[i]);\n if (res !== 0) return res;\n }\n return al === bl ? 0 : al < bl ? -1 : 1;\n}\n\nexport function compareUint8Arrays(\n a: Uint8Array,\n b: Uint8Array\n) {\n const al = a.length;\n const bl = b.length;\n const l = al < bl ? al : bl;\n for (let i = 0; i < l; ++i) {\n if (a[i] !== b[i]) return a[i] < b[i] ? -1 : 1;\n }\n return al === bl ? 0 : al < bl ? -1 : 1;\n}\n\n// Implementation of https://www.w3.org/TR/IndexedDB-3/#key-type\nfunction type(x: any) {\n const t = typeof x;\n if (t !== 'object') return t;\n if (ArrayBuffer.isView(x)) return 'binary';\n const tsTag = toStringTag(x); // Cannot use instanceof in Safari\n return tsTag === 'ArrayBuffer' ? 'binary' : (tsTag as 'Array' | 'Date');\n}\n\ntype BinaryType =\n | ArrayBuffer\n | DataView\n | Uint8ClampedArray\n | ArrayBufferView\n | Uint8Array\n | Int8Array\n | Uint16Array\n | Int16Array\n | Uint32Array\n | Int32Array\n | Float32Array\n | Float64Array;\n\nfunction getUint8Array(a: BinaryType): Uint8Array {\n if (a instanceof Uint8Array) return a;\n if (ArrayBuffer.isView(a))\n // TypedArray or DataView\n return new Uint8Array(a.buffer, a.byteOffset, a.byteLength);\n return new Uint8Array(a); // ArrayBuffer\n}\n","import { Collection as ICollection } from \"../../public/types/collection\";\nimport { Dexie } from \"../dexie\";\nimport { Table } from \"../table\";\nimport { IndexableType, IndexableTypeArrayReadonly } from \"../../public/types/indexable-type\";\nimport { PromiseExtended } from \"../../public/types/promise-extended\";\nimport { iter, isPlainKeyRange, getIndexOrStore, addReplayFilter, addFilter, addMatchFilter } from \"./collection-helpers\";\nimport { rejection } from \"../../helpers/promise\";\nimport { combine } from \"../../functions/combine\";\nimport { extend, hasOwn, deepClone, keys, setByKeyPath, getByKeyPath } from \"../../functions/utils\";\nimport { ModifyError } from \"../../errors\";\nimport { hangsOnDeleteLargeKeyRange } from \"../../globals/constants\";\nimport { ThenShortcut } from \"../../public/types/then-shortcut\";\nimport { Transaction } from '../transaction';\nimport { DBCoreCursor, DBCoreTransaction, DBCoreRangeType, DBCoreMutateResponse, DBCoreKeyRange } from '../../public/types/dbcore';\nimport { cmp } from \"../../functions/cmp\";\n\n/** class Collection\n * \n * https://dexie.org/docs/Collection/Collection\n */\nexport class Collection implements ICollection {\n db: Dexie;\n _ctx: {\n table: Table;\n index?: string | null;\n isPrimKey?: boolean;\n range: DBCoreKeyRange;\n keysOnly: boolean;\n dir: \"next\" | \"prev\";\n unique: \"\" | \"unique\";\n algorithm?: Function | null;\n filter?: Function | null;\n replayFilter: Function | null;\n justLimit: boolean; // True if a replayFilter is just a filter that performs a \"limit\" operation (or none at all)\n isMatch: Function | null;\n offset: number,\n limit: number,\n error: any, // If set, any promise must be rejected with this error\n or: Collection,\n valueMapper: (any) => any\n }\n \n _ondirectionchange?: Function;\n\n _read(fn: (idbtrans: IDBTransaction, dxTrans: Transaction) => PromiseLike, cb?): PromiseExtended {\n var ctx = this._ctx;\n return ctx.error ?\n ctx.table._trans(null, rejection.bind(null, ctx.error)) :\n ctx.table._trans('readonly', fn).then(cb);\n }\n\n _write(fn: (idbtrans: IDBTransaction, dxTrans: Transaction) => PromiseLike): PromiseExtended {\n var ctx = this._ctx;\n return ctx.error ?\n ctx.table._trans(null, rejection.bind(null, ctx.error)) :\n ctx.table._trans('readwrite', fn, \"locked\"); // When doing write operations on collections, always lock the operation so that upcoming operations gets queued.\n }\n\n _addAlgorithm(fn) {\n var ctx = this._ctx;\n ctx.algorithm = combine(ctx.algorithm, fn);\n }\n\n _iterate(\n fn: (item, cursor: DBCoreCursor, advance: Function) => void,\n coreTrans: DBCoreTransaction) : Promise\n {\n return iter(this._ctx, fn, coreTrans, this._ctx.table.core);\n }\n\n /** Collection.clone()\n * \n * https://dexie.org/docs/Collection/Collection.clone()\n * \n **/\n clone(props?) {\n var rv = Object.create(this.constructor.prototype),\n ctx = Object.create(this._ctx);\n if (props) extend(ctx, props);\n rv._ctx = ctx;\n return rv;\n }\n\n /** Collection.raw()\n * \n * https://dexie.org/docs/Collection/Collection.raw()\n * \n **/\n raw() {\n this._ctx.valueMapper = null;\n return this;\n }\n\n /** Collection.each()\n * \n * https://dexie.org/docs/Collection/Collection.each()\n * \n **/\n each(fn: (obj, cursor: DBCoreCursor) => any): PromiseExtended {\n var ctx = this._ctx;\n\n return this._read(trans => iter(ctx, fn, trans, ctx.table.core));\n }\n\n /** Collection.count()\n * \n * https://dexie.org/docs/Collection/Collection.count()\n * \n **/\n count(cb?) {\n return this._read(trans => {\n const ctx = this._ctx;\n const coreTable = ctx.table.core;\n if (isPlainKeyRange(ctx, true)) {\n // This is a plain key range. We can use the count() method if the index.\n return coreTable.count({\n trans,\n query: {\n index: getIndexOrStore(ctx, coreTable.schema),\n range: ctx.range\n }\n }).then(count => Math.min(count, ctx.limit));\n } else {\n // Algorithms, filters or expressions are applied. Need to count manually.\n var count = 0;\n return iter(ctx, () => { ++count; return false; }, trans, coreTable)\n .then(()=>count);\n }\n }).then(cb);\n }\n\n /** Collection.sortBy()\n * \n * https://dexie.org/docs/Collection/Collection.sortBy()\n * \n **/\n sortBy(keyPath: string): PromiseExtended;\n sortBy(keyPath: string, thenShortcut: ThenShortcut) : PromiseExtended;\n sortBy(keyPath: string, cb?: ThenShortcut) {\n const parts = keyPath.split('.').reverse(),\n lastPart = parts[0],\n lastIndex = parts.length - 1;\n function getval(obj, i) {\n if (i) return getval(obj[parts[i]], i - 1);\n return obj[lastPart];\n }\n var order = this._ctx.dir === \"next\" ? 1 : -1;\n\n function sorter(a, b) {\n var aVal = getval(a, lastIndex),\n bVal = getval(b, lastIndex);\n return aVal < bVal ? -order : aVal > bVal ? order : 0;\n }\n return this.toArray(function (a) {\n return a.sort(sorter);\n }).then(cb);\n }\n\n /** Collection.toArray()\n * \n * https://dexie.org/docs/Collection/Collection.toArray()\n * \n **/\n toArray(cb?): PromiseExtended {\n return this._read(trans => {\n var ctx = this._ctx;\n if (ctx.dir === 'next' && isPlainKeyRange(ctx, true) && ctx.limit > 0) {\n // Special optimation if we could use IDBObjectStore.getAll() or\n // IDBKeyRange.getAll():\n const {valueMapper} = ctx;\n const index = getIndexOrStore(ctx, ctx.table.core.schema);\n return ctx.table.core.query({\n trans,\n limit: ctx.limit,\n values: true,\n query: {\n index,\n range: ctx.range\n }\n }).then(({result}) => valueMapper ? result.map(valueMapper) : result);\n } else {\n // Getting array through a cursor.\n const a = [];\n return iter(ctx, item => a.push(item), trans, ctx.table.core).then(()=>a);\n }\n }, cb);\n }\n\n /** Collection.offset()\n * \n * https://dexie.org/docs/Collection/Collection.offset()\n * \n **/\n offset(offset: number) : Collection{\n var ctx = this._ctx;\n if (offset <= 0) return this;\n ctx.offset += offset; // For count()\n if (isPlainKeyRange(ctx)) {\n addReplayFilter(ctx, () => {\n var offsetLeft = offset;\n return (cursor, advance) => {\n if (offsetLeft === 0) return true;\n if (offsetLeft === 1) { --offsetLeft; return false; }\n advance(() => {\n cursor.advance(offsetLeft);\n offsetLeft = 0;\n });\n return false;\n };\n });\n } else {\n addReplayFilter(ctx, () => {\n var offsetLeft = offset;\n return () => (--offsetLeft < 0);\n });\n }\n return this;\n }\n\n /** Collection.limit()\n * \n * https://dexie.org/docs/Collection/Collection.limit()\n * \n **/\n limit(numRows: number) : Collection {\n this._ctx.limit = Math.min(this._ctx.limit, numRows); // For count()\n addReplayFilter(this._ctx, () => {\n var rowsLeft = numRows;\n return function (cursor, advance, resolve) {\n if (--rowsLeft <= 0) advance(resolve); // Stop after this item has been included\n return rowsLeft >= 0; // If numRows is already below 0, return false because then 0 was passed to numRows initially. Otherwise we wouldnt come here.\n };\n }, true);\n return this;\n }\n\n /** Collection.until()\n * \n * https://dexie.org/docs/Collection/Collection.until()\n * \n **/\n until(filterFunction: (x) => boolean, bIncludeStopEntry?) {\n addFilter(this._ctx, function (cursor, advance, resolve) {\n if (filterFunction(cursor.value)) {\n advance(resolve);\n return bIncludeStopEntry;\n } else {\n return true;\n }\n });\n return this;\n }\n\n /** Collection.first()\n * \n * https://dexie.org/docs/Collection/Collection.first()\n * \n **/\n first(cb?) {\n return this.limit(1).toArray(function (a) { return a[0]; }).then(cb);\n }\n\n /** Collection.last()\n * \n * https://dexie.org/docs/Collection/Collection.last()\n * \n **/\n last(cb?) {\n return this.reverse().first(cb);\n }\n\n /** Collection.filter()\n * \n * https://dexie.org/docs/Collection/Collection.filter()\n * \n **/\n filter(filterFunction: (x) => boolean): Collection {\n /// function(val){return true/false}\n addFilter(this._ctx, function (cursor) {\n return filterFunction(cursor.value);\n });\n // match filters not used in Dexie.js but can be used by 3rd part libraries to test a\n // collection for a match without querying DB. Used by Dexie.Observable.\n addMatchFilter(this._ctx, filterFunction);\n return this;\n }\n\n /** Collection.and()\n * \n * https://dexie.org/docs/Collection/Collection.and()\n * \n **/\n and(filter: (x) => boolean) {\n return this.filter(filter);\n }\n\n /** Collection.or()\n * \n * https://dexie.org/docs/Collection/Collection.or()\n * \n **/\n or(indexName: string) {\n return new this.db.WhereClause(this._ctx.table, indexName, this);\n }\n\n /** Collection.reverse()\n * \n * https://dexie.org/docs/Collection/Collection.reverse()\n * \n **/\n reverse() {\n this._ctx.dir = (this._ctx.dir === \"prev\" ? \"next\" : \"prev\");\n if (this._ondirectionchange) this._ondirectionchange(this._ctx.dir);\n return this;\n }\n\n /** Collection.desc()\n * \n * https://dexie.org/docs/Collection/Collection.desc()\n * \n **/\n desc() {\n return this.reverse();\n }\n\n /** Collection.eachKey()\n * \n * https://dexie.org/docs/Collection/Collection.eachKey()\n * \n **/\n eachKey(cb?) {\n var ctx = this._ctx;\n ctx.keysOnly = !ctx.isMatch;\n return this.each(function (val, cursor) { cb(cursor.key, cursor); });\n }\n\n /** Collection.eachUniqueKey()\n * \n * https://dexie.org/docs/Collection/Collection.eachUniqueKey()\n * \n **/\n eachUniqueKey(cb?) {\n this._ctx.unique = \"unique\";\n return this.eachKey(cb);\n }\n\n /** Collection.eachPrimaryKey()\n * \n * https://dexie.org/docs/Collection/Collection.eachPrimaryKey()\n * \n **/\n eachPrimaryKey(cb?) {\n var ctx = this._ctx;\n ctx.keysOnly = !ctx.isMatch;\n return this.each(function (val, cursor) { cb(cursor.primaryKey, cursor); });\n }\n\n /** Collection.keys()\n * \n * https://dexie.org/docs/Collection/Collection.keys()\n * \n **/\n keys(cb?) {\n var ctx = this._ctx;\n ctx.keysOnly = !ctx.isMatch;\n var a = [];\n return this.each(function (item, cursor) {\n a.push(cursor.key);\n }).then(function () {\n return a;\n }).then(cb);\n }\n\n /** Collection.primaryKeys()\n * \n * https://dexie.org/docs/Collection/Collection.primaryKeys()\n * \n **/\n primaryKeys(cb?) : PromiseExtended {\n var ctx = this._ctx;\n if (ctx.dir === 'next' && isPlainKeyRange(ctx, true) && ctx.limit > 0) {\n // Special optimation if we could use IDBObjectStore.getAllKeys() or\n // IDBKeyRange.getAllKeys():\n return this._read(trans => {\n var index = getIndexOrStore(ctx, ctx.table.core.schema);\n return ctx.table.core.query({\n trans,\n values: false,\n limit: ctx.limit,\n query: {\n index,\n range: ctx.range\n }});\n }).then(({result})=>result).then(cb);\n }\n ctx.keysOnly = !ctx.isMatch;\n var a = [];\n return this.each(function (item, cursor) {\n a.push(cursor.primaryKey);\n }).then(function () {\n return a;\n }).then(cb);\n }\n\n /** Collection.uniqueKeys()\n * \n * https://dexie.org/docs/Collection/Collection.uniqueKeys()\n * \n **/\n uniqueKeys(cb?) {\n this._ctx.unique = \"unique\";\n return this.keys(cb);\n }\n\n /** Collection.firstKey()\n * \n * https://dexie.org/docs/Collection/Collection.firstKey()\n * \n **/\n firstKey(cb?) {\n return this.limit(1).keys(function (a) { return a[0]; }).then(cb);\n }\n\n /** Collection.lastKey()\n * \n * https://dexie.org/docs/Collection/Collection.lastKey()\n * \n **/\n lastKey(cb?) {\n return this.reverse().firstKey(cb);\n }\n\n /** Collection.distinct()\n * \n * https://dexie.org/docs/Collection/Collection.distinct()\n * \n **/\n distinct() {\n var ctx = this._ctx,\n idx = ctx.index && ctx.table.schema.idxByName[ctx.index];\n if (!idx || !idx.multi) return this; // distinct() only makes differencies on multiEntry indexes.\n var set = {};\n addFilter(this._ctx, function (cursor: DBCoreCursor) {\n var strKey = cursor.primaryKey.toString(); // Converts any Date to String, String to String, Number to String and Array to comma-separated string\n var found = hasOwn(set, strKey);\n set[strKey] = true;\n return !found;\n });\n return this;\n }\n\n //\n // Methods that mutate storage\n //\n\n /** Collection.modify()\n * \n * https://dexie.org/docs/Collection/Collection.modify()\n * \n **/\n modify(changes: { [keyPath: string]: any }) : PromiseExtended\n modify(changes: (obj: any, ctx:{value: any, primKey: IndexableType}) => void | boolean): PromiseExtended {\n var ctx = this._ctx;\n return this._write(trans => {\n var modifyer: (obj: any, ctx:{value: any, primKey: IndexableType}) => void | boolean\n if (typeof changes === 'function') {\n // Changes is a function that may update, add or delete propterties or even require a deletion the object itself (delete this.item)\n modifyer = changes;\n } else {\n // changes is a set of {keyPath: value} and no one is listening to the updating hook.\n var keyPaths = keys(changes);\n var numKeys = keyPaths.length;\n modifyer = function (item) {\n var anythingModified = false;\n for (var i = 0; i < numKeys; ++i) {\n var keyPath = keyPaths[i], val = changes[keyPath];\n if (getByKeyPath(item, keyPath) !== val) {\n setByKeyPath(item, keyPath, val); // Adding {keyPath: undefined} means that the keyPath should be deleted. Handled by setByKeyPath\n anythingModified = true;\n }\n }\n return anythingModified;\n };\n }\n\n const coreTable = ctx.table.core;\n const {outbound, extractKey} = coreTable.schema.primaryKey;\n const limit = this.db._options.modifyChunkSize || 200;\n const totalFailures = [];\n let successCount = 0;\n const failedKeys: IndexableType[] = [];\n const applyMutateResult = (expectedCount: number, res: DBCoreMutateResponse) => {\n const {failures, numFailures} = res;\n successCount += expectedCount - numFailures;\n for (let pos of keys(failures)) {\n totalFailures.push(failures[pos]);\n }\n }\n return this.clone().primaryKeys().then(keys => {\n\n const nextChunk = (offset: number) => {\n const count = Math.min(limit, keys.length - offset);\n return coreTable.getMany({\n trans,\n keys: keys.slice(offset, offset + count),\n cache: \"immutable\" // Optimize for 2 things:\n // 1) observability-middleware can track changes better.\n // 2) hooks middleware don't have to query the existing values again when tracking changes.\n // We can use \"immutable\" because we promise to not touch the values we retrieve here!\n }).then(values => {\n const addValues = [];\n const putValues = [];\n const putKeys = outbound ? [] : null;\n const deleteKeys = [];\n for (let i=0; i 0 &&\n coreTable.mutate({trans, type: 'add', values: addValues})\n .then(res => {\n for (let pos in res.failures) {\n // Remove from deleteKeys the key of the object that failed to change its primary key\n deleteKeys.splice(parseInt(pos), 1);\n }\n applyMutateResult(addValues.length, res);\n })\n ).then(()=>(putValues.length > 0 || (criteria && typeof changes === 'object')) &&\n coreTable.mutate({\n trans,\n type: 'put',\n keys: putKeys,\n values: putValues,\n criteria,\n changeSpec: typeof changes !== 'function'\n && changes\n }).then(res=>applyMutateResult(putValues.length, res))\n ).then(()=>(deleteKeys.length > 0 || (criteria && changes === deleteCallback)) &&\n coreTable.mutate({\n trans,\n type: 'delete',\n keys: deleteKeys,\n criteria\n }).then(res=>applyMutateResult(deleteKeys.length, res))\n ).then(()=>{\n return keys.length > offset + count && nextChunk(offset + limit);\n });\n });\n }\n\n return nextChunk(0).then(()=>{\n if (totalFailures.length > 0)\n throw new ModifyError(\"Error modifying one or more objects\", totalFailures, successCount, failedKeys as IndexableTypeArrayReadonly);\n\n return keys.length;\n });\n });\n\n });\n }\n\n /** Collection.delete()\n * \n * https://dexie.org/docs/Collection/Collection.delete()\n * \n **/\n delete() : PromiseExtended {\n var ctx = this._ctx,\n range = ctx.range;\n //deletingHook = ctx.table.hook.deleting.fire,\n //hasDeleteHook = deletingHook !== nop;\n if (isPlainKeyRange(ctx) &&\n ((ctx.isPrimKey && !hangsOnDeleteLargeKeyRange) || range.type === DBCoreRangeType.Any)) // if no range, we'll use clear().\n {\n // May use IDBObjectStore.delete(IDBKeyRange) in this case (Issue #208)\n // For chromium, this is the way most optimized version.\n // For IE/Edge, this could hang the indexedDB engine and make operating system instable\n // (https://gist.github.com/dfahlander/5a39328f029de18222cf2125d56c38f7)\n return this._write(trans => {\n // Our API contract is to return a count of deleted items, so we have to count() before delete().\n const {primaryKey} = ctx.table.core.schema;\n const coreRange = range;\n return ctx.table.core.count({trans, query: {index: primaryKey, range: coreRange}}).then(count => {\n return ctx.table.core.mutate({trans, type: 'deleteRange', range: coreRange})\n .then(({failures, lastResult, results, numFailures}) => {\n if (numFailures) throw new ModifyError(\"Could not delete some values\",\n Object.keys(failures).map(pos => failures[pos]),\n count - numFailures);\n return count - numFailures;\n });\n });\n });\n }\n\n return this.modify(deleteCallback);\n }\n}\n\nconst deleteCallback = (value, ctx) => ctx.value = null;\n","import { IndexableType } from '../public/types/indexable-type';\n\nexport function simpleCompare(a, b) {\n return a < b ? -1 : a === b ? 0 : 1;\n}\n\nexport function simpleCompareReverse(a, b) {\n return a > b ? -1 : a === b ? 0 : 1;\n}\n","import { WhereClause } from './where-clause';\nimport { Collection } from '../collection';\nimport { STRING_EXPECTED } from '../../globals/constants';\nimport { simpleCompare, simpleCompareReverse } from '../../functions/compare-functions';\nimport { IndexableType } from '../../public';\nimport { DBCoreKeyRange, DBCoreRangeType } from '../../public/types/dbcore';\n\nexport function fail(collectionOrWhereClause: Collection | WhereClause, err, T?) {\n var collection = collectionOrWhereClause instanceof WhereClause ?\n new collectionOrWhereClause.Collection (collectionOrWhereClause) :\n collectionOrWhereClause;\n \n collection._ctx.error = T ? new T(err) : new TypeError(err);\n return collection;\n}\n\nexport function emptyCollection(whereClause: WhereClause) {\n return new whereClause.Collection (whereClause, () => rangeEqual(\"\")).limit(0);\n}\n\nexport function upperFactory(dir: 'next' | 'prev') {\n return dir === \"next\" ?\n (s: string) => s.toUpperCase() :\n (s: string) => s.toLowerCase();\n}\n\nexport function lowerFactory(dir: 'next' | 'prev') {\n return dir === \"next\" ?\n (s: string) => s.toLowerCase() :\n (s: string) => s.toUpperCase();\n}\n\nexport function nextCasing(key, lowerKey, upperNeedle, lowerNeedle, cmp, dir) {\n var length = Math.min(key.length, lowerNeedle.length);\n var llp = -1;\n for (var i = 0; i < length; ++i) {\n var lwrKeyChar = lowerKey[i];\n if (lwrKeyChar !== lowerNeedle[i]) {\n if (cmp(key[i], upperNeedle[i]) < 0) return key.substr(0, i) + upperNeedle[i] + upperNeedle.substr(i + 1);\n if (cmp(key[i], lowerNeedle[i]) < 0) return key.substr(0, i) + lowerNeedle[i] + upperNeedle.substr(i + 1);\n if (llp >= 0) return key.substr(0, llp) + lowerKey[llp] + upperNeedle.substr(llp + 1);\n return null;\n }\n if (cmp(key[i], lwrKeyChar) < 0) llp = i;\n }\n if (length < lowerNeedle.length && dir === \"next\") return key + upperNeedle.substr(key.length);\n if (length < key.length && dir === \"prev\") return key.substr(0, upperNeedle.length);\n return (llp < 0 ? null : key.substr(0, llp) + lowerNeedle[llp] + upperNeedle.substr(llp + 1));\n}\n\nexport function addIgnoreCaseAlgorithm(whereClause: WhereClause, match, needles, suffix) {\n /// \n var upper, lower, compare, upperNeedles, lowerNeedles, direction, nextKeySuffix,\n needlesLen = needles.length;\n if (!needles.every(s => typeof s === 'string')) {\n return fail(whereClause, STRING_EXPECTED);\n }\n function initDirection(dir) {\n upper = upperFactory(dir);\n lower = lowerFactory(dir);\n compare = (dir === \"next\" ? simpleCompare : simpleCompareReverse);\n var needleBounds = needles.map(function (needle){\n return {lower: lower(needle), upper: upper(needle)};\n }).sort(function(a,b) {\n return compare(a.lower, b.lower);\n });\n upperNeedles = needleBounds.map(function (nb){ return nb.upper; });\n lowerNeedles = needleBounds.map(function (nb){ return nb.lower; });\n direction = dir;\n nextKeySuffix = (dir === \"next\" ? \"\" : suffix);\n }\n initDirection(\"next\");\n\n var c = new whereClause.Collection (\n whereClause,\n ()=>createRange(upperNeedles[0], lowerNeedles[needlesLen-1] + suffix)\n );\n\n c._ondirectionchange = function (direction) {\n // This event onlys occur before filter is called the first time.\n initDirection(direction);\n };\n\n var firstPossibleNeedle = 0;\n\n c._addAlgorithm(function (cursor, advance, resolve) {\n /// \n /// \n /// \n var key = cursor.key;\n if (typeof key !== 'string') return false;\n var lowerKey = lower(key);\n if (match(lowerKey, lowerNeedles, firstPossibleNeedle)) {\n return true;\n } else {\n var lowestPossibleCasing = null;\n for (var i=firstPossibleNeedle; i 0) {\n lowestPossibleCasing = casing;\n }\n }\n if (lowestPossibleCasing !== null) {\n advance(function () { cursor.continue(lowestPossibleCasing + nextKeySuffix); });\n } else {\n advance(resolve);\n }\n return false;\n }\n });\n return c;\n}\n\nexport function createRange (lower: IndexableType, upper: IndexableType, lowerOpen?: boolean, upperOpen?: boolean): DBCoreKeyRange {\n return {\n type: DBCoreRangeType.Range,\n lower,\n upper,\n lowerOpen,\n upperOpen\n };\n}\n\nexport function rangeEqual (value: IndexableType) : DBCoreKeyRange {\n return {\n type: DBCoreRangeType.Equal,\n lower: value,\n upper: value\n };\n}\n","import { WhereClause as IWhereClause } from \"../../public/types/where-clause\";\nimport { Collection } from \"../collection\";\nimport { Table } from \"../table\";\nimport { IndexableType } from \"../../public/types/indexable-type\";\nimport { emptyCollection, fail, addIgnoreCaseAlgorithm, createRange, rangeEqual } from './where-clause-helpers';\nimport { INVALID_KEY_ARGUMENT, STRING_EXPECTED, maxString, minKey } from '../../globals/constants';\nimport { getArrayOf, NO_CHAR_ARRAY } from '../../functions/utils';\nimport { exceptions } from '../../errors';\nimport { Dexie } from '../dexie';\nimport { Collection as ICollection} from \"../../public/types/collection\";\n\n/** class WhereClause\n * \n * https://dexie.org/docs/WhereClause/WhereClause\n */\nexport class WhereClause implements IWhereClause {\n db: Dexie;\n _IDBKeyRange: typeof IDBKeyRange;\n _ctx: {\n table: Table;\n index: string;\n or: Collection;\n }\n _cmp: (a: IndexableType, b: IndexableType) => number;\n _ascending: (a: IndexableType, b: IndexableType) => number;\n _descending: (a: IndexableType, b: IndexableType) => number;\n _min: (a: IndexableType, b: IndexableType) => IndexableType;\n _max: (a: IndexableType, b: IndexableType) => IndexableType;\n\n get Collection() {\n return this._ctx.table.db.Collection;\n }\n\n /** WhereClause.between()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.between()\n * \n **/\n between(lower: IndexableType, upper: IndexableType, includeLower?: boolean, includeUpper?: boolean) {\n includeLower = includeLower !== false; // Default to true\n includeUpper = includeUpper === true; // Default to false\n try {\n if ((this._cmp(lower, upper) > 0) ||\n (this._cmp(lower, upper) === 0 && (includeLower || includeUpper) && !(includeLower && includeUpper)))\n return emptyCollection(this); // Workaround for idiotic W3C Specification that DataError must be thrown if lower > upper. The natural result would be to return an empty collection.\n return new this.Collection(this, ()=>createRange(lower, upper, !includeLower, !includeUpper));\n } catch (e) {\n return fail(this, INVALID_KEY_ARGUMENT);\n }\n }\n\n /** WhereClause.equals()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.equals()\n * \n **/\n equals(value: IndexableType) {\n if (value == null) return fail(this, INVALID_KEY_ARGUMENT);\n return new this.Collection(this, () => rangeEqual(value)) as ICollection;\n }\n\n /** WhereClause.above()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.above()\n * \n **/\n above(value: IndexableType) {\n if (value == null) return fail(this, INVALID_KEY_ARGUMENT);\n return new this.Collection(this, () => createRange(value, undefined, true));\n }\n\n /** WhereClause.aboveOrEqual()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.aboveOrEqual()\n * \n **/\n aboveOrEqual(value: IndexableType) {\n if (value == null) return fail(this, INVALID_KEY_ARGUMENT);\n return new this.Collection(this, () => createRange(value, undefined, false));\n }\n\n /** WhereClause.below()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.below()\n * \n **/\n below(value: IndexableType) {\n if (value == null) return fail(this, INVALID_KEY_ARGUMENT);\n return new this.Collection(this, () => createRange(undefined, value, false, true));\n }\n\n /** WhereClause.belowOrEqual()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.belowOrEqual()\n * \n **/\n belowOrEqual(value: IndexableType) {\n if (value == null) return fail(this, INVALID_KEY_ARGUMENT);\n return new this.Collection(this, () => createRange(undefined, value));\n }\n\n /** WhereClause.startsWith()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.startsWith()\n * \n **/\n startsWith(str: string) {\n if (typeof str !== 'string') return fail(this, STRING_EXPECTED);\n return this.between(str, str + maxString, true, true);\n }\n\n /** WhereClause.startsWithIgnoreCase()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.startsWithIgnoreCase()\n * \n **/\n startsWithIgnoreCase(str: string) {\n if (str === \"\") return this.startsWith(str);\n return addIgnoreCaseAlgorithm(this, (x, a) => x.indexOf(a[0]) === 0, [str], maxString);\n }\n\n /** WhereClause.equalsIgnoreCase()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.equalsIgnoreCase()\n * \n **/\n equalsIgnoreCase(str: string) {\n return addIgnoreCaseAlgorithm(this, (x, a) => x === a[0], [str], \"\");\n }\n\n /** WhereClause.anyOfIgnoreCase()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.anyOfIgnoreCase()\n * \n **/\n anyOfIgnoreCase(...values: string[]): Collection;\n anyOfIgnoreCase(values: string[]): Collection;\n anyOfIgnoreCase() {\n var set = getArrayOf.apply(NO_CHAR_ARRAY, arguments);\n if (set.length === 0) return emptyCollection(this);\n return addIgnoreCaseAlgorithm(this, (x, a) => a.indexOf(x) !== -1, set, \"\");\n }\n\n /** WhereClause.startsWithAnyOfIgnoreCase()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.startsWithAnyOfIgnoreCase()\n * \n **/\n startsWithAnyOfIgnoreCase(...values: string[]): Collection;\n startsWithAnyOfIgnoreCase(values: string[]): Collection;\n startsWithAnyOfIgnoreCase() {\n var set = getArrayOf.apply(NO_CHAR_ARRAY, arguments);\n if (set.length === 0) return emptyCollection(this);\n return addIgnoreCaseAlgorithm(this, (x, a) => a.some(n => x.indexOf(n) === 0), set, maxString);\n }\n\n /** WhereClause.anyOf()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.anyOf()\n * \n **/\n anyOf(...values: string[]): Collection;\n anyOf(values: string[]): Collection;\n anyOf() {\n const set = getArrayOf.apply(NO_CHAR_ARRAY, arguments);\n let compare = this._cmp;\n try { set.sort(compare); } catch (e) { return fail(this, INVALID_KEY_ARGUMENT); }\n if (set.length === 0) return emptyCollection(this);\n const c = new this.Collection(this, () => createRange(set[0], set[set.length - 1]));\n\n c._ondirectionchange = direction => {\n compare = (direction === \"next\" ?\n this._ascending :\n this._descending);\n set.sort(compare);\n };\n\n let i = 0;\n c._addAlgorithm((cursor, advance, resolve) => {\n const key = cursor.key;\n while (compare(key, set[i]) > 0) {\n // The cursor has passed beyond this key. Check next.\n ++i;\n if (i === set.length) {\n // There is no next. Stop searching.\n advance(resolve);\n return false;\n }\n }\n if (compare(key, set[i]) === 0) {\n // The current cursor value should be included and we should continue a single step in case next item has the same key or possibly our next key in set.\n return true;\n } else {\n // cursor.key not yet at set[i]. Forward cursor to the next key to hunt for.\n advance(() => { cursor.continue(set[i]); });\n return false;\n }\n });\n return c;\n }\n\n /** WhereClause.notEqual()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.notEqual()\n * \n **/\n notEqual(value: IndexableType) {\n return this.inAnyRange([[minKey, value], [value, this.db._maxKey]], { includeLowers: false, includeUppers: false });\n }\n\n /** WhereClause.noneOf()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.noneOf()\n * \n **/\n noneOf(...values: string[]): Collection;\n noneOf(values: string[]): Collection;\n noneOf() {\n const set = getArrayOf.apply(NO_CHAR_ARRAY, arguments);\n if (set.length === 0) return new this.Collection(this); // Return entire collection.\n try { set.sort(this._ascending); } catch (e) { return fail(this, INVALID_KEY_ARGUMENT); }\n // Transform [\"a\",\"b\",\"c\"] to a set of ranges for between/above/below: [[minKey,\"a\"], [\"a\",\"b\"], [\"b\",\"c\"], [\"c\",maxKey]]\n const ranges = set.reduce(\n (res, val) => res ?\n res.concat([[res[res.length - 1][1], val]]) :\n [[minKey, val]],\n null);\n ranges.push([set[set.length - 1], this.db._maxKey]);\n return this.inAnyRange(ranges, { includeLowers: false, includeUppers: false });\n }\n\n /** WhereClause.inAnyRange()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.inAnyRange()\n * \n **/\n inAnyRange(\n ranges: ReadonlyArray<{ 0: IndexableType, 1: IndexableType }>,\n options?: { includeLowers?: boolean, includeUppers?: boolean })\n {\n const cmp = this._cmp,\n ascending = this._ascending,\n descending = this._descending,\n min = this._min,\n max = this._max;\n\n if (ranges.length === 0) return emptyCollection(this);\n if (!ranges.every(range =>\n range[0] !== undefined &&\n range[1] !== undefined &&\n ascending(range[0], range[1]) <= 0)) {\n return fail(\n this,\n \"First argument to inAnyRange() must be an Array of two-value Arrays [lower,upper] where upper must not be lower than lower\",\n exceptions.InvalidArgument);\n }\n const includeLowers = !options || options.includeLowers !== false; // Default to true\n const includeUppers = options && options.includeUppers === true; // Default to false\n\n function addRange(ranges, newRange) {\n let i = 0, l = ranges.length;\n for (; i < l; ++i) {\n const range = ranges[i];\n if (cmp(newRange[0], range[1]) < 0 && cmp(newRange[1], range[0]) > 0) {\n range[0] = min(range[0], newRange[0]);\n range[1] = max(range[1], newRange[1]);\n break;\n }\n }\n if (i === l)\n ranges.push(newRange);\n return ranges;\n }\n\n let sortDirection = ascending;\n function rangeSorter(a, b) { return sortDirection(a[0], b[0]); }\n\n // Join overlapping ranges\n let set;\n try {\n set = ranges.reduce(addRange, []);\n set.sort(rangeSorter);\n } catch (ex) {\n return fail(this, INVALID_KEY_ARGUMENT);\n }\n\n let rangePos = 0;\n const keyIsBeyondCurrentEntry = includeUppers ?\n key => ascending(key, set[rangePos][1]) > 0 :\n key => ascending(key, set[rangePos][1]) >= 0;\n\n const keyIsBeforeCurrentEntry = includeLowers ?\n key => descending(key, set[rangePos][0]) > 0 :\n key => descending(key, set[rangePos][0]) >= 0;\n\n function keyWithinCurrentRange(key) {\n return !keyIsBeyondCurrentEntry(key) && !keyIsBeforeCurrentEntry(key);\n }\n\n let checkKey = keyIsBeyondCurrentEntry;\n\n const c = new this.Collection(\n this,\n () => createRange(set[0][0], set[set.length - 1][1], !includeLowers, !includeUppers));\n\n c._ondirectionchange = direction => {\n if (direction === \"next\") {\n checkKey = keyIsBeyondCurrentEntry;\n sortDirection = ascending;\n } else {\n checkKey = keyIsBeforeCurrentEntry;\n sortDirection = descending;\n }\n set.sort(rangeSorter);\n };\n\n c._addAlgorithm((cursor, advance, resolve) => {\n var key = cursor.key;\n while (checkKey(key)) {\n // The cursor has passed beyond this key. Check next.\n ++rangePos;\n if (rangePos === set.length) {\n // There is no next. Stop searching.\n advance(resolve);\n return false;\n }\n }\n if (keyWithinCurrentRange(key)) {\n // The current cursor value should be included and we should continue a single step in case next item has the same key or possibly our next key in set.\n return true;\n } else if (this._cmp(key, set[rangePos][1]) === 0 || this._cmp(key, set[rangePos][0]) === 0) {\n // includeUpper or includeLower is false so keyWithinCurrentRange() returns false even though we are at range border.\n // Continue to next key but don't include this one.\n return false;\n } else {\n // cursor.key not yet at set[i]. Forward cursor to the next key to hunt for.\n advance(() => {\n if (sortDirection === ascending) cursor.continue(set[rangePos][0]);\n else cursor.continue(set[rangePos][1]);\n });\n return false;\n }\n });\n return c;\n }\n\n /** WhereClause.startsWithAnyOf()\n * \n * https://dexie.org/docs/WhereClause/WhereClause.startsWithAnyOf()\n * \n **/\n startsWithAnyOf(...prefixes: string[]): Collection;\n startsWithAnyOf(prefixes: string[]): Collection;\n startsWithAnyOf() {\n const set = getArrayOf.apply(NO_CHAR_ARRAY, arguments);\n\n if (!set.every(s => typeof s === 'string')) {\n return fail(this, \"startsWithAnyOf() only works with strings\");\n }\n if (set.length === 0) return emptyCollection(this);\n\n return this.inAnyRange(set.map((str: string) => [str, str + maxString]));\n }\n\n}\n","import { wrap } from \"../helpers/promise\";\n\nexport function eventRejectHandler(reject) {\n return wrap(function (event) {\n preventDefault(event);\n reject (event.target.error);\n return false;\n });\n}\n\nexport function eventSuccessHandler (resolve) {\n return wrap(function (event){\n resolve(event.target.result);\n });\n}\n\nexport function hookedEventRejectHandler (reject) {\n return wrap(function (event) {\n // See comment on hookedEventSuccessHandler() why wrap() is needed only when supporting hooks.\n \n var req = event.target,\n err = req.error,\n ctx = req._hookCtx,// Contains the hook error handler. Put here instead of closure to boost performance.\n hookErrorHandler = ctx && ctx.onerror;\n hookErrorHandler && hookErrorHandler(err);\n preventDefault(event);\n reject (err);\n return false;\n });\n}\n\nexport function hookedEventSuccessHandler(resolve) {\n // wrap() is needed when calling hooks because the rare scenario of:\n // * hook does a db operation that fails immediately (IDB throws exception)\n // For calling db operations on correct transaction, wrap makes sure to set PSD correctly.\n // wrap() will also execute in a virtual tick.\n // * If not wrapped in a virtual tick, direct exception will launch a new physical tick.\n // * If this was the last event in the bulk, the promise will resolve after a physical tick\n // and the transaction will have committed already.\n // If no hook, the virtual tick will be executed in the reject()/resolve of the final promise,\n // because it is always marked with _lib = true when created using Transaction._promise().\n return wrap(function(event) {\n var req = event.target,\n ctx = req._hookCtx,// Contains the hook error handler. Put here instead of closure to boost performance.\n result = ctx.value || req.result, // Pass the object value on updates. The result from IDB is the primary key.\n hookSuccessHandler = ctx && ctx.onsuccess;\n hookSuccessHandler && hookSuccessHandler(result);\n resolve && resolve(result);\n }, resolve);\n}\n\n\nexport function preventDefault(event) {\n if (event.stopPropagation) // IndexedDBShim doesnt support this on Safari 8 and below.\n event.stopPropagation();\n if (event.preventDefault) // IndexedDBShim doesnt support this on Safari 8 and below.\n event.preventDefault();\n}\n\nexport function BulkErrorHandlerCatchAll(errorList, done?, supportHooks?) {\n return (supportHooks ? hookedEventRejectHandler : eventRejectHandler)(e => {\n errorList.push(e);\n done && done();\n });\n}\n\n","import Events from '../helpers/Events';\nimport { GlobalDexieEvents } from '../public/types/db-events';\n\nexport const DEXIE_STORAGE_MUTATED_EVENT_NAME = 'storagemutated' as 'storagemutated';\n\n// Name of the global event fired using DOM dispatchEvent (if not in node).\n// Reason for propagating this as a DOM event is for getting reactivity across\n// multiple versions of Dexie within the same app (as long as they are\n// compatible with regards to the event data).\n// If the ObservabilitySet protocol change in a way that would not be backward\n// compatible, make sure also update the event name to a new number at the end\n// so that two Dexie instances of different versions continue to work together\n// - maybe not able to communicate but won't fail due to unexpected data in\n// the detail property of the CustomEvent. If so, also make sure to udpate\n// docs and explain at which Dexie version the new name and format of the event\n// is being used.\nexport const STORAGE_MUTATED_DOM_EVENT_NAME = 'x-storagemutated-1';\n\nexport const globalEvents = Events(null, DEXIE_STORAGE_MUTATED_EVENT_NAME) as GlobalDexieEvents;\n","import { Transaction as ITransaction } from '../../public/types/transaction';\nimport { DexiePromise, wrap, rejection } from \"../../helpers/promise\";\nimport { DbSchema } from '../../public/types/db-schema';\nimport { assert, hasOwn } from '../../functions/utils';\nimport { PSD, usePSD } from '../../helpers/promise';\nimport { Dexie } from '../dexie';\nimport { exceptions } from '../../errors';\nimport { safariMultiStoreFix } from '../../functions/quirks';\nimport { preventDefault } from '../../functions/event-wrappers';\nimport { newScope } from '../../helpers/promise';\nimport * as Debug from '../../helpers/debug';\nimport { Table } from '../table';\nimport { globalEvents } from '../../globals/global-events';\n\n/** Transaction\n * \n * https://dexie.org/docs/Transaction/Transaction\n * \n **/\nexport class Transaction implements ITransaction {\n db: Dexie;\n active: boolean;\n mode: IDBTransactionMode;\n chromeTransactionDurability: ChromeTransactionDurability;\n idbtrans: IDBTransaction;\n storeNames: string[];\n on: any;\n parent?: Transaction;\n schema: DbSchema;\n _memoizedTables: {[tableName: string]: Table};\n\n _reculock: number;\n _blockedFuncs: { 0: () => any, 1: any }[];\n _resolve: () => void;\n _reject: (Error) => void;\n _waitingFor: DexiePromise; // for waitFor()\n _waitingQueue: Function[]; // for waitFor()\n _spinCount: number; // Just for debugging waitFor()\n _completion: DexiePromise;\n\n //\n // Transaction internal methods (not required by API users, but needed internally and eventually by dexie extensions)\n //\n\n /** Transaction._lock()\n * \n * Internal method.\n */\n _lock() {\n assert(!PSD.global); // Locking and unlocking reuires to be within a PSD scope.\n // Temporary set all requests into a pending queue if they are called before database is ready.\n ++this._reculock; // Recursive read/write lock pattern using PSD (Promise Specific Data) instead of TLS (Thread Local Storage)\n if (this._reculock === 1 && !PSD.global) PSD.lockOwnerFor = this;\n return this;\n }\n\n /** Transaction._unlock()\n * \n * Internal method.\n */\n _unlock() {\n assert(!PSD.global); // Locking and unlocking reuires to be within a PSD scope.\n if (--this._reculock === 0) {\n if (!PSD.global) PSD.lockOwnerFor = null;\n while (this._blockedFuncs.length > 0 && !this._locked()) {\n var fnAndPSD = this._blockedFuncs.shift();\n try { usePSD(fnAndPSD[1], fnAndPSD[0]); } catch (e) { }\n }\n }\n return this;\n }\n\n /** Transaction._lock()\n * \n * Internal method.\n */\n _locked() {\n // Checks if any write-lock is applied on this transaction.\n // To simplify the Dexie API for extension implementations, we support recursive locks.\n // This is accomplished by using \"Promise Specific Data\" (PSD).\n // PSD data is bound to a Promise and any child Promise emitted through then() or resolve( new Promise() ).\n // PSD is local to code executing on top of the call stacks of any of any code executed by Promise():\n // * callback given to the Promise() constructor (function (resolve, reject){...})\n // * callbacks given to then()/catch()/finally() methods (function (value){...})\n // If creating a new independant Promise instance from within a Promise call stack, the new Promise will derive the PSD from the call stack of the parent Promise.\n // Derivation is done so that the inner PSD __proto__ points to the outer PSD.\n // PSD.lockOwnerFor will point to current transaction object if the currently executing PSD scope owns the lock.\n return this._reculock && PSD.lockOwnerFor !== this;\n }\n\n /** Transaction.create()\n * \n * Internal method.\n * \n */\n create(idbtrans?: IDBTransaction) {\n if (!this.mode) return this;\n const idbdb = this.db.idbdb;\n const dbOpenError = this.db._state.dbOpenError;\n assert(!this.idbtrans);\n if (!idbtrans && !idbdb) {\n switch (dbOpenError && dbOpenError.name) {\n case \"DatabaseClosedError\":\n // Errors where it is no difference whether it was caused by the user operation or an earlier call to db.open()\n throw new exceptions.DatabaseClosed(dbOpenError);\n case \"MissingAPIError\":\n // Errors where it is no difference whether it was caused by the user operation or an earlier call to db.open()\n throw new exceptions.MissingAPI(dbOpenError.message, dbOpenError);\n default:\n // Make it clear that the user operation was not what caused the error - the error had occurred earlier on db.open()!\n throw new exceptions.OpenFailed(dbOpenError);\n }\n }\n if (!this.active) throw new exceptions.TransactionInactive();\n assert(this._completion._state === null); // Completion Promise must still be pending.\n\n idbtrans = this.idbtrans = idbtrans ||\n (this.db.core \n ? this.db.core.transaction(this.storeNames, this.mode as 'readwrite' | 'readonly', { durability: this.chromeTransactionDurability })\n : idbdb.transaction(this.storeNames, this.mode, { durability: this.chromeTransactionDurability })\n ) as IDBTransaction;\n\n idbtrans.onerror = wrap(ev => {\n preventDefault(ev);// Prohibit default bubbling to window.error\n this._reject(idbtrans.error);\n });\n idbtrans.onabort = wrap(ev => {\n preventDefault(ev);\n this.active && this._reject(new exceptions.Abort(idbtrans.error));\n this.active = false;\n this.on(\"abort\").fire(ev);\n });\n idbtrans.oncomplete = wrap(() => {\n this.active = false;\n this._resolve();\n if ('mutatedParts' in idbtrans) {\n globalEvents.storagemutated.fire(idbtrans[\"mutatedParts\"]);\n }\n });\n return this;\n }\n\n /** Transaction._promise()\n * \n * Internal method.\n */\n _promise(\n mode: IDBTransactionMode,\n fn: (resolve, reject, trans: Transaction) => PromiseLike | void,\n bWriteLock?: string | boolean): DexiePromise\n {\n if (mode === 'readwrite' && this.mode !== 'readwrite')\n return rejection(new exceptions.ReadOnly(\"Transaction is readonly\"));\n\n if (!this.active)\n return rejection(new exceptions.TransactionInactive());\n\n if (this._locked()) {\n return new DexiePromise((resolve, reject) => {\n this._blockedFuncs.push([() => {\n this._promise(mode, fn, bWriteLock).then(resolve, reject);\n }, PSD]);\n });\n\n } else if (bWriteLock) {\n return newScope(() => {\n var p = new DexiePromise((resolve, reject) => {\n this._lock();\n const rv = fn(resolve, reject, this);\n if (rv && rv.then) rv.then(resolve, reject);\n });\n p.finally(() => this._unlock());\n p._lib = true;\n return p;\n });\n\n } else {\n var p = new DexiePromise((resolve, reject) => {\n var rv = fn(resolve, reject, this);\n if (rv && rv.then) rv.then(resolve, reject);\n });\n p._lib = true;\n return p;\n }\n }\n\n /** Transaction._root()\n * \n * Internal method. Retrieves the root transaction in the tree of sub transactions.\n */\n _root() {\n return this.parent ? this.parent._root() : this;\n }\n\n /** Transaction.waitFor()\n * \n * Internal method. Can be accessed from the public API through\n * Dexie.waitFor(): https://dexie.org/docs/Dexie/Dexie.waitFor()\n * \n **/\n waitFor(promiseLike: PromiseLike) {\n // Always operate on the root transaction (in case this is a sub stransaction)\n var root = this._root();\n // For stability reasons, convert parameter to promise no matter what type is passed to waitFor().\n // (We must be able to call .then() on it.)\n const promise = DexiePromise.resolve(promiseLike);\n if (root._waitingFor) {\n // Already called waitFor(). Wait for both to complete.\n root._waitingFor = root._waitingFor.then(() => promise);\n } else {\n // We're not in waiting state. Start waiting state.\n root._waitingFor = promise;\n root._waitingQueue = [];\n // Start interacting with indexedDB until promise completes:\n var store = root.idbtrans.objectStore(root.storeNames[0]);\n (function spin() {\n ++root._spinCount; // For debugging only\n while (root._waitingQueue.length) (root._waitingQueue.shift())();\n if (root._waitingFor) store.get(-Infinity).onsuccess = spin;\n }());\n }\n var currentWaitPromise = root._waitingFor;\n return new DexiePromise((resolve, reject) => {\n promise.then(\n res => root._waitingQueue.push(wrap(resolve.bind(null, res))),\n err => root._waitingQueue.push(wrap(reject.bind(null, err)))\n ).finally(() => {\n if (root._waitingFor === currentWaitPromise) {\n // No one added a wait after us. Safe to stop the spinning.\n root._waitingFor = null;\n }\n });\n });\n } \n\n /** Transaction.abort()\n * \n * https://dexie.org/docs/Transaction/Transaction.abort()\n */\n abort() {\n if (this.active) {\n this.active = false;\n if (this.idbtrans) this.idbtrans.abort();\n this._reject(new exceptions.Abort());\n }\n }\n\n /** Transaction.table()\n * \n * https://dexie.org/docs/Transaction/Transaction.table()\n */\n table(tableName: string) {\n const memoizedTables = (this._memoizedTables || (this._memoizedTables = {}));\n if (hasOwn(memoizedTables, tableName))\n return memoizedTables[tableName];\n const tableSchema = this.schema[tableName];\n if (!tableSchema) {\n throw new exceptions.NotFound(\"Table \" + tableName + \" not part of transaction\"); \n }\n\n const transactionBoundTable = new this.db.Table(tableName, tableSchema, this);\n transactionBoundTable.core = this.db.core.table(tableName);\n memoizedTables[tableName] = transactionBoundTable;\n return transactionBoundTable;\n }\n}\n","import { IndexSpec } from '../public/types/index-spec';\n\nexport function createIndexSpec(\n name: string,\n keyPath: string | string[],\n unique: boolean,\n multi: boolean,\n auto: boolean,\n compound: boolean,\n isPrimKey: boolean\n): IndexSpec {\n return {\n name,\n keyPath,\n unique,\n multi,\n auto,\n compound,\n src: (unique && !isPrimKey ? '&' : '') + (multi ? '*' : '') + (auto ? \"++\" : \"\") + nameFromKeyPath(keyPath)\n }\n}\n\nexport function nameFromKeyPath (keyPath?: string | string[]): string {\n return typeof keyPath === 'string' ?\n keyPath :\n keyPath ? ('[' + [].join.call(keyPath, '+') + ']') : \"\";\n}\n","import { IndexSpec } from '../public/types/index-spec';\nimport { TableSchema } from '../public/types/table-schema';\nimport { createIndexSpec } from './index-spec';\nimport { arrayToObject } from '../functions/utils';\n\nexport function createTableSchema (\n name: string,\n primKey: IndexSpec,\n indexes: IndexSpec[]\n): TableSchema {\n return {\n name,\n primKey,\n indexes,\n mappedClass: null,\n idxByName: arrayToObject(indexes, index => [index.name, index])\n };\n}\n","import { maxString } from '../globals/constants';\n\nexport function safariMultiStoreFix(storeNames: string[]) {\n return storeNames.length === 1 ? storeNames[0] : storeNames;\n}\n\nexport function getNativeGetDatabaseNamesFn(indexedDB) {\n var fn = indexedDB && (indexedDB.getDatabaseNames || indexedDB.webkitGetDatabaseNames);\n return fn && fn.bind(indexedDB);\n}\n\nexport let getMaxKey = (IdbKeyRange: typeof IDBKeyRange) => {\n try {\n IdbKeyRange.only([[]]);\n getMaxKey = () => [[]];\n return [[]];\n } catch (e) {\n getMaxKey = () => maxString;\n return maxString;\n }\n}\n","import { getByKeyPath } from '../functions/utils';\n\nexport function getKeyExtractor (keyPath: null | string | string[]) : (a: any) => any {\n if (keyPath == null) {\n return () => undefined;\n } else if (typeof keyPath === 'string') {\n return getSinglePathKeyExtractor(keyPath);\n } else {\n return obj => getByKeyPath(obj, keyPath);\n }\n}\n\nexport function getSinglePathKeyExtractor(keyPath: string) {\n const split = keyPath.split('.');\n if (split.length === 1) {\n return obj => obj[keyPath];\n } else {\n return obj => getByKeyPath(obj, keyPath);\n }\n}\n","import {\n DBCore,\n DBCoreCursor,\n DBCoreOpenCursorRequest,\n DBCoreQueryRequest,\n DBCoreIndex,\n DBCoreKeyRange,\n DBCoreQueryResponse,\n DBCoreRangeType,\n DBCoreSchema,\n DBCoreTableSchema,\n DBCoreTable,\n DBCoreMutateResponse,\n} from \"../public/types/dbcore\";\nimport { isArray } from '../functions/utils';\nimport { eventRejectHandler, preventDefault } from '../functions/event-wrappers';\nimport { wrap } from '../helpers/promise';\nimport { getMaxKey } from '../functions/quirks';\nimport { getKeyExtractor } from './get-key-extractor';\n\nexport function arrayify(arrayLike: {length: number, [index: number]: T}): T[] {\n return [].slice.call(arrayLike);\n}\nexport function pick(obj: T, props: Prop[]): Pick {\n const result = {} as Pick;\n props.forEach(prop => result[prop] = obj[prop]);\n return result;\n}\n\nlet _id_counter = 0;\n\nexport function getKeyPathAlias(keyPath: null | string | string[]) {\n return keyPath == null ?\n \":id\" :\n typeof keyPath === 'string' ?\n keyPath :\n `[${keyPath.join('+')}]`;\n}\n\nexport function createDBCore (\n db: IDBDatabase,\n IdbKeyRange: typeof IDBKeyRange,\n tmpTrans: IDBTransaction) : DBCore\n{\n function extractSchema(db: IDBDatabase, trans: IDBTransaction) : {schema: DBCoreSchema, hasGetAll: boolean} {\n const tables = arrayify(db.objectStoreNames);\n return {\n schema: {\n name: db.name,\n tables: tables.map(table => trans.objectStore(table)).map(store => {\n const {keyPath, autoIncrement} = store;\n const compound = isArray(keyPath);\n const outbound = keyPath == null;\n const indexByKeyPath: {[keyPathAlias: string]: DBCoreIndex} = {};\n const result = {\n name: store.name,\n primaryKey: {\n name: null,\n isPrimaryKey: true,\n outbound,\n compound,\n keyPath,\n autoIncrement,\n unique: true,\n extractKey: getKeyExtractor(keyPath)\n } as DBCoreIndex,\n indexes: arrayify(store.indexNames).map(indexName => store.index(indexName))\n .map(index => {\n const {name, unique, multiEntry, keyPath} = index;\n const compound = isArray(keyPath);\n const result: DBCoreIndex = {\n name,\n compound,\n keyPath,\n unique,\n multiEntry,\n extractKey: getKeyExtractor(keyPath)\n };\n indexByKeyPath[getKeyPathAlias(keyPath)] = result;\n return result;\n }),\n getIndexByKeyPath: (keyPath: null | string | string[]) => indexByKeyPath[getKeyPathAlias(keyPath)]\n };\n indexByKeyPath[\":id\"] = result.primaryKey;\n if (keyPath != null) {\n indexByKeyPath[getKeyPathAlias(keyPath)] = result.primaryKey;\n }\n return result;\n })\n },\n hasGetAll: tables.length > 0 && ('getAll' in trans.objectStore(tables[0])) &&\n !(typeof navigator !== 'undefined' && /Safari/.test(navigator.userAgent) &&\n !/(Chrome\\/|Edge\\/)/.test(navigator.userAgent) &&\n [].concat(navigator.userAgent.match(/Safari\\/(\\d*)/))[1] < 604) // Bug with getAll() on Safari ver<604. See discussion following PR #579\n };\n }\n\n function makeIDBKeyRange (range: DBCoreKeyRange) : IDBKeyRange | null {\n if (range.type === DBCoreRangeType.Any) return null;\n if (range.type === DBCoreRangeType.Never) throw new Error(\"Cannot convert never type to IDBKeyRange\");\n const {lower, upper, lowerOpen, upperOpen} = range;\n const idbRange = lower === undefined ?\n upper === undefined ?\n null : //IDBKeyRange.lowerBound(-Infinity, false) : // Any range (TODO: Should we return null instead?)\n IdbKeyRange.upperBound(upper, !!upperOpen) : // below\n upper === undefined ?\n IdbKeyRange.lowerBound(lower, !!lowerOpen) : // above\n IdbKeyRange.bound(lower, upper, !!lowerOpen, !!upperOpen);\n return idbRange;\n }\n\n function createDbCoreTable(tableSchema: DBCoreTableSchema): DBCoreTable {\n const tableName = tableSchema.name;\n\n function mutate ({trans, type, keys, values, range}) {\n return new Promise((resolve, reject) => {\n resolve = wrap(resolve);\n const store = (trans as IDBTransaction).objectStore(tableName);\n const outbound = store.keyPath == null;\n const isAddOrPut = type === \"put\" || type === \"add\";\n if (!isAddOrPut && type !== 'delete' && type !== 'deleteRange')\n throw new Error (\"Invalid operation type: \" + type);\n\n const {length} = keys || values || {length: 1}; // keys.length if keys. values.length if values. 1 if range.\n if (keys && values && keys.length !== values.length) {\n throw new Error(\"Given keys array must have same length as given values array.\");\n }\n if (length === 0)\n // No items to write. Don't even bother!\n return resolve({numFailures: 0, failures: {}, results: [], lastResult: undefined});\n\n let req: IDBRequest;\n const reqs: IDBRequest[] = [];\n \n const failures: {[operationNumber: number]: Error} = [];\n let numFailures = 0;\n const errorHandler = \n event => {\n ++numFailures;\n preventDefault(event);\n };\n \n if (type === 'deleteRange') {\n // Here the argument is the range\n if (range.type === DBCoreRangeType.Never)\n return resolve({numFailures, failures, results: [], lastResult: undefined}); // Deleting the Never range shoulnt do anything.\n if (range.type === DBCoreRangeType.Any)\n reqs.push(req = store.clear()); // Deleting the Any range is equivalent to store.clear()\n else\n reqs.push(req = store.delete(makeIDBKeyRange(range)));\n } else {\n // No matter add, put or delete - find out arrays of first and second arguments to it.\n const [args1, args2] = isAddOrPut ?\n outbound ?\n [values, keys] :\n [values, null] :\n [keys, null];\n\n if (isAddOrPut) {\n for (let i=0; i {\n const lastResult = event.target.result;\n reqs.forEach((req, i) => req.error != null && (failures[i] = req.error));\n resolve({\n numFailures,\n failures,\n results: type === \"delete\" ? keys : reqs.map(req => req.result),\n lastResult\n });\n };\n \n req.onerror = event => { // wrap() not needed. All paths calling outside will wrap!\n errorHandler(event);\n done(event);\n };\n \n req.onsuccess = done;\n });\n }\n \n function openCursor ({trans, values, query, reverse, unique}: DBCoreOpenCursorRequest): Promise\n {\n return new Promise((resolve, reject) => {\n resolve = wrap(resolve);\n const {index, range} = query;\n const store = (trans as IDBTransaction).objectStore(tableName);\n // source\n const source = index.isPrimaryKey ?\n store :\n store.index(index.name);\n // direction\n const direction = reverse ?\n unique ?\n \"prevunique\" :\n \"prev\" :\n unique ?\n \"nextunique\" :\n \"next\";\n // request\n const req = values || !('openKeyCursor' in source) ?\n source.openCursor(makeIDBKeyRange(range), direction) :\n source.openKeyCursor(makeIDBKeyRange(range), direction);\n \n // iteration\n req.onerror = eventRejectHandler(reject);\n req.onsuccess = wrap(ev => {\n\n const cursor = req.result as unknown as DBCoreCursor;\n if (!cursor) {\n resolve(null);\n return;\n }\n (cursor as any).___id = ++_id_counter;\n (cursor as any).done = false;\n const _cursorContinue = cursor.continue.bind(cursor);\n let _cursorContinuePrimaryKey = cursor.continuePrimaryKey;\n if (_cursorContinuePrimaryKey) _cursorContinuePrimaryKey = _cursorContinuePrimaryKey.bind(cursor);\n const _cursorAdvance = cursor.advance.bind(cursor);\n const doThrowCursorIsNotStarted = ()=>{throw new Error(\"Cursor not started\");}\n const doThrowCursorIsStopped = ()=>{throw new Error(\"Cursor not stopped\");}\n (cursor as any).trans = trans;\n cursor.stop = cursor.continue = cursor.continuePrimaryKey = cursor.advance = doThrowCursorIsNotStarted;\n cursor.fail = wrap(reject);\n cursor.next = function (this: DBCoreCursor) {\n // next() must work with \"this\" pointer in order to function correctly for ProxyCursors (derived objects)\n // without having to re-define next() on each child.\n let gotOne = 1;\n return this.start(() => gotOne-- ? this.continue() : this.stop()).then(() => this);\n };\n cursor.start = (callback) => {\n //console.log(\"Starting cursor\", (cursor as any).___id);\n const iterationPromise = new Promise((resolveIteration, rejectIteration) =>{\n resolveIteration = wrap(resolveIteration);\n req.onerror = eventRejectHandler(rejectIteration);\n cursor.fail = rejectIteration;\n cursor.stop = value => {\n //console.log(\"Cursor stop\", cursor);\n cursor.stop = cursor.continue = cursor.continuePrimaryKey = cursor.advance = doThrowCursorIsStopped;\n resolveIteration(value);\n };\n });\n // Now change req.onsuccess to a callback that doesn't call initCursor but just observer.next()\n const guardedCallback = () => {\n if (req.result) {\n //console.log(\"Next result\", cursor);\n try {\n callback();\n } catch (err) {\n cursor.fail(err);\n }\n } else {\n (cursor as any).done = true;\n cursor.start = ()=>{throw new Error(\"Cursor behind last entry\");}\n cursor.stop();\n }\n }\n req.onsuccess = wrap(ev => {\n //cursor.continue = _cursorContinue;\n //cursor.continuePrimaryKey = _cursorContinuePrimaryKey;\n //cursor.advance = _cursorAdvance;\n req.onsuccess = guardedCallback;\n guardedCallback();\n });\n cursor.continue = _cursorContinue;\n cursor.continuePrimaryKey = _cursorContinuePrimaryKey;\n cursor.advance = _cursorAdvance;\n guardedCallback();\n return iterationPromise;\n };\n resolve(cursor);\n }, reject); \n });\n }\n \n function query (hasGetAll: boolean) {\n return (request: DBCoreQueryRequest) => {\n return new Promise((resolve, reject) => {\n resolve = wrap(resolve);\n const {trans, values, limit, query} = request;\n const nonInfinitLimit = limit === Infinity ? undefined : limit;\n const {index, range} = query;\n const store = (trans as IDBTransaction).objectStore(tableName);\n const source = index.isPrimaryKey ? store : store.index(index.name);\n const idbKeyRange = makeIDBKeyRange(range);\n if (limit === 0) return resolve({result: []});\n if (hasGetAll) {\n const req = values ?\n (source as any).getAll(idbKeyRange, nonInfinitLimit) :\n (source as any).getAllKeys(idbKeyRange, nonInfinitLimit);\n req.onsuccess = event => resolve({result: event.target.result});\n req.onerror = eventRejectHandler(reject);\n } else {\n let count = 0;\n const req = values || !('openKeyCursor' in source) ?\n source.openCursor(idbKeyRange) :\n source.openKeyCursor(idbKeyRange)\n const result = [];\n req.onsuccess = event => {\n const cursor = req.result as IDBCursorWithValue;\n if (!cursor) return resolve({result});\n result.push(values ? cursor.value : cursor.primaryKey);\n if (++count === limit) return resolve({result});\n cursor.continue();\n };\n req.onerror = eventRejectHandler(reject);\n }\n });\n };\n }\n \n return {\n name: tableName,\n schema: tableSchema,\n \n mutate,\n\n getMany ({trans, keys}) {\n return new Promise((resolve, reject) => {\n resolve = wrap(resolve);\n const store = (trans as IDBTransaction).objectStore(tableName);\n const length = keys.length;\n const result = new Array(length);\n let keyCount = 0;\n let callbackCount = 0;\n let valueCount = 0;\n let req: IDBRequest & {_pos?: number};\n \n const successHandler = event => {\n const req = event.target;\n if ((result[req._pos] = req.result) != null) ++valueCount;\n if (++callbackCount === keyCount) resolve(result);\n };\n const errorHandler = eventRejectHandler(reject);\n \n for (let i=0; i((resolve, reject) => {\n resolve = wrap (resolve);\n const store = (trans as IDBTransaction).objectStore(tableName);\n const req = store.get(key);\n req.onsuccess = event => resolve((event.target as any).result);\n req.onerror = eventRejectHandler(reject);\n });\n },\n\n query: query(hasGetAll),\n \n openCursor,\n\n count ({query, trans}) {\n const {index, range} = query;\n return new Promise((resolve, reject) => {\n const store = (trans as IDBTransaction).objectStore(tableName);\n const source = index.isPrimaryKey ? store : store.index(index.name);\n const idbKeyRange = makeIDBKeyRange(range);\n const req = idbKeyRange ? source.count(idbKeyRange) : source.count();\n req.onsuccess = wrap(ev => resolve((ev.target as IDBRequest).result));\n req.onerror = eventRejectHandler(reject);\n });\n }\n };\n }\n\n const {schema, hasGetAll} = extractSchema(db, tmpTrans);\n const tables = schema.tables.map(tableSchema => createDbCoreTable(tableSchema));\n const tableMap: {[name: string]: DBCoreTable} = {};\n tables.forEach(table => tableMap[table.name] = table);\n return {\n stack: \"dbcore\",\n \n transaction: db.transaction.bind(db),\n\n table(name: string) {\n const result = tableMap[name];\n if (!result) throw new Error(`Table '${name}' not found`);\n return tableMap[name];\n },\n\n MIN_KEY: -Infinity,\n\n MAX_KEY: getMaxKey(IdbKeyRange),\n\n schema\n\n };\n}\n","import { Dexie } from './';\nimport { createDBCore } from '../../dbcore/dbcore-indexeddb';\nimport { DBCore } from '../../public/types/dbcore';\nimport { DexieDOMDependencies } from '../../public/types/dexie-dom-dependencies';\nimport { DexieStacks, Middleware } from '../../public/types/middleware';\nimport { exceptions } from '../../errors';\n\nfunction createMiddlewareStack(\n stackImpl: {stack: string},\n middlewares: Middleware<{stack: string}>[]): TStack {\n return middlewares.reduce((down, {create}) => ({...down, ...create(down)}), stackImpl) as TStack;\n} \n\nfunction createMiddlewareStacks(\n middlewares: {[StackName in keyof DexieStacks]?: Middleware[]},\n idbdb: IDBDatabase,\n {IDBKeyRange, indexedDB}: DexieDOMDependencies,\n tmpTrans: IDBTransaction): {[StackName in keyof DexieStacks]?: DexieStacks[StackName]}\n{\n const dbcore = createMiddlewareStack(\n createDBCore(idbdb, IDBKeyRange, tmpTrans),\n middlewares.dbcore);\n \n // TODO: Create other stacks the same way as above. They might be dependant on the result\n // of creating dbcore stack.\n\n return {\n dbcore\n };\n}\n\nexport function generateMiddlewareStacks({_novip: db}: Dexie, tmpTrans: IDBTransaction) {\n const idbdb = tmpTrans.db;\n const stacks = createMiddlewareStacks(db._middlewares, idbdb, db._deps, tmpTrans);\n db.core = stacks.dbcore!;\n db.tables.forEach(table => {\n const tableName = table.name;\n if (db.core.schema.tables.some(tbl => tbl.name === tableName)) {\n table.core = db.core.table(tableName);\n if (db[tableName] instanceof db.Table) {\n db[tableName].core = table.core;\n }\n }\n });\n}\n","import { Dexie } from '../dexie';\nimport { DbSchema } from '../../public/types/db-schema';\nimport { _global } from \"../../globals/global\";\nimport { setProp, keys, slice, isArray, shallowClone, isAsyncFunction, defineProperty, getPropertyDescriptor } from '../../functions/utils';\nimport { Transaction } from '../transaction';\nimport { Version } from './version';\nimport Promise, { PSD, newScope, NativePromise, decrementExpectedAwaits, incrementExpectedAwaits } from '../../helpers/promise';\nimport { exceptions } from '../../errors';\nimport { TableSchema } from '../../public/types/table-schema';\nimport { IndexSpec } from '../../public/types/index-spec';\nimport { hasIEDeleteObjectStoreBug, isIEOrEdge } from '../../globals/constants';\nimport { safariMultiStoreFix } from '../../functions/quirks';\nimport { createIndexSpec, nameFromKeyPath } from '../../helpers/index-spec';\nimport { createTableSchema } from '../../helpers/table-schema';\nimport { generateMiddlewareStacks } from '../dexie/generate-middleware-stacks';\n\nexport function setApiOnPlace({_novip: db}: Dexie, objs: Object[], tableNames: string[], dbschema: DbSchema) {\n tableNames.forEach(tableName => {\n const schema = dbschema[tableName];\n objs.forEach(obj => {\n const propDesc = getPropertyDescriptor(obj, tableName);\n if (!propDesc || (\"value\" in propDesc && propDesc.value === undefined)) {\n // Either the prop is not declared, or it is initialized to undefined.\n if (obj === db.Transaction.prototype || obj instanceof db.Transaction) {\n // obj is a Transaction prototype (or prototype of a subclass to Transaction)\n // Make the API a getter that returns this.table(tableName)\n setProp(obj, tableName, {\n get(this: Transaction) { return this.table(tableName); },\n set(value: any) {\n // Issue #1039\n // Let \"this.schema = dbschema;\" and other props in transaction constructor work even if there's a name collision with the table name.\n defineProperty(this, tableName, {value, writable: true, configurable: true, enumerable: true});\n }\n });\n } else {\n // Table will not be bound to a transaction (will use Dexie.currentTransaction)\n obj[tableName] = new db.Table(tableName, schema);\n }\n }\n });\n });\n}\n\nexport function removeTablesApi({_novip: db}: Dexie, objs: Object[]) {\n objs.forEach(obj => {\n for (let key in obj) {\n if (obj[key] instanceof db.Table) delete obj[key];\n }\n });\n}\n\nexport function lowerVersionFirst(a: Version, b: Version) {\n return a._cfg.version - b._cfg.version;\n}\n\nexport function runUpgraders(db: Dexie, oldVersion: number, idbUpgradeTrans: IDBTransaction, reject) {\n const globalSchema = db._dbSchema;\n const trans = db._createTransaction('readwrite', db._storeNames, globalSchema);\n trans.create(idbUpgradeTrans);\n trans._completion.catch(reject);\n const rejectTransaction = trans._reject.bind(trans);\n const transless = PSD.transless || PSD;\n newScope(() => {\n PSD.trans = trans;\n PSD.transless = transless;\n if (oldVersion === 0) {\n // Create tables:\n keys(globalSchema).forEach(tableName => {\n createTable(idbUpgradeTrans, tableName, globalSchema[tableName].primKey, globalSchema[tableName].indexes);\n });\n generateMiddlewareStacks(db, idbUpgradeTrans);\n Promise.follow(() => db.on.populate.fire(trans)).catch(rejectTransaction);\n } else\n updateTablesAndIndexes(db, oldVersion, trans, idbUpgradeTrans).catch(rejectTransaction);\n });\n}\n\nexport type UpgradeQueueItem = (idbtrans: IDBTransaction) => PromiseLike | void;\n\nexport function updateTablesAndIndexes(\n {_novip: db}: Dexie,\n oldVersion: number,\n trans: Transaction,\n idbUpgradeTrans: IDBTransaction)\n{\n // Upgrade version to version, step-by-step from oldest to newest version.\n // Each transaction object will contain the table set that was current in that version (but also not-yet-deleted tables from its previous version)\n const queue: UpgradeQueueItem[] = [];\n const versions = db._versions;\n let globalSchema = db._dbSchema = buildGlobalSchema(db, db.idbdb, idbUpgradeTrans);\n let anyContentUpgraderHasRun = false;\n\n const versToRun = versions.filter(v => v._cfg.version >= oldVersion);\n versToRun.forEach(version => {\n queue.push(() => {\n const oldSchema = globalSchema;\n const newSchema = version._cfg.dbschema;\n adjustToExistingIndexNames(db, oldSchema, idbUpgradeTrans);\n adjustToExistingIndexNames(db, newSchema, idbUpgradeTrans);\n\n globalSchema = db._dbSchema = newSchema;\n\n const diff = getSchemaDiff(oldSchema, newSchema);\n // Add tables \n diff.add.forEach(tuple => {\n createTable(idbUpgradeTrans, tuple[0], tuple[1].primKey, tuple[1].indexes);\n });\n // Change tables\n diff.change.forEach(change => {\n if (change.recreate) {\n throw new exceptions.Upgrade(\"Not yet support for changing primary key\");\n } else {\n const store = idbUpgradeTrans.objectStore(change.name);\n // Add indexes\n change.add.forEach(idx => addIndex(store, idx));\n // Update indexes\n change.change.forEach(idx => {\n store.deleteIndex(idx.name);\n addIndex(store, idx);\n });\n // Delete indexes\n change.del.forEach(idxName => store.deleteIndex(idxName));\n }\n });\n\n const contentUpgrade = version._cfg.contentUpgrade;\n\n if (contentUpgrade && version._cfg.version > oldVersion) {\n // Update db.core with new tables and indexes:\n generateMiddlewareStacks(db, idbUpgradeTrans);\n trans._memoizedTables = {}; // Invalidate memoization as transaction shape may change between versions.\n\n anyContentUpgraderHasRun = true;\n\n // Add to-be-deleted tables to contentUpgrade transaction\n let upgradeSchema = shallowClone(newSchema);\n diff.del.forEach(table => {\n upgradeSchema[table] = oldSchema[table];\n });\n\n // Safe to affect Transaction.prototype globally in this moment,\n // because when this code runs, there may not be any other code\n // that can access any transaction instance, else than this particular\n // upgrader function.\n removeTablesApi(db, [db.Transaction.prototype]);\n setApiOnPlace(db, [db.Transaction.prototype], keys(upgradeSchema), upgradeSchema);\n trans.schema = upgradeSchema;\n\n // Support for native async await.\n const contentUpgradeIsAsync = isAsyncFunction(contentUpgrade);\n if (contentUpgradeIsAsync) {\n incrementExpectedAwaits();\n }\n \n let returnValue: any;\n const promiseFollowed = Promise.follow(() => {\n // Finally, call the scope function with our table and transaction arguments.\n returnValue = contentUpgrade(trans);\n if (returnValue) {\n if (contentUpgradeIsAsync) {\n // contentUpgrade is a native async function - we know for sure returnValue is native promise.\n var decrementor = decrementExpectedAwaits.bind(null, null);\n returnValue.then(decrementor, decrementor);\n }\n }\n });\n return (returnValue && typeof returnValue.then === 'function' ?\n Promise.resolve(returnValue) : promiseFollowed.then(()=>returnValue));\n }\n });\n queue.push(idbtrans => {\n if (!anyContentUpgraderHasRun || !hasIEDeleteObjectStoreBug) { // Dont delete old tables if ieBug is present and a content upgrader has run. Let tables be left in DB so far. This needs to be taken care of.\n const newSchema = version._cfg.dbschema;\n // Delete old tables\n deleteRemovedTables(newSchema, idbtrans);\n }\n // Restore the final API\n removeTablesApi(db, [db.Transaction.prototype]);\n setApiOnPlace(db, [db.Transaction.prototype], db._storeNames, db._dbSchema);\n trans.schema = db._dbSchema;\n });\n });\n\n // Now, create a queue execution engine\n function runQueue() {\n return queue.length ? Promise.resolve(queue.shift()(trans.idbtrans)).then(runQueue) :\n Promise.resolve();\n }\n\n return runQueue().then(() => {\n createMissingTables(globalSchema, idbUpgradeTrans); // At last, make sure to create any missing tables. (Needed by addons that add stores to DB without specifying version)\n });\n}\n\nexport interface SchemaDiff {\n del: string[],\n add: [string, TableSchema][];\n change: TableSchemaDiff[];\n}\n\nexport interface TableSchemaDiff {\n name: string,\n recreate: boolean,\n del: string[],\n add: IndexSpec[],\n change: IndexSpec[]\n}\n\nexport function getSchemaDiff(oldSchema: DbSchema, newSchema: DbSchema): SchemaDiff {\n const diff: SchemaDiff = {\n del: [], // Array of table names\n add: [], // Array of [tableName, newDefinition]\n change: [] // Array of {name: tableName, recreate: newDefinition, del: delIndexNames, add: newIndexDefs, change: changedIndexDefs}\n };\n let table: string;\n for (table in oldSchema) {\n if (!newSchema[table]) diff.del.push(table);\n }\n for (table in newSchema) {\n const oldDef = oldSchema[table],\n newDef = newSchema[table];\n if (!oldDef) {\n diff.add.push([table, newDef]);\n } else {\n const change = {\n name: table,\n def: newDef,\n recreate: false,\n del: [],\n add: [],\n change: []\n };\n if (\n (\n // compare keyPaths no matter if string or string[]\n // compare falsy keypaths same no matter if they are null or empty string.\n ''+(oldDef.primKey.keyPath||'')\n ) !== (\n ''+(newDef.primKey.keyPath||'')\n ) ||\n // Compare the autoIncrement flag also\n (oldDef.primKey.auto !== newDef.primKey.auto && !isIEOrEdge)) // IE has bug reading autoIncrement prop.\n {\n // Primary key has changed. Remove and re-add table.\n change.recreate = true;\n diff.change.push(change);\n } else {\n // Same primary key. Just find out what differs:\n const oldIndexes = oldDef.idxByName;\n const newIndexes = newDef.idxByName;\n let idxName: string;\n for (idxName in oldIndexes) {\n if (!newIndexes[idxName]) change.del.push(idxName);\n }\n for (idxName in newIndexes) {\n const oldIdx = oldIndexes[idxName],\n newIdx = newIndexes[idxName];\n if (!oldIdx) change.add.push(newIdx);\n else if (oldIdx.src !== newIdx.src) change.change.push(newIdx);\n }\n if (change.del.length > 0 || change.add.length > 0 || change.change.length > 0) {\n diff.change.push(change);\n }\n }\n }\n }\n return diff;\n}\n\nexport function createTable(\n idbtrans: IDBTransaction,\n tableName: string,\n primKey: IndexSpec,\n indexes: IndexSpec[]\n) {\n const store = idbtrans.db.createObjectStore(\n tableName,\n primKey.keyPath ?\n { keyPath: primKey.keyPath, autoIncrement: primKey.auto } :\n { autoIncrement: primKey.auto }\n );\n indexes.forEach(idx => addIndex(store, idx));\n return store;\n}\n\nexport function createMissingTables(newSchema: DbSchema, idbtrans: IDBTransaction) {\n keys(newSchema).forEach(tableName => {\n if (!idbtrans.db.objectStoreNames.contains(tableName)) {\n createTable(idbtrans, tableName, newSchema[tableName].primKey, newSchema[tableName].indexes);\n }\n });\n}\n\nexport function deleteRemovedTables(newSchema: DbSchema, idbtrans: IDBTransaction) {\n [].slice.call(idbtrans.db.objectStoreNames).forEach(storeName =>\n newSchema[storeName] == null && idbtrans.db.deleteObjectStore(storeName));\n}\n\nexport function addIndex(store: IDBObjectStore, idx: IndexSpec) {\n store.createIndex(idx.name, idx.keyPath, { unique: idx.unique, multiEntry: idx.multi });\n}\n\nfunction buildGlobalSchema(\n db: Dexie,\n idbdb: IDBDatabase,\n tmpTrans: IDBTransaction\n) {\n const globalSchema = {};\n const dbStoreNames = slice(idbdb.objectStoreNames, 0);\n dbStoreNames.forEach(storeName => {\n const store = tmpTrans.objectStore(storeName);\n let keyPath = store.keyPath;\n const primKey = createIndexSpec(\n nameFromKeyPath(keyPath),\n keyPath || \"\",\n false,\n false,\n !!store.autoIncrement,\n keyPath && typeof keyPath !== \"string\",\n true\n );\n const indexes: IndexSpec[] = [];\n for (let j = 0; j < store.indexNames.length; ++j) {\n const idbindex = store.index(store.indexNames[j]);\n keyPath = idbindex.keyPath;\n var index = createIndexSpec(\n idbindex.name,\n keyPath,\n !!idbindex.unique,\n !!idbindex.multiEntry,\n false,\n keyPath && typeof keyPath !== \"string\",\n false\n );\n indexes.push(index);\n }\n globalSchema[storeName] = createTableSchema(storeName, primKey, indexes);\n });\n return globalSchema;\n}\n\nexport function readGlobalSchema({_novip: db}: Dexie, idbdb: IDBDatabase, tmpTrans: IDBTransaction) {\n db.verno = idbdb.version / 10;\n const globalSchema = db._dbSchema = buildGlobalSchema(db, idbdb, tmpTrans);\n db._storeNames = slice(idbdb.objectStoreNames, 0);\n setApiOnPlace(db, [db._allTables], keys(globalSchema), globalSchema);\n}\n\nexport function verifyInstalledSchema(db: Dexie, tmpTrans: IDBTransaction): boolean {\n const installedSchema = buildGlobalSchema(db, db.idbdb, tmpTrans);\n const diff = getSchemaDiff(installedSchema, db._dbSchema);\n return !(diff.add.length || diff.change.some(ch => ch.add.length || ch.change.length));\n}\n\nexport function adjustToExistingIndexNames({_novip: db}: Dexie, schema: DbSchema, idbtrans: IDBTransaction) {\n // Issue #30 Problem with existing db - adjust to existing index names when migrating from non-dexie db\n const storeNames = idbtrans.db.objectStoreNames;\n\n for (let i = 0; i < storeNames.length; ++i) {\n const storeName = storeNames[i];\n const store = idbtrans.objectStore(storeName);\n db._hasGetAll = 'getAll' in store;\n\n for (let j = 0; j < store.indexNames.length; ++j) {\n const indexName = store.indexNames[j];\n const keyPath = store.index(indexName).keyPath;\n const dexieName = typeof keyPath === 'string' ? keyPath : \"[\" + slice(keyPath).join('+') + \"]\";\n if (schema[storeName]) {\n const indexSpec = schema[storeName].idxByName[dexieName];\n if (indexSpec) {\n indexSpec.name = indexName;\n delete schema[storeName].idxByName[dexieName];\n schema[storeName].idxByName[indexName] = indexSpec;\n }\n }\n }\n }\n\n // Bug with getAll() on Safari ver<604 on Workers only, see discussion following PR #579\n if (typeof navigator !== 'undefined' && /Safari/.test(navigator.userAgent) &&\n !/(Chrome\\/|Edge\\/)/.test(navigator.userAgent) &&\n _global.WorkerGlobalScope && _global instanceof _global.WorkerGlobalScope &&\n [].concat(navigator.userAgent.match(/Safari\\/(\\d*)/))[1] < 604)\n {\n db._hasGetAll = false;\n }\n}\n\nexport function parseIndexSyntax(primKeyAndIndexes: string): IndexSpec[] {\n return primKeyAndIndexes.split(',').map((index, indexNum) => {\n index = index.trim();\n const name = index.replace(/([&*]|\\+\\+)/g, \"\"); // Remove \"&\", \"++\" and \"*\"\n // Let keyPath of \"[a+b]\" be [\"a\",\"b\"]:\n const keyPath = /^\\[/.test(name) ? name.match(/^\\[(.*)\\]$/)[1].split('+') : name;\n\n return createIndexSpec(\n name,\n keyPath || null,\n /\\&/.test(index),\n /\\*/.test(index),\n /\\+\\+/.test(index),\n isArray(keyPath),\n indexNum === 0\n );\n });\n}\n","import { Version as IVersion } from '../../public/types/version';\nimport { DbSchema } from '../../public/types/db-schema';\nimport { extend, keys } from '../../functions/utils';\nimport { Dexie } from '../dexie';\nimport { Transaction } from '../transaction';\nimport { removeTablesApi, setApiOnPlace, parseIndexSyntax } from './schema-helpers';\nimport { exceptions } from '../../errors';\nimport { createTableSchema } from '../../helpers/table-schema';\nimport { nop, promisableChain } from '../../functions/chaining-functions';\n\n/** class Version\n *\n * https://dexie.org/docs/Version/Version\n */\nexport class Version implements IVersion {\n db: Dexie;\n _cfg: {\n version: number,\n storesSource: { [tableName: string]: string | null },\n dbschema: DbSchema,\n tables: {},\n contentUpgrade: Function | null\n }\n\n _parseStoresSpec(stores: { [tableName: string]: string | null }, outSchema: DbSchema): any {\n keys(stores).forEach(tableName => {\n if (stores[tableName] !== null) {\n var indexes = parseIndexSyntax(stores[tableName]);\n var primKey = indexes.shift();\n if (primKey.multi) throw new exceptions.Schema(\"Primary key cannot be multi-valued\");\n indexes.forEach(idx => {\n if (idx.auto) throw new exceptions.Schema(\"Only primary key can be marked as autoIncrement (++)\");\n if (!idx.keyPath) throw new exceptions.Schema(\"Index must have a name and cannot be an empty string\");\n });\n outSchema[tableName] = createTableSchema(tableName, primKey, indexes);\n }\n });\n }\n\n stores(stores: { [key: string]: string | null; }): IVersion {\n const db = this.db;\n this._cfg.storesSource = this._cfg.storesSource ?\n extend(this._cfg.storesSource, stores) :\n stores;\n const versions = db._versions;\n\n // Derive stores from earlier versions if they are not explicitely specified as null or a new syntax.\n const storesSpec: { [key: string]: string; } = {};\n let dbschema = {};\n versions.forEach(version => { // 'versions' is always sorted by lowest version first.\n extend(storesSpec, version._cfg.storesSource);\n dbschema = (version._cfg.dbschema = {});\n version._parseStoresSpec(storesSpec, dbschema);\n });\n // Update the latest schema to this version\n db._dbSchema = dbschema;\n // Update APIs\n removeTablesApi(db, [db._allTables, db, db.Transaction.prototype]);\n setApiOnPlace(db, [db._allTables, db, db.Transaction.prototype, this._cfg.tables], keys(dbschema), dbschema);\n db._storeNames = keys(dbschema);\n return this;\n }\n\n upgrade(upgradeFunction: (trans: Transaction) => PromiseLike | void): Version {\n this._cfg.contentUpgrade = promisableChain(this._cfg.contentUpgrade || nop, upgradeFunction);\n return this;\n }\n}\n","import { Dexie } from \"../classes/dexie/dexie\";\nimport { Table } from \"../public/types/table\";\nimport { DBNAMES_DB } from \"../globals/constants\";\nimport { DexieDOMDependencies } from \"../public/types/dexie-dom-dependencies\";\nimport { nop } from \"../functions/chaining-functions\";\n\ntype IDBKeyNamesVar = typeof IDBKeyRange;\n\nfunction getDbNamesTable(indexedDB: IDBFactory, IDBKeyRange: IDBKeyNamesVar) {\n let dbNamesDB = indexedDB[\"_dbNamesDB\"];\n if (!dbNamesDB) {\n dbNamesDB = indexedDB[\"_dbNamesDB\"] = new Dexie(DBNAMES_DB, {\n addons: [],\n indexedDB,\n IDBKeyRange,\n });\n dbNamesDB.version(1).stores({ dbnames: \"name\" });\n }\n return dbNamesDB.table(\"dbnames\") as Table<{ name: string }, string>;\n}\n\nfunction hasDatabasesNative(indexedDB: IDBFactory) {\n return indexedDB && typeof indexedDB.databases === \"function\";\n}\n\nexport function getDatabaseNames({\n indexedDB,\n IDBKeyRange,\n}: DexieDOMDependencies) {\n return hasDatabasesNative(indexedDB)\n ? Promise.resolve(indexedDB.databases()).then((infos) =>\n infos\n // Select name prop of infos:\n .map((info) => info.name)\n // Filter out DBNAMES_DB as previous Dexie or browser version would not have included it in the result.\n .filter((name) => name !== DBNAMES_DB)\n )\n : getDbNamesTable(indexedDB, IDBKeyRange).toCollection().primaryKeys();\n}\n\nexport function _onDatabaseCreated(\n { indexedDB, IDBKeyRange }: DexieDOMDependencies,\n name: string\n) {\n !hasDatabasesNative(indexedDB) &&\n name !== DBNAMES_DB &&\n getDbNamesTable(indexedDB, IDBKeyRange).put({name}).catch(nop);\n}\n\nexport function _onDatabaseDeleted(\n { indexedDB, IDBKeyRange }: DexieDOMDependencies,\n name: string\n) {\n !hasDatabasesNative(indexedDB) &&\n name !== DBNAMES_DB &&\n getDbNamesTable(indexedDB, IDBKeyRange).delete(name).catch(nop);\n}\n","import { newScope } from '../../helpers/promise';\nimport { PSD } from '../../helpers/promise';\n\nexport function vip (fn) {\n // To be used by subscribers to the on('ready') event.\n // This will let caller through to access DB even when it is blocked while the db.ready() subscribers are firing.\n // This would have worked automatically if we were certain that the Provider was using Dexie.Promise for all asyncronic operations. The promise PSD\n // from the provider.connect() call would then be derived all the way to when provider would call localDatabase.applyChanges(). But since\n // the provider more likely is using non-promise async APIs or other thenable implementations, we cannot assume that.\n // Note that this method is only useful for on('ready') subscribers that is returning a Promise from the event. If not using vip()\n // the database could deadlock since it wont open until the returned Promise is resolved, and any non-VIPed operation started by\n // the caller will not resolve until database is opened.\n return newScope(function () {\n PSD.letThrough = true; // Make sure we are let through if still blocking db due to onready is firing.\n return fn();\n });\n}\n\n","/**\n * Work around Safari 14 IndexedDB open bug.\n *\n * Safari has a horrible bug where IDB requests can hang while the browser is starting up. https://bugs.webkit.org/show_bug.cgi?id=226547\n * The only solution is to keep nudging it until it's awake.\n */\nfunction idbReady() {\n var isSafari = !navigator.userAgentData &&\n /Safari\\//.test(navigator.userAgent) &&\n !/Chrom(e|ium)\\//.test(navigator.userAgent);\n // No point putting other browsers or older versions of Safari through this mess.\n if (!isSafari || !indexedDB.databases)\n return Promise.resolve();\n var intervalId;\n return new Promise(function (resolve) {\n var tryIdb = function () { return indexedDB.databases().finally(resolve); };\n intervalId = setInterval(tryIdb, 100);\n tryIdb();\n }).finally(function () { return clearInterval(intervalId); });\n}\n\nexport default idbReady;\n","import { isArray } from '../functions/utils';\n\nexport function awaitIterator (iterator: Iterator) {\n var callNext = result => iterator.next(result),\n doThrow = error => iterator.throw(error),\n onSuccess = step(callNext),\n onError = step(doThrow);\n\n function step(getNext: (any)=>any) {\n return (val?) => {\n var next = getNext(val),\n value = next.value;\n\n return next.done ? value :\n (!value || typeof value.then !== 'function' ?\n isArray(value) ? Promise.all(value).then(onSuccess, onError) : onSuccess(value) :\n value.then(onSuccess, onError));\n };\n }\n\n return step(callNext)();\n}\n","import { TransactionMode } from '../../public/types/transaction-mode';\nimport { errnames, exceptions } from '../../errors';\nimport { flatten, isAsyncFunction } from '../../functions/utils';\nimport { Dexie } from './dexie';\nimport { Transaction } from '../transaction';\nimport { awaitIterator } from '../../helpers/yield-support';\nimport Promise, {\n PSD,\n NativePromise,\n decrementExpectedAwaits,\n rejection,\n incrementExpectedAwaits\n} from '../../helpers/promise';\n\nexport function extractTransactionArgs(mode: TransactionMode, _tableArgs_, scopeFunc) {\n // Let table arguments be all arguments between mode and last argument.\n var i = arguments.length;\n if (i < 2) throw new exceptions.InvalidArgument(\"Too few arguments\");\n // Prevent optimzation killer (https://github.com/petkaantonov/bluebird/wiki/Optimization-killers#32-leaking-arguments)\n // and clone arguments except the first one into local var 'args'.\n var args = new Array(i - 1);\n while (--i) args[i - 1] = arguments[i];\n // Let scopeFunc be the last argument and pop it so that args now only contain the table arguments.\n scopeFunc = args.pop();\n var tables = flatten(args); // Support using array as middle argument, or a mix of arrays and non-arrays.\n return [mode, tables, scopeFunc];\n}\n\nexport function enterTransactionScope(\n db: Dexie,\n mode: IDBTransactionMode,\n storeNames: string[],\n parentTransaction: Transaction | undefined,\n scopeFunc: ()=>PromiseLike | any\n) {\n return Promise.resolve().then(() => {\n // Keep a pointer to last non-transactional PSD to use if someone calls Dexie.ignoreTransaction().\n const transless = PSD.transless || PSD;\n // Our transaction.\n //return new Promise((resolve, reject) => {\n const trans = db._createTransaction(mode, storeNames, db._dbSchema, parentTransaction);\n // Let the transaction instance be part of a Promise-specific data (PSD) value.\n const zoneProps = {\n trans: trans,\n transless: transless\n };\n\n if (parentTransaction) {\n // Emulate transaction commit awareness for inner transaction (must 'commit' when the inner transaction has no more operations ongoing)\n trans.idbtrans = parentTransaction.idbtrans;\n } else {\n try {\n trans.create(); // Create the native transaction so that complete() or error() will trigger even if no operation is made upon it.\n db._state.PR1398_maxLoop = 3;\n } catch (ex) {\n if (ex.name === errnames.InvalidState && db.isOpen() && --db._state.PR1398_maxLoop > 0) {\n console.warn('Dexie: Need to reopen db');\n db._close();\n return db.open().then(() => enterTransactionScope(\n db,\n mode,\n storeNames,\n null,\n scopeFunc\n ));\n }\n return rejection(ex);\n }\n }\n\n // Support for native async await.\n const scopeFuncIsAsync = isAsyncFunction(scopeFunc);\n if (scopeFuncIsAsync) {\n incrementExpectedAwaits();\n }\n\n let returnValue;\n const promiseFollowed = Promise.follow(() => {\n // Finally, call the scope function with our table and transaction arguments.\n returnValue = scopeFunc.call(trans, trans);\n if (returnValue) {\n if (scopeFuncIsAsync) {\n // scopeFunc is a native async function - we know for sure returnValue is native promise.\n var decrementor = decrementExpectedAwaits.bind(null, null);\n returnValue.then(decrementor, decrementor);\n } else if (typeof returnValue.next === 'function' && typeof returnValue.throw === 'function') {\n // scopeFunc returned an iterator with throw-support. Handle yield as await.\n returnValue = awaitIterator(returnValue);\n }\n }\n }, zoneProps);\n return (returnValue && typeof returnValue.then === 'function' ?\n // Promise returned. User uses promise-style transactions.\n Promise.resolve(returnValue).then(x => trans.active ?\n x // Transaction still active. Continue.\n : rejection(new exceptions.PrematureCommit(\n \"Transaction committed too early. See http://bit.ly/2kdckMn\")))\n // No promise returned. Wait for all outstanding promises before continuing. \n : promiseFollowed.then(() => returnValue)\n ).then(x => {\n // sub transactions don't react to idbtrans.oncomplete. We must trigger a completion:\n if (parentTransaction) trans._resolve();\n // wait for trans._completion\n // (if root transaction, this means 'complete' event. If sub-transaction, we've just fired it ourselves)\n return trans._completion.then(() => x);\n }).catch(e => {\n trans._reject(e); // Yes, above then-handler were maybe not called because of an unhandled rejection in scopeFunc!\n return rejection(e);\n });\n });\n}\n","import {\n DBCore,\n DBCoreIndex,\n DBCoreKeyRange,\n DBCoreQueryRequest,\n DBCoreRangeType,\n DBCoreOpenCursorRequest,\n DBCoreCountRequest,\n DBCoreCursor,\n DBCoreTable,\n} from \"../public/types/dbcore\";\nimport { isArray } from '../functions/utils';\nimport { getKeyExtractor } from './get-key-extractor';\nimport { getKeyPathAlias } from './dbcore-indexeddb';\nimport { Middleware } from '../public/types/middleware';\n\ninterface VirtualIndex extends DBCoreIndex {\n /** True if this index is virtual, i.e. represents a compound index internally,\n * but makes it act as as having a subset of its keyPaths.\n */\n isVirtual: boolean;\n\n /** Number of keypaths that this index comprises. Can be 0..N.\n * Note: This is the length of the *virtual index*, not the real index.\n */\n keyLength: number;\n\n /** Number of popped keypaths from the real index.\n */\n keyTail: number;\n}\n\n// Move into some util:\nexport function pad (a: any | any[], value: any, count: number) {\n const result = isArray(a) ? a.slice() : [a];\n for (let i=0; i 0;\n const virtualIndex = {\n ...lowLevelIndex,\n isVirtual,\n keyTail,\n keyLength,\n extractKey: getKeyExtractor(keyPath),\n unique: !isVirtual && lowLevelIndex.unique\n };\n indexList.push(virtualIndex);\n if (!virtualIndex.isPrimaryKey) {\n allVirtualIndexes.push(virtualIndex);\n }\n if (keyLength > 1) {\n const virtualKeyPath = keyLength === 2 ?\n keyPath[0] : // This is a compound [a, b]. Add a virtual normal index a.\n keyPath.slice(0, keyLength - 1); // This is compound [a,b,c]. Add virtual compound [a,b].\n addVirtualIndexes(virtualKeyPath, keyTail + 1, lowLevelIndex);\n }\n indexList.sort((a,b) => a.keyTail - b.keyTail); // Shortest keyTail is the best one (represents real index)\n return virtualIndex;\n }\n \n const primaryKey = addVirtualIndexes(schema.primaryKey.keyPath, 0, schema.primaryKey);\n indexLookup[\":id\"] = [primaryKey];\n for (const index of schema.indexes) {\n addVirtualIndexes(index.keyPath, 0, index);\n }\n \n function findBestIndex(keyPath: null | string | string[]): VirtualIndex {\n const result = indexLookup[getKeyPathAlias(keyPath)];\n return result && result[0];\n }\n \n function translateRange (range: DBCoreKeyRange, keyTail: number): DBCoreKeyRange {\n return {\n type: range.type === DBCoreRangeType.Equal ?\n DBCoreRangeType.Range :\n range.type,\n lower: pad(range.lower, range.lowerOpen ? down.MAX_KEY : down.MIN_KEY, keyTail),\n lowerOpen: true, // doesn't matter true or false\n upper: pad(range.upper, range.upperOpen ? down.MIN_KEY : down.MAX_KEY, keyTail),\n upperOpen: true // doesn't matter true or false\n };\n }\n \n function translateRequest (req: DBCoreQueryRequest): DBCoreQueryRequest;\n function translateRequest (req: DBCoreOpenCursorRequest): DBCoreOpenCursorRequest;\n function translateRequest (req: DBCoreCountRequest): DBCoreCountRequest {\n const index = req.query.index as VirtualIndex;\n return index.isVirtual ? {\n ...req,\n query: {\n index,\n range: translateRange(req.query.range, index.keyTail)\n }\n } : req;\n }\n \n const result: DBCoreTable = {\n ...table,\n schema: {\n ...schema,\n primaryKey,\n indexes: allVirtualIndexes,\n getIndexByKeyPath: findBestIndex\n },\n\n count(req) {\n return table.count(translateRequest(req));\n }, \n \n query(req) {\n return table.query(translateRequest(req));\n },\n \n openCursor(req) {\n const {keyTail, isVirtual, keyLength} = (req.query.index as VirtualIndex);\n if (!isVirtual) return table.openCursor(req);\n \n function createVirtualCursor(cursor: DBCoreCursor) : DBCoreCursor {\n function _continue (key?: any) {\n key != null ?\n cursor.continue(pad(key, req.reverse ? down.MAX_KEY : down.MIN_KEY, keyTail)) :\n req.unique ?\n cursor.continue(\n cursor.key.slice(0, keyLength)\n .concat(req.reverse\n ? down.MIN_KEY\n : down.MAX_KEY, keyTail)\n ) :\n cursor.continue()\n }\n const virtualCursor = Object.create(cursor, {\n continue: {value: _continue},\n continuePrimaryKey: {\n value(key: any, primaryKey: any) {\n cursor.continuePrimaryKey(pad(key, down.MAX_KEY, keyTail), primaryKey);\n }\n },\n primaryKey: {\n get() {\n return cursor.primaryKey;\n }\n },\n key: {\n get() {\n const key = cursor.key as any[]; // A virtual cursor always operates on compound key\n return keyLength === 1 ?\n key[0] : // Cursor.key should not be an array.\n key.slice(0, keyLength); // Cursor.key should be first part of array.\n }\n },\n value: {\n get() {\n return cursor.value;\n }\n }\n });\n return virtualCursor;\n }\n \n return table.openCursor(translateRequest(req))\n .then(cursor => cursor && createVirtualCursor(cursor));\n }\n };\n return result;\n }\n }\n}\n\nexport const virtualIndexMiddleware : Middleware = {\n stack: \"dbcore\",\n name: \"VirtualIndexMiddleware\",\n level: 1,\n create: createVirtualIndexMiddleware\n};\n\n","import { keys, hasOwn, toStringTag } from './utils';\n\nexport function getObjectDiff(a: any, b: any, rv?: any, prfx?: string) {\n // Compares objects a and b and produces a diff object.\n rv = rv || {};\n prfx = prfx || '';\n keys(a).forEach((prop) => {\n if (!hasOwn(b, prop)) {\n // Property removed\n rv[prfx + prop] = undefined;\n } else {\n var ap = a[prop],\n bp = b[prop];\n if (typeof ap === 'object' && typeof bp === 'object' && ap && bp) {\n const apTypeName = toStringTag(ap);\n const bpTypeName = toStringTag(bp);\n\n if (apTypeName !== bpTypeName) {\n rv[prfx + prop] = b[prop]; // Property changed to other type\n } else if (apTypeName === 'Object') {\n // Pojo objects (not Date, ArrayBuffer, Array etc). Go deep.\n getObjectDiff(ap, bp, rv, prfx + prop + '.');\n } else if (ap !== bp) {\n // Values differ.\n // Could have checked if Date, arrays or binary types have same\n // content here but I think that would be a suboptimation.\n // Prefer simplicity.\n rv[prfx + prop] = b[prop];\n }\n } else if (ap !== bp) rv[prfx + prop] = b[prop]; // Primitive value changed\n }\n });\n keys(b).forEach((prop) => {\n if (!hasOwn(a, prop)) {\n rv[prfx + prop] = b[prop]; // Property added\n }\n });\n return rv;\n}\n","import {\n DBCore,\n DBCoreTable,\n DBCoreMutateResponse,\n DBCoreDeleteRangeRequest,\n DBCoreAddRequest,\n DBCorePutRequest,\n DBCoreDeleteRequest,\n DBCoreTransaction,\n DBCoreKeyRange\n} from \"../public/types/dbcore\";\nimport { nop } from '../functions/chaining-functions';\nimport { hasOwn, setByKeyPath } from '../functions/utils';\nimport { getObjectDiff } from \"../functions/get-object-diff\";\nimport { PSD } from '../helpers/promise';\n//import { LockableTableMiddleware } from '../dbcore/lockable-table-middleware';\nimport { getEffectiveKeys } from '../dbcore/get-effective-keys';\nimport { Middleware } from '../public/types/middleware';\nimport { Transaction } from '../classes/transaction';\n\nexport const hooksMiddleware: Middleware = {\n stack: \"dbcore\",\n name: \"HooksMiddleware\",\n level: 2,\n create: (downCore: DBCore) => ({\n ...downCore,\n table(tableName: string) {\n const downTable = downCore.table(tableName);\n const {primaryKey} = downTable.schema;\n \n const tableMiddleware: DBCoreTable = {\n ...downTable,\n mutate(req):Promise {\n const dxTrans = PSD.trans as Transaction;\n // Hooks can be transaction-bound. Need to grab them from transaction.table and not\n // db.table!\n const {deleting, creating, updating} = dxTrans.table(tableName).hook;\n switch (req.type) {\n case 'add':\n if (creating.fire === nop) break;\n return dxTrans._promise('readwrite', ()=>addPutOrDelete(req), true);\n case 'put':\n if (creating.fire === nop && updating.fire === nop) break;\n return dxTrans._promise('readwrite', ()=>addPutOrDelete(req), true);\n case 'delete':\n if (deleting.fire === nop) break;\n return dxTrans._promise('readwrite', ()=>addPutOrDelete(req), true);\n case 'deleteRange':\n if (deleting.fire === nop) break;\n return dxTrans._promise('readwrite', ()=>deleteRange(req), true);\n }\n // Any of the breaks above happened (no hooks) - do the default:\n return downTable.mutate(req);\n\n\n function addPutOrDelete(req: DBCoreAddRequest | DBCorePutRequest | DBCoreDeleteRequest): Promise {\n const dxTrans = PSD.trans;\n const keys = req.keys || getEffectiveKeys(primaryKey, req);\n if (!keys) throw new Error(\"Keys missing\");\n // Clone Request and set keys arg\n req = req.type === 'add' || req.type === 'put' ?\n {...req, keys} :\n {...req};\n if (req.type !== 'delete') req.values = [...req.values];\n if (req.keys) req.keys = [...req.keys];\n \n return getExistingValues(downTable, req, keys).then (existingValues => {\n const contexts = keys.map((key, i) => {\n const existingValue = existingValues[i];\n const ctx = { onerror: null, onsuccess: null };\n if (req.type === 'delete') {\n // delete operation\n deleting.fire.call(ctx, key, existingValue, dxTrans);\n } else if (req.type === 'add' || existingValue === undefined) {\n // The add() or put() resulted in a create\n const generatedPrimaryKey = creating.fire.call(ctx, key, req.values[i], dxTrans);\n if (key == null && generatedPrimaryKey != null) {\n key = generatedPrimaryKey;\n req.keys[i] = key;\n if (!primaryKey.outbound) {\n setByKeyPath(req.values[i], primaryKey.keyPath, key);\n }\n }\n } else {\n // The put() operation resulted in an update\n const objectDiff = getObjectDiff(existingValue, req.values[i]);\n const additionalChanges = updating.fire.call(ctx, objectDiff, key, existingValue, dxTrans);\n if (additionalChanges) {\n const requestedValue = req.values[i];\n Object.keys(additionalChanges).forEach(keyPath => {\n if (hasOwn(requestedValue, keyPath)) {\n // keyPath is already present as a literal property of the object\n requestedValue[keyPath] = additionalChanges[keyPath];\n } else {\n // keyPath represents a new or existing path into the object\n setByKeyPath(requestedValue, keyPath, additionalChanges[keyPath]);\n }\n });\n }\n }\n return ctx;\n });\n return downTable.mutate(req).then(({failures, results, numFailures, lastResult}) => {\n for (let i=0; i {\n contexts.forEach(ctx => ctx.onerror && ctx.onerror(error));\n return Promise.reject(error);\n });\n });\n }\n \n function deleteRange(req: DBCoreDeleteRangeRequest): Promise {\n return deleteNextChunk(req.trans, req.range, 10000);\n }\n \n function deleteNextChunk(trans: DBCoreTransaction, range: DBCoreKeyRange, limit: number) {\n // Query what keys in the DB within the given range\n return downTable.query({trans, values: false, query: {index: primaryKey, range}, limit})\n .then(({result}) => {\n // Given a set of keys, bulk delete those using the same procedure as in addPutOrDelete().\n // This will make sure that deleting hook is called.\n return addPutOrDelete({type: 'delete', keys: result, trans}).then(res => {\n if (res.numFailures > 0) return Promise.reject(res.failures[0]);\n if (result.length < limit) {\n return {failures: [], numFailures: 0, lastResult: undefined} as DBCoreMutateResponse;\n } else {\n return deleteNextChunk(trans, {...range, lower: result[result.length - 1], lowerOpen: true}, limit);\n }\n });\n })\n }\n }\n };\n //const {lock, lockableMiddleware} = LockableTableMiddleware(tableMiddleware);\n\n return tableMiddleware;\n },\n }) as DBCore\n};\n\nfunction getExistingValues(\n table: DBCoreTable,\n req: DBCoreAddRequest | DBCorePutRequest | DBCoreDeleteRequest,\n effectiveKeys: any[]\n) {\n return req.type === \"add\"\n ? Promise.resolve([])\n : table.getMany({ trans: req.trans, keys: effectiveKeys, cache: \"immutable\" });\n}\n","import {\n DBCoreAddRequest,\n DBCorePutRequest,\n DBCoreDeleteRequest,\n DBCoreIndex,\n DBCoreTable,\n} from \"../public/types/dbcore\";\n\nexport function getEffectiveKeys (\n primaryKey: DBCoreIndex,\n req: (Pick & {keys?: any[]}) | Pick)\n{\n //const {outbound} = primaryKey;\n if (req.type === 'delete') return req.keys;\n return req.keys || req.values.map(primaryKey.extractKey)\n}\n","import { deepClone } from \"../functions/utils\";\nimport { DBCore } from \"../public/types/dbcore\";\nimport { Middleware } from \"../public/types/middleware\";\nimport Promise from \"../helpers/promise\";\nimport { cmp } from '../functions/cmp';\n\nexport function getFromTransactionCache(\n keys: any[],\n cache: { keys: any[]; values: any[] } | undefined | null,\n clone?: boolean\n) {\n try {\n if (!cache) return null;\n if (cache.keys.length < keys.length) return null;\n const result: any[] = [];\n // Compare if the exact same order of keys was retrieved in same transaction:\n // Allow some cached keys to be omitted from provided set of keys\n // Use case: 1. getMany(keys) 2. update a subset of those 3. call put with the updated ones ==> middlewares should be able to find old values\n for (let i = 0, j = 0; i < cache.keys.length && j < keys.length; ++i) {\n if (cmp(cache.keys[i], keys[j]) !== 0) continue;\n result.push(clone ? deepClone(cache.values[i]) : cache.values[i]);\n ++j;\n }\n // If got all keys caller was looking for, return result.\n return result.length === keys.length ? result : null;\n } catch {\n return null;\n }\n}\n\nexport const cacheExistingValuesMiddleware: Middleware = {\n stack: \"dbcore\",\n level: -1,\n create: (core) => {\n return {\n table: (tableName) => {\n const table = core.table(tableName);\n return {\n ...table,\n getMany: (req) => {\n if (!req.cache) {\n return table.getMany(req);\n }\n const cachedResult = getFromTransactionCache(\n req.keys,\n req.trans[\"_cache\"],\n req.cache === \"clone\"\n );\n if (cachedResult) {\n return Promise.resolve(cachedResult);\n }\n return table.getMany(req).then((res) => {\n req.trans[\"_cache\"] = {\n keys: req.keys,\n values: req.cache === \"clone\" ? deepClone(res) : res,\n };\n return res;\n });\n },\n mutate: (req) => {\n // Invalidate cache on any mutate except \"add\" which can't change existing values:\n if (req.type !== \"add\") req.trans[\"_cache\"] = null;\n return table.mutate(req);\n },\n };\n },\n };\n },\n};\n","import { cmp } from \"../functions/cmp\";\nimport { extend, iteratorSymbol, props } from '../functions/utils';\nimport { IndexableType } from '../public';\nimport {\n EmptyRange,\n IntervalTree,\n IntervalTreeNode,\n RangeSetConstructor,\n RangeSetPrototype,\n} from \"../public/types/rangeset\";\n\n/* An interval tree implementation to efficiently detect overlapping ranges of queried indexes.\n *\n * https://en.wikipedia.org/wiki/Interval_tree\n * \n */\n\nfunction isEmptyRange(node: IntervalTree | {from: IndexableType, to: IndexableType}): node is EmptyRange {\n return !(\"from\" in node);\n}\n\nexport type RangeSet = RangeSetPrototype & IntervalTree;\n\nexport const RangeSet = function(fromOrTree: any, to?: any) {\n if (this) {\n // Called with new()\n extend(this, arguments.length ? {d:1, from: fromOrTree, to: arguments.length > 1 ? to : fromOrTree} : {d:0});\n } else {\n // Called without new()\n const rv = new RangeSet();\n if (fromOrTree && (\"d\" in fromOrTree)) {\n extend(rv, fromOrTree);\n }\n return rv;\n }\n} as RangeSetConstructor;\n\nprops(RangeSet.prototype, {\n add(rangeSet: IntervalTree | {from: IndexableType, to: IndexableType}) {\n mergeRanges(this, rangeSet);\n return this;\n },\n addKey(key: IndexableType) {\n addRange(this, key, key);\n return this;\n },\n addKeys(keys: IndexableType[]) {\n keys.forEach(key => addRange(this, key, key));\n return this;\n },\n\n [iteratorSymbol](): Iterator {\n return getRangeSetIterator(this);\n }\n});\n\nfunction addRange(target: IntervalTree, from: IndexableType, to: IndexableType) {\n const diff = cmp(from, to);\n // cmp() returns NaN if one of the args are IDB-invalid keys.\n // Avoid storing invalid keys in rangeset:\n if (isNaN(diff)) return;\n\n // Caller is trying to add a range where from is greater than to:\n if (diff > 0) throw RangeError();\n \n if (isEmptyRange(target)) return extend(target, { from, to, d: 1 });\n const left = target.l;\n const right = target.r;\n if (cmp(to, target.from) < 0) {\n left\n ? addRange(left, from, to)\n : (target.l = { from, to, d: 1, l: null, r: null });\n return rebalance(target);\n }\n if (cmp(from, target.to) > 0) {\n right\n ? addRange(right, from, to)\n : (target.r = { from, to, d: 1, l: null, r: null });\n return rebalance(target);\n }\n // Now we have some kind of overlap. We will be able to merge the new range into the node or let it be swallowed.\n\n // Grow left?\n if (cmp(from, target.from) < 0) {\n target.from = from;\n target.l = null; // Cut off for now. Re-add later.\n target.d = right ? right.d + 1 : 1;\n }\n // Grow right?\n if (cmp(to, target.to) > 0) {\n target.to = to;\n target.r = null; // Cut off for now. Re-add later.\n target.d = target.l ? target.l.d + 1 : 1;\n }\n const rightWasCutOff = !target.r;\n // Re-add left?\n if (left && !target.l) {\n //Ranges to the left may be swallowed. Cut it of and re-add all.\n //Could probably be done more efficiently!\n mergeRanges(target, left);\n }\n // Re-add right?\n if (right && rightWasCutOff) {\n //Ranges to the right may be swallowed. Cut it of and re-add all.\n //Could probably be done more efficiently!\n mergeRanges(target, right);\n }\n}\n\nexport function mergeRanges(target: IntervalTree, newSet: IntervalTree | {from: IndexableType, to: IndexableType}) {\n function _addRangeSet(\n target: IntervalTree,\n { from, to, l, r }: IntervalTreeNode | {from: IndexableType, to: IndexableType, l?: undefined, r?: undefined}\n ) {\n addRange(target, from, to);\n if (l) _addRangeSet(target, l);\n if (r) _addRangeSet(target, r);\n }\n\n if(!isEmptyRange(newSet)) _addRangeSet(target, newSet);\n}\n\nexport function rangesOverlap(\n rangeSet1: IntervalTree,\n rangeSet2: IntervalTree\n): boolean {\n // Start iterating other from scratch.\n const i1 = getRangeSetIterator(rangeSet2);\n let nextResult1 = i1.next();\n if (nextResult1.done) return false;\n let a = nextResult1.value;\n\n // Start iterating this from start of other\n const i2 = getRangeSetIterator(rangeSet1);\n let nextResult2 = i2.next(a.from); // Start from beginning of other range\n let b = nextResult2.value;\n\n while (!nextResult1.done && !nextResult2.done) {\n if (cmp(b!.from, a.to) <= 0 && cmp(b!.to, a.from) >= 0) return true;\n cmp(a.from, b!.from) < 0\n ? (a = (nextResult1 = i1.next(b!.from)).value!) // a is behind. forward it to beginning of next b-range\n : (b = (nextResult2 = i2.next(a.from)).value); // b is behind. forward it to beginning of next a-range\n }\n return false;\n}\n\ntype RangeSetIteratorState =\n | {\n up?: RangeSetIteratorState;\n n: IntervalTreeNode;\n s: 0 | 1 | 2 | 3;\n }\n | undefined\n | null;\nexport function getRangeSetIterator(\n node: EmptyRange | IntervalTreeNode\n): Generator {\n let state: RangeSetIteratorState = isEmptyRange(node) ? null : { s: 0, n: node };\n\n return {\n next(key?) {\n const keyProvided = arguments.length > 0;\n while (state) {\n switch (state.s) {\n case 0:\n // Initial state for node.\n // Fast forward to leftmost node.\n state.s = 1;\n if (keyProvided) {\n while (state.n.l && cmp(key, state.n.from) < 0)\n state = { up: state, n: state.n.l, s: 1 };\n } else {\n while (state.n.l) state = { up: state, n: state.n.l, s: 1 };\n }\n // intentionally fall into case 1:\n case 1:\n // We're on a node where it's left part is already handled or does not exist.\n state.s = 2;\n if (!keyProvided || cmp(key, state.n.to) <= 0)\n return { value: state.n, done: false };\n case 2:\n // We've emitted our node and should continue with the right part or let parent take over from it's state 1\n if (state.n.r) {\n state.s = 3; // So when child is done, we know we're done.\n state = { up: state, n: state.n.r, s: 0 };\n continue; // Will fall in to case 0 with fast forward to left leaf of this subtree.\n }\n // intentionally fall into case 3:\n case 3:\n state = state.up;\n }\n }\n return { done: true };\n },\n } as Generator;\n}\n\nfunction rebalance(target: IntervalTreeNode) {\n const diff = (target.r?.d || 0) - (target.l?.d || 0);\n const r = diff > 1 ? \"r\" : diff < -1 ? \"l\" : \"\";\n if (r) {\n\n // Rotate (https://en.wikipedia.org/wiki/Tree_rotation)\n //\n // \n // [OLDROOT]\n // [OLDROOT.L] [NEWROOT]\n // [NEWROOT.L] [NEWROOT.R]\n //\n // Is going to become:\n //\n // \n // [NEWROOT]\n // [OLDROOT] [NEWROOT.R]\n // [OLDROOT.L] [NEWROOT.L] \n\n // * clone now has the props of OLDROOT\n // Plan:\n // * target must be given the props of NEWROOT\n // * target[l] must point to a new OLDROOT\n // * target[r] must point to NEWROOT.R\n // * OLDROOT[r] must point to NEWROOT.L\n const l = r === \"r\" ? \"l\" : \"r\"; // Support both left/right rotation\n const rootClone = { ...target };\n // We're gonna copy props from target's right node into target so that target will\n // have same range as old target[r] (instead of changing pointers, we copy values.\n // that way we do not need to adjust pointers in parents).\n const oldRootRight = target[r]; \n target.from = oldRootRight.from;\n target.to = oldRootRight.to;\n target[r] = oldRootRight[r];\n rootClone[r] = oldRootRight[l];\n target[l] = rootClone;\n rootClone.d = computeDepth(rootClone);\n }\n target.d = computeDepth(target);\n}\n\nfunction computeDepth({ r, l }: Pick) {\n return (r ? (l ? Math.max(r.d, l.d) : r.d) : l ? l.d : 0) + 1;\n}\n","import { getFromTransactionCache } from \"../dbcore/cache-existing-values-middleware\";\nimport { cmp } from \"../functions/cmp\";\nimport { isArray, keys } from \"../functions/utils\";\nimport { PSD } from \"../helpers/promise\";\nimport { RangeSet } from \"../helpers/rangeset\";\nimport { ObservabilitySet } from \"../public/types/db-events\";\nimport {\n DBCore,\n DBCoreCountRequest,\n DBCoreCursor,\n DBCoreGetManyRequest,\n DBCoreGetRequest,\n DBCoreIndex,\n DBCoreOpenCursorRequest,\n DBCoreQueryRequest,\n DBCoreQueryResponse,\n DBCoreTable,\n DBCoreTableSchema,\n DBCoreTransaction,\n} from \"../public/types/dbcore\";\nimport { Middleware } from \"../public/types/middleware\";\n\nexport const observabilityMiddleware: Middleware = {\n stack: \"dbcore\",\n level: 0,\n create: (core) => {\n const dbName = core.schema.name;\n const FULL_RANGE = new RangeSet(core.MIN_KEY, core.MAX_KEY);\n\n return {\n ...core,\n table: (tableName) => {\n const table = core.table(tableName);\n const { schema } = table;\n const { primaryKey } = schema;\n const { extractKey, outbound } = primaryKey;\n const tableClone: DBCoreTable = {\n ...table,\n mutate: (req) => {\n const trans = req.trans as DBCoreTransaction & {\n mutatedParts?: ObservabilitySet;\n };\n const mutatedParts =\n trans.mutatedParts || (trans.mutatedParts = {});\n const getRangeSet = (indexName: string) => {\n const part = `idb://${dbName}/${tableName}/${indexName}`;\n return (mutatedParts[part] ||\n (mutatedParts[part] = new RangeSet())) as RangeSet;\n };\n const pkRangeSet = getRangeSet(\"\");\n const delsRangeSet = getRangeSet(\":dels\");\n\n const { type } = req;\n let [keys, newObjs] =\n req.type === \"deleteRange\"\n ? [req.range] // keys will be an DBCoreKeyRange object - transformed later on to a [from,to]-style range.\n : req.type === \"delete\"\n ? [req.keys] // keys known already here. newObjs will be undefined.\n : req.values.length < 50\n ? [[], req.values] // keys = empty array - will be resolved in mutate().then(...).\n : []; // keys and newObjs will both be undefined - changeSpec will become true (changed for entire table)\n const oldCache = req.trans[\"_cache\"];\n return table.mutate(req).then((res) => {\n // Add the mutated table and optionally keys to the mutatedTables set on the transaction.\n // Used by subscribers to txcommit event and for Collection.prototype.subscribe().\n if (isArray(keys)) {\n // keys is an array - delete, add or put of less than 50 rows.\n if (type !== \"delete\") keys = res.results;\n // individual keys (add put or delete)\n pkRangeSet.addKeys(keys);\n // Only get oldObjs if they have been cached recently\n // (This applies to Collection.modify() only, but also if updating/deleting hooks have subscribers)\n const oldObjs = getFromTransactionCache(keys, oldCache);\n\n // Supply detailed values per index for both old and new objects:\n if (!oldObjs && type !== \"add\") {\n // delete or put and we don't know old values.\n // Indicate this in the \":dels\" part, for the sake of count() queries only!\n delsRangeSet.addKeys(keys);\n }\n if (oldObjs || newObjs) {\n // No matter if knowning oldObjs or not, track the indices if it's a put, add or delete.\n trackAffectedIndexes(getRangeSet, schema, oldObjs, newObjs);\n }\n } else if (keys) {\n // As we can't know deleted index ranges, mark index-based subscriptions must trigger.\n const range = { from: keys.lower, to: keys.upper };\n delsRangeSet.add(range);\n // deleteRange. keys is a DBCoreKeyRange objects. Transform it to [from,to]-style range.\n pkRangeSet.add(range);\n } else {\n // Too many requests to record the details without slowing down write performance.\n // Let's just record a generic large range on primary key, the virtual :dels index and\n // all secondary indices:\n pkRangeSet.add(FULL_RANGE);\n delsRangeSet.add(FULL_RANGE);\n schema.indexes.forEach(idx => getRangeSet(idx.name).add(FULL_RANGE));\n }\n return res;\n });\n },\n };\n\n const getRange: (req: any) => [DBCoreIndex, RangeSet] = ({\n query: { index, range },\n }:\n | DBCoreQueryRequest\n | DBCoreCountRequest\n | DBCoreOpenCursorRequest) => [\n index,\n new RangeSet(range.lower ?? core.MIN_KEY, range.upper ?? core.MAX_KEY),\n ];\n\n const readSubscribers: {[method in\n Exclude]: \n (req: any) => [DBCoreIndex, RangeSet]\n } = {\n get: (req) => [primaryKey, new RangeSet(req.key)],\n getMany: (req) => [primaryKey, new RangeSet().addKeys(req.keys)],\n count: getRange,\n query: getRange,\n openCursor: getRange,\n }\n\n keys(readSubscribers).forEach(method => {\n tableClone[method] = function (\n req:\n | DBCoreGetRequest\n | DBCoreGetManyRequest\n | DBCoreQueryRequest\n | DBCoreCountRequest\n | DBCoreOpenCursorRequest\n ) {\n const { subscr } = PSD;\n if (subscr) {\n // Current zone want's to track all queries so they can be subscribed to.\n // (The query is executed within a \"liveQuery\" zone)\n // Check whether the query applies to a certain set of ranges:\n // Track what we should be observing:\n const getRangeSet = (indexName: string) => {\n const part = `idb://${dbName}/${tableName}/${indexName}`;\n return (subscr[part] ||\n (subscr[part] = new RangeSet())) as RangeSet;\n };\n const pkRangeSet = getRangeSet(\"\");\n const delsRangeSet = getRangeSet(\":dels\");\n const [queriedIndex, queriedRanges] = readSubscribers[method](req);\n // A generic rule here: queried ranges should always be subscribed to.\n getRangeSet(queriedIndex.name || \"\").add(queriedRanges);\n if (!queriedIndex.isPrimaryKey) {\n // Only count(), query() and openCursor() operates on secondary indices.\n // Since put(), delete() and deleteRange() mutations may happen without knowing oldObjs,\n // the mutate() method will be missing what secondary indices that are being deleted from\n // the subscribed range. We are working around this issue by recording all the resulting\n // primary keys from the queries. This only works for those kinds of queries where we can\n // derive the primary key from the result.\n // In this block we are accomplishing this using various strategies depending on the properties\n // of the query result.\n\n if (method === \"count\") {\n // We've got a problem! Delete and put mutations happen without known the oldObjs.\n // Those mutation could change the count.\n // Solution: Dedicated \":dels\" url represends a subscription to all mutations without oldObjs\n // (specially triggered in the mutators put(), delete() and deleteRange() when they don't know oldObject)\n delsRangeSet.add(FULL_RANGE);\n } else {\n // openCursor() or query()\n\n // Prepare a keysPromise in case the we're doing an IDBIndex.getAll() on a store with outbound keys.\n const keysPromise =\n method === \"query\" &&\n outbound &&\n (req as DBCoreQueryRequest).values &&\n table.query({\n ...(req as DBCoreQueryRequest),\n values: false,\n });\n\n return table[method].apply(this, arguments).then((res) => {\n if (method === \"query\") {\n if (outbound && (req as DBCoreQueryRequest).values) {\n // If keys are outbound, we can't use extractKey to map what keys to observe.\n // We've queried an index (like 'dateTime') on an outbound table\n // and retrieve a list of objects\n // from who we cannot know their primary keys.\n // \"Luckily\" though, we've prepared the keysPromise to assist us in exact this condition.\n return keysPromise.then(\n ({ result: resultingKeys }: DBCoreQueryResponse) => {\n pkRangeSet.addKeys(resultingKeys);\n return res;\n }\n );\n }\n // query() inbound values, keys or outbound keys. Secondary indexes only since\n // for primary keys we would only add results within the already registered range.\n const pKeys = (req as DBCoreQueryRequest).values\n ? (res as DBCoreQueryResponse).result.map(extractKey)\n : (res as DBCoreQueryResponse).result;\n if ((req as DBCoreQueryRequest).values) {\n // Subscribe to any mutation made on the returned keys,\n // so that we detect both deletions and updated properties.\n pkRangeSet.addKeys(pKeys);\n } else {\n // Subscribe only to mutations on the returned keys\n // in case the mutator was unable to know oldObjs.\n // If it has oldObj, the mutator won't put anything in \":dels\" because\n // it can more fine-grained put the exact removed and added index value in the correct\n // index range that we subscribe to in the queried range sets.\n // We don't load values so a change on a property outside our index will not\n // require us to re-execute the query.\n delsRangeSet.addKeys(pKeys);\n }\n } else if (method === \"openCursor\") {\n // Caller requests a cursor.\n // For the same reason as when method===\"query\", we only need to observe\n // those keys whose values are possibly used or rendered - which could\n // only happen on keys where they get the cursor's key, primaryKey or value.\n const cursor: DBCoreCursor | null = res;\n const wantValues = (req as DBCoreOpenCursorRequest).values;\n return (\n cursor &&\n Object.create(cursor, {\n key: {\n get() {\n delsRangeSet.addKey(cursor.primaryKey);\n return cursor.key;\n },\n },\n primaryKey: {\n get() {\n const pkey = cursor.primaryKey;\n delsRangeSet.addKey(pkey);\n return pkey;\n },\n },\n value: {\n get() {\n wantValues && pkRangeSet.addKey(cursor.primaryKey);\n return cursor.value;\n },\n },\n })\n );\n }\n return res;\n });\n }\n }\n }\n return table[method].apply(this, arguments);\n };\n });\n return tableClone;\n },\n };\n },\n};\n\nfunction trackAffectedIndexes(\n getRangeSet: (index: string) => RangeSet,\n schema: DBCoreTableSchema,\n oldObjs: any[] | undefined,\n newObjs: any[] | undefined\n) {\n function addAffectedIndex(ix: DBCoreIndex) {\n const rangeSet = getRangeSet(ix.name || \"\");\n function extractKey(obj: any) {\n return obj != null ? ix.extractKey(obj) : null;\n }\n const addKeyOrKeys = (key: any) => ix.multiEntry && isArray(key)\n // multiEntry and the old property was an array - add each array entry to the rangeSet:\n ? key.forEach(key => rangeSet.addKey(key))\n // Not multiEntry or the old property was not an array - add each array entry to the rangeSet:\n : rangeSet.addKey(key);\n\n (oldObjs || newObjs).forEach((_, i) => {\n const oldKey = oldObjs && extractKey(oldObjs[i]);\n const newKey = newObjs && extractKey(newObjs[i]);\n if (cmp(oldKey, newKey) !== 0) {\n // The index has changed. Add both old and new value of the index.\n if (oldKey != null) addKeyOrKeys(oldKey); // If oldKey is invalid key, addKey() will be a noop.\n if (newKey != null) addKeyOrKeys(newKey); // If newKey is invalid key, addKey() will be a noop.\n }\n });\n }\n schema.indexes.forEach(addAffectedIndex);\n}\n","import { _global } from '../../globals/global';\nimport { DexieDOMDependencies } from '../../public/types/dexie-dom-dependencies';\n\nexport let domDeps: DexieDOMDependencies\n\ntry {\n domDeps = {\n // Required:\n indexedDB: _global.indexedDB || _global.mozIndexedDB || _global.webkitIndexedDB || _global.msIndexedDB,\n IDBKeyRange: _global.IDBKeyRange || _global.webkitIDBKeyRange\n };\n} catch (e) {\n domDeps = { indexedDB: null, IDBKeyRange: null };\n}\n","// Import types from the public API\nimport { Dexie as IDexie } from \"../../public/types/dexie\";\nimport { DexieOptions, DexieConstructor } from \"../../public/types/dexie-constructor\";\nimport { DbEvents } from \"../../public/types/db-events\";\n//import { PromiseExtended, PromiseExtendedConstructor } from '../../public/types/promise-extended';\nimport { Table as ITable } from '../../public/types/table';\nimport { TableSchema } from \"../../public/types/table-schema\";\nimport { DbSchema } from '../../public/types/db-schema';\n\n// Internal imports\nimport { Table, TableConstructor, createTableConstructor } from \"../table\";\nimport { Collection, CollectionConstructor, createCollectionConstructor } from '../collection';\nimport { WhereClause } from '../where-clause/where-clause';\nimport { WhereClauseConstructor, createWhereClauseConstructor } from '../where-clause/where-clause-constructor';\nimport { Transaction } from '../transaction';\nimport { TransactionConstructor, createTransactionConstructor } from '../transaction/transaction-constructor';\nimport { Version } from \"../version/version\";\nimport { VersionConstructor, createVersionConstructor } from '../version/version-constructor';\n\n// Other imports...\nimport { DexieEventSet } from '../../public/types/dexie-event-set';\nimport { DexieExceptionClasses } from '../../public/types/errors';\nimport { DexieDOMDependencies } from '../../public/types/dexie-dom-dependencies';\nimport { nop, promisableChain } from '../../functions/chaining-functions';\nimport Promise, { PSD } from '../../helpers/promise';\nimport { extend, override, keys, hasOwn } from '../../functions/utils';\nimport Events from '../../helpers/Events';\nimport { maxString, connections, READONLY, READWRITE } from '../../globals/constants';\nimport { getMaxKey } from '../../functions/quirks';\nimport { exceptions } from '../../errors';\nimport { lowerVersionFirst } from '../version/schema-helpers';\nimport { dexieOpen } from './dexie-open';\nimport { wrap } from '../../helpers/promise';\nimport { _onDatabaseDeleted } from '../../helpers/database-enumerator';\nimport { eventRejectHandler } from '../../functions/event-wrappers';\nimport { extractTransactionArgs, enterTransactionScope } from './transaction-helpers';\nimport { TransactionMode } from '../../public/types/transaction-mode';\nimport { rejection } from '../../helpers/promise';\nimport { usePSD } from '../../helpers/promise';\nimport { DBCore } from '../../public/types/dbcore';\nimport { Middleware, DexieStacks } from '../../public/types/middleware';\nimport { virtualIndexMiddleware } from '../../dbcore/virtual-index-middleware';\nimport { hooksMiddleware } from '../../hooks/hooks-middleware';\nimport { IndexableType } from '../../public';\nimport { observabilityMiddleware } from '../../live-query/observability-middleware';\nimport { cacheExistingValuesMiddleware } from '../../dbcore/cache-existing-values-middleware';\n\nexport interface DbReadyState {\n dbOpenError: any;\n isBeingOpened: boolean;\n onReadyBeingFired: undefined | Function[];\n openComplete: boolean;\n dbReadyResolve: () => void;\n dbReadyPromise: Promise;\n cancelOpen: (reason?: Error) => void;\n openCanceller: Promise & { _stackHolder?: Error };\n autoSchema: boolean;\n vcFired?: boolean;\n PR1398_maxLoop?: number;\n}\n\nexport class Dexie implements IDexie {\n _options: DexieOptions;\n _state: DbReadyState;\n _versions: Version[];\n _storeNames: string[];\n _deps: DexieDOMDependencies;\n _allTables: { [name: string]: Table; };\n _createTransaction: (this: Dexie, mode: IDBTransactionMode, storeNames: ArrayLike, dbschema: { [tableName: string]: TableSchema; }, parentTransaction?: Transaction) => Transaction;\n _dbSchema: { [tableName: string]: TableSchema; };\n _hasGetAll?: boolean;\n _maxKey: IndexableType;\n _fireOnBlocked: (ev: Event) => void;\n _middlewares: {[StackName in keyof DexieStacks]?: Middleware[]} = {};\n _vip?: boolean;\n _novip?: Dexie;// db._novip is to escape to orig db from db.vip.\n core: DBCore;\n\n name: string;\n verno: number = 0;\n idbdb: IDBDatabase | null;\n vip: Dexie;\n on: DbEvents;\n\n Table: TableConstructor;\n WhereClause: WhereClauseConstructor;\n Collection: CollectionConstructor;\n Version: VersionConstructor;\n Transaction: TransactionConstructor;\n\n constructor(name: string, options?: DexieOptions) {\n const deps = (Dexie as any as DexieConstructor).dependencies;\n this._options = options = {\n // Default Options\n addons: (Dexie as any as DexieConstructor).addons, // Pick statically registered addons by default\n autoOpen: true, // Don't require db.open() explicitely.\n // Default DOM dependency implementations from static prop.\n indexedDB: deps.indexedDB, // Backend IndexedDB api. Default to browser env.\n IDBKeyRange: deps.IDBKeyRange, // Backend IDBKeyRange api. Default to browser env.\n ...options\n };\n this._deps = {\n indexedDB: options.indexedDB as IDBFactory,\n IDBKeyRange: options.IDBKeyRange as typeof IDBKeyRange\n };\n const {\n addons,\n } = options;\n this._dbSchema = {};\n this._versions = [];\n this._storeNames = [];\n this._allTables = {};\n this.idbdb = null;\n this._novip = this;\n const state: DbReadyState = {\n dbOpenError: null,\n isBeingOpened: false,\n onReadyBeingFired: null,\n openComplete: false,\n dbReadyResolve: nop,\n dbReadyPromise: null as Promise,\n cancelOpen: nop,\n openCanceller: null as Promise,\n autoSchema: true,\n PR1398_maxLoop: 3\n };\n state.dbReadyPromise = new Promise(resolve => {\n state.dbReadyResolve = resolve;\n });\n state.openCanceller = new Promise((_, reject) => {\n state.cancelOpen = reject;\n });\n this._state = state;\n this.name = name;\n this.on = Events(this, \"populate\", \"blocked\", \"versionchange\", \"close\", { ready: [promisableChain, nop] }) as DbEvents;\n this.on.ready.subscribe = override(this.on.ready.subscribe, subscribe => {\n return (subscriber, bSticky) => {\n (Dexie as any as DexieConstructor).vip(() => {\n const state = this._state;\n if (state.openComplete) {\n // Database already open. Call subscriber asap.\n if (!state.dbOpenError) Promise.resolve().then(subscriber);\n // bSticky: Also subscribe to future open sucesses (after close / reopen) \n if (bSticky) subscribe(subscriber);\n } else if (state.onReadyBeingFired) {\n // db.on('ready') subscribers are currently being executed and have not yet resolved or rejected\n state.onReadyBeingFired.push(subscriber);\n if (bSticky) subscribe(subscriber);\n } else {\n // Database not yet open. Subscribe to it.\n subscribe(subscriber);\n // If bSticky is falsy, make sure to unsubscribe subscriber when fired once.\n const db = this;\n if (!bSticky) subscribe(function unsubscribe() {\n db.on.ready.unsubscribe(subscriber);\n db.on.ready.unsubscribe(unsubscribe);\n });\n }\n });\n }\n });\n\n // Create derived classes bound to this instance of Dexie:\n this.Collection = createCollectionConstructor(this);\n this.Table = createTableConstructor(this);\n this.Transaction = createTransactionConstructor(this);\n this.Version = createVersionConstructor(this);\n this.WhereClause = createWhereClauseConstructor(this);\n\n // Default subscribers to \"versionchange\" and \"blocked\".\n // Can be overridden by custom handlers. If custom handlers return false, these default\n // behaviours will be prevented.\n this.on(\"versionchange\", ev => {\n // Default behavior for versionchange event is to close database connection.\n // Caller can override this behavior by doing db.on(\"versionchange\", function(){ return false; });\n // Let's not block the other window from making it's delete() or open() call.\n // NOTE! This event is never fired in IE,Edge or Safari.\n if (ev.newVersion > 0)\n console.warn(`Another connection wants to upgrade database '${this.name}'. Closing db now to resume the upgrade.`);\n else\n console.warn(`Another connection wants to delete database '${this.name}'. Closing db now to resume the delete request.`);\n this.close();\n // In many web applications, it would be recommended to force window.reload()\n // when this event occurs. To do that, subscribe to the versionchange event\n // and call window.location.reload(true) if ev.newVersion > 0 (not a deletion)\n // The reason for this is that your current web app obviously has old schema code that needs\n // to be updated. Another window got a newer version of the app and needs to upgrade DB but\n // your window is blocking it unless we close it here.\n });\n this.on(\"blocked\", ev => {\n if (!ev.newVersion || ev.newVersion < ev.oldVersion)\n console.warn(`Dexie.delete('${this.name}') was blocked`);\n else\n console.warn(`Upgrade '${this.name}' blocked by other connection holding version ${ev.oldVersion / 10}`);\n });\n\n this._maxKey = getMaxKey(options.IDBKeyRange as typeof IDBKeyRange);\n\n this._createTransaction = (\n mode: IDBTransactionMode,\n storeNames: string[],\n dbschema: DbSchema,\n parentTransaction?: Transaction) => new this.Transaction(mode, storeNames, dbschema, this._options.chromeTransactionDurability, parentTransaction);\n\n this._fireOnBlocked = ev => {\n this.on(\"blocked\").fire(ev);\n // Workaround (not fully*) for missing \"versionchange\" event in IE,Edge and Safari:\n connections\n .filter(c => c.name === this.name && c !== this && !c._state.vcFired)\n .map(c => c.on(\"versionchange\").fire(ev));\n }\n\n // Default middlewares:\n this.use(virtualIndexMiddleware);\n this.use(hooksMiddleware);\n this.use(observabilityMiddleware);\n this.use(cacheExistingValuesMiddleware);\n\n this.vip = Object.create(this, {_vip: {value: true}}) as Dexie;\n\n // Call each addon:\n addons.forEach(addon => addon(this));\n }\n\n version(versionNumber: number): Version {\n if (isNaN(versionNumber) || versionNumber < 0.1) throw new exceptions.Type(`Given version is not a positive number`);\n versionNumber = Math.round(versionNumber * 10) / 10;\n if (this.idbdb || this._state.isBeingOpened)\n throw new exceptions.Schema(\"Cannot add version when database is open\");\n this.verno = Math.max(this.verno, versionNumber);\n const versions = this._versions;\n var versionInstance = versions.filter(\n v => v._cfg.version === versionNumber)[0];\n if (versionInstance) return versionInstance;\n versionInstance = new this.Version(versionNumber);\n versions.push(versionInstance);\n versions.sort(lowerVersionFirst);\n versionInstance.stores({}); // Derive earlier schemas by default.\n // Disable autoschema mode, as at least one version is specified.\n this._state.autoSchema = false;\n return versionInstance;\n }\n\n _whenReady(fn: () => Promise): Promise {\n return (this.idbdb && (this._state.openComplete || PSD.letThrough || this._vip)) ? fn() : new Promise((resolve, reject) => {\n if (this._state.openComplete) {\n // idbdb is falsy but openComplete is true. Must have been an exception durin open.\n // Don't wait for openComplete as it would lead to infinite loop.\n return reject(new exceptions.DatabaseClosed(this._state.dbOpenError));\n }\n if (!this._state.isBeingOpened) {\n if (!this._options.autoOpen) {\n reject(new exceptions.DatabaseClosed());\n return;\n }\n this.open().catch(nop); // Open in background. If if fails, it will be catched by the final promise anyway.\n }\n this._state.dbReadyPromise.then(resolve, reject);\n }).then(fn);\n }\n\n use({stack, create, level, name}: Middleware): this {\n if (name) this.unuse({stack, name}); // Be able to replace existing middleware.\n const middlewares = this._middlewares[stack] || (this._middlewares[stack] = []);\n middlewares.push({stack, create, level: level == null ? 10 : level, name});\n middlewares.sort((a, b) => a.level - b.level);\n // Todo update db.core and db.tables...core ? Or should be expect this to have effect\n // only after next open()?\n return this;\n }\n\n unuse({stack, create}: Middleware<{stack: keyof DexieStacks}>): this;\n unuse({stack, name}: {stack: keyof DexieStacks, name: string}): this;\n unuse({stack, name, create}: {stack: keyof DexieStacks, name?: string, create?: Function}) {\n if (stack && this._middlewares[stack]) {\n this._middlewares[stack] = this._middlewares[stack].filter(mw =>\n create ? mw.create !== create : // Given middleware has a create method. Match that exactly.\n name ? mw.name !== name : // Given middleware spec \n false);\n }\n return this;\n }\n\n open() {\n return dexieOpen(this);\n }\n\n _close(): void {\n const state = this._state;\n const idx = connections.indexOf(this);\n if (idx >= 0) connections.splice(idx, 1);\n if (this.idbdb) {\n try { this.idbdb.close(); } catch (e) { }\n this._novip.idbdb = null; // db._novip is because db can be an Object.create(origDb).\n } \n // Reset dbReadyPromise promise:\n state.dbReadyPromise = new Promise(resolve => {\n state.dbReadyResolve = resolve;\n });\n state.openCanceller = new Promise((_, reject) => {\n state.cancelOpen = reject;\n });\n }\n\n close(): void {\n this._close();\n const state = this._state;\n this._options.autoOpen = false;\n state.dbOpenError = new exceptions.DatabaseClosed();\n if (state.isBeingOpened)\n state.cancelOpen(state.dbOpenError);\n }\n\n delete(): Promise {\n const hasArguments = arguments.length > 0;\n const state = this._state;\n return new Promise((resolve, reject) => {\n const doDelete = () => {\n this.close();\n var req = this._deps.indexedDB.deleteDatabase(this.name);\n req.onsuccess = wrap(() => {\n _onDatabaseDeleted(this._deps, this.name);\n resolve();\n });\n req.onerror = eventRejectHandler(reject);\n req.onblocked = this._fireOnBlocked;\n }\n\n if (hasArguments) throw new exceptions.InvalidArgument(\"Arguments not allowed in db.delete()\");\n if (state.isBeingOpened) {\n state.dbReadyPromise.then(doDelete);\n } else {\n doDelete();\n }\n });\n }\n\n backendDB() {\n return this.idbdb;\n }\n\n isOpen() {\n return this.idbdb !== null;\n }\n\n hasBeenClosed() {\n const dbOpenError = this._state.dbOpenError;\n return dbOpenError && (dbOpenError.name === 'DatabaseClosed');\n }\n\n hasFailed() {\n return this._state.dbOpenError !== null;\n }\n\n dynamicallyOpened() {\n return this._state.autoSchema;\n }\n\n get tables () {\n return keys(this._allTables).map(name => this._allTables[name]);\n }\n\n transaction(): Promise {\n const args = extractTransactionArgs.apply(this, arguments);\n return this._transaction.apply(this, args);\n }\n\n _transaction(mode: TransactionMode, tables: Array, scopeFunc: Function) {\n let parentTransaction = PSD.trans as Transaction | undefined;\n // Check if parent transactions is bound to this db instance, and if caller wants to reuse it\n if (!parentTransaction || parentTransaction.db !== this || mode.indexOf('!') !== -1) parentTransaction = null;\n const onlyIfCompatible = mode.indexOf('?') !== -1;\n mode = mode.replace('!', '').replace('?', '') as TransactionMode; // Ok. Will change arguments[0] as well but we wont touch arguments henceforth.\n let idbMode: IDBTransactionMode,\n storeNames;\n\n try {\n //\n // Get storeNames from arguments. Either through given table instances, or through given table names.\n //\n storeNames = tables.map(table => {\n var storeName = table instanceof this.Table ? table.name : table;\n if (typeof storeName !== 'string') throw new TypeError(\"Invalid table argument to Dexie.transaction(). Only Table or String are allowed\");\n return storeName;\n });\n\n //\n // Resolve mode. Allow shortcuts \"r\" and \"rw\".\n //\n if (mode == \"r\" || mode === READONLY)\n idbMode = READONLY;\n else if (mode == \"rw\" || mode == READWRITE)\n idbMode = READWRITE;\n else\n throw new exceptions.InvalidArgument(\"Invalid transaction mode: \" + mode);\n\n if (parentTransaction) {\n // Basic checks\n if (parentTransaction.mode === READONLY && idbMode === READWRITE) {\n if (onlyIfCompatible) {\n // Spawn new transaction instead.\n parentTransaction = null; \n }\n else throw new exceptions.SubTransaction(\"Cannot enter a sub-transaction with READWRITE mode when parent transaction is READONLY\");\n }\n if (parentTransaction) {\n storeNames.forEach(storeName => {\n if (parentTransaction && parentTransaction.storeNames.indexOf(storeName) === -1) {\n if (onlyIfCompatible) {\n // Spawn new transaction instead.\n parentTransaction = null; \n }\n else throw new exceptions.SubTransaction(\"Table \" + storeName +\n \" not included in parent transaction.\");\n }\n });\n }\n if (onlyIfCompatible && parentTransaction && !parentTransaction.active) {\n // '?' mode should not keep using an inactive transaction.\n parentTransaction = null;\n }\n }\n } catch (e) {\n return parentTransaction ?\n parentTransaction._promise(null, (_, reject) => {reject(e);}) :\n rejection (e);\n }\n // If this is a sub-transaction, lock the parent and then launch the sub-transaction.\n const enterTransaction = enterTransactionScope.bind(null, this, idbMode, storeNames, parentTransaction, scopeFunc);\n return (parentTransaction ?\n parentTransaction._promise(idbMode, enterTransaction, \"lock\") :\n PSD.trans ?\n // no parent transaction despite PSD.trans exists. Make sure also\n // that the zone we create is not a sub-zone of current, because\n // Promise.follow() should not wait for it if so.\n usePSD(PSD.transless, ()=>this._whenReady(enterTransaction)) :\n this._whenReady (enterTransaction));\n }\n\n table(tableName: string): Table;\n table(tableName: string): ITable;\n table(tableName: string): Table {\n if (!hasOwn(this._allTables, tableName)) {\n throw new exceptions.InvalidTable(`Table ${tableName} does not exist`); }\n return this._allTables[tableName];\n }\n}\n","import { Dexie } from '../../classes/dexie';\nimport { makeClassConstructor } from '../../functions/make-class-constructor';\nimport { Collection } from './collection';\nimport { WhereClause } from '../where-clause/where-clause';\nimport { AnyRange } from '../../dbcore/keyrange';\nimport { DBCoreKeyRange } from '../../public/types/dbcore';\nimport { mirror } from '../../functions/chaining-functions';\n\n/** Constructs a Collection instance. */\nexport interface CollectionConstructor {\n new(whereClause?: WhereClause | null, keyRangeGenerator?: () => DBCoreKeyRange): Collection;\n prototype: Collection;\n}\n\n/** Generates a Collection constructor bound to given Dexie instance.\n * \n * The purpose of having dynamically created constructors, is to allow\n * addons to extend classes for a certain Dexie instance without affecting\n * other db instances.\n */\nexport function createCollectionConstructor(db: Dexie) {\n return makeClassConstructor(\n Collection.prototype,\n\n function Collection(\n this: Collection,\n whereClause?: WhereClause | null,\n keyRangeGenerator?: () => DBCoreKeyRange)\n {\n this.db = db;\n let keyRange = AnyRange, error = null;\n if (keyRangeGenerator) try {\n keyRange = keyRangeGenerator();\n } catch (ex) {\n error = ex;\n }\n\n const whereCtx = whereClause._ctx;\n const table = whereCtx.table;\n const readingHook = table.hook.reading.fire;\n this._ctx = {\n table: table,\n index: whereCtx.index,\n isPrimKey: (!whereCtx.index || (table.schema.primKey.keyPath && whereCtx.index === table.schema.primKey.name)),\n range: keyRange,\n keysOnly: false,\n dir: \"next\",\n unique: \"\",\n algorithm: null,\n filter: null,\n replayFilter: null,\n justLimit: true, // True if a replayFilter is just a filter that performs a \"limit\" operation (or none at all)\n isMatch: null,\n offset: 0,\n limit: Infinity,\n error: error, // If set, any promise must be rejected with this error\n or: whereCtx.or,\n valueMapper: readingHook !== mirror ? readingHook : null\n };\n }\n );\n}\n","import { Dexie } from '../dexie';\nimport { TableSchema } from '../../public/types/table-schema';\nimport { Transaction } from '../transaction/transaction';\nimport { hookCreatingChain, pureFunctionChain, nop, mirror, hookUpdatingChain, hookDeletingChain } from '../../functions/chaining-functions';\nimport { TableHooks } from '../../public/types/table-hooks';\nimport { Table } from './table';\nimport Events from '../../helpers/Events';\nimport { makeClassConstructor } from '../../functions/make-class-constructor';\n\nexport interface TableConstructor {\n new (name: string, tableSchema: TableSchema, optionalTrans?: Transaction) : Table;\n prototype: Table;\n}\n\n/** Generates a Table constructor bound to given Dexie instance.\n * \n * The purpose of having dynamically created constructors, is to allow\n * addons to extend classes for a certain Dexie instance without affecting\n * other db instances.\n */\nexport function createTableConstructor (db: Dexie) {\n return makeClassConstructor(\n Table.prototype,\n\n function Table (this: Table, name: string, tableSchema: TableSchema, trans?: Transaction) {\n this.db = db;\n this._tx = trans;\n this.name = name;\n this.schema = tableSchema;\n this.hook = db._allTables[name] ? db._allTables[name].hook : Events(null, {\n \"creating\": [hookCreatingChain, nop],\n \"reading\": [pureFunctionChain, mirror],\n \"updating\": [hookUpdatingChain, nop],\n \"deleting\": [hookDeletingChain, nop]\n }) as TableHooks;\n }\n\n );\n}\n","import { Dexie } from '../dexie';\nimport { makeClassConstructor } from '../../functions/make-class-constructor';\nimport { Transaction } from './transaction';\nimport { DbSchema } from '../../public/types/db-schema';\nimport Events from '../../helpers/Events';\nimport Promise, { rejection } from '../../helpers/promise';\n\nexport interface TransactionConstructor {\n new (\n mode: IDBTransactionMode,\n storeNames: string[],\n dbschema: DbSchema,\n chromeTransactionDurability: ChromeTransactionDurability,\n parent?: Transaction) : T;\n prototype: T;\n}\n\n/** Generates a Transaction constructor bound to given Dexie instance.\n * \n * The purpose of having dynamically created constructors, is to allow\n * addons to extend classes for a certain Dexie instance without affecting\n * other db instances.\n */\nexport function createTransactionConstructor(db: Dexie) {\n return makeClassConstructor>(\n Transaction.prototype,\n function Transaction (\n this: Transaction,\n mode: IDBTransactionMode,\n storeNames: string[],\n dbschema: DbSchema,\n chromeTransactionDurability: ChromeTransactionDurability,\n parent?: Transaction)\n {\n this.db = db;\n this.mode = mode;\n this.storeNames = storeNames;\n this.schema = dbschema;\n this.chromeTransactionDurability = chromeTransactionDurability;\n this.idbtrans = null;\n this.on = Events(this, \"complete\", \"error\", \"abort\");\n this.parent = parent || null;\n this.active = true;\n this._reculock = 0;\n this._blockedFuncs = [];\n this._resolve = null;\n this._reject = null;\n this._waitingFor = null;\n this._waitingQueue = null;\n this._spinCount = 0; // Just for debugging waitFor()\n this._completion = new Promise ((resolve, reject) => {\n this._resolve = resolve;\n this._reject = reject;\n });\n \n this._completion.then(\n ()=> {\n this.active = false;\n this.on.complete.fire();\n },\n e => {\n var wasActive = this.active;\n this.active = false;\n this.on.error.fire(e);\n this.parent ?\n this.parent._reject(e) :\n wasActive && this.idbtrans && this.idbtrans.abort();\n return rejection(e); // Indicate we actually DO NOT catch this error.\n });\n \n });\n}\n","import { Dexie } from '../dexie';\nimport { makeClassConstructor } from '../../functions/make-class-constructor';\nimport { Version } from './version';\n\nexport interface VersionConstructor {\n new(versionNumber: number): Version;\n prototype: Version;\n}\n\n/** Generates a Version constructor bound to given Dexie instance.\n * \n * The purpose of having dynamically created constructors, is to allow\n * addons to extend classes for a certain Dexie instance without affecting\n * other db instances.\n */\nexport function createVersionConstructor(db: Dexie) {\n return makeClassConstructor(\n Version.prototype,\n\n function Version(this: Version, versionNumber: number) {\n this.db = db;\n this._cfg = {\n version: versionNumber,\n storesSource: null,\n dbschema: {},\n tables: {},\n contentUpgrade: null\n };\n });\n\n}\n","import { Dexie } from '../dexie';\nimport { makeClassConstructor } from '../../functions/make-class-constructor';\nimport { WhereClause } from './where-clause';\nimport { Table } from '../table';\nimport { Collection } from '../collection';\nimport { exceptions } from '../../errors';\n\nexport interface WhereClauseConstructor {\n new(table: Table, index?: string, orCollection?: Collection): WhereClause;\n prototype: WhereClause;\n}\n\n/** Generates a WhereClause constructor.\n * \n * The purpose of having dynamically created constructors, is to allow\n * addons to extend classes for a certain Dexie instance without affecting\n * other db instances.\n */\nexport function createWhereClauseConstructor(db: Dexie) {\n return makeClassConstructor(\n WhereClause.prototype,\n\n function WhereClause(this: WhereClause, table: Table, index?: string, orCollection?: Collection) {\n this.db = db;\n this._ctx = {\n table: table,\n index: index === \":id\" ? null : index,\n or: orCollection\n };\n const indexedDB = db._deps.indexedDB;\n if (!indexedDB) throw new exceptions.MissingAPI();\n this._cmp = this._ascending = indexedDB.cmp.bind(indexedDB);\n this._descending = (a, b) => indexedDB.cmp(b, a);\n this._max = (a, b) => indexedDB.cmp(a,b) > 0 ? a : b;\n this._min = (a, b) => indexedDB.cmp(a,b) < 0 ? a : b;\n this._IDBKeyRange = db._deps.IDBKeyRange;\n }\n );\n}\n","import { Dexie } from './dexie';\nimport * as Debug from '../../helpers/debug';\nimport { rejection } from '../../helpers/promise';\nimport { exceptions } from '../../errors';\nimport { eventRejectHandler, preventDefault } from '../../functions/event-wrappers';\nimport Promise, { wrap } from '../../helpers/promise';\nimport { connections } from '../../globals/constants';\nimport { runUpgraders, readGlobalSchema, adjustToExistingIndexNames, verifyInstalledSchema } from '../version/schema-helpers';\nimport { safariMultiStoreFix } from '../../functions/quirks';\nimport { _onDatabaseCreated } from '../../helpers/database-enumerator';\nimport { vip } from './vip';\nimport { promisableChain, nop } from '../../functions/chaining-functions';\nimport { generateMiddlewareStacks } from './generate-middleware-stacks';\nimport { slice } from '../../functions/utils';\nimport safari14Workaround from 'safari-14-idb-fix';\n\nexport function dexieOpen (db: Dexie) {\n const state = db._state;\n const {indexedDB} = db._deps;\n if (state.isBeingOpened || db.idbdb)\n return state.dbReadyPromise.then(() => state.dbOpenError ?\n rejection (state.dbOpenError) :\n db);\n Debug.debug && (state.openCanceller._stackHolder = Debug.getErrorWithStack()); // Let stacks point to when open() was called rather than where new Dexie() was called.\n state.isBeingOpened = true;\n state.dbOpenError = null;\n state.openComplete = false;\n const openCanceller = state.openCanceller;\n\n function throwIfCancelled() {\n // If state.openCanceller object reference is replaced, it means db.close() has been called,\n // meaning this open flow should be cancelled.\n if (state.openCanceller !== openCanceller) throw new exceptions.DatabaseClosed('db.open() was cancelled');\n }\n \n // Function pointers to call when the core opening process completes.\n let resolveDbReady = state.dbReadyResolve,\n // upgradeTransaction to abort on failure.\n upgradeTransaction: (IDBTransaction | null) = null,\n wasCreated = false;\n \n // safari14Workaround = Workaround by jakearchibald for new nasty bug in safari 14.\n return Promise.race([openCanceller, (typeof navigator === 'undefined' ? Promise.resolve() : safari14Workaround()).then(() => new Promise((resolve, reject) => {\n // Multiply db.verno with 10 will be needed to workaround upgrading bug in IE:\n // IE fails when deleting objectStore after reading from it.\n // A future version of Dexie.js will stopover an intermediate version to workaround this.\n // At that point, we want to be backward compatible. Could have been multiplied with 2, but by using 10, it is easier to map the number to the real version number.\n \n throwIfCancelled();\n // If no API, throw!\n if (!indexedDB) throw new exceptions.MissingAPI();\n const dbName = db.name;\n \n const req = state.autoSchema ?\n indexedDB.open(dbName) :\n indexedDB.open(dbName, Math.round(db.verno * 10));\n if (!req) throw new exceptions.MissingAPI(); // May happen in Safari private mode, see https://github.com/dfahlander/Dexie.js/issues/134\n req.onerror = eventRejectHandler(reject);\n req.onblocked = wrap(db._fireOnBlocked);\n req.onupgradeneeded = wrap (e => {\n upgradeTransaction = req.transaction;\n if (state.autoSchema && !db._options.allowEmptyDB) { // Unless an addon has specified db._allowEmptyDB, lets make the call fail.\n // Caller did not specify a version or schema. Doing that is only acceptable for opening alread existing databases.\n // If onupgradeneeded is called it means database did not exist. Reject the open() promise and make sure that we\n // do not create a new database by accident here.\n req.onerror = preventDefault; // Prohibit onabort error from firing before we're done!\n upgradeTransaction.abort(); // Abort transaction (would hope that this would make DB disappear but it doesnt.)\n // Close database and delete it.\n req.result.close();\n const delreq = indexedDB.deleteDatabase(dbName); // The upgrade transaction is atomic, and javascript is single threaded - meaning that there is no risk that we delete someone elses database here!\n delreq.onsuccess = delreq.onerror = wrap(() => {\n reject (new exceptions.NoSuchDatabase(`Database ${dbName} doesnt exist`));\n });\n } else {\n upgradeTransaction.onerror = eventRejectHandler(reject);\n var oldVer = e.oldVersion > Math.pow(2, 62) ? 0 : e.oldVersion; // Safari 8 fix.\n wasCreated = oldVer < 1;\n db._novip.idbdb = req.result;// db._novip is because db can be an Object.create(origDb).\n runUpgraders(db, oldVer / 10, upgradeTransaction, reject);\n }\n }, reject);\n \n req.onsuccess = wrap (() => {\n // Core opening procedure complete. Now let's just record some stuff.\n upgradeTransaction = null;\n const idbdb = db._novip.idbdb = req.result; // db._novip is because db can be an Object.create(origDb).\n\n const objectStoreNames = slice(idbdb.objectStoreNames);\n if (objectStoreNames.length > 0) try {\n const tmpTrans = idbdb.transaction(safariMultiStoreFix(objectStoreNames), 'readonly');\n if (state.autoSchema) readGlobalSchema(db, idbdb, tmpTrans);\n else {\n adjustToExistingIndexNames(db, db._dbSchema, tmpTrans);\n if (!verifyInstalledSchema(db, tmpTrans)) {\n console.warn(`Dexie SchemaDiff: Schema was extended without increasing the number passed to db.version(). Some queries may fail.`);\n }\n }\n generateMiddlewareStacks(db, tmpTrans);\n } catch (e) {\n // Safari 8 may bail out if > 1 store names. However, this shouldnt be a showstopper. Issue #120.\n // BUGBUG: It will bail out anyway as of Dexie 3.\n // Should we support Safari 8 anymore? Believe all\n // Dexie users use the shim for that platform anyway?!\n // If removing Safari 8 support, go ahead and remove the safariMultiStoreFix() function\n // as well as absurd upgrade version quirk for Safari.\n }\n \n connections.push(db); // Used for emulating versionchange event on IE/Edge/Safari.\n \n idbdb.onversionchange = wrap(ev => {\n state.vcFired = true; // detect implementations that not support versionchange (IE/Edge/Safari)\n db.on(\"versionchange\").fire(ev);\n });\n \n idbdb.onclose = wrap(ev => {\n db.on(\"close\").fire(ev);\n });\n\n if (wasCreated) _onDatabaseCreated(db._deps, dbName);\n\n resolve();\n\n }, reject);\n }))]).then(() => {\n // Before finally resolving the dbReadyPromise and this promise,\n // call and await all on('ready') subscribers:\n // Dexie.vip() makes subscribers able to use the database while being opened.\n // This is a must since these subscribers take part of the opening procedure.\n throwIfCancelled();\n state.onReadyBeingFired = [];\n return Promise.resolve(vip(()=>db.on.ready.fire(db.vip))).then(function fireRemainders() {\n if (state.onReadyBeingFired.length > 0) {\n // In case additional subscribers to db.on('ready') were added during the time db.on.ready.fire was executed.\n let remainders = state.onReadyBeingFired.reduce(promisableChain, nop);\n state.onReadyBeingFired = [];\n return Promise.resolve(vip(()=>remainders(db.vip))).then(fireRemainders)\n }\n });\n }).finally(()=>{\n state.onReadyBeingFired = null;\n state.isBeingOpened = false;\n }).then(()=>{\n // Resolve the db.open() with the db instance.\n return db;\n }).catch(err => {\n state.dbOpenError = err; // Record the error. It will be used to reject further promises of db operations.\n try {\n // Did we fail within onupgradeneeded? Make sure to abort the upgrade transaction so it doesnt commit.\n upgradeTransaction && upgradeTransaction.abort();\n } catch { }\n if (openCanceller === state.openCanceller) {\n // Still in the same open flow - The error reason was not due to external call to db.close().\n // Make sure to call db.close() to finalize resources.\n db._close(); // Closes and resets idbdb, removes connections, resets dbReadyPromise and openCanceller so that a later db.open() is fresh.\n }\n return rejection (err);\n }).finally(()=>{\n state.openComplete = true;\n resolveDbReady(); // dbReadyPromise is resolved no matter if open() rejects or resolved. It's just to wake up waiters.\n });\n}\n","import {\n Observable as IObservable,\n Observer,\n Subscription,\n} from \"../../public/types/observable\";\n\nconst symbolObservable: typeof Symbol.observable =\n typeof Symbol !== \"undefined\" && \"observable\" in Symbol\n ? Symbol.observable\n : \"@@observable\" as any;\n\nexport class Observable implements IObservable {\n private _subscribe: (observer: Observer) => Subscription;\n constructor(subscribe: (observer: Observer) => Subscription) {\n this._subscribe = subscribe;\n }\n\n subscribe(\n onNext?: ((value: T) => void) | null,\n onError?: ((error: any) => void) | null,\n onComplete?: (() => void) | null\n ): Subscription;\n subscribe(observer?: Observer | null): Subscription;\n subscribe(x?: any, error?: any, complete?: any): Subscription {\n return this._subscribe(\n !x || typeof x === \"function\" ? { next: x, error, complete } : x\n );\n }\n\n [symbolObservable]() {\n return this;\n }\n}\n","import { deepClone, keys } from \"../functions/utils\";\nimport { mergeRanges, RangeSet } from \"../helpers/rangeset\";\nimport { ObservabilitySet } from \"../public/types/db-events\";\n\nexport function extendObservabilitySet(\n target: ObservabilitySet,\n newSet: ObservabilitySet\n): ObservabilitySet {\n keys(newSet).forEach(part => {\n const rangeSet = target[part] || (target[part] = new RangeSet());\n mergeRanges(rangeSet, newSet[part]);\n });\n return target;\n}\n","import { Dexie as _Dexie } from './dexie';\nimport { _global } from '../../globals/global';\nimport { props, derive, extend, override, getByKeyPath, setByKeyPath, delByKeyPath, shallowClone, deepClone, asap } from '../../functions/utils';\nimport { getObjectDiff } from \"../../functions/get-object-diff\";\nimport { fullNameExceptions } from '../../errors';\nimport { DexieConstructor } from '../../public/types/dexie-constructor';\nimport { getDatabaseNames } from '../../helpers/database-enumerator';\nimport { PSD } from '../../helpers/promise';\nimport { usePSD } from '../../helpers/promise';\nimport { newScope } from '../../helpers/promise';\nimport { rejection } from '../../helpers/promise';\nimport { awaitIterator } from '../../helpers/yield-support';\nimport Promise from '../../helpers/promise';\nimport * as Debug from '../../helpers/debug';\nimport { dexieStackFrameFilter, minKey, connections, DEXIE_VERSION } from '../../globals/constants';\nimport Events from '../../helpers/Events';\nimport { exceptions } from '../../errors';\nimport { errnames } from '../../errors';\nimport { getMaxKey } from '../../functions/quirks';\nimport { vip } from './vip';\nimport { globalEvents } from '../../globals/global-events';\nimport { liveQuery } from '../../live-query/live-query';\nimport { extendObservabilitySet } from '../../live-query/extend-observability-set';\nimport { domDeps } from './dexie-dom-dependencies';\nimport { cmp } from '../../functions/cmp';\n\n/* (Dexie) is an instance of DexieConstructor, as defined in public/types/dexie-constructor.d.ts\n* (new Dexie()) is an instance of Dexie, as defined in public/types/dexie.d.ts\n* \n* Why we're doing this?\n\n* Because we've choosen to define the public Dexie API using a DexieConstructor interface\n* rather than declaring a class. On that interface, all static props are defined.\n* In practice, class Dexie's constructor implements DexieConstructor and all member props\n* are defined in interface Dexie. We could say, it's a typescript limitation of not being\n* able to define a static interface that forces us to do the cast below.\n*/\nconst Dexie = _Dexie as any as DexieConstructor;\n\n//\n// Set all static methods and properties onto Dexie:\n// \nprops(Dexie, {\n\n // Dexie.BulkError = class BulkError {...};\n // Dexie.XXXError = class XXXError {...};\n ...fullNameExceptions,\n\n //\n // Static delete() method.\n //\n delete(databaseName: string) {\n const db = new Dexie(databaseName, {addons: []});\n return db.delete();\n },\n\n //\n // Static exists() method.\n //\n exists(name: string) {\n return new Dexie(name, { addons: [] }).open().then(db => {\n db.close();\n return true;\n }).catch('NoSuchDatabaseError', () => false);\n },\n\n //\n // Static method for retrieving a list of all existing databases at current host.\n //\n getDatabaseNames(cb) {\n try {\n return getDatabaseNames(Dexie.dependencies).then(cb);\n } catch {\n return rejection(new exceptions.MissingAPI());\n }\n },\n\n /** @deprecated */\n defineClass() {\n function Class(content) {\n extend(this, content);\n }\n return Class;\n },\n\n ignoreTransaction(scopeFunc) {\n // In case caller is within a transaction but needs to create a separate transaction.\n // Example of usage:\n //\n // Let's say we have a logger function in our app. Other application-logic should be unaware of the\n // logger function and not need to include the 'logentries' table in all transaction it performs.\n // The logging should always be done in a separate transaction and not be dependant on the current\n // running transaction context. Then you could use Dexie.ignoreTransaction() to run code that starts a new transaction.\n //\n // Dexie.ignoreTransaction(function() {\n // db.logentries.add(newLogEntry);\n // });\n //\n // Unless using Dexie.ignoreTransaction(), the above example would try to reuse the current transaction\n // in current Promise-scope.\n //\n // An alternative to Dexie.ignoreTransaction() would be setImmediate() or setTimeout(). The reason we still provide an\n // API for this because\n // 1) The intention of writing the statement could be unclear if using setImmediate() or setTimeout().\n // 2) setTimeout() would wait unnescessary until firing. This is however not the case with setImmediate().\n // 3) setImmediate() is not supported in the ES standard.\n // 4) You might want to keep other PSD state that was set in a parent PSD, such as PSD.letThrough.\n return PSD.trans ?\n usePSD(PSD.transless, scopeFunc) : // Use the closest parent that was non-transactional.\n scopeFunc(); // No need to change scope because there is no ongoing transaction.\n },\n\n vip,\n\n async: function (generatorFn: Function) {\n return function () {\n try {\n var rv = awaitIterator(generatorFn.apply(this, arguments));\n if (!rv || typeof rv.then !== 'function')\n return Promise.resolve(rv);\n return rv;\n } catch (e) {\n return rejection(e);\n }\n };\n },\n\n spawn: function (generatorFn, args, thiz) {\n try {\n var rv = awaitIterator(generatorFn.apply(thiz, args || []));\n if (!rv || typeof rv.then !== 'function')\n return Promise.resolve(rv);\n return rv;\n } catch (e) {\n return rejection(e);\n }\n },\n\n // Dexie.currentTransaction property\n currentTransaction: {\n get: () => PSD.trans || null\n },\n\n waitFor: function (promiseOrFunction, optionalTimeout) {\n // If a function is provided, invoke it and pass the returning value to Transaction.waitFor()\n const promise = Promise.resolve(\n typeof promiseOrFunction === 'function' ?\n Dexie.ignoreTransaction(promiseOrFunction) :\n promiseOrFunction)\n .timeout(optionalTimeout || 60000); // Default the timeout to one minute. Caller may specify Infinity if required. \n\n // Run given promise on current transaction. If no current transaction, just return a Dexie promise based\n // on given value.\n return PSD.trans ?\n PSD.trans.waitFor(promise) :\n promise;\n },\n\n // Export our Promise implementation since it can be handy as a standalone Promise implementation\n Promise: Promise,\n\n // Dexie.debug proptery:\n // Dexie.debug = false\n // Dexie.debug = true\n // Dexie.debug = \"dexie\" - don't hide dexie's stack frames.\n debug: {\n get: () => Debug.debug,\n set: value => {\n Debug.setDebug(value, value === 'dexie' ? () => true : dexieStackFrameFilter);\n }\n },\n\n // Export our derive/extend/override methodology\n derive: derive, // Deprecate?\n extend: extend, // Deprecate?\n props: props,\n override: override, // Deprecate?\n // Export our Events() function - can be handy as a toolkit\n Events: Events,\n on: globalEvents,\n liveQuery,\n extendObservabilitySet,\n // Utilities\n getByKeyPath: getByKeyPath,\n setByKeyPath: setByKeyPath,\n delByKeyPath: delByKeyPath,\n shallowClone: shallowClone,\n deepClone: deepClone,\n getObjectDiff: getObjectDiff,\n cmp,\n asap: asap,\n //maxKey: new Dexie('',{addons:[]})._maxKey,\n minKey: minKey,\n // Addon registry\n addons: [],\n // Global DB connection list\n connections: connections,\n\n //MultiModifyError: exceptions.Modify, // Obsolete!\n errnames: errnames,\n\n // Export other static classes\n //IndexSpec: IndexSpec, Obsolete!\n //TableSchema: TableSchema, Obsolete!\n\n //\n // Dependencies\n //\n // These will automatically work in browsers with indexedDB support, or where an indexedDB polyfill has been included.\n //\n // In node.js, however, these properties must be set \"manually\" before instansiating a new Dexie().\n // For node.js, you need to require indexeddb-js or similar and then set these deps.\n //\n dependencies: domDeps,\n\n // API Version Number: Type Number, make sure to always set a version number that can be comparable correctly. Example: 0.9, 0.91, 0.92, 1.0, 1.01, 1.1, 1.2, 1.21, etc.\n semVer: DEXIE_VERSION,\n version: DEXIE_VERSION.split('.')\n .map(n => parseInt(n))\n .reduce((p, c, i) => p + (c / Math.pow(10, i * 2))),\n\n // https://github.com/dfahlander/Dexie.js/issues/186\n // typescript compiler tsc in mode ts-->es5 & commonJS, will expect require() to return\n // x.default. Workaround: Set Dexie.default = Dexie.\n // default: Dexie, // Commented because solved in index-umd.ts instead.\n // Make it possible to import {Dexie} (non-default import)\n // Reason 1: May switch to that in future.\n // Reason 2: We declare it both default and named exported in d.ts to make it possible\n // to let addons extend the Dexie interface with Typescript 2.1 (works only when explicitely\n // exporting the symbol, not just default exporting)\n // Dexie: Dexie // Commented because solved in index-umd.ts instead.\n});\n\nDexie.maxKey = getMaxKey(Dexie.dependencies.IDBKeyRange);\n","import { isIEOrEdge } from '../globals/constants';\nimport { globalEvents, DEXIE_STORAGE_MUTATED_EVENT_NAME, STORAGE_MUTATED_DOM_EVENT_NAME } from '../globals/global-events';\nimport { ObservabilitySet } from \"../public/types/db-events\";\n\nif (typeof dispatchEvent !== 'undefined' && typeof addEventListener !== 'undefined') {\n globalEvents(DEXIE_STORAGE_MUTATED_EVENT_NAME, updatedParts => {\n if (!propagatingLocally) {\n let event: CustomEvent;\n if (isIEOrEdge) {\n event = document.createEvent('CustomEvent');\n event.initCustomEvent(STORAGE_MUTATED_DOM_EVENT_NAME, true, true, updatedParts);\n } else {\n event = new CustomEvent(STORAGE_MUTATED_DOM_EVENT_NAME, {\n detail: updatedParts\n });\n }\n propagatingLocally = true;\n dispatchEvent(event);\n propagatingLocally = false;\n }\n });\n addEventListener(STORAGE_MUTATED_DOM_EVENT_NAME, ({detail}: CustomEvent) => {\n if (!propagatingLocally) {\n propagateLocally(detail);\n }\n });\n}\n\nexport function propagateLocally(updateParts: ObservabilitySet) {\n let wasMe = propagatingLocally;\n try {\n propagatingLocally = true;\n globalEvents.storagemutated.fire(updateParts);\n } finally {\n propagatingLocally = wasMe;\n }\n}\n\nexport let propagatingLocally = false;\n","import { isAsyncFunction, keys } from \"../functions/utils\";\nimport { globalEvents, DEXIE_STORAGE_MUTATED_EVENT_NAME } from \"../globals/global-events\";\nimport {\n decrementExpectedAwaits,\n incrementExpectedAwaits,\n newScope,\n PSD,\n usePSD,\n} from \"../helpers/promise\";\nimport { ObservabilitySet } from \"../public/types/db-events\";\nimport {\n Observable as IObservable,\n Subscription,\n} from \"../public/types/observable\";\nimport { Observable } from \"../classes/observable/observable\";\nimport { extendObservabilitySet } from \"./extend-observability-set\";\nimport { rangesOverlap } from \"../helpers/rangeset\";\n\nexport function liveQuery(querier: () => T | Promise): IObservable {\n return new Observable((observer) => {\n const scopeFuncIsAsync = isAsyncFunction(querier);\n function execute(subscr: ObservabilitySet) {\n if (scopeFuncIsAsync) {\n incrementExpectedAwaits();\n }\n const exec = () => newScope(querier, { subscr, trans: null });\n const rv = PSD.trans\n ? // Ignore current transaction if active when calling subscribe().\n usePSD(PSD.transless, exec)\n : exec();\n if (scopeFuncIsAsync) {\n (rv as Promise).then(\n decrementExpectedAwaits,\n decrementExpectedAwaits\n );\n }\n return rv;\n }\n\n let closed = false;\n\n let accumMuts: ObservabilitySet = {};\n let currentObs: ObservabilitySet = {};\n\n const subscription: Subscription = {\n get closed() {\n return closed;\n },\n unsubscribe: () => {\n closed = true;\n globalEvents.storagemutated.unsubscribe(mutationListener);\n },\n };\n\n observer.start && observer.start(subscription); // https://github.com/tc39/proposal-observable\n\n let querying = false,\n startedListening = false;\n\n function shouldNotify() {\n return keys(currentObs).some(\n (key) =>\n accumMuts[key] && rangesOverlap(accumMuts[key], currentObs[key])\n );\n }\n\n const mutationListener = (parts: ObservabilitySet) => {\n extendObservabilitySet(accumMuts, parts);\n if (shouldNotify()) {\n doQuery();\n }\n };\n\n const doQuery = () => {\n if (querying || closed) return;\n accumMuts = {};\n const subscr: ObservabilitySet = {};\n const ret = execute(subscr);\n if (!startedListening) {\n globalEvents(DEXIE_STORAGE_MUTATED_EVENT_NAME, mutationListener);\n startedListening = true;\n }\n querying = true;\n Promise.resolve(ret).then(\n (result) => {\n querying = false;\n if (closed) return;\n if (shouldNotify()) {\n // Mutations has happened while we were querying. Redo query.\n doQuery();\n } else {\n accumMuts = {};\n // Update what we are subscribing for based on this last run:\n currentObs = subscr;\n observer.next && observer.next(result);\n }\n },\n (err) => {\n querying = false;\n observer.error && observer.error(err);\n subscription.unsubscribe();\n }\n );\n };\n\n doQuery();\n return subscription;\n });\n}\n","import {\n globalEvents,\n STORAGE_MUTATED_DOM_EVENT_NAME,\n DEXIE_STORAGE_MUTATED_EVENT_NAME,\n} from '../globals/global-events';\nimport { propagateLocally, propagatingLocally } from './propagate-locally';\n\nif (typeof BroadcastChannel !== 'undefined') {\n const bc = new BroadcastChannel(STORAGE_MUTATED_DOM_EVENT_NAME);\n\n //\n // Propagate local changes to remote tabs, windows and workers via BroadcastChannel\n //\n globalEvents(DEXIE_STORAGE_MUTATED_EVENT_NAME, (changedParts) => {\n if (!propagatingLocally) {\n bc.postMessage(changedParts);\n }\n });\n\n //\n // Propagate remote changes locally via storage event:\n //\n bc.onmessage = (ev) => {\n if (ev.data) propagateLocally(ev.data);\n };\n} else if (typeof self !== 'undefined' && typeof navigator !== 'undefined') {\n // DOM verified - when typeof self !== \"undefined\", we are a window or worker. Not a Node process.\n\n //\n // Propagate local changes to remote tabs/windows via storage event and service worker\n // via messages. We have this code here because of https://bugs.webkit.org/show_bug.cgi?id=161472.\n //\n globalEvents(DEXIE_STORAGE_MUTATED_EVENT_NAME, (changedParts) => {\n try {\n if (!propagatingLocally) {\n if (typeof localStorage !== 'undefined') {\n // We're a browsing window or tab. Propagate to other windows/tabs via storage event:\n localStorage.setItem(\n STORAGE_MUTATED_DOM_EVENT_NAME,\n JSON.stringify({\n trig: Math.random(),\n changedParts,\n })\n );\n }\n if (typeof self['clients'] === 'object') {\n // We're a service worker. Propagate to our browser clients.\n [...self['clients'].matchAll({ includeUncontrolled: true })].forEach(\n (client) =>\n client.postMessage({\n type: STORAGE_MUTATED_DOM_EVENT_NAME,\n changedParts,\n })\n );\n }\n }\n } catch {}\n });\n\n //\n // Propagate remote changes locally via storage event:\n //\n if (typeof addEventListener !== 'undefined') {\n addEventListener('storage', (ev: StorageEvent) => {\n if (ev.key === STORAGE_MUTATED_DOM_EVENT_NAME) {\n const data = JSON.parse(ev.newValue);\n if (data) propagateLocally(data.changedParts);\n }\n });\n }\n\n //\n // Propagate messages from service worker\n //\n const swContainer = self.document && navigator.serviceWorker; // self.document is to verify we're not the SW ourself\n if (swContainer) {\n // We're a browser window and want to propagate message from the SW:\n swContainer.addEventListener('message', propagateMessageLocally);\n }\n}\n\nfunction propagateMessageLocally({ data }: MessageEvent) {\n if (data && data.type === STORAGE_MUTATED_DOM_EVENT_NAME) {\n propagateLocally(data.changedParts);\n }\n}\n","import { Dexie } from './classes/dexie';\nimport { DexieConstructor } from './public/types/dexie-constructor';\nimport { DexiePromise } from './helpers/promise';\nimport { mapError } from './errors';\nimport * as Debug from './helpers/debug';\nimport { dexieStackFrameFilter } from './globals/constants';\n\n// Generate all static properties such as Dexie.maxKey etc\n// (implement interface DexieConstructor):\nimport './classes/dexie/dexie-static-props';\nimport './live-query/enable-broadcast';\nimport { liveQuery } from './live-query/live-query';\n\n// Set rejectionMapper of DexiePromise so that it generally tries to map\n// DOMErrors and DOMExceptions to a DexieError instance with same name but with\n// async stack support and with a prototypal inheritance from DexieError and Error.\n// of Map DOMErrors and DOMExceptions to corresponding Dexie errors.\nDexiePromise.rejectionMapper = mapError;\n\n// Let the async stack filter focus on app code and filter away frames from dexie.min.js:\nDebug.setDebug(Debug.debug, dexieStackFrameFilter);\n\nexport { RangeSet, mergeRanges, rangesOverlap } from \"./helpers/rangeset\";\nexport { Dexie, liveQuery }; // Comply with public/index.d.ts.\nexport default Dexie;\n","import {Put, Get, Message} from '../Message'\nimport { Actor } from '../Actor';\nimport _ from \"../../lodash\";\nimport Dexie from 'dexie';\nimport {Children, NodeData} from \"../Node\";\n// import * as Comlink from \"comlink\";\n\n// TODO: add LRU or other eviction policy, clean up least important data when db gets too big\nclass MyDexie extends Dexie {\n nodes: Dexie.Table;\n constructor(dbName: string) {\n super(dbName);\n this.version(1).stores({\n nodes: \", value, updatedAt\"\n });\n this.nodes = this.table(\"nodes\");\n }\n}\n\nexport default class IndexedDB extends Actor {\n config = {};\n notStored = new Set();\n putQueue: any = {};\n getQueue: any = {};\n i = 0;\n queue = 0;\n db: MyDexie;\n\n constructor(config: any = {}) {\n super();\n this.config = config;\n const dbName = (config.dbName || 'iris');\n this.db = new MyDexie(dbName);\n this.db.open().catch((err) => {\n console.error(err.stack || err);\n });\n }\n\n put(nodeId: string, value: any) {\n // add puts to a queue and dexie bulk write them once per 500ms\n this.putQueue[nodeId] = value;\n this.throttledPut();\n }\n\n throttledPut = _.throttle(() => {\n const keys = Object.keys(this.putQueue);\n const values = keys.map(key => {\n this.notStored.delete(key);\n return this.putQueue[key];\n });\n this.db.nodes.bulkPut(values, keys).catch((err) => {\n console.error(err);\n });\n this.putQueue = {};\n }, 500);\n\n get(path: string, callback: Function) {\n this.getQueue[path] = this.getQueue[path] || [];\n this.getQueue[path].push(callback);\n this.throttledGet();\n }\n\n throttledGet = _.throttle(() => {\n // clone this.getQueue and clear it\n const queue = this.getQueue;\n const keys = Object.keys(queue);\n this.db.nodes.bulkGet(keys).then((values: (any | undefined)[]) => {\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n const value = values[i];\n const callbacks = queue[key];\n // console.log('have', key, value);\n for (const callback of callbacks) {\n callback(value);\n }\n }\n });\n this.getQueue = {};\n }, 100);\n\n handle(message: Message) {\n if (message instanceof Put) {\n this.handlePut(message);\n } else if (message instanceof Get) {\n this.handleGet(message);\n } else {\n console.log('worker got unknown message', message);\n }\n }\n\n handleGet(message: Get) {\n if (this.notStored.has(message.nodeId)) {\n // TODO message implying that the key is not stored\n return;\n }\n this.get(message.nodeId, (children: any) => {\n // TODO: this takes a long time to return\n if (children === undefined) {\n this.notStored.add(message.nodeId);\n // TODO message implying that the key is not stored\n } else {\n const putMessage = Put.newFromKv(message.nodeId, children, this);\n putMessage.inResponseTo = message.id;\n message.from && message.from.postMessage(putMessage);\n }\n });\n }\n\n mergeAndSave(path: string, children: Children) {\n this.get(path, (existing: any) => {\n // TODO check updatedAt timestamp\n if (existing === undefined) {\n this.put(path, children);\n } else {\n for (const [key, value] of Object.entries(children)) {\n if (existing[key] && existing[key].updatedAt >= value.updatedAt) {\n continue;\n }\n existing[key] = value;\n }\n this.put(path, existing);\n }\n });\n }\n\n savePath(path: string, value: any) {\n if (value === undefined) {\n this.db.nodes.delete(path);\n this.notStored.add(path);\n } else {\n this.notStored.delete(path);\n this.mergeAndSave(path, value);\n }\n }\n\n async handlePut(put: Put) {\n for (const [nodeName, children] of Object.entries(put.updatedNodes)) {\n if (!children) {\n console.log('deleting', nodeName);\n continue;\n }\n this.mergeAndSave(nodeName, children);\n }\n }\n}\n\n/*\nlet actor;\nglobal.onconnect = () => {\n if (actor) {\n console.log ('worker already exists');\n } else {\n console.log('starting worker');\n actor = actor || new IndexedDB();\n }\n}\n */\n\n// self.onconnect = (e) => Comlink.expose(actor, e.ports[0]);","import peers from \"./peers\";\nimport Node from \"./db/Node\";\n\nlet globalState: any;\n\nexport default function(opts: any = {}) {\n if (!globalState) {\n peers.init();\n const webSocketPeers = (opts.peers || peers.random());\n console.log('webSocketPeers', webSocketPeers);\n const myOpts = Object.assign({ webSocketPeers, localStorage: false, retry:Infinity }, opts);\n if (opts.peers) {\n console.log('adding peers', opts.peers);\n opts.peers.forEach((url: string) => peers.add({url}));\n }\n globalState = new Node('global', myOpts);\n }\n return globalState;\n}","import {Get, Message, Put} from \"../Message\";\nimport {Actor} from \"../Actor\";\n//@ts-ignore\n\nexport default class Websocket extends Actor {\n ws: WebSocket;\n router: Actor;\n sendQueue: string[] = [];\n\n constructor(url: string, router: Actor) {\n super('websocket:' + url);\n console.log('Websocket', url);\n this.router = router;\n this.ws = new WebSocket(url.replace('http', 'ws'));\n this.ws.onopen = () => {\n //this.ws.send(new Hi(this.router.peerId).serialize());\n console.log(`Connected to ${url}`);\n this.sendQueue.forEach((message) => this.ws.send(message));\n this.sendQueue = [];\n }\n this.ws.onmessage = async (event) => {\n try {\n const message = await Message.deserialize(event.data, this);\n this.router.postMessage(message);\n } catch (e) {\n //console.log('Failed to deserialize message', event.data, e);\n }\n }\n this.ws.onclose = () => {\n console.log(`Disconnected from ${url}`);\n }\n this.ws.onerror = () => {\n console.log(`Error on ${url}`);\n }\n }\n\n handle(message: Message): void {\n if (message instanceof Get || message instanceof Put) {\n if (message.from === this) {\n return;\n }\n if (this.ws.readyState === WebSocket.OPEN) {\n this.ws.send(message.serialize());\n } else if (this.ws.readyState === WebSocket.CONNECTING) {\n this.sendQueue.push(message.serialize());\n }\n }\n }\n}\n\n\n","import {Actor} from \"./Actor\";\nimport Memory from \"./adapters/Memory\";\nimport IndexedDB from \"./adapters/IndexedDB\";\nimport Websocket from \"./adapters/Websocket\";\nimport {Put, Get, Message} from \"./Message\";\n// import * as Comlink from \"comlink\";\n\n/*\nclass SeenGetMessage {\n constructor(id, from, lastReplyChecksum) {\n this.id = id;\n this.from = from;\n this.lastReplyChecksum = lastReplyChecksum;\n }\n}\n*/\n\nexport default class Router extends Actor {\n storageAdapters: Set = new Set();\n networkAdapters: Set = new Set();\n serverPeers: Set = new Set();\n seenMessages: Set = new Set();\n seenGetMessages: Map = new Map();\n subscribersByTopic: Map> = new Map();\n msgCounter = 0;\n peerId: string;\n\n constructor(config: any = {}) {\n super('router');\n // default random id\n this.peerId = config.peerId || Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15);\n this.storageAdapters.add(new Memory(config));\n this.storageAdapters.add(new IndexedDB(config));\n console.log('config', config);\n if (config.peers) {\n for (const peer of config.peers) {\n if (peer) {\n this.serverPeers.add(new Websocket(peer, this));\n }\n }\n }\n }\n\n handle(message: Message) {\n //console.log('router received', message);\n if (message instanceof Put || message instanceof Get) {\n if (this.seenMessages.has(message.id)) {\n return;\n }\n this.seenMessages.add(message.id);\n if (message instanceof Put) {\n this.handlePut(message);\n } else if (message instanceof Get) {\n this.handleGet(message);\n }\n }\n }\n\n handlePut(put: Put) {\n const sendTo: Set = new Set();\n Object.keys(put.updatedNodes).forEach(path => {\n // topic is first 3 nodes of path\n const topic = path.split('/').slice(0, 3).join('/');\n const subscribers = this.subscribersByTopic.get(topic);\n // send to storage adapters\n //console.log('put subscribers', subscribers);\n for (const storageAdapter of this.storageAdapters) {\n if (put.from !== storageAdapter) {\n sendTo.add(storageAdapter);\n }\n }\n\n for (const peer of this.serverPeers) {\n if (put.from !== peer) {\n sendTo.add(peer);\n }\n }\n\n if (subscribers) {\n for (const subscriber of subscribers) {\n if (subscriber !== put.from) {\n sendTo.add(subscriber);\n }\n }\n }\n });\n for (const actor of sendTo) {\n actor.postMessage(put);\n }\n }\n\n opt(opts: any) {\n if (opts.peers) {\n for (const peer of opts.peers) {\n if (peer) {\n this.serverPeers.add(new Websocket(peer, this));\n }\n }\n }\n }\n\n handleGet(get: Get) {\n const topic = get.nodeId.split('/')[1];\n const sendTo: Set = new Set();\n for (const storageAdapter of this.storageAdapters) {\n if (get.from !== storageAdapter) {\n sendTo.add(storageAdapter);\n }\n }\n for (const peer of this.serverPeers) {\n if (get.from !== peer) {\n sendTo.add(peer);\n }\n }\n if (!this.subscribersByTopic.has(topic)) {\n this.subscribersByTopic.set(topic, new Set());\n }\n const subscribers = this.subscribersByTopic.get(topic);\n if (subscribers) {\n if (!subscribers.has(get.from)) {\n subscribers.add(get.from);\n }\n }\n for (const actor of sendTo) {\n actor.postMessage(get);\n }\n }\n}\n\n/*\nlet actor: Actor;\nself.onconnect = () => {\n console.log('router shared worker connected');\n actor = actor || new Router();\n}\n*/\n\n// self.onconnect = (e) => Comlink.expose(actor, e.ports[0]);","import _ from '../lodash';\nimport {Actor} from './Actor';\nimport {Message, Put, Get, UpdatedNodes} from './Message';\n\n// @ts-ignore\nimport Router from './Router';\nimport Key from \"../Key\";\n//import * as Comlink from \"comlink\";\n\nexport type NodeData = {\n value: any;\n updatedAt: number;\n};\n\nexport type Children = {\n [key: string]: NodeData;\n}\n\nexport type Config = {\n peerId?: string;\n allowPublicSpace: boolean;\n myPublicKey?: string;\n enableStats: boolean;\n webSocketPeers?: string[];\n localOnly: boolean;\n}\n\nexport const DEFAULT_CONFIG: Config = {\n allowPublicSpace: false,\n enableStats: true,\n localOnly: true\n}\n\n// TODO move memory storage to its own adapter? it would make things simpler here\nexport default class Node extends Actor {\n root: Node;\n parent?: Node;\n children = new Map();\n once_subscriptions = new Map();\n on_subscriptions = new Map();\n map_subscriptions = new Map();\n counter = 0;\n config: Config;\n currentUser: any;\n router: Router;\n\n constructor(id = '', config?: Config, parent?: Node) {\n super(id);\n this.parent = parent;\n this.config = config || (parent && parent.config) || DEFAULT_CONFIG;\n if (parent) {\n this.root = parent.root;\n this.router = parent.router;\n } else {\n this.root = this;\n //@ts-ignore\n this.router = new Router({dbName: this.id + '-idb', peers: this.config.webSocketPeers});\n //console.log('idbWorker', idbWorker);\n //const router = Comlink.wrap(routerWorker);\n }\n }\n\n getCurrentUser(): any {\n return this.root.currentUser;\n }\n\n setCurrentUser(key: any) {\n this.root.currentUser = key;\n }\n\n handle(message: Message): void {\n if (message instanceof Put) {\n for (const [key, children] of Object.entries(message.updatedNodes)) {\n if (!children || typeof children !== 'object') {\n continue;\n }\n if (key === this.id) {\n for (const [childKey, childData] of Object.entries(children)) {\n this.get(childKey).doCallbacks(childData, childKey); // TODO children should have proper NodeData\n }\n }\n }\n this.parent && this.parent.handle(message);\n }\n };\n\n get(key: string): Node {\n const existing = this.children.get(key);\n if (existing) {\n return existing;\n }\n const newNode = new Node(`${this.id}/${key}`, this.config, this);\n this.children.set(key, newNode);\n return newNode;\n }\n\n user(pub: string | undefined): Node {\n pub = pub || (this.root.currentUser && this.root.currentUser.pub);\n if (!pub) {\n throw new Error(\"no public key!\");\n }\n return this.get('user').get(pub as string);\n }\n\n auth(key: any) {\n // TODO get public key from key\n this.root.setCurrentUser(key);\n return;\n }\n\n doCallbacks = (data: NodeData, key: string) => {\n if (typeof data.value === 'string' && data.value.startsWith('{\":\":')) {\n data.value = JSON.parse(data.value)[':'];\n }\n for (const [id, callback] of this.on_subscriptions) {\n const event = { off: () => this.on_subscriptions.delete(id) };\n callback(data.value, key, null, event);\n }\n for (const [id, callback] of this.once_subscriptions) {\n callback(data.value, key, null, {});\n this.once_subscriptions.delete(id);\n }\n if (this.parent) {\n const parent = this.parent;\n for (const [id, callback] of parent.map_subscriptions) {\n const event = { off: () => parent.map_subscriptions.delete(id) };\n callback(data.value, key, null, event);\n }\n }\n };\n\n async put(value: any): Promise {\n const updatedAt = Date.now();\n if (Array.isArray(value)) {\n throw new Error('put() does not support arrays');\n }\n if (typeof value === 'function') {\n throw new Error('put() does not support functions');\n }\n if (typeof value === 'object' && value !== null) {\n // TODO: update the whole path of parent nodes\n for (const key in value) {\n this.get(key).put(value[key]);\n }\n return;\n }\n value = await this.signIfNeeded(value);\n this.children = new Map();\n const updatedNodes: UpdatedNodes = {};\n await this.addParentNodes(updatedNodes, value, updatedAt);\n const put = Put.new(updatedNodes, this);\n this.handle(put);\n this.router.postMessage(put);\n }\n\n private async signIfNeeded(value: any) {\n if (this.id.indexOf('global/user/') === 0) {\n if (!this.getCurrentUser()) {\n throw new Error('not authenticated');\n }\n if (this.id.indexOf('global/user/' + this.getCurrentUser().pub) !== 0) {\n throw new Error('not allowed ' + this.id);\n }\n const signed = await Key.sign(value, this.getCurrentUser(), undefined, {raw: true});\n value = JSON.stringify({':': signed.m, '~': signed.s});\n console.log('saving signed value', value);\n }\n return value;\n }\n\n private async addParentNodes(updatedNodes: UpdatedNodes, value: any, updatedAt: number) {\n // TODO sign\n if (this.parent) {\n const childName = this.id.split('/').pop() as string;\n const parentId = this.parent.id;\n updatedNodes[parentId] = updatedNodes[parentId] || {};\n updatedNodes[parentId][childName] = {value, updatedAt};\n await this.parent.addParentNodes(updatedNodes, {'#': this.parent.id }, updatedAt);\n }\n }\n\n private request() {\n if (this.parent) { // TODO router should decide whether to re-request from peers\n const childKey = this.id.split('/').pop();\n this.router.postMessage(Get.new(this.parent.id, this, undefined, childKey));\n }\n }\n\n async once(callback?: Function | null): Promise {\n const id = this.counter++;\n callback && this.once_subscriptions.set(id, callback);\n this.request();\n }\n\n on(callback: Function): void {\n const id = this.counter++;\n this.on_subscriptions.set(id, callback);\n //const event = { off: () => this.on_subscriptions.delete(id) };\n this.request();\n }\n\n map(callback: Function): void {\n const id = this.counter++;\n this.map_subscriptions.set(id, callback);\n // TODO: child key should probably still be included. But how to handle link responses?\n this.router.postMessage(Get.new(this.id, this, undefined));\n }\n\n opt(opts: any) {\n this.router.opt(opts);\n }\n}","// @ts-nocheck\n\n/*eslint no-useless-escape: \"off\", camelcase: \"off\" */\n\nconst UNIQUE_ID_VALIDATORS = {\n email: /^([\\w-]+(?:\\.[\\w-]+)*)@((?:[\\w-]+\\.)*\\w[\\w-]{0,66})\\.([a-z]{2,6}(?:\\.[a-z]{2})?)$/i,\n bitcoin: /^[13][a-km-zA-HJ-NP-Z0-9]{26,33}$/,\n bitcoin_address: /^[13][a-km-zA-HJ-NP-Z0-9]{26,33}$/,\n ip: /^(([1-9]?\\d|1\\d\\d|2[0-5][0-5]|2[0-4]\\d)\\.){3}([1-9]?\\d|1\\d\\d|2[0-5][0-5]|2[0-4]\\d)$/,\n ipv6: /^(?:[A-F0-9]{1,4}:){7}[A-F0-9]{1,4}$/,\n gpg_fingerprint: null,\n gpg_keyid: null,\n google_oauth2: null,\n tel: /^\\d{7,}$/,\n phone: /^\\d{7,}$/,\n keyID: null,\n url: /[-a-zA-Z0-9@:%_\\+.~#?&//=]{2,256}\\.[a-z]{2,4}\\b(\\/[-a-zA-Z0-9@:%_\\+.~#?&//=]*)?/gi,\n account: /^([\\w-]+(?:\\.[\\w-]+)*)@((?:[\\w-]+\\.)*\\w[\\w-]{0,66})\\.([a-z]{2,6}(?:\\.[a-z]{2})?)$/i,\n uuid: /[0-9a-f]{8}\\-[0-9a-f]{4}\\-[0-9a-f]{4}\\-[0-9a-f]{4}\\-[0-9a-f]{12}/\n};\n\n// TODO this class could perhaps be removed\n\nclass Attribute {\n constructor(a, b) {\n if (typeof a === `object`) {\n if (typeof a.value !== `string`) { throw new Error(`param1.value must be a string, got ${typeof a.value}: ${JSON.stringify(a.value)}`); }\n if (typeof a.type !== `string`) { throw new Error(`param1.type must be a string, got ${typeof a.type}: ${JSON.stringify(a.type)}`); }\n b = a.value;\n a = a.type;\n }\n if (typeof a !== `string`) { throw new Error(`First param must be a string, got ${typeof a}: ${JSON.stringify(a)}`); }\n if (!a.length) { throw new Error(`First param string is empty`); }\n if (b) {\n if (typeof b !== `string`) { throw new Error(`Second parameter must be a string, got ${typeof b}: ${JSON.stringify(b)}`); }\n if (!b.length) { throw new Error(`Second param string is empty`); }\n this.type = a;\n this.value = b;\n } else {\n this.value = a;\n const t = Attribute.guessTypeOf(this.value);\n if (t) {\n this.type = t;\n } else {\n throw new Error(`Type of attribute was omitted and could not be guessed`);\n }\n }\n }\n\n static getUuid() {\n const b = a => a ? (a ^ Math.random() * 16 >> a / 4).toString(16) : ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, b);\n return new Attribute(`uuid`, b());\n }\n\n static getUniqueIdValidators() {\n return UNIQUE_ID_VALIDATORS;\n }\n\n static isUniqueType(type) {\n return Object.keys(UNIQUE_ID_VALIDATORS).indexOf(type) > -1;\n }\n\n isUniqueType() {\n return Attribute.isUniqueType(this.type);\n }\n\n static guessTypeOf(value) {\n for (const key in UNIQUE_ID_VALIDATORS) {\n if (value.match(UNIQUE_ID_VALIDATORS[key])) {\n return key;\n }\n }\n }\n\n static equals(a, b) {\n return a.equals(b);\n }\n\n equals(a) {\n return a && this.type === a.type && this.value === a.value;\n }\n\n uri() {\n return `${encodeURIComponent(this.value)}:${encodeURIComponent(this.type)}`;\n }\n}\n\nexport default Attribute;\n","import globalState from './global';\nimport session from './session';\n\n/**\n * Get a public space where only the specified user (public key) can write. Others can read.\n * @param pub The public key string or keypair object of the user. Defaults to the current user from session.\n * @returns {Node} The user space.\n */\nexport default function(pub: any = session.getKey()) {\n if (typeof pub === 'string') {\n return globalState().user(pub);\n } else if (typeof pub === 'object') {\n const userSpace = globalState().user(pub.pub);\n userSpace.auth(pub);\n return userSpace;\n }\n}\n","// @ts-nocheck\n\nimport util from './util';\nimport Attribute from './Attribute';\nimport session from './session';\nimport publicState from './global';\nimport userState from './public';\nimport Key from './Key';\n\n// TODO: extract Group channels into their own class\n\nconst DEFAULT_PERMISSIONS = {read: true, write: true, admin: false};\n\n/**\n* Private communication channel between two or more participants ([Gun](https://github.com/amark/gun) public keys). Can be used independently of other Iris stuff.\n*\n* Used as a core element of [iris-messenger](https://github.com/irislib/iris-messenger).\n*\n* You can use iris.private(pub) to always use the same Channel object for a given pub.\n*\n* ---\n*\n* #### Key-value API\n* `channel.put(key, value)` and `channel.on(key, callback)`.\n*\n* Note that each participant has their own versions of each key-value — they don't overwrite each other. `channel.on()` callback returns them all by default and has a parameter that indicates whose value you got.\n*\n* While values are encrypted, encryption of keys is not implemented yet.\n*\n* #### Message API\n* `channel.send()` and `channel.getMessages()` for timestamp-indexed chat-style messaging.\n*\n* Message data is encrypted, but timestamps are public so that peers can return your messages in a sequential order.\n*\n* ---\n*\n* You can open a channel with yourself for a private key-value space or a \"note to self\" type chat with yourself.\n*\n* **Privacy disclaimer:** Channel ids, data values and messages are encrypted, but message timestamps are unencrypted so that peers can return them to you in a sequential order. By looking at the unencrypted timestamps (or Gun subscriptions), it is possible to guess who are communicating with each other. This could be improved by indexing messages by *day* only, so making the guess would be more difficult, while you could still return them in a semi-sequential order.\n*\n* @param {Object} options\n* @param {string} options.key your keypair\n* @param {Object} options.gun [gun](https://github.com/amark/gun) instance\n* @param options.participants (optional) string or string array or permissions object ({'pub1':{read:true,write:true,admin:false},'pub2'...}) of participant public keys (your own key is included by default)\n* @param {string} options.chatLink (optional) chat link instead of participants list\n* @param {string} options.uuid (group channels only) unique channel identifier. Leave out for new channel.\n* @param {string} options.name (group channels only) channel name\n* @example\n* // Copy & paste this to console at https://iris.to or other page that has gun, sea and iris-lib\n* // Due to an unsolved bug, someoneElse's messages only start showing up after a reload\n*\n* var gun1 = new Gun('https://gun-us.herokuapp.com/gun');\n* var gun2 = new Gun('https://gun-us.herokuapp.com/gun');\n* var myKey = await Key.getDefault();\n* var someoneElse = localStorage.getItem('someoneElsesKey');\n* if (someoneElse) {\n* someoneElse = JSON.parse(someoneElse);\n* } else {\n* someoneElse = await Key.generate();\n* localStorage.setItem('someoneElsesKey', JSON.stringify(someoneElse));\n* }\n*\n* iris.Channel.initUser(gun1, myKey); // saves myKey.epub to gun.user().get('epub')\n* iris.Channel.initUser(gun2, someoneElse);\n*\n* var ourChannel = new iris.Channel({key: myKey, gun: gun1, participants: someoneElse.pub});\n* var theirChannel = new iris.Channel({key: someoneElse, gun: gun2, participants: myKey.pub});\n*\n* var myChannels = {}; // you can list them in a user interface\n* function printMessage(msg, info) {\n* console.log(`[${new Date(msg.time).toLocaleString()}] ${info.from.slice(0,8)}: ${msg.text}`)\n* }\n* iris.Channel.getChannels(gun1, myKey, channel => {\n* var pub = channel.getCurrentParticipants()[0];\n* gun1.user(pub).get('profile').get('name').on(name => channel.name = name);\n* myChannels[pub] = channel;\n* channel.getMessages(printMessage);\n* channel.on('mood', (mood, from) => console.log(from.slice(0,8) + ' is feeling ' + mood));\n* });\n*\n* // you can play with these in the console:\n* ourChannel.send('message from myKey');\n* theirChannel.send('message from someoneElse');\n*\n* ourChannel.put('mood', 'blessed');\n* theirChannel.put('mood', 'happy');\n*\n* @example https://github.com/irislib/iris-lib/blob/master/__tests__/Channel.js\n*/\nclass Channel {\n // TODO: these should be done in a cleaner way\n latestTime: any;\n theirMsgsLastSeenDate: any;\n myLastSeenTime: any;\n theirMsgsLastSeenTime: any;\n notificationSetting: any;\n messageIds: any; // this is used from session.processMessage\n latest: any;\n uuid: any;\n name: any;\n attachments: any;\n\n theirSecretUuids = {};\n theirGroupSecrets = {};\n secrets = {};\n ourSecretChannelIds = {};\n theirSecretChannelIds = {};\n messages = {};\n chatLinks = {};\n groupSubscriptions = {};\n directSubscriptions = {};\n getParticipantsCallbacks = {};\n myGroupSecret: any;\n participants: any;\n\n constructor(options: any) {\n this.myGroupSecret = options.myGroupSecret;\n\n if (options.chatLink) {\n this.useChatLink(options);\n }\n\n if (typeof options.participants === `string`) {\n this.addParticipant(options.participants, options.save);\n } else if (Array.isArray(options.participants)) {\n const o = {};\n options.participants.forEach(p => o[p] = Object.assign({}, DEFAULT_PERMISSIONS));\n options.participants = o;\n }\n if (typeof options.participants === `object`) { // it's a group channel\n const keys = Object.keys(options.participants);\n keys.forEach(k => {\n if (k !== session.getKey().pub) {\n this.addParticipant(k, options.save, Object.assign({}, DEFAULT_PERMISSIONS, options.participants[k]));\n }\n });\n options.participants[session.getKey().pub] = options.participants[session.getKey().pub] || Object.assign({}, DEFAULT_PERMISSIONS);\n if (options.uuid) {\n this.uuid = options.uuid;\n this.name = options.name;\n } else {\n options.uuid = Attribute.getUuid().value;\n this.uuid = options.uuid;\n options.participants[session.getKey().pub].admin = true;\n options.participants[session.getKey().pub].founder = true;\n }\n this.getChatLinks({subscribe: true});\n }\n this.participants = options.participants;\n if (options.uuid) { // It's a group channel\n // share secret uuid with other participants. since secret is already non-deterministic, maybe uuid could also be?\n // generate channel-specific secret and share it with other participants\n // put() keys should be encrypted first? so you could do put(uuid, secret)\n // what if you join the channel with 2 unconnected devices? on reconnect, the older secret would be overwritten and messages unreadable. maybe participants should store each others' old keys? or maybe you should store them and re-encrypt old stuff when key changes? return them with map() instead?\n this.putDirect(`S${this.uuid}`, this.getMyGroupSecret());\n this.getMySecretUuid().then(s => {\n this.putDirect(this.uuid, s); // TODO: encrypt keys in put()\n });\n this.onTheirDirect(this.uuid, (s, k, from) => {\n this.theirSecretUuids[from] = s;\n });\n this.onTheirDirect(`S${this.uuid}`, (s, k, from) => {\n this.theirGroupSecrets[from] = s;\n });\n // need to make put(), on(), send() and getMessages() behave differently when it's a group and retain the old versions for mutual signaling\n }\n this.onTheir(`participants`, (participants, k, from) => {\n let hasAdmin = false;\n const keys = Object.keys(this.participants);\n for (let i = 0; i < keys.length; i++) {\n if (this.participants[keys[i]].admin || this.participants[keys[i]].inviter) {\n hasAdmin = true;\n break;\n }\n }\n if (!hasAdmin) {\n keys.forEach(k => this.participants[k].admin = true); // if no admins, make everyone admin\n }\n if (this.participants[from] && (this.participants[from].admin || this.participants[from].inviter)) {\n if (typeof participants === `object`) {\n if (JSON.stringify(this.participants) === JSON.stringify(participants)) { return; }\n this.participants = participants;\n delete this.participants[from].inviter;\n Object.keys(participants).forEach(k => {\n if (k !== session.getKey().pub) {\n this.addParticipant(k, true, Object.assign({}, DEFAULT_PERMISSIONS, participants[k]), true);\n }\n });\n this.participantsChanged();\n options.saved = true;\n }\n }\n });\n if (!options.saved && (options.save === undefined || options.save === true)) {\n this.save();\n }\n }\n\n useChatLink(options) {\n const s = options.chatLink.split('?');\n if (s.length === 2) {\n const chatWith = util.getUrlParameter('chatWith', s[1]);\n const channelId = util.getUrlParameter('channelId', s[1]);\n const inviter = util.getUrlParameter('inviter', s[1]);\n const pub = inviter || chatWith;\n if (chatWith) {\n options.participants = pub;\n } else if (channelId && inviter && inviter !== session.getKey().pub) { // TODO! initializing it twice breaks things - new secret is generated\n options.uuid = channelId;\n options.participants = {};\n options.participants[inviter] = Object.assign({inviter: true}, DEFAULT_PERMISSIONS);\n }\n if (pub !== session.getKey().pub) {\n const sharedSecret = util.getUrlParameter('s', s[1]);\n const linkId = util.getUrlParameter('k', s[1]);\n if (sharedSecret && linkId) {\n this.save(); // save the channel first so it's there before inviter subscribes to it\n options.saved = true;\n publicState().user(pub).get('chatLinks').get(linkId).get('encryptedSharedKey').on(async encrypted => {\n const sharedKey = await Key.decrypt(encrypted, sharedSecret);\n const encryptedChatRequest = await Key.encrypt(session.getKey().pub, sharedSecret); // TODO encrypt is not deterministic, it uses salt\n const channelRequestId = await util.getHash(encryptedChatRequest);\n publicState(sharedKey).get('chatRequests').get(channelRequestId.slice(0, 12)).put(encryptedChatRequest);\n });\n }\n }\n }\n }\n\n getTheirSecretUuid(pub) {\n return new Promise(resolve => {\n if (!this.theirSecretUuids[pub]) {\n this.onTheirDirect(this.uuid, s => {\n this.theirSecretUuids[pub] = s;\n resolve(this.theirSecretUuids[pub]);\n }, pub);\n } else {\n resolve(this.theirSecretUuids[pub]);\n }\n });\n }\n\n getTheirGroupSecret(pub) {\n if (pub === session.getKey().pub) { return this.getMyGroupSecret(); }\n return new Promise(resolve => {\n if (!this.theirGroupSecrets[pub]) {\n this.onTheirDirect(`S${this.uuid}`, s => {\n this.theirGroupSecrets[pub] = s;\n resolve(this.theirGroupSecrets[pub]);\n }, pub);\n } else {\n resolve(this.theirGroupSecrets[pub]);\n }\n });\n }\n\n changeMyGroupSecret() {\n this.myGroupSecret = Key.random(32).toString('base64');\n // TODO: secret should be archived and probably messages should include the encryption key id so past messages don't become unreadable\n this.putDirect(`S${this.uuid}`, this.myGroupSecret);\n }\n\n /**\n * Unsubscribe messages from a channel participants\n *\n * @param {string} participant public key\n */\n async mute(participant) {\n publicState().user(participant).get(this.theirSecretUuids[participant]).off();\n // TODO: persist\n }\n\n /**\n * Mute user and prevent them from seeing your further (and maybe past) messages\n *\n * @param {string} participant public key\n */\n async block(participant) {\n this.mute(participant);\n this.putDirect(this.uuid, null);\n this.putDirect(`S${this.uuid}`, null);\n delete this.secrets[participant];\n delete this.ourSecretChannelIds[participant];\n delete this.theirSecretChannelIds[participant];\n this.changeMyGroupSecret();\n }\n\n async getMySecretUuid() {\n if (!this.mySecretUuid) {\n const mySecret = await Key.secret(session.getKey().epub, session.getKey());\n const mySecretHash = await util.getHash(mySecret);\n this.mySecretUuid = await util.getHash(mySecretHash + this.uuid);\n }\n return this.mySecretUuid;\n }\n\n /**\n * List participants of the channel (other than you)\n */\n getCurrentParticipants() {\n return Object.keys(this.secrets);\n }\n\n /**\n * Subscribe to the changing list of participants by channel admins\n */\n getParticipants(callback) {\n if (this.getParticipantsCallbackId) {\n this.getParticipantsCallbackId++;\n } else {\n this.getParticipantsCallbackId = 1;\n }\n this.getParticipantsCallbacks[this.getParticipantsCallbackId] = callback;\n if (this.participants) {\n callback(this.participants);\n }\n }\n\n participantsChanged() {\n Object.keys(this.getParticipantsCallbacks).forEach(id => {\n this.getParticipantsCallbacks[id](this.participants);\n });\n }\n\n /**\n * Returns either the uuid of a group channel or the public key of a direct channel.\n */\n getId() {\n return this.uuid || this.getCurrentParticipants()[0];\n }\n\n async getSecret(pub) {\n if (!this.secrets[pub]) {\n const epub = await util.gunOnceDefined(publicState().user(pub).get(`epub`));\n this.secrets[pub] = await Key.secret(epub, session.getKey());\n }\n return this.secrets[pub];\n }\n\n /**\n *\n */\n static async getOurSecretChannelId(pub, pair) {\n const epub = await util.gunOnceDefined(publicState().user(pub).get(`epub`));\n const secret = await Key.secret(epub, pair);\n return util.getHash(secret + pub);\n }\n\n /**\n *\n */\n static async getTheirSecretChannelId(pub, pair) {\n const epub = await util.gunOnceDefined(publicState().user(pub).get(`epub`));\n const secret = await Key.secret(epub, pair);\n return util.getHash(secret + pair.pub);\n }\n\n /**\n * Calls back with Channels that you have initiated or written to.\n * @param {Object} keypair Key keypair that the gun instance is authenticated with\n * @param callback callback function that is called for each public key you have a channel with\n */\n static async getChannels(callback, listenToChatLinks = true) {\n const keypair = session.getKey();\n const mySecret = await Key.secret(keypair.epub, keypair);\n if (listenToChatLinks) {\n Channel.getMyChatLinks( undefined, undefined, true);\n }\n const seen = {};\n\n const handleChannel = async (value, ourSecretChannelId) => {\n if (value && !seen[ourSecretChannelId]) {\n seen[ourSecretChannelId] = true;\n if (ourSecretChannelId.length > 44) {\n publicState().user().get(`chats`).get(ourSecretChannelId).put(null);\n return;\n }\n const encryptedChatId = await util.gunOnceDefined(publicState().user().get(`chats`).get(ourSecretChannelId).get(`pub`));\n const chatId = await Key.decrypt(encryptedChatId, mySecret);\n if (!chatId) {\n return;\n }\n if (chatId.pub || typeof chatId === `string`) {\n callback(new Channel({\n key: keypair,\n participants: chatId.pub || chatId,\n save: false\n }));\n } else if (chatId.uuid && chatId.participants && chatId.myGroupSecret) {\n callback(new Channel({\n key: keypair,\n participants: chatId.participants,\n uuid: chatId.uuid,\n myGroupSecret: chatId.myGroupSecret,\n save: false\n }));\n }\n }\n };\n\n publicState().user().get(`chats`).map(handleChannel);\n }\n\n getMyGroupSecret() { // group secret could be deterministic: hash(encryptToSelf(uuid + iterator))\n if (!this.myGroupSecret) {\n this.changeMyGroupSecret();\n }\n return this.myGroupSecret;\n }\n\n async getOurSecretChannelId(pub) {\n if (!this.ourSecretChannelIds[pub]) {\n const secret = await this.getSecret(pub);\n this.ourSecretChannelIds[pub] = await util.getHash(secret + pub);\n }\n return this.ourSecretChannelIds[pub];\n }\n\n async getTheirSecretChannelId(pub) {\n if (!this.theirSecretChannelIds[pub]) {\n const secret = await this.getSecret(pub);\n this.theirSecretChannelIds[pub] = await util.getHash(secret + session.getKey().pub);\n }\n return this.theirSecretChannelIds[pub];\n }\n\n /**\n * Get messages from the channel\n */\n async getMessages(callback) { // TODO: save callback and apply it when new participants are added to channel\n this.getCurrentParticipants().forEach(async pub => {\n if (pub !== session.getKey().pub) {\n // Subscribe to their messages\n let theirSecretChannelId;\n if (this.uuid) {\n theirSecretChannelId = await this.getTheirSecretUuid(pub);\n } else {\n theirSecretChannelId = await this.getTheirSecretChannelId(pub);\n }\n // TODO map().once\n publicState().user(pub).get(`chats`).get(theirSecretChannelId).get(`msgs`).map((data, key) => {this.messageReceived(callback, data, this.uuid || pub, false, key, pub);});\n }\n if (!this.uuid) {\n // Subscribe to our messages\n const ourSecretChannelId = await this.getOurSecretChannelId(pub);\n // TODO map().once\n userState().get(`chats`).get(ourSecretChannelId).get(`msgs`).map((data, key) => {this.messageReceived(callback, data, pub, true, key, session.getKey().pub);});\n }\n });\n if (this.uuid) {\n // Subscribe to our messages\n const mySecretUuid = await this.getMySecretUuid();\n // TODO map().once\n userState().get(`chats`).get(mySecretUuid).get(`msgs`).map((data, key) => {this.messageReceived(callback, data, this.uuid, true, key, session.getKey().pub);});\n }\n }\n\n async messageReceived(callback, data, channelId, selfAuthored, key, from) {\n if (this.messages[key] || !data) {\n return;\n }\n const secret = this.uuid ? (await this.getTheirGroupSecret(from)) : (await this.getSecret(channelId));\n const decrypted = await Key.decrypt(data, secret);\n if (typeof decrypted !== `object`) {\n return;\n }\n const info = {selfAuthored, channelId, from};\n this.messages[key] = decrypted;\n callback(decrypted, info);\n }\n\n /**\n * Get latest message in this channel. Useful for channel listing.\n */\n async getLatestMsg(callback) {\n const callbackIfLatest = async (msg, info) => {\n if (!this.latest) {\n this.latest = msg;\n callback(msg, info);\n } else {\n const t = (typeof this.latest.time === `string` ? this.latest.time : this.latest.time.toISOString());\n if (t < msg.time) {\n this.latest = msg;\n callback(msg, info);\n }\n }\n };\n this.onMy('latestMsg', msg => callbackIfLatest(msg, {selfAuthored: true, from: session.getKey().pub}));\n this.onTheir('latestMsg', (msg, k, from) => callbackIfLatest(msg, {selfAuthored: false, from}));\n }\n\n /**\n * Useful for notifications\n * @param {integer} time last seen msg time (default: now)\n */\n async setMyMsgsLastSeenTime(time?: string) {\n time = time || new Date().toISOString();\n return this.put(`msgsLastSeenTime`, time);\n }\n\n /**\n * Useful for notifications\n */\n async getMyMsgsLastSeenTime(callback) {\n this.onMy(`msgsLastSeenTime`, time => {\n this.myMsgsLastSeenTime = time;\n if (callback) {\n callback(this.myMsgsLastSeenTime);\n }\n });\n }\n\n /**\n * For \"seen\" status indicator\n */\n async getTheirMsgsLastSeenTime(callback) {\n this.onTheir(`msgsLastSeenTime`, time => {\n this.theirMsgsLastSeenTime = time;\n if (callback) {\n callback(this.theirMsgsLastSeenTime);\n }\n });\n }\n\n async removeParticipant(pub) {\n this.addParticipant(pub, true, {read: false, write: false});\n }\n\n /**\n * Add a public key to the channel or update its permissions\n * @param {string} pub\n */\n async addParticipant(pub: string, save = true, permissions?: any, subscribe?: boolean) {\n if (this.uuid) {\n return;\n }\n if (permissions === undefined) {\n permissions = DEFAULT_PERMISSIONS;\n }\n if (this.secrets[pub] && JSON.stringify(this.secrets[pub]) === JSON.stringify(permissions)) { // TODO: should be this.participants[pub]\n return;\n }\n this.secrets[pub] = null;\n this.getSecret(pub);\n const ourSecretChannelId = await this.getOurSecretChannelId(pub);\n if (save) {\n // Save their public key in encrypted format, so in channel listing we know who we are channeling with\n const mySecret = await Key.secret(session.getKey().epub, session.getKey());\n publicState().user().get(`chats`).get(ourSecretChannelId).get(`pub`).put(await Key.encrypt({pub}, mySecret));\n }\n if (this.uuid) {\n this.participants[pub] = permissions;\n if (save) {\n this.putDirect(`S${this.uuid}`, this.getMyGroupSecret());\n this.getMySecretUuid().then(s => {\n this.putDirect(this.uuid, s); // TODO: encrypt keys in put()\n });\n this.onTheirDirect(this.uuid, (s, k, from) => {\n this.theirSecretUuids[from] = s;\n });\n this.onTheirDirect(`S${this.uuid}`, (s, k, from) => {\n this.theirGroupSecrets[from] = s;\n });\n this.save();\n }\n }\n if (subscribe) {\n Object.values(this.directSubscriptions).forEach(arr => {\n arr.forEach(o => {\n if (!o.from || o.from === pub) {\n this._onTheirDirectFromUser(pub, o.key, o.callback);\n }\n });\n });\n Object.values(this.groupSubscriptions).forEach(arr => {\n arr.forEach(o => {\n if (o.from && o.from !== pub) { return; }\n if (permissions.write) {\n this._onTheirGroupFromUser(pub, o.key, o.callback);\n } else { // unsubscribe\n o.event && o.event.off();\n }\n });\n });\n }\n }\n\n /**\n * Send a message to the channel\n * @param msg string or {time, text, ...} object\n */\n async send(msg) {\n if (typeof msg === `string`) {\n msg = msg.trim();\n if (msg.length === 0) {\n return;\n }\n msg = {\n time: (new Date()).toISOString(),\n text: msg\n };\n } else if (typeof msg === `object`) {\n msg.time = msg.time || (new Date()).toISOString();\n } else {\n throw new Error(`msg param must be a string or an object`);\n }\n //publicState().user().get('message').set(temp);\n if (this.uuid) {\n const encrypted = await Key.encrypt(JSON.stringify(msg), this.getMyGroupSecret());\n const mySecretUuid = await this.getMySecretUuid();\n userState().get(`chats`).get(mySecretUuid).get(`msgs`).get(`${msg.time}`).put(encrypted);\n userState().get(`chats`).get(mySecretUuid).get(`latestMsg`).put(encrypted);\n } else {\n const keys = this.getCurrentParticipants();\n for (let i = 0;i < keys.length;i++) {\n const encrypted = await Key.encrypt(JSON.stringify(msg), (await this.getSecret(keys[i])));\n const ourSecretChannelId = await this.getOurSecretChannelId(keys[i]);\n userState().get(`chats`).get(ourSecretChannelId).get(`msgs`).get(`${msg.time}`).put(encrypted);\n userState().get(`chats`).get(ourSecretChannelId).get(`latestMsg`).put(encrypted);\n }\n }\n }\n\n /**\n * Save the channel to our channels list without sending a message\n */\n async save() {\n if (this.uuid) {\n const mySecretUuid = await this.getMySecretUuid();\n userState().get(`chats`).get(mySecretUuid).get('msgs').get('a').put(null);\n this.put(`participants`, this.participants); // public participants list\n const mySecret = await Key.secret(session.getKey().epub, session.getKey());\n userState().get(`chats`).get(mySecretUuid).get(`pub`).put(await Key.encrypt({\n uuid: this.uuid,\n myGroupSecret: this.getMyGroupSecret(),\n participants: this.participants // private participants list\n }, mySecret));\n this.participantsChanged();\n } else {\n const keys = this.getCurrentParticipants();\n for (let i = 0;i < keys.length;i++) {\n const ourSecretChannelId = await this.getOurSecretChannelId(keys[i]);\n userState().get(`chats`).get(ourSecretChannelId).get('msgs').get('a').put(null);\n }\n }\n }\n\n /**\n * Save a key-value pair, encrypt value. Each participant in the Channel writes to their own version of the key-value pair — they don't overwrite the same one.\n * @param {string} key\n * @param value\n */\n async put(key, value) {\n return (this.uuid ? this.putGroup : this.putDirect).call(this, key, value);\n }\n\n async putGroup(key, value) {\n if (key === `msgs`) { throw new Error(`Sorry, you can't overwrite the msgs field which is used for .send()`); }\n const encrypted = await Key.encrypt(JSON.stringify(value), this.getMyGroupSecret());\n const mySecretUuid = await this.getMySecretUuid();\n userState().get(`chats`).get(mySecretUuid).get(key).put(encrypted);\n }\n\n async putDirect(key, value) {\n if (key === `msgs`) { throw new Error(`Sorry, you can't overwrite the msgs field which is used for .send()`); }\n const keys = this.getCurrentParticipants();\n for (let i = 0;i < keys.length;i++) {\n const encrypted = await Key.encrypt(JSON.stringify(value), (await this.getSecret(keys[i])));\n const ourSecretChannelId = await this.getOurSecretChannelId(keys[i]);\n userState().get(`chats`).get(ourSecretChannelId).get(key).put(encrypted);\n }\n }\n\n /**\n * Subscribe to a key-value pair. Callback returns every participant's value unless you limit it with *from* param.\n * @param {string} key\n * @param {function} callback\n * @param {string} from public key whose value you want, or *\"me\"* for your value only, or *\"them\"* for the value of others only\n */\n async on(key: string, callback: Function, from?: string) {\n return (this.uuid ? this.onGroup : this.onDirect).call(this, key, callback, from);\n }\n\n async onDirect(key: string, callback: Function, from?: string) {\n if (!from || from === `me` || from === session.getKey().pub) {\n this.onMy(key, (val: any) => callback(val, session.getKey().pub));\n }\n if (!from || (from !== `me` && from !== session.getKey().pub)) {\n this.onTheir(key, (val: any, k: string, pub: string) => callback(val, pub));\n }\n }\n\n async onGroup(key: string, callback: Function, from?: string) {\n if (!from || from === `me` || from === session.getKey().pub) {\n this.onMyGroup(key, val => callback(val, session.getKey().pub));\n }\n if (!from || (from !== `me` && from !== session.getKey().pub)) {\n this.onTheirGroup(key, (val, k, pub) => callback(val, pub));\n }\n }\n\n async onMy(key: string, callback: Function) {\n return (this.uuid ? this.onMyGroup : this.onMyDirect).call(this, key, callback);\n }\n\n async onMyDirect(key: string, callback: Function) {\n if (typeof callback !== 'function') {\n throw new Error(`onMy callback must be a function, got ${typeof callback}`);\n }\n const keys = this.getCurrentParticipants();\n for (let i = 0;i < keys.length;i++) {\n const ourSecretChannelId = await this.getOurSecretChannelId(keys[i]);\n publicState().user().get(`chats`).get(ourSecretChannelId).get(key).on(async (data: any) => {\n const decrypted = await Key.decrypt(data, (await this.getSecret(keys[i])));\n if (decrypted) {\n callback(typeof decrypted.v !== `undefined` ? decrypted.v : decrypted, key);\n }\n });\n break;\n }\n }\n\n async onMyGroup(key, callback) {\n if (typeof callback !== 'function') {\n throw new Error(`onMy callback must be a function, got ${typeof callback}`);\n }\n const mySecretUuid = await this.getMySecretUuid();\n const mySecret = await this.getMyGroupSecret();\n publicState().user().get(`chats`).get(mySecretUuid).get(key).on(async data => {\n const decrypted = await Key.decrypt(data, mySecret);\n if (decrypted) {\n callback(typeof decrypted.v !== `undefined` ? decrypted.v : decrypted, key, session.getKey().pub);\n }\n });\n }\n\n async onTheir(key: string, callback: Function, from: string) {\n return (this.uuid ? this.onTheirGroup : this.onTheirDirect).call(this, key, callback, from);\n }\n\n async _onTheirDirectFromUser(key: string, callback: Function, pub: string) {\n if (!this.hasWritePermission(pub)) { return; }\n const theirSecretChannelId = await this.getTheirSecretChannelId(pub);\n publicState().user(pub).get(`chats`).get(theirSecretChannelId).get(key).on(async (data: any) => {\n if (!this.hasWritePermission(pub)) { return; }\n const decrypted = await Key.decrypt(data, (await this.getSecret(pub)));\n if (decrypted) {\n callback(typeof decrypted.v !== `undefined` ? decrypted.v : decrypted, key, pub);\n }\n });\n }\n\n async onTheirDirect(key: string, callback: Function, from: string) { // TODO: subscribe to new channel participants\n if (typeof callback !== 'function') {\n throw new Error(`onTheir callback must be a function, got ${typeof callback}`);\n }\n if (!Object.prototype.hasOwnProperty.call(this.directSubscriptions, key)) {\n this.directSubscriptions[key] = [];\n }\n this.directSubscriptions[key].push({key, callback, from});\n const participants = this.getCurrentParticipants();\n participants.forEach(async pub => {\n if (from && pub !== from) { return; }\n this._onTheirDirectFromUser(pub, key, callback);\n });\n }\n\n hasWritePermission(pub) {\n return !this.uuid || (this.participants && this.participants[pub] && this.participants[pub].write);\n }\n\n async _onTheirGroupFromUser(pub: string, key: string, callback: Function, subscription: any) {\n if (!this.hasWritePermission(pub)) { return; }\n const theirSecretUuid = await this.getTheirSecretUuid(pub);\n publicState().user(pub).get(`chats`).get(theirSecretUuid).get(key).on(async (data: any, _a: any, _b: any, e: Event) => {\n if (subscription) { subscription.event = e; }\n if (!this.hasWritePermission(pub)) { return; }\n const decrypted = await Key.decrypt(data, (await this.getTheirGroupSecret(pub)));\n if (decrypted) {\n callback(typeof decrypted.v !== `undefined` ? decrypted.v : decrypted, key, pub);\n }\n });\n }\n\n async onTheirGroup(key, callback, from) {\n if (typeof callback !== 'function') {\n throw new Error(`onTheir callback must be a function, got ${typeof callback}`);\n }\n if (!Object.prototype.hasOwnProperty.call(this.groupSubscriptions, key)) {\n this.groupSubscriptions[key] = [];\n }\n const subscription = {key, callback, from};\n this.groupSubscriptions[key].push(subscription);\n\n this.getParticipants(participants => {\n Object.keys(participants).forEach(async pub => {\n if (from && pub !== from) { return; }\n if (!(participants[pub] && participants[pub].write)) { return; }\n this._onTheirGroupFromUser(pub, key, callback, subscription);\n });\n });\n }\n\n /**\n * Set typing status\n */\n setTyping(isTyping, timeout = 5) {\n isTyping = typeof isTyping === `undefined` ? true : isTyping;\n timeout = timeout * 1000;\n this.put(`typing`, isTyping ? new Date().toISOString() : new Date(0).toISOString());\n clearTimeout(this.setTypingTimeout);\n this.setTypingTimeout = setTimeout(() => this.put(`typing`, false), timeout);\n }\n\n /**\n * Get typing status\n */\n getTyping(callback, timeout = 5) { // TODO callback not called on setTyping(false), at least for self chat\n timeout = timeout * 1000;\n this.onTheir(`typing`, (typing, key, pub) => {\n if (callback) {\n const isTyping = typing && new Date() - new Date(typing) <= timeout;\n callback(isTyping, pub);\n this.getTypingTimeouts = this.getTypingTimeouts || {};\n clearTimeout(this.getTypingTimeouts[pub]);\n if (isTyping) {\n this.getTypingTimeouts[pub] = setTimeout(() => callback(false, pub), timeout);\n }\n }\n });\n }\n\n /**\n * Get a simple link that points to the channel.\n *\n * Direct channel: both users need to give their simple links. Use createChatLink() to get a two-way link that needs to be given by one user only.\n *\n * Group channel: Works only if the link recipient has been already added onto the channel participants list.\n */\n getSimpleLink(urlRoot = 'https://iris.to/') {\n if (this.uuid) {\n return `${urlRoot}?channelId=${this.uuid}&inviter=${session.getKey().pub}`;\n }\n return `${urlRoot}?chatWith=${this.getCurrentParticipants()[0]}`;\n }\n\n /**\n *\n */\n async getChatLinks(opts: any = {}) {\n let {callback, urlRoot, subscribe} = opts;\n urlRoot = urlRoot || 'https://iris.to/';\n if (!this.uuid) { throw new Error('Only group channels may have chat links'); }\n const chatLinks: any[] = [];\n const chatLinkSubscriptions = {};\n this.on('chatLinks', (links: any, from: string) => {\n // TODO: check admin permissions\n if (!links || typeof links !== 'object') { return; }\n Object.keys(links).forEach(linkId => {\n const link = links[linkId];\n if (link === null) {\n chatLinkSubscriptions[linkId] && chatLinkSubscriptions[linkId].off(); // unsubscribe removed chat link\n delete chatLinkSubscriptions[linkId];\n callback && callback({id: linkId, url: null});\n return;\n }\n if (chatLinks.indexOf(linkId) !== -1) { return; }\n const channels = [];\n chatLinks.push(linkId);\n const url = Channel.formatChatLink({urlRoot, inviter: from, channelId: this.uuid, sharedSecret: link.sharedSecret, linkId});\n callback && callback({url, id: linkId});\n if (subscribe) {\n publicState().user(link.sharedKey.pub).get('chatRequests').map(async (encPub, requestId, a, e) => {\n if (!encPub || typeof encPub !== 'string' || encPub.length < 10) { return; }\n chatLinkSubscriptions[linkId] = e;\n const s = JSON.stringify(encPub);\n if (channels.indexOf(s) === -1) {\n channels.push(s);\n const pub = await Key.decrypt(encPub, link.sharedSecret);\n this.addParticipant(pub, undefined, undefined, true);\n }\n });\n }\n });\n });\n }\n\n async createChatLink(urlRoot = 'https://iris.to/') {\n const sharedKey = await Key.generate();\n const sharedKeyString = JSON.stringify(sharedKey);\n const sharedSecret = await Key.secret(sharedKey.epub, sharedKey);\n const encryptedSharedKey = await Key.encrypt(sharedKeyString, sharedSecret);\n const ownerSecret = await Key.secret(session.getKey().epub, session.getKey());\n const ownerEncryptedSharedKey = await Key.encrypt(sharedKeyString, ownerSecret);\n let linkId = await util.getHash(encryptedSharedKey);\n linkId = linkId.slice(0, 12);\n\n // User has to exist, in order for .get(chatRequests).on() to be ever triggered\n publicState(sharedKey).get('chatRequests').put({a: 1});\n\n this.chatLinks[linkId] = {sharedKey, sharedSecret};\n this.put('chatLinks', this.chatLinks);\n userState().get('chatLinks').get(linkId).put({encryptedSharedKey, ownerEncryptedSharedKey});\n\n return Channel.formatChatLink({urlRoot, channelId: this.uuid, inviter: session.getKey().pub, sharedSecret, linkId});\n }\n\n /**\n * Set the user's online/active status\n * @param {string} activity string: set the activity status every 3 seconds, null/false: stop updating\n */\n static setActivity(activity) {\n if (publicState().irisActivityStatus === activity) { return; }\n publicState().irisActivityStatus = activity;\n clearTimeout(publicState().setActivityTimeout);\n const update = () => {\n publicState().user().get(`activity`).put({status: activity, time: new Date().toISOString()});\n };\n update();\n function timerUpdate() {\n update();\n publicState().setActivityTimeout = setTimeout(timerUpdate, 3000);\n }\n if (activity) {\n timerUpdate();\n }\n }\n\n /**\n * Get the online status of a user.\n *\n * @param {string} pubKey public key of the user\n * @param {boolean} callback receives a boolean each time the user's online status changes\n */\n static getActivity(pubKey, callback) {\n let timeout;\n publicState().user(pubKey).get(`activity`).on(activity => {\n if (!activity || !(activity.time && activity.status)) { return; }\n clearTimeout(timeout);\n const now = new Date();\n const activityDate = new Date(activity.time);\n const isActive = activityDate > new Date(now.getTime() - 10 * 1000) && activityDate < new Date(now.getTime() + 30 * 1000);\n callback({isActive, lastActive: activity.time, status: activity.status});\n if (isActive) {\n timeout = setTimeout(() => callback({isOnline: false, lastActive: activity.time}), 10000);\n }\n });\n }\n\n static formatChatLink({urlRoot, chatWith, channelId, inviter, sharedSecret, linkId}) {\n const enc = encodeURIComponent;\n if (channelId && inviter) {\n return `${urlRoot}?channelId=${enc(channelId)}&inviter=${enc(inviter)}&s=${enc(sharedSecret)}&k=${enc(linkId)}`;\n }\n return `${urlRoot}?chatWith=${enc(chatWith)}&s=${enc(sharedSecret)}&k=${enc(linkId)}`;\n }\n\n /**\n * Creates a channel link that can be used for two-way communication, i.e. only one link needs to be exchanged.\n */\n static async createChatLink(urlRoot = 'https://iris.to/') {\n const user = publicState().user();\n const key = session.getKey();\n\n // We create a new Gun user whose private key is shared with the chat link recipients.\n // Chat link recipients can contact you by writing their public key to the shared key's user space.\n const sharedKey = await Key.generate();\n const sharedKeyString = JSON.stringify(sharedKey);\n const sharedSecret = await Key.secret(sharedKey.epub, sharedKey);\n const encryptedSharedKey = await Key.encrypt(sharedKeyString, sharedSecret);\n const ownerSecret = await Key.secret(key.epub, key);\n const ownerEncryptedSharedKey = await Key.encrypt(sharedKeyString, ownerSecret);\n let linkId = await util.getHash(encryptedSharedKey);\n linkId = linkId.slice(0, 12);\n\n // User has to exist, in order for .get(chatRequests).on() to be ever triggered\n publicState(sharedKey).get('chatRequests').put({a: 1}).get('chatRequests').put({a: 1});\n\n user.get('chatLinks').get(linkId).put({encryptedSharedKey, ownerEncryptedSharedKey});\n\n return Channel.formatChatLink({urlRoot, chatWith: key.pub, sharedSecret, linkId});\n }\n\n /**\n *\n */\n static async getMyChatLinks(urlRoot = 'https://iris.to/', callback: Function, subscribe = false) {\n const key = session.getKey();\n const user = publicState().user();\n const mySecret = await Key.secret(key.epub, key);\n const chatLinks = [];\n user.get('chatLinks').map((data, linkId) => {\n if (!data || chatLinks.indexOf(linkId) !== -1) { return; }\n const channels = [];\n user.get('chatLinks').get(linkId).get('ownerEncryptedSharedKey').on(async enc => {\n if (!enc || chatLinks.indexOf(linkId) !== -1) { return; }\n chatLinks.push(linkId);\n const sharedKey = await Key.decrypt(enc, mySecret);\n const sharedSecret = await Key.secret(sharedKey.epub, sharedKey);\n const url = Channel.formatChatLink({urlRoot, chatWith: key.pub, sharedSecret, linkId});\n if (callback) {\n callback({url, id: linkId});\n }\n if (subscribe) {\n publicState().user(sharedKey.pub).get('chatRequests').map(async (encPub, requestId) => {\n if (!encPub) { return; }\n const s = JSON.stringify(encPub);\n if (channels.indexOf(s) === -1) {\n channels.push(s);\n const pub = await Key.decrypt(encPub, sharedSecret);\n const channel = new Channel({key, participants: pub});\n channel.save();\n }\n publicState(sharedKey).get('chatRequests').get(requestId).put(null);\n });\n }\n });\n });\n }\n\n /**\n *\n */\n removeGroupChatLink(linkId) {\n this.chatLinks[linkId] = null;\n this.put('chatLinks', this.chatLinks);\n publicState().user().get('chatLinks').get(linkId).put(null);\n }\n\n /**\n *\n */\n static removePrivateChatLink(key, linkId) {\n publicState().user().auth(key);\n publicState().user().get('chatLinks').get(linkId).put(null);\n }\n\n /**\n *\n */\n static async deleteChannel(key, pub) {\n publicState().user().auth(key);\n const channelId = await Channel.getOurSecretChannelId(pub, key);\n publicState().user().get('channels').get(channelId).put(null);\n publicState().user().get('channels').get(channelId).off();\n }\n\n /**\n *\n */\n static async deleteGroup(key, uuid) {\n const mySecret = await Key.secret(key.epub, key);\n const mySecretHash = await util.getHash(mySecret);\n const mySecretUuid = await util.getHash(mySecretHash + uuid);\n publicState().user().auth(key);\n publicState().user().get('channels').get(mySecretUuid).put(null);\n publicState().user().get('channels').get(mySecretUuid).off();\n }\n}\n\nexport default Channel;\n","import Node from './db/Node';\n\nlet local: Node;\n\n/**\n * Get a state that is only synced in memory and local storage.\n *\n * Useful for storing things like UI state, local indexes or logged in user.\n * @returns {Node}\n */\nexport default function() {\n if (!local) {\n local = new Node('local');\n }\n return local;\n}","import Channel from './Channel';\nimport session from './session';\n\nconst channels = new Map();\n\n/**\n * Private channel that only you and publicKey can read/write.\n * @param publicKey\n * @returns {Channel}\n */\nexport default function(publicKey = session.getKey(), chatLink?: string): Channel {\n let channel = channels.get(publicKey);\n if (!channel) {\n channel = new Channel({participants: publicKey, chatLink})\n channels.set(publicKey, channel);\n }\n return channel;\n}","import local from './local';\n\nlet blockedUsers: { [key: string]: boolean } = {};\n\nexport default function() {\n if (!blockedUsers) {\n blockedUsers = {};\n local().get('block').map((isBlocked: boolean, user: string) => {\n if (isBlocked === blockedUsers[user]) { return; }\n if (isBlocked) {\n blockedUsers[user] = isBlocked;\n local().get('groups').map((_v: any, k: string) => {\n local().get('groups').get(k).get(user).put(false);\n });\n } else {\n delete blockedUsers[user];\n }\n });\n }\n return blockedUsers;\n}","import local from \"./local\";\nimport userSpace from './public';\nimport blockedUsers from './blockedUsers';\n\nlet counter = 0;\nconst cache = new Map>();\nconst callbacks = new Map();\n\ntype Event = {\n off: () => void;\n}\n\n/**\n * Aggregates public data from all users in the group.\n *\n * For example, the public message feed, message replies and likes are aggregated using this.\n * @param groupName\n * @returns object\n */\nexport default function(groupName = 'everyone') {\n return {\n get(path: string, callback: any) {\n const groupNode = local().get('groups').get(groupName);\n const follows: { [key: string]: boolean; } = {};\n requestAnimationFrame(() => {\n groupNode.map((isFollowing: any, user: string) => {\n if (blockedUsers()[user]) { return; } // TODO: allow to specifically query blocked users?\n if (follows[user] && follows[user] === isFollowing) { return; }\n follows[user] = isFollowing;\n if (isFollowing) { // TODO: callback on unfollow, for unsubscribe\n let node = userSpace(user);\n if (path && path !== '/') {\n node = path.split('/').reduce((sum:any, s:string) => sum.get(decodeURIComponent(s)), node);\n }\n callback(node, user);\n }\n });\n });\n },\n\n _cached_map(cached: Map | undefined, cacheKey: string, path: string, myEvent: Event, callback: Function) {\n if (!cached) {\n const cached = new Map();\n cache.set(cacheKey, cached);\n this.get(path, (node: any, from: string) => node.map((value: any, key: string, x: any) => {\n const item = {value, key, from};\n cached.set(key, item);\n for (let cb of callbacks.get(cacheKey).values()) {\n cb(value, key, x, myEvent, from);\n }\n }));\n } else {\n for (let item of cached.values()) {\n callback(item.value, item.key, 0, myEvent, item.from);\n }\n }\n },\n\n // TODO: this should probably store just the most recent value, not everyone's value\n // TODO: for counting of likes etc, use this.count() instead\n _cached_on(cached: Map | undefined, cacheKey: string, path: string, myEvent: Event, callback: Function) {\n if (!cached) {\n const cached = new Map();\n cache.set(cacheKey, cached);\n this.get(path, (node: any, from: string) => node.on((value: any, key: string, x: any) => {\n const item = {value, key, from};\n cached.set(from, item);\n for (let cb of callbacks.get(cacheKey).values()) {\n cb(value, key, x, myEvent, from);\n }\n }));\n } else {\n for (let item of cached.values()) {\n callback(item.value, item.key, 0, myEvent, item.from);\n }\n }\n },\n\n _cached_count(cached: Map | undefined, cacheKey: string, path: string, myEvent: Event, callback: Function) {\n if (!cached) {\n const cached = new Map();\n cache.set(cacheKey, cached);\n this.get(path, (node: any, from: string) => node.on((value: any, key: string) => {\n value ? cached.set(from, true) : cached.delete(from);\n const count = cached.size;\n for (let cb of callbacks.get(cacheKey).values()) {\n cb(count, key, null, myEvent, from);\n }\n }));\n } else {\n callback(cached.size, path.split('/').pop(), null, myEvent);\n }\n },\n\n _cached_fn(fn: string, path: string, callback: Function) {\n const cacheKey = `${fn}:${groupName}:${path}`;\n\n let callbackId = counter++;\n if (callbacks.has(cacheKey)) {\n callbacks.get(cacheKey).set(callbackId, callback);\n } else {\n callbacks.set(cacheKey, new Map([[callbackId, callback]]));\n }\n\n const myEvent = {off: () => {\n let myCallbacks = callbacks.get(cacheKey);\n myCallbacks && myCallbacks.delete(callbackId);\n }};\n\n const cached = cache.get(cacheKey);\n\n switch (fn) {\n case 'map':\n this._cached_map(cached, cacheKey, path, myEvent, callback);\n break;\n case 'on':\n this._cached_on(cached, cacheKey, path, myEvent, callback);\n break;\n case 'count':\n this._cached_count(cached, cacheKey, path, myEvent, callback);\n break;\n }\n },\n\n map(path: string, callback: Function) { // group queries are slow, so we cache them\n this._cached_fn('map', path, callback);\n },\n\n on(path: string, callback: Function) {\n this._cached_fn('on', path, callback);\n },\n\n count(path: string, callback: Function) {\n this._cached_fn('count', path, callback);\n }\n }\n}","// @ts-nocheck\n\nimport _ from './lodash';\nimport session from './session';\nimport util from './util';\nimport publicState from './global';\nimport privateState from './private';\nimport local from './local';\nimport group from './group';\nimport Key from './Key';\n\nconst NOTIFICATION_SERVICE_URL = 'https://iris-notifications.herokuapp.com/notify';\n// const notificationSound = new Audio('../../assets/audio/notification.mp3'); // TODO\nlet loginTime;\nlet unseenMsgsTotal = 0;\nlet unseenNotificationCount = 0;\nconst webPushSubscriptions = {};\n\nfunction desktopNotificationsEnabled() {\n return window.Notification && Notification.permission === 'granted';\n}\n\nfunction notifyMsg(msg, info, channelId, onClick) {\n function shouldNotify() {\n if (msg.timeObj < loginTime) { return false; }\n if (info.selfAuthored) { return false; }\n if (document.visibilityState === 'visible') { return false; }\n const channel = privateState(channelId);\n if (channel.notificationSetting === 'nothing') { return false; }\n if (channel.notificationSetting === 'mentions' && !msg.text.includes(session.getMyName())) { return false; }\n return true;\n }\n function shouldDesktopNotify() {\n if (!desktopNotificationsEnabled()) { return false; }\n return shouldNotify();\n }\n function shouldAudioNotify() {\n return shouldNotify();\n }\n if (shouldAudioNotify()) {\n //notificationSound.play(); // TODO\n }\n if (shouldDesktopNotify()) {\n let body, title;\n const channel = privateState(channelId);\n if (channel.uuid) {\n title = channel.participantProfiles[info.from].name;\n body = `${name}: ${msg.text}`;\n } else {\n title = 'Message'\n body = msg.text;\n }\n body = util.truncateString(body, 50);\n let desktopNotification = new Notification(title, { // TODO: replace with actual name\n icon: '/assets/img/icon128.png',\n body,\n silent: true\n });\n desktopNotification.onclick = function() {\n changeUnseenNotificationCount(-1);\n onClick && onClick();\n window.focus();\n };\n }\n}\n\nfunction changeChatUnseenMsgsCount(chatId, change) {\n const chat = privateState(chatId);\n if (!chat) return;\n const chatNode = local().get('channels').get(chatId);\n if (change) {\n unseenMsgsTotal += change;\n chat.unseen += change;\n } else {\n unseenMsgsTotal = unseenMsgsTotal - (chat.unseen || 0);\n chat.unseen = 0;\n }\n chatNode.get('unseen').put(chat.unseen);\n unseenMsgsTotal = unseenMsgsTotal >= 0 ? unseenMsgsTotal : 0;\n local().get('unseenMsgsTotal').put(unseenMsgsTotal);\n}\n\nconst publicVapidKey = 'BMqSvZArOIdn7vGkYplSpkZ70-Qt8nhYbey26WVa3LF3SwzblSzm3n3HHycpNkAKVq7MCkrzFuTFs_en7Y_J2MI';\n\nfunction urlBase64ToUint8Array(base64String) {\n const padding = '='.repeat((4 - base64String.length % 4) % 4);\n const base64 = (base64String + padding)\n .replace(/-/g, '+')\n .replace(/_/g, '/');\n\n const rawData = window.atob(base64);\n const outputArray = new Uint8Array(rawData.length);\n\n for (let i = 0; i < rawData.length; ++i) {\n outputArray[i] = rawData.charCodeAt(i);\n }\n return outputArray;\n}\n\nasync function subscribe(reg) {\n try {\n const subscription = await reg.pushManager.subscribe({\n userVisibleOnly: true,\n applicationServerKey: urlBase64ToUint8Array(publicVapidKey)\n });\n addWebPushSubscription(subscription);\n } catch (e) {\n console.error('web push subscription error', e);\n }\n}\n\nasync function subscribeToWebPush() {\n console.log('subscribing to web push', navigator.serviceWorker);\n if (!desktopNotificationsEnabled() || !navigator.serviceWorker) { return false; }\n await navigator.serviceWorker.ready;\n const reg = await navigator.serviceWorker.getRegistration();\n reg.active.postMessage({key: session.getKey()});\n const sub = await reg.pushManager.getSubscription();\n sub ? addWebPushSubscription(sub) : subscribe(reg);\n}\n\nconst addWebPushSubscriptionsToChats = _.debounce(() => {\n const arr = Object.values(webPushSubscriptions);\n session.channelIds.forEach(channelId => {\n privateState(channelId).put('webPushSubscriptions', arr);\n });\n}, 5000);\n\nfunction removeSubscription(hash) {\n delete webPushSubscriptions[hash];\n publicState().user().get('webPushSubscriptions').get(hash).put(null);\n addWebPushSubscriptionsToChats();\n}\n\nasync function addWebPushSubscription(s, saveToGun = true) {\n const myKey = session.getKey();\n const mySecret = await Key.secret(myKey.epub, myKey);\n const enc = await Key.encrypt(s, mySecret);\n const hash = await util.getHash(JSON.stringify(s));\n if (saveToGun) {\n publicState().user().get('webPushSubscriptions').get(hash).put(enc);\n }\n webPushSubscriptions[hash] = s;\n addWebPushSubscriptionsToChats();\n}\n\nasync function getWebPushSubscriptions() {\n const myKey = session.getKey();\n const mySecret = await Key.secret(myKey.epub, myKey);\n publicState().user().get('webPushSubscriptions').map(async enc => {\n if (!enc) { return; }\n const s = await Key.decrypt(enc, mySecret);\n addWebPushSubscription(s, false);\n });\n}\n\nfunction getEpub(user) {\n return new Promise(resolve => {\n publicState().user(user).get('epub').on(async (epub,k,x,e) => {\n if (epub) {\n e.off();\n resolve(epub);\n }\n });\n });\n}\n\nasync function getNotificationText(notification) {\n const profile = await publicState().user(notification.from).get('profile').once();\n const name = (profile && profile.name) || 'someone';\n const event = notification.event || notification.action;\n let eventText;\n if (event === 'like') eventText = `${name} liked your post`;\n else if (event === 'reply') eventText = `${name} replied to your post`;\n else if (event === 'mention') eventText = `${name} mentioned you in their post`;\n else if (event === 'follow') eventText = `${name} started following you`;\n else eventText = `${name} sent you a notification: ${event}`;\n return eventText;\n}\n\nfunction subscribeToIrisNotifications(onClick?: Function) {\n let notificationsSeenTime: any;\n let notificationsShownTime: any;\n publicState().user().get('notificationsSeenTime').on(v => {\n notificationsSeenTime = v;\n console.log(v);\n });\n publicState().user().get('notificationsShownTime').on(v => notificationsShownTime = v);\n const setNotificationsShownTime = _.debounce(() => {\n publicState().user().get('notificationsShownTime').put(new Date().toISOString());\n }, 1000);\n const alreadyHave = new Set();\n group().on(`notifications/${session.getPubKey()}`, async (encryptedNotification, k, x, e, from) => {\n const id = from.slice(0,30) + encryptedNotification.slice(0,30);\n if (alreadyHave.has(id)) { return; }\n alreadyHave.add(id);\n const epub = await getEpub(from);\n const secret = await Key.secret(epub, session.getKey());\n const notification = await Key.decrypt(encryptedNotification, secret);\n if (!notification || typeof notification !== 'object') { return; }\n setNotificationsShownTime();\n notification.from = from;\n local().get('notifications').get(notification.time).put(notification);\n if (!notificationsSeenTime || (notificationsSeenTime < notification.time)) {\n changeUnseenNotificationCount(1);\n }\n if (!notificationsShownTime || notificationsShownTime < notification.time) {\n console.log('was new!');\n const text = await getNotificationText(notification);\n let desktopNotification = new Notification(text, {\n icon: '/assets/img/icon128.png',\n body: text,\n silent: true\n });\n desktopNotification.onclick = function() {\n const link = notification.target ? `/post/${notification.target}` : `/profile/${notification.from}`;\n onClick && onClick(link);\n changeUnseenNotificationCount(-1);\n window.focus();\n };\n }\n });\n}\n\nfunction changeUnseenNotificationCount(change) {\n if (!change) {\n unseenNotificationCount = 0;\n publicState().user().get('notificationsSeenTime').put(new Date().toISOString());\n } else {\n unseenNotificationCount += change;\n unseenNotificationCount = Math.max(unseenNotificationCount, 0);\n }\n local().get('unseenNotificationCount').put(unseenNotificationCount);\n}\n\nasync function sendIrisNotification(recipient, notification) {\n if (!(recipient && notification)) { return; } // TODO: use typescript or sth :D\n if (typeof notification === 'object') { notification.time = new Date().toISOString() }\n const epub = await getEpub(recipient);\n const secret = await Key.secret(epub, session.getKey());\n const enc = await Key.encrypt(notification, secret);\n publicState().user().get('notifications').get(recipient).put(enc);\n}\n\nasync function sendWebPushNotification(recipient, notification) {\n console.log('sending web push notification to', recipient, notification);\n const channel = privateState(recipient);\n const myKey = session.getKey();\n const shouldWebPush = (recipient === myKey.pub) || !(channel.activity && channel.activity.isActive);\n if (shouldWebPush && channel.webPushSubscriptions) {\n const subscriptions = [];\n const participants = Object.keys(channel.webPushSubscriptions);\n for (let i = 0; i < participants.length; i++) {\n const participant = participants[i];\n const secret = await channel.getSecret(participant);\n const payload = {\n title: await Key.encrypt(notification.title, secret),\n body: await Key.encrypt(notification.body, secret),\n from:{pub: myKey.pub, epub: myKey.epub}\n };\n channel.webPushSubscriptions[participant].forEach(s => {\n if (s && s.endpoint) {\n subscriptions.push({subscription: s, payload});\n }\n });\n }\n if (subscriptions.length === 0) {return;}\n fetch(NOTIFICATION_SERVICE_URL, {\n method: 'POST',\n body: JSON.stringify({subscriptions}),\n headers: {\n 'content-type': 'application/json'\n }\n }).catch(() => {});\n }\n}\n\nfunction init() {\n loginTime = new Date();\n unseenMsgsTotal = 0;\n}\n\nexport default {init, notifyMsg, getNotificationText, sendWebPushNotification, changeUnseenNotificationCount, subscribeToIrisNotifications, sendIrisNotification, changeChatUnseenCount: changeChatUnseenMsgsCount, webPushSubscriptions, subscribeToWebPush, getWebPushSubscriptions, removeSubscription};\n","/**\n * Fuse.js v6.6.2 - Lightweight fuzzy-search (http://fusejs.io)\n *\n * Copyright (c) 2022 Kiro Risk (http://kiro.me)\n * All Rights Reserved. Apache Software License 2.0\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nfunction isArray(value) {\n return !Array.isArray\n ? getTag(value) === '[object Array]'\n : Array.isArray(value)\n}\n\n// Adapted from: https://github.com/lodash/lodash/blob/master/.internal/baseToString.js\nconst INFINITY = 1 / 0;\nfunction baseToString(value) {\n // Exit early for strings to avoid a performance hit in some environments.\n if (typeof value == 'string') {\n return value\n }\n let result = value + '';\n return result == '0' && 1 / value == -INFINITY ? '-0' : result\n}\n\nfunction toString(value) {\n return value == null ? '' : baseToString(value)\n}\n\nfunction isString(value) {\n return typeof value === 'string'\n}\n\nfunction isNumber(value) {\n return typeof value === 'number'\n}\n\n// Adapted from: https://github.com/lodash/lodash/blob/master/isBoolean.js\nfunction isBoolean(value) {\n return (\n value === true ||\n value === false ||\n (isObjectLike(value) && getTag(value) == '[object Boolean]')\n )\n}\n\nfunction isObject(value) {\n return typeof value === 'object'\n}\n\n// Checks if `value` is object-like.\nfunction isObjectLike(value) {\n return isObject(value) && value !== null\n}\n\nfunction isDefined(value) {\n return value !== undefined && value !== null\n}\n\nfunction isBlank(value) {\n return !value.trim().length\n}\n\n// Gets the `toStringTag` of `value`.\n// Adapted from: https://github.com/lodash/lodash/blob/master/.internal/getTag.js\nfunction getTag(value) {\n return value == null\n ? value === undefined\n ? '[object Undefined]'\n : '[object Null]'\n : Object.prototype.toString.call(value)\n}\n\nconst EXTENDED_SEARCH_UNAVAILABLE = 'Extended search is not available';\n\nconst INCORRECT_INDEX_TYPE = \"Incorrect 'index' type\";\n\nconst LOGICAL_SEARCH_INVALID_QUERY_FOR_KEY = (key) =>\n `Invalid value for key ${key}`;\n\nconst PATTERN_LENGTH_TOO_LARGE = (max) =>\n `Pattern length exceeds max of ${max}.`;\n\nconst MISSING_KEY_PROPERTY = (name) => `Missing ${name} property in key`;\n\nconst INVALID_KEY_WEIGHT_VALUE = (key) =>\n `Property 'weight' in key '${key}' must be a positive integer`;\n\nconst hasOwn = Object.prototype.hasOwnProperty;\n\nclass KeyStore {\n constructor(keys) {\n this._keys = [];\n this._keyMap = {};\n\n let totalWeight = 0;\n\n keys.forEach((key) => {\n let obj = createKey(key);\n\n totalWeight += obj.weight;\n\n this._keys.push(obj);\n this._keyMap[obj.id] = obj;\n\n totalWeight += obj.weight;\n });\n\n // Normalize weights so that their sum is equal to 1\n this._keys.forEach((key) => {\n key.weight /= totalWeight;\n });\n }\n get(keyId) {\n return this._keyMap[keyId]\n }\n keys() {\n return this._keys\n }\n toJSON() {\n return JSON.stringify(this._keys)\n }\n}\n\nfunction createKey(key) {\n let path = null;\n let id = null;\n let src = null;\n let weight = 1;\n let getFn = null;\n\n if (isString(key) || isArray(key)) {\n src = key;\n path = createKeyPath(key);\n id = createKeyId(key);\n } else {\n if (!hasOwn.call(key, 'name')) {\n throw new Error(MISSING_KEY_PROPERTY('name'))\n }\n\n const name = key.name;\n src = name;\n\n if (hasOwn.call(key, 'weight')) {\n weight = key.weight;\n\n if (weight <= 0) {\n throw new Error(INVALID_KEY_WEIGHT_VALUE(name))\n }\n }\n\n path = createKeyPath(name);\n id = createKeyId(name);\n getFn = key.getFn;\n }\n\n return { path, id, weight, src, getFn }\n}\n\nfunction createKeyPath(key) {\n return isArray(key) ? key : key.split('.')\n}\n\nfunction createKeyId(key) {\n return isArray(key) ? key.join('.') : key\n}\n\nfunction get(obj, path) {\n let list = [];\n let arr = false;\n\n const deepGet = (obj, path, index) => {\n if (!isDefined(obj)) {\n return\n }\n if (!path[index]) {\n // If there's no path left, we've arrived at the object we care about.\n list.push(obj);\n } else {\n let key = path[index];\n\n const value = obj[key];\n\n if (!isDefined(value)) {\n return\n }\n\n // If we're at the last value in the path, and if it's a string/number/bool,\n // add it to the list\n if (\n index === path.length - 1 &&\n (isString(value) || isNumber(value) || isBoolean(value))\n ) {\n list.push(toString(value));\n } else if (isArray(value)) {\n arr = true;\n // Search each item in the array.\n for (let i = 0, len = value.length; i < len; i += 1) {\n deepGet(value[i], path, index + 1);\n }\n } else if (path.length) {\n // An object. Recurse further.\n deepGet(value, path, index + 1);\n }\n }\n };\n\n // Backwards compatibility (since path used to be a string)\n deepGet(obj, isString(path) ? path.split('.') : path, 0);\n\n return arr ? list : list[0]\n}\n\nconst MatchOptions = {\n // Whether the matches should be included in the result set. When `true`, each record in the result\n // set will include the indices of the matched characters.\n // These can consequently be used for highlighting purposes.\n includeMatches: false,\n // When `true`, the matching function will continue to the end of a search pattern even if\n // a perfect match has already been located in the string.\n findAllMatches: false,\n // Minimum number of characters that must be matched before a result is considered a match\n minMatchCharLength: 1\n};\n\nconst BasicOptions = {\n // When `true`, the algorithm continues searching to the end of the input even if a perfect\n // match is found before the end of the same input.\n isCaseSensitive: false,\n // When true, the matching function will continue to the end of a search pattern even if\n includeScore: false,\n // List of properties that will be searched. This also supports nested properties.\n keys: [],\n // Whether to sort the result list, by score\n shouldSort: true,\n // Default sort function: sort by ascending score, ascending index\n sortFn: (a, b) =>\n a.score === b.score ? (a.idx < b.idx ? -1 : 1) : a.score < b.score ? -1 : 1\n};\n\nconst FuzzyOptions = {\n // Approximately where in the text is the pattern expected to be found?\n location: 0,\n // At what point does the match algorithm give up. A threshold of '0.0' requires a perfect match\n // (of both letters and location), a threshold of '1.0' would match anything.\n threshold: 0.6,\n // Determines how close the match must be to the fuzzy location (specified above).\n // An exact letter match which is 'distance' characters away from the fuzzy location\n // would score as a complete mismatch. A distance of '0' requires the match be at\n // the exact location specified, a threshold of '1000' would require a perfect match\n // to be within 800 characters of the fuzzy location to be found using a 0.8 threshold.\n distance: 100\n};\n\nconst AdvancedOptions = {\n // When `true`, it enables the use of unix-like search commands\n useExtendedSearch: false,\n // The get function to use when fetching an object's properties.\n // The default will search nested paths *ie foo.bar.baz*\n getFn: get,\n // When `true`, search will ignore `location` and `distance`, so it won't matter\n // where in the string the pattern appears.\n // More info: https://fusejs.io/concepts/scoring-theory.html#fuzziness-score\n ignoreLocation: false,\n // When `true`, the calculation for the relevance score (used for sorting) will\n // ignore the field-length norm.\n // More info: https://fusejs.io/concepts/scoring-theory.html#field-length-norm\n ignoreFieldNorm: false,\n // The weight to determine how much field length norm effects scoring.\n fieldNormWeight: 1\n};\n\nvar Config = {\n ...BasicOptions,\n ...MatchOptions,\n ...FuzzyOptions,\n ...AdvancedOptions\n};\n\nconst SPACE = /[^ ]+/g;\n\n// Field-length norm: the shorter the field, the higher the weight.\n// Set to 3 decimals to reduce index size.\nfunction norm(weight = 1, mantissa = 3) {\n const cache = new Map();\n const m = Math.pow(10, mantissa);\n\n return {\n get(value) {\n const numTokens = value.match(SPACE).length;\n\n if (cache.has(numTokens)) {\n return cache.get(numTokens)\n }\n\n // Default function is 1/sqrt(x), weight makes that variable\n const norm = 1 / Math.pow(numTokens, 0.5 * weight);\n\n // In place of `toFixed(mantissa)`, for faster computation\n const n = parseFloat(Math.round(norm * m) / m);\n\n cache.set(numTokens, n);\n\n return n\n },\n clear() {\n cache.clear();\n }\n }\n}\n\nclass FuseIndex {\n constructor({\n getFn = Config.getFn,\n fieldNormWeight = Config.fieldNormWeight\n } = {}) {\n this.norm = norm(fieldNormWeight, 3);\n this.getFn = getFn;\n this.isCreated = false;\n\n this.setIndexRecords();\n }\n setSources(docs = []) {\n this.docs = docs;\n }\n setIndexRecords(records = []) {\n this.records = records;\n }\n setKeys(keys = []) {\n this.keys = keys;\n this._keysMap = {};\n keys.forEach((key, idx) => {\n this._keysMap[key.id] = idx;\n });\n }\n create() {\n if (this.isCreated || !this.docs.length) {\n return\n }\n\n this.isCreated = true;\n\n // List is Array\n if (isString(this.docs[0])) {\n this.docs.forEach((doc, docIndex) => {\n this._addString(doc, docIndex);\n });\n } else {\n // List is Array\n this.docs.forEach((doc, docIndex) => {\n this._addObject(doc, docIndex);\n });\n }\n\n this.norm.clear();\n }\n // Adds a doc to the end of the index\n add(doc) {\n const idx = this.size();\n\n if (isString(doc)) {\n this._addString(doc, idx);\n } else {\n this._addObject(doc, idx);\n }\n }\n // Removes the doc at the specified index of the index\n removeAt(idx) {\n this.records.splice(idx, 1);\n\n // Change ref index of every subsquent doc\n for (let i = idx, len = this.size(); i < len; i += 1) {\n this.records[i].i -= 1;\n }\n }\n getValueForItemAtKeyId(item, keyId) {\n return item[this._keysMap[keyId]]\n }\n size() {\n return this.records.length\n }\n _addString(doc, docIndex) {\n if (!isDefined(doc) || isBlank(doc)) {\n return\n }\n\n let record = {\n v: doc,\n i: docIndex,\n n: this.norm.get(doc)\n };\n\n this.records.push(record);\n }\n _addObject(doc, docIndex) {\n let record = { i: docIndex, $: {} };\n\n // Iterate over every key (i.e, path), and fetch the value at that key\n this.keys.forEach((key, keyIndex) => {\n let value = key.getFn ? key.getFn(doc) : this.getFn(doc, key.path);\n\n if (!isDefined(value)) {\n return\n }\n\n if (isArray(value)) {\n let subRecords = [];\n const stack = [{ nestedArrIndex: -1, value }];\n\n while (stack.length) {\n const { nestedArrIndex, value } = stack.pop();\n\n if (!isDefined(value)) {\n continue\n }\n\n if (isString(value) && !isBlank(value)) {\n let subRecord = {\n v: value,\n i: nestedArrIndex,\n n: this.norm.get(value)\n };\n\n subRecords.push(subRecord);\n } else if (isArray(value)) {\n value.forEach((item, k) => {\n stack.push({\n nestedArrIndex: k,\n value: item\n });\n });\n } else ;\n }\n record.$[keyIndex] = subRecords;\n } else if (isString(value) && !isBlank(value)) {\n let subRecord = {\n v: value,\n n: this.norm.get(value)\n };\n\n record.$[keyIndex] = subRecord;\n }\n });\n\n this.records.push(record);\n }\n toJSON() {\n return {\n keys: this.keys,\n records: this.records\n }\n }\n}\n\nfunction createIndex(\n keys,\n docs,\n { getFn = Config.getFn, fieldNormWeight = Config.fieldNormWeight } = {}\n) {\n const myIndex = new FuseIndex({ getFn, fieldNormWeight });\n myIndex.setKeys(keys.map(createKey));\n myIndex.setSources(docs);\n myIndex.create();\n return myIndex\n}\n\nfunction parseIndex(\n data,\n { getFn = Config.getFn, fieldNormWeight = Config.fieldNormWeight } = {}\n) {\n const { keys, records } = data;\n const myIndex = new FuseIndex({ getFn, fieldNormWeight });\n myIndex.setKeys(keys);\n myIndex.setIndexRecords(records);\n return myIndex\n}\n\nfunction computeScore$1(\n pattern,\n {\n errors = 0,\n currentLocation = 0,\n expectedLocation = 0,\n distance = Config.distance,\n ignoreLocation = Config.ignoreLocation\n } = {}\n) {\n const accuracy = errors / pattern.length;\n\n if (ignoreLocation) {\n return accuracy\n }\n\n const proximity = Math.abs(expectedLocation - currentLocation);\n\n if (!distance) {\n // Dodge divide by zero error.\n return proximity ? 1.0 : accuracy\n }\n\n return accuracy + proximity / distance\n}\n\nfunction convertMaskToIndices(\n matchmask = [],\n minMatchCharLength = Config.minMatchCharLength\n) {\n let indices = [];\n let start = -1;\n let end = -1;\n let i = 0;\n\n for (let len = matchmask.length; i < len; i += 1) {\n let match = matchmask[i];\n if (match && start === -1) {\n start = i;\n } else if (!match && start !== -1) {\n end = i - 1;\n if (end - start + 1 >= minMatchCharLength) {\n indices.push([start, end]);\n }\n start = -1;\n }\n }\n\n // (i-1 - start) + 1 => i - start\n if (matchmask[i - 1] && i - start >= minMatchCharLength) {\n indices.push([start, i - 1]);\n }\n\n return indices\n}\n\n// Machine word size\nconst MAX_BITS = 32;\n\nfunction search(\n text,\n pattern,\n patternAlphabet,\n {\n location = Config.location,\n distance = Config.distance,\n threshold = Config.threshold,\n findAllMatches = Config.findAllMatches,\n minMatchCharLength = Config.minMatchCharLength,\n includeMatches = Config.includeMatches,\n ignoreLocation = Config.ignoreLocation\n } = {}\n) {\n if (pattern.length > MAX_BITS) {\n throw new Error(PATTERN_LENGTH_TOO_LARGE(MAX_BITS))\n }\n\n const patternLen = pattern.length;\n // Set starting location at beginning text and initialize the alphabet.\n const textLen = text.length;\n // Handle the case when location > text.length\n const expectedLocation = Math.max(0, Math.min(location, textLen));\n // Highest score beyond which we give up.\n let currentThreshold = threshold;\n // Is there a nearby exact match? (speedup)\n let bestLocation = expectedLocation;\n\n // Performance: only computer matches when the minMatchCharLength > 1\n // OR if `includeMatches` is true.\n const computeMatches = minMatchCharLength > 1 || includeMatches;\n // A mask of the matches, used for building the indices\n const matchMask = computeMatches ? Array(textLen) : [];\n\n let index;\n\n // Get all exact matches, here for speed up\n while ((index = text.indexOf(pattern, bestLocation)) > -1) {\n let score = computeScore$1(pattern, {\n currentLocation: index,\n expectedLocation,\n distance,\n ignoreLocation\n });\n\n currentThreshold = Math.min(score, currentThreshold);\n bestLocation = index + patternLen;\n\n if (computeMatches) {\n let i = 0;\n while (i < patternLen) {\n matchMask[index + i] = 1;\n i += 1;\n }\n }\n }\n\n // Reset the best location\n bestLocation = -1;\n\n let lastBitArr = [];\n let finalScore = 1;\n let binMax = patternLen + textLen;\n\n const mask = 1 << (patternLen - 1);\n\n for (let i = 0; i < patternLen; i += 1) {\n // Scan for the best match; each iteration allows for one more error.\n // Run a binary search to determine how far from the match location we can stray\n // at this error level.\n let binMin = 0;\n let binMid = binMax;\n\n while (binMin < binMid) {\n const score = computeScore$1(pattern, {\n errors: i,\n currentLocation: expectedLocation + binMid,\n expectedLocation,\n distance,\n ignoreLocation\n });\n\n if (score <= currentThreshold) {\n binMin = binMid;\n } else {\n binMax = binMid;\n }\n\n binMid = Math.floor((binMax - binMin) / 2 + binMin);\n }\n\n // Use the result from this iteration as the maximum for the next.\n binMax = binMid;\n\n let start = Math.max(1, expectedLocation - binMid + 1);\n let finish = findAllMatches\n ? textLen\n : Math.min(expectedLocation + binMid, textLen) + patternLen;\n\n // Initialize the bit array\n let bitArr = Array(finish + 2);\n\n bitArr[finish + 1] = (1 << i) - 1;\n\n for (let j = finish; j >= start; j -= 1) {\n let currentLocation = j - 1;\n let charMatch = patternAlphabet[text.charAt(currentLocation)];\n\n if (computeMatches) {\n // Speed up: quick bool to int conversion (i.e, `charMatch ? 1 : 0`)\n matchMask[currentLocation] = +!!charMatch;\n }\n\n // First pass: exact match\n bitArr[j] = ((bitArr[j + 1] << 1) | 1) & charMatch;\n\n // Subsequent passes: fuzzy match\n if (i) {\n bitArr[j] |=\n ((lastBitArr[j + 1] | lastBitArr[j]) << 1) | 1 | lastBitArr[j + 1];\n }\n\n if (bitArr[j] & mask) {\n finalScore = computeScore$1(pattern, {\n errors: i,\n currentLocation,\n expectedLocation,\n distance,\n ignoreLocation\n });\n\n // This match will almost certainly be better than any existing match.\n // But check anyway.\n if (finalScore <= currentThreshold) {\n // Indeed it is\n currentThreshold = finalScore;\n bestLocation = currentLocation;\n\n // Already passed `loc`, downhill from here on in.\n if (bestLocation <= expectedLocation) {\n break\n }\n\n // When passing `bestLocation`, don't exceed our current distance from `expectedLocation`.\n start = Math.max(1, 2 * expectedLocation - bestLocation);\n }\n }\n }\n\n // No hope for a (better) match at greater error levels.\n const score = computeScore$1(pattern, {\n errors: i + 1,\n currentLocation: expectedLocation,\n expectedLocation,\n distance,\n ignoreLocation\n });\n\n if (score > currentThreshold) {\n break\n }\n\n lastBitArr = bitArr;\n }\n\n const result = {\n isMatch: bestLocation >= 0,\n // Count exact matches (those with a score of 0) to be \"almost\" exact\n score: Math.max(0.001, finalScore)\n };\n\n if (computeMatches) {\n const indices = convertMaskToIndices(matchMask, minMatchCharLength);\n if (!indices.length) {\n result.isMatch = false;\n } else if (includeMatches) {\n result.indices = indices;\n }\n }\n\n return result\n}\n\nfunction createPatternAlphabet(pattern) {\n let mask = {};\n\n for (let i = 0, len = pattern.length; i < len; i += 1) {\n const char = pattern.charAt(i);\n mask[char] = (mask[char] || 0) | (1 << (len - i - 1));\n }\n\n return mask\n}\n\nclass BitapSearch {\n constructor(\n pattern,\n {\n location = Config.location,\n threshold = Config.threshold,\n distance = Config.distance,\n includeMatches = Config.includeMatches,\n findAllMatches = Config.findAllMatches,\n minMatchCharLength = Config.minMatchCharLength,\n isCaseSensitive = Config.isCaseSensitive,\n ignoreLocation = Config.ignoreLocation\n } = {}\n ) {\n this.options = {\n location,\n threshold,\n distance,\n includeMatches,\n findAllMatches,\n minMatchCharLength,\n isCaseSensitive,\n ignoreLocation\n };\n\n this.pattern = isCaseSensitive ? pattern : pattern.toLowerCase();\n\n this.chunks = [];\n\n if (!this.pattern.length) {\n return\n }\n\n const addChunk = (pattern, startIndex) => {\n this.chunks.push({\n pattern,\n alphabet: createPatternAlphabet(pattern),\n startIndex\n });\n };\n\n const len = this.pattern.length;\n\n if (len > MAX_BITS) {\n let i = 0;\n const remainder = len % MAX_BITS;\n const end = len - remainder;\n\n while (i < end) {\n addChunk(this.pattern.substr(i, MAX_BITS), i);\n i += MAX_BITS;\n }\n\n if (remainder) {\n const startIndex = len - MAX_BITS;\n addChunk(this.pattern.substr(startIndex), startIndex);\n }\n } else {\n addChunk(this.pattern, 0);\n }\n }\n\n searchIn(text) {\n const { isCaseSensitive, includeMatches } = this.options;\n\n if (!isCaseSensitive) {\n text = text.toLowerCase();\n }\n\n // Exact match\n if (this.pattern === text) {\n let result = {\n isMatch: true,\n score: 0\n };\n\n if (includeMatches) {\n result.indices = [[0, text.length - 1]];\n }\n\n return result\n }\n\n // Otherwise, use Bitap algorithm\n const {\n location,\n distance,\n threshold,\n findAllMatches,\n minMatchCharLength,\n ignoreLocation\n } = this.options;\n\n let allIndices = [];\n let totalScore = 0;\n let hasMatches = false;\n\n this.chunks.forEach(({ pattern, alphabet, startIndex }) => {\n const { isMatch, score, indices } = search(text, pattern, alphabet, {\n location: location + startIndex,\n distance,\n threshold,\n findAllMatches,\n minMatchCharLength,\n includeMatches,\n ignoreLocation\n });\n\n if (isMatch) {\n hasMatches = true;\n }\n\n totalScore += score;\n\n if (isMatch && indices) {\n allIndices = [...allIndices, ...indices];\n }\n });\n\n let result = {\n isMatch: hasMatches,\n score: hasMatches ? totalScore / this.chunks.length : 1\n };\n\n if (hasMatches && includeMatches) {\n result.indices = allIndices;\n }\n\n return result\n }\n}\n\nclass BaseMatch {\n constructor(pattern) {\n this.pattern = pattern;\n }\n static isMultiMatch(pattern) {\n return getMatch(pattern, this.multiRegex)\n }\n static isSingleMatch(pattern) {\n return getMatch(pattern, this.singleRegex)\n }\n search(/*text*/) {}\n}\n\nfunction getMatch(pattern, exp) {\n const matches = pattern.match(exp);\n return matches ? matches[1] : null\n}\n\n// Token: 'file\n\nclass ExactMatch extends BaseMatch {\n constructor(pattern) {\n super(pattern);\n }\n static get type() {\n return 'exact'\n }\n static get multiRegex() {\n return /^=\"(.*)\"$/\n }\n static get singleRegex() {\n return /^=(.*)$/\n }\n search(text) {\n const isMatch = text === this.pattern;\n\n return {\n isMatch,\n score: isMatch ? 0 : 1,\n indices: [0, this.pattern.length - 1]\n }\n }\n}\n\n// Token: !fire\n\nclass InverseExactMatch extends BaseMatch {\n constructor(pattern) {\n super(pattern);\n }\n static get type() {\n return 'inverse-exact'\n }\n static get multiRegex() {\n return /^!\"(.*)\"$/\n }\n static get singleRegex() {\n return /^!(.*)$/\n }\n search(text) {\n const index = text.indexOf(this.pattern);\n const isMatch = index === -1;\n\n return {\n isMatch,\n score: isMatch ? 0 : 1,\n indices: [0, text.length - 1]\n }\n }\n}\n\n// Token: ^file\n\nclass PrefixExactMatch extends BaseMatch {\n constructor(pattern) {\n super(pattern);\n }\n static get type() {\n return 'prefix-exact'\n }\n static get multiRegex() {\n return /^\\^\"(.*)\"$/\n }\n static get singleRegex() {\n return /^\\^(.*)$/\n }\n search(text) {\n const isMatch = text.startsWith(this.pattern);\n\n return {\n isMatch,\n score: isMatch ? 0 : 1,\n indices: [0, this.pattern.length - 1]\n }\n }\n}\n\n// Token: !^fire\n\nclass InversePrefixExactMatch extends BaseMatch {\n constructor(pattern) {\n super(pattern);\n }\n static get type() {\n return 'inverse-prefix-exact'\n }\n static get multiRegex() {\n return /^!\\^\"(.*)\"$/\n }\n static get singleRegex() {\n return /^!\\^(.*)$/\n }\n search(text) {\n const isMatch = !text.startsWith(this.pattern);\n\n return {\n isMatch,\n score: isMatch ? 0 : 1,\n indices: [0, text.length - 1]\n }\n }\n}\n\n// Token: .file$\n\nclass SuffixExactMatch extends BaseMatch {\n constructor(pattern) {\n super(pattern);\n }\n static get type() {\n return 'suffix-exact'\n }\n static get multiRegex() {\n return /^\"(.*)\"\\$$/\n }\n static get singleRegex() {\n return /^(.*)\\$$/\n }\n search(text) {\n const isMatch = text.endsWith(this.pattern);\n\n return {\n isMatch,\n score: isMatch ? 0 : 1,\n indices: [text.length - this.pattern.length, text.length - 1]\n }\n }\n}\n\n// Token: !.file$\n\nclass InverseSuffixExactMatch extends BaseMatch {\n constructor(pattern) {\n super(pattern);\n }\n static get type() {\n return 'inverse-suffix-exact'\n }\n static get multiRegex() {\n return /^!\"(.*)\"\\$$/\n }\n static get singleRegex() {\n return /^!(.*)\\$$/\n }\n search(text) {\n const isMatch = !text.endsWith(this.pattern);\n return {\n isMatch,\n score: isMatch ? 0 : 1,\n indices: [0, text.length - 1]\n }\n }\n}\n\nclass FuzzyMatch extends BaseMatch {\n constructor(\n pattern,\n {\n location = Config.location,\n threshold = Config.threshold,\n distance = Config.distance,\n includeMatches = Config.includeMatches,\n findAllMatches = Config.findAllMatches,\n minMatchCharLength = Config.minMatchCharLength,\n isCaseSensitive = Config.isCaseSensitive,\n ignoreLocation = Config.ignoreLocation\n } = {}\n ) {\n super(pattern);\n this._bitapSearch = new BitapSearch(pattern, {\n location,\n threshold,\n distance,\n includeMatches,\n findAllMatches,\n minMatchCharLength,\n isCaseSensitive,\n ignoreLocation\n });\n }\n static get type() {\n return 'fuzzy'\n }\n static get multiRegex() {\n return /^\"(.*)\"$/\n }\n static get singleRegex() {\n return /^(.*)$/\n }\n search(text) {\n return this._bitapSearch.searchIn(text)\n }\n}\n\n// Token: 'file\n\nclass IncludeMatch extends BaseMatch {\n constructor(pattern) {\n super(pattern);\n }\n static get type() {\n return 'include'\n }\n static get multiRegex() {\n return /^'\"(.*)\"$/\n }\n static get singleRegex() {\n return /^'(.*)$/\n }\n search(text) {\n let location = 0;\n let index;\n\n const indices = [];\n const patternLen = this.pattern.length;\n\n // Get all exact matches\n while ((index = text.indexOf(this.pattern, location)) > -1) {\n location = index + patternLen;\n indices.push([index, location - 1]);\n }\n\n const isMatch = !!indices.length;\n\n return {\n isMatch,\n score: isMatch ? 0 : 1,\n indices\n }\n }\n}\n\n// ❗Order is important. DO NOT CHANGE.\nconst searchers = [\n ExactMatch,\n IncludeMatch,\n PrefixExactMatch,\n InversePrefixExactMatch,\n InverseSuffixExactMatch,\n SuffixExactMatch,\n InverseExactMatch,\n FuzzyMatch\n];\n\nconst searchersLen = searchers.length;\n\n// Regex to split by spaces, but keep anything in quotes together\nconst SPACE_RE = / +(?=(?:[^\\\"]*\\\"[^\\\"]*\\\")*[^\\\"]*$)/;\nconst OR_TOKEN = '|';\n\n// Return a 2D array representation of the query, for simpler parsing.\n// Example:\n// \"^core go$ | rb$ | py$ xy$\" => [[\"^core\", \"go$\"], [\"rb$\"], [\"py$\", \"xy$\"]]\nfunction parseQuery(pattern, options = {}) {\n return pattern.split(OR_TOKEN).map((item) => {\n let query = item\n .trim()\n .split(SPACE_RE)\n .filter((item) => item && !!item.trim());\n\n let results = [];\n for (let i = 0, len = query.length; i < len; i += 1) {\n const queryItem = query[i];\n\n // 1. Handle multiple query match (i.e, once that are quoted, like `\"hello world\"`)\n let found = false;\n let idx = -1;\n while (!found && ++idx < searchersLen) {\n const searcher = searchers[idx];\n let token = searcher.isMultiMatch(queryItem);\n if (token) {\n results.push(new searcher(token, options));\n found = true;\n }\n }\n\n if (found) {\n continue\n }\n\n // 2. Handle single query matches (i.e, once that are *not* quoted)\n idx = -1;\n while (++idx < searchersLen) {\n const searcher = searchers[idx];\n let token = searcher.isSingleMatch(queryItem);\n if (token) {\n results.push(new searcher(token, options));\n break\n }\n }\n }\n\n return results\n })\n}\n\n// These extended matchers can return an array of matches, as opposed\n// to a singl match\nconst MultiMatchSet = new Set([FuzzyMatch.type, IncludeMatch.type]);\n\n/**\n * Command-like searching\n * ======================\n *\n * Given multiple search terms delimited by spaces.e.g. `^jscript .python$ ruby !java`,\n * search in a given text.\n *\n * Search syntax:\n *\n * | Token | Match type | Description |\n * | ----------- | -------------------------- | -------------------------------------- |\n * | `jscript` | fuzzy-match | Items that fuzzy match `jscript` |\n * | `=scheme` | exact-match | Items that are `scheme` |\n * | `'python` | include-match | Items that include `python` |\n * | `!ruby` | inverse-exact-match | Items that do not include `ruby` |\n * | `^java` | prefix-exact-match | Items that start with `java` |\n * | `!^earlang` | inverse-prefix-exact-match | Items that do not start with `earlang` |\n * | `.js$` | suffix-exact-match | Items that end with `.js` |\n * | `!.go$` | inverse-suffix-exact-match | Items that do not end with `.go` |\n *\n * A single pipe character acts as an OR operator. For example, the following\n * query matches entries that start with `core` and end with either`go`, `rb`,\n * or`py`.\n *\n * ```\n * ^core go$ | rb$ | py$\n * ```\n */\nclass ExtendedSearch {\n constructor(\n pattern,\n {\n isCaseSensitive = Config.isCaseSensitive,\n includeMatches = Config.includeMatches,\n minMatchCharLength = Config.minMatchCharLength,\n ignoreLocation = Config.ignoreLocation,\n findAllMatches = Config.findAllMatches,\n location = Config.location,\n threshold = Config.threshold,\n distance = Config.distance\n } = {}\n ) {\n this.query = null;\n this.options = {\n isCaseSensitive,\n includeMatches,\n minMatchCharLength,\n findAllMatches,\n ignoreLocation,\n location,\n threshold,\n distance\n };\n\n this.pattern = isCaseSensitive ? pattern : pattern.toLowerCase();\n this.query = parseQuery(this.pattern, this.options);\n }\n\n static condition(_, options) {\n return options.useExtendedSearch\n }\n\n searchIn(text) {\n const query = this.query;\n\n if (!query) {\n return {\n isMatch: false,\n score: 1\n }\n }\n\n const { includeMatches, isCaseSensitive } = this.options;\n\n text = isCaseSensitive ? text : text.toLowerCase();\n\n let numMatches = 0;\n let allIndices = [];\n let totalScore = 0;\n\n // ORs\n for (let i = 0, qLen = query.length; i < qLen; i += 1) {\n const searchers = query[i];\n\n // Reset indices\n allIndices.length = 0;\n numMatches = 0;\n\n // ANDs\n for (let j = 0, pLen = searchers.length; j < pLen; j += 1) {\n const searcher = searchers[j];\n const { isMatch, indices, score } = searcher.search(text);\n\n if (isMatch) {\n numMatches += 1;\n totalScore += score;\n if (includeMatches) {\n const type = searcher.constructor.type;\n if (MultiMatchSet.has(type)) {\n allIndices = [...allIndices, ...indices];\n } else {\n allIndices.push(indices);\n }\n }\n } else {\n totalScore = 0;\n numMatches = 0;\n allIndices.length = 0;\n break\n }\n }\n\n // OR condition, so if TRUE, return\n if (numMatches) {\n let result = {\n isMatch: true,\n score: totalScore / numMatches\n };\n\n if (includeMatches) {\n result.indices = allIndices;\n }\n\n return result\n }\n }\n\n // Nothing was matched\n return {\n isMatch: false,\n score: 1\n }\n }\n}\n\nconst registeredSearchers = [];\n\nfunction register(...args) {\n registeredSearchers.push(...args);\n}\n\nfunction createSearcher(pattern, options) {\n for (let i = 0, len = registeredSearchers.length; i < len; i += 1) {\n let searcherClass = registeredSearchers[i];\n if (searcherClass.condition(pattern, options)) {\n return new searcherClass(pattern, options)\n }\n }\n\n return new BitapSearch(pattern, options)\n}\n\nconst LogicalOperator = {\n AND: '$and',\n OR: '$or'\n};\n\nconst KeyType = {\n PATH: '$path',\n PATTERN: '$val'\n};\n\nconst isExpression = (query) =>\n !!(query[LogicalOperator.AND] || query[LogicalOperator.OR]);\n\nconst isPath = (query) => !!query[KeyType.PATH];\n\nconst isLeaf = (query) =>\n !isArray(query) && isObject(query) && !isExpression(query);\n\nconst convertToExplicit = (query) => ({\n [LogicalOperator.AND]: Object.keys(query).map((key) => ({\n [key]: query[key]\n }))\n});\n\n// When `auto` is `true`, the parse function will infer and initialize and add\n// the appropriate `Searcher` instance\nfunction parse(query, options, { auto = true } = {}) {\n const next = (query) => {\n let keys = Object.keys(query);\n\n const isQueryPath = isPath(query);\n\n if (!isQueryPath && keys.length > 1 && !isExpression(query)) {\n return next(convertToExplicit(query))\n }\n\n if (isLeaf(query)) {\n const key = isQueryPath ? query[KeyType.PATH] : keys[0];\n\n const pattern = isQueryPath ? query[KeyType.PATTERN] : query[key];\n\n if (!isString(pattern)) {\n throw new Error(LOGICAL_SEARCH_INVALID_QUERY_FOR_KEY(key))\n }\n\n const obj = {\n keyId: createKeyId(key),\n pattern\n };\n\n if (auto) {\n obj.searcher = createSearcher(pattern, options);\n }\n\n return obj\n }\n\n let node = {\n children: [],\n operator: keys[0]\n };\n\n keys.forEach((key) => {\n const value = query[key];\n\n if (isArray(value)) {\n value.forEach((item) => {\n node.children.push(next(item));\n });\n }\n });\n\n return node\n };\n\n if (!isExpression(query)) {\n query = convertToExplicit(query);\n }\n\n return next(query)\n}\n\n// Practical scoring function\nfunction computeScore(\n results,\n { ignoreFieldNorm = Config.ignoreFieldNorm }\n) {\n results.forEach((result) => {\n let totalScore = 1;\n\n result.matches.forEach(({ key, norm, score }) => {\n const weight = key ? key.weight : null;\n\n totalScore *= Math.pow(\n score === 0 && weight ? Number.EPSILON : score,\n (weight || 1) * (ignoreFieldNorm ? 1 : norm)\n );\n });\n\n result.score = totalScore;\n });\n}\n\nfunction transformMatches(result, data) {\n const matches = result.matches;\n data.matches = [];\n\n if (!isDefined(matches)) {\n return\n }\n\n matches.forEach((match) => {\n if (!isDefined(match.indices) || !match.indices.length) {\n return\n }\n\n const { indices, value } = match;\n\n let obj = {\n indices,\n value\n };\n\n if (match.key) {\n obj.key = match.key.src;\n }\n\n if (match.idx > -1) {\n obj.refIndex = match.idx;\n }\n\n data.matches.push(obj);\n });\n}\n\nfunction transformScore(result, data) {\n data.score = result.score;\n}\n\nfunction format(\n results,\n docs,\n {\n includeMatches = Config.includeMatches,\n includeScore = Config.includeScore\n } = {}\n) {\n const transformers = [];\n\n if (includeMatches) transformers.push(transformMatches);\n if (includeScore) transformers.push(transformScore);\n\n return results.map((result) => {\n const { idx } = result;\n\n const data = {\n item: docs[idx],\n refIndex: idx\n };\n\n if (transformers.length) {\n transformers.forEach((transformer) => {\n transformer(result, data);\n });\n }\n\n return data\n })\n}\n\nclass Fuse {\n constructor(docs, options = {}, index) {\n this.options = { ...Config, ...options };\n\n if (\n this.options.useExtendedSearch &&\n !true\n ) {\n throw new Error(EXTENDED_SEARCH_UNAVAILABLE)\n }\n\n this._keyStore = new KeyStore(this.options.keys);\n\n this.setCollection(docs, index);\n }\n\n setCollection(docs, index) {\n this._docs = docs;\n\n if (index && !(index instanceof FuseIndex)) {\n throw new Error(INCORRECT_INDEX_TYPE)\n }\n\n this._myIndex =\n index ||\n createIndex(this.options.keys, this._docs, {\n getFn: this.options.getFn,\n fieldNormWeight: this.options.fieldNormWeight\n });\n }\n\n add(doc) {\n if (!isDefined(doc)) {\n return\n }\n\n this._docs.push(doc);\n this._myIndex.add(doc);\n }\n\n remove(predicate = (/* doc, idx */) => false) {\n const results = [];\n\n for (let i = 0, len = this._docs.length; i < len; i += 1) {\n const doc = this._docs[i];\n if (predicate(doc, i)) {\n this.removeAt(i);\n i -= 1;\n len -= 1;\n\n results.push(doc);\n }\n }\n\n return results\n }\n\n removeAt(idx) {\n this._docs.splice(idx, 1);\n this._myIndex.removeAt(idx);\n }\n\n getIndex() {\n return this._myIndex\n }\n\n search(query, { limit = -1 } = {}) {\n const {\n includeMatches,\n includeScore,\n shouldSort,\n sortFn,\n ignoreFieldNorm\n } = this.options;\n\n let results = isString(query)\n ? isString(this._docs[0])\n ? this._searchStringList(query)\n : this._searchObjectList(query)\n : this._searchLogical(query);\n\n computeScore(results, { ignoreFieldNorm });\n\n if (shouldSort) {\n results.sort(sortFn);\n }\n\n if (isNumber(limit) && limit > -1) {\n results = results.slice(0, limit);\n }\n\n return format(results, this._docs, {\n includeMatches,\n includeScore\n })\n }\n\n _searchStringList(query) {\n const searcher = createSearcher(query, this.options);\n const { records } = this._myIndex;\n const results = [];\n\n // Iterate over every string in the index\n records.forEach(({ v: text, i: idx, n: norm }) => {\n if (!isDefined(text)) {\n return\n }\n\n const { isMatch, score, indices } = searcher.searchIn(text);\n\n if (isMatch) {\n results.push({\n item: text,\n idx,\n matches: [{ score, value: text, norm, indices }]\n });\n }\n });\n\n return results\n }\n\n _searchLogical(query) {\n\n const expression = parse(query, this.options);\n\n const evaluate = (node, item, idx) => {\n if (!node.children) {\n const { keyId, searcher } = node;\n\n const matches = this._findMatches({\n key: this._keyStore.get(keyId),\n value: this._myIndex.getValueForItemAtKeyId(item, keyId),\n searcher\n });\n\n if (matches && matches.length) {\n return [\n {\n idx,\n item,\n matches\n }\n ]\n }\n\n return []\n }\n\n const res = [];\n for (let i = 0, len = node.children.length; i < len; i += 1) {\n const child = node.children[i];\n const result = evaluate(child, item, idx);\n if (result.length) {\n res.push(...result);\n } else if (node.operator === LogicalOperator.AND) {\n return []\n }\n }\n return res\n };\n\n const records = this._myIndex.records;\n const resultMap = {};\n const results = [];\n\n records.forEach(({ $: item, i: idx }) => {\n if (isDefined(item)) {\n let expResults = evaluate(expression, item, idx);\n\n if (expResults.length) {\n // Dedupe when adding\n if (!resultMap[idx]) {\n resultMap[idx] = { idx, item, matches: [] };\n results.push(resultMap[idx]);\n }\n expResults.forEach(({ matches }) => {\n resultMap[idx].matches.push(...matches);\n });\n }\n }\n });\n\n return results\n }\n\n _searchObjectList(query) {\n const searcher = createSearcher(query, this.options);\n const { keys, records } = this._myIndex;\n const results = [];\n\n // List is Array\n records.forEach(({ $: item, i: idx }) => {\n if (!isDefined(item)) {\n return\n }\n\n let matches = [];\n\n // Iterate over every key (i.e, path), and fetch the value at that key\n keys.forEach((key, keyIndex) => {\n matches.push(\n ...this._findMatches({\n key,\n value: item[keyIndex],\n searcher\n })\n );\n });\n\n if (matches.length) {\n results.push({\n idx,\n item,\n matches\n });\n }\n });\n\n return results\n }\n _findMatches({ key, value, searcher }) {\n if (!isDefined(value)) {\n return []\n }\n\n let matches = [];\n\n if (isArray(value)) {\n value.forEach(({ v: text, i: idx, n: norm }) => {\n if (!isDefined(text)) {\n return\n }\n\n const { isMatch, score, indices } = searcher.searchIn(text);\n\n if (isMatch) {\n matches.push({\n score,\n key,\n value: text,\n idx,\n norm,\n indices\n });\n }\n });\n } else {\n const { v: text, n: norm } = value;\n\n const { isMatch, score, indices } = searcher.searchIn(text);\n\n if (isMatch) {\n matches.push({ score, key, value: text, norm, indices });\n }\n }\n\n return matches\n }\n}\n\nFuse.version = '6.6.2';\nFuse.createIndex = createIndex;\nFuse.parseIndex = parseIndex;\nFuse.config = Config;\n\n{\n Fuse.parseQuery = parse;\n}\n\n{\n register(ExtendedSearch);\n}\n\nexport { Fuse as default };\n","import util from \"./util\";\nimport Node from \"./db/Node\";\n\n// TODO config {peers: ['http://localhost:8768/gun'], file: 'State.electron', multicast:false, localStorage: false}\nconst electron = util.isElectron ? new Node('electron').get('state') : null;\n\nexport default electron;","// @ts-nocheck\nimport Key from './Key';\nimport notifications from './notifications';\nimport Channel from './Channel';\nimport util from './util';\nimport _ from './lodash';\nimport Fuse from \"fuse.js\";\nimport local from './local';\nimport electron from './electron';\nimport user from './public';\nimport privateState from './private';\nimport blockedUsers from './blockedUsers';\n\nlet key: any;\nlet myName: string;\nlet latestChatLink: string;\nlet onlineTimeout: any;\nlet ourActivity: any;\nlet noFollows: boolean;\nlet noFollowers: boolean;\nlet searchIndex: any;\nlet initCalled: boolean;\nconst searchableItems: any = {};\nconst getExtendedFollowsCalled = new Map();\n\nconst DEFAULT_FOLLOW = 'hyECQHwSo7fgr2MVfPyakvayPeixxsaAWVtZ-vbaiSc.TXIp8MnCtrnW6n2MrYquWPcc-DTmZzMBmc2yaGv9gIU';\n\nconst DEFAULT_SETTINGS = {\n electron: {\n openAtLogin: true,\n minimizeOnClose: true\n },\n local: {\n enableWebtorrent: !util.isMobile,\n enablePublicPeerDiscovery: true,\n autoplayWebtorrent: true,\n maxConnectedPeers: util.isElectron ? 2 : 1\n }\n};\n\n/**\n * User session management utilities.\n */\nexport default {\n /**\n * Log in with a key from localStorage.\n *\n * If no key is found and options.autologin is not false, a new user will be created.\n *\n * If options.autofollow is not false, the default follow will be added.\n * @param options\n */\n init(options: any = {}) {\n if (initCalled) { return; }\n initCalled = true;\n let localStorageKey = localStorage.getItem('chatKeyPair');\n console.log('localStorageKey', localStorageKey);\n if (localStorageKey) {\n this.login(JSON.parse(localStorageKey));\n } else if (options.autologin !== false) {\n this.loginAsNewUser(options);\n } else {\n this.clearIndexedDB();\n }\n setTimeout(() => {\n local().get('block').map(() => {\n this.updateSearchIndex();\n });\n this.updateSearchIndex();\n });\n setInterval(() => {\n if (this.taskQueue.length) {\n //console.log('this.taskQueue', this.taskQueue.length);\n const t = this.taskQueue.shift();\n t && t();\n }\n }, 10);\n },\n\n DEFAULT_SETTINGS,\n DEFAULT_FOLLOW,\n\n taskQueue: [] as any[],\n\n updateSearchIndex: _.throttle(() => {\n const options = {keys: ['name'], includeScore: true, includeMatches: true, threshold: 0.3};\n const values = Object.values(_.omit(searchableItems, Object.keys(blockedUsers())));\n searchIndex = new Fuse(values, options);\n local().get('searchIndexUpdated').put(true);\n }, 2000, {leading:true}),\n\n saveSearchResult: _.throttle(k => {\n local().get('contacts').get(k).put({followDistance: searchableItems[k].followDistance,followerCount: searchableItems[k].followers.size});\n }, 1000, {leading:true}),\n\n addFollow(callback: Function, k: string, followDistance: number, follower?: string) {\n if (searchableItems[k]) {\n if (searchableItems[k].followDistance > followDistance) {\n searchableItems[k].followDistance = followDistance;\n }\n follower && searchableItems[k].followers.add(follower);\n } else {\n searchableItems[k] = {key: k, followDistance, followers: new Set(follower && [follower])};\n this.taskQueue.push(() => {\n user(k).get('profile').get('name').on((name: string) => {\n searchableItems[k].name = name;\n local().get('contacts').get(k).get('name').put(name);\n callback && callback(k, searchableItems[k]);\n });\n });\n }\n this.saveSearchResult(k);\n callback && callback(k, searchableItems[k]);\n this.updateSearchIndex();\n this.updateNoFollows();\n this.updateNoFollowers();\n },\n\n removeFollow(k: string, followDistance: number, follower: string) {\n if (followDistance === 1) {\n local().get('contacts').get(k).put(false);\n local().get('groups').get('follows').get(k).put(false);\n if (searchableItems[k]) {\n searchableItems[k].followers.delete(follower);\n this.updateNoFollows();\n this.updateNoFollowers();\n }\n }\n if (searchableItems[k] && searchableItems[k].followers.size === 0) {\n delete searchableItems[k];\n local().get('contacts').get(k).put(false);\n local().get('groups').get('everyone').get(k).put(false);\n }\n },\n\n getExtendedFollows(callback: Function, k = key.pub, maxDepth = 3, currentDepth = 1) {\n const called = getExtendedFollowsCalled.get(k);\n if (called && called <= currentDepth) {\n return;\n }\n getExtendedFollowsCalled.set(k, currentDepth);\n\n this.addFollow(callback, k, currentDepth - 1);\n\n user(k).get('follow').map((isFollowing: boolean, followedKey: string) => { // TODO: unfollow\n if (isFollowing) {\n this.addFollow(callback, followedKey, currentDepth, k);\n if (currentDepth < maxDepth) {\n this.taskQueue.push(() => this.getExtendedFollows(callback, followedKey, maxDepth, currentDepth + 1));\n }\n } else {\n this.removeFollow(followedKey, currentDepth, k);\n }\n });\n\n return searchableItems;\n },\n\n updateNoFollows: _.throttle(() => {\n const v = Object.keys(searchableItems).length <= 1;\n if (v !== noFollows) {\n noFollows = v;\n local().get('noFollows').put(noFollows);\n }\n }, 1000, {leading:true}),\n\n updateNoFollowers: _.throttle(() => {\n const v = !(searchableItems[key.pub] && (searchableItems[key.pub].followers.size > 0));\n if (v !== noFollowers) {\n noFollowers = v;\n local().get('noFollowers').put(noFollowers);\n }\n }, 1000, {leading:true}),\n\n getSearchIndex() {\n return searchIndex;\n },\n\n setOurOnlineStatus() {\n const activeRoute = window.location.hash;\n Channel.setActivity(ourActivity = 'active');\n const setActive = _.debounce(() => {\n const chatId = activeRoute && activeRoute.replace('#/profile/','').replace('#/chat/','');\n const chat = privateState(chatId);\n if (chat && !ourActivity) {\n chat.setMyMsgsLastSeenTime();\n }\n Channel.setActivity(ourActivity = 'active');\n clearTimeout(onlineTimeout);\n onlineTimeout = setTimeout(() => Channel.setActivity(ourActivity = 'online'), 30000);\n }, 1000);\n document.addEventListener(\"touchmove\", setActive);\n document.addEventListener(\"mousemove\", setActive);\n document.addEventListener(\"keypress\", setActive);\n document.addEventListener(\"visibilitychange\", () => {\n if (document.visibilityState === 'visible') {\n Channel.setActivity(ourActivity = 'active');\n const chatId = location.pathname.slice(1).replace('chat/','');\n const chat = activeRoute && privateState(chatId);\n if (chat) {\n chat.setMyMsgsLastSeenTime();\n notifications.changeChatUnseenCount(chatId, 0);\n }\n } else {\n Channel.setActivity(ourActivity = 'online');\n }\n });\n setActive();\n window.addEventListener(\"beforeunload\", () => {\n Channel.setActivity(ourActivity = null);\n });\n },\n\n updateGroups() {\n this.getExtendedFollows((k: string, info: any) => {\n if (info.followDistance <= 1) {\n local().get('groups').get('follows').get(k).put(true);\n }\n local().get('groups').get('everyone').get(k).put(true);\n if (k === this.getPubKey()) {\n this.updateNoFollowers();\n }\n });\n },\n\n /**\n * Log in with a private key.\n * @param key\n */\n login(k: any) {\n console.log('login', k);\n const shouldRefresh = !!key;\n console.log('shouldRefresh', shouldRefresh, 'key', key);\n key = k;\n localStorage.setItem('chatKeyPair', JSON.stringify(k));\n user().auth(key);\n user().put({epub: key.epub});\n notifications.subscribeToWebPush();\n notifications.getWebPushSubscriptions();\n //notifications.subscribeToIrisNotifications();\n Channel.getMyChatLinks( undefined, (chatLink: any) => {\n local().get('chatLinks').get(chatLink.id).put(chatLink.url);\n latestChatLink = chatLink.url;\n });\n this.setOurOnlineStatus();\n Channel.getChannels( (c: Channel) => this.addChannel(c));\n user().get('profile').get('name').on((name: any) => {\n if (name && typeof name === 'string') {\n myName = name;\n }\n });\n // a lot of this is iris-messenger stuff\n notifications.init();\n local().get('loggedIn').put(true);\n console.log('local().get(\\'loggedIn\\').put(true);', local());\n local().get('settings').once().then(settings => {\n if (!settings) {\n local().get('settings').put(DEFAULT_SETTINGS.local);\n } else if (settings.enableWebtorrent === undefined || settings.autoplayWebtorrent === undefined) {\n local().get('settings').get('enableWebtorrent').put(DEFAULT_SETTINGS.local.enableWebtorrent);\n local().get('settings').get('autoplayWebtorrent').put(DEFAULT_SETTINGS.local.autoplayWebtorrent);\n }\n });\n user().get('block').map((isBlocked: boolean, user: string) => {\n local().get('block').get(user).put(isBlocked);\n if (isBlocked) {\n delete searchableItems[user];\n }\n });\n this.updateGroups();\n if (shouldRefresh) {\n location.reload();\n }\n if (electron) {\n electron.get('settings').on(electron => {\n local().get('settings').get('electron').put(electron);\n });\n electron.get('user').put(key.pub);\n }\n local().get('filters').get('group').once().then(v => {\n if (!v) {\n local().get('filters').get('group').put('follows');\n }\n });\n },\n\n\n\n /**\n * Create a new user account and log in.\n * @param options {Object} - Options for the new account.\n * @returns {Promise<*>}\n */\n loginAsNewUser(options: any = {}) {\n const name = options.name || util.generateName();\n console.log('loginAsNewUser name', name);\n return Key.generate().then(k => {\n this.login(k);\n user().get('profile').put({a:null});\n user().get('profile').get('name').put(name);\n local().get('filters').put({a:null});\n local().get('filters').get('group').put('follows');\n Channel.createChatLink().then(l => latestChatLink = l);\n setTimeout(() => {\n if (options.autofollow !== false) {\n console.log('autofollowing', DEFAULT_FOLLOW);\n user().get('follow').get(DEFAULT_FOLLOW).put(true);\n }\n }, 1000); // maybe wait for login return instead\n });\n },\n\n /**\n * Log out the current user.\n * @returns {Promise}\n */\n async logOut() {\n if (electron) {\n electron.get('user').put(null);\n }\n // TODO: remove subscription from your channels\n if (navigator.serviceWorker) {\n const reg = await navigator.serviceWorker.getRegistration();\n if (reg && reg.pushManager) {\n reg.active?.postMessage({key: null});\n const sub = await reg.pushManager.getSubscription();\n if (sub) {\n const hash = await util.getHash(JSON.stringify(sub));\n notifications.removeSubscription(hash);\n sub.unsubscribe && sub.unsubscribe();\n }\n }\n }\n this.clearIndexedDB();\n localStorage.clear(); // TODO clear only iris data\n window.location.hash = '';\n window.location.href = '/';\n location.reload();\n },\n\n clearIndexedDB() {\n return new Promise(resolve => {\n const r1 = window.indexedDB.deleteDatabase('local()');\n const r2 = window.indexedDB.deleteDatabase('radata');\n let r1done = false;\n let r2done = false;\n const check = () => {\n r1done && r2done && resolve(undefined);\n }\n r1.onerror = r2.onerror = e => console.error(e);\n //r1.onblocked = r2.onblocked = e => console.error('blocked', e);\n r1.onsuccess = () => {\n r1done = true;\n check();\n }\n r2.onsuccess = () => {\n r2done = true;\n check();\n }\n });\n },\n\n getMyChatLink() {\n return latestChatLink || util.getProfileLink(key.pub);\n },\n\n /**\n * Get the keypair of the logged in user.\n * @returns {*}\n */\n getKey() { return key; },\n\n /**\n * Get the public key of the logged in user.\n * @returns {*}\n */\n getPubKey() {\n return key && key.pub;\n },\n\n /**\n * Get the name of the logged in user.\n * @returns {*}\n */\n getMyName() { return myName; }, // TODO maybe remove and use iris.user().get('profile').get('name') instead?\n\n myPeerUrl: (ip: string) => `http://${ip}:8767/gun`,\n\n async shareMyPeerUrl(channel: Channel) {\n const myIp = await local().get('settings').get('electron').get('publicIp').once();\n myIp && channel.put && channel.put('my_peer', this.myPeerUrl(myIp));\n },\n\n newChannel(pub: string, chatLink?: string) {\n if (!pub || this.channelIds.has(pub)) {\n return;\n }\n const chat = privateState(pub, chatLink);\n this.addChannel(chat);\n return chat;\n },\n\n addChannel(chat: Channel) {\n this.taskQueue.push(() => {\n let pub = chat.getId();\n if (this.channelIds.has(pub)) { return; }\n this.channelIds.add(pub);\n const chatNode = local().get('channels').get(pub);\n chatNode.get('latestTime').on((t: string) => {\n if (t && (!chat.latestTime || t > chat.latestTime)) {\n chat.latestTime = t;\n } else {\n // chatNode.get('latestTime').put(chat.latestTime); // omg recursion\n }\n });\n chatNode.get('theirMsgsLastSeenTime').on((t: string) => {\n if (!t) { return; }\n const d = new Date(t);\n if (!chat.theirMsgsLastSeenDate || chat.theirMsgsLastSeenDate < d) {\n chat.theirMsgsLastSeenDate = d;\n }\n });\n chat.getLatestMsg && chat.getLatestMsg((latest: any, info: any) => {\n this.processMessage(pub, latest, info);\n });\n notifications.changeChatUnseenCount(pub, 0);\n chat.notificationSetting = 'all';\n chat.onMy('notificationSetting', (val: any) => {\n chat.notificationSetting = val;\n });\n //$(\".chat-list\").append(el);\n chat.theirMsgsLastSeenTime = '';\n chat.getTheirMsgsLastSeenTime((time: any) => {\n if (chat && time && time >= chat.theirMsgsLastSeenTime) {\n chat.theirMsgsLastSeenTime = time;\n chatNode.get('theirMsgsLastSeenTime').put(time);\n }\n });\n chat.getMyMsgsLastSeenTime((time: any) => {\n chat.myLastSeenTime = new Date(time);\n if (chat.latest && chat.myLastSeenTime >= chat.latest.time) {\n notifications.changeChatUnseenCount(pub, 0);\n }\n });\n chat.isTyping = false;\n chat.getTyping(isTyping => {\n chat.isTyping = isTyping;\n local().get('channels').get(pub).get('isTyping').put(isTyping);\n });\n chat.online = {};\n Channel.getActivity(pub, (activity) => {\n if (chat) {\n chatNode.put({theirLastActiveTime: activity && activity.lastActive, activity: activity && activity.isActive && activity.status});\n chat.activity = activity;\n }\n });\n if (chat.uuid) {\n let isDarkMode = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches;\n chat.participantProfiles = {};\n chat.on('name', v => {\n chat.name = v;\n searchableItems[chat.uuid] = {name: v, uuid: chat.uuid};\n local().get('channels').get(chat.uuid).get('name').put(v);\n });\n chat.on('photo', v => {\n searchableItems[chat.uuid] = searchableItems[chat.uuid] || {};\n searchableItems[chat.uuid].photo = v;\n local().get('channels').get(chat.uuid).get('photo').put(v)\n });\n chat.on('about', v => local().get('channels').get(chat.uuid).get('about').put(v));\n chat.getParticipants(participants => {\n delete participants.undefined; // TODO fix where it comes from\n if (typeof participants === 'object') {\n let keys = Object.keys(participants);\n keys.forEach((k, i) => {\n let hue = 360 / Math.max(keys.length, 2) * i; // TODO use css filter brightness\n chat.participantProfiles[k] = {permissions: participants[k], color: `hsl(${hue}, 98%, ${isDarkMode ? 80 : 33}%)`};\n user(k).get('profile').get('name').on(name => {\n chat.participantProfiles[k].name = name;\n });\n });\n }\n local().get('channels').get(chat.uuid).get('participants').put(participants);\n });\n chat.inviteLinks = {};\n chat.getChatLinks({callback: ({url, id}) => {\n console.log('got chat link', id, url);\n chat.inviteLinks[id] = url; // TODO use State\n local().get('inviteLinksChanged').put(true);\n }});\n } else {\n // TODO do we want this?\n user(pub).get('profile').get('name').on(v => local().get('channels').get(pub).get('name').put(v))\n }\n if (chat.put) {\n chat.onTheir('webPushSubscriptions', (s, k, from) => {\n if (!Array.isArray(s)) { return; }\n chat.webPushSubscriptions = chat.webPushSubscriptions || {};\n chat.webPushSubscriptions[from || pub] = s;\n });\n const arr = Object.values(notifications.webPushSubscriptions);\n setTimeout(() => chat.put('webPushSubscriptions', arr), 5000);\n this.shareMyPeerUrl(chat);\n }\n chat.onTheir('call', call => {\n local().get('call').put({pub, call});\n });\n local().get('channels').get(pub).put({enabled:true});\n /* Disable private peer discovery, since they're not connecting anyway\n if (chat.onTheir) {\n chat.onTheir('my_peer', (url, k, from) => {\n console.log('Got private peer url', url, 'from', from);\n peers.addPeer({url, from})\n });\n }\n */\n\n });\n },\n\n // TODO: should perhaps be in Channel\n processMessage(chatId: string, msg: any, info: any, onClickNotification?: Function) {\n const chat = privateState(chatId);\n chat.messageIds = chat.messageIds || {};\n if (chat.messageIds[msg.time + info.from]) return;\n chat.messageIds[msg.time + info.from] = true;\n if (info) {\n msg = Object.assign(msg, info);\n }\n if (msg.invite) {\n const chatLink = `https://iris.to/?channelId=${msg.invite.group}&inviter=${chatId}`;\n this.newChannel(msg.invite.group, chatLink);\n return;\n }\n msg.selfAuthored = info.selfAuthored;\n local().get('channels').get(chatId).get('msgs').get(msg.time + (msg.from && msg.from.slice(0, 10))).put(JSON.stringify(msg));\n msg.timeObj = new Date(msg.time);\n if (!info.selfAuthored && msg.timeObj > chat.myLastSeenTime) {\n if (window.location.hash !== `#/chat/${ chatId}` || document.visibilityState !== 'visible') {\n notifications.changeChatUnseenCount(chatId, 1);\n } else if (ourActivity === 'active') {\n chat.setMyMsgsLastSeenTime();\n }\n }\n if (!info.selfAuthored && msg.time > chat.theirMsgsLastSeenTime) {\n local().get('channels').get(chatId).get('theirMsgsLastSeenTime').put(msg.time);\n }\n if (!chat.latestTime || (msg.time > chat.latestTime)) {\n local().get('channels').get(chatId).put({\n latestTime: msg.time,\n latest: {time: msg.time, text: msg.text, selfAuthored: info.selfAuthored}\n });\n }\n // TODO: onclickNotification should do route(`/chat/${ pub}`);\n notifications.notifyMsg(msg, info, chatId, onClickNotification);\n },\n\n subscribeToMsgs(pub) {\n const c = privateState(pub);\n if (c.subscribed) { return; }\n c.subscribed = true;\n c.getMessages((msg, info) => {\n this.processMessage(pub, msg, info);\n });\n },\n\n /**\n * Known private channels with other users\n */\n channelIds: new Set(),\n};\n","import publicSpace from './global';\nimport util from './util';\n\n/**\n * Content-addressed storage\n */\nexport default {\n /**\n * Get a file identified by its hash\n * @param hash\n * @param callback\n * @returns {Promise}\n */\n get(hash: string, callback: Function) {\n return new Promise((resolve, reject) => {\n if (!hash) {\n reject('No hash provided');\n }\n if (typeof hash !== 'string') {\n reject('Hash must be a string');\n }\n publicSpace().get('#').get(hash).on((v: any, _k: string, _x: any, e: any) => {\n if (v) {\n e.off();\n callback && callback(v);\n resolve(v);\n }\n });\n });\n },\n\n /**\n * Store a file and return its hash\n * @param value\n * @returns {Promise}\n */\n async put(value: any) {\n const hash = await util.getHash(value);\n publicSpace().get('#').get(hash).put(value);\n return hash;\n }\n}","// @ts-nocheck\n\n/*jshint unused: false */\n`use strict`;\nimport util from './util';\nimport Attribute from './Attribute';\nimport Key from './Key';\n\nconst errorMsg = `Invalid message:`;\n\nclass ValidationError extends Error {}\n\n/**\n* Signed message object. Your friends can index and relay your messages, while others can still verify that they were signed by you.\n*\n* Fields: signedData, signer (public key) and signature.\n*\n* signedData has an author, signer, type, time and optionally other fields.\n*\n* signature covers the utf8 string representation of signedData. Since messages are digitally signed, users only need to care about the message signer and not who relayed it or whose index it was found from.\n*\n* signer is the entity that verified its origin. In other words: message author and signer can be different entities, and only the signer needs to use Iris.\n*\n* For example, a crawler can import and sign other people's messages from Twitter. Only the users who trust the crawler will see the messages.\n*\n* Constructor: creates a message from the param obj.signedData that must contain at least the mandatory fields: author, type and time.\n* @param obj\n*\n*/\nclass SignedMessage {\n signedData: any;\n pubKey: any;\n sig: any;\n\n constructor(obj: any) {\n this.signedData = obj.signedData;\n this.pubKey = obj.pubKey;\n if (obj.sig) {\n if (typeof obj.sig !== `string`) {\n throw new ValidationError(`SignedMessage signature must be a string`);\n }\n this.sig = obj.sig;\n this.getHash();\n }\n this._validate();\n }\n\n getSignerKeyID() {\n return this.pubKey; // hack until gun supports keyID lookups\n //return util.getHash(this.pubKey);\n }\n\n _validate() {\n if (!this.signedData) {throw new ValidationError(`${errorMsg} Missing signedData`);}\n if (typeof this.signedData !== `object`) {throw new ValidationError(`${errorMsg} signedData must be an object`);}\n const d = this.signedData;\n\n if (!d.type) {throw new ValidationError(`${errorMsg} Missing type definition`);}\n if (!d.author) {throw new ValidationError(`${errorMsg} Missing author`);}\n if (typeof d.author !== `object`) {throw new ValidationError(`${errorMsg} Author must be object`);}\n if (Array.isArray(d.author)) {throw new ValidationError(`${errorMsg} Author must not be an array`);}\n if (Object.keys(d.author).length === 0) {throw new ValidationError(`${errorMsg} Author empty`);}\n if (this.pubKey) {\n this.signerKeyHash = this.getSignerKeyID();\n }\n for (const attr in d.author) {\n const t = typeof d.author[attr];\n if (t !== `string`) {\n if (Array.isArray(d.author[attr])) {\n for (let i = 0;i < d.author[attr].length;i++) {\n if (typeof d.author[attr][i] !== `string`) {throw new ValidationError(`${errorMsg} Author attribute must be string, got ${attr}: [${d.author[attr][i]}]`);}\n if (d.author[attr][i].length === 0) {\n throw new ValidationError(`${errorMsg} author ${attr} in array[${i}] is empty`);\n }\n }\n } else {\n throw new ValidationError(`${errorMsg} Author attribute must be string or array, got ${attr}: ${d.author[attr]}`);\n }\n }\n if (attr === `keyID`) {\n if (t !== `string`) {throw new ValidationError(`${errorMsg} Author keyID must be string, got ${t}`);}\n if (this.signerKeyHash && d.author[attr] !== this.signerKeyHash) {throw new ValidationError(`${errorMsg} If message has a keyID author, it must be signed by the same key`);}\n }\n }\n if (d.recipient) {\n if (typeof d.recipient !== `object`) {throw new ValidationError(`${errorMsg} Recipient must be object`);}\n if (Array.isArray(d.recipient)) {throw new ValidationError(`${errorMsg} Recipient must not be an array`);}\n if (Object.keys(d.recipient).length === 0) {throw new ValidationError(`${errorMsg} Recipient empty`);}\n for (const attr in d.recipient) {\n const t = typeof d.recipient[attr];\n if (t !== `string`) {\n if (Array.isArray(d.recipient[attr])) {\n for (let i = 0;i < d.recipient[attr].length;i++) {\n if (typeof d.recipient[attr][i] !== `string`) {throw new ValidationError(`${errorMsg} Recipient attribute must be string, got ${attr}: [${d.recipient[attr][i]}]`);}\n if (d.recipient[attr][i].length === 0) {\n throw new ValidationError(`${errorMsg} recipient ${attr} in array[${i}] is empty`);\n }\n }\n } else {\n throw new ValidationError(`${errorMsg} Recipient attribute must be string or array, got ${attr}: ${d.recipient[attr]}`);\n }\n }\n }\n }\n if (!(d.time || d.timestamp)) {throw new ValidationError(`${errorMsg} Missing time field`);}\n\n if (!Date.parse(d.time || d.timestamp)) {throw new ValidationError(`${errorMsg} Invalid time field`);}\n\n return true;\n }\n\n /**\n * @param {Object} key keypair to sign the message with\n */\n async sign(key) {\n this.sig = await Key.sign(this.signedData, key);\n this.pubKey = key.pub;\n await this.getHash();\n return true;\n }\n\n /**\n * Create an iris message. SignedMessage time is automatically set. If signingKey is specified and author omitted, signingKey will be used as author.\n * @param {Object} signedData message data object including author, recipient and other possible attributes\n * @param {Object} signingKey optionally, you can set the key to sign the message with\n * @returns {Promise} message\n */\n static async create(signedData, signingKey) {\n if (!signedData.author && signingKey) {\n signedData.author = {keyID: Key.getId(signingKey)};\n }\n signedData.time = signedData.time || (new Date()).toISOString();\n const m = new SignedMessage({signedData});\n if (signingKey) {\n await m.sign(signingKey);\n }\n return m;\n }\n\n getAuthor(index) {\n for (const a of this.getAuthorIterable()) {\n if (a.isUniqueType()) {\n return index.getContacts(a);\n }\n }\n }\n\n getRecipient(index) {\n if (!this.signedData.recipient) {\n return undefined;\n }\n for (const a of this.getRecipientIterable()) {\n if (a.isUniqueType()) {\n return index.getContacts(a);\n }\n }\n }\n\n /**\n * @returns {string} base64 sha256 hash of message\n */\n async getHash() {\n if (this.sig && !this.hash) {\n this.hash = await util.getHash(this.sig);\n }\n return this.hash;\n }\n\n getId() {\n return this.getHash();\n }\n\n static async fromSig(obj) {\n if (!obj.sig) {\n throw new Error(`Missing signature in object:`, obj);\n }\n if (!obj.pubKey) {\n throw new Error(`Missing pubKey in object:`);\n }\n //const signedData = await Key.verify(obj.sig, obj.pubKey); // disable sig verification while migrating to new gun :(\n const signedData = JSON.parse(obj.sig.slice(4)).m;\n const o = {signedData, sig: obj.sig, pubKey: obj.pubKey};\n return new SignedMessage(o);\n }\n\n /**\n * @return {boolean} true if message signature is valid. Otherwise throws ValidationError.\n */\n async verify() {\n if (!this.pubKey) {\n throw new ValidationError(`${errorMsg} SignedMessage has no .pubKey`);\n }\n if (!this.sig) {\n throw new ValidationError(`${errorMsg} SignedMessage has no .sig`);\n }\n this.signedData = await Key.verify(this.sig, this.pubKey);\n if (!this.signedData) {\n throw new ValidationError(`${errorMsg} Invalid signature`);\n }\n if (this.hash) {\n if (this.hash !== (await util.getHash(this.sig))) {\n throw new ValidationError(`${errorMsg} Invalid message hash`);\n }\n } else {\n this.getHash();\n }\n return true;\n }\n\n /**\n * @returns {string}\n */\n serialize() {\n return {sig: this.sig, pubKey: this.pubKey};\n }\n\n toString() {\n return JSON.stringify(this.serialize());\n }\n\n /**\n * @returns {Promise}\n */\n static async deserialize(s) {\n return SignedMessage.fromSig(s);\n }\n\n static async fromString(s) {\n return SignedMessage.fromSig(JSON.parse(s));\n }\n}\n\nexport default SignedMessage;\n","/*eslint no-useless-escape: \"off\", camelcase: \"off\" */\n\nimport session from './session';\nimport peers from './peers';\nimport util from './util';\nimport local from './local';\nimport global from './global';\nimport publicState from './public';\nimport group from './group';\nimport electron from './electron';\nimport privateState from './private';\nimport staticState from './static';\nimport notifications from './notifications';\n\nimport SignedMessage from './SignedMessage';\nimport Channel from './Channel';\nimport Node from './db/Node';\nimport Key from './Key';\n\nexport default {\n local,\n global,\n group,\n public: publicState,\n private: privateState,\n static: staticState,\n electron,\n peers,\n session,\n util,\n notifications,\n SignedMessage,\n Channel,\n Node,\n Key\n};"],"names":["_","throttle","func","limit","inThrottle","args","arguments","context","this","apply","setTimeout","debounce","inDebounce","clearTimeout","sample","arr","Math","floor","random","length","sampleSize","size","temp","index","shuffled","slice","i","min","defer","once","called","omit","obj","keys","newObj","Object","forEach","key","includes","defaults","undefined","pickBy","predicate","isEqual","a","b","Date","getTime","prototype","every","k","uniq","set","Set","Array","from","isNode","toString","call","global","process","e","myKey","userAgent","navigator","toLowerCase","isElectron","indexOf","animals","adjectives","gunOnceDefined","node","Promise","resolve","on","val","_k","_a","eve","off","getHash","data","format","_context","Error","JSON","stringify","encoder","TextEncoder","encode","crypto","subtle","digest","buffer","hash","_this","arrayBufferToBase64","base64ToHex","capitalize","s","charAt","toUpperCase","generateName","str","raw","atob","result","hex","charCodeAt","binary","bytes","Uint8Array","len","byteLength","String","fromCharCode","window","btoa","getCaret","el","selectionStart","document","selection","focus","r","createRange","re","createTextRange","rc","duplicate","moveToBookmark","getBookmark","setEndPoint","text","getUrlParameter","sParam","sParams","sParameterName","sURLVariables","location","search","substring","split","decodeURIComponent","formatTime","date","t","toLocaleTimeString","timeStyle","formatDate","toLocaleString","dateStyle","getDaySeparatorText","dateStr","now","nowStr","toLocaleDateString","dayDifference","round","weekday","getProfileLink","pub","origin","encodeURIComponent","truncateString","createElement","type","cls","parent","setAttribute","appendChild","isMobile","check","vendor","test","substr","delay","getActiveKey","datadir","keyfile","fs","existsSync","privKeyFile","f","readFileSync","fromString","generate","newKey","writeFileSync","chmodSync","localStorage","getItem","setItem","getDefault","getActivePub","_context2","_this2","setActiveKey","save","util","getId","parse","ecdhSubtle","_context5","generateKey","name","namedCurve","then","_context3","exportKey","privateKey","priv","d","publicKey","x","y","sa","_context4","epriv","epub","dh","console","log","keyToJwk","jwk","kty","crv","ext","key_ops","sign","pair","cb","opt","_context6","_this3","importKey","m","Buffer","verify","_context7","_this4","buf","sig","secret","pubJwk","keysToEcdhJwk","assign","_context9","public","props","privJwk","privKey","_context8","deriveBits","rawBits","aeskey","salt","combo","_this5","_context10","keyB64","replace","jwkKey","alg","getRandomValues","encrypt","_context11","msg","rand","_this6","iv","aes","ct","decrypt","json","_context12","bufiv","bufct","_this7","tagLength","TextDecoder","decode","_e","ELECTRON_GUN_URL","DEFAULT_PEERS","wss://gun-rs.iris.to/gun","self","loc","host","is_localhost_but_not_dev","startsWith","hostname","endsWith","url","enabled","known","add","peer","visibility","Key","session","getKey","encryptedUrl","encryptedUrlHash","publicState","user","get","put","lastSeen","toISOString","connect","remove","disconnect","peerFromGun","getSaved","p","reset","isMixedContent","peers","disable","protocol","connectToLocalElectron","max","maxConnectedPeers","push","checkGunPeerCount","init","setInterval","Actor","id","c","_proto","handle","_message","postMessage","message","Message","fromObject","Get","Put","deserialize","dam","Hi","serialize","generateMsgId","nodeId","recipients","childKey","jsonStr","checksum","#",".","updatedNodes","inResponseTo","entries","children","myNodeId","childValue","value","updatedAt","_i3","_Object$entries3$_i","isUserSpace","_i4","_Object$entries4$_i","signatureObj","signature","signedStr",":",">","newFromKv","peerId","QuickLRU","Map","[object Object]","options","super","maxSize","TypeError","maxAge","Number","POSITIVE_INFINITY","onEviction","cache","oldCache","_size","item","expiry","delete","_deleteIfExpired","_getOrDeleteIfExpired","_getItemValue","_emitEvictions","_set","has","_moveToRecent","_peek","deleted","clear","newSize","items","_entriesAscending","removeCount","Symbol","iterator","oldCacheSize","entriesAscending","callbackFunction","thisArgument","toStringTag","Memory","config","_inheritsLoose","handlePut","handleGet","store","putMessage","mergeAndSave","nodeName","existing","_i2","_Object$entries2$_i","__assign","n","hasOwnProperty","__spreadArray","to","pack","ar","l","concat","_global","globalThis","isArray","extend","extension","getProto","getPrototypeOf","_hasOwn","hasOwn","prop","proto","Reflect","ownKeys","setProp","defineProperty","functionOrGetSet","configurable","writable","derive","Child","Parent","create","bind","getOwnPropertyDescriptor","getPropertyDescriptor","_slice","start","end","override","origFunc","overridedFactory","assert","asap","fn","setImmediate","arrayToObject","array","extractor","reduce","nameAndValue","getByKeyPath","keyPath","rv","period","innerObj","setByKeyPath","isFrozen","currentKeyPath","remainingKeyPath","isNaN","parseInt","splice","shallowClone","flatten","intrinsicTypeNames","map","num","filter","intrinsicTypes","circularRefs","deepClone","any","WeakMap","innerDeepClone","constructor","o","iteratorSymbol","getIteratorOf","NO_CHAR_ARRAY","getArrayOf","arrayLike","it","next","done","isAsyncFunction","debug","href","setDebug","libraryFilter","NEEDS_THROW_FOR_STACK","stack","getErrorWithStack","prettyStack","exception","numIgnoredFrames","frame","join","idbDomErrorNames","errorList","defaultTexts","VersionChanged","DatabaseClosed","Abort","TransactionInactive","MissingAPI","DexieError","getMultiErrorMessage","failures","v","ModifyError","successCount","failedKeys","BulkError","pos","failuresByPos","_stack","errnames","BaseException","exceptions","fullName","msgOrInner","inner","Syntax","SyntaxError","Type","Range","RangeError","exceptionMap","fullNameExceptions","nop","mirror","pureFunctionChain","f1","f2","callBoth","on1","on2","hookCreatingChain","res","onsuccess","onerror","res2","hookDeletingChain","hookUpdatingChain","modifications","reverseStoppableEventChain","promisableChain","thiz","INTERNAL","globalP","nativeP","resolvedNativePromise","nativePromiseProto","resolvedGlobalPromise","nativePromiseThen","NativePromise","patchGlobalPromise","stack_being_generated","schedulePhysicalTick","physicalTick","MutationObserver","hiddenDiv","observe","attributes","callback","microtickQueue","needsNewPhysicalTick","isOutsideMicroTick","unhandledErrors","rejectingErrors","currentFulfiller","rejectionMapper","globalPSD","ref","unhandleds","onunhandled","globalError","pgp","env","finalize","uh","PSD","numScheduledCalls","tickFinalizers","DexiePromise","_listeners","onuncatched","_lib","psd","_PSD","_stackHolder","_prev","_numPrev","_state","_value","handleRejection","executePromiseTask","thenProp","microTaskId","totalEchoes","onFulfilled","onRejected","possibleAwait","cleanup","decrementExpectedAwaits","reject","propagateToListener","Listener","nativeAwaitCompatibleWrap","linkToPreviousPromise","zone","promise","shouldExecuteTick","beginMicroTickScope","_then","propagateAllListeners","endMicroTickScope","ex","reason","_promise","origProp","tryCatch","some","addPossiblyUnhandledError","listeners","finalizePhysicalTick","listener","callListener","ret","markErrorAsHandled","prev","numPrev","wasRootExec","callbacks","unhandledErrs","finalizers","PromiseReject","wrap","errorCatcher","outerScope","switchToZone","catch","handler","err","finally","onFinally","getStack","stacks","errorName","failure","timeout","ms","Infinity","Timeout","snapShot","all","values","onPossibleParallellAsync","remaining","race","newPSD","newScope","usePSD","scheduler","follow","zoneProps","finalizer","allSettled","possiblePromises","results","status","AggregateError","task","awaits","echoes","taskCounter","zoneStack","zoneEchoes","zone_id_counter","a1","a2","globalEnv","PromiseProp","nthen","getPatchedPromiseThen","gthen","incrementExpectedAwaits","possiblePromise","rejection","zoneEnterEcho","targetZone","zoneLeaveEcho","pop","bEnteringZone","currentZone","enqueueNativeMicroTask","GlobalPromise_1","targetEnv","GlobalPromise","a3","job","outerZone","origThen","onResolved","event","eventData","createEvent","initEvent","CustomEvent","detail","dispatchEvent","PromiseRejectionEvent","onunhandledrejection","defaultPrevented","warn","maxString","INVALID_KEY_ARGUMENT","connections","isIEOrEdge","hasIEDeleteObjectStoreBug","hangsOnDeleteLargeKeyRange","dexieStackFrameFilter","combine","filter1","filter2","AnyRange","lower","lowerOpen","upper","upperOpen","workaroundForUndefinedPrimKey","Table","mode","writeLocked","trans","_tx","tableName","checkTableInTransaction","schema","NotFound","idbtrans","db","transless","tempTransaction","storeNames","idbdb","openComplete","letThrough","_vip","_createTransaction","_dbSchema","PR1398_maxLoop","InvalidState","isOpen","_close","open","_completion","dbOpenError","isBeingOpened","_options","autoOpen","dbReadyPromise","keyOrCrit","where","first","_trans","core","hook","reading","fire","indexOrCrit","WhereClause","keyPaths","equals","compoundIndex","indexes","primKey","ix","compound","_maxKey","kp","idxByName","idb","_deps","indexedDB","cmp","prevIndex","prevFilterFn","multi","idx","filterFunction","toCollection","and","thenShortcut","count","offset","numRows","each","toArray","Collection","reverse","mappedClass","readHook","unsubscribe","mapToClass","content","objToAdd","mutate","numFailures","lastResult","keyOrObject","modify","InvalidArgument","range","getMany","objects","keysOrOptions","wantResults","allKeys","auto","numObjects","objectsToAdd","objectsToPut","numKeys","Events","ctx","evs","eventName","subscriber","subscribe","addEventType","chainFunction","defaultFunction","addConfiguredEvents","subscribers","cfg","makeClassConstructor","isPlainKeyRange","ignoreLimitFilter","algorithm","or","justLimit","replayFilter","addFilter","addReplayFilter","factory","isLimitFilter","curr","getIndexOrStore","coreSchema","isPrimKey","primaryKey","getIndexByKeyPath","Schema","openCursor","coreTable","keysOnly","dir","unique","query","iter","coreTrans","set_1","union","cursor","advance","stop","fail","_iterate","iterate","valueMapper","cursorPromise","wrappedFn","continue","advancer","ta","tb","NaN","al","bl","compareUint8Arrays","getUint8Array","compareArrays","ArrayBuffer","isView","tsTag","byteOffset","_ctx","error","table","_read","parts","lastPart","lastIndex","getval","order","sorter","aVal","bVal","sort","valueMapper_1","a_1","offsetLeft","rowsLeft","bIncludeStopEntry","isMatch","indexName","_ondirectionchange","eachKey","firstKey","strKey","found","changes","_write","modifyer","anythingModified","outbound","extractKey","modifyChunkSize","totalFailures","applyMutateResult","expectedCount","_i","clone","primaryKeys","nextChunk","addValues","putValues","putKeys","deleteKeys","origValue","ctx_1","criteria","deleteCallback","changeSpec","coreRange","simpleCompare","simpleCompareReverse","collectionOrWhereClause","T","collection","emptyCollection","whereClause","rangeEqual","nextCasing","lowerKey","upperNeedle","lowerNeedle","llp","lwrKeyChar","addIgnoreCaseAlgorithm","match","needles","suffix","compare","upperNeedles","lowerNeedles","direction","nextKeySuffix","needlesLen","initDirection","upperFactory","lowerFactory","needleBounds","needle","nb","firstPossibleNeedle","_addAlgorithm","lowestPossibleCasing","casing","includeLower","includeUpper","_cmp","between","_ascending","_descending","inAnyRange","includeLowers","includeUppers","ranges","ascending","descending","_min","_max","sortDirection","rangeSorter","newRange","rangePos","keyIsBeyondCurrentEntry","keyIsBeforeCurrentEntry","checkKey","keyWithinCurrentRange","eventRejectHandler","preventDefault","target","stopPropagation","globalEvents","Transaction","_reculock","lockOwnerFor","_blockedFuncs","_locked","fnAndPSD","shift","OpenFailed","active","transaction","durability","chromeTransactionDurability","ev","_reject","onabort","oncomplete","_resolve","storagemutated","bWriteLock","ReadOnly","_lock","_unlock","_root","promiseLike","root","_waitingFor","_waitingQueue","objectStore","spin","_spinCount","currentWaitPromise","abort","memoizedTables","_memoizedTables","tableSchema","transactionBoundTable","createIndexSpec","src","nameFromKeyPath","createTableSchema","getMaxKey","IdbKeyRange","only","getKeyExtractor","getSinglePathKeyExtractor","arrayify","_id_counter","getKeyPathAlias","createDBCore","tmpTrans","makeIDBKeyRange","upperBound","lowerBound","bound","tables","objectStoreNames","autoIncrement","indexByKeyPath","isPrimaryKey","indexNames","multiEntry","hasGetAll","extractSchema","isAddOrPut","req","reqs","errorHandler","args1","args2","keyCount","callbackCount","successHandler","_pos","request","nonInfinitLimit","source","idbKeyRange","getAll","getAllKeys","count_1","req_1","openKeyCursor","result_1","___id","_cursorContinue","_cursorContinuePrimaryKey","continuePrimaryKey","_cursorAdvance","doThrowCursorIsStopped","gotOne","iterationPromise","resolveIteration","rejectIteration","guardedCallback","createDbCoreTable","tableMap","MIN_KEY","MAX_KEY","generateMiddlewareStacks","middlewares","dbcore","stackImpl","down","createMiddlewareStack","createMiddlewareStacks","_middlewares","tbl","setApiOnPlace","objs","tableNames","dbschema","propDesc","enumerable","removeTablesApi","lowerVersionFirst","_cfg","version","getSchemaDiff","oldSchema","newSchema","diff","del","change","oldDef","newDef","def","recreate","oldIndexes","newIndexes","idxName","oldIdx","newIdx","createTable","createObjectStore","addIndex","createIndex","buildGlobalSchema","globalSchema","storeName","j","idbindex","adjustToExistingIndexNames","_hasGetAll","dexieName","indexSpec","WorkerGlobalScope","Version","stores","outSchema","indexNum","trim","storesSource","storesSpec","_versions","_parseStoresSpec","_allTables","_storeNames","upgradeFunction","contentUpgrade","getDbNamesTable","IDBKeyRange","dbNamesDB","Dexie","addons","dbnames","hasDatabasesNative","databases","_onDatabaseDeleted","vip","idbReady","intervalId","userAgentData","tryIdb","clearInterval","awaitIterator","callNext","onSuccess","step","onError","throw","getNext","extractTransactionArgs","_tableArgs_","scopeFunc","enterTransactionScope","parentTransaction","returnValue","scopeFuncIsAsync","promiseFollowed","decrementor","PrematureCommit","pad","virtualIndexMiddleware","level","indexLookup","allVirtualIndexes","addVirtualIndexes","keyTail","lowLevelIndex","keyPathAlias","indexList","keyLength","isVirtual","virtualIndex","translateRequest","createVirtualCursor","getObjectDiff","prfx","ap","bp","apTypeName","hooksMiddleware","downCore","downTable","dxTrans","deleting","creating","updating","addPutOrDelete","deleteNextChunk","deleteRange","getEffectiveKeys","effectiveKeys","getExistingValues","existingValues","contexts","existingValue","generatedPrimaryKey","objectDiff","additionalChanges_1","requestedValue_1","getFromTransactionCache","cacheExistingValuesMiddleware","cachedResult","isEmptyRange","RangeSet","fromOrTree","addRange","left","right","rebalance","rightWasCutOff","mergeRanges","newSet","_addRangeSet","getRangeSetIterator","state","keyProvided","up","rootClone","oldRootRight","computeDepth","rangeSet","addKey","addKeys","domDeps","observabilityMiddleware","dbName","FULL_RANGE","tableClone","mutatedParts","getRangeSet","part","pkRangeSet","delsRangeSet","newObjs","oldObjs","addKeyOrKeys","oldKey","trackAffectedIndexes","getRange","_d","readSubscribers","method","subscr","pkRangeSet_1","delsRangeSet_1","queriedIndex","queriedRanges","keysPromise_1","pKeys","cursor_1","wantValues_1","pkey","deps","dependencies","_novip","onReadyBeingFired","dbReadyResolve","cancelOpen","openCanceller","autoSchema","ready","bSticky","db_1","keyRangeGenerator","keyRange","whereCtx","readingHook","createTableConstructor","complete","wasActive","createTransactionConstructor","versionNumber","createVersionConstructor","orCollection","_IDBKeyRange","createWhereClauseConstructor","newVersion","close","oldVersion","_fireOnBlocked","vcFired","use","addon","verno","versions","versionInstance","unuse","mw","Debug.debug","Debug.getErrorWithStack","throwIfCancelled","resolveDbReady","upgradeTransaction","wasCreated","safari14Workaround","onblocked","onupgradeneeded","allowEmptyDB","delreq","deleteDatabase","NoSuchDatabase","oldVer","pow","idbUpgradeTrans","rejectTransaction","populate","queue","anyContentUpgraderHasRun","tuple","Upgrade","store_1","deleteIndex","upgradeSchema_1","returnValue_1","contentUpgradeIsAsync_1","deleteObjectStore","deleteRemovedTables","runQueue","contains","updateTablesAndIndexes","runUpgraders","readGlobalSchema","ch","verifyInstalledSchema","onversionchange","onclose","_onDatabaseCreated","fireRemainders","remainders_1","dexieOpen","hasArguments","doDelete","_transaction","idbMode","onlyIfCompatible","SubTransaction","enterTransaction","_whenReady","InvalidTable","symbolObservable","observable","_subscribe","Observable","extendObservabilitySet","mozIndexedDB","webkitIndexedDB","msIndexedDB","webkitIDBKeyRange","_Dexie","propagateLocally","updateParts","wasMe","propagatingLocally","databaseName","exists","getDatabaseNames","infos","info","defineClass","ignoreTransaction","async","generatorFn","spawn","currentTransaction","waitFor","promiseOrFunction","optionalTimeout","Debug.setDebug","liveQuery","querier","observer","closed","accumMuts","currentObs","subscription","mutationListener","querying","startedListening","shouldNotify","rangeSet1","rangeSet2","i1","nextResult1","i2","nextResult2","rangesOverlap","doQuery","exec","execute","delByKeyPath","minKey","semVer","maxKey","addEventListener","updatedParts","event_1","initCustomEvent","BroadcastChannel","bc_1","changedParts","onmessage","trig","matchAll","includeUncontrolled","client","newValue","swContainer","serviceWorker","domError","globalState","MyDexie","nodes","IndexedDB","putQueue","notStored","bulkPut","getQueue","bulkGet","throttledPut","path","throttledGet","savePath","Websocket","router","ws","WebSocket","onopen","sendQueue","send","readyState","OPEN","CONNECTING","Router","storageAdapters","serverPeers","seenMessages","sendTo","topic","subscribersByTopic","storageAdapter","opts","DEFAULT_CONFIG","allowPublicSpace","enableStats","localOnly","Node","on_subscriptions","_loop2","once_subscriptions","map_subscriptions","_loop","webSocketPeers","getCurrentUser","currentUser","setCurrentUser","childData","doCallbacks","newNode","auth","signIfNeeded","addParentNodes","signed","~","childName","parentId","counter","myOpts","retry","UNIQUE_ID_VALIDATORS","email","bitcoin","bitcoin_address","ip","ipv6","gpg_fingerprint","gpg_keyid","google_oauth2","tel","phone","keyID","account","uuid","Attribute","guessTypeOf","getUuid","getUniqueIdValidators","isUniqueType","uri","userSpace","local","DEFAULT_PERMISSIONS","read","write","admin","Channel","myGroupSecret","chatLink","useChatLink","participants","addParticipant","founder","getChatLinks","putDirect","getMyGroupSecret","getMySecretUuid","onTheirDirect","theirSecretUuids","theirGroupSecrets","onTheir","hasAdmin","inviter","participantsChanged","saved","chatWith","channelId","sharedSecret","linkId","encrypted","sharedKey","encryptedChatRequest","channelRequestId","getTheirSecretUuid","getTheirGroupSecret","changeMyGroupSecret","mute","participant","block","secrets","ourSecretChannelIds","theirSecretChannelIds","mySecretUuid","mySecret","mySecretHash","getCurrentParticipants","getParticipants","getParticipantsCallbackId","getParticipantsCallbacks","getSecret","getOurSecretChannelId","getTheirSecretChannelId","getChannels","listenToChatLinks","keypair","getMyChatLinks","seen","handleChannel","ourSecretChannelId","encryptedChatId","chatId","getMessages","theirSecretChannelId","messageReceived","userState","_context13","selfAuthored","messages","_context14","decrypted","getLatestMsg","callbackIfLatest","latest","time","onMy","setMyMsgsLastSeenTime","getMyMsgsLastSeenTime","myMsgsLastSeenTime","getTheirMsgsLastSeenTime","_this8","theirMsgsLastSeenTime","removeParticipant","permissions","_context21","_this9","directSubscriptions","_onTheirDirectFromUser","groupSubscriptions","_onTheirGroupFromUser","_context22","_context23","putGroup","_context25","_context26","onGroup","onDirect","onMyGroup","onTheirGroup","onMyDirect","_context33","_context32","_this10","_context31","_context35","_context34","hasWritePermission","_context38","_this11","_context37","_context40","_context39","_this12","_context42","theirSecretUuid","_b","_this13","_context41","_context44","_context43","_this14","setTyping","isTyping","setTypingTimeout","_this15","getTyping","typing","_this16","getTypingTimeouts","getSimpleLink","urlRoot","_opts","_context46","chatLinks","chatLinkSubscriptions","links","link","channels","formatChatLink","_this17","encPub","requestId","_context45","createChatLink","_context47","sharedKeyString","encryptedSharedKey","ownerSecret","ownerEncryptedSharedKey","setActivity","activity","irisActivityStatus","setActivityTimeout","update","timerUpdate","getActivity","pubKey","activityDate","isActive","lastActive","isOnline","enc","_context48","_context51","_context50","_context49","removeGroupChatLink","removePrivateChatLink","deleteChannel","_context52","deleteGroup","_context53","channel","blockedUsers","isBlocked","_v","groupName","groupNode","follows","requestAnimationFrame","isFollowing","sum","_cached_map","cached","cacheKey","myEvent","_cached_on","_cached_count","_cached_fn","callbackId","myCallbacks","loginTime","unseenMsgsTotal","unseenNotificationCount","webPushSubscriptions","desktopNotificationsEnabled","Notification","permission","publicVapidKey","urlBase64ToUint8Array","base64String","base64","repeat","rawData","outputArray","reg","pushManager","userVisibleOnly","applicationServerKey","addWebPushSubscription","_subscribeToWebPush","getRegistration","getSubscription","sub","addWebPushSubscriptionsToChats","channelIds","privateState","_addWebPushSubscription","saveToGun","_getWebPushSubscriptions","getEpub","getNotificationText","_getNotificationText","notification","profile","action","changeUnseenNotificationCount","_sendIrisNotification","recipient","_sendWebPushNotification","subscriptions","title","body","payload","endpoint","fetch","headers","content-type","_ret","notifyMsg","onClick","timeObj","visibilityState","notificationSetting","getMyName","participantProfiles","icon","silent","onclick","sendWebPushNotification","subscribeToIrisNotifications","notificationsSeenTime","notificationsShownTime","setNotificationsShownTime","alreadyHave","group","getPubKey","encryptedNotification","sendIrisNotification","changeChatUnseenCount","chat","chatNode","unseen","subscribeToWebPush","getWebPushSubscriptions","removeSubscription","getTag","isString","isNumber","isObject","isDefined","isBlank","KeyStore","_keys","_keyMap","totalWeight","createKey","weight","keyId","getFn","createKeyPath","createKeyId","INVALID_KEY_WEIGHT_VALUE","Config","isCaseSensitive","includeScore","shouldSort","sortFn","score","includeMatches","findAllMatches","minMatchCharLength","threshold","distance","useExtendedSearch","list","deepGet","isObjectLike","isBoolean","baseToString","ignoreLocation","ignoreFieldNorm","fieldNormWeight","SPACE","FuseIndex","norm","mantissa","numTokens","parseFloat","isCreated","setIndexRecords","docs","records","_keysMap","doc","docIndex","_addString","_addObject","record","$","keyIndex","subRecords","nestedArrIndex","subRecord","myIndex","setKeys","setSources","computeScore$1","pattern","errors","currentLocation","expectedLocation","accuracy","proximity","abs","createPatternAlphabet","mask","char","BitapSearch","chunks","addChunk","startIndex","alphabet","remainder","indices","allIndices","totalScore","hasMatches","patternAlphabet","patternLen","textLen","currentThreshold","bestLocation","computeMatches","matchMask","lastBitArr","finalScore","binMax","binMin","binMid","finish","bitArr","charMatch","matchmask","convertMaskToIndices","BaseMatch","getMatch","multiRegex","singleRegex","exp","matches","FuzzyMatch","_bitapSearch","searchIn","IncludeMatch","searchers","searchersLen","SPACE_RE","MultiMatchSet","registeredSearchers","createSearcher","searcherClass","condition","isExpression","convertToExplicit","$and","isQueryPath","isPath","isLeaf","LOGICAL_SEARCH_INVALID_QUERY_FOR_KEY","searcher","operator","transformMatches","refIndex","transformScore","Fuse","_keyStore","setCollection","_docs","_myIndex","removeAt","_searchStringList","_searchObjectList","_searchLogical","EPSILON","computeScore","transformers","transformer","expression","evaluate","_findMatches","getValueForItemAtKeyId","resultMap","expResults","parseIndex","parseQuery","register","queryItem","token","isMultiMatch","isSingleMatch","numMatches","qLen","pLen","myName","latestChatLink","onlineTimeout","ourActivity","noFollows","noFollowers","searchIndex","initCalled","electron","searchableItems","getExtendedFollowsCalled","DEFAULT_FOLLOW","DEFAULT_SETTINGS","openAtLogin","minimizeOnClose","enableWebtorrent","enablePublicPeerDiscovery","autoplayWebtorrent","localStorageKey","login","autologin","loginAsNewUser","clearIndexedDB","updateSearchIndex","taskQueue","leading","saveSearchResult","followDistance","followerCount","followers","addFollow","follower","updateNoFollows","updateNoFollowers","removeFollow","getExtendedFollows","maxDepth","currentDepth","followedKey","getSearchIndex","setOurOnlineStatus","activeRoute","setActive","pathname","notifications","updateGroups","shouldRefresh","addChannel","settings","reload","autofollow","logOut","_reg$active","r1","r2","r1done","r2done","getMyChatLink","myPeerUrl","shareMyPeerUrl","myIp","newChannel","latestTime","theirMsgsLastSeenDate","processMessage","myLastSeenTime","online","theirLastActiveTime","isDarkMode","matchMedia","photo","hue","color","inviteLinks","onClickNotification","messageIds","invite","subscribeToMsgs","subscribed","publicSpace","_x","errorMsg","ValidationError","SignedMessage","signedData","_validate","getSignerKeyID","author","attr","signerKeyHash","timestamp","signingKey","getAuthor","getAuthorIterable","getContacts","getRecipient","getRecipientIterable","fromSig","private","static","staticState"],"mappings":"i/RACA,IAAMA,EAAI,CACRC,SAAU,SAACC,EAAgBC,GACzB,IAAIC,EACJ,OAAO,WACL,IAAMC,EAAOC,UACPC,EAAUC,KACXJ,IACHF,EAAKO,MAAMF,EAASF,GACpBD,GAAa,EACbM,YAAW,WAAA,OAAMN,GAAa,IAAOD,MAI3CQ,SAAU,SAACT,EAAgBC,GACzB,IAAIS,EACJ,OAAO,WACL,IAAMP,EAAOC,UACPC,EAAUC,KAChBK,aAAaD,GACbA,EAAaF,YAAW,WAAA,OAAMR,EAAKO,MAAMF,EAASF,KAAOF,KAG7DW,OAAQ,SAACC,GAAU,OAAKA,EAAIC,KAAKC,MAAMD,KAAKE,SAAWH,EAAII,UAC3DC,WAAY,SAACL,EAAYM,GAMvB,IALA,IAGIC,EACAC,EAJEC,EAAWT,EAAIU,MAAM,GACvBC,EAAIX,EAAII,OACRQ,EAAMD,EAAIL,EAGPK,KAAMC,GAEXL,EAAOE,EADPD,EAAQP,KAAKC,OAAOS,EAAI,GAAKV,KAAKE,WAElCM,EAASD,GAASC,EAASE,GAC3BF,EAASE,GAAKJ,EAEhB,OAAOE,EAASC,MAAME,IAExBC,MAAO,SAAC1B,GAAc,OAAKQ,WAAWR,EAAM,IAC5C2B,KAAM,SAAC3B,GACL,IAAI4B,GAAS,EACb,OAAO,WACDA,IAGJA,GAAS,EACT5B,EAAKO,MAAMD,KAAMF,cAGrByB,KAAM,SAACC,EAAUC,GACf,IAAMC,EAAS,GAMf,OALAC,OAAOF,KAAKD,GAAKI,SAAQ,SAAAC,GAClBJ,EAAKK,SAASD,KACjBH,EAAOG,GAAOL,EAAIK,OAGfH,GAETK,SAAU,SAACP,EAAUO,GAMnB,OALAJ,OAAOF,KAAKM,GAAUH,SAAQ,SAAAC,QACXG,IAAbR,EAAIK,KACNL,EAAIK,GAAOE,EAASF,OAGjBL,GAETS,OAAQ,SAACT,EAAUU,GACjB,IAAMR,EAAS,GAMf,OALAC,OAAOF,KAAKD,GAAKI,SAAQ,SAAAC,GACnBK,EAAUV,EAAIK,MAChBH,EAAOG,GAAOL,EAAIK,OAGfH,GAETS,QAAS,SAACC,EAAQC,GAChB,GAAID,IAAMC,EACR,OAAO,EAET,GAAID,aAAaE,MAAQD,aAAaC,KACpC,OAAOF,EAAEG,YAAcF,EAAEE,UAE3B,IAAKH,IAAMC,GAAmB,iBAAND,GAA+B,iBAANC,EAC/C,OAAOD,GAAMA,GAAKC,GAAMA,EAE1B,GAAID,EAAEI,YAAcH,EAAEG,UACpB,OAAO,EAET,IAAMf,EAAOE,OAAOF,KAAKW,GACzB,OAAIX,EAAKd,SAAWgB,OAAOF,KAAKY,GAAG1B,QAG5Bc,EAAKgB,OAAM,SAAAC,GAAC,OAAIlD,EAAE2C,QAAQC,EAAEM,GAAIL,EAAEK,QAE3CC,KAAM,SAACpC,GACL,IAAMqC,EAAM,IAAIC,IAAItC,GACpB,OAAOuC,MAAMC,KAAKH,KCzFlBI,GAAS,EACb,IACEA,uBAASrB,OAAOa,UAAUS,SAASC,KAAKC,OAAOC,SAC/C,MAAOC,IAET,ICPIC,EDOEC,GAAaP,GAAUQ,WAAaA,UAAUD,WAAaC,UAAUD,UAAUE,cAC/EC,EAAcH,GAAaA,EAAUI,QAAQ,eAAiB,EAoB9DC,EAAU,CACd,UACA,UACA,MACA,SACA,MACA,SACA,OACA,QACA,MACA,SACA,WACA,WACA,YACA,YACA,SACA,YACA,WACA,YACA,aACA,MACA,WACA,WACA,UACA,MACA,QACA,YACA,MACA,SACA,SACA,YACA,WACA,YACA,WACA,OACA,MACA,OACA,SACA,SACA,MACA,SACA,OACA,QACA,YACA,MACA,OACA,SACA,WACA,SACA,QACA,QACA,MACA,YACA,UACA,QACA,QACA,WACA,WACA,UACA,OACA,MACA,WACA,cACA,UACA,SACA,YACA,aACA,YACA,UACA,YACA,UACA,aACA,aACA,WACA,OACA,YACA,QACA,YACA,MACA,SACA,cACA,QACA,SACA,MACA,SACA,OACA,QACA,UACA,WACA,UACA,YACA,OACA,SACA,SACA,YACA,OACA,QACA,WACA,MACA,UACA,SACA,WACA,OACA,YACA,SACA,OACA,QACA,YACA,SACA,UACA,MACA,QACA,WACA,MACA,MACA,SACA,SACA,SACA,QACA,UACA,OACA,WACA,OACA,MACA,aACA,OACA,MACA,OACA,WACA,YACA,UACA,QACA,SACA,SACA,UACA,OACA,WACA,QACA,SACA,UACA,cACA,SACA,OACA,UACA,aACA,OACA,QACA,UACA,UACA,UACA,OACA,UACA,OACA,WACA,QACA,UACA,eACA,WACA,SACA,QACA,WACA,cACA,QACA,SACA,SACA,SACA,SACA,MACA,YACA,aACA,WACA,aACA,OACA,OACA,QACA,MACA,QACA,UACA,UACA,WACA,OACA,QACA,UACA,QACA,UACA,SACA,SACA,OACA,SACA,QACA,UACA,SACA,OACA,QACA,WACA,OACA,QACA,WACA,SACA,SACA,UACA,WACA,SACA,WACA,SACA,YACA,SACA,WACA,aACA,UACA,OACA,SACA,OACA,cACA,OACA,UACA,WACA,SACA,QACA,WACA,OACA,QACA,OACA,SACA,UACA,OACA,cACA,SACA,UACA,UACA,YACA,OACA,UACA,QACA,MACA,KACA,QACA,UACA,WACA,SACA,aACA,YACA,UACA,UACA,UACA,UACA,QACA,WACA,MACA,SACA,OACA,WACA,UACA,YACA,WACA,OACA,YACA,WACA,SACA,QACA,UACA,YACA,SACA,OACA,SACA,QACA,SACA,SACA,SACA,UACA,MACA,cACA,QACA,WACA,UACA,aACA,aACA,SACA,OACA,UACA,YACA,WACA,aACA,SACA,UACA,UACA,WACA,WACA,QACA,QACA,QACA,SACA,WACA,aACA,QACA,QACA,QACA,OACA,QACA,QACA,QACA,QACA,OACA,UACA,SACA,YACA,QACA,WACA,WACA,WACA,QACA,QACA,WACA,UACA,OACA,QACA,YACA,YACA,OACA,QACA,QACA,YACA,UACA,UACA,OACA,SACA,OACA,QACA,SACA,OACA,WACA,SACA,QACA,OACA,SACA,SACA,gBACA,QACA,SACA,QACA,OACA,UACA,UACA,SACA,OACA,UACA,SACA,QACA,UACA,YACA,UACA,aACA,WACA,OACA,YACA,SACA,aACA,OACA,OACA,UACA,MACA,QACA,SACA,MACA,SACA,UACA,MACA,SACA,SACA,QACA,WACA,QACA,QACA,MACA,QACA,QACA,MACA,WAGIC,EAAa,CACjB,UACA,MACA,WACA,MACA,QACA,WACA,QACA,OACA,UACA,QACA,SACA,OACA,UACA,UACA,YACA,SACA,OACA,QACA,QACA,OACA,OACA,UACA,SACA,SACA,QACA,SACA,OACA,OACA,SACA,UACA,SACA,QACA,UACA,OACA,QACA,MACA,QACA,SACA,QACA,SACA,MACA,QACA,SACA,UACA,SACA,OACA,OACA,OACA,SACA,MACA,SACA,QACA,UACA,SACA,SACA,QACA,WACA,OACA,UACA,QACA,QACA,OACA,OACA,OACA,SACA,MACA,QACA,QACA,QACA,OACA,QACA,QACA,WACA,QACA,MACA,QACA,QACA,OACA,WACA,QACA,SACA,YACA,QACA,QACA,UACA,SACA,QACA,OACA,UACA,UACA,OACA,QACA,UACA,QACA,QACA,WACA,aACA,SACA,SACA,OACA,YACA,aACA,YACA,aACA,SACA,YACA,QACA,QACA,OACA,SACA,QACA,OACA,QACA,QACA,SACA,SACA,QACA,YACA,QACA,UACA,aACA,QACA,SACA,SACA,OACA,MACA,MACA,QACA,SACA,UACA,UACA,QACA,QACA,YACA,SACA,QACA,QACA,YACA,QACA,QACA,WACA,SACA,OACA,QACA,SACA,SACA,SACA,QACA,SACA,OACA,MACA,SACA,SACA,QACA,UACA,UACA,WACA,UACA,QACA,MACA,aACA,QACA,YACA,YACA,WACA,SACA,QACA,YACA,WACA,UACA,YACA,YACA,YACA,QACA,cACA,UACA,OACA,SACA,UACA,UACA,aACA,WACA,WACA,WACA,SACA,OACA,MACA,UACA,SACA,aACA,UACA,UACA,YACA,aACA,UACA,YACA,QACA,WACA,UACA,OACA,QACA,WACA,cACA,QACA,WACA,QACA,UACA,QACA,SACA,UACA,YACA,SACA,QACA,OACA,WACA,WACA,cACA,cACA,aACA,aACA,aACA,QACA,SACA,aACA,cACA,YACA,eACA,UACA,YACA,OACA,WACA,YACA,OACA,WACA,QACA,SACA,WACA,OACA,QACA,UACA,UACA,YACA,QACA,SACA,OACA,SACA,SACA,QACA,WACA,UACA,WACA,QACA,WACA,QACA,UACA,WACA,aACA,aACA,aACA,YACA,QACA,YACA,UACA,OACA,QACA,OACA,MACA,MACA,QACA,OACA,QACA,YACA,QACA,QACA,SACA,YACA,OACA,QACA,WACA,UACA,QACA,QACA,WACA,MACA,SACA,YACA,OACA,OACA,UACA,OACA,MACA,MACA,SACA,YACA,MACA,OACA,OACA,QACA,QACA,WACA,OACA,SACA,OACA,QACA,aACA,gBACA,UACA,YACA,UACA,OACA,QACA,QACA,OACA,QACA,OACA,SACA,WACA,UACA,UACA,QACA,SACA,YACA,SACA,WACA,OACA,UACA,OACA,YACA,OACA,UACA,SACA,SACA,YACA,WACA,UACA,QACA,OACA,UACA,QACA,UACA,QACA,UACA,aACA,OACA,SACA,WACA,YACA,cACA,aACA,SACA,UACA,WACA,SACA,UACA,SACA,SACA,QACA,QACA,QACA,MACA,SACA,UACA,WACA,QACA,QACA,cACA,aACA,QACA,OACA,WACA,cACA,MACA,SACA,QACA,WACA,WACA,aACA,QACA,MACA,UACA,QACA,eACA,SACA,OACA,OACA,QACA,QACA,SACA,YACA,UACA,cACA,WACA,SACA,cACA,OACA,cACA,eACA,WACA,WACA,MACA,WACA,cACA,WACA,UACA,OACA,QACA,OACA,OACA,aACA,OACA,YACA,YACA,QACA,UACA,UACA,SACA,gBACA,WACA,SACA,UACA,SACA,WACA,OACA,OACA,aACA,OACA,WACA,YACA,WACA,WACA,MACA,QACA,UACA,MACA,aACA,SACA,WACA,UACA,WACA,aACA,QACA,OACA,SACA,QACA,SACA,QACA,WACA,SACA,SACA,YACA,WACA,QACA,UACA,WACA,YACA,QACA,OACA,YACA,WACA,YACA,QACA,OACA,SACA,WACA,SACA,QACA,QACA,SACA,UACA,eACA,SACA,QACA,MACA,SACA,QACA,UACA,cACA,SACA,UACA,UACA,aACA,YACA,WACA,QACA,WACA,UACA,UACA,SACA,SACA,aACA,UACA,aACA,aACA,UACA,UACA,MACA,QACA,YACA,cACA,SACA,YACA,WACA,YACA,WACA,WACA,SACA,UACA,OACA,OACA,MACA,aACA,OACA,QACA,WACA,aACA,OACA,QACA,QACA,QACA,UACA,SACA,UACA,WACA,QACA,WACA,OACA,OACA,SACA,WACA,UACA,QACA,UACA,QACA,aACA,WACA,QACA,QACA,cACA,OACA,UACA,UACA,OACA,WACA,UACA,QACA,YACA,QACA,UACA,SACA,OACA,WACA,OACA,YACA,QACA,WACA,WACA,QACA,QACA,UACA,SACA,MACA,YACA,WACA,YACA,OACA,QACA,cACA,MACA,UACA,QACA,OACA,WACA,eACA,QACA,OACA,OACA,QACA,UACA,SACA,YACA,gBACA,UACA,UACA,aACA,QACA,QACA,SACA,QACA,WACA,OACA,SACA,UACA,MACA,QACA,OACA,YACA,OACA,YACA,eACA,UACA,UACA,UACA,YACA,QACA,YACA,cACA,UACA,WACA,WACA,eACA,UACA,SACA,WACA,YACA,SACA,WACA,WACA,SACA,YACA,UACA,OACA,OACA,SACA,SACA,UACA,OACA,YACA,QACA,YACA,OACA,MACA,cACA,QACA,UACA,UACA,aACA,YACA,SACA,OACA,SACA,YACA,MACA,SACA,QACA,WACA,QACA,QACA,iBACA,SACA,aACA,gBACA,aACA,QACA,QACA,OACA,OACA,YACA,UACA,WACA,aACA,SACA,WACA,OACA,UACA,WACA,aACA,UACA,WACA,UACA,WACA,UACA,WACA,UACA,YACA,MACA,YACA,aACA,YACA,WACA,QACA,WACA,WACA,WACA,MACA,UACA,QACA,WACA,aACA,UACA,UACA,QACA,SACA,iBACA,YACA,YACA,aACA,YACA,OACA,SACA,WACA,SACA,cACA,cACA,OACA,SACA,WACA,UACA,SACA,aACA,UACA,cACA,gBACA,QACA,UACA,WACA,UACA,QACA,QACA,cACA,UACA,UACA,SACA,SACA,OACA,QACA,MACA,QACA,WACA,QACA,gBACA,UACA,aACA,aACA,SACA,WACA,WACA,WACA,QACA,aACA,UACA,OACA,QACA,aACA,QACA,WACA,OACA,WACA,YACA,QACA,aACA,UACA,YACA,SACA,YACA,SACA,SACA,UACA,aACA,eACA,YACA,QACA,WACA,WACA,OACA,WACA,SACA,aACA,YACA,WACA,MACA,gBACA,SACA,aACA,UACA,QACA,gBACA,SACA,WACA,aACA,SACA,WACA,SACA,OACA,WACA,WACA,aACA,WACA,eACA,YACA,UACA,WACA,WACA,aACA,YACA,UACA,OACA,WACA,SACA,QACA,QACA,aACA,QACA,SACA,QACA,YACA,OACA,WACA,SACA,SACA,WACA,SACA,UACA,OACA,WACA,WACA,QACA,SACA,QACA,aACA,YACA,eACA,WACA,cACA,YACA,SACA,eACA,gBACA,WACA,cACA,UACA,YACA,WACA,cACA,YACA,WACA,WACA,YACA,SACA,cACA,aACA,SACA,QACA,eACA,aACA,UACA,WACA,QACA,YACA,cACA,aACA,cACA,SACA,YACA,aACA,aACA,aACA,SACA,aACA,SACA,gBACA,QACA,WACA,aACA,QACA,aACA,kBACA,WACA,UACA,cACA,UACA,WACA,SACA,aACA,QACA,UACA,WACA,QACA,aACA,cACA,UACA,cACA,SACA,WACA,QACA,OACA,QACA,WACA,aACA,UACA,aACA,aACA,YACA,OACA,SACA,gBACA,UACA,aACA,cACA,SACA,SACA,cACA,OACA,UACA,OACA,aACA,QACA,OACA,QACA,SACA,SACA,UACA,SACA,UACA,QACA,SACA,WACA,QACA,YACA,SACA,WACA,SACA,UACA,cACA,WACA,UACA,YACA,WACA,QACA,WACA,OACA,eACA,YACA,cACA,cACA,aACA,WACA,cACA,OACA,QACA,WACA,SACA,WACA,iBACA,UACA,aACA,UACA,YACA,WACA,QACA,aACA,UACA,UACA,MACA,WACA,YACA,cACA,cACA,eACA,cACA,YACA,WACA,UACA,cACA,gBACA,OACA,WACA,UACA,WACA,aACA,aACA,UACA,YACA,aACA,QACA,UACA,WACA,QACA,eACA,OACA,UACA,SACA,cACA,cACA,WACA,QACA,UACA,WACA,QACA,UACA,UACA,SACA,UACA,WACA,UACA,SACA,WACA,YACA,OACA,WACA,SACA,aACA,cACA,YACA,OACA,UACA,QACA,QACA,YACA,SACA,QACA,UACA,MACA,aACA,YACA,UACA,QACA,SACA,aACA,SACA,UACA,YACA,WACA,iBACA,eACA,WACA,QACA,UACA,QACA,UACA,WACA,QACA,QACA,WACA,WACA,QACA,WACA,OACA,UACA,gBACA,UACA,UACA,aACA,UACA,SACA,cACA,gBACA,eACA,aACA,aACA,QACA,WACA,UACA,SACA,UACA,SACA,OACA,UACA,aACA,eACA,QACA,YACA,WACA,aACA,eACA,OACA,aACA,UACA,UACA,aACA,QACA,QACA,WACA,gBACA,WACA,QACA,eACA,WACA,aACA,UACA,aACA,YACA,UACA,SACA,cACA,UACA,WACA,UACA,YACA,UACA,SACA,UACA,UACA,WACA,cACA,WACA,gBACA,aACA,QACA,WACA,YACA,aACA,SACA,SACA,YACA,WACA,SACA,SACA,SACA,eACA,QACA,aACA,YACA,OACA,YACA,SACA,QACA,UACA,YACA,aACA,WACA,eACA,gBACA,SACA,aACA,QACA,WACA,SACA,gBACA,SACA,aACA,UACA,QACA,SACA,cACA,aACA,aACA,eACA,WACA,YACA,UACA,aACA,UACA,WACA,UACA,QACA,SACA,YACA,WACA,OACA,WACA,UACA,OACA,UACA,YACA,cACA,aACA,SACA,YACA,aACA,YACA,WACA,SACA,SACA,SACA,WACA,UACA,UACA,UACA,SACA,cACA,YACA,YACA,WACA,SACA,UACA,SACA,YACA,UACA,cACA,SACA,aACA,MACA,WACA,OACA,KACA,WACA,aACA,UACA,YACA,SACA,SACA,WACA,WACA,YACA,UACA,UACA,QACA,aACA,YACA,eACA,cACA,WACA,OACA,aACA,SACA,SACA,YACA,UACA,UACA,UACA,WACA,SACA,WACA,SACA,MACA,QACA,WACA,aACA,YACA,WACA,WACA,QACA,YACA,UACA,eACA,WACA,WACA,eACA,aACA,UACA,QACA,UACA,UACA,WACA,aACA,SACA,UACA,SACA,UACA,SACA,SACA,UACA,eACA,YACA,UACA,YACA,SACA,cACA,YACA,WACA,aACA,SACA,UACA,YACA,iBACA,QACA,SACA,WACA,cACA,QACA,OACA,WACA,cACA,aACA,aACA,aACA,YACA,QACA,aACA,QACA,SACA,YACA,OACA,UACA,WACA,SACA,YACA,QACA,UACA,OACA,YACA,YACA,WACA,OACA,SACA,UACA,UACA,WACA,YACA,aACA,WACA,cACA,SACA,OACA,cACA,OACA,WACA,UACA,OACA,OACA,MACA,SACA,QACA,OACA,eACA,YACA,OACA,QACA,WACA,QACA,UACA,YACA,SACA,SACA,WACA,SACA,QACA,QACA,SACA,WACA,UACA,OACA,OACA,OACA,WACA,OACA,UACA,QACA,SACA,YACA,WACA,WACA,YACA,SACA,QACA,QACA,aACA,QACA,QACA,SACA,SACA,QACA,SACA,YACA,WACA,SACA,UACA,OACA,YACA,UACA,MACA,SACA,YACA,MACA,QACA,OACA,SACA,SACA,QACA,QACA,OACA,MACA,QACA,WACA,QACA,QACA,QACA,WACA,WACA,SACA,WACA,QACA,WACA,QACA,UACA,QACA,OACA,OACA,OACA,cACA,UACA,OACA,SACA,QACA,QACA,MACA,OACA,OACA,QACA,aACA,MACA,SACA,WACA,SACA,WACA,UACA,SACA,SACA,QACA,QACA,WACA,QACA,OACA,QACA,MACA,UACA,SACA,QACA,MACA,QACA,UACA,QACA,QACA,SACA,UACA,UACA,SACA,OACA,OACA,OACA,MACA,SACA,QACA,SACA,QACA,OACA,UAC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"} \ No newline at end of file diff --git a/dist/local.d.ts b/dist/local.d.ts index 14b61ef..40fb02f 100644 --- a/dist/local.d.ts +++ b/dist/local.d.ts @@ -1,4 +1,4 @@ -import Node from './Node'; +import Node from './db/Node'; /** * Get a state that is only synced in memory and local storage. * diff --git a/dist/lodash.d.ts b/dist/lodash.d.ts index 798013d..d725baf 100644 --- a/dist/lodash.d.ts +++ b/dist/lodash.d.ts @@ -1,4 +1,4 @@ -declare const _default: { +declare const _: { throttle: (func: Function, limit: number) => () => void; debounce: (func: Function, limit: number) => () => void; sample: (arr: any[]) => any; @@ -8,5 +8,7 @@ declare const _default: { omit: (obj: any, keys: string[]) => {}; defaults: (obj: any, defaults: any) => any; pickBy: (obj: any, predicate: Function) => {}; + isEqual: (a: any, b: any) => any; + uniq: (arr: any[]) => any[]; }; -export default _default; +export default _; diff --git a/dist/public.d.ts b/dist/public.d.ts index e5d643c..303fa30 100644 --- a/dist/public.d.ts +++ b/dist/public.d.ts @@ -1,6 +1,6 @@ /** * Get a public space where only the specified user (public key) can write. Others can read. - * @param pub The public key of the user. Defaults to the current user from session. + * @param pub The public key string or keypair object of the user. Defaults to the current user from session. * @returns {Node} The user space. */ -export default function (pub?: string): any; +export default function (pub?: any): any; diff --git a/dist/util.d.ts b/dist/util.d.ts index cc7d1aa..8e887c7 100644 --- a/dist/util.d.ts +++ b/dist/util.d.ts @@ -1,15 +1,12 @@ -import 'gun/sea'; -declare function gunAsAnotherUser(gun: any, key: any, f: Function): any; declare function gunOnceDefined(node: any): Promise; declare const _default: { gunOnceDefined: typeof gunOnceDefined; - gunAsAnotherUser: typeof gunAsAnotherUser; - getHash(str: string, format?: string): Promise; + getHash(data: any, format?: string): Promise; capitalize(s: string): string; generateName(): string; base64ToHex(str: string): string; + arrayBufferToBase64(buffer: any): string; getCaret(el: HTMLInputElement): any; - injectCss(): void; getUrlParameter(sParam: string, sParams: string): string | true | undefined; formatTime(date: Date): any; formatDate(date: Date): string; diff --git a/package.json b/package.json index a6b6cf2..ce5ebc5 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,8 @@ "start": "tsdx watch --name iris", "build": "tsdx build --format cjs,esm,umd --name iris", "build:docs": "documentation build src/** --shallow -f html -o docs --config documentation.yml", - "test": "tsdx test", + "test": "yarn build;tsdx test", + "test:watch": "tsdx test --watch", "lint": "tsdx lint", "prepare": "tsdx build --name iris", "size": "size-limit", @@ -48,17 +49,20 @@ } ], "devDependencies": { + "@babel/preset-typescript": "^7.18.6", "@size-limit/preset-small-lib": "^8.1.0", "documentation": "^14.0.0", + "fake-indexeddb": "^4.0.0", "husky": "^8.0.1", + "rollup-plugin-web-worker-loader": "^1.6.1", "size-limit": "^8.1.0", "tsdx": "^0.14.1", "tslib": "^2.4.0", "typescript": "^4.8.4" }, "dependencies": { + "dexie": "^3.2.2", "fuse.js": "^6.6.2", - "gun": "https://github.com/mmalmi/gun", - "localforage": "^1.10.0" + "quick-lru": "^6.1.1" } } diff --git a/src/Channel.ts b/src/Channel.ts index e4cdd54..ba52940 100644 --- a/src/Channel.ts +++ b/src/Channel.ts @@ -1,12 +1,11 @@ // @ts-nocheck -import Gun from 'gun'; -import 'gun/sea'; import util from './util'; import Attribute from './Attribute'; import session from './session'; import publicState from './global'; import userState from './public'; +import Key from './Key'; // TODO: extract Group channels into their own class @@ -52,12 +51,12 @@ const DEFAULT_PERMISSIONS = {read: true, write: true, admin: false}; * * var gun1 = new Gun('https://gun-us.herokuapp.com/gun'); * var gun2 = new Gun('https://gun-us.herokuapp.com/gun'); -* var myKey = await iris.Key.getDefault(); +* var myKey = await Key.getDefault(); * var someoneElse = localStorage.getItem('someoneElsesKey'); * if (someoneElse) { * someoneElse = JSON.parse(someoneElse); * } else { -* someoneElse = await iris.Key.generate(); +* someoneElse = await Key.generate(); * localStorage.setItem('someoneElsesKey', JSON.stringify(someoneElse)); * } * @@ -218,12 +217,10 @@ class Channel { this.save(); // save the channel first so it's there before inviter subscribes to it options.saved = true; publicState().user(pub).get('chatLinks').get(linkId).get('encryptedSharedKey').on(async encrypted => { - const sharedKey = await Gun.SEA.decrypt(encrypted, sharedSecret); - const encryptedChatRequest = await Gun.SEA.encrypt(session.getKey().pub, sharedSecret); // TODO encrypt is not deterministic, it uses salt + const sharedKey = await Key.decrypt(encrypted, sharedSecret); + const encryptedChatRequest = await Key.encrypt(session.getKey().pub, sharedSecret); // TODO encrypt is not deterministic, it uses salt const channelRequestId = await util.getHash(encryptedChatRequest); - util.gunAsAnotherUser(publicState(), sharedKey, user => { - user.get('chatRequests').get(channelRequestId.slice(0, 12)).put(encryptedChatRequest); - }); + publicState(sharedKey).get('chatRequests').get(channelRequestId.slice(0, 12)).put(encryptedChatRequest); }); } } @@ -258,7 +255,7 @@ class Channel { } changeMyGroupSecret() { - this.myGroupSecret = Gun.SEA.random(32).toString('base64'); + this.myGroupSecret = Key.random(32).toString('base64'); // TODO: secret should be archived and probably messages should include the encryption key id so past messages don't become unreadable this.putDirect(`S${this.uuid}`, this.myGroupSecret); } @@ -290,7 +287,7 @@ class Channel { async getMySecretUuid() { if (!this.mySecretUuid) { - const mySecret = await Gun.SEA.secret(session.getKey().epub, session.getKey()); + const mySecret = await Key.secret(session.getKey().epub, session.getKey()); const mySecretHash = await util.getHash(mySecret); this.mySecretUuid = await util.getHash(mySecretHash + this.uuid); } @@ -335,7 +332,7 @@ class Channel { async getSecret(pub) { if (!this.secrets[pub]) { const epub = await util.gunOnceDefined(publicState().user(pub).get(`epub`)); - this.secrets[pub] = await Gun.SEA.secret(epub, session.getKey()); + this.secrets[pub] = await Key.secret(epub, session.getKey()); } return this.secrets[pub]; } @@ -345,7 +342,7 @@ class Channel { */ static async getOurSecretChannelId(pub, pair) { const epub = await util.gunOnceDefined(publicState().user(pub).get(`epub`)); - const secret = await Gun.SEA.secret(epub, pair); + const secret = await Key.secret(epub, pair); return util.getHash(secret + pub); } @@ -354,18 +351,18 @@ class Channel { */ static async getTheirSecretChannelId(pub, pair) { const epub = await util.gunOnceDefined(publicState().user(pub).get(`epub`)); - const secret = await Gun.SEA.secret(epub, pair); + const secret = await Key.secret(epub, pair); return util.getHash(secret + pair.pub); } /** * Calls back with Channels that you have initiated or written to. - * @param {Object} keypair Gun.SEA keypair that the gun instance is authenticated with + * @param {Object} keypair Key keypair that the gun instance is authenticated with * @param callback callback function that is called for each public key you have a channel with */ static async getChannels(callback, listenToChatLinks = true) { const keypair = session.getKey(); - const mySecret = await Gun.SEA.secret(keypair.epub, keypair); + const mySecret = await Key.secret(keypair.epub, keypair); if (listenToChatLinks) { Channel.getMyChatLinks( undefined, undefined, true); } @@ -379,7 +376,7 @@ class Channel { return; } const encryptedChatId = await util.gunOnceDefined(publicState().user().get(`chats`).get(ourSecretChannelId).get(`pub`)); - const chatId = await Gun.SEA.decrypt(encryptedChatId, mySecret); + const chatId = await Key.decrypt(encryptedChatId, mySecret); if (!chatId) { return; } @@ -401,7 +398,7 @@ class Channel { } }; - publicState().user().get(`chats`).map().on(handleChannel); + publicState().user().get(`chats`).map(handleChannel); } getMyGroupSecret() { // group secret could be deterministic: hash(encryptToSelf(uuid + iterator)) @@ -440,18 +437,21 @@ class Channel { } else { theirSecretChannelId = await this.getTheirSecretChannelId(pub); } - publicState().user(pub).get(`chats`).get(theirSecretChannelId).get(`msgs`).map().once((data, key) => {this.messageReceived(callback, data, this.uuid || pub, false, key, pub);}); + // TODO map().once + publicState().user(pub).get(`chats`).get(theirSecretChannelId).get(`msgs`).map((data, key) => {this.messageReceived(callback, data, this.uuid || pub, false, key, pub);}); } if (!this.uuid) { // Subscribe to our messages const ourSecretChannelId = await this.getOurSecretChannelId(pub); - userState().get(`chats`).get(ourSecretChannelId).get(`msgs`).map().once((data, key) => {this.messageReceived(callback, data, pub, true, key, session.getKey().pub);}); + // TODO map().once + userState().get(`chats`).get(ourSecretChannelId).get(`msgs`).map((data, key) => {this.messageReceived(callback, data, pub, true, key, session.getKey().pub);}); } }); if (this.uuid) { // Subscribe to our messages const mySecretUuid = await this.getMySecretUuid(); - userState().get(`chats`).get(mySecretUuid).get(`msgs`).map().once((data, key) => {this.messageReceived(callback, data, this.uuid, true, key, session.getKey().pub);}); + // TODO map().once + userState().get(`chats`).get(mySecretUuid).get(`msgs`).map((data, key) => {this.messageReceived(callback, data, this.uuid, true, key, session.getKey().pub);}); } } @@ -460,7 +460,7 @@ class Channel { return; } const secret = this.uuid ? (await this.getTheirGroupSecret(from)) : (await this.getSecret(channelId)); - const decrypted = await Gun.SEA.decrypt(data, secret); + const decrypted = await Key.decrypt(data, secret); if (typeof decrypted !== `object`) { return; } @@ -545,8 +545,8 @@ class Channel { const ourSecretChannelId = await this.getOurSecretChannelId(pub); if (save) { // Save their public key in encrypted format, so in channel listing we know who we are channeling with - const mySecret = await Gun.SEA.secret(session.getKey().epub, session.getKey()); - publicState().user().get(`chats`).get(ourSecretChannelId).get(`pub`).put(await Gun.SEA.encrypt({pub}, mySecret)); + const mySecret = await Key.secret(session.getKey().epub, session.getKey()); + publicState().user().get(`chats`).get(ourSecretChannelId).get(`pub`).put(await Key.encrypt({pub}, mySecret)); } if (this.uuid) { this.participants[pub] = permissions; @@ -606,14 +606,14 @@ class Channel { } //publicState().user().get('message').set(temp); if (this.uuid) { - const encrypted = await Gun.SEA.encrypt(JSON.stringify(msg), this.getMyGroupSecret()); + const encrypted = await Key.encrypt(JSON.stringify(msg), this.getMyGroupSecret()); const mySecretUuid = await this.getMySecretUuid(); userState().get(`chats`).get(mySecretUuid).get(`msgs`).get(`${msg.time}`).put(encrypted); userState().get(`chats`).get(mySecretUuid).get(`latestMsg`).put(encrypted); } else { const keys = this.getCurrentParticipants(); for (let i = 0;i < keys.length;i++) { - const encrypted = await Gun.SEA.encrypt(JSON.stringify(msg), (await this.getSecret(keys[i]))); + const encrypted = await Key.encrypt(JSON.stringify(msg), (await this.getSecret(keys[i]))); const ourSecretChannelId = await this.getOurSecretChannelId(keys[i]); userState().get(`chats`).get(ourSecretChannelId).get(`msgs`).get(`${msg.time}`).put(encrypted); userState().get(`chats`).get(ourSecretChannelId).get(`latestMsg`).put(encrypted); @@ -629,8 +629,8 @@ class Channel { const mySecretUuid = await this.getMySecretUuid(); userState().get(`chats`).get(mySecretUuid).get('msgs').get('a').put(null); this.put(`participants`, this.participants); // public participants list - const mySecret = await Gun.SEA.secret(session.getKey().epub, session.getKey()); - userState().get(`chats`).get(mySecretUuid).get(`pub`).put(await Gun.SEA.encrypt({ + const mySecret = await Key.secret(session.getKey().epub, session.getKey()); + userState().get(`chats`).get(mySecretUuid).get(`pub`).put(await Key.encrypt({ uuid: this.uuid, myGroupSecret: this.getMyGroupSecret(), participants: this.participants // private participants list @@ -656,7 +656,7 @@ class Channel { async putGroup(key, value) { if (key === `msgs`) { throw new Error(`Sorry, you can't overwrite the msgs field which is used for .send()`); } - const encrypted = await Gun.SEA.encrypt(JSON.stringify(value), this.getMyGroupSecret()); + const encrypted = await Key.encrypt(JSON.stringify(value), this.getMyGroupSecret()); const mySecretUuid = await this.getMySecretUuid(); userState().get(`chats`).get(mySecretUuid).get(key).put(encrypted); } @@ -665,7 +665,7 @@ class Channel { if (key === `msgs`) { throw new Error(`Sorry, you can't overwrite the msgs field which is used for .send()`); } const keys = this.getCurrentParticipants(); for (let i = 0;i < keys.length;i++) { - const encrypted = await Gun.SEA.encrypt(JSON.stringify(value), (await this.getSecret(keys[i]))); + const encrypted = await Key.encrypt(JSON.stringify(value), (await this.getSecret(keys[i]))); const ourSecretChannelId = await this.getOurSecretChannelId(keys[i]); userState().get(`chats`).get(ourSecretChannelId).get(key).put(encrypted); } @@ -711,7 +711,7 @@ class Channel { for (let i = 0;i < keys.length;i++) { const ourSecretChannelId = await this.getOurSecretChannelId(keys[i]); publicState().user().get(`chats`).get(ourSecretChannelId).get(key).on(async (data: any) => { - const decrypted = await Gun.SEA.decrypt(data, (await this.getSecret(keys[i]))); + const decrypted = await Key.decrypt(data, (await this.getSecret(keys[i]))); if (decrypted) { callback(typeof decrypted.v !== `undefined` ? decrypted.v : decrypted, key); } @@ -727,7 +727,7 @@ class Channel { const mySecretUuid = await this.getMySecretUuid(); const mySecret = await this.getMyGroupSecret(); publicState().user().get(`chats`).get(mySecretUuid).get(key).on(async data => { - const decrypted = await Gun.SEA.decrypt(data, mySecret); + const decrypted = await Key.decrypt(data, mySecret); if (decrypted) { callback(typeof decrypted.v !== `undefined` ? decrypted.v : decrypted, key, session.getKey().pub); } @@ -743,7 +743,7 @@ class Channel { const theirSecretChannelId = await this.getTheirSecretChannelId(pub); publicState().user(pub).get(`chats`).get(theirSecretChannelId).get(key).on(async (data: any) => { if (!this.hasWritePermission(pub)) { return; } - const decrypted = await Gun.SEA.decrypt(data, (await this.getSecret(pub))); + const decrypted = await Key.decrypt(data, (await this.getSecret(pub))); if (decrypted) { callback(typeof decrypted.v !== `undefined` ? decrypted.v : decrypted, key, pub); } @@ -775,7 +775,7 @@ class Channel { publicState().user(pub).get(`chats`).get(theirSecretUuid).get(key).on(async (data: any, _a: any, _b: any, e: Event) => { if (subscription) { subscription.event = e; } if (!this.hasWritePermission(pub)) { return; } - const decrypted = await Gun.SEA.decrypt(data, (await this.getTheirGroupSecret(pub))); + const decrypted = await Key.decrypt(data, (await this.getTheirGroupSecret(pub))); if (decrypted) { callback(typeof decrypted.v !== `undefined` ? decrypted.v : decrypted, key, pub); } @@ -830,32 +830,6 @@ class Channel { }); } - /** - * Add a chat button to page - * @param options {label, channelOptions} - */ - static addChatButton(options = {}) { - options = Object.assign({label: 'Chat'}, options); - if (!options.channelOptions) { - throw new Error('addChatButton missing options.channelOptions param'); - } - util.injectCss(); - let channel, box; - const btn = util.createElement('div', 'iris-chat-open-button', document.body); - btn.setAttribute('id', 'iris-chat-open-button'); - btn.innerHTML = ` ${options.label}`; - btn.addEventListener('click', () => { - btn.setAttribute('style', 'display: none'); - if (!channel) { - channel = new Channel(options.channelOptions); - box = channel.getChatBox(); - document.body.appendChild(box); - } else { - box.setAttribute('style', ''); // show - } - }); - } - /** * Get a simple link that points to the channel. * @@ -896,13 +870,13 @@ class Channel { const url = Channel.formatChatLink({urlRoot, inviter: from, channelId: this.uuid, sharedSecret: link.sharedSecret, linkId}); callback && callback({url, id: linkId}); if (subscribe) { - publicState().user(link.sharedKey.pub).get('chatRequests').map().on(async (encPub, requestId, a, e) => { + publicState().user(link.sharedKey.pub).get('chatRequests').map(async (encPub, requestId, a, e) => { if (!encPub || typeof encPub !== 'string' || encPub.length < 10) { return; } chatLinkSubscriptions[linkId] = e; const s = JSON.stringify(encPub); if (channels.indexOf(s) === -1) { channels.push(s); - const pub = await Gun.SEA.decrypt(encPub, link.sharedSecret); + const pub = await Key.decrypt(encPub, link.sharedSecret); this.addParticipant(pub, undefined, undefined, true); } }); @@ -912,19 +886,17 @@ class Channel { } async createChatLink(urlRoot = 'https://iris.to/') { - const sharedKey = await Gun.SEA.pair(); + const sharedKey = await Key.generate(); const sharedKeyString = JSON.stringify(sharedKey); - const sharedSecret = await Gun.SEA.secret(sharedKey.epub, sharedKey); - const encryptedSharedKey = await Gun.SEA.encrypt(sharedKeyString, sharedSecret); - const ownerSecret = await Gun.SEA.secret(session.getKey().epub, session.getKey()); - const ownerEncryptedSharedKey = await Gun.SEA.encrypt(sharedKeyString, ownerSecret); + const sharedSecret = await Key.secret(sharedKey.epub, sharedKey); + const encryptedSharedKey = await Key.encrypt(sharedKeyString, sharedSecret); + const ownerSecret = await Key.secret(session.getKey().epub, session.getKey()); + const ownerEncryptedSharedKey = await Key.encrypt(sharedKeyString, ownerSecret); let linkId = await util.getHash(encryptedSharedKey); linkId = linkId.slice(0, 12); // User has to exist, in order for .get(chatRequests).on() to be ever triggered - await util.gunAsAnotherUser(publicState(), sharedKey, user => { - return user.get('chatRequests').put({a: 1}).then(); - }); + publicState(sharedKey).get('chatRequests').put({a: 1}); this.chatLinks[linkId] = {sharedKey, sharedSecret}; this.put('chatLinks', this.chatLinks); @@ -933,149 +905,6 @@ class Channel { return Channel.formatChatLink({urlRoot, channelId: this.uuid, inviter: session.getKey().pub, sharedSecret, linkId}); } - /** - * Get a channel box element that you can add to your page - */ - getChatBox() { - util.injectCss(); - let minimized = false; - - const chatBox = util.createElement('div', 'iris-chat-box'); - const header = util.createElement('div', 'iris-chat-header', chatBox); - const minimize = util.createElement('span', 'iris-chat-minimize', header); - minimize.innerText = '—'; - minimize.addEventListener('click', e => { - e.stopPropagation(); - chatBox.setAttribute('class', 'iris-chat-box minimized'); - minimized = true; - }); - const headerText = util.createElement('div', 'iris-chat-header-text', header); - const onlineIndicator = util.createElement('span', 'iris-online-indicator', headerText); - onlineIndicator.innerHTML = '●'; - const nameEl = util.createElement('span', undefined, headerText); - const close = util.createElement('span', 'iris-chat-close', header); - close.innerHTML = '×'; - close.addEventListener('click', () => { - chatBox.setAttribute('style', 'display: none'); - const openChatBtn = document.getElementById('iris-chat-open-button'); - if (openChatBtn) { - openChatBtn.setAttribute('style', ''); // show - } - }); - header.addEventListener('click', () => { - if (minimized) { - chatBox.setAttribute('class', 'iris-chat-box'); - minimized = false; - } - }); - - const messages = util.createElement('div', 'iris-chat-messages', chatBox); - - const typingIndicator = util.createElement('div', 'iris-typing-indicator', chatBox); - typingIndicator.innerText = 'typing...'; - this.getTyping(isTyping => { - typingIndicator.setAttribute('class', `iris-typing-indicator${ isTyping ? ' yes' : ''}`); - }); - - const inputWrapper = util.createElement('div', 'iris-chat-input-wrapper', chatBox); - const textArea = util.createElement('textarea', undefined, inputWrapper); - textArea.setAttribute('rows', '1'); - textArea.setAttribute('placeholder', 'Type a message'); - if (util.isMobile) { - const sendBtn = util.createElement('button', undefined, inputWrapper); - sendBtn.innerHTML = ` - - `; - sendBtn.addEventListener('click', () => { - this.send(textArea.value); - textArea.value = ''; - this.setTyping(false); - }); - } - - const participants = this.getCurrentParticipants(); - if (participants.length) { - const pub = participants[0]; - publicState().user(pub).get('profile').get('name').on(name => nameEl.innerText = name); - Channel.getActivity(publicState(), pub, status => { - const cls = `iris-online-indicator${ status.isActive ? ' yes' : ''}`; - onlineIndicator.setAttribute('class', cls); - const undelivered = messages.querySelectorAll('.iris-chat-message:not(.delivered)'); - undelivered.forEach(msg => { - if (msg.getAttribute('data-time') <= status.lastActive) { - const c = msg.getAttribute('class'); - msg.setAttribute('class', `${c } delivered`); - } - }); - }); - } - - this.getTheirMsgsLastSeenTime(time => { - const unseen = messages.querySelectorAll('.iris-seen:not(.yes)'); - unseen.forEach(indicator => { - const msgEl = indicator.parentElement.parentElement.parentElement; - if (msgEl.getAttribute('data-time') <= time) { - const msgClass = msgEl.getAttribute('class'); - if (msgClass.indexOf('delivered') === -1) { - msgEl.setAttribute('class', `${msgClass } delivered`); - } - indicator.setAttribute('class', 'iris-seen yes'); - } - }); - }); - - this.getMessages((msg, info) => { - const msgContent = util.createElement('div', 'iris-msg-content'); - msgContent.innerText = msg.text; - const time = util.createElement('div', 'time', msgContent); - time.innerText = util.formatTime(new Date(msg.time)); - if (info.selfAuthored) { - const cls = this.theirMsgsLastSeenTime >= msg.time ? 'iris-seen yes' : 'iris-seen'; - const seenIndicator = util.createElement('span', cls, time); - seenIndicator.innerHTML = ' '; - } - msgContent.innerHTML = msgContent.innerHTML.replace(/\n/g, '
\n'); - - const msgEl = util.createElement('div', `${info.selfAuthored ? 'our' : 'their'} iris-chat-message`); - msgEl.appendChild(msgContent); - msgEl.setAttribute('data-time', msg.time); - for (let i = messages.children.length; i >= 0; i--) { - if (i === 0) { - messages.insertBefore(msgEl, messages.firstChild); - } else { - const t = messages.children[i - 1].getAttribute('data-time'); - if (t && t < msg.time) { - messages.children[i - 1].insertAdjacentElement('afterend', msgEl); - break; - } - } - } - messages.scrollTop = messages.scrollHeight; - }); - - textArea.addEventListener('keyup', event => { - Channel.setActivity(publicState(), true); // TODO - this.setMyMsgsLastSeenTime(); // TODO - if (event.keyCode === 13) { - event.preventDefault(); - const content = textArea.value; - const caret = util.getCaret(textArea); - if (event.shiftKey) { - textArea.value = `${content.substring(0, caret - 1) }\n${ content.substring(caret, content.length)}`; - } else { - textArea.value = content.substring(0, caret - 1) + content.substring(caret, content.length); - this.send(textArea.value); - textArea.value = ''; - this.setTyping(false); - } - } else { - this.setTyping(!!textArea.value.length); - } - }); - - return chatBox; - } - /** * Set the user's online/active status * @param {string} activity string: set the activity status every 3 seconds, null/false: stop updating @@ -1085,7 +914,7 @@ class Channel { publicState().irisActivityStatus = activity; clearTimeout(publicState().setActivityTimeout); const update = () => { - publicState().user().get(`activity`).put({status: activity, time: new Date(Gun.state()).toISOString()}); + publicState().user().get(`activity`).put({status: activity, time: new Date().toISOString()}); }; update(); function timerUpdate() { @@ -1108,7 +937,7 @@ class Channel { publicState().user(pubKey).get(`activity`).on(activity => { if (!activity || !(activity.time && activity.status)) { return; } clearTimeout(timeout); - const now = new Date(Gun.state()); + const now = new Date(); const activityDate = new Date(activity.time); const isActive = activityDate > new Date(now.getTime() - 10 * 1000) && activityDate < new Date(now.getTime() + 30 * 1000); callback({isActive, lastActive: activity.time, status: activity.status}); @@ -1135,19 +964,17 @@ class Channel { // We create a new Gun user whose private key is shared with the chat link recipients. // Chat link recipients can contact you by writing their public key to the shared key's user space. - const sharedKey = await Gun.SEA.pair(); + const sharedKey = await Key.generate(); const sharedKeyString = JSON.stringify(sharedKey); - const sharedSecret = await Gun.SEA.secret(sharedKey.epub, sharedKey); - const encryptedSharedKey = await Gun.SEA.encrypt(sharedKeyString, sharedSecret); - const ownerSecret = await Gun.SEA.secret(key.epub, key); - const ownerEncryptedSharedKey = await Gun.SEA.encrypt(sharedKeyString, ownerSecret); + const sharedSecret = await Key.secret(sharedKey.epub, sharedKey); + const encryptedSharedKey = await Key.encrypt(sharedKeyString, sharedSecret); + const ownerSecret = await Key.secret(key.epub, key); + const ownerEncryptedSharedKey = await Key.encrypt(sharedKeyString, ownerSecret); let linkId = await util.getHash(encryptedSharedKey); linkId = linkId.slice(0, 12); // User has to exist, in order for .get(chatRequests).on() to be ever triggered - util.gunAsAnotherUser(publicState(), sharedKey, user => { - user.get('chatRequests').put({a: 1}); - }); + publicState(sharedKey).get('chatRequests').put({a: 1}).get('chatRequests').put({a: 1}); user.get('chatLinks').get(linkId).put({encryptedSharedKey, ownerEncryptedSharedKey}); @@ -1160,33 +987,31 @@ class Channel { static async getMyChatLinks(urlRoot = 'https://iris.to/', callback: Function, subscribe = false) { const key = session.getKey(); const user = publicState().user(); - const mySecret = await Gun.SEA.secret(key.epub, key); + const mySecret = await Key.secret(key.epub, key); const chatLinks = []; - user.get('chatLinks').map().on((data, linkId) => { + user.get('chatLinks').map((data, linkId) => { if (!data || chatLinks.indexOf(linkId) !== -1) { return; } const channels = []; user.get('chatLinks').get(linkId).get('ownerEncryptedSharedKey').on(async enc => { if (!enc || chatLinks.indexOf(linkId) !== -1) { return; } chatLinks.push(linkId); - const sharedKey = await Gun.SEA.decrypt(enc, mySecret); - const sharedSecret = await Gun.SEA.secret(sharedKey.epub, sharedKey); + const sharedKey = await Key.decrypt(enc, mySecret); + const sharedSecret = await Key.secret(sharedKey.epub, sharedKey); const url = Channel.formatChatLink({urlRoot, chatWith: key.pub, sharedSecret, linkId}); if (callback) { callback({url, id: linkId}); } if (subscribe) { - publicState().user(sharedKey.pub).get('chatRequests').map().on(async (encPub, requestId) => { + publicState().user(sharedKey.pub).get('chatRequests').map(async (encPub, requestId) => { if (!encPub) { return; } const s = JSON.stringify(encPub); if (channels.indexOf(s) === -1) { channels.push(s); - const pub = await Gun.SEA.decrypt(encPub, sharedSecret); + const pub = await Key.decrypt(encPub, sharedSecret); const channel = new Channel({key, participants: pub}); channel.save(); } - util.gunAsAnotherUser(publicState(), sharedKey, user => { // remove the channel request after reading - user.get('chatRequests').get(requestId).put(null); - }); + publicState(sharedKey).get('chatRequests').get(requestId).put(null); }); } }); @@ -1224,7 +1049,7 @@ class Channel { * */ static async deleteGroup(key, uuid) { - const mySecret = await Gun.SEA.secret(key.epub, key); + const mySecret = await Key.secret(key.epub, key); const mySecretHash = await util.getHash(mySecret); const mySecretUuid = await util.getHash(mySecretHash + uuid); publicState().user().auth(key); diff --git a/src/Key.ts b/src/Key.ts index 843262f..20fdc1a 100644 --- a/src/Key.ts +++ b/src/Key.ts @@ -1,14 +1,12 @@ /*eslint no-useless-escape: "off", camelcase: "off" */ import util from './util'; -import Gun from 'gun'; // eslint-disable-line no-unused-vars -import 'gun/sea'; // eslint-disable-line no-unused-vars let myKey: any; -class Key { - static async getActiveKey(datadir = `.`, keyfile = `iris.key`, fs?: any) { +export default { + async getActiveKey(datadir = `.`, keyfile = `iris.key`, fs?: any) { if (myKey) { return myKey; } @@ -16,11 +14,11 @@ class Key { const privKeyFile = `${datadir}/${keyfile}`; if (fs.existsSync(privKeyFile)) { const f = fs.readFileSync(privKeyFile, `utf8`); - myKey = Key.fromString(f); + myKey = this.fromString(f); } else { - const newKey = await Key.generate(); + const newKey = await this.generate(); myKey = myKey || newKey; // eslint-disable-line require-atomic-updates - fs.writeFileSync(privKeyFile, Key.toString(myKey)); + fs.writeFileSync(privKeyFile, this.toString(myKey)); fs.chmodSync(privKeyFile, 400); } if (!myKey) { @@ -29,68 +27,274 @@ class Key { } else { const str = window.localStorage.getItem(`iris.myKey`); if (str) { - myKey = Key.fromString(str); + myKey = this.fromString(str); } else { - const newKey = await Key.generate(); + const newKey = await this.generate(); myKey = myKey || newKey; // eslint-disable-line require-atomic-updates - window.localStorage.setItem(`iris.myKey`, Key.toString(myKey)); + window.localStorage.setItem(`iris.myKey`, this.toString(myKey)); } if (!myKey) { throw new Error(`loading default key failed - check localStorage iris.myKey`); } } return myKey; - } + }, - static getDefault(datadir = `.`, keyfile = `iris.key`) { - return Key.getActiveKey(datadir, keyfile); - } + getDefault(datadir = `.`, keyfile = `iris.key`) { + return this.getActiveKey(datadir, keyfile); + }, - static async getActivePub(datadir = `.`, keyfile = `iris.key`) { - const key = await Key.getActiveKey(datadir, keyfile); + async getActivePub(datadir = `.`, keyfile = `iris.key`) { + const key = await this.getActiveKey(datadir, keyfile); return key.pub; - } + }, - static setActiveKey(key: any, save = true, datadir = `.`, keyfile = `iris.key`, fs: any) { + setActiveKey(key: any, save = true, datadir = `.`, keyfile = `iris.key`, fs: any) { myKey = key; if (!save) return; if (util.isNode) { const privKeyFile = `${datadir}/${keyfile}`; - fs.writeFileSync(privKeyFile, Key.toString(myKey)); + fs.writeFileSync(privKeyFile, this.toString(myKey)); fs.chmodSync(privKeyFile, 400); } else { - window.localStorage.setItem(`iris.myKey`, Key.toString(myKey)); + window.localStorage.setItem(`iris.myKey`, this.toString(myKey)); } - } + }, - static toString(key: any) { + toString(key: any) { return JSON.stringify(key); - } + }, - static getId(key: any) { + getId(key: any) { if (!(key && key.pub)) { throw new Error(`missing param`); } return key.pub; // hack until GUN supports lookups by keyID //return util.getHash(key.pub); - } + }, - static fromString(str: string) { + fromString(str: string) { return JSON.parse(str); - } + }, - static generate() { - return Gun.SEA.pair(); - } + // copied from Gun.SEA + async generate() { + try { + var ecdhSubtle = window.crypto.subtle; + // First: ECDSA keys for signing/verifying... + var sa = await ecdhSubtle.generateKey({name: 'ECDSA', namedCurve: 'P-256'}, true, ['sign', 'verify']) + .then(async (keys) => { + // privateKey scope doesn't leak out from here! + //const { d: priv } = await shim.subtle.exportKey('jwk', keys.privateKey) + var key: any = {}; + key.priv = (await ecdhSubtle.exportKey('jwk', keys.privateKey)).d; + var pub = await ecdhSubtle.exportKey('jwk', keys.publicKey); + //const pub = Buff.from([ x, y ].join(':')).toString('base64') // old + key.pub = pub.x + '.' + pub.y; // new + // x and y are already base64 + // pub is UTF8 but filename/URL safe (https://www.ietf.org/rfc/rfc3986.txt) + // but split on a non-base64 letter. + return key; + }) - static async sign(msg: any, pair: any) { - const sig = await Gun.SEA.sign(msg, pair); - return `a${sig}`; - } + // To include PGPv4 kind of keyId: + // const pubId = await SEA.keyid(keys.pub) + // Next: ECDH keys for encryption/decryption... - static verify(msg: any, pubKey: any) { - return Gun.SEA.verify(msg.slice(1), pubKey); - } -} + try { + var dh = await ecdhSubtle.generateKey({name: 'ECDH', namedCurve: 'P-256'}, true, ['deriveKey']) + .then(async (keys) => { + // privateKey scope doesn't leak out from here! + var key: any = {}; + key.epriv = (await ecdhSubtle.exportKey('jwk', keys.privateKey)).d; + var pub = await ecdhSubtle.exportKey('jwk', keys.publicKey); + //const epub = Buff.from([ ex, ey ].join(':')).toString('base64') // old + key.epub = pub.x + '.' + pub.y; // new + // ex and ey are already base64 + // epub is UTF8 but filename/URL safe (https://www.ietf.org/rfc/rfc3986.txt) + // but split on a non-base64 letter. + return key; + }) + } catch (e) { + if (e == 'Error: ECDH is not a supported algorithm') { + console.log('Ignoring ECDH...') + } else { + throw e + } + } + dh = dh || {}; + + var r = {pub: sa.pub, priv: sa.priv, /* pubId, */ epub: dh.epub, epriv: dh.epriv} + return r; + } catch (e) { + console.log(e); + throw e; + return; + } + }, + + keyToJwk(key: any): JsonWebKey { + if (typeof key === 'string') { + key = { pub: key }; + } + const jwk: JsonWebKey = { + kty: 'EC', + crv: 'P-256', + x: key.pub.split('.')[0], + y: key.pub.split('.')[1], + ext: true, + }; + jwk.key_ops = key.priv ? ['sign'] : ['verify']; + if (key.priv) { + jwk.d = key.priv + } + return jwk; + }, + + async sign(data: any, pair: any, cb?: Function, opt: any = {}) { + if(undefined === data){ throw '`undefined` not allowed.' } + const text = typeof data === 'string' ? data : JSON.stringify(data); // Gun.SEA doesn't preserve data type: "0" -> 0. Should we change this? + var jwk = this.keyToJwk(pair); + var hash = await util.getHash(text, 'buffer') as Buffer; + var sig = await window.crypto.subtle.importKey('jwk', jwk, {name: 'ECDSA', namedCurve: 'P-256'}, false, ['sign']) + .then((key) => + window.crypto.subtle.sign({name: 'ECDSA', hash: {name: 'SHA-256'}}, key, hash) + ) // privateKey scope doesn't leak out from here! + var r: any = {m: text, s: Buffer.from(sig).toString(opt.encode || 'base64')} + if(!opt.raw){ r = 'aSEA' + JSON.stringify(r) } // "aSEA" was a dumb fix for an earlier bug in Gun.SEA + + if(cb){ try{ cb(r) }catch(e){console.log(e)} } + return r; + }, + + async verify(data: any, pair: any, cb?: Function, opt: any = {}) { + try { + if (typeof data === 'string') { + if (data.slice(0, 4) === 'aSEA') { + data = data.slice(4) + } + try { + data = JSON.parse(data); + } catch (e) { + // not JSON + } + } + var pub = pair.pub || pair; + var jwk = this.keyToJwk(pub); + var key = await crypto.subtle.importKey('jwk', jwk, {name: 'ECDSA', namedCurve: 'P-256'}, false, ['verify']); -export default Key; + let text = data.m; + try { + text = JSON.parse(text); + } catch (e) { + // ignore + } + + let hash = await util.getHash(text, 'buffer') as Buffer; + var buf, sig, isValid; + buf = Buffer.from(data.s, opt.encode || 'base64'); + sig = new Uint8Array(buf); + isValid = await crypto.subtle.verify({name: 'ECDSA', hash: {name: 'SHA-256'}}, key, sig, hash); + var r = isValid? JSON.parse(text) : undefined; + if (r === undefined) { + //console.log('invalid', data, pair, hash); + } + + if(cb){ try{ cb(r) }catch(e){console.log(e)} } + return r; + } catch (e) { + console.log(e); + return undefined; + } + }, + + async secret(key: any, pair: any) { + var keysToEcdhJwk = (pub: any, d?: any): any => { // d === priv + //var [ x, y ] = shim.Buffer.from(pub, 'base64').toString('utf8').split(':') // old + var [ x, y ] = pub.split('.') // new + const jwk: JsonWebKey = Object.assign( + d ? { d } : {}, + { x: x, y: y, kty: 'EC', crv: 'P-256', ext: true } + ); + return jwk; + } + + var pub = key.epub || key; + var epub = pair.epub; + var epriv = pair.epriv; + var pubJwk = keysToEcdhJwk(pub); + var props = Object.assign({ + public: await crypto.subtle.importKey('jwk', pubJwk, {name: 'ECDH', namedCurve: 'P-256'}, true, []) + },{name: 'ECDH', namedCurve: 'P-256'}); + var privJwk = keysToEcdhJwk(epub, epriv); + return crypto.subtle.importKey('jwk', privJwk, {name: 'ECDH', namedCurve: 'P-256'}, false, ['deriveBits']) + .then(async (privKey) => { + var derivedBits = await crypto.subtle.deriveBits(props, privKey, 256); + var rawBits = new Uint8Array(derivedBits); + var derivedKey = await crypto.subtle.importKey('raw', rawBits,{ name: 'AES-GCM', length: 256 }, true, [ 'encrypt', 'decrypt' ]); + return crypto.subtle.exportKey('jwk', derivedKey).then(({ k }) => k); + }); + }, + + async aeskey(key: any, salt?: Buffer) { + const combo = key + (salt || this.random(8)).toString('utf8'); // new + let hash: any = await crypto.subtle.digest({name: 'SHA-256'}, new TextEncoder().encode(combo)); + hash = Buffer.from(hash, 'binary'); + + const keyB64 = hash.toString('base64'); + const k = keyB64.replace(/\+/g, '-').replace(/\//g, '_').replace(/\=/g, ''); + + const jwkKey = { kty: 'oct', k: k, ext: false, alg: 'A256GCM' }; + return await crypto.subtle.importKey('jwk', jwkKey, {name:'AES-GCM'}, false, ['encrypt', 'decrypt']) + }, + + random(len: number) { + return Buffer.from(crypto.getRandomValues(new Uint8Array(len))); + }, + + async encrypt(data: any, pair: any, cb?: Function, opt: any = {}) { + var key = pair.epriv || pair; + if(undefined === data){ throw '`undefined` not allowed.' } + var msg = (typeof data == 'string')? data : JSON.stringify(data); // Gun.SEA doesn't preserve data type: "0" -> 0. Should we change this? + var rand = {s: this.random(9), iv: this.random(15)}; // consider making this 9 and 15 or 18 or 12 to reduce == padding. + var ct = await this.aeskey(key, rand.s).then((aes) => crypto.subtle.encrypt({ // Keeping the AES key scope as private as possible... + name: opt.name || 'AES-GCM', iv: new Uint8Array(rand.iv) + }, aes, new TextEncoder().encode(msg))); + var r: any = { + // @ts-ignore + ct: Buffer.from(ct, 'binary').toString(opt.encode || 'base64'), + iv: rand.iv.toString(opt.encode || 'base64'), + s: rand.s.toString(opt.encode || 'base64') + } + if(!opt.raw){ r = 'SEA' + JSON.stringify(r) } + + if(cb){ try{ cb(r) }catch(e){console.log(e)} } + return r; + }, + + async decrypt(data: any, pair: any, cb?: Function, opt: any = {}) { + var key = pair.epriv || pair; + let json; + try { data = JSON.parse(data); } catch (e) {} + if (data.indexOf('SEA{') === 0) { + json = JSON.parse(data.slice(3)); + } else { + json = JSON.parse(data); + } + if (!json.ct || !json.iv || !json.s) { + throw 'Invalid ciphertext ' + json; + } + var buf: Buffer, bufiv: Buffer, bufct: Buffer; + buf = Buffer.from(json.s, opt.encode || 'base64'); + bufiv = Buffer.from(json.iv, opt.encode || 'base64'); + bufct = Buffer.from(json.ct, opt.encode || 'base64'); + var ct = await this.aeskey(key, buf).then((aes) => crypto.subtle.decrypt({ // Keeping aesKey scope as private as possible... + name: opt.name || 'AES-GCM', iv: new Uint8Array(bufiv), tagLength: 128 + }, aes, new Uint8Array(bufct))); + const text = new TextDecoder('utf8').decode(ct); + var r = text; + try { r = JSON.parse(text); } catch (_e) {} + if(cb){ try{ cb(r) }catch(e){console.log(e)} } + return r; + } +} \ No newline at end of file diff --git a/src/Node.ts b/src/Node.ts deleted file mode 100644 index 59fc1fc..0000000 --- a/src/Node.ts +++ /dev/null @@ -1,191 +0,0 @@ -// @ts-nocheck - -import localForage from 'localforage'; -import _ from './lodash'; - -type MyEventListener = { - off: Function -}; - -// Localforage returns null if an item is not found, so we represent null with this uuid instead. -// not foolproof, but good enough for now. -const LOCALFORAGE_NULL = "c2fc1ad0-f76f-11ec-b939-0242ac120002"; -const notInLocalForage = new Set(); - -localForage.config({ - driver: [localForage.LOCALSTORAGE, localForage.INDEXEDDB, localForage.WEBSQL] -}) - -/** - Our very own implementation of the Gun API - */ -export default class Node { - id: string; - parent: Node | null; - children = new Map(); - on_subscriptions = new Map(); - map_subscriptions = new Map(); - value: any = undefined; - counter = 0; - loaded = false; - - /** */ - constructor(id: string = '', parent: Node|null = null) { - this.id = id; - this.parent = parent; - } - - saveLocalForage = _.throttle(async () => { - if (!this.loaded) { - await this.loadLocalForage(); - } - if (this.children.size) { - const children = Array.from(this.children.keys()); - localForage.setItem(this.id, children); - } else if (this.value === undefined) { - localForage.removeItem(this.id); - } else { - localForage.setItem(this.id, this.value === null ? LOCALFORAGE_NULL : this.value); - } - }, 500); - - loadLocalForage = _.throttle(async () => { - if (notInLocalForage.has(this.id)) { - return undefined; - } - // try to get the value from localforage - let result = await localForage.getItem(this.id); - // getItem returns null if not found - if (result === null) { - result = undefined; - notInLocalForage.add(this.id); - } else if (result === LOCALFORAGE_NULL) { - result = null; - } else if (Array.isArray(result)) { - // result is a list of children - const newResult = {}; - await Promise.all(result.map(async key => { - newResult[key] = await this.get(key).once(); - })); - result = newResult; - } else { - // result is a value - this.value = result; - } - this.loaded = true; - return result; - }, 500); - - doCallbacks = _.throttle(() => { - for (const [id, callback] of this.on_subscriptions) { - const event = { off: () => this.on_subscriptions.delete(id) }; - this.once(callback, event, false); - } - if (this.parent) { - for (const [id, callback] of this.parent.on_subscriptions) { - const event = { off: () => this.parent.on_subscriptions.delete(id) }; - this.parent.once(callback, event, false); - } - for (const [id, callback] of this.parent.map_subscriptions) { - const event = { off: () => this.parent.map_subscriptions.delete(id) }; - this.once(callback, event, false); - } - } - }, 40); - - /** - * - * @param key - * @returns {Node} - * @example node.get('users').get('alice').put({name: 'Alice'}) - */ - get(key) { - const existing = this.children.get(key); - if (existing) { - return existing; - } - const new_node = new Node(`${this.id}/${key}`, this); - this.children.set(key, new_node); - this.saveLocalForage(); - return new_node; - } - - /** - * Set a value to the node. If the value is an object, it will be converted to child nodes. - * @param value - * @example node.get('users').get('alice').put({name: 'Alice'}) - */ - put(value) { - if (Array.isArray(value)) { - throw new Error('Sorry, we don\'t deal with arrays'); - } - if (typeof value === 'object' && value !== null) { - this.value = undefined; - for (const key in value) { - this.get(key).put(value[key]); - } - _.defer(() => this.doCallbacks(), 100); - return; - } - this.children = new Map(); - this.value = value; - this.doCallbacks(); - this.saveLocalForage(); - } - - // protip: the code would be a lot cleaner if you separated the Node API from storage adapters. - /** - * Return a value without subscribing to it - * @param callback - * @param event - * @param returnIfUndefined - * @returns {Promise<*>} - */ - async once(callback?: Function, event?: MyEventListener, returnIfUndefined = true): Promise { - let result: any; - if (this.children.size) { - // return an object containing all children - result = {}; - await Promise.all(Array.from(this.children.keys()).map(async key => { - result[key] = await this.get(key).once(undefined, event); - })); - } else if (this.value !== undefined) { - result = this.value; - } else { - result = await this.loadLocalForage(); - } - if (result !== undefined || returnIfUndefined) { - callback && callback(result, this.id.slice(this.id.lastIndexOf('/') + 1), null, event); - return result; - } - } - - /** - * Subscribe to a value - * @param callback - */ - on(callback: Function): void { - const id = this.counter++; - this.on_subscriptions.set(id, callback); - const event = { off: () => this.on_subscriptions.delete(id) }; - this.once(callback, event, false); - } - - /** - * Subscribe to the children of a node. Callback is called separately for each child. - * @param callback - * @returns {Promise} - */ - async map(callback: Function) { - const id = this.counter++; - this.map_subscriptions.set(id, callback); - const event = { off: () => this.map_subscriptions.delete(id) }; - if (!this.loaded) { - // ensure that the list of children is loaded - await this.loadLocalForage(); - } - for (const child of this.children.values()) { - child.once(callback, event, false); - } - } -} \ No newline at end of file diff --git a/src/SignedMessage.ts b/src/SignedMessage.ts index fab7e6a..fb29249 100644 --- a/src/SignedMessage.ts +++ b/src/SignedMessage.ts @@ -6,7 +6,7 @@ import util from './util'; import Attribute from './Attribute'; import Key from './Key'; -const errorMsg = `Invalid message:`; +const errorMsg = `Invalid message:`; class ValidationError extends Error {} @@ -26,23 +26,6 @@ class ValidationError extends Error {} * Constructor: creates a message from the param obj.signedData that must contain at least the mandatory fields: author, type and time. * @param obj * -* @example -* https://github.com/irislib/iris-lib/blob/master/__tests__/SignedMessage.js -* -* Verification message: -* { -* signedData: { -* author: {name:'Alice', key:'ABCD1234'}, -* recipient: { -* name: 'Bob', -* email: ['bob@example.com', 'bob.saget@example.com'], -* bitcoin: '1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa' -* }, -* type: 'verification' -* }, -* signer: 'ABCD1234', -* signature: '1234ABCD' -* } */ class SignedMessage { signedData: any; @@ -62,60 +45,6 @@ class SignedMessage { this._validate(); } - static _getArray(authorOrRecipient) { - const arr = []; - const keys = Object.keys(authorOrRecipient); - for (let i = 0;i < keys.length;i++) { - const type = keys[i]; - const value = authorOrRecipient[keys[i]]; - if (typeof value === `string`) { - arr.push(new Attribute(type, value)); - } else { // array - for (let j = 0;j < value.length;j++) { - const elementValue = value[j]; - arr.push(new Attribute(type, elementValue)); - } - } - } - return arr; - } - - static _getIterable(authorOrRecipient) { - return { - *[Symbol.iterator]() { - const keys = Object.keys(authorOrRecipient); - for (let i = 0;i < keys.length;i++) { - const type = keys[i]; - const value = authorOrRecipient[keys[i]]; - if (typeof value === `string`) { - yield new Attribute(type, value); - } else { // array - for (let j = 0;j < value.length;j++) { - const elementValue = value[j]; - yield new Attribute(type, elementValue); - } - } - } - } - }; - } - - getAuthorIterable() { - return SignedMessage._getIterable(this.signedData.author); - } - - getRecipientIterable() { - return SignedMessage._getIterable(this.signedData.recipient); - } - - getAuthorArray() { - return SignedMessage._getArray(this.signedData.author); - } - - getRecipientArray() { - return this.signedData.recipient ? SignedMessage._getArray(this.signedData.recipient) : []; - } - getSignerKeyID() { return this.pubKey; // hack until gun supports keyID lookups //return util.getHash(this.pubKey); @@ -177,36 +106,11 @@ class SignedMessage { if (!Date.parse(d.time || d.timestamp)) {throw new ValidationError(`${errorMsg} Invalid time field`);} - if (d.type === `rating`) { - if (isNaN(d.rating)) {throw new ValidationError(`${errorMsg} Invalid rating`);} - if (isNaN(d.maxRating)) {throw new ValidationError(`${errorMsg} Invalid maxRating`);} - if (isNaN(d.minRating)) {throw new ValidationError(`${errorMsg} Invalid minRating`);} - if (d.rating > d.maxRating) {throw new ValidationError(`${errorMsg} Rating is above maxRating`);} - if (d.rating < d.minRating) {throw new ValidationError(`${errorMsg} Rating is below minRating`);} - if (typeof d.context !== `string` || !d.context.length) {throw new ValidationError(`${errorMsg} Rating messages must have a context field`);} - } - - if (d.type === `verification` || d.type === `unverification`) { - if (d.recipient.length < 2) {throw new ValidationError(`${errorMsg} At least 2 recipient attributes are needed for a connection / disconnection. Got: ${d.recipient}`);} - } - return true; } - isPositive() { - return this.signedData.type === `rating` && this.signedData.rating > (this.signedData.maxRating + this.signedData.minRating) / 2; - } - - isNegative() { - return this.signedData.type === `rating` && this.signedData.rating < (this.signedData.maxRating + this.signedData.minRating) / 2; - } - - isNeutral() { - return this.signedData.type === `rating` && this.signedData.rating === (this.signedData.maxRating + this.signedData.minRating) / 2; - } - /** - * @param {Object} key Gun.SEA keypair to sign the message with + * @param {Object} key keypair to sign the message with */ async sign(key) { this.sig = await Key.sign(this.signedData, key); @@ -233,19 +137,6 @@ class SignedMessage { return m; } - static createVerification(signedData, signingKey) { - signedData.type = `verification`; - return SignedMessage.create(signedData, signingKey); - } - - static createRating(signedData, signingKey) { - signedData.type = `rating`; - signedData.context = signedData.context || `iris`; - signedData.maxRating = signedData.maxRating || 10; - signedData.minRating = signedData.minRating || -10; - return SignedMessage.create(signedData, signingKey); - } - getAuthor(index) { for (const a of this.getAuthorIterable()) { if (a.isUniqueType()) { @@ -337,14 +228,6 @@ class SignedMessage { static async fromString(s) { return SignedMessage.fromSig(JSON.parse(s)); } - - static async setReaction(gun, msg, reaction) { - const hash = await msg.getHash(); - gun.get(`reactions`).get(hash).put(reaction); - gun.get(`reactions`).get(hash).put(reaction); - gun.get(`messagesByHash`).get(hash).get(`reactions`).get(this.rootContact.value).put(reaction); - gun.get(`messagesByHash`).get(hash).get(`reactions`).get(this.rootContact.value).put(reaction); - } } export default SignedMessage; diff --git a/src/db/Actor.ts b/src/db/Actor.ts new file mode 100644 index 0000000..eb226f4 --- /dev/null +++ b/src/db/Actor.ts @@ -0,0 +1,25 @@ +import {Message} from './Message'; + +export function generateUuid() { + return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { + const r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8); + return v.toString(16); + }); +} + +export class Actor { + id: string; + + handle(_message: Message) { + throw new Error('not implemented'); + } + + // so we can support a similar api as Channels + postMessage(message: Message) { + this.handle(message); + } + + constructor(id = generateUuid()) { + this.id = id; + } +} \ No newline at end of file diff --git a/src/db/Message.ts b/src/db/Message.ts new file mode 100644 index 0000000..ab00381 --- /dev/null +++ b/src/db/Message.ts @@ -0,0 +1,260 @@ +import {Actor} from './Actor'; +import {Children} from "./Node"; +import Key from "../Key"; + +export class Message { + // When Messages are sent over BroadcastChannel, class name is lost. + static fromObject(obj: any): Message { + if (obj.type === 'get') { + return Get.fromObject(obj); + } else if (obj.type === 'put') { + return Put.fromObject(obj); + } else { + throw new Error('not implemented'); + } + } + + static async deserialize(str: string, from: Actor): Promise { + const obj = JSON.parse(str); + if (obj.get) { + return Get.deserialize(obj, str, from); + } else if (obj.put) { + return Put.deserialize(obj, str, from); + } else if (obj.dam && obj.dam === "hi") { + return Hi.deserialize(obj); + } else { + throw new Error('unknown message type'); + } + } + + serialize(): string { + throw new Error('not implemented'); + } +} + +function generateMsgId(): string { + return Math.random().toString(36).slice(2, 10); +} + +export class Get implements Message { + type: string = 'get'; + id: string; + nodeId: string; + from: Actor; + recipients?: string[]; + childKey?: string; + jsonStr?: string; + checksum?: string; + + serialize(): string { + if (this.jsonStr) { + return this.jsonStr; + } + + // TODO remove "global/", replace /^user\// with ~ + let nodeId = this.nodeId.replace(/^global\//, '').replace(/^user\//, '~'); + const obj: any = { + "#": this.id, + get: { + "#": nodeId, + ".": this.childKey + }, + }; + + if (this.childKey) { + obj.get['.'] = this.childKey; + } + this.jsonStr = JSON.stringify(obj); + return this.jsonStr; + } + + static async deserialize(obj: any, jsonStr: string, from: Actor): Promise { + const id = obj['#']; + let nodeId = obj.get['#']; // TODO add "global/" prefix, replace /^~/ with "user/" + if (nodeId.startsWith('~')) { + nodeId = 'user/' + nodeId.slice(1); + } + nodeId = 'global/' + nodeId; + const childKey = obj.get['.']; + return new Get(id, nodeId, from, undefined, childKey, jsonStr); + } + + static fromObject(obj: any): Get { + return new Get(obj.id, obj.nodeId, obj.from, obj.recipients, obj.childKey, obj.jsonStr, obj.checksum); + } + + static new(nodeId: string, from: Actor, recipients?: string[], childKey?: string, jsonStr?: string, checksum?: string): Get { + const id = generateMsgId(); + return new Get(id, nodeId, from, recipients, childKey, jsonStr, checksum); + } + + constructor(id: string, nodeId: string, from: Actor, recipients?: string[], childKey?: string, jsonStr?: string, checksum?: string) { + this.id = id; + this.from = from; + this.nodeId = nodeId; + this.recipients = recipients; + this.childKey = childKey; + this.jsonStr = jsonStr; + this.checksum = checksum; + } +} + +export type UpdatedNodes = { + [key: string]: Children; +}; + +export class Put implements Message { + type: string = 'put'; + id: string; + from: Actor; + updatedNodes: UpdatedNodes; + inResponseTo?: string; + recipients?: string[]; + jsonStr?: string; + checksum?: string; + + serialize(): string { + const obj = { + "#" : this.id, + "put": {} as any + }; + + // iterate over this.updatedNodes + for (const [nodeId, children] of Object.entries(this.updatedNodes)) { + let myNodeId = nodeId.replace(/^global\//, '').replace(/^user\//, '~'); + const node: any = obj.put[myNodeId] = {}; + for (const [childKey, childValue] of Object.entries(children)) { + if (!childValue) { + continue; + } + const data = childValue; + node[childKey] = data.value; + node["_"] = node["_"] || {}; + node["_"][">"] = node["_"][">"] || {}; + node["_"][">"][childKey] = data.updatedAt; + } + } + return JSON.stringify(obj); + } + + static async deserialize(obj: any, jsonStr: string, from: Actor): Promise { + const id = obj['#']; + const updatedNodes: UpdatedNodes = {}; + type SerializedChildren = { + [key: string]: any; + } + for (const [nodeId, c] of Object.entries(obj.put)) { + const children = c as SerializedChildren; + const node: any = {}; + const isUserSpace = nodeId.startsWith('~'); + for (const [childKey, childValue] of Object.entries(children)) { + if (childKey === '_') { + continue; + } + if (isUserSpace) { + const user = nodeId.split('/')[0].slice(1); + const signatureObj = JSON.parse(childValue); + const timestamp = children['_']['>'][childKey]; + const value = signatureObj[':']; + const signedObj = { + "#": nodeId, + ".": childKey, + ":": value, + ">": timestamp + }; + const signature = signatureObj['~']; + const signedStr = JSON.stringify(signedObj); + if (await Key.verify({s: signature, m: signedStr}, user) === undefined) { + throw new Error(`invalid signature in ${nodeId} of ${signedStr}`); + } + } + // TODO test hash space validity + const updatedAt = children['_']['>'][childKey]; + node[childKey] = { + value: childValue, + updatedAt, + }; + } + const myNodeId = 'global/' + nodeId.replace(/^~/, 'user/'); + updatedNodes[myNodeId] = node; + } + return new Put(id, updatedNodes, from, undefined, undefined, jsonStr); + } + + static fromObject(obj: any): Put { + return new Put(obj.id, obj.updatedNodes, obj.from, obj.inResponseTo, obj.recipients, obj.jsonStr, obj.checksum); + } + + static new(updatedNodes: UpdatedNodes, from: Actor, inResponseTo?: string, recipients?: string[], jsonStr?: string, checksum?: string): Put { + const id = generateMsgId(); + return new Put(id, updatedNodes, from, inResponseTo, recipients, jsonStr, checksum); + } + + static newFromKv(key: string, children: Children, from:Actor) { + const updatedNodes: UpdatedNodes = {}; + updatedNodes[key] = children; + return Put.new(updatedNodes, from); + } + + constructor(id: string, updatedNodes: UpdatedNodes, from: Actor, inResponseTo?: string, recipients?: string[], jsonStr?: string, checksum?: string) { + this.id = id; + this.from = from; + this.updatedNodes = updatedNodes; + this.inResponseTo = inResponseTo; + this.recipients = recipients; + this.jsonStr = jsonStr; + this.checksum = checksum; + } +} + +export class Hi implements Message { + type: string = 'hi'; + peerId: string; + jsonStr?: string; + + //{"#":"aHHO9Srurq9nh6Q9","dam":"hi"} + + + serialize(): string { + if (this.jsonStr) { + return this.jsonStr; + } + + const obj: any = { + dam: "hi", + "#": this.peerId, + }; + + this.jsonStr = JSON.stringify(obj); + return this.jsonStr; + } + + static deserialize(obj: any): Hi { + const peerId = obj['#']; + return new Hi(peerId); + } + + constructor(peerId: string, jsonStr?: string) { + this.peerId = peerId; + this.jsonStr = jsonStr; + } +} + +const parseGet = (get: any, from: Actor): Get => { + return new Get(get.id, get.nodeId, from, get.recipients, get.childKey, get.jsonStr, get.checksum); +} + +const parsePut = (put: any, from: Actor): Put => { + return new Put(put.id, put.updatedNodes, from, put.inResponseTo, put.recipients, put.jsonStr, put.checksum); +} + +export function messageFromJsonString(jsonStr: string, from: Actor): Message { + const obj = JSON.parse(jsonStr); + if (obj.get) { + return parseGet(obj.get, from); + } else if (obj.put) { + return parsePut(obj.put, from); + } else { + throw new Error('Unknown message type'); + } +} \ No newline at end of file diff --git a/src/db/Node.ts b/src/db/Node.ts new file mode 100644 index 0000000..e387ad0 --- /dev/null +++ b/src/db/Node.ts @@ -0,0 +1,212 @@ +import _ from '../lodash'; +import {Actor} from './Actor'; +import {Message, Put, Get, UpdatedNodes} from './Message'; + +// @ts-ignore +import Router from './Router'; +import Key from "../Key"; +//import * as Comlink from "comlink"; + +export type NodeData = { + value: any; + updatedAt: number; +}; + +export type Children = { + [key: string]: NodeData; +} + +export type Config = { + peerId?: string; + allowPublicSpace: boolean; + myPublicKey?: string; + enableStats: boolean; + webSocketPeers?: string[]; + localOnly: boolean; +} + +export const DEFAULT_CONFIG: Config = { + allowPublicSpace: false, + enableStats: true, + localOnly: true +} + +// TODO move memory storage to its own adapter? it would make things simpler here +export default class Node extends Actor { + root: Node; + parent?: Node; + children = new Map(); + once_subscriptions = new Map(); + on_subscriptions = new Map(); + map_subscriptions = new Map(); + counter = 0; + config: Config; + currentUser: any; + router: Router; + + constructor(id = '', config?: Config, parent?: Node) { + super(id); + this.parent = parent; + this.config = config || (parent && parent.config) || DEFAULT_CONFIG; + if (parent) { + this.root = parent.root; + this.router = parent.router; + } else { + this.root = this; + //@ts-ignore + this.router = new Router({dbName: this.id + '-idb', peers: this.config.webSocketPeers}); + //console.log('idbWorker', idbWorker); + //const router = Comlink.wrap(routerWorker); + } + } + + getCurrentUser(): any { + return this.root.currentUser; + } + + setCurrentUser(key: any) { + this.root.currentUser = key; + } + + handle(message: Message): void { + if (message instanceof Put) { + for (const [key, children] of Object.entries(message.updatedNodes)) { + if (!children || typeof children !== 'object') { + continue; + } + if (key === this.id) { + for (const [childKey, childData] of Object.entries(children)) { + this.get(childKey).doCallbacks(childData, childKey); // TODO children should have proper NodeData + } + } + } + this.parent && this.parent.handle(message); + } + }; + + get(key: string): Node { + const existing = this.children.get(key); + if (existing) { + return existing; + } + const newNode = new Node(`${this.id}/${key}`, this.config, this); + this.children.set(key, newNode); + return newNode; + } + + user(pub: string | undefined): Node { + pub = pub || (this.root.currentUser && this.root.currentUser.pub); + if (!pub) { + throw new Error("no public key!"); + } + return this.get('user').get(pub as string); + } + + auth(key: any) { + // TODO get public key from key + this.root.setCurrentUser(key); + return; + } + + doCallbacks = (data: NodeData, key: string) => { + if (typeof data.value === 'string' && data.value.startsWith('{":":')) { + data.value = JSON.parse(data.value)[':']; + } + for (const [id, callback] of this.on_subscriptions) { + const event = { off: () => this.on_subscriptions.delete(id) }; + callback(data.value, key, null, event); + } + for (const [id, callback] of this.once_subscriptions) { + callback(data.value, key, null, {}); + this.once_subscriptions.delete(id); + } + if (this.parent) { + const parent = this.parent; + for (const [id, callback] of parent.map_subscriptions) { + const event = { off: () => parent.map_subscriptions.delete(id) }; + callback(data.value, key, null, event); + } + } + }; + + async put(value: any): Promise { + const updatedAt = Date.now(); + if (Array.isArray(value)) { + throw new Error('put() does not support arrays'); + } + if (typeof value === 'function') { + throw new Error('put() does not support functions'); + } + if (typeof value === 'object' && value !== null) { + // TODO: update the whole path of parent nodes + for (const key in value) { + this.get(key).put(value[key]); + } + return; + } + value = await this.signIfNeeded(value); + this.children = new Map(); + const updatedNodes: UpdatedNodes = {}; + await this.addParentNodes(updatedNodes, value, updatedAt); + const put = Put.new(updatedNodes, this); + this.handle(put); + this.router.postMessage(put); + } + + private async signIfNeeded(value: any) { + if (this.id.indexOf('global/user/') === 0) { + if (!this.getCurrentUser()) { + throw new Error('not authenticated'); + } + if (this.id.indexOf('global/user/' + this.getCurrentUser().pub) !== 0) { + throw new Error('not allowed ' + this.id); + } + const signed = await Key.sign(value, this.getCurrentUser(), undefined, {raw: true}); + value = JSON.stringify({':': signed.m, '~': signed.s}); + console.log('saving signed value', value); + } + return value; + } + + private async addParentNodes(updatedNodes: UpdatedNodes, value: any, updatedAt: number) { + // TODO sign + if (this.parent) { + const childName = this.id.split('/').pop() as string; + const parentId = this.parent.id; + updatedNodes[parentId] = updatedNodes[parentId] || {}; + updatedNodes[parentId][childName] = {value, updatedAt}; + await this.parent.addParentNodes(updatedNodes, {'#': this.parent.id }, updatedAt); + } + } + + private request() { + if (this.parent) { // TODO router should decide whether to re-request from peers + const childKey = this.id.split('/').pop(); + this.router.postMessage(Get.new(this.parent.id, this, undefined, childKey)); + } + } + + async once(callback?: Function | null): Promise { + const id = this.counter++; + callback && this.once_subscriptions.set(id, callback); + this.request(); + } + + on(callback: Function): void { + const id = this.counter++; + this.on_subscriptions.set(id, callback); + //const event = { off: () => this.on_subscriptions.delete(id) }; + this.request(); + } + + map(callback: Function): void { + const id = this.counter++; + this.map_subscriptions.set(id, callback); + // TODO: child key should probably still be included. But how to handle link responses? + this.router.postMessage(Get.new(this.id, this, undefined)); + } + + opt(opts: any) { + this.router.opt(opts); + } +} \ No newline at end of file diff --git a/src/db/Router.ts b/src/db/Router.ts new file mode 100644 index 0000000..2a391ff --- /dev/null +++ b/src/db/Router.ts @@ -0,0 +1,138 @@ +import {Actor} from "./Actor"; +import Memory from "./adapters/Memory"; +import IndexedDB from "./adapters/IndexedDB"; +import Websocket from "./adapters/Websocket"; +import {Put, Get, Message} from "./Message"; +// import * as Comlink from "comlink"; + +/* +class SeenGetMessage { + constructor(id, from, lastReplyChecksum) { + this.id = id; + this.from = from; + this.lastReplyChecksum = lastReplyChecksum; + } +} +*/ + +export default class Router extends Actor { + storageAdapters: Set = new Set(); + networkAdapters: Set = new Set(); + serverPeers: Set = new Set(); + seenMessages: Set = new Set(); + seenGetMessages: Map = new Map(); + subscribersByTopic: Map> = new Map(); + msgCounter = 0; + peerId: string; + + constructor(config: any = {}) { + super('router'); + // default random id + this.peerId = config.peerId || Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15); + this.storageAdapters.add(new Memory(config)); + this.storageAdapters.add(new IndexedDB(config)); + console.log('config', config); + if (config.peers) { + for (const peer of config.peers) { + if (peer) { + this.serverPeers.add(new Websocket(peer, this)); + } + } + } + } + + handle(message: Message) { + //console.log('router received', message); + if (message instanceof Put || message instanceof Get) { + if (this.seenMessages.has(message.id)) { + return; + } + this.seenMessages.add(message.id); + if (message instanceof Put) { + this.handlePut(message); + } else if (message instanceof Get) { + this.handleGet(message); + } + } + } + + handlePut(put: Put) { + const sendTo: Set = new Set(); + Object.keys(put.updatedNodes).forEach(path => { + // topic is first 3 nodes of path + const topic = path.split('/').slice(0, 3).join('/'); + const subscribers = this.subscribersByTopic.get(topic); + // send to storage adapters + //console.log('put subscribers', subscribers); + for (const storageAdapter of this.storageAdapters) { + if (put.from !== storageAdapter) { + sendTo.add(storageAdapter); + } + } + + for (const peer of this.serverPeers) { + if (put.from !== peer) { + sendTo.add(peer); + } + } + + if (subscribers) { + for (const subscriber of subscribers) { + if (subscriber !== put.from) { + sendTo.add(subscriber); + } + } + } + }); + for (const actor of sendTo) { + actor.postMessage(put); + } + } + + opt(opts: any) { + if (opts.peers) { + for (const peer of opts.peers) { + if (peer) { + this.serverPeers.add(new Websocket(peer, this)); + } + } + } + } + + handleGet(get: Get) { + const topic = get.nodeId.split('/')[1]; + const sendTo: Set = new Set(); + for (const storageAdapter of this.storageAdapters) { + if (get.from !== storageAdapter) { + sendTo.add(storageAdapter); + } + } + for (const peer of this.serverPeers) { + if (get.from !== peer) { + sendTo.add(peer); + } + } + if (!this.subscribersByTopic.has(topic)) { + this.subscribersByTopic.set(topic, new Set()); + } + const subscribers = this.subscribersByTopic.get(topic); + if (subscribers) { + if (!subscribers.has(get.from)) { + subscribers.add(get.from); + } + } + for (const actor of sendTo) { + actor.postMessage(get); + } + } +} + +/* +let actor: Actor; +self.onconnect = () => { + console.log('router shared worker connected'); + actor = actor || new Router(); +} +*/ + +// self.onconnect = (e) => Comlink.expose(actor, e.ports[0]); \ No newline at end of file diff --git a/src/db/adapters/IndexedDB.ts b/src/db/adapters/IndexedDB.ts new file mode 100644 index 0000000..8249e5c --- /dev/null +++ b/src/db/adapters/IndexedDB.ts @@ -0,0 +1,159 @@ +import {Put, Get, Message} from '../Message' +import { Actor } from '../Actor'; +import _ from "../../lodash"; +import Dexie from 'dexie'; +import {Children, NodeData} from "../Node"; +// import * as Comlink from "comlink"; + +// TODO: add LRU or other eviction policy, clean up least important data when db gets too big +class MyDexie extends Dexie { + nodes: Dexie.Table; + constructor(dbName: string) { + super(dbName); + this.version(1).stores({ + nodes: ", value, updatedAt" + }); + this.nodes = this.table("nodes"); + } +} + +export default class IndexedDB extends Actor { + config = {}; + notStored = new Set(); + putQueue: any = {}; + getQueue: any = {}; + i = 0; + queue = 0; + db: MyDexie; + + constructor(config: any = {}) { + super(); + this.config = config; + const dbName = (config.dbName || 'iris'); + this.db = new MyDexie(dbName); + this.db.open().catch((err) => { + console.error(err.stack || err); + }); + } + + put(nodeId: string, value: any) { + // add puts to a queue and dexie bulk write them once per 500ms + this.putQueue[nodeId] = value; + this.throttledPut(); + } + + throttledPut = _.throttle(() => { + const keys = Object.keys(this.putQueue); + const values = keys.map(key => { + this.notStored.delete(key); + return this.putQueue[key]; + }); + this.db.nodes.bulkPut(values, keys).catch((err) => { + console.error(err); + }); + this.putQueue = {}; + }, 500); + + get(path: string, callback: Function) { + this.getQueue[path] = this.getQueue[path] || []; + this.getQueue[path].push(callback); + this.throttledGet(); + } + + throttledGet = _.throttle(() => { + // clone this.getQueue and clear it + const queue = this.getQueue; + const keys = Object.keys(queue); + this.db.nodes.bulkGet(keys).then((values: (any | undefined)[]) => { + for (let i = 0; i < keys.length; i++) { + const key = keys[i]; + const value = values[i]; + const callbacks = queue[key]; + // console.log('have', key, value); + for (const callback of callbacks) { + callback(value); + } + } + }); + this.getQueue = {}; + }, 100); + + handle(message: Message) { + if (message instanceof Put) { + this.handlePut(message); + } else if (message instanceof Get) { + this.handleGet(message); + } else { + console.log('worker got unknown message', message); + } + } + + handleGet(message: Get) { + if (this.notStored.has(message.nodeId)) { + // TODO message implying that the key is not stored + return; + } + this.get(message.nodeId, (children: any) => { + // TODO: this takes a long time to return + if (children === undefined) { + this.notStored.add(message.nodeId); + // TODO message implying that the key is not stored + } else { + const putMessage = Put.newFromKv(message.nodeId, children, this); + putMessage.inResponseTo = message.id; + message.from && message.from.postMessage(putMessage); + } + }); + } + + mergeAndSave(path: string, children: Children) { + this.get(path, (existing: any) => { + // TODO check updatedAt timestamp + if (existing === undefined) { + this.put(path, children); + } else { + for (const [key, value] of Object.entries(children)) { + if (existing[key] && existing[key].updatedAt >= value.updatedAt) { + continue; + } + existing[key] = value; + } + this.put(path, existing); + } + }); + } + + savePath(path: string, value: any) { + if (value === undefined) { + this.db.nodes.delete(path); + this.notStored.add(path); + } else { + this.notStored.delete(path); + this.mergeAndSave(path, value); + } + } + + async handlePut(put: Put) { + for (const [nodeName, children] of Object.entries(put.updatedNodes)) { + if (!children) { + console.log('deleting', nodeName); + continue; + } + this.mergeAndSave(nodeName, children); + } + } +} + +/* +let actor; +global.onconnect = () => { + if (actor) { + console.log ('worker already exists'); + } else { + console.log('starting worker'); + actor = actor || new IndexedDB(); + } +} + */ + +// self.onconnect = (e) => Comlink.expose(actor, e.ports[0]); \ No newline at end of file diff --git a/src/db/adapters/Memory.ts b/src/db/adapters/Memory.ts new file mode 100644 index 0000000..a9c688f --- /dev/null +++ b/src/db/adapters/Memory.ts @@ -0,0 +1,85 @@ +import {Put, Get, Message} from '../Message' +import { Actor } from '../Actor'; +import QuickLRU from 'quick-lru'; +import {Children} from "../Node"; +//import {NodeData} from "../Node"; +// import * as Comlink from "comlink"; +import _ from '../../lodash'; + +export default class Memory extends Actor { + config = {}; + store: QuickLRU = new QuickLRU({ maxSize: 10000 }); + + constructor(config: any = {}) { + super(); + this.config = config; + } + + handle(message: Message) { + if (message instanceof Put) { + this.handlePut(message); + } else if (message instanceof Get) { + this.handleGet(message); + } else { + console.log('Memory got unknown message', message); + } + } + + handleGet(message: Get) { + if (!message.from) { + console.log('no from in get message'); + return; + } + let children = this.store.get(message.nodeId); + if (children) { + //console.log('have', message.nodeId, children); + const putMessage = Put.newFromKv(message.nodeId, children, this); + putMessage.inResponseTo = message.id; + message.from && message.from.postMessage(putMessage); + } else { + //console.log('dont have', message.nodeId); + } + } + + mergeAndSave(nodeName: string, children: Children) { + const existing = this.store.get(nodeName); + + // TODO check updatedAt timestamp + if (existing === undefined) { + this.store.set(nodeName, children); + } else { + for (const [key, value] of Object.entries(children)) { + if (existing[key] && existing[key].updatedAt >= value.updatedAt) { + continue; + } + existing[key] = value; + } + this.store.set(nodeName, existing); + } + } + + async handlePut(put: Put) { + for (const [nodeName, children] of Object.entries(put.updatedNodes)) { + if (!children) { + console.log('deleting', nodeName); + this.store.delete(nodeName); + continue; + } + this.mergeAndSave(nodeName, children); + } + } +} + +/* +let actor; +global.onconnect = () => { + if (actor) { + console.log ('worker already exists'); + } else { + console.log('starting worker'); + actor = actor || new IndexedDB(); + } +} + */ + +// self.onconnect = (e) => Comlink.expose(actor, e.ports[0]); \ No newline at end of file diff --git a/src/db/adapters/Websocket.ts b/src/db/adapters/Websocket.ts new file mode 100644 index 0000000..f95007e --- /dev/null +++ b/src/db/adapters/Websocket.ts @@ -0,0 +1,51 @@ +import {Get, Message, Put} from "../Message"; +import {Actor} from "../Actor"; +//@ts-ignore + +export default class Websocket extends Actor { + ws: WebSocket; + router: Actor; + sendQueue: string[] = []; + + constructor(url: string, router: Actor) { + super('websocket:' + url); + console.log('Websocket', url); + this.router = router; + this.ws = new WebSocket(url.replace('http', 'ws')); + this.ws.onopen = () => { + //this.ws.send(new Hi(this.router.peerId).serialize()); + console.log(`Connected to ${url}`); + this.sendQueue.forEach((message) => this.ws.send(message)); + this.sendQueue = []; + } + this.ws.onmessage = async (event) => { + try { + const message = await Message.deserialize(event.data, this); + this.router.postMessage(message); + } catch (e) { + //console.log('Failed to deserialize message', event.data, e); + } + } + this.ws.onclose = () => { + console.log(`Disconnected from ${url}`); + } + this.ws.onerror = () => { + console.log(`Error on ${url}`); + } + } + + handle(message: Message): void { + if (message instanceof Get || message instanceof Put) { + if (message.from === this) { + return; + } + if (this.ws.readyState === WebSocket.OPEN) { + this.ws.send(message.serialize()); + } else if (this.ws.readyState === WebSocket.CONNECTING) { + this.sendQueue.push(message.serialize()); + } + } + } +} + + diff --git a/src/db/index.jsx b/src/db/index.jsx new file mode 100644 index 0000000..3a7bd72 --- /dev/null +++ b/src/db/index.jsx @@ -0,0 +1,42 @@ +import Node from './db/Node'; +import Component from '../BaseComponent'; + +// simple preact page for testing our db +export default class Index extends Component { + db = new Node(); + + componentDidMount() { + this.db.get('test').get('str').on(this.inject()); + } + + onChangeTextarea = (e) => { + console.log('setting str', e.target.value); + this.db.get('test').get('str').put(e.target.value); + } + + toggleSpam = () => { + if (this.state.isSpamming) { + clearInterval(this.spamInterval); + this.setState({isSpamming: false}); + } else { + this.spamInterval = setInterval(() => { + this.db.get('test').get('str').put(Math.random()); + }, 100); + this.setState({isSpamming: true}); + } + } + + render() { + return ( +
+

Test

+ +

+ +

+
+ ); + } +} \ No newline at end of file diff --git a/src/electron.ts b/src/electron.ts index 2b445fe..f747844 100644 --- a/src/electron.ts +++ b/src/electron.ts @@ -1,6 +1,7 @@ import util from "./util"; -import Gun from "gun"; +import Node from "./db/Node"; -const electron = util.isElectron ? new Gun({peers: ['http://localhost:8768/gun'], file: 'State.electron', multicast:false, localStorage: false}).get('state') : null; +// TODO config {peers: ['http://localhost:8768/gun'], file: 'State.electron', multicast:false, localStorage: false} +const electron = util.isElectron ? new Node('electron').get('state') : null; export default electron; \ No newline at end of file diff --git a/src/global.ts b/src/global.ts index f9caae5..9903781 100644 --- a/src/global.ts +++ b/src/global.ts @@ -1,22 +1,19 @@ -import Gun from 'gun'; -import 'gun/sea'; -import 'gun/lib/yson'; -import 'gun/lib/radix'; -import 'gun/lib/radisk'; -import 'gun/lib/store'; -import 'gun/lib/rindexed'; import peers from "./peers"; +import Node from "./db/Node"; -let global: any; +let globalState: any; export default function(opts: any = {}) { - if (!global) { - const myOpts = Object.assign({ peers: (opts.peers || peers.random()), localStorage: false, retry:Infinity }, opts); + if (!globalState) { + peers.init(); + const webSocketPeers = (opts.peers || peers.random()); + console.log('webSocketPeers', webSocketPeers); + const myOpts = Object.assign({ webSocketPeers, localStorage: false, retry:Infinity }, opts); if (opts.peers) { + console.log('adding peers', opts.peers); opts.peers.forEach((url: string) => peers.add({url})); } - peers.init(); - global = new Gun(myOpts); + globalState = new Node('global', myOpts); } - return global; + return globalState; } \ No newline at end of file diff --git a/src/index.ts b/src/index.ts index 5da6477..df1d3d2 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,8 +1,5 @@ /*eslint no-useless-escape: "off", camelcase: "off" */ -import Gun from 'gun'; -import 'gun/sea'; - import session from './session'; import peers from './peers'; import util from './util'; @@ -17,12 +14,12 @@ import notifications from './notifications'; import SignedMessage from './SignedMessage'; import Channel from './Channel'; -import Node from './Node'; +import Node from './db/Node'; +import Key from './Key'; export default { local, global, - group, public: publicState, private: privateState, @@ -32,10 +29,8 @@ export default { session, util, notifications, - - SEA: Gun.SEA, - Gun, SignedMessage, Channel, Node, + Key }; \ No newline at end of file diff --git a/src/local.ts b/src/local.ts index 6277643..c3861c9 100644 --- a/src/local.ts +++ b/src/local.ts @@ -1,4 +1,4 @@ -import Node from './Node'; +import Node from './db/Node'; let local: Node; @@ -10,7 +10,7 @@ let local: Node; */ export default function() { if (!local) { - local = new Node(); + local = new Node('local'); } return local; } \ No newline at end of file diff --git a/src/lodash.ts b/src/lodash.ts index 5856720..23c5426 100644 --- a/src/lodash.ts +++ b/src/lodash.ts @@ -1,5 +1,5 @@ // @ts-nocheck -export default { +const _ = { throttle: (func: Function, limit: number) => { let inThrottle: boolean; return function() { @@ -72,5 +72,30 @@ export default { } }); return newObj; + }, + isEqual: (a: any, b: any) => { + if (a === b) { + return true; + } + if (a instanceof Date && b instanceof Date) { + return a.getTime() === b.getTime(); + } + if (!a || !b || (typeof a !== 'object' && typeof b !== 'object')) { + return a !== a && b !== b; + } + if (a.prototype !== b.prototype) { + return false; + } + const keys = Object.keys(a); + if (keys.length !== Object.keys(b).length) { + return false; + } + return keys.every(k => _.isEqual(a[k], b[k])); + }, + uniq: (arr: any[]) => { + const set = new Set(arr); + return Array.from(set); } -} \ No newline at end of file +}; + +export default _; \ No newline at end of file diff --git a/src/notifications.ts b/src/notifications.ts index 3011fb4..f8c7e04 100644 --- a/src/notifications.ts +++ b/src/notifications.ts @@ -1,14 +1,13 @@ // @ts-nocheck import _ from './lodash'; -import Gun from 'gun'; - import session from './session'; import util from './util'; import publicState from './global'; import privateState from './private'; import local from './local'; import group from './group'; +import Key from './Key'; const NOTIFICATION_SERVICE_URL = 'https://iris-notifications.herokuapp.com/notify'; // const notificationSound = new Audio('../../assets/audio/notification.mp3'); // TODO @@ -135,8 +134,8 @@ function removeSubscription(hash) { async function addWebPushSubscription(s, saveToGun = true) { const myKey = session.getKey(); - const mySecret = await Gun.SEA.secret(myKey.epub, myKey); - const enc = await Gun.SEA.encrypt(s, mySecret); + const mySecret = await Key.secret(myKey.epub, myKey); + const enc = await Key.encrypt(s, mySecret); const hash = await util.getHash(JSON.stringify(s)); if (saveToGun) { publicState().user().get('webPushSubscriptions').get(hash).put(enc); @@ -147,10 +146,10 @@ async function addWebPushSubscription(s, saveToGun = true) { async function getWebPushSubscriptions() { const myKey = session.getKey(); - const mySecret = await Gun.SEA.secret(myKey.epub, myKey); - publicState().user().get('webPushSubscriptions').map().on(async enc => { + const mySecret = await Key.secret(myKey.epub, myKey); + publicState().user().get('webPushSubscriptions').map(async enc => { if (!enc) { return; } - const s = await Gun.SEA.decrypt(enc, mySecret); + const s = await Key.decrypt(enc, mySecret); addWebPushSubscription(s, false); }); } @@ -196,8 +195,8 @@ function subscribeToIrisNotifications(onClick?: Function) { if (alreadyHave.has(id)) { return; } alreadyHave.add(id); const epub = await getEpub(from); - const secret = await Gun.SEA.secret(epub, session.getKey()); - const notification = await Gun.SEA.decrypt(encryptedNotification, secret); + const secret = await Key.secret(epub, session.getKey()); + const notification = await Key.decrypt(encryptedNotification, secret); if (!notification || typeof notification !== 'object') { return; } setNotificationsShownTime(); notification.from = from; @@ -238,8 +237,8 @@ async function sendIrisNotification(recipient, notification) { if (!(recipient && notification)) { return; } // TODO: use typescript or sth :D if (typeof notification === 'object') { notification.time = new Date().toISOString() } const epub = await getEpub(recipient); - const secret = await Gun.SEA.secret(epub, session.getKey()); - const enc = await Gun.SEA.encrypt(notification, secret); + const secret = await Key.secret(epub, session.getKey()); + const enc = await Key.encrypt(notification, secret); publicState().user().get('notifications').get(recipient).put(enc); } @@ -255,8 +254,8 @@ async function sendWebPushNotification(recipient, notification) { const participant = participants[i]; const secret = await channel.getSecret(participant); const payload = { - title: await Gun.SEA.encrypt(notification.title, secret), - body: await Gun.SEA.encrypt(notification.body, secret), + title: await Key.encrypt(notification.title, secret), + body: await Key.encrypt(notification.body, secret), from:{pub: myKey.pub, epub: myKey.epub} }; channel.webPushSubscriptions[participant].forEach(s => { diff --git a/src/peers.ts b/src/peers.ts index 3bf98ae..ce27b46 100644 --- a/src/peers.ts +++ b/src/peers.ts @@ -1,11 +1,11 @@ import session from './session'; import _ from './lodash'; -import Gun from 'gun'; import util from './util'; import publicState from './global'; +import Key from './Key'; const ELECTRON_GUN_URL = 'http://localhost:8767/gun'; -let maxConnectedPeers = 2; +let maxConnectedPeers = 1; type Peer = { url?: string; @@ -19,20 +19,20 @@ type Peers = { } const DEFAULT_PEERS: Peers = { - 'https://gun-rs.iris.to/gun': {}, - 'https://gun-us.herokuapp.com/gun': {}, + 'wss://gun-rs.iris.to/gun': {}, +// 'wss://gun-us.herokuapp.com/gun': {}, }; -const loc = window.location; -const host = loc.host; -const is_localhost_but_not_dev = host.startsWith('localhost') && host !== 'localhost:8080'; -if (loc.hostname.endsWith('herokuapp.com') || is_localhost_but_not_dev) { - Object.keys(DEFAULT_PEERS).forEach(url => DEFAULT_PEERS[url].enabled = false); - DEFAULT_PEERS[`${loc.origin}/gun`] = {enabled: true}; +if (self.window) { + const loc = window.location; + const host = loc.host; + const is_localhost_but_not_dev = host.startsWith('localhost') && host !== 'localhost:8080'; + if (loc.hostname.endsWith('herokuapp.com') || is_localhost_but_not_dev) { + Object.keys(DEFAULT_PEERS).forEach(url => DEFAULT_PEERS[url].enabled = false); + DEFAULT_PEERS[`${loc.origin}/gun`] = {enabled: true}; + } } -const urlRegex = /^(https?:\/\/)?([\da-z.-]+)\.([a-z.]{2,6})([\/\w .-]*)*\/?$/; - /** * Networking and peer management utilities */ @@ -41,10 +41,6 @@ export default { /** */ async add(peer: Peer) { - if (peer.url && !urlRegex.test(peer.url)) { - throw new Error(`Invalid url ${peer.url}`); - } - if (peer.from) { Object.keys(this.known).forEach(k => { if (this.known[k].from === peer.from) { // remove previous peer url from the same user @@ -56,9 +52,9 @@ export default { this.known[url] = this.known[url] || _.omit(peer, ['url']); if (peer.visibility === 'public') { // rolling some crypto operations to obfuscate actual url in case we want to remove it - let secret = await Gun.SEA.secret(session.getKey().epub, session.getKey()) || ''; - let encryptedUrl = await Gun.SEA.encrypt(peer.url, secret); - let encryptedUrlHash = await Gun.SEA.work(encryptedUrl, null, null, {name: 'SHA-256'}); + let secret = await Key.secret(session.getKey().epub, session.getKey()) || ''; + let encryptedUrl = await Key.encrypt(peer.url, secret); + let encryptedUrlHash = await util.getHash(encryptedUrl); publicState().user().get('peers').get(encryptedUrlHash).put({url: peer.url, lastSeen: new Date().toISOString()}); } if (peer.enabled !== false) { @@ -81,6 +77,7 @@ export default { }, save() { + // TODO store them in iris.local() instead of localStorage localStorage.setItem('gunPeers', JSON.stringify(this.known)); }, @@ -106,6 +103,9 @@ export default { /** */ connect(url: string) { + if (!url) { + return; + } if (this.isMixedContent(url)) { return; } if (this.known[url]) { this.known[url].enabled = true; @@ -126,6 +126,7 @@ export default { }, isMixedContent(url: string) { + if (!url) { return false; } return window.location.protocol === 'https:' && (url.indexOf('http:') === 0); }, @@ -142,10 +143,12 @@ export default { if (sample && connectToLocalElectron) { sample.push(ELECTRON_GUN_URL); } + console.log('sample', sample, JSON.stringify(this.known)); return sample; }, checkGunPeerCount() { + return; let peersFromGun = publicState().back('opt.peers'); let connectedPeers = Object.values(peersFromGun).filter((peer: any) => { if (peer && peer.wire && peer.wire.constructor.name !== 'WebSocket') { diff --git a/src/public.ts b/src/public.ts index 44a385e..e100c67 100644 --- a/src/public.ts +++ b/src/public.ts @@ -1,17 +1,17 @@ -import publicState from './global'; +import globalState from './global'; import session from './session'; -let currentUser: any; - /** * Get a public space where only the specified user (public key) can write. Others can read. - * @param pub The public key of the user. Defaults to the current user from session. + * @param pub The public key string or keypair object of the user. Defaults to the current user from session. * @returns {Node} The user space. */ -export default function(pub?: string) { - if (!currentUser) { - currentUser = publicState().user(); - currentUser.auth(session.getKey()); +export default function(pub: any = session.getKey()) { + if (typeof pub === 'string') { + return globalState().user(pub); + } else if (typeof pub === 'object') { + const userSpace = globalState().user(pub.pub); + userSpace.auth(pub); + return userSpace; } - return pub ? publicState().user(pub) : currentUser; } diff --git a/src/session.ts b/src/session.ts index 0738653..197f209 100644 --- a/src/session.ts +++ b/src/session.ts @@ -1,11 +1,10 @@ // @ts-nocheck -import Gun from 'gun'; +import Key from './Key'; import notifications from './notifications'; import Channel from './Channel'; import util from './util'; import _ from './lodash'; import Fuse from "fuse.js"; -import localforage from 'localforage'; import local from './local'; import electron from './electron'; import user from './public'; @@ -37,7 +36,7 @@ const DEFAULT_SETTINGS = { autoplayWebtorrent: true, maxConnectedPeers: util.isElectron ? 2 : 1 } -} +}; /** * User session management utilities. @@ -55,6 +54,7 @@ export default { if (initCalled) { return; } initCalled = true; let localStorageKey = localStorage.getItem('chatKeyPair'); + console.log('localStorageKey', localStorageKey); if (localStorageKey) { this.login(JSON.parse(localStorageKey)); } else if (options.autologin !== false) { @@ -126,7 +126,6 @@ export default { this.updateNoFollowers(); } } - console.log('removeFollow', k, followDistance, follower); if (searchableItems[k] && searchableItems[k].followers.size === 0) { delete searchableItems[k]; local().get('contacts').get(k).put(false); @@ -143,7 +142,7 @@ export default { this.addFollow(callback, k, currentDepth - 1); - user(k).get('follow').map().on((isFollowing: boolean, followedKey: string) => { // TODO: unfollow + user(k).get('follow').map((isFollowing: boolean, followedKey: string) => { // TODO: unfollow if (isFollowing) { this.addFollow(callback, followedKey, currentDepth, k); if (currentDepth < maxDepth) { @@ -229,17 +228,16 @@ export default { * @param key */ login(k: any) { + console.log('login', k); const shouldRefresh = !!key; + console.log('shouldRefresh', shouldRefresh, 'key', key); key = k; localStorage.setItem('chatKeyPair', JSON.stringify(k)); user().auth(key); user().put({epub: key.epub}); - user().get('likes').put({a:null}); // gun bug? - user().get('msgs').put({a:null}); // gun bug? - user().get('replies').put({a:null}); // gun bug? notifications.subscribeToWebPush(); notifications.getWebPushSubscriptions(); - notifications.subscribeToIrisNotifications(); + //notifications.subscribeToIrisNotifications(); Channel.getMyChatLinks( undefined, (chatLink: any) => { local().get('chatLinks').get(chatLink.id).put(chatLink.url); latestChatLink = chatLink.url; @@ -251,8 +249,10 @@ export default { myName = name; } }); + // a lot of this is iris-messenger stuff notifications.init(); local().get('loggedIn').put(true); + console.log('local().get(\'loggedIn\').put(true);', local()); local().get('settings').once().then(settings => { if (!settings) { local().get('settings').put(DEFAULT_SETTINGS.local); @@ -261,7 +261,7 @@ export default { local().get('settings').get('autoplayWebtorrent').put(DEFAULT_SETTINGS.local.autoplayWebtorrent); } }); - user().get('block').map().on((isBlocked: boolean, user: string) => { + user().get('block').map((isBlocked: boolean, user: string) => { local().get('block').get(user).put(isBlocked); if (isBlocked) { delete searchableItems[user]; @@ -284,6 +284,8 @@ export default { }); }, + + /** * Create a new user account and log in. * @param options {Object} - Options for the new account. @@ -292,7 +294,7 @@ export default { loginAsNewUser(options: any = {}) { const name = options.name || util.generateName(); console.log('loginAsNewUser name', name); - return Gun.SEA.pair().then(k => { + return Key.generate().then(k => { this.login(k); user().get('profile').put({a:null}); user().get('profile').get('name').put(name); @@ -331,11 +333,9 @@ export default { } this.clearIndexedDB(); localStorage.clear(); // TODO clear only iris data - localforage.clear().then(() => { - window.location.hash = ''; - window.location.href = '/'; - location.reload(); - }); + window.location.hash = ''; + window.location.href = '/'; + location.reload(); }, clearIndexedDB() { diff --git a/src/util.ts b/src/util.ts index f6ec242..90e81c6 100644 --- a/src/util.ts +++ b/src/util.ts @@ -1,8 +1,6 @@ // @ts-nocheck /* eslint no-useless-escape: "off", camelcase: "off" */ -import Gun from 'gun'; // eslint-disable-line no-unused-vars -import 'gun/sea'; import _ from './lodash'; // eslint-disable-line no-unused-vars @@ -22,21 +20,6 @@ const isMobile = !isNode && (function() { return check; })(); -function gunAsAnotherUser(gun: any, key: any, f: Function) { // Hacky way to use multiple users with gun - const gun2 = new Gun({radisk: false, peers: Object.keys(gun._.opt.peers)}); // TODO: copy other options too - const user = gun2.user(); - user.auth(key); - setTimeout(() => { - // @ts-ignore - const peers = Object.values(gun2.back('opt.peers')); - peers.forEach(peer => { - // @ts-ignore - gun2.on('bye', peer); - }); - }, 20000); - return f(user); -} - function gunOnceDefined(node: any) { return new Promise(resolve => { node.on((val: any, _k: any, _a: any, eve: any) => { @@ -1867,18 +1850,23 @@ const adjectives = [ export default { gunOnceDefined, - gunAsAnotherUser, - async getHash (str: string, format = `base64`) { - if (!str) { - return undefined; + async getHash (data: any, format = `base64`) { + if (data === undefined) { + throw new Error('getHash data was undefined'); } - const hash = await Gun.SEA.work(str, undefined, undefined, {name: `SHA-256`}); - if (!hash) { - throw new Error(`Gun.SEA.work failed for ${str}`); + if (typeof data !== 'string') { + data = JSON.stringify(data); } - if (hash.length > 44) { - throw new Error(`Gun.SEA.work returned an invalid SHA-256 hash longer than 44 chars: ${hash}. This is probably due to a sea.js bug on Safari.`); + + const encoder = new TextEncoder(); + data = encoder.encode(data); + const buffer = await crypto.subtle.digest('SHA-256', data); + + if (format === 'buffer') { + return buffer; } + + const hash = this.arrayBufferToBase64(buffer); if (format === `hex`) { return this.base64ToHex(hash); } @@ -1903,6 +1891,16 @@ export default { return result; }, + arrayBufferToBase64( buffer ) { + var binary = ''; + var bytes = new Uint8Array( buffer ); + var len = bytes.byteLength; + for (var i = 0; i < len; i++) { + binary += String.fromCharCode( bytes[ i ] ); + } + return window.btoa( binary ); + }, + getCaret(el: HTMLInputElement) { if (el.selectionStart) { return el.selectionStart; @@ -1924,383 +1922,6 @@ export default { return 0; }, - injectCss() { - const elementId = `irisStyle`; - if (document.getElementById(elementId)) { - return; - } - const sheet = document.createElement(`style`); - sheet.id = elementId; - sheet.innerHTML = ` - .iris-follow-button .hover { - display: none; - } - - .iris-follow-button.following:hover .hover { - display: inline; - } - - .iris-follow-button.following:hover .nonhover { - display: none; - } - - .iris-identicon * { - box-sizing: border-box; - } - - .iris-identicon { - vertical-align: middle; - border-radius: 50%; - text-align: center; - display: inline-block; - position: relative; - max-width: 100%; - } - - .iris-distance { - z-index: 2; - position: absolute; - left:0%; - top:2px; - width: 100%; - text-align: right; - color: #fff; - text-shadow: 0 0 1px #000; - font-size: 75%; - line-height: 75%; - font-weight: bold; - } - - .iris-pie { - border-radius: 50%; - position: absolute; - top: 0; - left: 0; - box-shadow: 0px 0px 0px 0px #82FF84; - padding-bottom: 100%; - max-width: 100%; - -webkit-transition: all 0.2s ease-in-out; - -moz-transition: all 0.2s ease-in-out; - transition: all 0.2s ease-in-out; - } - - .iris-card { - padding: 10px; - background-color: #f7f7f7; - color: #777; - border: 1px solid #ddd; - display: flex; - flex-direction: row; - overflow: hidden; - } - - .iris-card a { - -webkit-transition: color 150ms; - transition: color 150ms; - text-decoration: none; - color: #337ab7; - } - - .iris-card a:hover, .iris-card a:active { - text-decoration: underline; - color: #23527c; - } - - .iris-pos { - color: #3c763d; - } - - .iris-neg { - color: #a94442; - } - - .iris-identicon img { - position: absolute; - top: 0; - left: 0; - max-width: 100%; - border-radius: 50%; - border-color: transparent; - border-style: solid; - } - - .iris-chat-open-button { - background-color: #1e1e1e; - color: #fff; - padding: 15px; - cursor: pointer; - user-select: none; - } - - .iris-chat-open-button svg { - width: 1em; - } - - .iris-chat-open-button, .iris-chat-box { - position: fixed; - bottom: 0.5rem; - right: 0.5rem; - border-radius: 8px; - font-family: system-ui; - font-size: 15px; - } - - .iris-chat-box { - background-color: #fff; - max-height: 25rem; - box-shadow: 2px 2px 20px rgba(0, 0, 0, 0.2); - height: calc(100% - 44px); - display: flex; - flex-direction: column; - width: 320px; - color: rgb(38, 38, 38); - } - - .iris-chat-box.minimized { - height: auto; - } - - .iris-chat-box.minimized .iris-chat-header { - border-radius: 8px; - cursor: pointer; - } - - .iris-chat-box.minimized .iris-chat-messages, .iris-chat-box.minimized .iris-typing-indicator, .iris-chat-box.minimized .iris-chat-input-wrapper, .iris-chat-box.minimized .iris-chat-minimize, .iris-chat-box.minimized .iris-chat-close { - display: none; - } - - .iris-chat-header { - background-color: #1e1e1e; - height: 44px; - color: #fff; - border-radius: 8px 8px 0 0; - text-align: center; - display: flex; - flex-direction: row; - justify-content: center; - align-items: center; - flex: none; - white-space: nowrap; - text-overflow: ellipsis; - overflow: hidden; - } - - .iris-chat-header-text { - flex: 1; - } - - .iris-online-indicator { - color: #bfbfbf; - margin-right: 5px; - font-size: 12px; - user-select: none; - flex: none; - } - - .iris-online-indicator.yes { - color: #80bf5f; - } - - .iris-typing-indicator { - display: none; - background-color: rgba(255, 255, 255, 0.5); - font-size: 12px; - padding: 2px; - color: #777; - } - - .iris-typing-indicator.yes { - display: block; - } - - .iris-chat-messages { - flex: 1; - padding: 15px; - overflow-y: scroll; - } - - .iris-chat-input-wrapper { - flex: none; - padding: 15px; - background-color: #efefef; - display: flex; - flex-direction: row; - border-radius: 0 0 8px 8px; - } - - .iris-chat-input-wrapper textarea { - padding: 15px 8px; - border-radius: 4px; - border: 1px solid rgba(0,0,0,0); - width: auto; - font-size: 15px; - resize: none; - flex: 1; - } - - .iris-chat-input-wrapper textarea:focus { - outline: none; - border: 1px solid #6dd0ed; - } - - .iris-chat-input-wrapper button svg { - display: inline-block; - font-size: inherit; - height: 1em; - width: 1em; - overflow: visible; - vertical-align: -0.125em; - } - - .iris-chat-input-wrapper button, .iris-chat-input-wrapper button:hover, .iris-chat-input-wrapper button:active, .iris-chat-input-wrapper button:focus { - flex: none; - color: #999; - background-color: transparent; - font-size: 30px; - padding: 5px; - border: 1px solid rgba(0,0,0,0); - border-radius: 4px; - margin-left: 5px; - } - - .iris-chat-input-wrapper button:active, .iris-chat-input-wrapper button:focus { - outline: none; - border: 1px solid #6dd0ed; - } - - .iris-chat-message { - display: flex; - flex-direction: column; - margin-bottom: 2px; - overflow-wrap: break-word; - } - - .iris-msg-content { - background-color: #efefef; - padding: 6px 10px; - border-radius: 8px; - box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.1); - flex: none; - max-width: 75%; - } - - .emoji { - font-size: 1.3em; - line-height: 1em; - } - - .iris-chat-message .emoji-only { - font-size: 3em; - text-align: center; - } - - .iris-seen { - color: rgba(0, 0, 0, 0.45); - user-select: none; - } - - .iris-seen.yes { - color: #4fc3f7; - } - - .iris-seen svg { - width: 18px; - } - - .iris-delivered-checkmark { - display: none; - } - - .delivered .iris-delivered-checkmark { - display: initial; - } - - .iris-chat-minimize, .iris-chat-close { - user-select: none; - cursor: pointer; - width: 45px; - line-height: 44px; - } - - .iris-chat-message.their { - align-items: flex-start; - } - - .iris-chat-message.their + .iris-chat-message.our .iris-msg-content, .day-separator + .iris-chat-message.our .iris-msg-content { - margin-top: 15px; - border-radius: 8px 0px 8px 8px; - } - - .iris-chat-message.their:first-of-type .iris-msg-content { - border-radius: 0px 8px 8px 8px; - } - - .iris-chat-message.our:first-of-type .iris-msg-content { - border-radius: 8px 0px 8px 8px; - } - - .iris-chat-message.our + .iris-chat-message.their .iris-msg-content, .day-separator + .iris-chat-message.their .iris-msg-content { - margin-top: 15px; - border-radius: 0px 8px 8px 8px; - } - - .iris-chat-message.our { - align-items: flex-end; - } - - .iris-chat-message.our .iris-msg-content { - background-color: #c5ecf7; - } - - .iris-chat-message .time { - text-align: right; - font-size: 12px; - color: rgba(0, 0, 0, 0.45); - } - - .iris-non-string { - color: blue; - } - - .day-separator { - display: inline-block; - border-radius: 8px; - background-color: rgba(227, 249, 255, 0.91); - padding: 6px 10px; - margin-top: 15px; - margin-left: auto; - margin-right: auto; - text-transform: uppercase; - font-size: 13px; - color: rgba(74, 74, 74, 0.88); - box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.1); - user-select: none; - } - - .day-separator:first-of-type { - margin-top: 0; - } - - *[contenteditable="true"]:not(:focus) { - cursor: pointer; - } - - *[contenteditable="true"] { - outline: none; - } - - [placeholder]:empty:before { - content: attr(placeholder); - color: #999; - } - - [placeholder]:empty:focus { - cursor: text; - } - `; - document.head.prepend(sheet); - }, - getUrlParameter(sParam: string, sParams: string) { const sPageURL = sParams || window.location.search.substring(1); const sURLVariables = sPageURL.split('&'); diff --git a/test/blah.test.js b/test/blah.test.js new file mode 100644 index 0000000..c0754a1 --- /dev/null +++ b/test/blah.test.js @@ -0,0 +1,108 @@ +const crypto = require('crypto'); + +Object.defineProperty(global.self, "crypto", { + value: { + subtle: crypto.webcrypto.subtle, + getRandomValues: arr => crypto.randomBytes(arr.length), + }, +}); + +const util = require('util'); +global.TextEncoder = util.TextEncoder; +global.TextDecoder = util.TextDecoder; + +// TODO: gun causes unnecessary modules like aws-sdk to be loaded and the tests won't run +require("fake-indexeddb/auto"); +const iris = require('../dist/iris.umd.development.js').default; // can we test directly from ../src directory? requires some jest config, but would enable testing without building + +/* +process.env.PORT = "8767"; +//@ts-ignore +import Gun from 'gun/examples/http'; +console.log('Gun', Gun); + */ + +describe('iris', () => { + describe('key', () => { + it('should generate a key', async () => { + const key = await iris.Key.generate(); + expect(key).toBeDefined(); + }); + it('should not verify with a bad signature', async () => { + const key = await iris.Key.generate(); + const signedMsg = 'bad message'; + const notVerified = await iris.Key.verify(signedMsg, key); + expect(notVerified).toBe(undefined); + }); + it('should sign and verify', async () => { + const key = await iris.Key.generate(); + const msg = 'hello'; + const signedMsg = await iris.Key.sign(msg, key); + console.log('signedMsg', signedMsg); + const verified = await iris.Key.verify(signedMsg, key); + expect(verified).toBe(msg); + }); + it('should encrypt and decrypt', async () => { + const msg = 'hello'; + const secret = 'mySecretPassword'; + const encrypted = await iris.Key.encrypt(msg, secret); + const decrypted = await iris.Key.decrypt(encrypted, secret); + expect(encrypted).not.toBe(msg); + expect(decrypted).toBe(msg); + }); + it('it should generate a shared secret with ECDH', async () => { + const key1 = await iris.Key.generate(); + const key2 = await iris.Key.generate(); + const secret1 = await iris.Key.secret(key1.epub, key2); + const secret2 = await iris.Key.secret(key2.epub, key1); + const secret3 = await iris.Key.secret(key1.epub, key1); + const secret4 = await iris.Key.secret(key2.epub, key2); + expect(secret1).toBe(secret2); + expect(secret1).not.toBe(secret3); + expect(secret1).not.toBe(secret4); + }); + }); + + describe('global', () => { + it('first put then on', (done) => { + iris.global().get('profile').get('name').put('Caleb'); + iris.global().get('profile').get('name').on((name) => { + expect(name).toBe('Caleb'); + done(); + }); + }); + it('first on then put', (done) => { + iris.global().get('profile').get('age').on((age) => { + expect(age).toBe(42); + done(); + }); + iris.global().get('profile').get('age').put(42); + }); + it('map & on same keys and values returned', (done) => { + iris.global().get('numbers').get('pi').put(3.14); + iris.global().get('numbers').get('e').put(2.71); + let onResult; + const map = new Map(); + function checkDone() { + if (map.size === 3 && onResult && Object.keys(onResult).length === 3) { + expect(map.get('pi')).toBe(3.14); + expect(map.get('e')).toBe(2.71); + expect(map.get('phi')).toBe(1.618); + expect(onResult.pi).toBe(3.14); + expect(onResult.e).toBe(2.71); + expect(onResult.phi).toBe(1.618); + done(); + } + } + iris.global().get('numbers').on((numbers) => { + onResult = numbers; + checkDone(); + }); + iris.global().get('numbers').map((value, key) => { + map.set(key, value); + checkDone(); + }); + iris.global().get('numbers').get('phi').put(1.618); + }); + }); +}); diff --git a/test/blah.test.ts b/test/blah.test.ts deleted file mode 100644 index 33c7ef5..0000000 --- a/test/blah.test.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { sum } from '../src'; - -describe('blah', () => { - it('works', () => { - expect(sum(1, 1)).toEqual(2); - }); -}); diff --git a/yarn.lock b/yarn.lock index 7880dff..2921393 100644 --- a/yarn.lock +++ b/yarn.lock @@ -90,6 +90,19 @@ "@babel/helper-replace-supers" "^7.18.9" "@babel/helper-split-export-declaration" "^7.18.6" +"@babel/helper-create-class-features-plugin@^7.20.2": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.2.tgz#3c08a5b5417c7f07b5cf3dfb6dc79cbec682e8c2" + integrity sha512-k22GoYRAHPYr9I+Gvy2ZQlAe5mGy8BqWst2wRt8cwIufWTxrsVshhIBvYNqC80N0GSFWTsqRVexOtfzlgOEDvA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.19.0" + "@babel/helper-member-expression-to-functions" "^7.18.9" + "@babel/helper-optimise-call-expression" "^7.18.6" + "@babel/helper-replace-supers" "^7.19.1" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.19.0": version "7.19.0" resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.19.0.tgz#7976aca61c0984202baca73d84e2337a5424a41b" @@ -191,6 +204,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.19.0.tgz#4796bb14961521f0f8715990bee2fb6e51ce21bf" integrity sha512-40Ryx7I8mT+0gaNxm8JGTZFUITNqdLAgdg0hXzeVZxVD6nFsdhQvip6v8dqkRHzsz1VFpFAaOCHNn0vKBL7Czw== +"@babel/helper-plugin-utils@^7.20.2": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz#d1b9000752b18d0877cff85a5c376ce5c3121629" + integrity sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ== + "@babel/helper-remap-async-to-generator@^7.18.6", "@babel/helper-remap-async-to-generator@^7.18.9": version "7.18.9" resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz#997458a0e3357080e54e1d79ec347f8a8cd28519" @@ -201,7 +219,7 @@ "@babel/helper-wrap-function" "^7.18.9" "@babel/types" "^7.18.9" -"@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.18.9": +"@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.18.9", "@babel/helper-replace-supers@^7.19.1": version "7.19.1" resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.19.1.tgz#e1592a9b4b368aa6bdb8784a711e0bcbf0612b78" integrity sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw== @@ -545,6 +563,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" +"@babel/plugin-syntax-typescript@^7.20.0": + version "7.20.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz#4e9a0cfc769c85689b77a2e642d24e9f697fc8c7" + integrity sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.19.0" + "@babel/plugin-transform-arrow-functions@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz#19063fcf8771ec7b31d742339dac62433d0611fe" @@ -783,6 +808,15 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.9" +"@babel/plugin-transform-typescript@^7.18.6": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.20.2.tgz#91515527b376fc122ba83b13d70b01af8fe98f3f" + integrity sha512-jvS+ngBfrnTUBfOQq8NfGnSbF9BrqlR6hjJ2yVxMkmO5nL/cdifNbI30EfjRlN4g5wYWNnMPyj5Sa6R1pbLeag== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.20.2" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-typescript" "^7.20.0" + "@babel/plugin-transform-unicode-escapes@^7.18.10": version "7.18.10" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz#1ecfb0eda83d09bbcb77c09970c2dd55832aa246" @@ -890,6 +924,15 @@ "@babel/types" "^7.4.4" esutils "^2.0.2" +"@babel/preset-typescript@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.18.6.tgz#ce64be3e63eddc44240c6358daefac17b3186399" + integrity sha512-s9ik86kXBAnD760aybBucdpnLsAt0jK1xqJn2juOn9lkOvSHV60os5hxoVJsPzMQxvnUJFAlkont2DvvaYEBtQ== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-validator-option" "^7.18.6" + "@babel/plugin-transform-typescript" "^7.18.6" + "@babel/runtime-corejs3@^7.10.2": version "7.19.4" resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.19.4.tgz#870dbfd9685b3dad5aeb2d00841bb8b6192e3095" @@ -1207,33 +1250,6 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@peculiar/asn1-schema@^2.1.6": - version "2.3.0" - resolved "https://registry.yarnpkg.com/@peculiar/asn1-schema/-/asn1-schema-2.3.0.tgz#5368416eb336138770c692ffc2bab119ee3ae917" - integrity sha512-DtNLAG4vmDrdSJFPe7rypkcj597chNQL7u+2dBtYo5mh7VW2+im6ke+O0NVr8W1f4re4C3F71LhoMb0Yxqa48Q== - dependencies: - asn1js "^3.0.5" - pvtsutils "^1.3.2" - tslib "^2.4.0" - -"@peculiar/json-schema@^1.1.12": - version "1.1.12" - resolved "https://registry.yarnpkg.com/@peculiar/json-schema/-/json-schema-1.1.12.tgz#fe61e85259e3b5ba5ad566cb62ca75b3d3cd5339" - integrity sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w== - dependencies: - tslib "^2.0.0" - -"@peculiar/webcrypto@^1.1.1": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@peculiar/webcrypto/-/webcrypto-1.4.0.tgz#f941bd95285a0f8a3d2af39ccda5197b80cd32bf" - integrity sha512-U58N44b2m3OuTgpmKgf0LPDOmP3bhwNz01vAnj1mBwxBASRhptWYK+M3zG+HBkDqGQM+bFsoIihTW8MdmPXEqg== - dependencies: - "@peculiar/asn1-schema" "^2.1.6" - "@peculiar/json-schema" "^1.1.12" - pvtsutils "^1.3.2" - tslib "^2.4.0" - webcrypto-core "^1.7.4" - "@rollup/plugin-babel@^5.1.0": version "5.3.1" resolved "https://registry.yarnpkg.com/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz#04bc0608f4aa4b2e4b1aebf284344d0f68fda283" @@ -1803,15 +1819,6 @@ asn1@~0.2.3: dependencies: safer-buffer "~2.1.0" -asn1js@^3.0.1, asn1js@^3.0.5: - version "3.0.5" - resolved "https://registry.yarnpkg.com/asn1js/-/asn1js-3.0.5.tgz#5ea36820443dbefb51cc7f88a2ebb5b462114f38" - integrity sha512-FVnvrKJwpt9LP2lAMl8qZswRNm3T4q9CON+bxldk2iwk3FFpuwhx2FfinyitizWHsVYyaY+y5JzDR0rCMV5yTQ== - dependencies: - pvtsutils "^1.3.2" - pvutils "^1.1.3" - tslib "^2.4.0" - assert-plus@1.0.0, assert-plus@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" @@ -2015,6 +2022,11 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== +base64-arraybuffer-es6@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/base64-arraybuffer-es6/-/base64-arraybuffer-es6-0.7.0.tgz#dbe1e6c87b1bf1ca2875904461a7de40f21abc86" + integrity sha512-ESyU/U1CFZDJUdr+neHRhNozeCv72Y7Vm0m1DCbjX3KBjT6eYocvAJlSk6+8+HkVwXlT1FNxhGW6q3UKAlCvvw== + base@^0.11.1: version "0.11.2" resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" @@ -2606,6 +2618,11 @@ detect-newline@^3.0.0: resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== +dexie@^3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/dexie/-/dexie-3.2.2.tgz#fa6f2a3c0d6ed0766f8d97a03720056f88fe0e01" + integrity sha512-q5dC3HPmir2DERlX+toCBbHQXW5MsyrFqPFcovkH9N2S/UW/H3H5AWAB6iEOExeraAu+j+zRDG+zg/D7YhH0qg== + diff-sequences@^25.2.6: version "25.2.6" resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-25.2.6.tgz#5f467c00edd35352b7bca46d7927d60e687a76dd" @@ -3323,6 +3340,13 @@ extsprintf@^1.2.0: resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== +fake-indexeddb@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fake-indexeddb/-/fake-indexeddb-4.0.0.tgz#1dfb2023a3be175e35a6d84975218b432041934d" + integrity sha512-oCfWSJ/qvQn1XPZ8SHX6kY3zr1t+bN7faZ/lltGY0SBGhFOPXnWf0+pbO/MOAgfMx6khC2gK3S/bvAgQpuQHDQ== + dependencies: + realistic-structured-clone "^3.0.0" + fast-deep-equal@^3.1.1: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" @@ -3685,14 +3709,6 @@ growly@^1.3.0: resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" integrity sha512-+xGQY0YyAWCnqy7Cd++hc2JqMYzlm0dG30Jd0beaA64sROr8C4nt8Yc9V5Ro3avlSUDTN0ulqP/VBKi1/lLygw== -"gun@https://github.com/mmalmi/gun": - version "0.2020.1238" - resolved "https://github.com/mmalmi/gun#77409e4e6edc20b7b77649a0910603bd1b5e4988" - dependencies: - ws "^7.2.1" - optionalDependencies: - "@peculiar/webcrypto" "^1.1.1" - har-schema@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" @@ -3894,11 +3910,6 @@ ignore@^5.2.0: resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== -immediate@~3.0.5: - version "3.0.6" - resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" - integrity sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ== - import-fresh@^3.0.0, import-fresh@^3.1.0: version "3.3.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" @@ -4948,13 +4959,6 @@ levn@^0.3.0, levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" -lie@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/lie/-/lie-3.1.1.tgz#9a436b2cc7746ca59de7a41fa469b3efb76bd87e" - integrity sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw== - dependencies: - immediate "~3.0.5" - lilconfig@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.0.6.tgz#32a384558bd58af3d4c6e077dd1ad1d397bc69d4" @@ -4965,13 +4969,6 @@ lines-and-columns@^1.1.6: resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== -localforage@^1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/localforage/-/localforage-1.10.0.tgz#5c465dc5f62b2807c3a84c0c6a1b1b3212781dd4" - integrity sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg== - dependencies: - lie "3.1.1" - locate-path@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" @@ -5006,7 +5003,7 @@ lodash.sortby@^4.7.0: resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" integrity sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA== -lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.21: +lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.21, lodash@^4.7.0: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -6212,18 +6209,6 @@ punycode@^2.1.0, punycode@^2.1.1: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== -pvtsutils@^1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/pvtsutils/-/pvtsutils-1.3.2.tgz#9f8570d132cdd3c27ab7d51a2799239bf8d8d5de" - integrity sha512-+Ipe2iNUyrZz+8K/2IOo+kKikdtfhRKzNpQbruF2URmqPtoqAs8g3xS7TJvFF2GcPXjh7DkqMnpVveRFq4PgEQ== - dependencies: - tslib "^2.4.0" - -pvutils@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/pvutils/-/pvutils-1.1.3.tgz#f35fc1d27e7cd3dfbd39c0826d173e806a03f5a3" - integrity sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ== - qs@~6.5.2: version "6.5.3" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad" @@ -6234,6 +6219,11 @@ queue-microtask@^1.2.2: resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== +quick-lru@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-6.1.1.tgz#f8e5bf9010376c126c80c1a62827a526c0e60adf" + integrity sha512-S27GBT+F0NTRiehtbrgaSE1idUAJ5bX8dPAQTdylEyNlrdcH5X4Lz7Edz3DYzecbsCluD5zO8ZNEe04z3D3u6Q== + randombytes@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" @@ -6291,6 +6281,15 @@ readdirp@~3.6.0: dependencies: picomatch "^2.2.1" +realistic-structured-clone@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/realistic-structured-clone/-/realistic-structured-clone-3.0.0.tgz#7b518049ce2dad41ac32b421cd297075b00e3e35" + integrity sha512-rOjh4nuWkAqf9PWu6JVpOWD4ndI+JHfgiZeMmujYcPi+fvILUu7g6l26TC1K5aBIp34nV+jE1cDO75EKOfHC5Q== + dependencies: + domexception "^1.0.1" + typeson "^6.1.0" + typeson-registry "^1.0.0-alpha.20" + realpath-native@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-2.0.0.tgz#7377ac429b6e1fd599dc38d08ed942d0d7beb866" @@ -6634,6 +6633,11 @@ rollup-plugin-typescript2@^0.27.3: resolve "1.17.0" tslib "2.0.1" +rollup-plugin-web-worker-loader@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/rollup-plugin-web-worker-loader/-/rollup-plugin-web-worker-loader-1.6.1.tgz#9d7a27575b64b0780fe4e8b3bc87470d217e485f" + integrity sha512-4QywQSz1NXFHKdyiou16mH3ijpcfLtLGOrAqvAqu1Gx+P8+zj+3gwC2BSL/VW1d+LW4nIHC8F7d7OXhs9UdR2A== + rollup-pluginutils@^2.8.2: version "2.8.2" resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz#72f2af0748b592364dbd3389e600e5a9444a351e" @@ -7342,6 +7346,13 @@ tr46@^1.0.1: dependencies: punycode "^2.1.0" +tr46@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.1.0.tgz#fa87aa81ca5d5941da8cbf1f9b749dc969a4e240" + integrity sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw== + dependencies: + punycode "^2.1.1" + trim-lines@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/trim-lines/-/trim-lines-3.0.1.tgz#d802e332a07df861c48802c04321017b1bd87338" @@ -7450,7 +7461,7 @@ tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.0.0, tslib@^2.0.3, tslib@^2.4.0: +tslib@^2.0.3, tslib@^2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== @@ -7523,6 +7534,20 @@ typescript@^4.8.4: resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.8.4.tgz#c464abca159669597be5f96b8943500b238e60e6" integrity sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ== +typeson-registry@^1.0.0-alpha.20: + version "1.0.0-alpha.39" + resolved "https://registry.yarnpkg.com/typeson-registry/-/typeson-registry-1.0.0-alpha.39.tgz#9e0f5aabd5eebfcffd65a796487541196f4b1211" + integrity sha512-NeGDEquhw+yfwNhguLPcZ9Oj0fzbADiX4R0WxvoY8nGhy98IbzQy1sezjoEFWOywOboj/DWehI+/aUlRVrJnnw== + dependencies: + base64-arraybuffer-es6 "^0.7.0" + typeson "^6.0.0" + whatwg-url "^8.4.0" + +typeson@^6.0.0, typeson@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/typeson/-/typeson-6.1.0.tgz#5b2a53705a5f58ff4d6f82f965917cabd0d7448b" + integrity sha512-6FTtyGr8ldU0pfbvW/eOZrEtEkczHRUtduBnA90Jh9kMPCiFNnXIon3vF41N0S4tV1HHQt4Hk1j4srpESziCaA== + unbox-primitive@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" @@ -7820,22 +7845,16 @@ wcwidth@^1.0.1: dependencies: defaults "^1.0.3" -webcrypto-core@^1.7.4: - version "1.7.5" - resolved "https://registry.yarnpkg.com/webcrypto-core/-/webcrypto-core-1.7.5.tgz#c02104c953ca7107557f9c165d194c6316587ca4" - integrity sha512-gaExY2/3EHQlRNNNVSrbG2Cg94Rutl7fAaKILS1w8ZDhGxdFOaw6EbCfHIxPy9vt/xwp5o0VQAx9aySPF6hU1A== - dependencies: - "@peculiar/asn1-schema" "^2.1.6" - "@peculiar/json-schema" "^1.1.12" - asn1js "^3.0.1" - pvtsutils "^1.3.2" - tslib "^2.4.0" - webidl-conversions@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== +webidl-conversions@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" + integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== + whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" @@ -7857,6 +7876,15 @@ whatwg-url@^7.0.0: tr46 "^1.0.1" webidl-conversions "^4.0.2" +whatwg-url@^8.4.0: + version "8.7.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.7.0.tgz#656a78e510ff8f3937bc0bcbe9f5c0ac35941b77" + integrity sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg== + dependencies: + lodash "^4.7.0" + tr46 "^2.1.0" + webidl-conversions "^6.1.0" + which-boxed-primitive@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" @@ -7940,7 +7968,7 @@ write@1.0.3: dependencies: mkdirp "^0.5.1" -ws@^7.0.0, ws@^7.2.1: +ws@^7.0.0: version "7.5.9" resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==